diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,32 @@
+# Changelog — sdl3-bindgen-sys
+
+## 0.0.0.1 - 2026-07-26
+
+Initial release.
+
+- Raw bindings (`SDL3.Sys.Bindgen.*`) and the curated alias layer
+  (`SDL3.Sys.*`) for the SDL 3.4 API, generated from the SDL 3.4.2
+  headers by a modified `hs-bindgen`.
+- Builds and runs against any SDL >= 3.2.0. Newer declarations are gated
+  by SDL3's version macros and error with `SDL_GetError` when not
+  available.
+- Per-function safe/unsafe curation with rationales.
+- Curated module docs lead with each header's SDL category overview.
+- Build flags:
+  - `strict-data` (default on) - apply `StrictData` to generated modules
+    unconditionally.
+  - `strict` (default off) - **experimental** - apply `Strict` to generated
+    modules unconditionally. Caveat emptor: I have not yet verified that
+    this does not break correctness guarantees for the bindgen runtime.
+  - `optimize` (default on) - compile the library with -O2. Meaningful
+    improvement in interface file quality.
+  - `optimize-aggressively` (default off) - release-mode; forces GHC to apply
+    very expensive optimizations to the library.
+- Supported platforms:
+  - 64-bit Linux - hand-verified, my host dev machine is NixOS
+  - macOS aarch64 - CI-verified, I do not develop on macOS in my free time
+  - Windows MSYS2/UCRT64 - CI-verified, I do not develop on Windows in my
+    free time either
+- ABI static assertions (`cbits/abi_assertions.c`, cabal flag
+  `abi-assertions`, default on): enforce that the building system's SDL
+  headers match the layouts `hs-bindgen` built in.
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,29 @@
+Copyright (c) 2026 Jeremy Nuttall
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Jeremy Nuttall nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/LICENSE_SDL b/LICENSE_SDL
new file mode 100644
--- /dev/null
+++ b/LICENSE_SDL
@@ -0,0 +1,23 @@
+The documentation embedded in this package's modules is derived from
+the Simple DirectMedia Layer (SDL3) headers and is covered by SDL's
+zlib license, reproduced below.
+
+----------------------------------------------------------------------
+
+Copyright (C) 1997-2026 Sam Lantinga <slouken@libsdl.org>
+
+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.
diff --git a/LICENSE_c-expr-runtime b/LICENSE_c-expr-runtime
new file mode 100644
--- /dev/null
+++ b/LICENSE_c-expr-runtime
@@ -0,0 +1,29 @@
+Copyright (c) 2024-2026, Well-Typed LLP and Anduril Industries Inc.
+
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of the copyright holder nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/LICENSE_hs-bindgen-runtime b/LICENSE_hs-bindgen-runtime
new file mode 100644
--- /dev/null
+++ b/LICENSE_hs-bindgen-runtime
@@ -0,0 +1,29 @@
+Copyright (c) 2024-2026, Well-Typed LLP and Anduril Industries Inc.
+
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of the copyright holder nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,209 @@
+# sdl3-bindgen-sys
+
+Fully automated, luxury low-level Haskell bindings to [SDL3](https://libsdl.org):
+the whole SDL 3.4 API, machine-generated from the headers using an
+ever-so-slightly hacked version of `hs-bindgen`.
+
+This package gets you SDL3 in full — windowing, input, audio, and the
+newfangled [GPU API](https://wiki.libsdl.org/SDL3/CategoryGPU) — today,
+if you dare.
+
+CI runs against **64-bit Linux, macOS, and Windows**, which is what
+this package aims to support.
+
+This library aims to be:
+
+- **Complete by construction:** Generated from all 58 headers of the
+  SDL 3.4 API (291 modules), so a gap is either a code generation
+  bug or a [deliberate omission](#what-is-not-bound) rather than a
+  binding waiting to be hand-written.
+- **Curated:** The `SDL3.Sys.*` layer wraps `hs-bindgen`'s output
+  with best-effort Haskell casing, native scalar types, and FFI safety
+  decisions and recommendations.
+- **First-class SDL docs:** Every binding carries SDL's header documentation,
+  and notes from the code generator's curation layer.
+- **ABI-verified:** A generated translation unit of C `_Static_assert`s
+  verifies the library's baked layouts against _your_ SDL at every
+  build — divergence is a compile error naming the declaration, not
+  memory corruption.
+
+## Quick start
+
+Install SDL **>= 3.2** development files where `pkg-config` can find
+them: `apt install libsdl3-dev` (Debian/Ubuntu), `brew install sdl3`
+(macOS), `pacman -S sdl3` (Arch), MSYS2's `mingw-w64-ucrt-x86_64-sdl3`
+(Windows), or
+[build from source](https://wiki.libsdl.org/SDL3/Installation) on
+distros that don't package SDL3 yet.
+
+The development _headers_ must be present, not just the shared library.
+
+Add `sdl3-bindgen-sys` to `build-depends`, and:
+
+```haskell
+{-# LANGUAGE BlockArguments #-}
+
+import Control.Monad (unless)
+import Foreign.C.ConstPtr (ConstPtr (..))
+import Foreign.C.String (peekCString, withCString)
+import SDL3.Sys qualified as SDL3
+
+main :: IO ()
+main = do
+  ok <- SDL3.init SDL3.SDL_INIT_VIDEO
+  unless ok do
+    err <- peekCString . unConstPtr =<< SDL3.getError
+    fail ("SDL_Init: " <> err)
+  window <- withCString "hello" \title ->
+    SDL3.createWindow (ConstPtr title) 640 480 0
+  SDL3.delaySafe 2000
+  SDL3.destroyWindow window
+  SDL3.quit
+```
+
+For something real, see
+[`lithon-examples`](https://github.com/jtnuttall/lithon/tree/main/lithon-examples)
+in the repository:
+
+- `sdl3-raw` is a minimal triangle with an event loop
+- `shmup` is a playable `apecs` game running on and rendering through
+  these bindings
+
+## Library structure
+
+For most uses, you will `import SDL3.Sys qualified as SDL3`.
+`SDL3.Sys` re-exports one module per SDL header.
+
+The raw hs-bindgen output lives underneath as `SDL3.Sys.Bindgen.*`, if
+you need to drop down to C types.
+
+### Safe and unsafe FFI
+
+Most functions come in both FFI flavors: `createWindow` is an `unsafe`
+foreign import; `createWindowSafe` is the `safe` one.
+
+General rules for safe vs. unsafe FFI:
+
+- You _must_ use a `safe` call if C will call back into Haskell.
+- You _should_ use a `safe` call if the C call could take a while (e.g.,
+  waiting on some OS event, or a locking mechanism, etc.).
+- You _should_ use an `unsafe` call if the C call is fast; `unsafe`
+  calls block the current GHC thread (capability) and the garbage
+  collector, but their overhead is very low compared to `safe` calls.
+
+### Typed constants
+
+SDL declares its flag and constant vocabularies as `typedef UintN`
+plus `#define`s, an association C never states, so binding generators
+cannot recover it.
+
+The curated layer restores this information from an explicit
+registry maintained alongside the generator.
+
+Similar to the `vulkan` library, every group member is a pattern synonym
+typed at its newtype, e.g. `SDL_INIT_VIDEO :: SDL_InitFlags`.
+
+You can combine bitmask groups with `.|.` from `Data.Bits`:
+
+```haskell
+SDL3.init (SDL3.SDL_INIT_VIDEO .|. SDL3.SDL_INIT_AUDIO)
+```
+
+### Conversion to and from C types
+
+`SDL3.Sys` re-exports `SDL3.Sys.Runtime`, the conversion vocabulary
+you'll actually reach for: `toBool`/`fromBool` for C-typed struct
+fields (e.g. a keyboard event's `repeat`), and the `CEnum` classes for
+moving between enum newtypes and their integral representations.
+
+## Platform support
+
+**64-bit platforms only.** Linux, macOS (aarch64, Homebrew `sdl3`), and
+Windows (MSYS2 UCRT64, including the LLP64 layouts) are all targets,
+and CI builds the released package on all three. 32-bit targets are
+rejected by the ABI assertions — 64-bit layouts are baked in.
+
+## Common issues
+
+- **Blank screen or crash on macOS** — SDL's Cocoa backend requires
+  video and event calls on the **process main thread**. Keep the SDL
+  loop on `main` (don't `forkIO` it); `runOnMainThreadSafe` is bound for
+  marshalling work onto it.
+- **`init` fails on Windows** — the bindings are generated with
+  `SDL_MAIN_HANDLED`: call `setMainReady` before `init`.
+- **`foo` or `fooSafe`?** — every function's haddock states its flavor
+  choice, and the rationale, under its **`sdl3-bindgen-sys` notes**
+  section.
+- **Branching on `SDL3.Sys.PlatformDefines`** — don't: its two
+  constants (`sDL_PLATFORM_LINUX`, `sDL_PLATFORM_UNIX`) are baked to
+  the generation host's value of `1` on every platform.
+- **`setLinuxThreadPriority(AndPolicy)` off-Linux** — both exist
+  everywhere but fail with an `SDL_GetError` message.
+
+## What is not bound
+
+Known gaps, so you can discover them here instead of mid-build:
+
+- **Variadic functions** — hs-bindgen skips them. That means the
+  `SDL_Log` family (including the `V`-suffixed `va_list` variants),
+  `SDL_SetError`, and `SDL_RenderDebugTextFormat` (the fixed-string
+  `SDL_RenderDebugText` _is_ bound). For logging, format in Haskell
+  first and write a one-line `"%s"` C shim if you need SDL's log
+  routing; for `SDL_SetError` there is currently **no workaround** in
+  this package.
+- **Function-like macros** — no linkable symbol exists. Macro
+  _constants_ are bound; see [Typed constants](#typed-constants).
+- The seven `long`-typed `SDL_stdinc.h` libc clones (`strtol`/`ltoa`
+  families, `lround`/`lroundf`): their FFI types cannot be correct on
+  both LP64 and LLP64, so they are omitted.
+- Three Windows-only interop functions (`SDL_SetWindowsMessageHook`,
+  `SDL_GetDirect3D9AdapterIndex`, `SDL_GetDXGIOutputInfo`) — niche;
+  native window handles are reached through the bound
+  `SDL_GetWindowProperties` keys instead.
+
+## Versioning
+
+The 0.0.x series is experimental: pin to the minor
+(e.g., `>=0.0.0.1 && <0.0.1`) and expect surface-shaping changes.
+
+SDL **>= 3.2.0** is required; the surface is generated from 3.4.2.
+Declarations newer than your SDL still compile and link — their wrapper
+C is gated on SDL's own version macros, so calling one on an older SDL
+fails at the call site via `SDL_GetError` (exactly like the Linux-only
+functions off Linux). The wrapper gates and the ABI assertion layer are
+driven by an empirically verified availability registry rather than
+SDL's (occasionally wrong) `\since` annotations; a handful of haddock
+`@since` lines therefore repeat an upstream floor the registry
+corrects — where they disagree, the registry wins, and a gated call's
+`SDL_GetError` message states the true floor.
+
+Two semantic deltas to know when running against a 3.2-series SDL:
+
+- `SDL_COLORSPACE_YUV_DEFAULT` is baked at its 3.4 value
+  (`BT601_LIMITED`); 3.2 defined it as `JPEG`.
+- Below SDL 3.2.12, `SDL_MouseWheelEvent.integer_x`/`integer_y` read
+  bytes SDL never wrote — memory-safe (`SDL_Event` is 128 bytes), but
+  meaningless.
+
+## Known documentation issues
+
+- A few module overviews absorb the opening of the first declaration's
+  documentation. Seems to be upstream — Doxygen fuses SDL's file-level
+  category comments before any other tool sees them in these cases.
+- Cross-header references in the raw `SDL3.Sys.Bindgen.*` docs may
+  appear as plain text; the curated `SDL3.Sys.*` modules should contain
+  repaired links.
+
+## Provenance and licensing
+
+Generated by [hs-bindgen](https://github.com/well-typed/hs-bindgen)
+driven by the repository's `lithon-codegen`, from the SDL 3.4.2
+headers. The generated tree is never hand-edited, but bugs are mine, not
+SDL's: report them at the
+[issue tracker](https://github.com/jtnuttall/lithon/issues).
+
+- `sdl3-bindgen-sys` is BSD-3-Clause (see `LICENSE`).
+- The SDL header documentation embedded in the haddocks is covered by SDL's
+  zlib license (`LICENSE_SDL`).
+- The vendored hs-bindgen and c-expr runtimes are BSD-3-Clause, (c) Well-Typed LLP
+  and Anduril Industries (`LICENSE_hs-bindgen-runtime`, `LICENSE_c-expr-runtime`).
diff --git a/cbits/abi_assertions.c b/cbits/abi_assertions.c
new file mode 100644
--- /dev/null
+++ b/cbits/abi_assertions.c
@@ -0,0 +1,2714 @@
+/* GENERATED by lithon-codegen (sdl3 generate) - do not edit.
+ *
+ * Every size, alignment, field offset, and enum value baked into the
+ * generated Haskell is re-asserted here against the SDL headers this
+ * package is compiled with. A failing line means the bindings would
+ * corrupt memory under this platform/SDL — the build stops instead.
+ * See the package README, section "ABI verification".
+ *
+ * #if guards mirror each declaration's documented @since — corrected
+ * and refined to member granularity by the empirical availability
+ * registry (lithon-codegen sdl3/versions.json) — on SDL's own version
+ * macros.
+ */
+#include <stddef.h>
+
+#define SDL_MAIN_HANDLED
+#include <SDL3/SDL.h>
+#include <SDL3/SDL_vulkan.h>
+#include <SDL3/SDL_main.h>
+
+/* ---- SDL_stdinc.h ---- */
+_Static_assert(sizeof(struct SDL_alignment_test) == 16, "struct SDL_alignment_test: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_alignment_test) == 8, "struct SDL_alignment_test: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_alignment_test, a) == 0, "struct SDL_alignment_test.a: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_alignment_test, b) == 8, "struct SDL_alignment_test.b: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_DUMMY_ENUM) == 4, "enum SDL_DUMMY_ENUM: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_DUMMY_ENUM) == 4, "enum SDL_DUMMY_ENUM: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((DUMMY_ENUM_VALUE) == (0), "DUMMY_ENUM_VALUE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_assert.h ---- */
+_Static_assert(sizeof(enum SDL_AssertState) == 4, "enum SDL_AssertState: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_AssertState) == 4, "enum SDL_AssertState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASSERTION_RETRY) == (0), "SDL_ASSERTION_RETRY: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASSERTION_BREAK) == (1), "SDL_ASSERTION_BREAK: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASSERTION_ABORT) == (2), "SDL_ASSERTION_ABORT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASSERTION_IGNORE) == (3), "SDL_ASSERTION_IGNORE: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASSERTION_ALWAYS_IGNORE) == (4), "SDL_ASSERTION_ALWAYS_IGNORE: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_AssertData) == 48, "struct SDL_AssertData: baked sizeof 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_AssertData) == 8, "struct SDL_AssertData: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AssertData, always_ignore) == 0, "struct SDL_AssertData.always_ignore: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AssertData, trigger_count) == 4, "struct SDL_AssertData.trigger_count: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AssertData, condition) == 8, "struct SDL_AssertData.condition: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AssertData, filename) == 16, "struct SDL_AssertData.filename: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AssertData, linenum) == 24, "struct SDL_AssertData.linenum: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AssertData, function) == 32, "struct SDL_AssertData.function: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AssertData, next) == 40, "struct SDL_AssertData.next: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_asyncio.h ---- */
+_Static_assert(sizeof(enum SDL_AsyncIOTaskType) == 4, "enum SDL_AsyncIOTaskType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_AsyncIOTaskType) == 4, "enum SDL_AsyncIOTaskType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASYNCIO_TASK_READ) == (0), "SDL_ASYNCIO_TASK_READ: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASYNCIO_TASK_WRITE) == (1), "SDL_ASYNCIO_TASK_WRITE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASYNCIO_TASK_CLOSE) == (2), "SDL_ASYNCIO_TASK_CLOSE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_AsyncIOResult) == 4, "enum SDL_AsyncIOResult: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_AsyncIOResult) == 4, "enum SDL_AsyncIOResult: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASYNCIO_COMPLETE) == (0), "SDL_ASYNCIO_COMPLETE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASYNCIO_FAILURE) == (1), "SDL_ASYNCIO_FAILURE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ASYNCIO_CANCELED) == (2), "SDL_ASYNCIO_CANCELED: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_AsyncIOOutcome) == 56, "struct SDL_AsyncIOOutcome: baked sizeof 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_AsyncIOOutcome) == 8, "struct SDL_AsyncIOOutcome: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AsyncIOOutcome, asyncio) == 0, "struct SDL_AsyncIOOutcome.asyncio: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AsyncIOOutcome, type) == 8, "struct SDL_AsyncIOOutcome.type: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AsyncIOOutcome, result) == 12, "struct SDL_AsyncIOOutcome.result: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AsyncIOOutcome, buffer) == 16, "struct SDL_AsyncIOOutcome.buffer: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AsyncIOOutcome, offset) == 24, "struct SDL_AsyncIOOutcome.offset: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AsyncIOOutcome, bytes_requested) == 32, "struct SDL_AsyncIOOutcome.bytes_requested: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AsyncIOOutcome, bytes_transferred) == 40, "struct SDL_AsyncIOOutcome.bytes_transferred: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AsyncIOOutcome, userdata) == 48, "struct SDL_AsyncIOOutcome.userdata: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_atomic.h ---- */
+_Static_assert(sizeof(struct SDL_AtomicInt) == 4, "struct SDL_AtomicInt: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_AtomicInt) == 4, "struct SDL_AtomicInt: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AtomicInt, value) == 0, "struct SDL_AtomicInt.value: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_AtomicU32) == 4, "struct SDL_AtomicU32: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_AtomicU32) == 4, "struct SDL_AtomicU32: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AtomicU32, value) == 0, "struct SDL_AtomicU32.value: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_properties.h ---- */
+_Static_assert(sizeof(enum SDL_PropertyType) == 4, "enum SDL_PropertyType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_PropertyType) == 4, "enum SDL_PropertyType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROPERTY_TYPE_INVALID) == (0), "SDL_PROPERTY_TYPE_INVALID: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROPERTY_TYPE_POINTER) == (1), "SDL_PROPERTY_TYPE_POINTER: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROPERTY_TYPE_STRING) == (2), "SDL_PROPERTY_TYPE_STRING: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROPERTY_TYPE_NUMBER) == (3), "SDL_PROPERTY_TYPE_NUMBER: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROPERTY_TYPE_FLOAT) == (4), "SDL_PROPERTY_TYPE_FLOAT: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROPERTY_TYPE_BOOLEAN) == (5), "SDL_PROPERTY_TYPE_BOOLEAN: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_thread.h ---- */
+_Static_assert(sizeof(enum SDL_ThreadPriority) == 4, "enum SDL_ThreadPriority: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_ThreadPriority) == 4, "enum SDL_ThreadPriority: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_THREAD_PRIORITY_LOW) == (0), "SDL_THREAD_PRIORITY_LOW: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_THREAD_PRIORITY_NORMAL) == (1), "SDL_THREAD_PRIORITY_NORMAL: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_THREAD_PRIORITY_HIGH) == (2), "SDL_THREAD_PRIORITY_HIGH: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_THREAD_PRIORITY_TIME_CRITICAL) == (3), "SDL_THREAD_PRIORITY_TIME_CRITICAL: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_ThreadState) == 4, "enum SDL_ThreadState: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_ThreadState) == 4, "enum SDL_ThreadState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_THREAD_UNKNOWN) == (0), "SDL_THREAD_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_THREAD_ALIVE) == (1), "SDL_THREAD_ALIVE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_THREAD_DETACHED) == (2), "SDL_THREAD_DETACHED: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_THREAD_COMPLETE) == (3), "SDL_THREAD_COMPLETE: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_mutex.h ---- */
+_Static_assert(sizeof(enum SDL_InitStatus) == 4, "enum SDL_InitStatus: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_InitStatus) == 4, "enum SDL_InitStatus: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_STATUS_UNINITIALIZED) == (0), "SDL_INIT_STATUS_UNINITIALIZED: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_STATUS_INITIALIZING) == (1), "SDL_INIT_STATUS_INITIALIZING: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_STATUS_INITIALIZED) == (2), "SDL_INIT_STATUS_INITIALIZED: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_STATUS_UNINITIALIZING) == (3), "SDL_INIT_STATUS_UNINITIALIZING: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_InitState) == 24, "struct SDL_InitState: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_InitState) == 8, "struct SDL_InitState: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_InitState, status) == 0, "struct SDL_InitState.status: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_InitState, thread) == 8, "struct SDL_InitState.thread: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_InitState, reserved) == 16, "struct SDL_InitState.reserved: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_iostream.h ---- */
+_Static_assert(sizeof(enum SDL_IOStatus) == 4, "enum SDL_IOStatus: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_IOStatus) == 4, "enum SDL_IOStatus: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_IO_STATUS_READY) == (0), "SDL_IO_STATUS_READY: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_IO_STATUS_ERROR) == (1), "SDL_IO_STATUS_ERROR: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_IO_STATUS_EOF) == (2), "SDL_IO_STATUS_EOF: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_IO_STATUS_NOT_READY) == (3), "SDL_IO_STATUS_NOT_READY: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_IO_STATUS_READONLY) == (4), "SDL_IO_STATUS_READONLY: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_IO_STATUS_WRITEONLY) == (5), "SDL_IO_STATUS_WRITEONLY: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_IOWhence) == 4, "enum SDL_IOWhence: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_IOWhence) == 4, "enum SDL_IOWhence: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_IO_SEEK_SET) == (0), "SDL_IO_SEEK_SET: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_IO_SEEK_CUR) == (1), "SDL_IO_SEEK_CUR: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_IO_SEEK_END) == (2), "SDL_IO_SEEK_END: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_IOStreamInterface) == 56, "struct SDL_IOStreamInterface: baked sizeof 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_IOStreamInterface) == 8, "struct SDL_IOStreamInterface: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_IOStreamInterface, version) == 0, "struct SDL_IOStreamInterface.version: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_IOStreamInterface, size) == 8, "struct SDL_IOStreamInterface.size: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_IOStreamInterface, seek) == 16, "struct SDL_IOStreamInterface.seek: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_IOStreamInterface, read) == 24, "struct SDL_IOStreamInterface.read: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_IOStreamInterface, write) == 32, "struct SDL_IOStreamInterface.write: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_IOStreamInterface, flush) == 40, "struct SDL_IOStreamInterface.flush: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_IOStreamInterface, close) == 48, "struct SDL_IOStreamInterface.close: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_audio.h ---- */
+_Static_assert(sizeof(enum SDL_AudioFormat) == 4, "enum SDL_AudioFormat: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_AudioFormat) == 4, "enum SDL_AudioFormat: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_UNKNOWN) == (0), "SDL_AUDIO_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_U8) == (8), "SDL_AUDIO_U8: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_S8) == (32776), "SDL_AUDIO_S8: baked value 32776 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_S16LE) == (32784), "SDL_AUDIO_S16LE: baked value 32784 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_S16BE) == (36880), "SDL_AUDIO_S16BE: baked value 36880 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_S32LE) == (32800), "SDL_AUDIO_S32LE: baked value 32800 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_S32BE) == (36896), "SDL_AUDIO_S32BE: baked value 36896 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_F32LE) == (33056), "SDL_AUDIO_F32LE: baked value 33056 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_F32BE) == (37152), "SDL_AUDIO_F32BE: baked value 37152 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_S16) == (32784), "SDL_AUDIO_S16: baked value 32784 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_S32) == (32800), "SDL_AUDIO_S32: baked value 32800 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_AUDIO_F32) == (33056), "SDL_AUDIO_F32: baked value 33056 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_AudioSpec) == 12, "struct SDL_AudioSpec: baked sizeof 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_AudioSpec) == 4, "struct SDL_AudioSpec: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioSpec, format) == 0, "struct SDL_AudioSpec.format: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioSpec, channels) == 4, "struct SDL_AudioSpec.channels: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioSpec, freq) == 8, "struct SDL_AudioSpec.freq: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_blendmode.h ---- */
+_Static_assert(sizeof(enum SDL_BlendOperation) == 4, "enum SDL_BlendOperation: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_BlendOperation) == 4, "enum SDL_BlendOperation: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDOPERATION_ADD) == (1), "SDL_BLENDOPERATION_ADD: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDOPERATION_SUBTRACT) == (2), "SDL_BLENDOPERATION_SUBTRACT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDOPERATION_REV_SUBTRACT) == (3), "SDL_BLENDOPERATION_REV_SUBTRACT: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDOPERATION_MINIMUM) == (4), "SDL_BLENDOPERATION_MINIMUM: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDOPERATION_MAXIMUM) == (5), "SDL_BLENDOPERATION_MAXIMUM: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_BlendFactor) == 4, "enum SDL_BlendFactor: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_BlendFactor) == 4, "enum SDL_BlendFactor: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDFACTOR_ZERO) == (1), "SDL_BLENDFACTOR_ZERO: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDFACTOR_ONE) == (2), "SDL_BLENDFACTOR_ONE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDFACTOR_SRC_COLOR) == (3), "SDL_BLENDFACTOR_SRC_COLOR: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR) == (4), "SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDFACTOR_SRC_ALPHA) == (5), "SDL_BLENDFACTOR_SRC_ALPHA: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA) == (6), "SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDFACTOR_DST_COLOR) == (7), "SDL_BLENDFACTOR_DST_COLOR: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR) == (8), "SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDFACTOR_DST_ALPHA) == (9), "SDL_BLENDFACTOR_DST_ALPHA: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA) == (10), "SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_pixels.h ---- */
+_Static_assert(sizeof(enum SDL_PixelType) == 4, "enum SDL_PixelType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_PixelType) == 4, "enum SDL_PixelType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_UNKNOWN) == (0), "SDL_PIXELTYPE_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_INDEX1) == (1), "SDL_PIXELTYPE_INDEX1: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_INDEX4) == (2), "SDL_PIXELTYPE_INDEX4: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_INDEX8) == (3), "SDL_PIXELTYPE_INDEX8: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_PACKED8) == (4), "SDL_PIXELTYPE_PACKED8: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_PACKED16) == (5), "SDL_PIXELTYPE_PACKED16: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_PACKED32) == (6), "SDL_PIXELTYPE_PACKED32: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_ARRAYU8) == (7), "SDL_PIXELTYPE_ARRAYU8: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_ARRAYU16) == (8), "SDL_PIXELTYPE_ARRAYU16: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_ARRAYU32) == (9), "SDL_PIXELTYPE_ARRAYU32: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_ARRAYF16) == (10), "SDL_PIXELTYPE_ARRAYF16: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_ARRAYF32) == (11), "SDL_PIXELTYPE_ARRAYF32: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELTYPE_INDEX2) == (12), "SDL_PIXELTYPE_INDEX2: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_BitmapOrder) == 4, "enum SDL_BitmapOrder: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_BitmapOrder) == 4, "enum SDL_BitmapOrder: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BITMAPORDER_NONE) == (0), "SDL_BITMAPORDER_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BITMAPORDER_4321) == (1), "SDL_BITMAPORDER_4321: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BITMAPORDER_1234) == (2), "SDL_BITMAPORDER_1234: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_PackedOrder) == 4, "enum SDL_PackedOrder: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_PackedOrder) == 4, "enum SDL_PackedOrder: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDORDER_NONE) == (0), "SDL_PACKEDORDER_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDORDER_XRGB) == (1), "SDL_PACKEDORDER_XRGB: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDORDER_RGBX) == (2), "SDL_PACKEDORDER_RGBX: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDORDER_ARGB) == (3), "SDL_PACKEDORDER_ARGB: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDORDER_RGBA) == (4), "SDL_PACKEDORDER_RGBA: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDORDER_XBGR) == (5), "SDL_PACKEDORDER_XBGR: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDORDER_BGRX) == (6), "SDL_PACKEDORDER_BGRX: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDORDER_ABGR) == (7), "SDL_PACKEDORDER_ABGR: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDORDER_BGRA) == (8), "SDL_PACKEDORDER_BGRA: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_ArrayOrder) == 4, "enum SDL_ArrayOrder: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_ArrayOrder) == 4, "enum SDL_ArrayOrder: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ARRAYORDER_NONE) == (0), "SDL_ARRAYORDER_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ARRAYORDER_RGB) == (1), "SDL_ARRAYORDER_RGB: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ARRAYORDER_RGBA) == (2), "SDL_ARRAYORDER_RGBA: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ARRAYORDER_ARGB) == (3), "SDL_ARRAYORDER_ARGB: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ARRAYORDER_BGR) == (4), "SDL_ARRAYORDER_BGR: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ARRAYORDER_BGRA) == (5), "SDL_ARRAYORDER_BGRA: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ARRAYORDER_ABGR) == (6), "SDL_ARRAYORDER_ABGR: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_PackedLayout) == 4, "enum SDL_PackedLayout: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_PackedLayout) == 4, "enum SDL_PackedLayout: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDLAYOUT_NONE) == (0), "SDL_PACKEDLAYOUT_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDLAYOUT_332) == (1), "SDL_PACKEDLAYOUT_332: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDLAYOUT_4444) == (2), "SDL_PACKEDLAYOUT_4444: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDLAYOUT_1555) == (3), "SDL_PACKEDLAYOUT_1555: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDLAYOUT_5551) == (4), "SDL_PACKEDLAYOUT_5551: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDLAYOUT_565) == (5), "SDL_PACKEDLAYOUT_565: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDLAYOUT_8888) == (6), "SDL_PACKEDLAYOUT_8888: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDLAYOUT_2101010) == (7), "SDL_PACKEDLAYOUT_2101010: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PACKEDLAYOUT_1010102) == (8), "SDL_PACKEDLAYOUT_1010102: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_PixelFormat) == 4, "enum SDL_PixelFormat: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_PixelFormat) == 4, "enum SDL_PixelFormat: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_UNKNOWN) == (0), "SDL_PIXELFORMAT_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_INDEX1LSB) == (286261504), "SDL_PIXELFORMAT_INDEX1LSB: baked value 286261504 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_INDEX1MSB) == (287310080), "SDL_PIXELFORMAT_INDEX1MSB: baked value 287310080 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_INDEX2LSB) == (470811136), "SDL_PIXELFORMAT_INDEX2LSB: baked value 470811136 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_INDEX2MSB) == (471859712), "SDL_PIXELFORMAT_INDEX2MSB: baked value 471859712 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_INDEX4LSB) == (303039488), "SDL_PIXELFORMAT_INDEX4LSB: baked value 303039488 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_INDEX4MSB) == (304088064), "SDL_PIXELFORMAT_INDEX4MSB: baked value 304088064 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_INDEX8) == (318769153), "SDL_PIXELFORMAT_INDEX8: baked value 318769153 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGB332) == (336660481), "SDL_PIXELFORMAT_RGB332: baked value 336660481 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_XRGB4444) == (353504258), "SDL_PIXELFORMAT_XRGB4444: baked value 353504258 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_XBGR4444) == (357698562), "SDL_PIXELFORMAT_XBGR4444: baked value 357698562 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_XRGB1555) == (353570562), "SDL_PIXELFORMAT_XRGB1555: baked value 353570562 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_XBGR1555) == (357764866), "SDL_PIXELFORMAT_XBGR1555: baked value 357764866 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ARGB4444) == (355602434), "SDL_PIXELFORMAT_ARGB4444: baked value 355602434 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGBA4444) == (356651010), "SDL_PIXELFORMAT_RGBA4444: baked value 356651010 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ABGR4444) == (359796738), "SDL_PIXELFORMAT_ABGR4444: baked value 359796738 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGRA4444) == (360845314), "SDL_PIXELFORMAT_BGRA4444: baked value 360845314 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ARGB1555) == (355667970), "SDL_PIXELFORMAT_ARGB1555: baked value 355667970 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGBA5551) == (356782082), "SDL_PIXELFORMAT_RGBA5551: baked value 356782082 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ABGR1555) == (359862274), "SDL_PIXELFORMAT_ABGR1555: baked value 359862274 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGRA5551) == (360976386), "SDL_PIXELFORMAT_BGRA5551: baked value 360976386 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGB565) == (353701890), "SDL_PIXELFORMAT_RGB565: baked value 353701890 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGR565) == (357896194), "SDL_PIXELFORMAT_BGR565: baked value 357896194 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGB24) == (386930691), "SDL_PIXELFORMAT_RGB24: baked value 386930691 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGR24) == (390076419), "SDL_PIXELFORMAT_BGR24: baked value 390076419 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_XRGB8888) == (370546692), "SDL_PIXELFORMAT_XRGB8888: baked value 370546692 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGBX8888) == (371595268), "SDL_PIXELFORMAT_RGBX8888: baked value 371595268 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_XBGR8888) == (374740996), "SDL_PIXELFORMAT_XBGR8888: baked value 374740996 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGRX8888) == (375789572), "SDL_PIXELFORMAT_BGRX8888: baked value 375789572 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ARGB8888) == (372645892), "SDL_PIXELFORMAT_ARGB8888: baked value 372645892 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGBA8888) == (373694468), "SDL_PIXELFORMAT_RGBA8888: baked value 373694468 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ABGR8888) == (376840196), "SDL_PIXELFORMAT_ABGR8888: baked value 376840196 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGRA8888) == (377888772), "SDL_PIXELFORMAT_BGRA8888: baked value 377888772 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_XRGB2101010) == (370614276), "SDL_PIXELFORMAT_XRGB2101010: baked value 370614276 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_XBGR2101010) == (374808580), "SDL_PIXELFORMAT_XBGR2101010: baked value 374808580 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ARGB2101010) == (372711428), "SDL_PIXELFORMAT_ARGB2101010: baked value 372711428 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ABGR2101010) == (376905732), "SDL_PIXELFORMAT_ABGR2101010: baked value 376905732 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGB48) == (403714054), "SDL_PIXELFORMAT_RGB48: baked value 403714054 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGR48) == (406859782), "SDL_PIXELFORMAT_BGR48: baked value 406859782 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGBA64) == (404766728), "SDL_PIXELFORMAT_RGBA64: baked value 404766728 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ARGB64) == (405815304), "SDL_PIXELFORMAT_ARGB64: baked value 405815304 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGRA64) == (407912456), "SDL_PIXELFORMAT_BGRA64: baked value 407912456 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ABGR64) == (408961032), "SDL_PIXELFORMAT_ABGR64: baked value 408961032 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGB48_FLOAT) == (437268486), "SDL_PIXELFORMAT_RGB48_FLOAT: baked value 437268486 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGR48_FLOAT) == (440414214), "SDL_PIXELFORMAT_BGR48_FLOAT: baked value 440414214 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGBA64_FLOAT) == (438321160), "SDL_PIXELFORMAT_RGBA64_FLOAT: baked value 438321160 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ARGB64_FLOAT) == (439369736), "SDL_PIXELFORMAT_ARGB64_FLOAT: baked value 439369736 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGRA64_FLOAT) == (441466888), "SDL_PIXELFORMAT_BGRA64_FLOAT: baked value 441466888 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ABGR64_FLOAT) == (442515464), "SDL_PIXELFORMAT_ABGR64_FLOAT: baked value 442515464 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGB96_FLOAT) == (454057996), "SDL_PIXELFORMAT_RGB96_FLOAT: baked value 454057996 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGR96_FLOAT) == (457203724), "SDL_PIXELFORMAT_BGR96_FLOAT: baked value 457203724 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGBA128_FLOAT) == (455114768), "SDL_PIXELFORMAT_RGBA128_FLOAT: baked value 455114768 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ARGB128_FLOAT) == (456163344), "SDL_PIXELFORMAT_ARGB128_FLOAT: baked value 456163344 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGRA128_FLOAT) == (458260496), "SDL_PIXELFORMAT_BGRA128_FLOAT: baked value 458260496 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ABGR128_FLOAT) == (459309072), "SDL_PIXELFORMAT_ABGR128_FLOAT: baked value 459309072 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_YV12) == (842094169), "SDL_PIXELFORMAT_YV12: baked value 842094169 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_IYUV) == (1448433993), "SDL_PIXELFORMAT_IYUV: baked value 1448433993 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_YUY2) == (844715353), "SDL_PIXELFORMAT_YUY2: baked value 844715353 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_UYVY) == (1498831189), "SDL_PIXELFORMAT_UYVY: baked value 1498831189 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_YVYU) == (1431918169), "SDL_PIXELFORMAT_YVYU: baked value 1431918169 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_NV12) == (842094158), "SDL_PIXELFORMAT_NV12: baked value 842094158 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_NV21) == (825382478), "SDL_PIXELFORMAT_NV21: baked value 825382478 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_P010) == (808530000), "SDL_PIXELFORMAT_P010: baked value 808530000 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_EXTERNAL_OES) == (542328143), "SDL_PIXELFORMAT_EXTERNAL_OES: baked value 542328143 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 2, 6)
+_Static_assert((SDL_PIXELFORMAT_MJPG) == (1196444237), "SDL_PIXELFORMAT_MJPG: baked value 1196444237 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert((SDL_PIXELFORMAT_RGBA32) == (376840196), "SDL_PIXELFORMAT_RGBA32: baked value 376840196 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ARGB32) == (377888772), "SDL_PIXELFORMAT_ARGB32: baked value 377888772 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGRA32) == (372645892), "SDL_PIXELFORMAT_BGRA32: baked value 372645892 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_ABGR32) == (373694468), "SDL_PIXELFORMAT_ABGR32: baked value 373694468 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_RGBX32) == (374740996), "SDL_PIXELFORMAT_RGBX32: baked value 374740996 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_XRGB32) == (375789572), "SDL_PIXELFORMAT_XRGB32: baked value 375789572 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_BGRX32) == (370546692), "SDL_PIXELFORMAT_BGRX32: baked value 370546692 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PIXELFORMAT_XBGR32) == (371595268), "SDL_PIXELFORMAT_XBGR32: baked value 371595268 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_ColorType) == 4, "enum SDL_ColorType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_ColorType) == 4, "enum SDL_ColorType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_TYPE_UNKNOWN) == (0), "SDL_COLOR_TYPE_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_TYPE_RGB) == (1), "SDL_COLOR_TYPE_RGB: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_TYPE_YCBCR) == (2), "SDL_COLOR_TYPE_YCBCR: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_ColorRange) == 4, "enum SDL_ColorRange: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_ColorRange) == 4, "enum SDL_ColorRange: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_RANGE_UNKNOWN) == (0), "SDL_COLOR_RANGE_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_RANGE_LIMITED) == (1), "SDL_COLOR_RANGE_LIMITED: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_RANGE_FULL) == (2), "SDL_COLOR_RANGE_FULL: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_ColorPrimaries) == 4, "enum SDL_ColorPrimaries: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_ColorPrimaries) == 4, "enum SDL_ColorPrimaries: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_UNKNOWN) == (0), "SDL_COLOR_PRIMARIES_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_BT709) == (1), "SDL_COLOR_PRIMARIES_BT709: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_UNSPECIFIED) == (2), "SDL_COLOR_PRIMARIES_UNSPECIFIED: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_BT470M) == (4), "SDL_COLOR_PRIMARIES_BT470M: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_BT470BG) == (5), "SDL_COLOR_PRIMARIES_BT470BG: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_BT601) == (6), "SDL_COLOR_PRIMARIES_BT601: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_SMPTE240) == (7), "SDL_COLOR_PRIMARIES_SMPTE240: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_GENERIC_FILM) == (8), "SDL_COLOR_PRIMARIES_GENERIC_FILM: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_BT2020) == (9), "SDL_COLOR_PRIMARIES_BT2020: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_XYZ) == (10), "SDL_COLOR_PRIMARIES_XYZ: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_SMPTE431) == (11), "SDL_COLOR_PRIMARIES_SMPTE431: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_SMPTE432) == (12), "SDL_COLOR_PRIMARIES_SMPTE432: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_EBU3213) == (22), "SDL_COLOR_PRIMARIES_EBU3213: baked value 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLOR_PRIMARIES_CUSTOM) == (31), "SDL_COLOR_PRIMARIES_CUSTOM: baked value 31 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_TransferCharacteristics) == 4, "enum SDL_TransferCharacteristics: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_TransferCharacteristics) == 4, "enum SDL_TransferCharacteristics: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_UNKNOWN) == (0), "SDL_TRANSFER_CHARACTERISTICS_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_BT709) == (1), "SDL_TRANSFER_CHARACTERISTICS_BT709: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_UNSPECIFIED) == (2), "SDL_TRANSFER_CHARACTERISTICS_UNSPECIFIED: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_GAMMA22) == (4), "SDL_TRANSFER_CHARACTERISTICS_GAMMA22: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_GAMMA28) == (5), "SDL_TRANSFER_CHARACTERISTICS_GAMMA28: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_BT601) == (6), "SDL_TRANSFER_CHARACTERISTICS_BT601: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_SMPTE240) == (7), "SDL_TRANSFER_CHARACTERISTICS_SMPTE240: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_LINEAR) == (8), "SDL_TRANSFER_CHARACTERISTICS_LINEAR: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_LOG100) == (9), "SDL_TRANSFER_CHARACTERISTICS_LOG100: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_LOG100_SQRT10) == (10), "SDL_TRANSFER_CHARACTERISTICS_LOG100_SQRT10: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_IEC61966) == (11), "SDL_TRANSFER_CHARACTERISTICS_IEC61966: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_BT1361) == (12), "SDL_TRANSFER_CHARACTERISTICS_BT1361: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_SRGB) == (13), "SDL_TRANSFER_CHARACTERISTICS_SRGB: baked value 13 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_BT2020_10BIT) == (14), "SDL_TRANSFER_CHARACTERISTICS_BT2020_10BIT: baked value 14 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_BT2020_12BIT) == (15), "SDL_TRANSFER_CHARACTERISTICS_BT2020_12BIT: baked value 15 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_PQ) == (16), "SDL_TRANSFER_CHARACTERISTICS_PQ: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_SMPTE428) == (17), "SDL_TRANSFER_CHARACTERISTICS_SMPTE428: baked value 17 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_HLG) == (18), "SDL_TRANSFER_CHARACTERISTICS_HLG: baked value 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRANSFER_CHARACTERISTICS_CUSTOM) == (31), "SDL_TRANSFER_CHARACTERISTICS_CUSTOM: baked value 31 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_MatrixCoefficients) == 4, "enum SDL_MatrixCoefficients: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_MatrixCoefficients) == 4, "enum SDL_MatrixCoefficients: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_IDENTITY) == (0), "SDL_MATRIX_COEFFICIENTS_IDENTITY: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_BT709) == (1), "SDL_MATRIX_COEFFICIENTS_BT709: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_UNSPECIFIED) == (2), "SDL_MATRIX_COEFFICIENTS_UNSPECIFIED: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_FCC) == (4), "SDL_MATRIX_COEFFICIENTS_FCC: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_BT470BG) == (5), "SDL_MATRIX_COEFFICIENTS_BT470BG: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_BT601) == (6), "SDL_MATRIX_COEFFICIENTS_BT601: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_SMPTE240) == (7), "SDL_MATRIX_COEFFICIENTS_SMPTE240: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_YCGCO) == (8), "SDL_MATRIX_COEFFICIENTS_YCGCO: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_BT2020_NCL) == (9), "SDL_MATRIX_COEFFICIENTS_BT2020_NCL: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_BT2020_CL) == (10), "SDL_MATRIX_COEFFICIENTS_BT2020_CL: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_SMPTE2085) == (11), "SDL_MATRIX_COEFFICIENTS_SMPTE2085: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_NCL) == (12), "SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_NCL: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_CL) == (13), "SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_CL: baked value 13 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_ICTCP) == (14), "SDL_MATRIX_COEFFICIENTS_ICTCP: baked value 14 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MATRIX_COEFFICIENTS_CUSTOM) == (31), "SDL_MATRIX_COEFFICIENTS_CUSTOM: baked value 31 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_ChromaLocation) == 4, "enum SDL_ChromaLocation: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_ChromaLocation) == 4, "enum SDL_ChromaLocation: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CHROMA_LOCATION_NONE) == (0), "SDL_CHROMA_LOCATION_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CHROMA_LOCATION_LEFT) == (1), "SDL_CHROMA_LOCATION_LEFT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CHROMA_LOCATION_CENTER) == (2), "SDL_CHROMA_LOCATION_CENTER: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CHROMA_LOCATION_TOPLEFT) == (3), "SDL_CHROMA_LOCATION_TOPLEFT: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_Colorspace) == 4, "enum SDL_Colorspace: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_Colorspace) == 4, "enum SDL_Colorspace: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_UNKNOWN) == (0), "SDL_COLORSPACE_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_SRGB) == (301991328), "SDL_COLORSPACE_SRGB: baked value 301991328 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_SRGB_LINEAR) == (301991168), "SDL_COLORSPACE_SRGB_LINEAR: baked value 301991168 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_HDR10) == (301999616), "SDL_COLORSPACE_HDR10: baked value 301999616 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_JPEG) == (570426566), "SDL_COLORSPACE_JPEG: baked value 570426566 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_BT601_LIMITED) == (554703046), "SDL_COLORSPACE_BT601_LIMITED: baked value 554703046 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_BT601_FULL) == (571480262), "SDL_COLORSPACE_BT601_FULL: baked value 571480262 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_BT709_LIMITED) == (554697761), "SDL_COLORSPACE_BT709_LIMITED: baked value 554697761 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_BT709_FULL) == (571474977), "SDL_COLORSPACE_BT709_FULL: baked value 571474977 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_BT2020_LIMITED) == (554706441), "SDL_COLORSPACE_BT2020_LIMITED: baked value 554706441 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_BT2020_FULL) == (571483657), "SDL_COLORSPACE_BT2020_FULL: baked value 571483657 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_COLORSPACE_RGB_DEFAULT) == (301991328), "SDL_COLORSPACE_RGB_DEFAULT: baked value 301991328 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert((SDL_COLORSPACE_YUV_DEFAULT) == (554703046), "SDL_COLORSPACE_YUV_DEFAULT: baked value 554703046 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(sizeof(struct SDL_Color) == 4, "struct SDL_Color: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_Color) == 1, "struct SDL_Color: baked alignment 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Color, r) == 0, "struct SDL_Color.r: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Color, g) == 1, "struct SDL_Color.g: baked offset 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Color, b) == 2, "struct SDL_Color.b: baked offset 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Color, a) == 3, "struct SDL_Color.a: baked offset 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_FColor) == 16, "struct SDL_FColor: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_FColor) == 4, "struct SDL_FColor: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_FColor, r) == 0, "struct SDL_FColor.r: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_FColor, g) == 4, "struct SDL_FColor.g: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_FColor, b) == 8, "struct SDL_FColor.b: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_FColor, a) == 12, "struct SDL_FColor.a: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_Palette) == 24, "struct SDL_Palette: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_Palette) == 8, "struct SDL_Palette: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Palette, ncolors) == 0, "struct SDL_Palette.ncolors: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Palette, colors) == 8, "struct SDL_Palette.colors: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Palette, version) == 16, "struct SDL_Palette.version: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Palette, refcount) == 20, "struct SDL_Palette.refcount: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_PixelFormatDetails) == 32, "struct SDL_PixelFormatDetails: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_PixelFormatDetails) == 4, "struct SDL_PixelFormatDetails: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, format) == 0, "struct SDL_PixelFormatDetails.format: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, bits_per_pixel) == 4, "struct SDL_PixelFormatDetails.bits_per_pixel: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, bytes_per_pixel) == 5, "struct SDL_PixelFormatDetails.bytes_per_pixel: baked offset 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, padding) == 6, "struct SDL_PixelFormatDetails.padding: baked offset 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Rmask) == 8, "struct SDL_PixelFormatDetails.Rmask: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Gmask) == 12, "struct SDL_PixelFormatDetails.Gmask: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Bmask) == 16, "struct SDL_PixelFormatDetails.Bmask: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Amask) == 20, "struct SDL_PixelFormatDetails.Amask: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Rbits) == 24, "struct SDL_PixelFormatDetails.Rbits: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Gbits) == 25, "struct SDL_PixelFormatDetails.Gbits: baked offset 25 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Bbits) == 26, "struct SDL_PixelFormatDetails.Bbits: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Abits) == 27, "struct SDL_PixelFormatDetails.Abits: baked offset 27 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Rshift) == 28, "struct SDL_PixelFormatDetails.Rshift: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Gshift) == 29, "struct SDL_PixelFormatDetails.Gshift: baked offset 29 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Bshift) == 30, "struct SDL_PixelFormatDetails.Bshift: baked offset 30 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PixelFormatDetails, Ashift) == 31, "struct SDL_PixelFormatDetails.Ashift: baked offset 31 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_rect.h ---- */
+_Static_assert(sizeof(struct SDL_Point) == 8, "struct SDL_Point: baked sizeof 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_Point) == 4, "struct SDL_Point: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Point, x) == 0, "struct SDL_Point.x: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Point, y) == 4, "struct SDL_Point.y: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_FPoint) == 8, "struct SDL_FPoint: baked sizeof 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_FPoint) == 4, "struct SDL_FPoint: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_FPoint, x) == 0, "struct SDL_FPoint.x: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_FPoint, y) == 4, "struct SDL_FPoint.y: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_Rect) == 16, "struct SDL_Rect: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_Rect) == 4, "struct SDL_Rect: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Rect, x) == 0, "struct SDL_Rect.x: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Rect, y) == 4, "struct SDL_Rect.y: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Rect, w) == 8, "struct SDL_Rect.w: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Rect, h) == 12, "struct SDL_Rect.h: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_FRect) == 16, "struct SDL_FRect: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_FRect) == 4, "struct SDL_FRect: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_FRect, x) == 0, "struct SDL_FRect.x: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_FRect, y) == 4, "struct SDL_FRect.y: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_FRect, w) == 8, "struct SDL_FRect.w: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_FRect, h) == 12, "struct SDL_FRect.h: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_surface.h ---- */
+_Static_assert(sizeof(enum SDL_ScaleMode) == 4, "enum SDL_ScaleMode: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_ScaleMode) == 4, "enum SDL_ScaleMode: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 2, 10)
+_Static_assert((SDL_SCALEMODE_INVALID) == (-1), "SDL_SCALEMODE_INVALID: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert((SDL_SCALEMODE_NEAREST) == (0), "SDL_SCALEMODE_NEAREST: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCALEMODE_LINEAR) == (1), "SDL_SCALEMODE_LINEAR: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert((SDL_SCALEMODE_PIXELART) == (2), "SDL_SCALEMODE_PIXELART: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(sizeof(enum SDL_FlipMode) == 4, "enum SDL_FlipMode: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_FlipMode) == 4, "enum SDL_FlipMode: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FLIP_NONE) == (0), "SDL_FLIP_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FLIP_HORIZONTAL) == (1), "SDL_FLIP_HORIZONTAL: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FLIP_VERTICAL) == (2), "SDL_FLIP_VERTICAL: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert((SDL_FLIP_HORIZONTAL_AND_VERTICAL) == (3), "SDL_FLIP_HORIZONTAL_AND_VERTICAL: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(sizeof(struct SDL_Surface) == 48, "struct SDL_Surface: baked sizeof 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_Surface) == 8, "struct SDL_Surface: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Surface, flags) == 0, "struct SDL_Surface.flags: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Surface, format) == 4, "struct SDL_Surface.format: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Surface, w) == 8, "struct SDL_Surface.w: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Surface, h) == 12, "struct SDL_Surface.h: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Surface, pitch) == 16, "struct SDL_Surface.pitch: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Surface, pixels) == 24, "struct SDL_Surface.pixels: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Surface, refcount) == 32, "struct SDL_Surface.refcount: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Surface, reserved) == 40, "struct SDL_Surface.reserved: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_camera.h ---- */
+_Static_assert(sizeof(struct SDL_CameraSpec) == 24, "struct SDL_CameraSpec: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_CameraSpec) == 4, "struct SDL_CameraSpec: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CameraSpec, format) == 0, "struct SDL_CameraSpec.format: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CameraSpec, colorspace) == 4, "struct SDL_CameraSpec.colorspace: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CameraSpec, width) == 8, "struct SDL_CameraSpec.width: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CameraSpec, height) == 12, "struct SDL_CameraSpec.height: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CameraSpec, framerate_numerator) == 16, "struct SDL_CameraSpec.framerate_numerator: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CameraSpec, framerate_denominator) == 20, "struct SDL_CameraSpec.framerate_denominator: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_CameraPosition) == 4, "enum SDL_CameraPosition: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_CameraPosition) == 4, "enum SDL_CameraPosition: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CAMERA_POSITION_UNKNOWN) == (0), "SDL_CAMERA_POSITION_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CAMERA_POSITION_FRONT_FACING) == (1), "SDL_CAMERA_POSITION_FRONT_FACING: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CAMERA_POSITION_BACK_FACING) == (2), "SDL_CAMERA_POSITION_BACK_FACING: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert(sizeof(enum SDL_CameraPermissionState) == 4, "enum SDL_CameraPermissionState: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_CameraPermissionState) == 4, "enum SDL_CameraPermissionState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CAMERA_PERMISSION_STATE_DENIED) == (-1), "SDL_CAMERA_PERMISSION_STATE_DENIED: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CAMERA_PERMISSION_STATE_PENDING) == (0), "SDL_CAMERA_PERMISSION_STATE_PENDING: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CAMERA_PERMISSION_STATE_APPROVED) == (1), "SDL_CAMERA_PERMISSION_STATE_APPROVED: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+
+/* ---- SDL_video.h ---- */
+_Static_assert(sizeof(enum SDL_SystemTheme) == 4, "enum SDL_SystemTheme: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_SystemTheme) == 4, "enum SDL_SystemTheme: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_THEME_UNKNOWN) == (0), "SDL_SYSTEM_THEME_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_THEME_LIGHT) == (1), "SDL_SYSTEM_THEME_LIGHT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_THEME_DARK) == (2), "SDL_SYSTEM_THEME_DARK: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_DisplayMode) == 40, "struct SDL_DisplayMode: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_DisplayMode) == 8, "struct SDL_DisplayMode: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayMode, displayID) == 0, "struct SDL_DisplayMode.displayID: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayMode, format) == 4, "struct SDL_DisplayMode.format: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayMode, w) == 8, "struct SDL_DisplayMode.w: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayMode, h) == 12, "struct SDL_DisplayMode.h: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayMode, pixel_density) == 16, "struct SDL_DisplayMode.pixel_density: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayMode, refresh_rate) == 20, "struct SDL_DisplayMode.refresh_rate: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayMode, refresh_rate_numerator) == 24, "struct SDL_DisplayMode.refresh_rate_numerator: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayMode, refresh_rate_denominator) == 28, "struct SDL_DisplayMode.refresh_rate_denominator: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayMode, internal) == 32, "struct SDL_DisplayMode.internal: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_DisplayOrientation) == 4, "enum SDL_DisplayOrientation: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_DisplayOrientation) == 4, "enum SDL_DisplayOrientation: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ORIENTATION_UNKNOWN) == (0), "SDL_ORIENTATION_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ORIENTATION_LANDSCAPE) == (1), "SDL_ORIENTATION_LANDSCAPE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ORIENTATION_LANDSCAPE_FLIPPED) == (2), "SDL_ORIENTATION_LANDSCAPE_FLIPPED: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ORIENTATION_PORTRAIT) == (3), "SDL_ORIENTATION_PORTRAIT: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ORIENTATION_PORTRAIT_FLIPPED) == (4), "SDL_ORIENTATION_PORTRAIT_FLIPPED: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_FlashOperation) == 4, "enum SDL_FlashOperation: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_FlashOperation) == 4, "enum SDL_FlashOperation: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FLASH_CANCEL) == (0), "SDL_FLASH_CANCEL: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FLASH_BRIEFLY) == (1), "SDL_FLASH_BRIEFLY: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FLASH_UNTIL_FOCUSED) == (2), "SDL_FLASH_UNTIL_FOCUSED: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert(sizeof(enum SDL_ProgressState) == 4, "enum SDL_ProgressState: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_ProgressState) == 4, "enum SDL_ProgressState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROGRESS_STATE_INVALID) == (-1), "SDL_PROGRESS_STATE_INVALID: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROGRESS_STATE_NONE) == (0), "SDL_PROGRESS_STATE_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROGRESS_STATE_INDETERMINATE) == (1), "SDL_PROGRESS_STATE_INDETERMINATE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROGRESS_STATE_NORMAL) == (2), "SDL_PROGRESS_STATE_NORMAL: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROGRESS_STATE_PAUSED) == (3), "SDL_PROGRESS_STATE_PAUSED: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROGRESS_STATE_ERROR) == (4), "SDL_PROGRESS_STATE_ERROR: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(sizeof(enum SDL_GLAttr) == 4, "enum SDL_GLAttr: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GLAttr) == 4, "enum SDL_GLAttr: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_RED_SIZE) == (0), "SDL_GL_RED_SIZE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_GREEN_SIZE) == (1), "SDL_GL_GREEN_SIZE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_BLUE_SIZE) == (2), "SDL_GL_BLUE_SIZE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_ALPHA_SIZE) == (3), "SDL_GL_ALPHA_SIZE: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_BUFFER_SIZE) == (4), "SDL_GL_BUFFER_SIZE: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_DOUBLEBUFFER) == (5), "SDL_GL_DOUBLEBUFFER: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_DEPTH_SIZE) == (6), "SDL_GL_DEPTH_SIZE: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_STENCIL_SIZE) == (7), "SDL_GL_STENCIL_SIZE: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_ACCUM_RED_SIZE) == (8), "SDL_GL_ACCUM_RED_SIZE: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_ACCUM_GREEN_SIZE) == (9), "SDL_GL_ACCUM_GREEN_SIZE: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_ACCUM_BLUE_SIZE) == (10), "SDL_GL_ACCUM_BLUE_SIZE: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_ACCUM_ALPHA_SIZE) == (11), "SDL_GL_ACCUM_ALPHA_SIZE: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_STEREO) == (12), "SDL_GL_STEREO: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_MULTISAMPLEBUFFERS) == (13), "SDL_GL_MULTISAMPLEBUFFERS: baked value 13 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_MULTISAMPLESAMPLES) == (14), "SDL_GL_MULTISAMPLESAMPLES: baked value 14 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_ACCELERATED_VISUAL) == (15), "SDL_GL_ACCELERATED_VISUAL: baked value 15 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_RETAINED_BACKING) == (16), "SDL_GL_RETAINED_BACKING: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_MAJOR_VERSION) == (17), "SDL_GL_CONTEXT_MAJOR_VERSION: baked value 17 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_MINOR_VERSION) == (18), "SDL_GL_CONTEXT_MINOR_VERSION: baked value 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_FLAGS) == (19), "SDL_GL_CONTEXT_FLAGS: baked value 19 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_PROFILE_MASK) == (20), "SDL_GL_CONTEXT_PROFILE_MASK: baked value 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_SHARE_WITH_CURRENT_CONTEXT) == (21), "SDL_GL_SHARE_WITH_CURRENT_CONTEXT: baked value 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_FRAMEBUFFER_SRGB_CAPABLE) == (22), "SDL_GL_FRAMEBUFFER_SRGB_CAPABLE: baked value 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_RELEASE_BEHAVIOR) == (23), "SDL_GL_CONTEXT_RELEASE_BEHAVIOR: baked value 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_RESET_NOTIFICATION) == (24), "SDL_GL_CONTEXT_RESET_NOTIFICATION: baked value 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_NO_ERROR) == (25), "SDL_GL_CONTEXT_NO_ERROR: baked value 25 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_FLOATBUFFERS) == (26), "SDL_GL_FLOATBUFFERS: baked value 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_EGL_PLATFORM) == (27), "SDL_GL_EGL_PLATFORM: baked value 27 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_HitTestResult) == 4, "enum SDL_HitTestResult: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_HitTestResult) == 4, "enum SDL_HitTestResult: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HITTEST_NORMAL) == (0), "SDL_HITTEST_NORMAL: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HITTEST_DRAGGABLE) == (1), "SDL_HITTEST_DRAGGABLE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HITTEST_RESIZE_TOPLEFT) == (2), "SDL_HITTEST_RESIZE_TOPLEFT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HITTEST_RESIZE_TOP) == (3), "SDL_HITTEST_RESIZE_TOP: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HITTEST_RESIZE_TOPRIGHT) == (4), "SDL_HITTEST_RESIZE_TOPRIGHT: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HITTEST_RESIZE_RIGHT) == (5), "SDL_HITTEST_RESIZE_RIGHT: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HITTEST_RESIZE_BOTTOMRIGHT) == (6), "SDL_HITTEST_RESIZE_BOTTOMRIGHT: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HITTEST_RESIZE_BOTTOM) == (7), "SDL_HITTEST_RESIZE_BOTTOM: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HITTEST_RESIZE_BOTTOMLEFT) == (8), "SDL_HITTEST_RESIZE_BOTTOMLEFT: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HITTEST_RESIZE_LEFT) == (9), "SDL_HITTEST_RESIZE_LEFT: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_dialog.h ---- */
+_Static_assert(sizeof(struct SDL_DialogFileFilter) == 16, "struct SDL_DialogFileFilter: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_DialogFileFilter) == 8, "struct SDL_DialogFileFilter: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DialogFileFilter, name) == 0, "struct SDL_DialogFileFilter.name: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DialogFileFilter, pattern) == 8, "struct SDL_DialogFileFilter.pattern: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_FileDialogType) == 4, "enum SDL_FileDialogType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_FileDialogType) == 4, "enum SDL_FileDialogType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FILEDIALOG_OPENFILE) == (0), "SDL_FILEDIALOG_OPENFILE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FILEDIALOG_SAVEFILE) == (1), "SDL_FILEDIALOG_SAVEFILE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FILEDIALOG_OPENFOLDER) == (2), "SDL_FILEDIALOG_OPENFOLDER: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_guid.h ---- */
+_Static_assert(sizeof(struct SDL_GUID) == 16, "struct SDL_GUID: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GUID) == 1, "struct SDL_GUID: baked alignment 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GUID, data) == 0, "struct SDL_GUID.data: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_power.h ---- */
+_Static_assert(sizeof(enum SDL_PowerState) == 4, "enum SDL_PowerState: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_PowerState) == 4, "enum SDL_PowerState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_POWERSTATE_ERROR) == (-1), "SDL_POWERSTATE_ERROR: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_POWERSTATE_UNKNOWN) == (0), "SDL_POWERSTATE_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_POWERSTATE_ON_BATTERY) == (1), "SDL_POWERSTATE_ON_BATTERY: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_POWERSTATE_NO_BATTERY) == (2), "SDL_POWERSTATE_NO_BATTERY: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_POWERSTATE_CHARGING) == (3), "SDL_POWERSTATE_CHARGING: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_POWERSTATE_CHARGED) == (4), "SDL_POWERSTATE_CHARGED: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_sensor.h ---- */
+_Static_assert(sizeof(enum SDL_SensorType) == 4, "enum SDL_SensorType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_SensorType) == 4, "enum SDL_SensorType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SENSOR_INVALID) == (-1), "SDL_SENSOR_INVALID: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SENSOR_UNKNOWN) == (0), "SDL_SENSOR_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SENSOR_ACCEL) == (1), "SDL_SENSOR_ACCEL: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SENSOR_GYRO) == (2), "SDL_SENSOR_GYRO: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SENSOR_ACCEL_L) == (3), "SDL_SENSOR_ACCEL_L: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SENSOR_GYRO_L) == (4), "SDL_SENSOR_GYRO_L: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SENSOR_ACCEL_R) == (5), "SDL_SENSOR_ACCEL_R: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SENSOR_GYRO_R) == (6), "SDL_SENSOR_GYRO_R: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 2, 30)
+_Static_assert((SDL_SENSOR_COUNT) == (7), "SDL_SENSOR_COUNT: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+
+/* ---- SDL_joystick.h ---- */
+_Static_assert(sizeof(enum SDL_JoystickType) == 4, "enum SDL_JoystickType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_JoystickType) == 4, "enum SDL_JoystickType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_UNKNOWN) == (0), "SDL_JOYSTICK_TYPE_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_GAMEPAD) == (1), "SDL_JOYSTICK_TYPE_GAMEPAD: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_WHEEL) == (2), "SDL_JOYSTICK_TYPE_WHEEL: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_ARCADE_STICK) == (3), "SDL_JOYSTICK_TYPE_ARCADE_STICK: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_FLIGHT_STICK) == (4), "SDL_JOYSTICK_TYPE_FLIGHT_STICK: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_DANCE_PAD) == (5), "SDL_JOYSTICK_TYPE_DANCE_PAD: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_GUITAR) == (6), "SDL_JOYSTICK_TYPE_GUITAR: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_DRUM_KIT) == (7), "SDL_JOYSTICK_TYPE_DRUM_KIT: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_ARCADE_PAD) == (8), "SDL_JOYSTICK_TYPE_ARCADE_PAD: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_THROTTLE) == (9), "SDL_JOYSTICK_TYPE_THROTTLE: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_TYPE_COUNT) == (10), "SDL_JOYSTICK_TYPE_COUNT: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_JoystickConnectionState) == 4, "enum SDL_JoystickConnectionState: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_JoystickConnectionState) == 4, "enum SDL_JoystickConnectionState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_CONNECTION_INVALID) == (-1), "SDL_JOYSTICK_CONNECTION_INVALID: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_CONNECTION_UNKNOWN) == (0), "SDL_JOYSTICK_CONNECTION_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_CONNECTION_WIRED) == (1), "SDL_JOYSTICK_CONNECTION_WIRED: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_JOYSTICK_CONNECTION_WIRELESS) == (2), "SDL_JOYSTICK_CONNECTION_WIRELESS: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_VirtualJoystickTouchpadDesc) == 8, "struct SDL_VirtualJoystickTouchpadDesc: baked sizeof 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_VirtualJoystickTouchpadDesc) == 2, "struct SDL_VirtualJoystickTouchpadDesc: baked alignment 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickTouchpadDesc, nfingers) == 0, "struct SDL_VirtualJoystickTouchpadDesc.nfingers: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickTouchpadDesc, padding) == 2, "struct SDL_VirtualJoystickTouchpadDesc.padding: baked offset 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_VirtualJoystickSensorDesc) == 8, "struct SDL_VirtualJoystickSensorDesc: baked sizeof 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_VirtualJoystickSensorDesc) == 4, "struct SDL_VirtualJoystickSensorDesc: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickSensorDesc, type) == 0, "struct SDL_VirtualJoystickSensorDesc.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickSensorDesc, rate) == 4, "struct SDL_VirtualJoystickSensorDesc.rate: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_VirtualJoystickDesc) == 136, "struct SDL_VirtualJoystickDesc: baked sizeof 136 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_VirtualJoystickDesc) == 8, "struct SDL_VirtualJoystickDesc: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, version) == 0, "struct SDL_VirtualJoystickDesc.version: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, type) == 4, "struct SDL_VirtualJoystickDesc.type: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, padding) == 6, "struct SDL_VirtualJoystickDesc.padding: baked offset 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, vendor_id) == 8, "struct SDL_VirtualJoystickDesc.vendor_id: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, product_id) == 10, "struct SDL_VirtualJoystickDesc.product_id: baked offset 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, naxes) == 12, "struct SDL_VirtualJoystickDesc.naxes: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, nbuttons) == 14, "struct SDL_VirtualJoystickDesc.nbuttons: baked offset 14 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, nballs) == 16, "struct SDL_VirtualJoystickDesc.nballs: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, nhats) == 18, "struct SDL_VirtualJoystickDesc.nhats: baked offset 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, ntouchpads) == 20, "struct SDL_VirtualJoystickDesc.ntouchpads: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, nsensors) == 22, "struct SDL_VirtualJoystickDesc.nsensors: baked offset 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, padding2) == 24, "struct SDL_VirtualJoystickDesc.padding2: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, button_mask) == 28, "struct SDL_VirtualJoystickDesc.button_mask: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, axis_mask) == 32, "struct SDL_VirtualJoystickDesc.axis_mask: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, name) == 40, "struct SDL_VirtualJoystickDesc.name: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, touchpads) == 48, "struct SDL_VirtualJoystickDesc.touchpads: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, sensors) == 56, "struct SDL_VirtualJoystickDesc.sensors: baked offset 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, userdata) == 64, "struct SDL_VirtualJoystickDesc.userdata: baked offset 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, Update) == 72, "struct SDL_VirtualJoystickDesc.Update: baked offset 72 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, SetPlayerIndex) == 80, "struct SDL_VirtualJoystickDesc.SetPlayerIndex: baked offset 80 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, Rumble) == 88, "struct SDL_VirtualJoystickDesc.Rumble: baked offset 88 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, RumbleTriggers) == 96, "struct SDL_VirtualJoystickDesc.RumbleTriggers: baked offset 96 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, SetLED) == 104, "struct SDL_VirtualJoystickDesc.SetLED: baked offset 104 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, SendEffect) == 112, "struct SDL_VirtualJoystickDesc.SendEffect: baked offset 112 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, SetSensorsEnabled) == 120, "struct SDL_VirtualJoystickDesc.SetSensorsEnabled: baked offset 120 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_VirtualJoystickDesc, Cleanup) == 128, "struct SDL_VirtualJoystickDesc.Cleanup: baked offset 128 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_gamepad.h ---- */
+_Static_assert(sizeof(enum SDL_GamepadType) == 4, "enum SDL_GamepadType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GamepadType) == 4, "enum SDL_GamepadType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_UNKNOWN) == (0), "SDL_GAMEPAD_TYPE_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_STANDARD) == (1), "SDL_GAMEPAD_TYPE_STANDARD: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_XBOX360) == (2), "SDL_GAMEPAD_TYPE_XBOX360: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_XBOXONE) == (3), "SDL_GAMEPAD_TYPE_XBOXONE: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_PS3) == (4), "SDL_GAMEPAD_TYPE_PS3: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_PS4) == (5), "SDL_GAMEPAD_TYPE_PS4: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_PS5) == (6), "SDL_GAMEPAD_TYPE_PS5: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO) == (7), "SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT) == (8), "SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT) == (9), "SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR) == (10), "SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert((SDL_GAMEPAD_TYPE_GAMECUBE) == (11), "SDL_GAMEPAD_TYPE_GAMECUBE: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_TYPE_COUNT) == (12), "SDL_GAMEPAD_TYPE_COUNT: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(sizeof(enum SDL_GamepadButton) == 4, "enum SDL_GamepadButton: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GamepadButton) == 4, "enum SDL_GamepadButton: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_INVALID) == (-1), "SDL_GAMEPAD_BUTTON_INVALID: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_SOUTH) == (0), "SDL_GAMEPAD_BUTTON_SOUTH: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_EAST) == (1), "SDL_GAMEPAD_BUTTON_EAST: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_WEST) == (2), "SDL_GAMEPAD_BUTTON_WEST: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_NORTH) == (3), "SDL_GAMEPAD_BUTTON_NORTH: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_BACK) == (4), "SDL_GAMEPAD_BUTTON_BACK: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_GUIDE) == (5), "SDL_GAMEPAD_BUTTON_GUIDE: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_START) == (6), "SDL_GAMEPAD_BUTTON_START: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LEFT_STICK) == (7), "SDL_GAMEPAD_BUTTON_LEFT_STICK: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_RIGHT_STICK) == (8), "SDL_GAMEPAD_BUTTON_RIGHT_STICK: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LEFT_SHOULDER) == (9), "SDL_GAMEPAD_BUTTON_LEFT_SHOULDER: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER) == (10), "SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_DPAD_UP) == (11), "SDL_GAMEPAD_BUTTON_DPAD_UP: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_DPAD_DOWN) == (12), "SDL_GAMEPAD_BUTTON_DPAD_DOWN: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_DPAD_LEFT) == (13), "SDL_GAMEPAD_BUTTON_DPAD_LEFT: baked value 13 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_DPAD_RIGHT) == (14), "SDL_GAMEPAD_BUTTON_DPAD_RIGHT: baked value 14 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_MISC1) == (15), "SDL_GAMEPAD_BUTTON_MISC1: baked value 15 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1) == (16), "SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LEFT_PADDLE1) == (17), "SDL_GAMEPAD_BUTTON_LEFT_PADDLE1: baked value 17 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2) == (18), "SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2: baked value 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LEFT_PADDLE2) == (19), "SDL_GAMEPAD_BUTTON_LEFT_PADDLE2: baked value 19 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_TOUCHPAD) == (20), "SDL_GAMEPAD_BUTTON_TOUCHPAD: baked value 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_MISC2) == (21), "SDL_GAMEPAD_BUTTON_MISC2: baked value 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_MISC3) == (22), "SDL_GAMEPAD_BUTTON_MISC3: baked value 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_MISC4) == (23), "SDL_GAMEPAD_BUTTON_MISC4: baked value 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_MISC5) == (24), "SDL_GAMEPAD_BUTTON_MISC5: baked value 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_MISC6) == (25), "SDL_GAMEPAD_BUTTON_MISC6: baked value 25 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_COUNT) == (26), "SDL_GAMEPAD_BUTTON_COUNT: baked value 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GamepadButtonLabel) == 4, "enum SDL_GamepadButtonLabel: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GamepadButtonLabel) == 4, "enum SDL_GamepadButtonLabel: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN) == (0), "SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LABEL_A) == (1), "SDL_GAMEPAD_BUTTON_LABEL_A: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LABEL_B) == (2), "SDL_GAMEPAD_BUTTON_LABEL_B: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LABEL_X) == (3), "SDL_GAMEPAD_BUTTON_LABEL_X: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LABEL_Y) == (4), "SDL_GAMEPAD_BUTTON_LABEL_Y: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LABEL_CROSS) == (5), "SDL_GAMEPAD_BUTTON_LABEL_CROSS: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LABEL_CIRCLE) == (6), "SDL_GAMEPAD_BUTTON_LABEL_CIRCLE: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LABEL_SQUARE) == (7), "SDL_GAMEPAD_BUTTON_LABEL_SQUARE: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE) == (8), "SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GamepadAxis) == 4, "enum SDL_GamepadAxis: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GamepadAxis) == 4, "enum SDL_GamepadAxis: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_AXIS_INVALID) == (-1), "SDL_GAMEPAD_AXIS_INVALID: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_AXIS_LEFTX) == (0), "SDL_GAMEPAD_AXIS_LEFTX: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_AXIS_LEFTY) == (1), "SDL_GAMEPAD_AXIS_LEFTY: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_AXIS_RIGHTX) == (2), "SDL_GAMEPAD_AXIS_RIGHTX: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_AXIS_RIGHTY) == (3), "SDL_GAMEPAD_AXIS_RIGHTY: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_AXIS_LEFT_TRIGGER) == (4), "SDL_GAMEPAD_AXIS_LEFT_TRIGGER: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_AXIS_RIGHT_TRIGGER) == (5), "SDL_GAMEPAD_AXIS_RIGHT_TRIGGER: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_AXIS_COUNT) == (6), "SDL_GAMEPAD_AXIS_COUNT: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GamepadBindingType) == 4, "enum SDL_GamepadBindingType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GamepadBindingType) == 4, "enum SDL_GamepadBindingType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BINDTYPE_NONE) == (0), "SDL_GAMEPAD_BINDTYPE_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BINDTYPE_BUTTON) == (1), "SDL_GAMEPAD_BINDTYPE_BUTTON: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BINDTYPE_AXIS) == (2), "SDL_GAMEPAD_BINDTYPE_AXIS: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GAMEPAD_BINDTYPE_HAT) == (3), "SDL_GAMEPAD_BINDTYPE_HAT: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GamepadBinding) == 32, "struct SDL_GamepadBinding: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GamepadBinding) == 4, "struct SDL_GamepadBinding: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadBinding, input_type) == 0, "struct SDL_GamepadBinding.input_type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadBinding, input) == 4, "struct SDL_GamepadBinding.input: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadBinding, output_type) == 16, "struct SDL_GamepadBinding.output_type: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadBinding, output) == 20, "struct SDL_GamepadBinding.output: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_scancode.h ---- */
+_Static_assert(sizeof(enum SDL_Scancode) == 4, "enum SDL_Scancode: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_Scancode) == 4, "enum SDL_Scancode: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_UNKNOWN) == (0), "SDL_SCANCODE_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_A) == (4), "SDL_SCANCODE_A: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_B) == (5), "SDL_SCANCODE_B: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_C) == (6), "SDL_SCANCODE_C: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_D) == (7), "SDL_SCANCODE_D: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_E) == (8), "SDL_SCANCODE_E: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F) == (9), "SDL_SCANCODE_F: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_G) == (10), "SDL_SCANCODE_G: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_H) == (11), "SDL_SCANCODE_H: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_I) == (12), "SDL_SCANCODE_I: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_J) == (13), "SDL_SCANCODE_J: baked value 13 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_K) == (14), "SDL_SCANCODE_K: baked value 14 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_L) == (15), "SDL_SCANCODE_L: baked value 15 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_M) == (16), "SDL_SCANCODE_M: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_N) == (17), "SDL_SCANCODE_N: baked value 17 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_O) == (18), "SDL_SCANCODE_O: baked value 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_P) == (19), "SDL_SCANCODE_P: baked value 19 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_Q) == (20), "SDL_SCANCODE_Q: baked value 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_R) == (21), "SDL_SCANCODE_R: baked value 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_S) == (22), "SDL_SCANCODE_S: baked value 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_T) == (23), "SDL_SCANCODE_T: baked value 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_U) == (24), "SDL_SCANCODE_U: baked value 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_V) == (25), "SDL_SCANCODE_V: baked value 25 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_W) == (26), "SDL_SCANCODE_W: baked value 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_X) == (27), "SDL_SCANCODE_X: baked value 27 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_Y) == (28), "SDL_SCANCODE_Y: baked value 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_Z) == (29), "SDL_SCANCODE_Z: baked value 29 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_1) == (30), "SDL_SCANCODE_1: baked value 30 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_2) == (31), "SDL_SCANCODE_2: baked value 31 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_3) == (32), "SDL_SCANCODE_3: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_4) == (33), "SDL_SCANCODE_4: baked value 33 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_5) == (34), "SDL_SCANCODE_5: baked value 34 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_6) == (35), "SDL_SCANCODE_6: baked value 35 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_7) == (36), "SDL_SCANCODE_7: baked value 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_8) == (37), "SDL_SCANCODE_8: baked value 37 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_9) == (38), "SDL_SCANCODE_9: baked value 38 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_0) == (39), "SDL_SCANCODE_0: baked value 39 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_RETURN) == (40), "SDL_SCANCODE_RETURN: baked value 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_ESCAPE) == (41), "SDL_SCANCODE_ESCAPE: baked value 41 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_BACKSPACE) == (42), "SDL_SCANCODE_BACKSPACE: baked value 42 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_TAB) == (43), "SDL_SCANCODE_TAB: baked value 43 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_SPACE) == (44), "SDL_SCANCODE_SPACE: baked value 44 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MINUS) == (45), "SDL_SCANCODE_MINUS: baked value 45 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_EQUALS) == (46), "SDL_SCANCODE_EQUALS: baked value 46 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LEFTBRACKET) == (47), "SDL_SCANCODE_LEFTBRACKET: baked value 47 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_RIGHTBRACKET) == (48), "SDL_SCANCODE_RIGHTBRACKET: baked value 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_BACKSLASH) == (49), "SDL_SCANCODE_BACKSLASH: baked value 49 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_NONUSHASH) == (50), "SDL_SCANCODE_NONUSHASH: baked value 50 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_SEMICOLON) == (51), "SDL_SCANCODE_SEMICOLON: baked value 51 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_APOSTROPHE) == (52), "SDL_SCANCODE_APOSTROPHE: baked value 52 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_GRAVE) == (53), "SDL_SCANCODE_GRAVE: baked value 53 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_COMMA) == (54), "SDL_SCANCODE_COMMA: baked value 54 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_PERIOD) == (55), "SDL_SCANCODE_PERIOD: baked value 55 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_SLASH) == (56), "SDL_SCANCODE_SLASH: baked value 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CAPSLOCK) == (57), "SDL_SCANCODE_CAPSLOCK: baked value 57 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F1) == (58), "SDL_SCANCODE_F1: baked value 58 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F2) == (59), "SDL_SCANCODE_F2: baked value 59 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F3) == (60), "SDL_SCANCODE_F3: baked value 60 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F4) == (61), "SDL_SCANCODE_F4: baked value 61 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F5) == (62), "SDL_SCANCODE_F5: baked value 62 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F6) == (63), "SDL_SCANCODE_F6: baked value 63 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F7) == (64), "SDL_SCANCODE_F7: baked value 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F8) == (65), "SDL_SCANCODE_F8: baked value 65 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F9) == (66), "SDL_SCANCODE_F9: baked value 66 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F10) == (67), "SDL_SCANCODE_F10: baked value 67 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F11) == (68), "SDL_SCANCODE_F11: baked value 68 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F12) == (69), "SDL_SCANCODE_F12: baked value 69 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_PRINTSCREEN) == (70), "SDL_SCANCODE_PRINTSCREEN: baked value 70 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_SCROLLLOCK) == (71), "SDL_SCANCODE_SCROLLLOCK: baked value 71 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_PAUSE) == (72), "SDL_SCANCODE_PAUSE: baked value 72 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_INSERT) == (73), "SDL_SCANCODE_INSERT: baked value 73 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_HOME) == (74), "SDL_SCANCODE_HOME: baked value 74 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_PAGEUP) == (75), "SDL_SCANCODE_PAGEUP: baked value 75 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_DELETE) == (76), "SDL_SCANCODE_DELETE: baked value 76 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_END) == (77), "SDL_SCANCODE_END: baked value 77 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_PAGEDOWN) == (78), "SDL_SCANCODE_PAGEDOWN: baked value 78 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_RIGHT) == (79), "SDL_SCANCODE_RIGHT: baked value 79 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LEFT) == (80), "SDL_SCANCODE_LEFT: baked value 80 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_DOWN) == (81), "SDL_SCANCODE_DOWN: baked value 81 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_UP) == (82), "SDL_SCANCODE_UP: baked value 82 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_NUMLOCKCLEAR) == (83), "SDL_SCANCODE_NUMLOCKCLEAR: baked value 83 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_DIVIDE) == (84), "SDL_SCANCODE_KP_DIVIDE: baked value 84 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_MULTIPLY) == (85), "SDL_SCANCODE_KP_MULTIPLY: baked value 85 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_MINUS) == (86), "SDL_SCANCODE_KP_MINUS: baked value 86 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_PLUS) == (87), "SDL_SCANCODE_KP_PLUS: baked value 87 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_ENTER) == (88), "SDL_SCANCODE_KP_ENTER: baked value 88 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_1) == (89), "SDL_SCANCODE_KP_1: baked value 89 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_2) == (90), "SDL_SCANCODE_KP_2: baked value 90 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_3) == (91), "SDL_SCANCODE_KP_3: baked value 91 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_4) == (92), "SDL_SCANCODE_KP_4: baked value 92 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_5) == (93), "SDL_SCANCODE_KP_5: baked value 93 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_6) == (94), "SDL_SCANCODE_KP_6: baked value 94 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_7) == (95), "SDL_SCANCODE_KP_7: baked value 95 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_8) == (96), "SDL_SCANCODE_KP_8: baked value 96 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_9) == (97), "SDL_SCANCODE_KP_9: baked value 97 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_0) == (98), "SDL_SCANCODE_KP_0: baked value 98 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_PERIOD) == (99), "SDL_SCANCODE_KP_PERIOD: baked value 99 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_NONUSBACKSLASH) == (100), "SDL_SCANCODE_NONUSBACKSLASH: baked value 100 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_APPLICATION) == (101), "SDL_SCANCODE_APPLICATION: baked value 101 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_POWER) == (102), "SDL_SCANCODE_POWER: baked value 102 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_EQUALS) == (103), "SDL_SCANCODE_KP_EQUALS: baked value 103 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F13) == (104), "SDL_SCANCODE_F13: baked value 104 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F14) == (105), "SDL_SCANCODE_F14: baked value 105 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F15) == (106), "SDL_SCANCODE_F15: baked value 106 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F16) == (107), "SDL_SCANCODE_F16: baked value 107 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F17) == (108), "SDL_SCANCODE_F17: baked value 108 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F18) == (109), "SDL_SCANCODE_F18: baked value 109 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F19) == (110), "SDL_SCANCODE_F19: baked value 110 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F20) == (111), "SDL_SCANCODE_F20: baked value 111 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F21) == (112), "SDL_SCANCODE_F21: baked value 112 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F22) == (113), "SDL_SCANCODE_F22: baked value 113 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F23) == (114), "SDL_SCANCODE_F23: baked value 114 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_F24) == (115), "SDL_SCANCODE_F24: baked value 115 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_EXECUTE) == (116), "SDL_SCANCODE_EXECUTE: baked value 116 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_HELP) == (117), "SDL_SCANCODE_HELP: baked value 117 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MENU) == (118), "SDL_SCANCODE_MENU: baked value 118 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_SELECT) == (119), "SDL_SCANCODE_SELECT: baked value 119 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_STOP) == (120), "SDL_SCANCODE_STOP: baked value 120 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AGAIN) == (121), "SDL_SCANCODE_AGAIN: baked value 121 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_UNDO) == (122), "SDL_SCANCODE_UNDO: baked value 122 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CUT) == (123), "SDL_SCANCODE_CUT: baked value 123 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_COPY) == (124), "SDL_SCANCODE_COPY: baked value 124 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_PASTE) == (125), "SDL_SCANCODE_PASTE: baked value 125 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_FIND) == (126), "SDL_SCANCODE_FIND: baked value 126 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MUTE) == (127), "SDL_SCANCODE_MUTE: baked value 127 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_VOLUMEUP) == (128), "SDL_SCANCODE_VOLUMEUP: baked value 128 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_VOLUMEDOWN) == (129), "SDL_SCANCODE_VOLUMEDOWN: baked value 129 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_COMMA) == (133), "SDL_SCANCODE_KP_COMMA: baked value 133 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_EQUALSAS400) == (134), "SDL_SCANCODE_KP_EQUALSAS400: baked value 134 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_INTERNATIONAL1) == (135), "SDL_SCANCODE_INTERNATIONAL1: baked value 135 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_INTERNATIONAL2) == (136), "SDL_SCANCODE_INTERNATIONAL2: baked value 136 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_INTERNATIONAL3) == (137), "SDL_SCANCODE_INTERNATIONAL3: baked value 137 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_INTERNATIONAL4) == (138), "SDL_SCANCODE_INTERNATIONAL4: baked value 138 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_INTERNATIONAL5) == (139), "SDL_SCANCODE_INTERNATIONAL5: baked value 139 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_INTERNATIONAL6) == (140), "SDL_SCANCODE_INTERNATIONAL6: baked value 140 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_INTERNATIONAL7) == (141), "SDL_SCANCODE_INTERNATIONAL7: baked value 141 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_INTERNATIONAL8) == (142), "SDL_SCANCODE_INTERNATIONAL8: baked value 142 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_INTERNATIONAL9) == (143), "SDL_SCANCODE_INTERNATIONAL9: baked value 143 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LANG1) == (144), "SDL_SCANCODE_LANG1: baked value 144 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LANG2) == (145), "SDL_SCANCODE_LANG2: baked value 145 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LANG3) == (146), "SDL_SCANCODE_LANG3: baked value 146 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LANG4) == (147), "SDL_SCANCODE_LANG4: baked value 147 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LANG5) == (148), "SDL_SCANCODE_LANG5: baked value 148 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LANG6) == (149), "SDL_SCANCODE_LANG6: baked value 149 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LANG7) == (150), "SDL_SCANCODE_LANG7: baked value 150 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LANG8) == (151), "SDL_SCANCODE_LANG8: baked value 151 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LANG9) == (152), "SDL_SCANCODE_LANG9: baked value 152 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_ALTERASE) == (153), "SDL_SCANCODE_ALTERASE: baked value 153 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_SYSREQ) == (154), "SDL_SCANCODE_SYSREQ: baked value 154 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CANCEL) == (155), "SDL_SCANCODE_CANCEL: baked value 155 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CLEAR) == (156), "SDL_SCANCODE_CLEAR: baked value 156 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_PRIOR) == (157), "SDL_SCANCODE_PRIOR: baked value 157 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_RETURN2) == (158), "SDL_SCANCODE_RETURN2: baked value 158 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_SEPARATOR) == (159), "SDL_SCANCODE_SEPARATOR: baked value 159 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_OUT) == (160), "SDL_SCANCODE_OUT: baked value 160 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_OPER) == (161), "SDL_SCANCODE_OPER: baked value 161 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CLEARAGAIN) == (162), "SDL_SCANCODE_CLEARAGAIN: baked value 162 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CRSEL) == (163), "SDL_SCANCODE_CRSEL: baked value 163 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_EXSEL) == (164), "SDL_SCANCODE_EXSEL: baked value 164 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_00) == (176), "SDL_SCANCODE_KP_00: baked value 176 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_000) == (177), "SDL_SCANCODE_KP_000: baked value 177 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_THOUSANDSSEPARATOR) == (178), "SDL_SCANCODE_THOUSANDSSEPARATOR: baked value 178 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_DECIMALSEPARATOR) == (179), "SDL_SCANCODE_DECIMALSEPARATOR: baked value 179 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CURRENCYUNIT) == (180), "SDL_SCANCODE_CURRENCYUNIT: baked value 180 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CURRENCYSUBUNIT) == (181), "SDL_SCANCODE_CURRENCYSUBUNIT: baked value 181 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_LEFTPAREN) == (182), "SDL_SCANCODE_KP_LEFTPAREN: baked value 182 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_RIGHTPAREN) == (183), "SDL_SCANCODE_KP_RIGHTPAREN: baked value 183 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_LEFTBRACE) == (184), "SDL_SCANCODE_KP_LEFTBRACE: baked value 184 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_RIGHTBRACE) == (185), "SDL_SCANCODE_KP_RIGHTBRACE: baked value 185 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_TAB) == (186), "SDL_SCANCODE_KP_TAB: baked value 186 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_BACKSPACE) == (187), "SDL_SCANCODE_KP_BACKSPACE: baked value 187 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_A) == (188), "SDL_SCANCODE_KP_A: baked value 188 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_B) == (189), "SDL_SCANCODE_KP_B: baked value 189 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_C) == (190), "SDL_SCANCODE_KP_C: baked value 190 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_D) == (191), "SDL_SCANCODE_KP_D: baked value 191 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_E) == (192), "SDL_SCANCODE_KP_E: baked value 192 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_F) == (193), "SDL_SCANCODE_KP_F: baked value 193 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_XOR) == (194), "SDL_SCANCODE_KP_XOR: baked value 194 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_POWER) == (195), "SDL_SCANCODE_KP_POWER: baked value 195 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_PERCENT) == (196), "SDL_SCANCODE_KP_PERCENT: baked value 196 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_LESS) == (197), "SDL_SCANCODE_KP_LESS: baked value 197 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_GREATER) == (198), "SDL_SCANCODE_KP_GREATER: baked value 198 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_AMPERSAND) == (199), "SDL_SCANCODE_KP_AMPERSAND: baked value 199 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_DBLAMPERSAND) == (200), "SDL_SCANCODE_KP_DBLAMPERSAND: baked value 200 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_VERTICALBAR) == (201), "SDL_SCANCODE_KP_VERTICALBAR: baked value 201 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_DBLVERTICALBAR) == (202), "SDL_SCANCODE_KP_DBLVERTICALBAR: baked value 202 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_COLON) == (203), "SDL_SCANCODE_KP_COLON: baked value 203 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_HASH) == (204), "SDL_SCANCODE_KP_HASH: baked value 204 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_SPACE) == (205), "SDL_SCANCODE_KP_SPACE: baked value 205 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_AT) == (206), "SDL_SCANCODE_KP_AT: baked value 206 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_EXCLAM) == (207), "SDL_SCANCODE_KP_EXCLAM: baked value 207 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_MEMSTORE) == (208), "SDL_SCANCODE_KP_MEMSTORE: baked value 208 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_MEMRECALL) == (209), "SDL_SCANCODE_KP_MEMRECALL: baked value 209 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_MEMCLEAR) == (210), "SDL_SCANCODE_KP_MEMCLEAR: baked value 210 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_MEMADD) == (211), "SDL_SCANCODE_KP_MEMADD: baked value 211 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_MEMSUBTRACT) == (212), "SDL_SCANCODE_KP_MEMSUBTRACT: baked value 212 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_MEMMULTIPLY) == (213), "SDL_SCANCODE_KP_MEMMULTIPLY: baked value 213 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_MEMDIVIDE) == (214), "SDL_SCANCODE_KP_MEMDIVIDE: baked value 214 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_PLUSMINUS) == (215), "SDL_SCANCODE_KP_PLUSMINUS: baked value 215 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_CLEAR) == (216), "SDL_SCANCODE_KP_CLEAR: baked value 216 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_CLEARENTRY) == (217), "SDL_SCANCODE_KP_CLEARENTRY: baked value 217 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_BINARY) == (218), "SDL_SCANCODE_KP_BINARY: baked value 218 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_OCTAL) == (219), "SDL_SCANCODE_KP_OCTAL: baked value 219 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_DECIMAL) == (220), "SDL_SCANCODE_KP_DECIMAL: baked value 220 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_KP_HEXADECIMAL) == (221), "SDL_SCANCODE_KP_HEXADECIMAL: baked value 221 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LCTRL) == (224), "SDL_SCANCODE_LCTRL: baked value 224 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LSHIFT) == (225), "SDL_SCANCODE_LSHIFT: baked value 225 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LALT) == (226), "SDL_SCANCODE_LALT: baked value 226 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_LGUI) == (227), "SDL_SCANCODE_LGUI: baked value 227 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_RCTRL) == (228), "SDL_SCANCODE_RCTRL: baked value 228 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_RSHIFT) == (229), "SDL_SCANCODE_RSHIFT: baked value 229 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_RALT) == (230), "SDL_SCANCODE_RALT: baked value 230 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_RGUI) == (231), "SDL_SCANCODE_RGUI: baked value 231 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MODE) == (257), "SDL_SCANCODE_MODE: baked value 257 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_SLEEP) == (258), "SDL_SCANCODE_SLEEP: baked value 258 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_WAKE) == (259), "SDL_SCANCODE_WAKE: baked value 259 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CHANNEL_INCREMENT) == (260), "SDL_SCANCODE_CHANNEL_INCREMENT: baked value 260 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CHANNEL_DECREMENT) == (261), "SDL_SCANCODE_CHANNEL_DECREMENT: baked value 261 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_PLAY) == (262), "SDL_SCANCODE_MEDIA_PLAY: baked value 262 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_PAUSE) == (263), "SDL_SCANCODE_MEDIA_PAUSE: baked value 263 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_RECORD) == (264), "SDL_SCANCODE_MEDIA_RECORD: baked value 264 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_FAST_FORWARD) == (265), "SDL_SCANCODE_MEDIA_FAST_FORWARD: baked value 265 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_REWIND) == (266), "SDL_SCANCODE_MEDIA_REWIND: baked value 266 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_NEXT_TRACK) == (267), "SDL_SCANCODE_MEDIA_NEXT_TRACK: baked value 267 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_PREVIOUS_TRACK) == (268), "SDL_SCANCODE_MEDIA_PREVIOUS_TRACK: baked value 268 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_STOP) == (269), "SDL_SCANCODE_MEDIA_STOP: baked value 269 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_EJECT) == (270), "SDL_SCANCODE_MEDIA_EJECT: baked value 270 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_PLAY_PAUSE) == (271), "SDL_SCANCODE_MEDIA_PLAY_PAUSE: baked value 271 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_MEDIA_SELECT) == (272), "SDL_SCANCODE_MEDIA_SELECT: baked value 272 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_NEW) == (273), "SDL_SCANCODE_AC_NEW: baked value 273 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_OPEN) == (274), "SDL_SCANCODE_AC_OPEN: baked value 274 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_CLOSE) == (275), "SDL_SCANCODE_AC_CLOSE: baked value 275 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_EXIT) == (276), "SDL_SCANCODE_AC_EXIT: baked value 276 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_SAVE) == (277), "SDL_SCANCODE_AC_SAVE: baked value 277 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_PRINT) == (278), "SDL_SCANCODE_AC_PRINT: baked value 278 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_PROPERTIES) == (279), "SDL_SCANCODE_AC_PROPERTIES: baked value 279 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_SEARCH) == (280), "SDL_SCANCODE_AC_SEARCH: baked value 280 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_HOME) == (281), "SDL_SCANCODE_AC_HOME: baked value 281 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_BACK) == (282), "SDL_SCANCODE_AC_BACK: baked value 282 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_FORWARD) == (283), "SDL_SCANCODE_AC_FORWARD: baked value 283 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_STOP) == (284), "SDL_SCANCODE_AC_STOP: baked value 284 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_REFRESH) == (285), "SDL_SCANCODE_AC_REFRESH: baked value 285 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_AC_BOOKMARKS) == (286), "SDL_SCANCODE_AC_BOOKMARKS: baked value 286 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_SOFTLEFT) == (287), "SDL_SCANCODE_SOFTLEFT: baked value 287 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_SOFTRIGHT) == (288), "SDL_SCANCODE_SOFTRIGHT: baked value 288 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_CALL) == (289), "SDL_SCANCODE_CALL: baked value 289 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_ENDCALL) == (290), "SDL_SCANCODE_ENDCALL: baked value 290 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_RESERVED) == (400), "SDL_SCANCODE_RESERVED: baked value 400 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SCANCODE_COUNT) == (512), "SDL_SCANCODE_COUNT: baked value 512 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_keyboard.h ---- */
+_Static_assert(sizeof(enum SDL_TextInputType) == 4, "enum SDL_TextInputType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_TextInputType) == 4, "enum SDL_TextInputType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTINPUT_TYPE_TEXT) == (0), "SDL_TEXTINPUT_TYPE_TEXT: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTINPUT_TYPE_TEXT_NAME) == (1), "SDL_TEXTINPUT_TYPE_TEXT_NAME: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTINPUT_TYPE_TEXT_EMAIL) == (2), "SDL_TEXTINPUT_TYPE_TEXT_EMAIL: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTINPUT_TYPE_TEXT_USERNAME) == (3), "SDL_TEXTINPUT_TYPE_TEXT_USERNAME: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN) == (4), "SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE) == (5), "SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTINPUT_TYPE_NUMBER) == (6), "SDL_TEXTINPUT_TYPE_NUMBER: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN) == (7), "SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE) == (8), "SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_Capitalization) == 4, "enum SDL_Capitalization: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_Capitalization) == 4, "enum SDL_Capitalization: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CAPITALIZE_NONE) == (0), "SDL_CAPITALIZE_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CAPITALIZE_SENTENCES) == (1), "SDL_CAPITALIZE_SENTENCES: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CAPITALIZE_WORDS) == (2), "SDL_CAPITALIZE_WORDS: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_CAPITALIZE_LETTERS) == (3), "SDL_CAPITALIZE_LETTERS: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_mouse.h ---- */
+_Static_assert(sizeof(enum SDL_SystemCursor) == 4, "enum SDL_SystemCursor: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_SystemCursor) == 4, "enum SDL_SystemCursor: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_DEFAULT) == (0), "SDL_SYSTEM_CURSOR_DEFAULT: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_TEXT) == (1), "SDL_SYSTEM_CURSOR_TEXT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_WAIT) == (2), "SDL_SYSTEM_CURSOR_WAIT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_CROSSHAIR) == (3), "SDL_SYSTEM_CURSOR_CROSSHAIR: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_PROGRESS) == (4), "SDL_SYSTEM_CURSOR_PROGRESS: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_NWSE_RESIZE) == (5), "SDL_SYSTEM_CURSOR_NWSE_RESIZE: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_NESW_RESIZE) == (6), "SDL_SYSTEM_CURSOR_NESW_RESIZE: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_EW_RESIZE) == (7), "SDL_SYSTEM_CURSOR_EW_RESIZE: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_NS_RESIZE) == (8), "SDL_SYSTEM_CURSOR_NS_RESIZE: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_MOVE) == (9), "SDL_SYSTEM_CURSOR_MOVE: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_NOT_ALLOWED) == (10), "SDL_SYSTEM_CURSOR_NOT_ALLOWED: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_POINTER) == (11), "SDL_SYSTEM_CURSOR_POINTER: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_NW_RESIZE) == (12), "SDL_SYSTEM_CURSOR_NW_RESIZE: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_N_RESIZE) == (13), "SDL_SYSTEM_CURSOR_N_RESIZE: baked value 13 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_NE_RESIZE) == (14), "SDL_SYSTEM_CURSOR_NE_RESIZE: baked value 14 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_E_RESIZE) == (15), "SDL_SYSTEM_CURSOR_E_RESIZE: baked value 15 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_SE_RESIZE) == (16), "SDL_SYSTEM_CURSOR_SE_RESIZE: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_S_RESIZE) == (17), "SDL_SYSTEM_CURSOR_S_RESIZE: baked value 17 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_SW_RESIZE) == (18), "SDL_SYSTEM_CURSOR_SW_RESIZE: baked value 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_W_RESIZE) == (19), "SDL_SYSTEM_CURSOR_W_RESIZE: baked value 19 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SYSTEM_CURSOR_COUNT) == (20), "SDL_SYSTEM_CURSOR_COUNT: baked value 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_MouseWheelDirection) == 4, "enum SDL_MouseWheelDirection: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_MouseWheelDirection) == 4, "enum SDL_MouseWheelDirection: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MOUSEWHEEL_NORMAL) == (0), "SDL_MOUSEWHEEL_NORMAL: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MOUSEWHEEL_FLIPPED) == (1), "SDL_MOUSEWHEEL_FLIPPED: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert(sizeof(struct SDL_CursorFrameInfo) == 16, "struct SDL_CursorFrameInfo: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_CursorFrameInfo) == 8, "struct SDL_CursorFrameInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CursorFrameInfo, surface) == 0, "struct SDL_CursorFrameInfo.surface: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CursorFrameInfo, duration) == 8, "struct SDL_CursorFrameInfo.duration: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+
+/* ---- SDL_touch.h ---- */
+_Static_assert(sizeof(enum SDL_TouchDeviceType) == 4, "enum SDL_TouchDeviceType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_TouchDeviceType) == 4, "enum SDL_TouchDeviceType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TOUCH_DEVICE_INVALID) == (-1), "SDL_TOUCH_DEVICE_INVALID: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TOUCH_DEVICE_DIRECT) == (0), "SDL_TOUCH_DEVICE_DIRECT: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE) == (1), "SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TOUCH_DEVICE_INDIRECT_RELATIVE) == (2), "SDL_TOUCH_DEVICE_INDIRECT_RELATIVE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_Finger) == 24, "struct SDL_Finger: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_Finger) == 8, "struct SDL_Finger: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Finger, id) == 0, "struct SDL_Finger.id: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Finger, x) == 8, "struct SDL_Finger.x: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Finger, y) == 12, "struct SDL_Finger.y: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Finger, pressure) == 16, "struct SDL_Finger.pressure: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_pen.h ---- */
+_Static_assert(sizeof(enum SDL_PenAxis) == 4, "enum SDL_PenAxis: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_PenAxis) == 4, "enum SDL_PenAxis: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_AXIS_PRESSURE) == (0), "SDL_PEN_AXIS_PRESSURE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_AXIS_XTILT) == (1), "SDL_PEN_AXIS_XTILT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_AXIS_YTILT) == (2), "SDL_PEN_AXIS_YTILT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_AXIS_DISTANCE) == (3), "SDL_PEN_AXIS_DISTANCE: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_AXIS_ROTATION) == (4), "SDL_PEN_AXIS_ROTATION: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_AXIS_SLIDER) == (5), "SDL_PEN_AXIS_SLIDER: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_AXIS_TANGENTIAL_PRESSURE) == (6), "SDL_PEN_AXIS_TANGENTIAL_PRESSURE: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_AXIS_COUNT) == (7), "SDL_PEN_AXIS_COUNT: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert(sizeof(enum SDL_PenDeviceType) == 4, "enum SDL_PenDeviceType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_PenDeviceType) == 4, "enum SDL_PenDeviceType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_DEVICE_TYPE_INVALID) == (-1), "SDL_PEN_DEVICE_TYPE_INVALID: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_DEVICE_TYPE_UNKNOWN) == (0), "SDL_PEN_DEVICE_TYPE_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_DEVICE_TYPE_DIRECT) == (1), "SDL_PEN_DEVICE_TYPE_DIRECT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_DEVICE_TYPE_INDIRECT) == (2), "SDL_PEN_DEVICE_TYPE_INDIRECT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+
+/* ---- SDL_events.h ---- */
+_Static_assert(sizeof(enum SDL_EventType) == 4, "enum SDL_EventType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_EventType) == 4, "enum SDL_EventType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_FIRST) == (0), "SDL_EVENT_FIRST: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_QUIT) == (256), "SDL_EVENT_QUIT: baked value 256 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_TERMINATING) == (257), "SDL_EVENT_TERMINATING: baked value 257 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_LOW_MEMORY) == (258), "SDL_EVENT_LOW_MEMORY: baked value 258 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WILL_ENTER_BACKGROUND) == (259), "SDL_EVENT_WILL_ENTER_BACKGROUND: baked value 259 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DID_ENTER_BACKGROUND) == (260), "SDL_EVENT_DID_ENTER_BACKGROUND: baked value 260 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WILL_ENTER_FOREGROUND) == (261), "SDL_EVENT_WILL_ENTER_FOREGROUND: baked value 261 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DID_ENTER_FOREGROUND) == (262), "SDL_EVENT_DID_ENTER_FOREGROUND: baked value 262 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_LOCALE_CHANGED) == (263), "SDL_EVENT_LOCALE_CHANGED: baked value 263 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_SYSTEM_THEME_CHANGED) == (264), "SDL_EVENT_SYSTEM_THEME_CHANGED: baked value 264 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DISPLAY_ORIENTATION) == (337), "SDL_EVENT_DISPLAY_ORIENTATION: baked value 337 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DISPLAY_ADDED) == (338), "SDL_EVENT_DISPLAY_ADDED: baked value 338 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DISPLAY_REMOVED) == (339), "SDL_EVENT_DISPLAY_REMOVED: baked value 339 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DISPLAY_MOVED) == (340), "SDL_EVENT_DISPLAY_MOVED: baked value 340 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED) == (341), "SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED: baked value 341 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED) == (342), "SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED: baked value 342 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED) == (343), "SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED: baked value 343 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert((SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGED) == (344), "SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGED: baked value 344 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert((SDL_EVENT_DISPLAY_FIRST) == (337), "SDL_EVENT_DISPLAY_FIRST: baked value 337 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert((SDL_EVENT_DISPLAY_LAST) == (344), "SDL_EVENT_DISPLAY_LAST: baked value 344 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert((SDL_EVENT_WINDOW_SHOWN) == (514), "SDL_EVENT_WINDOW_SHOWN: baked value 514 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_HIDDEN) == (515), "SDL_EVENT_WINDOW_HIDDEN: baked value 515 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_EXPOSED) == (516), "SDL_EVENT_WINDOW_EXPOSED: baked value 516 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_MOVED) == (517), "SDL_EVENT_WINDOW_MOVED: baked value 517 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_RESIZED) == (518), "SDL_EVENT_WINDOW_RESIZED: baked value 518 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED) == (519), "SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED: baked value 519 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_METAL_VIEW_RESIZED) == (520), "SDL_EVENT_WINDOW_METAL_VIEW_RESIZED: baked value 520 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_MINIMIZED) == (521), "SDL_EVENT_WINDOW_MINIMIZED: baked value 521 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_MAXIMIZED) == (522), "SDL_EVENT_WINDOW_MAXIMIZED: baked value 522 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_RESTORED) == (523), "SDL_EVENT_WINDOW_RESTORED: baked value 523 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_MOUSE_ENTER) == (524), "SDL_EVENT_WINDOW_MOUSE_ENTER: baked value 524 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_MOUSE_LEAVE) == (525), "SDL_EVENT_WINDOW_MOUSE_LEAVE: baked value 525 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_FOCUS_GAINED) == (526), "SDL_EVENT_WINDOW_FOCUS_GAINED: baked value 526 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_FOCUS_LOST) == (527), "SDL_EVENT_WINDOW_FOCUS_LOST: baked value 527 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_CLOSE_REQUESTED) == (528), "SDL_EVENT_WINDOW_CLOSE_REQUESTED: baked value 528 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_HIT_TEST) == (529), "SDL_EVENT_WINDOW_HIT_TEST: baked value 529 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_ICCPROF_CHANGED) == (530), "SDL_EVENT_WINDOW_ICCPROF_CHANGED: baked value 530 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_DISPLAY_CHANGED) == (531), "SDL_EVENT_WINDOW_DISPLAY_CHANGED: baked value 531 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED) == (532), "SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED: baked value 532 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_SAFE_AREA_CHANGED) == (533), "SDL_EVENT_WINDOW_SAFE_AREA_CHANGED: baked value 533 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_OCCLUDED) == (534), "SDL_EVENT_WINDOW_OCCLUDED: baked value 534 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_ENTER_FULLSCREEN) == (535), "SDL_EVENT_WINDOW_ENTER_FULLSCREEN: baked value 535 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_LEAVE_FULLSCREEN) == (536), "SDL_EVENT_WINDOW_LEAVE_FULLSCREEN: baked value 536 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_DESTROYED) == (537), "SDL_EVENT_WINDOW_DESTROYED: baked value 537 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_HDR_STATE_CHANGED) == (538), "SDL_EVENT_WINDOW_HDR_STATE_CHANGED: baked value 538 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_FIRST) == (514), "SDL_EVENT_WINDOW_FIRST: baked value 514 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_WINDOW_LAST) == (538), "SDL_EVENT_WINDOW_LAST: baked value 538 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_KEY_DOWN) == (768), "SDL_EVENT_KEY_DOWN: baked value 768 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_KEY_UP) == (769), "SDL_EVENT_KEY_UP: baked value 769 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_TEXT_EDITING) == (770), "SDL_EVENT_TEXT_EDITING: baked value 770 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_TEXT_INPUT) == (771), "SDL_EVENT_TEXT_INPUT: baked value 771 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_KEYMAP_CHANGED) == (772), "SDL_EVENT_KEYMAP_CHANGED: baked value 772 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_KEYBOARD_ADDED) == (773), "SDL_EVENT_KEYBOARD_ADDED: baked value 773 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_KEYBOARD_REMOVED) == (774), "SDL_EVENT_KEYBOARD_REMOVED: baked value 774 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_TEXT_EDITING_CANDIDATES) == (775), "SDL_EVENT_TEXT_EDITING_CANDIDATES: baked value 775 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert((SDL_EVENT_SCREEN_KEYBOARD_SHOWN) == (776), "SDL_EVENT_SCREEN_KEYBOARD_SHOWN: baked value 776 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_SCREEN_KEYBOARD_HIDDEN) == (777), "SDL_EVENT_SCREEN_KEYBOARD_HIDDEN: baked value 777 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert((SDL_EVENT_MOUSE_MOTION) == (1024), "SDL_EVENT_MOUSE_MOTION: baked value 1024 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_MOUSE_BUTTON_DOWN) == (1025), "SDL_EVENT_MOUSE_BUTTON_DOWN: baked value 1025 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_MOUSE_BUTTON_UP) == (1026), "SDL_EVENT_MOUSE_BUTTON_UP: baked value 1026 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_MOUSE_WHEEL) == (1027), "SDL_EVENT_MOUSE_WHEEL: baked value 1027 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_MOUSE_ADDED) == (1028), "SDL_EVENT_MOUSE_ADDED: baked value 1028 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_MOUSE_REMOVED) == (1029), "SDL_EVENT_MOUSE_REMOVED: baked value 1029 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_JOYSTICK_AXIS_MOTION) == (1536), "SDL_EVENT_JOYSTICK_AXIS_MOTION: baked value 1536 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_JOYSTICK_BALL_MOTION) == (1537), "SDL_EVENT_JOYSTICK_BALL_MOTION: baked value 1537 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_JOYSTICK_HAT_MOTION) == (1538), "SDL_EVENT_JOYSTICK_HAT_MOTION: baked value 1538 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_JOYSTICK_BUTTON_DOWN) == (1539), "SDL_EVENT_JOYSTICK_BUTTON_DOWN: baked value 1539 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_JOYSTICK_BUTTON_UP) == (1540), "SDL_EVENT_JOYSTICK_BUTTON_UP: baked value 1540 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_JOYSTICK_ADDED) == (1541), "SDL_EVENT_JOYSTICK_ADDED: baked value 1541 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_JOYSTICK_REMOVED) == (1542), "SDL_EVENT_JOYSTICK_REMOVED: baked value 1542 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_JOYSTICK_BATTERY_UPDATED) == (1543), "SDL_EVENT_JOYSTICK_BATTERY_UPDATED: baked value 1543 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_JOYSTICK_UPDATE_COMPLETE) == (1544), "SDL_EVENT_JOYSTICK_UPDATE_COMPLETE: baked value 1544 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_AXIS_MOTION) == (1616), "SDL_EVENT_GAMEPAD_AXIS_MOTION: baked value 1616 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_BUTTON_DOWN) == (1617), "SDL_EVENT_GAMEPAD_BUTTON_DOWN: baked value 1617 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_BUTTON_UP) == (1618), "SDL_EVENT_GAMEPAD_BUTTON_UP: baked value 1618 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_ADDED) == (1619), "SDL_EVENT_GAMEPAD_ADDED: baked value 1619 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_REMOVED) == (1620), "SDL_EVENT_GAMEPAD_REMOVED: baked value 1620 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_REMAPPED) == (1621), "SDL_EVENT_GAMEPAD_REMAPPED: baked value 1621 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN) == (1622), "SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN: baked value 1622 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION) == (1623), "SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION: baked value 1623 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_TOUCHPAD_UP) == (1624), "SDL_EVENT_GAMEPAD_TOUCHPAD_UP: baked value 1624 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_SENSOR_UPDATE) == (1625), "SDL_EVENT_GAMEPAD_SENSOR_UPDATE: baked value 1625 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_UPDATE_COMPLETE) == (1626), "SDL_EVENT_GAMEPAD_UPDATE_COMPLETE: baked value 1626 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED) == (1627), "SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED: baked value 1627 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_FINGER_DOWN) == (1792), "SDL_EVENT_FINGER_DOWN: baked value 1792 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_FINGER_UP) == (1793), "SDL_EVENT_FINGER_UP: baked value 1793 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_FINGER_MOTION) == (1794), "SDL_EVENT_FINGER_MOTION: baked value 1794 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_FINGER_CANCELED) == (1795), "SDL_EVENT_FINGER_CANCELED: baked value 1795 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert((SDL_EVENT_PINCH_BEGIN) == (1808), "SDL_EVENT_PINCH_BEGIN: baked value 1808 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PINCH_UPDATE) == (1809), "SDL_EVENT_PINCH_UPDATE: baked value 1809 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PINCH_END) == (1810), "SDL_EVENT_PINCH_END: baked value 1810 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert((SDL_EVENT_CLIPBOARD_UPDATE) == (2304), "SDL_EVENT_CLIPBOARD_UPDATE: baked value 2304 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DROP_FILE) == (4096), "SDL_EVENT_DROP_FILE: baked value 4096 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DROP_TEXT) == (4097), "SDL_EVENT_DROP_TEXT: baked value 4097 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DROP_BEGIN) == (4098), "SDL_EVENT_DROP_BEGIN: baked value 4098 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DROP_COMPLETE) == (4099), "SDL_EVENT_DROP_COMPLETE: baked value 4099 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_DROP_POSITION) == (4100), "SDL_EVENT_DROP_POSITION: baked value 4100 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_AUDIO_DEVICE_ADDED) == (4352), "SDL_EVENT_AUDIO_DEVICE_ADDED: baked value 4352 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_AUDIO_DEVICE_REMOVED) == (4353), "SDL_EVENT_AUDIO_DEVICE_REMOVED: baked value 4353 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED) == (4354), "SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED: baked value 4354 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_SENSOR_UPDATE) == (4608), "SDL_EVENT_SENSOR_UPDATE: baked value 4608 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PEN_PROXIMITY_IN) == (4864), "SDL_EVENT_PEN_PROXIMITY_IN: baked value 4864 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PEN_PROXIMITY_OUT) == (4865), "SDL_EVENT_PEN_PROXIMITY_OUT: baked value 4865 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PEN_DOWN) == (4866), "SDL_EVENT_PEN_DOWN: baked value 4866 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PEN_UP) == (4867), "SDL_EVENT_PEN_UP: baked value 4867 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PEN_BUTTON_DOWN) == (4868), "SDL_EVENT_PEN_BUTTON_DOWN: baked value 4868 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PEN_BUTTON_UP) == (4869), "SDL_EVENT_PEN_BUTTON_UP: baked value 4869 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PEN_MOTION) == (4870), "SDL_EVENT_PEN_MOTION: baked value 4870 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PEN_AXIS) == (4871), "SDL_EVENT_PEN_AXIS: baked value 4871 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_CAMERA_DEVICE_ADDED) == (5120), "SDL_EVENT_CAMERA_DEVICE_ADDED: baked value 5120 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_CAMERA_DEVICE_REMOVED) == (5121), "SDL_EVENT_CAMERA_DEVICE_REMOVED: baked value 5121 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_CAMERA_DEVICE_APPROVED) == (5122), "SDL_EVENT_CAMERA_DEVICE_APPROVED: baked value 5122 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_CAMERA_DEVICE_DENIED) == (5123), "SDL_EVENT_CAMERA_DEVICE_DENIED: baked value 5123 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_RENDER_TARGETS_RESET) == (8192), "SDL_EVENT_RENDER_TARGETS_RESET: baked value 8192 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_RENDER_DEVICE_RESET) == (8193), "SDL_EVENT_RENDER_DEVICE_RESET: baked value 8193 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_RENDER_DEVICE_LOST) == (8194), "SDL_EVENT_RENDER_DEVICE_LOST: baked value 8194 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PRIVATE0) == (16384), "SDL_EVENT_PRIVATE0: baked value 16384 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PRIVATE1) == (16385), "SDL_EVENT_PRIVATE1: baked value 16385 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PRIVATE2) == (16386), "SDL_EVENT_PRIVATE2: baked value 16386 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_PRIVATE3) == (16387), "SDL_EVENT_PRIVATE3: baked value 16387 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_POLL_SENTINEL) == (32512), "SDL_EVENT_POLL_SENTINEL: baked value 32512 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_USER) == (32768), "SDL_EVENT_USER: baked value 32768 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_LAST) == (65535), "SDL_EVENT_LAST: baked value 65535 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_EVENT_ENUM_PADDING) == (2147483647), "SDL_EVENT_ENUM_PADDING: baked value 2147483647 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_CommonEvent) == 16, "struct SDL_CommonEvent: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_CommonEvent) == 8, "struct SDL_CommonEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CommonEvent, type) == 0, "struct SDL_CommonEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CommonEvent, reserved) == 4, "struct SDL_CommonEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CommonEvent, timestamp) == 8, "struct SDL_CommonEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_DisplayEvent) == 32, "struct SDL_DisplayEvent: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_DisplayEvent) == 8, "struct SDL_DisplayEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayEvent, type) == 0, "struct SDL_DisplayEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayEvent, reserved) == 4, "struct SDL_DisplayEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayEvent, timestamp) == 8, "struct SDL_DisplayEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayEvent, displayID) == 16, "struct SDL_DisplayEvent.displayID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayEvent, data1) == 20, "struct SDL_DisplayEvent.data1: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DisplayEvent, data2) == 24, "struct SDL_DisplayEvent.data2: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_WindowEvent) == 32, "struct SDL_WindowEvent: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_WindowEvent) == 8, "struct SDL_WindowEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_WindowEvent, type) == 0, "struct SDL_WindowEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_WindowEvent, reserved) == 4, "struct SDL_WindowEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_WindowEvent, timestamp) == 8, "struct SDL_WindowEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_WindowEvent, windowID) == 16, "struct SDL_WindowEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_WindowEvent, data1) == 20, "struct SDL_WindowEvent.data1: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_WindowEvent, data2) == 24, "struct SDL_WindowEvent.data2: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_KeyboardDeviceEvent) == 24, "struct SDL_KeyboardDeviceEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_KeyboardDeviceEvent) == 8, "struct SDL_KeyboardDeviceEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardDeviceEvent, type) == 0, "struct SDL_KeyboardDeviceEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardDeviceEvent, reserved) == 4, "struct SDL_KeyboardDeviceEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardDeviceEvent, timestamp) == 8, "struct SDL_KeyboardDeviceEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardDeviceEvent, which) == 16, "struct SDL_KeyboardDeviceEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_KeyboardEvent) == 40, "struct SDL_KeyboardEvent: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_KeyboardEvent) == 8, "struct SDL_KeyboardEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, type) == 0, "struct SDL_KeyboardEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, reserved) == 4, "struct SDL_KeyboardEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, timestamp) == 8, "struct SDL_KeyboardEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, windowID) == 16, "struct SDL_KeyboardEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, which) == 20, "struct SDL_KeyboardEvent.which: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, scancode) == 24, "struct SDL_KeyboardEvent.scancode: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, key) == 28, "struct SDL_KeyboardEvent.key: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, mod) == 32, "struct SDL_KeyboardEvent.mod: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, raw) == 34, "struct SDL_KeyboardEvent.raw: baked offset 34 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, down) == 36, "struct SDL_KeyboardEvent.down: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_KeyboardEvent, repeat) == 37, "struct SDL_KeyboardEvent.repeat: baked offset 37 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_TextEditingEvent) == 40, "struct SDL_TextEditingEvent: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_TextEditingEvent) == 8, "struct SDL_TextEditingEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingEvent, type) == 0, "struct SDL_TextEditingEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingEvent, reserved) == 4, "struct SDL_TextEditingEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingEvent, timestamp) == 8, "struct SDL_TextEditingEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingEvent, windowID) == 16, "struct SDL_TextEditingEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingEvent, text) == 24, "struct SDL_TextEditingEvent.text: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingEvent, start) == 32, "struct SDL_TextEditingEvent.start: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingEvent, length) == 36, "struct SDL_TextEditingEvent.length: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_TextEditingCandidatesEvent) == 48, "struct SDL_TextEditingCandidatesEvent: baked sizeof 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_TextEditingCandidatesEvent) == 8, "struct SDL_TextEditingCandidatesEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, type) == 0, "struct SDL_TextEditingCandidatesEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, reserved) == 4, "struct SDL_TextEditingCandidatesEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, timestamp) == 8, "struct SDL_TextEditingCandidatesEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, windowID) == 16, "struct SDL_TextEditingCandidatesEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, candidates) == 24, "struct SDL_TextEditingCandidatesEvent.candidates: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, num_candidates) == 32, "struct SDL_TextEditingCandidatesEvent.num_candidates: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, selected_candidate) == 36, "struct SDL_TextEditingCandidatesEvent.selected_candidate: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, horizontal) == 40, "struct SDL_TextEditingCandidatesEvent.horizontal: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, padding1) == 41, "struct SDL_TextEditingCandidatesEvent.padding1: baked offset 41 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, padding2) == 42, "struct SDL_TextEditingCandidatesEvent.padding2: baked offset 42 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextEditingCandidatesEvent, padding3) == 43, "struct SDL_TextEditingCandidatesEvent.padding3: baked offset 43 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_TextInputEvent) == 32, "struct SDL_TextInputEvent: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_TextInputEvent) == 8, "struct SDL_TextInputEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextInputEvent, type) == 0, "struct SDL_TextInputEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextInputEvent, reserved) == 4, "struct SDL_TextInputEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextInputEvent, timestamp) == 8, "struct SDL_TextInputEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextInputEvent, windowID) == 16, "struct SDL_TextInputEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TextInputEvent, text) == 24, "struct SDL_TextInputEvent.text: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_MouseDeviceEvent) == 24, "struct SDL_MouseDeviceEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_MouseDeviceEvent) == 8, "struct SDL_MouseDeviceEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseDeviceEvent, type) == 0, "struct SDL_MouseDeviceEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseDeviceEvent, reserved) == 4, "struct SDL_MouseDeviceEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseDeviceEvent, timestamp) == 8, "struct SDL_MouseDeviceEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseDeviceEvent, which) == 16, "struct SDL_MouseDeviceEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_MouseMotionEvent) == 48, "struct SDL_MouseMotionEvent: baked sizeof 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_MouseMotionEvent) == 8, "struct SDL_MouseMotionEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseMotionEvent, type) == 0, "struct SDL_MouseMotionEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseMotionEvent, reserved) == 4, "struct SDL_MouseMotionEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseMotionEvent, timestamp) == 8, "struct SDL_MouseMotionEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseMotionEvent, windowID) == 16, "struct SDL_MouseMotionEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseMotionEvent, which) == 20, "struct SDL_MouseMotionEvent.which: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseMotionEvent, state) == 24, "struct SDL_MouseMotionEvent.state: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseMotionEvent, x) == 28, "struct SDL_MouseMotionEvent.x: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseMotionEvent, y) == 32, "struct SDL_MouseMotionEvent.y: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseMotionEvent, xrel) == 36, "struct SDL_MouseMotionEvent.xrel: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseMotionEvent, yrel) == 40, "struct SDL_MouseMotionEvent.yrel: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_MouseButtonEvent) == 40, "struct SDL_MouseButtonEvent: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_MouseButtonEvent) == 8, "struct SDL_MouseButtonEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, type) == 0, "struct SDL_MouseButtonEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, reserved) == 4, "struct SDL_MouseButtonEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, timestamp) == 8, "struct SDL_MouseButtonEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, windowID) == 16, "struct SDL_MouseButtonEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, which) == 20, "struct SDL_MouseButtonEvent.which: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, button) == 24, "struct SDL_MouseButtonEvent.button: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, down) == 25, "struct SDL_MouseButtonEvent.down: baked offset 25 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, clicks) == 26, "struct SDL_MouseButtonEvent.clicks: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, padding) == 27, "struct SDL_MouseButtonEvent.padding: baked offset 27 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, x) == 28, "struct SDL_MouseButtonEvent.x: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseButtonEvent, y) == 32, "struct SDL_MouseButtonEvent.y: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 2, 12)
+_Static_assert(sizeof(struct SDL_MouseWheelEvent) == 56, "struct SDL_MouseWheelEvent: baked sizeof 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_MouseWheelEvent) == 8, "struct SDL_MouseWheelEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, type) == 0, "struct SDL_MouseWheelEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, reserved) == 4, "struct SDL_MouseWheelEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, timestamp) == 8, "struct SDL_MouseWheelEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, windowID) == 16, "struct SDL_MouseWheelEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, which) == 20, "struct SDL_MouseWheelEvent.which: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, x) == 24, "struct SDL_MouseWheelEvent.x: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, y) == 28, "struct SDL_MouseWheelEvent.y: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, direction) == 32, "struct SDL_MouseWheelEvent.direction: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, mouse_x) == 36, "struct SDL_MouseWheelEvent.mouse_x: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, mouse_y) == 40, "struct SDL_MouseWheelEvent.mouse_y: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 2, 12)
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, integer_x) == 44, "struct SDL_MouseWheelEvent.integer_x: baked offset 44 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MouseWheelEvent, integer_y) == 48, "struct SDL_MouseWheelEvent.integer_y: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(sizeof(struct SDL_JoyAxisEvent) == 32, "struct SDL_JoyAxisEvent: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_JoyAxisEvent) == 8, "struct SDL_JoyAxisEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyAxisEvent, type) == 0, "struct SDL_JoyAxisEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyAxisEvent, reserved) == 4, "struct SDL_JoyAxisEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyAxisEvent, timestamp) == 8, "struct SDL_JoyAxisEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyAxisEvent, which) == 16, "struct SDL_JoyAxisEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyAxisEvent, axis) == 20, "struct SDL_JoyAxisEvent.axis: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyAxisEvent, padding1) == 21, "struct SDL_JoyAxisEvent.padding1: baked offset 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyAxisEvent, padding2) == 22, "struct SDL_JoyAxisEvent.padding2: baked offset 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyAxisEvent, padding3) == 23, "struct SDL_JoyAxisEvent.padding3: baked offset 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyAxisEvent, value) == 24, "struct SDL_JoyAxisEvent.value: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyAxisEvent, padding4) == 26, "struct SDL_JoyAxisEvent.padding4: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_JoyBallEvent) == 32, "struct SDL_JoyBallEvent: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_JoyBallEvent) == 8, "struct SDL_JoyBallEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBallEvent, type) == 0, "struct SDL_JoyBallEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBallEvent, reserved) == 4, "struct SDL_JoyBallEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBallEvent, timestamp) == 8, "struct SDL_JoyBallEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBallEvent, which) == 16, "struct SDL_JoyBallEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBallEvent, ball) == 20, "struct SDL_JoyBallEvent.ball: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBallEvent, padding1) == 21, "struct SDL_JoyBallEvent.padding1: baked offset 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBallEvent, padding2) == 22, "struct SDL_JoyBallEvent.padding2: baked offset 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBallEvent, padding3) == 23, "struct SDL_JoyBallEvent.padding3: baked offset 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBallEvent, xrel) == 24, "struct SDL_JoyBallEvent.xrel: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBallEvent, yrel) == 26, "struct SDL_JoyBallEvent.yrel: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_JoyHatEvent) == 24, "struct SDL_JoyHatEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_JoyHatEvent) == 8, "struct SDL_JoyHatEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyHatEvent, type) == 0, "struct SDL_JoyHatEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyHatEvent, reserved) == 4, "struct SDL_JoyHatEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyHatEvent, timestamp) == 8, "struct SDL_JoyHatEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyHatEvent, which) == 16, "struct SDL_JoyHatEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyHatEvent, hat) == 20, "struct SDL_JoyHatEvent.hat: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyHatEvent, value) == 21, "struct SDL_JoyHatEvent.value: baked offset 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyHatEvent, padding1) == 22, "struct SDL_JoyHatEvent.padding1: baked offset 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyHatEvent, padding2) == 23, "struct SDL_JoyHatEvent.padding2: baked offset 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_JoyButtonEvent) == 24, "struct SDL_JoyButtonEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_JoyButtonEvent) == 8, "struct SDL_JoyButtonEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyButtonEvent, type) == 0, "struct SDL_JoyButtonEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyButtonEvent, reserved) == 4, "struct SDL_JoyButtonEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyButtonEvent, timestamp) == 8, "struct SDL_JoyButtonEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyButtonEvent, which) == 16, "struct SDL_JoyButtonEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyButtonEvent, button) == 20, "struct SDL_JoyButtonEvent.button: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyButtonEvent, down) == 21, "struct SDL_JoyButtonEvent.down: baked offset 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyButtonEvent, padding1) == 22, "struct SDL_JoyButtonEvent.padding1: baked offset 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyButtonEvent, padding2) == 23, "struct SDL_JoyButtonEvent.padding2: baked offset 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_JoyDeviceEvent) == 24, "struct SDL_JoyDeviceEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_JoyDeviceEvent) == 8, "struct SDL_JoyDeviceEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyDeviceEvent, type) == 0, "struct SDL_JoyDeviceEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyDeviceEvent, reserved) == 4, "struct SDL_JoyDeviceEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyDeviceEvent, timestamp) == 8, "struct SDL_JoyDeviceEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyDeviceEvent, which) == 16, "struct SDL_JoyDeviceEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_JoyBatteryEvent) == 32, "struct SDL_JoyBatteryEvent: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_JoyBatteryEvent) == 8, "struct SDL_JoyBatteryEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBatteryEvent, type) == 0, "struct SDL_JoyBatteryEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBatteryEvent, reserved) == 4, "struct SDL_JoyBatteryEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBatteryEvent, timestamp) == 8, "struct SDL_JoyBatteryEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBatteryEvent, which) == 16, "struct SDL_JoyBatteryEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBatteryEvent, state) == 20, "struct SDL_JoyBatteryEvent.state: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_JoyBatteryEvent, percent) == 24, "struct SDL_JoyBatteryEvent.percent: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GamepadAxisEvent) == 32, "struct SDL_GamepadAxisEvent: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GamepadAxisEvent) == 8, "struct SDL_GamepadAxisEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadAxisEvent, type) == 0, "struct SDL_GamepadAxisEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadAxisEvent, reserved) == 4, "struct SDL_GamepadAxisEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadAxisEvent, timestamp) == 8, "struct SDL_GamepadAxisEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadAxisEvent, which) == 16, "struct SDL_GamepadAxisEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadAxisEvent, axis) == 20, "struct SDL_GamepadAxisEvent.axis: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadAxisEvent, padding1) == 21, "struct SDL_GamepadAxisEvent.padding1: baked offset 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadAxisEvent, padding2) == 22, "struct SDL_GamepadAxisEvent.padding2: baked offset 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadAxisEvent, padding3) == 23, "struct SDL_GamepadAxisEvent.padding3: baked offset 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadAxisEvent, value) == 24, "struct SDL_GamepadAxisEvent.value: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadAxisEvent, padding4) == 26, "struct SDL_GamepadAxisEvent.padding4: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GamepadButtonEvent) == 24, "struct SDL_GamepadButtonEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GamepadButtonEvent) == 8, "struct SDL_GamepadButtonEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadButtonEvent, type) == 0, "struct SDL_GamepadButtonEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadButtonEvent, reserved) == 4, "struct SDL_GamepadButtonEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadButtonEvent, timestamp) == 8, "struct SDL_GamepadButtonEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadButtonEvent, which) == 16, "struct SDL_GamepadButtonEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadButtonEvent, button) == 20, "struct SDL_GamepadButtonEvent.button: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadButtonEvent, down) == 21, "struct SDL_GamepadButtonEvent.down: baked offset 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadButtonEvent, padding1) == 22, "struct SDL_GamepadButtonEvent.padding1: baked offset 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadButtonEvent, padding2) == 23, "struct SDL_GamepadButtonEvent.padding2: baked offset 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GamepadDeviceEvent) == 24, "struct SDL_GamepadDeviceEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GamepadDeviceEvent) == 8, "struct SDL_GamepadDeviceEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadDeviceEvent, type) == 0, "struct SDL_GamepadDeviceEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadDeviceEvent, reserved) == 4, "struct SDL_GamepadDeviceEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadDeviceEvent, timestamp) == 8, "struct SDL_GamepadDeviceEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadDeviceEvent, which) == 16, "struct SDL_GamepadDeviceEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GamepadTouchpadEvent) == 40, "struct SDL_GamepadTouchpadEvent: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GamepadTouchpadEvent) == 8, "struct SDL_GamepadTouchpadEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadTouchpadEvent, type) == 0, "struct SDL_GamepadTouchpadEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadTouchpadEvent, reserved) == 4, "struct SDL_GamepadTouchpadEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadTouchpadEvent, timestamp) == 8, "struct SDL_GamepadTouchpadEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadTouchpadEvent, which) == 16, "struct SDL_GamepadTouchpadEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadTouchpadEvent, touchpad) == 20, "struct SDL_GamepadTouchpadEvent.touchpad: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadTouchpadEvent, finger) == 24, "struct SDL_GamepadTouchpadEvent.finger: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadTouchpadEvent, x) == 28, "struct SDL_GamepadTouchpadEvent.x: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadTouchpadEvent, y) == 32, "struct SDL_GamepadTouchpadEvent.y: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadTouchpadEvent, pressure) == 36, "struct SDL_GamepadTouchpadEvent.pressure: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GamepadSensorEvent) == 48, "struct SDL_GamepadSensorEvent: baked sizeof 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GamepadSensorEvent) == 8, "struct SDL_GamepadSensorEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadSensorEvent, type) == 0, "struct SDL_GamepadSensorEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadSensorEvent, reserved) == 4, "struct SDL_GamepadSensorEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadSensorEvent, timestamp) == 8, "struct SDL_GamepadSensorEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadSensorEvent, which) == 16, "struct SDL_GamepadSensorEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadSensorEvent, sensor) == 20, "struct SDL_GamepadSensorEvent.sensor: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadSensorEvent, data) == 24, "struct SDL_GamepadSensorEvent.data: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GamepadSensorEvent, sensor_timestamp) == 40, "struct SDL_GamepadSensorEvent.sensor_timestamp: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_AudioDeviceEvent) == 24, "struct SDL_AudioDeviceEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_AudioDeviceEvent) == 8, "struct SDL_AudioDeviceEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioDeviceEvent, type) == 0, "struct SDL_AudioDeviceEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioDeviceEvent, reserved) == 4, "struct SDL_AudioDeviceEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioDeviceEvent, timestamp) == 8, "struct SDL_AudioDeviceEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioDeviceEvent, which) == 16, "struct SDL_AudioDeviceEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioDeviceEvent, recording) == 20, "struct SDL_AudioDeviceEvent.recording: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioDeviceEvent, padding1) == 21, "struct SDL_AudioDeviceEvent.padding1: baked offset 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioDeviceEvent, padding2) == 22, "struct SDL_AudioDeviceEvent.padding2: baked offset 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_AudioDeviceEvent, padding3) == 23, "struct SDL_AudioDeviceEvent.padding3: baked offset 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_CameraDeviceEvent) == 24, "struct SDL_CameraDeviceEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_CameraDeviceEvent) == 8, "struct SDL_CameraDeviceEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CameraDeviceEvent, type) == 0, "struct SDL_CameraDeviceEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CameraDeviceEvent, reserved) == 4, "struct SDL_CameraDeviceEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CameraDeviceEvent, timestamp) == 8, "struct SDL_CameraDeviceEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_CameraDeviceEvent, which) == 16, "struct SDL_CameraDeviceEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_RenderEvent) == 24, "struct SDL_RenderEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_RenderEvent) == 8, "struct SDL_RenderEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_RenderEvent, type) == 0, "struct SDL_RenderEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_RenderEvent, reserved) == 4, "struct SDL_RenderEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_RenderEvent, timestamp) == 8, "struct SDL_RenderEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_RenderEvent, windowID) == 16, "struct SDL_RenderEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_TouchFingerEvent) == 56, "struct SDL_TouchFingerEvent: baked sizeof 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_TouchFingerEvent) == 8, "struct SDL_TouchFingerEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, type) == 0, "struct SDL_TouchFingerEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, reserved) == 4, "struct SDL_TouchFingerEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, timestamp) == 8, "struct SDL_TouchFingerEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, touchID) == 16, "struct SDL_TouchFingerEvent.touchID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, fingerID) == 24, "struct SDL_TouchFingerEvent.fingerID: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, x) == 32, "struct SDL_TouchFingerEvent.x: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, y) == 36, "struct SDL_TouchFingerEvent.y: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, dx) == 40, "struct SDL_TouchFingerEvent.dx: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, dy) == 44, "struct SDL_TouchFingerEvent.dy: baked offset 44 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, pressure) == 48, "struct SDL_TouchFingerEvent.pressure: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_TouchFingerEvent, windowID) == 52, "struct SDL_TouchFingerEvent.windowID: baked offset 52 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert(sizeof(struct SDL_PinchFingerEvent) == 24, "struct SDL_PinchFingerEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_PinchFingerEvent) == 8, "struct SDL_PinchFingerEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PinchFingerEvent, type) == 0, "struct SDL_PinchFingerEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PinchFingerEvent, reserved) == 4, "struct SDL_PinchFingerEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PinchFingerEvent, timestamp) == 8, "struct SDL_PinchFingerEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PinchFingerEvent, scale) == 16, "struct SDL_PinchFingerEvent.scale: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PinchFingerEvent, windowID) == 20, "struct SDL_PinchFingerEvent.windowID: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(sizeof(struct SDL_PenProximityEvent) == 24, "struct SDL_PenProximityEvent: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_PenProximityEvent) == 8, "struct SDL_PenProximityEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenProximityEvent, type) == 0, "struct SDL_PenProximityEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenProximityEvent, reserved) == 4, "struct SDL_PenProximityEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenProximityEvent, timestamp) == 8, "struct SDL_PenProximityEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenProximityEvent, windowID) == 16, "struct SDL_PenProximityEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenProximityEvent, which) == 20, "struct SDL_PenProximityEvent.which: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_PenMotionEvent) == 40, "struct SDL_PenMotionEvent: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_PenMotionEvent) == 8, "struct SDL_PenMotionEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenMotionEvent, type) == 0, "struct SDL_PenMotionEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenMotionEvent, reserved) == 4, "struct SDL_PenMotionEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenMotionEvent, timestamp) == 8, "struct SDL_PenMotionEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenMotionEvent, windowID) == 16, "struct SDL_PenMotionEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenMotionEvent, which) == 20, "struct SDL_PenMotionEvent.which: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenMotionEvent, pen_state) == 24, "struct SDL_PenMotionEvent.pen_state: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenMotionEvent, x) == 28, "struct SDL_PenMotionEvent.x: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenMotionEvent, y) == 32, "struct SDL_PenMotionEvent.y: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_PenTouchEvent) == 40, "struct SDL_PenTouchEvent: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_PenTouchEvent) == 8, "struct SDL_PenTouchEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenTouchEvent, type) == 0, "struct SDL_PenTouchEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenTouchEvent, reserved) == 4, "struct SDL_PenTouchEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenTouchEvent, timestamp) == 8, "struct SDL_PenTouchEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenTouchEvent, windowID) == 16, "struct SDL_PenTouchEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenTouchEvent, which) == 20, "struct SDL_PenTouchEvent.which: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenTouchEvent, pen_state) == 24, "struct SDL_PenTouchEvent.pen_state: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenTouchEvent, x) == 28, "struct SDL_PenTouchEvent.x: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenTouchEvent, y) == 32, "struct SDL_PenTouchEvent.y: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenTouchEvent, eraser) == 36, "struct SDL_PenTouchEvent.eraser: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenTouchEvent, down) == 37, "struct SDL_PenTouchEvent.down: baked offset 37 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_PenButtonEvent) == 40, "struct SDL_PenButtonEvent: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_PenButtonEvent) == 8, "struct SDL_PenButtonEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenButtonEvent, type) == 0, "struct SDL_PenButtonEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenButtonEvent, reserved) == 4, "struct SDL_PenButtonEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenButtonEvent, timestamp) == 8, "struct SDL_PenButtonEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenButtonEvent, windowID) == 16, "struct SDL_PenButtonEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenButtonEvent, which) == 20, "struct SDL_PenButtonEvent.which: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenButtonEvent, pen_state) == 24, "struct SDL_PenButtonEvent.pen_state: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenButtonEvent, x) == 28, "struct SDL_PenButtonEvent.x: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenButtonEvent, y) == 32, "struct SDL_PenButtonEvent.y: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenButtonEvent, button) == 36, "struct SDL_PenButtonEvent.button: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenButtonEvent, down) == 37, "struct SDL_PenButtonEvent.down: baked offset 37 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_PenAxisEvent) == 48, "struct SDL_PenAxisEvent: baked sizeof 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_PenAxisEvent) == 8, "struct SDL_PenAxisEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenAxisEvent, type) == 0, "struct SDL_PenAxisEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenAxisEvent, reserved) == 4, "struct SDL_PenAxisEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenAxisEvent, timestamp) == 8, "struct SDL_PenAxisEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenAxisEvent, windowID) == 16, "struct SDL_PenAxisEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenAxisEvent, which) == 20, "struct SDL_PenAxisEvent.which: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenAxisEvent, pen_state) == 24, "struct SDL_PenAxisEvent.pen_state: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenAxisEvent, x) == 28, "struct SDL_PenAxisEvent.x: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenAxisEvent, y) == 32, "struct SDL_PenAxisEvent.y: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenAxisEvent, axis) == 36, "struct SDL_PenAxisEvent.axis: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PenAxisEvent, value) == 40, "struct SDL_PenAxisEvent.value: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_DropEvent) == 48, "struct SDL_DropEvent: baked sizeof 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_DropEvent) == 8, "struct SDL_DropEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DropEvent, type) == 0, "struct SDL_DropEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DropEvent, reserved) == 4, "struct SDL_DropEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DropEvent, timestamp) == 8, "struct SDL_DropEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DropEvent, windowID) == 16, "struct SDL_DropEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DropEvent, x) == 20, "struct SDL_DropEvent.x: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DropEvent, y) == 24, "struct SDL_DropEvent.y: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DropEvent, source) == 32, "struct SDL_DropEvent.source: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DropEvent, data) == 40, "struct SDL_DropEvent.data: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_ClipboardEvent) == 32, "struct SDL_ClipboardEvent: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_ClipboardEvent) == 8, "struct SDL_ClipboardEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_ClipboardEvent, type) == 0, "struct SDL_ClipboardEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_ClipboardEvent, reserved) == 4, "struct SDL_ClipboardEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_ClipboardEvent, timestamp) == 8, "struct SDL_ClipboardEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_ClipboardEvent, owner) == 16, "struct SDL_ClipboardEvent.owner: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_ClipboardEvent, num_mime_types) == 20, "struct SDL_ClipboardEvent.num_mime_types: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_ClipboardEvent, mime_types) == 24, "struct SDL_ClipboardEvent.mime_types: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_SensorEvent) == 56, "struct SDL_SensorEvent: baked sizeof 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_SensorEvent) == 8, "struct SDL_SensorEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_SensorEvent, type) == 0, "struct SDL_SensorEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_SensorEvent, reserved) == 4, "struct SDL_SensorEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_SensorEvent, timestamp) == 8, "struct SDL_SensorEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_SensorEvent, which) == 16, "struct SDL_SensorEvent.which: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_SensorEvent, data) == 20, "struct SDL_SensorEvent.data: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_SensorEvent, sensor_timestamp) == 48, "struct SDL_SensorEvent.sensor_timestamp: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_QuitEvent) == 16, "struct SDL_QuitEvent: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_QuitEvent) == 8, "struct SDL_QuitEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_QuitEvent, type) == 0, "struct SDL_QuitEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_QuitEvent, reserved) == 4, "struct SDL_QuitEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_QuitEvent, timestamp) == 8, "struct SDL_QuitEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_UserEvent) == 40, "struct SDL_UserEvent: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_UserEvent) == 8, "struct SDL_UserEvent: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_UserEvent, type) == 0, "struct SDL_UserEvent.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_UserEvent, reserved) == 4, "struct SDL_UserEvent.reserved: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_UserEvent, timestamp) == 8, "struct SDL_UserEvent.timestamp: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_UserEvent, windowID) == 16, "struct SDL_UserEvent.windowID: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_UserEvent, code) == 20, "struct SDL_UserEvent.code: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_UserEvent, data1) == 24, "struct SDL_UserEvent.data1: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_UserEvent, data2) == 32, "struct SDL_UserEvent.data2: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(union SDL_Event) == 128, "union SDL_Event: baked sizeof 128 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(union SDL_Event) == 8, "union SDL_Event: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_EventAction) == 4, "enum SDL_EventAction: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_EventAction) == 4, "enum SDL_EventAction: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ADDEVENT) == (0), "SDL_ADDEVENT: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEEKEVENT) == (1), "SDL_PEEKEVENT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GETEVENT) == (2), "SDL_GETEVENT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_filesystem.h ---- */
+_Static_assert(sizeof(enum SDL_Folder) == 4, "enum SDL_Folder: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_Folder) == 4, "enum SDL_Folder: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_HOME) == (0), "SDL_FOLDER_HOME: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_DESKTOP) == (1), "SDL_FOLDER_DESKTOP: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_DOCUMENTS) == (2), "SDL_FOLDER_DOCUMENTS: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_DOWNLOADS) == (3), "SDL_FOLDER_DOWNLOADS: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_MUSIC) == (4), "SDL_FOLDER_MUSIC: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_PICTURES) == (5), "SDL_FOLDER_PICTURES: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_PUBLICSHARE) == (6), "SDL_FOLDER_PUBLICSHARE: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_SAVEDGAMES) == (7), "SDL_FOLDER_SAVEDGAMES: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_SCREENSHOTS) == (8), "SDL_FOLDER_SCREENSHOTS: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_TEMPLATES) == (9), "SDL_FOLDER_TEMPLATES: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_VIDEOS) == (10), "SDL_FOLDER_VIDEOS: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_FOLDER_COUNT) == (11), "SDL_FOLDER_COUNT: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_PathType) == 4, "enum SDL_PathType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_PathType) == 4, "enum SDL_PathType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PATHTYPE_NONE) == (0), "SDL_PATHTYPE_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PATHTYPE_FILE) == (1), "SDL_PATHTYPE_FILE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PATHTYPE_DIRECTORY) == (2), "SDL_PATHTYPE_DIRECTORY: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PATHTYPE_OTHER) == (3), "SDL_PATHTYPE_OTHER: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_PathInfo) == 40, "struct SDL_PathInfo: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_PathInfo) == 8, "struct SDL_PathInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PathInfo, type) == 0, "struct SDL_PathInfo.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PathInfo, size) == 8, "struct SDL_PathInfo.size: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PathInfo, create_time) == 16, "struct SDL_PathInfo.create_time: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PathInfo, modify_time) == 24, "struct SDL_PathInfo.modify_time: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_PathInfo, access_time) == 32, "struct SDL_PathInfo.access_time: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_EnumerationResult) == 4, "enum SDL_EnumerationResult: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_EnumerationResult) == 4, "enum SDL_EnumerationResult: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ENUM_CONTINUE) == (0), "SDL_ENUM_CONTINUE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ENUM_SUCCESS) == (1), "SDL_ENUM_SUCCESS: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_ENUM_FAILURE) == (2), "SDL_ENUM_FAILURE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_gpu.h ---- */
+_Static_assert(sizeof(enum SDL_GPUPrimitiveType) == 4, "enum SDL_GPUPrimitiveType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUPrimitiveType) == 4, "enum SDL_GPUPrimitiveType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_PRIMITIVETYPE_TRIANGLELIST) == (0), "SDL_GPU_PRIMITIVETYPE_TRIANGLELIST: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP) == (1), "SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_PRIMITIVETYPE_LINELIST) == (2), "SDL_GPU_PRIMITIVETYPE_LINELIST: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_PRIMITIVETYPE_LINESTRIP) == (3), "SDL_GPU_PRIMITIVETYPE_LINESTRIP: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_PRIMITIVETYPE_POINTLIST) == (4), "SDL_GPU_PRIMITIVETYPE_POINTLIST: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPULoadOp) == 4, "enum SDL_GPULoadOp: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPULoadOp) == 4, "enum SDL_GPULoadOp: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_LOADOP_LOAD) == (0), "SDL_GPU_LOADOP_LOAD: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_LOADOP_CLEAR) == (1), "SDL_GPU_LOADOP_CLEAR: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_LOADOP_DONT_CARE) == (2), "SDL_GPU_LOADOP_DONT_CARE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUStoreOp) == 4, "enum SDL_GPUStoreOp: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUStoreOp) == 4, "enum SDL_GPUStoreOp: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STOREOP_STORE) == (0), "SDL_GPU_STOREOP_STORE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STOREOP_DONT_CARE) == (1), "SDL_GPU_STOREOP_DONT_CARE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STOREOP_RESOLVE) == (2), "SDL_GPU_STOREOP_RESOLVE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STOREOP_RESOLVE_AND_STORE) == (3), "SDL_GPU_STOREOP_RESOLVE_AND_STORE: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUIndexElementSize) == 4, "enum SDL_GPUIndexElementSize: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUIndexElementSize) == 4, "enum SDL_GPUIndexElementSize: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_INDEXELEMENTSIZE_16BIT) == (0), "SDL_GPU_INDEXELEMENTSIZE_16BIT: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_INDEXELEMENTSIZE_32BIT) == (1), "SDL_GPU_INDEXELEMENTSIZE_32BIT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUTextureFormat) == 4, "enum SDL_GPUTextureFormat: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUTextureFormat) == 4, "enum SDL_GPUTextureFormat: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_INVALID) == (0), "SDL_GPU_TEXTUREFORMAT_INVALID: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_A8_UNORM) == (1), "SDL_GPU_TEXTUREFORMAT_A8_UNORM: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8_UNORM) == (2), "SDL_GPU_TEXTUREFORMAT_R8_UNORM: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8G8_UNORM) == (3), "SDL_GPU_TEXTUREFORMAT_R8G8_UNORM: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM) == (4), "SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16_UNORM) == (5), "SDL_GPU_TEXTUREFORMAT_R16_UNORM: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16G16_UNORM) == (6), "SDL_GPU_TEXTUREFORMAT_R16G16_UNORM: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM) == (7), "SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM) == (8), "SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM) == (9), "SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM) == (10), "SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM) == (11), "SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM) == (12), "SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM) == (13), "SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM: baked value 13 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM) == (14), "SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM: baked value 14 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM) == (15), "SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM: baked value 15 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM) == (16), "SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM) == (17), "SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM: baked value 17 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM) == (18), "SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM: baked value 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT) == (19), "SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT: baked value 19 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT) == (20), "SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT: baked value 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8_SNORM) == (21), "SDL_GPU_TEXTUREFORMAT_R8_SNORM: baked value 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8G8_SNORM) == (22), "SDL_GPU_TEXTUREFORMAT_R8G8_SNORM: baked value 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM) == (23), "SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM: baked value 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16_SNORM) == (24), "SDL_GPU_TEXTUREFORMAT_R16_SNORM: baked value 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16G16_SNORM) == (25), "SDL_GPU_TEXTUREFORMAT_R16G16_SNORM: baked value 25 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM) == (26), "SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM: baked value 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16_FLOAT) == (27), "SDL_GPU_TEXTUREFORMAT_R16_FLOAT: baked value 27 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT) == (28), "SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT: baked value 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT) == (29), "SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT: baked value 29 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R32_FLOAT) == (30), "SDL_GPU_TEXTUREFORMAT_R32_FLOAT: baked value 30 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT) == (31), "SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT: baked value 31 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT) == (32), "SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT) == (33), "SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT: baked value 33 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8_UINT) == (34), "SDL_GPU_TEXTUREFORMAT_R8_UINT: baked value 34 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8G8_UINT) == (35), "SDL_GPU_TEXTUREFORMAT_R8G8_UINT: baked value 35 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT) == (36), "SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT: baked value 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16_UINT) == (37), "SDL_GPU_TEXTUREFORMAT_R16_UINT: baked value 37 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16G16_UINT) == (38), "SDL_GPU_TEXTUREFORMAT_R16G16_UINT: baked value 38 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT) == (39), "SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT: baked value 39 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R32_UINT) == (40), "SDL_GPU_TEXTUREFORMAT_R32_UINT: baked value 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R32G32_UINT) == (41), "SDL_GPU_TEXTUREFORMAT_R32G32_UINT: baked value 41 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT) == (42), "SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT: baked value 42 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8_INT) == (43), "SDL_GPU_TEXTUREFORMAT_R8_INT: baked value 43 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8G8_INT) == (44), "SDL_GPU_TEXTUREFORMAT_R8G8_INT: baked value 44 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT) == (45), "SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT: baked value 45 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16_INT) == (46), "SDL_GPU_TEXTUREFORMAT_R16_INT: baked value 46 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16G16_INT) == (47), "SDL_GPU_TEXTUREFORMAT_R16G16_INT: baked value 47 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT) == (48), "SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT: baked value 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R32_INT) == (49), "SDL_GPU_TEXTUREFORMAT_R32_INT: baked value 49 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R32G32_INT) == (50), "SDL_GPU_TEXTUREFORMAT_R32G32_INT: baked value 50 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT) == (51), "SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT: baked value 51 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB) == (52), "SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB: baked value 52 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB) == (53), "SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB: baked value 53 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB) == (54), "SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB: baked value 54 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB) == (55), "SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB: baked value 55 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB) == (56), "SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB: baked value 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB) == (57), "SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB: baked value 57 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_D16_UNORM) == (58), "SDL_GPU_TEXTUREFORMAT_D16_UNORM: baked value 58 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_D24_UNORM) == (59), "SDL_GPU_TEXTUREFORMAT_D24_UNORM: baked value 59 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_D32_FLOAT) == (60), "SDL_GPU_TEXTUREFORMAT_D32_FLOAT: baked value 60 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT) == (61), "SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT: baked value 61 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT) == (62), "SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT: baked value 62 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM) == (63), "SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM: baked value 63 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM) == (64), "SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM: baked value 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM) == (65), "SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM: baked value 65 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM) == (66), "SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM: baked value 66 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM) == (67), "SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM: baked value 67 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM) == (68), "SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM: baked value 68 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM) == (69), "SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM: baked value 69 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM) == (70), "SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM: baked value 70 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM) == (71), "SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM: baked value 71 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM) == (72), "SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM: baked value 72 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM) == (73), "SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM: baked value 73 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM) == (74), "SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM: baked value 74 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM) == (75), "SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM: baked value 75 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM) == (76), "SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM: baked value 76 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB) == (77), "SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB: baked value 77 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB) == (78), "SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB: baked value 78 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB) == (79), "SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB: baked value 79 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB) == (80), "SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB: baked value 80 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB) == (81), "SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB: baked value 81 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB) == (82), "SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB: baked value 82 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB) == (83), "SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB: baked value 83 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB) == (84), "SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB: baked value 84 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB) == (85), "SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB: baked value 85 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB) == (86), "SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB: baked value 86 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB) == (87), "SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB: baked value 87 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB) == (88), "SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB: baked value 88 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB) == (89), "SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB: baked value 89 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB) == (90), "SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB: baked value 90 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT) == (91), "SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT: baked value 91 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT) == (92), "SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT: baked value 92 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT) == (93), "SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT: baked value 93 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT) == (94), "SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT: baked value 94 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT) == (95), "SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT: baked value 95 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT) == (96), "SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT: baked value 96 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT) == (97), "SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT: baked value 97 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT) == (98), "SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT: baked value 98 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT) == (99), "SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT: baked value 99 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT) == (100), "SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT: baked value 100 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT) == (101), "SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT: baked value 101 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT) == (102), "SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT: baked value 102 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT) == (103), "SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT: baked value 103 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT) == (104), "SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT: baked value 104 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUTextureType) == 4, "enum SDL_GPUTextureType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUTextureType) == 4, "enum SDL_GPUTextureType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTURETYPE_2D) == (0), "SDL_GPU_TEXTURETYPE_2D: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTURETYPE_2D_ARRAY) == (1), "SDL_GPU_TEXTURETYPE_2D_ARRAY: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTURETYPE_3D) == (2), "SDL_GPU_TEXTURETYPE_3D: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTURETYPE_CUBE) == (3), "SDL_GPU_TEXTURETYPE_CUBE: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTURETYPE_CUBE_ARRAY) == (4), "SDL_GPU_TEXTURETYPE_CUBE_ARRAY: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUSampleCount) == 4, "enum SDL_GPUSampleCount: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUSampleCount) == 4, "enum SDL_GPUSampleCount: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SAMPLECOUNT_1) == (0), "SDL_GPU_SAMPLECOUNT_1: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SAMPLECOUNT_2) == (1), "SDL_GPU_SAMPLECOUNT_2: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SAMPLECOUNT_4) == (2), "SDL_GPU_SAMPLECOUNT_4: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SAMPLECOUNT_8) == (3), "SDL_GPU_SAMPLECOUNT_8: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUCubeMapFace) == 4, "enum SDL_GPUCubeMapFace: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUCubeMapFace) == 4, "enum SDL_GPUCubeMapFace: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_CUBEMAPFACE_POSITIVEX) == (0), "SDL_GPU_CUBEMAPFACE_POSITIVEX: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_CUBEMAPFACE_NEGATIVEX) == (1), "SDL_GPU_CUBEMAPFACE_NEGATIVEX: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_CUBEMAPFACE_POSITIVEY) == (2), "SDL_GPU_CUBEMAPFACE_POSITIVEY: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_CUBEMAPFACE_NEGATIVEY) == (3), "SDL_GPU_CUBEMAPFACE_NEGATIVEY: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_CUBEMAPFACE_POSITIVEZ) == (4), "SDL_GPU_CUBEMAPFACE_POSITIVEZ: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_CUBEMAPFACE_NEGATIVEZ) == (5), "SDL_GPU_CUBEMAPFACE_NEGATIVEZ: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUTransferBufferUsage) == 4, "enum SDL_GPUTransferBufferUsage: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUTransferBufferUsage) == 4, "enum SDL_GPUTransferBufferUsage: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD) == (0), "SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD) == (1), "SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUShaderStage) == 4, "enum SDL_GPUShaderStage: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUShaderStage) == 4, "enum SDL_GPUShaderStage: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SHADERSTAGE_VERTEX) == (0), "SDL_GPU_SHADERSTAGE_VERTEX: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SHADERSTAGE_FRAGMENT) == (1), "SDL_GPU_SHADERSTAGE_FRAGMENT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUVertexElementFormat) == 4, "enum SDL_GPUVertexElementFormat: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUVertexElementFormat) == 4, "enum SDL_GPUVertexElementFormat: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_INVALID) == (0), "SDL_GPU_VERTEXELEMENTFORMAT_INVALID: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_INT) == (1), "SDL_GPU_VERTEXELEMENTFORMAT_INT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_INT2) == (2), "SDL_GPU_VERTEXELEMENTFORMAT_INT2: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_INT3) == (3), "SDL_GPU_VERTEXELEMENTFORMAT_INT3: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_INT4) == (4), "SDL_GPU_VERTEXELEMENTFORMAT_INT4: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_UINT) == (5), "SDL_GPU_VERTEXELEMENTFORMAT_UINT: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_UINT2) == (6), "SDL_GPU_VERTEXELEMENTFORMAT_UINT2: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_UINT3) == (7), "SDL_GPU_VERTEXELEMENTFORMAT_UINT3: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_UINT4) == (8), "SDL_GPU_VERTEXELEMENTFORMAT_UINT4: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_FLOAT) == (9), "SDL_GPU_VERTEXELEMENTFORMAT_FLOAT: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2) == (10), "SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3) == (11), "SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4) == (12), "SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_BYTE2) == (13), "SDL_GPU_VERTEXELEMENTFORMAT_BYTE2: baked value 13 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_BYTE4) == (14), "SDL_GPU_VERTEXELEMENTFORMAT_BYTE4: baked value 14 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2) == (15), "SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2: baked value 15 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4) == (16), "SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_BYTE2_NORM) == (17), "SDL_GPU_VERTEXELEMENTFORMAT_BYTE2_NORM: baked value 17 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_BYTE4_NORM) == (18), "SDL_GPU_VERTEXELEMENTFORMAT_BYTE4_NORM: baked value 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2_NORM) == (19), "SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2_NORM: baked value 19 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM) == (20), "SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM: baked value 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_SHORT2) == (21), "SDL_GPU_VERTEXELEMENTFORMAT_SHORT2: baked value 21 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_SHORT4) == (22), "SDL_GPU_VERTEXELEMENTFORMAT_SHORT4: baked value 22 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_USHORT2) == (23), "SDL_GPU_VERTEXELEMENTFORMAT_USHORT2: baked value 23 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_USHORT4) == (24), "SDL_GPU_VERTEXELEMENTFORMAT_USHORT4: baked value 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_SHORT2_NORM) == (25), "SDL_GPU_VERTEXELEMENTFORMAT_SHORT2_NORM: baked value 25 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_SHORT4_NORM) == (26), "SDL_GPU_VERTEXELEMENTFORMAT_SHORT4_NORM: baked value 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_USHORT2_NORM) == (27), "SDL_GPU_VERTEXELEMENTFORMAT_USHORT2_NORM: baked value 27 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_USHORT4_NORM) == (28), "SDL_GPU_VERTEXELEMENTFORMAT_USHORT4_NORM: baked value 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_HALF2) == (29), "SDL_GPU_VERTEXELEMENTFORMAT_HALF2: baked value 29 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXELEMENTFORMAT_HALF4) == (30), "SDL_GPU_VERTEXELEMENTFORMAT_HALF4: baked value 30 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUVertexInputRate) == 4, "enum SDL_GPUVertexInputRate: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUVertexInputRate) == 4, "enum SDL_GPUVertexInputRate: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXINPUTRATE_VERTEX) == (0), "SDL_GPU_VERTEXINPUTRATE_VERTEX: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_VERTEXINPUTRATE_INSTANCE) == (1), "SDL_GPU_VERTEXINPUTRATE_INSTANCE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUFillMode) == 4, "enum SDL_GPUFillMode: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUFillMode) == 4, "enum SDL_GPUFillMode: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_FILLMODE_FILL) == (0), "SDL_GPU_FILLMODE_FILL: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_FILLMODE_LINE) == (1), "SDL_GPU_FILLMODE_LINE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUCullMode) == 4, "enum SDL_GPUCullMode: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUCullMode) == 4, "enum SDL_GPUCullMode: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_CULLMODE_NONE) == (0), "SDL_GPU_CULLMODE_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_CULLMODE_FRONT) == (1), "SDL_GPU_CULLMODE_FRONT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_CULLMODE_BACK) == (2), "SDL_GPU_CULLMODE_BACK: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUFrontFace) == 4, "enum SDL_GPUFrontFace: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUFrontFace) == 4, "enum SDL_GPUFrontFace: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE) == (0), "SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_FRONTFACE_CLOCKWISE) == (1), "SDL_GPU_FRONTFACE_CLOCKWISE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUCompareOp) == 4, "enum SDL_GPUCompareOp: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUCompareOp) == 4, "enum SDL_GPUCompareOp: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COMPAREOP_INVALID) == (0), "SDL_GPU_COMPAREOP_INVALID: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COMPAREOP_NEVER) == (1), "SDL_GPU_COMPAREOP_NEVER: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COMPAREOP_LESS) == (2), "SDL_GPU_COMPAREOP_LESS: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COMPAREOP_EQUAL) == (3), "SDL_GPU_COMPAREOP_EQUAL: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COMPAREOP_LESS_OR_EQUAL) == (4), "SDL_GPU_COMPAREOP_LESS_OR_EQUAL: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COMPAREOP_GREATER) == (5), "SDL_GPU_COMPAREOP_GREATER: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COMPAREOP_NOT_EQUAL) == (6), "SDL_GPU_COMPAREOP_NOT_EQUAL: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COMPAREOP_GREATER_OR_EQUAL) == (7), "SDL_GPU_COMPAREOP_GREATER_OR_EQUAL: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COMPAREOP_ALWAYS) == (8), "SDL_GPU_COMPAREOP_ALWAYS: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUStencilOp) == 4, "enum SDL_GPUStencilOp: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUStencilOp) == 4, "enum SDL_GPUStencilOp: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STENCILOP_INVALID) == (0), "SDL_GPU_STENCILOP_INVALID: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STENCILOP_KEEP) == (1), "SDL_GPU_STENCILOP_KEEP: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STENCILOP_ZERO) == (2), "SDL_GPU_STENCILOP_ZERO: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STENCILOP_REPLACE) == (3), "SDL_GPU_STENCILOP_REPLACE: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP) == (4), "SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP) == (5), "SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STENCILOP_INVERT) == (6), "SDL_GPU_STENCILOP_INVERT: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STENCILOP_INCREMENT_AND_WRAP) == (7), "SDL_GPU_STENCILOP_INCREMENT_AND_WRAP: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_STENCILOP_DECREMENT_AND_WRAP) == (8), "SDL_GPU_STENCILOP_DECREMENT_AND_WRAP: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUBlendOp) == 4, "enum SDL_GPUBlendOp: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUBlendOp) == 4, "enum SDL_GPUBlendOp: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDOP_INVALID) == (0), "SDL_GPU_BLENDOP_INVALID: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDOP_ADD) == (1), "SDL_GPU_BLENDOP_ADD: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDOP_SUBTRACT) == (2), "SDL_GPU_BLENDOP_SUBTRACT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDOP_REVERSE_SUBTRACT) == (3), "SDL_GPU_BLENDOP_REVERSE_SUBTRACT: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDOP_MIN) == (4), "SDL_GPU_BLENDOP_MIN: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDOP_MAX) == (5), "SDL_GPU_BLENDOP_MAX: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUBlendFactor) == 4, "enum SDL_GPUBlendFactor: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUBlendFactor) == 4, "enum SDL_GPUBlendFactor: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_INVALID) == (0), "SDL_GPU_BLENDFACTOR_INVALID: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_ZERO) == (1), "SDL_GPU_BLENDFACTOR_ZERO: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_ONE) == (2), "SDL_GPU_BLENDFACTOR_ONE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_SRC_COLOR) == (3), "SDL_GPU_BLENDFACTOR_SRC_COLOR: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR) == (4), "SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_DST_COLOR) == (5), "SDL_GPU_BLENDFACTOR_DST_COLOR: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR) == (6), "SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_SRC_ALPHA) == (7), "SDL_GPU_BLENDFACTOR_SRC_ALPHA: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA) == (8), "SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_DST_ALPHA) == (9), "SDL_GPU_BLENDFACTOR_DST_ALPHA: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA) == (10), "SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_CONSTANT_COLOR) == (11), "SDL_GPU_BLENDFACTOR_CONSTANT_COLOR: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR) == (12), "SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE) == (13), "SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE: baked value 13 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUFilter) == 4, "enum SDL_GPUFilter: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUFilter) == 4, "enum SDL_GPUFilter: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_FILTER_NEAREST) == (0), "SDL_GPU_FILTER_NEAREST: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_FILTER_LINEAR) == (1), "SDL_GPU_FILTER_LINEAR: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUSamplerMipmapMode) == 4, "enum SDL_GPUSamplerMipmapMode: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUSamplerMipmapMode) == 4, "enum SDL_GPUSamplerMipmapMode: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SAMPLERMIPMAPMODE_NEAREST) == (0), "SDL_GPU_SAMPLERMIPMAPMODE_NEAREST: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SAMPLERMIPMAPMODE_LINEAR) == (1), "SDL_GPU_SAMPLERMIPMAPMODE_LINEAR: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUSamplerAddressMode) == 4, "enum SDL_GPUSamplerAddressMode: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUSamplerAddressMode) == 4, "enum SDL_GPUSamplerAddressMode: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SAMPLERADDRESSMODE_REPEAT) == (0), "SDL_GPU_SAMPLERADDRESSMODE_REPEAT: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT) == (1), "SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE) == (2), "SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUPresentMode) == 4, "enum SDL_GPUPresentMode: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUPresentMode) == 4, "enum SDL_GPUPresentMode: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_PRESENTMODE_VSYNC) == (0), "SDL_GPU_PRESENTMODE_VSYNC: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_PRESENTMODE_IMMEDIATE) == (1), "SDL_GPU_PRESENTMODE_IMMEDIATE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_PRESENTMODE_MAILBOX) == (2), "SDL_GPU_PRESENTMODE_MAILBOX: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_GPUSwapchainComposition) == 4, "enum SDL_GPUSwapchainComposition: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_GPUSwapchainComposition) == 4, "enum SDL_GPUSwapchainComposition: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SWAPCHAINCOMPOSITION_SDR) == (0), "SDL_GPU_SWAPCHAINCOMPOSITION_SDR: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR) == (1), "SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR) == (2), "SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084) == (3), "SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUViewport) == 24, "struct SDL_GPUViewport: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUViewport) == 4, "struct SDL_GPUViewport: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUViewport, x) == 0, "struct SDL_GPUViewport.x: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUViewport, y) == 4, "struct SDL_GPUViewport.y: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUViewport, w) == 8, "struct SDL_GPUViewport.w: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUViewport, h) == 12, "struct SDL_GPUViewport.h: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUViewport, min_depth) == 16, "struct SDL_GPUViewport.min_depth: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUViewport, max_depth) == 20, "struct SDL_GPUViewport.max_depth: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUTextureTransferInfo) == 24, "struct SDL_GPUTextureTransferInfo: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUTextureTransferInfo) == 8, "struct SDL_GPUTextureTransferInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureTransferInfo, transfer_buffer) == 0, "struct SDL_GPUTextureTransferInfo.transfer_buffer: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureTransferInfo, offset) == 8, "struct SDL_GPUTextureTransferInfo.offset: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureTransferInfo, pixels_per_row) == 12, "struct SDL_GPUTextureTransferInfo.pixels_per_row: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureTransferInfo, rows_per_layer) == 16, "struct SDL_GPUTextureTransferInfo.rows_per_layer: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUTransferBufferLocation) == 16, "struct SDL_GPUTransferBufferLocation: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUTransferBufferLocation) == 8, "struct SDL_GPUTransferBufferLocation: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTransferBufferLocation, transfer_buffer) == 0, "struct SDL_GPUTransferBufferLocation.transfer_buffer: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTransferBufferLocation, offset) == 8, "struct SDL_GPUTransferBufferLocation.offset: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUTextureLocation) == 32, "struct SDL_GPUTextureLocation: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUTextureLocation) == 8, "struct SDL_GPUTextureLocation: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureLocation, texture) == 0, "struct SDL_GPUTextureLocation.texture: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureLocation, mip_level) == 8, "struct SDL_GPUTextureLocation.mip_level: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureLocation, layer) == 12, "struct SDL_GPUTextureLocation.layer: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureLocation, x) == 16, "struct SDL_GPUTextureLocation.x: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureLocation, y) == 20, "struct SDL_GPUTextureLocation.y: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureLocation, z) == 24, "struct SDL_GPUTextureLocation.z: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUTextureRegion) == 40, "struct SDL_GPUTextureRegion: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUTextureRegion) == 8, "struct SDL_GPUTextureRegion: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureRegion, texture) == 0, "struct SDL_GPUTextureRegion.texture: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureRegion, mip_level) == 8, "struct SDL_GPUTextureRegion.mip_level: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureRegion, layer) == 12, "struct SDL_GPUTextureRegion.layer: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureRegion, x) == 16, "struct SDL_GPUTextureRegion.x: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureRegion, y) == 20, "struct SDL_GPUTextureRegion.y: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureRegion, z) == 24, "struct SDL_GPUTextureRegion.z: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureRegion, w) == 28, "struct SDL_GPUTextureRegion.w: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureRegion, h) == 32, "struct SDL_GPUTextureRegion.h: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureRegion, d) == 36, "struct SDL_GPUTextureRegion.d: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUBlitRegion) == 32, "struct SDL_GPUBlitRegion: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUBlitRegion) == 8, "struct SDL_GPUBlitRegion: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitRegion, texture) == 0, "struct SDL_GPUBlitRegion.texture: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitRegion, mip_level) == 8, "struct SDL_GPUBlitRegion.mip_level: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitRegion, layer_or_depth_plane) == 12, "struct SDL_GPUBlitRegion.layer_or_depth_plane: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitRegion, x) == 16, "struct SDL_GPUBlitRegion.x: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitRegion, y) == 20, "struct SDL_GPUBlitRegion.y: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitRegion, w) == 24, "struct SDL_GPUBlitRegion.w: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitRegion, h) == 28, "struct SDL_GPUBlitRegion.h: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUBufferLocation) == 16, "struct SDL_GPUBufferLocation: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUBufferLocation) == 8, "struct SDL_GPUBufferLocation: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBufferLocation, buffer) == 0, "struct SDL_GPUBufferLocation.buffer: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBufferLocation, offset) == 8, "struct SDL_GPUBufferLocation.offset: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUBufferRegion) == 16, "struct SDL_GPUBufferRegion: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUBufferRegion) == 8, "struct SDL_GPUBufferRegion: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBufferRegion, buffer) == 0, "struct SDL_GPUBufferRegion.buffer: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBufferRegion, offset) == 8, "struct SDL_GPUBufferRegion.offset: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBufferRegion, size) == 12, "struct SDL_GPUBufferRegion.size: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUIndirectDrawCommand) == 16, "struct SDL_GPUIndirectDrawCommand: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUIndirectDrawCommand) == 4, "struct SDL_GPUIndirectDrawCommand: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndirectDrawCommand, num_vertices) == 0, "struct SDL_GPUIndirectDrawCommand.num_vertices: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndirectDrawCommand, num_instances) == 4, "struct SDL_GPUIndirectDrawCommand.num_instances: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndirectDrawCommand, first_vertex) == 8, "struct SDL_GPUIndirectDrawCommand.first_vertex: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndirectDrawCommand, first_instance) == 12, "struct SDL_GPUIndirectDrawCommand.first_instance: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUIndexedIndirectDrawCommand) == 20, "struct SDL_GPUIndexedIndirectDrawCommand: baked sizeof 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUIndexedIndirectDrawCommand) == 4, "struct SDL_GPUIndexedIndirectDrawCommand: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndexedIndirectDrawCommand, num_indices) == 0, "struct SDL_GPUIndexedIndirectDrawCommand.num_indices: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndexedIndirectDrawCommand, num_instances) == 4, "struct SDL_GPUIndexedIndirectDrawCommand.num_instances: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndexedIndirectDrawCommand, first_index) == 8, "struct SDL_GPUIndexedIndirectDrawCommand.first_index: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndexedIndirectDrawCommand, vertex_offset) == 12, "struct SDL_GPUIndexedIndirectDrawCommand.vertex_offset: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndexedIndirectDrawCommand, first_instance) == 16, "struct SDL_GPUIndexedIndirectDrawCommand.first_instance: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUIndirectDispatchCommand) == 12, "struct SDL_GPUIndirectDispatchCommand: baked sizeof 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUIndirectDispatchCommand) == 4, "struct SDL_GPUIndirectDispatchCommand: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndirectDispatchCommand, groupcount_x) == 0, "struct SDL_GPUIndirectDispatchCommand.groupcount_x: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndirectDispatchCommand, groupcount_y) == 4, "struct SDL_GPUIndirectDispatchCommand.groupcount_y: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUIndirectDispatchCommand, groupcount_z) == 8, "struct SDL_GPUIndirectDispatchCommand.groupcount_z: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUSamplerCreateInfo) == 52, "struct SDL_GPUSamplerCreateInfo: baked sizeof 52 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUSamplerCreateInfo) == 4, "struct SDL_GPUSamplerCreateInfo: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, min_filter) == 0, "struct SDL_GPUSamplerCreateInfo.min_filter: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, mag_filter) == 4, "struct SDL_GPUSamplerCreateInfo.mag_filter: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, mipmap_mode) == 8, "struct SDL_GPUSamplerCreateInfo.mipmap_mode: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, address_mode_u) == 12, "struct SDL_GPUSamplerCreateInfo.address_mode_u: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, address_mode_v) == 16, "struct SDL_GPUSamplerCreateInfo.address_mode_v: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, address_mode_w) == 20, "struct SDL_GPUSamplerCreateInfo.address_mode_w: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, mip_lod_bias) == 24, "struct SDL_GPUSamplerCreateInfo.mip_lod_bias: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, max_anisotropy) == 28, "struct SDL_GPUSamplerCreateInfo.max_anisotropy: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, compare_op) == 32, "struct SDL_GPUSamplerCreateInfo.compare_op: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, min_lod) == 36, "struct SDL_GPUSamplerCreateInfo.min_lod: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, max_lod) == 40, "struct SDL_GPUSamplerCreateInfo.max_lod: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, enable_anisotropy) == 44, "struct SDL_GPUSamplerCreateInfo.enable_anisotropy: baked offset 44 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, enable_compare) == 45, "struct SDL_GPUSamplerCreateInfo.enable_compare: baked offset 45 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, padding1) == 46, "struct SDL_GPUSamplerCreateInfo.padding1: baked offset 46 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, padding2) == 47, "struct SDL_GPUSamplerCreateInfo.padding2: baked offset 47 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUSamplerCreateInfo, props) == 48, "struct SDL_GPUSamplerCreateInfo.props: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUVertexBufferDescription) == 16, "struct SDL_GPUVertexBufferDescription: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUVertexBufferDescription) == 4, "struct SDL_GPUVertexBufferDescription: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexBufferDescription, slot) == 0, "struct SDL_GPUVertexBufferDescription.slot: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexBufferDescription, pitch) == 4, "struct SDL_GPUVertexBufferDescription.pitch: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexBufferDescription, input_rate) == 8, "struct SDL_GPUVertexBufferDescription.input_rate: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexBufferDescription, instance_step_rate) == 12, "struct SDL_GPUVertexBufferDescription.instance_step_rate: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUVertexAttribute) == 16, "struct SDL_GPUVertexAttribute: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUVertexAttribute) == 4, "struct SDL_GPUVertexAttribute: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexAttribute, location) == 0, "struct SDL_GPUVertexAttribute.location: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexAttribute, buffer_slot) == 4, "struct SDL_GPUVertexAttribute.buffer_slot: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexAttribute, format) == 8, "struct SDL_GPUVertexAttribute.format: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexAttribute, offset) == 12, "struct SDL_GPUVertexAttribute.offset: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUVertexInputState) == 32, "struct SDL_GPUVertexInputState: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUVertexInputState) == 8, "struct SDL_GPUVertexInputState: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexInputState, vertex_buffer_descriptions) == 0, "struct SDL_GPUVertexInputState.vertex_buffer_descriptions: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexInputState, num_vertex_buffers) == 8, "struct SDL_GPUVertexInputState.num_vertex_buffers: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexInputState, vertex_attributes) == 16, "struct SDL_GPUVertexInputState.vertex_attributes: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVertexInputState, num_vertex_attributes) == 24, "struct SDL_GPUVertexInputState.num_vertex_attributes: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUStencilOpState) == 16, "struct SDL_GPUStencilOpState: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUStencilOpState) == 4, "struct SDL_GPUStencilOpState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStencilOpState, fail_op) == 0, "struct SDL_GPUStencilOpState.fail_op: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStencilOpState, pass_op) == 4, "struct SDL_GPUStencilOpState.pass_op: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStencilOpState, depth_fail_op) == 8, "struct SDL_GPUStencilOpState.depth_fail_op: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStencilOpState, compare_op) == 12, "struct SDL_GPUStencilOpState.compare_op: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUColorTargetBlendState) == 32, "struct SDL_GPUColorTargetBlendState: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUColorTargetBlendState) == 4, "struct SDL_GPUColorTargetBlendState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, src_color_blendfactor) == 0, "struct SDL_GPUColorTargetBlendState.src_color_blendfactor: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, dst_color_blendfactor) == 4, "struct SDL_GPUColorTargetBlendState.dst_color_blendfactor: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, color_blend_op) == 8, "struct SDL_GPUColorTargetBlendState.color_blend_op: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, src_alpha_blendfactor) == 12, "struct SDL_GPUColorTargetBlendState.src_alpha_blendfactor: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, dst_alpha_blendfactor) == 16, "struct SDL_GPUColorTargetBlendState.dst_alpha_blendfactor: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, alpha_blend_op) == 20, "struct SDL_GPUColorTargetBlendState.alpha_blend_op: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, color_write_mask) == 24, "struct SDL_GPUColorTargetBlendState.color_write_mask: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, enable_blend) == 25, "struct SDL_GPUColorTargetBlendState.enable_blend: baked offset 25 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, enable_color_write_mask) == 26, "struct SDL_GPUColorTargetBlendState.enable_color_write_mask: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, padding1) == 27, "struct SDL_GPUColorTargetBlendState.padding1: baked offset 27 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetBlendState, padding2) == 28, "struct SDL_GPUColorTargetBlendState.padding2: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUShaderCreateInfo) == 56, "struct SDL_GPUShaderCreateInfo: baked sizeof 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUShaderCreateInfo) == 8, "struct SDL_GPUShaderCreateInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUShaderCreateInfo, code_size) == 0, "struct SDL_GPUShaderCreateInfo.code_size: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUShaderCreateInfo, code) == 8, "struct SDL_GPUShaderCreateInfo.code: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUShaderCreateInfo, entrypoint) == 16, "struct SDL_GPUShaderCreateInfo.entrypoint: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUShaderCreateInfo, format) == 24, "struct SDL_GPUShaderCreateInfo.format: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUShaderCreateInfo, stage) == 28, "struct SDL_GPUShaderCreateInfo.stage: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUShaderCreateInfo, num_samplers) == 32, "struct SDL_GPUShaderCreateInfo.num_samplers: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUShaderCreateInfo, num_storage_textures) == 36, "struct SDL_GPUShaderCreateInfo.num_storage_textures: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUShaderCreateInfo, num_storage_buffers) == 40, "struct SDL_GPUShaderCreateInfo.num_storage_buffers: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUShaderCreateInfo, num_uniform_buffers) == 44, "struct SDL_GPUShaderCreateInfo.num_uniform_buffers: baked offset 44 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUShaderCreateInfo, props) == 48, "struct SDL_GPUShaderCreateInfo.props: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUTextureCreateInfo) == 36, "struct SDL_GPUTextureCreateInfo: baked sizeof 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUTextureCreateInfo) == 4, "struct SDL_GPUTextureCreateInfo: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureCreateInfo, type) == 0, "struct SDL_GPUTextureCreateInfo.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureCreateInfo, format) == 4, "struct SDL_GPUTextureCreateInfo.format: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureCreateInfo, usage) == 8, "struct SDL_GPUTextureCreateInfo.usage: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureCreateInfo, width) == 12, "struct SDL_GPUTextureCreateInfo.width: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureCreateInfo, height) == 16, "struct SDL_GPUTextureCreateInfo.height: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureCreateInfo, layer_count_or_depth) == 20, "struct SDL_GPUTextureCreateInfo.layer_count_or_depth: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureCreateInfo, num_levels) == 24, "struct SDL_GPUTextureCreateInfo.num_levels: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureCreateInfo, sample_count) == 28, "struct SDL_GPUTextureCreateInfo.sample_count: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureCreateInfo, props) == 32, "struct SDL_GPUTextureCreateInfo.props: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUBufferCreateInfo) == 12, "struct SDL_GPUBufferCreateInfo: baked sizeof 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUBufferCreateInfo) == 4, "struct SDL_GPUBufferCreateInfo: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBufferCreateInfo, usage) == 0, "struct SDL_GPUBufferCreateInfo.usage: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBufferCreateInfo, size) == 4, "struct SDL_GPUBufferCreateInfo.size: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBufferCreateInfo, props) == 8, "struct SDL_GPUBufferCreateInfo.props: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUTransferBufferCreateInfo) == 12, "struct SDL_GPUTransferBufferCreateInfo: baked sizeof 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUTransferBufferCreateInfo) == 4, "struct SDL_GPUTransferBufferCreateInfo: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTransferBufferCreateInfo, usage) == 0, "struct SDL_GPUTransferBufferCreateInfo.usage: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTransferBufferCreateInfo, size) == 4, "struct SDL_GPUTransferBufferCreateInfo.size: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTransferBufferCreateInfo, props) == 8, "struct SDL_GPUTransferBufferCreateInfo.props: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPURasterizerState) == 28, "struct SDL_GPURasterizerState: baked sizeof 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPURasterizerState) == 4, "struct SDL_GPURasterizerState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURasterizerState, fill_mode) == 0, "struct SDL_GPURasterizerState.fill_mode: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURasterizerState, cull_mode) == 4, "struct SDL_GPURasterizerState.cull_mode: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURasterizerState, front_face) == 8, "struct SDL_GPURasterizerState.front_face: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURasterizerState, depth_bias_constant_factor) == 12, "struct SDL_GPURasterizerState.depth_bias_constant_factor: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURasterizerState, depth_bias_clamp) == 16, "struct SDL_GPURasterizerState.depth_bias_clamp: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURasterizerState, depth_bias_slope_factor) == 20, "struct SDL_GPURasterizerState.depth_bias_slope_factor: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURasterizerState, enable_depth_bias) == 24, "struct SDL_GPURasterizerState.enable_depth_bias: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURasterizerState, enable_depth_clip) == 25, "struct SDL_GPURasterizerState.enable_depth_clip: baked offset 25 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURasterizerState, padding1) == 26, "struct SDL_GPURasterizerState.padding1: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURasterizerState, padding2) == 27, "struct SDL_GPURasterizerState.padding2: baked offset 27 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUMultisampleState) == 12, "struct SDL_GPUMultisampleState: baked sizeof 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUMultisampleState) == 4, "struct SDL_GPUMultisampleState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUMultisampleState, sample_count) == 0, "struct SDL_GPUMultisampleState.sample_count: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUMultisampleState, sample_mask) == 4, "struct SDL_GPUMultisampleState.sample_mask: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUMultisampleState, enable_mask) == 8, "struct SDL_GPUMultisampleState.enable_mask: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert(offsetof(struct SDL_GPUMultisampleState, enable_alpha_to_coverage) == 9, "struct SDL_GPUMultisampleState.enable_alpha_to_coverage: baked offset 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(offsetof(struct SDL_GPUMultisampleState, padding2) == 10, "struct SDL_GPUMultisampleState.padding2: baked offset 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUMultisampleState, padding3) == 11, "struct SDL_GPUMultisampleState.padding3: baked offset 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUDepthStencilState) == 44, "struct SDL_GPUDepthStencilState: baked sizeof 44 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUDepthStencilState) == 4, "struct SDL_GPUDepthStencilState: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, compare_op) == 0, "struct SDL_GPUDepthStencilState.compare_op: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, back_stencil_state) == 4, "struct SDL_GPUDepthStencilState.back_stencil_state: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, front_stencil_state) == 20, "struct SDL_GPUDepthStencilState.front_stencil_state: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, compare_mask) == 36, "struct SDL_GPUDepthStencilState.compare_mask: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, write_mask) == 37, "struct SDL_GPUDepthStencilState.write_mask: baked offset 37 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, enable_depth_test) == 38, "struct SDL_GPUDepthStencilState.enable_depth_test: baked offset 38 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, enable_depth_write) == 39, "struct SDL_GPUDepthStencilState.enable_depth_write: baked offset 39 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, enable_stencil_test) == 40, "struct SDL_GPUDepthStencilState.enable_stencil_test: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, padding1) == 41, "struct SDL_GPUDepthStencilState.padding1: baked offset 41 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, padding2) == 42, "struct SDL_GPUDepthStencilState.padding2: baked offset 42 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilState, padding3) == 43, "struct SDL_GPUDepthStencilState.padding3: baked offset 43 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUColorTargetDescription) == 36, "struct SDL_GPUColorTargetDescription: baked sizeof 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUColorTargetDescription) == 4, "struct SDL_GPUColorTargetDescription: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetDescription, format) == 0, "struct SDL_GPUColorTargetDescription.format: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetDescription, blend_state) == 4, "struct SDL_GPUColorTargetDescription.blend_state: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUGraphicsPipelineTargetInfo) == 24, "struct SDL_GPUGraphicsPipelineTargetInfo: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUGraphicsPipelineTargetInfo) == 8, "struct SDL_GPUGraphicsPipelineTargetInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineTargetInfo, color_target_descriptions) == 0, "struct SDL_GPUGraphicsPipelineTargetInfo.color_target_descriptions: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineTargetInfo, num_color_targets) == 8, "struct SDL_GPUGraphicsPipelineTargetInfo.num_color_targets: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineTargetInfo, depth_stencil_format) == 12, "struct SDL_GPUGraphicsPipelineTargetInfo.depth_stencil_format: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineTargetInfo, has_depth_stencil_target) == 16, "struct SDL_GPUGraphicsPipelineTargetInfo.has_depth_stencil_target: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineTargetInfo, padding1) == 17, "struct SDL_GPUGraphicsPipelineTargetInfo.padding1: baked offset 17 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineTargetInfo, padding2) == 18, "struct SDL_GPUGraphicsPipelineTargetInfo.padding2: baked offset 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineTargetInfo, padding3) == 19, "struct SDL_GPUGraphicsPipelineTargetInfo.padding3: baked offset 19 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUGraphicsPipelineCreateInfo) == 168, "struct SDL_GPUGraphicsPipelineCreateInfo: baked sizeof 168 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUGraphicsPipelineCreateInfo) == 8, "struct SDL_GPUGraphicsPipelineCreateInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineCreateInfo, vertex_shader) == 0, "struct SDL_GPUGraphicsPipelineCreateInfo.vertex_shader: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineCreateInfo, fragment_shader) == 8, "struct SDL_GPUGraphicsPipelineCreateInfo.fragment_shader: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineCreateInfo, vertex_input_state) == 16, "struct SDL_GPUGraphicsPipelineCreateInfo.vertex_input_state: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineCreateInfo, primitive_type) == 48, "struct SDL_GPUGraphicsPipelineCreateInfo.primitive_type: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineCreateInfo, rasterizer_state) == 52, "struct SDL_GPUGraphicsPipelineCreateInfo.rasterizer_state: baked offset 52 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineCreateInfo, multisample_state) == 80, "struct SDL_GPUGraphicsPipelineCreateInfo.multisample_state: baked offset 80 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineCreateInfo, depth_stencil_state) == 92, "struct SDL_GPUGraphicsPipelineCreateInfo.depth_stencil_state: baked offset 92 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineCreateInfo, target_info) == 136, "struct SDL_GPUGraphicsPipelineCreateInfo.target_info: baked offset 136 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUGraphicsPipelineCreateInfo, props) == 160, "struct SDL_GPUGraphicsPipelineCreateInfo.props: baked offset 160 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUComputePipelineCreateInfo) == 72, "struct SDL_GPUComputePipelineCreateInfo: baked sizeof 72 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUComputePipelineCreateInfo) == 8, "struct SDL_GPUComputePipelineCreateInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, code_size) == 0, "struct SDL_GPUComputePipelineCreateInfo.code_size: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, code) == 8, "struct SDL_GPUComputePipelineCreateInfo.code: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, entrypoint) == 16, "struct SDL_GPUComputePipelineCreateInfo.entrypoint: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, format) == 24, "struct SDL_GPUComputePipelineCreateInfo.format: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, num_samplers) == 28, "struct SDL_GPUComputePipelineCreateInfo.num_samplers: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, num_readonly_storage_textures) == 32, "struct SDL_GPUComputePipelineCreateInfo.num_readonly_storage_textures: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, num_readonly_storage_buffers) == 36, "struct SDL_GPUComputePipelineCreateInfo.num_readonly_storage_buffers: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, num_readwrite_storage_textures) == 40, "struct SDL_GPUComputePipelineCreateInfo.num_readwrite_storage_textures: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, num_readwrite_storage_buffers) == 44, "struct SDL_GPUComputePipelineCreateInfo.num_readwrite_storage_buffers: baked offset 44 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, num_uniform_buffers) == 48, "struct SDL_GPUComputePipelineCreateInfo.num_uniform_buffers: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, threadcount_x) == 52, "struct SDL_GPUComputePipelineCreateInfo.threadcount_x: baked offset 52 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, threadcount_y) == 56, "struct SDL_GPUComputePipelineCreateInfo.threadcount_y: baked offset 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, threadcount_z) == 60, "struct SDL_GPUComputePipelineCreateInfo.threadcount_z: baked offset 60 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUComputePipelineCreateInfo, props) == 64, "struct SDL_GPUComputePipelineCreateInfo.props: baked offset 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUColorTargetInfo) == 64, "struct SDL_GPUColorTargetInfo: baked sizeof 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUColorTargetInfo) == 8, "struct SDL_GPUColorTargetInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, texture) == 0, "struct SDL_GPUColorTargetInfo.texture: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, mip_level) == 8, "struct SDL_GPUColorTargetInfo.mip_level: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, layer_or_depth_plane) == 12, "struct SDL_GPUColorTargetInfo.layer_or_depth_plane: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, clear_color) == 16, "struct SDL_GPUColorTargetInfo.clear_color: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, load_op) == 32, "struct SDL_GPUColorTargetInfo.load_op: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, store_op) == 36, "struct SDL_GPUColorTargetInfo.store_op: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, resolve_texture) == 40, "struct SDL_GPUColorTargetInfo.resolve_texture: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, resolve_mip_level) == 48, "struct SDL_GPUColorTargetInfo.resolve_mip_level: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, resolve_layer) == 52, "struct SDL_GPUColorTargetInfo.resolve_layer: baked offset 52 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, cycle) == 56, "struct SDL_GPUColorTargetInfo.cycle: baked offset 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, cycle_resolve_texture) == 57, "struct SDL_GPUColorTargetInfo.cycle_resolve_texture: baked offset 57 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, padding1) == 58, "struct SDL_GPUColorTargetInfo.padding1: baked offset 58 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUColorTargetInfo, padding2) == 59, "struct SDL_GPUColorTargetInfo.padding2: baked offset 59 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUDepthStencilTargetInfo) == 32, "struct SDL_GPUDepthStencilTargetInfo: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUDepthStencilTargetInfo) == 8, "struct SDL_GPUDepthStencilTargetInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilTargetInfo, texture) == 0, "struct SDL_GPUDepthStencilTargetInfo.texture: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilTargetInfo, clear_depth) == 8, "struct SDL_GPUDepthStencilTargetInfo.clear_depth: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilTargetInfo, load_op) == 12, "struct SDL_GPUDepthStencilTargetInfo.load_op: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilTargetInfo, store_op) == 16, "struct SDL_GPUDepthStencilTargetInfo.store_op: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilTargetInfo, stencil_load_op) == 20, "struct SDL_GPUDepthStencilTargetInfo.stencil_load_op: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilTargetInfo, stencil_store_op) == 24, "struct SDL_GPUDepthStencilTargetInfo.stencil_store_op: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilTargetInfo, cycle) == 28, "struct SDL_GPUDepthStencilTargetInfo.cycle: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilTargetInfo, clear_stencil) == 29, "struct SDL_GPUDepthStencilTargetInfo.clear_stencil: baked offset 29 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert(offsetof(struct SDL_GPUDepthStencilTargetInfo, mip_level) == 30, "struct SDL_GPUDepthStencilTargetInfo.mip_level: baked offset 30 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUDepthStencilTargetInfo, layer) == 31, "struct SDL_GPUDepthStencilTargetInfo.layer: baked offset 31 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(sizeof(struct SDL_GPUBlitInfo) == 96, "struct SDL_GPUBlitInfo: baked sizeof 96 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUBlitInfo) == 8, "struct SDL_GPUBlitInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitInfo, source) == 0, "struct SDL_GPUBlitInfo.source: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitInfo, destination) == 32, "struct SDL_GPUBlitInfo.destination: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitInfo, load_op) == 64, "struct SDL_GPUBlitInfo.load_op: baked offset 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitInfo, clear_color) == 68, "struct SDL_GPUBlitInfo.clear_color: baked offset 68 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitInfo, flip_mode) == 84, "struct SDL_GPUBlitInfo.flip_mode: baked offset 84 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitInfo, filter) == 88, "struct SDL_GPUBlitInfo.filter: baked offset 88 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitInfo, cycle) == 92, "struct SDL_GPUBlitInfo.cycle: baked offset 92 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitInfo, padding1) == 93, "struct SDL_GPUBlitInfo.padding1: baked offset 93 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitInfo, padding2) == 94, "struct SDL_GPUBlitInfo.padding2: baked offset 94 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBlitInfo, padding3) == 95, "struct SDL_GPUBlitInfo.padding3: baked offset 95 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUBufferBinding) == 16, "struct SDL_GPUBufferBinding: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUBufferBinding) == 8, "struct SDL_GPUBufferBinding: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBufferBinding, buffer) == 0, "struct SDL_GPUBufferBinding.buffer: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUBufferBinding, offset) == 8, "struct SDL_GPUBufferBinding.offset: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUTextureSamplerBinding) == 16, "struct SDL_GPUTextureSamplerBinding: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUTextureSamplerBinding) == 8, "struct SDL_GPUTextureSamplerBinding: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureSamplerBinding, texture) == 0, "struct SDL_GPUTextureSamplerBinding.texture: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUTextureSamplerBinding, sampler) == 8, "struct SDL_GPUTextureSamplerBinding.sampler: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUStorageBufferReadWriteBinding) == 16, "struct SDL_GPUStorageBufferReadWriteBinding: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUStorageBufferReadWriteBinding) == 8, "struct SDL_GPUStorageBufferReadWriteBinding: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageBufferReadWriteBinding, buffer) == 0, "struct SDL_GPUStorageBufferReadWriteBinding.buffer: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageBufferReadWriteBinding, cycle) == 8, "struct SDL_GPUStorageBufferReadWriteBinding.cycle: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageBufferReadWriteBinding, padding1) == 9, "struct SDL_GPUStorageBufferReadWriteBinding.padding1: baked offset 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageBufferReadWriteBinding, padding2) == 10, "struct SDL_GPUStorageBufferReadWriteBinding.padding2: baked offset 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageBufferReadWriteBinding, padding3) == 11, "struct SDL_GPUStorageBufferReadWriteBinding.padding3: baked offset 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_GPUStorageTextureReadWriteBinding) == 24, "struct SDL_GPUStorageTextureReadWriteBinding: baked sizeof 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUStorageTextureReadWriteBinding) == 8, "struct SDL_GPUStorageTextureReadWriteBinding: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageTextureReadWriteBinding, texture) == 0, "struct SDL_GPUStorageTextureReadWriteBinding.texture: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageTextureReadWriteBinding, mip_level) == 8, "struct SDL_GPUStorageTextureReadWriteBinding.mip_level: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageTextureReadWriteBinding, layer) == 12, "struct SDL_GPUStorageTextureReadWriteBinding.layer: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageTextureReadWriteBinding, cycle) == 16, "struct SDL_GPUStorageTextureReadWriteBinding.cycle: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageTextureReadWriteBinding, padding1) == 17, "struct SDL_GPUStorageTextureReadWriteBinding.padding1: baked offset 17 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageTextureReadWriteBinding, padding2) == 18, "struct SDL_GPUStorageTextureReadWriteBinding.padding2: baked offset 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUStorageTextureReadWriteBinding, padding3) == 19, "struct SDL_GPUStorageTextureReadWriteBinding.padding3: baked offset 19 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert(sizeof(struct SDL_GPUVulkanOptions) == 56, "struct SDL_GPUVulkanOptions: baked sizeof 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPUVulkanOptions) == 8, "struct SDL_GPUVulkanOptions: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVulkanOptions, vulkan_api_version) == 0, "struct SDL_GPUVulkanOptions.vulkan_api_version: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVulkanOptions, feature_list) == 8, "struct SDL_GPUVulkanOptions.feature_list: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVulkanOptions, vulkan_10_physical_device_features) == 16, "struct SDL_GPUVulkanOptions.vulkan_10_physical_device_features: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVulkanOptions, device_extension_count) == 24, "struct SDL_GPUVulkanOptions.device_extension_count: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVulkanOptions, device_extension_names) == 32, "struct SDL_GPUVulkanOptions.device_extension_names: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVulkanOptions, instance_extension_count) == 40, "struct SDL_GPUVulkanOptions.instance_extension_count: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPUVulkanOptions, instance_extension_names) == 48, "struct SDL_GPUVulkanOptions.instance_extension_names: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+
+/* ---- SDL_haptic.h ---- */
+_Static_assert(sizeof(struct SDL_HapticDirection) == 16, "struct SDL_HapticDirection: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_HapticDirection) == 4, "struct SDL_HapticDirection: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticDirection, type) == 0, "struct SDL_HapticDirection.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticDirection, dir) == 4, "struct SDL_HapticDirection.dir: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_HapticConstant) == 40, "struct SDL_HapticConstant: baked sizeof 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_HapticConstant) == 4, "struct SDL_HapticConstant: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, type) == 0, "struct SDL_HapticConstant.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, direction) == 4, "struct SDL_HapticConstant.direction: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, length) == 20, "struct SDL_HapticConstant.length: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, delay) == 24, "struct SDL_HapticConstant.delay: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, button) == 26, "struct SDL_HapticConstant.button: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, interval) == 28, "struct SDL_HapticConstant.interval: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, level) == 30, "struct SDL_HapticConstant.level: baked offset 30 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, attack_length) == 32, "struct SDL_HapticConstant.attack_length: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, attack_level) == 34, "struct SDL_HapticConstant.attack_level: baked offset 34 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, fade_length) == 36, "struct SDL_HapticConstant.fade_length: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticConstant, fade_level) == 38, "struct SDL_HapticConstant.fade_level: baked offset 38 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_HapticPeriodic) == 48, "struct SDL_HapticPeriodic: baked sizeof 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_HapticPeriodic) == 4, "struct SDL_HapticPeriodic: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, type) == 0, "struct SDL_HapticPeriodic.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, direction) == 4, "struct SDL_HapticPeriodic.direction: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, length) == 20, "struct SDL_HapticPeriodic.length: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, delay) == 24, "struct SDL_HapticPeriodic.delay: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, button) == 26, "struct SDL_HapticPeriodic.button: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, interval) == 28, "struct SDL_HapticPeriodic.interval: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, period) == 30, "struct SDL_HapticPeriodic.period: baked offset 30 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, magnitude) == 32, "struct SDL_HapticPeriodic.magnitude: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, offset) == 34, "struct SDL_HapticPeriodic.offset: baked offset 34 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, phase) == 36, "struct SDL_HapticPeriodic.phase: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, attack_length) == 38, "struct SDL_HapticPeriodic.attack_length: baked offset 38 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, attack_level) == 40, "struct SDL_HapticPeriodic.attack_level: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, fade_length) == 42, "struct SDL_HapticPeriodic.fade_length: baked offset 42 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticPeriodic, fade_level) == 44, "struct SDL_HapticPeriodic.fade_level: baked offset 44 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_HapticCondition) == 68, "struct SDL_HapticCondition: baked sizeof 68 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_HapticCondition) == 4, "struct SDL_HapticCondition: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, type) == 0, "struct SDL_HapticCondition.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, direction) == 4, "struct SDL_HapticCondition.direction: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, length) == 20, "struct SDL_HapticCondition.length: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, delay) == 24, "struct SDL_HapticCondition.delay: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, button) == 26, "struct SDL_HapticCondition.button: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, interval) == 28, "struct SDL_HapticCondition.interval: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, right_sat) == 30, "struct SDL_HapticCondition.right_sat: baked offset 30 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, left_sat) == 36, "struct SDL_HapticCondition.left_sat: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, right_coeff) == 42, "struct SDL_HapticCondition.right_coeff: baked offset 42 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, left_coeff) == 48, "struct SDL_HapticCondition.left_coeff: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, deadband) == 54, "struct SDL_HapticCondition.deadband: baked offset 54 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCondition, center) == 60, "struct SDL_HapticCondition.center: baked offset 60 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_HapticRamp) == 44, "struct SDL_HapticRamp: baked sizeof 44 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_HapticRamp) == 4, "struct SDL_HapticRamp: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, type) == 0, "struct SDL_HapticRamp.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, direction) == 4, "struct SDL_HapticRamp.direction: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, length) == 20, "struct SDL_HapticRamp.length: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, delay) == 24, "struct SDL_HapticRamp.delay: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, button) == 26, "struct SDL_HapticRamp.button: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, interval) == 28, "struct SDL_HapticRamp.interval: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, start) == 30, "struct SDL_HapticRamp.start: baked offset 30 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, end) == 32, "struct SDL_HapticRamp.end: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, attack_length) == 34, "struct SDL_HapticRamp.attack_length: baked offset 34 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, attack_level) == 36, "struct SDL_HapticRamp.attack_level: baked offset 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, fade_length) == 38, "struct SDL_HapticRamp.fade_length: baked offset 38 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticRamp, fade_level) == 40, "struct SDL_HapticRamp.fade_level: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_HapticLeftRight) == 12, "struct SDL_HapticLeftRight: baked sizeof 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_HapticLeftRight) == 4, "struct SDL_HapticLeftRight: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticLeftRight, type) == 0, "struct SDL_HapticLeftRight.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticLeftRight, length) == 4, "struct SDL_HapticLeftRight.length: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticLeftRight, large_magnitude) == 8, "struct SDL_HapticLeftRight.large_magnitude: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticLeftRight, small_magnitude) == 10, "struct SDL_HapticLeftRight.small_magnitude: baked offset 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_HapticCustom) == 56, "struct SDL_HapticCustom: baked sizeof 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_HapticCustom) == 8, "struct SDL_HapticCustom: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, type) == 0, "struct SDL_HapticCustom.type: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, direction) == 4, "struct SDL_HapticCustom.direction: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, length) == 20, "struct SDL_HapticCustom.length: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, delay) == 24, "struct SDL_HapticCustom.delay: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, button) == 26, "struct SDL_HapticCustom.button: baked offset 26 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, interval) == 28, "struct SDL_HapticCustom.interval: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, channels) == 30, "struct SDL_HapticCustom.channels: baked offset 30 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, period) == 32, "struct SDL_HapticCustom.period: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, samples) == 34, "struct SDL_HapticCustom.samples: baked offset 34 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, data) == 40, "struct SDL_HapticCustom.data: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, attack_length) == 48, "struct SDL_HapticCustom.attack_length: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, attack_level) == 50, "struct SDL_HapticCustom.attack_level: baked offset 50 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, fade_length) == 52, "struct SDL_HapticCustom.fade_length: baked offset 52 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_HapticCustom, fade_level) == 54, "struct SDL_HapticCustom.fade_level: baked offset 54 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(union SDL_HapticEffect) == 72, "union SDL_HapticEffect: baked sizeof 72 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(union SDL_HapticEffect) == 8, "union SDL_HapticEffect: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_hidapi.h ---- */
+_Static_assert(sizeof(enum SDL_hid_bus_type) == 4, "enum SDL_hid_bus_type: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_hid_bus_type) == 4, "enum SDL_hid_bus_type: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HID_API_BUS_UNKNOWN) == (0), "SDL_HID_API_BUS_UNKNOWN: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HID_API_BUS_USB) == (1), "SDL_HID_API_BUS_USB: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HID_API_BUS_BLUETOOTH) == (2), "SDL_HID_API_BUS_BLUETOOTH: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HID_API_BUS_I2C) == (3), "SDL_HID_API_BUS_I2C: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HID_API_BUS_SPI) == (4), "SDL_HID_API_BUS_SPI: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_hid_device_info) == 80, "struct SDL_hid_device_info: baked sizeof 80 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_hid_device_info) == 8, "struct SDL_hid_device_info: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, path) == 0, "struct SDL_hid_device_info.path: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, vendor_id) == 8, "struct SDL_hid_device_info.vendor_id: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, product_id) == 10, "struct SDL_hid_device_info.product_id: baked offset 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, serial_number) == 16, "struct SDL_hid_device_info.serial_number: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, release_number) == 24, "struct SDL_hid_device_info.release_number: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, manufacturer_string) == 32, "struct SDL_hid_device_info.manufacturer_string: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, product_string) == 40, "struct SDL_hid_device_info.product_string: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, usage_page) == 48, "struct SDL_hid_device_info.usage_page: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, usage) == 50, "struct SDL_hid_device_info.usage: baked offset 50 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, interface_number) == 52, "struct SDL_hid_device_info.interface_number: baked offset 52 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, interface_class) == 56, "struct SDL_hid_device_info.interface_class: baked offset 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, interface_subclass) == 60, "struct SDL_hid_device_info.interface_subclass: baked offset 60 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, interface_protocol) == 64, "struct SDL_hid_device_info.interface_protocol: baked offset 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, bus_type) == 68, "struct SDL_hid_device_info.bus_type: baked offset 68 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_hid_device_info, next) == 72, "struct SDL_hid_device_info.next: baked offset 72 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_hints.h ---- */
+_Static_assert(sizeof(enum SDL_HintPriority) == 4, "enum SDL_HintPriority: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_HintPriority) == 4, "enum SDL_HintPriority: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HINT_DEFAULT) == (0), "SDL_HINT_DEFAULT: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HINT_NORMAL) == (1), "SDL_HINT_NORMAL: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HINT_OVERRIDE) == (2), "SDL_HINT_OVERRIDE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_init.h ---- */
+_Static_assert(sizeof(enum SDL_AppResult) == 4, "enum SDL_AppResult: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_AppResult) == 4, "enum SDL_AppResult: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_APP_CONTINUE) == (0), "SDL_APP_CONTINUE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_APP_SUCCESS) == (1), "SDL_APP_SUCCESS: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_APP_FAILURE) == (2), "SDL_APP_FAILURE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_locale.h ---- */
+_Static_assert(sizeof(struct SDL_Locale) == 16, "struct SDL_Locale: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_Locale) == 8, "struct SDL_Locale: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Locale, language) == 0, "struct SDL_Locale.language: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Locale, country) == 8, "struct SDL_Locale.country: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_log.h ---- */
+_Static_assert(sizeof(enum SDL_LogCategory) == 4, "enum SDL_LogCategory: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_LogCategory) == 4, "enum SDL_LogCategory: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_APPLICATION) == (0), "SDL_LOG_CATEGORY_APPLICATION: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_ERROR) == (1), "SDL_LOG_CATEGORY_ERROR: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_ASSERT) == (2), "SDL_LOG_CATEGORY_ASSERT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_SYSTEM) == (3), "SDL_LOG_CATEGORY_SYSTEM: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_AUDIO) == (4), "SDL_LOG_CATEGORY_AUDIO: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_VIDEO) == (5), "SDL_LOG_CATEGORY_VIDEO: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_RENDER) == (6), "SDL_LOG_CATEGORY_RENDER: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_INPUT) == (7), "SDL_LOG_CATEGORY_INPUT: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_TEST) == (8), "SDL_LOG_CATEGORY_TEST: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_GPU) == (9), "SDL_LOG_CATEGORY_GPU: baked value 9 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_RESERVED2) == (10), "SDL_LOG_CATEGORY_RESERVED2: baked value 10 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_RESERVED3) == (11), "SDL_LOG_CATEGORY_RESERVED3: baked value 11 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_RESERVED4) == (12), "SDL_LOG_CATEGORY_RESERVED4: baked value 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_RESERVED5) == (13), "SDL_LOG_CATEGORY_RESERVED5: baked value 13 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_RESERVED6) == (14), "SDL_LOG_CATEGORY_RESERVED6: baked value 14 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_RESERVED7) == (15), "SDL_LOG_CATEGORY_RESERVED7: baked value 15 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_RESERVED8) == (16), "SDL_LOG_CATEGORY_RESERVED8: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_RESERVED9) == (17), "SDL_LOG_CATEGORY_RESERVED9: baked value 17 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_RESERVED10) == (18), "SDL_LOG_CATEGORY_RESERVED10: baked value 18 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_CATEGORY_CUSTOM) == (19), "SDL_LOG_CATEGORY_CUSTOM: baked value 19 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_LogPriority) == 4, "enum SDL_LogPriority: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_LogPriority) == 4, "enum SDL_LogPriority: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_PRIORITY_INVALID) == (0), "SDL_LOG_PRIORITY_INVALID: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_PRIORITY_TRACE) == (1), "SDL_LOG_PRIORITY_TRACE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_PRIORITY_VERBOSE) == (2), "SDL_LOG_PRIORITY_VERBOSE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_PRIORITY_DEBUG) == (3), "SDL_LOG_PRIORITY_DEBUG: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_PRIORITY_INFO) == (4), "SDL_LOG_PRIORITY_INFO: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_PRIORITY_WARN) == (5), "SDL_LOG_PRIORITY_WARN: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_PRIORITY_ERROR) == (6), "SDL_LOG_PRIORITY_ERROR: baked value 6 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_PRIORITY_CRITICAL) == (7), "SDL_LOG_PRIORITY_CRITICAL: baked value 7 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOG_PRIORITY_COUNT) == (8), "SDL_LOG_PRIORITY_COUNT: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_messagebox.h ---- */
+_Static_assert(sizeof(struct SDL_MessageBoxButtonData) == 16, "struct SDL_MessageBoxButtonData: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_MessageBoxButtonData) == 8, "struct SDL_MessageBoxButtonData: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxButtonData, flags) == 0, "struct SDL_MessageBoxButtonData.flags: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxButtonData, buttonID) == 4, "struct SDL_MessageBoxButtonData.buttonID: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxButtonData, text) == 8, "struct SDL_MessageBoxButtonData.text: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_MessageBoxColor) == 3, "struct SDL_MessageBoxColor: baked sizeof 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_MessageBoxColor) == 1, "struct SDL_MessageBoxColor: baked alignment 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxColor, r) == 0, "struct SDL_MessageBoxColor.r: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxColor, g) == 1, "struct SDL_MessageBoxColor.g: baked offset 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxColor, b) == 2, "struct SDL_MessageBoxColor.b: baked offset 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_MessageBoxColorType) == 4, "enum SDL_MessageBoxColorType: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_MessageBoxColorType) == 4, "enum SDL_MessageBoxColorType: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_COLOR_BACKGROUND) == (0), "SDL_MESSAGEBOX_COLOR_BACKGROUND: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_COLOR_TEXT) == (1), "SDL_MESSAGEBOX_COLOR_TEXT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_COLOR_BUTTON_BORDER) == (2), "SDL_MESSAGEBOX_COLOR_BUTTON_BORDER: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND) == (3), "SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED) == (4), "SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_COLOR_COUNT) == (5), "SDL_MESSAGEBOX_COLOR_COUNT: baked value 5 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_MessageBoxColorScheme) == 15, "struct SDL_MessageBoxColorScheme: baked sizeof 15 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_MessageBoxColorScheme) == 1, "struct SDL_MessageBoxColorScheme: baked alignment 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxColorScheme, colors) == 0, "struct SDL_MessageBoxColorScheme.colors: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_MessageBoxData) == 56, "struct SDL_MessageBoxData: baked sizeof 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_MessageBoxData) == 8, "struct SDL_MessageBoxData: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxData, flags) == 0, "struct SDL_MessageBoxData.flags: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxData, window) == 8, "struct SDL_MessageBoxData.window: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxData, title) == 16, "struct SDL_MessageBoxData.title: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxData, message) == 24, "struct SDL_MessageBoxData.message: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxData, numbuttons) == 32, "struct SDL_MessageBoxData.numbuttons: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxData, buttons) == 40, "struct SDL_MessageBoxData.buttons: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_MessageBoxData, colorScheme) == 48, "struct SDL_MessageBoxData.colorScheme: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_process.h ---- */
+_Static_assert(sizeof(enum SDL_ProcessIO) == 4, "enum SDL_ProcessIO: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_ProcessIO) == 4, "enum SDL_ProcessIO: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROCESS_STDIO_INHERITED) == (0), "SDL_PROCESS_STDIO_INHERITED: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROCESS_STDIO_NULL) == (1), "SDL_PROCESS_STDIO_NULL: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROCESS_STDIO_APP) == (2), "SDL_PROCESS_STDIO_APP: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PROCESS_STDIO_REDIRECT) == (3), "SDL_PROCESS_STDIO_REDIRECT: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_render.h ---- */
+_Static_assert(sizeof(struct SDL_Vertex) == 32, "struct SDL_Vertex: baked sizeof 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_Vertex) == 4, "struct SDL_Vertex: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Vertex, position) == 0, "struct SDL_Vertex.position: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Vertex, color) == 8, "struct SDL_Vertex.color: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Vertex, tex_coord) == 24, "struct SDL_Vertex.tex_coord: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_TextureAccess) == 4, "enum SDL_TextureAccess: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_TextureAccess) == 4, "enum SDL_TextureAccess: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTUREACCESS_STATIC) == (0), "SDL_TEXTUREACCESS_STATIC: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTUREACCESS_STREAMING) == (1), "SDL_TEXTUREACCESS_STREAMING: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTUREACCESS_TARGET) == (2), "SDL_TEXTUREACCESS_TARGET: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert(sizeof(enum SDL_TextureAddressMode) == 4, "enum SDL_TextureAddressMode: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_TextureAddressMode) == 4, "enum SDL_TextureAddressMode: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTURE_ADDRESS_INVALID) == (-1), "SDL_TEXTURE_ADDRESS_INVALID: baked value -1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTURE_ADDRESS_AUTO) == (0), "SDL_TEXTURE_ADDRESS_AUTO: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTURE_ADDRESS_CLAMP) == (1), "SDL_TEXTURE_ADDRESS_CLAMP: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TEXTURE_ADDRESS_WRAP) == (2), "SDL_TEXTURE_ADDRESS_WRAP: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert(sizeof(enum SDL_RendererLogicalPresentation) == 4, "enum SDL_RendererLogicalPresentation: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_RendererLogicalPresentation) == 4, "enum SDL_RendererLogicalPresentation: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOGICAL_PRESENTATION_DISABLED) == (0), "SDL_LOGICAL_PRESENTATION_DISABLED: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOGICAL_PRESENTATION_STRETCH) == (1), "SDL_LOGICAL_PRESENTATION_STRETCH: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOGICAL_PRESENTATION_LETTERBOX) == (2), "SDL_LOGICAL_PRESENTATION_LETTERBOX: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOGICAL_PRESENTATION_OVERSCAN) == (3), "SDL_LOGICAL_PRESENTATION_OVERSCAN: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_LOGICAL_PRESENTATION_INTEGER_SCALE) == (4), "SDL_LOGICAL_PRESENTATION_INTEGER_SCALE: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(struct SDL_Texture) == 16, "struct SDL_Texture: baked sizeof 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_Texture) == 4, "struct SDL_Texture: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Texture, format) == 0, "struct SDL_Texture.format: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Texture, w) == 4, "struct SDL_Texture.w: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Texture, h) == 8, "struct SDL_Texture.h: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_Texture, refcount) == 12, "struct SDL_Texture.refcount: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert(sizeof(struct SDL_GPURenderStateCreateInfo) == 64, "struct SDL_GPURenderStateCreateInfo: baked sizeof 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_GPURenderStateCreateInfo) == 8, "struct SDL_GPURenderStateCreateInfo: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURenderStateCreateInfo, fragment_shader) == 0, "struct SDL_GPURenderStateCreateInfo.fragment_shader: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURenderStateCreateInfo, num_sampler_bindings) == 8, "struct SDL_GPURenderStateCreateInfo.num_sampler_bindings: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURenderStateCreateInfo, sampler_bindings) == 16, "struct SDL_GPURenderStateCreateInfo.sampler_bindings: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURenderStateCreateInfo, num_storage_textures) == 24, "struct SDL_GPURenderStateCreateInfo.num_storage_textures: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURenderStateCreateInfo, storage_textures) == 32, "struct SDL_GPURenderStateCreateInfo.storage_textures: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURenderStateCreateInfo, num_storage_buffers) == 40, "struct SDL_GPURenderStateCreateInfo.num_storage_buffers: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURenderStateCreateInfo, storage_buffers) == 48, "struct SDL_GPURenderStateCreateInfo.storage_buffers: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_GPURenderStateCreateInfo, props) == 56, "struct SDL_GPURenderStateCreateInfo.props: baked offset 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+
+/* ---- SDL_storage.h ---- */
+_Static_assert(sizeof(struct SDL_StorageInterface) == 96, "struct SDL_StorageInterface: baked sizeof 96 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_StorageInterface) == 8, "struct SDL_StorageInterface: baked alignment 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, version) == 0, "struct SDL_StorageInterface.version: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, close) == 8, "struct SDL_StorageInterface.close: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, ready) == 16, "struct SDL_StorageInterface.ready: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, enumerate) == 24, "struct SDL_StorageInterface.enumerate: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, info) == 32, "struct SDL_StorageInterface.info: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, read_file) == 40, "struct SDL_StorageInterface.read_file: baked offset 40 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, write_file) == 48, "struct SDL_StorageInterface.write_file: baked offset 48 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, mkdir) == 56, "struct SDL_StorageInterface.mkdir: baked offset 56 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, remove) == 64, "struct SDL_StorageInterface.remove: baked offset 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, rename) == 72, "struct SDL_StorageInterface.rename: baked offset 72 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, copy) == 80, "struct SDL_StorageInterface.copy: baked offset 80 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_StorageInterface, space_remaining) == 88, "struct SDL_StorageInterface.space_remaining: baked offset 88 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_system.h ---- */
+_Static_assert(sizeof(enum SDL_Sandbox) == 4, "enum SDL_Sandbox: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_Sandbox) == 4, "enum SDL_Sandbox: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SANDBOX_NONE) == (0), "SDL_SANDBOX_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SANDBOX_UNKNOWN_CONTAINER) == (1), "SDL_SANDBOX_UNKNOWN_CONTAINER: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SANDBOX_FLATPAK) == (2), "SDL_SANDBOX_FLATPAK: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SANDBOX_SNAP) == (3), "SDL_SANDBOX_SNAP: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SANDBOX_MACOS) == (4), "SDL_SANDBOX_MACOS: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_time.h ---- */
+_Static_assert(sizeof(struct SDL_DateTime) == 36, "struct SDL_DateTime: baked sizeof 36 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(struct SDL_DateTime) == 4, "struct SDL_DateTime: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DateTime, year) == 0, "struct SDL_DateTime.year: baked offset 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DateTime, month) == 4, "struct SDL_DateTime.month: baked offset 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DateTime, day) == 8, "struct SDL_DateTime.day: baked offset 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DateTime, hour) == 12, "struct SDL_DateTime.hour: baked offset 12 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DateTime, minute) == 16, "struct SDL_DateTime.minute: baked offset 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DateTime, second) == 20, "struct SDL_DateTime.second: baked offset 20 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DateTime, nanosecond) == 24, "struct SDL_DateTime.nanosecond: baked offset 24 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DateTime, day_of_week) == 28, "struct SDL_DateTime.day_of_week: baked offset 28 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(offsetof(struct SDL_DateTime, utc_offset) == 32, "struct SDL_DateTime.utc_offset: baked offset 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_DateFormat) == 4, "enum SDL_DateFormat: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_DateFormat) == 4, "enum SDL_DateFormat: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_DATE_FORMAT_YYYYMMDD) == (0), "SDL_DATE_FORMAT_YYYYMMDD: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_DATE_FORMAT_DDMMYYYY) == (1), "SDL_DATE_FORMAT_DDMMYYYY: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_DATE_FORMAT_MMDDYYYY) == (2), "SDL_DATE_FORMAT_MMDDYYYY: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(sizeof(enum SDL_TimeFormat) == 4, "enum SDL_TimeFormat: baked sizeof 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert(_Alignof(enum SDL_TimeFormat) == 4, "enum SDL_TimeFormat: baked alignment 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TIME_FORMAT_24HR) == (0), "SDL_TIME_FORMAT_24HR: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TIME_FORMAT_12HR) == (1), "SDL_TIME_FORMAT_12HR: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_blendmode.h (typed constants) ---- */
+_Static_assert((SDL_BLENDMODE_NONE) == (0ull), "SDL_BLENDMODE_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDMODE_BLEND) == (1ull), "SDL_BLENDMODE_BLEND: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDMODE_BLEND_PREMULTIPLIED) == (16ull), "SDL_BLENDMODE_BLEND_PREMULTIPLIED: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDMODE_ADD) == (2ull), "SDL_BLENDMODE_ADD: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDMODE_ADD_PREMULTIPLIED) == (32ull), "SDL_BLENDMODE_ADD_PREMULTIPLIED: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDMODE_MOD) == (4ull), "SDL_BLENDMODE_MOD: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDMODE_MUL) == (8ull), "SDL_BLENDMODE_MUL: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BLENDMODE_INVALID) == (2147483647ull), "SDL_BLENDMODE_INVALID: baked value 2147483647 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_video.h (typed constants) ---- */
+_Static_assert((SDL_GL_CONTEXT_DEBUG_FLAG) == (1ull), "SDL_GL_CONTEXT_DEBUG_FLAG: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG) == (2ull), "SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG) == (4ull), "SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_RESET_ISOLATION_FLAG) == (8ull), "SDL_GL_CONTEXT_RESET_ISOLATION_FLAG: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE) == (0ull), "SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH) == (1ull), "SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_RESET_NO_NOTIFICATION) == (0ull), "SDL_GL_CONTEXT_RESET_NO_NOTIFICATION: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_RESET_LOSE_CONTEXT) == (1ull), "SDL_GL_CONTEXT_RESET_LOSE_CONTEXT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_PROFILE_CORE) == (1ull), "SDL_GL_CONTEXT_PROFILE_CORE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_PROFILE_COMPATIBILITY) == (2ull), "SDL_GL_CONTEXT_PROFILE_COMPATIBILITY: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GL_CONTEXT_PROFILE_ES) == (4ull), "SDL_GL_CONTEXT_PROFILE_ES: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_gpu.h (typed constants) ---- */
+_Static_assert((SDL_GPU_BUFFERUSAGE_VERTEX) == (1ull), "SDL_GPU_BUFFERUSAGE_VERTEX: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BUFFERUSAGE_INDEX) == (2ull), "SDL_GPU_BUFFERUSAGE_INDEX: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BUFFERUSAGE_INDIRECT) == (4ull), "SDL_GPU_BUFFERUSAGE_INDIRECT: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ) == (8ull), "SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ) == (16ull), "SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE) == (32ull), "SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COLORCOMPONENT_R) == (1ull), "SDL_GPU_COLORCOMPONENT_R: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COLORCOMPONENT_G) == (2ull), "SDL_GPU_COLORCOMPONENT_G: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COLORCOMPONENT_B) == (4ull), "SDL_GPU_COLORCOMPONENT_B: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_COLORCOMPONENT_A) == (8ull), "SDL_GPU_COLORCOMPONENT_A: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SHADERFORMAT_INVALID) == (0ull), "SDL_GPU_SHADERFORMAT_INVALID: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SHADERFORMAT_PRIVATE) == (1ull), "SDL_GPU_SHADERFORMAT_PRIVATE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SHADERFORMAT_SPIRV) == (2ull), "SDL_GPU_SHADERFORMAT_SPIRV: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SHADERFORMAT_DXBC) == (4ull), "SDL_GPU_SHADERFORMAT_DXBC: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SHADERFORMAT_DXIL) == (8ull), "SDL_GPU_SHADERFORMAT_DXIL: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SHADERFORMAT_MSL) == (16ull), "SDL_GPU_SHADERFORMAT_MSL: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_SHADERFORMAT_METALLIB) == (32ull), "SDL_GPU_SHADERFORMAT_METALLIB: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREUSAGE_SAMPLER) == (1ull), "SDL_GPU_TEXTUREUSAGE_SAMPLER: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREUSAGE_COLOR_TARGET) == (2ull), "SDL_GPU_TEXTUREUSAGE_COLOR_TARGET: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET) == (4ull), "SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ) == (8ull), "SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ) == (16ull), "SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE) == (32ull), "SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE) == (64ull), "SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE: baked value 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_filesystem.h (typed constants) ---- */
+_Static_assert((SDL_GLOB_CASEINSENSITIVE) == (1ull), "SDL_GLOB_CASEINSENSITIVE: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_haptic.h (typed constants) ---- */
+_Static_assert((SDL_HAPTIC_POLAR) == (0ull), "SDL_HAPTIC_POLAR: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_CARTESIAN) == (1ull), "SDL_HAPTIC_CARTESIAN: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_SPHERICAL) == (2ull), "SDL_HAPTIC_SPHERICAL: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_STEERING_AXIS) == (3ull), "SDL_HAPTIC_STEERING_AXIS: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_CONSTANT) == (1ull), "SDL_HAPTIC_CONSTANT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_SINE) == (2ull), "SDL_HAPTIC_SINE: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_SQUARE) == (4ull), "SDL_HAPTIC_SQUARE: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_TRIANGLE) == (8ull), "SDL_HAPTIC_TRIANGLE: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_SAWTOOTHUP) == (16ull), "SDL_HAPTIC_SAWTOOTHUP: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_SAWTOOTHDOWN) == (32ull), "SDL_HAPTIC_SAWTOOTHDOWN: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_RAMP) == (64ull), "SDL_HAPTIC_RAMP: baked value 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_SPRING) == (128ull), "SDL_HAPTIC_SPRING: baked value 128 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_DAMPER) == (256ull), "SDL_HAPTIC_DAMPER: baked value 256 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_INERTIA) == (512ull), "SDL_HAPTIC_INERTIA: baked value 512 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_FRICTION) == (1024ull), "SDL_HAPTIC_FRICTION: baked value 1024 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_LEFTRIGHT) == (2048ull), "SDL_HAPTIC_LEFTRIGHT: baked value 2048 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_RESERVED1) == (4096ull), "SDL_HAPTIC_RESERVED1: baked value 4096 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_RESERVED2) == (8192ull), "SDL_HAPTIC_RESERVED2: baked value 8192 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_RESERVED3) == (16384ull), "SDL_HAPTIC_RESERVED3: baked value 16384 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_HAPTIC_CUSTOM) == (32768ull), "SDL_HAPTIC_CUSTOM: baked value 32768 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_init.h (typed constants) ---- */
+_Static_assert((SDL_INIT_AUDIO) == (16ull), "SDL_INIT_AUDIO: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_VIDEO) == (32ull), "SDL_INIT_VIDEO: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_JOYSTICK) == (512ull), "SDL_INIT_JOYSTICK: baked value 512 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_HAPTIC) == (4096ull), "SDL_INIT_HAPTIC: baked value 4096 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_GAMEPAD) == (8192ull), "SDL_INIT_GAMEPAD: baked value 8192 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_EVENTS) == (16384ull), "SDL_INIT_EVENTS: baked value 16384 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_SENSOR) == (32768ull), "SDL_INIT_SENSOR: baked value 32768 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_INIT_CAMERA) == (65536ull), "SDL_INIT_CAMERA: baked value 65536 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_keycode.h (typed constants) ---- */
+_Static_assert((SDL_KMOD_NONE) == (0ull), "SDL_KMOD_NONE: baked value 0 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_LSHIFT) == (1ull), "SDL_KMOD_LSHIFT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_RSHIFT) == (2ull), "SDL_KMOD_RSHIFT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_LEVEL5) == (4ull), "SDL_KMOD_LEVEL5: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_LCTRL) == (64ull), "SDL_KMOD_LCTRL: baked value 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_RCTRL) == (128ull), "SDL_KMOD_RCTRL: baked value 128 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_LALT) == (256ull), "SDL_KMOD_LALT: baked value 256 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_RALT) == (512ull), "SDL_KMOD_RALT: baked value 512 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_LGUI) == (1024ull), "SDL_KMOD_LGUI: baked value 1024 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_RGUI) == (2048ull), "SDL_KMOD_RGUI: baked value 2048 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_NUM) == (4096ull), "SDL_KMOD_NUM: baked value 4096 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_CAPS) == (8192ull), "SDL_KMOD_CAPS: baked value 8192 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_MODE) == (16384ull), "SDL_KMOD_MODE: baked value 16384 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_SCROLL) == (32768ull), "SDL_KMOD_SCROLL: baked value 32768 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_CTRL) == (192ull), "SDL_KMOD_CTRL: baked value 192 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_SHIFT) == (3ull), "SDL_KMOD_SHIFT: baked value 3 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_ALT) == (768ull), "SDL_KMOD_ALT: baked value 768 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_KMOD_GUI) == (3072ull), "SDL_KMOD_GUI: baked value 3072 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_messagebox.h (typed constants) ---- */
+_Static_assert((SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT) == (1ull), "SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT) == (2ull), "SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_ERROR) == (16ull), "SDL_MESSAGEBOX_ERROR: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_WARNING) == (32ull), "SDL_MESSAGEBOX_WARNING: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_INFORMATION) == (64ull), "SDL_MESSAGEBOX_INFORMATION: baked value 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT) == (128ull), "SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT: baked value 128 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT) == (256ull), "SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT: baked value 256 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_mouse.h (typed constants) ---- */
+_Static_assert((SDL_BUTTON_LMASK) == (1ull), "SDL_BUTTON_LMASK: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BUTTON_MMASK) == (2ull), "SDL_BUTTON_MMASK: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BUTTON_RMASK) == (4ull), "SDL_BUTTON_RMASK: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BUTTON_X1MASK) == (8ull), "SDL_BUTTON_X1MASK: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_BUTTON_X2MASK) == (16ull), "SDL_BUTTON_X2MASK: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_pen.h (typed constants) ---- */
+_Static_assert((SDL_PEN_INPUT_DOWN) == (1ull), "SDL_PEN_INPUT_DOWN: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_INPUT_BUTTON_1) == (2ull), "SDL_PEN_INPUT_BUTTON_1: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_INPUT_BUTTON_2) == (4ull), "SDL_PEN_INPUT_BUTTON_2: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_INPUT_BUTTON_3) == (8ull), "SDL_PEN_INPUT_BUTTON_3: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_INPUT_BUTTON_4) == (16ull), "SDL_PEN_INPUT_BUTTON_4: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_INPUT_BUTTON_5) == (32ull), "SDL_PEN_INPUT_BUTTON_5: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_PEN_INPUT_ERASER_TIP) == (1073741824ull), "SDL_PEN_INPUT_ERASER_TIP: baked value 1073741824 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert((SDL_PEN_INPUT_IN_PROXIMITY) == (2147483648ull), "SDL_PEN_INPUT_IN_PROXIMITY: baked value 2147483648 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+
+/* ---- SDL_surface.h (typed constants) ---- */
+_Static_assert((SDL_SURFACE_PREALLOCATED) == (1ull), "SDL_SURFACE_PREALLOCATED: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SURFACE_LOCK_NEEDED) == (2ull), "SDL_SURFACE_LOCK_NEEDED: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SURFACE_LOCKED) == (4ull), "SDL_SURFACE_LOCKED: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_SURFACE_SIMD_ALIGNED) == (8ull), "SDL_SURFACE_SIMD_ALIGNED: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_tray.h (typed constants) ---- */
+_Static_assert((SDL_TRAYENTRY_BUTTON) == (1ull), "SDL_TRAYENTRY_BUTTON: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRAYENTRY_CHECKBOX) == (2ull), "SDL_TRAYENTRY_CHECKBOX: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRAYENTRY_SUBMENU) == (4ull), "SDL_TRAYENTRY_SUBMENU: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRAYENTRY_DISABLED) == (2147483648ull), "SDL_TRAYENTRY_DISABLED: baked value 2147483648 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_TRAYENTRY_CHECKED) == (1073741824ull), "SDL_TRAYENTRY_CHECKED: baked value 1073741824 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+
+/* ---- SDL_video.h (typed constants) ---- */
+_Static_assert((SDL_WINDOW_FULLSCREEN) == (1ull), "SDL_WINDOW_FULLSCREEN: baked value 1 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_OPENGL) == (2ull), "SDL_WINDOW_OPENGL: baked value 2 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_OCCLUDED) == (4ull), "SDL_WINDOW_OCCLUDED: baked value 4 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_HIDDEN) == (8ull), "SDL_WINDOW_HIDDEN: baked value 8 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_BORDERLESS) == (16ull), "SDL_WINDOW_BORDERLESS: baked value 16 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_RESIZABLE) == (32ull), "SDL_WINDOW_RESIZABLE: baked value 32 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_MINIMIZED) == (64ull), "SDL_WINDOW_MINIMIZED: baked value 64 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_MAXIMIZED) == (128ull), "SDL_WINDOW_MAXIMIZED: baked value 128 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_MOUSE_GRABBED) == (256ull), "SDL_WINDOW_MOUSE_GRABBED: baked value 256 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_INPUT_FOCUS) == (512ull), "SDL_WINDOW_INPUT_FOCUS: baked value 512 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_MOUSE_FOCUS) == (1024ull), "SDL_WINDOW_MOUSE_FOCUS: baked value 1024 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_EXTERNAL) == (2048ull), "SDL_WINDOW_EXTERNAL: baked value 2048 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_MODAL) == (4096ull), "SDL_WINDOW_MODAL: baked value 4096 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_HIGH_PIXEL_DENSITY) == (8192ull), "SDL_WINDOW_HIGH_PIXEL_DENSITY: baked value 8192 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_MOUSE_CAPTURE) == (16384ull), "SDL_WINDOW_MOUSE_CAPTURE: baked value 16384 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_MOUSE_RELATIVE_MODE) == (32768ull), "SDL_WINDOW_MOUSE_RELATIVE_MODE: baked value 32768 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_ALWAYS_ON_TOP) == (65536ull), "SDL_WINDOW_ALWAYS_ON_TOP: baked value 65536 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_UTILITY) == (131072ull), "SDL_WINDOW_UTILITY: baked value 131072 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_TOOLTIP) == (262144ull), "SDL_WINDOW_TOOLTIP: baked value 262144 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_POPUP_MENU) == (524288ull), "SDL_WINDOW_POPUP_MENU: baked value 524288 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_KEYBOARD_GRABBED) == (1048576ull), "SDL_WINDOW_KEYBOARD_GRABBED: baked value 1048576 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#if SDL_VERSION_ATLEAST(3, 4, 0)
+_Static_assert((SDL_WINDOW_FILL_DOCUMENT) == (2097152ull), "SDL_WINDOW_FILL_DOCUMENT: baked value 2097152 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+#endif
+_Static_assert((SDL_WINDOW_VULKAN) == (268435456ull), "SDL_WINDOW_VULKAN: baked value 268435456 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_METAL) == (536870912ull), "SDL_WINDOW_METAL: baked value 536870912 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_TRANSPARENT) == (1073741824ull), "SDL_WINDOW_TRANSPARENT: baked value 1073741824 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
+_Static_assert((SDL_WINDOW_NOT_FOCUSABLE) == (2147483648ull), "SDL_WINDOW_NOT_FOCUSABLE: baked value 2147483648 differs from your SDL3 headers (sdl3-bindgen-sys README: ABI verification)");
diff --git a/runtime-cexpr/C/Expr/HostPlatform.hs b/runtime-cexpr/C/Expr/HostPlatform.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Expr/HostPlatform.hs
@@ -0,0 +1,54 @@
+{-# LANGUAGE CPP #-}
+
+#include <MachDeps.h>
+
+-- Confusingly, mingw32_HOST_OS is also defined on 64-bit Windows
+#ifdef mingw32_HOST_OS
+#  if WORD_SIZE_IN_BITS == 64
+#    define CExprPlatform C.Expr.Win64
+#  else
+#    error "C.Expr: Windows: word size must be 64 bits"
+#  endif
+#else
+#  if WORD_SIZE_IN_BITS == 32
+#    define CExprPlatform C.Expr.Posix32
+#  elif WORD_SIZE_IN_BITS == 64
+#    define CExprPlatform C.Expr.Posix64
+#  else
+#    error "C.Expr: POSIX: word size must be 32 or 64 bits"
+#  endif
+#endif
+
+module C.Expr.HostPlatform
+  ( -- explicit re-exports of everything in C.Operator.Classes
+    -- (we don't re-export the module, for better haddocks)
+
+    -- * Logical operators
+    Not(..)
+  , Logical(..)
+    -- * Equality and comparison
+  , RelEq(..), RelOrd(..)
+  , NotNull(..)
+    -- * Arithmetic
+    -- ** Unary
+  , Plus(..)
+  , Minus(..)
+    -- ** Binary
+  , Add(..)
+  , Sub(..)
+  , Mult(..)
+  , Div(..)
+  , Rem(..)
+    -- * Bitwise
+    -- ** Unary
+  , Complement(..)
+    -- ** Binary
+  , Bitwise(..)
+  , Shift(..)
+
+    -- instances
+  , module CExprPlatform
+  ) where
+
+import C.Operator.Classes
+import CExprPlatform
diff --git a/runtime-cexpr/C/Expr/Posix32.hs b/runtime-cexpr/C/Expr/Posix32.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Expr/Posix32.hs
@@ -0,0 +1,27 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE UndecidableInstances #-}
+-- Some options to make this module faster to compile
+{-# OPTIONS_GHC -O0 -fmax-pmcheck-models=1 #-}
+{-# OPTIONS_GHC -Wno-orphans -Wno-unused-matches #-}
+
+module C.Expr.Posix32 (
+  module C.Operator.Classes,
+  module C.Expr.Posix32,
+) where
+
+-- c-expr
+
+import C.Operator.Classes
+import C.Operator.GenInstances (cExprInstances)
+import C.Type (OS (..), Platform (..), WordWidth (..))
+
+--------------------------------------------------------------------------------
+
+$( cExprInstances
+     ( Platform
+         { platformWordWidth = WordWidth32
+         , platformOS = Posix
+         }
+     )
+ )
diff --git a/runtime-cexpr/C/Expr/Posix64.hs b/runtime-cexpr/C/Expr/Posix64.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Expr/Posix64.hs
@@ -0,0 +1,25 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE UndecidableInstances #-}
+-- Some options to make this module faster to compile
+{-# OPTIONS_GHC -O0 -fmax-pmcheck-models=1 #-}
+{-# OPTIONS_GHC -Wno-orphans -Wno-unused-matches #-}
+
+module C.Expr.Posix64 (
+  module C.Operator.Classes,
+  module C.Expr.Posix64,
+) where
+
+import C.Operator.Classes
+import C.Operator.GenInstances (cExprInstances)
+import C.Type (OS (..), Platform (..), WordWidth (..))
+
+--------------------------------------------------------------------------------
+
+$( cExprInstances
+     ( Platform
+         { platformWordWidth = WordWidth64
+         , platformOS = Posix
+         }
+     )
+ )
diff --git a/runtime-cexpr/C/Expr/Win64.hs b/runtime-cexpr/C/Expr/Win64.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Expr/Win64.hs
@@ -0,0 +1,25 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE UndecidableInstances #-}
+-- Some options to make this module faster to compile
+{-# OPTIONS_GHC -O0 -fmax-pmcheck-models=1 #-}
+{-# OPTIONS_GHC -Wno-orphans -Wno-unused-matches #-}
+
+module C.Expr.Win64 (
+  module C.Operator.Classes,
+  module C.Expr.Win64,
+) where
+
+import C.Operator.Classes
+import C.Operator.GenInstances (cExprInstances)
+import C.Type (OS (..), Platform (..), WordWidth (..))
+
+--------------------------------------------------------------------------------
+
+$( cExprInstances
+     ( Platform
+         { platformWordWidth = WordWidth64
+         , platformOS = Windows
+         }
+     )
+ )
diff --git a/runtime-cexpr/C/Operator/Classes.hs b/runtime-cexpr/C/Operator/Classes.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Operator/Classes.hs
@@ -0,0 +1,219 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE UndecidableInstances #-}
+
+module C.Operator.Classes (
+  -- * Logical operators
+  Not (..),
+  Logical (..),
+
+  -- * Equality and comparison
+  RelEq (..),
+  RelOrd (..),
+  NotNull (..),
+
+  -- * Arithmetic
+
+  -- ** Unary
+  Plus (..),
+  Minus (..),
+
+  -- ** Binary
+  Add (..),
+  Sub (..),
+  Mult (..),
+  Div (..),
+  Rem (..),
+
+  -- * Bitwise
+
+  -- ** Unary
+  Complement (..),
+
+  -- ** Binary
+  Bitwise (..),
+  Shift (..),
+) where
+
+import Data.Kind (Constraint, Type)
+import Foreign (Ptr, nullPtr)
+import Foreign.C
+import Prelude (Bool (..), Eq (..), Num (..))
+
+--------------------------------------------------------------------------------
+
+-- | Class to compare whether a value is zero/null.
+type NotNull :: Type -> Constraint
+class NotNull a where
+  notNull :: a -> Bool
+
+instance (Eq a, Num a) => NotNull a where
+  notNull = (/= 0)
+instance {-# OVERLAPPING #-} NotNull (Ptr a) where
+  notNull = (/= nullPtr)
+
+--------------------------------------------------------------------------------
+
+infixr 0 `not`
+
+-- | Class for the C logical negation operator.
+type Not :: Type -> Constraint
+class Not a where
+  -- | C logical negation operator.
+  not :: a -> CInt
+
+infixl 7 &&
+infixl 8 ||
+
+-- | Class for C boolean logical operators (conjunction and disjunction).
+type Logical :: Type -> Type -> Constraint
+class Logical a b where
+  (&&), (||) :: a -> b -> CInt
+
+--------------------------------------------------------------------------------
+
+infixl 5 ==
+infixl 5 !=
+
+-- | Class for C equality and inequality operators.
+type RelEq :: Type -> Type -> Constraint
+class RelEq a b where
+  (==), (!=) :: a -> b -> CInt
+
+infixl 4 >=
+infixl 4 <
+infixl 4 <=
+infixl 4 >
+
+-- | Class for C relative comparison operators (less than, greater than or equal, etc).
+type RelOrd :: Type -> Type -> Constraint
+class RelOrd a b where
+  (<=), (<), (>=), (>) :: a -> b -> CInt
+
+--------------------------------------------------------------------------------
+
+infixr 0 `plus`
+
+-- | Class for the C unary plus operator.
+type Plus :: Type -> Constraint
+class Plus a where
+  -- | Result type family of the C unary plus operator.
+  type PlusRes a :: Type
+
+  -- | C unary plus operator.
+  plus :: a -> PlusRes a
+
+infixr 0 `negate`
+
+-- | Class for the C unary minus operator.
+type Minus :: Type -> Constraint
+class Minus a where
+  -- | Result type family of the C unary minus operator.
+  type MinusRes a :: Type
+
+  -- | C unary plus minus.
+  negate :: a -> MinusRes a
+
+infixl 2 +
+
+-- | Class for the C binary addition operator.
+type Add :: Type -> Type -> Constraint
+class Add a b where
+  -- | Result type family of the C binary addition operator.
+  type AddRes a b :: Type
+
+  -- | C binary addition operator.
+  (+) :: a -> b -> AddRes a b
+
+infixl 2 -
+
+-- | Class for the C binary subtraction operator.
+type Sub :: Type -> Type -> Constraint
+class Sub a b where
+  -- | Result type family of the C binary subtraction operator.
+  type SubRes a b :: Type
+
+  -- | C binary subtraction operator.
+  (-) :: a -> b -> SubRes a b
+
+infixl 1 *
+
+-- | Class for the C binary multiplication operator..
+type Mult :: Type -> Type -> Constraint
+class Mult a b where
+  -- | Result type family of the C binary multiplication operator.
+  type MultRes a b :: Type
+
+  -- | C binary multiplication operator.
+  (*) :: a -> b -> MultRes a b
+
+infixl 1 /
+
+-- | Class for the C binary division operator.
+type Div :: Type -> Type -> Constraint
+class Div a b where
+  -- | Result type family of the C binary division operator.
+  type DivRes a b :: Type
+
+  -- | C binary division operator.
+  (/) :: a -> b -> DivRes a b
+
+infixl 1 %
+
+-- | Class for the C binary remainder operator..
+type Rem :: Type -> Type -> Constraint
+class Rem a b where
+  -- | Result type family of the C binary remainder operator.
+  type RemRes a b :: Type
+
+  -- | C binary remainder operator.
+  (%) :: a -> b -> RemRes a b
+
+--------------------------------------------------------------------------------
+
+infixr 0 .~
+
+-- | Class for the C unary bitwise complement operator.
+type Complement :: Type -> Constraint
+class Complement a where
+  -- | Result type family of the C unary bitwise complement operator.
+  type ComplementRes a :: Type
+
+  -- | C unary bitwise complement operator.
+  (.~) :: a -> ComplementRes a
+
+infixl 7 .&.
+infixl 8 .|.
+infixl 6 .^.
+
+-- | Class for C binary bitwise logical operators.
+type Bitwise :: Type -> Type -> Constraint
+class Bitwise a b where
+  -- | Result type family of C binary bitwise logical operators.
+  type BitsRes a b :: Type
+
+  -- | C binary bitwise *and* operator.
+  (.&.) :: a -> b -> BitsRes a b
+
+  -- | C binary bitwise *or* operator.
+  (.|.) :: a -> b -> BitsRes a b
+
+  -- | C binary bitwise *xor* operator.
+  (.^.) :: a -> b -> BitsRes a b
+
+infixl 3 <<
+infixl 3 >>
+
+-- | Class for the C binary bit-shift operators.
+type Shift :: Type -> Type -> Constraint
+class Shift a i where
+  -- | Result type family of C binary bit-shift operators.
+  type ShiftRes a :: Type
+
+  -- | C binary left-shift operator.
+  (<<) :: a -> i -> ShiftRes a
+
+  -- | C binary right-shift operator.
+  (>>) :: a -> i -> ShiftRes a
+
+--------------------------------------------------------------------------------
diff --git a/runtime-cexpr/C/Operator/GenInstances.hs b/runtime-cexpr/C/Operator/GenInstances.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Operator/GenInstances.hs
@@ -0,0 +1,212 @@
+{-# LANGUAGE TemplateHaskellQuotes #-}
+
+module C.Operator.GenInstances (cExprInstances) where
+
+import Control.Monad (guard)
+import Data.Bits qualified as Bits
+import Foreign.C.Types
+import Language.Haskell.TH qualified as TH
+import Prelude hiding (Fractional (..), Integral (..), Num (..))
+import Prelude qualified
+
+import C.Operator.Classes qualified as C
+import C.Operator.Internal qualified as C
+import C.Operator.TH
+import C.Type qualified as C
+
+--------------------------------------------------------------------------------
+
+-- | All instances for arithmetic classes on standard types, for the given
+-- 'C.Platform'.
+cExprInstances :: C.Platform -> TH.Q [TH.Dec]
+cExprInstances platform = do
+  concat
+    <$> sequence
+      [ ----------------------------------------------------------------------------
+        -- Not, Logical
+
+        do
+          impl <- [|\i -> if C.notNull i then 0 else 1|]
+          withInstanceProofs
+            [ genUnaryInstances
+                ''C.Not
+                (Left $ TH.ConT ''CInt)
+                (C.unaryLogicalType platform)
+                [ClassMethod 'C.not "singNot" 1 impl]
+            ]
+      , do
+          impl1 <- [|\i j -> if C.notNull i Prelude.&& C.notNull j then 1 else 0|]
+          impl2 <- [|\i j -> if C.notNull i Prelude.|| C.notNull j then 1 else 0|]
+          withInstanceProofs
+            [ genBinaryInstances
+                ''C.Logical
+                (Left $ TH.ConT ''CInt)
+                (C.binaryLogicalType platform)
+                [ ClassMethod '(C.&&) "singAnd" 2 impl1
+                , ClassMethod '(C.||) "singOr" 2 impl2
+                ]
+            ]
+      , ----------------------------------------------------------------------------
+        -- RelEq, RelOrd
+
+        do
+          impl1 <- [|\a b -> if a Prelude.== b then 1 else 0|]
+          impl2 <- [|\a b -> if a Prelude./= b then 1 else 0|]
+          withInstanceProofs
+            [ genBinaryInstances
+                ''C.RelEq
+                (Left $ TH.ConT ''CInt)
+                (C.binaryEqType platform)
+                [ ClassMethod '(C.==) "singEq" 2 impl1
+                , ClassMethod '(C.!=) "singNEq" 2 impl2
+                ]
+            ]
+      , do
+          impl1 <- [|\a b -> if a Prelude.> b then 1 else 0|]
+          impl2 <- [|\a b -> if a Prelude.>= b then 1 else 0|]
+          impl3 <- [|\a b -> if a Prelude.< b then 1 else 0|]
+          impl4 <- [|\a b -> if a Prelude.<= b then 1 else 0|]
+          withInstanceProofs
+            [ genBinaryInstances
+                ''C.RelOrd
+                (Left $ TH.ConT ''CInt)
+                (C.binaryRelType platform)
+                [ ClassMethod '(C.>) "singGT" 2 impl1
+                , ClassMethod '(C.>=) "singGTE" 2 impl2
+                , ClassMethod '(C.<) "singLT" 2 impl3
+                , ClassMethod '(C.<=) "singLTE" 2 impl4
+                ]
+            ]
+      , ----------------------------------------------------------------------------
+        -- Plus, Minus
+
+        withInstanceProofs
+          [ genUnaryInstances
+              ''C.Plus
+              (withAssoc "PlusRes" "PlusResImpl" SameArgs)
+              (C.unaryPlusType platform)
+              [ClassMethod 'C.plus "singPlus" 1 (TH.VarE 'Prelude.id)]
+          ]
+      , genUnaryTyFam platform (TH.mkName "PlusResImpl") C.unaryPlusType
+      , withInstanceProofs
+          [ genUnaryInstances
+              ''C.Minus
+              (withAssoc "MinusRes" "MinusResImpl" SameArgs)
+              (C.unaryMinusType platform)
+              [ClassMethod 'C.negate "singNegate" 1 (TH.VarE 'Prelude.negate)]
+          ]
+      , genUnaryTyFam platform (TH.mkName "MinusResImpl") C.unaryMinusType
+      , ----------------------------------------------------------------------------
+        -- Add, Sub, Mult, Div, Rem
+
+        withInstanceProofs
+          [ genBinaryInstances
+              ''C.Add
+              (withAssoc "AddRes" "AddResImpl" SameArgs)
+              (C.binaryAddType platform)
+              [ClassMethod '(C.+) "singAdd" 2 (TH.VarE '(Prelude.+))]
+          ]
+      , genBinaryTyFam platform (TH.mkName "AddResImpl") C.binaryAddType
+      , withInstanceProofs
+          [ genBinaryInstances
+              ''C.Sub
+              (withAssoc "SubRes" "SubResImpl" SameArgs)
+              (C.binarySubType platform)
+              [ClassMethod '(C.-) "singSub" 2 (TH.VarE '(Prelude.-))]
+          ]
+      , genBinaryTyFam platform (TH.mkName "SubResImpl") C.binarySubType
+      , withInstanceProofs
+          [ genBinaryInstances
+              ''C.Mult
+              (withAssoc "MultRes" "MultResImpl" SameArgs)
+              (C.binaryMultiplicativeType platform)
+              [ClassMethod '(C.*) "singMult" 2 (TH.VarE '(Prelude.*))]
+          ]
+      , genBinaryTyFam platform (TH.mkName "MultResImpl") C.binaryMultiplicativeType
+      , -- NB: this is the key usage of 'withInstanceProofs' with a non-singleton list
+        withInstanceProofs
+          -- division for integral types
+          [ genBinaryInstances
+              ''C.Div
+              (withAssoc "DivRes" "MultResImpl" SameArgs) -- NB: re-use 'MultResImpl'
+              ( \a b ->
+                  do
+                    op@(resTy, _) <- C.integralBinaryType platform a b
+                    guard (case resTy of C.Arithmetic (C.FloatLike{}) -> False; _ -> True)
+                    return op
+              )
+              [ClassMethod '(C./) "singDiv" 2 (TH.VarE 'Prelude.div)]
+          , -- division for floating-point types
+            genBinaryInstances
+              ''C.Div
+              (withAssoc "DivRes" "MultResImpl" SameArgs) -- NB: re-use 'MultResImpl'
+              ( \a b ->
+                  do
+                    op@(resTy, _) <- C.binaryMultiplicativeType platform a b
+                    guard (case resTy of C.Arithmetic (C.FloatLike{}) -> True; _ -> False)
+                    return op
+              )
+              [ClassMethod '(C./) "singDiv" 2 (TH.VarE '(Prelude./))]
+          ]
+      , withInstanceProofs
+          [ genBinaryInstances
+              ''C.Rem
+              (withAssoc "RemRes" "BinResImpl" SameArgs) -- NB: use 'BinResImpl'
+              (C.integralBinaryType platform)
+              [ClassMethod '(C.%) "singRem" 2 (TH.VarE 'Prelude.rem)]
+          ]
+      , genBinaryTyFam platform (TH.mkName "BinResImpl") C.integralBinaryType
+      , ----------------------------------------------------------------------------
+        -- Complement, Bitwise, Shift
+
+        withInstanceProofs
+          [ genUnaryInstances
+              ''C.Complement
+              (withAssoc "ComplementRes" "ComplementResImpl" SameArgs)
+              (C.integralUnaryType platform)
+              [ClassMethod '(C..~) "singComplement" 1 (TH.VarE 'Bits.complement)]
+          ]
+      , genUnaryTyFam platform (TH.mkName "ComplementResImpl") C.integralUnaryType
+      , withInstanceProofs
+          [ genBinaryInstances
+              ''C.Bitwise
+              (withAssoc "BitsRes" "BinResImpl" SameArgs) -- NB: use 'BinResImpl'
+              (C.integralBinaryType platform)
+              [ ClassMethod '(C..&.) "singBitAnd" 2 (TH.VarE '(Bits..&.))
+              , ClassMethod '(C..|.) "singBitOr" 2 (TH.VarE '(Bits..|.))
+              , ClassMethod '(C..^.) "singBitXor" 2 (TH.VarE 'Bits.xor)
+              ]
+          ]
+      , do
+          impl1 <- [|\a i -> Bits.shiftL a (Prelude.fromIntegral i)|]
+          impl2 <- [|\a i -> Bits.shiftR a (Prelude.fromIntegral i)|]
+          withInstanceProofs
+            [ genBinaryInstances
+                ''C.Shift
+                (withAssoc "ShiftRes" "ShiftResImpl" FirstArgOnly)
+                -- NB: use 'FirstArgOnly', because the result type only depends on the
+                -- first argument.
+                (C.shiftType platform)
+                [ ClassMethod '(C.<<) "singShiftL" 2 impl1
+                , ClassMethod '(C.>>) "singShiftR" 2 impl2
+                ]
+            ]
+      , genUnaryTyFam platform (TH.mkName "ShiftResImpl") $
+          -- The associated type family for Shift is unary, as the result type
+          -- only depends on the shiftee type, not the type of the shift amount,
+          -- which undergoes an independent arithmetic promotion.
+          \plat ty -> C.shiftType plat ty (C.Arithmetic $ C.Integral $ C.IntLike $ C.Int C.Signed)
+      ]
+
+--------------------------------------------------------------------------------
+
+-- | Utility function to construct a 'C.Operator.TH.AssocTyFam' argument to pass
+-- to 'genUnaryInstances' or 'genBinaryInstances'.
+withAssoc :: String -> String -> AssocTyFamArgs -> Either TH.Type AssocTyFam
+withAssoc famName implName args =
+  Right $
+    AssocTyFam
+      { assocTyFamName = TH.mkName famName
+      , assocTyFamImplName = TH.mkName implName
+      , assocTyFamArgs = args
+      }
diff --git a/runtime-cexpr/C/Operator/Internal.hs b/runtime-cexpr/C/Operator/Internal.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Operator/Internal.hs
@@ -0,0 +1,476 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module C.Operator.Internal where
+
+import Control.Arrow (first, second, (***))
+import Control.Exception (assert)
+import Data.Kind qualified as Hs
+import Data.Nat (Nat (..))
+import Data.Vec.Lazy (Vec (..))
+import Data.Void qualified as Absurd
+import GHC.Generics (Generic)
+
+import C.Type
+
+--------------------------------------------------------------------------------
+
+-- | **Internal implementation detail**
+--
+-- How is a C operator, when instantiated at a particular type, implemented?
+type OpImpl :: Nat -> Hs.Type
+data OpImpl n
+  = -- | Convert arguments with the given conversions and then apply
+    -- the implied function (e.g. addition for the 'Add' class)
+    -- at the resulting type.
+    ConvertThenOp
+      {argumentConversions :: !(Vec n [Conversion])}
+  | -- | Add an integral value and a pointer.
+    AddIntegralAndPtr
+  | -- | Add a pointer and an integral value.
+    AddPtrAndIntegral
+  | -- | Get the difference between two pointers.
+    SubPtrAndPtr
+  | -- | Subtract an integral value from a pointer.
+    SubPtrAndIntegral
+  deriving stock (Generic, Show)
+
+data Conversion
+  = FromIntegralTo {fromIntegralTo :: !(Type Absurd.Void)}
+  | RealToFracTo {realToFracTo :: !(Type Absurd.Void)}
+  | PtrToInt
+  deriving stock (Generic, Show)
+
+--------------------------------------------------------------------------------
+
+type Op :: Nat -> Hs.Type
+data Op arity where
+  UnaryOp :: UnaryOp -> Op (S Z)
+  BinaryOp :: BinaryOp -> Op (S (S Z))
+
+data UnaryOp
+  = -- | @+@
+    UnaryPlus
+  | -- | @-@
+    UnaryMinus
+  | -- | @!@
+    LogicalNot
+  | -- | @~@
+    BitwiseNot
+  deriving stock (Bounded, Enum, Eq, Ord, Show)
+
+data BinaryOp
+  = -- | @*@
+    Mult
+  | -- | @/@
+    Div
+  | -- | @%@
+    Rem
+  | -- | @+@
+    Add
+  | -- | @-@
+    Sub
+  | -- | @<<@
+    ShiftLeft
+  | -- | @>>@
+    ShiftRight
+  | -- | @<@
+    RelLT
+  | -- | @<=@
+    RelLE
+  | -- | @>@
+    RelGT
+  | -- | @>=@
+    RelGE
+  | -- | @==@
+    RelEQ
+  | -- | @!=@
+    RelNE
+  | -- | @&@
+    BitwiseAnd
+  | -- | @^@
+    BitwiseXor
+  | -- | @|@
+    BitwiseOr
+  | -- | @&&@
+    LogicalAnd
+  | -- | @||@
+    LogicalOr
+  deriving stock (Bounded, Enum, Eq, Ord, Show)
+
+pprOp :: Op arity -> String
+pprOp = \case
+  UnaryOp op ->
+    case op of
+      UnaryPlus -> "+"
+      UnaryMinus -> "-"
+      LogicalNot -> "!"
+      BitwiseNot -> "~"
+  BinaryOp op ->
+    case op of
+      Mult -> "*"
+      Div -> "/"
+      Rem -> "%"
+      Add -> "+"
+      Sub -> "-"
+      ShiftLeft -> "<<"
+      ShiftRight -> ">>"
+      RelLT -> "<"
+      RelLE -> "<="
+      RelGT -> ">"
+      RelGE -> ">="
+      RelEQ -> "=="
+      RelNE -> "!="
+      BitwiseAnd -> "&"
+      BitwiseXor -> "^"
+      BitwiseOr -> "|"
+      LogicalAnd -> "&&"
+      LogicalOr -> "||"
+
+pprOpApp :: forall arity. Op arity -> Vec arity String -> String
+pprOpApp op args =
+  case op of
+    UnaryOp{} -> unary
+    BinaryOp{} -> binary
+ where
+  unary :: (arity ~ S Z) => String
+  unary =
+    case args of
+      a ::: VNil ->
+        pprOp op ++ a
+  binary :: (arity ~ S (S Z)) => String
+  binary =
+    case args of
+      a ::: b ::: VNil ->
+        a ++ pprOp op ++ b
+
+--------------------------------------------------------------------------------
+
+opResTypeAndImpl
+  :: forall arity a
+   . (Eq a) => Platform -> Op arity -> Vec arity (Type a) -> Maybe (Type a, OpImpl arity)
+opResTypeAndImpl plat op args =
+  case op of
+    UnaryOp o ->
+      case o of
+        UnaryPlus -> unary unaryPlusType
+        UnaryMinus -> unary unaryMinusType
+        LogicalNot -> unary unaryLogicalType
+        BitwiseNot -> unary integralUnaryType
+    BinaryOp o ->
+      case o of
+        Mult -> binary binaryMultiplicativeType
+        Div -> binary binaryMultiplicativeType
+        Rem -> binary integralBinaryType
+        Add -> binary binaryAddType
+        Sub -> binary binarySubType
+        ShiftLeft -> binary shiftType
+        ShiftRight -> binary shiftType
+        RelLT -> binary binaryRelType
+        RelLE -> binary binaryRelType
+        RelGT -> binary binaryRelType
+        RelGE -> binary binaryRelType
+        RelEQ -> binary binaryEqType
+        RelNE -> binary binaryEqType
+        BitwiseAnd -> binary integralBinaryType
+        BitwiseXor -> binary integralBinaryType
+        BitwiseOr -> binary integralBinaryType
+        LogicalAnd -> binary binaryLogicalType
+        LogicalOr -> binary binaryLogicalType
+ where
+  unary :: (arity ~ S Z) => (Platform -> Type a -> Maybe r) -> Maybe r
+  unary f =
+    case args of
+      a ::: VNil ->
+        f plat a
+  binary :: (arity ~ S (S Z)) => (Platform -> Type a -> Type a -> Maybe r) -> Maybe r
+  binary f =
+    case args of
+      a ::: b ::: VNil ->
+        f plat a b
+
+--------------------------------------------------------------------------------
+
+-- | Result type of unary @+@
+unaryPlusType :: Platform -> Type a -> Maybe (Type a, OpImpl (S Z))
+unaryPlusType plat = \case
+  Arithmetic ty ->
+    Just $ mkArithConv1 $ arithmeticPromotion plat ty
+  Ptr{} ->
+    -- The C++ standard allows unary plus on pointers, but the C standard doesn't.
+    Nothing
+  Void -> Nothing
+
+-- | Result type of unary @-@
+unaryMinusType :: Platform -> Type a -> Maybe (Type a, OpImpl (S Z))
+unaryMinusType plat = \case
+  Arithmetic ty ->
+    Just $ mkArithConv1 $ arithmeticPromotion plat ty
+  Ptr{} -> Nothing
+  Void -> Nothing
+
+-- | Result type of binary @+@
+binaryAddType :: Platform -> Type a -> Type a -> Maybe (Type a, OpImpl (S (S Z)))
+binaryAddType plat (Arithmetic a1) (Arithmetic a2) =
+  Just $ mkArithConv2 $ arithmeticConversion plat a1 a2
+binaryAddType _ (Arithmetic (Integral{})) ptr@(Ptr{}) =
+  Just (ptr, AddIntegralAndPtr)
+binaryAddType _ ptr@(Ptr{}) (Arithmetic (Integral{})) =
+  Just (ptr, AddPtrAndIntegral)
+binaryAddType _ _ _ =
+  Nothing
+
+-- | Result type of binary @-@
+binarySubType :: (Eq a) => Platform -> Type a -> Type a -> Maybe (Type a, OpImpl (S (S Z)))
+binarySubType plat (Arithmetic a1) (Arithmetic a2) =
+  Just $ mkArithConv2 $ arithmeticConversion plat a1 a2
+binarySubType _ ptr@(Ptr{}) (Arithmetic (Integral{})) =
+  Just (ptr, SubPtrAndIntegral)
+binarySubType _ (Ptr ty1) (Ptr ty2)
+  | ty1 == ty2 =
+      -- TODO: do we want to be more lenient in allowing subtraction of pointers
+      -- with different pointee types, e.g. allow @(x :: Ptr Void) - (y :: Ptr Int)@?
+      Just (Arithmetic $ Integral $ IntLike PtrDiff, SubPtrAndPtr)
+binarySubType _ _ _ =
+  Nothing
+
+-- | Result type for multiplication and division (integral and floating-point)
+binaryMultiplicativeType :: Platform -> Type a -> Type a -> Maybe (Type a, OpImpl (S (S Z)))
+binaryMultiplicativeType plat (Arithmetic a1) (Arithmetic a2) =
+  Just $ mkArithConv2 $ arithmeticConversion plat a1 a2
+binaryMultiplicativeType _ _ _ = Nothing
+
+-- | Result type for bitwise not operator
+integralUnaryType :: Platform -> Type a -> Maybe (Type a, OpImpl (S Z))
+integralUnaryType plat (Arithmetic a1)
+  | Integral{} <- a1 =
+      Just $ mkArithConv1 $ arithmeticPromotion plat a1
+integralUnaryType _ _ = Nothing
+
+-- | Type for integral remainder and binary bitwise logic operators
+integralBinaryType :: Platform -> Type a -> Type a -> Maybe (Type a, OpImpl (S (S Z)))
+integralBinaryType plat (Arithmetic a1) (Arithmetic a2)
+  | Integral{} <- a1
+  , Integral{} <- a2 =
+      Just $ mkArithConv2 $ arithmeticConversion plat a1 a2
+integralBinaryType _ _ _ = Nothing
+
+-- | Type for binary shift operators
+shiftType
+  :: Platform
+  -> Type a
+  -- ^ type of the value being shifted
+  -> Type a
+  -- ^ type of the shift amount
+  -> Maybe (Type a, OpImpl (S (S Z)))
+shiftType plat (Arithmetic a1@(Integral{})) (Arithmetic a2@(Integral{})) =
+  let (i1, c1) = arithmeticPromotion plat a1
+      (_, c2) = arithmeticPromotion plat a2
+   in Just (Arithmetic i1, ConvertThenOp (c1 ::: c2 ::: VNil))
+shiftType _ _ _ =
+  Nothing
+
+intType, uintType :: Type a
+intType = Arithmetic $ Integral $ IntLike $ Int Signed
+uintType = Arithmetic $ Integral $ IntLike $ Int Unsigned
+
+convertToInt :: Platform -> Type a -> Maybe [Conversion]
+convertToInt _ = \case
+  Arithmetic a -> Just $ case a of
+    Integral i ->
+      case i of
+        IntLike (Int Signed) -> []
+        _ -> [FromIntegralTo intType]
+    FloatLike{} ->
+      [RealToFracTo intType]
+  Ptr{} ->
+    Just [PtrToInt]
+  _ ->
+    Nothing
+
+-- | Type for logical not operation @!@.
+unaryLogicalType :: Platform -> Type a -> Maybe (Type a, OpImpl (S Z))
+unaryLogicalType plat a = do
+  _conv <- convertToInt plat a
+  return $ (intType, ConvertThenOp ([] ::: VNil))
+
+-- | Type for binary equality operators @==@ and @!=@.
+binaryEqType :: (Eq a) => Platform -> Type a -> Type a -> Maybe (Type a, OpImpl (S (S Z)))
+binaryEqType plat (Arithmetic a1) (Arithmetic a2) =
+  Just $ mkArithConv2 (Integral $ IntLike $ Int Signed, snd $ arithmeticConversion plat a1 a2)
+binaryEqType _ (Ptr ty1) (Ptr ty2)
+  | ty1 == ty2 =
+      -- TODO: does the C standard allow "Ptr Int" == "Ptr Void"?
+      Just (intType, ConvertThenOp ([] ::: [] ::: VNil))
+binaryEqType _ _ _ = Nothing
+
+-- | Type for binary logical operators @&&@ and @||@.
+binaryLogicalType :: Platform -> Type a -> Type a -> Maybe (Type a, OpImpl (S (S Z)))
+binaryLogicalType plat a1 a2 = do
+  _c1 <- convertToInt plat a1
+  _c2 <- convertToInt plat a2
+  return (intType, ConvertThenOp ([] ::: [] ::: VNil))
+
+-- | Type for binary comparison operators @<@, @<=@, @>@, @>=@.
+binaryRelType :: (Eq a) => Platform -> Type a -> Type a -> Maybe (Type a, OpImpl (S (S Z)))
+binaryRelType plat (Arithmetic a1) (Arithmetic a2) =
+  Just $ mkArithConv2 (Integral $ IntLike $ Int Signed, snd $ arithmeticConversion plat a1 a2)
+binaryRelType _ (Ptr ty1) (Ptr ty2)
+  | ty1 == ty2 =
+      -- TODO: C is a bit more lenient than requiring the inner types to
+      -- match exactly.
+      Just (intType, ConvertThenOp ([] ::: [] ::: VNil))
+binaryRelType _ _ _ = Nothing
+
+mkArithConv1 :: (ArithmeticType, [Conversion]) -> (Type a, OpImpl (S Z))
+mkArithConv1 =
+  (Arithmetic *** (\a -> ConvertThenOp (a ::: VNil)))
+
+mkArithConv2
+  :: (ArithmeticType, ([Conversion], [Conversion])) -> (Type a, OpImpl (S (S Z)))
+mkArithConv2 =
+  (Arithmetic *** (\(a, b) -> ConvertThenOp (a ::: b ::: VNil)))
+
+--------------------------------------------------------------------------------
+
+arithmeticPromotion :: Platform -> ArithmeticType -> (ArithmeticType, [Conversion])
+arithmeticPromotion _ f@(FloatLike{}) =
+  (f, [])
+arithmeticPromotion plat (Integral i) =
+  first (Integral . IntLike) $ integralPromotion plat i
+
+integralPromotion :: Platform -> IntegralType -> (IntLikeType, [Conversion])
+-- C standard: Promotion from integral types (non bit-field case).
+--
+-- If the integer conversion rank of T is lower than that of int:
+--
+--   1. promote T to int if int can represent all the values of T,
+--   2. otherwise promote T to unsigned int
+integralPromotion plat (IntLike i)
+  | intLikeTypeConversionRank plat i < intLikeTypeConversionRank plat (Int Signed) =
+      if intLikeTypeFitsInInt plat i then
+        (Int Signed, [FromIntegralTo intType])
+      else
+        (Int Unsigned, [FromIntegralTo uintType])
+  | otherwise =
+      (i, [])
+integralPromotion plat (CharLike c) =
+  assert
+    (charLikeTypeSizeInBits plat c < intLikeTypeSizeInBits plat (Int Signed))
+    (Int Signed, [FromIntegralTo intType])
+integralPromotion _ Bool =
+  (Int Signed, [FromIntegralTo intType])
+
+--------------------------------------------------------------------------------
+-- Arithmetic conversion
+
+arithmeticConversion
+  :: Platform
+  -> ArithmeticType
+  -> ArithmeticType
+  -> (ArithmeticType, ([Conversion], [Conversion]))
+arithmeticConversion plat (Integral i1) (Integral i2) =
+  -- Both arguments are integral: do integral promotion then integral conversion.
+  let
+    (j1, c1) = integralPromotion plat i1
+    (j2, c2) = integralPromotion plat i2
+    (r, (d1, d2)) = integralArithmeticConversion plat j1 j2
+   in
+    (Integral $ IntLike r, (c1 ++ d1, c2 ++ d2))
+-- At least one of the arguments is of floating-point type:
+-- pick the largest floating-point type.
+arithmeticConversion _ (FloatLike f1) (FloatLike f2) =
+  ( FloatLike (max f1 f2)
+  , (if f2 > f1 then [rf f2] else [], if f1 > f2 then [rf f1] else [])
+  )
+ where
+  rf f = RealToFracTo $ Arithmetic $ FloatLike f
+arithmeticConversion _ f@(FloatLike{}) (Integral{}) =
+  (f, ([], [FromIntegralTo (Arithmetic f)]))
+arithmeticConversion _ (Integral{}) f@(FloatLike{}) =
+  (f, ([FromIntegralTo (Arithmetic f)], []))
+
+integralArithmeticConversion
+  :: Platform -> IntLikeType -> IntLikeType -> (IntLikeType, ([Conversion], [Conversion]))
+integralArithmeticConversion plat t1 t2
+  -- The following rules are applied to determine the arithmetic conversion result type 'C':
+  --
+  --   1. If 'T1' and 'T2' are the same type, 'C' is that type.
+  | t1 == t2 =
+      (t1, ([], []))
+  --   2. If T1 and T2 are both signed integer types or both unsigned integer types,
+  --      C is the type of greater integer conversion rank.
+  | s1 == s2 =
+      if rk1 >= rk2 then
+        (t1, ([], [FromIntegralTo (Arithmetic $ Integral $ IntLike t1)]))
+      else
+        (t2, ([FromIntegralTo (Arithmetic $ Integral $ IntLike t2)], []))
+  | otherwise =
+      --   3. Otherwise, the types are of different signs.
+      --      Implement the logic in 'integralArithmeticConversion_differentSigns'.
+      case s1 of
+        Signed ->
+          integralArithmeticConversion_differentSigns plat (t1, rk1) (t2, rk2)
+        Unsigned ->
+          second (\(c1, c2) -> (c2, c1)) $
+            integralArithmeticConversion_differentSigns plat (t2, rk2) (t1, rk1)
+ where
+  s1, s2 :: Sign
+  s1 = intLikeTypeSign t1
+  s2 = intLikeTypeSign t2
+  rk1, rk2 :: IntegerConversionRank
+  rk1 = intLikeTypeConversionRank plat t1
+  rk2 = intLikeTypeConversionRank plat t2
+
+integralArithmeticConversion_differentSigns
+  :: Platform
+  -> (IntLikeType, IntegerConversionRank)
+  -- ^ the signed type
+  -> (IntLikeType, IntegerConversionRank)
+  -- ^ the unsigned type
+  -> (IntLikeType, ([Conversion], [Conversion]))
+integralArithmeticConversion_differentSigns plat s@(t_s, rk_s) u@(t_u, rk_u)
+  -- Implement the following rules to determine the arithmetic conversion
+  -- result type C for signed type S and unsigned type U:
+  --
+  --   1. If the rank of U is greater than or equal to the rank of S, C is U.
+  | rk_u >= rk_s =
+      (t_u, ([FromIntegralTo (Arithmetic $ Integral $ IntLike t_u)], []))
+  -- Otherwise, S has (strictly) greater rank than U.
+  --
+  --   2. If S can represent all of the values of U, C is S.
+  | unsignedFitsInSigned plat t_u t_s =
+      (t_s, ([], [FromIntegralTo (Arithmetic $ Integral $ IntLike t_s)]))
+  --   3. Otherwise, C is the unsigned integer type corresponding to S.
+  | otherwise =
+      ( \iTy ->
+          let ty = Arithmetic $ Integral $ IntLike iTy
+           in (iTy, ([FromIntegralTo ty], [FromIntegralTo ty]))
+      )
+        $ case t_s of
+          Short{} -> Short Unsigned
+          Int{} -> Int Unsigned
+          Long{} -> Long Unsigned
+          LongLong{} -> LongLong Unsigned
+          _ ->
+            -- Should never happen, because any unsigned type of rank strictly
+            -- less than that of ptrdiff_t fits into ptrdiff_t.
+            error $
+              unlines
+                [ "integralArithmeticConversion_differentSigns: extended type"
+                , "ty: " ++ show t_s
+                , "s: " ++ show s
+                , "u: " ++ show u
+                ]
+
+-- | Does the given unsigned type fit into the given signed type?
+unsignedFitsInSigned
+  :: Platform
+  -> IntLikeType
+  -- ^ the unsigned type
+  -> IntLikeType
+  -- ^ the signed type
+  -> Bool
+unsignedFitsInSigned plat u s =
+  intLikeTypeSizeInBits plat s > intLikeTypeSizeInBits plat u
+
+--------------------------------------------------------------------------------
diff --git a/runtime-cexpr/C/Operator/TH.hs b/runtime-cexpr/C/Operator/TH.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Operator/TH.hs
@@ -0,0 +1,614 @@
+{-# LANGUAGE CPP #-}
+
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskellQuotes #-}
+{-# LANGUAGE ViewPatterns #-}
+
+{-# LANGUAGE BangPatterns #-}
+
+module C.Operator.TH
+  (
+
+  -- * Generating type family declarations
+    genTyFam, genUnaryTyFam, genBinaryTyFam
+
+  -- * Generating class instances
+  , ClassMethod(..)
+  , genUnaryInstances, genBinaryInstances
+  , genClassInstances, genInstance
+  , AssocTyFam(..), AssocTyFamArgs(..)
+
+  -- * Generating proofs
+  , withInstanceProofs
+
+  ) where
+
+-- base
+import Data.Foldable
+  ( toList
+#if !MIN_VERSION_base(4,20,0)
+  , foldl'
+#endif
+  )
+import Data.Function
+  ( on )
+import Data.Kind qualified as Hs
+import Data.List
+  ( sortOn )
+import Data.List.NonEmpty
+  ( groupBy )
+
+import qualified Data.List.NonEmpty as NE
+import Data.Maybe
+  ( fromJust, maybeToList, mapMaybe )
+import Data.Proxy
+  ( Proxy(..) )
+import Data.Type.Equality
+  ( type (:~:)(Refl) )
+import Data.Void
+  ( absurd )
+import Foreign
+  ( Ptr, plusPtr, minusPtr )
+import Foreign.C
+import qualified GHC.Exts as Foreign.C
+  ( Ptr(Ptr) )
+import GHC.Exts
+  ( Int(I#), addr2Int# )
+
+-- containers
+import Data.Map.Strict qualified as Map
+
+-- fin
+import Data.Type.Nat qualified as Fin
+import Data.Type.Nat
+  ( Nat(..) )
+
+-- some
+import Data.GADT.Compare
+  ( GEq(geq) )
+
+-- template-haskell
+import Language.Haskell.TH qualified as TH
+
+-- vec
+import Data.Vec.Lazy
+  ( Vec(..) )
+import Data.Vec.Lazy qualified as Vec
+
+-- c-expr
+import C.Type
+import C.Type.Internal.Universe
+import C.Operator.Internal
+  ( OpImpl(..), Conversion(..) )
+
+--------------------------------------------------------------------------------
+-- Type families
+
+-- | Generate a unary closed type family with the equations ranging over
+-- all types, with the RHS being given by the given function.
+--
+-- If the function returns 'Nothing', that particular type family equation
+-- is omitted.
+genUnaryTyFam
+  :: Platform
+  -> TH.Name -- ^ type family name
+  -> ( Platform -> Type TH.Name -> Maybe ( Type TH.Name, details ) )
+      -- ^ function implementing the type family reduction rules
+  -> TH.Q [ TH.Dec ]
+genUnaryTyFam platform fam f = genTyFam @( S Z ) platform fam g
+  where
+    g :: Platform -> Vec ( S Z ) ( Type TH.Name ) -> Maybe ( Type TH.Name )
+    g p ( a ::: VNil ) = fst <$> f p a
+
+-- | Generate a binary closed type family with the equations ranging over
+-- all pairs of types, with the RHS being given by the given function.
+--
+-- If the function returns 'Nothing', that particular type family equation
+-- is omitted.
+genBinaryTyFam
+  :: Platform
+  -> TH.Name -- ^ type family name
+  -> ( Platform -> Type TH.Name -> Type TH.Name -> Maybe ( Type TH.Name, details ) )
+      -- ^ function implementing the type family reduction rules
+  -> TH.Q [ TH.Dec ]
+genBinaryTyFam platform fam f = genTyFam @( S ( S Z ) ) platform fam g
+  where
+    g :: Platform -> Vec ( S ( S Z ) ) ( Type TH.Name ) -> Maybe ( Type TH.Name )
+    g p ( a ::: b ::: VNil ) = fst <$> f p a b
+
+-- | Generate a closed type family with the equations ranging over
+-- all @n@-tuples of types, with the RHS being given by the given function.
+--
+-- If the function returns 'Nothing', that particular type family equation
+-- is omitted.
+genTyFam
+  :: forall n
+  .  Fin.SNatI n
+  => Platform
+  -> TH.Name -- ^ type family name
+  -> ( Platform -> Vec n ( Type TH.Name ) -> Maybe ( Type TH.Name ) )
+      -- ^ function implementing the type family reduction rules
+  -> TH.Q [ TH.Dec ]
+genTyFam platform famName impl = do
+  let hsTy :: TH.Type
+      hsTy = TH.ConT ''Hs.Type
+      n :: Int
+      n = Fin.reflectToNum @n Proxy
+      args = fmap TH.mkName $ fromJust $ Vec.fromListPrefix @n [ "t" ++ show i | i <- [(1 :: Int)..]]
+
+      kiSig, famDecl :: TH.Dec
+      kiSig =
+        TH.KiSigD famName ( foldr ( \ arg acc -> TH.AppT ( TH.AppT TH.ArrowT arg ) acc ) hsTy ( replicate n hsTy ) )
+      famDecl =
+        TH.ClosedTypeFamilyD
+          ( TH.TypeFamilyHead famName
+              [ TH.PlainTV
+                  a
+#if MIN_VERSION_template_haskell(2,21,0)
+                  TH.BndrReq
+#else
+                  ()
+#endif
+              | a <- toList args
+              ]
+              TH.NoSig
+              Nothing
+          )
+          ( mkTyFamEqs famName ( impl platform ) )
+
+  return
+    [ kiSig, famDecl ]
+
+-- | Generate the equations of a closed type family, with the RHS of each
+-- equation being given by the given function.
+--
+-- If the function returns 'Nothing', that particular type family equation
+-- is omitted.
+mkTyFamEqs
+  :: forall n
+  .  Fin.SNatI n
+  => TH.Name -- ^ type family name
+  -> ( Vec n ( Type TH.Name ) -> Maybe ( Type TH.Name ) )
+      -- ^ function implementing the type family reduction rules
+  -> [ TH.TySynEqn ]
+mkTyFamEqs fam impl =
+  [ TH.TySynEqn Nothing ( foldl' TH.AppT ( TH.ConT fam ) ( fmap mkType args ) ) ( mkType res )
+  | ( args :: Vec n ( Type a ) ) <- map mkNames $ enumerateTypeTuples @n
+  , res <- maybeToList $ impl args
+  ]
+
+--------------------------------------------------------------------------------
+-- Class instances
+
+-- | Information needed to generate a class instance (of the form we need
+-- for the @c-expr@ library) with Template Haskell.
+data ClassInstance
+  = ClassInstance
+  { className      :: !TH.Name
+  , instanceTys    :: ![ TH.Type ]
+  , classMethods   :: ![ ClassMethod ]
+  }
+  deriving stock Show
+
+-- | Information needed to generate the methods in a class instance for the
+-- @c-expr@ library, using Template Haskell.
+data ClassMethod
+  = ClassMethod
+  { methodName   :: !TH.Name
+  , proveName    :: !String
+  , methodNbArgs :: !Int
+  , methodFn     :: !TH.Exp
+  }
+  deriving stock Show
+
+-- | Information needed to generate associated type family instances for
+-- the @c-expr@ library, using Template Haskell.
+data AssocTyFam
+  = AssocTyFam
+      { assocTyFamName :: !TH.Name
+      , assocTyFamArgs :: !AssocTyFamArgs
+      , assocTyFamImplName :: !TH.Name
+      }
+
+-- | Information about the arity/arguments of an associated type family.
+data AssocTyFamArgs
+  -- | The associated type family has the same arguments as the class.
+  = SameArgs
+  -- | The associated type family has a single argument, which is the same
+  -- as the first argument of the class.
+  | FirstArgOnly
+
+
+-- | Generate TH declarations for a collection of instances of a unary class,
+-- where the argument ranges over all supported types.
+genUnaryInstances
+  :: TH.Name
+     -- ^ class name
+  -> Either TH.Type AssocTyFam
+     -- ^ result type (either constant, or given by an associated type family)
+  -> ( Type TH.Name -> Maybe ( Type TH.Name, OpImpl ( S Z ) ) )
+     -- ^ function computing the result type and implementation strategy
+  -> [ ClassMethod ]
+     -- ^ class methods
+  -> TH.Q ( [ TH.Dec ], [ ( TH.Name, ( TH.Type, TH.Clause ) ) ] )
+genUnaryInstances cls fam f = genClassInstances @( S Z ) cls fam ( \ ( a ::: VNil ) -> f a )
+
+-- | Generate TH declarations for a collection of instances of a binary class,
+-- where the arguments range over pairs of supported types.
+genBinaryInstances
+  :: TH.Name
+     -- ^ class name
+  -> Either TH.Type AssocTyFam
+     -- ^ result type (either constant, or given by an associated type family)
+  -> ( Type TH.Name -> Type TH.Name -> Maybe ( Type TH.Name, OpImpl ( S ( S Z ) ) ) )
+     -- ^ function computing the result type and implementation strategy
+  -> [ ClassMethod ]
+     -- ^ class methods
+  -> TH.Q ( [ TH.Dec ], [ ( TH.Name, ( TH.Type, TH.Clause ) ) ] )
+genBinaryInstances cls fam f =
+  genClassInstances @( S ( S Z ) ) cls fam ( \ ( a ::: b ::: VNil ) -> f a b )
+
+-- | Generate TH declarations for a collection of instances of a class,
+-- where the arguments range over all @n@-tuples of supported types.
+genClassInstances
+  :: forall n
+  .  Fin.SNatI n
+  => TH.Name
+     -- ^ class name
+  -> Either TH.Type AssocTyFam
+     -- ^ result type (either constant, or given by an associated type family)
+  -> ( Vec n ( Type TH.Name ) -> Maybe ( Type TH.Name, OpImpl n ) )
+     -- ^ function computing the result type and implementation strategy
+  -> [ ClassMethod ]
+     -- ^ class methods
+  -> TH.Q ( [ TH.Dec ], [ ( TH.Name, ( TH.Type, TH.Clause ) ) ] )
+genClassInstances cls fam resTyFn meths = do
+  instDecs0 <-
+    sequence
+      [ ( argTys , ) <$> genInstance cls ( case fam of { Left {} -> Nothing; Right tf -> Just tf } ) argTys resTy opImpl meths
+      | argTys <- map mkNames $ enumerateTypeTuples @n
+      , ( resTy, opImpl ) <- maybeToList $ resTyFn argTys
+      ]
+  let instDecs = discardSubsumed instDecs0
+      ( insts, singFuns ) = unzip instDecs
+  return
+    ( insts, map ( \ ( nm, c ) -> ( nm, ( proveType ( Fin.reflectToNum @n Proxy ) fam, c ) ) ) ( concat singFuns ) )
+
+-- | Generate singletons that prove the availability of instances.
+--
+-- Example: @singAdd :: SType ty1 -> SType ty2 -> (SType (AddRes ty1 ty2), ty1 -> ty2 -> AddRes ty1 ty2)@.
+withInstanceProofs :: [ TH.Q ( [ TH.Dec ], [ ( TH.Name, ( TH.Type, TH.Clause ) ) ] ) ] -> TH.Q [ TH.Dec ]
+withInstanceProofs inner = do
+  ( decs, singFuns ) <- unzip <$> sequence inner
+  return $
+    concat decs ++ concatMap funDecl ( groupBy ( (==) `on` fst ) $ sortOn fst $ concat singFuns )
+  where
+    funDecl :: NE.NonEmpty ( TH.Name, ( TH.Type, TH.Clause ) ) -> [ TH.Dec ]
+    funDecl ( ( nm, ( ty, c ) ) NE.:| cs ) =
+      [ TH.SigD nm ty
+      , TH.FunD nm ( c : map ( snd . snd ) cs )
+      ]
+
+-- | Discard instances that are subsumed by more general instances, to avoid
+-- overlapping instances.
+--
+-- Example: @instance Add (Ptr ty1) (Ptr ty2)@ is more general
+-- than @instance Add (Ptr ty) (Ptr ty)@; discard the latter.
+discardSubsumed :: forall n b. Fin.SNatI n => [ ( Vec n ( Type TH.Name ), b ) ] -> [ b ]
+discardSubsumed insts = Map.elems $ Map.filterWithKey keepInst allInsts
+  where
+    allInsts = Map.fromList insts
+    keepInst :: Vec n ( Type TH.Name ) -> b -> Bool
+    keepInst k _
+      -- NB: for simplicity we only handle the n=2 case,
+      -- as we don't have any ternary instances.
+      | Just Refl <- Fin.eqNat @n @( S ( S Z ) )
+      , Ptr ty1 ::: Ptr ty2 ::: VNil <- k
+      , ty1 == ty2
+      , Map.member ( Ptr ( TH.mkName "ty_1" ) ::: Ptr ( TH.mkName "ty_2" ) ::: VNil ) allInsts
+      = False
+      | otherwise
+      = True
+
+-- | The type of one of the "prove" functions.
+--
+-- Example:
+--
+-- @singAdd :: SType rec ty1 -> SType rec ty2 -> ( SType rec ( AddRes ty1 ty2 ), ty1 -> ty2 -> AddRes ty1 ty2 )@
+proveType :: Int -> Either TH.Type AssocTyFam -> TH.Type
+proveType nbArgs resFam =
+  TH.ForallT
+    ( map mkTv ( TH.mkName "rec" : tvs ) )
+    [ TH.ConT ''GEq `TH.AppT` TH.VarT ( TH.mkName "rec" ) ] $ go 1
+  where
+    tvs = [ TH.mkName $ "ty_" ++ show j | j <- [ 1 .. nbArgs ] ]
+    mkTv tv = TH.PlainTV tv TH.SpecifiedSpec
+
+    mkFunTy [] res = res
+    mkFunTy (a:as) res = TH.ArrowT `TH.AppT` a `TH.AppT` (mkFunTy as res)
+
+    resTy =
+      case resFam of
+        Left ty -> ty
+        Right AssocTyFam
+          { assocTyFamName = famNm
+          , assocTyFamArgs = famArgs
+          } -> case famArgs of
+            SameArgs     -> foldl' TH.AppT ( TH.ConT famNm ) ( map TH.VarT tvs )
+            FirstArgOnly -> ( TH.ConT famNm ) `TH.AppT` ( TH.VarT $ TH.mkName "ty_1" )
+
+    go i
+      | i > nbArgs
+      = TH.TupleT 2 `TH.AppT` mkSingTy resTy `TH.AppT` ( mkFunTy ( map TH.VarT tvs ) resTy )
+      | otherwise
+      = TH.ArrowT `TH.AppT` ( mkSingTy $ TH.VarT ( TH.mkName $ "ty_" ++ show i ) ) `TH.AppT` go ( i + 1 )
+
+-- | Generate one TH declaration for a class instance.
+genInstance
+  :: forall n
+  .  TH.Name
+     -- ^ class name
+  -> Maybe AssocTyFam
+     -- ^ optional associated type family definition
+  -> Vec n ( Type TH.Name )
+     -- ^ class instance argument types
+  -> Type TH.Name
+     -- ^ result type
+  -> OpImpl n
+     -- ^ class instance implementation strategy
+  -> [ ClassMethod ]
+     -- ^ class methods
+  -> TH.Q ( TH.Dec, [ ( TH.Name, TH.Clause ) ] )
+genInstance cls fam argTys resTy methImpl meths = do
+  let clsTy :: TH.Type
+      clsTy = mkTcApp cls argTys
+      famDecs :: [ TH.Dec ]
+      famDecs =
+        [ TH.TySynInstD $
+            TH.TySynEqn Nothing ( mkTcApp famName args ) ( mkTcApp famImplName args )
+        | AssocTyFam
+           { assocTyFamName     = famName
+           , assocTyFamImplName = famImplName
+           , assocTyFamArgs     = assocArgs
+           } <- maybeToList fam
+        , let args :: [ Type TH.Name ]
+              args =
+               case assocArgs of
+                  SameArgs -> toList argTys
+                  FirstArgOnly ->
+                    case argTys of
+                      VNil -> []
+                      ( a ::: _ ) -> [ a ]
+
+        ]
+      methDecs :: [ TH.Dec ]
+      proveDecs :: [ ( TH.Name, TH.Clause ) ]
+      ( methDecs, proveDecs ) = unzip
+        -- NB: use scoped type variables in the function, because Template Haskell
+        -- doesn't support generating instances with explicit quantification
+        -- (https://gitlab.haskell.org/ghc/ghc/-/issues/21794).
+        --
+        -- We would want:
+        --
+        -- instance forall ty1 ty2. Sub (Ptr ty1) (Ptr ty2) where
+        --   (-) x y = ... @(SubRes (Ptr ty1) (Ptr ty2))
+        --
+        -- but we instead generate:
+        --
+        -- instance Sub (Ptr ty1) (Ptr ty2) where
+        --   (-) (x :: Ptr ty1) (y :: Ptr ty2) = ... @(SubRes (Ptr ty1) (Ptr ty2))
+        [ ( TH.FunD meth [ TH.Clause ( map ( \ ( arg, ty ) -> TH.SigP ( TH.VarP arg ) ( mkType ty ) ) args ) ( TH.NormalB body ) [ ] ]
+          , ( proveNm,
+                TH.Clause provePats
+                  ( case mbProveGuard of
+                      Nothing -> TH.NormalB proveRes
+                      Just g -> TH.GuardedB [ ( g, proveRes ) ]
+                  )
+                  []
+            )
+          )
+        | ClassMethod
+            { methodName   = meth
+            , proveName    = proveStr
+            , methodNbArgs = nbArgs
+            , methodFn     = fn
+            } <- meths
+        , let argNms :: [ TH.Name ]
+              argNms = map ( TH.mkName . ( "a" ++ ) . show ) [ 1 .. nbArgs ]
+              args :: [ ( TH.Name, Type TH.Name ) ]
+              args = zip argNms ( toList argTys )
+
+              proveNm = TH.mkName proveStr
+              ( provePats, mbProveGuard ) = mkSingPats ( toList argTys )
+              proveRes = TH.TupE [ Just ( mkSingExp resTy ), Just $ TH.VarE meth ]
+
+              mkConversions :: [ Conversion ] -> TH.Exp -> TH.Exp
+              mkConversions [] e = e
+              mkConversions (c1 : cs) e = mkConversions cs ( mkConversion c1 e )
+              mkConversion :: Conversion -> TH.Exp -> TH.Exp
+              mkConversion c e = ( `TH.AppE` e ) $ case c of
+                FromIntegralTo { fromIntegralTo = to } ->
+                  TH.VarE 'Prelude.fromIntegral `TH.AppTypeE` TH.WildCardT `TH.AppTypeE` mkType (fmap absurd to)
+                RealToFracTo   { realToFracTo   = to } ->
+                  TH.VarE 'Prelude.realToFrac `TH.AppTypeE` TH.WildCardT `TH.AppTypeE` mkType (fmap absurd to)
+                PtrToInt ->
+                  TH.LamE [ TH.ConP 'Foreign.C.Ptr [] [ TH.VarP ( TH.mkName "ptr" ) ] ]
+                      ( TH.AppE ( TH.ConE 'I# ) $
+                        TH.AppE ( TH.VarE 'addr2Int# ) ( TH.VarE $ TH.mkName "ptr" ) )
+              body =
+                case methImpl of
+                  ConvertThenOp convs ->
+                    foldl' TH.AppE fn $
+                      zipWith mkConversions ( toList convs ) ( map TH.VarE argNms )
+                  AddIntegralAndPtr ->
+                    case argNms of
+                      [ i, p ] ->
+                        TH.VarE 'plusPtr
+                            `TH.AppE`
+                          ( TH.VarE p )
+                            `TH.AppE`
+                          ( TH.VarE 'fromIntegral `TH.AppE` TH.VarE i )
+                      _ -> error $ "genInstance AddIntegralAndPtr: expected 2 arguments, but got: " ++ show args
+                  AddPtrAndIntegral ->
+                    case argNms of
+                      [ p, i ] ->
+                        TH.VarE 'plusPtr
+                            `TH.AppE`
+                          ( TH.VarE p )
+                            `TH.AppE`
+                          ( TH.VarE 'fromIntegral `TH.AppE` TH.VarE i )
+                      _ -> error $ "genInstance AddPtrAndIntegral: expected 2 arguments, but got: " ++ show args
+                  SubPtrAndPtr ->
+                    case argNms of
+                      [ p1, p2 ] ->
+                        ( TH.VarE 'fromIntegral `TH.AppTypeE` TH.WildCardT `TH.AppTypeE` TH.ConT ''CPtrdiff )
+                            `TH.AppE`
+                          ( TH.VarE 'minusPtr `TH.AppE` TH.VarE p1 `TH.AppE` TH.VarE p2 )
+                      _ -> error $ "genInstance SubPtrAndPtr: expected 2 arguments, but got: " ++ show args
+                  SubPtrAndIntegral ->
+                    case argNms of
+                      [ p, i ] ->
+                        TH.VarE 'plusPtr
+                            `TH.AppE`
+                          ( TH.VarE p )
+                            `TH.AppE`
+                          ( TH.VarE 'fromIntegral `TH.AppE` ( TH.VarE 'Prelude.negate `TH.AppE` TH.VarE i ) )
+                      _ -> error $ "genInstance SubPtrAndIntegral: expected 2 arguments, but got: " ++ show args
+        ]
+      overlap :: Maybe TH.Overlap
+      overlap = Nothing
+      ctxt :: [ TH.Type ]
+      ctxt = [ ]
+  return $
+    ( TH.InstanceD overlap ctxt clsTy ( famDecs ++ methDecs )
+    , proveDecs
+    )
+
+--------------------------------------------------------------------------------
+-- Util
+
+mkNames :: Vec n ( Type OpaqueTy ) -> Vec n ( Type TH.Name )
+mkNames = fmap $ fmap $ \ ( OpaqueTy i ) -> TH.mkName ( "ty_" ++ show i )
+
+mkTcApp :: Foldable f => TH.Name -> f ( Type TH.Name ) -> TH.Type
+mkTcApp tc args =
+  foldl' ( \ a t -> TH.AppT a ( mkType t ) ) ( TH.ConT tc ) args
+
+mkType :: Type TH.Name -> TH.Type
+mkType = \case
+  Void -> TH.ConT ''()
+  Ptr ty -> TH.AppT ( TH.ConT ''Ptr ) ( TH.VarT ty )
+  Arithmetic a ->
+    mkArithmeticType a
+
+mkSingTy :: TH.Type -> TH.Type
+mkSingTy ty = ( TH.ConT ''SType ) `TH.AppT` TH.VarT ( TH.mkName "rec" ) `TH.AppT` ty
+
+mkSingPats :: [ Type TH.Name ] -> ( [ TH.Pat ], Maybe TH.Guard )
+mkSingPats tys = ( map ( mkSingPat . mkOne ) tickedTys, if null guards then Nothing else Just $ TH.PatG guards )
+  where
+    tickedTys = mkTicked 0 tys
+    mkTicked :: Int -> [ Type TH.Name ] -> [ Either ( TH.Name, Int ) ( Type TH.Name ) ]
+    mkTicked _ [] = []
+    mkTicked i ( Ptr nm : rest ) = Left ( nm, i ) : mkTicked ( i + 1 )rest
+    mkTicked i ( ty : rest ) = Right ty : mkTicked i rest
+    mkOne ( Left ( nm, i ) ) = Ptr $ mkTickedName nm i
+    mkOne ( Right ty ) = ty
+    guards = concat $ mapMaybe mkGroup $ groupBy ( (==) `on` fst ) $ mapMaybe oneGuard tickedTys
+    mkGroup :: NE.NonEmpty ( TH.Name, Int ) -> Maybe [ TH.Stmt ]
+    mkGroup ( _ NE.:| [] ) = Nothing
+    mkGroup ( ( nm, i ) NE.:| ( fmap snd -> js ) ) =
+      Just
+        [ TH.BindS
+           ( TH.ConP 'Just [] [ TH.ConP 'Refl [] [] ] )
+           ( TH.VarE 'geq `TH.AppE` TH.VarE ( mkTickedName nm i ) `TH.AppE` TH.VarE ( mkTickedName nm j ) )
+        | j <- js ]
+    mkTickedName nm i = TH.mkName $ show nm ++ replicate i '\''
+    oneGuard ( Left ( nm, i ) ) = Just ( nm, i )
+    oneGuard _                  = Nothing
+
+mkSingPat :: Type TH.Name -> TH.Pat
+mkSingExp :: Type TH.Name -> TH.Exp
+( mkSingPat, mkSingExp ) =
+  ( go_type TH.VarP ( \ c -> TH.ConP c [] [] ) ( \ c a -> TH.ConP c [] [a] )
+  , go_type TH.VarE TH.ConE ( \ c e -> TH.AppE ( TH.ConE c ) e )
+  )
+  where
+    go_type var con conapp = \case
+      Void -> con 'SVoid
+      Ptr ty -> conapp 'SPtr ( var ty )
+      Arithmetic a -> conapp 'SArithmetic $ go_arith a
+
+        where
+
+        go_arith = \case
+          Integral i -> conapp 'SIntegral $ go_integral i
+          FloatLike f -> conapp 'SFloatLike $ go_floatlike f
+        go_integral = \case
+          Bool -> con 'SBool
+          CharLike c -> conapp 'SCharLike $ go_charlike c
+          IntLike i -> conapp 'SIntLike $ go_intlike i
+        go_floatlike = \case
+          FloatType -> con 'SFloatType
+          DoubleType -> con 'SDoubleType
+        go_charlike = \case
+          Char -> con 'S_Char
+          SChar -> con 'S_SChar
+          UChar -> con 'S_UChar
+        go_intlike = \case
+          Short s ->
+            case s of
+              Signed -> con 'SShort
+              Unsigned -> con 'SUShort
+          Int s ->
+            case s of
+              Signed -> con 'SInt
+              Unsigned -> con 'SUInt
+          Long s ->
+            case s of
+              Signed -> con 'SLong
+              Unsigned -> con 'SULong
+          LongLong s ->
+            case s of
+              Signed -> con 'SLongLong
+              Unsigned -> con 'SULongLong
+          PtrDiff -> con 'SPtrDiff
+
+mkArithmeticType :: ArithmeticType -> TH.Type
+mkArithmeticType ( Integral i ) = mkIntegralType i
+mkArithmeticType ( FloatLike f ) =
+  TH.ConT $
+    case f of
+      FloatType  -> ''CFloat
+      DoubleType -> ''CDouble
+
+mkIntegralType :: IntegralType -> TH.Type
+mkIntegralType = \case
+  Bool -> TH.ConT ''CBool
+  CharLike c -> TH.ConT $
+    case c of
+      Char  -> ''CChar
+      SChar -> ''CSChar
+      UChar -> ''CUChar
+  IntLike i ->
+    mkIntLikeType i
+
+mkIntLikeType :: IntLikeType -> TH.Type
+mkIntLikeType = TH.ConT . \case
+  Short    s ->
+    case s of
+      Signed   -> ''CShort
+      Unsigned -> ''CUShort
+  Int      s ->
+    case s of
+      Signed   -> ''CInt
+      Unsigned -> ''CUInt
+  Long     s ->
+    case s of
+      Signed   -> ''CLong
+      Unsigned -> ''CULong
+  LongLong s ->
+    case s of
+      Signed   -> ''CLLong
+      Unsigned -> ''CULLong
+  PtrDiff -> ''CPtrdiff
diff --git a/runtime-cexpr/C/Operators.hs b/runtime-cexpr/C/Operators.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Operators.hs
@@ -0,0 +1,29 @@
+module C.Operators (
+  -- * C operators and their types
+  Op (..),
+  UnaryOp (..),
+  BinaryOp (..),
+  pprOp,
+  pprOpApp,
+  opResType,
+) where
+
+import Data.Vec.Lazy
+
+import C.Operator.Internal
+import C.Type
+
+--------------------------------------------------------------------------------
+
+-- | Compute the result type of a C operator applied to
+-- arguments of the given types.
+opResType
+  :: (Eq a)
+  => Platform
+  -> Op arity
+  -- ^ C operator
+  -> Vec arity (Type a)
+  -- ^ types of its arguments
+  -> Maybe (Type a)
+opResType plat op args =
+  fst <$> opResTypeAndImpl plat op args
diff --git a/runtime-cexpr/C/Type.hs b/runtime-cexpr/C/Type.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Type.hs
@@ -0,0 +1,605 @@
+{-# LANGUAGE ConstraintKinds #-}
+{-# LANGUAGE PartialTypeSignatures #-}
+{-# LANGUAGE QuantifiedConstraints #-}
+{-# LANGUAGE RankNTypes #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE StandaloneDeriving #-}
+
+module C.Type (
+  -- * C types
+  Type (..),
+  ArithmeticType (..),
+  IntegralType (..),
+  CharLikeType (..),
+  IntLikeType (..),
+  Sign (..),
+  FloatingType (..),
+  IntegerConversionRank (..),
+  intLikeTypeSign,
+  charLikeTypeSizeInBits,
+  intLikeTypeSizeInBits,
+  intLikeTypeConversionRank,
+  intLikeTypeFitsInInt,
+  showTypeAsCType,
+
+  -- * Platform
+  Platform (..),
+  WordWidth (..),
+  OS (..),
+  hostPlatform,
+
+  -- * Singletons for C types
+  SType (..),
+  SArithmeticType (..),
+  SIntegralType (..),
+  SCharLikeType (..),
+  SIntLikeType (..),
+  SFloatingType (..),
+
+  -- ** Promotion
+  promoteType,
+  promoteArithmeticType,
+  promoteIntegralType,
+  promoteCharLikeType,
+  promoteIntLikeType,
+  promoteFloatingType,
+
+  -- ** Demotion
+  demoteType,
+  demoteArithmeticType,
+  demoteIntegralType,
+  demoteCharLikeType,
+  demoteIntLikeType,
+  demoteFloatingType,
+
+  -- ** Utilities
+  witnessType,
+  witnessArithmeticType,
+  witnessFloatingType,
+  witnessIntegralType,
+  witnessCharLike,
+  witnessIntLike,
+) where
+
+import Data.GADT.Compare
+import Data.Kind qualified as Hs
+import Data.Semigroup (Arg (..))
+import Data.Type.Equality
+import Foreign.C.Types
+import Foreign.Ptr qualified as Foreign (Ptr)
+import Foreign.Storable (sizeOf)
+import GHC.Generics (Generic)
+import System.Info qualified (os)
+
+--------------------------------------------------------------------------------
+
+data Type a
+  = Void
+  | Arithmetic !ArithmeticType
+  | Ptr !a
+  deriving stock (Eq, Foldable, Functor, Generic, Ord, Show, Traversable)
+
+data ArithmeticType
+  = Integral !IntegralType
+  | FloatLike !FloatingType
+  deriving stock (Eq, Generic, Ord, Show)
+
+data FloatingType = FloatType | DoubleType
+  deriving stock (Eq, Generic, Ord, Show)
+
+data IntegralType
+  = Bool
+  | CharLike !CharLikeType
+  | IntLike !IntLikeType
+  deriving stock (Eq, Generic, Ord, Show)
+
+data CharLikeType = Char | SChar | UChar
+  deriving stock (Eq, Generic, Ord, Show)
+
+data Sign = Signed | Unsigned
+  deriving stock (Eq, Generic, Ord, Show)
+
+data IntLikeType
+  = Short !Sign
+  | Int !Sign
+  | Long !Sign
+  | LongLong !Sign
+  | PtrDiff
+  deriving stock (Eq, Generic, Ord, Show)
+
+--------------------------------------------------------------------------------
+
+data WordWidth = WordWidth32 | WordWidth64
+  deriving stock (Eq, Generic, Ord, Show)
+
+wordWidthInBits :: WordWidth -> Word
+wordWidthInBits = \case
+  WordWidth32 -> 32
+  WordWidth64 -> 64
+
+data OS = Windows | Posix
+  deriving stock (Eq, Generic, Ord, Show)
+
+data Platform = Platform
+  { platformWordWidth :: !WordWidth
+  , platformOS :: !OS
+  }
+  deriving stock (Eq, Generic, Show)
+
+hostPlatform :: Platform
+hostPlatform =
+  Platform
+    { platformWordWidth =
+        case sizeOf @(Foreign.Ptr ()) undefined of
+          4 -> WordWidth32
+          8 -> WordWidth64
+          w -> error $ "hostPlatform: unsupported word width (" ++ show (8 * w) ++ " bits)"
+    , platformOS =
+        case System.Info.os of
+          "mingw32" -> Windows
+          _ -> Posix
+    }
+
+newtype IntegerConversionRank = IntegerConversionRank Rational
+  deriving stock (Eq, Generic, Ord, Show)
+
+intLikeTypeSign :: IntLikeType -> Sign
+intLikeTypeSign = \case
+  Short s -> s
+  Int s -> s
+  Long s -> s
+  LongLong s -> s
+  PtrDiff -> Signed
+
+charLikeTypeSizeInBits :: Platform -> CharLikeType -> Word
+charLikeTypeSizeInBits _ = \case
+  -- NB: this would need to change if we wanted to support
+  -- platforms on which char is not 8 bits wide.
+  Char -> 8
+  SChar -> 8
+  UChar -> 8
+
+intLikeTypeSizeInBits :: Platform -> IntLikeType -> Word
+intLikeTypeSizeInBits plat i =
+  case platformWordWidth plat of
+    WordWidth32 ->
+      case i of
+        Short{} -> 16
+        Int{} -> 32
+        Long{} -> 32
+        LongLong{} -> 64
+        PtrDiff -> 32
+    WordWidth64 ->
+      case i of
+        Short{} -> 16
+        Int{} -> 32
+        Long{} ->
+          case platformOS plat of
+            Windows -> 32
+            Posix -> 64
+        LongLong{} -> 64
+        PtrDiff -> 64
+
+intLikeTypeConversionRank :: Platform -> IntLikeType -> IntegerConversionRank
+intLikeTypeConversionRank plat =
+  IntegerConversionRank . \case
+    -- Rules for integer conversion ranks:
+    --
+    --  1. No two signed integer types other than char and signed char (if char is signed)
+    --     have the same rank, even if they have the same representation.
+    --  2. The rank of a signed integer type is greater than the rank of any
+    --     signed integer type with a smaller width.
+    --  3. The ranks of char/short/int/long/long long increase in order.
+    --  4. The rank of any unsigned integer type equals the rank of the
+    --     corresponding signed integer type.
+    --  5. The rank of any standard integer type is greater than the rank of
+    --     any extended integer type with the same width.
+    --  6. The rank of bool is less than the rank of all standard integer types.
+    --  7. The rank of any extended signed integer type relative to another extended
+    --     signed integer type with the same width is implementation-defined.
+
+    -- Standard integer types.
+    -- Implement (3), ignoring sign as per (4).
+    Short{} -> 3
+    Int{} -> 4
+    Long{} -> 5
+    LongLong{} -> 6
+    -- Extended types.
+    _extended_ty ->
+      -- The following logic comes from (1) and (5), which dictate that the
+      -- integer conversion rank of ptrdiff_t and size_t must be:
+      --
+      --  (a) strictly greater than the integer conversion rank of any
+      --      standard integer type whose size is less than the word width,
+      --  (b) strictly less than the integer conversion rank of any standard
+      --      integer type whose size is greater than or equal to the word width.
+      case minimum
+        [ Arg rk ty
+        | ty <- [Short Signed, Int Signed, Long Signed, LongLong Signed]
+        , let sz = intLikeTypeSizeInBits plat ty
+              rk = intLikeTypeConversionRank plat ty
+        , sz >= wordWidthInBits (platformWordWidth plat)
+        ] of
+        Arg (IntegerConversionRank rk) _ ->
+          rk - 0.5
+
+-- 0.5 is an arbitrary value in the open interval ]0,1[
+--
+-- This assumes that the standard integer types are given
+-- integral integer conversion ranks.
+
+-- | Does the given 'IntLikeType' fit inside the (signed) @int@ type
+-- on this platform?
+intLikeTypeFitsInInt :: Platform -> IntLikeType -> Bool
+intLikeTypeFitsInInt plat ty =
+  -- TODO: this logic is questionable, as in theory I think we could have
+  -- an 'IntLike' type of a small size but of an entirely distinct range,
+  -- e.g. an 8-bit unsigned integer type that can store values in the range
+  -- [2^32, 2^32+2^8-1].
+  case intLikeTypeSign ty of
+    Signed ->
+      sz <= intSz
+    Unsigned ->
+      sz < intSz
+ where
+  sz, intSz :: Word
+  sz = intLikeTypeSizeInBits plat ty
+  intSz = intLikeTypeSizeInBits plat (Int Signed)
+
+--------------------------------------------------------------------------------
+
+showTypeAsCType :: (Show a) => Type a -> String -> String
+showTypeAsCType ty s =
+  case ty of
+    Void -> "void" +++ s
+    Arithmetic a -> showArithmeticTypeAsCType a +++ s
+    Ptr a -> addStar (show a) ++ s
+ where
+  x +++ "" = x
+  x +++ y = x ++ " " ++ y
+  addStar x@(_ : _)
+    | last x == '*' =
+        x ++ "*"
+  addStar x =
+    x ++ " *"
+
+showArithmeticTypeAsCType :: ArithmeticType -> String
+showArithmeticTypeAsCType = \case
+  Integral i ->
+    showIntegralTypeAsCType i
+  FloatLike f ->
+    case f of
+      FloatType -> "float"
+      DoubleType -> "double"
+
+showIntegralTypeAsCType :: IntegralType -> String
+showIntegralTypeAsCType = \case
+  Bool -> "bool"
+  CharLike c ->
+    case c of
+      Char -> "char"
+      SChar -> "signed char"
+      UChar -> "unsigned char"
+  IntLike i ->
+    showIntLikeTypeAsCType i
+
+showIntLikeTypeAsCType :: IntLikeType -> String
+showIntLikeTypeAsCType = \case
+  Short s -> withSign s "short"
+  Int s -> withSign s "int"
+  Long s -> withSign s "long"
+  LongLong s -> withSign s "long long"
+  PtrDiff -> "ptrdiff_t"
+ where
+  withSign s = case s of
+    Signed -> id
+    Unsigned -> ("unsigned " ++)
+
+--------------------------------------------------------------------------------
+-- Singletons
+
+type SType :: (Hs.Type -> Hs.Type) -> Hs.Type -> Hs.Type
+data SType rec a where
+  SVoid :: SType rec ()
+  SArithmetic :: !(SArithmeticType ty) -> SType rec ty
+  SPtr :: rec ty -> SType rec (Foreign.Ptr ty)
+deriving stock instance (forall x. Show (rec x)) => Show (SType rec a)
+
+data SArithmeticType ty where
+  SIntegral :: !(SIntegralType ty) -> SArithmeticType ty
+  SFloatLike :: !(SFloatingType ty) -> SArithmeticType ty
+deriving stock instance Show (SArithmeticType ty)
+
+data SFloatingType ty where
+  SFloatType :: SFloatingType CFloat
+  SDoubleType :: SFloatingType CDouble
+deriving stock instance Show (SFloatingType ty)
+
+data SIntegralType ty where
+  SBool :: SIntegralType CBool
+  SCharLike :: !(SCharLikeType ty) -> SIntegralType ty
+  SIntLike :: !(SIntLikeType ty) -> SIntegralType ty
+deriving stock instance Show (SIntegralType ty)
+
+data SCharLikeType ty where
+  S_Char :: SCharLikeType CChar
+  S_SChar :: SCharLikeType CSChar
+  S_UChar :: SCharLikeType CUChar
+deriving stock instance Show (SCharLikeType ty)
+
+data SIntLikeType ty where
+  SShort :: SIntLikeType CShort
+  SUShort :: SIntLikeType CUShort
+  SInt :: SIntLikeType CInt
+  SUInt :: SIntLikeType CUInt
+  SLong :: SIntLikeType CLong
+  SULong :: SIntLikeType CULong
+  SLongLong :: SIntLikeType CLLong
+  SULongLong :: SIntLikeType CULLong
+  SPtrDiff :: SIntLikeType CPtrdiff
+
+-- NB: make sure to update 'GEq SIntLikeType' when updating this datatype
+deriving stock instance Show (SIntLikeType ty)
+
+instance (GEq rec) => GEq (SType rec) where
+  geq SVoid SVoid = Just Refl
+  geq (SArithmetic a) (SArithmetic b) = geq a b
+  geq (SPtr a) (SPtr b) =
+    case geq a b of
+      Just Refl -> Just Refl
+      Nothing -> Nothing
+  geq _ _ = Nothing
+instance GEq SArithmeticType where
+  geq (SIntegral a) (SIntegral b) = geq a b
+  geq (SFloatLike a) (SFloatLike b) = geq a b
+  geq _ _ = Nothing
+
+instance GEq SFloatingType where
+  geq SFloatType SFloatType = Just Refl
+  geq SDoubleType SDoubleType = Just Refl
+  geq _ _ = Nothing
+instance GEq SCharLikeType where
+  geq S_Char S_Char = Just Refl
+  geq S_SChar S_SChar = Just Refl
+  geq S_UChar S_UChar = Just Refl
+  geq _ _ = Nothing
+
+instance GEq SIntegralType where
+  geq SBool SBool = Just Refl
+  geq (SCharLike a) (SCharLike b) = geq a b
+  geq (SIntLike a) (SIntLike b) = geq a b
+  geq _ _ = Nothing
+
+instance GEq SIntLikeType where
+  geq SShort SShort = Just Refl
+  geq SUShort SUShort = Just Refl
+  geq SInt SInt = Just Refl
+  geq SUInt SUInt = Just Refl
+  geq SLong SLong = Just Refl
+  geq SULong SULong = Just Refl
+  geq SLongLong SLongLong = Just Refl
+  geq SULongLong SULongLong = Just Refl
+  geq SPtrDiff SPtrDiff = Just Refl
+  geq _ _ = Nothing
+
+promoteType
+  :: (a -> (forall ty. rec ty -> r) -> r)
+  -> Type a
+  -> (forall ty. (Ord ty, Show ty) => SType rec ty -> r)
+  -> r
+promoteType recur ty f = case ty of
+  Void -> f SVoid
+  Arithmetic i -> promoteArithmeticType i (f . SArithmetic)
+  Ptr p -> recur p (f . SPtr)
+
+promoteArithmeticType
+  :: ArithmeticType -> (forall ty. (Ord ty, Show ty) => SArithmeticType ty -> r) -> r
+promoteArithmeticType ty f = case ty of
+  Integral t -> promoteIntegralType t (f . SIntegral)
+  FloatLike t -> promoteFloatingType t (f . SFloatLike)
+
+promoteFloatingType
+  :: FloatingType -> (forall ty. (Ord ty, Show ty) => SFloatingType ty -> r) -> r
+promoteFloatingType ty f = case ty of
+  FloatType -> f SFloatType
+  DoubleType -> f SDoubleType
+
+promoteIntegralType
+  :: IntegralType -> (forall ty. (Show ty, Integral ty) => SIntegralType ty -> r) -> r
+promoteIntegralType ty f = case ty of
+  Bool -> f SBool
+  CharLike c -> promoteCharLikeType c (f . SCharLike)
+  IntLike i -> promoteIntLikeType i (f . SIntLike)
+
+promoteCharLikeType
+  :: CharLikeType -> (forall ty. (Show ty, Integral ty) => SCharLikeType ty -> r) -> r
+promoteCharLikeType ty f = case ty of
+  Char -> f S_Char
+  UChar -> f S_UChar
+  SChar -> f S_SChar
+
+promoteIntLikeType
+  :: IntLikeType -> (forall ty. (Show ty, Integral ty) => SIntLikeType ty -> r) -> r
+promoteIntLikeType ty f = case ty of
+  Short s ->
+    case s of
+      Signed -> f SShort
+      Unsigned -> f SUShort
+  Int s ->
+    case s of
+      Signed -> f SInt
+      Unsigned -> f SUInt
+  Long s ->
+    case s of
+      Signed -> f SLong
+      Unsigned -> f SULong
+  LongLong s ->
+    case s of
+      Signed -> f SLongLong
+      Unsigned -> f SULongLong
+  PtrDiff -> f SPtrDiff
+
+demoteType :: (forall ty'. rec ty' -> a) -> SType rec ty -> Type a
+demoteType recur = \case
+  SVoid -> Void
+  SArithmetic a -> Arithmetic $ demoteArithmeticType a
+  SPtr a -> Ptr $ recur a
+
+demoteArithmeticType :: SArithmeticType ty -> ArithmeticType
+demoteArithmeticType = \case
+  SIntegral i -> Integral $ demoteIntegralType i
+  SFloatLike f -> FloatLike $ demoteFloatingType f
+
+demoteIntegralType :: SIntegralType ty -> IntegralType
+demoteIntegralType = \case
+  SBool -> Bool
+  SCharLike c -> CharLike $ demoteCharLikeType c
+  SIntLike i -> IntLike $ demoteIntLikeType i
+
+demoteFloatingType :: SFloatingType ty -> FloatingType
+demoteFloatingType = \case
+  SFloatType -> FloatType
+  SDoubleType -> DoubleType
+
+demoteCharLikeType :: SCharLikeType ty -> CharLikeType
+demoteCharLikeType = \case
+  S_Char -> Char
+  S_UChar -> UChar
+  S_SChar -> SChar
+
+demoteIntLikeType :: SIntLikeType ty -> IntLikeType
+demoteIntLikeType = \case
+  SShort -> Short Signed
+  SUShort -> Short Unsigned
+  SInt -> Int Signed
+  SUInt -> Int Unsigned
+  SLong -> Long Signed
+  SULong -> Long Unsigned
+  SLongLong -> LongLong Signed
+  SULongLong -> LongLong Unsigned
+  SPtrDiff -> PtrDiff
+
+witnessType
+  :: forall c ty rec r
+   . ( forall x. c (Foreign.Ptr x)
+     , c CChar
+     , c CSChar
+     , c CUChar
+     , c CShort
+     , c CUShort
+     , c CInt
+     , c CUInt
+     , c CLong
+     , c CULong
+     , c CLLong
+     , c CULLong
+     , c CPtrdiff
+     , c CSize
+     , c CBool
+     , c CFloat
+     , c CDouble
+     , c ()
+     )
+  => (forall ty'. rec ty' -> ((c ty') => r) -> r)
+  -> SType rec ty
+  -> ((c ty) => r)
+  -> r
+witnessType recur ty f =
+  case ty of
+    SVoid -> f
+    SArithmetic i -> witnessArithmeticType @c i f
+    SPtr p -> recur p f
+
+witnessArithmeticType
+  :: forall c ty r
+   . ( c CChar
+     , c CSChar
+     , c CUChar
+     , c CShort
+     , c CUShort
+     , c CInt
+     , c CUInt
+     , c CLong
+     , c CULong
+     , c CLLong
+     , c CULLong
+     , c CPtrdiff
+     , c CSize
+     , c CBool
+     , c CFloat
+     , c CDouble
+     )
+  => SArithmeticType ty -> ((c ty) => r) -> r
+witnessArithmeticType ty f =
+  case ty of
+    SIntegral i -> witnessIntegralType @c i f
+    SFloatLike k -> witnessFloatingType @c k f
+
+witnessFloatingType
+  :: forall c ty r
+   . (c CFloat, c CDouble)
+  => SFloatingType ty -> ((c ty) => r) -> r
+witnessFloatingType ty f =
+  case ty of
+    SFloatType -> f
+    SDoubleType -> f
+
+witnessIntegralType
+  :: forall c ty r
+   . ( c CChar
+     , c CSChar
+     , c CUChar
+     , c CShort
+     , c CUShort
+     , c CInt
+     , c CUInt
+     , c CLong
+     , c CULong
+     , c CLLong
+     , c CULLong
+     , c CPtrdiff
+     , c CSize
+     , c CBool
+     )
+  => SIntegralType ty -> ((c ty) => r) -> r
+witnessIntegralType ty f =
+  case ty of
+    SBool -> f
+    SCharLike c -> witnessCharLike @c c f
+    SIntLike i -> witnessIntLike @c i f
+
+witnessCharLike
+  :: forall c ty r
+   . (c CChar, c CSChar, c CUChar)
+  => SCharLikeType ty -> ((c ty) => r) -> r
+witnessCharLike ty f =
+  case ty of
+    S_Char -> f
+    S_SChar -> f
+    S_UChar -> f
+
+witnessIntLike
+  :: forall c ty r
+   . ( c CShort
+     , c CUShort
+     , c CInt
+     , c CUInt
+     , c CLong
+     , c CULong
+     , c CLLong
+     , c CULLong
+     , c CPtrdiff
+     , c CSize
+     )
+  => SIntLikeType ty -> ((c ty) => r) -> r
+witnessIntLike ty f =
+  case ty of
+    SShort -> f
+    SUShort -> f
+    SInt -> f
+    SUInt -> f
+    SLong -> f
+    SULong -> f
+    SLongLong -> f
+    SULongLong -> f
+    SPtrDiff -> f
diff --git a/runtime-cexpr/C/Type/Internal/Universe.hs b/runtime-cexpr/C/Type/Internal/Universe.hs
new file mode 100644
--- /dev/null
+++ b/runtime-cexpr/C/Type/Internal/Universe.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+-- | **Internal** module listing out all n-tuples of types
+-- for the purposes of generating code with Template Haskell
+-- and for testing.
+module C.Type.Internal.Universe (
+  OpaqueTy (..),
+  enumerateTypeTuples,
+  allArithmeticTypes,
+  allIntegralTypes,
+  allIntLikeTypes,
+) where
+
+import Data.Functor ((<&>))
+import Data.Type.Nat qualified as Fin
+import Data.Vec.Lazy (Vec (..))
+import Data.Vec.Lazy qualified as Vec (snoc)
+import GHC.Generics (Generic)
+
+import C.Type
+
+--------------------------------------------------------------------------------
+
+-- | Helper type to use 'Fin.induction' on.
+newtype F n = F {unF :: [(Vec n (Type OpaqueTy), Maybe Int)]}
+
+-- | An opaque named type with a unique identifier.
+newtype OpaqueTy = OpaqueTy Int
+  deriving stock (Eq, Generic, Ord, Show)
+
+-- | Enumerate all tuples of types.
+--
+-- For example, for @n = 2@, this will list out pairs of types.
+-- This list will include all pairwise combination of primitive types,
+-- and also two pairs of pointer types:
+--
+--  - @( Ptr ty_1, Ptr ty_2 )@ – pointers to different types,
+--  - @( Ptr ty_1, Ptr ty_1 )@ – pointers to the same type.
+--
+-- This is used for generating type family and class instances.
+enumerateTypeTuples :: forall n. (Fin.SNatI n) => [Vec n (Type OpaqueTy)]
+enumerateTypeTuples =
+  fmap fst $
+    unF $
+      Fin.induction
+        (F [(VNil, Nothing)])
+        ( \((F prev) :: F m) -> F $ do
+            (tys, mbLastUsedTyVarNumber) <- prev
+            let m = case mbLastUsedTyVarNumber of
+                  Nothing -> 1
+                  Just i -> i + 1
+            (ty, mbNextUsedTyVar) <- allTypes m
+            let mbUsedTv = maxMaybe mbLastUsedTyVarNumber mbNextUsedTyVar
+            return (Vec.snoc tys ty, mbUsedTv)
+        )
+
+maxMaybe :: (Ord i) => Maybe i -> Maybe i -> Maybe i
+maxMaybe (Just i) (Just j) = Just $ max i j
+maxMaybe j@(Just{}) Nothing = j
+maxMaybe Nothing r = r
+
+allTypes :: Int -> [(Type OpaqueTy, Maybe Int)]
+allTypes n =
+  fmap ((,Nothing) . Arithmetic) allArithmeticTypes
+    ++ (Void, Nothing)
+    : [(Ptr (OpaqueTy i), Just i) | i <- [1 .. n]]
+
+-- For unary functions, just have a single pointer type "Ptr a".
+-- For binary functions, the first argument has "Ptr a1",
+-- while the second argument has both "Ptr a1" and "Ptr a2".
+-- etc
+
+allArithmeticTypes :: [ArithmeticType]
+allArithmeticTypes =
+  fmap FloatLike [FloatType, DoubleType]
+    ++ fmap Integral allIntegralTypes
+
+allIntegralTypes :: [IntegralType]
+allIntegralTypes = Bool : fmap CharLike [Char, SChar, UChar] ++ fmap IntLike allIntLikeTypes
+
+allIntLikeTypes :: [IntLikeType]
+allIntLikeTypes =
+  concatMap ([Signed, Unsigned] <&>) [Short, Int, Long, LongLong]
+    ++ [PtrDiff]
diff --git a/runtime/HsBindgen/Runtime/BitfieldPtr.hs b/runtime/HsBindgen/Runtime/BitfieldPtr.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/BitfieldPtr.hs
@@ -0,0 +1,90 @@
+-- | Pointers to bitfields
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.BitfieldPtr qualified as BitfieldPtr
+module HsBindgen.Runtime.BitfieldPtr (
+  Bitfield (..),
+  BitfieldPtr, -- opaque
+  mkBitfieldPtr,
+  startingByte,
+  offset,
+  width,
+  bounds,
+  peek,
+  poke,
+) where
+
+import Data.Kind
+import Data.Proxy
+import Foreign.Ptr
+
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support.Bitfield as Bitfield
+
+-- | Pointer to a bit-field of a C object
+--
+-- A @BitfieldPtr a@ is for a bit-field of type @a@.  For example, a
+-- @Bitfield CUInt@ points to a bit-field of type @CUInt@.
+type BitfieldPtr :: Type -> Type
+
+type role BitfieldPtr nominal
+data BitfieldPtr a = UnsafeBitfieldPtr
+  { startingByte :: Ptr ()
+  -- ^ Pointer to the byte where the bit-field starts
+  --
+  -- We do /not/ assume that the pointer is aligned.
+  , offset :: Int
+  -- ^ Offset of the bit-field (0 to 7 bits)
+  , width :: Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  , bounds :: (Ptr (), Ptr ())
+  -- ^ Memory bounds of the @struct@
+  --
+  -- The lower bound is inclusive, and the upper bound is exclusive.
+  --
+  -- To peek/poke a bit-field, we may peek/poke any memory within these
+  -- bounds.  We must not peek/poke memory outside of these bounds.
+  }
+
+-- | Construct a 'BitfieldPtr' given the C object pointer, offset, and width
+mkBitfieldPtr
+  :: forall s a
+   . (Marshal.StaticSize s)
+  => Ptr s
+  -- ^ Pointer to the C object with the bit-field
+  -> Int
+  -- ^ Offset of the bit-field (0 or more bits)
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> BitfieldPtr a
+mkBitfieldPtr ptr off width
+  | width < 1 || width > 64 =
+      error $ "invalid bit-field width: " ++ show width
+  | otherwise =
+      UnsafeBitfieldPtr
+        { startingByte = castPtr $ ptr `plusPtr` offBytes
+        , offset = offBits
+        , width = width
+        , bounds = (ptrL, ptrH)
+        }
+ where
+  offBytes, offBits :: Int
+  (offBytes, offBits) = off `quotRem` 8
+
+  ptrL, ptrH :: Ptr ()
+  ptrL = castPtr ptr
+  ptrH = ptrL `plusPtr` Marshal.staticSizeOf @s Proxy
+
+{-# INLINE peek #-}
+
+-- | Read from a bit-field
+peek :: (Bitfield a) => BitfieldPtr a -> IO a
+peek (UnsafeBitfieldPtr p o w b) = Bitfield.peekBitOffWidth p o w b
+
+{-# INLINE poke #-}
+
+-- | Write to a bit-field
+poke :: (Bitfield a) => BitfieldPtr a -> a -> IO ()
+poke (UnsafeBitfieldPtr p o w b) = Bitfield.pokeBitOffWidth p o w b
diff --git a/runtime/HsBindgen/Runtime/Block.hs b/runtime/HsBindgen/Runtime/Block.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Block.hs
@@ -0,0 +1,40 @@
+-- | Bare-bones support for blocks
+--
+-- TODO <https://github.com/well-typed/hs-bindgen/issues/2132>
+--
+-- Ideally we would at least support @Block_copy@ and @Block_release@. This
+-- would be easy to do, but would mean that @hs-bindgen-runtime@ would then
+-- depend on the runtime (@libblocksruntime@).
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.Block qualified as Block
+module HsBindgen.Runtime.Block (
+  Block (..),
+) where
+
+import Foreign (Ptr)
+
+import HsBindgen.Runtime.Support.HasFFIType (HasFFIType, ViaNewtype (..))
+
+{-------------------------------------------------------------------------------
+  Definition
+
+  We expose the definition of 'Block' so that it can appear in foreign imports.
+-------------------------------------------------------------------------------}
+
+-- | Block
+--
+-- See <https://clang.llvm.org/docs/BlockLanguageSpec.html>
+--
+-- The type index is the type of the bloc, for example:
+--
+-- > typedef int(^VarCounter)(int increment);
+--
+-- corresponds to
+--
+-- > newtype VarCounter = VarCounter (Block (CInt -> IO CInt))
+newtype Block t = Block (Ptr ())
+
+deriving via ViaNewtype (Ptr ()) instance HasFFIType (Block t)
diff --git a/runtime/HsBindgen/Runtime/CBool.hs b/runtime/HsBindgen/Runtime/CBool.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/CBool.hs
@@ -0,0 +1,160 @@
+{-# LANGUAGE NoImplicitPrelude #-}
+
+-- | C boolean semantics
+--
+-- In C, boolean types are numeric, where value @0@ is considered false and any
+-- other value is considered true.  They are implemented differently across
+-- different C projects:
+--
+-- * Since C23, there is a @bool@ type and predefined constants @true@ and
+--   @false@.
+-- * Since C99, standard header @stdbool.h@ defines (implementation-dependent)
+--   type @_Bool@ and macros @true@ and @false@.  This header is deprecated
+--   since C23.
+-- * Before C99, users defined boolean types and values, following the common
+--   conventions.  Some projects still define their own boolean type, perhaps
+--   for compatibility with old C standards.  Common implementations include the
+--   following, where @bool@ may be spelled differently (such as @Bool@ or
+--   @BOOL@):
+--
+--     * An @enum@ type:
+--
+--         @
+--         typedef enum { false, true } bool;
+--         @
+--
+--     * A @typedef@ and /separate/ @enum@ values:
+--
+--         @
+--         typedef int bool;
+--         enum { false, true };
+--         @
+--
+--     * A @typedef@ and macro values:
+--
+--         @
+--         typedef int bool;
+--         #define true 1
+--         #define false 0
+--         @
+--
+--     * A macro alias and macro values:
+--
+--         @
+--         #define bool int
+--         #define true 1
+--         #define false 0
+--         @
+--
+-- This module provides an API that is compatible with bindings generated for
+-- any of these possible implementations.  Note that the implementation only
+-- requires 'Eq' and 'Num' instances.  Conversion follows C23 semantics: /only/
+-- value @0@ is considered false, and any other value is considered true.
+--
+-- Intended for qualified import.
+--
+-- > import HsBindgen.Runtime.CBool qualified as CBool
+module HsBindgen.Runtime.CBool (
+  -- * Values
+  true,
+  false,
+
+  -- * Predicates
+  isTrue,
+  isFalse,
+
+  -- * Conversion
+  fromBool,
+  toBool,
+
+  -- * Operations
+  (&&),
+  (||),
+  not,
+  bool,
+  if_,
+  when,
+  unless,
+) where
+
+import Prelude hiding (not, (&&), (||))
+import Prelude qualified
+
+{-------------------------------------------------------------------------------
+  Values
+-------------------------------------------------------------------------------}
+
+-- | Standard true value: @1@
+true :: (Num b) => b
+true = 1
+
+-- | Standard false value: @0@
+false :: (Num b) => b
+false = 0
+
+{-------------------------------------------------------------------------------
+  Predicates
+-------------------------------------------------------------------------------}
+
+-- | 'True' if the value is not @0@
+isTrue :: (Eq b, Num b) => b -> Bool
+isTrue = (/= false)
+
+-- | 'True' if the value is @0@
+isFalse :: (Eq b, Num b) => b -> Bool
+isFalse = (== false)
+
+{-------------------------------------------------------------------------------
+  Conversion
+-------------------------------------------------------------------------------}
+
+-- | Convert from 'Bool' to 'true' or 'false'
+fromBool :: (Num b) => Bool -> b
+fromBool True = true
+fromBool False = false
+
+-- | Convert to 'Bool' using 'isTrue'
+toBool :: (Eq b, Num b) => b -> Bool
+toBool = isTrue
+
+{-------------------------------------------------------------------------------
+  Operations
+-------------------------------------------------------------------------------}
+
+-- | Boolean /and/, lazy in the second argument
+--
+-- This function returns one of the standard values.
+(&&) :: (Eq b, Num b) => b -> b -> b
+l && r = fromBool $ toBool l Prelude.&& toBool r
+
+-- | Boolean /or/, lazy in the second argument
+--
+-- This function returns one of the standard values.
+(||) :: (Eq b, Num b) => b -> b -> b
+l || r = fromBool $ toBool l Prelude.|| toBool r
+
+-- | Boolean /not/
+--
+-- This function returns one of the standard values.
+not :: (Eq b, Num b) => b -> b
+not = fromBool . Prelude.not . toBool
+
+-- | Boolean case analysis, implemented using 'isTrue'
+--
+-- See 'Data.Bool.bool' for details.
+bool :: (Eq b, Num b) => a -> a -> b -> a
+bool f t b = if isTrue b then t else f
+
+-- | Boolean case analysis, implemented using 'isTrue'
+if_ :: (Eq b, Num b) => b -> a -> a -> a
+if_ b t f = if isTrue b then t else f
+
+-- | Execute an applicative expression when the condition 'isTrue'
+when :: (Eq b, Num b, Applicative f) => b -> f () -> f ()
+when b e = if isTrue b then e else pure ()
+{-# ANN when ("HLint: ignore Use when" :: String) #-}
+
+-- | Execute an applicative expression when the condition 'isFalse'
+unless :: (Eq b, Num b, Applicative f) => b -> f () -> f ()
+unless b e = if isFalse b then e else pure ()
+{-# ANN unless ("HLint: ignore Use when" :: String) #-}
diff --git a/runtime/HsBindgen/Runtime/CEnum.hs b/runtime/HsBindgen/Runtime/CEnum.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/CEnum.hs
@@ -0,0 +1,655 @@
+-- | C enumerations
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.CEnum qualified as CEnum
+module HsBindgen.Runtime.CEnum (
+  -- * Type classes
+  CEnum (..),
+  SequentialCEnum (..),
+
+  -- * Deriving via support
+  AsCEnum (..),
+  AsSequentialCEnum (..),
+
+  -- * API
+  getNames,
+
+  -- * Instance support
+  DeclaredValues,
+  declaredValuesFromList,
+  show,
+  shows,
+  showsWrappedUndeclared,
+  readEither,
+  readPrec,
+  readPrecWrappedUndeclared,
+  seqIsDeclared,
+  seqMkDeclared,
+
+  -- ** Exceptions
+  CEnumException (..),
+) where
+
+import Control.Exception (Exception (displayException), throw)
+import Data.Bifunctor (Bifunctor (first))
+import Data.Coerce (Coercible, coerce)
+import Data.List qualified as List
+import Data.List.NonEmpty (NonEmpty ((:|)))
+import Data.List.NonEmpty qualified as NonEmpty
+import Data.Map.Strict (Map)
+import Data.Map.Strict qualified as Map
+import Data.Proxy (Proxy (Proxy))
+import GHC.Show (appPrec, appPrec1, showSpace)
+import Text.ParserCombinators.ReadP qualified as ReadP
+import Text.ParserCombinators.ReadPrec qualified as ReadPrec
+import Text.Read (ReadPrec, minPrec, (+++))
+import Text.Read qualified as Read
+import Text.Read.Lex (Lexeme (..), expect)
+import Prelude hiding (show, shows)
+import Prelude qualified
+
+{-------------------------------------------------------------------------------
+  Type classes
+-------------------------------------------------------------------------------}
+
+-- | C enumeration
+--
+-- This class implements an API for Haskell representations of C enumerations.
+-- C @enum@ declarations only declare values; they do not limit the range of the
+-- corresponding integral type.  They may have negative values, non-sequential
+-- values, and multiple names for a single value.
+--
+-- At a low level, @hs-bindgen@ generates a @newtype@ wrapper around the
+-- integral representation type to represent a C @enum@. An instance of this
+-- class is generated automatically. A 'Show' instance defined using 'shows' is
+-- also generated by default. 'Bounded' and 'Prelude.Enum' instances are /not/
+-- generated automatically because values do not technically need to be
+-- declared. Users may optionally derive these instances using 'AsCEnum' or
+-- 'AsSequentialCEnum' when appropriate.
+--
+-- This class may also be used with Haskell sum-type representations of
+-- enumerations.
+class (Integral (CEnumZ a)) => CEnum a where
+  -- | Integral representation type
+  type CEnumZ a
+
+  -- | Construct a value from the integral representation
+  --
+  -- prop> fromCEnum . toCEnum === id
+  toCEnum :: CEnumZ a -> a
+  default toCEnum :: (Coercible a (CEnumZ a)) => CEnumZ a -> a
+  toCEnum = coerce
+
+  -- | Get the integral representation for a value
+  --
+  -- prop> toCEnum . fromCEnum === id
+  --
+  -- If @a@ has an 'Ord' instance, it should be compatible with the 'Ord'
+  -- instance on the underlying integral value:
+  --
+  -- prop> \x y -> (x <= y) === (fromCEnum x <= fromCEnum y)
+  fromCEnum :: a -> CEnumZ a
+  default fromCEnum :: (Coercible a (CEnumZ a)) => a -> CEnumZ a
+  fromCEnum = coerce
+
+  -- | Declared values and associated names
+  declaredValues :: proxy a -> DeclaredValues a
+
+  -- | Show undeclared value
+  --
+  -- Like any 'Show' related function, this should generate a valid Haskell
+  -- expression. In this case, a valid Haskell expression for values /outside/
+  -- of the set of declared values (that is, for which 'isDeclared' will return
+  -- 'False').
+  --
+  -- The default definition just shows the underlying integer value; this is
+  -- valid if the Haskell wrapper has a 'Num' instance. If the Haskell type is
+  -- simply a newtype wrapper around the underlying C type, you can use
+  -- 'showsWrappedUndeclared'. Finally, if the Haskell type /cannot/ represent
+  -- undeclared values, this can be defined using @error@.
+  --
+  -- > showsUndeclared _ = \_ x ->
+  -- >   error $ "Unexpected value " ++ show x ++ " for type Foo"
+  showsUndeclared :: proxy a -> Int -> CEnumZ a -> ShowS
+  default showsUndeclared
+    :: (Show (CEnumZ a))
+    => proxy a -> Int -> CEnumZ a -> ShowS
+  showsUndeclared _ = showsPrec
+
+  -- | Read undeclared value
+  --
+  -- See 'showsUndeclared', 'showsWrappedUndeclared', and
+  -- 'readPrecWrappedUndeclared'.
+  readPrecUndeclared :: ReadPrec a
+
+  -- | Determine if the specified value is declared
+  --
+  -- This has a default definition in terms of 'declaredValues', but you may
+  -- wish to override this with a more efficient implementation (in particular,
+  -- see 'seqIsDeclared').
+  isDeclared :: a -> Bool
+  isDeclared x = (fromCEnum x) `Map.member` getIntegralToDeclaredValues (Proxy :: Proxy a)
+
+  -- | Construct a value only if it is declared
+  --
+  -- See also 'seqMkDeclared'.
+  mkDeclared :: CEnumZ a -> Maybe a
+  mkDeclared i
+    | i `Map.member` getIntegralToDeclaredValues (Proxy :: Proxy a) = Just (toCEnum i)
+    | otherwise = Nothing
+
+-- | C enumeration with sequential values
+--
+-- 'Bounded' and 'Enum' methods may be implemented more efficiently when the
+-- values of an enumeration are sequential.  An instance of this class is
+-- generated automatically in this case.  Users may optionally derive these
+-- instances using 'AsSequentialCEnum' when appropriate.
+--
+-- This class may also be used with Haskell sum-type representations of
+-- enumerations.
+--
+-- prop> all isDeclared [minDeclaredValue..maxDeclaredValue]
+class (CEnum a) => SequentialCEnum a where
+  -- | The minimum declared value
+  --
+  -- prop> minDeclaredValue == minimum (filter isDeclared (map toCEnum [minBound..]))
+  minDeclaredValue :: a
+
+  -- | The maximum declared value
+  --
+  -- prop> maxDeclaredValue == maximum (filter isDeclared (map toCEnum [minBound..]))
+  maxDeclaredValue :: a
+
+{-------------------------------------------------------------------------------
+  API
+-------------------------------------------------------------------------------}
+
+-- | Get all names associated with a value
+--
+-- An empty list is returned when the specified value is not declared.
+getNames :: forall a. (CEnum a) => a -> [String]
+getNames x =
+  maybe [] NonEmpty.toList $
+    Map.lookup (fromCEnum x) (getIntegralToDeclaredValues (Proxy :: Proxy a))
+
+{-------------------------------------------------------------------------------
+  Instance support
+-------------------------------------------------------------------------------}
+
+-- | Declared values (opaque)
+data DeclaredValues a = DeclaredValues
+  { integralToDeclaredValues :: !(Map (CEnumZ a) (NonEmpty String))
+  , declaredValueToIntegral :: !(Map String (CEnumZ a))
+  }
+
+-- | Construct t'DeclaredValues' from a list of values and associated names
+declaredValuesFromList
+  :: (Ord (CEnumZ a))
+  => [(CEnumZ a, NonEmpty String)]
+  -> DeclaredValues a
+declaredValuesFromList xs =
+  DeclaredValues
+    { integralToDeclaredValues = Map.fromList xs
+    , declaredValueToIntegral =
+        Map.fromList [(n, i) | (i, ns) <- xs, n <- NonEmpty.toList ns]
+    }
+
+declaredValuesList :: DeclaredValues a -> [String]
+declaredValuesList = Map.keys . declaredValueToIntegral
+
+-- | Show the specified value
+--
+-- Examples for a hypothetical enumeration type, using generated defaults:
+--
+-- > showCEnum StatusOK == "StatusOK"
+--
+-- > showCEnum (StatusCode 418) == "StatusCode 418"
+show :: forall a. (CEnum a) => a -> String
+show x = shows 0 x ""
+
+-- | Generalization of 'Prelude.show' (akin to 'Prelude.shows').
+--
+-- This function may be used in the definition of a 'Show' instance for a
+-- @newtype@ representation of a C enumeration.
+--
+-- When the value is declared, a corresponding name is returned.  Otherwise,
+-- 'showsUndeclared' is called.
+shows :: forall a. (CEnum a) => Int -> a -> ShowS
+shows prec x =
+  case Map.lookup i (getIntegralToDeclaredValues (Proxy :: Proxy a)) of
+    Just (name :| _names) -> showString name
+    Nothing -> showsUndeclared (Proxy :: Proxy a) prec i
+ where
+  i :: CEnumZ a
+  i = fromCEnum x
+
+-- | Read a 'CEnum' from string
+--
+-- Examples for a hypothetical enumeration type, using generated defaults:
+--
+-- > (readEitherCEnum "StatusCode 200" :: StatusCode) == Right StatusOK
+--
+-- > (readEitherCEnum "StatusOK" :: StatusCode) == Right StatusOK
+--
+-- > (readEitherCEnum "StatusCode 123" :: StatusCode) == Right (StatusCode 123)
+readEither :: forall a. (CEnum a) => String -> Either String a
+readEither s =
+  case [x | (x, "") <- ReadPrec.readPrec_to_S read' minPrec s] of
+    [x] -> Right x
+    [] -> Left "readEitherCEnum: no parse"
+    _xs -> Left "readEitherCEnum: ambiguous parse"
+ where
+  read' =
+    do
+      x <- readPrec
+      ReadPrec.lift ReadP.skipSpaces
+      return x
+
+-- | Helper function for defining 'showsUndeclared'
+--
+-- This helper can be used in the case where @a@ is a newtype wrapper around
+-- the underlying @CEnumZ a@.
+showsWrappedUndeclared
+  :: (Show (CEnumZ a))
+  => String -> proxy a -> Int -> CEnumZ a -> ShowS
+showsWrappedUndeclared constructorName _ p x =
+  showParen (p >= appPrec1) $
+    showString constructorName
+      . showSpace
+      . showsPrec appPrec1 x
+
+-- | Read a declared 'CEnum' value
+readPrecDeclaredValue :: forall proxy a. (CEnum a) => proxy a -> ReadPrec a
+readPrecDeclaredValue proxy = Read.parens $ ReadPrec.prec appPrec1 $ do
+  declaredValue <-
+    ReadPrec.lift $
+      ReadP.choice $
+        map ReadP.string $
+          declaredValuesList $
+            declaredValues proxy
+  pure $ toCEnum $ (declaredValueToIntegral $ declaredValues proxy) Map.! declaredValue
+
+-- | Helper function for defining 'readPrecUndeclared'
+--
+-- This helper can be used in the case where @a@ is a newtype wrapper around
+-- the underlying @CEnumZ a@.
+readPrecWrappedUndeclared
+  :: forall a. (CEnum a, Read (CEnumZ a)) => String -> ReadPrec a
+readPrecWrappedUndeclared constructorName = Read.parens $ ReadPrec.prec appPrec $ do
+  ReadPrec.lift $ expect $ Ident constructorName
+  n <- Read.step (Read.readPrec :: ReadPrec (CEnumZ a))
+  pure $ toCEnum n
+
+-- | Read a 'CEnum' from string
+--
+-- This function may be used in the definition of a 'Read' instance for a
+-- @newtype@ representation of a C enumeration.
+readPrec :: forall a. (CEnum a) => ReadPrec a
+readPrec = readPrecDeclaredValue (Proxy :: Proxy a) +++ readPrecUndeclared
+
+-- | Determine if the specified value is declared
+--
+-- This implementation is optimized for 'SequentialCEnum'.
+seqIsDeclared :: forall a. (SequentialCEnum a) => a -> Bool
+seqIsDeclared x = i >= minZ && i <= maxZ
+ where
+  minZ, maxZ, i :: CEnumZ a
+  minZ = fromCEnum (minDeclaredValue @a)
+  maxZ = fromCEnum (maxDeclaredValue @a)
+  i = fromCEnum x
+
+-- | Construct a value only if it is declared
+--
+-- This implementation is optimized for 'SequentialCEnum'.
+seqMkDeclared :: forall a. (SequentialCEnum a) => CEnumZ a -> Maybe a
+seqMkDeclared i
+  | i >= minZ && i <= maxZ = Just (toCEnum i)
+  | otherwise = Nothing
+ where
+  minZ, maxZ :: CEnumZ a
+  minZ = fromCEnum (minDeclaredValue @a)
+  maxZ = fromCEnum (maxDeclaredValue @a)
+
+{-------------------------------------------------------------------------------
+  Deriving via support
+-------------------------------------------------------------------------------}
+
+-- | Type used to derive classes using @DerivingVia@ a type with a 'CEnum'
+-- instance
+--
+-- When the values are sequential, 'AsSequentialCEnum' provides better
+-- performance and should therefore be used instead.
+--
+-- The following classes may be derived:
+--
+-- * 'Bounded' may be derived using the bounds of the declared values.  This is
+--   /not/ derived by default.
+-- * 'Enum' may be derived using the bounds of the declared values.  This
+--   instance assumes that only the declared values are valid and throws a
+--   'CEnumException' if passed a value that is not declared.  This is /not/
+--   derived by default.
+--
+-- For /declared/ values we have
+--
+-- prop> toEnum   === coerce       . toCENum   . fromIntegral
+-- prop> fromEnum === fromIntegral . fromCEnum . coerce
+--
+-- In addition we guarantee that where 'pred' or 'succ' are defined, we have
+--
+-- prop> \x -> (pred x < x) && (x < succ x)
+newtype AsCEnum a = WrapCEnum {unwrapCEnum :: a}
+
+instance (CEnum a) => Bounded (AsCEnum a) where
+  minBound = WrapCEnum minBoundGen
+  maxBound = WrapCEnum maxBoundGen
+
+instance (CEnum a) => Enum (AsCEnum a) where
+  succ = WrapCEnum . succGen . unwrapCEnum
+  pred = WrapCEnum . predGen . unwrapCEnum
+
+  toEnum = WrapCEnum . toEnumGen
+  fromEnum = fromEnumGen . unwrapCEnum
+
+  enumFrom (WrapCEnum x) = WrapCEnum <$> enumFromGen x
+  enumFromThen (WrapCEnum x) (WrapCEnum y) = WrapCEnum <$> enumFromThenGen x y
+  enumFromTo (WrapCEnum x) (WrapCEnum z) = WrapCEnum <$> enumFromToGen x z
+  enumFromThenTo (WrapCEnum x) (WrapCEnum y) (WrapCEnum z) =
+    WrapCEnum <$> enumFromThenToGen x y z
+
+-- | Type used to derive classes using @DerivingVia@ a type with a
+-- 'SequentialCEnum' instance
+--
+-- The following classes may be derived:
+--
+-- * 'Bounded' may be derived using the bounds of the declared values.  This is
+--   /not/ derived by default.
+-- * 'Enum' may be derived using the bounds of the declared values.  This
+--   instance assumes that only the declared values are valid and throws a
+--   'CEnumException' if passed a value that is not declared.  This is /not/
+--   derived by default.
+--
+-- 'AsSequentialCEnum' should have the same properties as 'AsCEnum'.
+newtype AsSequentialCEnum a = WrapSequentialCEnum {unwrapSequentialCEnum :: a}
+
+instance (SequentialCEnum a) => Bounded (AsSequentialCEnum a) where
+  minBound = WrapSequentialCEnum minBoundSeq
+  maxBound = WrapSequentialCEnum maxBoundSeq
+
+instance (SequentialCEnum a) => Enum (AsSequentialCEnum a) where
+  succ = WrapSequentialCEnum . succSeq . unwrapSequentialCEnum
+  pred = WrapSequentialCEnum . predSeq . unwrapSequentialCEnum
+
+  toEnum = WrapSequentialCEnum . toEnumSeq
+  fromEnum = fromEnumSeq . unwrapSequentialCEnum
+
+  enumFrom (WrapSequentialCEnum x) = WrapSequentialCEnum <$> enumFromSeq x
+  enumFromThen (WrapSequentialCEnum x) (WrapSequentialCEnum y) =
+    WrapSequentialCEnum <$> enumFromThenSeq x y
+  enumFromTo (WrapSequentialCEnum x) (WrapSequentialCEnum z) =
+    WrapSequentialCEnum <$> enumFromToSeq x z
+  enumFromThenTo
+    (WrapSequentialCEnum x)
+    (WrapSequentialCEnum y)
+    (WrapSequentialCEnum z) =
+      WrapSequentialCEnum <$> enumFromThenToSeq x y z
+
+{-------------------------------------------------------------------------------
+  Exceptions
+-------------------------------------------------------------------------------}
+
+-- | Exceptions used by optional C enumeration instances
+data CEnumException
+  = CEnumNotDeclared Integer
+  | CEnumNoSuccessor Integer
+  | CEnumNoPredecessor Integer
+  | CEnumEmpty
+  | CEnumFromEqThen Integer
+  deriving stock (Eq, Show)
+
+instance Exception CEnumException where
+  displayException = \case
+    CEnumNotDeclared i -> "C enumeration value not declared: " ++ Prelude.show i
+    CEnumNoSuccessor i ->
+      "C enumeration value has no declared successor: " ++ Prelude.show i
+    CEnumNoPredecessor i ->
+      "C enumeration value has no declared predecessor: " ++ Prelude.show i
+    CEnumEmpty -> "C enumeration has no declared values"
+    CEnumFromEqThen i -> "enumeration from and then values equal: " ++ Prelude.show i
+
+{-------------------------------------------------------------------------------
+  Bounded instance implementation
+-------------------------------------------------------------------------------}
+
+minBoundGen :: forall a. (CEnum a) => a
+minBoundGen = case Map.lookupMin (getIntegralToDeclaredValues (Proxy :: Proxy a)) of
+  Just (i, _names) -> toCEnum i
+  Nothing -> throw CEnumEmpty
+
+minBoundSeq :: (SequentialCEnum a) => a
+minBoundSeq = minDeclaredValue
+
+maxBoundGen :: forall a. (CEnum a) => a
+maxBoundGen = case Map.lookupMax (getIntegralToDeclaredValues (Proxy :: Proxy a)) of
+  Just (k, _names) -> toCEnum k
+  Nothing -> throw CEnumEmpty
+
+maxBoundSeq :: (SequentialCEnum a) => a
+maxBoundSeq = maxDeclaredValue
+
+{-------------------------------------------------------------------------------
+  Enum instance implementation
+-------------------------------------------------------------------------------}
+
+succGen :: forall a. (CEnum a) => a -> a
+succGen x = either (throw . CEnumNotDeclared) id $ do
+  (_ltMap, gtMap) <- splitMap i (getIntegralToDeclaredValues (Proxy :: Proxy a))
+  case Map.lookupMin gtMap of
+    Just (j, _names) -> return $ toCEnum j
+    Nothing -> throw $ CEnumNoSuccessor (toInteger i)
+ where
+  i :: CEnumZ a
+  i = fromCEnum x
+
+succSeq :: forall a. (SequentialCEnum a) => a -> a
+succSeq x
+  | i >= minZ && i < maxZ = toCEnum (i + 1)
+  | i == maxZ = throw $ CEnumNoSuccessor (toInteger i)
+  | otherwise = throw $ CEnumNotDeclared (toInteger i)
+ where
+  minZ, maxZ, i :: CEnumZ a
+  minZ = fromCEnum (minDeclaredValue @a)
+  maxZ = fromCEnum (maxDeclaredValue @a)
+  i = fromCEnum x
+
+predGen :: forall a. (CEnum a) => a -> a
+predGen y = either (throw . CEnumNotDeclared) id $ do
+  (ltMap, _gtMap) <- splitMap j (getIntegralToDeclaredValues (Proxy :: Proxy a))
+  case Map.lookupMax ltMap of
+    Just (i, _names) -> return $ toCEnum i
+    Nothing -> throw $ CEnumNoPredecessor (toInteger j)
+ where
+  j :: CEnumZ a
+  j = fromCEnum y
+
+predSeq :: forall a. (SequentialCEnum a) => a -> a
+predSeq y
+  | j > minZ && j <= maxZ = toCEnum (j - 1)
+  | j == minZ = throw $ CEnumNoPredecessor (toInteger j)
+  | otherwise = throw $ CEnumNotDeclared (toInteger j)
+ where
+  minZ, maxZ, j :: CEnumZ a
+  minZ = fromCEnum (minDeclaredValue @a)
+  maxZ = fromCEnum (maxDeclaredValue @a)
+  j = fromCEnum y
+
+toEnumGen :: (CEnum a) => Int -> a
+toEnumGen i = case mkDeclared (fromIntegral i) of
+  Just x -> x
+  Nothing -> throw $ CEnumNotDeclared (toInteger i)
+
+toEnumSeq :: forall a. (SequentialCEnum a) => Int -> a
+toEnumSeq n
+  | i >= minZ && i <= maxZ = toCEnum i
+  | otherwise = throw $ CEnumNotDeclared (toInteger i)
+ where
+  minZ, maxZ, i :: CEnumZ a
+  minZ = fromCEnum (minDeclaredValue @a)
+  maxZ = fromCEnum (maxDeclaredValue @a)
+  i = fromIntegral n
+
+fromEnumGen :: forall a. (CEnum a) => a -> Int
+fromEnumGen x
+  | i `Map.member` getIntegralToDeclaredValues (Proxy :: Proxy a) = fromIntegral i
+  | otherwise = throw $ CEnumNotDeclared (toInteger i)
+ where
+  i :: CEnumZ a
+  i = fromCEnum x
+
+fromEnumSeq :: forall a. (SequentialCEnum a) => a -> Int
+fromEnumSeq x
+  | i >= minZ && i <= maxZ = fromIntegral i
+  | otherwise = throw $ CEnumNotDeclared (toInteger i)
+ where
+  minZ, maxZ, i :: CEnumZ a
+  minZ = fromCEnum (minDeclaredValue @a)
+  maxZ = fromCEnum (maxDeclaredValue @a)
+  i = fromCEnum x
+
+enumFromGen :: forall a. (CEnum a) => a -> [a]
+enumFromGen x = either (throw . CEnumNotDeclared) id $ do
+  (_ltMap, gtMap) <- splitMap i (getIntegralToDeclaredValues (Proxy :: Proxy a))
+  return $ x : map toCEnum (Map.keys gtMap)
+ where
+  i :: CEnumZ a
+  i = fromCEnum x
+
+enumFromSeq :: forall a. (SequentialCEnum a) => a -> [a]
+enumFromSeq x
+  | i >= minZ && i <= maxZ = map toCEnum [i .. maxZ]
+  | otherwise = throw $ CEnumNotDeclared (toInteger i)
+ where
+  minZ, maxZ, i :: CEnumZ a
+  minZ = fromCEnum (minDeclaredValue @a)
+  maxZ = fromCEnum (maxDeclaredValue @a)
+  i = fromCEnum x
+
+enumFromThenGen :: forall a. (CEnum a) => a -> a -> [a]
+enumFromThenGen x y = case compare i j of
+  LT -> either (throw . CEnumNotDeclared) id $ do
+    (_ltIMap, gtIMap) <- splitMap i (getIntegralToDeclaredValues (Proxy :: Proxy a))
+    (ltJMap, gtJMap) <- splitMap j gtIMap
+    let w = Map.size ltJMap + 1
+        js = j : Map.keys gtJMap
+    return $ x : map (toCEnum . NonEmpty.head) (nonEmptyChunksOf w js)
+  GT -> either (throw . CEnumNotDeclared) id $ do
+    (ltIMap, _gtIMap) <- splitMap i (getIntegralToDeclaredValues (Proxy :: Proxy a))
+    (ltJMap, gtJMap) <- splitMap j ltIMap
+    let w = Map.size gtJMap + 1
+        js = j : reverse (Map.keys ltJMap)
+    return $ x : map (toCEnum . NonEmpty.head) (nonEmptyChunksOf w js)
+  EQ -> throw $ CEnumFromEqThen (toInteger i)
+ where
+  i, j :: CEnumZ a
+  i = fromCEnum x
+  j = fromCEnum y
+
+enumFromThenSeq :: forall a. (SequentialCEnum a) => a -> a -> [a]
+enumFromThenSeq x y
+  | i == j = throw $ CEnumFromEqThen (toInteger i)
+  | i < minZ || i > maxZ = throw $ CEnumNotDeclared (toInteger i)
+  | j < minZ || j > maxZ = throw $ CEnumNotDeclared (toInteger j)
+  | i < j = map toCEnum [i, j .. maxZ]
+  | otherwise = map toCEnum [i, j .. minZ]
+ where
+  minZ, maxZ, i, j :: CEnumZ a
+  minZ = fromCEnum (minDeclaredValue @a)
+  maxZ = fromCEnum (maxDeclaredValue @a)
+  i = fromCEnum x
+  j = fromCEnum y
+
+enumFromToGen :: forall a. (CEnum a) => a -> a -> [a]
+enumFromToGen x z = either (throw . CEnumNotDeclared) id $ do
+  (_ltIMap, gtIMap) <- splitMap i (getIntegralToDeclaredValues (Proxy :: Proxy a))
+  if i == k then
+    return [x]
+  else do
+    (ltKMap, _gtKMap) <- splitMap k gtIMap
+    return $ x : map toCEnum (Map.keys ltKMap) ++ [z]
+ where
+  i, k :: CEnumZ a
+  i = fromCEnum x
+  k = fromCEnum z
+
+enumFromToSeq :: forall a. (SequentialCEnum a) => a -> a -> [a]
+enumFromToSeq x z
+  | i < minZ || i > maxZ = throw $ CEnumNotDeclared (toInteger i)
+  | k < minZ || k > maxZ = throw $ CEnumNotDeclared (toInteger k)
+  | otherwise = map toCEnum [i .. k]
+ where
+  minZ, maxZ, i, k :: CEnumZ a
+  minZ = fromCEnum (minDeclaredValue @a)
+  maxZ = fromCEnum (maxDeclaredValue @a)
+  i = fromCEnum x
+  k = fromCEnum z
+
+enumFromThenToGen :: forall a. (CEnum a) => a -> a -> a -> [a]
+enumFromThenToGen x y z = case compare i j of
+  LT -> either (throw . CEnumNotDeclared) id $ do
+    (_ltIMap, gtIMap) <- splitMap i (getIntegralToDeclaredValues (Proxy :: Proxy a))
+    (ltJMap, gtJMap) <- splitMap j gtIMap
+    (ltKMap, _gtKMap) <- splitMap k gtJMap
+    let w = Map.size ltJMap + 1
+        js = j : Map.keys ltKMap ++ [k]
+    return $ x : map (toCEnum . NonEmpty.head) (nonEmptyChunksOf w js)
+  GT -> either (throw . CEnumNotDeclared) id $ do
+    (ltIMap, _gtIMap) <- splitMap i (getIntegralToDeclaredValues (Proxy :: Proxy a))
+    (ltJMap, gtJMap) <- splitMap j ltIMap
+    (_ltKMap, gtKMap) <- splitMap k ltJMap
+    let w = Map.size gtJMap + 1
+        js = j : reverse (k : Map.keys gtKMap)
+    return $ x : map (toCEnum . NonEmpty.head) (nonEmptyChunksOf w js)
+  EQ -> throw $ CEnumFromEqThen (toInteger i)
+ where
+  i, j, k :: CEnumZ a
+  i = fromCEnum x
+  j = fromCEnum y
+  k = fromCEnum z
+
+enumFromThenToSeq :: forall a. (SequentialCEnum a) => a -> a -> a -> [a]
+enumFromThenToSeq x y z
+  | i == j = throw $ CEnumFromEqThen (toInteger i)
+  | i < minZ || i > maxZ = throw $ CEnumNotDeclared (toInteger i)
+  | j < minZ || j > maxZ = throw $ CEnumNotDeclared (toInteger j)
+  | k < minZ || k > maxZ = throw $ CEnumNotDeclared (toInteger k)
+  | otherwise = map toCEnum [i, j .. k]
+ where
+  minZ, maxZ, i, j, k :: CEnumZ a
+  minZ = fromCEnum (minDeclaredValue @a)
+  maxZ = fromCEnum (maxDeclaredValue @a)
+  i = fromCEnum x
+  j = fromCEnum y
+  k = fromCEnum z
+
+{-------------------------------------------------------------------------------
+  Auxiliary Functions
+-------------------------------------------------------------------------------}
+
+getIntegralToDeclaredValues :: (CEnum a) => proxy a -> Map (CEnumZ a) (NonEmpty String)
+getIntegralToDeclaredValues = integralToDeclaredValues . declaredValues
+
+nonEmptyChunksOf :: Int -> [a] -> [NonEmpty a]
+nonEmptyChunksOf n xs
+  | n > 0 = aux xs
+  | otherwise = error $ "nonEmptyChunksOf: n must be positive, got " ++ Prelude.show n
+ where
+  aux :: [a] -> [NonEmpty a]
+  aux xs' = case first NonEmpty.nonEmpty (List.splitAt n xs') of
+    (Just ne, rest) -> ne : aux rest
+    (Nothing, _rest) -> []
+
+splitMap :: (Integral k) => k -> Map k v -> Either Integer (Map k v, Map k v)
+splitMap n m = case Map.splitLookup n m of
+  (ltMap, Just{}, gtMap) -> Right (ltMap, gtMap)
+  (_ltMap, Nothing, _gtMap) -> Left (toInteger n)
diff --git a/runtime/HsBindgen/Runtime/ConstantArray.hs b/runtime/HsBindgen/Runtime/ConstantArray.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/ConstantArray.hs
@@ -0,0 +1,227 @@
+-- | C arrays of known, constant size
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.ConstantArray qualified as CA
+module HsBindgen.Runtime.ConstantArray (
+  ConstantArray, -- opaque
+  toVector,
+  fromVector,
+
+  -- * Pointers
+  -- $pointers
+  toPtr,
+  toFirstElemPtr,
+
+  -- * Construction
+  repeat,
+  fromList,
+
+  -- * Query
+  toList,
+) where
+
+import Data.Coerce (Coercible, coerce)
+import Data.Proxy (Proxy (..))
+import Data.Vector.Storable qualified as VS
+import Foreign.ForeignPtr (mallocForeignPtrArray, withForeignPtr)
+import Foreign.Marshal.Utils (copyBytes)
+import Foreign.Ptr (Ptr, castPtr)
+import Foreign.Storable (Storable (..))
+import GHC.Records (HasField (..))
+import GHC.Stack (HasCallStack)
+import GHC.TypeNats (KnownNat, Nat, natVal)
+import Prelude hiding (repeat)
+
+import HsBindgen.Runtime.IsArray (IsArray (..))
+import HsBindgen.Runtime.Marshal (ReadRaw, StaticSize, WriteRaw)
+
+{-------------------------------------------------------------------------------
+  Definition
+-------------------------------------------------------------------------------}
+
+-- | A C array of known size
+newtype ConstantArray (n :: Nat) a = CA (VS.Vector a)
+  deriving stock (Eq, Show)
+  deriving anyclass (ReadRaw, StaticSize, WriteRaw)
+
+type role ConstantArray nominal nominal
+
+-- | /( O(1) /): Get the underlying 'VS.Vector' representation
+--
+-- This makes the full 'VS.Vector' API available.
+toVector
+  :: forall a n arrayLike
+   . (Coercible arrayLike (ConstantArray n a))
+  => arrayLike
+  -> (Proxy n, VS.Vector a)
+toVector (coerce -> xs) = (Proxy @n, xs)
+
+-- | /( O(1) /): Construct from a 'VS.Vector' representation
+--
+-- This makes the full 'VS.Vector' API available.
+--
+-- Precondition: the vector must have the right number of elements.
+fromVector
+  :: forall a n arrayLike
+   . ( Coercible arrayLike (ConstantArray n a)
+     , Storable a
+     , KnownNat n
+     , HasCallStack
+     )
+  => Proxy n
+  -> VS.Vector a
+  -> arrayLike
+fromVector _ xs
+  | VS.length xs == n = coerce xs
+  | otherwise = error $ "fromVector: expected " ++ show n ++ " elements"
+ where
+  n = intVal (Proxy @n)
+
+{-------------------------------------------------------------------------------
+  Pointers
+-------------------------------------------------------------------------------}
+
+-- $pointers
+--
+-- In example C code below, @p1@ points to the array @xs@ as a whole, while @p2@
+-- points to the first element of @xs@.
+--
+-- > extern int xs[3];
+-- > void foo () {
+-- >   int (*p1)[3] = &xs;
+-- >   int *p2 = &(xs[0]);
+-- > }
+--
+-- Though the types of @p1@ and @p2@ differ, the /values/ of the pointers (the
+-- address they point to) is the same. An array is just a block of contiguous
+-- memory storing array elements. @p1@ points to where @xs@ starts, and @p2@
+-- points to where the first element of @xs@ starts, and these addresses are the
+-- same. In Haskell, the corresponding types for @p1@ and @p2@ respectively are
+-- @'Ptr' ('ConstantArray' n 'Foreign.C.CInt')@ and @'Ptr' 'Foreign.C.CInt'@
+-- respectively.
+--
+-- Functions like 'peek' require a @'Ptr' ('ConstantArray' n a)@ argument. If
+-- the user only has access to a @'Ptr' a@ but they know that is pointing to the
+-- first element in an array, then they can use 'toPtr' to convert the pointer
+-- before using 'HsBindgen.Runtime.IncompleteArray.peekArray' on it. Conversely,
+-- if the user has access to a @'Ptr' ('ConstantArray' n a)@ but they want to
+-- convert it to a @'Ptr' a@, then they can use @'toFirstElemPtr'@.
+--
+-- NOTE: with overloaded record dot syntax, syntax like @.toFirstElemPtr@ is
+-- also supported.
+--
+-- Relevant functions in this module also support pointers of newtypes around
+-- 'ConstantArray', hence the addition of 'Coercible' constraints in many
+-- places. For example, we can use 'toPtr' at a 'ConstantArray' type
+-- or we can use 'toPtr' at a newtype around a 'ConstantArray'.
+--
+-- > newtype A n = A (ConstantArray n CInt)
+-- > toPtr @(ConstantArray 3 CInt) ::
+-- >   Proxy 3 -> Ptr CInt -> Ptr (ConstantArray 3 CInt)
+-- > toPtr @(A 3) ::
+-- >   Proxy 3 -> Ptr CInt -> Ptr (A 3)
+
+-- | 'toFirstElemPtr' for overloaded record dot syntax
+instance HasField "toFirstElemPtr" (Ptr (ConstantArray n a)) (Ptr a) where
+  getField = snd . toFirstElemPtr
+
+-- | /( O(1) /): Use a pointer to the first element of an array as a pointer to the whole of
+-- said array.
+--
+-- NOTE: this function does not check that the pointer /is/ actually a pointer
+-- to the first element of an array.
+toPtr
+  :: forall arrayLike n a
+   . (Coercible arrayLike (ConstantArray n a))
+  => Proxy n
+  -> Ptr a
+  -> Ptr arrayLike
+toPtr _ = castPtr
+ where
+  -- The 'Coercible' constraint is unused but that is intentional, so we
+  -- circumvent the @-Wredundant-constraints@ warning by defining @_unused@.
+  --
+  -- Why is it intentional? The constraint adds a little bit of type safety to
+  -- the use of 'castPtr', which can normally cast pointers arbitrarily.
+  _unused = coerce @arrayLike @(ConstantArray n a)
+
+-- | /( O(1) /): Use a pointer to a whole array as a pointer to the first element of said
+-- array.
+toFirstElemPtr
+  :: forall arrayLike n a
+   . (Coercible arrayLike (ConstantArray n a))
+  => Ptr arrayLike
+  -> (Proxy n, Ptr a)
+toFirstElemPtr ptr = (Proxy @n, castPtr ptr)
+ where
+  -- The 'Coercible' constraint is unused but that is intentional, so we
+  -- circumvent the @-Wredundant-constraints@ warning by defining @_unused@.
+  --
+  -- Why is it intentional? The constraint adds a little bit of type safety to
+  -- the use of 'castPtr', which can normally cast pointers arbitrarily.
+  _unused = coerce @arrayLike @(ConstantArray n a)
+
+instance (Storable a, KnownNat n) => Storable (ConstantArray n a) where
+  sizeOf _ = intVal (Proxy @n) * sizeOf (undefined :: a)
+
+  alignment _ = alignment (undefined :: a)
+
+  peek ptr = do
+    fptr <- mallocForeignPtrArray size
+    withForeignPtr fptr $ \ptr' -> do
+      copyBytes ptr' (castPtr ptr) (size * sizeOfA)
+    vs <- VS.freeze (VS.MVector size fptr)
+    return (CA vs)
+   where
+    size = intVal (Proxy @n)
+    sizeOfA = sizeOf (undefined :: a)
+
+  poke ptr (CA vs) = do
+    VS.MVector size fptr <- VS.unsafeThaw vs
+    withForeignPtr fptr $ \ptr' -> do
+      copyBytes ptr (castPtr ptr') (size * sizeOfA)
+   where
+    sizeOfA = sizeOf (undefined :: a)
+
+instance IsArray (ConstantArray n a) where
+  type Elem (ConstantArray n a) = a
+
+  -- \| /( O(n) /)
+  withElemPtr (CA v) k = do
+    -- we copy the data, a e.g. int fun(int xs[3]) may mutate it.
+    VS.MVector _ fptr <- VS.thaw v
+    withForeignPtr fptr $ \(ptr :: Ptr a) -> k ptr
+
+{-------------------------------------------------------------------------------
+  Construction
+-------------------------------------------------------------------------------}
+
+-- | /( O(n) /)
+repeat :: forall n a. (KnownNat n, Storable a) => a -> ConstantArray n a
+repeat x = CA (VS.replicate (intVal (Proxy @n)) x)
+
+-- | /( O(n) /): Construct from a list
+--
+-- Precondition: the list must have the right number of elements.
+fromList
+  :: forall n a
+   . (KnownNat n, Storable a, HasCallStack)
+  => [a] -> ConstantArray n a
+fromList xs = fromVector (Proxy @n) (VS.fromList xs)
+
+{-------------------------------------------------------------------------------
+  Query
+-------------------------------------------------------------------------------}
+
+-- | /( O(n) /)
+toList :: (Storable a) => ConstantArray n a -> [a]
+toList (CA v) = VS.toList v
+
+{-------------------------------------------------------------------------------
+  Auxiliary
+-------------------------------------------------------------------------------}
+
+intVal :: forall n. (KnownNat n) => Proxy n -> Int
+intVal p = fromIntegral (natVal p)
diff --git a/runtime/HsBindgen/Runtime/FLAM.hs b/runtime/HsBindgen/Runtime/FLAM.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/FLAM.hs
@@ -0,0 +1,145 @@
+{-# LANGUAGE MagicHash #-}
+
+-- We capitalize module names, but use camelCase/PascalCase in code:
+--
+-- - in types names:    FlamFoo, FooFlamBar
+-- - in variable names: flamFoo, fooFlamBar
+
+-- | Intended for qualified import.
+--
+-- @
+-- import HsBindgen.Runtime.FLAM (WithFlam)
+-- import HsBindgen.Runtime.FLAM qualified as FLAM
+-- @
+module HsBindgen.Runtime.FLAM (
+  -- * Definitions
+  Offset (..),
+  NumElems (..),
+  WithFlam (..),
+
+  -- * Exceptions
+  FlamLengthMismatch (..),
+) where
+
+import Control.Exception (Exception, throwIO)
+import Data.Kind (Type)
+import Data.Vector.Storable qualified as VS
+import Data.Vector.Storable.Mutable qualified as VSM
+import Foreign (Ptr, Storable)
+import Foreign qualified
+import GHC.Exts (Proxy#, proxy#)
+
+import HsBindgen.Runtime.Marshal
+
+{-------------------------------------------------------------------------------
+  Definitions
+-------------------------------------------------------------------------------}
+
+-- | The offset of the FLAM to the beginning of the underlying data structure in
+--   bytes
+class Offset elem aux | aux -> elem where
+  offset :: Proxy# aux -> Int
+
+-- | The number of elements 'elem' of the FLAM contained in structure 'aux'
+class (Offset elem aux) => NumElems elem aux | aux -> elem where
+  numElems :: aux -> Int
+
+-- | Data structure with flexible array member
+data WithFlam elem aux = WithFlam
+  { -- Underlying data structure without FLAM
+    aux :: !aux
+  , -- We use the word "flam" for the flexible array member of the struct.
+    -- We use the word "vector" to refer to its Haskell representation (as a
+    -- vector).
+    flam :: {-# UNPACK #-} !(VS.Vector elem)
+  }
+  deriving stock (Show)
+
+instance
+  (Storable aux, Storable elem, NumElems elem aux)
+  => ReadRaw (WithFlam elem aux)
+  where
+  readRaw = peek
+
+instance
+  (Storable aux, Storable elem, NumElems elem aux)
+  => WriteRaw (WithFlam elem aux)
+  where
+  writeRaw = poke
+
+{-------------------------------------------------------------------------------
+  Peek and poke
+-------------------------------------------------------------------------------}
+
+-- | Peek structure with flexible array member.
+peek
+  :: forall aux elem
+   . (Storable aux, Storable elem, NumElems elem aux)
+  => Ptr (WithFlam elem aux) -> IO (WithFlam elem aux)
+peek ptrStruct = do
+  aux <- Foreign.peek (ptrToAux ptrStruct)
+  let Size{sizeNumElems, sizeNumBytes} = flamSize aux
+  vector <- VSM.unsafeNew sizeNumElems
+  Foreign.withForeignPtr (fst (VSM.unsafeToForeignPtr0 vector)) $ \ptrVectorElems -> do
+    Foreign.copyBytes ptrVectorElems (ptrToFlam ptrStruct) sizeNumBytes
+  vector' <- VS.unsafeFreeze vector
+  return (WithFlam aux vector')
+
+-- | Poke structure with flexible array member.
+poke
+  :: forall aux elem
+   . (Storable aux, Storable elem, NumElems elem aux)
+  => Ptr (WithFlam elem aux) -> WithFlam elem aux -> IO ()
+poke ptrStruct (WithFlam aux vector)
+  | sizeNumElems /= VS.length vector =
+      throwIO $ FlamLengthMismatch sizeNumElems (VS.length vector)
+  | otherwise = do
+      Foreign.poke (ptrToAux ptrStruct) aux
+      VS.unsafeWith vector $ \ptrVectorElems -> do
+        Foreign.copyBytes (ptrToFlam ptrStruct) ptrVectorElems sizeNumBytes
+ where
+  Size{sizeNumElems, sizeNumBytes} = flamSize aux
+
+{-------------------------------------------------------------------------------
+  Exceptions
+-------------------------------------------------------------------------------}
+
+-- | Exception thrown when 'writeRaw' detects a FLAM length mismatch
+data FlamLengthMismatch = FlamLengthMismatch
+  { flamLengthStruct :: Int
+  , flamLengthProvided :: Int
+  }
+  deriving stock (Show)
+
+instance Exception FlamLengthMismatch
+
+{-------------------------------------------------------------------------------
+  Internal helpers
+-------------------------------------------------------------------------------}
+
+ptrToAux :: Ptr (WithFlam elem aux) -> Ptr aux
+ptrToAux = Foreign.castPtr
+
+ptrToFlam
+  :: forall elem aux
+   . (Offset elem aux)
+  => Ptr (WithFlam elem aux) -> Ptr elem
+ptrToFlam ptrStruct = Foreign.plusPtr ptrStruct (offset (proxy# @aux))
+
+-- Internal.
+data Size = Size
+  { sizeNumElems :: Int
+  , sizeNumBytes :: Int
+  }
+
+flamSize
+  :: forall (elem :: Type) aux
+   . (NumElems elem aux, Storable elem)
+  => aux -> Size
+flamSize aux =
+  Size
+    { sizeNumElems
+    , sizeNumBytes = sizeNumElems * Foreign.sizeOf (undefined :: elem)
+    }
+ where
+  sizeNumElems = numElems aux
diff --git a/runtime/HsBindgen/Runtime/HasCBitfield.hs b/runtime/HsBindgen/Runtime/HasCBitfield.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/HasCBitfield.hs
@@ -0,0 +1,187 @@
+{-# LANGUAGE MagicHash #-}
+
+-- | Declarations with C bitfields
+--
+-- Most users do not directly need to use @HasCField@, and can use record dot
+-- syntax instead. For example, given
+--
+-- Given
+--
+-- > struct DriverFlags {
+-- >   unsigned int safe      : 1;
+-- >   unsigned int allocates : 1;
+-- > };
+--
+-- @hs-bindgen@ will generate code such that if
+--
+-- > flagsPtr :: Ptr DriverFlags
+--
+-- then
+--
+-- > flagsPtr.driverFlags_allocates :: BitfieldPtr CUInt
+--
+-- Module "HsBindgen.Runtime.BitfieldPtr" can be used to interact with
+-- these t'BitfieldPtr's; for example:
+--
+-- > BitfieldPtr.peek flagsPtr.driverFlags_allocates
+--
+-- Bitfields can be chained with regular fields; for example, given
+--
+-- > struct Driver {
+-- >   struct DriverFlags flags;
+-- >   ..
+-- > };
+--
+-- then if
+--
+-- > driverPtr :: Ptr Driver
+--
+-- then
+--
+-- > driverPtr.driver_flags.driverFlags_allocates :: BitfieldPtr CUInt
+--
+-- See also "HsBindgen.Runtime.HasCField".
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.HasCBitfield qualified as HasCBitfield
+module HsBindgen.Runtime.HasCBitfield (
+  HasCBitfield (..),
+  offset,
+  width,
+  toPtr,
+  peek,
+  poke,
+) where
+
+import Data.Kind
+import Data.Proxy
+import Foreign.Ptr
+import GHC.Exts (Proxy#, proxy#)
+import GHC.TypeLits
+
+import HsBindgen.Runtime.BitfieldPtr (BitfieldPtr, mkBitfieldPtr)
+import HsBindgen.Runtime.BitfieldPtr qualified as BitfieldPtr
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support.Bitfield (Bitfield)
+
+-- | Evidence that a C object @a@ has a bit-field with the name @field@.
+--
+-- Bit-fields can be part of structs and unions.
+--
+-- === Struct
+--
+-- If we have the C struct @S@:
+--
+-- > struct S {
+-- >   int x : 2;
+-- >   int y : 3;
+-- > }
+--
+-- And an accompanying Haskell datatype @S@:
+--
+-- > data S = S { s_x :: CInt, s_y :: CInt }
+--
+-- Then we can define two instances
+--
+-- > HasCBitfield S "s_x"
+-- > HasCBitfield S "s_y"
+--
+-- === Union
+--
+-- If we have the C union @U@:
+--
+-- > union U {
+-- >   int x : 2;
+-- >   int y : 3;
+-- > }
+--
+-- And an accompanying Haskell datatype @U@:
+--
+-- > data U = U ... {- details elided -}
+-- > ... {- getters and setters elided -}
+--
+-- Then we can define two instances
+--
+-- > HasCBitfield U "u_x"
+-- > HasCBitfield U "u_y"
+class HasCBitfield (a :: Type) (field :: Symbol) where
+  -- | The type of the bit field
+  type CBitfieldType (a :: Type) (field :: Symbol) :: Type
+
+  -- | The offset (in number of bits) of the bit-field with respect to the parent
+  -- object.
+  bitfieldOffset# :: Proxy# a -> Proxy# field -> Int
+
+  -- | The width (in number of bits) of the bit-field.
+  bitfieldWidth# :: Proxy# a -> Proxy# field -> Int
+
+{-# INLINE offset #-}
+
+-- | The offset (in number of bits) of the bit-field with respect to the
+-- parent object.
+offset
+  :: forall a field
+   . (HasCBitfield a field)
+  => Proxy a
+  -> Proxy field
+  -> Int
+offset = \_ _ -> bitfieldOffset# (proxy# @a) (proxy# @field)
+
+{-# INLINE width #-}
+
+-- | The width (in number of bits) of the bit-field.
+width
+  :: forall a field
+   . (HasCBitfield a field)
+  => Proxy a
+  -> Proxy field
+  -> Int
+width = \_ _ -> bitfieldWidth# (proxy# @a) (proxy# @field)
+
+{-# INLINE toPtr #-}
+
+-- | Convert a pointer to a C object to a pointer to one of the object's
+-- bit-fields.
+toPtr
+  :: forall a field
+   . ( Marshal.StaticSize a
+     , HasCBitfield a field
+     )
+  => Proxy field
+  -> Ptr a
+  -> BitfieldPtr (CBitfieldType a field)
+toPtr _ ptr = mkBitfieldPtr ptr o w
+ where
+  o = bitfieldOffset# (proxy# @a) (proxy# @field)
+  w = bitfieldWidth# (proxy# @a) (proxy# @field)
+
+{-# INLINE peek #-}
+
+-- | Using a pointer to a C object, read from one of the object's bit-fields.
+peek
+  :: forall a field
+   . ( Marshal.StaticSize a
+     , HasCBitfield a field
+     , Bitfield (CBitfieldType a field)
+     )
+  => Proxy field
+  -> Ptr a
+  -> IO (CBitfieldType a field)
+peek field ptr = BitfieldPtr.peek (toPtr field ptr)
+
+{-# INLINE poke #-}
+
+-- | Using a pointer to a C object, write to one of the object's bit-fields.
+poke
+  :: forall a field
+   . ( Marshal.StaticSize a
+     , HasCBitfield a field
+     , Bitfield (CBitfieldType a field)
+     )
+  => Proxy field
+  -> Ptr a
+  -> CBitfieldType a field
+  -> IO ()
+poke field ptr val = BitfieldPtr.poke (toPtr field ptr) val
diff --git a/runtime/HsBindgen/Runtime/HasCField.hs b/runtime/HsBindgen/Runtime/HasCField.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/HasCField.hs
@@ -0,0 +1,194 @@
+{-# LANGUAGE MagicHash #-}
+
+-- | Declarations with C fields
+--
+-- Most users do not directly need to use @HasCField@, and can use record dot
+-- syntax instead. For example, given
+--
+-- > struct DriverInfo {
+-- >   char* name;
+-- >   int version;
+-- > };
+-- >
+-- > struct Driver {
+-- >   struct DriverInfo info;
+-- > };
+--
+-- @hs-bindgen@ will generate code such that if
+--
+-- > driverPtr :: Ptr Driver
+--
+-- then
+--
+-- > driverPtr.driver_version                    :: Ptr DriverInfo
+-- > driverPtr.driver_version.driverInfo_version :: Ptr CInt
+--
+-- Note that chaining like this can only be done for nested structs; no actual
+-- dereferencing takes place! For example, if we additionally had
+--
+-- > struct DriverCode {
+-- >   ..
+-- > };
+-- >
+-- > struct Driver {
+-- >   ..
+-- >   struct DriverCode* code;
+-- > };
+-- >
+--
+-- then
+--
+-- > driverPtr.driver_code :: Ptr (Ptr DriverCode)
+--
+-- (note the double 'Ptr'), which must be dereferenced before any fields of
+-- @DriverCode@ can be accessed.
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.HasCField qualified as HasCField
+module HsBindgen.Runtime.HasCField (
+  -- * Fields
+  HasCField (..),
+  offset,
+  fromPtr,
+  peek,
+  poke,
+  readRaw,
+  writeRaw,
+) where
+
+import Data.Kind
+import Data.Proxy
+import Foreign.Ptr
+import Foreign.Storable hiding (peek, poke)
+import Foreign.Storable qualified
+import GHC.Exts (Proxy#, proxy#)
+import GHC.TypeLits
+
+import HsBindgen.Runtime.Marshal (ReadRaw, WriteRaw)
+import HsBindgen.Runtime.Marshal qualified
+
+-- | Evidence that a C object @a@ has a field with the name @field@.
+--
+-- Fields can be part of structs and unions. Typedefs are a degenerate use case.
+--
+-- === Struct
+--
+-- If we have the C struct @S@:
+--
+-- > struct S {
+-- >   int x;
+-- >   int y;
+-- > }
+--
+-- And an accompanying Haskell datatype @S@:
+--
+-- > data S = S { s_x :: CInt, s_y :: CInt }
+--
+-- Then we can define two instances
+--
+-- > HasCField S "s_x"
+-- > HasCField S "s_y"
+--
+-- === Union
+--
+-- If we have the C union @U@:
+--
+-- > union U {
+-- >   int x;
+-- >   int y;
+-- > }
+--
+-- And an accompanying Haskell datatype @U@:
+--
+-- > data U = U ... {- details elided -}
+-- > ... {- getters and setters elided -}
+--
+-- Then we can define two instances
+--
+-- > HasCField U "u_x"
+-- > HasCField U "u_y"
+--
+-- === Typedef
+--
+-- If we have the C typedef @T@:
+--
+-- > typedef int T;
+--
+-- And an accompanying Haskell newtype @T@:
+--
+-- > newtype T = T { unwrapT :: Int }
+--
+-- Then we can define the instance:
+--
+-- > HasCField T "unwrapT"
+class HasCField (a :: Type) (field :: Symbol) where
+  type CFieldType (a :: Type) (field :: Symbol) :: Type
+
+  -- | The offset (in number of bytes) of the field with respect to the parent
+  -- object.
+  offset# :: Proxy# a -> Proxy# field -> Int
+
+{-# INLINE offset #-}
+
+-- | The offset (in number of bytes) of the field with respect to the parent
+-- object.
+offset
+  :: forall a field
+   . (HasCField a field)
+  => Proxy a
+  -> Proxy field
+  -> Int
+offset = \_ _ -> offset# (proxy# @a) (proxy# @field)
+
+{-# INLINE fromPtr #-}
+
+-- | Convert a pointer to a C object to a pointer to one of the object's fields.
+fromPtr
+  :: forall a field
+   . (HasCField a field)
+  => Proxy field
+  -> Ptr a
+  -> Ptr (CFieldType a field)
+fromPtr _ ptr = ptr `plusPtr` offset# (proxy# @a) (proxy# @field)
+
+{-# INLINE peek #-}
+
+-- | Using a pointer to a C object, read from one of the object's fields.
+peek
+  :: (HasCField a field, Storable (CFieldType a field))
+  => Proxy field
+  -> Ptr a
+  -> IO (CFieldType a field)
+peek field ptr = Foreign.Storable.peek (fromPtr field ptr)
+
+{-# INLINE poke #-}
+
+-- | Using a pointer to a C object, write to one of the object's fields.
+poke
+  :: (HasCField a field, Storable (CFieldType a field))
+  => Proxy field
+  -> Ptr a
+  -> CFieldType a field
+  -> IO ()
+poke field ptr val = Foreign.Storable.poke (fromPtr field ptr) val
+
+-- | Read a field using a pointer to a C object
+{-# INLINE readRaw #-}
+readRaw
+  :: (HasCField a field, ReadRaw (CFieldType a field))
+  => Proxy field
+  -> Ptr a
+  -> IO (CFieldType a field)
+readRaw field ptr = HsBindgen.Runtime.Marshal.readRaw (fromPtr field ptr)
+
+-- | Write a field using a pointer to a C object
+{-# INLINE writeRaw #-}
+writeRaw
+  :: (HasCField a field, WriteRaw (CFieldType a field))
+  => Proxy field
+  -> Ptr a
+  -> CFieldType a field
+  -> IO ()
+writeRaw field ptr = HsBindgen.Runtime.Marshal.writeRaw (fromPtr field ptr)
diff --git a/runtime/HsBindgen/Runtime/IncompleteArray.hs b/runtime/HsBindgen/Runtime/IncompleteArray.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/IncompleteArray.hs
@@ -0,0 +1,228 @@
+-- | C arrays of unknown size
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.IncompleteArray qualified as IA
+module HsBindgen.Runtime.IncompleteArray (
+  IncompleteArray, -- opaque
+  toVector,
+  fromVector,
+
+  -- * Pointers
+  -- $pointers
+  toPtr,
+  toFirstElemPtr,
+  peekArray,
+  pokeArray,
+
+  -- * Construction
+  repeat,
+  fromList,
+
+  -- * Query
+  toList,
+) where
+
+import Data.Coerce (Coercible, coerce)
+import Data.Vector.Storable qualified as VS
+import Foreign.ForeignPtr (mallocForeignPtrArray, withForeignPtr)
+import Foreign.Marshal.Utils (copyBytes)
+import Foreign.Ptr (Ptr, castPtr, plusPtr)
+import Foreign.Storable (Storable (..))
+import GHC.Records (HasField (..))
+import Prelude hiding (repeat)
+
+import HsBindgen.Runtime.IsArray (IsArray (..))
+
+{-------------------------------------------------------------------------------
+  Definition
+-------------------------------------------------------------------------------}
+
+-- | A C array of unknown size
+newtype IncompleteArray a = IA (VS.Vector a)
+  deriving stock (Eq, Show)
+
+type role IncompleteArray nominal
+
+-- | /( O(1) /): Get the underlying 'VS.Vector' representation
+--
+-- This makes the full 'VS.Vector' API available.
+toVector
+  :: (Coercible arrayLike (IncompleteArray a))
+  => arrayLike
+  -> VS.Vector a
+toVector (coerce -> xs) = xs
+
+-- | /( O(1) /): Construct from a 'VS.Vector' representation
+--
+-- This makes the full 'VS.Vector' API available.
+fromVector
+  :: (Coercible arrayLike (IncompleteArray a))
+  => VS.Vector a
+  -> arrayLike
+fromVector = coerce
+
+{-------------------------------------------------------------------------------
+  Pointers
+-------------------------------------------------------------------------------}
+
+-- $pointers
+--
+-- In example C code below, @p1@ points to the array @xs@ as a whole, while @p2@
+-- points to the first element of @xs@.
+--
+-- > extern int xs[];
+-- > void foo () {
+-- >   int (*p1)[] = &xs;
+-- >   int *p2 = &(xs[0]);
+-- > }
+--
+-- Though the types of @p1@ and @p2@ differ, the /values/ of the pointers (the
+-- address they point to) is the same. An array is just a block of contiguous
+-- memory storing array elements. @p1@ points to where @xs@ starts, and @p2@
+-- points to where the first element of @xs@ starts, and these addresses are the
+-- same. In Haskell, the corresponding types for @p1@ and @p2@ respectively are
+-- @'Ptr' ('IncompleteArray' 'Foreign.C.CInt')@ and @'Ptr' 'Foreign.C.CInt'@
+-- respectively.
+--
+-- Functions like 'peekArray' require a @'Ptr' ('IncompleteArray' a)@ argument.
+-- If the user only has access to a @'Ptr' a@ but they know that is pointing to
+-- the first element in an array, then they can use 'toPtr' to convert the
+-- pointer before using 'peekArray' on it. Conversely, if the user has access to
+-- a @'Ptr' ('IncompleteArray' a)@ but they want to convert it to a @'Ptr' a@,
+-- then they can use @'toFirstElemPtr'@.
+--
+-- NOTE: with overloaded record dot syntax, syntax like @.toFirstElemPtr@ is
+-- also supported.
+--
+-- Relevant functions in this module also support pointers of newtypes around
+-- 'IncompleteArray', hence the addition of 'Coercible' constraints in many
+-- places. For example, we can use 'toPtr' at an 'IncompleteArray' type or we
+-- can use 'toPtr' at a newtype around an 'IncompleteArray'.
+--
+-- > newtype A = A (IncompleteArray CInt)
+-- > toPtr @(IncompleteArray CInt) :: Ptr CInt -> Ptr (IncompleteArray CInt)
+-- > toPtr @A                      :: Ptr CInt -> Ptr A
+
+-- | 'toFirstElemPtr' for overloaded record dot syntax
+instance HasField "toFirstElemPtr" (Ptr (IncompleteArray a)) (Ptr a) where
+  getField = toFirstElemPtr
+
+-- | /( O(1) /): Use a pointer to the first element of an array as a pointer to the whole of
+-- said array.
+--
+-- NOTE: this function does not check that the pointer /is/ actually a pointer
+-- to the first element of an array.
+toPtr
+  :: forall arrayLike a
+   . (Coercible arrayLike (IncompleteArray a))
+  => Ptr a
+  -> Ptr arrayLike
+toPtr = castPtr
+ where
+  -- The 'Coercible' constraint is unused but that is intentional, so we
+  -- circumvent the @-Wredundant-constraints@ warning by defining @_unused@.
+  --
+  -- Why is it intentional? The constraint adds a little bit of type safety to
+  -- the use of 'castPtr', which can normally cast pointers arbitrarily.
+  _unused = coerce @arrayLike @(IncompleteArray a)
+
+-- | /( O(1) /): Use a pointer to a whole array as a pointer to the first element of said
+-- array.
+toFirstElemPtr
+  :: forall arrayLike a
+   . (Coercible arrayLike (IncompleteArray a))
+  => Ptr arrayLike
+  -> Ptr a
+toFirstElemPtr ptr = castPtr ptr
+ where
+  -- The 'Coercible' constraint is unused but that is intentional, so we
+  -- circumvent the @-Wredundant-constraints@ warning by defining @_unused@.
+  --
+  -- Why is it intentional? The constraint adds a little bit of type safety to
+  -- the use of 'castPtr', which can normally cast pointers arbitrarily.
+  _unused = coerce @arrayLike @(IncompleteArray a)
+
+-- | /( O(n) /): Peek a number of elements from a pointer to an incomplete array.
+peekArray
+  :: forall a arrayLike
+   . (Coercible arrayLike (IncompleteArray a), Storable a)
+  => Int
+  -> Ptr arrayLike
+  -> IO arrayLike
+peekArray = peekArrayOff 0
+
+-- | /( O(n) /): Peek a number of elements from a pointer to an incomplete array, starting
+-- at an offset in terms of a number of array elements into the array pointer.
+peekArrayOff
+  :: forall a arrayLike
+   . (Coercible arrayLike (IncompleteArray a), Storable a)
+  => Int
+  -> Int
+  -> Ptr arrayLike
+  -> IO arrayLike
+peekArrayOff off size ptr = do
+  fptr <- mallocForeignPtrArray @a size
+  withForeignPtr fptr $ \(ptr' :: Ptr a) -> do
+    copyBytes ptr' (castPtr ptr `plusPtr` offBytes) (size * sizeOfA)
+  vs <- VS.freeze (VS.MVector size fptr)
+  return $ coerce (IA vs)
+ where
+  sizeOfA = sizeOf (undefined :: a)
+  offBytes = sizeOfA * off
+
+-- | /( O(n) /): Poke a number of elements to a pointer to an incomplete array.
+pokeArray
+  :: forall a arrayLike
+   . (Coercible arrayLike (IncompleteArray a), Storable a)
+  => Ptr arrayLike
+  -> arrayLike
+  -> IO ()
+pokeArray = pokeArrayOff 0
+
+-- | /( O(n) /): Poke a number of elements to a pointer to an incomplete array, starting at
+-- an offset in terms of a number of array elements into the array pointer.
+pokeArrayOff
+  :: forall a arrayLike
+   . (Coercible arrayLike (IncompleteArray a), Storable a)
+  => Int
+  -> Ptr arrayLike
+  -> arrayLike
+  -> IO ()
+pokeArrayOff off ptr (coerce -> IA vs) = do
+  VS.MVector size fptr <- VS.unsafeThaw vs
+  withForeignPtr fptr $ \(ptr' :: Ptr a) ->
+    copyBytes (castPtr ptr) (ptr' `plusPtr` offBytes) (size * sizeOfA)
+ where
+  sizeOfA = sizeOf (undefined :: a)
+  offBytes = sizeOfA * off
+
+instance IsArray (IncompleteArray a) where
+  type Elem (IncompleteArray a) = a
+
+  -- \| /( O(n) /)
+  withElemPtr (IA v) k = do
+    -- we copy the data, as e.g. @int fun(int xs[])@ may mutate it.
+    VS.MVector _ fptr <- VS.thaw v
+    withForeignPtr fptr $ \(ptr :: Ptr a) -> k ptr
+
+{-------------------------------------------------------------------------------
+  Construction
+-------------------------------------------------------------------------------}
+
+-- | /( O(n) /)
+repeat :: (Storable a) => Int -> a -> IncompleteArray a
+repeat n x = IA (VS.replicate n x)
+
+-- | /( O(n) /)
+fromList :: (Storable a) => [a] -> IncompleteArray a
+fromList xs = IA (VS.fromList xs)
+
+{-------------------------------------------------------------------------------
+  Query
+-------------------------------------------------------------------------------}
+
+-- | /( O(n) /)
+toList :: (Storable a) => IncompleteArray a -> [a]
+toList (IA v) = VS.toList v
diff --git a/runtime/HsBindgen/Runtime/IsArray.hs b/runtime/HsBindgen/Runtime/IsArray.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/IsArray.hs
@@ -0,0 +1,17 @@
+-- | Class for C arrays (of known or unknown size)
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.IsArray qualified as IsA
+module HsBindgen.Runtime.IsArray (
+  IsArray (..),
+) where
+
+import Data.Kind (Type)
+import Foreign.Ptr (Ptr)
+import Foreign.Storable (Storable)
+
+class IsArray a where
+  type Elem a :: Type
+  withElemPtr :: (Storable (Elem a)) => a -> (Ptr (Elem a) -> IO r) -> IO r
diff --git a/runtime/HsBindgen/Runtime/LibC.hs b/runtime/HsBindgen/Runtime/LibC.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/LibC.hs
@@ -0,0 +1,348 @@
+-- | Types used by the C standard library external binding specification
+--
+-- Intended for qualified import.
+--
+-- > import HsBindgen.Runtime.LibC qualified as LibC
+module HsBindgen.Runtime.LibC (
+  -- * Primitive types
+  -- $PrimitiveTypes
+  Foreign.C.CChar (..),
+  Foreign.C.CUChar (..),
+  Foreign.C.CShort (..),
+  Foreign.C.CUShort (..),
+  Foreign.C.CInt (..),
+  Foreign.C.CUInt (..),
+  Foreign.C.CLong (..),
+  Foreign.C.CULong (..),
+  Foreign.C.CLLong (..),
+  Foreign.C.CULLong (..),
+  Foreign.C.CFloat (..),
+  Foreign.C.CDouble (..),
+  Foreign.C.CString,
+
+  -- * Boolean types
+  -- $BooleanTypes
+  Foreign.C.CBool (..),
+
+  -- * Integral types
+  -- $IntegralTypes
+  Data.Int.Int8,
+  Data.Int.Int16,
+  Data.Int.Int32,
+  Data.Int.Int64,
+  Data.Word.Word8,
+  Data.Word.Word16,
+  Data.Word.Word32,
+  Data.Word.Word64,
+  Foreign.C.CIntMax (..),
+  Foreign.C.CUIntMax (..),
+  Foreign.C.CIntPtr (..),
+  Foreign.C.CUIntPtr (..),
+
+  -- * Floating types
+  -- $FloatingTypes
+  LibC.CFenvT,
+  LibC.CFexceptT,
+
+  -- * Standard definitions
+  -- $StandardDefinitions
+  Foreign.C.CSize (..),
+  Foreign.C.CPtrdiff (..),
+
+  -- * Non-local jump types
+  -- $NonLocalJumpTypes
+  Foreign.C.CJmpBuf,
+
+  -- * Wide character types
+  -- $WideCharacterTypes
+  Foreign.C.CWchar (..),
+  LibC.CWintT (..),
+  LibC.CMbstateT,
+  LibC.CWctransT (..),
+  LibC.CWctypeT (..),
+  LibC.CChar16T (..),
+  LibC.CChar32T (..),
+
+  -- * Localization types
+  -- $LocalizationTypes
+
+  -- * Time types
+  -- $TimeTypes
+  Foreign.C.CTime,
+  Foreign.C.CClock,
+  LibC.CTm (..),
+
+  -- * File types
+  -- $FileTypes
+  Foreign.C.CFile,
+  Foreign.C.CFpos,
+
+  -- * Signal types
+  -- $SignalTypes
+  Foreign.C.CSigAtomic (..),
+) where
+
+import Data.Int qualified
+import Data.Word qualified
+import Foreign.C qualified
+
+import HsBindgen.Runtime.Support.LibC.Auxiliary as LibC
+
+{-
+  The binding specification for the types in this module is defined in
+  @HsBindgen.BindingSpec.Private.Stdlib@ in the @hs-bindgen:internal@ library,
+  in the same order.
+
+  References in chronological order:
+  - https://github.com/well-typed/hs-bindgen/issues/293
+  - https://github.com/well-typed/hs-bindgen/issues/478
+  - https://github.com/well-typed/hs-bindgen/pull/957
+  - https://github.com/well-typed/hs-bindgen/issues/1123
+-}
+
+{-------------------------------------------------------------------------------
+  Primitive types
+-------------------------------------------------------------------------------}
+
+-- $PrimitiveTypes
+--
+-- The following types are available in all C standards.  The corresponding
+-- Haskell types are defined in @base@ with platform-specific implementations.
+--
+-- Integral types:
+--
+-- * @char@ corresponds to Haskell type 'Foreign.C.CChar'.
+-- * @unsigned char@ corresponds to Haskell type 'Foreign.C.CUChar'.
+-- * @short@ corresponds to Haskell type 'Foreign.C.CShort'.
+-- * @unsigned short@ corresponds to Haskell type 'Foreign.C.CUShort'.
+-- * @int@ corresponds to Haskell type 'Foreign.C.CInt'.
+-- * @unsigned int@ corresponds to Haskell type 'Foreign.C.CUInt'.
+-- * @long@ corresponds to Haskell type 'Foreign.C.CLong'.
+-- * @unsigned long@ corresponds to Haskell type 'Foreign.C.CULong'.
+-- * @long long@ corresponds to Haskell type 'Foreign.C.CLLong'.
+-- * @unsigned long long@ corresponds to Haskell type 'Foreign.C.CULLong'.
+--
+-- Floating types:
+--
+-- * @float@ corresponds to Haskell type 'Foreign.C.CFloat'.
+-- * @double@ corresponds to Haskell type 'Foreign.C.CDouble'.
+-- * @long double@ is not yet supported.
+--
+-- Other types:
+--
+-- * @char*@ corresponds to Haskell type 'Foreign.C.CString'.
+
+{-------------------------------------------------------------------------------
+  Boolean types
+-------------------------------------------------------------------------------}
+
+-- $BooleanTypes
+--
+-- Boolean data types have integral representations where @0@ represents 'False'
+-- and @1@ represents 'True'.
+--
+-- C standards prior to C99 did not include a boolean type.  C99 defined
+-- @_Bool@, which was deprecated in C23.  C23 defines a @bool@ type.  Relevant
+-- macros are defined in the @stdbool.h@ header file.
+--
+-- 'Foreign.C.CBool' is defined in @base@ with a platform-specific
+-- implementation.  It should be compatible with boolean types across all of the
+-- C standards.  Only values @0@ and @1@ may be used even though the
+-- representation allows for other values.
+
+{-------------------------------------------------------------------------------
+  Integral types
+-------------------------------------------------------------------------------}
+
+-- $IntegralTypes
+--
+-- The following C types are available since C99 and are provided by the
+-- @stdint.h@ and @inttypes.h@ header files.
+--
+-- * @int8_t@ is a signed integral type with exactly 8 bits.  'Data.Int.Int8' is
+--   the corresponding Haskell type.
+-- * @int16_t@ is a signed integral type with exactly 16 bits.  'Data.Int.Int16'
+--   is the corresponding Haskell type.
+-- * @int32_t@ is a signed integral type with exactly 32 bits.  'Data.Int.Int32'
+--   is the corresponding Haskell type.
+-- * @int64_t@ is a signed integral type with exactly 64 bits.  'Data.Int.Int64'
+--   is the corresponding Haskell type.
+-- * @uint8_t@ is an unsigned integral type with exactly 8 bits.
+--   'Data.Word.Word8' is the corresponding Haskell type.
+-- * @uint16_t@ is an unsigned integral type with exactly 16 bits.
+--   'Data.Word.Word16' is the corresponding Haskell type.
+-- * @uint32_t@ is an unsigned integral type with exactly 32 bits.
+--   'Data.Word.Word32' is the corresponding Haskell type.
+-- * @uint64_t@ is an unsigned integral type with exactly 64 bits.
+--   'Data.Word.Word64' is the corresponding Haskell type.
+-- * @int_least8_t@ is a signed integral type with at least 8 bits, such that no
+--   other signed integral type exists with a smaller size and at least 8 bits.
+--   'Data.Int.Int8' is the corresponding Haskell type.
+-- * @int_least16_t@ is a signed integral type with at least 16 bits, such that
+--   no other signed integral type exists with a smaller size and at least 16
+--   bits.  'Data.Int.Int16' is the corresponding Haskell type.
+-- * @int_least32_t@ is a signed integral type with at least 32 bits, such that
+--   no other signed integral type exists with a smaller size and at least 32
+--   bits.  'Data.Int.Int32' is the corresponding Haskell type.
+-- * @int_least64_t@ is a signed integral type with at least 64 bits, such that
+--   no other signed integral type exists with a smaller size and at least 64
+--   bits.  'Data.Int.Int64' is the corresponding Haskell type.
+-- * @uint_least8_t@ is an unsigned integral type with at least 8 bits, such
+--   that no other unsigned integral type exists with a smaller size and at
+--   least 8 bits.  'Data.Word.Word8' is the corresponding Haskell type.
+-- * @uint_least16_t@ is an unsigned integral type with at least 16 bits, such
+--   that no other unsigned integral type exists with a smaller size and at
+--   least 16 bits.  'Data.Word.Word16' is the corresponding Haskell type.
+-- * @uint_least32_t@ is an unsigned integral type with at least 32 bits, such
+--   that no other unsigned integral type exists with a smaller size and at
+--   least 32 bits.  'Data.Word.Word32' is the corresponding Haskell type.
+-- * @uint_least64_t@ is an unsigned integral type with at least 64 bits, such
+--   that no other unsigned integral type exists with a smaller size and at
+--   least 64 bits.  'Data.Word.Word64' is the corresponding Haskell type.
+-- * @int_fast8_t@ is a signed integral type with at least 8 bits, such that it
+--   is at least as fast as any other signed integral type that has at least 8
+--   bits.  'Data.Int.Int8' is the corresponding Haskell type.
+-- * @int_fast16_t@ is a signed integral type with at least 16 bits, such that
+--   it is at least as fast as any other signed integral type that has at least
+--   16 bits.  'Data.Int.Int16' is the corresponding Haskell type.
+-- * @int_fast32_t@ is a signed integral type with at least 32 bits, such that
+--   it is at least as fast as any other signed integral type that has at least
+--   32 bits.  'Data.Int.Int32' is the corresponding Haskell type.
+-- * @int_fast64_t@ is a signed integral type with at least 64 bits, such that
+--   it is at least as fast as any other signed integral type that has at least
+--   64 bits.  'Data.Int.Int64' is the corresponding Haskell type.
+-- * @uint_fast8_t@ is an unsigned integral type with at least 8 bits, such that
+--   it is at least as fast as any other unsigned integral type that has at
+--   least 8 bits.  'Data.Word.Word8' is the corresponding Haskell type.
+-- * @uint_fast16_t@ is an unsigned integral type with at least 16 bits, such
+--   that it is at least as fast as any other unsigned integral type that has at
+--   least 16 bits.  'Data.Word.Word16' is the corresponding Haskell type.
+-- * @uint_fast32_t@ is an unsigned integral type with at least 32 bits, such
+--   that it is at least as fast as any other unsigned integral type that has at
+--   least 32 bits.  'Data.Word.Word32' is the corresponding Haskell type.
+-- * @uint_fast64_t@ is an unsigned integral type with at least 64 bits, such
+--   that it is at least as fast as any other unsigned integral type that has at
+--   least 64 bits.  'Data.Word.Word64' is the corresponding Haskell type.
+-- * @intmax_t@ is the signed integral type with the maximum width supported.
+--   'Foreign.C.CIntMax', defined in @base@ with a platform-specific
+--   implementation, is the corresponding Haskell type.
+-- * @uintmax_t@ is the unsigned integral type with the maximum width supported.
+--   'Foreign.C.CUIntMax', defined in @base@ with a platform-specific
+--   implementation, is the corresponding Haskell type.
+-- * @intptr_t@ is a signed integral type capable of holding a value converted
+--   from a void pointer and then be converted back to that type with a value
+--   that compares equal to the original pointer.  'Foreign.C.CIntPtr', defined
+--   in @base@ with a platform-specific implementation, is the corresponding
+--   Haskell type.
+-- * @uintptr_t@ is an unsigned integral type capable of holding a value
+--   converted from a void pointer and then be converted back to that type with
+--   a value that compares equal to the original pointer.  'Foreign.C.CUIntPtr',
+--   defined in @base@ with a platform-specific implementation, is the
+--   corresponding Haskell type.
+
+{-------------------------------------------------------------------------------
+  Floating types
+-------------------------------------------------------------------------------}
+
+-- $FloatingTypes
+--
+-- @float_t@, defined in the @math.h@ header file, is not supported yet because
+-- it uses @long double@.
+--
+-- @double_t@, defined in the @math.h@ header file, is not supported yet because
+-- it uses @long double@.
+
+{-------------------------------------------------------------------------------
+  Standard definitions
+-------------------------------------------------------------------------------}
+
+-- $StandardDefinitions
+--
+-- @size_t@ is an unsigned integral type used to represent the size of objects
+-- in memory and dereference elements of an array.  It is defined in the
+-- @stddef.h@ header file, and it is made available in many other header files
+-- that use it.  'Foreign.C.CSize', defined in @base@ with a platform-specific
+-- implementation, is the corresponding Haskell type.
+--
+-- @ptrdiff_t@ is a type that represents the result of pointer subtraction.  It
+-- is defined in the @stddef.h@ header file.  'Foreign.C.CPtrdiff`, defined in
+-- @base@ with a platform-specific implementation, is the corresponding Haskell
+-- type.
+--
+-- @max_align_t@, defined in the @stddef.h@ header from C11, is not supported
+-- yet because it uses @long double@.
+
+{-------------------------------------------------------------------------------
+  Non-local jump types
+-------------------------------------------------------------------------------}
+
+-- $NonLocalJumpTypes
+--
+-- @jmp_buf@ holds information to restore the calling environment.  It is
+-- defined in the @setjmp.h@ header file.  'Foreign.C.CJmpBuf', defined in
+-- @base@ as an opaque type, may only be used with a 'Foreign.Ptr.Ptr'.
+
+{-------------------------------------------------------------------------------
+  Wide character types
+-------------------------------------------------------------------------------}
+
+-- $WideCharacterTypes
+--
+-- @wchar_t@ represents wide characters.  It is available since C95.  It is
+-- defined in the @stddef.h@ and @wchar.h@ header files, and it is made
+-- available in other header files that use it.  'Foreign.C.CWchar', defined in
+-- @base@ with a platform-specific implementation, is the corresponding Haskell
+-- type.
+
+{-------------------------------------------------------------------------------
+  Localization types
+-------------------------------------------------------------------------------}
+
+-- $LocalizationTypes
+--
+-- @struct lconv@, defined in the @locale.h@ header file, is not supported yet
+-- because fields differ across C standards.
+
+{-------------------------------------------------------------------------------
+  Time types
+-------------------------------------------------------------------------------}
+
+-- $TimeTypes
+--
+-- @time_t@ represents a point in time.  It is not portable, as libraries may
+-- use different time representations.  It is defined in the @time.h@ header
+-- file, and it is made available in other header files that use it.
+-- 'Foreign.C.CTime', defined in @base@ with a platform-specific implementation,
+-- is the corresponding Haskell type.
+--
+-- @clock_t@ represents clock tick counts, in units of time of a constant but
+-- system-specific duration.  It is defined in the @time.h@ header file, and it
+-- is made available in other header files that use it.  'Foreign.C.CClock',
+-- defined in @base@ with a platform-specific implementation, is the
+-- corresponding Haskell type.
+
+{-------------------------------------------------------------------------------
+  File types
+-------------------------------------------------------------------------------}
+
+-- $FileTypes
+--
+-- @FILE@ identifies and contains information that controls a stream.  It is
+-- defined in the @stdio.h@ header file, and it is made available in other
+-- header files that use it.  'Foreign.C.CFile', defined in @base@ as an opaque
+-- type, may only be used with a 'Foreign.Ptr.Ptr'.
+--
+-- @fpos_t@ contains information that specifies a position within a file.  It is
+-- defined in the @stdio.h@ header file.  'Foreign.C.CFpos', defined in @base@
+-- as an opaque type, may only be used with a 'Foreign.Ptr.Ptr'.
+
+{-------------------------------------------------------------------------------
+  Signal types
+-------------------------------------------------------------------------------}
+
+-- $SignalTypes
+--
+-- @sig_atomic_t@ is an integral type that represents an object that can be
+-- accessed as an atomic entity even in the presence of asynchronous signals.
+-- It is defined in the @signal.h@ header file.  'Foreign.C.CSigAtomic', defined
+-- in @base@ with a platform-specific implementation.
diff --git a/runtime/HsBindgen/Runtime/Marshal.hs b/runtime/HsBindgen/Runtime/Marshal.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Marshal.hs
@@ -0,0 +1,449 @@
+-- | Marshaling and serialization
+--
+-- Generalizes 'Storable'. For details, see
+-- https://github.com/well-typed/hs-bindgen/issues/649.
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.Marshal qualified as Marshal
+module HsBindgen.Runtime.Marshal (
+  -- * Type Classes
+  StaticSize (..),
+  ReadRaw (..),
+  WriteRaw (..),
+  EquivStorable (..),
+
+  -- * Utility Functions
+  readRawByteOff,
+  writeRawByteOff,
+  readRawElemOff,
+  writeRawElemOff,
+  maybeReadRaw,
+  with,
+  withZero,
+  new,
+  newZero,
+) where
+
+import Data.Complex (Complex ((:+)))
+import Data.Int (Int16, Int32, Int64, Int8)
+import Data.Proxy (Proxy (Proxy))
+import Data.Word (Word16, Word32, Word64, Word8)
+import Foreign.C qualified as C
+import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)
+import Foreign.Marshal.Alloc qualified as Alloc
+import Foreign.Marshal.Utils qualified as Utils
+import Foreign.Ptr (FunPtr, Ptr)
+import Foreign.Ptr qualified as Ptr
+import Foreign.StablePtr (StablePtr)
+import Foreign.Storable (Storable)
+import Foreign.Storable qualified as Storable
+import GHC.ForeignPtr (mallocForeignPtrAlignedBytes)
+
+import HsBindgen.Runtime.PtrConst (PtrConst)
+
+{-------------------------------------------------------------------------------
+  Type Classes
+-------------------------------------------------------------------------------}
+
+-- | Size and alignment for values that have a static size in memory
+--
+-- Types that are instances of 'Storable' can derive this instance.
+class StaticSize a where
+  -- | Storage requirements (bytes)
+  staticSizeOf :: Proxy a -> Int
+  default staticSizeOf :: (Storable a) => Proxy a -> Int
+  staticSizeOf _proxy = Storable.sizeOf @a undefined
+
+  -- | Alignment (bytes)
+  staticAlignment :: Proxy a -> Int
+  default staticAlignment :: (Storable a) => Proxy a -> Int
+  staticAlignment _proxy = Storable.alignment @a undefined
+
+-- | Values that can be read from memory
+--
+-- Types that are instances of 'Storable' can derive this instance.
+class ReadRaw a where
+  -- | Read a value from the given memory location
+  --
+  -- This function might require a properly aligned address to function
+  -- correctly, depending on the architecture.
+  readRaw :: Ptr a -> IO a
+  default readRaw :: (Storable a) => Ptr a -> IO a
+  readRaw = Storable.peek
+
+-- | Values that can be written to memory
+--
+-- Types that are instances of 'Storable' can derive this instance.
+class WriteRaw a where
+  -- | Write a value to the given memory location
+  --
+  -- This function might require a properly aligned address to function
+  -- correctly, depending on the architecture.
+  writeRaw :: Ptr a -> a -> IO ()
+  default writeRaw :: (Storable a) => Ptr a -> a -> IO ()
+  writeRaw = Storable.poke
+
+-- | Type used to derive a 'Storable' instance when the type has 'StaticSize',
+-- 'ReadRaw', and 'WriteRaw' instances
+--
+-- Use the @DerivingVia@ GHC extension as follows:
+--
+-- @
+-- {-# LANGUAGE DerivingVia #-}
+--
+-- data Foo = Foo { ... }
+--   deriving Storable via EquivStorable Foo
+-- @
+newtype EquivStorable a = EquivStorable a
+
+instance
+  (ReadRaw a, StaticSize a, WriteRaw a)
+  => Storable (EquivStorable a)
+  where
+  sizeOf _ = staticSizeOf @a undefined
+  alignment _ = staticAlignment @a undefined
+
+  peek ptr = EquivStorable <$> readRaw (Ptr.castPtr ptr)
+
+  poke ptr (EquivStorable x) = writeRaw (Ptr.castPtr ptr) x
+
+{-------------------------------------------------------------------------------
+  Utility Functions
+-------------------------------------------------------------------------------}
+
+-- | Read a value from the given memory location, given by a base address and an
+-- offset
+readRawByteOff :: (ReadRaw a) => Ptr b -> Int -> IO a
+readRawByteOff ptr off = readRaw (ptr `Ptr.plusPtr` off)
+
+-- | Write a value to the given memory location, given by a base address and an
+-- offset
+writeRawByteOff :: (WriteRaw a) => Ptr b -> Int -> a -> IO ()
+writeRawByteOff ptr off = writeRaw (ptr `Ptr.plusPtr` off)
+
+-- | Read a value from a memory area regarded as an array of values of the same
+-- kind
+--
+-- The first argument specifies the start address of the array.  The second
+-- specifies the (zero-based) index into the array.
+readRawElemOff :: forall a. (ReadRaw a, StaticSize a) => Ptr a -> Int -> IO a
+readRawElemOff ptr off = readRawByteOff ptr $ off * staticSizeOf @a Proxy
+
+-- | Write a value to a memory area regarded as an array of values of the same
+-- kind
+--
+-- The first argument specifies the start address of the array.  The second
+-- specifies the (zero-based) index into the array.
+writeRawElemOff
+  :: forall a
+   . (StaticSize a, WriteRaw a)
+  => Ptr a
+  -> Int
+  -> a
+  -> IO ()
+writeRawElemOff ptr off = writeRawByteOff ptr $ off * staticSizeOf @a Proxy
+
+-- | Read a value from memory when passed a non-null pointer
+maybeReadRaw :: (ReadRaw a) => Ptr a -> IO (Maybe a)
+maybeReadRaw ptr
+  | ptr == Ptr.nullPtr = return Nothing
+  | otherwise = Just <$> readRaw ptr
+
+-- | Allocate local memory, write the specified value, and call a function with
+-- the pointer
+--
+-- The allocated memory is aligned.
+--
+-- Memory that is not written to by 'Storable.poke' may contain arbitrary data.
+--
+-- The allocated memory is freed when the function terminates, either normally
+-- or via an exception.  The passed pointer must therefore /not/ be used after
+-- this.
+with
+  :: forall a b
+   . (StaticSize a, WriteRaw a)
+  => a
+  -> (Ptr a -> IO b)
+  -> IO b
+with x f = Alloc.allocaBytesAligned size align $ \ptr -> do
+  writeRaw ptr x
+  f ptr
+ where
+  size, align :: Int
+  size = staticSizeOf @a Proxy
+  align = staticAlignment @a Proxy
+
+-- | Allocate local memory, write the specified value, and call a function with
+-- the pointer
+--
+-- The allocated memory is aligned.
+--
+-- The memory is filled with bytes of value zero before the value is written.
+-- Memory that is not written to by 'Storable.poke' contains zeros, not
+-- arbitrary data.
+--
+-- The allocated memory is freed when the function terminates, either normally
+-- or via an exception.  The passed pointer must therefore /not/ be used after
+-- this.
+withZero
+  :: forall a b
+   . (StaticSize a, WriteRaw a)
+  => a
+  -> (Ptr a -> IO b)
+  -> IO b
+withZero x f = Alloc.allocaBytesAligned size align $ \ptr -> do
+  Utils.fillBytes ptr 0 size
+  writeRaw ptr x
+  f ptr
+ where
+  size, align :: Int
+  size = staticSizeOf @a Proxy
+  align = staticAlignment @a Proxy
+
+-- | Allocate memory, write the specified value, and the 'ForeignPtr'
+--
+-- The allocated memory is aligned.
+--
+-- Memory that is not written to by 'writeRaw' may contain arbitrary data.
+new
+  :: forall a
+   . (StaticSize a, WriteRaw a)
+  => a
+  -> IO (ForeignPtr a)
+new x = do
+  fptr <- mallocForeignPtrAlignedBytes size align
+  withForeignPtr fptr $ \ptr -> writeRaw ptr x
+  return fptr
+ where
+  size, align :: Int
+  size = staticSizeOf @a Proxy
+  align = staticAlignment @a Proxy
+
+-- | Allocate memory, write the specified value, and the 'ForeignPtr'
+--
+-- The allocated memory is aligned.
+--
+-- The memory is filled with bytes of value zero before the value is written.
+-- Memory that is not written to by 'writeRaw' contains zeros, not arbitrary
+-- data.
+newZero
+  :: forall a
+   . (StaticSize a, WriteRaw a)
+  => a
+  -> IO (ForeignPtr a)
+newZero x = do
+  fptr <- mallocForeignPtrAlignedBytes size align
+  withForeignPtr fptr $ \ptr -> do
+    Utils.fillBytes ptr 0 size
+    writeRaw ptr x
+  return fptr
+ where
+  size, align :: Int
+  size = staticSizeOf @a Proxy
+  align = staticAlignment @a Proxy
+
+{-------------------------------------------------------------------------------
+  Instances
+-------------------------------------------------------------------------------}
+
+instance StaticSize C.CChar
+instance ReadRaw C.CChar
+instance WriteRaw C.CChar
+
+instance StaticSize C.CSChar
+instance ReadRaw C.CSChar
+instance WriteRaw C.CSChar
+
+instance StaticSize C.CUChar
+instance ReadRaw C.CUChar
+instance WriteRaw C.CUChar
+
+instance StaticSize C.CShort
+instance ReadRaw C.CShort
+instance WriteRaw C.CShort
+
+instance StaticSize C.CUShort
+instance ReadRaw C.CUShort
+instance WriteRaw C.CUShort
+
+instance StaticSize C.CInt
+instance ReadRaw C.CInt
+instance WriteRaw C.CInt
+
+instance StaticSize C.CUInt
+instance ReadRaw C.CUInt
+instance WriteRaw C.CUInt
+
+instance StaticSize C.CLong
+instance ReadRaw C.CLong
+instance WriteRaw C.CLong
+
+instance StaticSize C.CULong
+instance ReadRaw C.CULong
+instance WriteRaw C.CULong
+
+instance StaticSize C.CPtrdiff
+instance ReadRaw C.CPtrdiff
+instance WriteRaw C.CPtrdiff
+
+instance StaticSize C.CSize
+instance ReadRaw C.CSize
+instance WriteRaw C.CSize
+
+instance StaticSize C.CWchar
+instance ReadRaw C.CWchar
+instance WriteRaw C.CWchar
+
+instance StaticSize C.CSigAtomic
+instance ReadRaw C.CSigAtomic
+instance WriteRaw C.CSigAtomic
+
+instance StaticSize C.CLLong
+instance ReadRaw C.CLLong
+instance WriteRaw C.CLLong
+
+instance StaticSize C.CULLong
+instance ReadRaw C.CULLong
+instance WriteRaw C.CULLong
+
+instance StaticSize C.CBool
+instance ReadRaw C.CBool
+instance WriteRaw C.CBool
+
+instance StaticSize C.CIntPtr
+instance ReadRaw C.CIntPtr
+instance WriteRaw C.CIntPtr
+
+instance StaticSize C.CUIntPtr
+instance ReadRaw C.CUIntPtr
+instance WriteRaw C.CUIntPtr
+
+instance StaticSize C.CIntMax
+instance ReadRaw C.CIntMax
+instance WriteRaw C.CIntMax
+
+instance StaticSize C.CUIntMax
+instance ReadRaw C.CUIntMax
+instance WriteRaw C.CUIntMax
+
+instance StaticSize C.CClock
+instance ReadRaw C.CClock
+instance WriteRaw C.CClock
+
+instance StaticSize C.CTime
+instance ReadRaw C.CTime
+instance WriteRaw C.CTime
+
+instance StaticSize C.CUSeconds
+instance ReadRaw C.CUSeconds
+instance WriteRaw C.CUSeconds
+
+instance StaticSize C.CSUSeconds
+instance ReadRaw C.CSUSeconds
+instance WriteRaw C.CSUSeconds
+
+instance StaticSize C.CFloat
+instance ReadRaw C.CFloat
+instance WriteRaw C.CFloat
+
+instance StaticSize C.CDouble
+instance ReadRaw C.CDouble
+instance WriteRaw C.CDouble
+
+instance StaticSize (Ptr a)
+instance ReadRaw (Ptr a)
+instance WriteRaw (Ptr a)
+
+instance StaticSize (PtrConst a)
+instance ReadRaw (PtrConst a)
+instance WriteRaw (PtrConst a)
+
+instance StaticSize (FunPtr a)
+instance ReadRaw (FunPtr a)
+instance WriteRaw (FunPtr a)
+
+instance StaticSize (StablePtr a)
+instance ReadRaw (StablePtr a)
+instance WriteRaw (StablePtr a)
+
+instance StaticSize Int8
+instance ReadRaw Int8
+instance WriteRaw Int8
+
+instance StaticSize Int16
+instance ReadRaw Int16
+instance WriteRaw Int16
+
+instance StaticSize Int32
+instance ReadRaw Int32
+instance WriteRaw Int32
+
+instance StaticSize Int64
+instance ReadRaw Int64
+instance WriteRaw Int64
+
+instance StaticSize Word8
+instance ReadRaw Word8
+instance WriteRaw Word8
+
+instance StaticSize Word16
+instance ReadRaw Word16
+instance WriteRaw Word16
+
+instance StaticSize Word32
+instance ReadRaw Word32
+instance WriteRaw Word32
+
+instance StaticSize Word64
+instance ReadRaw Word64
+instance WriteRaw Word64
+
+instance StaticSize Int
+instance ReadRaw Int
+instance WriteRaw Int
+
+instance StaticSize Word
+instance ReadRaw Word
+instance WriteRaw Word
+
+instance StaticSize Float
+instance ReadRaw Float
+instance WriteRaw Float
+
+instance StaticSize Double
+instance ReadRaw Double
+instance WriteRaw Double
+
+instance StaticSize Char
+instance ReadRaw Char
+instance WriteRaw Char
+
+instance StaticSize Bool
+instance ReadRaw Bool
+instance WriteRaw Bool
+
+instance StaticSize ()
+instance ReadRaw ()
+instance WriteRaw ()
+
+--------------------------------------------------------------------------------
+
+-- The instances for 'Complex' follow the 'Storable' instance.  It is rewritten
+-- so that they only rely on the classes defined in this module, not 'Storable'.
+
+instance (StaticSize a) => StaticSize (Complex a) where
+  staticSizeOf _ = 2 * staticSizeOf (Proxy @a)
+  staticAlignment _ = staticAlignment (Proxy @a)
+
+instance (ReadRaw a, StaticSize a) => ReadRaw (Complex a) where
+  readRaw ptrComplex =
+    let ptrPart = Ptr.castPtr ptrComplex
+     in (:+) <$> readRaw ptrPart <*> readRawElemOff ptrPart 1
+
+instance (StaticSize a, WriteRaw a) => WriteRaw (Complex a) where
+  writeRaw ptrComplex (r :+ i) = do
+    let ptrPart = Ptr.castPtr ptrComplex
+    writeRaw ptrPart r
+    writeRawElemOff ptrPart 1 i
diff --git a/runtime/HsBindgen/Runtime/Prelude.hs b/runtime/HsBindgen/Runtime/Prelude.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Prelude.hs
@@ -0,0 +1,64 @@
+-- | Common definitions for interfacing with @hs-bindgen@ generated code.
+--
+-- This prelude re-exports every runtime definition that is safe to use
+-- unqualified, /including/ definitions from modules that are otherwise intended
+-- for qualified import (e.g. 'WithFlam' from "HsBindgen.Runtime.FLAM").
+module HsBindgen.Runtime.Prelude (
+  -- * C enumerations
+  CEnum (..),
+  SequentialCEnum (..),
+  AsCEnum (..),
+  AsSequentialCEnum (..),
+
+  -- * Fields and bit-fields
+  HasCField (..),
+  HasCBitfield (..),
+  BitfieldPtr,
+  mkBitfieldPtr,
+
+  -- * Function pointers and instances
+  ToFunPtr (..),
+  FromFunPtr (..),
+  withFunPtr,
+
+  -- * Pointers
+  plusPtrElem,
+  safeCastFunPtr,
+
+  -- * Arrays
+  ConstantArray, -- opaque
+  IncompleteArray, -- opaque
+  IsArray (Elem),
+
+  -- * Flexible array members
+  WithFlam, -- opaque
+
+  -- * Unions
+  IsUnion,
+
+  -- * Marshaling and serialization
+  StaticSize (..),
+  ReadRaw (..),
+  WriteRaw (..),
+  EquivStorable (..),
+  -- Blocks
+  Block (..),
+
+  -- * Read-only pointers
+  PtrConst, -- type synonym or opaque, depending on version of @base@
+) where
+
+import HsBindgen.Runtime.BitfieldPtr
+import HsBindgen.Runtime.Block
+import HsBindgen.Runtime.CEnum
+import HsBindgen.Runtime.ConstantArray
+import HsBindgen.Runtime.FLAM (WithFlam)
+import HsBindgen.Runtime.HasCBitfield
+import HsBindgen.Runtime.HasCField
+import HsBindgen.Runtime.IncompleteArray
+import HsBindgen.Runtime.IsArray
+import HsBindgen.Runtime.Marshal
+import HsBindgen.Runtime.PtrConst
+import HsBindgen.Runtime.Support.FunPtr
+import HsBindgen.Runtime.Support.Ptr
+import HsBindgen.Runtime.Union
diff --git a/runtime/HsBindgen/Runtime/PtrConst.hs b/runtime/HsBindgen/Runtime/PtrConst.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/PtrConst.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE CPP #-}
+
+-- | Read-only pointers
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.PtrConst qualified as PtrConst
+module HsBindgen.Runtime.PtrConst (
+    PtrConst -- type synonym or opaque, depending on version of @base@
+  , peek
+  , unsafeToPtr
+  , unsafeFromPtr
+    -- * Relationship with t'ConstPtr'
+    -- $constptr
+  ) where
+
+#if MIN_VERSION_base(4,18,0)
+import Foreign.C.ConstPtr (ConstPtr(..))
+#endif
+
+import Data.Kind (Type)
+import Foreign.Ptr (Ptr)
+import Foreign.Storable (Storable)
+import Foreign.Storable qualified as F
+
+-- | A read-only pointer.
+--
+-- A @'PtrConst' a@ is a pointer to a type @a@ with a C @const@ qualifier. For
+-- instance, the Haskell type @PtrConst CInt@ is equivalent to the C type @const
+-- int*@. @const@-qualified contents of a pointer should not be modified, but
+-- reading the contents is okay.
+type PtrConst :: Type -> Type
+#if MIN_VERSION_base(4,18,0)
+type PtrConst a = ConstPtr a
+#else
+type role PtrConst phantom
+newtype PtrConst a = Wrap { unwrap :: Ptr a }
+    deriving stock (Eq, Ord)
+    deriving newtype Storable
+
+-- doesn't use record syntax
+instance Show (PtrConst a) where
+    showsPrec d (Wrap p) = showParen (d > 10) $ showString "PtrConst " . showsPrec 11 p
+#endif
+
+{-------------------------------------------------------------------------------
+  Internal
+-------------------------------------------------------------------------------}
+
+unPtrConst :: PtrConst a -> Ptr a
+#if MIN_VERSION_base(4,18,0)
+unPtrConst = unConstPtr
+#else
+unPtrConst = unwrap
+#endif
+
+mkPtrConst :: Ptr a -> PtrConst a
+#if MIN_VERSION_base(4,18,0)
+mkPtrConst = ConstPtr
+#else
+mkPtrConst = Wrap
+#endif
+
+{-------------------------------------------------------------------------------
+  Public
+-------------------------------------------------------------------------------}
+
+-- | Like 'F.peek'
+peek :: Storable a => PtrConst a -> IO a
+peek ptrc = F.peek (unPtrConst ptrc)
+
+-- | Unsafe: convert a 'PtrConst' to a 'Ptr'.
+--
+-- NOTE: use the output pointer only with read access.
+unsafeToPtr :: PtrConst a -> Ptr a
+unsafeToPtr ptrc = unPtrConst ptrc
+
+-- | Unsafe: convert a 'Ptr' to a 'PtrConst'.
+--
+-- NOTE: use the input pointer only with read access.
+unsafeFromPtr :: Ptr a -> PtrConst a
+unsafeFromPtr ptr = mkPtrConst ptr
+
+{-------------------------------------------------------------------------------
+  Relationship with t'ConstPtr'
+-------------------------------------------------------------------------------}
+
+{- $constptr
+
+'PtrConst' is a pointer-to-const-data, but t'ConstPtr' is too. They are mostly
+equivalent, so why a new type? For two main reasons:
+
+1. t'ConstPtr' is actually a misnomer: it is a pointer-to-const-data, not a
+   const-pointer-to-data.
+2. t'ConstPtr' can be freely converted to a 'Ptr', even though its contents
+   should be considered to be read-only.
+
+'PtrConst' is arguably a better name, and it goes further in ensuring that
+the pointer only has read access.
+
+On @base-4.18@ and up, 'PtrConst' is a type synonym around t'ConstPtr', while on
+earlier @base@ versions it is a custom, opaque datatype. If you care about
+compatibility with all @base@ versions that @hs-bindgen-runtime@ support, then
+you should treat 'PtrConst' as its own type distinct from t'ConstPtr' using only
+the functions in the "HsBindgen.Runtime.PtrConst" module rather than the
+"Foreign.C.ConstPtr" module.
+-}
+
diff --git a/runtime/HsBindgen/Runtime/Support.hs b/runtime/HsBindgen/Runtime/Support.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support.hs
@@ -0,0 +1,200 @@
+{-# LANGUAGE MagicHash #-}
+{-# OPTIONS_HADDOCK hide #-}
+
+-- | Definitions required by generated bindings.
+--
+-- This module ensures compatibility across GHC versions and @base@ library
+-- versions. It re-exports most Haskell definitions that are used by the
+-- generated bindings. In particular, the order of exports matches the order of
+-- constructors of 'HsBindgen.Backend.SHs.Global.BindgenGlobal'.
+--
+-- See https://github.com/well-typed/hs-bindgen/issues/1627.
+--
+-- We maintain minimal lists of explicit imports and exports.
+--
+-- The "HsBindgen.Runtime.Support" module should only re-export definitions
+-- intended for unqualified import defined in @hs-bindgen-runtime@ or from other
+-- libraries such as @base@ or @containers@.
+--
+-- For definitions in @hs-bindgen-runtime@ which are intended for qualified
+-- import, the generated code will directly import those modules in a qualified
+-- way, as intended.
+--
+-- So far, we have not come across definitions intended for unqualified import
+-- defined in other libraries.
+--
+-- For the full rule on what generated code may import, see the "Imports in
+-- generated code" section of @dev\/code-structure.md@.
+--
+-- Intended for qualified import.
+--
+-- @
+-- import HsBindgen.Runtime.Support qualified as BG
+-- @
+module HsBindgen.Runtime.Support (
+  -- * Function pointers
+  ToFunPtr (toFunPtr),
+  FromFunPtr (fromFunPtr),
+
+  -- * Foreign function interface
+  Ptr (Ptr),
+  FunPtr,
+  plusPtr,
+  StablePtr,
+  getUnionPayload,
+  setUnionPayload,
+  with,
+  allocaAndPeek,
+  Generic,
+
+  -- * 'Storable'
+  Storable (sizeOf, alignment, peekByteOff, pokeByteOff, peek, poke),
+
+  -- * 'HasField'
+  HasField (getField),
+
+  -- * Proxy
+  Proxy (Proxy),
+
+  -- * 'HasFFIType'
+  HasFFIType (fromFFIType, toFFIType),
+  castFunPtrFromFFIType,
+  castFunPtrToFFIType,
+
+  -- * Unsafe
+  unsafePerformIO,
+
+  -- * Primitive
+  Prim (
+    sizeOf#,
+    alignment#,
+    indexByteArray#,
+    readByteArray#,
+    writeByteArray#,
+    indexOffAddr#,
+    readOffAddr#,
+    writeOffAddr#
+  ),
+  (+#),
+  (*#),
+
+  -- * Other type classes
+  Bitfield,
+  Bits,
+  FiniteBits,
+  Ix,
+  readPrec,
+  readListPrec,
+  readListDefault,
+  readListPrecDefault,
+  -- Floating point numbers
+  castWord32ToFloat,
+  castWord64ToDouble,
+  -- The CFloat and CDouble constructors are exported below, together with
+  -- their types.
+
+  -- Non-empty lists
+  NonEmpty ((:|)),
+  singleton,
+  -- Arrays
+  ByteArray,
+  SizedByteArray (SizedByteArray),
+  -- ByteString
+  BS.ByteString,
+  BS.pack,
+  -- Complex numbers
+  Complex,
+  -- C types
+  Void,
+  Int8,
+  Int16,
+  Int32,
+  Int64,
+  Word8,
+  Word16,
+  Word32,
+  Word64,
+  CChar,
+  CSChar,
+  CUChar,
+  CShort,
+  CUShort,
+  CInt,
+  CUInt,
+  CLong,
+  CULong,
+  CLLong,
+  CULLong,
+  CBool,
+  CFloat (CFloat),
+  CDouble (CDouble),
+  CStringLen,
+  CPtrdiff,
+) where
+
+import Data.Array.Byte (ByteArray)
+import Data.Bits (Bits, FiniteBits)
+import Data.ByteString qualified as BS (ByteString, pack)
+import Data.Complex (Complex)
+import Data.Int (Int16, Int32, Int64, Int8)
+import Data.Ix (Ix)
+import Data.List.NonEmpty (NonEmpty ((:|)), singleton)
+import Data.Primitive.Types (
+  Prim (
+    alignment#,
+    indexByteArray#,
+    indexOffAddr#,
+    readByteArray#,
+    readOffAddr#,
+    sizeOf#,
+    writeByteArray#,
+    writeOffAddr#
+  ),
+ )
+import Data.Proxy (Proxy (Proxy))
+import Data.Void (Void)
+import Data.Word (Word16, Word32, Word64, Word8)
+import Foreign (
+  Storable (alignment, peek, peekByteOff, poke, pokeByteOff, sizeOf),
+  with,
+ )
+import Foreign.C (
+  CBool,
+  CChar,
+  CDouble (CDouble),
+  CFloat (CFloat),
+  CInt,
+  CLLong,
+  CLong,
+  CPtrdiff,
+  CSChar,
+  CShort,
+  CUChar,
+  CUInt,
+  CULLong,
+  CULong,
+  CUShort,
+ )
+import Foreign.C.String (CStringLen)
+import GHC.Base ((*#), (+#))
+import GHC.Float (castWord32ToFloat, castWord64ToDouble)
+import GHC.Generics (Generic)
+import GHC.Ptr (FunPtr, Ptr (Ptr), plusPtr)
+import GHC.Records (HasField (getField))
+import GHC.Stable (StablePtr)
+import System.IO.Unsafe (unsafePerformIO)
+import Text.Read (readListDefault, readListPrec, readListPrecDefault, readPrec)
+
+import HsBindgen.Runtime.Support.Bitfield (Bitfield)
+import HsBindgen.Runtime.Support.ByteArray (getUnionPayload, setUnionPayload)
+import HsBindgen.Runtime.Support.CAPI (allocaAndPeek)
+import HsBindgen.Runtime.Support.FunPtr (
+  FromFunPtr (fromFunPtr),
+  ToFunPtr (toFunPtr),
+ )
+import HsBindgen.Runtime.Support.HasFFIType (
+  HasFFIType (fromFFIType, toFFIType),
+  castFunPtrFromFFIType,
+  castFunPtrToFFIType,
+ )
+import HsBindgen.Runtime.Support.SizedByteArray (SizedByteArray (SizedByteArray))
diff --git a/runtime/HsBindgen/Runtime/Support/Bitfield.hs b/runtime/HsBindgen/Runtime/Support/Bitfield.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/Bitfield.hs
@@ -0,0 +1,752 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+module HsBindgen.Runtime.Support.Bitfield (
+  -- * Bitfield
+  Bitfield (..),
+  defaultNarrow,
+  signedExtend,
+  unsignedExtend,
+  loMask,
+  hiMask,
+
+  -- * Storable
+  peekBitOffWidth,
+  pokeBitOffWidth,
+
+  -- * Auxiliary functions (exported for testing)
+  getBitfield,
+  getBitfieldLE,
+  getBitfieldBE,
+  putBitfield,
+  putBitfieldLE,
+  putBitfieldBE,
+) where
+
+-- \$setup
+-- >>> import Data.Word
+-- >>> import Numeric
+-- >>> import Foreign.C.Types
+
+import Data.Bits
+import Data.Int (Int16, Int32, Int64, Int8)
+import Data.List.NonEmpty (NonEmpty)
+import Data.List.NonEmpty qualified as NonEmpty
+import Data.Proxy
+import Data.Word (Word16, Word32, Word64, Word8)
+import Foreign.C.Types
+import Foreign.Marshal.Alloc (alloca)
+import Foreign.Marshal.Array (peekArray, pokeArray)
+import Foreign.Ptr
+import Foreign.Storable
+import System.IO.Unsafe (unsafePerformIO)
+
+import HsBindgen.Runtime.Marshal qualified as Marshal
+
+{-------------------------------------------------------------------------------
+  Bitfield
+-------------------------------------------------------------------------------}
+
+-- | Types which can be a bit-field in a C @struct@
+--
+-- The members convert to/from 'Word64' to make the use in the implementation of
+-- bitfields in @hs-bindgen@ easier.  We could not convert or have a smallest
+-- @WordN@ that best fits the type, but doing so would complicate usage for
+-- little benefit.
+--
+-- >>> let width = 5 :: Int
+-- >>> extend (narrow (3 :: CSChar) width) width :: CSChar
+-- 3
+--
+-- >>> let width = 5 :: Int
+-- >>> extend (narrow (-7 :: CSChar) width) width :: CSChar
+-- -7
+--
+-- overflow case, the result is undefined behavior:
+--
+-- >>> let width = 5 :: Int
+-- >>> extend (narrow (-100 :: CSChar) width) width :: CSChar
+-- -4
+class Bitfield a where
+  -- | Narrow the value so that only @width@ lowest bits are set
+  narrow :: a -> Int -> Word64
+  default narrow :: (Integral a) => a -> Int -> Word64
+  narrow = defaultNarrow
+
+  -- | Extend the value from only @width@ lowest bits representation
+  --
+  -- This should extend the sign for signed types.
+  extend :: Word64 -> Int -> a
+
+-- NOTE We could get away without a type class, using 'defaultNarrow',
+-- 'signedExtend', and 'unsignedExtend' directly, but we would still need to
+-- encode the signedness of a target type somewhere anyway.
+
+-- Instances for "Data.Int" signed integral types
+instance Bitfield Int where extend = signedExtend
+instance Bitfield Int8 where extend = signedExtend
+instance Bitfield Int16 where extend = signedExtend
+instance Bitfield Int32 where extend = signedExtend
+instance Bitfield Int64 where extend = signedExtend
+
+-- Instances for "Data.Word" unsigned integral types
+instance Bitfield Word where extend = unsignedExtend
+instance Bitfield Word8 where extend = unsignedExtend
+instance Bitfield Word16 where extend = unsignedExtend
+instance Bitfield Word32 where extend = unsignedExtend
+instance Bitfield Word64 where extend = unsignedExtend
+
+-- Instances for "Foreign.C.Types" signed integral types
+instance Bitfield CChar where extend = signedExtend
+instance Bitfield CSChar where extend = signedExtend
+instance Bitfield CShort where extend = signedExtend
+instance Bitfield CInt where extend = signedExtend
+instance Bitfield CLong where extend = signedExtend
+instance Bitfield CPtrdiff where extend = signedExtend
+instance Bitfield CWchar where extend = signedExtend
+instance Bitfield CSigAtomic where extend = signedExtend
+instance Bitfield CLLong where extend = signedExtend
+instance Bitfield CIntPtr where extend = signedExtend
+instance Bitfield CIntMax where extend = signedExtend
+
+-- Instances for "Foreign.C.Types" unsigned integral types
+instance Bitfield CUChar where extend = unsignedExtend
+instance Bitfield CUShort where extend = unsignedExtend
+instance Bitfield CUInt where extend = unsignedExtend
+instance Bitfield CULong where extend = unsignedExtend
+instance Bitfield CSize where extend = unsignedExtend
+instance Bitfield CULLong where extend = unsignedExtend
+instance Bitfield CBool where extend = unsignedExtend
+instance Bitfield CUIntPtr where extend = unsignedExtend
+instance Bitfield CUIntMax where extend = unsignedExtend
+
+-- | Default 'narrow' implementation
+--
+-- This function takes the lowest @width@ bits.
+defaultNarrow
+  :: (Integral a)
+  => a
+  -- ^ Value of the bit-field
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> Word64
+defaultNarrow x width = fromIntegral x .&. loMask width
+
+-- | Unsigned extend, just converts types
+unsignedExtend
+  :: (Num a)
+  => Word64
+  -- ^ Value of the bit-field
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> a
+unsignedExtend x _width = fromIntegral x
+
+-- | Signed extend, performs
+-- [sign extension](https://en.wikipedia.org/wiki/Sign_extension)
+signedExtend
+  :: (Num a)
+  => Word64
+  -- ^ Value of the bit-field
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> a
+signedExtend x width
+  -- Negative: extend the sign
+  | testBit x (width - 1) = fromIntegral $ hiMask width .|. x
+  -- Non-negative: just convert
+  | otherwise = fromIntegral x
+
+-- | Generate a low mask
+--
+-- The argument essentially specifies the number of least significant bits that
+-- are one.  It should be in range @[0 .. typeWidth]@, where @typeWidth@ is the
+-- width of the type.
+--
+-- >>> map (flip showBin "" . loMask @Word16) [0, 1, 2, 5, 8, 16]
+-- ["0","1","11","11111","11111111","1111111111111111"]
+loMask :: forall a. (FiniteBits a, Num a) => Int -> a
+loMask n
+  | n >= 0 && n < finiteBitSize @a 0 = unsafeShiftL 1 n - 1
+  -- For other values of @n@, 'unsafeShiftL' has undefined behavior.  Shifting
+  -- an 'Int64' by 64 bits is particularly problematic.
+  | otherwise = complement 0
+
+-- | Generate a high mask
+--
+-- The argument essentially specifies the number of least significant bits that
+-- are zero.  It should be in range @[0 .. typeWidth]@, where @typeWidth@ is
+-- the width of the type.
+--
+-- >>> map (flip showBin "" . hiMask @Word16) [0, 1, 2, 5, 8, 16]
+-- ["1111111111111111","1111111111111110","1111111111111100","1111111111100000","1111111100000000","0"]
+hiMask :: (FiniteBits a, Num a) => Int -> a
+hiMask = complement . loMask
+
+{------------------------------------------------------------------------------
+  Storable
+------------------------------------------------------------------------------}
+
+-- | Read a bit-field from memory
+--
+-- This function only uses aligned reads, so that it is safe to use on any
+-- architecture.
+--
+-- A bit-field is read using a single peek when possible, as determined by
+-- alignment and the passed memory bounds.  This should always be the case with
+-- normal @struct@s.
+--
+-- When it is not possible to read a bit-field using a single peek, multiple
+-- peeks are used to read the bytes of the bit-field.  This may happen with
+-- (poorly-designed) packed @struct@s.
+--
+-- The memory bounds should generally be the bounds of the @struct@ object.  In
+-- this case, concurrent access to different objects (in an array) is safe.
+-- Concurrent access to bit-fields within a single @struct@ object is generally
+-- unsafe.
+peekBitOffWidth
+  :: forall a
+   . (Bitfield a)
+  => Ptr ()
+  -- ^ Pointer to the byte where the bit-field starts
+  -> Int
+  -- ^ Offset of the bit-field (0 to 7 bits)
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> (Ptr (), Ptr ())
+  -- ^ Memory bounds, must contain the bit-field
+  -> IO a
+peekBitOffWidth ptrB off width bounds@(ptrL, ptrH)
+  | off < 0 || off > 7 = fail' "invalid offset"
+  | width < 1 || width > 64 = fail' "invalid width"
+  | ptrB < ptrL || ptrBH > ptrH = fail' "out of bounds"
+  | Just (ptr8, _, r) <- getAligned @Word8 (ptrB, ptrBH) off width bounds =
+      readAligned ptr8 r
+  | Just (ptr16, _, r) <- getAligned @Word16 (ptrB, ptrBH) off width bounds =
+      readAligned ptr16 r
+  | Just (ptr32, _, r) <- getAligned @Word32 (ptrB, ptrBH) off width bounds =
+      readAligned ptr32 r
+  | Just (ptr64, _, r) <- getAligned @Word64 (ptrB, ptrBH) off width bounds =
+      readAligned ptr64 r
+  | otherwise = readBytes
+ where
+  -- Minimum number of bytes that must be read
+  minBytes :: Int
+  minBytes = case (off + width) `quotRem` 8 of
+    (bytes, 0) -> bytes
+    (bytes, _) -> bytes + 1
+
+  -- High bound of bytes that must be read
+  ptrBH :: Ptr ()
+  ptrBH = ptrB `plusPtr` minBytes
+
+  -- Read the bit-field using a single, aligned word
+  readAligned
+    :: (FiniteBits w, Integral w, Marshal.ReadRaw w)
+    => Ptr w
+    -- \^ Pointer to aligned word
+    -> Int
+    -- \^ Right offset (bits)
+    -> IO a
+  readAligned ptr roff = do
+    w <- Marshal.readRaw ptr
+    let w' = unsafeShiftR w roff .&. loMask width
+    return $! extend (fromIntegral w') width
+
+  -- Read the bit-field using bytes
+  readBytes :: IO a
+  readBytes = do
+    w8s <- peekArray minBytes (castPtr ptrB)
+    case getBitfield off width w8s of
+      Right w64 -> return $! extend w64 width
+      Left msg -> fail' msg
+
+  fail' :: String -> IO a
+  fail' msg =
+    fail $
+      concat
+        [ "peekBitOffWidth "
+        , show ptrB
+        , " "
+        , show off
+        , " "
+        , show width
+        , " ("
+        , show ptrL
+        , ", "
+        , show ptrH
+        , "): "
+        , msg
+        ]
+
+-- | Write a bit-field to memory
+--
+-- This function only uses aligned reads and writes, so that it is safe to use
+-- on any architecture.
+--
+-- When a bit-field can be written using a single poke, as determined by
+-- alignment and the passed memory bounds, a single peek reads any extra bits
+-- when necessary, and then a single poke writes the bit-field.  This should
+-- always be the case with normal @struct@s.
+--
+-- When it is not possible to write a bit-field using a single poke, the byte(s)
+-- containing any extra bits are read when necessary, and then multiple pokes
+-- are used to write the bytes of the bit-field.  This may happen with
+-- (poorly-designed) packed @struct@s.
+--
+-- The memory bounds should generally be the bounds of the @struct@ object.  In
+-- this case, concurrent access to different objects (in an array) is safe.
+-- Concurrent access to bit-fields within a single @struct@ object is generally
+-- unsafe.
+pokeBitOffWidth
+  :: forall a
+   . (Bitfield a)
+  => Ptr ()
+  -- ^ Pointer to the byte where the bit-field starts
+  -> Int
+  -- ^ Offset of the bit-field (0 to 7 bits)
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> (Ptr (), Ptr ())
+  -- ^ Memory bounds, must contain the bit-field
+  -> a
+  -- ^ Bit-field value
+  -> IO ()
+pokeBitOffWidth ptrB off width bounds@(ptrL, ptrH) x
+  | off < 0 || off > 7 = fail' "invalid offset"
+  | width < 1 || width > 64 = fail' "invalid width"
+  | ptrB < ptrL || ptrBH > ptrH = fail' "out of bounds"
+  | Just (ptr8, l, r) <- getAligned @Word8 (ptrB, ptrBH) off width bounds =
+      writeAligned ptr8 l r
+  | Just (ptr16, l, r) <- getAligned @Word16 (ptrB, ptrBH) off width bounds =
+      writeAligned ptr16 l r
+  | Just (ptr32, l, r) <- getAligned @Word32 (ptrB, ptrBH) off width bounds =
+      writeAligned ptr32 l r
+  | Just (ptr64, l, r) <- getAligned @Word64 (ptrB, ptrBH) off width bounds =
+      writeAligned ptr64 l r
+  | otherwise = writeBytes
+ where
+  -- Minimum number of bytes that must be written
+  minBytes :: Int
+  minBytes = case (off + width) `quotRem` 8 of
+    (bytes, 0) -> bytes
+    (bytes, _) -> bytes + 1
+
+  -- High bound of bytes that must be written
+  ptrBH :: Ptr ()
+  ptrBH = ptrB `plusPtr` minBytes
+
+  -- Write the bit-field using a single, aligned word
+  writeAligned
+    :: (FiniteBits w, Integral w, Marshal.ReadRaw w, Marshal.WriteRaw w)
+    => Ptr w
+    -- \^ Pointer to aligned word
+    -> Int
+    -- \^ Left offset (bits)
+    -> Int
+    -- \^ Right offset (bits)
+    -> IO ()
+  writeAligned ptr loff roff
+    | loff == 0 && roff == 0 =
+        Marshal.writeRaw ptr (fromIntegral (narrow x width))
+    | otherwise = do
+        w <- Marshal.readRaw ptr
+        let x' = unsafeShiftL (fromIntegral (narrow x width)) roff
+            mask = unsafeShiftL (loMask width) roff
+        Marshal.writeRaw ptr ((w .&. complement mask) .|. x')
+
+  -- Write the bit-field using bytes
+  writeBytes :: IO ()
+  writeBytes = do
+    let ptrL8 = castPtr ptrB
+        ptrH8 = castPtr (ptrBH `plusPtr` (-1))
+    l8 <-
+      if off == 0 then
+        return 0x00
+      else
+        Marshal.readRaw ptrL8
+    h8 <-
+      if 8 * minBytes - width - off == 0 then
+        return 0x00
+      else
+        if ptrH8 == ptrL8 then return l8 else Marshal.readRaw ptrH8
+    pokeArray ptrL8 $ putBitfield off width l8 h8 (narrow x width)
+
+  fail' :: String -> IO ()
+  fail' msg =
+    fail $
+      concat
+        [ "pokeBitOffWidth "
+        , show ptrB
+        , " "
+        , show off
+        , " "
+        , show width
+        , " ("
+        , show ptrL
+        , ", "
+        , show ptrH
+        , ") x: "
+        , msg
+        ]
+
+{-------------------------------------------------------------------------------
+  Auxiliary functions
+-------------------------------------------------------------------------------}
+
+-- | Is the system little endian?
+--
+-- This value is computed (once) by allocating two bytes of memory, writing a
+-- @1 :: 'Word16'@, and checking the value of the first byte.  With a little
+-- endian architecture, we get @01 00@ byte order, and the first byte is 1.
+-- With a big endian architecture, we get a @00 01@ byte order, and the first
+-- byte is 0.
+--
+-- Reference: <https://en.wikipedia.org/wiki/Endianness>
+isLittleEndian :: Bool
+isLittleEndian = unsafePerformIO $ alloca $ \ptr -> do
+  poke @Word16 ptr 1
+  (== 1) <$> peekByteOff @Word8 ptr 0
+{-# NOINLINE isLittleEndian #-}
+
+-- | Get a pointer to an aligned word that spans the whole bit-field, when
+-- possible
+--
+-- This function also returns the number of bits to the left and right of the
+-- bit-field within the aligned word.
+getAligned
+  :: forall w
+   . (Marshal.StaticSize w)
+  => (Ptr (), Ptr ())
+  -- ^ Minimal bit-field bounds
+  -> Int
+  -- ^ Offset of the bit-field (0 to 7 bits)
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> (Ptr (), Ptr ())
+  -- ^ Memory bounds, must contain the bit-field
+  -> Maybe (Ptr w, Int, Int)
+getAligned (ptrB, ptrBH) off width (ptrL, ptrH)
+  | ptrA < ptrL = Nothing -- Lower bound of the word is out of bounds
+  | ptrAH < ptrBH = Nothing -- Whole bit-field is not within the word
+  | ptrAH > ptrH = Nothing -- Higher bound of the word is out of bounds
+  | otherwise = Just (castPtr ptrA, lBits, rBits)
+ where
+  wSize, wAlign :: Int
+  wSize = Marshal.staticSizeOf @w Proxy
+  wAlign = Marshal.staticAlignment @w Proxy
+
+  -- Aligned word bounds, where @ptrA@ is a pointer to the highest aligned
+  -- word of the specified size such that @ptrA <= ptrB@
+  ptrA, ptrAH :: Ptr ()
+  (ptrA, ptrAH) = case alignPtr ptrB wAlign of
+    ptr
+      | ptr == ptrB -> (ptr, ptr `plusPtr` wSize)
+      | otherwise -> (ptr `plusPtr` negate wSize, ptr)
+
+  -- Number of bits to the left and right of the bit-field within the aligned
+  -- word
+  --
+  -- Example @struct@:
+  --
+  -- \* a:10 1000000011
+  -- \* b:24 000000000000000000000000
+  -- \* c:24 110000000000000000000111
+  lBits, rBits :: Int
+  (lBits, rBits)
+    -- Little endian: bit-field offsets are from the least significant bit
+    --
+    -- Field @b@ has an offset of 2, shown as @xx@ in this memory diagram:
+    --
+    --          bbbbbbxx bbbbbbbb bbbbbbbb       bb
+    -- 00000011 00000010 00000000 00000000 00011100 00000000 00000000 00000011
+    -- \|        |                                   |
+    -- ptrA     ptrB                                ptrBH
+    --
+    -- Left bits are shown as @l@s and right bits are shown as @r@s in this
+    -- 'Word64' diagram:
+    --
+    -- llllllll llllllll llllllll llllllbb bbbbbbbb bbbbbbbb bbbbbbrr rrrrrrrr
+    -- 00000011 00000000 00000000 00011100 00000000 00000000 00000010 00000011
+    | isLittleEndian =
+        let r = off + 8 * (ptrB `minusPtr` ptrA)
+         in (wSize - width - r, r)
+    -- Big endian: bit-field offsets are from the most significant bit
+    --
+    -- Field @b@ has an offset of 2, shown as @xx@ in this memory diagram:
+    --
+    --          xxbbbbbb bbbbbbbb bbbbbbbb bb
+    -- 10000000 11000000 00000000 00000000 00110000 00000000 00000001 11000000
+    -- \|        |                                   |
+    -- ptrA     ptrB                                ptrBH
+    --
+    -- Left bits are shown as @l@s and right bits are shown as @r@s in this
+    -- 'Word64' diagram:
+    --
+    -- llllllll llbbbbbb bbbbbbbb bbbbbbbb bbrrrrrr rrrrrrrr rrrrrrrr rrrrrrrr
+    -- 10000000 11000000 00000000 00000000 00110000 00000000 00000001 11000000
+    | otherwise =
+        let l = 8 * (ptrB `minusPtr` ptrA) + off
+         in (l, wSize - width - l)
+
+-- | Get a bit-field value from a list of bytes (native byte order)
+getBitfield
+  :: Int
+  -- ^ Offset of the bit-field (0 to 7 bits)
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> [Word8]
+  -- ^ Bytes as read from memory
+  -> Either String Word64
+getBitfield
+  | isLittleEndian = getBitfieldLE
+  | otherwise = getBitfieldBE
+
+-- | Get a bit-field value from a list of bytes (little endian)
+getBitfieldLE
+  :: Int
+  -- ^ Offset of the bit-field (0 to 7 bits)
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> [Word8]
+  -- ^ Bytes as read from memory
+  -> Either String Word64
+getBitfieldLE off width = auxFirst
+ where
+  -- With little endian, @struct@s are stored in reverse byte order, and
+  -- bit-field offsets are from the least significant bit.
+  --
+  -- \* Single byte: @| loff? | numFieldBits | off? |@
+  --
+  -- \* First byte:  @| numFieldBits | off? |@
+  -- \* Middle byte: @| numFieldBits = 8 |@
+  -- \* Last byte:   @| loff? | numFieldBits |@
+
+  auxFirst
+    :: [Word8]
+    -- \^ Bytes as read from memory
+    -> Either String Word64
+  auxFirst = \case
+    -- First byte or single byte
+    (b : bs) ->
+      let numFieldBits = min width (8 - off)
+          fieldByte = unsafeShiftR b off .&. loMask numFieldBits
+          fieldWord = fromIntegral fieldByte
+       in auxNext fieldWord numFieldBits (width - numFieldBits) bs
+    [] -> Left "not enough bytes"
+
+  auxNext
+    :: Word64
+    -- \^ Bit-field value accumulator
+    -> Int
+    -- \^ Number of bit-field bits in the accumulator
+    -> Int
+    -- \^ Remaining number of bits in the bit-field
+    -> [Word8]
+    -- \^ Remaining bytes as read from memory
+    -> Either String Word64
+  auxNext !acc numAccBits width' = \case
+    (b : bs)
+      -- Middle byte
+      | width' >= 8 ->
+          let fieldWord = unsafeShiftL (fromIntegral b) numAccBits
+           in auxNext (fieldWord .|. acc) (numAccBits + 8) (width' - 8) bs
+      -- Last byte
+      | width' > 0 ->
+          let fieldByte = b .&. loMask width'
+              fieldWord = unsafeShiftL (fromIntegral fieldByte) numAccBits
+           in auxNext (fieldWord .|. acc) (numAccBits + width') 0 bs
+      | otherwise -> Left "too many bytes"
+    []
+      | width' == 0 -> Right acc
+      | otherwise -> Left "not enough bytes"
+
+-- | Get a bit-field value from a list of bytes (big endian)
+getBitfieldBE
+  :: Int
+  -- ^ Offset of the bit-field (0 to 7 bits)
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> [Word8]
+  -- ^ Bytes as read from memory
+  -> Either String Word64
+getBitfieldBE off width = auxFirst
+ where
+  -- With big endian, @struct@s are stored in byte order, and bit-field
+  -- offsets are from the most significant bit.
+  --
+  -- \* Single byte: @| off? | numFieldBits | roff? |@
+  --
+  -- \* First byte:  @| off? | numFieldBits |@
+  -- \* Middle byte: @| numFieldBits = 8 |@
+  -- \* Last byte:   @| numFieldBits | roff? |@
+
+  off8 :: Int
+  off8 = 8 - off
+
+  auxFirst
+    :: [Word8]
+    -- \^ Bytes as read from memory
+    -> Either String Word64
+  auxFirst = \case
+    (b : bs)
+      -- First byte
+      | width >= off8 ->
+          let width' = width - off8
+              fieldByte = b .&. loMask off8
+              fieldWord = unsafeShiftL (fromIntegral fieldByte) width'
+           in auxNext fieldWord width' bs
+      -- Single byte
+      | otherwise ->
+          let fieldByte = unsafeShiftR (b .&. loMask off8) (off8 - width)
+              fieldWord = fromIntegral fieldByte
+           in auxNext fieldWord 0 bs
+    [] -> Left "not enough bytes"
+
+  auxNext
+    :: Word64
+    -- \^ Bit-field value accumulator
+    -> Int
+    -- \^ Remaining number of bits in the bit-field
+    -> [Word8]
+    -- \^ Remaining bytes as read from memory
+    -> Either String Word64
+  auxNext !acc width' = \case
+    (b : bs)
+      -- Middle byte
+      | width' >= 8 ->
+          let width'' = width' - 8
+              x = unsafeShiftL (fromIntegral b) width''
+           in auxNext (acc .|. x) width'' bs
+      -- Last byte
+      | width' > 0 ->
+          let b' = unsafeShiftR b (8 - width')
+              x = fromIntegral b'
+           in auxNext (acc .|. x) 0 bs
+      | otherwise -> Left "too many bytes"
+    []
+      | width' == 0 -> Right acc
+      | otherwise -> Left "not enough bytes"
+
+-- | Put a bit-field value into a list of bytes (native byte order)
+putBitfield
+  :: Int
+  -- ^ Offset of the bit-field (0 to 7 bits)
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> Word8
+  -- ^ Existing low byte, not used when not needed
+  -> Word8
+  -- ^ Existing high byte, not used when not needed
+  -> Word64
+  -- ^ Bit-field value
+  -> [Word8]
+putBitfield
+  | isLittleEndian = putBitfieldLE
+  | otherwise = putBitfieldBE
+
+-- | Put a bit-field value into a list of bytes (little endian)
+putBitfieldLE
+  :: Int
+  -- ^ Offset of the bit-field (0 to 7 bits)
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> Word8
+  -- ^ Existing low byte, not used when not needed
+  -> Word8
+  -- ^ Existing high byte, not used when not needed
+  -> Word64
+  -- ^ Bit-field value
+  -> [Word8]
+putBitfieldLE off width l8 h8 = auxFirst
+ where
+  auxFirst
+    :: Word64
+    -- \^ Bit-field value
+    -> [Word8]
+  auxFirst x =
+    -- Handle low offset of single/first byte
+    let b' = fromIntegral (x .&. 0xFF)
+        b
+          | off > 0 = unsafeShiftL b' off .|. (l8 .&. loMask off)
+          | otherwise = b' -- optimization
+        acc = NonEmpty.singleton b
+        numFieldBits = min width (8 - off)
+     in auxNext acc (width + off - 8) (unsafeShiftR x numFieldBits)
+
+  auxNext
+    :: NonEmpty Word8
+    -- \^ Accumulator (reverse order)
+    -> Int
+    -- \^ Remaining number of bits (may be negative)
+    -> Word64
+    -- \^ Remaining bit-field value
+    -> [Word8]
+  auxNext acc width' x
+    -- Middle/last byte
+    | width' > 0 =
+        let b = fromIntegral (x .&. 0xFF)
+         in auxNext (NonEmpty.cons b acc) (width' - 8) (unsafeShiftR x 8)
+    -- Handle high offset of single/last byte
+    | otherwise =
+        let hoff = negate width'
+            b' = NonEmpty.head acc
+            b
+              | hoff > 0 =
+                  let mask = unsafeShiftL (loMask hoff) (8 - hoff)
+                   in (h8 .&. mask) .|. (b' .&. complement mask)
+              | otherwise = b' -- optimization
+         in reverse (b : NonEmpty.tail acc)
+
+-- | Put a bit-field value into a list of bytes (big endian)
+putBitfieldBE
+  :: Int
+  -- ^ Offset of the bit-field (0 to 7 bits)
+  -> Int
+  -- ^ Width of the bit-field (1 to 64 bits)
+  -> Word8
+  -- ^ Existing low byte, not used when not needed
+  -> Word8
+  -- ^ Existing high byte, not used when not needed
+  -> Word64
+  -- ^ Bit-field value
+  -> [Word8]
+putBitfieldBE off width l8 h8 = auxFirst
+ where
+  auxFirst
+    :: Word64
+    -- \^ Bit-field value
+    -> [Word8]
+  auxFirst x =
+    -- Handle high offset of single/last byte
+    let hoff = (8 - ((width + off) `mod` 8)) `mod` 8
+        b' = fromIntegral (x .&. 0xFF)
+        b
+          | hoff > 0 = unsafeShiftL b' hoff .|. (h8 .&. loMask hoff)
+          | otherwise = b' -- optimization
+        acc = NonEmpty.singleton b
+        numFieldBits = min width (8 - hoff)
+     in auxNext acc (width + hoff - 8) (unsafeShiftR x numFieldBits)
+
+  auxNext
+    :: NonEmpty Word8
+    -- \^ Accumulator
+    -> Int
+    -- \^ Remaining number of bits (may be negative)
+    -> Word64
+    -- \^ Remaining bit-field value
+    -> [Word8]
+  auxNext acc width' x
+    -- Middle/first byte
+    | width' > 0 =
+        let b = fromIntegral (x .&. 0xFF)
+         in auxNext (NonEmpty.cons b acc) (width' - 8) (unsafeShiftR x 8)
+    -- Handle low offset of single/first byte
+    | otherwise -- off == negate width'
+      =
+        let b' = NonEmpty.head acc
+            b
+              | off > 0 =
+                  let mask = unsafeShiftL (loMask off) (8 - off)
+                   in (l8 .&. mask) .|. (b' .&. complement mask)
+              | otherwise = b' -- optimization
+         in b : NonEmpty.tail acc
diff --git a/runtime/HsBindgen/Runtime/Support/ByteArray.hs b/runtime/HsBindgen/Runtime/Support/ByteArray.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/ByteArray.hs
@@ -0,0 +1,120 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+-- | Utilities for dealing with 'ByteArray' and 'Storable'
+--
+-- The additional copying we have to do here is a bit annoying, but in the end
+-- an FFI implementation based on 'Storable' is never going to be /extremely/
+-- fast, as we are effectively (de)serializing. A few additional @memcpy@
+-- operations are therefore not going to be a huge difference.
+--
+-- We /could/ choose to use pinned bytearrays. This would avoid /some/ copying,
+-- but by no means all: we'd still need one copy (instead of two) in
+-- 'peekByteArray' and 'pokeByteArray', and the calls to 'peek' and 'poke' in
+-- 'peekFromByteArray' and 'pokeToByteArray' will (likely) do copying of their
+-- own as well.
+module HsBindgen.Runtime.Support.ByteArray (
+  -- * Support for defining 'Storable' instances for union types
+  peekByteArray,
+  pokeByteArray,
+
+  -- * Support for defining setters and getters for union types
+  setUnionPayload,
+  getUnionPayload,
+) where
+
+import Control.Exception
+import Control.Monad.Primitive (RealWorld)
+import Data.Coerce (Coercible, coerce)
+import Data.Primitive.ByteArray (ByteArray, MutableByteArray)
+import Data.Primitive.ByteArray qualified as BA
+import Foreign (Ptr, Storable (peek, poke), castPtr, copyBytes, sizeOf)
+import System.IO.Unsafe (unsafePerformIO)
+
+{-------------------------------------------------------------------------------
+  Support for defining 'Storable' instances for union types
+-------------------------------------------------------------------------------}
+
+peekByteArray :: Int -> Ptr a -> IO ByteArray
+peekByteArray n src = do
+  pinnedCopy <- BA.newPinnedByteArray n
+  BA.withMutableByteArrayContents pinnedCopy $ \dest ->
+    copyBytes dest (castPtr src) n
+  BA.freezeByteArray pinnedCopy 0 n
+
+pokeByteArray :: Ptr a -> ByteArray -> IO ()
+pokeByteArray dest bytes = do
+  pinnedCopy <- thawToPinned bytes
+  BA.withMutableByteArrayContents pinnedCopy $ \src ->
+    copyBytes dest (castPtr src) n
+ where
+  n = BA.sizeofByteArray bytes
+
+{-------------------------------------------------------------------------------
+  Support for defining setters and getters for union types
+-------------------------------------------------------------------------------}
+
+setUnionPayload
+  :: forall payload union
+   . ( Storable payload
+     , Storable union
+     , Coercible union ByteArray
+     )
+  => payload -> union
+setUnionPayload = coerce . pokeToByteArray (sizeOf (undefined :: union))
+
+getUnionPayload
+  :: forall payload union
+   . ( Storable payload
+     , Coercible union ByteArray
+     )
+  => union -> payload
+getUnionPayload = peekFromByteArray . coerce
+
+{-------------------------------------------------------------------------------
+  Internal auxiliary
+-------------------------------------------------------------------------------}
+
+-- | Read 'Storable' value from 'ByteArray'
+--
+-- Precondition:
+--
+-- > sizeOf (undefined :: a) <= sizeofByteArray bytes
+--
+-- It may well be the case that the ByteArray is /larger/; 'peekFromByteArray'
+-- is intended to be used for reading values from otherwise opaque unions (where
+-- @a@ is one such possible value), and so the bytearray will be large enough to
+-- store the entire union.
+peekFromByteArray :: forall a. (Storable a) => ByteArray -> a
+peekFromByteArray bytes =
+  assert (sizeOf (undefined :: a) <= BA.sizeofByteArray bytes) $
+    unsafePerformIO $ do
+      pinnedCopy <- thawToPinned bytes
+      BA.withMutableByteArrayContents pinnedCopy $ \ptr ->
+        peek (castPtr ptr)
+
+-- | Write 'Storable' value to new 'ByteArray' of specified size
+--
+-- Precondition:
+--
+-- > sizeOf (undefined :: a) <= n
+--
+-- It may well be that @n@ is larger; see also 'peekFromByteArray'.
+pokeToByteArray :: forall a. (Storable a) => Int -> a -> ByteArray
+pokeToByteArray n x =
+  assert (sizeOf (undefined :: a) <= n) $
+    unsafePerformIO $ do
+      pinnedCopy <- BA.newPinnedByteArray n
+      BA.withMutableByteArrayContents pinnedCopy $ \ptr ->
+        poke (castPtr ptr) x
+      -- The copy constructed by 'freezeByteArray' is /not/ pinned.
+      BA.freezeByteArray pinnedCopy 0 n
+
+-- | Like 'Data.Primiteve.ByteArray.thawByteArray', but the new
+-- | 'MutableByteArray' is pinned
+thawToPinned :: ByteArray -> IO (MutableByteArray RealWorld)
+thawToPinned src = do
+  dest <- BA.newPinnedByteArray n
+  BA.copyByteArray dest 0 src 0 n
+  return dest
+ where
+  n = BA.sizeofByteArray src
diff --git a/runtime/HsBindgen/Runtime/Support/CAPI.hs b/runtime/HsBindgen/Runtime/Support/CAPI.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/CAPI.hs
@@ -0,0 +1,26 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+-- We capitalize module names, but use camelCase/PascalCase in code:
+--
+-- - in types names:    CapiFoo, FooCapiBar
+-- - in variable names: capiFoo, fooCapiBar
+module HsBindgen.Runtime.Support.CAPI (
+  addCSource,
+  allocaAndPeek,
+
+  -- * Auxiliary
+  Data.List.unlines,
+) where
+
+import Data.List qualified
+import Foreign (Ptr, Storable, alloca, peek)
+import Language.Haskell.TH (DecsQ)
+import Language.Haskell.TH.Syntax (ForeignSrcLang (LangC), addForeignSource)
+
+addCSource :: String -> DecsQ
+addCSource src = do
+  addForeignSource LangC src
+  return []
+
+allocaAndPeek :: (Storable a) => (Ptr a -> IO ()) -> IO a
+allocaAndPeek k = alloca $ \ptr -> k ptr >> peek ptr
diff --git a/runtime/HsBindgen/Runtime/Support/CompatHasField.hs b/runtime/HsBindgen/Runtime/Support/CompatHasField.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/CompatHasField.hs
@@ -0,0 +1,17 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+-- | Prelude required by generated bindings.
+--
+-- This is a sub-mobule of "HsBindgen.Runtime.Support" that only exports
+-- definitions from the @record-hasfield@ package. We do this because the
+-- 'HasField' name is not unique. The name is used for two separate classes the
+-- "GHC.Records" and "GHC.Records.Compat" modules, and we can't export the same
+-- name from the "HsBindgen.Runtime.Support" twice.
+module HsBindgen.Runtime.Support.CompatHasField (
+  -- * 'HasField'
+  HasField (hasField),
+  getField,
+  setField,
+) where
+
+import GHC.Records.Compat (HasField (..), getField, setField)
diff --git a/runtime/HsBindgen/Runtime/Support/FFIType.hs b/runtime/HsBindgen/Runtime/Support/FFIType.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/FFIType.hs
@@ -0,0 +1,68 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+-- NOTE: For now, this module is classified "Support"; however, it may become
+-- public in the future. See also
+-- https://github.com/well-typed/hs-bindgen/issues/1565.
+
+-- | Datatypes for the 'HsBindgen.Runtime.HasFFIType.HasFFIType' class.
+--
+-- These datatypes reify all possible values of the
+-- 'HsBindgen.Runtime.HasFFIType.FFIType' type. These datatypes are for internal
+-- use in the 'HsBindgen.Runtime.HasFFIType.HasFFIType' class, and they are
+-- exported for the @hs-bindgen@ package to use. You probably won't need to use
+-- these directly, but you might find the datatypes useful as documentation for
+-- the 'HsBindgen.Runtime.HasFFIType.HasFFIType' class.
+module HsBindgen.Runtime.Support.FFIType (
+  FFIType (..),
+  BasicFFIType (..),
+) where
+
+-- | A foreign type without newtypes
+--
+-- This datatype does not restrict itself to valid foreign types. For example,
+-- @IO Unit `FunArrow` IO Unit@ is not a valid foreign type, but we can
+-- represent it nonetheless. See the discussion on the
+-- 'HsBindgen.Runtime.HasFFIType.HasFFIType' class for why this
+-- is okay.
+--
+-- Also, see the "8.4.2 Foreign Types" section of the report for more
+-- information about foreign types:
+-- <https://www.haskell.org/onlinereport/haskell2010/haskellch8.html#x15-1560008.4.2>
+data FFIType
+  = -- === Foreign types ===
+    FunArrow FFIType FFIType
+  | -- === Marshallable foreign result types ===
+    Unit
+  | IO FFIType
+  | -- === Marshallable foreign types ===
+    Basic BasicFFIType
+  deriving stock (Eq, Ord, Show)
+
+-- | A basic foreign type as described in the "8.4.2
+-- Foreign Types" section of the "Haskell 2010 Language" report:
+--
+-- <https://www.haskell.org/onlinereport/haskell2010/haskellch8.html#x15-1560008.4.2>
+data BasicFFIType
+  = -- Prelude
+    Char
+  | Int
+  | Double
+  | Float
+  | Bool
+  | -- Data.Int
+    Int8
+  | Int16
+  | Int32
+  | Int64
+  | -- Data.Word
+    Word
+  | Word8
+  | Word16
+  | Word32
+  | Word64
+  | -- Foreign.Ptr
+    Ptr
+  | FunPtr
+  | -- Foreign.StablePtr
+    StablePtr
+  deriving stock (Bounded, Enum, Eq, Ord, Show)
diff --git a/runtime/HsBindgen/Runtime/Support/FunPtr.hs b/runtime/HsBindgen/Runtime/Support/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/FunPtr.hs
@@ -0,0 +1,19 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+-- | Function pointer utilities and type classes with pre-generated instances.
+--
+-- This module provides the 'ToFunPtr' and 'FromFunPtr' type classes along with
+-- Template Haskell generated instances for common function signatures.
+--
+-- NOTE: For now, this module is classified "Support" because the definitions
+-- are re-exported from the runtime prelude. Should we add definitions intended
+-- for qualified import, we need to add a public module.
+module HsBindgen.Runtime.Support.FunPtr (
+  -- * Re-exports from "HsBindgen.Runtime.FunPtr.Class"
+  ToFunPtr (..),
+  FromFunPtr (..),
+  withFunPtr,
+) where
+
+import HsBindgen.Runtime.Support.FunPtr.Class
+import HsBindgen.Runtime.Support.TH.Instances ()
diff --git a/runtime/HsBindgen/Runtime/Support/FunPtr/Class.hs b/runtime/HsBindgen/Runtime/Support/FunPtr/Class.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/FunPtr/Class.hs
@@ -0,0 +1,37 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+-- | Function pointer utilities and type class for converting Haskell functions
+-- to C function pointers.
+--
+-- This module provides a type class 'ToFunPtr' that allows for a uniform
+-- interface to convert Haskell functions to C function pointers.
+module HsBindgen.Runtime.Support.FunPtr.Class (
+  -- * Type class
+  ToFunPtr (..),
+  FromFunPtr (..),
+
+  -- * Utilities
+  withFunPtr,
+) where
+
+import Control.Exception (bracket)
+import Foreign qualified as F
+import GHC.Ptr qualified as Ptr
+
+-- | Type class for converting Haskell functions to C function pointers.
+class ToFunPtr a where
+  -- | Convert a Haskell function to a C function pointer.
+  --
+  -- The caller is responsible for freeing the function pointer using
+  -- 'F.freeHaskellFunPtr' when it is no longer needed.
+  toFunPtr :: a -> IO (F.FunPtr a)
+
+-- | Type class for converting C function pointers to Haskell functions.
+class FromFunPtr a where
+  -- | Convert C function pointer into a Haskell function.
+  fromFunPtr :: F.FunPtr a -> a
+
+-- | This function makes sure that 'F.freeHaskellFunPtr' is called after
+-- 'toFunPtr' has allocated memory for a 'Ptr.FunPtr'.
+withFunPtr :: (ToFunPtr a) => a -> (Ptr.FunPtr a -> IO b) -> IO b
+withFunPtr x = bracket (toFunPtr x) F.freeHaskellFunPtr
diff --git a/runtime/HsBindgen/Runtime/Support/HasFFIType.hs b/runtime/HsBindgen/Runtime/Support/HasFFIType.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/HasFFIType.hs
@@ -0,0 +1,381 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+{-# LANGUAGE CPP #-}
+
+-- NOTE: For now, this module is classified "Support"; however, it may become
+-- public in the future. See also
+-- https://github.com/well-typed/hs-bindgen/issues/1565.
+
+module HsBindgen.Runtime.Support.HasFFIType (
+    -- * Class
+    HasFFIType
+  , FFIType
+  , toFFIType
+  , fromFFIType
+  , castFunPtrToFFIType
+  , castFunPtrFromFFIType
+    -- * Deriving-via
+  , ViaNewtype(..)
+  , ViaCoercible(..)
+  ) where
+
+import Prelude as Types (Bool, Char, Double, Float, Int, Word)
+import Prelude hiding (Bool, Char, Double, Float, Int, Word)
+
+import Data.Coerce (Coercible, coerce)
+import Data.Int as Types (Int16, Int32, Int64, Int8)
+import Data.Kind (Type)
+import Data.Void (Void)
+import Data.Word as Types (Word16, Word32, Word64, Word8)
+import Foreign.C.Error as Types (Errno (..))
+import Foreign.C.Types as Types (CBool (..), CChar (..), CClock (..),
+                                 CDouble (..), CFloat (..), CInt (..),
+                                 CIntMax (..), CIntPtr (..), CLLong (..),
+                                 CLong (..), CPtrdiff (..), CSChar (..),
+                                 CSUSeconds (..), CShort (..), CSigAtomic (..),
+                                 CSize (..), CTime (..), CUChar (..),
+                                 CUInt (..), CUIntMax (..), CUIntPtr (..),
+                                 CULLong (..), CULong (..), CUSeconds (..),
+                                 CUShort (..), CWchar (..))
+import Foreign.Ptr (castFunPtr, castPtr)
+import Foreign.Ptr as Types (FunPtr, IntPtr (..), Ptr, WordPtr (..))
+import Foreign.StablePtr (castPtrToStablePtr, castStablePtrToPtr)
+import Foreign.StablePtr as Types (StablePtr)
+
+import HsBindgen.Runtime.PtrConst as Types (PtrConst, unsafeFromPtr,
+                                            unsafeToPtr)
+import HsBindgen.Runtime.Support.FFIType qualified as FFI
+
+{-------------------------------------------------------------------------------
+  Class
+-------------------------------------------------------------------------------}
+
+-- | The 'HasFFIType' class broadly captures Haskell types that can be
+-- converted to and from an /FFI type/.
+--
+-- An FFI type is similar to a /foreign type/, but with all newtypes removed.
+-- Foreign types are the kinds of types that are allowed in @foreign import@
+-- declarations.
+--
+-- Some laws apply to this class:
+--
+-- * If @x :: a@ is a foreign type, then @toFFIType x :: FFIType
+--   a@ is also a valid foreign type and contains no newtypes.
+-- * If @x :: FFIType a@ is a foreign type, then @fromFFIType x
+--   :: a@ is also a valid foreign type.
+--
+-- Note in particular that this does /not/ guarantee that:
+--
+-- * Every type @a@ that is an instance of 'HasFFIType' is a valid
+-- foreign type
+-- * Every type @'FFIType' a@ is a valid foreign type.
+--
+-- Informally, 'toFFIType' and 'fromFFIType' preserve
+-- /valid-foreign-type-ness/.
+--
+-- === User-supplied instances
+--
+-- Generally as a rule of thumb, if @a@ is a valid foreign type, then there
+-- should be a sensible 'HasFFIType' instance. Instances are provided in this
+-- module for most basic type constructors, like 'Prelude.(->)', 'IO',
+-- 'Prelude.()', and all eligible types from the "Foreign" module hierarchy.
+-- However, we can't magically generate instance for user-defined newtypes, nor
+-- do we try to generate instances for all newtypes from the @base@ package or
+-- other core packages. Instead, the user should derive such instances either
+-- using newtype-deriving or using deriving-via with the t'ViaNewtype'\ or
+-- t'ViaCoercible' helper datatypes. Instances can otherwise not be defined by
+-- hand. Regardless of the deriving method, the @UndecidableInstances@ language
+-- extension should also be enabled.
+--
+-- === Foreign types
+--
+-- Foreign types and its sub-kinds are described by the the "Haskell 2010 Language"
+-- report. Kinds of foreign types include:
+--
+-- * top-level /foreign types/
+-- * /basic foreign types/
+-- * /marshallable foreign result types/
+-- * /marshallable foreign types/
+--
+-- See the "8.4.2 Foreign Types" section of the report for more information:
+-- <https://www.haskell.org/onlinereport/haskell2010/haskellch8.html#x15-1560008.4.2>
+--
+class HasFFIType a where
+  type ToFFIType a :: FFI.FFIType
+  -- | Convert a foreign type to its FFI type.
+  --
+  -- See the 'HasFFIType' class for more information
+  toFFIType :: a -> FFIType a
+  -- | Convert an FFI type a foreign type.
+  --
+  -- See the 'HasFFIType' class for more information
+  fromFFIType :: FFIType a -> a
+
+type FFIType a = FromFFIType (ToFFIType a)
+
+-- | Cast the foreign type inside the function pointer to its FFI type.
+castFunPtrToFFIType ::
+     forall a. HasFFIType a
+  => FunPtr a
+  -> FunPtr (FFIType a)
+castFunPtrToFFIType = castFunPtr
+  where
+    -- NOTE: the constraint is unused, but we want to restrict what types can be
+    -- cast, so we work around "unused constraint" warnings with this local
+    -- definition.
+    _unused = toFFIType @a
+
+-- | Cast the FFI type inside a function pointer to a foreign type.
+castFunPtrFromFFIType ::
+     forall a. HasFFIType a
+  => FunPtr (FFIType a)
+  -> FunPtr a
+castFunPtrFromFFIType = castFunPtr
+  where
+    -- NOTE: the constraint is unused, but we want to restrict what types can be
+    -- cast, so we work around "unused constraint" warnings with this local
+    -- definition.
+    _unused = fromFFIType @a
+
+type FromFFIType :: FFI.FFIType -> Type
+type family FromFFIType ft where
+  -- === Foreign types ===
+  FromFFIType (FFI.FunArrow a b) = FromFFIType a -> FromFFIType b
+
+  -- === Marshallable foreign result types ===
+  FromFFIType FFI.Unit = ()
+  FromFFIType (FFI.IO a) = IO (FromFFIType a)
+
+  -- === Marshallable foreign types ===
+  FromFFIType (FFI.Basic a) = FromBasicFFIType a
+
+type FromBasicFFIType :: FFI.BasicFFIType -> Type
+type family FromBasicFFIType ft where
+  -- Prelude
+  FromBasicFFIType FFI.Char   = Char
+  FromBasicFFIType FFI.Int    = Int
+  FromBasicFFIType FFI.Double = Double
+  FromBasicFFIType FFI.Float  = Float
+  FromBasicFFIType FFI.Bool   = Bool
+  -- Data.Int
+  FromBasicFFIType FFI.Int8  = Int8
+  FromBasicFFIType FFI.Int16 = Int16
+  FromBasicFFIType FFI.Int32 = Int32
+  FromBasicFFIType FFI.Int64 = Int64
+  -- Data.Word
+  FromBasicFFIType FFI.Word   = Word
+  FromBasicFFIType FFI.Word8  = Word8
+  FromBasicFFIType FFI.Word16 = Word16
+  FromBasicFFIType FFI.Word32 = Word32
+  FromBasicFFIType FFI.Word64 = Word64
+  -- Foreign.Ptr
+  FromBasicFFIType FFI.Ptr     = Ptr Void
+  FromBasicFFIType FFI.FunPtr  = FunPtr Void
+  -- Foreign.StablePtr
+  FromBasicFFIType FFI.StablePtr = StablePtr Void
+
+{-------------------------------------------------------------------------------
+  Deriving-via
+-------------------------------------------------------------------------------}
+
+-- === Via newtype ===
+
+type ViaNewtype :: Type -> Type
+newtype ViaNewtype a = ViaNewtype a
+
+-- | This produces almost the same instance as you would get using @deriving
+-- newtype@, but /this/ instance has explicit @INLINE@ pragmas.
+instance HasFFIType a => HasFFIType (ViaNewtype a) where
+  type ToFFIType (ViaNewtype a) = ToFFIType a
+  {-# INLINE toFFIType #-}
+  toFFIType (ViaNewtype x) = toFFIType x
+  {-# INLINE fromFFIType #-}
+  fromFFIType x = ViaNewtype (fromFFIType x)
+
+type ViaCoercible :: Type -> Type -> Type
+newtype ViaCoercible a b = ViaCoercible b
+
+instance (Coercible a b, HasFFIType a) => HasFFIType (ViaCoercible a b) where
+  type ToFFIType (ViaCoercible a b) = ToFFIType a
+  {-# INLINE toFFIType #-}
+  toFFIType (ViaCoercible x) = toFFIType (coerce @b @a x)
+  {-# INLINE fromFFIType #-}
+  fromFFIType x = ViaCoercible (coerce @a @b (fromFFIType x))
+
+-- === Via an FFI type ===
+
+type ViaFFIType :: k -> Type -> Type
+newtype ViaFFIType k a = ViaFFIType a
+
+instance FromFFIType ft ~ a => HasFFIType (ViaFFIType ft a) where
+  type ToFFIType (ViaFFIType ft a) = ft
+  {-# INLINE toFFIType #-}
+  toFFIType (ViaFFIType x) = x
+  {-# INLINE fromFFIType #-}
+  fromFFIType x = ViaFFIType x
+
+-- === Via a basic foreign type ===
+
+type ViaBasicFFIType :: k -> Type -> Type
+newtype ViaBasicFFIType k a = ViaBasicFFIType a
+
+instance FromFFIType (FFI.Basic ft) ~ a => HasFFIType (ViaBasicFFIType ft a) where
+  type ToFFIType (ViaBasicFFIType ft a) = FFI.Basic ft
+  {-# INLINE toFFIType #-}
+  toFFIType (ViaBasicFFIType x) = x
+  {-# INLINE fromFFIType #-}
+  fromFFIType x = ViaBasicFFIType x
+
+{-------------------------------------------------------------------------------
+  Foreign types
+-------------------------------------------------------------------------------}
+
+instance (HasFFIType a, HasFFIType b) => HasFFIType (a -> b) where
+  type ToFFIType (a -> b) = FFI.FunArrow (ToFFIType a) (ToFFIType b)
+  {-# INLINE toFFIType #-}
+  toFFIType f = \x -> toFFIType (f $ fromFFIType x)
+  {-# INLINE fromFFIType #-}
+  fromFFIType f = \x -> fromFFIType (f $ toFFIType x)
+
+{-------------------------------------------------------------------------------
+  Marshallable foreign result types
+-------------------------------------------------------------------------------}
+
+deriving via ViaFFIType FFI.Unit () instance HasFFIType ()
+
+instance HasFFIType a => HasFFIType (IO a) where
+  type ToFFIType (IO ( a)) = FFI.IO (ToFFIType a)
+  {-# INLINE toFFIType #-}
+  toFFIType = fmap toFFIType
+  {-# INLINE fromFFIType #-}
+  fromFFIType = fmap fromFFIType
+
+{-------------------------------------------------------------------------------
+  Marshallable foreign types
+-------------------------------------------------------------------------------}
+
+-- === Prelude ===
+
+-- == Basic foreign types ==
+
+deriving via ViaBasicFFIType FFI.Char Char instance HasFFIType Char
+deriving via ViaBasicFFIType FFI.Int Int instance HasFFIType Int
+deriving via ViaBasicFFIType FFI.Double Double instance HasFFIType Double
+deriving via ViaBasicFFIType FFI.Float Float instance HasFFIType Float
+deriving via ViaBasicFFIType FFI.Bool Bool instance HasFFIType Bool
+
+-- === Data.Int ===
+
+-- == Basic foreign types ==
+
+deriving via ViaBasicFFIType FFI.Int8 Int8 instance HasFFIType Int8
+deriving via ViaBasicFFIType FFI.Int16 Int16 instance HasFFIType Int16
+deriving via ViaBasicFFIType FFI.Int32 Int32 instance HasFFIType Int32
+deriving via ViaBasicFFIType FFI.Int64 Int64 instance HasFFIType Int64
+
+-- === Data.Word ===
+
+-- == Basic foreign types ==
+
+deriving via ViaBasicFFIType FFI.Word Word instance HasFFIType Word
+deriving via ViaBasicFFIType FFI.Word8 Word8 instance HasFFIType Word8
+deriving via ViaBasicFFIType FFI.Word16 Word16 instance HasFFIType Word16
+deriving via ViaBasicFFIType FFI.Word32 Word32 instance HasFFIType Word32
+deriving via ViaBasicFFIType FFI.Word64 Word64 instance HasFFIType Word64
+
+-- === Foreign.Ptr ===
+
+-- == Basic foreign types ==
+
+instance HasFFIType (Ptr a) where
+  type ToFFIType (Ptr a) = FFI.Basic FFI.Ptr
+  {-# INLINE toFFIType #-}
+  toFFIType = castPtr
+  {-# INLINE fromFFIType #-}
+  fromFFIType = castPtr
+
+instance HasFFIType (FunPtr a) where
+  type ToFFIType (FunPtr a) = FFI.Basic FFI.FunPtr
+  {-# INLINE toFFIType #-}
+  toFFIType = castFunPtr
+  {-# INLINE fromFFIType #-}
+  fromFFIType = castFunPtr
+
+-- == Newtypes around basic foreign types ==
+
+deriving newtype instance HasFFIType IntPtr
+deriving newtype instance HasFFIType WordPtr
+
+-- === Foreign.StablePtr ===
+
+-- == Basic foreign types ==
+
+instance HasFFIType (StablePtr a) where
+  type ToFFIType (StablePtr a) = FFI.Basic FFI.StablePtr
+  {-# INLINE toFFIType #-}
+  toFFIType = castStablePtr
+  {-# INLINE fromFFIType #-}
+  fromFFIType = castStablePtr
+
+{-# INLINE castStablePtr #-}
+castStablePtr :: StablePtr a -> StablePtr b
+castStablePtr = castPtrToStablePtr . castStablePtrToPtr
+
+-- === Foreign.C.ConstPtr ===
+
+-- == Newtypes around basic foreign types ==
+
+instance HasFFIType (PtrConst a) where
+  type ToFFIType (PtrConst a) = FFI.Basic FFI.Ptr
+  {-# INLINE toFFIType #-}
+  toFFIType = castPtr . unsafeToPtr
+  {-# INLINE fromFFIType #-}
+  fromFFIType = unsafeFromPtr . castPtr
+
+-- === Foreign.C.Error ===
+
+-- == Newtypes around basic foreign types ==
+
+deriving newtype instance HasFFIType Errno
+
+-- === Foreign.C.Types ===
+
+-- == Newtypes around basic foreign types ==
+
+deriving newtype instance HasFFIType CChar
+deriving newtype instance HasFFIType CSChar
+deriving newtype instance HasFFIType CUChar
+deriving newtype instance HasFFIType CShort
+deriving newtype instance HasFFIType CUShort
+deriving newtype instance HasFFIType CInt
+deriving newtype instance HasFFIType CUInt
+deriving newtype instance HasFFIType CLong
+deriving newtype instance HasFFIType CULong
+deriving newtype instance HasFFIType CPtrdiff
+deriving newtype instance HasFFIType CSize
+deriving newtype instance HasFFIType CWchar
+deriving newtype instance HasFFIType CSigAtomic
+deriving newtype instance HasFFIType CLLong
+deriving newtype instance HasFFIType CULLong
+deriving newtype instance HasFFIType CBool
+deriving newtype instance HasFFIType CIntPtr
+deriving newtype instance HasFFIType CUIntPtr
+deriving newtype instance HasFFIType CIntMax
+deriving newtype instance HasFFIType CUIntMax
+
+-- === Foreign.C.Types : Numeric types ===
+
+-- == Newtypes around basic foreign types ==
+
+deriving newtype instance HasFFIType CClock
+deriving newtype instance HasFFIType CTime
+deriving newtype instance HasFFIType CUSeconds
+deriving newtype instance HasFFIType CSUSeconds
+
+-- === Foreign.C.Types : Floating types ===
+
+-- == Newtypes around basic foreign types ==
+
+deriving newtype instance HasFFIType CFloat
+deriving newtype instance HasFFIType CDouble
+
diff --git a/runtime/HsBindgen/Runtime/Support/LibC/Auxiliary.hsc b/runtime/HsBindgen/Runtime/Support/LibC/Auxiliary.hsc
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/LibC/Auxiliary.hsc
@@ -0,0 +1,355 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE OverloadedRecordDot #-}
+{-# LANGUAGE UnboxedTuples #-}
+
+-- | C standard library types that are not in @base@
+--
+-- These are re-exported in the public-facing module "HsBindgen.Runtime.LibC".
+module HsBindgen.Runtime.Support.LibC.Auxiliary (
+    -- * Floating Types
+    CFenvT
+  , CFexceptT
+
+    -- * Wide Character Types
+  , CWintT(..)
+  , CMbstateT
+  , CWctransT(..)
+  , CWctypeT(..)
+  , CChar16T(..)
+  , CChar32T(..)
+
+    -- * Time Types
+  , CTm(..)
+  ) where
+
+import Data.Bits (Bits, FiniteBits)
+import Data.Ix (Ix)
+import Data.Primitive.Types (Prim)
+import Data.Proxy (Proxy (..))
+import Data.Word (Word16, Word32)
+import Foreign.C.Types qualified as C
+import Foreign.Ptr (Ptr)
+import Foreign.Storable
+import GHC.Records (HasField (..))
+
+import HsBindgen.Runtime.HasCField (HasCField (..))
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Support.Bitfield (Bitfield)
+import HsBindgen.Runtime.Support.HasFFIType (HasFFIType)
+import HsBindgen.Runtime.Marshal
+
+#include <inttypes.h>
+#include <locale.h>
+#include <stdlib.h>
+#include <time.h>
+
+{-------------------------------------------------------------------------------
+  Integral Types
+-------------------------------------------------------------------------------}
+
+-- NOTE The \"least\" and \"fast\" types (such as @int_least32_t@) /cannot/ be
+-- defined in the standard library because their implementations differ across
+-- different @libc@ implementations, and users may choose which @libc@ to use
+-- when running @hs-bindgen@.
+
+{-------------------------------------------------------------------------------
+  Floating Types
+-------------------------------------------------------------------------------}
+
+-- TODO <https://github.com/well-typed/hs-bindgen/issues/2133>
+--
+-- TODO CFloatT @float_t@ (arch, uses long double, math.h)
+
+-- TODO <https://github.com/well-typed/hs-bindgen/issues/2133>
+--
+-- TODO CDoubleT @double_t@ (arch, uses long double, math.h)
+
+--------------------------------------------------------------------------------
+
+-- | C @fenv_t@ type
+--
+-- @fenv_t@ represents the entire floating-point environment.  It is
+-- implementation-specific, so this representation is opaque and may only be
+-- used with a 'Ptr'.  It is available since C99.  It is defined in the @fenv.h@
+-- header file.
+data CFenvT
+
+--------------------------------------------------------------------------------
+
+-- | C @fexcept_t@ type
+--
+-- @fexcept_t@ represents the floating-point status flags collectively,
+-- including any status the implementation associates with the flags.  It is
+-- implementation-specific, so this representation is opaque and may only be
+-- used with a 'Ptr'.  It is available since C99.  It is defined in the @fenv.h@
+-- header file.
+data CFexceptT
+
+{-------------------------------------------------------------------------------
+  Standard Definitions
+-------------------------------------------------------------------------------}
+
+-- TODO <https://github.com/well-typed/hs-bindgen/issues/2133>
+--
+-- TODO CMaxAlignT @max_align_t@ (uses long double, C11, stddef.h)
+
+{-------------------------------------------------------------------------------
+  Wide Character Types
+-------------------------------------------------------------------------------}
+
+-- | C @wint_t@ type
+--
+-- @wint_t@ represents wide integers.  It is available since C95.  It is defined
+-- in the @wchar.h@ and @wctype.h@ header files.
+newtype CWintT = CWintT C.CUInt
+  deriving newtype (
+      Bitfield
+    , Bits
+    , Bounded
+    , Enum
+    , Eq
+    , FiniteBits
+    , HasFFIType
+    , Integral
+    , Ix
+    , Num
+    , Ord
+    , Prim
+    , Read
+    , ReadRaw
+    , Real
+    , Show
+    , StaticSize
+    , Storable
+    , WriteRaw
+    )
+
+--------------------------------------------------------------------------------
+
+-- | C @mbstate_t@ type
+--
+-- @mbstate_t@ is a complete object type other than an array type that can hold
+-- the conversion state information necessary to convert between sequences of
+-- multibyte characters and wide characters.  It is implementation-specific, so
+-- this representation is opaque and may only be used with a 'Ptr'.  It is
+-- available since C95.  It is defined in the @wchar.h@ and @uchar.h@ header
+-- files.
+data CMbstateT
+
+--------------------------------------------------------------------------------
+
+-- | C @wctrans_t@ type
+--
+-- @wctrans_t@ is a scalar type that can hold values which represent
+-- locale-specific character transformations.  It is available since C95.  It is
+-- defined in the @wctype.h@ header file.
+newtype CWctransT = CWctransT (Ptr C.CInt)
+  deriving newtype (
+      Eq
+    , HasFFIType
+    , Prim
+    , ReadRaw
+    , Show
+    , StaticSize
+    , Storable
+    , WriteRaw
+    )
+
+--------------------------------------------------------------------------------
+
+-- | C @wctype_t@ type
+--
+-- @wctype_t@ is a scalar type that can hold values which represent
+-- locale-specific character classification categories.  It is available since
+-- C95.  It is defined in the @wctype.h@ and @wchar.h@ header files.
+newtype CWctypeT = CWctypeT C.CULong
+  deriving newtype (
+      Eq
+    , HasFFIType
+    , Prim
+    , ReadRaw
+    , Show
+    , StaticSize
+    , Storable
+    , WriteRaw
+    )
+
+--------------------------------------------------------------------------------
+
+-- | C @char16_t@ type
+--
+-- @char16_t@ represents a 16-bit Unicode character.  It is available since C11.
+-- It is defined in the @uchar.h@ header file.
+newtype CChar16T = CChar16T Word16
+  deriving newtype (
+      Bitfield
+    , Bits
+    , Bounded
+    , Enum
+    , Eq
+    , FiniteBits
+    , HasFFIType
+    , Integral
+    , Ix
+    , Num
+    , Ord
+    , Prim
+    , Read
+    , ReadRaw
+    , Real
+    , Show
+    , StaticSize
+    , Storable
+    , WriteRaw
+    )
+
+--------------------------------------------------------------------------------
+
+-- | C @char32_t@ type
+--
+-- @char32_t@ represents a 32-bit Unicode character.  It is available since C11.
+-- It is defined in the @uchar.h@ header file.
+newtype CChar32T = CChar32T Word32
+  deriving newtype (
+      Bitfield
+    , Bits
+    , Bounded
+    , Enum
+    , Eq
+    , FiniteBits
+    , HasFFIType
+    , Integral
+    , Ix
+    , Num
+    , Ord
+    , Prim
+    , Read
+    , ReadRaw
+    , Real
+    , Show
+    , StaticSize
+    , Storable
+    , WriteRaw
+    )
+
+{-------------------------------------------------------------------------------
+  Localization Types
+-------------------------------------------------------------------------------}
+
+-- TODO <https://github.com/well-typed/hs-bindgen/issues/2133>
+--
+-- CLconv @struct lconv@ (fields added in C99, locale.h)
+
+{-------------------------------------------------------------------------------
+  Time Types
+-------------------------------------------------------------------------------}
+
+-- | C @struct tm@ type
+--
+-- @struct tm@ holds the components of a calendar time, called the
+-- /broken-down time/.  Note that only the fields defined in the standard are
+-- represented here.  It is defined in the @time.h@ header file, and it is made
+-- available in other header files that use it.
+data CTm = CTm {
+      tm_sec   :: C.CInt -- ^ Seconds after the minute (@[0, 61]@)
+    , tm_min   :: C.CInt -- ^ Minutes after the hour (@[0, 59]@)
+    , tm_hour  :: C.CInt -- ^ Hours since midnight (@[0, 23]@)
+    , tm_mday  :: C.CInt -- ^ Day of the month (@[1, 31]@)
+    , tm_mon   :: C.CInt -- ^ Months since January (@[0, 11]@)
+    , tm_year  :: C.CInt -- ^ Years since 1900
+    , tm_wday  :: C.CInt -- ^ Days since Sunday (@[0, 6]@)
+    , tm_yday  :: C.CInt -- ^ Days since January 1 (@[0, 365]@)
+    , tm_isdst :: C.CInt -- ^ Daylight Saving Time flag
+    }
+  deriving stock (Eq, Show)
+
+instance HasCField CTm "tm_sec" where
+  type CFieldType CTm "tm_sec" = C.CInt
+  offset## _ _ = #offset struct tm, tm_sec
+
+instance HasCField CTm "tm_min" where
+  type CFieldType CTm "tm_min" = C.CInt
+  offset## _ _ = #offset struct tm, tm_min
+
+instance HasCField CTm "tm_hour" where
+  type CFieldType CTm "tm_hour" = C.CInt
+  offset## _ _ = #offset struct tm, tm_hour
+
+instance HasCField CTm "tm_mday" where
+  type CFieldType CTm "tm_mday" = C.CInt
+  offset## _ _ = #offset struct tm, tm_mday
+
+instance HasCField CTm "tm_mon" where
+  type CFieldType CTm "tm_mon" = C.CInt
+  offset## _ _ = #offset struct tm, tm_mon
+
+instance HasCField CTm "tm_year" where
+  type CFieldType CTm "tm_year" = C.CInt
+  offset## _ _ = #offset struct tm, tm_year
+
+instance HasCField CTm "tm_wday" where
+  type CFieldType CTm "tm_wday" = C.CInt
+  offset## _ _ = #offset struct tm, tm_wday
+
+instance HasCField CTm "tm_yday" where
+  type CFieldType CTm "tm_yday" = C.CInt
+  offset## _ _ = #offset struct tm, tm_yday
+
+instance HasCField CTm "tm_isdst" where
+  type CFieldType CTm "tm_isdst" = C.CInt
+  offset## _ _ = #offset struct tm, tm_isdst
+
+instance ( ty ~ (CFieldType CTm "tm_sec")
+         ) => HasField "tm_sec" (Ptr CTm) (Ptr ty) where
+  getField = HasCField.fromPtr (Proxy @"tm_sec")
+
+instance ( ty ~ (CFieldType CTm "tm_min")
+         ) => HasField "tm_min" (Ptr CTm) (Ptr ty) where
+  getField = HasCField.fromPtr (Proxy @"tm_min")
+
+instance ( ty ~ (CFieldType CTm "tm_hour")
+         ) => HasField "tm_hour" (Ptr CTm) (Ptr ty) where
+  getField = HasCField.fromPtr (Proxy @"tm_hour")
+
+instance ( ty ~ (CFieldType CTm "tm_mday")
+         ) => HasField "tm_mday" (Ptr CTm) (Ptr ty) where
+  getField = HasCField.fromPtr (Proxy @"tm_mday")
+
+instance ( ty ~ (CFieldType CTm "tm_mon")
+         ) => HasField "tm_mon" (Ptr CTm) (Ptr ty) where
+  getField = HasCField.fromPtr (Proxy @"tm_mon")
+
+instance ( ty ~ (CFieldType CTm "tm_year")
+         ) => HasField "tm_year" (Ptr CTm) (Ptr ty) where
+  getField = HasCField.fromPtr (Proxy @"tm_year")
+
+instance ( ty ~ (CFieldType CTm "tm_wday")
+         ) => HasField "tm_wday" (Ptr CTm) (Ptr ty) where
+  getField = HasCField.fromPtr (Proxy @"tm_wday")
+
+instance ( ty ~ (CFieldType CTm "tm_yday")
+         ) => HasField "tm_yday" (Ptr CTm) (Ptr ty) where
+  getField = HasCField.fromPtr (Proxy @"tm_yday")
+
+instance ( ty ~ (CFieldType CTm "tm_isdst")
+         ) => HasField "tm_isdst" (Ptr CTm) (Ptr ty) where
+  getField = HasCField.fromPtr (Proxy @"tm_isdst")
+
+instance ReadRaw CTm where
+  readRaw ptr = do
+    tm_sec   <- (#peek struct tm, tm_sec)   ptr
+    tm_min   <- (#peek struct tm, tm_min)   ptr
+    tm_hour  <- (#peek struct tm, tm_hour)  ptr
+    tm_mday  <- (#peek struct tm, tm_mday)  ptr
+    tm_mon   <- (#peek struct tm, tm_mon)   ptr
+    tm_year  <- (#peek struct tm, tm_year)  ptr
+    tm_wday  <- (#peek struct tm, tm_wday)  ptr
+    tm_yday  <- (#peek struct tm, tm_yday)  ptr
+    tm_isdst <- (#peek struct tm, tm_isdst) ptr
+    return CTm{..}
+
+instance StaticSize CTm where
+  staticSizeOf    _ = #size      struct tm
+  staticAlignment _ = #alignment struct tm
diff --git a/runtime/HsBindgen/Runtime/Support/Ptr.hs b/runtime/HsBindgen/Runtime/Support/Ptr.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/Ptr.hs
@@ -0,0 +1,36 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+-- NOTE: For now, this module is classified "Support" because the definitions
+-- are re-exported from the runtime prelude. Should we add definitions intended
+-- for qualified import, we need to add a public module.
+
+-- | Pointer utilities
+module HsBindgen.Runtime.Support.Ptr (
+  plusPtrElem,
+  safeCastFunPtr,
+) where
+
+import Data.Coerce (Coercible, coerce)
+import Foreign.Ptr
+import Foreign.Storable
+
+-- | Advances the given address by the given offset in number of elements of
+-- type @a@.
+--
+-- Examples:
+--
+-- > plusPtr (_ :: Ptr Word32) 2 -- moves the pointer by 2 bytes
+-- > plusPtrElem (_ :: Ptr Word32) 2 -- moves the pointer by 2*4=8 bytes
+--
+-- NOTE: if @a@ is an instance of 'Data.Primitive.Types.Prim', then you can
+-- alternatively use 'Data.Primitive.Ptr.advancePtr'.
+plusPtrElem :: forall a. (Storable a) => Ptr a -> Int -> Ptr a
+plusPtrElem ptr i = ptr `plusPtr` (i * sizeOf (undefined :: a))
+
+-- | Safely casts a 'FunPtr' to a 'FunPtr' of a different type.
+safeCastFunPtr
+  :: forall a b. (Coercible a b) => FunPtr a -> FunPtr b
+safeCastFunPtr = castFunPtr
+ where
+  _unused :: a -> b
+  _unused = coerce
diff --git a/runtime/HsBindgen/Runtime/Support/SizedByteArray.hs b/runtime/HsBindgen/Runtime/Support/SizedByteArray.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/SizedByteArray.hs
@@ -0,0 +1,80 @@
+{-# OPTIONS_HADDOCK hide #-}
+
+module HsBindgen.Runtime.Support.SizedByteArray (
+  SizedByteArray (..),
+  zeroUnionValue,
+) where
+
+import Data.Coerce (Coercible, coerce)
+import Data.Primitive.ByteArray (ByteArray (..))
+import Data.Primitive.ByteArray qualified as BA
+import Data.Proxy (Proxy (..))
+import Data.Word (Word8)
+import Foreign (Storable (..))
+import Foreign.Ptr (Ptr, castPtr)
+import GHC.TypeNats qualified as GHC
+
+import HsBindgen.Runtime.Marshal
+
+{-------------------------------------------------------------------------------
+  Definition
+-------------------------------------------------------------------------------}
+
+-- | t'SizedByteArray's provide deriving-via support for t'ByteArray'.
+--
+-- Intended usage:
+--
+-- > newtype Foo = Foo ByteArray
+-- >   deriving (Storable, Prim) via SizedByteArray 16 4
+--
+-- == Size
+--
+-- In this example, the v'ByteArray' must have size 16.
+--
+-- == Storable
+--
+-- The derived 'Storable' instance does /not/ declare that the t'ByteArray'
+-- /itself/ is memory aligned in any way (indeed, the t'ByteArray' may well not
+-- be pinned). It merely states that if we use 'Storable' to pass the
+-- t'ByteArray' to a C function, we must
+--
+-- * allocate a temporary buffer (typically using 'Foreign.alloca')
+-- * copy the v'ByteArray' into that buffer
+-- * call the C function, passing a pointer to this buffer
+--
+-- where /that temporary buffer/ must be memory aligned.
+newtype SizedByteArray (size :: GHC.Nat) (alignment :: GHC.Nat)
+  = SizedByteArray ByteArray
+  deriving (Storable) via EquivStorable (SizedByteArray size alignment)
+
+{-------------------------------------------------------------------------------
+  StaticSize, ReadRaw, WriteRaw
+-------------------------------------------------------------------------------}
+
+instance (GHC.KnownNat n, GHC.KnownNat m) => StaticSize (SizedByteArray n m) where
+  staticSizeOf _ = fromIntegral (GHC.natVal (Proxy @n))
+  staticAlignment _ = fromIntegral (GHC.natVal (Proxy @m))
+
+instance (GHC.KnownNat n) => ReadRaw (SizedByteArray n m) where
+  readRaw ptrSBA = do
+    let ptr = castPtr ptrSBA :: Ptr Word8
+        size = fromIntegral $ GHC.natVal (Proxy @n)
+    arr <- BA.newByteArray size
+    BA.copyPtrToMutableByteArray arr 0 ptr size
+    SizedByteArray <$> BA.unsafeFreezeByteArray arr
+
+-- | Write a t'SizedByteArray' to the specified location, which must have the
+-- correct alignment (matching @m@)
+instance (GHC.KnownNat n) => WriteRaw (SizedByteArray n m) where
+  writeRaw ptrSBA (SizedByteArray arr) = do
+    let ptr = castPtr ptrSBA :: Ptr Word8
+        size = fromIntegral $ GHC.natVal (Proxy @n)
+    BA.copyByteArrayToAddr ptr arr 0 size
+
+{-# DEPRECATED zeroUnionValue "Use HsBindgen.Runtime.Union.zero instead" #-}
+
+-- | Create a value of a C union with all bytes initialized to zero.
+zeroUnionValue :: forall a. (Coercible a ByteArray, StaticSize a) => a
+zeroUnionValue = coerce $ BA.byteArrayFromListN n $ replicate n (0 :: Word8)
+ where
+  n = staticSizeOf (Proxy :: Proxy a)
diff --git a/runtime/HsBindgen/Runtime/Support/TH/Instances.hs b/runtime/HsBindgen/Runtime/Support/TH/Instances.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/TH/Instances.hs
@@ -0,0 +1,72 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# OPTIONS_GHC -Wno-missing-export-lists #-}
+{-# OPTIONS_GHC -Wno-orphans #-}
+
+-- | Generate FFI wrappers and 'ToFunPtr' class instances for 287 types.
+module HsBindgen.Runtime.Support.TH.Instances () where
+
+import Foreign.C.Types
+
+import HsBindgen.Runtime.Support.FunPtr.Class
+import HsBindgen.Runtime.Support.TH.Types
+
+-- | Generate instances for all @IO a@ functions
+--
+-- > 17 FFI wrappers
+-- > 17 FFI dynamic
+-- > 17 ToFunPtr instances
+-- > 17 FromFunPtr instances
+--
+-- Total = 68
+$( do
+     decls <-
+       sequence
+         [ generateInstance retTy
+         | retTy <- allIOTypes
+         ]
+     return $ concat decls
+ )
+
+-- | Generate instances for all @a -> IO b@ functions
+--
+-- > (17 + 17) * 2 = 70 FFI wrappers
+-- > (17 + 17) * 2 = 70 FFI dynamic
+-- > (17 + 17) * 2 = 70 ToFunPtr instances
+-- > (17 + 17) * 2 = 70 FromFunPtr instances
+--
+-- Total = 280
+$( do
+     decls <-
+       sequence
+         [ generateInstance [t|$argTy -> $retTy|]
+         | argTy <- allPrimTypes ++ allPtrTypes
+         , retTy <- commonReturnTypes
+         ]
+     return $ concat decls
+ )
+
+-- | Generate instances for @a -> b -> IO c@ functions.
+--
+-- We can't generate all binary functions because that would mean
+--
+-- > (17 + 18) * (17 + 18) * 18 = 22050 instances
+--
+-- Instead we only generate instances for the most common C callback
+-- signatures.
+--
+-- > (5 + 5) * (5 + 5) * 2 = 200 FFI wrappers
+-- > (5 + 5) * (5 + 5) * 2 = 200 FFI dynamic
+-- > (5 + 5) * (5 + 5) * 2 = 200 ToFunPtr instances
+-- > (5 + 5) * (5 + 5) * 2 = 200 FromFunPtr instances
+--
+-- Total = 800
+$( do
+     decls <-
+       sequence
+         [ generateInstance [t|$argTy1 -> $argTy2 -> $retTy|]
+         | argTy1 <- commonPrimTypes ++ commonPtrTypes
+         , argTy2 <- commonPrimTypes ++ commonPtrTypes
+         , retTy <- commonReturnTypes
+         ]
+     return $ concat decls
+ )
diff --git a/runtime/HsBindgen/Runtime/Support/TH/Types.hs b/runtime/HsBindgen/Runtime/Support/TH/Types.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Support/TH/Types.hs
@@ -0,0 +1,150 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+-- | This module provides TH splices that generate FFI wrappers and
+-- 'ToFunPtr' instances that are called in different modules to paralellize
+-- compilation and compile time code generation.
+module HsBindgen.Runtime.Support.TH.Types (
+  -- * Types
+  allPrimTypes,
+  allPtrTypes,
+  allIOTypes,
+
+  -- * Common Types
+  commonPrimTypes,
+  commonPtrTypes,
+  commonReturnTypes,
+
+  -- * Generate the instances
+  generateInstance,
+) where
+
+import Data.Void (Void)
+import Foreign qualified as F
+import Foreign.C.Types
+import GHC.Ptr qualified as Ptr
+import Language.Haskell.TH
+
+import HsBindgen.Runtime.Support.FunPtr.Class
+
+-- | Get primitive marshallable types
+allPrimTypes :: [Q Type]
+allPrimTypes =
+  [ [t|CChar|]
+  , [t|CSChar|]
+  , [t|CUChar|]
+  , [t|CInt|]
+  , [t|CUInt|]
+  , [t|CShort|]
+  , [t|CUShort|]
+  , [t|CLong|]
+  , [t|CULong|]
+  , [t|CPtrdiff|]
+  , [t|CSize|]
+  , [t|CLLong|]
+  , [t|CULLong|]
+  , [t|CBool|]
+  , [t|CFloat|]
+  , [t|CDouble|]
+  , [t|Int|]
+  ]
+
+-- | Get pointer types for all primitive types
+allPtrTypes :: [Q Type]
+allPtrTypes =
+  [t|Ptr.Ptr Void|]
+    : [ [t|Ptr.Ptr $t|]
+      | t <- allPrimTypes
+      ]
+
+-- | Get IO types for all primitive types
+allIOTypes :: [Q Type]
+allIOTypes =
+  [t|IO ()|]
+    : [ [t|IO $t|]
+      | t <- allPrimTypes
+      ]
+
+-- | A list of the most common primitive types found in C callbacks.
+commonPrimTypes :: [Q Type]
+commonPrimTypes =
+  [ [t|CChar|]
+  , [t|CInt|]
+  , [t|CUInt|]
+  , [t|CDouble|]
+  , [t|CFloat|]
+  ]
+
+-- | Common pointer types, including the crucial @void*@ and @char*@.
+commonPtrTypes :: [Q Type]
+commonPtrTypes =
+  [ [t|Ptr.Ptr Void|]
+  , [t|Ptr.Ptr CChar|]
+  , [t|Ptr.Ptr CInt|]
+  ]
+
+-- | The most common return types for callbacks are @void@ and integer status
+-- codes.
+commonReturnTypes :: [Q Type]
+commonReturnTypes =
+  [ [t|IO ()|]
+  , [t|IO CInt|]
+  ]
+
+-- | Generate a foreign import wrapper and 'ToFunPtr' instance for a
+-- particular type
+generateInstance :: Q Type -> Q [Dec]
+generateInstance funTyQ = do
+  funTy <- funTyQ
+
+  wrapperName <- newName ("wrapper_" ++ sanitizeTypeName (show funTy))
+  dynamicName <- newName ("dynamic_" ++ sanitizeTypeName (show funTy))
+
+  foreignImportWrapper <-
+    forImpD
+      CCall
+      Safe
+      "wrapper"
+      wrapperName
+      [t|$funTyQ -> IO (F.FunPtr $funTyQ)|]
+
+  foreignImportDynamic <-
+    forImpD
+      CCall
+      Safe
+      "dynamic"
+      dynamicName
+      [t|F.FunPtr $funTyQ -> $funTyQ|]
+
+  toFunPtrInstance <-
+    instanceD
+      (return [])
+      [t|ToFunPtr $funTyQ|]
+      [ funD
+          (mkName "toFunPtr")
+          [ clause [] (normalB (varE wrapperName)) []
+          ]
+      ]
+
+  fromFunPtrInstance <-
+    instanceD
+      (return [])
+      [t|FromFunPtr $funTyQ|]
+      [ funD
+          (mkName "fromFunPtr")
+          [ clause [] (normalB (varE dynamicName)) []
+          ]
+      ]
+  return
+    [ foreignImportWrapper
+    , foreignImportDynamic
+    , toFunPtrInstance
+    , fromFunPtrInstance
+    ]
+ where
+  -- \| Sanitize type name for use in generated names
+  sanitizeTypeName :: String -> String
+  sanitizeTypeName = concatMap sanitizeChar
+   where
+    sanitizeChar c
+      | c `elem` (['a' .. 'z'] ++ ['A' .. 'Z'] ++ ['0' .. '9']) = [c]
+      | otherwise = "_"
diff --git a/runtime/HsBindgen/Runtime/Union.hs b/runtime/HsBindgen/Runtime/Union.hs
new file mode 100644
--- /dev/null
+++ b/runtime/HsBindgen/Runtime/Union.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE AllowAmbiguousTypes #-}
+
+-- | Class for C unions
+--
+-- This module is intended to be imported qualified.
+--
+-- > import HsBindgen.Runtime.Prelude
+-- > import HsBindgen.Runtime.Union qualified as Union
+module HsBindgen.Runtime.Union (
+  IsUnion (..),
+  get,
+  set,
+) where
+
+import Data.Coerce (coerce)
+import Data.Primitive.ByteArray qualified as BA
+import Data.Proxy (Proxy (..))
+import Data.Word (Word8)
+import GHC.Records.Compat qualified as Compat
+import GHC.TypeNats (KnownNat)
+
+import HsBindgen.Runtime.Marshal
+import HsBindgen.Runtime.Support.SizedByteArray (SizedByteArray (..))
+
+class IsUnion u where
+  zero :: u
+
+instance (KnownNat n, KnownNat m) => IsUnion (SizedByteArray n m) where
+  zero = coerce $ BA.byteArrayFromListN n $ replicate n (0 :: Word8)
+   where
+    n = staticSizeOf (Proxy :: Proxy (SizedByteArray n m))
+
+get
+  :: forall field union a
+   . (Compat.HasField field union a)
+  => union
+  -> a
+get = Compat.getField @field
+
+set
+  :: forall field union a
+   . (Compat.HasField field union a, IsUnion union)
+  => a
+  -> union
+set = Compat.setField @field zero
diff --git a/sdl3-bindgen-sys.cabal b/sdl3-bindgen-sys.cabal
new file mode 100644
--- /dev/null
+++ b/sdl3-bindgen-sys.cabal
@@ -0,0 +1,520 @@
+cabal-version: 2.2
+
+-- This file has been generated from package.yaml by hpack version 0.39.6.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: "v\192\194\247\225\129e\DEL\238^\168q\247\215\247M}\241\168\184~\192\216\DC1OG0W\EM/@\233"
+
+name:           sdl3-bindgen-sys
+version:        0.0.0.1
+synopsis:       Complete SDL3 bindings, raw + curated, generated by hs-bindgen
+description:    Machine-generated low-level bindings to the whole SDL 3.4 API: the raw
+                hs-bindgen output (@SDL3.Sys.Bindgen.*@) plus a curated @SDL3.Sys@ layer
+                with per-function safe/unsafe FFI decisions, typed constants, and native
+                Haskell scalars. SDL's own header documentation rides along in the
+                haddocks.
+                .
+                A generated translation unit of C @_Static_assert@s checks the baked
+                layouts against your installed SDL at every build, so ABI divergence is
+                a compile error rather than memory corruption.
+                .
+                Supports 64-bit Linux, macOS, and Windows, with SDL >= 3.2 development
+                headers present. See the README for a quick start and the list of
+                deliberate omissions.
+category:       Graphics
+homepage:       https://github.com/jtnuttall/lithon#readme
+bug-reports:    https://github.com/jtnuttall/lithon/issues
+author:         Jeremy Nuttall
+maintainer:     jeremy@jeremy-nuttall.com
+copyright:      (c) 2026 Jeremy Nuttall
+license:        BSD-3-Clause
+license-files:  LICENSE,
+                LICENSE_SDL,
+                LICENSE_hs-bindgen-runtime,
+                LICENSE_c-expr-runtime
+build-type:     Simple
+tested-with:
+    GHC == 9.8.* || == 9.10.* || == 9.12.*
+extra-doc-files:
+    README.md
+    CHANGELOG.md
+
+source-repository head
+  type: git
+  location: https://github.com/jtnuttall/lithon
+  subdir: sdl3-bindgen-sys
+
+flag abi-assertions
+  description: Verify the baked ABI layout against the system SDL3 headers at build time
+               via generated C static assertions (disable only to diagnose)
+  manual: True
+  default: True
+
+flag optimize
+  description: Build with -O2. Package ghc-options win over cabal's optimization setting, so use
+               -f -optimize for faster iterative builds of this large package.
+  manual: True
+  default: True
+
+flag optimize-aggressively
+  description: Build with expensive optimizations. Consider this the release build: slow, but paid once if
+               caching is set up, so it may be worth it for artifacts you intend to ship.
+               .
+               Currently: -O2 -fexpose-all-unfoldings -flate-specialise -flate-dmd-anal -fstg-lift-lams.
+  manual: True
+  default: False
+
+flag strict
+  description: EXPERIMENTAL: compile the generated modules with Strict.
+               .
+               The emitted hs-bindgen code has not been audited for laziness dependence; main library only.
+               .
+               NB: Implies StrictData (GHC semantics), so -f -strict-data does not undo strict fields.
+  manual: True
+  default: False
+
+flag strict-data
+  description: Compile the generated modules with StrictData (strict fields on every generated
+               record). Main library only; the vendored runtime keeps its upstream semantics.
+               Disable if you need lazy fields.
+  manual: True
+  default: True
+
+library
+  exposed-modules:
+      SDL3.Sys
+      SDL3.Sys.Assert
+      SDL3.Sys.Asyncio
+      SDL3.Sys.Atomic
+      SDL3.Sys.Audio
+      SDL3.Sys.Bindgen.Assert
+      SDL3.Sys.Bindgen.Assert.FunPtr
+      SDL3.Sys.Bindgen.Assert.Safe
+      SDL3.Sys.Bindgen.Assert.Unsafe
+      SDL3.Sys.Bindgen.Asyncio
+      SDL3.Sys.Bindgen.Asyncio.FunPtr
+      SDL3.Sys.Bindgen.Asyncio.Safe
+      SDL3.Sys.Bindgen.Asyncio.Unsafe
+      SDL3.Sys.Bindgen.Atomic
+      SDL3.Sys.Bindgen.Atomic.FunPtr
+      SDL3.Sys.Bindgen.Atomic.Safe
+      SDL3.Sys.Bindgen.Atomic.Unsafe
+      SDL3.Sys.Bindgen.Audio
+      SDL3.Sys.Bindgen.Audio.FunPtr
+      SDL3.Sys.Bindgen.Audio.Safe
+      SDL3.Sys.Bindgen.Audio.Unsafe
+      SDL3.Sys.Bindgen.Bits.FunPtr
+      SDL3.Sys.Bindgen.Bits.Safe
+      SDL3.Sys.Bindgen.Bits.Unsafe
+      SDL3.Sys.Bindgen.Blendmode
+      SDL3.Sys.Bindgen.Blendmode.FunPtr
+      SDL3.Sys.Bindgen.Blendmode.Safe
+      SDL3.Sys.Bindgen.Blendmode.Unsafe
+      SDL3.Sys.Bindgen.Camera
+      SDL3.Sys.Bindgen.Camera.FunPtr
+      SDL3.Sys.Bindgen.Camera.Safe
+      SDL3.Sys.Bindgen.Camera.Unsafe
+      SDL3.Sys.Bindgen.Clipboard
+      SDL3.Sys.Bindgen.Clipboard.FunPtr
+      SDL3.Sys.Bindgen.Clipboard.Safe
+      SDL3.Sys.Bindgen.Clipboard.Unsafe
+      SDL3.Sys.Bindgen.Cpuinfo
+      SDL3.Sys.Bindgen.Cpuinfo.FunPtr
+      SDL3.Sys.Bindgen.Cpuinfo.Safe
+      SDL3.Sys.Bindgen.Cpuinfo.Unsafe
+      SDL3.Sys.Bindgen.Dialog
+      SDL3.Sys.Bindgen.Dialog.FunPtr
+      SDL3.Sys.Bindgen.Dialog.Safe
+      SDL3.Sys.Bindgen.Dialog.Unsafe
+      SDL3.Sys.Bindgen.Dlopennote
+      SDL3.Sys.Bindgen.Endian
+      SDL3.Sys.Bindgen.Endian.FunPtr
+      SDL3.Sys.Bindgen.Endian.Safe
+      SDL3.Sys.Bindgen.Endian.Unsafe
+      SDL3.Sys.Bindgen.Error.FunPtr
+      SDL3.Sys.Bindgen.Error.Safe
+      SDL3.Sys.Bindgen.Error.Unsafe
+      SDL3.Sys.Bindgen.Events
+      SDL3.Sys.Bindgen.Events.FunPtr
+      SDL3.Sys.Bindgen.Events.Safe
+      SDL3.Sys.Bindgen.Events.Unsafe
+      SDL3.Sys.Bindgen.Filesystem
+      SDL3.Sys.Bindgen.Filesystem.FunPtr
+      SDL3.Sys.Bindgen.Filesystem.Safe
+      SDL3.Sys.Bindgen.Filesystem.Unsafe
+      SDL3.Sys.Bindgen.Gamepad
+      SDL3.Sys.Bindgen.Gamepad.FunPtr
+      SDL3.Sys.Bindgen.Gamepad.Safe
+      SDL3.Sys.Bindgen.Gamepad.Unsafe
+      SDL3.Sys.Bindgen.Gpu
+      SDL3.Sys.Bindgen.Gpu.FunPtr
+      SDL3.Sys.Bindgen.Gpu.Safe
+      SDL3.Sys.Bindgen.Gpu.Unsafe
+      SDL3.Sys.Bindgen.Guid
+      SDL3.Sys.Bindgen.Guid.FunPtr
+      SDL3.Sys.Bindgen.Guid.Safe
+      SDL3.Sys.Bindgen.Guid.Unsafe
+      SDL3.Sys.Bindgen.Haptic
+      SDL3.Sys.Bindgen.Haptic.FunPtr
+      SDL3.Sys.Bindgen.Haptic.Safe
+      SDL3.Sys.Bindgen.Haptic.Unsafe
+      SDL3.Sys.Bindgen.Hidapi
+      SDL3.Sys.Bindgen.Hidapi.FunPtr
+      SDL3.Sys.Bindgen.Hidapi.Safe
+      SDL3.Sys.Bindgen.Hidapi.Unsafe
+      SDL3.Sys.Bindgen.Hints
+      SDL3.Sys.Bindgen.Hints.FunPtr
+      SDL3.Sys.Bindgen.Hints.Safe
+      SDL3.Sys.Bindgen.Hints.Unsafe
+      SDL3.Sys.Bindgen.Init
+      SDL3.Sys.Bindgen.Init.FunPtr
+      SDL3.Sys.Bindgen.Init.Safe
+      SDL3.Sys.Bindgen.Init.Unsafe
+      SDL3.Sys.Bindgen.Iostream
+      SDL3.Sys.Bindgen.Iostream.FunPtr
+      SDL3.Sys.Bindgen.Iostream.Safe
+      SDL3.Sys.Bindgen.Iostream.Unsafe
+      SDL3.Sys.Bindgen.Joystick
+      SDL3.Sys.Bindgen.Joystick.FunPtr
+      SDL3.Sys.Bindgen.Joystick.Safe
+      SDL3.Sys.Bindgen.Joystick.Unsafe
+      SDL3.Sys.Bindgen.Keyboard
+      SDL3.Sys.Bindgen.Keyboard.FunPtr
+      SDL3.Sys.Bindgen.Keyboard.Safe
+      SDL3.Sys.Bindgen.Keyboard.Unsafe
+      SDL3.Sys.Bindgen.Keycode
+      SDL3.Sys.Bindgen.Loadso
+      SDL3.Sys.Bindgen.Loadso.FunPtr
+      SDL3.Sys.Bindgen.Loadso.Safe
+      SDL3.Sys.Bindgen.Loadso.Unsafe
+      SDL3.Sys.Bindgen.Locale
+      SDL3.Sys.Bindgen.Locale.FunPtr
+      SDL3.Sys.Bindgen.Locale.Safe
+      SDL3.Sys.Bindgen.Locale.Unsafe
+      SDL3.Sys.Bindgen.Log
+      SDL3.Sys.Bindgen.Log.FunPtr
+      SDL3.Sys.Bindgen.Log.Safe
+      SDL3.Sys.Bindgen.Log.Unsafe
+      SDL3.Sys.Bindgen.Main
+      SDL3.Sys.Bindgen.Main.FunPtr
+      SDL3.Sys.Bindgen.Main.Safe
+      SDL3.Sys.Bindgen.Main.Unsafe
+      SDL3.Sys.Bindgen.Messagebox
+      SDL3.Sys.Bindgen.Messagebox.FunPtr
+      SDL3.Sys.Bindgen.Messagebox.Safe
+      SDL3.Sys.Bindgen.Messagebox.Unsafe
+      SDL3.Sys.Bindgen.Metal
+      SDL3.Sys.Bindgen.Metal.FunPtr
+      SDL3.Sys.Bindgen.Metal.Safe
+      SDL3.Sys.Bindgen.Metal.Unsafe
+      SDL3.Sys.Bindgen.Misc.FunPtr
+      SDL3.Sys.Bindgen.Misc.Safe
+      SDL3.Sys.Bindgen.Misc.Unsafe
+      SDL3.Sys.Bindgen.Mouse
+      SDL3.Sys.Bindgen.Mouse.FunPtr
+      SDL3.Sys.Bindgen.Mouse.Safe
+      SDL3.Sys.Bindgen.Mouse.Unsafe
+      SDL3.Sys.Bindgen.Mutex
+      SDL3.Sys.Bindgen.Mutex.FunPtr
+      SDL3.Sys.Bindgen.Mutex.Safe
+      SDL3.Sys.Bindgen.Mutex.Unsafe
+      SDL3.Sys.Bindgen.Pen
+      SDL3.Sys.Bindgen.Pen.FunPtr
+      SDL3.Sys.Bindgen.Pen.Safe
+      SDL3.Sys.Bindgen.Pen.Unsafe
+      SDL3.Sys.Bindgen.Pixels
+      SDL3.Sys.Bindgen.Pixels.FunPtr
+      SDL3.Sys.Bindgen.Pixels.Safe
+      SDL3.Sys.Bindgen.Pixels.Unsafe
+      SDL3.Sys.Bindgen.Platform.FunPtr
+      SDL3.Sys.Bindgen.Platform.Safe
+      SDL3.Sys.Bindgen.Platform.Unsafe
+      SDL3.Sys.Bindgen.PlatformDefines
+      SDL3.Sys.Bindgen.Power
+      SDL3.Sys.Bindgen.Power.FunPtr
+      SDL3.Sys.Bindgen.Power.Safe
+      SDL3.Sys.Bindgen.Power.Unsafe
+      SDL3.Sys.Bindgen.Process
+      SDL3.Sys.Bindgen.Process.FunPtr
+      SDL3.Sys.Bindgen.Process.Safe
+      SDL3.Sys.Bindgen.Process.Unsafe
+      SDL3.Sys.Bindgen.Properties
+      SDL3.Sys.Bindgen.Properties.FunPtr
+      SDL3.Sys.Bindgen.Properties.Safe
+      SDL3.Sys.Bindgen.Properties.Unsafe
+      SDL3.Sys.Bindgen.Rect
+      SDL3.Sys.Bindgen.Rect.FunPtr
+      SDL3.Sys.Bindgen.Rect.Safe
+      SDL3.Sys.Bindgen.Rect.Unsafe
+      SDL3.Sys.Bindgen.Render
+      SDL3.Sys.Bindgen.Render.FunPtr
+      SDL3.Sys.Bindgen.Render.Safe
+      SDL3.Sys.Bindgen.Render.Unsafe
+      SDL3.Sys.Bindgen.Runtime
+      SDL3.Sys.Bindgen.Runtime.BitfieldPtr
+      SDL3.Sys.Bindgen.Runtime.Block
+      SDL3.Sys.Bindgen.Runtime.CBool
+      SDL3.Sys.Bindgen.Runtime.CEnum
+      SDL3.Sys.Bindgen.Runtime.CExpr
+      SDL3.Sys.Bindgen.Runtime.ConstantArray
+      SDL3.Sys.Bindgen.Runtime.FLAM
+      SDL3.Sys.Bindgen.Runtime.HasCBitfield
+      SDL3.Sys.Bindgen.Runtime.HasCField
+      SDL3.Sys.Bindgen.Runtime.IncompleteArray
+      SDL3.Sys.Bindgen.Runtime.IsArray
+      SDL3.Sys.Bindgen.Runtime.Marshal
+      SDL3.Sys.Bindgen.Runtime.PtrConst
+      SDL3.Sys.Bindgen.Runtime.Union
+      SDL3.Sys.Bindgen.Scancode
+      SDL3.Sys.Bindgen.Sensor
+      SDL3.Sys.Bindgen.Sensor.FunPtr
+      SDL3.Sys.Bindgen.Sensor.Safe
+      SDL3.Sys.Bindgen.Sensor.Unsafe
+      SDL3.Sys.Bindgen.Stdinc
+      SDL3.Sys.Bindgen.Stdinc.FunPtr
+      SDL3.Sys.Bindgen.Stdinc.Safe
+      SDL3.Sys.Bindgen.Stdinc.Unsafe
+      SDL3.Sys.Bindgen.Storage
+      SDL3.Sys.Bindgen.Storage.FunPtr
+      SDL3.Sys.Bindgen.Storage.Safe
+      SDL3.Sys.Bindgen.Storage.Unsafe
+      SDL3.Sys.Bindgen.Surface
+      SDL3.Sys.Bindgen.Surface.FunPtr
+      SDL3.Sys.Bindgen.Surface.Safe
+      SDL3.Sys.Bindgen.Surface.Unsafe
+      SDL3.Sys.Bindgen.System
+      SDL3.Sys.Bindgen.System.FunPtr
+      SDL3.Sys.Bindgen.System.Safe
+      SDL3.Sys.Bindgen.System.Unsafe
+      SDL3.Sys.Bindgen.Thread
+      SDL3.Sys.Bindgen.Thread.FunPtr
+      SDL3.Sys.Bindgen.Thread.Safe
+      SDL3.Sys.Bindgen.Thread.Unsafe
+      SDL3.Sys.Bindgen.Time
+      SDL3.Sys.Bindgen.Time.FunPtr
+      SDL3.Sys.Bindgen.Time.Safe
+      SDL3.Sys.Bindgen.Time.Unsafe
+      SDL3.Sys.Bindgen.Timer
+      SDL3.Sys.Bindgen.Timer.FunPtr
+      SDL3.Sys.Bindgen.Timer.Safe
+      SDL3.Sys.Bindgen.Timer.Unsafe
+      SDL3.Sys.Bindgen.Touch
+      SDL3.Sys.Bindgen.Touch.FunPtr
+      SDL3.Sys.Bindgen.Touch.Safe
+      SDL3.Sys.Bindgen.Touch.Unsafe
+      SDL3.Sys.Bindgen.Tray
+      SDL3.Sys.Bindgen.Tray.FunPtr
+      SDL3.Sys.Bindgen.Tray.Safe
+      SDL3.Sys.Bindgen.Tray.Unsafe
+      SDL3.Sys.Bindgen.Version
+      SDL3.Sys.Bindgen.Version.FunPtr
+      SDL3.Sys.Bindgen.Version.Safe
+      SDL3.Sys.Bindgen.Version.Unsafe
+      SDL3.Sys.Bindgen.Video
+      SDL3.Sys.Bindgen.Video.FunPtr
+      SDL3.Sys.Bindgen.Video.Safe
+      SDL3.Sys.Bindgen.Video.Unsafe
+      SDL3.Sys.Bindgen.Vulkan
+      SDL3.Sys.Bindgen.Vulkan.FunPtr
+      SDL3.Sys.Bindgen.Vulkan.Safe
+      SDL3.Sys.Bindgen.Vulkan.Unsafe
+      SDL3.Sys.Bits
+      SDL3.Sys.Blendmode
+      SDL3.Sys.Camera
+      SDL3.Sys.Clipboard
+      SDL3.Sys.Cpuinfo
+      SDL3.Sys.Dialog
+      SDL3.Sys.Dlopennote
+      SDL3.Sys.Endian
+      SDL3.Sys.Error
+      SDL3.Sys.Events
+      SDL3.Sys.Filesystem
+      SDL3.Sys.Gamepad
+      SDL3.Sys.Gpu
+      SDL3.Sys.Guid
+      SDL3.Sys.Haptic
+      SDL3.Sys.Hidapi
+      SDL3.Sys.Hints
+      SDL3.Sys.Init
+      SDL3.Sys.Iostream
+      SDL3.Sys.Joystick
+      SDL3.Sys.Keyboard
+      SDL3.Sys.Keycode
+      SDL3.Sys.Loadso
+      SDL3.Sys.Locale
+      SDL3.Sys.Log
+      SDL3.Sys.Main
+      SDL3.Sys.Messagebox
+      SDL3.Sys.Metal
+      SDL3.Sys.Misc
+      SDL3.Sys.Mouse
+      SDL3.Sys.Mutex
+      SDL3.Sys.Pen
+      SDL3.Sys.Pixels
+      SDL3.Sys.Platform
+      SDL3.Sys.PlatformDefines
+      SDL3.Sys.Power
+      SDL3.Sys.Process
+      SDL3.Sys.Properties
+      SDL3.Sys.Rect
+      SDL3.Sys.Render
+      SDL3.Sys.Runtime
+      SDL3.Sys.Scancode
+      SDL3.Sys.Sensor
+      SDL3.Sys.Stdinc
+      SDL3.Sys.Storage
+      SDL3.Sys.Surface
+      SDL3.Sys.System
+      SDL3.Sys.Thread
+      SDL3.Sys.Time
+      SDL3.Sys.Timer
+      SDL3.Sys.Touch
+      SDL3.Sys.Tray
+      SDL3.Sys.Version
+      SDL3.Sys.Video
+      SDL3.Sys.Vulkan
+  other-modules:
+      Paths_sdl3_bindgen_sys
+  autogen-modules:
+      Paths_sdl3_bindgen_sys
+  hs-source-dirs:
+      src
+  ghc-options: -optc-Wno-incompatible-pointer-types -optc-Wno-incompatible-function-pointer-types
+  pkgconfig-depends:
+      sdl3 >= 3.2
+  build-depends:
+      base >=4.17 && <4.23
+    , bindgen-runtime
+    , cexpr-runtime
+  default-language: GHC2021
+  if flag(abi-assertions)
+    c-sources:
+        cbits/abi_assertions.c
+  if flag(strict-data)
+    default-extensions:
+        StrictData
+  if flag(strict)
+    default-extensions:
+        Strict
+  if flag(optimize)
+    ghc-options: -O2
+  if flag(optimize-aggressively)
+    ghc-options: -O2 -fexpose-all-unfoldings -flate-specialise -flate-dmd-anal -fstg-lift-lams
+
+library bindgen-runtime
+  exposed-modules:
+      HsBindgen.Runtime.BitfieldPtr
+      HsBindgen.Runtime.Block
+      HsBindgen.Runtime.CBool
+      HsBindgen.Runtime.CEnum
+      HsBindgen.Runtime.ConstantArray
+      HsBindgen.Runtime.FLAM
+      HsBindgen.Runtime.HasCBitfield
+      HsBindgen.Runtime.HasCField
+      HsBindgen.Runtime.IncompleteArray
+      HsBindgen.Runtime.IsArray
+      HsBindgen.Runtime.LibC
+      HsBindgen.Runtime.Marshal
+      HsBindgen.Runtime.Prelude
+      HsBindgen.Runtime.PtrConst
+      HsBindgen.Runtime.Support
+      HsBindgen.Runtime.Support.Bitfield
+      HsBindgen.Runtime.Support.ByteArray
+      HsBindgen.Runtime.Support.CAPI
+      HsBindgen.Runtime.Support.CompatHasField
+      HsBindgen.Runtime.Support.FFIType
+      HsBindgen.Runtime.Support.FunPtr
+      HsBindgen.Runtime.Support.FunPtr.Class
+      HsBindgen.Runtime.Support.HasFFIType
+      HsBindgen.Runtime.Support.LibC.Auxiliary
+      HsBindgen.Runtime.Support.Ptr
+      HsBindgen.Runtime.Support.SizedByteArray
+      HsBindgen.Runtime.Support.TH.Instances
+      HsBindgen.Runtime.Support.TH.Types
+      HsBindgen.Runtime.Union
+  other-modules:
+      Paths_sdl3_bindgen_sys
+  autogen-modules:
+      Paths_sdl3_bindgen_sys
+  hs-source-dirs:
+      runtime
+  default-extensions:
+      DataKinds
+      DefaultSignatures
+      DeriveAnyClass
+      DerivingStrategies
+      DerivingVia
+      FunctionalDependencies
+      LambdaCase
+      PatternSynonyms
+      RecordWildCards
+      RoleAnnotations
+      ScopedTypeVariables
+      TypeFamilies
+      UndecidableInstances
+      ViewPatterns
+  build-tool-depends:
+      hsc2hs:hsc2hs
+  build-depends:
+      base >=4.17 && <4.23
+    , bytestring >=0.11 && <0.13
+    , containers >=0.6 && <0.9
+    , primitive ==0.9.*
+    , record-hasfield >=1.0 && <2
+    , template-haskell >=2.18 && <2.25
+    , vector ==0.13.*
+  default-language: GHC2021
+  if flag(optimize)
+    ghc-options: -O2
+  if flag(optimize-aggressively)
+    ghc-options: -O2 -fexpose-all-unfoldings -flate-specialise -flate-dmd-anal -fstg-lift-lams
+
+library cexpr-runtime
+  exposed-modules:
+      C.Expr.HostPlatform
+      C.Expr.Posix32
+      C.Expr.Posix64
+      C.Expr.Win64
+      C.Operator.Classes
+      C.Operator.GenInstances
+      C.Operator.Internal
+      C.Operator.TH
+      C.Operators
+      C.Type
+      C.Type.Internal.Universe
+  other-modules:
+      Paths_sdl3_bindgen_sys
+  autogen-modules:
+      Paths_sdl3_bindgen_sys
+  hs-source-dirs:
+      runtime-cexpr
+  default-extensions:
+      DataKinds
+      DeriveGeneric
+      DeriveTraversable
+      DerivingStrategies
+      FlexibleInstances
+      GADTs
+      ImportQualifiedPost
+      LambdaCase
+      MagicHash
+      MultiParamTypeClasses
+      ParallelListComp
+      StandaloneKindSignatures
+      TupleSections
+      TypeApplications
+      TypeFamilies
+      TypeOperators
+  build-depends:
+      base >=4.17 && <4.23
+    , containers >=0.5 && <0.9
+    , fin >=0.3.2 && <0.4
+    , some >=1.0.6 && <1.1
+    , template-haskell >=2.18 && <2.25
+    , vec ==0.5.*
+  default-language: Haskell2010
+  if flag(optimize)
+    ghc-options: -O2
+  if flag(optimize-aggressively)
+    ghc-options: -O2 -fexpose-all-unfoldings -flate-specialise -flate-dmd-anal -fstg-lift-lams
diff --git a/src/SDL3/Sys.hs b/src/SDL3/Sys.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys.hs
@@ -0,0 +1,233 @@
+{-# LANGUAGE DuplicateRecordFields #-}
+
+-- |
+-- Curated low-level SDL3 surface: Re-exports every per-header module.
+--
+-- This is a low-level module intended to provide the building blocks for
+-- higher-level libraries.
+--
+-- Contributing is encouraged. Please submit either an issue or PR to the
+-- upstream repository if you run into problems with these generated bindings.
+--
+-- These bindings are still experimental and in flux, and will not stabilize
+-- at least until hs-bindgen is itself released stably.
+--
+-- Pin to a minor version (e.g. @>=0.0.0.1 && <0.0.1@) until this library hits @0.1.0.0@.
+--
+-- __Conventions__
+--
+-- * Every function's foreign-import flavor is classified deterministically
+--   by the checked-in registry. Most functions export both @safe@ and @unsafe@
+--   FFI bindings.
+--
+-- * Function aliases follow the camel-segments rule: strip @SDL_@ and
+--   join the underscore segments (@SDL_CreateWindow@ -> @createWindow@,
+--   @SDL_GL_SwapWindow@ -> @glSwapWindow@, @SDL_GUIDToString@ ->
+--   @guidToString@).
+--
+-- * An /unsuffixed/ alias is always the __unsafe__ foreign import; a
+--   @Safe@-suffixed alias is always the __safe__ one.
+--
+-- * Functions that unavoidably invoke a callback during the call export
+--   only the @Safe@ alias — re-entering Haskell from an unsafe call is undefined
+--   behavior, so the footgun is simply not handed out. NB: A non-Haskell
+--   callback function (e.g., written in C or Rust) cannot re-enter the runtime;
+--   for that case the unsafe imports stay available under the
+--   @SDL3.Sys.Bindgen.*.Unsafe@ modules.
+--
+-- * Functions curated @unsafe-only@ — quick, nonblocking, callback-free —
+--   export only the unsuffixed alias: paying the safe-call overhead for
+--   them buys nothing. Each alias's documentation records its rationale.
+--
+-- * Types, enum patterns, macro constants, and property keys re-export
+--   verbatim from the @SDL3.Sys.Bindgen.*@ base modules.
+--
+-- * This layer additionally provides typed pattern synonyms for
+--   the macro constant groups in SDL headers.
+--
+-- * Some aliases (@free@, @abs@, @init@, …) collide with the "Prelude";
+--   import this module qualified or curate your import list.
+--
+-- == Families
+--
+-- * "SDL3.Sys.Assert" — A helpful assertion macro!
+-- * "SDL3.Sys.Asyncio" — SDL offers a way to perform I/O asynchronously.
+-- * "SDL3.Sys.Atomic" — Atomic operations.
+-- * "SDL3.Sys.Audio" — Audio functionality for the SDL library.
+-- * "SDL3.Sys.Bits" — Functions for fiddling with bits and bitmasks.
+-- * "SDL3.Sys.Blendmode" — Blend modes decide how two colors will mix together.
+-- * "SDL3.Sys.Camera" — Video capture for the SDL library.
+-- * "SDL3.Sys.Clipboard" — SDL provides access to the system clipboard, both for reading information from other processes and publishing information of its own.
+-- * "SDL3.Sys.Cpuinfo" — CPU feature detection for SDL.
+-- * "SDL3.Sys.Dialog" — File dialog support.
+-- * "SDL3.Sys.Dlopennote" — This header allows you to annotate your code so external tools know about dynamic shared library dependencies.
+-- * "SDL3.Sys.Endian" — Functions for reading and writing endian-specific values.
+-- * "SDL3.Sys.Error" — Simple error message routines for SDL.
+-- * "SDL3.Sys.Events" — Event queue management.
+-- * "SDL3.Sys.Filesystem" — SDL offers an API for examining and manipulating the system's filesystem.
+-- * "SDL3.Sys.Gamepad" — SDL provides a low-level joystick API, which just treats joysticks as an arbitrary pile of buttons, axes, and hat switches.
+-- * "SDL3.Sys.Gpu" — The GPU API offers a cross-platform way for apps to talk to modern graphics hardware.
+-- * "SDL3.Sys.Guid" — A GUID is a 128-bit value that represents something that is uniquely identifiable by this value: "globally unique."
+-- * "SDL3.Sys.Haptic" — The SDL haptic subsystem manages haptic (force feedback) devices.
+-- * "SDL3.Sys.Hidapi" — Header file for SDL HIDAPI functions.
+-- * "SDL3.Sys.Hints" — This file contains functions to set and get configuration hints, as well as listing each of them alphabetically.
+-- * "SDL3.Sys.Init" — All SDL programs need to initialize the library before starting to work with it.
+-- * "SDL3.Sys.Iostream" — SDL provides an abstract interface for reading and writing data streams.
+-- * "SDL3.Sys.Joystick" — SDL joystick support.
+-- * "SDL3.Sys.Keyboard" — SDL keyboard management.
+-- * "SDL3.Sys.Keycode" — Defines constants which identify keyboard keys and modifiers.
+-- * "SDL3.Sys.Loadso" — System-dependent library loading routines.
+-- * "SDL3.Sys.Locale" — SDL locale services.
+-- * "SDL3.Sys.Log" — Simple log messages with priorities and categories.
+-- * "SDL3.Sys.Main" — App entry-point handling; SDL_main is not bound here.
+-- * "SDL3.Sys.Messagebox" — SDL offers a simple message box API, which is useful for simple alerts, such as informing the user when something fatal happens at startup without the need to build a UI for it (or informing the user before your UI is ready).
+-- * "SDL3.Sys.Metal" — Functions to creating Metal layers and views on SDL windows.
+-- * "SDL3.Sys.Misc" — SDL API functions that don't fit elsewhere.
+-- * "SDL3.Sys.Mouse" — Any GUI application has to deal with the mouse, and SDL provides functions to manage mouse input and the displayed cursor.
+-- * "SDL3.Sys.Mutex" — Thread synchronization primitives: mutexes, semaphores, condition variables, and read/write locks.
+-- * "SDL3.Sys.Pen" — SDL pen event handling.
+-- * "SDL3.Sys.Pixels" — SDL offers facilities for pixel management.
+-- * "SDL3.Sys.Platform" — SDL provides a means to identify the app's platform, both at compile time and runtime.
+-- * "SDL3.Sys.PlatformDefines" — Platform-detection defines, baked at generation time.
+-- * "SDL3.Sys.Power" — SDL power management routines.
+-- * "SDL3.Sys.Process" — Process control support.
+-- * "SDL3.Sys.Properties" — A property is a variable that can be created and retrieved by name at runtime.
+-- * "SDL3.Sys.Rect" — Some helper functions for managing rectangles and 2D points, in both integer and floating point versions.
+-- * "SDL3.Sys.Render" — Header file for SDL 2D rendering functions.
+-- * "SDL3.Sys.Runtime" — Bridge vocabulary: C99 bool and C enum conversions, curated from the runtime.
+-- * "SDL3.Sys.Scancode" — Defines keyboard scancodes.
+-- * "SDL3.Sys.Sensor" — SDL sensor management.
+-- * "SDL3.Sys.Stdinc" — SDL's C-library replacements: memory, strings, math, and conversions.
+-- * "SDL3.Sys.Storage" — The storage API is a high-level API designed to abstract away the portability issues that come up when using something lower-level (in SDL's case, this sits on top of the [Filesystem](https://wiki.libsdl.org/SDL3/CategoryFilesystem) and [IOStream](https://wiki.libsdl.org/SDL3/CategoryIOStream) subsystems).
+-- * "SDL3.Sys.Surface" — SDL surfaces are buffers of pixels in system RAM.
+-- * "SDL3.Sys.System" — Platform-specific SDL API functions.
+-- * "SDL3.Sys.Thread" — SDL offers cross-platform thread management functions.
+-- * "SDL3.Sys.Time" — SDL realtime clock and date/time routines.
+-- * "SDL3.Sys.Timer" — SDL provides time management functionality.
+-- * "SDL3.Sys.Touch" — SDL offers touch input, on platforms that support it.
+-- * "SDL3.Sys.Tray" — SDL offers a way to add items to the "system tray" (more correctly called the "notification area" on Windows).
+-- * "SDL3.Sys.Version" — Functionality to query the current SDL version, both as headers the app was compiled against, and a library the app is linked to.
+-- * "SDL3.Sys.Video" — SDL's video subsystem is largely interested in abstracting window management from the underlying operating system.
+-- * "SDL3.Sys.Vulkan" — Functions for creating Vulkan surfaces on SDL windows.
+module SDL3.Sys (
+  module SDL3.Sys.Assert,
+  module SDL3.Sys.Asyncio,
+  module SDL3.Sys.Atomic,
+  module SDL3.Sys.Audio,
+  module SDL3.Sys.Bits,
+  module SDL3.Sys.Blendmode,
+  module SDL3.Sys.Camera,
+  module SDL3.Sys.Clipboard,
+  module SDL3.Sys.Cpuinfo,
+  module SDL3.Sys.Dialog,
+  module SDL3.Sys.Dlopennote,
+  module SDL3.Sys.Endian,
+  module SDL3.Sys.Error,
+  module SDL3.Sys.Events,
+  module SDL3.Sys.Filesystem,
+  module SDL3.Sys.Gamepad,
+  module SDL3.Sys.Gpu,
+  module SDL3.Sys.Guid,
+  module SDL3.Sys.Haptic,
+  module SDL3.Sys.Hidapi,
+  module SDL3.Sys.Hints,
+  module SDL3.Sys.Init,
+  module SDL3.Sys.Iostream,
+  module SDL3.Sys.Joystick,
+  module SDL3.Sys.Keyboard,
+  module SDL3.Sys.Keycode,
+  module SDL3.Sys.Loadso,
+  module SDL3.Sys.Locale,
+  module SDL3.Sys.Log,
+  module SDL3.Sys.Main,
+  module SDL3.Sys.Messagebox,
+  module SDL3.Sys.Metal,
+  module SDL3.Sys.Misc,
+  module SDL3.Sys.Mouse,
+  module SDL3.Sys.Mutex,
+  module SDL3.Sys.Pen,
+  module SDL3.Sys.Pixels,
+  module SDL3.Sys.Platform,
+  module SDL3.Sys.PlatformDefines,
+  module SDL3.Sys.Power,
+  module SDL3.Sys.Process,
+  module SDL3.Sys.Properties,
+  module SDL3.Sys.Rect,
+  module SDL3.Sys.Render,
+  module SDL3.Sys.Runtime,
+  module SDL3.Sys.Scancode,
+  module SDL3.Sys.Sensor,
+  module SDL3.Sys.Stdinc,
+  module SDL3.Sys.Storage,
+  module SDL3.Sys.Surface,
+  module SDL3.Sys.System,
+  module SDL3.Sys.Thread,
+  module SDL3.Sys.Time,
+  module SDL3.Sys.Timer,
+  module SDL3.Sys.Touch,
+  module SDL3.Sys.Tray,
+  module SDL3.Sys.Version,
+  module SDL3.Sys.Video,
+  module SDL3.Sys.Vulkan,
+)
+where
+
+import SDL3.Sys.Assert
+import SDL3.Sys.Asyncio
+import SDL3.Sys.Atomic
+import SDL3.Sys.Audio
+import SDL3.Sys.Bits
+import SDL3.Sys.Blendmode
+import SDL3.Sys.Camera
+import SDL3.Sys.Clipboard
+import SDL3.Sys.Cpuinfo
+import SDL3.Sys.Dialog
+import SDL3.Sys.Dlopennote
+import SDL3.Sys.Endian
+import SDL3.Sys.Error
+import SDL3.Sys.Events
+import SDL3.Sys.Filesystem
+import SDL3.Sys.Gamepad
+import SDL3.Sys.Gpu
+import SDL3.Sys.Guid
+import SDL3.Sys.Haptic
+import SDL3.Sys.Hidapi
+import SDL3.Sys.Hints
+import SDL3.Sys.Init
+import SDL3.Sys.Iostream
+import SDL3.Sys.Joystick
+import SDL3.Sys.Keyboard
+import SDL3.Sys.Keycode
+import SDL3.Sys.Loadso
+import SDL3.Sys.Locale
+import SDL3.Sys.Log
+import SDL3.Sys.Main
+import SDL3.Sys.Messagebox
+import SDL3.Sys.Metal
+import SDL3.Sys.Misc
+import SDL3.Sys.Mouse
+import SDL3.Sys.Mutex
+import SDL3.Sys.Pen
+import SDL3.Sys.Pixels
+import SDL3.Sys.Platform
+import SDL3.Sys.PlatformDefines
+import SDL3.Sys.Power
+import SDL3.Sys.Process
+import SDL3.Sys.Properties
+import SDL3.Sys.Rect
+import SDL3.Sys.Render
+import SDL3.Sys.Runtime
+import SDL3.Sys.Scancode
+import SDL3.Sys.Sensor
+import SDL3.Sys.Stdinc
+import SDL3.Sys.Storage
+import SDL3.Sys.Surface
+import SDL3.Sys.System
+import SDL3.Sys.Thread
+import SDL3.Sys.Time
+import SDL3.Sys.Timer
+import SDL3.Sys.Touch
+import SDL3.Sys.Tray
+import SDL3.Sys.Version
+import SDL3.Sys.Video
+import SDL3.Sys.Vulkan
diff --git a/src/SDL3/Sys/Assert.hs b/src/SDL3/Sys/Assert.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Assert.hs
@@ -0,0 +1,436 @@
+-- | A helpful assertion macro!
+--
+--     SDL assertions operate like your usual @assert@ macro, but with some added features:
+--
+--     * It uses a trick with the @sizeof@ operator, so disabled assertions vaporize out of the compiled code, but variables only referenced in the assertion won\'t trigger compiler warnings about being unused.
+--
+--     * It is safe to use with a dangling-else: @if (x) SDL_assert(y); else do_something();@
+--
+--     * It works the same everywhere, instead of counting on various platforms\' compiler and C runtime to behave.
+--
+--     * It provides multiple levels of assertion (SDL_assert, SDL_assert_release, SDL_assert_paranoid) instead of a single all-or-nothing option.
+--
+--     * It offers a variety of responses when an assertion fails (retry, trigger the debugger, abort the program, ignore the failure once, ignore it for the rest of the program\'s run).
+--
+--     * It tries to show the user a dialog by default, if possible, but the app can provide a callback to handle assertion failures however they like.
+--
+--     * It lets failed assertions be retried. Perhaps you had a network failure and just want to retry the test after plugging your network cable back in? You can.
+--
+--     * It lets the user ignore an assertion failure, if there\'s a harmless problem that one can continue past.
+--
+--     * It lets the user mark an assertion as ignored for the rest of the program\'s run; if there\'s a harmless problem that keeps popping up.
+--
+--     * It provides statistics and data on all failed assertions to the app.
+--
+--     * It allows the default assertion handler to be controlled with environment variables, in case an automated script needs to control it.
+--
+--     * It can be used as an aid to Clang\'s static analysis; it will treat SDL assertions as universally true (under the assumption that you are serious about the asserted claims and that your debug builds will detect when these claims were wrong). This can help the analyzer avoid false positives.
+--
+--     To use it: compile a debug build and just sprinkle around tests to check your code!
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Assert.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Assert (
+  module SDL3.Sys.Bindgen.Assert,
+
+  -- * Function aliases
+  SDL3.Sys.Assert.reportAssertion,
+  SDL3.Sys.Assert.reportAssertionSafe,
+  SDL3.Sys.Assert.setAssertionHandler,
+  SDL3.Sys.Assert.setAssertionHandlerSafe,
+  SDL3.Sys.Assert.getDefaultAssertionHandler,
+  SDL3.Sys.Assert.getDefaultAssertionHandlerSafe,
+  SDL3.Sys.Assert.getAssertionHandler,
+  SDL3.Sys.Assert.getAssertionHandlerSafe,
+  SDL3.Sys.Assert.getAssertionReport,
+  SDL3.Sys.Assert.getAssertionReportSafe,
+  SDL3.Sys.Assert.resetAssertionReport,
+  SDL3.Sys.Assert.resetAssertionReportSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Assert
+import SDL3.Sys.Bindgen.Assert.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Assert.Unsafe qualified as Unsafe
+
+-- | Never call this directly.
+--
+--     Use the SDL_assert macros instead.
+--
+--     [Returns]: assert state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReportAssertion@.
+--                   The safe flavor is 'reportAssertionSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReportAssertion@, defined at @SDL3\/SDL_assert.h 350:45@
+reportAssertion
+  :: BG.Ptr SDL_AssertData
+  -- ^
+  --
+  --           [@data@]: assert data structure.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@func@]: function name.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: file name.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@line@]: line number.
+  -> IO SDL_AssertState
+reportAssertion =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_ReportAssertion x00 x11 x22 (Coerce.coerce x33)
+
+-- | Never call this directly.
+--
+--     Use the SDL_assert macros instead.
+--
+--     [Returns]: assert state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReportAssertion@.
+--                   The unsafe flavor is 'reportAssertion'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReportAssertion@, defined at @SDL3\/SDL_assert.h 350:45@
+reportAssertionSafe
+  :: BG.Ptr SDL_AssertData
+  -- ^
+  --
+  --           [@data@]: assert data structure.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@func@]: function name.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: file name.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@line@]: line number.
+  -> IO SDL_AssertState
+reportAssertionSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_ReportAssertion x00 x11 x22 (Coerce.coerce x33)
+
+-- | Set an application-defined assertion handler.
+--
+--     This function allows an application to show its own assertion UI and\/or force the response to an assertion failure. If the application doesn\'t provide this, SDL will try to do the right thing, popping up a system-specific GUI dialog, and probably minimizing any fullscreen windows.
+--
+--     This callback may fire from any thread, but it runs wrapped in a mutex, so it will only fire from one thread at a time.
+--
+--     This callback is NOT reset to SDL\'s internal handler upon 'SDL3.Sys.Init.quit'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAssertionHandler'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAssertionHandler@.
+--                   The safe flavor is 'setAssertionHandlerSafe'
+--                   : registration; the handler fires from failed SDL assertions.
+--
+--     [C declaration]: @SDL_SetAssertionHandler@, defined at @SDL3\/SDL_assert.h 591:34@
+setAssertionHandler
+  :: SDL_AssertionHandler
+  -- ^
+  --
+  --           [@handler@]: the 'SDL_AssertionHandler' function to call when an assertion fails or NULL for the default handler.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @handler@.
+  -> IO ()
+setAssertionHandler = Unsafe.sDL_SetAssertionHandler
+
+-- | Set an application-defined assertion handler.
+--
+--     This function allows an application to show its own assertion UI and\/or force the response to an assertion failure. If the application doesn\'t provide this, SDL will try to do the right thing, popping up a system-specific GUI dialog, and probably minimizing any fullscreen windows.
+--
+--     This callback may fire from any thread, but it runs wrapped in a mutex, so it will only fire from one thread at a time.
+--
+--     This callback is NOT reset to SDL\'s internal handler upon 'SDL3.Sys.Init.quit'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAssertionHandler'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAssertionHandler@.
+--                   The unsafe flavor is 'setAssertionHandler'
+--                   : registration; the handler fires from failed SDL assertions.
+--
+--     [C declaration]: @SDL_SetAssertionHandler@, defined at @SDL3\/SDL_assert.h 591:34@
+setAssertionHandlerSafe
+  :: SDL_AssertionHandler
+  -- ^
+  --
+  --           [@handler@]: the 'SDL_AssertionHandler' function to call when an assertion fails or NULL for the default handler.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @handler@.
+  -> IO ()
+setAssertionHandlerSafe =
+  Safe.sDL_SetAssertionHandler
+
+-- | Get the default assertion handler.
+--
+--     This returns the function pointer that is called by default when an assertion is triggered. This is an internal function provided by SDL, that is used for assertions when @'setAssertionHandler'@ hasn\'t been used to provide a different function.
+--
+--     [Returns]: the default 'SDL_AssertionHandler' that is called when an assert triggers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAssertionHandler'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDefaultAssertionHandler@.
+--                   The safe flavor is 'getDefaultAssertionHandlerSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetDefaultAssertionHandler@, defined at @SDL3\/SDL_assert.h 612:50@
+getDefaultAssertionHandler :: IO SDL_AssertionHandler
+getDefaultAssertionHandler =
+  Unsafe.sDL_GetDefaultAssertionHandler
+
+-- | Get the default assertion handler.
+--
+--     This returns the function pointer that is called by default when an assertion is triggered. This is an internal function provided by SDL, that is used for assertions when @'setAssertionHandler'@ hasn\'t been used to provide a different function.
+--
+--     [Returns]: the default 'SDL_AssertionHandler' that is called when an assert triggers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAssertionHandler'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDefaultAssertionHandler@.
+--                   The unsafe flavor is 'getDefaultAssertionHandler'
+--                   .
+--
+--     [C declaration]: @SDL_GetDefaultAssertionHandler@, defined at @SDL3\/SDL_assert.h 612:50@
+getDefaultAssertionHandlerSafe :: IO SDL_AssertionHandler
+getDefaultAssertionHandlerSafe =
+  Safe.sDL_GetDefaultAssertionHandler
+
+-- | Get the current assertion handler.
+--
+--     This returns the function pointer that is called when an assertion is triggered. This is either the value last passed to @'setAssertionHandler'@, or if no application-specified function is set, is equivalent to calling @'getDefaultAssertionHandler'@.
+--
+--     The parameter @puserdata@ is a pointer to a void*, which will store the \"userdata\" pointer that was passed to @'setAssertionHandler'@. This value will always be NULL for the default handler. If you don\'t care about this data, it is safe to pass a NULL pointer to this function to ignore it.
+--
+--     [Returns]: the 'SDL_AssertionHandler' that is called when an assert triggers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAssertionHandler'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAssertionHandler@.
+--                   The safe flavor is 'getAssertionHandlerSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAssertionHandler@, defined at @SDL3\/SDL_assert.h 637:50@
+getAssertionHandler
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@puserdata@]: pointer which is filled with the \"userdata\" pointer that was passed to @'setAssertionHandler'@.
+  -> IO SDL_AssertionHandler
+getAssertionHandler = Unsafe.sDL_GetAssertionHandler
+
+-- | Get the current assertion handler.
+--
+--     This returns the function pointer that is called when an assertion is triggered. This is either the value last passed to @'setAssertionHandler'@, or if no application-specified function is set, is equivalent to calling @'getDefaultAssertionHandler'@.
+--
+--     The parameter @puserdata@ is a pointer to a void*, which will store the \"userdata\" pointer that was passed to @'setAssertionHandler'@. This value will always be NULL for the default handler. If you don\'t care about this data, it is safe to pass a NULL pointer to this function to ignore it.
+--
+--     [Returns]: the 'SDL_AssertionHandler' that is called when an assert triggers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAssertionHandler'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAssertionHandler@.
+--                   The unsafe flavor is 'getAssertionHandler'
+--                   .
+--
+--     [C declaration]: @SDL_GetAssertionHandler@, defined at @SDL3\/SDL_assert.h 637:50@
+getAssertionHandlerSafe
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@puserdata@]: pointer which is filled with the \"userdata\" pointer that was passed to @'setAssertionHandler'@.
+  -> IO SDL_AssertionHandler
+getAssertionHandlerSafe =
+  Safe.sDL_GetAssertionHandler
+
+-- | Get a list of all assertion failures.
+--
+--     This function gets all assertions triggered since the last call to @'resetAssertionReport'@, or the start of the program.
+--
+--     The proper way to examine this data looks something like this:
+--
+--     @
+--     const SDL_AssertData *item = SDL_GetAssertionReport();
+--     while (item) {
+--        printf(\"\'%s\', %s (%s:%d), triggered %u times, always ignore: %s.\\\\n\",
+--               item->condition, item->function, item->filename,
+--               item->linenum, item->trigger_count,
+--               item->always_ignore ? \"yes\" : \"no\");
+--        item = item->next;
+--     }
+--     @
+--
+--     [Returns]: a list of all failed assertions or NULL if the list is empty. This memory should not be modified or freed by the application. This pointer remains valid until the next call to 'SDL3.Sys.Init.quit' or @'resetAssertionReport'@.
+--
+--     [Thread safety]: This function is not thread safe. Other threads calling @'resetAssertionReport'@ simultaneously, may render the returned pointer invalid.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resetAssertionReport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAssertionReport@.
+--                   The safe flavor is 'getAssertionReportSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAssertionReport@, defined at @SDL3\/SDL_assert.h 671:52@
+getAssertionReport :: IO (PtrConst.PtrConst SDL_AssertData)
+getAssertionReport = Unsafe.sDL_GetAssertionReport
+
+-- | Get a list of all assertion failures.
+--
+--     This function gets all assertions triggered since the last call to @'resetAssertionReport'@, or the start of the program.
+--
+--     The proper way to examine this data looks something like this:
+--
+--     @
+--     const SDL_AssertData *item = SDL_GetAssertionReport();
+--     while (item) {
+--        printf(\"\'%s\', %s (%s:%d), triggered %u times, always ignore: %s.\\\\n\",
+--               item->condition, item->function, item->filename,
+--               item->linenum, item->trigger_count,
+--               item->always_ignore ? \"yes\" : \"no\");
+--        item = item->next;
+--     }
+--     @
+--
+--     [Returns]: a list of all failed assertions or NULL if the list is empty. This memory should not be modified or freed by the application. This pointer remains valid until the next call to 'SDL3.Sys.Init.quit' or @'resetAssertionReport'@.
+--
+--     [Thread safety]: This function is not thread safe. Other threads calling @'resetAssertionReport'@ simultaneously, may render the returned pointer invalid.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resetAssertionReport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAssertionReport@.
+--                   The unsafe flavor is 'getAssertionReport'
+--                   .
+--
+--     [C declaration]: @SDL_GetAssertionReport@, defined at @SDL3\/SDL_assert.h 671:52@
+getAssertionReportSafe :: IO (PtrConst.PtrConst SDL_AssertData)
+getAssertionReportSafe = Safe.sDL_GetAssertionReport
+
+-- | Clear the list of all assertion failures.
+--
+--     This function will clear the list of all assertions triggered up to that point. Immediately following this call, 'getAssertionReport' will return no items. In addition, any previously-triggered assertions will be reset to a trigger_count of zero, and their always_ignore state will be false.
+--
+--     [Thread safety]: This function is not thread safe. Other threads triggering an assertion, or simultaneously calling this function may cause memory leaks or crashes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAssertionReport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ResetAssertionReport@.
+--                   The safe flavor is 'resetAssertionReportSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ResetAssertionReport@, defined at @SDL3\/SDL_assert.h 689:34@
+resetAssertionReport :: IO ()
+resetAssertionReport =
+  Unsafe.sDL_ResetAssertionReport
+
+-- | Clear the list of all assertion failures.
+--
+--     This function will clear the list of all assertions triggered up to that point. Immediately following this call, 'getAssertionReport' will return no items. In addition, any previously-triggered assertions will be reset to a trigger_count of zero, and their always_ignore state will be false.
+--
+--     [Thread safety]: This function is not thread safe. Other threads triggering an assertion, or simultaneously calling this function may cause memory leaks or crashes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAssertionReport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ResetAssertionReport@.
+--                   The unsafe flavor is 'resetAssertionReport'
+--                   .
+--
+--     [C declaration]: @SDL_ResetAssertionReport@, defined at @SDL3\/SDL_assert.h 689:34@
+resetAssertionReportSafe :: IO ()
+resetAssertionReportSafe =
+  Safe.sDL_ResetAssertionReport
diff --git a/src/SDL3/Sys/Asyncio.hs b/src/SDL3/Sys/Asyncio.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Asyncio.hs
@@ -0,0 +1,1042 @@
+-- | SDL offers a way to perform I\/O asynchronously. This allows an app to read or write files without waiting for data to actually transfer; the functions that request I\/O never block while the request is fulfilled.
+--
+--     Instead, the data moves in the background and the app can check for results at their leisure.
+--
+--     This is more complicated than just reading and writing files in a synchronous way, but it can allow for more efficiency, and never having framerate drops as the hard drive catches up, etc.
+--
+--     The general usage pattern for async I\/O is:
+--
+--     * Create one or more 'SDL_AsyncIOQueue' objects.
+--
+--     * Open files with 'asyncIOFromFile'.
+--
+--     * Start I\/O tasks to the files with 'readAsyncIO' or 'writeAsyncIO', putting those tasks into one of the queues.
+--
+--     * Later on, use 'getAsyncIOResult' on a queue to see if any task is finished without blocking. Tasks might finish in any order with success or failure.
+--
+--     * When all your tasks are done, close the file with 'closeAsyncIO'. This also generates a task, since it might flush data to disk!
+--
+--     This all works, without blocking, in a single thread, but one can also wait on a queue in a background thread, sleeping until new results have arrived:
+--
+--     * Call 'waitAsyncIOResult' from one or more threads to efficiently block until new tasks complete.
+--
+--     * When shutting down, call 'signalAsyncIOQueue' to unblock any sleeping threads despite there being no new tasks completed.
+--
+--     And, of course, to match the synchronous 'SDL3.Sys.Iostream.loadFile', we offer 'loadFileAsync' as a convenience function. This will handle allocating a buffer, slurping in the file data, and null-terminating it; you still check for results later.
+--
+--     Behind the scenes, SDL will use newer, efficient APIs on platforms that support them: Linux\'s io_uring and Windows 11\'s IoRing, for example. If those technologies aren\'t available, SDL will offload the work to a thread pool that will manage otherwise-synchronous loads without blocking the app.
+--
+--     Best Practices
+--
+--     Simple non-blocking I\/O for an app that just wants to pick up data whenever it\'s ready without losing framerate waiting on disks to spin can use whatever pattern works well for the program. In this case, simply call 'readAsyncIO', or maybe 'loadFileAsync', as needed. Once a frame, call 'getAsyncIOResult' to check for any completed tasks and deal with the data as it arrives.
+--
+--     If two separate pieces of the same program need their own I\/O, it is legal for each to create their own queue. This will prevent either piece from accidentally consuming the other\'s completed tasks. Each queue does require some amount of resources, but it is not an overwhelming cost. Do not make a queue for each task, however. It is better to put many tasks into a single queue. They will be reported in order of completion, not in the order they were submitted, so it doesn\'t generally matter what order tasks are started.
+--
+--     One async I\/O queue can be shared by multiple threads, or one thread can have more than one queue, but the most efficient way if ruthless efficiency is the goal is to have one queue per thread, with multiple threads working in parallel, and attempt to keep each queue loaded with tasks that are both started by and consumed by the same thread. On modern platforms that can use newer interfaces, this can keep data flowing as efficiently as possible all the way from storage hardware to the app, with no contention between threads for access to the same queue.
+--
+--     Written data is not guaranteed to make it to physical media by the time a closing task is completed, unless 'closeAsyncIO' is called with its @flush@ parameter set to true, which is to say that a successful result here can still result in lost data during an unfortunately-timed power outage if not flushed. However, flushing will take longer and may be unnecessary, depending on the app\'s needs. The asynchronous I\/O operation structure.
+--
+--     This operates as an opaque handle. One can then request read or write operations on it.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'asyncIOFromFile'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Asyncio.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Asyncio (
+  module SDL3.Sys.Bindgen.Asyncio,
+
+  -- * Function aliases
+  SDL3.Sys.Asyncio.asyncIOFromFile,
+  SDL3.Sys.Asyncio.asyncIOFromFileSafe,
+  SDL3.Sys.Asyncio.getAsyncIOSize,
+  SDL3.Sys.Asyncio.getAsyncIOSizeSafe,
+  SDL3.Sys.Asyncio.readAsyncIO,
+  SDL3.Sys.Asyncio.readAsyncIOSafe,
+  SDL3.Sys.Asyncio.writeAsyncIO,
+  SDL3.Sys.Asyncio.writeAsyncIOSafe,
+  SDL3.Sys.Asyncio.closeAsyncIO,
+  SDL3.Sys.Asyncio.closeAsyncIOSafe,
+  SDL3.Sys.Asyncio.createAsyncIOQueue,
+  SDL3.Sys.Asyncio.createAsyncIOQueueSafe,
+  SDL3.Sys.Asyncio.destroyAsyncIOQueue,
+  SDL3.Sys.Asyncio.destroyAsyncIOQueueSafe,
+  SDL3.Sys.Asyncio.getAsyncIOResult,
+  SDL3.Sys.Asyncio.getAsyncIOResultSafe,
+  SDL3.Sys.Asyncio.waitAsyncIOResult,
+  SDL3.Sys.Asyncio.waitAsyncIOResultSafe,
+  SDL3.Sys.Asyncio.signalAsyncIOQueue,
+  SDL3.Sys.Asyncio.signalAsyncIOQueueSafe,
+  SDL3.Sys.Asyncio.loadFileAsync,
+  SDL3.Sys.Asyncio.loadFileAsyncSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Asyncio
+import SDL3.Sys.Bindgen.Asyncio.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Asyncio.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Use this function to create a new 'SDL_AsyncIO' object for reading from and\/or writing to a named file.
+--
+--     The @mode@ string understands the following values:
+--
+--     * \"r\": Open a file for reading only. It must exist.
+--
+--     * \"w\": Open a file for writing only. It will create missing files or truncate existing ones.
+--
+--     * \"r+\": Open a file for update both reading and writing. The file must exist.
+--
+--     * \"w+\": Create an empty file for both reading and writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     There is no \"b\" mode, as there is only \"binary\" style I\/O, and no \"a\" mode for appending, since you specify the position when starting a task.
+--
+--     This function supports Unicode filenames, but they must be encoded in UTF-8 format, regardless of the underlying operating system.
+--
+--     This call is /not/ asynchronous; it will open the file before returning, under the assumption that doing so is generally a fast operation. Future reads and writes to the opened file will be async, however.
+--
+--     [Returns]: a pointer to the 'SDL_AsyncIO' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeAsyncIO', 'readAsyncIO', 'writeAsyncIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AsyncIOFromFile@.
+--                   The safe flavor is 'asyncIOFromFileSafe'
+--                   .
+--
+--     [C declaration]: @SDL_AsyncIOFromFile@, defined at @SDL3\/SDL_asyncio.h 224:43@
+asyncIOFromFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a UTF-8 string representing the filename to open.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mode@]: an ASCII string representing the mode to be used for opening the file.
+  -> IO (BG.Ptr SDL_AsyncIO)
+asyncIOFromFile = Unsafe.sDL_AsyncIOFromFile
+
+-- | Use this function to create a new 'SDL_AsyncIO' object for reading from and\/or writing to a named file.
+--
+--     The @mode@ string understands the following values:
+--
+--     * \"r\": Open a file for reading only. It must exist.
+--
+--     * \"w\": Open a file for writing only. It will create missing files or truncate existing ones.
+--
+--     * \"r+\": Open a file for update both reading and writing. The file must exist.
+--
+--     * \"w+\": Create an empty file for both reading and writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     There is no \"b\" mode, as there is only \"binary\" style I\/O, and no \"a\" mode for appending, since you specify the position when starting a task.
+--
+--     This function supports Unicode filenames, but they must be encoded in UTF-8 format, regardless of the underlying operating system.
+--
+--     This call is /not/ asynchronous; it will open the file before returning, under the assumption that doing so is generally a fast operation. Future reads and writes to the opened file will be async, however.
+--
+--     [Returns]: a pointer to the 'SDL_AsyncIO' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeAsyncIO', 'readAsyncIO', 'writeAsyncIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AsyncIOFromFile@.
+--                   The unsafe flavor is 'asyncIOFromFile'
+--                   .
+--
+--     [C declaration]: @SDL_AsyncIOFromFile@, defined at @SDL3\/SDL_asyncio.h 224:43@
+asyncIOFromFileSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a UTF-8 string representing the filename to open.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mode@]: an ASCII string representing the mode to be used for opening the file.
+  -> IO (BG.Ptr SDL_AsyncIO)
+asyncIOFromFileSafe = Safe.sDL_AsyncIOFromFile
+
+-- | Use this function to get the size of the data stream in an 'SDL_AsyncIO'.
+--
+--     This call is /not/ asynchronous; it assumes that obtaining this info is a non-blocking operation in most reasonable cases.
+--
+--     [Returns]: the size of the data stream in the SDL_IOStream on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAsyncIOSize@.
+--                   The safe flavor is 'getAsyncIOSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAsyncIOSize@, defined at @SDL3\/SDL_asyncio.h 241:36@
+getAsyncIOSize
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: the 'SDL_AsyncIO' to get the size of the data stream from.
+  -> IO BG.Int64
+getAsyncIOSize =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetAsyncIOSize x00)
+
+-- | Use this function to get the size of the data stream in an 'SDL_AsyncIO'.
+--
+--     This call is /not/ asynchronous; it assumes that obtaining this info is a non-blocking operation in most reasonable cases.
+--
+--     [Returns]: the size of the data stream in the SDL_IOStream on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAsyncIOSize@.
+--                   The unsafe flavor is 'getAsyncIOSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAsyncIOSize@, defined at @SDL3\/SDL_asyncio.h 241:36@
+getAsyncIOSizeSafe
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: the 'SDL_AsyncIO' to get the size of the data stream from.
+  -> IO BG.Int64
+getAsyncIOSizeSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetAsyncIOSize x00)
+
+-- | Start an async read.
+--
+--     This function reads up to @size@ bytes from @offset@ position in the data source to the area pointed at by @ptr@. This function may read less bytes than requested.
+--
+--     This function returns as quickly as possible; it does not wait for the read to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     @ptr@ must remain available until the work is done, and may be accessed by the system at any time until then. Do not allocate it on the stack, as this might take longer than the life of the calling function to complete!
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'writeAsyncIO', 'createAsyncIOQueue'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadAsyncIO@.
+--                   The safe flavor is 'readAsyncIOSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadAsyncIO@, defined at @SDL3\/SDL_asyncio.h 279:34@
+readAsyncIO
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to read data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@offset@]: the position to start reading in the data source.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to read from the data source.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO Bool
+readAsyncIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Unsafe.sDL_ReadAsyncIO x00 x11 (Coerce.coerce x22) (Coerce.coerce x33) x44 x55)
+
+-- | Start an async read.
+--
+--     This function reads up to @size@ bytes from @offset@ position in the data source to the area pointed at by @ptr@. This function may read less bytes than requested.
+--
+--     This function returns as quickly as possible; it does not wait for the read to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     @ptr@ must remain available until the work is done, and may be accessed by the system at any time until then. Do not allocate it on the stack, as this might take longer than the life of the calling function to complete!
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'writeAsyncIO', 'createAsyncIOQueue'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadAsyncIO@.
+--                   The unsafe flavor is 'readAsyncIO'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadAsyncIO@, defined at @SDL3\/SDL_asyncio.h 279:34@
+readAsyncIOSafe
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to read data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@offset@]: the position to start reading in the data source.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to read from the data source.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO Bool
+readAsyncIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Safe.sDL_ReadAsyncIO x00 x11 (Coerce.coerce x22) (Coerce.coerce x33) x44 x55)
+
+-- | Start an async write.
+--
+--     This function writes @size@ bytes from @offset@ position in the data source to the area pointed at by @ptr@.
+--
+--     This function returns as quickly as possible; it does not wait for the write to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     @ptr@ must remain available until the work is done, and may be accessed by the system at any time until then. Do not allocate it on the stack, as this might take longer than the life of the calling function to complete!
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'readAsyncIO', 'createAsyncIOQueue'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteAsyncIO@.
+--                   The safe flavor is 'writeAsyncIOSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteAsyncIO@, defined at @SDL3\/SDL_asyncio.h 316:34@
+writeAsyncIO
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to write data from.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@offset@]: the position to start writing to the data source.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to write to the data source.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO Bool
+writeAsyncIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Unsafe.sDL_WriteAsyncIO x00 x11 (Coerce.coerce x22) (Coerce.coerce x33) x44 x55)
+
+-- | Start an async write.
+--
+--     This function writes @size@ bytes from @offset@ position in the data source to the area pointed at by @ptr@.
+--
+--     This function returns as quickly as possible; it does not wait for the write to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     @ptr@ must remain available until the work is done, and may be accessed by the system at any time until then. Do not allocate it on the stack, as this might take longer than the life of the calling function to complete!
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'readAsyncIO', 'createAsyncIOQueue'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteAsyncIO@.
+--                   The unsafe flavor is 'writeAsyncIO'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteAsyncIO@, defined at @SDL3\/SDL_asyncio.h 316:34@
+writeAsyncIOSafe
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to write data from.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@offset@]: the position to start writing to the data source.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to write to the data source.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO Bool
+writeAsyncIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Safe.sDL_WriteAsyncIO x00 x11 (Coerce.coerce x22) (Coerce.coerce x33) x44 x55)
+
+-- | Close and free any allocated resources for an async I\/O object.
+--
+--     Closing a file is /also/ an asynchronous task! If a write failure were to happen during the closing process, for example, the task results will report it as usual.
+--
+--     Closing a file that has been written to does not guarantee the data has made it to physical media; it may remain in the operating system\'s file cache, for later writing to disk. This means that a successfully-closed file can be lost if the system crashes or loses power in this small window. To prevent this, call this function with the @flush@ parameter set to true. This will make the operation take longer, and perhaps increase system load in general, but a successful result guarantees that the data has made it to physical storage. Don\'t use this for temporary files, caches, and unimportant data, and definitely use it for crucial irreplaceable files, like game saves.
+--
+--     This function guarantees that the close will happen after any other pending tasks to @asyncio@, so it\'s safe to open a file, start several operations, close the file immediately, then check for all results later. This function will not block until the tasks have completed.
+--
+--     Once this function returns true, @asyncio@ is no longer valid, regardless of any future outcomes. Any completed tasks might still contain this pointer in their 'SDL_AsyncIOOutcome' data, in case the app was using this value to track information, but it should not be used again.
+--
+--     If this function returns false, the close wasn\'t started at all, and it\'s safe to attempt to close again later.
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but two threads should not attempt to close the same object.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CloseAsyncIO@.
+--                   The safe flavor is 'closeAsyncIOSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CloseAsyncIO@, defined at @SDL3\/SDL_asyncio.h 365:34@
+closeAsyncIO
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure to close.
+  -> Bool
+  -- ^
+  --
+  --           [@flush@]: true if data should sync to disk before the task completes.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO Bool
+closeAsyncIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_CloseAsyncIO x00 (CBool.fromBool x11) x22 x33)
+
+-- | Close and free any allocated resources for an async I\/O object.
+--
+--     Closing a file is /also/ an asynchronous task! If a write failure were to happen during the closing process, for example, the task results will report it as usual.
+--
+--     Closing a file that has been written to does not guarantee the data has made it to physical media; it may remain in the operating system\'s file cache, for later writing to disk. This means that a successfully-closed file can be lost if the system crashes or loses power in this small window. To prevent this, call this function with the @flush@ parameter set to true. This will make the operation take longer, and perhaps increase system load in general, but a successful result guarantees that the data has made it to physical storage. Don\'t use this for temporary files, caches, and unimportant data, and definitely use it for crucial irreplaceable files, like game saves.
+--
+--     This function guarantees that the close will happen after any other pending tasks to @asyncio@, so it\'s safe to open a file, start several operations, close the file immediately, then check for all results later. This function will not block until the tasks have completed.
+--
+--     Once this function returns true, @asyncio@ is no longer valid, regardless of any future outcomes. Any completed tasks might still contain this pointer in their 'SDL_AsyncIOOutcome' data, in case the app was using this value to track information, but it should not be used again.
+--
+--     If this function returns false, the close wasn\'t started at all, and it\'s safe to attempt to close again later.
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but two threads should not attempt to close the same object.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CloseAsyncIO@.
+--                   The unsafe flavor is 'closeAsyncIO'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CloseAsyncIO@, defined at @SDL3\/SDL_asyncio.h 365:34@
+closeAsyncIOSafe
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure to close.
+  -> Bool
+  -- ^
+  --
+  --           [@flush@]: true if data should sync to disk before the task completes.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO Bool
+closeAsyncIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_CloseAsyncIO x00 (CBool.fromBool x11) x22 x33)
+
+-- | Create a task queue for tracking multiple I\/O operations.
+--
+--     Async I\/O operations are assigned to a queue when started. The queue can be checked for completed tasks thereafter.
+--
+--     [Returns]: a new task queue object or NULL if there was an error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyAsyncIOQueue', 'getAsyncIOResult', 'waitAsyncIOResult'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateAsyncIOQueue@.
+--                   The safe flavor is 'createAsyncIOQueueSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 384:48@
+createAsyncIOQueue :: IO (BG.Ptr SDL_AsyncIOQueue)
+createAsyncIOQueue = Unsafe.sDL_CreateAsyncIOQueue
+
+-- | Create a task queue for tracking multiple I\/O operations.
+--
+--     Async I\/O operations are assigned to a queue when started. The queue can be checked for completed tasks thereafter.
+--
+--     [Returns]: a new task queue object or NULL if there was an error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyAsyncIOQueue', 'getAsyncIOResult', 'waitAsyncIOResult'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateAsyncIOQueue@.
+--                   The unsafe flavor is 'createAsyncIOQueue'
+--                   .
+--
+--     [C declaration]: @SDL_CreateAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 384:48@
+createAsyncIOQueueSafe :: IO (BG.Ptr SDL_AsyncIOQueue)
+createAsyncIOQueueSafe = Safe.sDL_CreateAsyncIOQueue
+
+-- | Destroy a previously-created async I\/O task queue.
+--
+--     If there are still tasks pending for this queue, this call will block until those tasks are finished. All those tasks will be deallocated. Their results will be lost to the app.
+--
+--     Any pending reads from @'loadFileAsync'@ that are still in this queue will have their buffers deallocated by this function, to prevent a memory leak.
+--
+--     Once this function is called, the queue is no longer valid and should not be used, including by other threads that might access it while destruction is blocking on pending tasks.
+--
+--     Do not destroy a queue that still has threads waiting on it through @'waitAsyncIOResult'@. You can call @'signalAsyncIOQueue'@ first to unblock those threads, and take measures (such as SDL_WaitThread()) to make sure they have finished their wait and won\'t wait on the queue again.
+--
+--     [Thread safety]: It is safe to call this function from any thread, so long as no other thread is waiting on the queue with 'waitAsyncIOResult'.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyAsyncIOQueue@.
+--                   The safe flavor is 'destroyAsyncIOQueueSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 414:34@
+destroyAsyncIOQueue
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the task queue to destroy.
+  -> IO ()
+destroyAsyncIOQueue = Unsafe.sDL_DestroyAsyncIOQueue
+
+-- | Destroy a previously-created async I\/O task queue.
+--
+--     If there are still tasks pending for this queue, this call will block until those tasks are finished. All those tasks will be deallocated. Their results will be lost to the app.
+--
+--     Any pending reads from @'loadFileAsync'@ that are still in this queue will have their buffers deallocated by this function, to prevent a memory leak.
+--
+--     Once this function is called, the queue is no longer valid and should not be used, including by other threads that might access it while destruction is blocking on pending tasks.
+--
+--     Do not destroy a queue that still has threads waiting on it through @'waitAsyncIOResult'@. You can call @'signalAsyncIOQueue'@ first to unblock those threads, and take measures (such as SDL_WaitThread()) to make sure they have finished their wait and won\'t wait on the queue again.
+--
+--     [Thread safety]: It is safe to call this function from any thread, so long as no other thread is waiting on the queue with 'waitAsyncIOResult'.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyAsyncIOQueue@.
+--                   The unsafe flavor is 'destroyAsyncIOQueue'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 414:34@
+destroyAsyncIOQueueSafe
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the task queue to destroy.
+  -> IO ()
+destroyAsyncIOQueueSafe =
+  Safe.sDL_DestroyAsyncIOQueue
+
+-- | Query an async I\/O task queue for completed tasks.
+--
+--     If a task assigned to this queue has finished, this will return true and fill in @outcome@ with the details of the task. If no task in the queue has finished, this function will return false. This function does not block.
+--
+--     If a task has completed, this function will free its resources and the task pointer will no longer be valid. The task will be removed from the queue.
+--
+--     It is safe for multiple threads to call this function on the same queue at once; a completed task will only go to one of the threads.
+--
+--     [Returns]: true if a task has completed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'waitAsyncIOResult'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAsyncIOResult@.
+--                   The safe flavor is 'getAsyncIOResultSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 440:34@
+getAsyncIOResult
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to query.
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -- ^
+  --
+  --           [@outcome@]: details of a finished task will be written here. May not be NULL.
+  -> IO Bool
+getAsyncIOResult =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetAsyncIOResult x00 x11)
+
+-- | Query an async I\/O task queue for completed tasks.
+--
+--     If a task assigned to this queue has finished, this will return true and fill in @outcome@ with the details of the task. If no task in the queue has finished, this function will return false. This function does not block.
+--
+--     If a task has completed, this function will free its resources and the task pointer will no longer be valid. The task will be removed from the queue.
+--
+--     It is safe for multiple threads to call this function on the same queue at once; a completed task will only go to one of the threads.
+--
+--     [Returns]: true if a task has completed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'waitAsyncIOResult'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAsyncIOResult@.
+--                   The unsafe flavor is 'getAsyncIOResult'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 440:34@
+getAsyncIOResultSafe
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to query.
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -- ^
+  --
+  --           [@outcome@]: details of a finished task will be written here. May not be NULL.
+  -> IO Bool
+getAsyncIOResultSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetAsyncIOResult x00 x11)
+
+-- | Block until an async I\/O task queue has a completed task.
+--
+--     This function puts the calling thread to sleep until there a task assigned to the queue that has finished.
+--
+--     If a task assigned to the queue has finished, this will return true and fill in @outcome@ with the details of the task. If no task in the queue has finished, this function will return false.
+--
+--     If a task has completed, this function will free its resources and the task pointer will no longer be valid. The task will be removed from the queue.
+--
+--     It is safe for multiple threads to call this function on the same queue at once; a completed task will only go to one of the threads.
+--
+--     Note that by the nature of various platforms, more than one waiting thread may wake to handle a single task, but only one will obtain it, so @timeoutMS@ is a /maximum/ wait time, and this function may return false sooner.
+--
+--     This function may return false if there was a system error, the OS inadvertently awoke multiple threads, or if @'signalAsyncIOQueue'@ was called to wake up all waiting threads without a finished task.
+--
+--     A timeout can be used to specify a maximum wait time, but rather than polling, it is possible to have a timeout of -1 to wait forever, and use @'signalAsyncIOQueue'@ to wake up the waiting threads later.
+--
+--     [Returns]: true if task has completed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'signalAsyncIOQueue'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitAsyncIOResult@.
+--                   The safe flavor is 'waitAsyncIOResultSafe'
+--                   : blocks until a result is ready (timeoutMS = -1 waits forever); an unsafe call stalls every capability and GC.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitAsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 484:34@
+waitAsyncIOResult
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to wait on.
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -- ^
+  --
+  --           [@outcome@]: details of a finished task will be written here. May not be NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum time to wait, in milliseconds, or -1 to wait indefinitely.
+  -> IO Bool
+waitAsyncIOResult =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_WaitAsyncIOResult x00 x11 (Coerce.coerce x22))
+
+-- | Block until an async I\/O task queue has a completed task.
+--
+--     This function puts the calling thread to sleep until there a task assigned to the queue that has finished.
+--
+--     If a task assigned to the queue has finished, this will return true and fill in @outcome@ with the details of the task. If no task in the queue has finished, this function will return false.
+--
+--     If a task has completed, this function will free its resources and the task pointer will no longer be valid. The task will be removed from the queue.
+--
+--     It is safe for multiple threads to call this function on the same queue at once; a completed task will only go to one of the threads.
+--
+--     Note that by the nature of various platforms, more than one waiting thread may wake to handle a single task, but only one will obtain it, so @timeoutMS@ is a /maximum/ wait time, and this function may return false sooner.
+--
+--     This function may return false if there was a system error, the OS inadvertently awoke multiple threads, or if @'signalAsyncIOQueue'@ was called to wake up all waiting threads without a finished task.
+--
+--     A timeout can be used to specify a maximum wait time, but rather than polling, it is possible to have a timeout of -1 to wait forever, and use @'signalAsyncIOQueue'@ to wake up the waiting threads later.
+--
+--     [Returns]: true if task has completed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'signalAsyncIOQueue'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitAsyncIOResult@.
+--                   The unsafe flavor is 'waitAsyncIOResult'
+--                   : blocks until a result is ready (timeoutMS = -1 waits forever); an unsafe call stalls every capability and GC.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitAsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 484:34@
+waitAsyncIOResultSafe
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to wait on.
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -- ^
+  --
+  --           [@outcome@]: details of a finished task will be written here. May not be NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum time to wait, in milliseconds, or -1 to wait indefinitely.
+  -> IO Bool
+waitAsyncIOResultSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_WaitAsyncIOResult x00 x11 (Coerce.coerce x22))
+
+-- | Wake up any threads that are blocking in @'waitAsyncIOResult'@.
+--
+--     This will unblock any threads that are sleeping in a call to 'waitAsyncIOResult' for the specified queue, and cause them to return from that function.
+--
+--     This can be useful when destroying a queue to make sure nothing is touching it indefinitely. In this case, once this call completes, the caller should take measures to make sure any previously-blocked threads have returned from their wait and will not touch the queue again (perhaps by setting a flag to tell the threads to terminate and then using 'SDL3.Sys.Thread.waitThread' to make sure they\'ve done so).
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'waitAsyncIOResult'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SignalAsyncIOQueue@.
+--                   The safe flavor is 'signalAsyncIOQueueSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SignalAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 508:34@
+signalAsyncIOQueue
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to signal.
+  -> IO ()
+signalAsyncIOQueue = Unsafe.sDL_SignalAsyncIOQueue
+
+-- | Wake up any threads that are blocking in @'waitAsyncIOResult'@.
+--
+--     This will unblock any threads that are sleeping in a call to 'waitAsyncIOResult' for the specified queue, and cause them to return from that function.
+--
+--     This can be useful when destroying a queue to make sure nothing is touching it indefinitely. In this case, once this call completes, the caller should take measures to make sure any previously-blocked threads have returned from their wait and will not touch the queue again (perhaps by setting a flag to tell the threads to terminate and then using 'SDL3.Sys.Thread.waitThread' to make sure they\'ve done so).
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'waitAsyncIOResult'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SignalAsyncIOQueue@.
+--                   The unsafe flavor is 'signalAsyncIOQueue'
+--                   .
+--
+--     [C declaration]: @SDL_SignalAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 508:34@
+signalAsyncIOQueueSafe
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to signal.
+  -> IO ()
+signalAsyncIOQueueSafe = Safe.sDL_SignalAsyncIOQueue
+
+-- | Load all the data from a file path, asynchronously.
+--
+--     This function returns as quickly as possible; it does not wait for the read to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in 'SDL_AsyncIOOutcome' \'s bytes_transferred value.
+--
+--     This function will allocate the buffer to contain the file. It must be deallocated by calling 'SDL3.Sys.Stdinc.free' on 'SDL_AsyncIOOutcome' \'s buffer field after completion.
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Iostream.loadFileIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadFileAsync@.
+--                   The safe flavor is 'loadFileAsyncSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadFileAsync@, defined at @SDL3\/SDL_asyncio.h 542:34@
+loadFileAsync
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to read all available data from.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO Bool
+loadFileAsync =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_LoadFileAsync x00 x11 x22)
+
+-- | Load all the data from a file path, asynchronously.
+--
+--     This function returns as quickly as possible; it does not wait for the read to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in 'SDL_AsyncIOOutcome' \'s bytes_transferred value.
+--
+--     This function will allocate the buffer to contain the file. It must be deallocated by calling 'SDL3.Sys.Stdinc.free' on 'SDL_AsyncIOOutcome' \'s buffer field after completion.
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Iostream.loadFileIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadFileAsync@.
+--                   The unsafe flavor is 'loadFileAsync'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadFileAsync@, defined at @SDL3\/SDL_asyncio.h 542:34@
+loadFileAsyncSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to read all available data from.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO Bool
+loadFileAsyncSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_LoadFileAsync x00 x11 x22)
diff --git a/src/SDL3/Sys/Atomic.hs b/src/SDL3/Sys/Atomic.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Atomic.hs
@@ -0,0 +1,1135 @@
+-- | Atomic operations.
+--
+--     IMPORTANT: If you are not an expert in concurrent lockless programming, you should not be using any functions in this file. You should be protecting your data structures with full mutexes instead.
+--
+--     /__Seriously, here be dragons!__/
+--
+--     You can find out a little more about lockless programming and the subtle issues that can arise here: [https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/dxtecharts\/lockless-programming](https://learn.microsoft.com/en-us/windows/win32/dxtecharts/lockless-programming)
+--
+--     There\'s also lots of good information here:
+--
+--     * [https:\/\/www.1024cores.net\/home\/lock-free-algorithms](https://www.1024cores.net/home/lock-free-algorithms)
+--
+--     * [https:\/\/preshing.com\/](https://preshing.com/)
+--
+--     These operations may or may not actually be implemented using processor specific atomic operations. When possible they are implemented as true processor specific atomic operations. When that is not possible the are implemented using locks that /do/ use the available atomic operations.
+--
+--     All of the atomic operations that modify memory are full memory barriers. An atomic spinlock.
+--
+--     The atomic locks are efficient spinlocks using CPU instructions, but are vulnerable to starvation and can spin forever if a thread holding a lock has been terminated. For this reason you should minimize the code executed inside an atomic lock and never do expensive things like API or system calls while holding them.
+--
+--     They are also vulnerable to starvation if the thread holding the lock is lower priority than other threads and doesn\'t get scheduled. In general you should use mutexes instead, since they have better performance and contention behavior.
+--
+--     The atomic locks are not safe to lock recursively.
+--
+--     Porting Note: The spin lock functions and type are required and can not be emulated because they are used in the atomic emulation code.
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Atomic.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Atomic (
+  module SDL3.Sys.Bindgen.Atomic,
+
+  -- * Function aliases
+  SDL3.Sys.Atomic.tryLockSpinlock,
+  SDL3.Sys.Atomic.tryLockSpinlockSafe,
+  SDL3.Sys.Atomic.lockSpinlock,
+  SDL3.Sys.Atomic.lockSpinlockSafe,
+  SDL3.Sys.Atomic.unlockSpinlock,
+  SDL3.Sys.Atomic.unlockSpinlockSafe,
+  SDL3.Sys.Atomic.memoryBarrierReleaseFunction,
+  SDL3.Sys.Atomic.memoryBarrierReleaseFunctionSafe,
+  SDL3.Sys.Atomic.memoryBarrierAcquireFunction,
+  SDL3.Sys.Atomic.memoryBarrierAcquireFunctionSafe,
+  SDL3.Sys.Atomic.compareAndSwapAtomicInt,
+  SDL3.Sys.Atomic.compareAndSwapAtomicIntSafe,
+  SDL3.Sys.Atomic.setAtomicInt,
+  SDL3.Sys.Atomic.setAtomicIntSafe,
+  SDL3.Sys.Atomic.getAtomicInt,
+  SDL3.Sys.Atomic.getAtomicIntSafe,
+  SDL3.Sys.Atomic.addAtomicInt,
+  SDL3.Sys.Atomic.addAtomicIntSafe,
+  SDL3.Sys.Atomic.compareAndSwapAtomicU32,
+  SDL3.Sys.Atomic.compareAndSwapAtomicU32Safe,
+  SDL3.Sys.Atomic.setAtomicU32,
+  SDL3.Sys.Atomic.setAtomicU32Safe,
+  SDL3.Sys.Atomic.getAtomicU32,
+  SDL3.Sys.Atomic.getAtomicU32Safe,
+  SDL3.Sys.Atomic.addAtomicU32,
+  SDL3.Sys.Atomic.addAtomicU32Safe,
+  SDL3.Sys.Atomic.compareAndSwapAtomicPointer,
+  SDL3.Sys.Atomic.compareAndSwapAtomicPointerSafe,
+  SDL3.Sys.Atomic.setAtomicPointer,
+  SDL3.Sys.Atomic.setAtomicPointerSafe,
+  SDL3.Sys.Atomic.getAtomicPointer,
+  SDL3.Sys.Atomic.getAtomicPointerSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Atomic
+import SDL3.Sys.Bindgen.Atomic.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Atomic.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Try to lock a spin lock by setting it to a non-zero value.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Returns]: true if the lock succeeded, false if the lock is already held.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockSpinlock', 'unlockSpinlock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_TryLockSpinlock@.
+--                   The safe flavor is 'tryLockSpinlockSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TryLockSpinlock@, defined at @SDL3\/SDL_atomic.h 100:34@
+tryLockSpinlock
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO Bool
+tryLockSpinlock =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_TryLockSpinlock x00)
+
+-- | Try to lock a spin lock by setting it to a non-zero value.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Returns]: true if the lock succeeded, false if the lock is already held.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockSpinlock', 'unlockSpinlock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_TryLockSpinlock@.
+--                   The unsafe flavor is 'tryLockSpinlock'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TryLockSpinlock@, defined at @SDL3\/SDL_atomic.h 100:34@
+tryLockSpinlockSafe
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO Bool
+tryLockSpinlockSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_TryLockSpinlock x00)
+
+-- | Lock a spin lock by setting it to a non-zero value.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'tryLockSpinlock', 'unlockSpinlock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LockSpinlock@.
+--                   The safe flavor is 'lockSpinlockSafe'
+--                   .
+--
+--     [C declaration]: @SDL_LockSpinlock@, defined at @SDL3\/SDL_atomic.h 117:34@
+lockSpinlock
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO ()
+lockSpinlock = Unsafe.sDL_LockSpinlock
+
+-- | Lock a spin lock by setting it to a non-zero value.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'tryLockSpinlock', 'unlockSpinlock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LockSpinlock@.
+--                   The unsafe flavor is 'lockSpinlock'
+--                   .
+--
+--     [C declaration]: @SDL_LockSpinlock@, defined at @SDL3\/SDL_atomic.h 117:34@
+lockSpinlockSafe
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO ()
+lockSpinlockSafe = Safe.sDL_LockSpinlock
+
+-- | Unlock a spin lock by setting it to 0.
+--
+--     Always returns immediately.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockSpinlock', 'tryLockSpinlock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnlockSpinlock@.
+--                   The safe flavor is 'unlockSpinlockSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockSpinlock@, defined at @SDL3\/SDL_atomic.h 136:34@
+unlockSpinlock
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO ()
+unlockSpinlock = Unsafe.sDL_UnlockSpinlock
+
+-- | Unlock a spin lock by setting it to 0.
+--
+--     Always returns immediately.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockSpinlock', 'tryLockSpinlock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnlockSpinlock@.
+--                   The unsafe flavor is 'unlockSpinlock'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockSpinlock@, defined at @SDL3\/SDL_atomic.h 136:34@
+unlockSpinlockSafe
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO ()
+unlockSpinlockSafe = Safe.sDL_UnlockSpinlock
+
+-- | Insert a memory release barrier (function version).
+--
+--     Please refer to SDL_MemoryBarrierRelease for details. This is a function version, which might be useful if you need to use this functionality from a scripting language, etc. Also, some of the macro versions call this function behind the scenes, where more heavy lifting can happen inside of SDL. Generally, though, an app written in C\/C++\/etc should use the macro version, as it will be more efficient.
+--
+--     [Thread safety]: Obviously this function is safe to use from any thread at any time, but if you find yourself needing this, you are probably dealing with some very sensitive code; be careful!
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MemoryBarrierRelease@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MemoryBarrierReleaseFunction@.
+--                   The safe flavor is 'memoryBarrierReleaseFunctionSafe'
+--                   .
+--
+--     [C declaration]: @SDL_MemoryBarrierReleaseFunction@, defined at @SDL3\/SDL_atomic.h 192:34@
+memoryBarrierReleaseFunction :: IO ()
+memoryBarrierReleaseFunction =
+  Unsafe.sDL_MemoryBarrierReleaseFunction
+
+-- | Insert a memory release barrier (function version).
+--
+--     Please refer to SDL_MemoryBarrierRelease for details. This is a function version, which might be useful if you need to use this functionality from a scripting language, etc. Also, some of the macro versions call this function behind the scenes, where more heavy lifting can happen inside of SDL. Generally, though, an app written in C\/C++\/etc should use the macro version, as it will be more efficient.
+--
+--     [Thread safety]: Obviously this function is safe to use from any thread at any time, but if you find yourself needing this, you are probably dealing with some very sensitive code; be careful!
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MemoryBarrierRelease@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MemoryBarrierReleaseFunction@.
+--                   The unsafe flavor is 'memoryBarrierReleaseFunction'
+--                   .
+--
+--     [C declaration]: @SDL_MemoryBarrierReleaseFunction@, defined at @SDL3\/SDL_atomic.h 192:34@
+memoryBarrierReleaseFunctionSafe :: IO ()
+memoryBarrierReleaseFunctionSafe =
+  Safe.sDL_MemoryBarrierReleaseFunction
+
+-- | Insert a memory acquire barrier (function version).
+--
+--     Please refer to SDL_MemoryBarrierRelease for details. This is a function version, which might be useful if you need to use this functionality from a scripting language, etc. Also, some of the macro versions call this function behind the scenes, where more heavy lifting can happen inside of SDL. Generally, though, an app written in C\/C++\/etc should use the macro version, as it will be more efficient.
+--
+--     [Thread safety]: Obviously this function is safe to use from any thread at any time, but if you find yourself needing this, you are probably dealing with some very sensitive code; be careful!
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MemoryBarrierAcquire@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MemoryBarrierAcquireFunction@.
+--                   The safe flavor is 'memoryBarrierAcquireFunctionSafe'
+--                   .
+--
+--     [C declaration]: @SDL_MemoryBarrierAcquireFunction@, defined at @SDL3\/SDL_atomic.h 212:34@
+memoryBarrierAcquireFunction :: IO ()
+memoryBarrierAcquireFunction =
+  Unsafe.sDL_MemoryBarrierAcquireFunction
+
+-- | Insert a memory acquire barrier (function version).
+--
+--     Please refer to SDL_MemoryBarrierRelease for details. This is a function version, which might be useful if you need to use this functionality from a scripting language, etc. Also, some of the macro versions call this function behind the scenes, where more heavy lifting can happen inside of SDL. Generally, though, an app written in C\/C++\/etc should use the macro version, as it will be more efficient.
+--
+--     [Thread safety]: Obviously this function is safe to use from any thread at any time, but if you find yourself needing this, you are probably dealing with some very sensitive code; be careful!
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MemoryBarrierAcquire@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MemoryBarrierAcquireFunction@.
+--                   The unsafe flavor is 'memoryBarrierAcquireFunction'
+--                   .
+--
+--     [C declaration]: @SDL_MemoryBarrierAcquireFunction@, defined at @SDL3\/SDL_atomic.h 212:34@
+memoryBarrierAcquireFunctionSafe :: IO ()
+memoryBarrierAcquireFunctionSafe =
+  Safe.sDL_MemoryBarrierAcquireFunction
+
+-- | Set an atomic variable to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the atomic variable was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAtomicInt', 'setAtomicInt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CompareAndSwapAtomicInt@.
+--                   The safe flavor is 'compareAndSwapAtomicIntSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicInt@, defined at @SDL3\/SDL_atomic.h 415:34@
+compareAndSwapAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@oldval@]: the old value.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@newval@]: the new value.
+  -> IO Bool
+compareAndSwapAtomicInt =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_CompareAndSwapAtomicInt x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Set an atomic variable to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the atomic variable was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAtomicInt', 'setAtomicInt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CompareAndSwapAtomicInt@.
+--                   The unsafe flavor is 'compareAndSwapAtomicInt'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicInt@, defined at @SDL3\/SDL_atomic.h 415:34@
+compareAndSwapAtomicIntSafe
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@oldval@]: the old value.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@newval@]: the new value.
+  -> IO Bool
+compareAndSwapAtomicIntSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_CompareAndSwapAtomicInt x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Set an atomic variable to a value.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAtomicInt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAtomicInt@.
+--                   The safe flavor is 'setAtomicIntSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAtomicInt@, defined at @SDL3\/SDL_atomic.h 435:33@
+setAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@v@]: the desired value.
+  -> IO BG.Int32
+setAtomicInt =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_SetAtomicInt x00 (Coerce.coerce x11))
+
+-- | Set an atomic variable to a value.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAtomicInt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAtomicInt@.
+--                   The unsafe flavor is 'setAtomicInt'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAtomicInt@, defined at @SDL3\/SDL_atomic.h 435:33@
+setAtomicIntSafe
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@v@]: the desired value.
+  -> IO BG.Int32
+setAtomicIntSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_SetAtomicInt x00 (Coerce.coerce x11))
+
+-- | Get the value of an atomic variable.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of an atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAtomicInt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAtomicInt@.
+--                   The safe flavor is 'getAtomicIntSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAtomicInt@, defined at @SDL3\/SDL_atomic.h 452:33@
+getAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable.
+  -> IO BG.Int32
+getAtomicInt =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetAtomicInt x00)
+
+-- | Get the value of an atomic variable.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of an atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAtomicInt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAtomicInt@.
+--                   The unsafe flavor is 'getAtomicInt'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAtomicInt@, defined at @SDL3\/SDL_atomic.h 452:33@
+getAtomicIntSafe
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable.
+  -> IO BG.Int32
+getAtomicIntSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetAtomicInt x00)
+
+-- | Add to an atomic variable.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_AtomicDecRef@, @SDL_AtomicIncRef@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AddAtomicInt@.
+--                   The safe flavor is 'addAtomicIntSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddAtomicInt@, defined at @SDL3\/SDL_atomic.h 473:33@
+addAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@v@]: the desired value to add.
+  -> IO BG.Int32
+addAtomicInt =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_AddAtomicInt x00 (Coerce.coerce x11))
+
+-- | Add to an atomic variable.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_AtomicDecRef@, @SDL_AtomicIncRef@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddAtomicInt@.
+--                   The unsafe flavor is 'addAtomicInt'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddAtomicInt@, defined at @SDL3\/SDL_atomic.h 473:33@
+addAtomicIntSafe
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@v@]: the desired value to add.
+  -> IO BG.Int32
+addAtomicIntSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_AddAtomicInt x00 (Coerce.coerce x11))
+
+-- | Set an atomic variable to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the atomic variable was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAtomicU32', 'setAtomicU32'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CompareAndSwapAtomicU32@.
+--                   The safe flavor is 'compareAndSwapAtomicU32Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicU32@, defined at @SDL3\/SDL_atomic.h 560:34@
+compareAndSwapAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@oldval@]: the old value.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@newval@]: the new value.
+  -> IO Bool
+compareAndSwapAtomicU32 =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_CompareAndSwapAtomicU32 x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Set an atomic variable to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the atomic variable was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAtomicU32', 'setAtomicU32'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CompareAndSwapAtomicU32@.
+--                   The unsafe flavor is 'compareAndSwapAtomicU32'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicU32@, defined at @SDL3\/SDL_atomic.h 560:34@
+compareAndSwapAtomicU32Safe
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@oldval@]: the old value.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@newval@]: the new value.
+  -> IO Bool
+compareAndSwapAtomicU32Safe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_CompareAndSwapAtomicU32 x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Set an atomic variable to a value.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAtomicU32'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAtomicU32@.
+--                   The safe flavor is 'setAtomicU32Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAtomicU32@, defined at @SDL3\/SDL_atomic.h 580:36@
+setAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@v@]: the desired value.
+  -> IO BG.Word32
+setAtomicU32 =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_SetAtomicU32 x00 (Coerce.coerce x11))
+
+-- | Set an atomic variable to a value.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAtomicU32'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAtomicU32@.
+--                   The unsafe flavor is 'setAtomicU32'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAtomicU32@, defined at @SDL3\/SDL_atomic.h 580:36@
+setAtomicU32Safe
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@v@]: the desired value.
+  -> IO BG.Word32
+setAtomicU32Safe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_SetAtomicU32 x00 (Coerce.coerce x11))
+
+-- | Get the value of an atomic variable.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of an atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAtomicU32'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAtomicU32@.
+--                   The safe flavor is 'getAtomicU32Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAtomicU32@, defined at @SDL3\/SDL_atomic.h 597:36@
+getAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable.
+  -> IO BG.Word32
+getAtomicU32 =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetAtomicU32 x00)
+
+-- | Get the value of an atomic variable.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of an atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAtomicU32'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAtomicU32@.
+--                   The unsafe flavor is 'getAtomicU32'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAtomicU32@, defined at @SDL3\/SDL_atomic.h 597:36@
+getAtomicU32Safe
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable.
+  -> IO BG.Word32
+getAtomicU32Safe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetAtomicU32 x00)
+
+-- | Add to an atomic variable.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AddAtomicU32@.
+--                   The safe flavor is 'addAtomicU32Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddAtomicU32@, defined at @SDL3\/SDL_atomic.h 615:36@
+addAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@v@]: the desired value to add or subtract.
+  -> IO BG.Word32
+addAtomicU32 =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_AddAtomicU32 x00 (Coerce.coerce x11))
+
+-- | Add to an atomic variable.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddAtomicU32@.
+--                   The unsafe flavor is 'addAtomicU32'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddAtomicU32@, defined at @SDL3\/SDL_atomic.h 615:36@
+addAtomicU32Safe
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@v@]: the desired value to add or subtract.
+  -> IO BG.Word32
+addAtomicU32Safe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_AddAtomicU32 x00 (Coerce.coerce x11))
+
+-- | Set a pointer to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the pointer was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'compareAndSwapAtomicInt', 'getAtomicPointer', 'setAtomicPointer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CompareAndSwapAtomicPointer@.
+--                   The safe flavor is 'compareAndSwapAtomicPointerSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicPointer@, defined at @SDL3\/SDL_atomic.h 636:34@
+compareAndSwapAtomicPointer
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@oldval@]: the old pointer value.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@newval@]: the new pointer value.
+  -> IO Bool
+compareAndSwapAtomicPointer =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_CompareAndSwapAtomicPointer x00 x11 x22)
+
+-- | Set a pointer to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the pointer was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'compareAndSwapAtomicInt', 'getAtomicPointer', 'setAtomicPointer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CompareAndSwapAtomicPointer@.
+--                   The unsafe flavor is 'compareAndSwapAtomicPointer'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicPointer@, defined at @SDL3\/SDL_atomic.h 636:34@
+compareAndSwapAtomicPointerSafe
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@oldval@]: the old pointer value.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@newval@]: the new pointer value.
+  -> IO Bool
+compareAndSwapAtomicPointerSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_CompareAndSwapAtomicPointer x00 x11 x22)
+
+-- | Set a pointer to a value atomically.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the pointer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'compareAndSwapAtomicPointer', 'getAtomicPointer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAtomicPointer@.
+--                   The safe flavor is 'setAtomicPointerSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetAtomicPointer@, defined at @SDL3\/SDL_atomic.h 655:36@
+setAtomicPointer
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@v@]: the desired pointer value.
+  -> IO (BG.Ptr BG.Void)
+setAtomicPointer = Unsafe.sDL_SetAtomicPointer
+
+-- | Set a pointer to a value atomically.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the pointer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'compareAndSwapAtomicPointer', 'getAtomicPointer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAtomicPointer@.
+--                   The unsafe flavor is 'setAtomicPointer'
+--                   .
+--
+--     [C declaration]: @SDL_SetAtomicPointer@, defined at @SDL3\/SDL_atomic.h 655:36@
+setAtomicPointerSafe
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@v@]: the desired pointer value.
+  -> IO (BG.Ptr BG.Void)
+setAtomicPointerSafe = Safe.sDL_SetAtomicPointer
+
+-- | Get the value of a pointer atomically.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of a pointer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'compareAndSwapAtomicPointer', 'setAtomicPointer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAtomicPointer@.
+--                   The safe flavor is 'getAtomicPointerSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAtomicPointer@, defined at @SDL3\/SDL_atomic.h 673:36@
+getAtomicPointer
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> IO (BG.Ptr BG.Void)
+getAtomicPointer = Unsafe.sDL_GetAtomicPointer
+
+-- | Get the value of a pointer atomically.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of a pointer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'compareAndSwapAtomicPointer', 'setAtomicPointer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAtomicPointer@.
+--                   The unsafe flavor is 'getAtomicPointer'
+--                   .
+--
+--     [C declaration]: @SDL_GetAtomicPointer@, defined at @SDL3\/SDL_atomic.h 673:36@
+getAtomicPointerSafe
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> IO (BG.Ptr BG.Void)
+getAtomicPointerSafe = Safe.sDL_GetAtomicPointer
diff --git a/src/SDL3/Sys/Audio.hs b/src/SDL3/Sys/Audio.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Audio.hs
@@ -0,0 +1,4784 @@
+-- | Audio functionality for the SDL library.
+--
+--     All audio in SDL3 revolves around 'SDL_AudioStream'. Whether you want to play or record audio, convert it, stream it, buffer it, or mix it, you\'re going to be passing it through an audio stream.
+--
+--     Audio streams are quite flexible; they can accept any amount of data at a time, in any supported format, and output it as needed in any other format, even if the data format changes on either side halfway through.
+--
+--     An app opens an audio device and binds any number of audio streams to it, feeding more data to the streams as available. When the device needs more data, it will pull it from all bound streams and mix them together for playback.
+--
+--     Audio streams can also use an app-provided callback to supply data on-demand, which maps pretty closely to the SDL2 audio model.
+--
+--     SDL also provides a simple .WAV loader in 'loadWAV' (and 'loadWAVIO' if you aren\'t reading from a file) as a basic means to load sound data into your program.
+--
+--     Logical audio devices
+--
+--     In SDL3, opening a physical device (like a SoundBlaster 16 Pro) gives you a logical device ID that you can bind audio streams to. In almost all cases, logical devices can be used anywhere in the API that a physical device is normally used. However, since each device opening generates a new logical device, different parts of the program (say, a VoIP library, or text-to-speech framework, or maybe some other sort of mixer on top of SDL) can have their own device opens that do not interfere with each other; each logical device will mix its separate audio down to a single buffer, fed to the physical device, behind the scenes. As many logical devices as you like can come and go; SDL will only have to open the physical device at the OS level once, and will manage all the logical devices on top of it internally.
+--
+--     One other benefit of logical devices: if you don\'t open a specific physical device, instead opting for the default, SDL can automatically migrate those logical devices to different hardware as circumstances change: a user plugged in headphones? The system default changed? SDL can transparently migrate the logical devices to the correct physical device seamlessly and keep playing; the app doesn\'t even have to know it happened if it doesn\'t want to.
+--
+--     Simplified audio
+--
+--     As a simplified model for when a single source of audio is all that\'s needed, an app can use 'openAudioDeviceStream', which is a single function to open an audio device, create an audio stream, bind that stream to the newly-opened device, and (optionally) provide a callback for obtaining audio data. When using this function, the primary interface is the 'SDL_AudioStream' and the device handle is mostly hidden away; destroying a stream created through this function will also close the device, stream bindings cannot be changed, etc. One other quirk of this is that the device is started in a /paused/ state and must be explicitly resumed; this is partially to offer a clean migration for SDL2 apps and partially because the app might have to do more setup before playback begins; in the non-simplified form, nothing will play until a stream is bound to a device, so they start /unpaused/.
+--
+--     Channel layouts
+--
+--     Audio data passing through SDL is uncompressed PCM data, interleaved. One can provide their own decompression through an MP3, etc, decoder, but SDL does not provide this directly. Each interleaved channel of data is meant to be in a specific order.
+--
+--     Abbreviations:
+--
+--     * FRONT = single mono speaker
+--
+--     * FL = front left speaker
+--
+--     * FR = front right speaker
+--
+--     * FC = front center speaker
+--
+--     * BL = back left speaker
+--
+--     * BR = back right speaker
+--
+--     * SR = surround right speaker
+--
+--     * SL = surround left speaker
+--
+--     * BC = back center speaker
+--
+--     * LFE = low-frequency speaker
+--
+--     These are listed in the order they are laid out in memory, so \"FL, FR\" means \"the front left speaker is laid out in memory first, then the front right, then it repeats for the next audio frame\".
+--
+--     * 1 channel (mono) layout: FRONT
+--
+--     * 2 channels (stereo) layout: FL, FR
+--
+--     * 3 channels (2.1) layout: FL, FR, LFE
+--
+--     * 4 channels (quad) layout: FL, FR, BL, BR
+--
+--     * 5 channels (4.1) layout: FL, FR, LFE, BL, BR
+--
+--     * 6 channels (5.1) layout: FL, FR, FC, LFE, BL, BR (last two can also be SL, SR)
+--
+--     * 7 channels (6.1) layout: FL, FR, FC, LFE, BC, SL, SR
+--
+--     * 8 channels (7.1) layout: FL, FR, FC, LFE, BL, BR, SL, SR
+--
+--     This is the same order as DirectSound expects, but applied to all platforms; SDL will swizzle the channels as necessary if a platform expects something different.
+--
+--     'SDL_AudioStream' can also be provided channel maps to change this ordering to whatever is necessary, in other audio processing scenarios. Mask of bits in an 'SDL_AudioFormat' that contains the format bit size.
+--
+--     Generally one should use SDL_AUDIO_BITSIZE instead of this macro directly.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Audio.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Audio (
+  module SDL3.Sys.Bindgen.Audio,
+
+  -- * Function aliases
+  SDL3.Sys.Audio.getNumAudioDrivers,
+  SDL3.Sys.Audio.getNumAudioDriversSafe,
+  SDL3.Sys.Audio.getAudioDriver,
+  SDL3.Sys.Audio.getAudioDriverSafe,
+  SDL3.Sys.Audio.getCurrentAudioDriver,
+  SDL3.Sys.Audio.getCurrentAudioDriverSafe,
+  SDL3.Sys.Audio.getAudioPlaybackDevices,
+  SDL3.Sys.Audio.getAudioPlaybackDevicesSafe,
+  SDL3.Sys.Audio.getAudioRecordingDevices,
+  SDL3.Sys.Audio.getAudioRecordingDevicesSafe,
+  SDL3.Sys.Audio.getAudioDeviceName,
+  SDL3.Sys.Audio.getAudioDeviceNameSafe,
+  SDL3.Sys.Audio.getAudioDeviceFormat,
+  SDL3.Sys.Audio.getAudioDeviceFormatSafe,
+  SDL3.Sys.Audio.getAudioDeviceChannelMap,
+  SDL3.Sys.Audio.getAudioDeviceChannelMapSafe,
+  SDL3.Sys.Audio.openAudioDevice,
+  SDL3.Sys.Audio.openAudioDeviceSafe,
+  SDL3.Sys.Audio.isAudioDevicePhysical,
+  SDL3.Sys.Audio.isAudioDevicePhysicalSafe,
+  SDL3.Sys.Audio.isAudioDevicePlayback,
+  SDL3.Sys.Audio.isAudioDevicePlaybackSafe,
+  SDL3.Sys.Audio.pauseAudioDevice,
+  SDL3.Sys.Audio.pauseAudioDeviceSafe,
+  SDL3.Sys.Audio.resumeAudioDevice,
+  SDL3.Sys.Audio.resumeAudioDeviceSafe,
+  SDL3.Sys.Audio.audioDevicePaused,
+  SDL3.Sys.Audio.audioDevicePausedSafe,
+  SDL3.Sys.Audio.getAudioDeviceGain,
+  SDL3.Sys.Audio.getAudioDeviceGainSafe,
+  SDL3.Sys.Audio.setAudioDeviceGain,
+  SDL3.Sys.Audio.setAudioDeviceGainSafe,
+  SDL3.Sys.Audio.closeAudioDevice,
+  SDL3.Sys.Audio.closeAudioDeviceSafe,
+  SDL3.Sys.Audio.bindAudioStreams,
+  SDL3.Sys.Audio.bindAudioStreamsSafe,
+  SDL3.Sys.Audio.bindAudioStream,
+  SDL3.Sys.Audio.bindAudioStreamSafe,
+  SDL3.Sys.Audio.unbindAudioStreams,
+  SDL3.Sys.Audio.unbindAudioStreamsSafe,
+  SDL3.Sys.Audio.unbindAudioStream,
+  SDL3.Sys.Audio.unbindAudioStreamSafe,
+  SDL3.Sys.Audio.getAudioStreamDevice,
+  SDL3.Sys.Audio.getAudioStreamDeviceSafe,
+  SDL3.Sys.Audio.createAudioStream,
+  SDL3.Sys.Audio.createAudioStreamSafe,
+  SDL3.Sys.Audio.getAudioStreamProperties,
+  SDL3.Sys.Audio.getAudioStreamPropertiesSafe,
+  SDL3.Sys.Audio.getAudioStreamFormat,
+  SDL3.Sys.Audio.getAudioStreamFormatSafe,
+  SDL3.Sys.Audio.setAudioStreamFormat,
+  SDL3.Sys.Audio.setAudioStreamFormatSafe,
+  SDL3.Sys.Audio.getAudioStreamFrequencyRatio,
+  SDL3.Sys.Audio.getAudioStreamFrequencyRatioSafe,
+  SDL3.Sys.Audio.setAudioStreamFrequencyRatio,
+  SDL3.Sys.Audio.setAudioStreamFrequencyRatioSafe,
+  SDL3.Sys.Audio.getAudioStreamGain,
+  SDL3.Sys.Audio.getAudioStreamGainSafe,
+  SDL3.Sys.Audio.setAudioStreamGain,
+  SDL3.Sys.Audio.setAudioStreamGainSafe,
+  SDL3.Sys.Audio.getAudioStreamInputChannelMap,
+  SDL3.Sys.Audio.getAudioStreamInputChannelMapSafe,
+  SDL3.Sys.Audio.getAudioStreamOutputChannelMap,
+  SDL3.Sys.Audio.getAudioStreamOutputChannelMapSafe,
+  SDL3.Sys.Audio.setAudioStreamInputChannelMap,
+  SDL3.Sys.Audio.setAudioStreamInputChannelMapSafe,
+  SDL3.Sys.Audio.setAudioStreamOutputChannelMap,
+  SDL3.Sys.Audio.setAudioStreamOutputChannelMapSafe,
+  SDL3.Sys.Audio.putAudioStreamData,
+  SDL3.Sys.Audio.putAudioStreamDataSafe,
+  SDL3.Sys.Audio.putAudioStreamDataNoCopy,
+  SDL3.Sys.Audio.putAudioStreamDataNoCopySafe,
+  SDL3.Sys.Audio.putAudioStreamPlanarData,
+  SDL3.Sys.Audio.putAudioStreamPlanarDataSafe,
+  SDL3.Sys.Audio.getAudioStreamData,
+  SDL3.Sys.Audio.getAudioStreamDataSafe,
+  SDL3.Sys.Audio.getAudioStreamAvailable,
+  SDL3.Sys.Audio.getAudioStreamAvailableSafe,
+  SDL3.Sys.Audio.getAudioStreamQueued,
+  SDL3.Sys.Audio.getAudioStreamQueuedSafe,
+  SDL3.Sys.Audio.flushAudioStream,
+  SDL3.Sys.Audio.flushAudioStreamSafe,
+  SDL3.Sys.Audio.clearAudioStream,
+  SDL3.Sys.Audio.clearAudioStreamSafe,
+  SDL3.Sys.Audio.pauseAudioStreamDevice,
+  SDL3.Sys.Audio.pauseAudioStreamDeviceSafe,
+  SDL3.Sys.Audio.resumeAudioStreamDevice,
+  SDL3.Sys.Audio.resumeAudioStreamDeviceSafe,
+  SDL3.Sys.Audio.audioStreamDevicePaused,
+  SDL3.Sys.Audio.audioStreamDevicePausedSafe,
+  SDL3.Sys.Audio.lockAudioStream,
+  SDL3.Sys.Audio.lockAudioStreamSafe,
+  SDL3.Sys.Audio.unlockAudioStream,
+  SDL3.Sys.Audio.unlockAudioStreamSafe,
+  SDL3.Sys.Audio.setAudioStreamGetCallback,
+  SDL3.Sys.Audio.setAudioStreamGetCallbackSafe,
+  SDL3.Sys.Audio.setAudioStreamPutCallback,
+  SDL3.Sys.Audio.setAudioStreamPutCallbackSafe,
+  SDL3.Sys.Audio.destroyAudioStream,
+  SDL3.Sys.Audio.destroyAudioStreamSafe,
+  SDL3.Sys.Audio.openAudioDeviceStream,
+  SDL3.Sys.Audio.openAudioDeviceStreamSafe,
+  SDL3.Sys.Audio.setAudioPostmixCallback,
+  SDL3.Sys.Audio.setAudioPostmixCallbackSafe,
+  SDL3.Sys.Audio.loadWAVIO,
+  SDL3.Sys.Audio.loadWAVIOSafe,
+  SDL3.Sys.Audio.loadWAV,
+  SDL3.Sys.Audio.loadWAVSafe,
+  SDL3.Sys.Audio.mixAudio,
+  SDL3.Sys.Audio.mixAudioSafe,
+  SDL3.Sys.Audio.convertAudioSamples,
+  SDL3.Sys.Audio.convertAudioSamplesSafe,
+  SDL3.Sys.Audio.getAudioFormatName,
+  SDL3.Sys.Audio.getAudioFormatNameSafe,
+  SDL3.Sys.Audio.getSilenceValueForFormat,
+  SDL3.Sys.Audio.getSilenceValueForFormatSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Audio
+import SDL3.Sys.Bindgen.Audio.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Audio.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Use this function to get the number of built-in audio drivers.
+--
+--     This function returns a hardcoded number. This never returns a negative value; if there are no drivers compiled into this build of SDL, this function returns zero. The presence of a driver in this list does not mean it will function, it just means SDL is capable of interacting with that interface. For example, a build of SDL might have esound support, but if there\'s no esound server available, SDL\'s esound driver would fail if used.
+--
+--     By default, SDL tries all drivers, in its preferred order, until one is found to be usable.
+--
+--     [Returns]: the number of built-in audio drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumAudioDrivers@.
+--                   The safe flavor is 'getNumAudioDriversSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumAudioDrivers@, defined at @SDL3\/SDL_audio.h 477:33@
+getNumAudioDrivers :: IO BG.Int32
+getNumAudioDrivers =
+  fmap Coerce.coerce Unsafe.sDL_GetNumAudioDrivers
+
+-- | Use this function to get the number of built-in audio drivers.
+--
+--     This function returns a hardcoded number. This never returns a negative value; if there are no drivers compiled into this build of SDL, this function returns zero. The presence of a driver in this list does not mean it will function, it just means SDL is capable of interacting with that interface. For example, a build of SDL might have esound support, but if there\'s no esound server available, SDL\'s esound driver would fail if used.
+--
+--     By default, SDL tries all drivers, in its preferred order, until one is found to be usable.
+--
+--     [Returns]: the number of built-in audio drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumAudioDrivers@.
+--                   The unsafe flavor is 'getNumAudioDrivers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumAudioDrivers@, defined at @SDL3\/SDL_audio.h 477:33@
+getNumAudioDriversSafe :: IO BG.Int32
+getNumAudioDriversSafe =
+  fmap Coerce.coerce Safe.sDL_GetNumAudioDrivers
+
+-- | Use this function to get the name of a built in audio driver.
+--
+--     The list of audio drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"alsa\", \"coreaudio\" or \"wasapi\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the audio driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumAudioDrivers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioDriver@.
+--                   The safe flavor is 'getAudioDriverSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioDriver@, defined at @SDL3\/SDL_audio.h 501:42@
+getAudioDriver
+  :: BG.Int32
+  -- ^
+  --
+  --           [@index@]: the index of the audio driver; the value ranges from 0 to @'getNumAudioDrivers'@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getAudioDriver =
+  \x00 -> Unsafe.sDL_GetAudioDriver (Coerce.coerce x00)
+
+-- | Use this function to get the name of a built in audio driver.
+--
+--     The list of audio drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"alsa\", \"coreaudio\" or \"wasapi\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the audio driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumAudioDrivers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioDriver@.
+--                   The unsafe flavor is 'getAudioDriver'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioDriver@, defined at @SDL3\/SDL_audio.h 501:42@
+getAudioDriverSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@index@]: the index of the audio driver; the value ranges from 0 to @'getNumAudioDrivers'@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getAudioDriverSafe =
+  \x00 -> Safe.sDL_GetAudioDriver (Coerce.coerce x00)
+
+-- | Get the name of the current audio driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"alsa\", \"coreaudio\" or \"wasapi\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current audio driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCurrentAudioDriver@.
+--                   The safe flavor is 'getCurrentAudioDriverSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentAudioDriver@, defined at @SDL3\/SDL_audio.h 517:42@
+getCurrentAudioDriver :: IO (PtrConst.PtrConst BG.CChar)
+getCurrentAudioDriver =
+  Unsafe.sDL_GetCurrentAudioDriver
+
+-- | Get the name of the current audio driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"alsa\", \"coreaudio\" or \"wasapi\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current audio driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCurrentAudioDriver@.
+--                   The unsafe flavor is 'getCurrentAudioDriver'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentAudioDriver@, defined at @SDL3\/SDL_audio.h 517:42@
+getCurrentAudioDriverSafe :: IO (PtrConst.PtrConst BG.CChar)
+getCurrentAudioDriverSafe =
+  Safe.sDL_GetCurrentAudioDriver
+
+-- | Get a list of currently-connected audio playback devices.
+--
+--     This returns of list of available devices that play sound, perhaps to speakers or headphones (\"playback\" devices). If you want devices that record audio, like a microphone (\"recording\" devices), use @'getAudioRecordingDevices'@ instead.
+--
+--     This only returns a list of physical devices; it will not have any device IDs returned by @'openAudioDevice'@.
+--
+--     If this function returns NULL, to signify an error, @*count@ will be set to zero.
+--
+--     [Returns]: a 0 terminated array of device instance IDs or NULL on error; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openAudioDevice', 'getAudioRecordingDevices'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioPlaybackDevices@.
+--                   The safe flavor is 'getAudioPlaybackDevicesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioPlaybackDevices@, defined at @SDL3\/SDL_audio.h 546:49@
+getAudioPlaybackDevices
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+getAudioPlaybackDevices =
+  Unsafe.sDL_GetAudioPlaybackDevices
+
+-- | Get a list of currently-connected audio playback devices.
+--
+--     This returns of list of available devices that play sound, perhaps to speakers or headphones (\"playback\" devices). If you want devices that record audio, like a microphone (\"recording\" devices), use @'getAudioRecordingDevices'@ instead.
+--
+--     This only returns a list of physical devices; it will not have any device IDs returned by @'openAudioDevice'@.
+--
+--     If this function returns NULL, to signify an error, @*count@ will be set to zero.
+--
+--     [Returns]: a 0 terminated array of device instance IDs or NULL on error; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openAudioDevice', 'getAudioRecordingDevices'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioPlaybackDevices@.
+--                   The unsafe flavor is 'getAudioPlaybackDevices'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioPlaybackDevices@, defined at @SDL3\/SDL_audio.h 546:49@
+getAudioPlaybackDevicesSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+getAudioPlaybackDevicesSafe =
+  Safe.sDL_GetAudioPlaybackDevices
+
+-- | Get a list of currently-connected audio recording devices.
+--
+--     This returns of list of available devices that record audio, like a microphone (\"recording\" devices). If you want devices that play sound, perhaps to speakers or headphones (\"playback\" devices), use @'getAudioPlaybackDevices'@ instead.
+--
+--     This only returns a list of physical devices; it will not have any device IDs returned by @'openAudioDevice'@.
+--
+--     If this function returns NULL, to signify an error, @*count@ will be set to zero.
+--
+--     [Returns]: a 0 terminated array of device instance IDs, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openAudioDevice', 'getAudioPlaybackDevices'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioRecordingDevices@.
+--                   The safe flavor is 'getAudioRecordingDevicesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioRecordingDevices@, defined at @SDL3\/SDL_audio.h 575:49@
+getAudioRecordingDevices
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+getAudioRecordingDevices =
+  Unsafe.sDL_GetAudioRecordingDevices
+
+-- | Get a list of currently-connected audio recording devices.
+--
+--     This returns of list of available devices that record audio, like a microphone (\"recording\" devices). If you want devices that play sound, perhaps to speakers or headphones (\"playback\" devices), use @'getAudioPlaybackDevices'@ instead.
+--
+--     This only returns a list of physical devices; it will not have any device IDs returned by @'openAudioDevice'@.
+--
+--     If this function returns NULL, to signify an error, @*count@ will be set to zero.
+--
+--     [Returns]: a 0 terminated array of device instance IDs, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openAudioDevice', 'getAudioPlaybackDevices'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioRecordingDevices@.
+--                   The unsafe flavor is 'getAudioRecordingDevices'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioRecordingDevices@, defined at @SDL3\/SDL_audio.h 575:49@
+getAudioRecordingDevicesSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+getAudioRecordingDevicesSafe =
+  Safe.sDL_GetAudioRecordingDevices
+
+-- | Get the human-readable name of a specific audio device.
+--
+--     __WARNING__: this function will work with SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK and SDL_AUDIO_DEVICE_DEFAULT_RECORDING, returning the current default physical devices\' names. However, as the default device may change at any time, it is likely better to show a generic name to the user, like \"System default audio device\" or perhaps \"default [currently %s]\". Do not store this name to disk to reidentify the device in a later run of the program, as the default might change in general, and the string will be the name of a specific device and not the abstract system default.
+--
+--     [Returns]: the name of the audio device, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioPlaybackDevices', 'getAudioRecordingDevices'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioDeviceName@.
+--                   The safe flavor is 'getAudioDeviceNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioDeviceName@, defined at @SDL3\/SDL_audio.h 600:42@
+getAudioDeviceName
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getAudioDeviceName = Unsafe.sDL_GetAudioDeviceName
+
+-- | Get the human-readable name of a specific audio device.
+--
+--     __WARNING__: this function will work with SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK and SDL_AUDIO_DEVICE_DEFAULT_RECORDING, returning the current default physical devices\' names. However, as the default device may change at any time, it is likely better to show a generic name to the user, like \"System default audio device\" or perhaps \"default [currently %s]\". Do not store this name to disk to reidentify the device in a later run of the program, as the default might change in general, and the string will be the name of a specific device and not the abstract system default.
+--
+--     [Returns]: the name of the audio device, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioPlaybackDevices', 'getAudioRecordingDevices'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioDeviceName@.
+--                   The unsafe flavor is 'getAudioDeviceName'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioDeviceName@, defined at @SDL3\/SDL_audio.h 600:42@
+getAudioDeviceNameSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getAudioDeviceNameSafe = Safe.sDL_GetAudioDeviceName
+
+-- | Get the current audio format of a specific audio device.
+--
+--     For an opened device, this will report the format the device is currently using. If the device isn\'t yet opened, this will report the device\'s preferred format (or a reasonable default if this can\'t be determined).
+--
+--     You may also specify SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING here, which is useful for getting a reasonable recommendation before opening the system-recommended default device.
+--
+--     You can also use this to request the current device buffer size. This is specified in sample frames and represents the amount of data SDL will feed to the physical hardware in each chunk. This can be converted to milliseconds of audio with the following equation:
+--
+--     @ms = (int) ((((Sint64) frames) * 1000) \/ spec.freq);@
+--
+--     Buffer size is only important if you need low-level control over the audio playback timing. Most apps do not need this.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioDeviceFormat@.
+--                   The safe flavor is 'getAudioDeviceFormatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioDeviceFormat@, defined at @SDL3\/SDL_audio.h 635:34@
+getAudioDeviceFormat
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: on return, will be filled with device details.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@sample_frames@]: pointer to store device buffer size, in sample frames. Can be NULL.
+  -> IO Bool
+getAudioDeviceFormat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetAudioDeviceFormat x00 x11 x22)
+
+-- | Get the current audio format of a specific audio device.
+--
+--     For an opened device, this will report the format the device is currently using. If the device isn\'t yet opened, this will report the device\'s preferred format (or a reasonable default if this can\'t be determined).
+--
+--     You may also specify SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING here, which is useful for getting a reasonable recommendation before opening the system-recommended default device.
+--
+--     You can also use this to request the current device buffer size. This is specified in sample frames and represents the amount of data SDL will feed to the physical hardware in each chunk. This can be converted to milliseconds of audio with the following equation:
+--
+--     @ms = (int) ((((Sint64) frames) * 1000) \/ spec.freq);@
+--
+--     Buffer size is only important if you need low-level control over the audio playback timing. Most apps do not need this.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioDeviceFormat@.
+--                   The unsafe flavor is 'getAudioDeviceFormat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioDeviceFormat@, defined at @SDL3\/SDL_audio.h 635:34@
+getAudioDeviceFormatSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: on return, will be filled with device details.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@sample_frames@]: pointer to store device buffer size, in sample frames. Can be NULL.
+  -> IO Bool
+getAudioDeviceFormatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetAudioDeviceFormat x00 x11 x22)
+
+-- | Get the current channel map of an audio device.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](https://wiki.libsdl.org/SDL3/CategoryAudio#channel-layouts).
+--
+--     Audio devices usually have no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamInputChannelMap'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioDeviceChannelMap@.
+--                   The safe flavor is 'getAudioDeviceChannelMapSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioDeviceChannelMap@, defined at @SDL3\/SDL_audio.h 658:35@
+getAudioDeviceChannelMap
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+getAudioDeviceChannelMap =
+  Unsafe.sDL_GetAudioDeviceChannelMap
+
+-- | Get the current channel map of an audio device.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](https://wiki.libsdl.org/SDL3/CategoryAudio#channel-layouts).
+--
+--     Audio devices usually have no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamInputChannelMap'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioDeviceChannelMap@.
+--                   The unsafe flavor is 'getAudioDeviceChannelMap'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioDeviceChannelMap@, defined at @SDL3\/SDL_audio.h 658:35@
+getAudioDeviceChannelMapSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+getAudioDeviceChannelMapSafe =
+  Safe.sDL_GetAudioDeviceChannelMap
+
+-- | Open a specific audio device.
+--
+--     You can open both playback and recording devices through this function. Playback devices will take data from bound audio streams, mix it, and send it to the hardware. Recording devices will feed any bound audio streams with a copy of any incoming data.
+--
+--     An opened audio device starts out with no audio streams bound. To start audio playing, bind a stream and supply audio data to it. Unlike SDL2, there is no audio callback; you only bind audio streams and make sure they have data flowing into them (however, you can simulate SDL2\'s semantics fairly closely by using 'openAudioDeviceStream' instead of this function).
+--
+--     If you don\'t care about opening a specific device, pass a @devid@ of either @SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK@ or @SDL_AUDIO_DEVICE_DEFAULT_RECORDING@. In this case, SDL will try to pick the most reasonable default, and may also switch between physical devices seamlessly later, if the most reasonable default changes during the lifetime of this opened device (user changed the default in the OS\'s system preferences, the default got unplugged so the system jumped to a new default, the user plugged in headphones on a mobile device, etc). Unless you have a good reason to choose a specific device, this is probably what you want.
+--
+--     You may request a specific format for the audio device, but there is no promise the device will honor that request for several reasons. As such, it\'s only meant to be a hint as to what data your app will provide. Audio streams will accept data in whatever format you specify and manage conversion for you as appropriate. 'getAudioDeviceFormat' can tell you the preferred format for the device before opening and the actual format the device is using after opening.
+--
+--     It\'s legal to open the same device ID more than once; each successful open will generate a new logical 'SDL_AudioDeviceID' that is managed separately from others on the same physical device. This allows libraries to open a device separately from the main app and bind its own streams without conflicting.
+--
+--     It is also legal to open a device ID returned by a previous call to this function; doing so just creates another logical device on the same physical device. This may be useful for making logical groupings of audio streams.
+--
+--     This function returns the opened device ID on success. This is a new, unique 'SDL_AudioDeviceID' that represents a logical device.
+--
+--     Some backends might offer arbitrary devices (for example, a networked audio protocol that can connect to an arbitrary server). For these, as a change from SDL2, you should open a default device ID and use an SDL hint to specify the target if you care, or otherwise let the backend figure out a reasonable default. Most backends don\'t offer anything like this, and often this would be an end user setting an environment variable for their custom need, and not something an application should specifically manage.
+--
+--     When done with an audio device, possibly at the end of the app\'s life, one should call @'closeAudioDevice'@ on the returned device id.
+--
+--     [Returns]: the device ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeAudioDevice', 'getAudioDeviceFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenAudioDevice@.
+--                   The safe flavor is 'openAudioDeviceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenAudioDevice@, defined at @SDL3\/SDL_audio.h 734:47@
+openAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device instance id to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING for the most reasonable default device.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: the requested device configuration. Can be NULL to use reasonable defaults.
+  -> IO SDL_AudioDeviceID
+openAudioDevice = Unsafe.sDL_OpenAudioDevice
+
+-- | Open a specific audio device.
+--
+--     You can open both playback and recording devices through this function. Playback devices will take data from bound audio streams, mix it, and send it to the hardware. Recording devices will feed any bound audio streams with a copy of any incoming data.
+--
+--     An opened audio device starts out with no audio streams bound. To start audio playing, bind a stream and supply audio data to it. Unlike SDL2, there is no audio callback; you only bind audio streams and make sure they have data flowing into them (however, you can simulate SDL2\'s semantics fairly closely by using 'openAudioDeviceStream' instead of this function).
+--
+--     If you don\'t care about opening a specific device, pass a @devid@ of either @SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK@ or @SDL_AUDIO_DEVICE_DEFAULT_RECORDING@. In this case, SDL will try to pick the most reasonable default, and may also switch between physical devices seamlessly later, if the most reasonable default changes during the lifetime of this opened device (user changed the default in the OS\'s system preferences, the default got unplugged so the system jumped to a new default, the user plugged in headphones on a mobile device, etc). Unless you have a good reason to choose a specific device, this is probably what you want.
+--
+--     You may request a specific format for the audio device, but there is no promise the device will honor that request for several reasons. As such, it\'s only meant to be a hint as to what data your app will provide. Audio streams will accept data in whatever format you specify and manage conversion for you as appropriate. 'getAudioDeviceFormat' can tell you the preferred format for the device before opening and the actual format the device is using after opening.
+--
+--     It\'s legal to open the same device ID more than once; each successful open will generate a new logical 'SDL_AudioDeviceID' that is managed separately from others on the same physical device. This allows libraries to open a device separately from the main app and bind its own streams without conflicting.
+--
+--     It is also legal to open a device ID returned by a previous call to this function; doing so just creates another logical device on the same physical device. This may be useful for making logical groupings of audio streams.
+--
+--     This function returns the opened device ID on success. This is a new, unique 'SDL_AudioDeviceID' that represents a logical device.
+--
+--     Some backends might offer arbitrary devices (for example, a networked audio protocol that can connect to an arbitrary server). For these, as a change from SDL2, you should open a default device ID and use an SDL hint to specify the target if you care, or otherwise let the backend figure out a reasonable default. Most backends don\'t offer anything like this, and often this would be an end user setting an environment variable for their custom need, and not something an application should specifically manage.
+--
+--     When done with an audio device, possibly at the end of the app\'s life, one should call @'closeAudioDevice'@ on the returned device id.
+--
+--     [Returns]: the device ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeAudioDevice', 'getAudioDeviceFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenAudioDevice@.
+--                   The unsafe flavor is 'openAudioDevice'
+--                   .
+--
+--     [C declaration]: @SDL_OpenAudioDevice@, defined at @SDL3\/SDL_audio.h 734:47@
+openAudioDeviceSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device instance id to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING for the most reasonable default device.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: the requested device configuration. Can be NULL to use reasonable defaults.
+  -> IO SDL_AudioDeviceID
+openAudioDeviceSafe = Safe.sDL_OpenAudioDevice
+
+-- | Determine if an audio device is physical (instead of logical).
+--
+--     An 'SDL_AudioDeviceID' that represents physical hardware is a physical device; there is one for each piece of hardware that SDL can see. Logical devices are created by calling 'openAudioDevice' or 'openAudioDeviceStream', and while each is associated with a physical device, there can be any number of logical devices on one physical device.
+--
+--     For the most part, logical and physical IDs are interchangeable if you try to open a logical device, SDL understands to assign that effort to the underlying physical device, etc. However, it might be useful to know if an arbitrary device ID is physical or logical. This function reports which.
+--
+--     This function may return either true or false for invalid device IDs.
+--
+--     [Returns]: true if devid is a physical device, false if it is logical.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IsAudioDevicePhysical@.
+--                   The safe flavor is 'isAudioDevicePhysicalSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsAudioDevicePhysical@, defined at @SDL3\/SDL_audio.h 759:34@
+isAudioDevicePhysical
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device ID to query.
+  -> IO Bool
+isAudioDevicePhysical =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_IsAudioDevicePhysical x00)
+
+-- | Determine if an audio device is physical (instead of logical).
+--
+--     An 'SDL_AudioDeviceID' that represents physical hardware is a physical device; there is one for each piece of hardware that SDL can see. Logical devices are created by calling 'openAudioDevice' or 'openAudioDeviceStream', and while each is associated with a physical device, there can be any number of logical devices on one physical device.
+--
+--     For the most part, logical and physical IDs are interchangeable if you try to open a logical device, SDL understands to assign that effort to the underlying physical device, etc. However, it might be useful to know if an arbitrary device ID is physical or logical. This function reports which.
+--
+--     This function may return either true or false for invalid device IDs.
+--
+--     [Returns]: true if devid is a physical device, false if it is logical.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IsAudioDevicePhysical@.
+--                   The unsafe flavor is 'isAudioDevicePhysical'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsAudioDevicePhysical@, defined at @SDL3\/SDL_audio.h 759:34@
+isAudioDevicePhysicalSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device ID to query.
+  -> IO Bool
+isAudioDevicePhysicalSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_IsAudioDevicePhysical x00)
+
+-- | Determine if an audio device is a playback device (instead of recording).
+--
+--     This function may return either true or false for invalid device IDs.
+--
+--     [Returns]: true if devid is a playback device, false if it is recording.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IsAudioDevicePlayback@.
+--                   The safe flavor is 'isAudioDevicePlaybackSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsAudioDevicePlayback@, defined at @SDL3\/SDL_audio.h 773:34@
+isAudioDevicePlayback
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device ID to query.
+  -> IO Bool
+isAudioDevicePlayback =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_IsAudioDevicePlayback x00)
+
+-- | Determine if an audio device is a playback device (instead of recording).
+--
+--     This function may return either true or false for invalid device IDs.
+--
+--     [Returns]: true if devid is a playback device, false if it is recording.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IsAudioDevicePlayback@.
+--                   The unsafe flavor is 'isAudioDevicePlayback'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsAudioDevicePlayback@, defined at @SDL3\/SDL_audio.h 773:34@
+isAudioDevicePlaybackSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device ID to query.
+  -> IO Bool
+isAudioDevicePlaybackSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_IsAudioDevicePlayback x00)
+
+-- | Use this function to pause audio playback on a specified device.
+--
+--     This function pauses audio processing for a given device. Any bound audio streams will not progress, and no audio will be generated. Pausing one device does not prevent other unpaused devices from running.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow. Pausing a paused device is a legal no-op.
+--
+--     Pausing a device can be useful to halt all audio without unbinding all the audio streams. This might be useful while a game is paused, or a level is loading, etc.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @'openAudioDevice'@ can be.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resumeAudioDevice', 'audioDevicePaused'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PauseAudioDevice@.
+--                   The safe flavor is 'pauseAudioDeviceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PauseAudioDevice@, defined at @SDL3\/SDL_audio.h 804:34@
+pauseAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @'openAudioDevice'@.
+  -> IO Bool
+pauseAudioDevice =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_PauseAudioDevice x00)
+
+-- | Use this function to pause audio playback on a specified device.
+--
+--     This function pauses audio processing for a given device. Any bound audio streams will not progress, and no audio will be generated. Pausing one device does not prevent other unpaused devices from running.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow. Pausing a paused device is a legal no-op.
+--
+--     Pausing a device can be useful to halt all audio without unbinding all the audio streams. This might be useful while a game is paused, or a level is loading, etc.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @'openAudioDevice'@ can be.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resumeAudioDevice', 'audioDevicePaused'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PauseAudioDevice@.
+--                   The unsafe flavor is 'pauseAudioDevice'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PauseAudioDevice@, defined at @SDL3\/SDL_audio.h 804:34@
+pauseAudioDeviceSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @'openAudioDevice'@.
+  -> IO Bool
+pauseAudioDeviceSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_PauseAudioDevice x00)
+
+-- | Use this function to unpause audio playback on a specified device.
+--
+--     This function unpauses audio processing for a given device that has previously been paused with @'pauseAudioDevice'@. Once unpaused, any bound audio streams will begin to progress again, and audio can be generated.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow. Unpausing an unpaused device is a legal no-op.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @'openAudioDevice'@ can be.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'audioDevicePaused', 'pauseAudioDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ResumeAudioDevice@.
+--                   The safe flavor is 'resumeAudioDeviceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ResumeAudioDevice@, defined at @SDL3\/SDL_audio.h 832:34@
+resumeAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @'openAudioDevice'@.
+  -> IO Bool
+resumeAudioDevice =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_ResumeAudioDevice x00)
+
+-- | Use this function to unpause audio playback on a specified device.
+--
+--     This function unpauses audio processing for a given device that has previously been paused with @'pauseAudioDevice'@. Once unpaused, any bound audio streams will begin to progress again, and audio can be generated.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow. Unpausing an unpaused device is a legal no-op.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @'openAudioDevice'@ can be.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'audioDevicePaused', 'pauseAudioDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ResumeAudioDevice@.
+--                   The unsafe flavor is 'resumeAudioDevice'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ResumeAudioDevice@, defined at @SDL3\/SDL_audio.h 832:34@
+resumeAudioDeviceSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @'openAudioDevice'@.
+  -> IO Bool
+resumeAudioDeviceSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_ResumeAudioDevice x00)
+
+-- | Use this function to query if an audio device is paused.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @'openAudioDevice'@ can be. Physical and invalid device IDs will report themselves as unpaused here.
+--
+--     [Returns]: true if device is valid and paused, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pauseAudioDevice', 'resumeAudioDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AudioDevicePaused@.
+--                   The safe flavor is 'audioDevicePausedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AudioDevicePaused@, defined at @SDL3\/SDL_audio.h 854:34@
+audioDevicePaused
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @'openAudioDevice'@.
+  -> IO Bool
+audioDevicePaused =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_AudioDevicePaused x00)
+
+-- | Use this function to query if an audio device is paused.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @'openAudioDevice'@ can be. Physical and invalid device IDs will report themselves as unpaused here.
+--
+--     [Returns]: true if device is valid and paused, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pauseAudioDevice', 'resumeAudioDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AudioDevicePaused@.
+--                   The unsafe flavor is 'audioDevicePaused'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AudioDevicePaused@, defined at @SDL3\/SDL_audio.h 854:34@
+audioDevicePausedSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @'openAudioDevice'@.
+  -> IO Bool
+audioDevicePausedSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_AudioDevicePaused x00)
+
+-- | Get the gain of an audio device.
+--
+--     The gain of a device is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio devices default to a gain of 1.0f (no change in output).
+--
+--     Physical devices may not have their gain changed, only logical devices, and this function will always return -1.0f when used on physical devices.
+--
+--     [Returns]: the gain of the device or -1.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioDeviceGain'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioDeviceGain@.
+--                   The safe flavor is 'getAudioDeviceGainSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioDeviceGain@, defined at @SDL3\/SDL_audio.h 877:35@
+getAudioDeviceGain
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the audio device to query.
+  -> IO Float
+getAudioDeviceGain =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetAudioDeviceGain x00)
+
+-- | Get the gain of an audio device.
+--
+--     The gain of a device is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio devices default to a gain of 1.0f (no change in output).
+--
+--     Physical devices may not have their gain changed, only logical devices, and this function will always return -1.0f when used on physical devices.
+--
+--     [Returns]: the gain of the device or -1.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioDeviceGain'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioDeviceGain@.
+--                   The unsafe flavor is 'getAudioDeviceGain'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioDeviceGain@, defined at @SDL3\/SDL_audio.h 877:35@
+getAudioDeviceGainSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the audio device to query.
+  -> IO Float
+getAudioDeviceGainSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetAudioDeviceGain x00)
+
+-- | Change the gain of an audio device.
+--
+--     The gain of a device is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio devices default to a gain of 1.0f (no change in output).
+--
+--     Physical devices may not have their gain changed, only logical devices, and this function will always return false when used on physical devices. While it might seem attractive to adjust several logical devices at once in this way, it would allow an app or library to interfere with another portion of the program\'s otherwise-isolated devices.
+--
+--     This is applied, along with any per-audiostream gain, during playback to the hardware, and can be continuously changed to create various effects. On recording devices, this will adjust the gain before passing the data into an audiostream; that recording audiostream can then adjust its gain further when outputting the data elsewhere, if it likes, but that second gain is not applied until the data leaves the audiostream again.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioDeviceGain'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAudioDeviceGain@.
+--                   The safe flavor is 'setAudioDeviceGainSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioDeviceGain@, defined at @SDL3\/SDL_audio.h 912:34@
+setAudioDeviceGain
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the audio device on which to change gain.
+  -> Float
+  -- ^
+  --
+  --           [@gain@]: the gain. 1.0f is no change, 0.0f is silence.
+  -> IO Bool
+setAudioDeviceGain =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetAudioDeviceGain x00 (Coerce.coerce x11))
+
+-- | Change the gain of an audio device.
+--
+--     The gain of a device is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio devices default to a gain of 1.0f (no change in output).
+--
+--     Physical devices may not have their gain changed, only logical devices, and this function will always return false when used on physical devices. While it might seem attractive to adjust several logical devices at once in this way, it would allow an app or library to interfere with another portion of the program\'s otherwise-isolated devices.
+--
+--     This is applied, along with any per-audiostream gain, during playback to the hardware, and can be continuously changed to create various effects. On recording devices, this will adjust the gain before passing the data into an audiostream; that recording audiostream can then adjust its gain further when outputting the data elsewhere, if it likes, but that second gain is not applied until the data leaves the audiostream again.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioDeviceGain'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAudioDeviceGain@.
+--                   The unsafe flavor is 'setAudioDeviceGain'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioDeviceGain@, defined at @SDL3\/SDL_audio.h 912:34@
+setAudioDeviceGainSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the audio device on which to change gain.
+  -> Float
+  -- ^
+  --
+  --           [@gain@]: the gain. 1.0f is no change, 0.0f is silence.
+  -> IO Bool
+setAudioDeviceGainSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetAudioDeviceGain x00 (Coerce.coerce x11))
+
+-- | Close a previously-opened audio device.
+--
+--     The application should close open audio devices once they are no longer needed.
+--
+--     This function may block briefly while pending audio data is played by the hardware, so that applications don\'t drop the last buffer of data they supplied if terminating immediately afterwards.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openAudioDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CloseAudioDevice@.
+--                   The safe flavor is 'closeAudioDeviceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CloseAudioDevice@, defined at @SDL3\/SDL_audio.h 933:34@
+closeAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device id previously returned by @'openAudioDevice'@.
+  -> IO ()
+closeAudioDevice = Unsafe.sDL_CloseAudioDevice
+
+-- | Close a previously-opened audio device.
+--
+--     The application should close open audio devices once they are no longer needed.
+--
+--     This function may block briefly while pending audio data is played by the hardware, so that applications don\'t drop the last buffer of data they supplied if terminating immediately afterwards.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openAudioDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CloseAudioDevice@.
+--                   The unsafe flavor is 'closeAudioDevice'
+--                   .
+--
+--     [C declaration]: @SDL_CloseAudioDevice@, defined at @SDL3\/SDL_audio.h 933:34@
+closeAudioDeviceSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device id previously returned by @'openAudioDevice'@.
+  -> IO ()
+closeAudioDeviceSafe = Safe.sDL_CloseAudioDevice
+
+-- | Bind a list of audio streams to an audio device.
+--
+--     Audio data will flow through any bound streams. For a playback device, data for all bound streams will be mixed together and fed to the device. For a recording device, a copy of recorded data will be provided to each bound stream.
+--
+--     Audio streams can only be bound to an open device. This operation is atomic all streams bound in the same call will start processing at the same time, so they can stay in sync. Also: either all streams will be bound or none of them will be.
+--
+--     It is an error to bind an already-bound stream; it must be explicitly unbound first.
+--
+--     Binding a stream to a device will set its output format for playback devices, and its input format for recording devices, so they match the device\'s settings. The caller is welcome to change the other end of the stream\'s format at any time with @'setAudioStreamFormat'@. If the other end of the stream\'s format has never been set (the audio stream was created with a NULL audio spec), this function will set it to match the device end\'s format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindAudioStreams', 'unbindAudioStream', 'getAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindAudioStreams@.
+--                   The safe flavor is 'bindAudioStreamsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindAudioStreams@, defined at @SDL3\/SDL_audio.h 973:34@
+bindAudioStreams
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to bind a stream to.
+  -> PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -- ^
+  --
+  --           [@streams@]: an array of audio streams to bind.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_streams@]: number streams listed in the @streams@ array.
+  -> IO Bool
+bindAudioStreams =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_BindAudioStreams x00 x11 (Coerce.coerce x22))
+
+-- | Bind a list of audio streams to an audio device.
+--
+--     Audio data will flow through any bound streams. For a playback device, data for all bound streams will be mixed together and fed to the device. For a recording device, a copy of recorded data will be provided to each bound stream.
+--
+--     Audio streams can only be bound to an open device. This operation is atomic all streams bound in the same call will start processing at the same time, so they can stay in sync. Also: either all streams will be bound or none of them will be.
+--
+--     It is an error to bind an already-bound stream; it must be explicitly unbound first.
+--
+--     Binding a stream to a device will set its output format for playback devices, and its input format for recording devices, so they match the device\'s settings. The caller is welcome to change the other end of the stream\'s format at any time with @'setAudioStreamFormat'@. If the other end of the stream\'s format has never been set (the audio stream was created with a NULL audio spec), this function will set it to match the device end\'s format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindAudioStreams', 'unbindAudioStream', 'getAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindAudioStreams@.
+--                   The unsafe flavor is 'bindAudioStreams'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindAudioStreams@, defined at @SDL3\/SDL_audio.h 973:34@
+bindAudioStreamsSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to bind a stream to.
+  -> PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -- ^
+  --
+  --           [@streams@]: an array of audio streams to bind.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_streams@]: number streams listed in the @streams@ array.
+  -> IO Bool
+bindAudioStreamsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_BindAudioStreams x00 x11 (Coerce.coerce x22))
+
+-- | Bind a single audio stream to an audio device.
+--
+--     This is a convenience function, equivalent to calling @'bindAudioStreams' (devid, &stream, 1)@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindAudioStreams', 'unbindAudioStream', 'getAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindAudioStream@.
+--                   The safe flavor is 'bindAudioStreamSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindAudioStream@, defined at @SDL3\/SDL_audio.h 994:34@
+bindAudioStream
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to bind a stream to.
+  -> BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: an audio stream to bind to a device.
+  -> IO Bool
+bindAudioStream =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_BindAudioStream x00 x11)
+
+-- | Bind a single audio stream to an audio device.
+--
+--     This is a convenience function, equivalent to calling @'bindAudioStreams' (devid, &stream, 1)@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindAudioStreams', 'unbindAudioStream', 'getAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindAudioStream@.
+--                   The unsafe flavor is 'bindAudioStream'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindAudioStream@, defined at @SDL3\/SDL_audio.h 994:34@
+bindAudioStreamSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to bind a stream to.
+  -> BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: an audio stream to bind to a device.
+  -> IO Bool
+bindAudioStreamSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_BindAudioStream x00 x11)
+
+-- | Unbind a list of audio streams from their audio devices.
+--
+--     The streams being unbound do not all have to be on the same device. All streams on the same device will be unbound atomically (data will stop flowing through all unbound streams on the same device at the same time).
+--
+--     Unbinding a stream that isn\'t bound to a device is a legal no-op.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindAudioStreams'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnbindAudioStreams@.
+--                   The safe flavor is 'unbindAudioStreamsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UnbindAudioStreams@, defined at @SDL3\/SDL_audio.h 1015:34@
+unbindAudioStreams
+  :: PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -- ^
+  --
+  --           [@streams@]: an array of audio streams to unbind. Can be NULL or contain NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_streams@]: number streams listed in the @streams@ array.
+  -> IO ()
+unbindAudioStreams =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_UnbindAudioStreams x00 (Coerce.coerce x11)
+
+-- | Unbind a list of audio streams from their audio devices.
+--
+--     The streams being unbound do not all have to be on the same device. All streams on the same device will be unbound atomically (data will stop flowing through all unbound streams on the same device at the same time).
+--
+--     Unbinding a stream that isn\'t bound to a device is a legal no-op.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindAudioStreams'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnbindAudioStreams@.
+--                   The unsafe flavor is 'unbindAudioStreams'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UnbindAudioStreams@, defined at @SDL3\/SDL_audio.h 1015:34@
+unbindAudioStreamsSafe
+  :: PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -- ^
+  --
+  --           [@streams@]: an array of audio streams to unbind. Can be NULL or contain NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_streams@]: number streams listed in the @streams@ array.
+  -> IO ()
+unbindAudioStreamsSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_UnbindAudioStreams x00 (Coerce.coerce x11)
+
+-- | Unbind a single audio stream from its audio device.
+--
+--     This is a convenience function, equivalent to calling @'unbindAudioStreams' (&stream, 1)@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnbindAudioStream@.
+--                   The safe flavor is 'unbindAudioStreamSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UnbindAudioStream@, defined at @SDL3\/SDL_audio.h 1031:34@
+unbindAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: an audio stream to unbind from a device. Can be NULL.
+  -> IO ()
+unbindAudioStream = Unsafe.sDL_UnbindAudioStream
+
+-- | Unbind a single audio stream from its audio device.
+--
+--     This is a convenience function, equivalent to calling @'unbindAudioStreams' (&stream, 1)@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnbindAudioStream@.
+--                   The unsafe flavor is 'unbindAudioStream'
+--                   .
+--
+--     [C declaration]: @SDL_UnbindAudioStream@, defined at @SDL3\/SDL_audio.h 1031:34@
+unbindAudioStreamSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: an audio stream to unbind from a device. Can be NULL.
+  -> IO ()
+unbindAudioStreamSafe = Safe.sDL_UnbindAudioStream
+
+-- | Query an audio stream for its currently-bound device.
+--
+--     This reports the logical audio device that an audio stream is currently bound to.
+--
+--     If not bound, or invalid, this returns zero, which is not a valid device ID.
+--
+--     [Returns]: the bound audio device, or 0 if not bound or invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindAudioStream', 'bindAudioStreams'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioStreamDevice@.
+--                   The safe flavor is 'getAudioStreamDeviceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1052:47@
+getAudioStreamDevice
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO SDL_AudioDeviceID
+getAudioStreamDevice =
+  Unsafe.sDL_GetAudioStreamDevice
+
+-- | Query an audio stream for its currently-bound device.
+--
+--     This reports the logical audio device that an audio stream is currently bound to.
+--
+--     If not bound, or invalid, this returns zero, which is not a valid device ID.
+--
+--     [Returns]: the bound audio device, or 0 if not bound or invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindAudioStream', 'bindAudioStreams'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioStreamDevice@.
+--                   The unsafe flavor is 'getAudioStreamDevice'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1052:47@
+getAudioStreamDeviceSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO SDL_AudioDeviceID
+getAudioStreamDeviceSafe =
+  Safe.sDL_GetAudioStreamDevice
+
+-- | Create a new audio stream.
+--
+--     [Returns]: a new audio stream on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'putAudioStreamData', 'getAudioStreamData', 'getAudioStreamAvailable', 'flushAudioStream', 'clearAudioStream', 'setAudioStreamFormat', 'destroyAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateAudioStream@.
+--                   The safe flavor is 'createAudioStreamSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateAudioStream@, defined at @SDL3\/SDL_audio.h 1074:47@
+createAudioStream
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the format details of the input audio.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the format details of the output audio.
+  -> IO (BG.Ptr SDL_AudioStream)
+createAudioStream = Unsafe.sDL_CreateAudioStream
+
+-- | Create a new audio stream.
+--
+--     [Returns]: a new audio stream on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'putAudioStreamData', 'getAudioStreamData', 'getAudioStreamAvailable', 'flushAudioStream', 'clearAudioStream', 'setAudioStreamFormat', 'destroyAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateAudioStream@.
+--                   The unsafe flavor is 'createAudioStream'
+--                   .
+--
+--     [C declaration]: @SDL_CreateAudioStream@, defined at @SDL3\/SDL_audio.h 1074:47@
+createAudioStreamSafe
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the format details of the input audio.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the format details of the output audio.
+  -> IO (BG.Ptr SDL_AudioStream)
+createAudioStreamSafe = Safe.sDL_CreateAudioStream
+
+-- | Get the properties associated with an audio stream.
+--
+--     The application can hang any data it wants here, but the following properties are understood by SDL:
+--
+--     * @'sDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN'@: if true (the default), the stream be automatically cleaned up when the audio subsystem quits. If set to false, the streams will persist beyond that. This property is ignored for streams created through @'openAudioDeviceStream'@, and will always be cleaned up. Streams that are not cleaned up will still be unbound from devices when the audio subsystem quits. This property was added in SDL 3.4.0.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioStreamProperties@.
+--                   The safe flavor is 'getAudioStreamPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioStreamProperties@, defined at @SDL3\/SDL_audio.h 1098:46@
+getAudioStreamProperties
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getAudioStreamProperties =
+  Unsafe.sDL_GetAudioStreamProperties
+
+-- | Get the properties associated with an audio stream.
+--
+--     The application can hang any data it wants here, but the following properties are understood by SDL:
+--
+--     * @'sDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN'@: if true (the default), the stream be automatically cleaned up when the audio subsystem quits. If set to false, the streams will persist beyond that. This property is ignored for streams created through @'openAudioDeviceStream'@, and will always be cleaned up. Streams that are not cleaned up will still be unbound from devices when the audio subsystem quits. This property was added in SDL 3.4.0.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioStreamProperties@.
+--                   The unsafe flavor is 'getAudioStreamProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioStreamProperties@, defined at @SDL3\/SDL_audio.h 1098:46@
+getAudioStreamPropertiesSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getAudioStreamPropertiesSafe =
+  Safe.sDL_GetAudioStreamProperties
+
+-- | Query the current format of an audio stream.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioStreamFormat@.
+--                   The safe flavor is 'getAudioStreamFormatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamFormat@, defined at @SDL3\/SDL_audio.h 1119:34@
+getAudioStreamFormat
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: where to store the input audio format; ignored if NULL.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: where to store the output audio format; ignored if NULL.
+  -> IO Bool
+getAudioStreamFormat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetAudioStreamFormat x00 x11 x22)
+
+-- | Query the current format of an audio stream.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioStreamFormat@.
+--                   The unsafe flavor is 'getAudioStreamFormat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamFormat@, defined at @SDL3\/SDL_audio.h 1119:34@
+getAudioStreamFormatSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: where to store the input audio format; ignored if NULL.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: where to store the output audio format; ignored if NULL.
+  -> IO Bool
+getAudioStreamFormatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetAudioStreamFormat x00 x11 x22)
+
+-- | Change the input and output formats of an audio stream.
+--
+--     Future calls to and 'getAudioStreamAvailable' and 'getAudioStreamData' will reflect the new format, and future calls to 'putAudioStreamData' must provide data in the new input formats.
+--
+--     Data that was previously queued in the stream will still be operated on in the format that was current when it was added, which is to say you can put the end of a sound file in one format to a stream, change formats for the next sound file, and start putting that new data while the previous sound file is still queued, and everything will still play back correctly.
+--
+--     If a stream is bound to a device, then the format of the side of the stream bound to a device cannot be changed (src_spec for recording devices, dst_spec for playback devices). Attempts to make a change to this side will be ignored, but this will not report an error. The other side\'s format can be changed.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamFormat', 'setAudioStreamFrequencyRatio'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAudioStreamFormat@.
+--                   The safe flavor is 'setAudioStreamFormatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamFormat@, defined at @SDL3\/SDL_audio.h 1156:34@
+setAudioStreamFormat
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the format is being changed.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the new format of the audio input; if NULL, it is not changed.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the new format of the audio output; if NULL, it is not changed.
+  -> IO Bool
+setAudioStreamFormat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetAudioStreamFormat x00 x11 x22)
+
+-- | Change the input and output formats of an audio stream.
+--
+--     Future calls to and 'getAudioStreamAvailable' and 'getAudioStreamData' will reflect the new format, and future calls to 'putAudioStreamData' must provide data in the new input formats.
+--
+--     Data that was previously queued in the stream will still be operated on in the format that was current when it was added, which is to say you can put the end of a sound file in one format to a stream, change formats for the next sound file, and start putting that new data while the previous sound file is still queued, and everything will still play back correctly.
+--
+--     If a stream is bound to a device, then the format of the side of the stream bound to a device cannot be changed (src_spec for recording devices, dst_spec for playback devices). Attempts to make a change to this side will be ignored, but this will not report an error. The other side\'s format can be changed.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamFormat', 'setAudioStreamFrequencyRatio'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAudioStreamFormat@.
+--                   The unsafe flavor is 'setAudioStreamFormat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamFormat@, defined at @SDL3\/SDL_audio.h 1156:34@
+setAudioStreamFormatSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the format is being changed.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the new format of the audio input; if NULL, it is not changed.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the new format of the audio output; if NULL, it is not changed.
+  -> IO Bool
+setAudioStreamFormatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetAudioStreamFormat x00 x11 x22)
+
+-- | Get the frequency ratio of an audio stream.
+--
+--     [Returns]: the frequency ratio of the stream or 0.0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamFrequencyRatio'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioStreamFrequencyRatio@.
+--                   The safe flavor is 'getAudioStreamFrequencyRatioSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamFrequencyRatio@, defined at @SDL3\/SDL_audio.h 1172:35@
+getAudioStreamFrequencyRatio
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO Float
+getAudioStreamFrequencyRatio =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetAudioStreamFrequencyRatio x00)
+
+-- | Get the frequency ratio of an audio stream.
+--
+--     [Returns]: the frequency ratio of the stream or 0.0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamFrequencyRatio'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioStreamFrequencyRatio@.
+--                   The unsafe flavor is 'getAudioStreamFrequencyRatio'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamFrequencyRatio@, defined at @SDL3\/SDL_audio.h 1172:35@
+getAudioStreamFrequencyRatioSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO Float
+getAudioStreamFrequencyRatioSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetAudioStreamFrequencyRatio x00)
+
+-- | Change the frequency ratio of an audio stream.
+--
+--     The frequency ratio is used to adjust the rate at which input data is consumed. Changing this effectively modifies the speed and pitch of the audio. A value greater than 1.0f will play the audio faster, and at a higher pitch. A value less than 1.0f will play the audio slower, and at a lower pitch. 1.0f means play at normal speed.
+--
+--     This is applied during 'getAudioStreamData', and can be continuously changed to create various effects.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamFrequencyRatio', 'setAudioStreamFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAudioStreamFrequencyRatio@.
+--                   The safe flavor is 'setAudioStreamFrequencyRatioSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamFrequencyRatio@, defined at @SDL3\/SDL_audio.h 1200:34@
+setAudioStreamFrequencyRatio
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream on which the frequency ratio is being changed.
+  -> Float
+  -- ^
+  --
+  --           [@ratio@]: the frequency ratio. 1.0 is normal speed. Must be between 0.01 and 100.
+  -> IO Bool
+setAudioStreamFrequencyRatio =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetAudioStreamFrequencyRatio x00 (Coerce.coerce x11))
+
+-- | Change the frequency ratio of an audio stream.
+--
+--     The frequency ratio is used to adjust the rate at which input data is consumed. Changing this effectively modifies the speed and pitch of the audio. A value greater than 1.0f will play the audio faster, and at a higher pitch. A value less than 1.0f will play the audio slower, and at a lower pitch. 1.0f means play at normal speed.
+--
+--     This is applied during 'getAudioStreamData', and can be continuously changed to create various effects.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamFrequencyRatio', 'setAudioStreamFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAudioStreamFrequencyRatio@.
+--                   The unsafe flavor is 'setAudioStreamFrequencyRatio'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamFrequencyRatio@, defined at @SDL3\/SDL_audio.h 1200:34@
+setAudioStreamFrequencyRatioSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream on which the frequency ratio is being changed.
+  -> Float
+  -- ^
+  --
+  --           [@ratio@]: the frequency ratio. 1.0 is normal speed. Must be between 0.01 and 100.
+  -> IO Bool
+setAudioStreamFrequencyRatioSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetAudioStreamFrequencyRatio x00 (Coerce.coerce x11))
+
+-- | Get the gain of an audio stream.
+--
+--     The gain of a stream is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio streams default to a gain of 1.0f (no change in output).
+--
+--     [Returns]: the gain of the stream or -1.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamGain'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioStreamGain@.
+--                   The safe flavor is 'getAudioStreamGainSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamGain@, defined at @SDL3\/SDL_audio.h 1221:35@
+getAudioStreamGain
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO Float
+getAudioStreamGain =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetAudioStreamGain x00)
+
+-- | Get the gain of an audio stream.
+--
+--     The gain of a stream is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio streams default to a gain of 1.0f (no change in output).
+--
+--     [Returns]: the gain of the stream or -1.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamGain'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioStreamGain@.
+--                   The unsafe flavor is 'getAudioStreamGain'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamGain@, defined at @SDL3\/SDL_audio.h 1221:35@
+getAudioStreamGainSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO Float
+getAudioStreamGainSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetAudioStreamGain x00)
+
+-- | Change the gain of an audio stream.
+--
+--     The gain of a stream is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio streams default to a gain of 1.0f (no change in output).
+--
+--     This is applied during 'getAudioStreamData', and can be continuously changed to create various effects.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamGain'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAudioStreamGain@.
+--                   The safe flavor is 'setAudioStreamGainSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamGain@, defined at @SDL3\/SDL_audio.h 1246:34@
+setAudioStreamGain
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream on which the gain is being changed.
+  -> Float
+  -- ^
+  --
+  --           [@gain@]: the gain. 1.0f is no change, 0.0f is silence.
+  -> IO Bool
+setAudioStreamGain =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetAudioStreamGain x00 (Coerce.coerce x11))
+
+-- | Change the gain of an audio stream.
+--
+--     The gain of a stream is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio streams default to a gain of 1.0f (no change in output).
+--
+--     This is applied during 'getAudioStreamData', and can be continuously changed to create various effects.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamGain'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAudioStreamGain@.
+--                   The unsafe flavor is 'setAudioStreamGain'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamGain@, defined at @SDL3\/SDL_audio.h 1246:34@
+setAudioStreamGainSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream on which the gain is being changed.
+  -> Float
+  -- ^
+  --
+  --           [@gain@]: the gain. 1.0f is no change, 0.0f is silence.
+  -> IO Bool
+setAudioStreamGainSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetAudioStreamGain x00 (Coerce.coerce x11))
+
+-- | Get the current input channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](https://wiki.libsdl.org/SDL3/CategoryAudio#channel-layouts).
+--
+--     Audio streams default to no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamInputChannelMap'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioStreamInputChannelMap@.
+--                   The safe flavor is 'getAudioStreamInputChannelMapSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioStreamInputChannelMap@, defined at @SDL3\/SDL_audio.h 1270:35@
+getAudioStreamInputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+getAudioStreamInputChannelMap =
+  Unsafe.sDL_GetAudioStreamInputChannelMap
+
+-- | Get the current input channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](https://wiki.libsdl.org/SDL3/CategoryAudio#channel-layouts).
+--
+--     Audio streams default to no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamInputChannelMap'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioStreamInputChannelMap@.
+--                   The unsafe flavor is 'getAudioStreamInputChannelMap'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioStreamInputChannelMap@, defined at @SDL3\/SDL_audio.h 1270:35@
+getAudioStreamInputChannelMapSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+getAudioStreamInputChannelMapSafe =
+  Safe.sDL_GetAudioStreamInputChannelMap
+
+-- | Get the current output channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](https://wiki.libsdl.org/SDL3/CategoryAudio#channel-layouts).
+--
+--     Audio streams default to no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamInputChannelMap'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioStreamOutputChannelMap@.
+--                   The safe flavor is 'getAudioStreamOutputChannelMapSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioStreamOutputChannelMap@, defined at @SDL3\/SDL_audio.h 1294:35@
+getAudioStreamOutputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+getAudioStreamOutputChannelMap =
+  Unsafe.sDL_GetAudioStreamOutputChannelMap
+
+-- | Get the current output channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](https://wiki.libsdl.org/SDL3/CategoryAudio#channel-layouts).
+--
+--     Audio streams default to no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamInputChannelMap'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioStreamOutputChannelMap@.
+--                   The unsafe flavor is 'getAudioStreamOutputChannelMap'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioStreamOutputChannelMap@, defined at @SDL3\/SDL_audio.h 1294:35@
+getAudioStreamOutputChannelMapSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+getAudioStreamOutputChannelMapSafe =
+  Safe.sDL_GetAudioStreamOutputChannelMap
+
+-- | Set the current input channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](https://wiki.libsdl.org/SDL3/CategoryAudio#channel-layouts).
+--
+--     The input channel map reorders data that is added to a stream via 'putAudioStreamData'. Future calls to 'putAudioStreamData' must provide data in the new channel order.
+--
+--     Each item in the array represents an input channel, and its value is the channel that it should be remapped to. To reverse a stereo signal\'s left and right values, you\'d have an array of @{ 1, 0 }@. It is legal to remap multiple channels to the same thing, so @{ 1, 1 }@ would duplicate the right channel to both channels of a stereo signal. An element in the channel map set to -1 instead of a valid channel will mute that channel, setting it to a silence value.
+--
+--     You cannot change the number of channels through a channel map, just reorder\/mute them.
+--
+--     Data that was previously queued in the stream will still be operated on in the order that was current when it was added, which is to say you can put the end of a sound file in one order to a stream, change orders for the next sound file, and start putting that new data while the previous sound file is still queued, and everything will still play back correctly.
+--
+--     Audio streams default to no remapping applied. Passing a NULL channel map is legal, and turns off remapping.
+--
+--     SDL will copy the channel map; the caller does not have to save this array after this call.
+--
+--     If @count@ is not equal to the current number of channels in the audio stream\'s format, this will fail. This is a safety measure to make sure a race condition hasn\'t changed the format while this call is setting the channel map.
+--
+--     Unlike attempting to change the stream\'s format, the input channel map on a stream bound to a recording device is permitted to change at any time; any data added to the stream from the device after this call will have the new mapping, but previously-added data will still have the prior mapping.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running. Don\'t change the stream\'s format to have a different number of channels from a different thread at the same time, though!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamInputChannelMap'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAudioStreamInputChannelMap@.
+--                   The safe flavor is 'setAudioStreamInputChannelMapSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamInputChannelMap@, defined at @SDL3\/SDL_audio.h 1354:34@
+setAudioStreamInputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to change.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@chmap@]: the new channel map, NULL to reset to default.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: The number of channels in the map.
+  -> IO Bool
+setAudioStreamInputChannelMap =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetAudioStreamInputChannelMap x00 x11 (Coerce.coerce x22))
+
+-- | Set the current input channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](https://wiki.libsdl.org/SDL3/CategoryAudio#channel-layouts).
+--
+--     The input channel map reorders data that is added to a stream via 'putAudioStreamData'. Future calls to 'putAudioStreamData' must provide data in the new channel order.
+--
+--     Each item in the array represents an input channel, and its value is the channel that it should be remapped to. To reverse a stereo signal\'s left and right values, you\'d have an array of @{ 1, 0 }@. It is legal to remap multiple channels to the same thing, so @{ 1, 1 }@ would duplicate the right channel to both channels of a stereo signal. An element in the channel map set to -1 instead of a valid channel will mute that channel, setting it to a silence value.
+--
+--     You cannot change the number of channels through a channel map, just reorder\/mute them.
+--
+--     Data that was previously queued in the stream will still be operated on in the order that was current when it was added, which is to say you can put the end of a sound file in one order to a stream, change orders for the next sound file, and start putting that new data while the previous sound file is still queued, and everything will still play back correctly.
+--
+--     Audio streams default to no remapping applied. Passing a NULL channel map is legal, and turns off remapping.
+--
+--     SDL will copy the channel map; the caller does not have to save this array after this call.
+--
+--     If @count@ is not equal to the current number of channels in the audio stream\'s format, this will fail. This is a safety measure to make sure a race condition hasn\'t changed the format while this call is setting the channel map.
+--
+--     Unlike attempting to change the stream\'s format, the input channel map on a stream bound to a recording device is permitted to change at any time; any data added to the stream from the device after this call will have the new mapping, but previously-added data will still have the prior mapping.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running. Don\'t change the stream\'s format to have a different number of channels from a different thread at the same time, though!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamInputChannelMap'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAudioStreamInputChannelMap@.
+--                   The unsafe flavor is 'setAudioStreamInputChannelMap'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamInputChannelMap@, defined at @SDL3\/SDL_audio.h 1354:34@
+setAudioStreamInputChannelMapSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to change.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@chmap@]: the new channel map, NULL to reset to default.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: The number of channels in the map.
+  -> IO Bool
+setAudioStreamInputChannelMapSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetAudioStreamInputChannelMap x00 x11 (Coerce.coerce x22))
+
+-- | Set the current output channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](https://wiki.libsdl.org/SDL3/CategoryAudio#channel-layouts).
+--
+--     The output channel map reorders data that is leaving a stream via 'getAudioStreamData'.
+--
+--     Each item in the array represents an input channel, and its value is the channel that it should be remapped to. To reverse a stereo signal\'s left and right values, you\'d have an array of @{ 1, 0 }@. It is legal to remap multiple channels to the same thing, so @{ 1, 1 }@ would duplicate the right channel to both channels of a stereo signal. An element in the channel map set to -1 instead of a valid channel will mute that channel, setting it to a silence value.
+--
+--     You cannot change the number of channels through a channel map, just reorder\/mute them.
+--
+--     The output channel map can be changed at any time, as output remapping is applied during 'getAudioStreamData'.
+--
+--     Audio streams default to no remapping applied. Passing a NULL channel map is legal, and turns off remapping.
+--
+--     SDL will copy the channel map; the caller does not have to save this array after this call.
+--
+--     If @count@ is not equal to the current number of channels in the audio stream\'s format, this will fail. This is a safety measure to make sure a race condition hasn\'t changed the format while this call is setting the channel map.
+--
+--     Unlike attempting to change the stream\'s format, the output channel map on a stream bound to a recording device is permitted to change at any time; any data added to the stream after this call will have the new mapping, but previously-added data will still have the prior mapping. When the channel map doesn\'t match the hardware\'s channel layout, SDL will convert the data before feeding it to the device for playback.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running. Don\'t change the stream\'s format to have a different number of channels from a a different thread at the same time, though!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamInputChannelMap'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAudioStreamOutputChannelMap@.
+--                   The safe flavor is 'setAudioStreamOutputChannelMapSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamOutputChannelMap@, defined at @SDL3\/SDL_audio.h 1412:34@
+setAudioStreamOutputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to change.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@chmap@]: the new channel map, NULL to reset to default.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: The number of channels in the map.
+  -> IO Bool
+setAudioStreamOutputChannelMap =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetAudioStreamOutputChannelMap x00 x11 (Coerce.coerce x22))
+
+-- | Set the current output channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](https://wiki.libsdl.org/SDL3/CategoryAudio#channel-layouts).
+--
+--     The output channel map reorders data that is leaving a stream via 'getAudioStreamData'.
+--
+--     Each item in the array represents an input channel, and its value is the channel that it should be remapped to. To reverse a stereo signal\'s left and right values, you\'d have an array of @{ 1, 0 }@. It is legal to remap multiple channels to the same thing, so @{ 1, 1 }@ would duplicate the right channel to both channels of a stereo signal. An element in the channel map set to -1 instead of a valid channel will mute that channel, setting it to a silence value.
+--
+--     You cannot change the number of channels through a channel map, just reorder\/mute them.
+--
+--     The output channel map can be changed at any time, as output remapping is applied during 'getAudioStreamData'.
+--
+--     Audio streams default to no remapping applied. Passing a NULL channel map is legal, and turns off remapping.
+--
+--     SDL will copy the channel map; the caller does not have to save this array after this call.
+--
+--     If @count@ is not equal to the current number of channels in the audio stream\'s format, this will fail. This is a safety measure to make sure a race condition hasn\'t changed the format while this call is setting the channel map.
+--
+--     Unlike attempting to change the stream\'s format, the output channel map on a stream bound to a recording device is permitted to change at any time; any data added to the stream after this call will have the new mapping, but previously-added data will still have the prior mapping. When the channel map doesn\'t match the hardware\'s channel layout, SDL will convert the data before feeding it to the device for playback.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running. Don\'t change the stream\'s format to have a different number of channels from a a different thread at the same time, though!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamInputChannelMap'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAudioStreamOutputChannelMap@.
+--                   The unsafe flavor is 'setAudioStreamOutputChannelMap'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamOutputChannelMap@, defined at @SDL3\/SDL_audio.h 1412:34@
+setAudioStreamOutputChannelMapSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to change.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@chmap@]: the new channel map, NULL to reset to default.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: The number of channels in the map.
+  -> IO Bool
+setAudioStreamOutputChannelMapSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetAudioStreamOutputChannelMap x00 x11 (Coerce.coerce x22))
+
+-- | Add data to the stream.
+--
+--     This data must match the format\/channels\/samplerate specified in the latest call to 'setAudioStreamFormat', or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     Note that this call simply copies the unconverted data for later. This is different than SDL2, where data was converted during the Put call and the Get call would just dequeue the previously-converted data.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'clearAudioStream', 'flushAudioStream', 'getAudioStreamData', 'getAudioStreamQueued'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PutAudioStreamData@.
+--                   The safe flavor is 'putAudioStreamDataSafe'
+--                   : runs a registered put callback synchronously on the calling thread.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PutAudioStreamData@, defined at @SDL3\/SDL_audio.h 1442:34@
+putAudioStreamData
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@buf@]: a pointer to the audio data to add.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@len@]: the number of bytes to write to the stream.
+  -> IO Bool
+putAudioStreamData =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_PutAudioStreamData x00 x11 (Coerce.coerce x22))
+
+-- | Add data to the stream.
+--
+--     This data must match the format\/channels\/samplerate specified in the latest call to 'setAudioStreamFormat', or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     Note that this call simply copies the unconverted data for later. This is different than SDL2, where data was converted during the Put call and the Get call would just dequeue the previously-converted data.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'clearAudioStream', 'flushAudioStream', 'getAudioStreamData', 'getAudioStreamQueued'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PutAudioStreamData@.
+--                   The unsafe flavor is 'putAudioStreamData'
+--                   : runs a registered put callback synchronously on the calling thread.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PutAudioStreamData@, defined at @SDL3\/SDL_audio.h 1442:34@
+putAudioStreamDataSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@buf@]: a pointer to the audio data to add.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@len@]: the number of bytes to write to the stream.
+  -> IO Bool
+putAudioStreamDataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_PutAudioStreamData x00 x11 (Coerce.coerce x22))
+
+-- | Add external data to an audio stream without copying it.
+--
+--     Unlike @'putAudioStreamData'@, this function does not make a copy of the provided data, instead storing the provided pointer. This means that the put operation does not need to allocate and copy the data, but the original data must remain available until the stream is done with it, either by being read from the stream in its entirety, or a call to @'clearAudioStream'@ or @'destroyAudioStream'@.
+--
+--     The data must match the format\/channels\/samplerate specified in the latest call to 'setAudioStreamFormat', or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     An optional callback may be provided, which is called when the stream no longer needs the data. Once this callback fires, the stream will not access the data again. This callback will fire for any reason the data is no longer needed, including clearing or destroying the stream.
+--
+--     Note that there is still an allocation to store tracking information, so this function is more efficient for larger blocks of data. If you\'re planning to put a few samples at a time, it will be more efficient to use @'putAudioStreamData'@, which allocates and buffers in blocks.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'clearAudioStream', 'flushAudioStream', 'getAudioStreamData', 'getAudioStreamQueued'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PutAudioStreamDataNoCopy@.
+--                   The safe flavor is 'putAudioStreamDataNoCopySafe'
+--                   : completion callback is deferred; see the curated stream teardown entries.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PutAudioStreamDataNoCopy@, defined at @SDL3\/SDL_audio.h 1519:34@
+putAudioStreamDataNoCopy
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@buf@]: a pointer to the audio data to add.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@len@]: the number of bytes to add to the stream.
+  -> SDL_AudioStreamDataCompleteCallback
+  -- ^
+  --
+  --           [@callback@]: the callback function to call when the data is no longer needed by the stream. May be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO Bool
+putAudioStreamDataNoCopy =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_PutAudioStreamDataNoCopy x00 x11 (Coerce.coerce x22) x33 x44)
+
+-- | Add external data to an audio stream without copying it.
+--
+--     Unlike @'putAudioStreamData'@, this function does not make a copy of the provided data, instead storing the provided pointer. This means that the put operation does not need to allocate and copy the data, but the original data must remain available until the stream is done with it, either by being read from the stream in its entirety, or a call to @'clearAudioStream'@ or @'destroyAudioStream'@.
+--
+--     The data must match the format\/channels\/samplerate specified in the latest call to 'setAudioStreamFormat', or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     An optional callback may be provided, which is called when the stream no longer needs the data. Once this callback fires, the stream will not access the data again. This callback will fire for any reason the data is no longer needed, including clearing or destroying the stream.
+--
+--     Note that there is still an allocation to store tracking information, so this function is more efficient for larger blocks of data. If you\'re planning to put a few samples at a time, it will be more efficient to use @'putAudioStreamData'@, which allocates and buffers in blocks.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'clearAudioStream', 'flushAudioStream', 'getAudioStreamData', 'getAudioStreamQueued'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PutAudioStreamDataNoCopy@.
+--                   The unsafe flavor is 'putAudioStreamDataNoCopy'
+--                   : completion callback is deferred; see the curated stream teardown entries.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PutAudioStreamDataNoCopy@, defined at @SDL3\/SDL_audio.h 1519:34@
+putAudioStreamDataNoCopySafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@buf@]: a pointer to the audio data to add.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@len@]: the number of bytes to add to the stream.
+  -> SDL_AudioStreamDataCompleteCallback
+  -- ^
+  --
+  --           [@callback@]: the callback function to call when the data is no longer needed by the stream. May be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO Bool
+putAudioStreamDataNoCopySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_PutAudioStreamDataNoCopy x00 x11 (Coerce.coerce x22) x33 x44)
+
+-- | Add data to the stream with each channel in a separate array.
+--
+--     This data must match the format\/channels\/samplerate specified in the latest call to 'setAudioStreamFormat', or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     The data will be interleaved and queued. Note that 'SDL_AudioStream' only operates on interleaved data, so this is simply a convenience function for easily queueing data from sources that provide separate arrays. There is no equivalent function to retrieve planar data.
+--
+--     The arrays in @channel_buffers@ are ordered as they are to be interleaved; the first array will be the first sample in the interleaved data. Any individual array may be NULL; in this case, silence will be interleaved for that channel.
+--
+--     @num_channels@ specifies how many arrays are in @channel_buffers@. This can be used as a safety to prevent overflow, in case the stream format has changed elsewhere. If more channels are specified than the current input spec, they are ignored. If less channels are specified, the missing arrays are treated as if they are NULL (silence is written to those channels). If the count is -1, SDL will assume the array count matches the current input spec.
+--
+--     Note that @num_samples@ is the number of /samples per array/. This can also be thought of as the number of /sample frames/ to be queued. A value of 1 with stereo arrays will queue two samples to the stream. This is different than 'putAudioStreamData', which wants the size of a single array in bytes.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'clearAudioStream', 'flushAudioStream', 'getAudioStreamData', 'getAudioStreamQueued'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PutAudioStreamPlanarData@.
+--                   The safe flavor is 'putAudioStreamPlanarDataSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PutAudioStreamPlanarData@, defined at @SDL3\/SDL_audio.h 1572:34@
+putAudioStreamPlanarData
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst (PtrConst.PtrConst BG.Void)
+  -- ^
+  --
+  --           [@channel_buffers@]: a pointer to an array of arrays, one array per channel.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_channels@]: the number of arrays in @channel_buffers@ or -1.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_samples@]: the number of /samples/ per array to write to the stream.
+  -> IO Bool
+putAudioStreamPlanarData =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_PutAudioStreamPlanarData x00 x11 (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Add data to the stream with each channel in a separate array.
+--
+--     This data must match the format\/channels\/samplerate specified in the latest call to 'setAudioStreamFormat', or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     The data will be interleaved and queued. Note that 'SDL_AudioStream' only operates on interleaved data, so this is simply a convenience function for easily queueing data from sources that provide separate arrays. There is no equivalent function to retrieve planar data.
+--
+--     The arrays in @channel_buffers@ are ordered as they are to be interleaved; the first array will be the first sample in the interleaved data. Any individual array may be NULL; in this case, silence will be interleaved for that channel.
+--
+--     @num_channels@ specifies how many arrays are in @channel_buffers@. This can be used as a safety to prevent overflow, in case the stream format has changed elsewhere. If more channels are specified than the current input spec, they are ignored. If less channels are specified, the missing arrays are treated as if they are NULL (silence is written to those channels). If the count is -1, SDL will assume the array count matches the current input spec.
+--
+--     Note that @num_samples@ is the number of /samples per array/. This can also be thought of as the number of /sample frames/ to be queued. A value of 1 with stereo arrays will queue two samples to the stream. This is different than 'putAudioStreamData', which wants the size of a single array in bytes.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'clearAudioStream', 'flushAudioStream', 'getAudioStreamData', 'getAudioStreamQueued'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PutAudioStreamPlanarData@.
+--                   The unsafe flavor is 'putAudioStreamPlanarData'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PutAudioStreamPlanarData@, defined at @SDL3\/SDL_audio.h 1572:34@
+putAudioStreamPlanarDataSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst (PtrConst.PtrConst BG.Void)
+  -- ^
+  --
+  --           [@channel_buffers@]: a pointer to an array of arrays, one array per channel.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_channels@]: the number of arrays in @channel_buffers@ or -1.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_samples@]: the number of /samples/ per array to write to the stream.
+  -> IO Bool
+putAudioStreamPlanarDataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_PutAudioStreamPlanarData x00 x11 (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Get converted\/resampled data from the stream.
+--
+--     The input\/output data format\/channels\/samplerate is specified when creating the stream, and can be changed after creation by calling 'setAudioStreamFormat'.
+--
+--     Note that any conversion and resampling necessary is done during this call, and 'putAudioStreamData' simply queues unconverted data for later. This is different than SDL2, where that work was done while inputting new data to the stream and requesting the output just copied the converted data.
+--
+--     [Returns]: the number of bytes read from the stream or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'clearAudioStream', 'getAudioStreamAvailable', 'putAudioStreamData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioStreamData@.
+--                   The safe flavor is 'getAudioStreamDataSafe'
+--                   : runs a registered get callback synchronously on the calling thread.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamData@, defined at @SDL3\/SDL_audio.h 1602:33@
+getAudioStreamData
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio is being requested from.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@buf@]: a buffer to fill with audio data.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@len@]: the maximum number of bytes to fill.
+  -> IO BG.Int32
+getAudioStreamData =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_GetAudioStreamData x00 x11 (Coerce.coerce x22))
+
+-- | Get converted\/resampled data from the stream.
+--
+--     The input\/output data format\/channels\/samplerate is specified when creating the stream, and can be changed after creation by calling 'setAudioStreamFormat'.
+--
+--     Note that any conversion and resampling necessary is done during this call, and 'putAudioStreamData' simply queues unconverted data for later. This is different than SDL2, where that work was done while inputting new data to the stream and requesting the output just copied the converted data.
+--
+--     [Returns]: the number of bytes read from the stream or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'clearAudioStream', 'getAudioStreamAvailable', 'putAudioStreamData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioStreamData@.
+--                   The unsafe flavor is 'getAudioStreamData'
+--                   : runs a registered get callback synchronously on the calling thread.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamData@, defined at @SDL3\/SDL_audio.h 1602:33@
+getAudioStreamDataSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio is being requested from.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@buf@]: a buffer to fill with audio data.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@len@]: the maximum number of bytes to fill.
+  -> IO BG.Int32
+getAudioStreamDataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_GetAudioStreamData x00 x11 (Coerce.coerce x22))
+
+-- | Get the number of converted\/resampled bytes available.
+--
+--     The stream may be buffering data behind the scenes until it has enough to resample correctly, so this number might be lower than what you expect, or even be zero. Add more data or flush the stream if you need the data now.
+--
+--     If the stream has so much data that it would overflow an int, the return value is clamped to a maximum value, but no queued data is lost; if there are gigabytes of data queued, the app might need to read some of it with 'getAudioStreamData' before this function\'s return value is no longer clamped.
+--
+--     [Returns]: the number of converted\/resampled bytes available or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamData', 'putAudioStreamData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioStreamAvailable@.
+--                   The safe flavor is 'getAudioStreamAvailableSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamAvailable@, defined at @SDL3\/SDL_audio.h 1628:33@
+getAudioStreamAvailable
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO BG.Int32
+getAudioStreamAvailable =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetAudioStreamAvailable x00)
+
+-- | Get the number of converted\/resampled bytes available.
+--
+--     The stream may be buffering data behind the scenes until it has enough to resample correctly, so this number might be lower than what you expect, or even be zero. Add more data or flush the stream if you need the data now.
+--
+--     If the stream has so much data that it would overflow an int, the return value is clamped to a maximum value, but no queued data is lost; if there are gigabytes of data queued, the app might need to read some of it with 'getAudioStreamData' before this function\'s return value is no longer clamped.
+--
+--     [Returns]: the number of converted\/resampled bytes available or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamData', 'putAudioStreamData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioStreamAvailable@.
+--                   The unsafe flavor is 'getAudioStreamAvailable'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamAvailable@, defined at @SDL3\/SDL_audio.h 1628:33@
+getAudioStreamAvailableSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO BG.Int32
+getAudioStreamAvailableSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetAudioStreamAvailable x00)
+
+-- | Get the number of bytes currently queued.
+--
+--     This is the number of bytes put into a stream as input, not the number that can be retrieved as output. Because of several details, it\'s not possible to calculate one number directly from the other. If you need to know how much usable data can be retrieved right now, you should use @'getAudioStreamAvailable'@ and not this function.
+--
+--     Note that audio streams can change their input format at any time, even if there is still data queued in a different format, so the returned byte count will not necessarily match the number of /sample frames/ available. Users of this API should be aware of format changes they make when feeding a stream and plan accordingly.
+--
+--     Queued data is not converted until it is consumed by 'getAudioStreamData', so this value should be representative of the exact data that was put into the stream.
+--
+--     If the stream has so much data that it would overflow an int, the return value is clamped to a maximum value, but no queued data is lost; if there are gigabytes of data queued, the app might need to read some of it with 'getAudioStreamData' before this function\'s return value is no longer clamped.
+--
+--     [Returns]: the number of bytes queued or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'putAudioStreamData', 'clearAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioStreamQueued@.
+--                   The safe flavor is 'getAudioStreamQueuedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamQueued@, defined at @SDL3\/SDL_audio.h 1667:33@
+getAudioStreamQueued
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO BG.Int32
+getAudioStreamQueued =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetAudioStreamQueued x00)
+
+-- | Get the number of bytes currently queued.
+--
+--     This is the number of bytes put into a stream as input, not the number that can be retrieved as output. Because of several details, it\'s not possible to calculate one number directly from the other. If you need to know how much usable data can be retrieved right now, you should use @'getAudioStreamAvailable'@ and not this function.
+--
+--     Note that audio streams can change their input format at any time, even if there is still data queued in a different format, so the returned byte count will not necessarily match the number of /sample frames/ available. Users of this API should be aware of format changes they make when feeding a stream and plan accordingly.
+--
+--     Queued data is not converted until it is consumed by 'getAudioStreamData', so this value should be representative of the exact data that was put into the stream.
+--
+--     If the stream has so much data that it would overflow an int, the return value is clamped to a maximum value, but no queued data is lost; if there are gigabytes of data queued, the app might need to read some of it with 'getAudioStreamData' before this function\'s return value is no longer clamped.
+--
+--     [Returns]: the number of bytes queued or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'putAudioStreamData', 'clearAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioStreamQueued@.
+--                   The unsafe flavor is 'getAudioStreamQueued'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetAudioStreamQueued@, defined at @SDL3\/SDL_audio.h 1667:33@
+getAudioStreamQueuedSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO BG.Int32
+getAudioStreamQueuedSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetAudioStreamQueued x00)
+
+-- | Tell the stream that you\'re done sending data, and anything being buffered should be converted\/resampled and made available immediately.
+--
+--     It is legal to add more data to a stream after flushing, but there may be audio gaps in the output. Generally this is intended to signal the end of input, so the complete output becomes available.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'putAudioStreamData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_FlushAudioStream@.
+--                   The safe flavor is 'flushAudioStreamSafe'
+--                   : may invoke a pending data-complete callback synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlushAudioStream@, defined at @SDL3\/SDL_audio.h 1688:34@
+flushAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to flush.
+  -> IO Bool
+flushAudioStream =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_FlushAudioStream x00)
+
+-- | Tell the stream that you\'re done sending data, and anything being buffered should be converted\/resampled and made available immediately.
+--
+--     It is legal to add more data to a stream after flushing, but there may be audio gaps in the output. Generally this is intended to signal the end of input, so the complete output becomes available.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'putAudioStreamData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_FlushAudioStream@.
+--                   The unsafe flavor is 'flushAudioStream'
+--                   : may invoke a pending data-complete callback synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlushAudioStream@, defined at @SDL3\/SDL_audio.h 1688:34@
+flushAudioStreamSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to flush.
+  -> IO Bool
+flushAudioStreamSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_FlushAudioStream x00)
+
+-- | Clear any pending data in the stream.
+--
+--     This drops any queued data, so there will be nothing to read from the stream until more is added.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamAvailable', 'getAudioStreamData', 'getAudioStreamQueued', 'putAudioStreamData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ClearAudioStream@.
+--                   The safe flavor is 'clearAudioStreamSafe'
+--                   : may invoke a pending data-complete callback synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearAudioStream@, defined at @SDL3\/SDL_audio.h 1709:34@
+clearAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to clear.
+  -> IO Bool
+clearAudioStream =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_ClearAudioStream x00)
+
+-- | Clear any pending data in the stream.
+--
+--     This drops any queued data, so there will be nothing to read from the stream until more is added.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamAvailable', 'getAudioStreamData', 'getAudioStreamQueued', 'putAudioStreamData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ClearAudioStream@.
+--                   The unsafe flavor is 'clearAudioStream'
+--                   : may invoke a pending data-complete callback synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearAudioStream@, defined at @SDL3\/SDL_audio.h 1709:34@
+clearAudioStreamSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to clear.
+  -> IO Bool
+clearAudioStreamSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_ClearAudioStream x00)
+
+-- | Use this function to pause audio playback on the audio device associated with an audio stream.
+--
+--     This function pauses audio processing for a given device. Any bound audio streams will not progress, and no audio will be generated. Pausing one device does not prevent other unpaused devices from running.
+--
+--     Pausing a device can be useful to halt all audio without unbinding all the audio streams. This might be useful while a game is paused, or a level is loading, etc.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resumeAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PauseAudioStreamDevice@.
+--                   The safe flavor is 'pauseAudioStreamDeviceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PauseAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1733:34@
+pauseAudioStreamDevice
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to pause.
+  -> IO Bool
+pauseAudioStreamDevice =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_PauseAudioStreamDevice x00)
+
+-- | Use this function to pause audio playback on the audio device associated with an audio stream.
+--
+--     This function pauses audio processing for a given device. Any bound audio streams will not progress, and no audio will be generated. Pausing one device does not prevent other unpaused devices from running.
+--
+--     Pausing a device can be useful to halt all audio without unbinding all the audio streams. This might be useful while a game is paused, or a level is loading, etc.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resumeAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PauseAudioStreamDevice@.
+--                   The unsafe flavor is 'pauseAudioStreamDevice'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PauseAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1733:34@
+pauseAudioStreamDeviceSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to pause.
+  -> IO Bool
+pauseAudioStreamDeviceSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_PauseAudioStreamDevice x00)
+
+-- | Use this function to unpause audio playback on the audio device associated with an audio stream.
+--
+--     This function unpauses audio processing for a given device that has previously been paused. Once unpaused, any bound audio streams will begin to progress again, and audio can be generated.
+--
+--     'openAudioDeviceStream' opens audio devices in a paused state, so this function call is required for audio playback to begin on such devices.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pauseAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ResumeAudioStreamDevice@.
+--                   The safe flavor is 'resumeAudioStreamDeviceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ResumeAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1756:34@
+resumeAudioStreamDevice
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to resume.
+  -> IO Bool
+resumeAudioStreamDevice =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_ResumeAudioStreamDevice x00)
+
+-- | Use this function to unpause audio playback on the audio device associated with an audio stream.
+--
+--     This function unpauses audio processing for a given device that has previously been paused. Once unpaused, any bound audio streams will begin to progress again, and audio can be generated.
+--
+--     'openAudioDeviceStream' opens audio devices in a paused state, so this function call is required for audio playback to begin on such devices.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pauseAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ResumeAudioStreamDevice@.
+--                   The unsafe flavor is 'resumeAudioStreamDevice'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ResumeAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1756:34@
+resumeAudioStreamDeviceSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to resume.
+  -> IO Bool
+resumeAudioStreamDeviceSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_ResumeAudioStreamDevice x00)
+
+-- | Use this function to query if an audio device associated with a stream is paused.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow.
+--
+--     [Returns]: true if device is valid and paused, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pauseAudioStreamDevice', 'resumeAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AudioStreamDevicePaused@.
+--                   The safe flavor is 'audioStreamDevicePausedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AudioStreamDevicePaused@, defined at @SDL3\/SDL_audio.h 1775:34@
+audioStreamDevicePaused
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to query.
+  -> IO Bool
+audioStreamDevicePaused =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_AudioStreamDevicePaused x00)
+
+-- | Use this function to query if an audio device associated with a stream is paused.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow.
+--
+--     [Returns]: true if device is valid and paused, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pauseAudioStreamDevice', 'resumeAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AudioStreamDevicePaused@.
+--                   The unsafe flavor is 'audioStreamDevicePaused'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AudioStreamDevicePaused@, defined at @SDL3\/SDL_audio.h 1775:34@
+audioStreamDevicePausedSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to query.
+  -> IO Bool
+audioStreamDevicePausedSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_AudioStreamDevicePaused x00)
+
+-- | Lock an audio stream for serialized access.
+--
+--     Each 'SDL_AudioStream' has an internal mutex it uses to protect its data structures from threading conflicts. This function allows an app to lock that mutex, which could be useful if registering callbacks on this stream.
+--
+--     One does not need to lock a stream to use in it most cases, as the stream manages this lock internally. However, this lock is held during callbacks, which may run from arbitrary threads at any time, so if an app needs to protect shared data during those callbacks, locking the stream guarantees that the callback is not running while the lock is held.
+--
+--     As this is just a wrapper over 'SDL3.Sys.Mutex.lockMutex' for an internal lock; it has all the same attributes (recursive locks are allowed, etc).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'unlockAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LockAudioStream@.
+--                   The safe flavor is 'lockAudioStreamSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LockAudioStream@, defined at @SDL3\/SDL_audio.h 1804:34@
+lockAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to lock.
+  -> IO Bool
+lockAudioStream =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_LockAudioStream x00)
+
+-- | Lock an audio stream for serialized access.
+--
+--     Each 'SDL_AudioStream' has an internal mutex it uses to protect its data structures from threading conflicts. This function allows an app to lock that mutex, which could be useful if registering callbacks on this stream.
+--
+--     One does not need to lock a stream to use in it most cases, as the stream manages this lock internally. However, this lock is held during callbacks, which may run from arbitrary threads at any time, so if an app needs to protect shared data during those callbacks, locking the stream guarantees that the callback is not running while the lock is held.
+--
+--     As this is just a wrapper over 'SDL3.Sys.Mutex.lockMutex' for an internal lock; it has all the same attributes (recursive locks are allowed, etc).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'unlockAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LockAudioStream@.
+--                   The unsafe flavor is 'lockAudioStream'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LockAudioStream@, defined at @SDL3\/SDL_audio.h 1804:34@
+lockAudioStreamSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to lock.
+  -> IO Bool
+lockAudioStreamSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_LockAudioStream x00)
+
+-- | Unlock an audio stream for serialized access.
+--
+--     This unlocks an audio stream after a call to 'lockAudioStream'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: You should only call this from the same thread that previously called 'lockAudioStream'.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnlockAudioStream@.
+--                   The safe flavor is 'unlockAudioStreamSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UnlockAudioStream@, defined at @SDL3\/SDL_audio.h 1823:34@
+unlockAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to unlock.
+  -> IO Bool
+unlockAudioStream =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_UnlockAudioStream x00)
+
+-- | Unlock an audio stream for serialized access.
+--
+--     This unlocks an audio stream after a call to 'lockAudioStream'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: You should only call this from the same thread that previously called 'lockAudioStream'.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnlockAudioStream@.
+--                   The unsafe flavor is 'unlockAudioStream'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UnlockAudioStream@, defined at @SDL3\/SDL_audio.h 1823:34@
+unlockAudioStreamSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to unlock.
+  -> IO Bool
+unlockAudioStreamSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_UnlockAudioStream x00)
+
+-- | Set a callback that runs when data is requested from an audio stream.
+--
+--     This callback is called /before/ data is obtained from the stream, giving the callback the chance to add more on-demand.
+--
+--     The callback can (optionally) call @'putAudioStreamData'@ to add more audio to the stream during this call; if needed, the request that triggered this callback will obtain the new data immediately.
+--
+--     The callback\'s @additional_amount@ argument is roughly how many bytes of /unconverted/ data (in the stream\'s input format) is needed by the caller, although this may overestimate a little for safety. This takes into account how much is already in the stream and only asks for any extra necessary to resolve the request, which means the callback may be asked for zero bytes, and a different amount on each call.
+--
+--     The callback is not required to supply exact amounts; it is allowed to supply too much or too little or none at all. The caller will get what\'s available, up to the amount they requested, regardless of this callback\'s outcome.
+--
+--     Clearing or flushing an audio stream does not call this callback.
+--
+--     This function obtains the stream\'s lock, which means any existing callback (get or put) in progress will finish running before setting the new callback.
+--
+--     Setting a NULL function turns off the callback.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information. This only fails if @stream@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamPutCallback'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAudioStreamGetCallback@.
+--                   The safe flavor is 'setAudioStreamGetCallbackSafe'
+--                   : registration; fires on the audio thread and synchronously during SDL_GetAudioStreamData.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamGetCallback@, defined at @SDL3\/SDL_audio.h 1911:34@
+setAudioStreamGetCallback
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to set the new callback on.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: the new callback function to call when data is requested from the stream.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO Bool
+setAudioStreamGetCallback =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetAudioStreamGetCallback x00 x11 x22)
+
+-- | Set a callback that runs when data is requested from an audio stream.
+--
+--     This callback is called /before/ data is obtained from the stream, giving the callback the chance to add more on-demand.
+--
+--     The callback can (optionally) call @'putAudioStreamData'@ to add more audio to the stream during this call; if needed, the request that triggered this callback will obtain the new data immediately.
+--
+--     The callback\'s @additional_amount@ argument is roughly how many bytes of /unconverted/ data (in the stream\'s input format) is needed by the caller, although this may overestimate a little for safety. This takes into account how much is already in the stream and only asks for any extra necessary to resolve the request, which means the callback may be asked for zero bytes, and a different amount on each call.
+--
+--     The callback is not required to supply exact amounts; it is allowed to supply too much or too little or none at all. The caller will get what\'s available, up to the amount they requested, regardless of this callback\'s outcome.
+--
+--     Clearing or flushing an audio stream does not call this callback.
+--
+--     This function obtains the stream\'s lock, which means any existing callback (get or put) in progress will finish running before setting the new callback.
+--
+--     Setting a NULL function turns off the callback.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information. This only fails if @stream@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamPutCallback'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAudioStreamGetCallback@.
+--                   The unsafe flavor is 'setAudioStreamGetCallback'
+--                   : registration; fires on the audio thread and synchronously during SDL_GetAudioStreamData.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamGetCallback@, defined at @SDL3\/SDL_audio.h 1911:34@
+setAudioStreamGetCallbackSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to set the new callback on.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: the new callback function to call when data is requested from the stream.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO Bool
+setAudioStreamGetCallbackSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetAudioStreamGetCallback x00 x11 x22)
+
+-- | Set a callback that runs when data is added to an audio stream.
+--
+--     This callback is called /after/ the data is added to the stream, giving the callback the chance to obtain it immediately.
+--
+--     The callback can (optionally) call @'getAudioStreamData'@ to obtain audio from the stream during this call.
+--
+--     The callback\'s @additional_amount@ argument is how many bytes of /converted/ data (in the stream\'s output format) was provided by the caller, although this may underestimate a little for safety. This value might be less than what is currently available in the stream, if data was already there, and might be less than the caller provided if the stream needs to keep a buffer to aid in resampling. Which means the callback may be provided with zero bytes, and a different amount on each call.
+--
+--     The callback may call 'getAudioStreamAvailable' to see the total amount currently available to read from the stream, instead of the total provided by the current call.
+--
+--     The callback is not required to obtain all data. It is allowed to read less or none at all. Anything not read now simply remains in the stream for later access.
+--
+--     Clearing or flushing an audio stream does not call this callback.
+--
+--     This function obtains the stream\'s lock, which means any existing callback (get or put) in progress will finish running before setting the new callback.
+--
+--     Setting a NULL function turns off the callback.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information. This only fails if @stream@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamGetCallback'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAudioStreamPutCallback@.
+--                   The safe flavor is 'setAudioStreamPutCallbackSafe'
+--                   : registration; fires on the audio thread and synchronously during SDL_PutAudioStreamData.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamPutCallback@, defined at @SDL3\/SDL_audio.h 1960:34@
+setAudioStreamPutCallback
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to set the new callback on.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: the new callback function to call when data is added to the stream.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO Bool
+setAudioStreamPutCallback =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetAudioStreamPutCallback x00 x11 x22)
+
+-- | Set a callback that runs when data is added to an audio stream.
+--
+--     This callback is called /after/ the data is added to the stream, giving the callback the chance to obtain it immediately.
+--
+--     The callback can (optionally) call @'getAudioStreamData'@ to obtain audio from the stream during this call.
+--
+--     The callback\'s @additional_amount@ argument is how many bytes of /converted/ data (in the stream\'s output format) was provided by the caller, although this may underestimate a little for safety. This value might be less than what is currently available in the stream, if data was already there, and might be less than the caller provided if the stream needs to keep a buffer to aid in resampling. Which means the callback may be provided with zero bytes, and a different amount on each call.
+--
+--     The callback may call 'getAudioStreamAvailable' to see the total amount currently available to read from the stream, instead of the total provided by the current call.
+--
+--     The callback is not required to obtain all data. It is allowed to read less or none at all. Anything not read now simply remains in the stream for later access.
+--
+--     Clearing or flushing an audio stream does not call this callback.
+--
+--     This function obtains the stream\'s lock, which means any existing callback (get or put) in progress will finish running before setting the new callback.
+--
+--     Setting a NULL function turns off the callback.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information. This only fails if @stream@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAudioStreamGetCallback'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAudioStreamPutCallback@.
+--                   The unsafe flavor is 'setAudioStreamPutCallback'
+--                   : registration; fires on the audio thread and synchronously during SDL_PutAudioStreamData.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioStreamPutCallback@, defined at @SDL3\/SDL_audio.h 1960:34@
+setAudioStreamPutCallbackSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to set the new callback on.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: the new callback function to call when data is added to the stream.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO Bool
+setAudioStreamPutCallbackSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetAudioStreamPutCallback x00 x11 x22)
+
+-- | Free an audio stream.
+--
+--     This will release all allocated data, including any audio that is still queued. You do not need to manually clear the stream first.
+--
+--     If this stream was bound to an audio device, it is unbound during this call. If this stream was created with 'openAudioDeviceStream', the audio device that was opened alongside this stream\'s creation will be closed, too.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyAudioStream@.
+--                   The safe flavor is 'destroyAudioStreamSafe'
+--                   : may invoke a pending data-complete callback synchronously.
+--
+--     [C declaration]: @SDL_DestroyAudioStream@, defined at @SDL3\/SDL_audio.h 1982:34@
+destroyAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to destroy.
+  -> IO ()
+destroyAudioStream = Unsafe.sDL_DestroyAudioStream
+
+-- | Free an audio stream.
+--
+--     This will release all allocated data, including any audio that is still queued. You do not need to manually clear the stream first.
+--
+--     If this stream was bound to an audio device, it is unbound during this call. If this stream was created with 'openAudioDeviceStream', the audio device that was opened alongside this stream\'s creation will be closed, too.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createAudioStream'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyAudioStream@.
+--                   The unsafe flavor is 'destroyAudioStream'
+--                   : may invoke a pending data-complete callback synchronously.
+--
+--     [C declaration]: @SDL_DestroyAudioStream@, defined at @SDL3\/SDL_audio.h 1982:34@
+destroyAudioStreamSafe
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to destroy.
+  -> IO ()
+destroyAudioStreamSafe = Safe.sDL_DestroyAudioStream
+
+-- | Convenience function for straightforward audio init for the common case.
+--
+--     If all your app intends to do is provide a single source of PCM audio, this function allows you to do all your audio setup in a single call.
+--
+--     This is also intended to be a clean means to migrate apps from SDL2.
+--
+--     This function will open an audio device, create a stream and bind it. Unlike other methods of setup, the audio device will be closed when this stream is destroyed, so the app can treat the returned 'SDL_AudioStream' as the only object needed to manage audio playback.
+--
+--     Also unlike other functions, the audio device begins paused. This is to map more closely to SDL2-style behavior, since there is no extra step here to bind a stream to begin audio flowing. The audio device should be resumed with @'resumeAudioStreamDevice'@.
+--
+--     This function works with both playback and recording devices.
+--
+--     The @spec@ parameter represents the app\'s side of the audio stream. That is, for recording audio, this will be the output format, and for playing audio, this will be the input format. If spec is NULL, the system will choose the format, and the app can use @'getAudioStreamFormat'@ to obtain this information later.
+--
+--     If you don\'t care about opening a specific audio device, you can (and probably /should/), use SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK for playback and SDL_AUDIO_DEVICE_DEFAULT_RECORDING for recording.
+--
+--     One can optionally provide a callback function; if NULL, the app is expected to queue audio data for playback (or unqueue audio data if capturing). Otherwise, the callback will begin to fire once the device is unpaused.
+--
+--     Destroying the returned stream with 'destroyAudioStream' will also close the audio device associated with this stream.
+--
+--     [Returns]: an audio stream on success, ready to use, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. When done with this stream, call 'destroyAudioStream' to free resources and close the device.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamDevice', 'resumeAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenAudioDeviceStream@.
+--                   The safe flavor is 'openAudioDeviceStreamSafe'
+--                   : callback is optional (NULL bypass) and fires on the audio thread.
+--
+--     [C declaration]: @SDL_OpenAudioDeviceStream@, defined at @SDL3\/SDL_audio.h 2045:47@
+openAudioDeviceStream
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: the audio stream\'s data format. Can be NULL.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: a callback where the app will provide new data for playback, or receive new data for recording. Can be NULL, in which case the app will need to call 'putAudioStreamData' or 'getAudioStreamData' as necessary.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: app-controlled pointer passed to callback. Can be NULL. Ignored if callback is NULL.
+  -> IO (BG.Ptr SDL_AudioStream)
+openAudioDeviceStream =
+  Unsafe.sDL_OpenAudioDeviceStream
+
+-- | Convenience function for straightforward audio init for the common case.
+--
+--     If all your app intends to do is provide a single source of PCM audio, this function allows you to do all your audio setup in a single call.
+--
+--     This is also intended to be a clean means to migrate apps from SDL2.
+--
+--     This function will open an audio device, create a stream and bind it. Unlike other methods of setup, the audio device will be closed when this stream is destroyed, so the app can treat the returned 'SDL_AudioStream' as the only object needed to manage audio playback.
+--
+--     Also unlike other functions, the audio device begins paused. This is to map more closely to SDL2-style behavior, since there is no extra step here to bind a stream to begin audio flowing. The audio device should be resumed with @'resumeAudioStreamDevice'@.
+--
+--     This function works with both playback and recording devices.
+--
+--     The @spec@ parameter represents the app\'s side of the audio stream. That is, for recording audio, this will be the output format, and for playing audio, this will be the input format. If spec is NULL, the system will choose the format, and the app can use @'getAudioStreamFormat'@ to obtain this information later.
+--
+--     If you don\'t care about opening a specific audio device, you can (and probably /should/), use SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK for playback and SDL_AUDIO_DEVICE_DEFAULT_RECORDING for recording.
+--
+--     One can optionally provide a callback function; if NULL, the app is expected to queue audio data for playback (or unqueue audio data if capturing). Otherwise, the callback will begin to fire once the device is unpaused.
+--
+--     Destroying the returned stream with 'destroyAudioStream' will also close the audio device associated with this stream.
+--
+--     [Returns]: an audio stream on success, ready to use, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. When done with this stream, call 'destroyAudioStream' to free resources and close the device.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAudioStreamDevice', 'resumeAudioStreamDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenAudioDeviceStream@.
+--                   The unsafe flavor is 'openAudioDeviceStream'
+--                   : callback is optional (NULL bypass) and fires on the audio thread.
+--
+--     [C declaration]: @SDL_OpenAudioDeviceStream@, defined at @SDL3\/SDL_audio.h 2045:47@
+openAudioDeviceStreamSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: the audio stream\'s data format. Can be NULL.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: a callback where the app will provide new data for playback, or receive new data for recording. Can be NULL, in which case the app will need to call 'putAudioStreamData' or 'getAudioStreamData' as necessary.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: app-controlled pointer passed to callback. Can be NULL. Ignored if callback is NULL.
+  -> IO (BG.Ptr SDL_AudioStream)
+openAudioDeviceStreamSafe =
+  Safe.sDL_OpenAudioDeviceStream
+
+-- | Set a callback that fires when data is about to be fed to an audio device.
+--
+--     This is useful for accessing the final mix, perhaps for writing a visualizer or applying a final effect to the audio data before playback.
+--
+--     The buffer is the final mix of all bound audio streams on an opened device; this callback will fire regularly for any device that is both opened and unpaused. If there is no new data to mix, either because no streams are bound to the device or all the streams are empty, this callback will still fire with the entire buffer set to silence.
+--
+--     This callback is allowed to make changes to the data; the contents of the buffer after this call is what is ultimately passed along to the hardware.
+--
+--     The callback is always provided the data in float format (values from -1.0f to 1.0f), but the number of channels or sample rate may be different than the format the app requested when opening the device; SDL might have had to manage a conversion behind the scenes, or the playback might have jumped to new physical hardware when a system default changed, etc. These details may change between calls. Accordingly, the size of the buffer might change between calls as well.
+--
+--     This callback can run at any time, and from any thread; if you need to serialize access to your app\'s data, you should provide and use a mutex or other synchronization device.
+--
+--     All of this to say: there are specific needs this callback can fulfill, but it is not the simplest interface. Apps should generally provide audio in their preferred format through an 'SDL_AudioStream' and let SDL handle the difference.
+--
+--     This function is extremely time-sensitive; the callback should do the least amount of work possible and return as quickly as it can. The longer the callback runs, the higher the risk of audio dropouts or other problems.
+--
+--     This function will block until the audio device is in between iterations, so any existing callback that might be running will finish before this function sets the new callback and returns.
+--
+--     Setting a NULL callback function disables any previously-set callback.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAudioPostmixCallback@.
+--                   The safe flavor is 'setAudioPostmixCallbackSafe'
+--                   : registration; fires on the audio thread.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioPostmixCallback@, defined at @SDL3\/SDL_audio.h 2136:34@
+setAudioPostmixCallback
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the ID of an opened audio device.
+  -> SDL_AudioPostmixCallback
+  -- ^
+  --
+  --           [@callback@]: a callback function to be called. Can be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: app-controlled pointer passed to callback. Can be NULL.
+  -> IO Bool
+setAudioPostmixCallback =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetAudioPostmixCallback x00 x11 x22)
+
+-- | Set a callback that fires when data is about to be fed to an audio device.
+--
+--     This is useful for accessing the final mix, perhaps for writing a visualizer or applying a final effect to the audio data before playback.
+--
+--     The buffer is the final mix of all bound audio streams on an opened device; this callback will fire regularly for any device that is both opened and unpaused. If there is no new data to mix, either because no streams are bound to the device or all the streams are empty, this callback will still fire with the entire buffer set to silence.
+--
+--     This callback is allowed to make changes to the data; the contents of the buffer after this call is what is ultimately passed along to the hardware.
+--
+--     The callback is always provided the data in float format (values from -1.0f to 1.0f), but the number of channels or sample rate may be different than the format the app requested when opening the device; SDL might have had to manage a conversion behind the scenes, or the playback might have jumped to new physical hardware when a system default changed, etc. These details may change between calls. Accordingly, the size of the buffer might change between calls as well.
+--
+--     This callback can run at any time, and from any thread; if you need to serialize access to your app\'s data, you should provide and use a mutex or other synchronization device.
+--
+--     All of this to say: there are specific needs this callback can fulfill, but it is not the simplest interface. Apps should generally provide audio in their preferred format through an 'SDL_AudioStream' and let SDL handle the difference.
+--
+--     This function is extremely time-sensitive; the callback should do the least amount of work possible and return as quickly as it can. The longer the callback runs, the higher the risk of audio dropouts or other problems.
+--
+--     This function will block until the audio device is in between iterations, so any existing callback that might be running will finish before this function sets the new callback and returns.
+--
+--     Setting a NULL callback function disables any previously-set callback.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAudioPostmixCallback@.
+--                   The unsafe flavor is 'setAudioPostmixCallback'
+--                   : registration; fires on the audio thread.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAudioPostmixCallback@, defined at @SDL3\/SDL_audio.h 2136:34@
+setAudioPostmixCallbackSafe
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the ID of an opened audio device.
+  -> SDL_AudioPostmixCallback
+  -- ^
+  --
+  --           [@callback@]: a callback function to be called. Can be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: app-controlled pointer passed to callback. Can be NULL.
+  -> IO Bool
+setAudioPostmixCallbackSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetAudioPostmixCallback x00 x11 x22)
+
+-- | Load the audio data of a WAVE file into memory.
+--
+--     Loading a WAVE file requires @src@, @spec@, @audio_buf@ and @audio_len@ to be valid pointers. The entire data portion of the file is then loaded into memory and decoded if necessary.
+--
+--     Supported formats are RIFF WAVE files with the formats PCM (8, 16, 24, and 32 bits), IEEE Float (32 bits), Microsoft ADPCM and IMA ADPCM (4 bits), and A-law and mu-law (8 bits). Other formats are currently unsupported and cause an error.
+--
+--     If this function succeeds, the return value is zero and the pointer to the audio data allocated by the function is written to @audio_buf@ and its length in bytes to @audio_len@. The 'SDL_AudioSpec' members @freq@, @channels@, and @format@ are set to the values of the audio data in the buffer.
+--
+--     It\'s necessary to use 'SDL3.Sys.Stdinc.free' to free the audio data returned in @audio_buf@ when it is no longer used.
+--
+--     Because of the underspecification of the .WAV format, there are many problematic files in the wild that cause issues with strict decoders. To provide compatibility with these files, this decoder is lenient in regards to the truncation of the file, the fact chunk, and the size of the RIFF chunk. The hints @SDL_HINT_WAVE_RIFF_CHUNK_SIZE@, @SDL_HINT_WAVE_TRUNCATION@, and @SDL_HINT_WAVE_FACT_CHUNK@ can be used to tune the behavior of the loading process.
+--
+--     Any file that is invalid (due to truncation, corruption, or wrong values in the headers), too big, or unsupported causes an error. Additionally, any critical I\/O error from the data source will terminate the loading process with an error. The function returns NULL on error and in all cases (with the exception of @src@ being NULL), an appropriate error message will be set.
+--
+--     It is required that the data source supports seeking.
+--
+--     Example:
+--
+--     @
+--     SDL_LoadWAV_IO(SDL_IOFromFile(\"sample.wav\", \"rb\"), true, &spec, &buf, &len);
+--     @
+--
+--     Note that the 'loadWAV' function does this same thing for you, but in a less messy way:
+--
+--     @
+--     SDL_LoadWAV(\"sample.wav\", &spec, &buf, &len);
+--     @
+--
+--     This function returns false if the .WAV file cannot be opened, uses an unknown data format, or is corrupt; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Returns]: true on success. @audio_buf@ will be filled with a pointer to an allocated buffer containing the audio data, and @audio_len@ is filled with the length of that audio buffer in bytes.
+--
+--     When the application is done with the data returned in @audio_buf@, it should call 'SDL3.Sys.Stdinc.free' to dispose of it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Stdinc.free', 'loadWAV'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadWAV_IO@.
+--                   The safe flavor is 'loadWAVIOSafe'
+--                   : reads the whole stream; a Haskell SDL_IOStreamInterface re-enters synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadWAV_IO@, defined at @SDL3\/SDL_audio.h 2217:34@
+loadWAVIO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data source for the WAVE data.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @src@ before returning, even in the case of an error.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: a pointer to an 'SDL_AudioSpec' that will be set to the WAVE data\'s format details on successful return.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@audio_buf@]: a pointer filled with the audio data, allocated by the function.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@audio_len@]: a pointer filled with the length of the audio data buffer in bytes.
+  -> IO Bool
+loadWAVIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_LoadWAV_IO x00 (CBool.fromBool x11) x22 x33 x44)
+
+-- | Load the audio data of a WAVE file into memory.
+--
+--     Loading a WAVE file requires @src@, @spec@, @audio_buf@ and @audio_len@ to be valid pointers. The entire data portion of the file is then loaded into memory and decoded if necessary.
+--
+--     Supported formats are RIFF WAVE files with the formats PCM (8, 16, 24, and 32 bits), IEEE Float (32 bits), Microsoft ADPCM and IMA ADPCM (4 bits), and A-law and mu-law (8 bits). Other formats are currently unsupported and cause an error.
+--
+--     If this function succeeds, the return value is zero and the pointer to the audio data allocated by the function is written to @audio_buf@ and its length in bytes to @audio_len@. The 'SDL_AudioSpec' members @freq@, @channels@, and @format@ are set to the values of the audio data in the buffer.
+--
+--     It\'s necessary to use 'SDL3.Sys.Stdinc.free' to free the audio data returned in @audio_buf@ when it is no longer used.
+--
+--     Because of the underspecification of the .WAV format, there are many problematic files in the wild that cause issues with strict decoders. To provide compatibility with these files, this decoder is lenient in regards to the truncation of the file, the fact chunk, and the size of the RIFF chunk. The hints @SDL_HINT_WAVE_RIFF_CHUNK_SIZE@, @SDL_HINT_WAVE_TRUNCATION@, and @SDL_HINT_WAVE_FACT_CHUNK@ can be used to tune the behavior of the loading process.
+--
+--     Any file that is invalid (due to truncation, corruption, or wrong values in the headers), too big, or unsupported causes an error. Additionally, any critical I\/O error from the data source will terminate the loading process with an error. The function returns NULL on error and in all cases (with the exception of @src@ being NULL), an appropriate error message will be set.
+--
+--     It is required that the data source supports seeking.
+--
+--     Example:
+--
+--     @
+--     SDL_LoadWAV_IO(SDL_IOFromFile(\"sample.wav\", \"rb\"), true, &spec, &buf, &len);
+--     @
+--
+--     Note that the 'loadWAV' function does this same thing for you, but in a less messy way:
+--
+--     @
+--     SDL_LoadWAV(\"sample.wav\", &spec, &buf, &len);
+--     @
+--
+--     This function returns false if the .WAV file cannot be opened, uses an unknown data format, or is corrupt; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Returns]: true on success. @audio_buf@ will be filled with a pointer to an allocated buffer containing the audio data, and @audio_len@ is filled with the length of that audio buffer in bytes.
+--
+--     When the application is done with the data returned in @audio_buf@, it should call 'SDL3.Sys.Stdinc.free' to dispose of it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Stdinc.free', 'loadWAV'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadWAV_IO@.
+--                   The unsafe flavor is 'loadWAVIO'
+--                   : reads the whole stream; a Haskell SDL_IOStreamInterface re-enters synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadWAV_IO@, defined at @SDL3\/SDL_audio.h 2217:34@
+loadWAVIOSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data source for the WAVE data.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @src@ before returning, even in the case of an error.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: a pointer to an 'SDL_AudioSpec' that will be set to the WAVE data\'s format details on successful return.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@audio_buf@]: a pointer filled with the audio data, allocated by the function.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@audio_len@]: a pointer filled with the length of the audio data buffer in bytes.
+  -> IO Bool
+loadWAVIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_LoadWAV_IO x00 (CBool.fromBool x11) x22 x33 x44)
+
+-- | Loads a WAV from a file path.
+--
+--     This is a convenience function that is effectively the same as:
+--
+--     @
+--     SDL_LoadWAV_IO(SDL_IOFromFile(path, \"rb\"), true, spec, audio_buf, audio_len);
+--     @
+--
+--     This function returns false if the .WAV file cannot be opened, uses an unknown data format, or is corrupt; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Returns]: true on success. @audio_buf@ will be filled with a pointer to an allocated buffer containing the audio data, and @audio_len@ is filled with the length of that audio buffer in bytes.
+--
+--     When the application is done with the data returned in @audio_buf@, it should call 'SDL3.Sys.Stdinc.free' to dispose of it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Stdinc.free', 'loadWAVIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadWAV@.
+--                   The safe flavor is 'loadWAVSafe'
+--                   : blocks on whole-file I\/O.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadWAV@, defined at @SDL3\/SDL_audio.h 2253:34@
+loadWAV
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the file path of the WAV file to open.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: a pointer to an 'SDL_AudioSpec' that will be set to the WAVE data\'s format details on successful return.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@audio_buf@]: a pointer filled with the audio data, allocated by the function.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@audio_len@]: a pointer filled with the length of the audio data buffer in bytes.
+  -> IO Bool
+loadWAV =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_LoadWAV x00 x11 x22 x33)
+
+-- | Loads a WAV from a file path.
+--
+--     This is a convenience function that is effectively the same as:
+--
+--     @
+--     SDL_LoadWAV_IO(SDL_IOFromFile(path, \"rb\"), true, spec, audio_buf, audio_len);
+--     @
+--
+--     This function returns false if the .WAV file cannot be opened, uses an unknown data format, or is corrupt; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Returns]: true on success. @audio_buf@ will be filled with a pointer to an allocated buffer containing the audio data, and @audio_len@ is filled with the length of that audio buffer in bytes.
+--
+--     When the application is done with the data returned in @audio_buf@, it should call 'SDL3.Sys.Stdinc.free' to dispose of it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Stdinc.free', 'loadWAVIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadWAV@.
+--                   The unsafe flavor is 'loadWAV'
+--                   : blocks on whole-file I\/O.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadWAV@, defined at @SDL3\/SDL_audio.h 2253:34@
+loadWAVSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the file path of the WAV file to open.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: a pointer to an 'SDL_AudioSpec' that will be set to the WAVE data\'s format details on successful return.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@audio_buf@]: a pointer filled with the audio data, allocated by the function.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@audio_len@]: a pointer filled with the length of the audio data buffer in bytes.
+  -> IO Bool
+loadWAVSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_LoadWAV x00 x11 x22 x33)
+
+-- | Mix audio data in a specified format.
+--
+--     This takes an audio buffer @src@ of @len@ bytes of @format@ data and mixes it into @dst@, performing addition, volume adjustment, and overflow clipping. The buffer pointed to by @dst@ must also be @len@ bytes of @format@ data.
+--
+--     This is provided for convenience you can mix your own audio data.
+--
+--     Do not use this function for mixing together more than two streams of sample data. The output from repeated application of this function may be distorted by clipping, because there is no accumulator with greater range than the input (not to mention this being an inefficient way of doing it).
+--
+--     It is a common misconception that this function is required to write audio data to an output stream in an audio callback. While you can do that, @'mixAudio'@ is really only needed when you\'re mixing a single audio stream with a volume adjustment.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MixAudio@.
+--                   The safe flavor is 'mixAudioSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MixAudio@, defined at @SDL3\/SDL_audio.h 2289:34@
+mixAudio
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@dst@]: the destination for the mixed audio.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@src@]: the source audio buffer to be mixed.
+  -> SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the 'SDL_AudioFormat' structure representing the desired audio format.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@len@]: the length of the audio buffer in bytes.
+  -> Float
+  -- ^
+  --
+  --           [@volume@]: ranges from 0.0 - 1.0, and should be set to 1.0 for full audio volume.
+  -> IO Bool
+mixAudio =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_MixAudio x00 x11 x22 (Coerce.coerce x33) (Coerce.coerce x44))
+
+-- | Mix audio data in a specified format.
+--
+--     This takes an audio buffer @src@ of @len@ bytes of @format@ data and mixes it into @dst@, performing addition, volume adjustment, and overflow clipping. The buffer pointed to by @dst@ must also be @len@ bytes of @format@ data.
+--
+--     This is provided for convenience you can mix your own audio data.
+--
+--     Do not use this function for mixing together more than two streams of sample data. The output from repeated application of this function may be distorted by clipping, because there is no accumulator with greater range than the input (not to mention this being an inefficient way of doing it).
+--
+--     It is a common misconception that this function is required to write audio data to an output stream in an audio callback. While you can do that, @'mixAudio'@ is really only needed when you\'re mixing a single audio stream with a volume adjustment.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MixAudio@.
+--                   The unsafe flavor is 'mixAudio'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MixAudio@, defined at @SDL3\/SDL_audio.h 2289:34@
+mixAudioSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@dst@]: the destination for the mixed audio.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@src@]: the source audio buffer to be mixed.
+  -> SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the 'SDL_AudioFormat' structure representing the desired audio format.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@len@]: the length of the audio buffer in bytes.
+  -> Float
+  -- ^
+  --
+  --           [@volume@]: ranges from 0.0 - 1.0, and should be set to 1.0 for full audio volume.
+  -> IO Bool
+mixAudioSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_MixAudio x00 x11 x22 (Coerce.coerce x33) (Coerce.coerce x44))
+
+-- | Convert some audio data of one format to another format.
+--
+--     Please note that this function is for convenience, but should not be used to resample audio in blocks, as it will introduce audio artifacts on the boundaries. You should only use this function if you are converting audio data in its entirety in one call. If you want to convert audio in smaller chunks, use an 'SDL_AudioStream', which is designed for this situation.
+--
+--     Internally, this function creates and destroys an 'SDL_AudioStream' on each use, so it\'s also less efficient than using one directly, if you need to convert multiple times.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ConvertAudioSamples@.
+--                   The safe flavor is 'convertAudioSamplesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ConvertAudioSamples@, defined at @SDL3\/SDL_audio.h 2319:34@
+convertAudioSamples
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the format details of the input audio.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@src_data@]: the audio data to be converted.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@src_len@]: the len of src_data.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the format details of the output audio.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@dst_data@]: will be filled with a pointer to converted audio data, which should be freed with 'SDL3.Sys.Stdinc.free'. On error, it will be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dst_len@]: will be filled with the len of dst_data.
+  -> IO Bool
+convertAudioSamples =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Unsafe.sDL_ConvertAudioSamples x00 x11 (Coerce.coerce x22) x33 x44 x55)
+
+-- | Convert some audio data of one format to another format.
+--
+--     Please note that this function is for convenience, but should not be used to resample audio in blocks, as it will introduce audio artifacts on the boundaries. You should only use this function if you are converting audio data in its entirety in one call. If you want to convert audio in smaller chunks, use an 'SDL_AudioStream', which is designed for this situation.
+--
+--     Internally, this function creates and destroys an 'SDL_AudioStream' on each use, so it\'s also less efficient than using one directly, if you need to convert multiple times.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ConvertAudioSamples@.
+--                   The unsafe flavor is 'convertAudioSamples'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ConvertAudioSamples@, defined at @SDL3\/SDL_audio.h 2319:34@
+convertAudioSamplesSafe
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the format details of the input audio.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@src_data@]: the audio data to be converted.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@src_len@]: the len of src_data.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the format details of the output audio.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@dst_data@]: will be filled with a pointer to converted audio data, which should be freed with 'SDL3.Sys.Stdinc.free'. On error, it will be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dst_len@]: will be filled with the len of dst_data.
+  -> IO Bool
+convertAudioSamplesSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Safe.sDL_ConvertAudioSamples x00 x11 (Coerce.coerce x22) x33 x44 x55)
+
+-- | Get the human readable name of an audio format.
+--
+--     [Returns]: the human readable name of the specified audio format or \"SDL_AUDIO_UNKNOWN\" if the format isn\'t recognized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAudioFormatName@.
+--                   The safe flavor is 'getAudioFormatNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioFormatName@, defined at @SDL3\/SDL_audio.h 2332:42@
+getAudioFormatName
+  :: SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the audio format to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getAudioFormatName = Unsafe.sDL_GetAudioFormatName
+
+-- | Get the human readable name of an audio format.
+--
+--     [Returns]: the human readable name of the specified audio format or \"SDL_AUDIO_UNKNOWN\" if the format isn\'t recognized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAudioFormatName@.
+--                   The unsafe flavor is 'getAudioFormatName'
+--                   .
+--
+--     [C declaration]: @SDL_GetAudioFormatName@, defined at @SDL3\/SDL_audio.h 2332:42@
+getAudioFormatNameSafe
+  :: SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the audio format to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getAudioFormatNameSafe = Safe.sDL_GetAudioFormatName
+
+-- | Get the appropriate memset value for silencing an audio format.
+--
+--     The value returned by this function can be used as the second argument to memset (or SDL_memset) to set an audio buffer in a specific format to silence.
+--
+--     [Returns]: a byte value that can be passed to memset.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSilenceValueForFormat@.
+--                   The safe flavor is 'getSilenceValueForFormatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSilenceValueForFormat@, defined at @SDL3\/SDL_audio.h 2348:33@
+getSilenceValueForFormat
+  :: SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the audio data format to query.
+  -> IO BG.Int32
+getSilenceValueForFormat =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetSilenceValueForFormat x00)
+
+-- | Get the appropriate memset value for silencing an audio format.
+--
+--     The value returned by this function can be used as the second argument to memset (or SDL_memset) to set an audio buffer in a specific format to silence.
+--
+--     [Returns]: a byte value that can be passed to memset.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSilenceValueForFormat@.
+--                   The unsafe flavor is 'getSilenceValueForFormat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSilenceValueForFormat@, defined at @SDL3\/SDL_audio.h 2348:33@
+getSilenceValueForFormatSafe
+  :: SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the audio data format to query.
+  -> IO BG.Int32
+getSilenceValueForFormatSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetSilenceValueForFormat x00)
diff --git a/src/SDL3/Sys/Bindgen/Assert.hs b/src/SDL3/Sys/Bindgen/Assert.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Assert.hs
@@ -0,0 +1,631 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | A helpful assertion macro!
+--
+--     SDL assertions operate like your usual @assert@ macro, but with some added features:
+--
+--     * It uses a trick with the @sizeof@ operator, so disabled assertions vaporize out of the compiled code, but variables only referenced in the assertion won\'t trigger compiler warnings about being unused.
+--
+--     * It is safe to use with a dangling-else: @if (x) SDL_assert(y); else do_something();@
+--
+--     * It works the same everywhere, instead of counting on various platforms\' compiler and C runtime to behave.
+--
+--     * It provides multiple levels of assertion (SDL_assert, SDL_assert_release, SDL_assert_paranoid) instead of a single all-or-nothing option.
+--
+--     * It offers a variety of responses when an assertion fails (retry, trigger the debugger, abort the program, ignore the failure once, ignore it for the rest of the program\'s run).
+--
+--     * It tries to show the user a dialog by default, if possible, but the app can provide a callback to handle assertion failures however they like.
+--
+--     * It lets failed assertions be retried. Perhaps you had a network failure and just want to retry the test after plugging your network cable back in? You can.
+--
+--     * It lets the user ignore an assertion failure, if there\'s a harmless problem that one can continue past.
+--
+--     * It lets the user mark an assertion as ignored for the rest of the program\'s run; if there\'s a harmless problem that keeps popping up.
+--
+--     * It provides statistics and data on all failed assertions to the app.
+--
+--     * It allows the default assertion handler to be controlled with environment variables, in case an automated script needs to control it.
+--
+--     * It can be used as an aid to Clang\'s static analysis; it will treat SDL assertions as universally true (under the assumption that you are serious about the asserted claims and that your debug builds will detect when these claims were wrong). This can help the analyzer avoid false positives.
+--
+--     To use it: compile a debug build and just sprinkle around tests to check your code!
+module SDL3.Sys.Bindgen.Assert (
+  SDL3.Sys.Bindgen.Assert.sDL_ASSERT_LEVEL,
+  SDL3.Sys.Bindgen.Assert.sDL_NULL_WHILE_LOOP_CONDITION,
+  SDL3.Sys.Bindgen.Assert.SDL_AssertState (..),
+  pattern SDL3.Sys.Bindgen.Assert.SDL_ASSERTION_RETRY,
+  pattern SDL3.Sys.Bindgen.Assert.SDL_ASSERTION_BREAK,
+  pattern SDL3.Sys.Bindgen.Assert.SDL_ASSERTION_ABORT,
+  pattern SDL3.Sys.Bindgen.Assert.SDL_ASSERTION_IGNORE,
+  pattern SDL3.Sys.Bindgen.Assert.SDL_ASSERTION_ALWAYS_IGNORE,
+  SDL3.Sys.Bindgen.Assert.SDL_AssertData (..),
+  SDL3.Sys.Bindgen.Assert.SDL_AssertionHandler_Aux (..),
+  SDL3.Sys.Bindgen.Assert.SDL_AssertionHandler (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @macro SDL_ASSERT_LEVEL@, defined at @SDL3\/SDL_assert.h 101:9@
+sDL_ASSERT_LEVEL :: BG.CInt
+sDL_ASSERT_LEVEL = (2 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_NULL_WHILE_LOOP_CONDITION@, defined at @SDL3\/SDL_assert.h 273:9@
+sDL_NULL_WHILE_LOOP_CONDITION :: BG.CInt
+sDL_NULL_WHILE_LOOP_CONDITION = (0 :: BG.CInt)
+
+-- | Possible outcomes from a triggered assertion.
+--
+--     When an enabled assertion triggers, it may call the assertion handler (possibly one provided by the app via SDL_SetAssertionHandler), which will return one of these values, possibly after asking the user.
+--
+--     Then SDL will respond based on this outcome (loop around to retry the condition, try to break in a debugger, kill the program, or ignore the problem).
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_AssertState@, defined at @SDL3\/SDL_assert.h 306:14@
+newtype SDL_AssertState = SDL_AssertState
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_AssertState where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_AssertState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AssertState
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_AssertState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AssertState unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_AssertState instance BG.Storable SDL_AssertState
+
+deriving via BG.CUInt instance BG.Prim SDL_AssertState
+
+instance CEnum.CEnum SDL_AssertState where
+  type CEnumZ SDL_AssertState = BG.CUInt
+
+  toCEnum = SDL_AssertState
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_ASSERTION_RETRY")
+        , (1, BG.singleton "SDL_ASSERTION_BREAK")
+        , (2, BG.singleton "SDL_ASSERTION_ABORT")
+        , (3, BG.singleton "SDL_ASSERTION_IGNORE")
+        , (4, BG.singleton "SDL_ASSERTION_ALWAYS_IGNORE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_AssertState"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_AssertState"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_AssertState where
+  minDeclaredValue = SDL_ASSERTION_RETRY
+
+  maxDeclaredValue = SDL_ASSERTION_ALWAYS_IGNORE
+
+instance Show SDL_AssertState where
+  showsPrec = CEnum.shows
+
+instance Read SDL_AssertState where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_AssertState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AssertState{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AssertState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AssertState "unwrap" where
+  type CFieldType SDL_AssertState "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Retry the assert immediately.
+--
+--     [C declaration]: @SDL_ASSERTION_RETRY@, defined at @SDL3\/SDL_assert.h 308:5@
+pattern SDL_ASSERTION_RETRY :: SDL_AssertState
+pattern SDL_ASSERTION_RETRY = SDL_AssertState 0
+
+-- | Make the debugger trigger a breakpoint.
+--
+--     [C declaration]: @SDL_ASSERTION_BREAK@, defined at @SDL3\/SDL_assert.h 309:5@
+pattern SDL_ASSERTION_BREAK :: SDL_AssertState
+pattern SDL_ASSERTION_BREAK = SDL_AssertState 1
+
+-- | Terminate the program.
+--
+--     [C declaration]: @SDL_ASSERTION_ABORT@, defined at @SDL3\/SDL_assert.h 310:5@
+pattern SDL_ASSERTION_ABORT :: SDL_AssertState
+pattern SDL_ASSERTION_ABORT = SDL_AssertState 2
+
+-- | Ignore the assert.
+--
+--     [C declaration]: @SDL_ASSERTION_IGNORE@, defined at @SDL3\/SDL_assert.h 311:5@
+pattern SDL_ASSERTION_IGNORE :: SDL_AssertState
+pattern SDL_ASSERTION_IGNORE = SDL_AssertState 3
+
+-- | Ignore the assert from now on.
+--
+--     [C declaration]: @SDL_ASSERTION_ALWAYS_IGNORE@, defined at @SDL3\/SDL_assert.h 312:5@
+pattern SDL_ASSERTION_ALWAYS_IGNORE :: SDL_AssertState
+pattern SDL_ASSERTION_ALWAYS_IGNORE = SDL_AssertState 4
+
+-- | Information about an assertion failure.
+--
+--     This structure is filled in with information about a triggered assertion, used by the assertion handler, then added to the assertion report. This is returned as a linked list from @SDL_GetAssertionReport()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_AssertData@, defined at @SDL3\/SDL_assert.h 324:16@
+data SDL_AssertData = SDL_AssertData
+  { always_ignore :: BG.CBool
+  -- ^ true if app should always continue when assertion is triggered.
+  --
+  --          [C declaration]: @always_ignore@, defined at @SDL3\/SDL_assert.h 326:10@
+  , trigger_count :: BG.CUInt
+  -- ^ Number of times this assertion has been triggered.
+  --
+  --          [C declaration]: @trigger_count@, defined at @SDL3\/SDL_assert.h 327:18@
+  , condition :: PtrConst.PtrConst BG.CChar
+  -- ^ A string of this assert\'s test code.
+  --
+  --          [C declaration]: @condition@, defined at @SDL3\/SDL_assert.h 328:17@
+  , filename :: PtrConst.PtrConst BG.CChar
+  -- ^ The source file where this assert lives.
+  --
+  --          [C declaration]: @filename@, defined at @SDL3\/SDL_assert.h 329:17@
+  , linenum :: BG.CInt
+  -- ^ The line in @filename@ where this assert lives.
+  --
+  --          [C declaration]: @linenum@, defined at @SDL3\/SDL_assert.h 330:9@
+  , function :: PtrConst.PtrConst BG.CChar
+  -- ^ The name of the function where this assert lives.
+  --
+  --          [C declaration]: @function@, defined at @SDL3\/SDL_assert.h 331:17@
+  , next :: PtrConst.PtrConst SDL_AssertData
+  -- ^ next item in the linked list.
+  --
+  --          [C declaration]: @next@, defined at @SDL3\/SDL_assert.h 332:34@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_AssertData where
+  staticSizeOf = \_ -> (48 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_AssertData where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AssertData
+        <*> HasCField.readRaw (BG.Proxy @"always_ignore") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"trigger_count") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"condition") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"filename") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"linenum") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"function") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"next") ptr0
+
+instance Marshal.WriteRaw SDL_AssertData where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AssertData
+            always_ignore2
+            trigger_count3
+            condition4
+            filename5
+            linenum6
+            function7
+            next8 ->
+              HasCField.writeRaw (BG.Proxy @"always_ignore") ptr0 always_ignore2
+                >> HasCField.writeRaw (BG.Proxy @"trigger_count") ptr0 trigger_count3
+                >> HasCField.writeRaw (BG.Proxy @"condition") ptr0 condition4
+                >> HasCField.writeRaw (BG.Proxy @"filename") ptr0 filename5
+                >> HasCField.writeRaw (BG.Proxy @"linenum") ptr0 linenum6
+                >> HasCField.writeRaw (BG.Proxy @"function") ptr0 function7
+                >> HasCField.writeRaw (BG.Proxy @"next") ptr0 next8
+
+deriving via Marshal.EquivStorable SDL_AssertData instance BG.Storable SDL_AssertData
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "always_ignore" SDL_AssertData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AssertData
+            { always_ignore = y1
+            , trigger_count = BG.getField @"trigger_count" x0
+            , condition = BG.getField @"condition" x0
+            , filename = BG.getField @"filename" x0
+            , linenum = BG.getField @"linenum" x0
+            , function = BG.getField @"function" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"always_ignore" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "always_ignore" (BG.Ptr SDL_AssertData) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"always_ignore")
+
+instance HasCField.HasCField SDL_AssertData "always_ignore" where
+  type
+    CFieldType SDL_AssertData "always_ignore" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "trigger_count" SDL_AssertData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AssertData
+            { trigger_count = y1
+            , always_ignore = BG.getField @"always_ignore" x0
+            , condition = BG.getField @"condition" x0
+            , filename = BG.getField @"filename" x0
+            , linenum = BG.getField @"linenum" x0
+            , function = BG.getField @"function" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"trigger_count" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "trigger_count" (BG.Ptr SDL_AssertData) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"trigger_count")
+
+instance HasCField.HasCField SDL_AssertData "trigger_count" where
+  type
+    CFieldType SDL_AssertData "trigger_count" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "condition" SDL_AssertData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AssertData
+            { condition = y1
+            , always_ignore = BG.getField @"always_ignore" x0
+            , trigger_count = BG.getField @"trigger_count" x0
+            , filename = BG.getField @"filename" x0
+            , linenum = BG.getField @"linenum" x0
+            , function = BG.getField @"function" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"condition" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "condition" (BG.Ptr SDL_AssertData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"condition")
+
+instance HasCField.HasCField SDL_AssertData "condition" where
+  type
+    CFieldType SDL_AssertData "condition" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "filename" SDL_AssertData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AssertData
+            { filename = y1
+            , always_ignore = BG.getField @"always_ignore" x0
+            , trigger_count = BG.getField @"trigger_count" x0
+            , condition = BG.getField @"condition" x0
+            , linenum = BG.getField @"linenum" x0
+            , function = BG.getField @"function" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"filename" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "filename" (BG.Ptr SDL_AssertData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"filename")
+
+instance HasCField.HasCField SDL_AssertData "filename" where
+  type
+    CFieldType SDL_AssertData "filename" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "linenum" SDL_AssertData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AssertData
+            { linenum = y1
+            , always_ignore = BG.getField @"always_ignore" x0
+            , trigger_count = BG.getField @"trigger_count" x0
+            , condition = BG.getField @"condition" x0
+            , filename = BG.getField @"filename" x0
+            , function = BG.getField @"function" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"linenum" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "linenum" (BG.Ptr SDL_AssertData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"linenum")
+
+instance HasCField.HasCField SDL_AssertData "linenum" where
+  type CFieldType SDL_AssertData "linenum" = BG.CInt
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "function" SDL_AssertData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AssertData
+            { function = y1
+            , always_ignore = BG.getField @"always_ignore" x0
+            , trigger_count = BG.getField @"trigger_count" x0
+            , condition = BG.getField @"condition" x0
+            , filename = BG.getField @"filename" x0
+            , linenum = BG.getField @"linenum" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"function" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "function" (BG.Ptr SDL_AssertData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"function")
+
+instance HasCField.HasCField SDL_AssertData "function" where
+  type
+    CFieldType SDL_AssertData "function" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_AssertData)
+  => BG.CompatHasField.HasField "next" SDL_AssertData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AssertData
+            { next = y1
+            , always_ignore = BG.getField @"always_ignore" x0
+            , trigger_count = BG.getField @"trigger_count" x0
+            , condition = BG.getField @"condition" x0
+            , filename = BG.getField @"filename" x0
+            , linenum = BG.getField @"linenum" x0
+            , function = BG.getField @"function" x0
+            }
+      , BG.getField @"next" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_AssertData)
+  => BG.HasField "next" (BG.Ptr SDL_AssertData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"next")
+
+instance HasCField.HasCField SDL_AssertData "next" where
+  type
+    CFieldType SDL_AssertData "next" =
+      PtrConst.PtrConst SDL_AssertData
+
+  offset# = \_ -> \_ -> 40
+
+-- | Auxiliary type used by 'SDL_AssertionHandler'
+--
+--     [C declaration]: @SDL_AssertionHandler@, defined at @SDL3\/SDL_assert.h 565:35@
+newtype SDL_AssertionHandler_Aux = SDL_AssertionHandler_Aux
+  { unwrap :: PtrConst.PtrConst SDL_AssertData -> BG.Ptr BG.Void -> IO SDL_AssertState
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_AssertionHandler_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_4cf4facc2fb068b6_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32))
+
+-- __unique:__ @toSDL_AssertionHandler_Aux@
+hs_bindgen_4cf4facc2fb068b6
+  :: SDL_AssertionHandler_Aux
+  -> IO (BG.FunPtr SDL_AssertionHandler_Aux)
+hs_bindgen_4cf4facc2fb068b6 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_4cf4facc2fb068b6_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_AssertionHandler_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_a1f4d13109856a1b_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32)
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @fromSDL_AssertionHandler_Aux@
+hs_bindgen_a1f4d13109856a1b
+  :: BG.FunPtr SDL_AssertionHandler_Aux
+  -> SDL_AssertionHandler_Aux
+hs_bindgen_a1f4d13109856a1b =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_a1f4d13109856a1b_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_AssertionHandler_Aux where
+  toFunPtr = hs_bindgen_4cf4facc2fb068b6
+
+instance BG.FromFunPtr SDL_AssertionHandler_Aux where
+  fromFunPtr = hs_bindgen_a1f4d13109856a1b
+
+instance
+  (ty ~ (PtrConst.PtrConst SDL_AssertData -> BG.Ptr BG.Void -> IO SDL_AssertState))
+  => BG.CompatHasField.HasField "unwrap" SDL_AssertionHandler_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AssertionHandler_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (PtrConst.PtrConst SDL_AssertData -> BG.Ptr BG.Void -> IO SDL_AssertState))
+  => BG.HasField "unwrap" (BG.Ptr SDL_AssertionHandler_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AssertionHandler_Aux "unwrap" where
+  type
+    CFieldType SDL_AssertionHandler_Aux "unwrap" =
+      PtrConst.PtrConst SDL_AssertData -> BG.Ptr BG.Void -> IO SDL_AssertState
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback that fires when an SDL assertion fails.
+--
+--     [@data@]: a pointer to the 'SDL_AssertData' structure corresponding to the current assertion.
+--
+--     [@userdata@]: what was passed as @userdata@ to @SDL_SetAssertionHandler()@.
+--
+--     [Returns]: an 'SDL_AssertState' value indicating how to handle the failure.
+--
+--     [Thread safety]: This callback may be called from any thread that triggers an assert at any time.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_AssertionHandler@, defined at @SDL3\/SDL_assert.h 565:35@
+newtype SDL_AssertionHandler = SDL_AssertionHandler
+  { unwrap :: BG.FunPtr SDL_AssertionHandler_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_AssertionHandler_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_AssertionHandler ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AssertionHandler{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_AssertionHandler_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AssertionHandler) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AssertionHandler "unwrap" where
+  type
+    CFieldType SDL_AssertionHandler "unwrap" =
+      BG.FunPtr SDL_AssertionHandler_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Assert/FunPtr.hs b/src/SDL3/Sys/Bindgen/Assert/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Assert/FunPtr.hs
@@ -0,0 +1,288 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Assert.FunPtr (
+  SDL3.Sys.Bindgen.Assert.FunPtr.sDL_ReportAssertion,
+  SDL3.Sys.Bindgen.Assert.FunPtr.sDL_SetAssertionHandler,
+  SDL3.Sys.Bindgen.Assert.FunPtr.sDL_GetDefaultAssertionHandler,
+  SDL3.Sys.Bindgen.Assert.FunPtr.sDL_GetAssertionHandler,
+  SDL3.Sys.Bindgen.Assert.FunPtr.sDL_GetAssertionReport,
+  SDL3.Sys.Bindgen.Assert.FunPtr.sDL_ResetAssertionReport,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Assert
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_assert.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_ReportAssertion */"
+         , "__attribute__ ((const))"
+         , "SDL_AssertState (*hs_bindgen_3242a9f392e3cbbb (void)) ("
+         , "  SDL_AssertData *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_ReportAssertion;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_SetAssertionHandler */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_d3c978a8cd9d0fb4 (void)) ("
+         , "  SDL_AssertionHandler arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAssertionHandler;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_GetDefaultAssertionHandler */"
+         , "__attribute__ ((const))"
+         , "SDL_AssertionHandler (*hs_bindgen_9ee5171cfc759fff (void)) (void)"
+         , "{"
+         , "  return &SDL_GetDefaultAssertionHandler;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_GetAssertionHandler */"
+         , "__attribute__ ((const))"
+         , "SDL_AssertionHandler (*hs_bindgen_d86a645db34b2ab2 (void)) ("
+         , "  void **arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAssertionHandler;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_GetAssertionReport */"
+         , "__attribute__ ((const))"
+         , "SDL_AssertData const *(*hs_bindgen_81f7661412c040b9 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetAssertionReport;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_ResetAssertionReport */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_d418f82b830fadaf (void)) (void)"
+         , "{"
+         , "  return &SDL_ResetAssertionReport;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_ReportAssertion@
+foreign import ccall unsafe "hs_bindgen_3242a9f392e3cbbb"
+  hs_bindgen_3242a9f392e3cbbb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_ReportAssertion@
+hs_bindgen_3242a9f392e3cbbb
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_AssertData
+             -> PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.CInt
+             -> IO SDL_AssertState
+           )
+       )
+hs_bindgen_3242a9f392e3cbbb =
+  BG.fromFFIType hs_bindgen_3242a9f392e3cbbb_base
+
+{-# NOINLINE sDL_ReportAssertion #-}
+
+-- | Never call this directly.
+--
+--     Use the SDL_assert macros instead.
+--
+--     [@data@]: assert data structure.
+--
+--     [@func@]: function name.
+--
+--     [@file@]: file name.
+--
+--     [@line@]: line number.
+--
+--     [Returns]: assert state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReportAssertion@, defined at @SDL3\/SDL_assert.h 350:45@
+sDL_ReportAssertion
+  :: BG.FunPtr
+       ( BG.Ptr SDL_AssertData
+         -> PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> BG.CInt
+         -> IO SDL_AssertState
+       )
+sDL_ReportAssertion =
+  BG.unsafePerformIO hs_bindgen_3242a9f392e3cbbb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_SetAssertionHandler@
+foreign import ccall unsafe "hs_bindgen_d3c978a8cd9d0fb4"
+  hs_bindgen_d3c978a8cd9d0fb4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_SetAssertionHandler@
+hs_bindgen_d3c978a8cd9d0fb4 :: IO (BG.FunPtr (SDL_AssertionHandler -> BG.Ptr BG.Void -> IO ()))
+hs_bindgen_d3c978a8cd9d0fb4 =
+  BG.fromFFIType hs_bindgen_d3c978a8cd9d0fb4_base
+
+{-# NOINLINE sDL_SetAssertionHandler #-}
+
+-- | Set an application-defined assertion handler.
+--
+--     This function allows an application to show its own assertion UI and\/or force the response to an assertion failure. If the application doesn\'t provide this, SDL will try to do the right thing, popping up a system-specific GUI dialog, and probably minimizing any fullscreen windows.
+--
+--     This callback may fire from any thread, but it runs wrapped in a mutex, so it will only fire from one thread at a time.
+--
+--     This callback is NOT reset to SDL\'s internal handler upon SDL_Quit()!
+--
+--     [@handler@]: the 'SDL_AssertionHandler' function to call when an assertion fails or NULL for the default handler.
+--
+--     [@userdata@]: a pointer that is passed to @handler@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAssertionHandler'
+--
+--     [C declaration]: @SDL_SetAssertionHandler@, defined at @SDL3\/SDL_assert.h 591:34@
+sDL_SetAssertionHandler :: BG.FunPtr (SDL_AssertionHandler -> BG.Ptr BG.Void -> IO ())
+sDL_SetAssertionHandler =
+  BG.unsafePerformIO hs_bindgen_d3c978a8cd9d0fb4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_GetDefaultAssertionHandler@
+foreign import ccall unsafe "hs_bindgen_9ee5171cfc759fff"
+  hs_bindgen_9ee5171cfc759fff_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_GetDefaultAssertionHandler@
+hs_bindgen_9ee5171cfc759fff :: IO (BG.FunPtr (IO SDL_AssertionHandler))
+hs_bindgen_9ee5171cfc759fff =
+  BG.fromFFIType hs_bindgen_9ee5171cfc759fff_base
+
+{-# NOINLINE sDL_GetDefaultAssertionHandler #-}
+
+-- | Get the default assertion handler.
+--
+--     This returns the function pointer that is called by default when an assertion is triggered. This is an internal function provided by SDL, that is used for assertions when @SDL_SetAssertionHandler()@ hasn\'t been used to provide a different function.
+--
+--     [Returns]: the default 'SDL_AssertionHandler' that is called when an assert triggers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAssertionHandler'
+--
+--     [C declaration]: @SDL_GetDefaultAssertionHandler@, defined at @SDL3\/SDL_assert.h 612:50@
+sDL_GetDefaultAssertionHandler :: BG.FunPtr (IO SDL_AssertionHandler)
+sDL_GetDefaultAssertionHandler =
+  BG.unsafePerformIO hs_bindgen_9ee5171cfc759fff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_GetAssertionHandler@
+foreign import ccall unsafe "hs_bindgen_d86a645db34b2ab2"
+  hs_bindgen_d86a645db34b2ab2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_GetAssertionHandler@
+hs_bindgen_d86a645db34b2ab2 :: IO (BG.FunPtr (BG.Ptr (BG.Ptr BG.Void) -> IO SDL_AssertionHandler))
+hs_bindgen_d86a645db34b2ab2 =
+  BG.fromFFIType hs_bindgen_d86a645db34b2ab2_base
+
+{-# NOINLINE sDL_GetAssertionHandler #-}
+
+-- | Get the current assertion handler.
+--
+--     This returns the function pointer that is called when an assertion is triggered. This is either the value last passed to @SDL_SetAssertionHandler()@, or if no application-specified function is set, is equivalent to calling @SDL_GetDefaultAssertionHandler()@.
+--
+--     The parameter @puserdata@ is a pointer to a void*, which will store the \"userdata\" pointer that was passed to @SDL_SetAssertionHandler()@. This value will always be NULL for the default handler. If you don\'t care about this data, it is safe to pass a NULL pointer to this function to ignore it.
+--
+--     [@puserdata@]: pointer which is filled with the \"userdata\" pointer that was passed to @SDL_SetAssertionHandler()@.
+--
+--     [Returns]: the 'SDL_AssertionHandler' that is called when an assert triggers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAssertionHandler'
+--
+--     [C declaration]: @SDL_GetAssertionHandler@, defined at @SDL3\/SDL_assert.h 637:50@
+sDL_GetAssertionHandler :: BG.FunPtr (BG.Ptr (BG.Ptr BG.Void) -> IO SDL_AssertionHandler)
+sDL_GetAssertionHandler =
+  BG.unsafePerformIO hs_bindgen_d86a645db34b2ab2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_GetAssertionReport@
+foreign import ccall unsafe "hs_bindgen_81f7661412c040b9"
+  hs_bindgen_81f7661412c040b9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_GetAssertionReport@
+hs_bindgen_81f7661412c040b9 :: IO (BG.FunPtr (IO (PtrConst.PtrConst SDL_AssertData)))
+hs_bindgen_81f7661412c040b9 =
+  BG.fromFFIType hs_bindgen_81f7661412c040b9_base
+
+{-# NOINLINE sDL_GetAssertionReport #-}
+
+-- | Get a list of all assertion failures.
+--
+--     This function gets all assertions triggered since the last call to @SDL_ResetAssertionReport()@, or the start of the program.
+--
+--     The proper way to examine this data looks something like this:
+--
+--     @
+--     const SDL_AssertData *item = SDL_GetAssertionReport();
+--     while (item) {
+--        printf(\"\'%s\', %s (%s:%d), triggered %u times, always ignore: %s.\\\\n\",
+--               item->condition, item->function, item->filename,
+--               item->linenum, item->trigger_count,
+--               item->always_ignore ? \"yes\" : \"no\");
+--        item = item->next;
+--     }
+--     @
+--
+--     [Returns]: a list of all failed assertions or NULL if the list is empty. This memory should not be modified or freed by the application. This pointer remains valid until the next call to SDL_Quit() or @SDL_ResetAssertionReport()@.
+--
+--     [Thread safety]: This function is not thread safe. Other threads calling @SDL_ResetAssertionReport()@ simultaneously, may render the returned pointer invalid.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResetAssertionReport'
+--
+--     [C declaration]: @SDL_GetAssertionReport@, defined at @SDL3\/SDL_assert.h 671:52@
+sDL_GetAssertionReport :: BG.FunPtr (IO (PtrConst.PtrConst SDL_AssertData))
+sDL_GetAssertionReport =
+  BG.unsafePerformIO hs_bindgen_81f7661412c040b9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_ResetAssertionReport@
+foreign import ccall unsafe "hs_bindgen_d418f82b830fadaf"
+  hs_bindgen_d418f82b830fadaf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_get_SDL_ResetAssertionReport@
+hs_bindgen_d418f82b830fadaf :: IO (BG.FunPtr (IO ()))
+hs_bindgen_d418f82b830fadaf =
+  BG.fromFFIType hs_bindgen_d418f82b830fadaf_base
+
+{-# NOINLINE sDL_ResetAssertionReport #-}
+
+-- | Clear the list of all assertion failures.
+--
+--     This function will clear the list of all assertions triggered up to that point. Immediately following this call, SDL_GetAssertionReport will return no items. In addition, any previously-triggered assertions will be reset to a trigger_count of zero, and their always_ignore state will be false.
+--
+--     [Thread safety]: This function is not thread safe. Other threads triggering an assertion, or simultaneously calling this function may cause memory leaks or crashes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAssertionReport'
+--
+--     [C declaration]: @SDL_ResetAssertionReport@, defined at @SDL3\/SDL_assert.h 689:34@
+sDL_ResetAssertionReport :: BG.FunPtr (IO ())
+sDL_ResetAssertionReport =
+  BG.unsafePerformIO hs_bindgen_d418f82b830fadaf
diff --git a/src/SDL3/Sys/Bindgen/Assert/Safe.hs b/src/SDL3/Sys/Bindgen/Assert/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Assert/Safe.hs
@@ -0,0 +1,278 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Assert.Safe (
+  SDL3.Sys.Bindgen.Assert.Safe.sDL_ReportAssertion,
+  SDL3.Sys.Bindgen.Assert.Safe.sDL_SetAssertionHandler,
+  SDL3.Sys.Bindgen.Assert.Safe.sDL_GetDefaultAssertionHandler,
+  SDL3.Sys.Bindgen.Assert.Safe.sDL_GetAssertionHandler,
+  SDL3.Sys.Bindgen.Assert.Safe.sDL_GetAssertionReport,
+  SDL3.Sys.Bindgen.Assert.Safe.sDL_ResetAssertionReport,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Assert
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_assert.h>"
+         , "SDL_AssertState hs_bindgen_1ac37dfe626398fd ("
+         , "  SDL_AssertData *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_ReportAssertion)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_29fb2e1c47c9de9d ("
+         , "  SDL_AssertionHandler arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetAssertionHandler)(arg1, arg2);"
+         , "}"
+         , "SDL_AssertionHandler hs_bindgen_95e7fb7c037fc4ae (void)"
+         , "{"
+         , "  return (SDL_GetDefaultAssertionHandler)();"
+         , "}"
+         , "SDL_AssertionHandler hs_bindgen_b7b44249a97e8ea4 ("
+         , "  void **arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAssertionHandler)(arg1);"
+         , "}"
+         , "SDL_AssertData const *hs_bindgen_3b5bb811b27af0d4 (void)"
+         , "{"
+         , "  return (SDL_GetAssertionReport)();"
+         , "}"
+         , "void hs_bindgen_b5d43ee02d99641a (void)"
+         , "{"
+         , "  (SDL_ResetAssertionReport)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_ReportAssertion@
+foreign import ccall safe "hs_bindgen_1ac37dfe626398fd"
+  hs_bindgen_1ac37dfe626398fd_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_ReportAssertion@
+hs_bindgen_1ac37dfe626398fd
+  :: BG.Ptr SDL_AssertData
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> IO SDL_AssertState
+hs_bindgen_1ac37dfe626398fd =
+  BG.fromFFIType hs_bindgen_1ac37dfe626398fd_base
+
+-- | Never call this directly.
+--
+--     Use the SDL_assert macros instead.
+--
+--     [Returns]: assert state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReportAssertion@, defined at @SDL3\/SDL_assert.h 350:45@
+sDL_ReportAssertion
+  :: BG.Ptr SDL_AssertData
+  -- ^
+  --
+  --           [@data@]: assert data structure.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@func@]: function name.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: file name.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@line@]: line number.
+  -> IO SDL_AssertState
+sDL_ReportAssertion = hs_bindgen_1ac37dfe626398fd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_SetAssertionHandler@
+foreign import ccall safe "hs_bindgen_29fb2e1c47c9de9d"
+  hs_bindgen_29fb2e1c47c9de9d_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_SetAssertionHandler@
+hs_bindgen_29fb2e1c47c9de9d
+  :: SDL_AssertionHandler
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_29fb2e1c47c9de9d =
+  BG.fromFFIType hs_bindgen_29fb2e1c47c9de9d_base
+
+-- | Set an application-defined assertion handler.
+--
+--     This function allows an application to show its own assertion UI and\/or force the response to an assertion failure. If the application doesn\'t provide this, SDL will try to do the right thing, popping up a system-specific GUI dialog, and probably minimizing any fullscreen windows.
+--
+--     This callback may fire from any thread, but it runs wrapped in a mutex, so it will only fire from one thread at a time.
+--
+--     This callback is NOT reset to SDL\'s internal handler upon SDL_Quit()!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAssertionHandler'
+--
+--     [C declaration]: @SDL_SetAssertionHandler@, defined at @SDL3\/SDL_assert.h 591:34@
+sDL_SetAssertionHandler
+  :: SDL_AssertionHandler
+  -- ^
+  --
+  --           [@handler@]: the 'SDL_AssertionHandler' function to call when an assertion fails or NULL for the default handler.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @handler@.
+  -> IO ()
+sDL_SetAssertionHandler = hs_bindgen_29fb2e1c47c9de9d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_GetDefaultAssertionHandler@
+foreign import ccall safe "hs_bindgen_95e7fb7c037fc4ae"
+  hs_bindgen_95e7fb7c037fc4ae_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_GetDefaultAssertionHandler@
+hs_bindgen_95e7fb7c037fc4ae :: IO SDL_AssertionHandler
+hs_bindgen_95e7fb7c037fc4ae =
+  BG.fromFFIType hs_bindgen_95e7fb7c037fc4ae_base
+
+-- | Get the default assertion handler.
+--
+--     This returns the function pointer that is called by default when an assertion is triggered. This is an internal function provided by SDL, that is used for assertions when @SDL_SetAssertionHandler()@ hasn\'t been used to provide a different function.
+--
+--     [Returns]: the default 'SDL_AssertionHandler' that is called when an assert triggers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAssertionHandler'
+--
+--     [C declaration]: @SDL_GetDefaultAssertionHandler@, defined at @SDL3\/SDL_assert.h 612:50@
+sDL_GetDefaultAssertionHandler :: IO SDL_AssertionHandler
+sDL_GetDefaultAssertionHandler =
+  hs_bindgen_95e7fb7c037fc4ae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_GetAssertionHandler@
+foreign import ccall safe "hs_bindgen_b7b44249a97e8ea4"
+  hs_bindgen_b7b44249a97e8ea4_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_GetAssertionHandler@
+hs_bindgen_b7b44249a97e8ea4
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -> IO SDL_AssertionHandler
+hs_bindgen_b7b44249a97e8ea4 =
+  BG.fromFFIType hs_bindgen_b7b44249a97e8ea4_base
+
+-- | Get the current assertion handler.
+--
+--     This returns the function pointer that is called when an assertion is triggered. This is either the value last passed to @SDL_SetAssertionHandler()@, or if no application-specified function is set, is equivalent to calling @SDL_GetDefaultAssertionHandler()@.
+--
+--     The parameter @puserdata@ is a pointer to a void*, which will store the \"userdata\" pointer that was passed to @SDL_SetAssertionHandler()@. This value will always be NULL for the default handler. If you don\'t care about this data, it is safe to pass a NULL pointer to this function to ignore it.
+--
+--     [Returns]: the 'SDL_AssertionHandler' that is called when an assert triggers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAssertionHandler'
+--
+--     [C declaration]: @SDL_GetAssertionHandler@, defined at @SDL3\/SDL_assert.h 637:50@
+sDL_GetAssertionHandler
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@puserdata@]: pointer which is filled with the \"userdata\" pointer that was passed to @SDL_SetAssertionHandler()@.
+  -> IO SDL_AssertionHandler
+sDL_GetAssertionHandler = hs_bindgen_b7b44249a97e8ea4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_GetAssertionReport@
+foreign import ccall safe "hs_bindgen_3b5bb811b27af0d4"
+  hs_bindgen_3b5bb811b27af0d4_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_GetAssertionReport@
+hs_bindgen_3b5bb811b27af0d4 :: IO (PtrConst.PtrConst SDL_AssertData)
+hs_bindgen_3b5bb811b27af0d4 =
+  BG.fromFFIType hs_bindgen_3b5bb811b27af0d4_base
+
+-- | Get a list of all assertion failures.
+--
+--     This function gets all assertions triggered since the last call to @SDL_ResetAssertionReport()@, or the start of the program.
+--
+--     The proper way to examine this data looks something like this:
+--
+--     @
+--     const SDL_AssertData *item = SDL_GetAssertionReport();
+--     while (item) {
+--        printf(\"\'%s\', %s (%s:%d), triggered %u times, always ignore: %s.\\\\n\",
+--               item->condition, item->function, item->filename,
+--               item->linenum, item->trigger_count,
+--               item->always_ignore ? \"yes\" : \"no\");
+--        item = item->next;
+--     }
+--     @
+--
+--     [Returns]: a list of all failed assertions or NULL if the list is empty. This memory should not be modified or freed by the application. This pointer remains valid until the next call to SDL_Quit() or @SDL_ResetAssertionReport()@.
+--
+--     [Thread safety]: This function is not thread safe. Other threads calling @SDL_ResetAssertionReport()@ simultaneously, may render the returned pointer invalid.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResetAssertionReport'
+--
+--     [C declaration]: @SDL_GetAssertionReport@, defined at @SDL3\/SDL_assert.h 671:52@
+sDL_GetAssertionReport :: IO (PtrConst.PtrConst SDL_AssertData)
+sDL_GetAssertionReport = hs_bindgen_3b5bb811b27af0d4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_ResetAssertionReport@
+foreign import ccall safe "hs_bindgen_b5d43ee02d99641a"
+  hs_bindgen_b5d43ee02d99641a_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Safe_SDL_ResetAssertionReport@
+hs_bindgen_b5d43ee02d99641a :: IO ()
+hs_bindgen_b5d43ee02d99641a =
+  BG.fromFFIType hs_bindgen_b5d43ee02d99641a_base
+
+-- | Clear the list of all assertion failures.
+--
+--     This function will clear the list of all assertions triggered up to that point. Immediately following this call, SDL_GetAssertionReport will return no items. In addition, any previously-triggered assertions will be reset to a trigger_count of zero, and their always_ignore state will be false.
+--
+--     [Thread safety]: This function is not thread safe. Other threads triggering an assertion, or simultaneously calling this function may cause memory leaks or crashes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAssertionReport'
+--
+--     [C declaration]: @SDL_ResetAssertionReport@, defined at @SDL3\/SDL_assert.h 689:34@
+sDL_ResetAssertionReport :: IO ()
+sDL_ResetAssertionReport =
+  hs_bindgen_b5d43ee02d99641a
diff --git a/src/SDL3/Sys/Bindgen/Assert/Unsafe.hs b/src/SDL3/Sys/Bindgen/Assert/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Assert/Unsafe.hs
@@ -0,0 +1,278 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Assert.Unsafe (
+  SDL3.Sys.Bindgen.Assert.Unsafe.sDL_ReportAssertion,
+  SDL3.Sys.Bindgen.Assert.Unsafe.sDL_SetAssertionHandler,
+  SDL3.Sys.Bindgen.Assert.Unsafe.sDL_GetDefaultAssertionHandler,
+  SDL3.Sys.Bindgen.Assert.Unsafe.sDL_GetAssertionHandler,
+  SDL3.Sys.Bindgen.Assert.Unsafe.sDL_GetAssertionReport,
+  SDL3.Sys.Bindgen.Assert.Unsafe.sDL_ResetAssertionReport,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Assert
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_assert.h>"
+         , "SDL_AssertState hs_bindgen_a7639e4e554aca71 ("
+         , "  SDL_AssertData *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_ReportAssertion)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_e1f2894e05101967 ("
+         , "  SDL_AssertionHandler arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetAssertionHandler)(arg1, arg2);"
+         , "}"
+         , "SDL_AssertionHandler hs_bindgen_dff5ecac8d034d8d (void)"
+         , "{"
+         , "  return (SDL_GetDefaultAssertionHandler)();"
+         , "}"
+         , "SDL_AssertionHandler hs_bindgen_0c314ac7cf70966e ("
+         , "  void **arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAssertionHandler)(arg1);"
+         , "}"
+         , "SDL_AssertData const *hs_bindgen_53829b7497744243 (void)"
+         , "{"
+         , "  return (SDL_GetAssertionReport)();"
+         , "}"
+         , "void hs_bindgen_bb1d739857931f60 (void)"
+         , "{"
+         , "  (SDL_ResetAssertionReport)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_ReportAssertion@
+foreign import ccall unsafe "hs_bindgen_a7639e4e554aca71"
+  hs_bindgen_a7639e4e554aca71_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_ReportAssertion@
+hs_bindgen_a7639e4e554aca71
+  :: BG.Ptr SDL_AssertData
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> IO SDL_AssertState
+hs_bindgen_a7639e4e554aca71 =
+  BG.fromFFIType hs_bindgen_a7639e4e554aca71_base
+
+-- | Never call this directly.
+--
+--     Use the SDL_assert macros instead.
+--
+--     [Returns]: assert state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReportAssertion@, defined at @SDL3\/SDL_assert.h 350:45@
+sDL_ReportAssertion
+  :: BG.Ptr SDL_AssertData
+  -- ^
+  --
+  --           [@data@]: assert data structure.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@func@]: function name.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: file name.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@line@]: line number.
+  -> IO SDL_AssertState
+sDL_ReportAssertion = hs_bindgen_a7639e4e554aca71
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_SetAssertionHandler@
+foreign import ccall unsafe "hs_bindgen_e1f2894e05101967"
+  hs_bindgen_e1f2894e05101967_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_SetAssertionHandler@
+hs_bindgen_e1f2894e05101967
+  :: SDL_AssertionHandler
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_e1f2894e05101967 =
+  BG.fromFFIType hs_bindgen_e1f2894e05101967_base
+
+-- | Set an application-defined assertion handler.
+--
+--     This function allows an application to show its own assertion UI and\/or force the response to an assertion failure. If the application doesn\'t provide this, SDL will try to do the right thing, popping up a system-specific GUI dialog, and probably minimizing any fullscreen windows.
+--
+--     This callback may fire from any thread, but it runs wrapped in a mutex, so it will only fire from one thread at a time.
+--
+--     This callback is NOT reset to SDL\'s internal handler upon SDL_Quit()!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAssertionHandler'
+--
+--     [C declaration]: @SDL_SetAssertionHandler@, defined at @SDL3\/SDL_assert.h 591:34@
+sDL_SetAssertionHandler
+  :: SDL_AssertionHandler
+  -- ^
+  --
+  --           [@handler@]: the 'SDL_AssertionHandler' function to call when an assertion fails or NULL for the default handler.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @handler@.
+  -> IO ()
+sDL_SetAssertionHandler = hs_bindgen_e1f2894e05101967
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_GetDefaultAssertionHandler@
+foreign import ccall unsafe "hs_bindgen_dff5ecac8d034d8d"
+  hs_bindgen_dff5ecac8d034d8d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_GetDefaultAssertionHandler@
+hs_bindgen_dff5ecac8d034d8d :: IO SDL_AssertionHandler
+hs_bindgen_dff5ecac8d034d8d =
+  BG.fromFFIType hs_bindgen_dff5ecac8d034d8d_base
+
+-- | Get the default assertion handler.
+--
+--     This returns the function pointer that is called by default when an assertion is triggered. This is an internal function provided by SDL, that is used for assertions when @SDL_SetAssertionHandler()@ hasn\'t been used to provide a different function.
+--
+--     [Returns]: the default 'SDL_AssertionHandler' that is called when an assert triggers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAssertionHandler'
+--
+--     [C declaration]: @SDL_GetDefaultAssertionHandler@, defined at @SDL3\/SDL_assert.h 612:50@
+sDL_GetDefaultAssertionHandler :: IO SDL_AssertionHandler
+sDL_GetDefaultAssertionHandler =
+  hs_bindgen_dff5ecac8d034d8d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_GetAssertionHandler@
+foreign import ccall unsafe "hs_bindgen_0c314ac7cf70966e"
+  hs_bindgen_0c314ac7cf70966e_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_GetAssertionHandler@
+hs_bindgen_0c314ac7cf70966e
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -> IO SDL_AssertionHandler
+hs_bindgen_0c314ac7cf70966e =
+  BG.fromFFIType hs_bindgen_0c314ac7cf70966e_base
+
+-- | Get the current assertion handler.
+--
+--     This returns the function pointer that is called when an assertion is triggered. This is either the value last passed to @SDL_SetAssertionHandler()@, or if no application-specified function is set, is equivalent to calling @SDL_GetDefaultAssertionHandler()@.
+--
+--     The parameter @puserdata@ is a pointer to a void*, which will store the \"userdata\" pointer that was passed to @SDL_SetAssertionHandler()@. This value will always be NULL for the default handler. If you don\'t care about this data, it is safe to pass a NULL pointer to this function to ignore it.
+--
+--     [Returns]: the 'SDL_AssertionHandler' that is called when an assert triggers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAssertionHandler'
+--
+--     [C declaration]: @SDL_GetAssertionHandler@, defined at @SDL3\/SDL_assert.h 637:50@
+sDL_GetAssertionHandler
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@puserdata@]: pointer which is filled with the \"userdata\" pointer that was passed to @SDL_SetAssertionHandler()@.
+  -> IO SDL_AssertionHandler
+sDL_GetAssertionHandler = hs_bindgen_0c314ac7cf70966e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_GetAssertionReport@
+foreign import ccall unsafe "hs_bindgen_53829b7497744243"
+  hs_bindgen_53829b7497744243_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_GetAssertionReport@
+hs_bindgen_53829b7497744243 :: IO (PtrConst.PtrConst SDL_AssertData)
+hs_bindgen_53829b7497744243 =
+  BG.fromFFIType hs_bindgen_53829b7497744243_base
+
+-- | Get a list of all assertion failures.
+--
+--     This function gets all assertions triggered since the last call to @SDL_ResetAssertionReport()@, or the start of the program.
+--
+--     The proper way to examine this data looks something like this:
+--
+--     @
+--     const SDL_AssertData *item = SDL_GetAssertionReport();
+--     while (item) {
+--        printf(\"\'%s\', %s (%s:%d), triggered %u times, always ignore: %s.\\\\n\",
+--               item->condition, item->function, item->filename,
+--               item->linenum, item->trigger_count,
+--               item->always_ignore ? \"yes\" : \"no\");
+--        item = item->next;
+--     }
+--     @
+--
+--     [Returns]: a list of all failed assertions or NULL if the list is empty. This memory should not be modified or freed by the application. This pointer remains valid until the next call to SDL_Quit() or @SDL_ResetAssertionReport()@.
+--
+--     [Thread safety]: This function is not thread safe. Other threads calling @SDL_ResetAssertionReport()@ simultaneously, may render the returned pointer invalid.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResetAssertionReport'
+--
+--     [C declaration]: @SDL_GetAssertionReport@, defined at @SDL3\/SDL_assert.h 671:52@
+sDL_GetAssertionReport :: IO (PtrConst.PtrConst SDL_AssertData)
+sDL_GetAssertionReport = hs_bindgen_53829b7497744243
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_ResetAssertionReport@
+foreign import ccall unsafe "hs_bindgen_bb1d739857931f60"
+  hs_bindgen_bb1d739857931f60_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Assert_Unsafe_SDL_ResetAssertionReport@
+hs_bindgen_bb1d739857931f60 :: IO ()
+hs_bindgen_bb1d739857931f60 =
+  BG.fromFFIType hs_bindgen_bb1d739857931f60_base
+
+-- | Clear the list of all assertion failures.
+--
+--     This function will clear the list of all assertions triggered up to that point. Immediately following this call, SDL_GetAssertionReport will return no items. In addition, any previously-triggered assertions will be reset to a trigger_count of zero, and their always_ignore state will be false.
+--
+--     [Thread safety]: This function is not thread safe. Other threads triggering an assertion, or simultaneously calling this function may cause memory leaks or crashes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAssertionReport'
+--
+--     [C declaration]: @SDL_ResetAssertionReport@, defined at @SDL3\/SDL_assert.h 689:34@
+sDL_ResetAssertionReport :: IO ()
+sDL_ResetAssertionReport =
+  hs_bindgen_bb1d739857931f60
diff --git a/src/SDL3/Sys/Bindgen/Asyncio.hs b/src/SDL3/Sys/Bindgen/Asyncio.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Asyncio.hs
@@ -0,0 +1,678 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL offers a way to perform I\/O asynchronously. This allows an app to read or write files without waiting for data to actually transfer; the functions that request I\/O never block while the request is fulfilled.
+--
+--     Instead, the data moves in the background and the app can check for results at their leisure.
+--
+--     This is more complicated than just reading and writing files in a synchronous way, but it can allow for more efficiency, and never having framerate drops as the hard drive catches up, etc.
+--
+--     The general usage pattern for async I\/O is:
+--
+--     * Create one or more 'SDL_AsyncIOQueue' objects.
+--
+--     * Open files with SDL_AsyncIOFromFile.
+--
+--     * Start I\/O tasks to the files with SDL_ReadAsyncIO or SDL_WriteAsyncIO, putting those tasks into one of the queues.
+--
+--     * Later on, use SDL_GetAsyncIOResult on a queue to see if any task is finished without blocking. Tasks might finish in any order with success or failure.
+--
+--     * When all your tasks are done, close the file with SDL_CloseAsyncIO. This also generates a task, since it might flush data to disk!
+--
+--     This all works, without blocking, in a single thread, but one can also wait on a queue in a background thread, sleeping until new results have arrived:
+--
+--     * Call SDL_WaitAsyncIOResult from one or more threads to efficiently block until new tasks complete.
+--
+--     * When shutting down, call SDL_SignalAsyncIOQueue to unblock any sleeping threads despite there being no new tasks completed.
+--
+--     And, of course, to match the synchronous SDL_LoadFile, we offer SDL_LoadFileAsync as a convenience function. This will handle allocating a buffer, slurping in the file data, and null-terminating it; you still check for results later.
+--
+--     Behind the scenes, SDL will use newer, efficient APIs on platforms that support them: Linux\'s io_uring and Windows 11\'s IoRing, for example. If those technologies aren\'t available, SDL will offload the work to a thread pool that will manage otherwise-synchronous loads without blocking the app.
+--
+--     Best Practices
+--
+--     Simple non-blocking I\/O for an app that just wants to pick up data whenever it\'s ready without losing framerate waiting on disks to spin can use whatever pattern works well for the program. In this case, simply call SDL_ReadAsyncIO, or maybe SDL_LoadFileAsync, as needed. Once a frame, call SDL_GetAsyncIOResult to check for any completed tasks and deal with the data as it arrives.
+--
+--     If two separate pieces of the same program need their own I\/O, it is legal for each to create their own queue. This will prevent either piece from accidentally consuming the other\'s completed tasks. Each queue does require some amount of resources, but it is not an overwhelming cost. Do not make a queue for each task, however. It is better to put many tasks into a single queue. They will be reported in order of completion, not in the order they were submitted, so it doesn\'t generally matter what order tasks are started.
+--
+--     One async I\/O queue can be shared by multiple threads, or one thread can have more than one queue, but the most efficient way if ruthless efficiency is the goal is to have one queue per thread, with multiple threads working in parallel, and attempt to keep each queue loaded with tasks that are both started by and consumed by the same thread. On modern platforms that can use newer interfaces, this can keep data flowing as efficiently as possible all the way from storage hardware to the app, with no contention between threads for access to the same queue.
+--
+--     Written data is not guaranteed to make it to physical media by the time a closing task is completed, unless SDL_CloseAsyncIO is called with its @flush@ parameter set to true, which is to say that a successful result here can still result in lost data during an unfortunately-timed power outage if not flushed. However, flushing will take longer and may be unnecessary, depending on the app\'s needs. The asynchronous I\/O operation structure.
+--
+--     This operates as an opaque handle. One can then request read or write operations on it.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AsyncIOFromFile'
+module SDL3.Sys.Bindgen.Asyncio (
+  SDL3.Sys.Bindgen.Asyncio.SDL_AsyncIO,
+  SDL3.Sys.Bindgen.Asyncio.SDL_AsyncIOTaskType (..),
+  pattern SDL3.Sys.Bindgen.Asyncio.SDL_ASYNCIO_TASK_READ,
+  pattern SDL3.Sys.Bindgen.Asyncio.SDL_ASYNCIO_TASK_WRITE,
+  pattern SDL3.Sys.Bindgen.Asyncio.SDL_ASYNCIO_TASK_CLOSE,
+  SDL3.Sys.Bindgen.Asyncio.SDL_AsyncIOResult (..),
+  pattern SDL3.Sys.Bindgen.Asyncio.SDL_ASYNCIO_COMPLETE,
+  pattern SDL3.Sys.Bindgen.Asyncio.SDL_ASYNCIO_FAILURE,
+  pattern SDL3.Sys.Bindgen.Asyncio.SDL_ASYNCIO_CANCELED,
+  SDL3.Sys.Bindgen.Asyncio.SDL_AsyncIOOutcome (..),
+  SDL3.Sys.Bindgen.Asyncio.SDL_AsyncIOQueue,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @struct SDL_AsyncIO@, defined at @SDL3\/SDL_asyncio.h 124:16@
+data SDL_AsyncIO
+
+-- | Types of asynchronous I\/O tasks.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_AsyncIOTaskType@, defined at @SDL3\/SDL_asyncio.h 131:14@
+newtype SDL_AsyncIOTaskType = SDL_AsyncIOTaskType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_AsyncIOTaskType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_AsyncIOTaskType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AsyncIOTaskType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_AsyncIOTaskType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AsyncIOTaskType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_AsyncIOTaskType instance BG.Storable SDL_AsyncIOTaskType
+
+deriving via BG.CUInt instance BG.Prim SDL_AsyncIOTaskType
+
+instance CEnum.CEnum SDL_AsyncIOTaskType where
+  type CEnumZ SDL_AsyncIOTaskType = BG.CUInt
+
+  toCEnum = SDL_AsyncIOTaskType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_ASYNCIO_TASK_READ")
+        , (1, BG.singleton "SDL_ASYNCIO_TASK_WRITE")
+        , (2, BG.singleton "SDL_ASYNCIO_TASK_CLOSE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_AsyncIOTaskType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_AsyncIOTaskType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_AsyncIOTaskType where
+  minDeclaredValue = SDL_ASYNCIO_TASK_READ
+
+  maxDeclaredValue = SDL_ASYNCIO_TASK_CLOSE
+
+instance Show SDL_AsyncIOTaskType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_AsyncIOTaskType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_AsyncIOTaskType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AsyncIOTaskType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AsyncIOTaskType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AsyncIOTaskType "unwrap" where
+  type
+    CFieldType SDL_AsyncIOTaskType "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | A read operation.
+--
+--     [C declaration]: @SDL_ASYNCIO_TASK_READ@, defined at @SDL3\/SDL_asyncio.h 133:5@
+pattern SDL_ASYNCIO_TASK_READ :: SDL_AsyncIOTaskType
+pattern SDL_ASYNCIO_TASK_READ = SDL_AsyncIOTaskType 0
+
+-- | A write operation.
+--
+--     [C declaration]: @SDL_ASYNCIO_TASK_WRITE@, defined at @SDL3\/SDL_asyncio.h 134:5@
+pattern SDL_ASYNCIO_TASK_WRITE :: SDL_AsyncIOTaskType
+pattern SDL_ASYNCIO_TASK_WRITE = SDL_AsyncIOTaskType 1
+
+-- | A close operation.
+--
+--     [C declaration]: @SDL_ASYNCIO_TASK_CLOSE@, defined at @SDL3\/SDL_asyncio.h 135:5@
+pattern SDL_ASYNCIO_TASK_CLOSE :: SDL_AsyncIOTaskType
+pattern SDL_ASYNCIO_TASK_CLOSE = SDL_AsyncIOTaskType 2
+
+-- | Possible outcomes of an asynchronous I\/O task.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_AsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 143:14@
+newtype SDL_AsyncIOResult = SDL_AsyncIOResult
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_AsyncIOResult where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_AsyncIOResult where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AsyncIOResult
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_AsyncIOResult where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AsyncIOResult unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_AsyncIOResult instance BG.Storable SDL_AsyncIOResult
+
+deriving via BG.CUInt instance BG.Prim SDL_AsyncIOResult
+
+instance CEnum.CEnum SDL_AsyncIOResult where
+  type CEnumZ SDL_AsyncIOResult = BG.CUInt
+
+  toCEnum = SDL_AsyncIOResult
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_ASYNCIO_COMPLETE")
+        , (1, BG.singleton "SDL_ASYNCIO_FAILURE")
+        , (2, BG.singleton "SDL_ASYNCIO_CANCELED")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_AsyncIOResult"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_AsyncIOResult"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_AsyncIOResult where
+  minDeclaredValue = SDL_ASYNCIO_COMPLETE
+
+  maxDeclaredValue = SDL_ASYNCIO_CANCELED
+
+instance Show SDL_AsyncIOResult where
+  showsPrec = CEnum.shows
+
+instance Read SDL_AsyncIOResult where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_AsyncIOResult ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AsyncIOResult{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AsyncIOResult) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AsyncIOResult "unwrap" where
+  type CFieldType SDL_AsyncIOResult "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | request was completed without error
+--
+--     [C declaration]: @SDL_ASYNCIO_COMPLETE@, defined at @SDL3\/SDL_asyncio.h 145:5@
+pattern SDL_ASYNCIO_COMPLETE :: SDL_AsyncIOResult
+pattern SDL_ASYNCIO_COMPLETE = SDL_AsyncIOResult 0
+
+-- | request failed for some reason; check SDL_GetError()!
+--
+--     [C declaration]: @SDL_ASYNCIO_FAILURE@, defined at @SDL3\/SDL_asyncio.h 146:5@
+pattern SDL_ASYNCIO_FAILURE :: SDL_AsyncIOResult
+pattern SDL_ASYNCIO_FAILURE = SDL_AsyncIOResult 1
+
+-- | request was canceled before completing.
+--
+--     [C declaration]: @SDL_ASYNCIO_CANCELED@, defined at @SDL3\/SDL_asyncio.h 147:5@
+pattern SDL_ASYNCIO_CANCELED :: SDL_AsyncIOResult
+pattern SDL_ASYNCIO_CANCELED = SDL_AsyncIOResult 2
+
+-- | Information about a completed asynchronous I\/O request.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_AsyncIOOutcome@, defined at @SDL3\/SDL_asyncio.h 155:16@
+data SDL_AsyncIOOutcome = SDL_AsyncIOOutcome
+  { asyncio :: BG.Ptr SDL_AsyncIO
+  -- ^ what generated this task. This pointer will be invalid if it was closed!
+  --
+  --          [C declaration]: @asyncio@, defined at @SDL3\/SDL_asyncio.h 157:18@
+  , type' :: SDL_AsyncIOTaskType
+  -- ^ What sort of task was this? Read, write, etc?
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_asyncio.h 158:25@
+  , result :: SDL_AsyncIOResult
+  -- ^ the result of the work (success, failure, cancellation).
+  --
+  --          [C declaration]: @result@, defined at @SDL3\/SDL_asyncio.h 159:23@
+  , buffer :: BG.Ptr BG.Void
+  -- ^ buffer where data was read\/written.
+  --
+  --          [C declaration]: @buffer@, defined at @SDL3\/SDL_asyncio.h 160:11@
+  , offset :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ offset in the 'SDL_AsyncIO' where data was read\/written.
+  --
+  --          [C declaration]: @offset@, defined at @SDL3\/SDL_asyncio.h 161:12@
+  , bytes_requested :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ number of bytes the task was to read\/write.
+  --
+  --          [C declaration]: @bytes_requested@, defined at @SDL3\/SDL_asyncio.h 162:12@
+  , bytes_transferred :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ actual number of bytes that were read\/written.
+  --
+  --          [C declaration]: @bytes_transferred@, defined at @SDL3\/SDL_asyncio.h 163:12@
+  , userdata :: BG.Ptr BG.Void
+  -- ^ pointer provided by the app when starting the task
+  --
+  --          [C declaration]: @userdata@, defined at @SDL3\/SDL_asyncio.h 164:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_AsyncIOOutcome where
+  staticSizeOf = \_ -> (56 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_AsyncIOOutcome where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AsyncIOOutcome
+        <*> HasCField.readRaw (BG.Proxy @"asyncio") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"result") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"buffer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"offset") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"bytes_requested") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"bytes_transferred") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"userdata") ptr0
+
+instance Marshal.WriteRaw SDL_AsyncIOOutcome where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AsyncIOOutcome
+            asyncio2
+            type'3
+            result4
+            buffer5
+            offset6
+            bytes_requested7
+            bytes_transferred8
+            userdata9 ->
+              HasCField.writeRaw (BG.Proxy @"asyncio") ptr0 asyncio2
+                >> HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'3
+                >> HasCField.writeRaw (BG.Proxy @"result") ptr0 result4
+                >> HasCField.writeRaw (BG.Proxy @"buffer") ptr0 buffer5
+                >> HasCField.writeRaw (BG.Proxy @"offset") ptr0 offset6
+                >> HasCField.writeRaw (BG.Proxy @"bytes_requested") ptr0 bytes_requested7
+                >> HasCField.writeRaw (BG.Proxy @"bytes_transferred") ptr0 bytes_transferred8
+                >> HasCField.writeRaw (BG.Proxy @"userdata") ptr0 userdata9
+
+deriving via Marshal.EquivStorable SDL_AsyncIOOutcome instance BG.Storable SDL_AsyncIOOutcome
+
+instance
+  (ty ~ BG.Ptr SDL_AsyncIO)
+  => BG.CompatHasField.HasField "asyncio" SDL_AsyncIOOutcome ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AsyncIOOutcome
+            { asyncio = y1
+            , type' = BG.getField @"type'" x0
+            , result = BG.getField @"result" x0
+            , buffer = BG.getField @"buffer" x0
+            , offset = BG.getField @"offset" x0
+            , bytes_requested = BG.getField @"bytes_requested" x0
+            , bytes_transferred = BG.getField @"bytes_transferred" x0
+            , userdata = BG.getField @"userdata" x0
+            }
+      , BG.getField @"asyncio" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_AsyncIO)
+  => BG.HasField "asyncio" (BG.Ptr SDL_AsyncIOOutcome) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"asyncio")
+
+instance HasCField.HasCField SDL_AsyncIOOutcome "asyncio" where
+  type
+    CFieldType SDL_AsyncIOOutcome "asyncio" =
+      BG.Ptr SDL_AsyncIO
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_AsyncIOTaskType)
+  => BG.CompatHasField.HasField "type'" SDL_AsyncIOOutcome ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AsyncIOOutcome
+            { type' = y1
+            , asyncio = BG.getField @"asyncio" x0
+            , result = BG.getField @"result" x0
+            , buffer = BG.getField @"buffer" x0
+            , offset = BG.getField @"offset" x0
+            , bytes_requested = BG.getField @"bytes_requested" x0
+            , bytes_transferred = BG.getField @"bytes_transferred" x0
+            , userdata = BG.getField @"userdata" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_AsyncIOTaskType)
+  => BG.HasField "type'" (BG.Ptr SDL_AsyncIOOutcome) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_AsyncIOOutcome "type'" where
+  type
+    CFieldType SDL_AsyncIOOutcome "type'" =
+      SDL_AsyncIOTaskType
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL_AsyncIOResult)
+  => BG.CompatHasField.HasField "result" SDL_AsyncIOOutcome ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AsyncIOOutcome
+            { result = y1
+            , asyncio = BG.getField @"asyncio" x0
+            , type' = BG.getField @"type'" x0
+            , buffer = BG.getField @"buffer" x0
+            , offset = BG.getField @"offset" x0
+            , bytes_requested = BG.getField @"bytes_requested" x0
+            , bytes_transferred = BG.getField @"bytes_transferred" x0
+            , userdata = BG.getField @"userdata" x0
+            }
+      , BG.getField @"result" x0
+      )
+
+instance
+  (ty ~ SDL_AsyncIOResult)
+  => BG.HasField "result" (BG.Ptr SDL_AsyncIOOutcome) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"result")
+
+instance HasCField.HasCField SDL_AsyncIOOutcome "result" where
+  type
+    CFieldType SDL_AsyncIOOutcome "result" =
+      SDL_AsyncIOResult
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "buffer" SDL_AsyncIOOutcome ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AsyncIOOutcome
+            { buffer = y1
+            , asyncio = BG.getField @"asyncio" x0
+            , type' = BG.getField @"type'" x0
+            , result = BG.getField @"result" x0
+            , offset = BG.getField @"offset" x0
+            , bytes_requested = BG.getField @"bytes_requested" x0
+            , bytes_transferred = BG.getField @"bytes_transferred" x0
+            , userdata = BG.getField @"userdata" x0
+            }
+      , BG.getField @"buffer" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "buffer" (BG.Ptr SDL_AsyncIOOutcome) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"buffer")
+
+instance HasCField.HasCField SDL_AsyncIOOutcome "buffer" where
+  type
+    CFieldType SDL_AsyncIOOutcome "buffer" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "offset" SDL_AsyncIOOutcome ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AsyncIOOutcome
+            { offset = y1
+            , asyncio = BG.getField @"asyncio" x0
+            , type' = BG.getField @"type'" x0
+            , result = BG.getField @"result" x0
+            , buffer = BG.getField @"buffer" x0
+            , bytes_requested = BG.getField @"bytes_requested" x0
+            , bytes_transferred = BG.getField @"bytes_transferred" x0
+            , userdata = BG.getField @"userdata" x0
+            }
+      , BG.getField @"offset" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "offset" (BG.Ptr SDL_AsyncIOOutcome) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"offset")
+
+instance HasCField.HasCField SDL_AsyncIOOutcome "offset" where
+  type
+    CFieldType SDL_AsyncIOOutcome "offset" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "bytes_requested" SDL_AsyncIOOutcome ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AsyncIOOutcome
+            { bytes_requested = y1
+            , asyncio = BG.getField @"asyncio" x0
+            , type' = BG.getField @"type'" x0
+            , result = BG.getField @"result" x0
+            , buffer = BG.getField @"buffer" x0
+            , offset = BG.getField @"offset" x0
+            , bytes_transferred = BG.getField @"bytes_transferred" x0
+            , userdata = BG.getField @"userdata" x0
+            }
+      , BG.getField @"bytes_requested" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "bytes_requested" (BG.Ptr SDL_AsyncIOOutcome) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"bytes_requested")
+
+instance HasCField.HasCField SDL_AsyncIOOutcome "bytes_requested" where
+  type
+    CFieldType SDL_AsyncIOOutcome "bytes_requested" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "bytes_transferred" SDL_AsyncIOOutcome ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AsyncIOOutcome
+            { bytes_transferred = y1
+            , asyncio = BG.getField @"asyncio" x0
+            , type' = BG.getField @"type'" x0
+            , result = BG.getField @"result" x0
+            , buffer = BG.getField @"buffer" x0
+            , offset = BG.getField @"offset" x0
+            , bytes_requested = BG.getField @"bytes_requested" x0
+            , userdata = BG.getField @"userdata" x0
+            }
+      , BG.getField @"bytes_transferred" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "bytes_transferred" (BG.Ptr SDL_AsyncIOOutcome) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"bytes_transferred")
+
+instance HasCField.HasCField SDL_AsyncIOOutcome "bytes_transferred" where
+  type
+    CFieldType SDL_AsyncIOOutcome "bytes_transferred" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "userdata" SDL_AsyncIOOutcome ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AsyncIOOutcome
+            { userdata = y1
+            , asyncio = BG.getField @"asyncio" x0
+            , type' = BG.getField @"type'" x0
+            , result = BG.getField @"result" x0
+            , buffer = BG.getField @"buffer" x0
+            , offset = BG.getField @"offset" x0
+            , bytes_requested = BG.getField @"bytes_requested" x0
+            , bytes_transferred = BG.getField @"bytes_transferred" x0
+            }
+      , BG.getField @"userdata" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "userdata" (BG.Ptr SDL_AsyncIOOutcome) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"userdata")
+
+instance HasCField.HasCField SDL_AsyncIOOutcome "userdata" where
+  type
+    CFieldType SDL_AsyncIOOutcome "userdata" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 48
+
+-- | A queue of completed asynchronous I\/O tasks.
+--
+--     When starting an asynchronous operation, you specify a queue for the new task. A queue can be asked later if any tasks in it have completed, allowing an app to manage multiple pending tasks in one place, in whatever order they complete.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAsyncIOQueue', 'sDL_ReadAsyncIO', 'sDL_WriteAsyncIO', 'sDL_GetAsyncIOResult', 'sDL_WaitAsyncIOResult'
+--
+--     [C declaration]: @struct SDL_AsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 183:16@
+data SDL_AsyncIOQueue
diff --git a/src/SDL3/Sys/Bindgen/Asyncio/FunPtr.hs b/src/SDL3/Sys/Bindgen/Asyncio/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Asyncio/FunPtr.hs
@@ -0,0 +1,637 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Asyncio.FunPtr (
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_AsyncIOFromFile,
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_GetAsyncIOSize,
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_ReadAsyncIO,
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_WriteAsyncIO,
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_CloseAsyncIO,
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_CreateAsyncIOQueue,
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_DestroyAsyncIOQueue,
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_GetAsyncIOResult,
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_WaitAsyncIOResult,
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_SignalAsyncIOQueue,
+  SDL3.Sys.Bindgen.Asyncio.FunPtr.sDL_LoadFileAsync,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Asyncio
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_asyncio.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_AsyncIOFromFile */"
+         , "__attribute__ ((const))"
+         , "SDL_AsyncIO *(*hs_bindgen_1df76789789f6d0b (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_AsyncIOFromFile;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_GetAsyncIOSize */"
+         , "__attribute__ ((const))"
+         , "Sint64 (*hs_bindgen_2873a0d4a88e3a7b (void)) ("
+         , "  SDL_AsyncIO *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAsyncIOSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_ReadAsyncIO */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c870b15855ed63f1 (void)) ("
+         , "  SDL_AsyncIO *arg1,"
+         , "  void *arg2,"
+         , "  Uint64 arg3,"
+         , "  Uint64 arg4,"
+         , "  SDL_AsyncIOQueue *arg5,"
+         , "  void *arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadAsyncIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_WriteAsyncIO */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9a68985237acc0c3 (void)) ("
+         , "  SDL_AsyncIO *arg1,"
+         , "  void *arg2,"
+         , "  Uint64 arg3,"
+         , "  Uint64 arg4,"
+         , "  SDL_AsyncIOQueue *arg5,"
+         , "  void *arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteAsyncIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_CloseAsyncIO */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e5791205836e93d4 (void)) ("
+         , "  SDL_AsyncIO *arg1,"
+         , "  _Bool arg2,"
+         , "  SDL_AsyncIOQueue *arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_CloseAsyncIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_CreateAsyncIOQueue */"
+         , "__attribute__ ((const))"
+         , "SDL_AsyncIOQueue *(*hs_bindgen_bad5a1c7bbfc4f36 (void)) (void)"
+         , "{"
+         , "  return &SDL_CreateAsyncIOQueue;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_DestroyAsyncIOQueue */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_f1f3445924531218 (void)) ("
+         , "  SDL_AsyncIOQueue *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyAsyncIOQueue;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_GetAsyncIOResult */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a377aedfcfda7243 (void)) ("
+         , "  SDL_AsyncIOQueue *arg1,"
+         , "  SDL_AsyncIOOutcome *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAsyncIOResult;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_WaitAsyncIOResult */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1b55fd087de307a9 (void)) ("
+         , "  SDL_AsyncIOQueue *arg1,"
+         , "  SDL_AsyncIOOutcome *arg2,"
+         , "  Sint32 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitAsyncIOResult;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_SignalAsyncIOQueue */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_094baddfb7dfcf9e (void)) ("
+         , "  SDL_AsyncIOQueue *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SignalAsyncIOQueue;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_LoadFileAsync */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f844da257a66f6c5 (void)) ("
+         , "  char const *arg1,"
+         , "  SDL_AsyncIOQueue *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_LoadFileAsync;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_AsyncIOFromFile@
+foreign import ccall unsafe "hs_bindgen_1df76789789f6d0b"
+  hs_bindgen_1df76789789f6d0b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_AsyncIOFromFile@
+hs_bindgen_1df76789789f6d0b
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_AsyncIO)))
+hs_bindgen_1df76789789f6d0b =
+  BG.fromFFIType hs_bindgen_1df76789789f6d0b_base
+
+{-# NOINLINE sDL_AsyncIOFromFile #-}
+
+-- | Use this function to create a new 'SDL_AsyncIO' object for reading from and\/or writing to a named file.
+--
+--     The @mode@ string understands the following values:
+--
+--     * \"r\": Open a file for reading only. It must exist.
+--
+--     * \"w\": Open a file for writing only. It will create missing files or truncate existing ones.
+--
+--     * \"r+\": Open a file for update both reading and writing. The file must exist.
+--
+--     * \"w+\": Create an empty file for both reading and writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     There is no \"b\" mode, as there is only \"binary\" style I\/O, and no \"a\" mode for appending, since you specify the position when starting a task.
+--
+--     This function supports Unicode filenames, but they must be encoded in UTF-8 format, regardless of the underlying operating system.
+--
+--     This call is /not/ asynchronous; it will open the file before returning, under the assumption that doing so is generally a fast operation. Future reads and writes to the opened file will be async, however.
+--
+--     [@file@]: a UTF-8 string representing the filename to open.
+--
+--     [@mode@]: an ASCII string representing the mode to be used for opening the file.
+--
+--     [Returns]: a pointer to the 'SDL_AsyncIO' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseAsyncIO', 'sDL_ReadAsyncIO', 'sDL_WriteAsyncIO'
+--
+--     [C declaration]: @SDL_AsyncIOFromFile@, defined at @SDL3\/SDL_asyncio.h 224:43@
+sDL_AsyncIOFromFile
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_AsyncIO))
+sDL_AsyncIOFromFile =
+  BG.unsafePerformIO hs_bindgen_1df76789789f6d0b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_GetAsyncIOSize@
+foreign import ccall unsafe "hs_bindgen_2873a0d4a88e3a7b"
+  hs_bindgen_2873a0d4a88e3a7b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_GetAsyncIOSize@
+hs_bindgen_2873a0d4a88e3a7b
+  :: IO (BG.FunPtr (BG.Ptr SDL_AsyncIO -> IO SDL3.Sys.Bindgen.Stdinc.Sint64))
+hs_bindgen_2873a0d4a88e3a7b =
+  BG.fromFFIType hs_bindgen_2873a0d4a88e3a7b_base
+
+{-# NOINLINE sDL_GetAsyncIOSize #-}
+
+-- | Use this function to get the size of the data stream in an 'SDL_AsyncIO'.
+--
+--     This call is /not/ asynchronous; it assumes that obtaining this info is a non-blocking operation in most reasonable cases.
+--
+--     [@asyncio@]: the 'SDL_AsyncIO' to get the size of the data stream from.
+--
+--     [Returns]: the size of the data stream in the SDL_IOStream on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAsyncIOSize@, defined at @SDL3\/SDL_asyncio.h 241:36@
+sDL_GetAsyncIOSize :: BG.FunPtr (BG.Ptr SDL_AsyncIO -> IO SDL3.Sys.Bindgen.Stdinc.Sint64)
+sDL_GetAsyncIOSize =
+  BG.unsafePerformIO hs_bindgen_2873a0d4a88e3a7b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_ReadAsyncIO@
+foreign import ccall unsafe "hs_bindgen_c870b15855ed63f1"
+  hs_bindgen_c870b15855ed63f1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_ReadAsyncIO@
+hs_bindgen_c870b15855ed63f1
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_AsyncIO
+             -> BG.Ptr BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> BG.Ptr SDL_AsyncIOQueue
+             -> BG.Ptr BG.Void
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_c870b15855ed63f1 =
+  BG.fromFFIType hs_bindgen_c870b15855ed63f1_base
+
+{-# NOINLINE sDL_ReadAsyncIO #-}
+
+-- | Start an async read.
+--
+--     This function reads up to @size@ bytes from @offset@ position in the data source to the area pointed at by @ptr@. This function may read less bytes than requested.
+--
+--     This function returns as quickly as possible; it does not wait for the read to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     @ptr@ must remain available until the work is done, and may be accessed by the system at any time until then. Do not allocate it on the stack, as this might take longer than the life of the calling function to complete!
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure.
+--
+--     [@ptr@]: a pointer to a buffer to read data into.
+--
+--     [@offset@]: the position to start reading in the data source.
+--
+--     [@size@]: the number of bytes to read from the data source.
+--
+--     [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+--
+--     [@userdata@]: an app-defined pointer that will be provided with the task results.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WriteAsyncIO', 'sDL_CreateAsyncIOQueue'
+--
+--     [C declaration]: @SDL_ReadAsyncIO@, defined at @SDL3\/SDL_asyncio.h 279:34@
+sDL_ReadAsyncIO
+  :: BG.FunPtr
+       ( BG.Ptr SDL_AsyncIO
+         -> BG.Ptr BG.Void
+         -> SDL3.Sys.Bindgen.Stdinc.Uint64
+         -> SDL3.Sys.Bindgen.Stdinc.Uint64
+         -> BG.Ptr SDL_AsyncIOQueue
+         -> BG.Ptr BG.Void
+         -> IO BG.CBool
+       )
+sDL_ReadAsyncIO =
+  BG.unsafePerformIO hs_bindgen_c870b15855ed63f1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_WriteAsyncIO@
+foreign import ccall unsafe "hs_bindgen_9a68985237acc0c3"
+  hs_bindgen_9a68985237acc0c3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_WriteAsyncIO@
+hs_bindgen_9a68985237acc0c3
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_AsyncIO
+             -> BG.Ptr BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> BG.Ptr SDL_AsyncIOQueue
+             -> BG.Ptr BG.Void
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_9a68985237acc0c3 =
+  BG.fromFFIType hs_bindgen_9a68985237acc0c3_base
+
+{-# NOINLINE sDL_WriteAsyncIO #-}
+
+-- | Start an async write.
+--
+--     This function writes @size@ bytes from @offset@ position in the data source to the area pointed at by @ptr@.
+--
+--     This function returns as quickly as possible; it does not wait for the write to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     @ptr@ must remain available until the work is done, and may be accessed by the system at any time until then. Do not allocate it on the stack, as this might take longer than the life of the calling function to complete!
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure.
+--
+--     [@ptr@]: a pointer to a buffer to write data from.
+--
+--     [@offset@]: the position to start writing to the data source.
+--
+--     [@size@]: the number of bytes to write to the data source.
+--
+--     [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+--
+--     [@userdata@]: an app-defined pointer that will be provided with the task results.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ReadAsyncIO', 'sDL_CreateAsyncIOQueue'
+--
+--     [C declaration]: @SDL_WriteAsyncIO@, defined at @SDL3\/SDL_asyncio.h 316:34@
+sDL_WriteAsyncIO
+  :: BG.FunPtr
+       ( BG.Ptr SDL_AsyncIO
+         -> BG.Ptr BG.Void
+         -> SDL3.Sys.Bindgen.Stdinc.Uint64
+         -> SDL3.Sys.Bindgen.Stdinc.Uint64
+         -> BG.Ptr SDL_AsyncIOQueue
+         -> BG.Ptr BG.Void
+         -> IO BG.CBool
+       )
+sDL_WriteAsyncIO =
+  BG.unsafePerformIO hs_bindgen_9a68985237acc0c3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_CloseAsyncIO@
+foreign import ccall unsafe "hs_bindgen_e5791205836e93d4"
+  hs_bindgen_e5791205836e93d4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_CloseAsyncIO@
+hs_bindgen_e5791205836e93d4
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_AsyncIO -> BG.CBool -> BG.Ptr SDL_AsyncIOQueue -> BG.Ptr BG.Void -> IO BG.CBool)
+       )
+hs_bindgen_e5791205836e93d4 =
+  BG.fromFFIType hs_bindgen_e5791205836e93d4_base
+
+{-# NOINLINE sDL_CloseAsyncIO #-}
+
+-- | Close and free any allocated resources for an async I\/O object.
+--
+--     Closing a file is /also/ an asynchronous task! If a write failure were to happen during the closing process, for example, the task results will report it as usual.
+--
+--     Closing a file that has been written to does not guarantee the data has made it to physical media; it may remain in the operating system\'s file cache, for later writing to disk. This means that a successfully-closed file can be lost if the system crashes or loses power in this small window. To prevent this, call this function with the @flush@ parameter set to true. This will make the operation take longer, and perhaps increase system load in general, but a successful result guarantees that the data has made it to physical storage. Don\'t use this for temporary files, caches, and unimportant data, and definitely use it for crucial irreplaceable files, like game saves.
+--
+--     This function guarantees that the close will happen after any other pending tasks to @asyncio@, so it\'s safe to open a file, start several operations, close the file immediately, then check for all results later. This function will not block until the tasks have completed.
+--
+--     Once this function returns true, @asyncio@ is no longer valid, regardless of any future outcomes. Any completed tasks might still contain this pointer in their 'SDL_AsyncIOOutcome' data, in case the app was using this value to track information, but it should not be used again.
+--
+--     If this function returns false, the close wasn\'t started at all, and it\'s safe to attempt to close again later.
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure to close.
+--
+--     [@flush@]: true if data should sync to disk before the task completes.
+--
+--     [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+--
+--     [@userdata@]: an app-defined pointer that will be provided with the task results.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but two threads should not attempt to close the same object.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CloseAsyncIO@, defined at @SDL3\/SDL_asyncio.h 365:34@
+sDL_CloseAsyncIO
+  :: BG.FunPtr
+       (BG.Ptr SDL_AsyncIO -> BG.CBool -> BG.Ptr SDL_AsyncIOQueue -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_CloseAsyncIO =
+  BG.unsafePerformIO hs_bindgen_e5791205836e93d4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_CreateAsyncIOQueue@
+foreign import ccall unsafe "hs_bindgen_bad5a1c7bbfc4f36"
+  hs_bindgen_bad5a1c7bbfc4f36_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_CreateAsyncIOQueue@
+hs_bindgen_bad5a1c7bbfc4f36 :: IO (BG.FunPtr (IO (BG.Ptr SDL_AsyncIOQueue)))
+hs_bindgen_bad5a1c7bbfc4f36 =
+  BG.fromFFIType hs_bindgen_bad5a1c7bbfc4f36_base
+
+{-# NOINLINE sDL_CreateAsyncIOQueue #-}
+
+-- | Create a task queue for tracking multiple I\/O operations.
+--
+--     Async I\/O operations are assigned to a queue when started. The queue can be checked for completed tasks thereafter.
+--
+--     [Returns]: a new task queue object or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyAsyncIOQueue', 'sDL_GetAsyncIOResult', 'sDL_WaitAsyncIOResult'
+--
+--     [C declaration]: @SDL_CreateAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 384:48@
+sDL_CreateAsyncIOQueue :: BG.FunPtr (IO (BG.Ptr SDL_AsyncIOQueue))
+sDL_CreateAsyncIOQueue =
+  BG.unsafePerformIO hs_bindgen_bad5a1c7bbfc4f36
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_DestroyAsyncIOQueue@
+foreign import ccall unsafe "hs_bindgen_f1f3445924531218"
+  hs_bindgen_f1f3445924531218_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_DestroyAsyncIOQueue@
+hs_bindgen_f1f3445924531218 :: IO (BG.FunPtr (BG.Ptr SDL_AsyncIOQueue -> IO ()))
+hs_bindgen_f1f3445924531218 =
+  BG.fromFFIType hs_bindgen_f1f3445924531218_base
+
+{-# NOINLINE sDL_DestroyAsyncIOQueue #-}
+
+-- | Destroy a previously-created async I\/O task queue.
+--
+--     If there are still tasks pending for this queue, this call will block until those tasks are finished. All those tasks will be deallocated. Their results will be lost to the app.
+--
+--     Any pending reads from @SDL_LoadFileAsync()@ that are still in this queue will have their buffers deallocated by this function, to prevent a memory leak.
+--
+--     Once this function is called, the queue is no longer valid and should not be used, including by other threads that might access it while destruction is blocking on pending tasks.
+--
+--     Do not destroy a queue that still has threads waiting on it through @SDL_WaitAsyncIOResult()@. You can call @SDL_SignalAsyncIOQueue()@ first to unblock those threads, and take measures (such as SDL_WaitThread()) to make sure they have finished their wait and won\'t wait on the queue again.
+--
+--     [@queue@]: the task queue to destroy.
+--
+--     [Thread safety]: It is safe to call this function from any thread, so long as no other thread is waiting on the queue with SDL_WaitAsyncIOResult.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DestroyAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 414:34@
+sDL_DestroyAsyncIOQueue :: BG.FunPtr (BG.Ptr SDL_AsyncIOQueue -> IO ())
+sDL_DestroyAsyncIOQueue =
+  BG.unsafePerformIO hs_bindgen_f1f3445924531218
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_GetAsyncIOResult@
+foreign import ccall unsafe "hs_bindgen_a377aedfcfda7243"
+  hs_bindgen_a377aedfcfda7243_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_GetAsyncIOResult@
+hs_bindgen_a377aedfcfda7243
+  :: IO (BG.FunPtr (BG.Ptr SDL_AsyncIOQueue -> BG.Ptr SDL_AsyncIOOutcome -> IO BG.CBool))
+hs_bindgen_a377aedfcfda7243 =
+  BG.fromFFIType hs_bindgen_a377aedfcfda7243_base
+
+{-# NOINLINE sDL_GetAsyncIOResult #-}
+
+-- | Query an async I\/O task queue for completed tasks.
+--
+--     If a task assigned to this queue has finished, this will return true and fill in @outcome@ with the details of the task. If no task in the queue has finished, this function will return false. This function does not block.
+--
+--     If a task has completed, this function will free its resources and the task pointer will no longer be valid. The task will be removed from the queue.
+--
+--     It is safe for multiple threads to call this function on the same queue at once; a completed task will only go to one of the threads.
+--
+--     [@queue@]: the async I\/O task queue to query.
+--
+--     [@outcome@]: details of a finished task will be written here. May not be NULL.
+--
+--     [Returns]: true if a task has completed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAsyncIOResult'
+--
+--     [C declaration]: @SDL_GetAsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 440:34@
+sDL_GetAsyncIOResult
+  :: BG.FunPtr (BG.Ptr SDL_AsyncIOQueue -> BG.Ptr SDL_AsyncIOOutcome -> IO BG.CBool)
+sDL_GetAsyncIOResult =
+  BG.unsafePerformIO hs_bindgen_a377aedfcfda7243
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_WaitAsyncIOResult@
+foreign import ccall unsafe "hs_bindgen_1b55fd087de307a9"
+  hs_bindgen_1b55fd087de307a9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_WaitAsyncIOResult@
+hs_bindgen_1b55fd087de307a9
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_AsyncIOQueue
+             -> BG.Ptr SDL_AsyncIOOutcome
+             -> SDL3.Sys.Bindgen.Stdinc.Sint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_1b55fd087de307a9 =
+  BG.fromFFIType hs_bindgen_1b55fd087de307a9_base
+
+{-# NOINLINE sDL_WaitAsyncIOResult #-}
+
+-- | Block until an async I\/O task queue has a completed task.
+--
+--     This function puts the calling thread to sleep until there a task assigned to the queue that has finished.
+--
+--     If a task assigned to the queue has finished, this will return true and fill in @outcome@ with the details of the task. If no task in the queue has finished, this function will return false.
+--
+--     If a task has completed, this function will free its resources and the task pointer will no longer be valid. The task will be removed from the queue.
+--
+--     It is safe for multiple threads to call this function on the same queue at once; a completed task will only go to one of the threads.
+--
+--     Note that by the nature of various platforms, more than one waiting thread may wake to handle a single task, but only one will obtain it, so @timeoutMS@ is a /maximum/ wait time, and this function may return false sooner.
+--
+--     This function may return false if there was a system error, the OS inadvertently awoke multiple threads, or if @SDL_SignalAsyncIOQueue()@ was called to wake up all waiting threads without a finished task.
+--
+--     A timeout can be used to specify a maximum wait time, but rather than polling, it is possible to have a timeout of -1 to wait forever, and use @SDL_SignalAsyncIOQueue()@ to wake up the waiting threads later.
+--
+--     [@queue@]: the async I\/O task queue to wait on.
+--
+--     [@outcome@]: details of a finished task will be written here. May not be NULL.
+--
+--     [@timeoutMS@]: the maximum time to wait, in milliseconds, or -1 to wait indefinitely.
+--
+--     [Returns]: true if task has completed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalAsyncIOQueue'
+--
+--     [C declaration]: @SDL_WaitAsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 484:34@
+sDL_WaitAsyncIOResult
+  :: BG.FunPtr
+       ( BG.Ptr SDL_AsyncIOQueue
+         -> BG.Ptr SDL_AsyncIOOutcome
+         -> SDL3.Sys.Bindgen.Stdinc.Sint32
+         -> IO BG.CBool
+       )
+sDL_WaitAsyncIOResult =
+  BG.unsafePerformIO hs_bindgen_1b55fd087de307a9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_SignalAsyncIOQueue@
+foreign import ccall unsafe "hs_bindgen_094baddfb7dfcf9e"
+  hs_bindgen_094baddfb7dfcf9e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_SignalAsyncIOQueue@
+hs_bindgen_094baddfb7dfcf9e :: IO (BG.FunPtr (BG.Ptr SDL_AsyncIOQueue -> IO ()))
+hs_bindgen_094baddfb7dfcf9e =
+  BG.fromFFIType hs_bindgen_094baddfb7dfcf9e_base
+
+{-# NOINLINE sDL_SignalAsyncIOQueue #-}
+
+-- | Wake up any threads that are blocking in @SDL_WaitAsyncIOResult()@.
+--
+--     This will unblock any threads that are sleeping in a call to SDL_WaitAsyncIOResult for the specified queue, and cause them to return from that function.
+--
+--     This can be useful when destroying a queue to make sure nothing is touching it indefinitely. In this case, once this call completes, the caller should take measures to make sure any previously-blocked threads have returned from their wait and will not touch the queue again (perhaps by setting a flag to tell the threads to terminate and then using SDL_WaitThread() to make sure they\'ve done so).
+--
+--     [@queue@]: the async I\/O task queue to signal.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAsyncIOResult'
+--
+--     [C declaration]: @SDL_SignalAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 508:34@
+sDL_SignalAsyncIOQueue :: BG.FunPtr (BG.Ptr SDL_AsyncIOQueue -> IO ())
+sDL_SignalAsyncIOQueue =
+  BG.unsafePerformIO hs_bindgen_094baddfb7dfcf9e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_LoadFileAsync@
+foreign import ccall unsafe "hs_bindgen_f844da257a66f6c5"
+  hs_bindgen_f844da257a66f6c5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_get_SDL_LoadFileAsync@
+hs_bindgen_f844da257a66f6c5
+  :: IO
+       (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr SDL_AsyncIOQueue -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_f844da257a66f6c5 =
+  BG.fromFFIType hs_bindgen_f844da257a66f6c5_base
+
+{-# NOINLINE sDL_LoadFileAsync #-}
+
+-- | Load all the data from a file path, asynchronously.
+--
+--     This function returns as quickly as possible; it does not wait for the read to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in 'SDL_AsyncIOOutcome' \'s bytes_transferred value.
+--
+--     This function will allocate the buffer to contain the file. It must be deallocated by calling SDL_free() on 'SDL_AsyncIOOutcome' \'s buffer field after completion.
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [@file@]: the path to read all available data from.
+--
+--     [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+--
+--     [@userdata@]: an app-defined pointer that will be provided with the task results.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_LoadFile_IO
+--
+--     [C declaration]: @SDL_LoadFileAsync@, defined at @SDL3\/SDL_asyncio.h 542:34@
+sDL_LoadFileAsync
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr SDL_AsyncIOQueue -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_LoadFileAsync =
+  BG.unsafePerformIO hs_bindgen_f844da257a66f6c5
diff --git a/src/SDL3/Sys/Bindgen/Asyncio/Safe.hs b/src/SDL3/Sys/Bindgen/Asyncio/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Asyncio/Safe.hs
@@ -0,0 +1,650 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Asyncio.Safe (
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_AsyncIOFromFile,
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_GetAsyncIOSize,
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_ReadAsyncIO,
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_WriteAsyncIO,
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_CloseAsyncIO,
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_CreateAsyncIOQueue,
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_DestroyAsyncIOQueue,
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_GetAsyncIOResult,
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_WaitAsyncIOResult,
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_SignalAsyncIOQueue,
+  SDL3.Sys.Bindgen.Asyncio.Safe.sDL_LoadFileAsync,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Asyncio
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_asyncio.h>"
+         , "SDL_AsyncIO *hs_bindgen_31ab6fd411d04f78 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AsyncIOFromFile)(arg1, arg2);"
+         , "}"
+         , "Sint64 hs_bindgen_53193075bdfec7d8 ("
+         , "  SDL_AsyncIO *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAsyncIOSize)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_c7966557f41dcbfc ("
+         , "  SDL_AsyncIO *arg1,"
+         , "  void *arg2,"
+         , "  Uint64 arg3,"
+         , "  Uint64 arg4,"
+         , "  SDL_AsyncIOQueue *arg5,"
+         , "  void *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadAsyncIO)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_3970c0028c407ec9 ("
+         , "  SDL_AsyncIO *arg1,"
+         , "  void *arg2,"
+         , "  Uint64 arg3,"
+         , "  Uint64 arg4,"
+         , "  SDL_AsyncIOQueue *arg5,"
+         , "  void *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteAsyncIO)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_c29ad527f342080d ("
+         , "  SDL_AsyncIO *arg1,"
+         , "  _Bool arg2,"
+         , "  SDL_AsyncIOQueue *arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_CloseAsyncIO)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "SDL_AsyncIOQueue *hs_bindgen_175ded8a64120502 (void)"
+         , "{"
+         , "  return (SDL_CreateAsyncIOQueue)();"
+         , "}"
+         , "void hs_bindgen_4ff67e45af8870e5 ("
+         , "  SDL_AsyncIOQueue *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyAsyncIOQueue)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0fb3edb3afb2ac7e ("
+         , "  SDL_AsyncIOQueue *arg1,"
+         , "  SDL_AsyncIOOutcome *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAsyncIOResult)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_449b1d195d52a054 ("
+         , "  SDL_AsyncIOQueue *arg1,"
+         , "  SDL_AsyncIOOutcome *arg2,"
+         , "  Sint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitAsyncIOResult)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_ee15a5dcf2cc9ab4 ("
+         , "  SDL_AsyncIOQueue *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SignalAsyncIOQueue)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_7556f48fabd8988b ("
+         , "  char const *arg1,"
+         , "  SDL_AsyncIOQueue *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadFileAsync)(arg1, arg2, arg3);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_AsyncIOFromFile@
+foreign import ccall safe "hs_bindgen_31ab6fd411d04f78"
+  hs_bindgen_31ab6fd411d04f78_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_AsyncIOFromFile@
+hs_bindgen_31ab6fd411d04f78
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_AsyncIO)
+hs_bindgen_31ab6fd411d04f78 =
+  BG.fromFFIType hs_bindgen_31ab6fd411d04f78_base
+
+-- | Use this function to create a new 'SDL_AsyncIO' object for reading from and\/or writing to a named file.
+--
+--     The @mode@ string understands the following values:
+--
+--     * \"r\": Open a file for reading only. It must exist.
+--
+--     * \"w\": Open a file for writing only. It will create missing files or truncate existing ones.
+--
+--     * \"r+\": Open a file for update both reading and writing. The file must exist.
+--
+--     * \"w+\": Create an empty file for both reading and writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     There is no \"b\" mode, as there is only \"binary\" style I\/O, and no \"a\" mode for appending, since you specify the position when starting a task.
+--
+--     This function supports Unicode filenames, but they must be encoded in UTF-8 format, regardless of the underlying operating system.
+--
+--     This call is /not/ asynchronous; it will open the file before returning, under the assumption that doing so is generally a fast operation. Future reads and writes to the opened file will be async, however.
+--
+--     [Returns]: a pointer to the 'SDL_AsyncIO' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseAsyncIO', 'sDL_ReadAsyncIO', 'sDL_WriteAsyncIO'
+--
+--     [C declaration]: @SDL_AsyncIOFromFile@, defined at @SDL3\/SDL_asyncio.h 224:43@
+sDL_AsyncIOFromFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a UTF-8 string representing the filename to open.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mode@]: an ASCII string representing the mode to be used for opening the file.
+  -> IO (BG.Ptr SDL_AsyncIO)
+sDL_AsyncIOFromFile = hs_bindgen_31ab6fd411d04f78
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_GetAsyncIOSize@
+foreign import ccall safe "hs_bindgen_53193075bdfec7d8"
+  hs_bindgen_53193075bdfec7d8_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_GetAsyncIOSize@
+hs_bindgen_53193075bdfec7d8
+  :: BG.Ptr SDL_AsyncIO
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+hs_bindgen_53193075bdfec7d8 =
+  BG.fromFFIType hs_bindgen_53193075bdfec7d8_base
+
+-- | Use this function to get the size of the data stream in an 'SDL_AsyncIO'.
+--
+--     This call is /not/ asynchronous; it assumes that obtaining this info is a non-blocking operation in most reasonable cases.
+--
+--     [Returns]: the size of the data stream in the SDL_IOStream on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAsyncIOSize@, defined at @SDL3\/SDL_asyncio.h 241:36@
+sDL_GetAsyncIOSize
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: the 'SDL_AsyncIO' to get the size of the data stream from.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+sDL_GetAsyncIOSize = hs_bindgen_53193075bdfec7d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_ReadAsyncIO@
+foreign import ccall safe "hs_bindgen_c7966557f41dcbfc"
+  hs_bindgen_c7966557f41dcbfc_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_ReadAsyncIO@
+hs_bindgen_c7966557f41dcbfc
+  :: BG.Ptr SDL_AsyncIO
+  -> BG.Ptr BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_c7966557f41dcbfc =
+  BG.fromFFIType hs_bindgen_c7966557f41dcbfc_base
+
+-- | Start an async read.
+--
+--     This function reads up to @size@ bytes from @offset@ position in the data source to the area pointed at by @ptr@. This function may read less bytes than requested.
+--
+--     This function returns as quickly as possible; it does not wait for the read to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     @ptr@ must remain available until the work is done, and may be accessed by the system at any time until then. Do not allocate it on the stack, as this might take longer than the life of the calling function to complete!
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WriteAsyncIO', 'sDL_CreateAsyncIOQueue'
+--
+--     [C declaration]: @SDL_ReadAsyncIO@, defined at @SDL3\/SDL_asyncio.h 279:34@
+sDL_ReadAsyncIO
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to read data into.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@offset@]: the position to start reading in the data source.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to read from the data source.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO BG.CBool
+sDL_ReadAsyncIO = hs_bindgen_c7966557f41dcbfc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_WriteAsyncIO@
+foreign import ccall safe "hs_bindgen_3970c0028c407ec9"
+  hs_bindgen_3970c0028c407ec9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_WriteAsyncIO@
+hs_bindgen_3970c0028c407ec9
+  :: BG.Ptr SDL_AsyncIO
+  -> BG.Ptr BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_3970c0028c407ec9 =
+  BG.fromFFIType hs_bindgen_3970c0028c407ec9_base
+
+-- | Start an async write.
+--
+--     This function writes @size@ bytes from @offset@ position in the data source to the area pointed at by @ptr@.
+--
+--     This function returns as quickly as possible; it does not wait for the write to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     @ptr@ must remain available until the work is done, and may be accessed by the system at any time until then. Do not allocate it on the stack, as this might take longer than the life of the calling function to complete!
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ReadAsyncIO', 'sDL_CreateAsyncIOQueue'
+--
+--     [C declaration]: @SDL_WriteAsyncIO@, defined at @SDL3\/SDL_asyncio.h 316:34@
+sDL_WriteAsyncIO
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to write data from.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@offset@]: the position to start writing to the data source.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to write to the data source.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO BG.CBool
+sDL_WriteAsyncIO = hs_bindgen_3970c0028c407ec9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_CloseAsyncIO@
+foreign import ccall safe "hs_bindgen_c29ad527f342080d"
+  hs_bindgen_c29ad527f342080d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_CloseAsyncIO@
+hs_bindgen_c29ad527f342080d
+  :: BG.Ptr SDL_AsyncIO
+  -> BG.CBool
+  -> BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_c29ad527f342080d =
+  BG.fromFFIType hs_bindgen_c29ad527f342080d_base
+
+-- | Close and free any allocated resources for an async I\/O object.
+--
+--     Closing a file is /also/ an asynchronous task! If a write failure were to happen during the closing process, for example, the task results will report it as usual.
+--
+--     Closing a file that has been written to does not guarantee the data has made it to physical media; it may remain in the operating system\'s file cache, for later writing to disk. This means that a successfully-closed file can be lost if the system crashes or loses power in this small window. To prevent this, call this function with the @flush@ parameter set to true. This will make the operation take longer, and perhaps increase system load in general, but a successful result guarantees that the data has made it to physical storage. Don\'t use this for temporary files, caches, and unimportant data, and definitely use it for crucial irreplaceable files, like game saves.
+--
+--     This function guarantees that the close will happen after any other pending tasks to @asyncio@, so it\'s safe to open a file, start several operations, close the file immediately, then check for all results later. This function will not block until the tasks have completed.
+--
+--     Once this function returns true, @asyncio@ is no longer valid, regardless of any future outcomes. Any completed tasks might still contain this pointer in their 'SDL_AsyncIOOutcome' data, in case the app was using this value to track information, but it should not be used again.
+--
+--     If this function returns false, the close wasn\'t started at all, and it\'s safe to attempt to close again later.
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but two threads should not attempt to close the same object.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CloseAsyncIO@, defined at @SDL3\/SDL_asyncio.h 365:34@
+sDL_CloseAsyncIO
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure to close.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@flush@]: true if data should sync to disk before the task completes.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO BG.CBool
+sDL_CloseAsyncIO = hs_bindgen_c29ad527f342080d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_CreateAsyncIOQueue@
+foreign import ccall safe "hs_bindgen_175ded8a64120502"
+  hs_bindgen_175ded8a64120502_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_CreateAsyncIOQueue@
+hs_bindgen_175ded8a64120502 :: IO (BG.Ptr SDL_AsyncIOQueue)
+hs_bindgen_175ded8a64120502 =
+  BG.fromFFIType hs_bindgen_175ded8a64120502_base
+
+-- | Create a task queue for tracking multiple I\/O operations.
+--
+--     Async I\/O operations are assigned to a queue when started. The queue can be checked for completed tasks thereafter.
+--
+--     [Returns]: a new task queue object or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyAsyncIOQueue', 'sDL_GetAsyncIOResult', 'sDL_WaitAsyncIOResult'
+--
+--     [C declaration]: @SDL_CreateAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 384:48@
+sDL_CreateAsyncIOQueue :: IO (BG.Ptr SDL_AsyncIOQueue)
+sDL_CreateAsyncIOQueue = hs_bindgen_175ded8a64120502
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_DestroyAsyncIOQueue@
+foreign import ccall safe "hs_bindgen_4ff67e45af8870e5"
+  hs_bindgen_4ff67e45af8870e5_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_DestroyAsyncIOQueue@
+hs_bindgen_4ff67e45af8870e5
+  :: BG.Ptr SDL_AsyncIOQueue
+  -> IO ()
+hs_bindgen_4ff67e45af8870e5 =
+  BG.fromFFIType hs_bindgen_4ff67e45af8870e5_base
+
+-- | Destroy a previously-created async I\/O task queue.
+--
+--     If there are still tasks pending for this queue, this call will block until those tasks are finished. All those tasks will be deallocated. Their results will be lost to the app.
+--
+--     Any pending reads from @SDL_LoadFileAsync()@ that are still in this queue will have their buffers deallocated by this function, to prevent a memory leak.
+--
+--     Once this function is called, the queue is no longer valid and should not be used, including by other threads that might access it while destruction is blocking on pending tasks.
+--
+--     Do not destroy a queue that still has threads waiting on it through @SDL_WaitAsyncIOResult()@. You can call @SDL_SignalAsyncIOQueue()@ first to unblock those threads, and take measures (such as SDL_WaitThread()) to make sure they have finished their wait and won\'t wait on the queue again.
+--
+--     [Thread safety]: It is safe to call this function from any thread, so long as no other thread is waiting on the queue with SDL_WaitAsyncIOResult.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DestroyAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 414:34@
+sDL_DestroyAsyncIOQueue
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the task queue to destroy.
+  -> IO ()
+sDL_DestroyAsyncIOQueue = hs_bindgen_4ff67e45af8870e5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_GetAsyncIOResult@
+foreign import ccall safe "hs_bindgen_0fb3edb3afb2ac7e"
+  hs_bindgen_0fb3edb3afb2ac7e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_GetAsyncIOResult@
+hs_bindgen_0fb3edb3afb2ac7e
+  :: BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -> IO BG.CBool
+hs_bindgen_0fb3edb3afb2ac7e =
+  BG.fromFFIType hs_bindgen_0fb3edb3afb2ac7e_base
+
+-- | Query an async I\/O task queue for completed tasks.
+--
+--     If a task assigned to this queue has finished, this will return true and fill in @outcome@ with the details of the task. If no task in the queue has finished, this function will return false. This function does not block.
+--
+--     If a task has completed, this function will free its resources and the task pointer will no longer be valid. The task will be removed from the queue.
+--
+--     It is safe for multiple threads to call this function on the same queue at once; a completed task will only go to one of the threads.
+--
+--     [Returns]: true if a task has completed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAsyncIOResult'
+--
+--     [C declaration]: @SDL_GetAsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 440:34@
+sDL_GetAsyncIOResult
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to query.
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -- ^
+  --
+  --           [@outcome@]: details of a finished task will be written here. May not be NULL.
+  -> IO BG.CBool
+sDL_GetAsyncIOResult = hs_bindgen_0fb3edb3afb2ac7e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_WaitAsyncIOResult@
+foreign import ccall safe "hs_bindgen_449b1d195d52a054"
+  hs_bindgen_449b1d195d52a054_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_WaitAsyncIOResult@
+hs_bindgen_449b1d195d52a054
+  :: BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_449b1d195d52a054 =
+  BG.fromFFIType hs_bindgen_449b1d195d52a054_base
+
+-- | Block until an async I\/O task queue has a completed task.
+--
+--     This function puts the calling thread to sleep until there a task assigned to the queue that has finished.
+--
+--     If a task assigned to the queue has finished, this will return true and fill in @outcome@ with the details of the task. If no task in the queue has finished, this function will return false.
+--
+--     If a task has completed, this function will free its resources and the task pointer will no longer be valid. The task will be removed from the queue.
+--
+--     It is safe for multiple threads to call this function on the same queue at once; a completed task will only go to one of the threads.
+--
+--     Note that by the nature of various platforms, more than one waiting thread may wake to handle a single task, but only one will obtain it, so @timeoutMS@ is a /maximum/ wait time, and this function may return false sooner.
+--
+--     This function may return false if there was a system error, the OS inadvertently awoke multiple threads, or if @SDL_SignalAsyncIOQueue()@ was called to wake up all waiting threads without a finished task.
+--
+--     A timeout can be used to specify a maximum wait time, but rather than polling, it is possible to have a timeout of -1 to wait forever, and use @SDL_SignalAsyncIOQueue()@ to wake up the waiting threads later.
+--
+--     [Returns]: true if task has completed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalAsyncIOQueue'
+--
+--     [C declaration]: @SDL_WaitAsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 484:34@
+sDL_WaitAsyncIOResult
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to wait on.
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -- ^
+  --
+  --           [@outcome@]: details of a finished task will be written here. May not be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum time to wait, in milliseconds, or -1 to wait indefinitely.
+  -> IO BG.CBool
+sDL_WaitAsyncIOResult = hs_bindgen_449b1d195d52a054
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_SignalAsyncIOQueue@
+foreign import ccall safe "hs_bindgen_ee15a5dcf2cc9ab4"
+  hs_bindgen_ee15a5dcf2cc9ab4_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_SignalAsyncIOQueue@
+hs_bindgen_ee15a5dcf2cc9ab4
+  :: BG.Ptr SDL_AsyncIOQueue
+  -> IO ()
+hs_bindgen_ee15a5dcf2cc9ab4 =
+  BG.fromFFIType hs_bindgen_ee15a5dcf2cc9ab4_base
+
+-- | Wake up any threads that are blocking in @SDL_WaitAsyncIOResult()@.
+--
+--     This will unblock any threads that are sleeping in a call to SDL_WaitAsyncIOResult for the specified queue, and cause them to return from that function.
+--
+--     This can be useful when destroying a queue to make sure nothing is touching it indefinitely. In this case, once this call completes, the caller should take measures to make sure any previously-blocked threads have returned from their wait and will not touch the queue again (perhaps by setting a flag to tell the threads to terminate and then using SDL_WaitThread() to make sure they\'ve done so).
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAsyncIOResult'
+--
+--     [C declaration]: @SDL_SignalAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 508:34@
+sDL_SignalAsyncIOQueue
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to signal.
+  -> IO ()
+sDL_SignalAsyncIOQueue = hs_bindgen_ee15a5dcf2cc9ab4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_LoadFileAsync@
+foreign import ccall safe "hs_bindgen_7556f48fabd8988b"
+  hs_bindgen_7556f48fabd8988b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Safe_SDL_LoadFileAsync@
+hs_bindgen_7556f48fabd8988b
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_7556f48fabd8988b =
+  BG.fromFFIType hs_bindgen_7556f48fabd8988b_base
+
+-- | Load all the data from a file path, asynchronously.
+--
+--     This function returns as quickly as possible; it does not wait for the read to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in 'SDL_AsyncIOOutcome' \'s bytes_transferred value.
+--
+--     This function will allocate the buffer to contain the file. It must be deallocated by calling SDL_free() on 'SDL_AsyncIOOutcome' \'s buffer field after completion.
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_LoadFile_IO
+--
+--     [C declaration]: @SDL_LoadFileAsync@, defined at @SDL3\/SDL_asyncio.h 542:34@
+sDL_LoadFileAsync
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to read all available data from.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO BG.CBool
+sDL_LoadFileAsync = hs_bindgen_7556f48fabd8988b
diff --git a/src/SDL3/Sys/Bindgen/Asyncio/Unsafe.hs b/src/SDL3/Sys/Bindgen/Asyncio/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Asyncio/Unsafe.hs
@@ -0,0 +1,650 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Asyncio.Unsafe (
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_AsyncIOFromFile,
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_GetAsyncIOSize,
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_ReadAsyncIO,
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_WriteAsyncIO,
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_CloseAsyncIO,
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_CreateAsyncIOQueue,
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_DestroyAsyncIOQueue,
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_GetAsyncIOResult,
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_WaitAsyncIOResult,
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_SignalAsyncIOQueue,
+  SDL3.Sys.Bindgen.Asyncio.Unsafe.sDL_LoadFileAsync,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Asyncio
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_asyncio.h>"
+         , "SDL_AsyncIO *hs_bindgen_b82f292b6e7c7687 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AsyncIOFromFile)(arg1, arg2);"
+         , "}"
+         , "Sint64 hs_bindgen_11b3160b0d9e0815 ("
+         , "  SDL_AsyncIO *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAsyncIOSize)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_a7608bfc5c5b7642 ("
+         , "  SDL_AsyncIO *arg1,"
+         , "  void *arg2,"
+         , "  Uint64 arg3,"
+         , "  Uint64 arg4,"
+         , "  SDL_AsyncIOQueue *arg5,"
+         , "  void *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadAsyncIO)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_bb28a3e2adf0fdc9 ("
+         , "  SDL_AsyncIO *arg1,"
+         , "  void *arg2,"
+         , "  Uint64 arg3,"
+         , "  Uint64 arg4,"
+         , "  SDL_AsyncIOQueue *arg5,"
+         , "  void *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteAsyncIO)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_59b28e6203185e0c ("
+         , "  SDL_AsyncIO *arg1,"
+         , "  _Bool arg2,"
+         , "  SDL_AsyncIOQueue *arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_CloseAsyncIO)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "SDL_AsyncIOQueue *hs_bindgen_0b66ff14f8c0ce55 (void)"
+         , "{"
+         , "  return (SDL_CreateAsyncIOQueue)();"
+         , "}"
+         , "void hs_bindgen_2ac8fde123b3e134 ("
+         , "  SDL_AsyncIOQueue *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyAsyncIOQueue)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_a47b3011385bfa90 ("
+         , "  SDL_AsyncIOQueue *arg1,"
+         , "  SDL_AsyncIOOutcome *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAsyncIOResult)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c57196121c6d7557 ("
+         , "  SDL_AsyncIOQueue *arg1,"
+         , "  SDL_AsyncIOOutcome *arg2,"
+         , "  Sint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitAsyncIOResult)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_f68ee0d177862e72 ("
+         , "  SDL_AsyncIOQueue *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SignalAsyncIOQueue)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_c0a4fd9b015deb20 ("
+         , "  char const *arg1,"
+         , "  SDL_AsyncIOQueue *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadFileAsync)(arg1, arg2, arg3);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_AsyncIOFromFile@
+foreign import ccall unsafe "hs_bindgen_b82f292b6e7c7687"
+  hs_bindgen_b82f292b6e7c7687_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_AsyncIOFromFile@
+hs_bindgen_b82f292b6e7c7687
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_AsyncIO)
+hs_bindgen_b82f292b6e7c7687 =
+  BG.fromFFIType hs_bindgen_b82f292b6e7c7687_base
+
+-- | Use this function to create a new 'SDL_AsyncIO' object for reading from and\/or writing to a named file.
+--
+--     The @mode@ string understands the following values:
+--
+--     * \"r\": Open a file for reading only. It must exist.
+--
+--     * \"w\": Open a file for writing only. It will create missing files or truncate existing ones.
+--
+--     * \"r+\": Open a file for update both reading and writing. The file must exist.
+--
+--     * \"w+\": Create an empty file for both reading and writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     There is no \"b\" mode, as there is only \"binary\" style I\/O, and no \"a\" mode for appending, since you specify the position when starting a task.
+--
+--     This function supports Unicode filenames, but they must be encoded in UTF-8 format, regardless of the underlying operating system.
+--
+--     This call is /not/ asynchronous; it will open the file before returning, under the assumption that doing so is generally a fast operation. Future reads and writes to the opened file will be async, however.
+--
+--     [Returns]: a pointer to the 'SDL_AsyncIO' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseAsyncIO', 'sDL_ReadAsyncIO', 'sDL_WriteAsyncIO'
+--
+--     [C declaration]: @SDL_AsyncIOFromFile@, defined at @SDL3\/SDL_asyncio.h 224:43@
+sDL_AsyncIOFromFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a UTF-8 string representing the filename to open.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mode@]: an ASCII string representing the mode to be used for opening the file.
+  -> IO (BG.Ptr SDL_AsyncIO)
+sDL_AsyncIOFromFile = hs_bindgen_b82f292b6e7c7687
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_GetAsyncIOSize@
+foreign import ccall unsafe "hs_bindgen_11b3160b0d9e0815"
+  hs_bindgen_11b3160b0d9e0815_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_GetAsyncIOSize@
+hs_bindgen_11b3160b0d9e0815
+  :: BG.Ptr SDL_AsyncIO
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+hs_bindgen_11b3160b0d9e0815 =
+  BG.fromFFIType hs_bindgen_11b3160b0d9e0815_base
+
+-- | Use this function to get the size of the data stream in an 'SDL_AsyncIO'.
+--
+--     This call is /not/ asynchronous; it assumes that obtaining this info is a non-blocking operation in most reasonable cases.
+--
+--     [Returns]: the size of the data stream in the SDL_IOStream on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAsyncIOSize@, defined at @SDL3\/SDL_asyncio.h 241:36@
+sDL_GetAsyncIOSize
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: the 'SDL_AsyncIO' to get the size of the data stream from.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+sDL_GetAsyncIOSize = hs_bindgen_11b3160b0d9e0815
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_ReadAsyncIO@
+foreign import ccall unsafe "hs_bindgen_a7608bfc5c5b7642"
+  hs_bindgen_a7608bfc5c5b7642_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_ReadAsyncIO@
+hs_bindgen_a7608bfc5c5b7642
+  :: BG.Ptr SDL_AsyncIO
+  -> BG.Ptr BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_a7608bfc5c5b7642 =
+  BG.fromFFIType hs_bindgen_a7608bfc5c5b7642_base
+
+-- | Start an async read.
+--
+--     This function reads up to @size@ bytes from @offset@ position in the data source to the area pointed at by @ptr@. This function may read less bytes than requested.
+--
+--     This function returns as quickly as possible; it does not wait for the read to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     @ptr@ must remain available until the work is done, and may be accessed by the system at any time until then. Do not allocate it on the stack, as this might take longer than the life of the calling function to complete!
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WriteAsyncIO', 'sDL_CreateAsyncIOQueue'
+--
+--     [C declaration]: @SDL_ReadAsyncIO@, defined at @SDL3\/SDL_asyncio.h 279:34@
+sDL_ReadAsyncIO
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to read data into.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@offset@]: the position to start reading in the data source.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to read from the data source.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO BG.CBool
+sDL_ReadAsyncIO = hs_bindgen_a7608bfc5c5b7642
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_WriteAsyncIO@
+foreign import ccall unsafe "hs_bindgen_bb28a3e2adf0fdc9"
+  hs_bindgen_bb28a3e2adf0fdc9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_WriteAsyncIO@
+hs_bindgen_bb28a3e2adf0fdc9
+  :: BG.Ptr SDL_AsyncIO
+  -> BG.Ptr BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_bb28a3e2adf0fdc9 =
+  BG.fromFFIType hs_bindgen_bb28a3e2adf0fdc9_base
+
+-- | Start an async write.
+--
+--     This function writes @size@ bytes from @offset@ position in the data source to the area pointed at by @ptr@.
+--
+--     This function returns as quickly as possible; it does not wait for the write to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     @ptr@ must remain available until the work is done, and may be accessed by the system at any time until then. Do not allocate it on the stack, as this might take longer than the life of the calling function to complete!
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ReadAsyncIO', 'sDL_CreateAsyncIOQueue'
+--
+--     [C declaration]: @SDL_WriteAsyncIO@, defined at @SDL3\/SDL_asyncio.h 316:34@
+sDL_WriteAsyncIO
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to write data from.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@offset@]: the position to start writing to the data source.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to write to the data source.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO BG.CBool
+sDL_WriteAsyncIO = hs_bindgen_bb28a3e2adf0fdc9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_CloseAsyncIO@
+foreign import ccall unsafe "hs_bindgen_59b28e6203185e0c"
+  hs_bindgen_59b28e6203185e0c_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_CloseAsyncIO@
+hs_bindgen_59b28e6203185e0c
+  :: BG.Ptr SDL_AsyncIO
+  -> BG.CBool
+  -> BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_59b28e6203185e0c =
+  BG.fromFFIType hs_bindgen_59b28e6203185e0c_base
+
+-- | Close and free any allocated resources for an async I\/O object.
+--
+--     Closing a file is /also/ an asynchronous task! If a write failure were to happen during the closing process, for example, the task results will report it as usual.
+--
+--     Closing a file that has been written to does not guarantee the data has made it to physical media; it may remain in the operating system\'s file cache, for later writing to disk. This means that a successfully-closed file can be lost if the system crashes or loses power in this small window. To prevent this, call this function with the @flush@ parameter set to true. This will make the operation take longer, and perhaps increase system load in general, but a successful result guarantees that the data has made it to physical storage. Don\'t use this for temporary files, caches, and unimportant data, and definitely use it for crucial irreplaceable files, like game saves.
+--
+--     This function guarantees that the close will happen after any other pending tasks to @asyncio@, so it\'s safe to open a file, start several operations, close the file immediately, then check for all results later. This function will not block until the tasks have completed.
+--
+--     Once this function returns true, @asyncio@ is no longer valid, regardless of any future outcomes. Any completed tasks might still contain this pointer in their 'SDL_AsyncIOOutcome' data, in case the app was using this value to track information, but it should not be used again.
+--
+--     If this function returns false, the close wasn\'t started at all, and it\'s safe to attempt to close again later.
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but two threads should not attempt to close the same object.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CloseAsyncIO@, defined at @SDL3\/SDL_asyncio.h 365:34@
+sDL_CloseAsyncIO
+  :: BG.Ptr SDL_AsyncIO
+  -- ^
+  --
+  --           [@asyncio@]: a pointer to an 'SDL_AsyncIO' structure to close.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@flush@]: true if data should sync to disk before the task completes.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO BG.CBool
+sDL_CloseAsyncIO = hs_bindgen_59b28e6203185e0c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_CreateAsyncIOQueue@
+foreign import ccall unsafe "hs_bindgen_0b66ff14f8c0ce55"
+  hs_bindgen_0b66ff14f8c0ce55_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_CreateAsyncIOQueue@
+hs_bindgen_0b66ff14f8c0ce55 :: IO (BG.Ptr SDL_AsyncIOQueue)
+hs_bindgen_0b66ff14f8c0ce55 =
+  BG.fromFFIType hs_bindgen_0b66ff14f8c0ce55_base
+
+-- | Create a task queue for tracking multiple I\/O operations.
+--
+--     Async I\/O operations are assigned to a queue when started. The queue can be checked for completed tasks thereafter.
+--
+--     [Returns]: a new task queue object or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyAsyncIOQueue', 'sDL_GetAsyncIOResult', 'sDL_WaitAsyncIOResult'
+--
+--     [C declaration]: @SDL_CreateAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 384:48@
+sDL_CreateAsyncIOQueue :: IO (BG.Ptr SDL_AsyncIOQueue)
+sDL_CreateAsyncIOQueue = hs_bindgen_0b66ff14f8c0ce55
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_DestroyAsyncIOQueue@
+foreign import ccall unsafe "hs_bindgen_2ac8fde123b3e134"
+  hs_bindgen_2ac8fde123b3e134_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_DestroyAsyncIOQueue@
+hs_bindgen_2ac8fde123b3e134
+  :: BG.Ptr SDL_AsyncIOQueue
+  -> IO ()
+hs_bindgen_2ac8fde123b3e134 =
+  BG.fromFFIType hs_bindgen_2ac8fde123b3e134_base
+
+-- | Destroy a previously-created async I\/O task queue.
+--
+--     If there are still tasks pending for this queue, this call will block until those tasks are finished. All those tasks will be deallocated. Their results will be lost to the app.
+--
+--     Any pending reads from @SDL_LoadFileAsync()@ that are still in this queue will have their buffers deallocated by this function, to prevent a memory leak.
+--
+--     Once this function is called, the queue is no longer valid and should not be used, including by other threads that might access it while destruction is blocking on pending tasks.
+--
+--     Do not destroy a queue that still has threads waiting on it through @SDL_WaitAsyncIOResult()@. You can call @SDL_SignalAsyncIOQueue()@ first to unblock those threads, and take measures (such as SDL_WaitThread()) to make sure they have finished their wait and won\'t wait on the queue again.
+--
+--     [Thread safety]: It is safe to call this function from any thread, so long as no other thread is waiting on the queue with SDL_WaitAsyncIOResult.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DestroyAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 414:34@
+sDL_DestroyAsyncIOQueue
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the task queue to destroy.
+  -> IO ()
+sDL_DestroyAsyncIOQueue = hs_bindgen_2ac8fde123b3e134
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_GetAsyncIOResult@
+foreign import ccall unsafe "hs_bindgen_a47b3011385bfa90"
+  hs_bindgen_a47b3011385bfa90_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_GetAsyncIOResult@
+hs_bindgen_a47b3011385bfa90
+  :: BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -> IO BG.CBool
+hs_bindgen_a47b3011385bfa90 =
+  BG.fromFFIType hs_bindgen_a47b3011385bfa90_base
+
+-- | Query an async I\/O task queue for completed tasks.
+--
+--     If a task assigned to this queue has finished, this will return true and fill in @outcome@ with the details of the task. If no task in the queue has finished, this function will return false. This function does not block.
+--
+--     If a task has completed, this function will free its resources and the task pointer will no longer be valid. The task will be removed from the queue.
+--
+--     It is safe for multiple threads to call this function on the same queue at once; a completed task will only go to one of the threads.
+--
+--     [Returns]: true if a task has completed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAsyncIOResult'
+--
+--     [C declaration]: @SDL_GetAsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 440:34@
+sDL_GetAsyncIOResult
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to query.
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -- ^
+  --
+  --           [@outcome@]: details of a finished task will be written here. May not be NULL.
+  -> IO BG.CBool
+sDL_GetAsyncIOResult = hs_bindgen_a47b3011385bfa90
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_WaitAsyncIOResult@
+foreign import ccall unsafe "hs_bindgen_c57196121c6d7557"
+  hs_bindgen_c57196121c6d7557_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_WaitAsyncIOResult@
+hs_bindgen_c57196121c6d7557
+  :: BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_c57196121c6d7557 =
+  BG.fromFFIType hs_bindgen_c57196121c6d7557_base
+
+-- | Block until an async I\/O task queue has a completed task.
+--
+--     This function puts the calling thread to sleep until there a task assigned to the queue that has finished.
+--
+--     If a task assigned to the queue has finished, this will return true and fill in @outcome@ with the details of the task. If no task in the queue has finished, this function will return false.
+--
+--     If a task has completed, this function will free its resources and the task pointer will no longer be valid. The task will be removed from the queue.
+--
+--     It is safe for multiple threads to call this function on the same queue at once; a completed task will only go to one of the threads.
+--
+--     Note that by the nature of various platforms, more than one waiting thread may wake to handle a single task, but only one will obtain it, so @timeoutMS@ is a /maximum/ wait time, and this function may return false sooner.
+--
+--     This function may return false if there was a system error, the OS inadvertently awoke multiple threads, or if @SDL_SignalAsyncIOQueue()@ was called to wake up all waiting threads without a finished task.
+--
+--     A timeout can be used to specify a maximum wait time, but rather than polling, it is possible to have a timeout of -1 to wait forever, and use @SDL_SignalAsyncIOQueue()@ to wake up the waiting threads later.
+--
+--     [Returns]: true if task has completed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalAsyncIOQueue'
+--
+--     [C declaration]: @SDL_WaitAsyncIOResult@, defined at @SDL3\/SDL_asyncio.h 484:34@
+sDL_WaitAsyncIOResult
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to wait on.
+  -> BG.Ptr SDL_AsyncIOOutcome
+  -- ^
+  --
+  --           [@outcome@]: details of a finished task will be written here. May not be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum time to wait, in milliseconds, or -1 to wait indefinitely.
+  -> IO BG.CBool
+sDL_WaitAsyncIOResult = hs_bindgen_c57196121c6d7557
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_SignalAsyncIOQueue@
+foreign import ccall unsafe "hs_bindgen_f68ee0d177862e72"
+  hs_bindgen_f68ee0d177862e72_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_SignalAsyncIOQueue@
+hs_bindgen_f68ee0d177862e72
+  :: BG.Ptr SDL_AsyncIOQueue
+  -> IO ()
+hs_bindgen_f68ee0d177862e72 =
+  BG.fromFFIType hs_bindgen_f68ee0d177862e72_base
+
+-- | Wake up any threads that are blocking in @SDL_WaitAsyncIOResult()@.
+--
+--     This will unblock any threads that are sleeping in a call to SDL_WaitAsyncIOResult for the specified queue, and cause them to return from that function.
+--
+--     This can be useful when destroying a queue to make sure nothing is touching it indefinitely. In this case, once this call completes, the caller should take measures to make sure any previously-blocked threads have returned from their wait and will not touch the queue again (perhaps by setting a flag to tell the threads to terminate and then using SDL_WaitThread() to make sure they\'ve done so).
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAsyncIOResult'
+--
+--     [C declaration]: @SDL_SignalAsyncIOQueue@, defined at @SDL3\/SDL_asyncio.h 508:34@
+sDL_SignalAsyncIOQueue
+  :: BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: the async I\/O task queue to signal.
+  -> IO ()
+sDL_SignalAsyncIOQueue = hs_bindgen_f68ee0d177862e72
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_LoadFileAsync@
+foreign import ccall unsafe "hs_bindgen_c0a4fd9b015deb20"
+  hs_bindgen_c0a4fd9b015deb20_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Asyncio_Unsafe_SDL_LoadFileAsync@
+hs_bindgen_c0a4fd9b015deb20
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL_AsyncIOQueue
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_c0a4fd9b015deb20 =
+  BG.fromFFIType hs_bindgen_c0a4fd9b015deb20_base
+
+-- | Load all the data from a file path, asynchronously.
+--
+--     This function returns as quickly as possible; it does not wait for the read to complete. On a successful return, this work will continue in the background. If the work begins, even failure is asynchronous: a failing return value from this function only means the work couldn\'t start at all.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in 'SDL_AsyncIOOutcome' \'s bytes_transferred value.
+--
+--     This function will allocate the buffer to contain the file. It must be deallocated by calling SDL_free() on 'SDL_AsyncIOOutcome' \'s buffer field after completion.
+--
+--     An 'SDL_AsyncIOQueue' must be specified. The newly-created task will be added to it when it completes its work.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_LoadFile_IO
+--
+--     [C declaration]: @SDL_LoadFileAsync@, defined at @SDL3\/SDL_asyncio.h 542:34@
+sDL_LoadFileAsync
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to read all available data from.
+  -> BG.Ptr SDL_AsyncIOQueue
+  -- ^
+  --
+  --           [@queue@]: a queue to add the new 'SDL_AsyncIO' to.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an app-defined pointer that will be provided with the task results.
+  -> IO BG.CBool
+sDL_LoadFileAsync = hs_bindgen_c0a4fd9b015deb20
diff --git a/src/SDL3/Sys/Bindgen/Atomic.hs b/src/SDL3/Sys/Bindgen/Atomic.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Atomic.hs
@@ -0,0 +1,226 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Atomic operations.
+--
+--     IMPORTANT: If you are not an expert in concurrent lockless programming, you should not be using any functions in this file. You should be protecting your data structures with full mutexes instead.
+--
+--     /__Seriously, here be dragons!__/
+--
+--     You can find out a little more about lockless programming and the subtle issues that can arise here: [https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/dxtecharts\/lockless-programming](https://learn.microsoft.com/en-us/windows/win32/dxtecharts/lockless-programming)
+--
+--     There\'s also lots of good information here:
+--
+--     * [https:\/\/www.1024cores.net\/home\/lock-free-algorithms](https://www.1024cores.net/home/lock-free-algorithms)
+--
+--     * [https:\/\/preshing.com\/](https://preshing.com/)
+--
+--     These operations may or may not actually be implemented using processor specific atomic operations. When possible they are implemented as true processor specific atomic operations. When that is not possible the are implemented using locks that /do/ use the available atomic operations.
+--
+--     All of the atomic operations that modify memory are full memory barriers. An atomic spinlock.
+--
+--     The atomic locks are efficient spinlocks using CPU instructions, but are vulnerable to starvation and can spin forever if a thread holding a lock has been terminated. For this reason you should minimize the code executed inside an atomic lock and never do expensive things like API or system calls while holding them.
+--
+--     They are also vulnerable to starvation if the thread holding the lock is lower priority than other threads and doesn\'t get scheduled. In general you should use mutexes instead, since they have better performance and contention behavior.
+--
+--     The atomic locks are not safe to lock recursively.
+--
+--     Porting Note: The spin lock functions and type are required and can not be emulated because they are used in the atomic emulation code.
+module SDL3.Sys.Bindgen.Atomic (
+  SDL3.Sys.Bindgen.Atomic.SDL_SpinLock (..),
+  SDL3.Sys.Bindgen.Atomic.SDL_AtomicInt (..),
+  SDL3.Sys.Bindgen.Atomic.SDL_AtomicU32 (..),
+)
+where
+
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_SpinLock@, defined at @SDL3\/SDL_atomic.h 82:13@
+newtype SDL_SpinLock = SDL_SpinLock
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_SpinLock ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SpinLock{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_SpinLock) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_SpinLock "unwrap" where
+  type CFieldType SDL_SpinLock "unwrap" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | A type representing an atomic integer value.
+--
+--     This can be used to manage a value that is synchronized across multiple CPUs without a race condition; when an app sets a value with SDL_SetAtomicInt all other threads, regardless of the CPU it is running on, will see that value when retrieved with SDL_GetAtomicInt, regardless of CPU caches, etc.
+--
+--     This is also useful for atomic compare-and-swap operations: a thread can change the value as long as its current value matches expectations. When done in a loop, one can guarantee data consistency across threads without a lock (but the usual warnings apply: if you don\'t know what you\'re doing, or you don\'t do it carefully, you can confidently cause any number of disasters with this, so in most cases, you /should/ use a mutex instead of this!).
+--
+--     This is a struct so people don\'t accidentally use numeric operations on it directly. You have to use SDL atomic functions.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicInt', 'sDL_GetAtomicInt', 'sDL_SetAtomicInt', 'sDL_AddAtomicInt'
+--
+--     [C declaration]: @struct SDL_AtomicInt@, defined at @SDL3\/SDL_atomic.h 395:16@
+data SDL_AtomicInt = SDL_AtomicInt
+  { value :: BG.CInt
+  -- ^ [C declaration]: @value@, defined at @SDL3\/SDL_atomic.h 395:36@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_AtomicInt where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_AtomicInt where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AtomicInt
+        <*> HasCField.readRaw (BG.Proxy @"value") ptr0
+
+instance Marshal.WriteRaw SDL_AtomicInt where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AtomicInt value2 ->
+            HasCField.writeRaw (BG.Proxy @"value") ptr0 value2
+
+deriving via Marshal.EquivStorable SDL_AtomicInt instance BG.Storable SDL_AtomicInt
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "value" SDL_AtomicInt ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AtomicInt{value = y1}
+      , BG.getField @"value" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "value" (BG.Ptr SDL_AtomicInt) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"value")
+
+instance HasCField.HasCField SDL_AtomicInt "value" where
+  type CFieldType SDL_AtomicInt "value" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | A type representing an atomic unsigned 32-bit value.
+--
+--     This can be used to manage a value that is synchronized across multiple CPUs without a race condition; when an app sets a value with SDL_SetAtomicU32 all other threads, regardless of the CPU it is running on, will see that value when retrieved with SDL_GetAtomicU32, regardless of CPU caches, etc.
+--
+--     This is also useful for atomic compare-and-swap operations: a thread can change the value as long as its current value matches expectations. When done in a loop, one can guarantee data consistency across threads without a lock (but the usual warnings apply: if you don\'t know what you\'re doing, or you don\'t do it carefully, you can confidently cause any number of disasters with this, so in most cases, you /should/ use a mutex instead of this!).
+--
+--     This is a struct so people don\'t accidentally use numeric operations on it directly. You have to use SDL atomic functions.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicU32', 'sDL_GetAtomicU32', 'sDL_SetAtomicU32'
+--
+--     [C declaration]: @struct SDL_AtomicU32@, defined at @SDL3\/SDL_atomic.h 540:16@
+data SDL_AtomicU32 = SDL_AtomicU32
+  { value :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @value@, defined at @SDL3\/SDL_atomic.h 540:39@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_AtomicU32 where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_AtomicU32 where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AtomicU32
+        <*> HasCField.readRaw (BG.Proxy @"value") ptr0
+
+instance Marshal.WriteRaw SDL_AtomicU32 where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AtomicU32 value2 ->
+            HasCField.writeRaw (BG.Proxy @"value") ptr0 value2
+
+deriving via Marshal.EquivStorable SDL_AtomicU32 instance BG.Storable SDL_AtomicU32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "value" SDL_AtomicU32 ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AtomicU32{value = y1}
+      , BG.getField @"value" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "value" (BG.Ptr SDL_AtomicU32) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"value")
+
+instance HasCField.HasCField SDL_AtomicU32 "value" where
+  type
+    CFieldType SDL_AtomicU32 "value" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Atomic/FunPtr.hs b/src/SDL3/Sys/Bindgen/Atomic/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Atomic/FunPtr.hs
@@ -0,0 +1,716 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Atomic.FunPtr (
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_TryLockSpinlock,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_LockSpinlock,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_UnlockSpinlock,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_MemoryBarrierReleaseFunction,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_MemoryBarrierAcquireFunction,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_CompareAndSwapAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_SetAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_GetAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_AddAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_CompareAndSwapAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_SetAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_GetAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_AddAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_CompareAndSwapAtomicPointer,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_SetAtomicPointer,
+  SDL3.Sys.Bindgen.Atomic.FunPtr.sDL_GetAtomicPointer,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Atomic
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_atomic.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_TryLockSpinlock */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3653769bf64cd142 (void)) ("
+         , "  SDL_SpinLock *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_TryLockSpinlock;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_LockSpinlock */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_192f3ef53748431b (void)) ("
+         , "  SDL_SpinLock *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_LockSpinlock;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_UnlockSpinlock */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_da14195ad2b603e0 (void)) ("
+         , "  SDL_SpinLock *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_UnlockSpinlock;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_MemoryBarrierReleaseFunction */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_4979d73c1ba41e39 (void)) (void)"
+         , "{"
+         , "  return &SDL_MemoryBarrierReleaseFunction;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_MemoryBarrierAcquireFunction */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_e6cbd7564a024d99 (void)) (void)"
+         , "{"
+         , "  return &SDL_MemoryBarrierAcquireFunction;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_CompareAndSwapAtomicInt */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c535bda19feaf153 (void)) ("
+         , "  SDL_AtomicInt *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_CompareAndSwapAtomicInt;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_SetAtomicInt */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_281a397e642c4489 (void)) ("
+         , "  SDL_AtomicInt *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAtomicInt;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_GetAtomicInt */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_db9688135888e49b (void)) ("
+         , "  SDL_AtomicInt *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAtomicInt;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_AddAtomicInt */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_3e37f598766ca408 (void)) ("
+         , "  SDL_AtomicInt *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_AddAtomicInt;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_CompareAndSwapAtomicU32 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b4be57e876b926c0 (void)) ("
+         , "  SDL_AtomicU32 *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_CompareAndSwapAtomicU32;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_SetAtomicU32 */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_34e65bfeeaed8bb5 (void)) ("
+         , "  SDL_AtomicU32 *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAtomicU32;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_GetAtomicU32 */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_89429d58246e8835 (void)) ("
+         , "  SDL_AtomicU32 *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAtomicU32;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_AddAtomicU32 */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_74ebd3ff8c83f38e (void)) ("
+         , "  SDL_AtomicU32 *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_AddAtomicU32;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_AddAtomicU32 requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_CompareAndSwapAtomicPointer */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6871c50a63bfd9f4 (void)) ("
+         , "  void **arg1,"
+         , "  void *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_CompareAndSwapAtomicPointer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_SetAtomicPointer */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_f4bd3696da14dba9 (void)) ("
+         , "  void **arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAtomicPointer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_GetAtomicPointer */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_dc36e65ef974254e (void)) ("
+         , "  void **arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAtomicPointer;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_TryLockSpinlock@
+foreign import ccall unsafe "hs_bindgen_3653769bf64cd142"
+  hs_bindgen_3653769bf64cd142_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_TryLockSpinlock@
+hs_bindgen_3653769bf64cd142 :: IO (BG.FunPtr (BG.Ptr SDL_SpinLock -> IO BG.CBool))
+hs_bindgen_3653769bf64cd142 =
+  BG.fromFFIType hs_bindgen_3653769bf64cd142_base
+
+{-# NOINLINE sDL_TryLockSpinlock #-}
+
+-- | Try to lock a spin lock by setting it to a non-zero value.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [@lock@]: a pointer to a lock variable.
+--
+--     [Returns]: true if the lock succeeded, false if the lock is already held.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockSpinlock', 'sDL_UnlockSpinlock'
+--
+--     [C declaration]: @SDL_TryLockSpinlock@, defined at @SDL3\/SDL_atomic.h 100:34@
+sDL_TryLockSpinlock :: BG.FunPtr (BG.Ptr SDL_SpinLock -> IO BG.CBool)
+sDL_TryLockSpinlock =
+  BG.unsafePerformIO hs_bindgen_3653769bf64cd142
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_LockSpinlock@
+foreign import ccall unsafe "hs_bindgen_192f3ef53748431b"
+  hs_bindgen_192f3ef53748431b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_LockSpinlock@
+hs_bindgen_192f3ef53748431b :: IO (BG.FunPtr (BG.Ptr SDL_SpinLock -> IO ()))
+hs_bindgen_192f3ef53748431b =
+  BG.fromFFIType hs_bindgen_192f3ef53748431b_base
+
+{-# NOINLINE sDL_LockSpinlock #-}
+
+-- | Lock a spin lock by setting it to a non-zero value.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [@lock@]: a pointer to a lock variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TryLockSpinlock', 'sDL_UnlockSpinlock'
+--
+--     [C declaration]: @SDL_LockSpinlock@, defined at @SDL3\/SDL_atomic.h 117:34@
+sDL_LockSpinlock :: BG.FunPtr (BG.Ptr SDL_SpinLock -> IO ())
+sDL_LockSpinlock =
+  BG.unsafePerformIO hs_bindgen_192f3ef53748431b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_UnlockSpinlock@
+foreign import ccall unsafe "hs_bindgen_da14195ad2b603e0"
+  hs_bindgen_da14195ad2b603e0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_UnlockSpinlock@
+hs_bindgen_da14195ad2b603e0 :: IO (BG.FunPtr (BG.Ptr SDL_SpinLock -> IO ()))
+hs_bindgen_da14195ad2b603e0 =
+  BG.fromFFIType hs_bindgen_da14195ad2b603e0_base
+
+{-# NOINLINE sDL_UnlockSpinlock #-}
+
+-- | Unlock a spin lock by setting it to 0.
+--
+--     Always returns immediately.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [@lock@]: a pointer to a lock variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockSpinlock', 'sDL_TryLockSpinlock'
+--
+--     [C declaration]: @SDL_UnlockSpinlock@, defined at @SDL3\/SDL_atomic.h 136:34@
+sDL_UnlockSpinlock :: BG.FunPtr (BG.Ptr SDL_SpinLock -> IO ())
+sDL_UnlockSpinlock =
+  BG.unsafePerformIO hs_bindgen_da14195ad2b603e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_MemoryBarrierReleaseFunction@
+foreign import ccall unsafe "hs_bindgen_4979d73c1ba41e39"
+  hs_bindgen_4979d73c1ba41e39_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_MemoryBarrierReleaseFunction@
+hs_bindgen_4979d73c1ba41e39 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_4979d73c1ba41e39 =
+  BG.fromFFIType hs_bindgen_4979d73c1ba41e39_base
+
+{-# NOINLINE sDL_MemoryBarrierReleaseFunction #-}
+
+-- | Insert a memory release barrier (function version).
+--
+--     Please refer to SDL_MemoryBarrierRelease for details. This is a function version, which might be useful if you need to use this functionality from a scripting language, etc. Also, some of the macro versions call this function behind the scenes, where more heavy lifting can happen inside of SDL. Generally, though, an app written in C\/C++\/etc should use the macro version, as it will be more efficient.
+--
+--     [Thread safety]: Obviously this function is safe to use from any thread at any time, but if you find yourself needing this, you are probably dealing with some very sensitive code; be careful!
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MemoryBarrierRelease@
+--
+--     [C declaration]: @SDL_MemoryBarrierReleaseFunction@, defined at @SDL3\/SDL_atomic.h 192:34@
+sDL_MemoryBarrierReleaseFunction :: BG.FunPtr (IO ())
+sDL_MemoryBarrierReleaseFunction =
+  BG.unsafePerformIO hs_bindgen_4979d73c1ba41e39
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_MemoryBarrierAcquireFunction@
+foreign import ccall unsafe "hs_bindgen_e6cbd7564a024d99"
+  hs_bindgen_e6cbd7564a024d99_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_MemoryBarrierAcquireFunction@
+hs_bindgen_e6cbd7564a024d99 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_e6cbd7564a024d99 =
+  BG.fromFFIType hs_bindgen_e6cbd7564a024d99_base
+
+{-# NOINLINE sDL_MemoryBarrierAcquireFunction #-}
+
+-- | Insert a memory acquire barrier (function version).
+--
+--     Please refer to SDL_MemoryBarrierRelease for details. This is a function version, which might be useful if you need to use this functionality from a scripting language, etc. Also, some of the macro versions call this function behind the scenes, where more heavy lifting can happen inside of SDL. Generally, though, an app written in C\/C++\/etc should use the macro version, as it will be more efficient.
+--
+--     [Thread safety]: Obviously this function is safe to use from any thread at any time, but if you find yourself needing this, you are probably dealing with some very sensitive code; be careful!
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MemoryBarrierAcquire@
+--
+--     [C declaration]: @SDL_MemoryBarrierAcquireFunction@, defined at @SDL3\/SDL_atomic.h 212:34@
+sDL_MemoryBarrierAcquireFunction :: BG.FunPtr (IO ())
+sDL_MemoryBarrierAcquireFunction =
+  BG.unsafePerformIO hs_bindgen_e6cbd7564a024d99
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_CompareAndSwapAtomicInt@
+foreign import ccall unsafe "hs_bindgen_c535bda19feaf153"
+  hs_bindgen_c535bda19feaf153_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_CompareAndSwapAtomicInt@
+hs_bindgen_c535bda19feaf153
+  :: IO (BG.FunPtr (BG.Ptr SDL_AtomicInt -> BG.CInt -> BG.CInt -> IO BG.CBool))
+hs_bindgen_c535bda19feaf153 =
+  BG.fromFFIType hs_bindgen_c535bda19feaf153_base
+
+{-# NOINLINE sDL_CompareAndSwapAtomicInt #-}
+
+-- | Set an atomic variable to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+--
+--     [@oldval@]: the old value.
+--
+--     [@newval@]: the new value.
+--
+--     [Returns]: true if the atomic variable was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicInt', 'sDL_SetAtomicInt'
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicInt@, defined at @SDL3\/SDL_atomic.h 415:34@
+sDL_CompareAndSwapAtomicInt :: BG.FunPtr (BG.Ptr SDL_AtomicInt -> BG.CInt -> BG.CInt -> IO BG.CBool)
+sDL_CompareAndSwapAtomicInt =
+  BG.unsafePerformIO hs_bindgen_c535bda19feaf153
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_SetAtomicInt@
+foreign import ccall unsafe "hs_bindgen_281a397e642c4489"
+  hs_bindgen_281a397e642c4489_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_SetAtomicInt@
+hs_bindgen_281a397e642c4489 :: IO (BG.FunPtr (BG.Ptr SDL_AtomicInt -> BG.CInt -> IO BG.CInt))
+hs_bindgen_281a397e642c4489 =
+  BG.fromFFIType hs_bindgen_281a397e642c4489_base
+
+{-# NOINLINE sDL_SetAtomicInt #-}
+
+-- | Set an atomic variable to a value.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+--
+--     [@v@]: the desired value.
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicInt'
+--
+--     [C declaration]: @SDL_SetAtomicInt@, defined at @SDL3\/SDL_atomic.h 435:33@
+sDL_SetAtomicInt :: BG.FunPtr (BG.Ptr SDL_AtomicInt -> BG.CInt -> IO BG.CInt)
+sDL_SetAtomicInt =
+  BG.unsafePerformIO hs_bindgen_281a397e642c4489
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_GetAtomicInt@
+foreign import ccall unsafe "hs_bindgen_db9688135888e49b"
+  hs_bindgen_db9688135888e49b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_GetAtomicInt@
+hs_bindgen_db9688135888e49b :: IO (BG.FunPtr (BG.Ptr SDL_AtomicInt -> IO BG.CInt))
+hs_bindgen_db9688135888e49b =
+  BG.fromFFIType hs_bindgen_db9688135888e49b_base
+
+{-# NOINLINE sDL_GetAtomicInt #-}
+
+-- | Get the value of an atomic variable.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to an 'SDL_AtomicInt' variable.
+--
+--     [Returns]: the current value of an atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAtomicInt'
+--
+--     [C declaration]: @SDL_GetAtomicInt@, defined at @SDL3\/SDL_atomic.h 452:33@
+sDL_GetAtomicInt :: BG.FunPtr (BG.Ptr SDL_AtomicInt -> IO BG.CInt)
+sDL_GetAtomicInt =
+  BG.unsafePerformIO hs_bindgen_db9688135888e49b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_AddAtomicInt@
+foreign import ccall unsafe "hs_bindgen_3e37f598766ca408"
+  hs_bindgen_3e37f598766ca408_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_AddAtomicInt@
+hs_bindgen_3e37f598766ca408 :: IO (BG.FunPtr (BG.Ptr SDL_AtomicInt -> BG.CInt -> IO BG.CInt))
+hs_bindgen_3e37f598766ca408 =
+  BG.fromFFIType hs_bindgen_3e37f598766ca408_base
+
+{-# NOINLINE sDL_AddAtomicInt #-}
+
+-- | Add to an atomic variable.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+--
+--     [@v@]: the desired value to add.
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_AtomicDecRef@, @SDL_AtomicIncRef@
+--
+--     [C declaration]: @SDL_AddAtomicInt@, defined at @SDL3\/SDL_atomic.h 473:33@
+sDL_AddAtomicInt :: BG.FunPtr (BG.Ptr SDL_AtomicInt -> BG.CInt -> IO BG.CInt)
+sDL_AddAtomicInt =
+  BG.unsafePerformIO hs_bindgen_3e37f598766ca408
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_CompareAndSwapAtomicU32@
+foreign import ccall unsafe "hs_bindgen_b4be57e876b926c0"
+  hs_bindgen_b4be57e876b926c0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_CompareAndSwapAtomicU32@
+hs_bindgen_b4be57e876b926c0
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_AtomicU32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_b4be57e876b926c0 =
+  BG.fromFFIType hs_bindgen_b4be57e876b926c0_base
+
+{-# NOINLINE sDL_CompareAndSwapAtomicU32 #-}
+
+-- | Set an atomic variable to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+--
+--     [@oldval@]: the old value.
+--
+--     [@newval@]: the new value.
+--
+--     [Returns]: true if the atomic variable was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicU32', 'sDL_SetAtomicU32'
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicU32@, defined at @SDL3\/SDL_atomic.h 560:34@
+sDL_CompareAndSwapAtomicU32
+  :: BG.FunPtr
+       ( BG.Ptr SDL_AtomicU32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_CompareAndSwapAtomicU32 =
+  BG.unsafePerformIO hs_bindgen_b4be57e876b926c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_SetAtomicU32@
+foreign import ccall unsafe "hs_bindgen_34e65bfeeaed8bb5"
+  hs_bindgen_34e65bfeeaed8bb5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_SetAtomicU32@
+hs_bindgen_34e65bfeeaed8bb5
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_AtomicU32 -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+       )
+hs_bindgen_34e65bfeeaed8bb5 =
+  BG.fromFFIType hs_bindgen_34e65bfeeaed8bb5_base
+
+{-# NOINLINE sDL_SetAtomicU32 #-}
+
+-- | Set an atomic variable to a value.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+--
+--     [@v@]: the desired value.
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicU32'
+--
+--     [C declaration]: @SDL_SetAtomicU32@, defined at @SDL3\/SDL_atomic.h 580:36@
+sDL_SetAtomicU32
+  :: BG.FunPtr
+       (BG.Ptr SDL_AtomicU32 -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+sDL_SetAtomicU32 =
+  BG.unsafePerformIO hs_bindgen_34e65bfeeaed8bb5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_GetAtomicU32@
+foreign import ccall unsafe "hs_bindgen_89429d58246e8835"
+  hs_bindgen_89429d58246e8835_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_GetAtomicU32@
+hs_bindgen_89429d58246e8835
+  :: IO (BG.FunPtr (BG.Ptr SDL_AtomicU32 -> IO SDL3.Sys.Bindgen.Stdinc.Uint32))
+hs_bindgen_89429d58246e8835 =
+  BG.fromFFIType hs_bindgen_89429d58246e8835_base
+
+{-# NOINLINE sDL_GetAtomicU32 #-}
+
+-- | Get the value of an atomic variable.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to an 'SDL_AtomicU32' variable.
+--
+--     [Returns]: the current value of an atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAtomicU32'
+--
+--     [C declaration]: @SDL_GetAtomicU32@, defined at @SDL3\/SDL_atomic.h 597:36@
+sDL_GetAtomicU32 :: BG.FunPtr (BG.Ptr SDL_AtomicU32 -> IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+sDL_GetAtomicU32 =
+  BG.unsafePerformIO hs_bindgen_89429d58246e8835
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_AddAtomicU32@
+foreign import ccall unsafe "hs_bindgen_74ebd3ff8c83f38e"
+  hs_bindgen_74ebd3ff8c83f38e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_AddAtomicU32@
+hs_bindgen_74ebd3ff8c83f38e
+  :: IO (BG.FunPtr (BG.Ptr SDL_AtomicU32 -> BG.CInt -> IO SDL3.Sys.Bindgen.Stdinc.Uint32))
+hs_bindgen_74ebd3ff8c83f38e =
+  BG.fromFFIType hs_bindgen_74ebd3ff8c83f38e_base
+
+{-# NOINLINE sDL_AddAtomicU32 #-}
+
+-- | Add to an atomic variable.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+--
+--     [@v@]: the desired value to add or subtract.
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_AddAtomicU32@, defined at @SDL3\/SDL_atomic.h 615:36@
+sDL_AddAtomicU32 :: BG.FunPtr (BG.Ptr SDL_AtomicU32 -> BG.CInt -> IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+sDL_AddAtomicU32 =
+  BG.unsafePerformIO hs_bindgen_74ebd3ff8c83f38e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_CompareAndSwapAtomicPointer@
+foreign import ccall unsafe "hs_bindgen_6871c50a63bfd9f4"
+  hs_bindgen_6871c50a63bfd9f4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_CompareAndSwapAtomicPointer@
+hs_bindgen_6871c50a63bfd9f4
+  :: IO (BG.FunPtr (BG.Ptr (BG.Ptr BG.Void) -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_6871c50a63bfd9f4 =
+  BG.fromFFIType hs_bindgen_6871c50a63bfd9f4_base
+
+{-# NOINLINE sDL_CompareAndSwapAtomicPointer #-}
+
+-- | Set a pointer to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to a pointer.
+--
+--     [@oldval@]: the old pointer value.
+--
+--     [@newval@]: the new pointer value.
+--
+--     [Returns]: true if the pointer was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicInt', 'sDL_GetAtomicPointer', 'sDL_SetAtomicPointer'
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicPointer@, defined at @SDL3\/SDL_atomic.h 636:34@
+sDL_CompareAndSwapAtomicPointer
+  :: BG.FunPtr (BG.Ptr (BG.Ptr BG.Void) -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_CompareAndSwapAtomicPointer =
+  BG.unsafePerformIO hs_bindgen_6871c50a63bfd9f4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_SetAtomicPointer@
+foreign import ccall unsafe "hs_bindgen_f4bd3696da14dba9"
+  hs_bindgen_f4bd3696da14dba9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_SetAtomicPointer@
+hs_bindgen_f4bd3696da14dba9
+  :: IO (BG.FunPtr (BG.Ptr (BG.Ptr BG.Void) -> BG.Ptr BG.Void -> IO (BG.Ptr BG.Void)))
+hs_bindgen_f4bd3696da14dba9 =
+  BG.fromFFIType hs_bindgen_f4bd3696da14dba9_base
+
+{-# NOINLINE sDL_SetAtomicPointer #-}
+
+-- | Set a pointer to a value atomically.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to a pointer.
+--
+--     [@v@]: the desired pointer value.
+--
+--     [Returns]: the previous value of the pointer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicPointer', 'sDL_GetAtomicPointer'
+--
+--     [C declaration]: @SDL_SetAtomicPointer@, defined at @SDL3\/SDL_atomic.h 655:36@
+sDL_SetAtomicPointer :: BG.FunPtr (BG.Ptr (BG.Ptr BG.Void) -> BG.Ptr BG.Void -> IO (BG.Ptr BG.Void))
+sDL_SetAtomicPointer =
+  BG.unsafePerformIO hs_bindgen_f4bd3696da14dba9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_GetAtomicPointer@
+foreign import ccall unsafe "hs_bindgen_dc36e65ef974254e"
+  hs_bindgen_dc36e65ef974254e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_get_SDL_GetAtomicPointer@
+hs_bindgen_dc36e65ef974254e :: IO (BG.FunPtr (BG.Ptr (BG.Ptr BG.Void) -> IO (BG.Ptr BG.Void)))
+hs_bindgen_dc36e65ef974254e =
+  BG.fromFFIType hs_bindgen_dc36e65ef974254e_base
+
+{-# NOINLINE sDL_GetAtomicPointer #-}
+
+-- | Get the value of a pointer atomically.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [@a@]: a pointer to a pointer.
+--
+--     [Returns]: the current value of a pointer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicPointer', 'sDL_SetAtomicPointer'
+--
+--     [C declaration]: @SDL_GetAtomicPointer@, defined at @SDL3\/SDL_atomic.h 673:36@
+sDL_GetAtomicPointer :: BG.FunPtr (BG.Ptr (BG.Ptr BG.Void) -> IO (BG.Ptr BG.Void))
+sDL_GetAtomicPointer =
+  BG.unsafePerformIO hs_bindgen_dc36e65ef974254e
diff --git a/src/SDL3/Sys/Bindgen/Atomic/Safe.hs b/src/SDL3/Sys/Bindgen/Atomic/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Atomic/Safe.hs
@@ -0,0 +1,743 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Atomic.Safe (
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_TryLockSpinlock,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_LockSpinlock,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_UnlockSpinlock,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_MemoryBarrierReleaseFunction,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_MemoryBarrierAcquireFunction,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_CompareAndSwapAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_SetAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_GetAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_AddAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_CompareAndSwapAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_SetAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_GetAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_AddAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_CompareAndSwapAtomicPointer,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_SetAtomicPointer,
+  SDL3.Sys.Bindgen.Atomic.Safe.sDL_GetAtomicPointer,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Atomic
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_atomic.h>"
+         , "_Bool hs_bindgen_172686d1676cd710 ("
+         , "  SDL_SpinLock *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TryLockSpinlock)(arg1);"
+         , "}"
+         , "void hs_bindgen_24dd21497804fb35 ("
+         , "  SDL_SpinLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_LockSpinlock)(arg1);"
+         , "}"
+         , "void hs_bindgen_db995a2e290168e8 ("
+         , "  SDL_SpinLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockSpinlock)(arg1);"
+         , "}"
+         , "void hs_bindgen_242899706a6f2e17 (void)"
+         , "{"
+         , "  (SDL_MemoryBarrierReleaseFunction)();"
+         , "}"
+         , "void hs_bindgen_4e0cd51f93ed2a72 (void)"
+         , "{"
+         , "  (SDL_MemoryBarrierAcquireFunction)();"
+         , "}"
+         , "_Bool hs_bindgen_e3e24329b42ecc89 ("
+         , "  SDL_AtomicInt *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CompareAndSwapAtomicInt)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_0b591b00447451f3 ("
+         , "  SDL_AtomicInt *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAtomicInt)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_a79c0e141e6af2a9 ("
+         , "  SDL_AtomicInt *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAtomicInt)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_8436b21863a9d6bb ("
+         , "  SDL_AtomicInt *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AddAtomicInt)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_935e1a8a131d0775 ("
+         , "  SDL_AtomicU32 *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CompareAndSwapAtomicU32)(arg1, arg2, arg3);"
+         , "}"
+         , "Uint32 hs_bindgen_14474ef0e01d438d ("
+         , "  SDL_AtomicU32 *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAtomicU32)(arg1, arg2);"
+         , "}"
+         , "Uint32 hs_bindgen_141a90ab67d079cd ("
+         , "  SDL_AtomicU32 *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAtomicU32)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "Uint32 hs_bindgen_a1640976428ead6d ("
+         , "  SDL_AtomicU32 *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_AddAtomicU32)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_AddAtomicU32 requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_7fbbd1e4574eb707 ("
+         , "  void **arg1,"
+         , "  void *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CompareAndSwapAtomicPointer)(arg1, arg2, arg3);"
+         , "}"
+         , "void *hs_bindgen_169f34ca098fd557 ("
+         , "  void **arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAtomicPointer)(arg1, arg2);"
+         , "}"
+         , "void *hs_bindgen_330ea044308fd995 ("
+         , "  void **arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAtomicPointer)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_TryLockSpinlock@
+foreign import ccall safe "hs_bindgen_172686d1676cd710"
+  hs_bindgen_172686d1676cd710_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_TryLockSpinlock@
+hs_bindgen_172686d1676cd710
+  :: BG.Ptr SDL_SpinLock
+  -> IO BG.CBool
+hs_bindgen_172686d1676cd710 =
+  BG.fromFFIType hs_bindgen_172686d1676cd710_base
+
+-- | Try to lock a spin lock by setting it to a non-zero value.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Returns]: true if the lock succeeded, false if the lock is already held.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockSpinlock', 'sDL_UnlockSpinlock'
+--
+--     [C declaration]: @SDL_TryLockSpinlock@, defined at @SDL3\/SDL_atomic.h 100:34@
+sDL_TryLockSpinlock
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO BG.CBool
+sDL_TryLockSpinlock = hs_bindgen_172686d1676cd710
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_LockSpinlock@
+foreign import ccall safe "hs_bindgen_24dd21497804fb35"
+  hs_bindgen_24dd21497804fb35_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_LockSpinlock@
+hs_bindgen_24dd21497804fb35
+  :: BG.Ptr SDL_SpinLock
+  -> IO ()
+hs_bindgen_24dd21497804fb35 =
+  BG.fromFFIType hs_bindgen_24dd21497804fb35_base
+
+-- | Lock a spin lock by setting it to a non-zero value.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TryLockSpinlock', 'sDL_UnlockSpinlock'
+--
+--     [C declaration]: @SDL_LockSpinlock@, defined at @SDL3\/SDL_atomic.h 117:34@
+sDL_LockSpinlock
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO ()
+sDL_LockSpinlock = hs_bindgen_24dd21497804fb35
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_UnlockSpinlock@
+foreign import ccall safe "hs_bindgen_db995a2e290168e8"
+  hs_bindgen_db995a2e290168e8_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_UnlockSpinlock@
+hs_bindgen_db995a2e290168e8
+  :: BG.Ptr SDL_SpinLock
+  -> IO ()
+hs_bindgen_db995a2e290168e8 =
+  BG.fromFFIType hs_bindgen_db995a2e290168e8_base
+
+-- | Unlock a spin lock by setting it to 0.
+--
+--     Always returns immediately.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockSpinlock', 'sDL_TryLockSpinlock'
+--
+--     [C declaration]: @SDL_UnlockSpinlock@, defined at @SDL3\/SDL_atomic.h 136:34@
+sDL_UnlockSpinlock
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO ()
+sDL_UnlockSpinlock = hs_bindgen_db995a2e290168e8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_MemoryBarrierReleaseFunction@
+foreign import ccall safe "hs_bindgen_242899706a6f2e17"
+  hs_bindgen_242899706a6f2e17_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_MemoryBarrierReleaseFunction@
+hs_bindgen_242899706a6f2e17 :: IO ()
+hs_bindgen_242899706a6f2e17 =
+  BG.fromFFIType hs_bindgen_242899706a6f2e17_base
+
+-- | Insert a memory release barrier (function version).
+--
+--     Please refer to SDL_MemoryBarrierRelease for details. This is a function version, which might be useful if you need to use this functionality from a scripting language, etc. Also, some of the macro versions call this function behind the scenes, where more heavy lifting can happen inside of SDL. Generally, though, an app written in C\/C++\/etc should use the macro version, as it will be more efficient.
+--
+--     [Thread safety]: Obviously this function is safe to use from any thread at any time, but if you find yourself needing this, you are probably dealing with some very sensitive code; be careful!
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MemoryBarrierRelease@
+--
+--     [C declaration]: @SDL_MemoryBarrierReleaseFunction@, defined at @SDL3\/SDL_atomic.h 192:34@
+sDL_MemoryBarrierReleaseFunction :: IO ()
+sDL_MemoryBarrierReleaseFunction =
+  hs_bindgen_242899706a6f2e17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_MemoryBarrierAcquireFunction@
+foreign import ccall safe "hs_bindgen_4e0cd51f93ed2a72"
+  hs_bindgen_4e0cd51f93ed2a72_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_MemoryBarrierAcquireFunction@
+hs_bindgen_4e0cd51f93ed2a72 :: IO ()
+hs_bindgen_4e0cd51f93ed2a72 =
+  BG.fromFFIType hs_bindgen_4e0cd51f93ed2a72_base
+
+-- | Insert a memory acquire barrier (function version).
+--
+--     Please refer to SDL_MemoryBarrierRelease for details. This is a function version, which might be useful if you need to use this functionality from a scripting language, etc. Also, some of the macro versions call this function behind the scenes, where more heavy lifting can happen inside of SDL. Generally, though, an app written in C\/C++\/etc should use the macro version, as it will be more efficient.
+--
+--     [Thread safety]: Obviously this function is safe to use from any thread at any time, but if you find yourself needing this, you are probably dealing with some very sensitive code; be careful!
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MemoryBarrierAcquire@
+--
+--     [C declaration]: @SDL_MemoryBarrierAcquireFunction@, defined at @SDL3\/SDL_atomic.h 212:34@
+sDL_MemoryBarrierAcquireFunction :: IO ()
+sDL_MemoryBarrierAcquireFunction =
+  hs_bindgen_4e0cd51f93ed2a72
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_CompareAndSwapAtomicInt@
+foreign import ccall safe "hs_bindgen_e3e24329b42ecc89"
+  hs_bindgen_e3e24329b42ecc89_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_CompareAndSwapAtomicInt@
+hs_bindgen_e3e24329b42ecc89
+  :: BG.Ptr SDL_AtomicInt
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_e3e24329b42ecc89 =
+  BG.fromFFIType hs_bindgen_e3e24329b42ecc89_base
+
+-- | Set an atomic variable to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the atomic variable was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicInt', 'sDL_SetAtomicInt'
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicInt@, defined at @SDL3\/SDL_atomic.h 415:34@
+sDL_CompareAndSwapAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@oldval@]: the old value.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@newval@]: the new value.
+  -> IO BG.CBool
+sDL_CompareAndSwapAtomicInt =
+  hs_bindgen_e3e24329b42ecc89
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_SetAtomicInt@
+foreign import ccall safe "hs_bindgen_0b591b00447451f3"
+  hs_bindgen_0b591b00447451f3_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_SetAtomicInt@
+hs_bindgen_0b591b00447451f3
+  :: BG.Ptr SDL_AtomicInt
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_0b591b00447451f3 =
+  BG.fromFFIType hs_bindgen_0b591b00447451f3_base
+
+-- | Set an atomic variable to a value.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicInt'
+--
+--     [C declaration]: @SDL_SetAtomicInt@, defined at @SDL3\/SDL_atomic.h 435:33@
+sDL_SetAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@v@]: the desired value.
+  -> IO BG.CInt
+sDL_SetAtomicInt = hs_bindgen_0b591b00447451f3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_GetAtomicInt@
+foreign import ccall safe "hs_bindgen_a79c0e141e6af2a9"
+  hs_bindgen_a79c0e141e6af2a9_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_GetAtomicInt@
+hs_bindgen_a79c0e141e6af2a9
+  :: BG.Ptr SDL_AtomicInt
+  -> IO BG.CInt
+hs_bindgen_a79c0e141e6af2a9 =
+  BG.fromFFIType hs_bindgen_a79c0e141e6af2a9_base
+
+-- | Get the value of an atomic variable.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of an atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAtomicInt'
+--
+--     [C declaration]: @SDL_GetAtomicInt@, defined at @SDL3\/SDL_atomic.h 452:33@
+sDL_GetAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable.
+  -> IO BG.CInt
+sDL_GetAtomicInt = hs_bindgen_a79c0e141e6af2a9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_AddAtomicInt@
+foreign import ccall safe "hs_bindgen_8436b21863a9d6bb"
+  hs_bindgen_8436b21863a9d6bb_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_AddAtomicInt@
+hs_bindgen_8436b21863a9d6bb
+  :: BG.Ptr SDL_AtomicInt
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_8436b21863a9d6bb =
+  BG.fromFFIType hs_bindgen_8436b21863a9d6bb_base
+
+-- | Add to an atomic variable.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_AtomicDecRef@, @SDL_AtomicIncRef@
+--
+--     [C declaration]: @SDL_AddAtomicInt@, defined at @SDL3\/SDL_atomic.h 473:33@
+sDL_AddAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@v@]: the desired value to add.
+  -> IO BG.CInt
+sDL_AddAtomicInt = hs_bindgen_8436b21863a9d6bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_CompareAndSwapAtomicU32@
+foreign import ccall safe "hs_bindgen_935e1a8a131d0775"
+  hs_bindgen_935e1a8a131d0775_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_CompareAndSwapAtomicU32@
+hs_bindgen_935e1a8a131d0775
+  :: BG.Ptr SDL_AtomicU32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_935e1a8a131d0775 =
+  BG.fromFFIType hs_bindgen_935e1a8a131d0775_base
+
+-- | Set an atomic variable to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the atomic variable was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicU32', 'sDL_SetAtomicU32'
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicU32@, defined at @SDL3\/SDL_atomic.h 560:34@
+sDL_CompareAndSwapAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@oldval@]: the old value.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@newval@]: the new value.
+  -> IO BG.CBool
+sDL_CompareAndSwapAtomicU32 =
+  hs_bindgen_935e1a8a131d0775
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_SetAtomicU32@
+foreign import ccall safe "hs_bindgen_14474ef0e01d438d"
+  hs_bindgen_14474ef0e01d438d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_SetAtomicU32@
+hs_bindgen_14474ef0e01d438d
+  :: BG.Ptr SDL_AtomicU32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_14474ef0e01d438d =
+  BG.fromFFIType hs_bindgen_14474ef0e01d438d_base
+
+-- | Set an atomic variable to a value.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicU32'
+--
+--     [C declaration]: @SDL_SetAtomicU32@, defined at @SDL3\/SDL_atomic.h 580:36@
+sDL_SetAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@v@]: the desired value.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_SetAtomicU32 = hs_bindgen_14474ef0e01d438d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_GetAtomicU32@
+foreign import ccall safe "hs_bindgen_141a90ab67d079cd"
+  hs_bindgen_141a90ab67d079cd_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_GetAtomicU32@
+hs_bindgen_141a90ab67d079cd
+  :: BG.Ptr SDL_AtomicU32
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_141a90ab67d079cd =
+  BG.fromFFIType hs_bindgen_141a90ab67d079cd_base
+
+-- | Get the value of an atomic variable.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of an atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAtomicU32'
+--
+--     [C declaration]: @SDL_GetAtomicU32@, defined at @SDL3\/SDL_atomic.h 597:36@
+sDL_GetAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_GetAtomicU32 = hs_bindgen_141a90ab67d079cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_AddAtomicU32@
+foreign import ccall safe "hs_bindgen_a1640976428ead6d"
+  hs_bindgen_a1640976428ead6d_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_AddAtomicU32@
+hs_bindgen_a1640976428ead6d
+  :: BG.Ptr SDL_AtomicU32
+  -> BG.CInt
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_a1640976428ead6d =
+  BG.fromFFIType hs_bindgen_a1640976428ead6d_base
+
+-- | Add to an atomic variable.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_AddAtomicU32@, defined at @SDL3\/SDL_atomic.h 615:36@
+sDL_AddAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@v@]: the desired value to add or subtract.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_AddAtomicU32 = hs_bindgen_a1640976428ead6d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_CompareAndSwapAtomicPointer@
+foreign import ccall safe "hs_bindgen_7fbbd1e4574eb707"
+  hs_bindgen_7fbbd1e4574eb707_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_CompareAndSwapAtomicPointer@
+hs_bindgen_7fbbd1e4574eb707
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -> BG.Ptr BG.Void
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_7fbbd1e4574eb707 =
+  BG.fromFFIType hs_bindgen_7fbbd1e4574eb707_base
+
+-- | Set a pointer to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the pointer was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicInt', 'sDL_GetAtomicPointer', 'sDL_SetAtomicPointer'
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicPointer@, defined at @SDL3\/SDL_atomic.h 636:34@
+sDL_CompareAndSwapAtomicPointer
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@oldval@]: the old pointer value.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@newval@]: the new pointer value.
+  -> IO BG.CBool
+sDL_CompareAndSwapAtomicPointer =
+  hs_bindgen_7fbbd1e4574eb707
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_SetAtomicPointer@
+foreign import ccall safe "hs_bindgen_169f34ca098fd557"
+  hs_bindgen_169f34ca098fd557_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_SetAtomicPointer@
+hs_bindgen_169f34ca098fd557
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_169f34ca098fd557 =
+  BG.fromFFIType hs_bindgen_169f34ca098fd557_base
+
+-- | Set a pointer to a value atomically.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the pointer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicPointer', 'sDL_GetAtomicPointer'
+--
+--     [C declaration]: @SDL_SetAtomicPointer@, defined at @SDL3\/SDL_atomic.h 655:36@
+sDL_SetAtomicPointer
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@v@]: the desired pointer value.
+  -> IO (BG.Ptr BG.Void)
+sDL_SetAtomicPointer = hs_bindgen_169f34ca098fd557
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_GetAtomicPointer@
+foreign import ccall safe "hs_bindgen_330ea044308fd995"
+  hs_bindgen_330ea044308fd995_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Safe_SDL_GetAtomicPointer@
+hs_bindgen_330ea044308fd995
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_330ea044308fd995 =
+  BG.fromFFIType hs_bindgen_330ea044308fd995_base
+
+-- | Get the value of a pointer atomically.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of a pointer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicPointer', 'sDL_SetAtomicPointer'
+--
+--     [C declaration]: @SDL_GetAtomicPointer@, defined at @SDL3\/SDL_atomic.h 673:36@
+sDL_GetAtomicPointer
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetAtomicPointer = hs_bindgen_330ea044308fd995
diff --git a/src/SDL3/Sys/Bindgen/Atomic/Unsafe.hs b/src/SDL3/Sys/Bindgen/Atomic/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Atomic/Unsafe.hs
@@ -0,0 +1,743 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Atomic.Unsafe (
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_TryLockSpinlock,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_LockSpinlock,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_UnlockSpinlock,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_MemoryBarrierReleaseFunction,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_MemoryBarrierAcquireFunction,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_CompareAndSwapAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_SetAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_GetAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_AddAtomicInt,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_CompareAndSwapAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_SetAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_GetAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_AddAtomicU32,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_CompareAndSwapAtomicPointer,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_SetAtomicPointer,
+  SDL3.Sys.Bindgen.Atomic.Unsafe.sDL_GetAtomicPointer,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Atomic
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_atomic.h>"
+         , "_Bool hs_bindgen_7e1a623878ef7201 ("
+         , "  SDL_SpinLock *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TryLockSpinlock)(arg1);"
+         , "}"
+         , "void hs_bindgen_ac33cd18d7856e17 ("
+         , "  SDL_SpinLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_LockSpinlock)(arg1);"
+         , "}"
+         , "void hs_bindgen_025b3bf7538a123c ("
+         , "  SDL_SpinLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockSpinlock)(arg1);"
+         , "}"
+         , "void hs_bindgen_0e27a69a6cca6aac (void)"
+         , "{"
+         , "  (SDL_MemoryBarrierReleaseFunction)();"
+         , "}"
+         , "void hs_bindgen_0eaa15705859b209 (void)"
+         , "{"
+         , "  (SDL_MemoryBarrierAcquireFunction)();"
+         , "}"
+         , "_Bool hs_bindgen_7528ef136d782538 ("
+         , "  SDL_AtomicInt *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CompareAndSwapAtomicInt)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_6267a61e0fd93b33 ("
+         , "  SDL_AtomicInt *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAtomicInt)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_5d8655898ff6cb2a ("
+         , "  SDL_AtomicInt *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAtomicInt)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_072d591dbe0586a7 ("
+         , "  SDL_AtomicInt *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AddAtomicInt)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_f42a3f89648096cd ("
+         , "  SDL_AtomicU32 *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CompareAndSwapAtomicU32)(arg1, arg2, arg3);"
+         , "}"
+         , "Uint32 hs_bindgen_f11ee3aacbcad44d ("
+         , "  SDL_AtomicU32 *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAtomicU32)(arg1, arg2);"
+         , "}"
+         , "Uint32 hs_bindgen_8dd395b4cca78369 ("
+         , "  SDL_AtomicU32 *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAtomicU32)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "Uint32 hs_bindgen_faa1fbc7406c4097 ("
+         , "  SDL_AtomicU32 *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_AddAtomicU32)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_AddAtomicU32 requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_b184ba517671509d ("
+         , "  void **arg1,"
+         , "  void *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CompareAndSwapAtomicPointer)(arg1, arg2, arg3);"
+         , "}"
+         , "void *hs_bindgen_c511073c2deacde8 ("
+         , "  void **arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAtomicPointer)(arg1, arg2);"
+         , "}"
+         , "void *hs_bindgen_24c92517dd70cd57 ("
+         , "  void **arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAtomicPointer)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_TryLockSpinlock@
+foreign import ccall unsafe "hs_bindgen_7e1a623878ef7201"
+  hs_bindgen_7e1a623878ef7201_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_TryLockSpinlock@
+hs_bindgen_7e1a623878ef7201
+  :: BG.Ptr SDL_SpinLock
+  -> IO BG.CBool
+hs_bindgen_7e1a623878ef7201 =
+  BG.fromFFIType hs_bindgen_7e1a623878ef7201_base
+
+-- | Try to lock a spin lock by setting it to a non-zero value.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Returns]: true if the lock succeeded, false if the lock is already held.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockSpinlock', 'sDL_UnlockSpinlock'
+--
+--     [C declaration]: @SDL_TryLockSpinlock@, defined at @SDL3\/SDL_atomic.h 100:34@
+sDL_TryLockSpinlock
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO BG.CBool
+sDL_TryLockSpinlock = hs_bindgen_7e1a623878ef7201
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_LockSpinlock@
+foreign import ccall unsafe "hs_bindgen_ac33cd18d7856e17"
+  hs_bindgen_ac33cd18d7856e17_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_LockSpinlock@
+hs_bindgen_ac33cd18d7856e17
+  :: BG.Ptr SDL_SpinLock
+  -> IO ()
+hs_bindgen_ac33cd18d7856e17 =
+  BG.fromFFIType hs_bindgen_ac33cd18d7856e17_base
+
+-- | Lock a spin lock by setting it to a non-zero value.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TryLockSpinlock', 'sDL_UnlockSpinlock'
+--
+--     [C declaration]: @SDL_LockSpinlock@, defined at @SDL3\/SDL_atomic.h 117:34@
+sDL_LockSpinlock
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO ()
+sDL_LockSpinlock = hs_bindgen_ac33cd18d7856e17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_UnlockSpinlock@
+foreign import ccall unsafe "hs_bindgen_025b3bf7538a123c"
+  hs_bindgen_025b3bf7538a123c_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_UnlockSpinlock@
+hs_bindgen_025b3bf7538a123c
+  :: BG.Ptr SDL_SpinLock
+  -> IO ()
+hs_bindgen_025b3bf7538a123c =
+  BG.fromFFIType hs_bindgen_025b3bf7538a123c_base
+
+-- | Unlock a spin lock by setting it to 0.
+--
+--     Always returns immediately.
+--
+--     /__Please note that spinlocks are dangerous if you don\'t know what you\'re doing. Please be careful using any sort of spinlock!__/
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockSpinlock', 'sDL_TryLockSpinlock'
+--
+--     [C declaration]: @SDL_UnlockSpinlock@, defined at @SDL3\/SDL_atomic.h 136:34@
+sDL_UnlockSpinlock
+  :: BG.Ptr SDL_SpinLock
+  -- ^
+  --
+  --           [@lock@]: a pointer to a lock variable.
+  -> IO ()
+sDL_UnlockSpinlock = hs_bindgen_025b3bf7538a123c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_MemoryBarrierReleaseFunction@
+foreign import ccall unsafe "hs_bindgen_0e27a69a6cca6aac"
+  hs_bindgen_0e27a69a6cca6aac_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_MemoryBarrierReleaseFunction@
+hs_bindgen_0e27a69a6cca6aac :: IO ()
+hs_bindgen_0e27a69a6cca6aac =
+  BG.fromFFIType hs_bindgen_0e27a69a6cca6aac_base
+
+-- | Insert a memory release barrier (function version).
+--
+--     Please refer to SDL_MemoryBarrierRelease for details. This is a function version, which might be useful if you need to use this functionality from a scripting language, etc. Also, some of the macro versions call this function behind the scenes, where more heavy lifting can happen inside of SDL. Generally, though, an app written in C\/C++\/etc should use the macro version, as it will be more efficient.
+--
+--     [Thread safety]: Obviously this function is safe to use from any thread at any time, but if you find yourself needing this, you are probably dealing with some very sensitive code; be careful!
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MemoryBarrierRelease@
+--
+--     [C declaration]: @SDL_MemoryBarrierReleaseFunction@, defined at @SDL3\/SDL_atomic.h 192:34@
+sDL_MemoryBarrierReleaseFunction :: IO ()
+sDL_MemoryBarrierReleaseFunction =
+  hs_bindgen_0e27a69a6cca6aac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_MemoryBarrierAcquireFunction@
+foreign import ccall unsafe "hs_bindgen_0eaa15705859b209"
+  hs_bindgen_0eaa15705859b209_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_MemoryBarrierAcquireFunction@
+hs_bindgen_0eaa15705859b209 :: IO ()
+hs_bindgen_0eaa15705859b209 =
+  BG.fromFFIType hs_bindgen_0eaa15705859b209_base
+
+-- | Insert a memory acquire barrier (function version).
+--
+--     Please refer to SDL_MemoryBarrierRelease for details. This is a function version, which might be useful if you need to use this functionality from a scripting language, etc. Also, some of the macro versions call this function behind the scenes, where more heavy lifting can happen inside of SDL. Generally, though, an app written in C\/C++\/etc should use the macro version, as it will be more efficient.
+--
+--     [Thread safety]: Obviously this function is safe to use from any thread at any time, but if you find yourself needing this, you are probably dealing with some very sensitive code; be careful!
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MemoryBarrierAcquire@
+--
+--     [C declaration]: @SDL_MemoryBarrierAcquireFunction@, defined at @SDL3\/SDL_atomic.h 212:34@
+sDL_MemoryBarrierAcquireFunction :: IO ()
+sDL_MemoryBarrierAcquireFunction =
+  hs_bindgen_0eaa15705859b209
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_CompareAndSwapAtomicInt@
+foreign import ccall unsafe "hs_bindgen_7528ef136d782538"
+  hs_bindgen_7528ef136d782538_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_CompareAndSwapAtomicInt@
+hs_bindgen_7528ef136d782538
+  :: BG.Ptr SDL_AtomicInt
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_7528ef136d782538 =
+  BG.fromFFIType hs_bindgen_7528ef136d782538_base
+
+-- | Set an atomic variable to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the atomic variable was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicInt', 'sDL_SetAtomicInt'
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicInt@, defined at @SDL3\/SDL_atomic.h 415:34@
+sDL_CompareAndSwapAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@oldval@]: the old value.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@newval@]: the new value.
+  -> IO BG.CBool
+sDL_CompareAndSwapAtomicInt =
+  hs_bindgen_7528ef136d782538
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_SetAtomicInt@
+foreign import ccall unsafe "hs_bindgen_6267a61e0fd93b33"
+  hs_bindgen_6267a61e0fd93b33_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_SetAtomicInt@
+hs_bindgen_6267a61e0fd93b33
+  :: BG.Ptr SDL_AtomicInt
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_6267a61e0fd93b33 =
+  BG.fromFFIType hs_bindgen_6267a61e0fd93b33_base
+
+-- | Set an atomic variable to a value.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicInt'
+--
+--     [C declaration]: @SDL_SetAtomicInt@, defined at @SDL3\/SDL_atomic.h 435:33@
+sDL_SetAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@v@]: the desired value.
+  -> IO BG.CInt
+sDL_SetAtomicInt = hs_bindgen_6267a61e0fd93b33
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_GetAtomicInt@
+foreign import ccall unsafe "hs_bindgen_5d8655898ff6cb2a"
+  hs_bindgen_5d8655898ff6cb2a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_GetAtomicInt@
+hs_bindgen_5d8655898ff6cb2a
+  :: BG.Ptr SDL_AtomicInt
+  -> IO BG.CInt
+hs_bindgen_5d8655898ff6cb2a =
+  BG.fromFFIType hs_bindgen_5d8655898ff6cb2a_base
+
+-- | Get the value of an atomic variable.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of an atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAtomicInt'
+--
+--     [C declaration]: @SDL_GetAtomicInt@, defined at @SDL3\/SDL_atomic.h 452:33@
+sDL_GetAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable.
+  -> IO BG.CInt
+sDL_GetAtomicInt = hs_bindgen_5d8655898ff6cb2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_AddAtomicInt@
+foreign import ccall unsafe "hs_bindgen_072d591dbe0586a7"
+  hs_bindgen_072d591dbe0586a7_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_AddAtomicInt@
+hs_bindgen_072d591dbe0586a7
+  :: BG.Ptr SDL_AtomicInt
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_072d591dbe0586a7 =
+  BG.fromFFIType hs_bindgen_072d591dbe0586a7_base
+
+-- | Add to an atomic variable.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_AtomicDecRef@, @SDL_AtomicIncRef@
+--
+--     [C declaration]: @SDL_AddAtomicInt@, defined at @SDL3\/SDL_atomic.h 473:33@
+sDL_AddAtomicInt
+  :: BG.Ptr SDL_AtomicInt
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicInt' variable to be modified.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@v@]: the desired value to add.
+  -> IO BG.CInt
+sDL_AddAtomicInt = hs_bindgen_072d591dbe0586a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_CompareAndSwapAtomicU32@
+foreign import ccall unsafe "hs_bindgen_f42a3f89648096cd"
+  hs_bindgen_f42a3f89648096cd_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_CompareAndSwapAtomicU32@
+hs_bindgen_f42a3f89648096cd
+  :: BG.Ptr SDL_AtomicU32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_f42a3f89648096cd =
+  BG.fromFFIType hs_bindgen_f42a3f89648096cd_base
+
+-- | Set an atomic variable to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the atomic variable was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicU32', 'sDL_SetAtomicU32'
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicU32@, defined at @SDL3\/SDL_atomic.h 560:34@
+sDL_CompareAndSwapAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@oldval@]: the old value.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@newval@]: the new value.
+  -> IO BG.CBool
+sDL_CompareAndSwapAtomicU32 =
+  hs_bindgen_f42a3f89648096cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_SetAtomicU32@
+foreign import ccall unsafe "hs_bindgen_f11ee3aacbcad44d"
+  hs_bindgen_f11ee3aacbcad44d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_SetAtomicU32@
+hs_bindgen_f11ee3aacbcad44d
+  :: BG.Ptr SDL_AtomicU32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_f11ee3aacbcad44d =
+  BG.fromFFIType hs_bindgen_f11ee3aacbcad44d_base
+
+-- | Set an atomic variable to a value.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAtomicU32'
+--
+--     [C declaration]: @SDL_SetAtomicU32@, defined at @SDL3\/SDL_atomic.h 580:36@
+sDL_SetAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@v@]: the desired value.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_SetAtomicU32 = hs_bindgen_f11ee3aacbcad44d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_GetAtomicU32@
+foreign import ccall unsafe "hs_bindgen_8dd395b4cca78369"
+  hs_bindgen_8dd395b4cca78369_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_GetAtomicU32@
+hs_bindgen_8dd395b4cca78369
+  :: BG.Ptr SDL_AtomicU32
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_8dd395b4cca78369 =
+  BG.fromFFIType hs_bindgen_8dd395b4cca78369_base
+
+-- | Get the value of an atomic variable.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of an atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAtomicU32'
+--
+--     [C declaration]: @SDL_GetAtomicU32@, defined at @SDL3\/SDL_atomic.h 597:36@
+sDL_GetAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_GetAtomicU32 = hs_bindgen_8dd395b4cca78369
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_AddAtomicU32@
+foreign import ccall unsafe "hs_bindgen_faa1fbc7406c4097"
+  hs_bindgen_faa1fbc7406c4097_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_AddAtomicU32@
+hs_bindgen_faa1fbc7406c4097
+  :: BG.Ptr SDL_AtomicU32
+  -> BG.CInt
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_faa1fbc7406c4097 =
+  BG.fromFFIType hs_bindgen_faa1fbc7406c4097_base
+
+-- | Add to an atomic variable.
+--
+--     This function also acts as a full memory barrier.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the atomic variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_AddAtomicU32@, defined at @SDL3\/SDL_atomic.h 615:36@
+sDL_AddAtomicU32
+  :: BG.Ptr SDL_AtomicU32
+  -- ^
+  --
+  --           [@a@]: a pointer to an 'SDL_AtomicU32' variable to be modified.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@v@]: the desired value to add or subtract.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_AddAtomicU32 = hs_bindgen_faa1fbc7406c4097
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_CompareAndSwapAtomicPointer@
+foreign import ccall unsafe "hs_bindgen_b184ba517671509d"
+  hs_bindgen_b184ba517671509d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_CompareAndSwapAtomicPointer@
+hs_bindgen_b184ba517671509d
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -> BG.Ptr BG.Void
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_b184ba517671509d =
+  BG.fromFFIType hs_bindgen_b184ba517671509d_base
+
+-- | Set a pointer to a new value if it is currently an old value.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: true if the pointer was set, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicInt', 'sDL_GetAtomicPointer', 'sDL_SetAtomicPointer'
+--
+--     [C declaration]: @SDL_CompareAndSwapAtomicPointer@, defined at @SDL3\/SDL_atomic.h 636:34@
+sDL_CompareAndSwapAtomicPointer
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@oldval@]: the old pointer value.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@newval@]: the new pointer value.
+  -> IO BG.CBool
+sDL_CompareAndSwapAtomicPointer =
+  hs_bindgen_b184ba517671509d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_SetAtomicPointer@
+foreign import ccall unsafe "hs_bindgen_c511073c2deacde8"
+  hs_bindgen_c511073c2deacde8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_SetAtomicPointer@
+hs_bindgen_c511073c2deacde8
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_c511073c2deacde8 =
+  BG.fromFFIType hs_bindgen_c511073c2deacde8_base
+
+-- | Set a pointer to a value atomically.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the previous value of the pointer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicPointer', 'sDL_GetAtomicPointer'
+--
+--     [C declaration]: @SDL_SetAtomicPointer@, defined at @SDL3\/SDL_atomic.h 655:36@
+sDL_SetAtomicPointer
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@v@]: the desired pointer value.
+  -> IO (BG.Ptr BG.Void)
+sDL_SetAtomicPointer = hs_bindgen_c511073c2deacde8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_GetAtomicPointer@
+foreign import ccall unsafe "hs_bindgen_24c92517dd70cd57"
+  hs_bindgen_24c92517dd70cd57_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Atomic_Unsafe_SDL_GetAtomicPointer@
+hs_bindgen_24c92517dd70cd57
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_24c92517dd70cd57 =
+  BG.fromFFIType hs_bindgen_24c92517dd70cd57_base
+
+-- | Get the value of a pointer atomically.
+--
+--     /__Note: If you don\'t know what this function is for, you shouldn\'t use it!__/
+--
+--     [Returns]: the current value of a pointer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CompareAndSwapAtomicPointer', 'sDL_SetAtomicPointer'
+--
+--     [C declaration]: @SDL_GetAtomicPointer@, defined at @SDL3\/SDL_atomic.h 673:36@
+sDL_GetAtomicPointer
+  :: BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@a@]: a pointer to a pointer.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetAtomicPointer = hs_bindgen_24c92517dd70cd57
diff --git a/src/SDL3/Sys/Bindgen/Audio.hs b/src/SDL3/Sys/Bindgen/Audio.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Audio.hs
@@ -0,0 +1,1133 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Audio functionality for the SDL library.
+--
+--     All audio in SDL3 revolves around 'SDL_AudioStream'. Whether you want to play or record audio, convert it, stream it, buffer it, or mix it, you\'re going to be passing it through an audio stream.
+--
+--     Audio streams are quite flexible; they can accept any amount of data at a time, in any supported format, and output it as needed in any other format, even if the data format changes on either side halfway through.
+--
+--     An app opens an audio device and binds any number of audio streams to it, feeding more data to the streams as available. When the device needs more data, it will pull it from all bound streams and mix them together for playback.
+--
+--     Audio streams can also use an app-provided callback to supply data on-demand, which maps pretty closely to the SDL2 audio model.
+--
+--     SDL also provides a simple .WAV loader in SDL_LoadWAV (and SDL_LoadWAV_IO if you aren\'t reading from a file) as a basic means to load sound data into your program.
+--
+--     Logical audio devices
+--
+--     In SDL3, opening a physical device (like a SoundBlaster 16 Pro) gives you a logical device ID that you can bind audio streams to. In almost all cases, logical devices can be used anywhere in the API that a physical device is normally used. However, since each device opening generates a new logical device, different parts of the program (say, a VoIP library, or text-to-speech framework, or maybe some other sort of mixer on top of SDL) can have their own device opens that do not interfere with each other; each logical device will mix its separate audio down to a single buffer, fed to the physical device, behind the scenes. As many logical devices as you like can come and go; SDL will only have to open the physical device at the OS level once, and will manage all the logical devices on top of it internally.
+--
+--     One other benefit of logical devices: if you don\'t open a specific physical device, instead opting for the default, SDL can automatically migrate those logical devices to different hardware as circumstances change: a user plugged in headphones? The system default changed? SDL can transparently migrate the logical devices to the correct physical device seamlessly and keep playing; the app doesn\'t even have to know it happened if it doesn\'t want to.
+--
+--     Simplified audio
+--
+--     As a simplified model for when a single source of audio is all that\'s needed, an app can use SDL_OpenAudioDeviceStream, which is a single function to open an audio device, create an audio stream, bind that stream to the newly-opened device, and (optionally) provide a callback for obtaining audio data. When using this function, the primary interface is the 'SDL_AudioStream' and the device handle is mostly hidden away; destroying a stream created through this function will also close the device, stream bindings cannot be changed, etc. One other quirk of this is that the device is started in a /paused/ state and must be explicitly resumed; this is partially to offer a clean migration for SDL2 apps and partially because the app might have to do more setup before playback begins; in the non-simplified form, nothing will play until a stream is bound to a device, so they start /unpaused/.
+--
+--     Channel layouts
+--
+--     Audio data passing through SDL is uncompressed PCM data, interleaved. One can provide their own decompression through an MP3, etc, decoder, but SDL does not provide this directly. Each interleaved channel of data is meant to be in a specific order.
+--
+--     Abbreviations:
+--
+--     * FRONT = single mono speaker
+--
+--     * FL = front left speaker
+--
+--     * FR = front right speaker
+--
+--     * FC = front center speaker
+--
+--     * BL = back left speaker
+--
+--     * BR = back right speaker
+--
+--     * SR = surround right speaker
+--
+--     * SL = surround left speaker
+--
+--     * BC = back center speaker
+--
+--     * LFE = low-frequency speaker
+--
+--     These are listed in the order they are laid out in memory, so \"FL, FR\" means \"the front left speaker is laid out in memory first, then the front right, then it repeats for the next audio frame\".
+--
+--     * 1 channel (mono) layout: FRONT
+--
+--     * 2 channels (stereo) layout: FL, FR
+--
+--     * 3 channels (2.1) layout: FL, FR, LFE
+--
+--     * 4 channels (quad) layout: FL, FR, BL, BR
+--
+--     * 5 channels (4.1) layout: FL, FR, LFE, BL, BR
+--
+--     * 6 channels (5.1) layout: FL, FR, FC, LFE, BL, BR (last two can also be SL, SR)
+--
+--     * 7 channels (6.1) layout: FL, FR, FC, LFE, BC, SL, SR
+--
+--     * 8 channels (7.1) layout: FL, FR, FC, LFE, BL, BR, SL, SR
+--
+--     This is the same order as DirectSound expects, but applied to all platforms; SDL will swizzle the channels as necessary if a platform expects something different.
+--
+--     'SDL_AudioStream' can also be provided channel maps to change this ordering to whatever is necessary, in other audio processing scenarios. Mask of bits in an 'SDL_AudioFormat' that contains the format bit size.
+--
+--     Generally one should use SDL_AUDIO_BITSIZE instead of this macro directly.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Audio (
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_MASK_BITSIZE,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_MASK_FLOAT,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_MASK_BIG_ENDIAN,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_MASK_SIGNED,
+  SDL3.Sys.Bindgen.Audio.SDL_AudioFormat (..),
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_U8,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_S8,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_S16LE,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_S16BE,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_S32LE,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_S32BE,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_F32LE,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_F32BE,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_S16,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_S32,
+  pattern SDL3.Sys.Bindgen.Audio.SDL_AUDIO_F32,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_BITSIZE,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_BYTESIZE,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_ISFLOAT,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_ISBIGENDIAN,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_ISLITTLEENDIAN,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_ISSIGNED,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_ISINT,
+  SDL3.Sys.Bindgen.Audio.sDL_AUDIO_ISUNSIGNED,
+  SDL3.Sys.Bindgen.Audio.SDL_AudioDeviceID (..),
+  SDL3.Sys.Bindgen.Audio.SDL_AudioSpec (..),
+  SDL3.Sys.Bindgen.Audio.SDL_AudioStream,
+  SDL3.Sys.Bindgen.Audio.sDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN,
+  SDL3.Sys.Bindgen.Audio.SDL_AudioStreamDataCompleteCallback_Aux (..),
+  SDL3.Sys.Bindgen.Audio.SDL_AudioStreamDataCompleteCallback (..),
+  SDL3.Sys.Bindgen.Audio.SDL_AudioStreamCallback_Aux (..),
+  SDL3.Sys.Bindgen.Audio.SDL_AudioStreamCallback (..),
+  SDL3.Sys.Bindgen.Audio.SDL_AudioPostmixCallback_Aux (..),
+  SDL3.Sys.Bindgen.Audio.SDL_AudioPostmixCallback (..),
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @macro SDL_AUDIO_MASK_BITSIZE@, defined at @SDL3\/SDL_audio.h 151:9@
+sDL_AUDIO_MASK_BITSIZE :: BG.CUInt
+sDL_AUDIO_MASK_BITSIZE = (255 :: BG.CUInt)
+
+-- | Mask of bits in an 'SDL_AudioFormat' that contain the floating point flag.
+--
+--     Generally one should use SDL_AUDIO_ISFLOAT instead of this macro directly.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_MASK_FLOAT@, defined at @SDL3\/SDL_audio.h 160:9@
+sDL_AUDIO_MASK_FLOAT :: BG.CUInt
+sDL_AUDIO_MASK_FLOAT =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (8 :: BG.CInt)
+
+-- | Mask of bits in an 'SDL_AudioFormat' that contain the bigendian flag.
+--
+--     Generally one should use SDL_AUDIO_ISBIGENDIAN or SDL_AUDIO_ISLITTLEENDIAN instead of this macro directly.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_MASK_BIG_ENDIAN@, defined at @SDL3\/SDL_audio.h 170:9@
+sDL_AUDIO_MASK_BIG_ENDIAN :: BG.CUInt
+sDL_AUDIO_MASK_BIG_ENDIAN =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (12 :: BG.CInt)
+
+-- | Mask of bits in an 'SDL_AudioFormat' that contain the signed data flag.
+--
+--     Generally one should use SDL_AUDIO_ISSIGNED instead of this macro directly.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_MASK_SIGNED@, defined at @SDL3\/SDL_audio.h 179:9@
+sDL_AUDIO_MASK_SIGNED :: BG.CUInt
+sDL_AUDIO_MASK_SIGNED =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (15 :: BG.CInt)
+
+-- | Audio format.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AUDIO_BITSIZE', 'sDL_AUDIO_BYTESIZE', 'sDL_AUDIO_ISINT', 'sDL_AUDIO_ISFLOAT', 'sDL_AUDIO_ISBIGENDIAN', 'sDL_AUDIO_ISLITTLEENDIAN', 'sDL_AUDIO_ISSIGNED', 'sDL_AUDIO_ISUNSIGNED'
+--
+--     [C declaration]: @enum SDL_AudioFormat@, defined at @SDL3\/SDL_audio.h 221:14@
+newtype SDL_AudioFormat = SDL_AudioFormat
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_AudioFormat where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_AudioFormat where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AudioFormat
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_AudioFormat where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AudioFormat unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_AudioFormat instance BG.Storable SDL_AudioFormat
+
+deriving via BG.CUInt instance BG.Prim SDL_AudioFormat
+
+instance CEnum.CEnum SDL_AudioFormat where
+  type CEnumZ SDL_AudioFormat = BG.CUInt
+
+  toCEnum = SDL_AudioFormat
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_AUDIO_UNKNOWN")
+        , (8, BG.singleton "SDL_AUDIO_U8")
+        , (32776, BG.singleton "SDL_AUDIO_S8")
+        , (32784, ("SDL_AUDIO_S16LE" BG.:| ["SDL_AUDIO_S16"]))
+        , (32800, ("SDL_AUDIO_S32LE" BG.:| ["SDL_AUDIO_S32"]))
+        , (33056, ("SDL_AUDIO_F32LE" BG.:| ["SDL_AUDIO_F32"]))
+        , (36880, BG.singleton "SDL_AUDIO_S16BE")
+        , (36896, BG.singleton "SDL_AUDIO_S32BE")
+        , (37152, BG.singleton "SDL_AUDIO_F32BE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_AudioFormat"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_AudioFormat"
+
+instance Show SDL_AudioFormat where
+  showsPrec = CEnum.shows
+
+instance Read SDL_AudioFormat where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_AudioFormat ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioFormat{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AudioFormat) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AudioFormat "unwrap" where
+  type CFieldType SDL_AudioFormat "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Unspecified audio format
+--
+--     [C declaration]: @SDL_AUDIO_UNKNOWN@, defined at @SDL3\/SDL_audio.h 223:5@
+pattern SDL_AUDIO_UNKNOWN :: SDL_AudioFormat
+pattern SDL_AUDIO_UNKNOWN = SDL_AudioFormat 0
+
+-- | Unsigned 8-bit samples
+--
+--     [C declaration]: @SDL_AUDIO_U8@, defined at @SDL3\/SDL_audio.h 224:5@
+pattern SDL_AUDIO_U8 :: SDL_AudioFormat
+pattern SDL_AUDIO_U8 = SDL_AudioFormat 8
+
+-- | Signed 8-bit samples
+--
+--     [C declaration]: @SDL_AUDIO_S8@, defined at @SDL3\/SDL_audio.h 226:5@
+pattern SDL_AUDIO_S8 :: SDL_AudioFormat
+pattern SDL_AUDIO_S8 = SDL_AudioFormat 32776
+
+-- | Signed 16-bit samples
+--
+--     [C declaration]: @SDL_AUDIO_S16LE@, defined at @SDL3\/SDL_audio.h 228:5@
+pattern SDL_AUDIO_S16LE :: SDL_AudioFormat
+pattern SDL_AUDIO_S16LE = SDL_AudioFormat 32784
+
+-- | As above, but big-endian byte order
+--
+--     [C declaration]: @SDL_AUDIO_S16BE@, defined at @SDL3\/SDL_audio.h 230:5@
+pattern SDL_AUDIO_S16BE :: SDL_AudioFormat
+pattern SDL_AUDIO_S16BE = SDL_AudioFormat 36880
+
+-- | 32-bit integer samples
+--
+--     [C declaration]: @SDL_AUDIO_S32LE@, defined at @SDL3\/SDL_audio.h 232:5@
+pattern SDL_AUDIO_S32LE :: SDL_AudioFormat
+pattern SDL_AUDIO_S32LE = SDL_AudioFormat 32800
+
+-- | As above, but big-endian byte order
+--
+--     [C declaration]: @SDL_AUDIO_S32BE@, defined at @SDL3\/SDL_audio.h 234:5@
+pattern SDL_AUDIO_S32BE :: SDL_AudioFormat
+pattern SDL_AUDIO_S32BE = SDL_AudioFormat 36896
+
+-- | 32-bit floating point samples
+--
+--     [C declaration]: @SDL_AUDIO_F32LE@, defined at @SDL3\/SDL_audio.h 236:5@
+pattern SDL_AUDIO_F32LE :: SDL_AudioFormat
+pattern SDL_AUDIO_F32LE = SDL_AudioFormat 33056
+
+-- | As above, but big-endian byte order
+--
+--     [C declaration]: @SDL_AUDIO_F32BE@, defined at @SDL3\/SDL_audio.h 238:5@
+pattern SDL_AUDIO_F32BE :: SDL_AudioFormat
+pattern SDL_AUDIO_F32BE = SDL_AudioFormat 37152
+
+-- | [C declaration]: @SDL_AUDIO_S16@, defined at @SDL3\/SDL_audio.h 243:5@
+pattern SDL_AUDIO_S16 :: SDL_AudioFormat
+pattern SDL_AUDIO_S16 = SDL_AudioFormat 32784
+
+-- | [C declaration]: @SDL_AUDIO_S32@, defined at @SDL3\/SDL_audio.h 244:5@
+pattern SDL_AUDIO_S32 :: SDL_AudioFormat
+pattern SDL_AUDIO_S32 = SDL_AudioFormat 32800
+
+-- | [C declaration]: @SDL_AUDIO_F32@, defined at @SDL3\/SDL_audio.h 245:5@
+pattern SDL_AUDIO_F32 :: SDL_AudioFormat
+pattern SDL_AUDIO_F32 = SDL_AudioFormat 33056
+
+-- | Retrieve the size, in bits, from an 'SDL_AudioFormat'.
+--
+--     For example, @SDL_AUDIO_BITSIZE(SDL_AUDIO_S16)@ returns 16.
+--
+--     [@x@]: an 'SDL_AudioFormat' value.
+--
+--     [Returns]: data size in bits.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_BITSIZE@, defined at @SDL3\/SDL_audio.h 266:9@
+sDL_AUDIO_BITSIZE
+  :: forall a0. (C.Expr.HostPlatform.Bitwise a0 BG.CUInt) => a0 -> C.Expr.HostPlatform.BitsRes a0 BG.CUInt
+sDL_AUDIO_BITSIZE =
+  \x0 ->
+    (C.Expr.HostPlatform..&.) x0 sDL_AUDIO_MASK_BITSIZE
+
+-- | Retrieve the size, in bytes, from an 'SDL_AudioFormat'.
+--
+--     For example, @SDL_AUDIO_BYTESIZE(SDL_AUDIO_S16)@ returns 2.
+--
+--     [@x@]: an 'SDL_AudioFormat' value.
+--
+--     [Returns]: data size in bytes.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_BYTESIZE@, defined at @SDL3\/SDL_audio.h 280:9@
+sDL_AUDIO_BYTESIZE
+  :: forall a0
+   . (C.Expr.HostPlatform.Div (C.Expr.HostPlatform.BitsRes a0 BG.CUInt) BG.CInt)
+  => (C.Expr.HostPlatform.Bitwise a0 BG.CUInt)
+  => a0 -> C.Expr.HostPlatform.DivRes (C.Expr.HostPlatform.BitsRes a0 BG.CUInt) BG.CInt
+sDL_AUDIO_BYTESIZE =
+  \x0 ->
+    (C.Expr.HostPlatform./) (sDL_AUDIO_BITSIZE x0) (8 :: BG.CInt)
+
+-- | Determine if an 'SDL_AudioFormat' represents floating point data.
+--
+--     For example, @SDL_AUDIO_ISFLOAT(SDL_AUDIO_S16)@ returns 0.
+--
+--     [@x@]: an 'SDL_AudioFormat' value.
+--
+--     [Returns]: non-zero if format is floating point, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_ISFLOAT@, defined at @SDL3\/SDL_audio.h 294:9@
+sDL_AUDIO_ISFLOAT
+  :: forall a0. (C.Expr.HostPlatform.Bitwise a0 BG.CUInt) => a0 -> C.Expr.HostPlatform.BitsRes a0 BG.CUInt
+sDL_AUDIO_ISFLOAT =
+  \x0 ->
+    (C.Expr.HostPlatform..&.) x0 sDL_AUDIO_MASK_FLOAT
+
+-- | Determine if an 'SDL_AudioFormat' represents bigendian data.
+--
+--     For example, @SDL_AUDIO_ISBIGENDIAN(SDL_AUDIO_S16LE)@ returns 0.
+--
+--     [@x@]: an 'SDL_AudioFormat' value.
+--
+--     [Returns]: non-zero if format is bigendian, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_ISBIGENDIAN@, defined at @SDL3\/SDL_audio.h 308:9@
+sDL_AUDIO_ISBIGENDIAN
+  :: forall a0. (C.Expr.HostPlatform.Bitwise a0 BG.CUInt) => a0 -> C.Expr.HostPlatform.BitsRes a0 BG.CUInt
+sDL_AUDIO_ISBIGENDIAN =
+  \x0 ->
+    (C.Expr.HostPlatform..&.) x0 sDL_AUDIO_MASK_BIG_ENDIAN
+
+-- | Determine if an 'SDL_AudioFormat' represents littleendian data.
+--
+--     For example, @SDL_AUDIO_ISLITTLEENDIAN(SDL_AUDIO_S16BE)@ returns 0.
+--
+--     [@x@]: an 'SDL_AudioFormat' value.
+--
+--     [Returns]: non-zero if format is littleendian, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_ISLITTLEENDIAN@, defined at @SDL3\/SDL_audio.h 322:9@
+sDL_AUDIO_ISLITTLEENDIAN
+  :: forall a0
+   . (C.Expr.HostPlatform.Not (C.Expr.HostPlatform.BitsRes a0 BG.CUInt))
+  => (C.Expr.HostPlatform.Bitwise a0 BG.CUInt)
+  => a0 -> BG.CInt
+sDL_AUDIO_ISLITTLEENDIAN =
+  \x0 ->
+    C.Expr.HostPlatform.not (sDL_AUDIO_ISBIGENDIAN x0)
+
+-- | Determine if an 'SDL_AudioFormat' represents signed data.
+--
+--     For example, @SDL_AUDIO_ISSIGNED(SDL_AUDIO_U8)@ returns 0.
+--
+--     [@x@]: an 'SDL_AudioFormat' value.
+--
+--     [Returns]: non-zero if format is signed, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_ISSIGNED@, defined at @SDL3\/SDL_audio.h 336:9@
+sDL_AUDIO_ISSIGNED
+  :: forall a0. (C.Expr.HostPlatform.Bitwise a0 BG.CUInt) => a0 -> C.Expr.HostPlatform.BitsRes a0 BG.CUInt
+sDL_AUDIO_ISSIGNED =
+  \x0 ->
+    (C.Expr.HostPlatform..&.) x0 sDL_AUDIO_MASK_SIGNED
+
+-- | Determine if an 'SDL_AudioFormat' represents integer data.
+--
+--     For example, @SDL_AUDIO_ISINT(SDL_AUDIO_F32)@ returns 0.
+--
+--     [@x@]: an 'SDL_AudioFormat' value.
+--
+--     [Returns]: non-zero if format is integer, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_ISINT@, defined at @SDL3\/SDL_audio.h 350:9@
+sDL_AUDIO_ISINT
+  :: forall a0
+   . (C.Expr.HostPlatform.Not (C.Expr.HostPlatform.BitsRes a0 BG.CUInt))
+  => (C.Expr.HostPlatform.Bitwise a0 BG.CUInt)
+  => a0 -> BG.CInt
+sDL_AUDIO_ISINT =
+  \x0 -> C.Expr.HostPlatform.not (sDL_AUDIO_ISFLOAT x0)
+
+-- | Determine if an 'SDL_AudioFormat' represents unsigned data.
+--
+--     For example, @SDL_AUDIO_ISUNSIGNED(SDL_AUDIO_S16)@ returns 0.
+--
+--     [@x@]: an 'SDL_AudioFormat' value.
+--
+--     [Returns]: non-zero if format is unsigned, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_AUDIO_ISUNSIGNED@, defined at @SDL3\/SDL_audio.h 364:9@
+sDL_AUDIO_ISUNSIGNED
+  :: forall a0
+   . (C.Expr.HostPlatform.Not (C.Expr.HostPlatform.BitsRes a0 BG.CUInt))
+  => (C.Expr.HostPlatform.Bitwise a0 BG.CUInt)
+  => a0 -> BG.CInt
+sDL_AUDIO_ISUNSIGNED =
+  \x0 ->
+    C.Expr.HostPlatform.not (sDL_AUDIO_ISSIGNED x0)
+
+-- | SDL Audio Device instance IDs.
+--
+--     Zero is used to signify an invalid\/null device.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_AudioDeviceID@, defined at @SDL3\/SDL_audio.h 374:16@
+newtype SDL_AudioDeviceID = SDL_AudioDeviceID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_AudioDeviceID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioDeviceID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AudioDeviceID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AudioDeviceID "unwrap" where
+  type
+    CFieldType SDL_AudioDeviceID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Format specifier for audio data.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_AudioFormat'
+--
+--     [C declaration]: @struct SDL_AudioSpec@, defined at @SDL3\/SDL_audio.h 405:16@
+data SDL_AudioSpec = SDL_AudioSpec
+  { format :: SDL_AudioFormat
+  -- ^ Audio data format
+  --
+  --          [C declaration]: @format@, defined at @SDL3\/SDL_audio.h 407:21@
+  , channels :: BG.CInt
+  -- ^ Number of channels: 1 mono, 2 stereo, etc
+  --
+  --          [C declaration]: @channels@, defined at @SDL3\/SDL_audio.h 408:9@
+  , freq :: BG.CInt
+  -- ^ sample rate: sample frames per second
+  --
+  --          [C declaration]: @freq@, defined at @SDL3\/SDL_audio.h 409:9@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_AudioSpec where
+  staticSizeOf = \_ -> (12 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_AudioSpec where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AudioSpec
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"channels") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"freq") ptr0
+
+instance Marshal.WriteRaw SDL_AudioSpec where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AudioSpec format2 channels3 freq4 ->
+            HasCField.writeRaw (BG.Proxy @"format") ptr0 format2
+              >> HasCField.writeRaw (BG.Proxy @"channels") ptr0 channels3
+              >> HasCField.writeRaw (BG.Proxy @"freq") ptr0 freq4
+
+deriving via Marshal.EquivStorable SDL_AudioSpec instance BG.Storable SDL_AudioSpec
+
+instance
+  (ty ~ SDL_AudioFormat)
+  => BG.CompatHasField.HasField "format" SDL_AudioSpec ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioSpec
+            { format = y1
+            , channels = BG.getField @"channels" x0
+            , freq = BG.getField @"freq" x0
+            }
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL_AudioFormat)
+  => BG.HasField "format" (BG.Ptr SDL_AudioSpec) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_AudioSpec "format" where
+  type
+    CFieldType SDL_AudioSpec "format" =
+      SDL_AudioFormat
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "channels" SDL_AudioSpec ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioSpec
+            { channels = y1
+            , format = BG.getField @"format" x0
+            , freq = BG.getField @"freq" x0
+            }
+      , BG.getField @"channels" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "channels" (BG.Ptr SDL_AudioSpec) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"channels")
+
+instance HasCField.HasCField SDL_AudioSpec "channels" where
+  type CFieldType SDL_AudioSpec "channels" = BG.CInt
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "freq" SDL_AudioSpec ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioSpec
+            { freq = y1
+            , format = BG.getField @"format" x0
+            , channels = BG.getField @"channels" x0
+            }
+      , BG.getField @"freq" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "freq" (BG.Ptr SDL_AudioSpec) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"freq")
+
+instance HasCField.HasCField SDL_AudioSpec "freq" where
+  type CFieldType SDL_AudioSpec "freq" = BG.CInt
+
+  offset# = \_ -> \_ -> 8
+
+-- | The opaque handle that represents an audio stream.
+--
+--     'SDL_AudioStream' is an audio conversion interface.
+--
+--     * It can handle resampling data in chunks without generating artifacts, when it doesn\'t have the complete buffer available.
+--
+--     * It can handle incoming data in any variable size.
+--
+--     * It can handle input\/output format changes on the fly.
+--
+--     * It can remap audio channels between inputs and outputs.
+--
+--     * You push data as you have it, and pull it when you need it
+--
+--     * It can also function as a basic audio data queue even if you just have sound that needs to pass from one place to another.
+--
+--     * You can hook callbacks up to them when more data is added or requested, to manage data on-the-fly.
+--
+--     Audio streams are the core of the SDL3 audio interface. You create one or more of them, bind them to an opened audio device, and feed data to them (or for recording, consume data from them).
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAudioStream'
+--
+--     [C declaration]: @struct SDL_AudioStream@, defined at @SDL3\/SDL_audio.h 451:16@
+data SDL_AudioStream
+
+-- | [C declaration]: @macro SDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN@, literal @\"SDL.audiostream.auto_cleanup\"@, defined at @SDL3\/SDL_audio.h 1100:9@
+sDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN :: BG.ByteString
+sDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x61
+    , 0x75
+    , 0x64
+    , 0x69
+    , 0x6F
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x6D
+    , 0x2E
+    , 0x61
+    , 0x75
+    , 0x74
+    , 0x6F
+    , 0x5F
+    , 0x63
+    , 0x6C
+    , 0x65
+    , 0x61
+    , 0x6E
+    , 0x75
+    , 0x70
+    ]
+
+-- | Auxiliary type used by 'SDL_AudioStreamDataCompleteCallback'
+--
+--     [C declaration]: @SDL_AudioStreamDataCompleteCallback@, defined at @SDL3\/SDL_audio.h 1472:24@
+newtype SDL_AudioStreamDataCompleteCallback_Aux = SDL_AudioStreamDataCompleteCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_AudioStreamDataCompleteCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_d632898096a732d7_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> IO ()))
+
+-- __unique:__ @toSDL_AudioStreamDataCompleteCallback_Aux@
+hs_bindgen_d632898096a732d7
+  :: SDL_AudioStreamDataCompleteCallback_Aux
+  -> IO (BG.FunPtr SDL_AudioStreamDataCompleteCallback_Aux)
+hs_bindgen_d632898096a732d7 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_d632898096a732d7_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_AudioStreamDataCompleteCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_13d85e7076fc6ef1_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> IO ())
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO ()
+
+-- __unique:__ @fromSDL_AudioStreamDataCompleteCallback_Aux@
+hs_bindgen_13d85e7076fc6ef1
+  :: BG.FunPtr SDL_AudioStreamDataCompleteCallback_Aux
+  -> SDL_AudioStreamDataCompleteCallback_Aux
+hs_bindgen_13d85e7076fc6ef1 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_13d85e7076fc6ef1_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_AudioStreamDataCompleteCallback_Aux where
+  toFunPtr = hs_bindgen_d632898096a732d7
+
+instance BG.FromFunPtr SDL_AudioStreamDataCompleteCallback_Aux where
+  fromFunPtr = hs_bindgen_13d85e7076fc6ef1
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_AudioStreamDataCompleteCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioStreamDataCompleteCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_AudioStreamDataCompleteCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AudioStreamDataCompleteCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_AudioStreamDataCompleteCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback that fires for completed @SDL_PutAudioStreamDataNoCopy()@ data.
+--
+--     When using @SDL_PutAudioStreamDataNoCopy()@ to provide data to an 'SDL_AudioStream', it\'s not safe to dispose of the data until the stream has completely consumed it. Often times it\'s difficult to know exactly when this has happened.
+--
+--     This callback fires once when the stream no longer needs the buffer, allowing the app to easily free or reuse it.
+--
+--     [@userdata@]: an opaque pointer provided by the app for their personal use.
+--
+--     [@buf@]: the pointer provided to @SDL_PutAudioStreamDataNoCopy()@.
+--
+--     [@buflen@]: the size of buffer, in bytes, provided to @SDL_PutAudioStreamDataNoCopy()@.
+--
+--     [Thread safety]: This callbacks may run from any thread, so if you need to protect shared data, you should use SDL_LockAudioStream to serialize access; this lock will be held before your callback is called, so your callback does not need to manage the lock explicitly.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetAudioStreamGetCallback', 'sDL_SetAudioStreamPutCallback'
+--
+--     [C declaration]: @SDL_AudioStreamDataCompleteCallback@, defined at @SDL3\/SDL_audio.h 1472:24@
+newtype SDL_AudioStreamDataCompleteCallback = SDL_AudioStreamDataCompleteCallback
+  { unwrap :: BG.FunPtr SDL_AudioStreamDataCompleteCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_AudioStreamDataCompleteCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_AudioStreamDataCompleteCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioStreamDataCompleteCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_AudioStreamDataCompleteCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AudioStreamDataCompleteCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AudioStreamDataCompleteCallback "unwrap" where
+  type
+    CFieldType SDL_AudioStreamDataCompleteCallback "unwrap" =
+      BG.FunPtr SDL_AudioStreamDataCompleteCallback_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_AudioStreamCallback'
+--
+--     [C declaration]: @SDL_AudioStreamCallback@, defined at @SDL3\/SDL_audio.h 1865:24@
+newtype SDL_AudioStreamCallback_Aux = SDL_AudioStreamCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> BG.Ptr SDL_AudioStream -> BG.CInt -> BG.CInt -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_AudioStreamCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_2ba16e119c56cb1b_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> BG.Int32 -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> BG.Int32 -> IO ()))
+
+-- __unique:__ @toSDL_AudioStreamCallback_Aux@
+hs_bindgen_2ba16e119c56cb1b
+  :: SDL_AudioStreamCallback_Aux
+  -> IO (BG.FunPtr SDL_AudioStreamCallback_Aux)
+hs_bindgen_2ba16e119c56cb1b =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_2ba16e119c56cb1b_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_AudioStreamCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_a0fafe03b8b6d008_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> BG.Int32 -> IO ())
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO ()
+
+-- __unique:__ @fromSDL_AudioStreamCallback_Aux@
+hs_bindgen_a0fafe03b8b6d008
+  :: BG.FunPtr SDL_AudioStreamCallback_Aux
+  -> SDL_AudioStreamCallback_Aux
+hs_bindgen_a0fafe03b8b6d008 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_a0fafe03b8b6d008_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_AudioStreamCallback_Aux where
+  toFunPtr = hs_bindgen_2ba16e119c56cb1b
+
+instance BG.FromFunPtr SDL_AudioStreamCallback_Aux where
+  fromFunPtr = hs_bindgen_a0fafe03b8b6d008
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr SDL_AudioStream -> BG.CInt -> BG.CInt -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_AudioStreamCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioStreamCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr SDL_AudioStream -> BG.CInt -> BG.CInt -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_AudioStreamCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AudioStreamCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_AudioStreamCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> BG.Ptr SDL_AudioStream -> BG.CInt -> BG.CInt -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback that fires when data passes through an 'SDL_AudioStream'.
+--
+--     Apps can (optionally) register a callback with an audio stream that is called when data is added with SDL_PutAudioStreamData, or requested with SDL_GetAudioStreamData.
+--
+--     Two values are offered here: one is the amount of additional data needed to satisfy the immediate request (which might be zero if the stream already has enough data queued) and the other is the total amount being requested. In a Get call triggering a Put callback, these values can be different. In a Put call triggering a Get callback, these values are always the same.
+--
+--     Byte counts might be slightly overestimated due to buffering or resampling, and may change from call to call.
+--
+--     This callback is not required to do anything. Generally this is useful for adding\/reading data on demand, and the app will often put\/get data as appropriate, but the system goes on with the data currently available to it if this callback does nothing.
+--
+--     [@stream@]: the SDL audio stream associated with this callback.
+--
+--     [@additional_amount@]: the amount of data, in bytes, that is needed right now.
+--
+--     [@total_amount@]: the total amount of data requested, in bytes, that is requested or available.
+--
+--     [@userdata@]: an opaque pointer provided by the app for their personal use.
+--
+--     [Thread safety]: This callbacks may run from any thread, so if you need to protect shared data, you should use SDL_LockAudioStream to serialize access; this lock will be held before your callback is called, so your callback does not need to manage the lock explicitly.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamGetCallback', 'sDL_SetAudioStreamPutCallback'
+--
+--     [C declaration]: @SDL_AudioStreamCallback@, defined at @SDL3\/SDL_audio.h 1865:24@
+newtype SDL_AudioStreamCallback = SDL_AudioStreamCallback
+  { unwrap :: BG.FunPtr SDL_AudioStreamCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_AudioStreamCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_AudioStreamCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioStreamCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_AudioStreamCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AudioStreamCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AudioStreamCallback "unwrap" where
+  type
+    CFieldType SDL_AudioStreamCallback "unwrap" =
+      BG.FunPtr SDL_AudioStreamCallback_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_AudioPostmixCallback'
+--
+--     [C declaration]: @SDL_AudioPostmixCallback@, defined at @SDL3\/SDL_audio.h 2082:24@
+newtype SDL_AudioPostmixCallback_Aux = SDL_AudioPostmixCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> PtrConst.PtrConst SDL_AudioSpec -> BG.Ptr BG.CFloat -> BG.CInt -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_AudioPostmixCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_303b6f766f2a421d_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> IO ()))
+
+-- __unique:__ @toSDL_AudioPostmixCallback_Aux@
+hs_bindgen_303b6f766f2a421d
+  :: SDL_AudioPostmixCallback_Aux
+  -> IO (BG.FunPtr SDL_AudioPostmixCallback_Aux)
+hs_bindgen_303b6f766f2a421d =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_303b6f766f2a421d_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_AudioPostmixCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_148fa618325eaf19_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> IO ())
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO ()
+
+-- __unique:__ @fromSDL_AudioPostmixCallback_Aux@
+hs_bindgen_148fa618325eaf19
+  :: BG.FunPtr SDL_AudioPostmixCallback_Aux
+  -> SDL_AudioPostmixCallback_Aux
+hs_bindgen_148fa618325eaf19 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_148fa618325eaf19_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_AudioPostmixCallback_Aux where
+  toFunPtr = hs_bindgen_303b6f766f2a421d
+
+instance BG.FromFunPtr SDL_AudioPostmixCallback_Aux where
+  fromFunPtr = hs_bindgen_148fa618325eaf19
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> PtrConst.PtrConst SDL_AudioSpec -> BG.Ptr BG.CFloat -> BG.CInt -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_AudioPostmixCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioPostmixCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> PtrConst.PtrConst SDL_AudioSpec -> BG.Ptr BG.CFloat -> BG.CInt -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_AudioPostmixCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AudioPostmixCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_AudioPostmixCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> PtrConst.PtrConst SDL_AudioSpec -> BG.Ptr BG.CFloat -> BG.CInt -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback that fires when data is about to be fed to an audio device.
+--
+--     This is useful for accessing the final mix, perhaps for writing a visualizer or applying a final effect to the audio data before playback.
+--
+--     This callback should run as quickly as possible and not block for any significant time, as this callback delays submission of data to the audio device, which can cause audio playback problems.
+--
+--     The postmix callback /must/ be able to handle any audio data format specified in @spec@, which can change between callbacks if the audio device changed. However, this only covers frequency and channel count; data is always provided here in SDL_AUDIO_F32 format.
+--
+--     The postmix callback runs /after/ logical device gain and audiostream gain have been applied, which is to say you can make the output data louder at this point than the gain settings would suggest.
+--
+--     [@userdata@]: a pointer provided by the app through SDL_SetAudioPostmixCallback, for its own use.
+--
+--     [@spec@]: the current format of audio that is to be submitted to the audio device.
+--
+--     [@buffer@]: the buffer of audio samples to be submitted. The callback can inspect and\/or modify this data.
+--
+--     [@buflen@]: the size of @buffer@ in bytes.
+--
+--     [Thread safety]: This will run from a background thread owned by SDL. The application is responsible for locking resources the callback touches that need to be protected.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioPostmixCallback'
+--
+--     [C declaration]: @SDL_AudioPostmixCallback@, defined at @SDL3\/SDL_audio.h 2082:24@
+newtype SDL_AudioPostmixCallback = SDL_AudioPostmixCallback
+  { unwrap :: BG.FunPtr SDL_AudioPostmixCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_AudioPostmixCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_AudioPostmixCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioPostmixCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_AudioPostmixCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AudioPostmixCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AudioPostmixCallback "unwrap" where
+  type
+    CFieldType SDL_AudioPostmixCallback "unwrap" =
+      BG.FunPtr SDL_AudioPostmixCallback_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Audio/FunPtr.hs b/src/SDL3/Sys/Bindgen/Audio/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Audio/FunPtr.hs
@@ -0,0 +1,2931 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Audio.FunPtr (
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetNumAudioDrivers,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioDriver,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetCurrentAudioDriver,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioPlaybackDevices,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioRecordingDevices,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioDeviceName,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioDeviceFormat,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioDeviceChannelMap,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_OpenAudioDevice,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_IsAudioDevicePhysical,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_IsAudioDevicePlayback,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_PauseAudioDevice,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_ResumeAudioDevice,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_AudioDevicePaused,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioDeviceGain,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_SetAudioDeviceGain,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_CloseAudioDevice,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_BindAudioStreams,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_BindAudioStream,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_UnbindAudioStreams,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_UnbindAudioStream,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioStreamDevice,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_CreateAudioStream,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioStreamProperties,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioStreamFormat,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_SetAudioStreamFormat,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioStreamFrequencyRatio,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_SetAudioStreamFrequencyRatio,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioStreamGain,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_SetAudioStreamGain,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioStreamInputChannelMap,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioStreamOutputChannelMap,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_SetAudioStreamInputChannelMap,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_SetAudioStreamOutputChannelMap,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_PutAudioStreamData,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_PutAudioStreamDataNoCopy,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_PutAudioStreamPlanarData,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioStreamData,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioStreamAvailable,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioStreamQueued,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_FlushAudioStream,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_ClearAudioStream,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_PauseAudioStreamDevice,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_ResumeAudioStreamDevice,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_AudioStreamDevicePaused,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_LockAudioStream,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_UnlockAudioStream,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_SetAudioStreamGetCallback,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_SetAudioStreamPutCallback,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_DestroyAudioStream,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_OpenAudioDeviceStream,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_SetAudioPostmixCallback,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_LoadWAV_IO,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_LoadWAV,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_MixAudio,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_ConvertAudioSamples,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetAudioFormatName,
+  SDL3.Sys.Bindgen.Audio.FunPtr.sDL_GetSilenceValueForFormat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Audio
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_audio.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetNumAudioDrivers */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_70df3deb87a6a291 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetNumAudioDrivers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDriver */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_96a59296db34206f (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioDriver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetCurrentAudioDriver */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_3b5e65309af7eb52 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetCurrentAudioDriver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioPlaybackDevices */"
+         , "__attribute__ ((const))"
+         , "SDL_AudioDeviceID *(*hs_bindgen_0154df1db50254cb (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioPlaybackDevices;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioRecordingDevices */"
+         , "__attribute__ ((const))"
+         , "SDL_AudioDeviceID *(*hs_bindgen_b1e17652d75669ba (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioRecordingDevices;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_dcc642abb8604857 (void)) ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioDeviceName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceFormat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7ee63106dd01fabe (void)) ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioSpec *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioDeviceFormat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceChannelMap */"
+         , "__attribute__ ((const))"
+         , "signed int *(*hs_bindgen_d8865ee45cf3f909 (void)) ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioDeviceChannelMap;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_OpenAudioDevice */"
+         , "__attribute__ ((const))"
+         , "SDL_AudioDeviceID (*hs_bindgen_a61ac8f884503a96 (void)) ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioSpec const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenAudioDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_IsAudioDevicePhysical */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6499cfa703c6758f (void)) ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_IsAudioDevicePhysical;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_IsAudioDevicePlayback */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a0086d8f92145768 (void)) ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_IsAudioDevicePlayback;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PauseAudioDevice */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1003717acae7ce8b (void)) ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_PauseAudioDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ResumeAudioDevice */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_df9a550a09c18c65 (void)) ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ResumeAudioDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_AudioDevicePaused */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4580e249e63ded2b (void)) ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_AudioDevicePaused;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceGain */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_6f1b270afdab6bb6 (void)) ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioDeviceGain;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioDeviceGain */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_aa933d15c7bb8ed3 (void)) ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAudioDeviceGain;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_CloseAudioDevice */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_b303dd6fccc99188 (void)) ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CloseAudioDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_BindAudioStreams */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3e9d0d17f11c1de8 (void)) ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioStream *const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_BindAudioStreams;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_BindAudioStream */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d6749d59b79ec0ff (void)) ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioStream *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_BindAudioStream;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_UnbindAudioStreams */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_d96a4f36c25b0021 (void)) ("
+         , "  SDL_AudioStream *const *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_UnbindAudioStreams;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_UnbindAudioStream */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_8afc843a61a3bdb8 (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_UnbindAudioStream;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamDevice */"
+         , "__attribute__ ((const))"
+         , "SDL_AudioDeviceID (*hs_bindgen_218bd50ed6f98e9c (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioStreamDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_CreateAudioStream */"
+         , "__attribute__ ((const))"
+         , "SDL_AudioStream *(*hs_bindgen_7305536d807d048c (void)) ("
+         , "  SDL_AudioSpec const *arg1,"
+         , "  SDL_AudioSpec const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateAudioStream;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_73d6922c8243e33c (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioStreamProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamFormat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_eb3398e3b41382ce (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioSpec *arg2,"
+         , "  SDL_AudioSpec *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioStreamFormat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamFormat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_53ea32f5417e7afe (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioSpec const *arg2,"
+         , "  SDL_AudioSpec const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAudioStreamFormat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamFrequencyRatio */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_b61bdb5d542753f6 (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioStreamFrequencyRatio;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamFrequencyRatio */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ce1524607d0065a9 (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAudioStreamFrequencyRatio;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamGain */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_a83ce7d2a5163b17 (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioStreamGain;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamGain */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_79a25e2eef272c3b (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAudioStreamGain;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamInputChannelMap */"
+         , "__attribute__ ((const))"
+         , "signed int *(*hs_bindgen_8335e23836f4112d (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioStreamInputChannelMap;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamOutputChannelMap */"
+         , "__attribute__ ((const))"
+         , "signed int *(*hs_bindgen_fa8ad3c08cbd6973 (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioStreamOutputChannelMap;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamInputChannelMap */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_779c5c09495318d9 (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAudioStreamInputChannelMap;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamOutputChannelMap */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_aea000b7665d902d (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAudioStreamOutputChannelMap;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PutAudioStreamData */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_958cb85cef653993 (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_PutAudioStreamData;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef void *SDL_AudioStreamDataCompleteCallback;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PutAudioStreamDataNoCopy */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_29041de46ea3d0a6 (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3,"
+         , "  SDL_AudioStreamDataCompleteCallback arg4,"
+         , "  void *arg5"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_PutAudioStreamDataNoCopy;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_PutAudioStreamDataNoCopy requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PutAudioStreamPlanarData */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8d42e0e8a50f7193 (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void const *const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_PutAudioStreamPlanarData;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_PutAudioStreamPlanarData requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamData */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_c52b30082bdb58cd (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioStreamData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamAvailable */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_887ee267fde7c9f0 (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioStreamAvailable;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamQueued */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_30f43c9a9503bb9c (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioStreamQueued;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_FlushAudioStream */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b5a765a41b34efed (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_FlushAudioStream;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ClearAudioStream */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_66aa75f68cad1a60 (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ClearAudioStream;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PauseAudioStreamDevice */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_65bad5f751085af2 (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_PauseAudioStreamDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ResumeAudioStreamDevice */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3422451103f73d83 (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ResumeAudioStreamDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_AudioStreamDevicePaused */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3e6ce96a7f944949 (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_AudioStreamDevicePaused;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_LockAudioStream */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_0d7bbaa2282f61af (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_LockAudioStream;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_UnlockAudioStream */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_01197b6703408060 (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_UnlockAudioStream;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamGetCallback */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c3613cf8e8649c19 (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioStreamCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAudioStreamGetCallback;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamPutCallback */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_94194526836dd7bc (void)) ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioStreamCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAudioStreamPutCallback;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_DestroyAudioStream */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_8414956b9aa941e0 (void)) ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyAudioStream;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_OpenAudioDeviceStream */"
+         , "__attribute__ ((const))"
+         , "SDL_AudioStream *(*hs_bindgen_e8ad9974dfab54c1 (void)) ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioSpec const *arg2,"
+         , "  SDL_AudioStreamCallback arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenAudioDeviceStream;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioPostmixCallback */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fb49ec8721a9eaae (void)) ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioPostmixCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAudioPostmixCallback;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_LoadWAV_IO */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_aeaf62387043ab14 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2,"
+         , "  SDL_AudioSpec *arg3,"
+         , "  Uint8 **arg4,"
+         , "  Uint32 *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_LoadWAV_IO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_LoadWAV */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_23688fb6d15b1a20 (void)) ("
+         , "  char const *arg1,"
+         , "  SDL_AudioSpec *arg2,"
+         , "  Uint8 **arg3,"
+         , "  Uint32 *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_LoadWAV;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_MixAudio */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b67274f0c4cb98dd (void)) ("
+         , "  Uint8 *arg1,"
+         , "  Uint8 const *arg2,"
+         , "  SDL_AudioFormat arg3,"
+         , "  Uint32 arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_MixAudio;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ConvertAudioSamples */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_94a0a8ff1b94e777 (void)) ("
+         , "  SDL_AudioSpec const *arg1,"
+         , "  Uint8 const *arg2,"
+         , "  signed int arg3,"
+         , "  SDL_AudioSpec const *arg4,"
+         , "  Uint8 **arg5,"
+         , "  signed int *arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_ConvertAudioSamples;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioFormatName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_8a62dc82ce668b2b (void)) ("
+         , "  SDL_AudioFormat arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAudioFormatName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetSilenceValueForFormat */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_733e8e75537d52fb (void)) ("
+         , "  SDL_AudioFormat arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSilenceValueForFormat;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetNumAudioDrivers@
+foreign import ccall unsafe "hs_bindgen_70df3deb87a6a291"
+  hs_bindgen_70df3deb87a6a291_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetNumAudioDrivers@
+hs_bindgen_70df3deb87a6a291 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_70df3deb87a6a291 =
+  BG.fromFFIType hs_bindgen_70df3deb87a6a291_base
+
+{-# NOINLINE sDL_GetNumAudioDrivers #-}
+
+-- | Use this function to get the number of built-in audio drivers.
+--
+--     This function returns a hardcoded number. This never returns a negative value; if there are no drivers compiled into this build of SDL, this function returns zero. The presence of a driver in this list does not mean it will function, it just means SDL is capable of interacting with that interface. For example, a build of SDL might have esound support, but if there\'s no esound server available, SDL\'s esound driver would fail if used.
+--
+--     By default, SDL tries all drivers, in its preferred order, until one is found to be usable.
+--
+--     [Returns]: the number of built-in audio drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioDriver'
+--
+--     [C declaration]: @SDL_GetNumAudioDrivers@, defined at @SDL3\/SDL_audio.h 477:33@
+sDL_GetNumAudioDrivers :: BG.FunPtr (IO BG.CInt)
+sDL_GetNumAudioDrivers =
+  BG.unsafePerformIO hs_bindgen_70df3deb87a6a291
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDriver@
+foreign import ccall unsafe "hs_bindgen_96a59296db34206f"
+  hs_bindgen_96a59296db34206f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDriver@
+hs_bindgen_96a59296db34206f :: IO (BG.FunPtr (BG.CInt -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_96a59296db34206f =
+  BG.fromFFIType hs_bindgen_96a59296db34206f_base
+
+{-# NOINLINE sDL_GetAudioDriver #-}
+
+-- | Use this function to get the name of a built in audio driver.
+--
+--     The list of audio drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"alsa\", \"coreaudio\" or \"wasapi\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [@index@]: the index of the audio driver; the value ranges from 0 to @SDL_GetNumAudioDrivers()@ - 1.
+--
+--     [Returns]: the name of the audio driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumAudioDrivers'
+--
+--     [C declaration]: @SDL_GetAudioDriver@, defined at @SDL3\/SDL_audio.h 501:42@
+sDL_GetAudioDriver :: BG.FunPtr (BG.CInt -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetAudioDriver =
+  BG.unsafePerformIO hs_bindgen_96a59296db34206f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetCurrentAudioDriver@
+foreign import ccall unsafe "hs_bindgen_3b5e65309af7eb52"
+  hs_bindgen_3b5e65309af7eb52_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetCurrentAudioDriver@
+hs_bindgen_3b5e65309af7eb52 :: IO (BG.FunPtr (IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_3b5e65309af7eb52 =
+  BG.fromFFIType hs_bindgen_3b5e65309af7eb52_base
+
+{-# NOINLINE sDL_GetCurrentAudioDriver #-}
+
+-- | Get the name of the current audio driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"alsa\", \"coreaudio\" or \"wasapi\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current audio driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentAudioDriver@, defined at @SDL3\/SDL_audio.h 517:42@
+sDL_GetCurrentAudioDriver :: BG.FunPtr (IO (PtrConst.PtrConst BG.CChar))
+sDL_GetCurrentAudioDriver =
+  BG.unsafePerformIO hs_bindgen_3b5e65309af7eb52
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioPlaybackDevices@
+foreign import ccall unsafe "hs_bindgen_0154df1db50254cb"
+  hs_bindgen_0154df1db50254cb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioPlaybackDevices@
+hs_bindgen_0154df1db50254cb :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_AudioDeviceID)))
+hs_bindgen_0154df1db50254cb =
+  BG.fromFFIType hs_bindgen_0154df1db50254cb_base
+
+{-# NOINLINE sDL_GetAudioPlaybackDevices #-}
+
+-- | Get a list of currently-connected audio playback devices.
+--
+--     This returns of list of available devices that play sound, perhaps to speakers or headphones (\"playback\" devices). If you want devices that record audio, like a microphone (\"recording\" devices), use @SDL_GetAudioRecordingDevices()@ instead.
+--
+--     This only returns a list of physical devices; it will not have any device IDs returned by @SDL_OpenAudioDevice()@.
+--
+--     If this function returns NULL, to signify an error, @*count@ will be set to zero.
+--
+--     [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of device instance IDs or NULL on error; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenAudioDevice', 'sDL_GetAudioRecordingDevices'
+--
+--     [C declaration]: @SDL_GetAudioPlaybackDevices@, defined at @SDL3\/SDL_audio.h 546:49@
+sDL_GetAudioPlaybackDevices :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_AudioDeviceID))
+sDL_GetAudioPlaybackDevices =
+  BG.unsafePerformIO hs_bindgen_0154df1db50254cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioRecordingDevices@
+foreign import ccall unsafe "hs_bindgen_b1e17652d75669ba"
+  hs_bindgen_b1e17652d75669ba_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioRecordingDevices@
+hs_bindgen_b1e17652d75669ba :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_AudioDeviceID)))
+hs_bindgen_b1e17652d75669ba =
+  BG.fromFFIType hs_bindgen_b1e17652d75669ba_base
+
+{-# NOINLINE sDL_GetAudioRecordingDevices #-}
+
+-- | Get a list of currently-connected audio recording devices.
+--
+--     This returns of list of available devices that record audio, like a microphone (\"recording\" devices). If you want devices that play sound, perhaps to speakers or headphones (\"playback\" devices), use @SDL_GetAudioPlaybackDevices()@ instead.
+--
+--     This only returns a list of physical devices; it will not have any device IDs returned by @SDL_OpenAudioDevice()@.
+--
+--     If this function returns NULL, to signify an error, @*count@ will be set to zero.
+--
+--     [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of device instance IDs, or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenAudioDevice', 'sDL_GetAudioPlaybackDevices'
+--
+--     [C declaration]: @SDL_GetAudioRecordingDevices@, defined at @SDL3\/SDL_audio.h 575:49@
+sDL_GetAudioRecordingDevices :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_AudioDeviceID))
+sDL_GetAudioRecordingDevices =
+  BG.unsafePerformIO hs_bindgen_b1e17652d75669ba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceName@
+foreign import ccall unsafe "hs_bindgen_dcc642abb8604857"
+  hs_bindgen_dcc642abb8604857_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceName@
+hs_bindgen_dcc642abb8604857 :: IO (BG.FunPtr (SDL_AudioDeviceID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_dcc642abb8604857 =
+  BG.fromFFIType hs_bindgen_dcc642abb8604857_base
+
+{-# NOINLINE sDL_GetAudioDeviceName #-}
+
+-- | Get the human-readable name of a specific audio device.
+--
+--     __WARNING__: this function will work with SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK and SDL_AUDIO_DEVICE_DEFAULT_RECORDING, returning the current default physical devices\' names. However, as the default device may change at any time, it is likely better to show a generic name to the user, like \"System default audio device\" or perhaps \"default [currently %s]\". Do not store this name to disk to reidentify the device in a later run of the program, as the default might change in general, and the string will be the name of a specific device and not the abstract system default.
+--
+--     [@devid@]: the instance ID of the device to query.
+--
+--     [Returns]: the name of the audio device, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioPlaybackDevices', 'sDL_GetAudioRecordingDevices'
+--
+--     [C declaration]: @SDL_GetAudioDeviceName@, defined at @SDL3\/SDL_audio.h 600:42@
+sDL_GetAudioDeviceName :: BG.FunPtr (SDL_AudioDeviceID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetAudioDeviceName =
+  BG.unsafePerformIO hs_bindgen_dcc642abb8604857
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceFormat@
+foreign import ccall unsafe "hs_bindgen_7ee63106dd01fabe"
+  hs_bindgen_7ee63106dd01fabe_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceFormat@
+hs_bindgen_7ee63106dd01fabe
+  :: IO (BG.FunPtr (SDL_AudioDeviceID -> BG.Ptr SDL_AudioSpec -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_7ee63106dd01fabe =
+  BG.fromFFIType hs_bindgen_7ee63106dd01fabe_base
+
+{-# NOINLINE sDL_GetAudioDeviceFormat #-}
+
+-- | Get the current audio format of a specific audio device.
+--
+--     For an opened device, this will report the format the device is currently using. If the device isn\'t yet opened, this will report the device\'s preferred format (or a reasonable default if this can\'t be determined).
+--
+--     You may also specify SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING here, which is useful for getting a reasonable recommendation before opening the system-recommended default device.
+--
+--     You can also use this to request the current device buffer size. This is specified in sample frames and represents the amount of data SDL will feed to the physical hardware in each chunk. This can be converted to milliseconds of audio with the following equation:
+--
+--     @ms = (int) ((((Sint64) frames) * 1000) \/ spec.freq);@
+--
+--     Buffer size is only important if you need low-level control over the audio playback timing. Most apps do not need this.
+--
+--     [@devid@]: the instance ID of the device to query.
+--
+--     [@spec@]: on return, will be filled with device details.
+--
+--     [@sample_frames@]: pointer to store device buffer size, in sample frames. Can be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAudioDeviceFormat@, defined at @SDL3\/SDL_audio.h 635:34@
+sDL_GetAudioDeviceFormat
+  :: BG.FunPtr (SDL_AudioDeviceID -> BG.Ptr SDL_AudioSpec -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetAudioDeviceFormat =
+  BG.unsafePerformIO hs_bindgen_7ee63106dd01fabe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceChannelMap@
+foreign import ccall unsafe "hs_bindgen_d8865ee45cf3f909"
+  hs_bindgen_d8865ee45cf3f909_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceChannelMap@
+hs_bindgen_d8865ee45cf3f909
+  :: IO (BG.FunPtr (SDL_AudioDeviceID -> BG.Ptr BG.CInt -> IO (BG.Ptr BG.CInt)))
+hs_bindgen_d8865ee45cf3f909 =
+  BG.fromFFIType hs_bindgen_d8865ee45cf3f909_base
+
+{-# NOINLINE sDL_GetAudioDeviceChannelMap #-}
+
+-- | Get the current channel map of an audio device.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     Audio devices usually have no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [@devid@]: the instance ID of the device to query.
+--
+--     [@count@]: On output, set to number of channels in the map. Can be NULL.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_GetAudioDeviceChannelMap@, defined at @SDL3\/SDL_audio.h 658:35@
+sDL_GetAudioDeviceChannelMap
+  :: BG.FunPtr (SDL_AudioDeviceID -> BG.Ptr BG.CInt -> IO (BG.Ptr BG.CInt))
+sDL_GetAudioDeviceChannelMap =
+  BG.unsafePerformIO hs_bindgen_d8865ee45cf3f909
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_OpenAudioDevice@
+foreign import ccall unsafe "hs_bindgen_a61ac8f884503a96"
+  hs_bindgen_a61ac8f884503a96_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_OpenAudioDevice@
+hs_bindgen_a61ac8f884503a96
+  :: IO (BG.FunPtr (SDL_AudioDeviceID -> PtrConst.PtrConst SDL_AudioSpec -> IO SDL_AudioDeviceID))
+hs_bindgen_a61ac8f884503a96 =
+  BG.fromFFIType hs_bindgen_a61ac8f884503a96_base
+
+{-# NOINLINE sDL_OpenAudioDevice #-}
+
+-- | Open a specific audio device.
+--
+--     You can open both playback and recording devices through this function. Playback devices will take data from bound audio streams, mix it, and send it to the hardware. Recording devices will feed any bound audio streams with a copy of any incoming data.
+--
+--     An opened audio device starts out with no audio streams bound. To start audio playing, bind a stream and supply audio data to it. Unlike SDL2, there is no audio callback; you only bind audio streams and make sure they have data flowing into them (however, you can simulate SDL2\'s semantics fairly closely by using SDL_OpenAudioDeviceStream instead of this function).
+--
+--     If you don\'t care about opening a specific device, pass a @devid@ of either @SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK@ or @SDL_AUDIO_DEVICE_DEFAULT_RECORDING@. In this case, SDL will try to pick the most reasonable default, and may also switch between physical devices seamlessly later, if the most reasonable default changes during the lifetime of this opened device (user changed the default in the OS\'s system preferences, the default got unplugged so the system jumped to a new default, the user plugged in headphones on a mobile device, etc). Unless you have a good reason to choose a specific device, this is probably what you want.
+--
+--     You may request a specific format for the audio device, but there is no promise the device will honor that request for several reasons. As such, it\'s only meant to be a hint as to what data your app will provide. Audio streams will accept data in whatever format you specify and manage conversion for you as appropriate. SDL_GetAudioDeviceFormat can tell you the preferred format for the device before opening and the actual format the device is using after opening.
+--
+--     It\'s legal to open the same device ID more than once; each successful open will generate a new logical 'SDL_AudioDeviceID' that is managed separately from others on the same physical device. This allows libraries to open a device separately from the main app and bind its own streams without conflicting.
+--
+--     It is also legal to open a device ID returned by a previous call to this function; doing so just creates another logical device on the same physical device. This may be useful for making logical groupings of audio streams.
+--
+--     This function returns the opened device ID on success. This is a new, unique 'SDL_AudioDeviceID' that represents a logical device.
+--
+--     Some backends might offer arbitrary devices (for example, a networked audio protocol that can connect to an arbitrary server). For these, as a change from SDL2, you should open a default device ID and use an SDL hint to specify the target if you care, or otherwise let the backend figure out a reasonable default. Most backends don\'t offer anything like this, and often this would be an end user setting an environment variable for their custom need, and not something an application should specifically manage.
+--
+--     When done with an audio device, possibly at the end of the app\'s life, one should call @SDL_CloseAudioDevice()@ on the returned device id.
+--
+--     [@devid@]: the device instance id to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING for the most reasonable default device.
+--
+--     [@spec@]: the requested device configuration. Can be NULL to use reasonable defaults.
+--
+--     [Returns]: the device ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseAudioDevice', 'sDL_GetAudioDeviceFormat'
+--
+--     [C declaration]: @SDL_OpenAudioDevice@, defined at @SDL3\/SDL_audio.h 734:47@
+sDL_OpenAudioDevice
+  :: BG.FunPtr (SDL_AudioDeviceID -> PtrConst.PtrConst SDL_AudioSpec -> IO SDL_AudioDeviceID)
+sDL_OpenAudioDevice =
+  BG.unsafePerformIO hs_bindgen_a61ac8f884503a96
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_IsAudioDevicePhysical@
+foreign import ccall unsafe "hs_bindgen_6499cfa703c6758f"
+  hs_bindgen_6499cfa703c6758f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_IsAudioDevicePhysical@
+hs_bindgen_6499cfa703c6758f :: IO (BG.FunPtr (SDL_AudioDeviceID -> IO BG.CBool))
+hs_bindgen_6499cfa703c6758f =
+  BG.fromFFIType hs_bindgen_6499cfa703c6758f_base
+
+{-# NOINLINE sDL_IsAudioDevicePhysical #-}
+
+-- | Determine if an audio device is physical (instead of logical).
+--
+--     An 'SDL_AudioDeviceID' that represents physical hardware is a physical device; there is one for each piece of hardware that SDL can see. Logical devices are created by calling SDL_OpenAudioDevice or SDL_OpenAudioDeviceStream, and while each is associated with a physical device, there can be any number of logical devices on one physical device.
+--
+--     For the most part, logical and physical IDs are interchangeable if you try to open a logical device, SDL understands to assign that effort to the underlying physical device, etc. However, it might be useful to know if an arbitrary device ID is physical or logical. This function reports which.
+--
+--     This function may return either true or false for invalid device IDs.
+--
+--     [@devid@]: the device ID to query.
+--
+--     [Returns]: true if devid is a physical device, false if it is logical.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsAudioDevicePhysical@, defined at @SDL3\/SDL_audio.h 759:34@
+sDL_IsAudioDevicePhysical :: BG.FunPtr (SDL_AudioDeviceID -> IO BG.CBool)
+sDL_IsAudioDevicePhysical =
+  BG.unsafePerformIO hs_bindgen_6499cfa703c6758f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_IsAudioDevicePlayback@
+foreign import ccall unsafe "hs_bindgen_a0086d8f92145768"
+  hs_bindgen_a0086d8f92145768_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_IsAudioDevicePlayback@
+hs_bindgen_a0086d8f92145768 :: IO (BG.FunPtr (SDL_AudioDeviceID -> IO BG.CBool))
+hs_bindgen_a0086d8f92145768 =
+  BG.fromFFIType hs_bindgen_a0086d8f92145768_base
+
+{-# NOINLINE sDL_IsAudioDevicePlayback #-}
+
+-- | Determine if an audio device is a playback device (instead of recording).
+--
+--     This function may return either true or false for invalid device IDs.
+--
+--     [@devid@]: the device ID to query.
+--
+--     [Returns]: true if devid is a playback device, false if it is recording.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsAudioDevicePlayback@, defined at @SDL3\/SDL_audio.h 773:34@
+sDL_IsAudioDevicePlayback :: BG.FunPtr (SDL_AudioDeviceID -> IO BG.CBool)
+sDL_IsAudioDevicePlayback =
+  BG.unsafePerformIO hs_bindgen_a0086d8f92145768
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PauseAudioDevice@
+foreign import ccall unsafe "hs_bindgen_1003717acae7ce8b"
+  hs_bindgen_1003717acae7ce8b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PauseAudioDevice@
+hs_bindgen_1003717acae7ce8b :: IO (BG.FunPtr (SDL_AudioDeviceID -> IO BG.CBool))
+hs_bindgen_1003717acae7ce8b =
+  BG.fromFFIType hs_bindgen_1003717acae7ce8b_base
+
+{-# NOINLINE sDL_PauseAudioDevice #-}
+
+-- | Use this function to pause audio playback on a specified device.
+--
+--     This function pauses audio processing for a given device. Any bound audio streams will not progress, and no audio will be generated. Pausing one device does not prevent other unpaused devices from running.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow. Pausing a paused device is a legal no-op.
+--
+--     Pausing a device can be useful to halt all audio without unbinding all the audio streams. This might be useful while a game is paused, or a level is loading, etc.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @SDL_OpenAudioDevice()@ can be.
+--
+--     [@devid@]: a device opened by @SDL_OpenAudioDevice()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResumeAudioDevice', 'sDL_AudioDevicePaused'
+--
+--     [C declaration]: @SDL_PauseAudioDevice@, defined at @SDL3\/SDL_audio.h 804:34@
+sDL_PauseAudioDevice :: BG.FunPtr (SDL_AudioDeviceID -> IO BG.CBool)
+sDL_PauseAudioDevice =
+  BG.unsafePerformIO hs_bindgen_1003717acae7ce8b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ResumeAudioDevice@
+foreign import ccall unsafe "hs_bindgen_df9a550a09c18c65"
+  hs_bindgen_df9a550a09c18c65_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ResumeAudioDevice@
+hs_bindgen_df9a550a09c18c65 :: IO (BG.FunPtr (SDL_AudioDeviceID -> IO BG.CBool))
+hs_bindgen_df9a550a09c18c65 =
+  BG.fromFFIType hs_bindgen_df9a550a09c18c65_base
+
+{-# NOINLINE sDL_ResumeAudioDevice #-}
+
+-- | Use this function to unpause audio playback on a specified device.
+--
+--     This function unpauses audio processing for a given device that has previously been paused with @SDL_PauseAudioDevice()@. Once unpaused, any bound audio streams will begin to progress again, and audio can be generated.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow. Unpausing an unpaused device is a legal no-op.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @SDL_OpenAudioDevice()@ can be.
+--
+--     [@devid@]: a device opened by @SDL_OpenAudioDevice()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AudioDevicePaused', 'sDL_PauseAudioDevice'
+--
+--     [C declaration]: @SDL_ResumeAudioDevice@, defined at @SDL3\/SDL_audio.h 832:34@
+sDL_ResumeAudioDevice :: BG.FunPtr (SDL_AudioDeviceID -> IO BG.CBool)
+sDL_ResumeAudioDevice =
+  BG.unsafePerformIO hs_bindgen_df9a550a09c18c65
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_AudioDevicePaused@
+foreign import ccall unsafe "hs_bindgen_4580e249e63ded2b"
+  hs_bindgen_4580e249e63ded2b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_AudioDevicePaused@
+hs_bindgen_4580e249e63ded2b :: IO (BG.FunPtr (SDL_AudioDeviceID -> IO BG.CBool))
+hs_bindgen_4580e249e63ded2b =
+  BG.fromFFIType hs_bindgen_4580e249e63ded2b_base
+
+{-# NOINLINE sDL_AudioDevicePaused #-}
+
+-- | Use this function to query if an audio device is paused.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @SDL_OpenAudioDevice()@ can be. Physical and invalid device IDs will report themselves as unpaused here.
+--
+--     [@devid@]: a device opened by @SDL_OpenAudioDevice()@.
+--
+--     [Returns]: true if device is valid and paused, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseAudioDevice', 'sDL_ResumeAudioDevice'
+--
+--     [C declaration]: @SDL_AudioDevicePaused@, defined at @SDL3\/SDL_audio.h 854:34@
+sDL_AudioDevicePaused :: BG.FunPtr (SDL_AudioDeviceID -> IO BG.CBool)
+sDL_AudioDevicePaused =
+  BG.unsafePerformIO hs_bindgen_4580e249e63ded2b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceGain@
+foreign import ccall unsafe "hs_bindgen_6f1b270afdab6bb6"
+  hs_bindgen_6f1b270afdab6bb6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioDeviceGain@
+hs_bindgen_6f1b270afdab6bb6 :: IO (BG.FunPtr (SDL_AudioDeviceID -> IO BG.CFloat))
+hs_bindgen_6f1b270afdab6bb6 =
+  BG.fromFFIType hs_bindgen_6f1b270afdab6bb6_base
+
+{-# NOINLINE sDL_GetAudioDeviceGain #-}
+
+-- | Get the gain of an audio device.
+--
+--     The gain of a device is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio devices default to a gain of 1.0f (no change in output).
+--
+--     Physical devices may not have their gain changed, only logical devices, and this function will always return -1.0f when used on physical devices.
+--
+--     [@devid@]: the audio device to query.
+--
+--     [Returns]: the gain of the device or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioDeviceGain'
+--
+--     [C declaration]: @SDL_GetAudioDeviceGain@, defined at @SDL3\/SDL_audio.h 877:35@
+sDL_GetAudioDeviceGain :: BG.FunPtr (SDL_AudioDeviceID -> IO BG.CFloat)
+sDL_GetAudioDeviceGain =
+  BG.unsafePerformIO hs_bindgen_6f1b270afdab6bb6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioDeviceGain@
+foreign import ccall unsafe "hs_bindgen_aa933d15c7bb8ed3"
+  hs_bindgen_aa933d15c7bb8ed3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioDeviceGain@
+hs_bindgen_aa933d15c7bb8ed3 :: IO (BG.FunPtr (SDL_AudioDeviceID -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_aa933d15c7bb8ed3 =
+  BG.fromFFIType hs_bindgen_aa933d15c7bb8ed3_base
+
+{-# NOINLINE sDL_SetAudioDeviceGain #-}
+
+-- | Change the gain of an audio device.
+--
+--     The gain of a device is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio devices default to a gain of 1.0f (no change in output).
+--
+--     Physical devices may not have their gain changed, only logical devices, and this function will always return false when used on physical devices. While it might seem attractive to adjust several logical devices at once in this way, it would allow an app or library to interfere with another portion of the program\'s otherwise-isolated devices.
+--
+--     This is applied, along with any per-audiostream gain, during playback to the hardware, and can be continuously changed to create various effects. On recording devices, this will adjust the gain before passing the data into an audiostream; that recording audiostream can then adjust its gain further when outputting the data elsewhere, if it likes, but that second gain is not applied until the data leaves the audiostream again.
+--
+--     [@devid@]: the audio device on which to change gain.
+--
+--     [@gain@]: the gain. 1.0f is no change, 0.0f is silence.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioDeviceGain'
+--
+--     [C declaration]: @SDL_SetAudioDeviceGain@, defined at @SDL3\/SDL_audio.h 912:34@
+sDL_SetAudioDeviceGain :: BG.FunPtr (SDL_AudioDeviceID -> BG.CFloat -> IO BG.CBool)
+sDL_SetAudioDeviceGain =
+  BG.unsafePerformIO hs_bindgen_aa933d15c7bb8ed3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_CloseAudioDevice@
+foreign import ccall unsafe "hs_bindgen_b303dd6fccc99188"
+  hs_bindgen_b303dd6fccc99188_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_CloseAudioDevice@
+hs_bindgen_b303dd6fccc99188 :: IO (BG.FunPtr (SDL_AudioDeviceID -> IO ()))
+hs_bindgen_b303dd6fccc99188 =
+  BG.fromFFIType hs_bindgen_b303dd6fccc99188_base
+
+{-# NOINLINE sDL_CloseAudioDevice #-}
+
+-- | Close a previously-opened audio device.
+--
+--     The application should close open audio devices once they are no longer needed.
+--
+--     This function may block briefly while pending audio data is played by the hardware, so that applications don\'t drop the last buffer of data they supplied if terminating immediately afterwards.
+--
+--     [@devid@]: an audio device id previously returned by @SDL_OpenAudioDevice()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenAudioDevice'
+--
+--     [C declaration]: @SDL_CloseAudioDevice@, defined at @SDL3\/SDL_audio.h 933:34@
+sDL_CloseAudioDevice :: BG.FunPtr (SDL_AudioDeviceID -> IO ())
+sDL_CloseAudioDevice =
+  BG.unsafePerformIO hs_bindgen_b303dd6fccc99188
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_BindAudioStreams@
+foreign import ccall unsafe "hs_bindgen_3e9d0d17f11c1de8"
+  hs_bindgen_3e9d0d17f11c1de8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_BindAudioStreams@
+hs_bindgen_3e9d0d17f11c1de8
+  :: IO
+       ( BG.FunPtr
+           (SDL_AudioDeviceID -> PtrConst.PtrConst (BG.Ptr SDL_AudioStream) -> BG.CInt -> IO BG.CBool)
+       )
+hs_bindgen_3e9d0d17f11c1de8 =
+  BG.fromFFIType hs_bindgen_3e9d0d17f11c1de8_base
+
+{-# NOINLINE sDL_BindAudioStreams #-}
+
+-- | Bind a list of audio streams to an audio device.
+--
+--     Audio data will flow through any bound streams. For a playback device, data for all bound streams will be mixed together and fed to the device. For a recording device, a copy of recorded data will be provided to each bound stream.
+--
+--     Audio streams can only be bound to an open device. This operation is atomic all streams bound in the same call will start processing at the same time, so they can stay in sync. Also: either all streams will be bound or none of them will be.
+--
+--     It is an error to bind an already-bound stream; it must be explicitly unbound first.
+--
+--     Binding a stream to a device will set its output format for playback devices, and its input format for recording devices, so they match the device\'s settings. The caller is welcome to change the other end of the stream\'s format at any time with @SDL_SetAudioStreamFormat()@. If the other end of the stream\'s format has never been set (the audio stream was created with a NULL audio spec), this function will set it to match the device end\'s format.
+--
+--     [@devid@]: an audio device to bind a stream to.
+--
+--     [@streams@]: an array of audio streams to bind.
+--
+--     [@num_streams@]: number streams listed in the @streams@ array.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStreams', 'sDL_UnbindAudioStream', 'sDL_GetAudioStreamDevice'
+--
+--     [C declaration]: @SDL_BindAudioStreams@, defined at @SDL3\/SDL_audio.h 973:34@
+sDL_BindAudioStreams
+  :: BG.FunPtr
+       (SDL_AudioDeviceID -> PtrConst.PtrConst (BG.Ptr SDL_AudioStream) -> BG.CInt -> IO BG.CBool)
+sDL_BindAudioStreams =
+  BG.unsafePerformIO hs_bindgen_3e9d0d17f11c1de8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_BindAudioStream@
+foreign import ccall unsafe "hs_bindgen_d6749d59b79ec0ff"
+  hs_bindgen_d6749d59b79ec0ff_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_BindAudioStream@
+hs_bindgen_d6749d59b79ec0ff
+  :: IO (BG.FunPtr (SDL_AudioDeviceID -> BG.Ptr SDL_AudioStream -> IO BG.CBool))
+hs_bindgen_d6749d59b79ec0ff =
+  BG.fromFFIType hs_bindgen_d6749d59b79ec0ff_base
+
+{-# NOINLINE sDL_BindAudioStream #-}
+
+-- | Bind a single audio stream to an audio device.
+--
+--     This is a convenience function, equivalent to calling @'sDL_BindAudioStreams' (devid, &stream, 1)@.
+--
+--     [@devid@]: an audio device to bind a stream to.
+--
+--     [@stream@]: an audio stream to bind to a device.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStreams', 'sDL_UnbindAudioStream', 'sDL_GetAudioStreamDevice'
+--
+--     [C declaration]: @SDL_BindAudioStream@, defined at @SDL3\/SDL_audio.h 994:34@
+sDL_BindAudioStream :: BG.FunPtr (SDL_AudioDeviceID -> BG.Ptr SDL_AudioStream -> IO BG.CBool)
+sDL_BindAudioStream =
+  BG.unsafePerformIO hs_bindgen_d6749d59b79ec0ff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_UnbindAudioStreams@
+foreign import ccall unsafe "hs_bindgen_d96a4f36c25b0021"
+  hs_bindgen_d96a4f36c25b0021_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_UnbindAudioStreams@
+hs_bindgen_d96a4f36c25b0021
+  :: IO (BG.FunPtr (PtrConst.PtrConst (BG.Ptr SDL_AudioStream) -> BG.CInt -> IO ()))
+hs_bindgen_d96a4f36c25b0021 =
+  BG.fromFFIType hs_bindgen_d96a4f36c25b0021_base
+
+{-# NOINLINE sDL_UnbindAudioStreams #-}
+
+-- | Unbind a list of audio streams from their audio devices.
+--
+--     The streams being unbound do not all have to be on the same device. All streams on the same device will be unbound atomically (data will stop flowing through all unbound streams on the same device at the same time).
+--
+--     Unbinding a stream that isn\'t bound to a device is a legal no-op.
+--
+--     [@streams@]: an array of audio streams to unbind. Can be NULL or contain NULL.
+--
+--     [@num_streams@]: number streams listed in the @streams@ array.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStreams'
+--
+--     [C declaration]: @SDL_UnbindAudioStreams@, defined at @SDL3\/SDL_audio.h 1015:34@
+sDL_UnbindAudioStreams :: BG.FunPtr (PtrConst.PtrConst (BG.Ptr SDL_AudioStream) -> BG.CInt -> IO ())
+sDL_UnbindAudioStreams =
+  BG.unsafePerformIO hs_bindgen_d96a4f36c25b0021
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_UnbindAudioStream@
+foreign import ccall unsafe "hs_bindgen_8afc843a61a3bdb8"
+  hs_bindgen_8afc843a61a3bdb8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_UnbindAudioStream@
+hs_bindgen_8afc843a61a3bdb8 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO ()))
+hs_bindgen_8afc843a61a3bdb8 =
+  BG.fromFFIType hs_bindgen_8afc843a61a3bdb8_base
+
+{-# NOINLINE sDL_UnbindAudioStream #-}
+
+-- | Unbind a single audio stream from its audio device.
+--
+--     This is a convenience function, equivalent to calling @'sDL_UnbindAudioStreams' (&stream, 1)@.
+--
+--     [@stream@]: an audio stream to unbind from a device. Can be NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStream'
+--
+--     [C declaration]: @SDL_UnbindAudioStream@, defined at @SDL3\/SDL_audio.h 1031:34@
+sDL_UnbindAudioStream :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO ())
+sDL_UnbindAudioStream =
+  BG.unsafePerformIO hs_bindgen_8afc843a61a3bdb8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamDevice@
+foreign import ccall unsafe "hs_bindgen_218bd50ed6f98e9c"
+  hs_bindgen_218bd50ed6f98e9c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamDevice@
+hs_bindgen_218bd50ed6f98e9c :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO SDL_AudioDeviceID))
+hs_bindgen_218bd50ed6f98e9c =
+  BG.fromFFIType hs_bindgen_218bd50ed6f98e9c_base
+
+{-# NOINLINE sDL_GetAudioStreamDevice #-}
+
+-- | Query an audio stream for its currently-bound device.
+--
+--     This reports the logical audio device that an audio stream is currently bound to.
+--
+--     If not bound, or invalid, this returns zero, which is not a valid device ID.
+--
+--     [@stream@]: the audio stream to query.
+--
+--     [Returns]: the bound audio device, or 0 if not bound or invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStream', 'sDL_BindAudioStreams'
+--
+--     [C declaration]: @SDL_GetAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1052:47@
+sDL_GetAudioStreamDevice :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO SDL_AudioDeviceID)
+sDL_GetAudioStreamDevice =
+  BG.unsafePerformIO hs_bindgen_218bd50ed6f98e9c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_CreateAudioStream@
+foreign import ccall unsafe "hs_bindgen_7305536d807d048c"
+  hs_bindgen_7305536d807d048c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_CreateAudioStream@
+hs_bindgen_7305536d807d048c
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst SDL_AudioSpec -> PtrConst.PtrConst SDL_AudioSpec -> IO (BG.Ptr SDL_AudioStream))
+       )
+hs_bindgen_7305536d807d048c =
+  BG.fromFFIType hs_bindgen_7305536d807d048c_base
+
+{-# NOINLINE sDL_CreateAudioStream #-}
+
+-- | Create a new audio stream.
+--
+--     [@src_spec@]: the format details of the input audio.
+--
+--     [@dst_spec@]: the format details of the output audio.
+--
+--     [Returns]: a new audio stream on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PutAudioStreamData', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamAvailable', 'sDL_FlushAudioStream', 'sDL_ClearAudioStream', 'sDL_SetAudioStreamFormat', 'sDL_DestroyAudioStream'
+--
+--     [C declaration]: @SDL_CreateAudioStream@, defined at @SDL3\/SDL_audio.h 1074:47@
+sDL_CreateAudioStream
+  :: BG.FunPtr
+       (PtrConst.PtrConst SDL_AudioSpec -> PtrConst.PtrConst SDL_AudioSpec -> IO (BG.Ptr SDL_AudioStream))
+sDL_CreateAudioStream =
+  BG.unsafePerformIO hs_bindgen_7305536d807d048c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamProperties@
+foreign import ccall unsafe "hs_bindgen_73d6922c8243e33c"
+  hs_bindgen_73d6922c8243e33c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamProperties@
+hs_bindgen_73d6922c8243e33c
+  :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_73d6922c8243e33c =
+  BG.fromFFIType hs_bindgen_73d6922c8243e33c_base
+
+{-# NOINLINE sDL_GetAudioStreamProperties #-}
+
+-- | Get the properties associated with an audio stream.
+--
+--     The application can hang any data it wants here, but the following properties are understood by SDL:
+--
+--     * @'sDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN'@: if true (the default), the stream be automatically cleaned up when the audio subsystem quits. If set to false, the streams will persist beyond that. This property is ignored for streams created through @SDL_OpenAudioDeviceStream()@, and will always be cleaned up. Streams that are not cleaned up will still be unbound from devices when the audio subsystem quits. This property was added in SDL 3.4.0.
+--
+--     [@stream@]: the 'SDL_AudioStream' to query.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAudioStreamProperties@, defined at @SDL3\/SDL_audio.h 1098:46@
+sDL_GetAudioStreamProperties
+  :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetAudioStreamProperties =
+  BG.unsafePerformIO hs_bindgen_73d6922c8243e33c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamFormat@
+foreign import ccall unsafe "hs_bindgen_eb3398e3b41382ce"
+  hs_bindgen_eb3398e3b41382ce_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamFormat@
+hs_bindgen_eb3398e3b41382ce
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.Ptr SDL_AudioSpec -> BG.Ptr SDL_AudioSpec -> IO BG.CBool))
+hs_bindgen_eb3398e3b41382ce =
+  BG.fromFFIType hs_bindgen_eb3398e3b41382ce_base
+
+{-# NOINLINE sDL_GetAudioStreamFormat #-}
+
+-- | Query the current format of an audio stream.
+--
+--     [@stream@]: the 'SDL_AudioStream' to query.
+--
+--     [@src_spec@]: where to store the input audio format; ignored if NULL.
+--
+--     [@dst_spec@]: where to store the output audio format; ignored if NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamFormat'
+--
+--     [C declaration]: @SDL_GetAudioStreamFormat@, defined at @SDL3\/SDL_audio.h 1119:34@
+sDL_GetAudioStreamFormat
+  :: BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.Ptr SDL_AudioSpec -> BG.Ptr SDL_AudioSpec -> IO BG.CBool)
+sDL_GetAudioStreamFormat =
+  BG.unsafePerformIO hs_bindgen_eb3398e3b41382ce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamFormat@
+foreign import ccall unsafe "hs_bindgen_53ea32f5417e7afe"
+  hs_bindgen_53ea32f5417e7afe_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamFormat@
+hs_bindgen_53ea32f5417e7afe
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_AudioStream
+             -> PtrConst.PtrConst SDL_AudioSpec
+             -> PtrConst.PtrConst SDL_AudioSpec
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_53ea32f5417e7afe =
+  BG.fromFFIType hs_bindgen_53ea32f5417e7afe_base
+
+{-# NOINLINE sDL_SetAudioStreamFormat #-}
+
+-- | Change the input and output formats of an audio stream.
+--
+--     Future calls to and SDL_GetAudioStreamAvailable and SDL_GetAudioStreamData will reflect the new format, and future calls to SDL_PutAudioStreamData must provide data in the new input formats.
+--
+--     Data that was previously queued in the stream will still be operated on in the format that was current when it was added, which is to say you can put the end of a sound file in one format to a stream, change formats for the next sound file, and start putting that new data while the previous sound file is still queued, and everything will still play back correctly.
+--
+--     If a stream is bound to a device, then the format of the side of the stream bound to a device cannot be changed (src_spec for recording devices, dst_spec for playback devices). Attempts to make a change to this side will be ignored, but this will not report an error. The other side\'s format can be changed.
+--
+--     [@stream@]: the stream the format is being changed.
+--
+--     [@src_spec@]: the new format of the audio input; if NULL, it is not changed.
+--
+--     [@dst_spec@]: the new format of the audio output; if NULL, it is not changed.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamFormat', 'sDL_SetAudioStreamFrequencyRatio'
+--
+--     [C declaration]: @SDL_SetAudioStreamFormat@, defined at @SDL3\/SDL_audio.h 1156:34@
+sDL_SetAudioStreamFormat
+  :: BG.FunPtr
+       ( BG.Ptr SDL_AudioStream
+         -> PtrConst.PtrConst SDL_AudioSpec
+         -> PtrConst.PtrConst SDL_AudioSpec
+         -> IO BG.CBool
+       )
+sDL_SetAudioStreamFormat =
+  BG.unsafePerformIO hs_bindgen_53ea32f5417e7afe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamFrequencyRatio@
+foreign import ccall unsafe "hs_bindgen_b61bdb5d542753f6"
+  hs_bindgen_b61bdb5d542753f6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamFrequencyRatio@
+hs_bindgen_b61bdb5d542753f6 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CFloat))
+hs_bindgen_b61bdb5d542753f6 =
+  BG.fromFFIType hs_bindgen_b61bdb5d542753f6_base
+
+{-# NOINLINE sDL_GetAudioStreamFrequencyRatio #-}
+
+-- | Get the frequency ratio of an audio stream.
+--
+--     [@stream@]: the 'SDL_AudioStream' to query.
+--
+--     [Returns]: the frequency ratio of the stream or 0.0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamFrequencyRatio'
+--
+--     [C declaration]: @SDL_GetAudioStreamFrequencyRatio@, defined at @SDL3\/SDL_audio.h 1172:35@
+sDL_GetAudioStreamFrequencyRatio :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CFloat)
+sDL_GetAudioStreamFrequencyRatio =
+  BG.unsafePerformIO hs_bindgen_b61bdb5d542753f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamFrequencyRatio@
+foreign import ccall unsafe "hs_bindgen_ce1524607d0065a9"
+  hs_bindgen_ce1524607d0065a9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamFrequencyRatio@
+hs_bindgen_ce1524607d0065a9 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_ce1524607d0065a9 =
+  BG.fromFFIType hs_bindgen_ce1524607d0065a9_base
+
+{-# NOINLINE sDL_SetAudioStreamFrequencyRatio #-}
+
+-- | Change the frequency ratio of an audio stream.
+--
+--     The frequency ratio is used to adjust the rate at which input data is consumed. Changing this effectively modifies the speed and pitch of the audio. A value greater than 1.0f will play the audio faster, and at a higher pitch. A value less than 1.0f will play the audio slower, and at a lower pitch. 1.0f means play at normal speed.
+--
+--     This is applied during SDL_GetAudioStreamData, and can be continuously changed to create various effects.
+--
+--     [@stream@]: the stream on which the frequency ratio is being changed.
+--
+--     [@ratio@]: the frequency ratio. 1.0 is normal speed. Must be between 0.01 and 100.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamFrequencyRatio', 'sDL_SetAudioStreamFormat'
+--
+--     [C declaration]: @SDL_SetAudioStreamFrequencyRatio@, defined at @SDL3\/SDL_audio.h 1200:34@
+sDL_SetAudioStreamFrequencyRatio :: BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.CFloat -> IO BG.CBool)
+sDL_SetAudioStreamFrequencyRatio =
+  BG.unsafePerformIO hs_bindgen_ce1524607d0065a9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamGain@
+foreign import ccall unsafe "hs_bindgen_a83ce7d2a5163b17"
+  hs_bindgen_a83ce7d2a5163b17_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamGain@
+hs_bindgen_a83ce7d2a5163b17 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CFloat))
+hs_bindgen_a83ce7d2a5163b17 =
+  BG.fromFFIType hs_bindgen_a83ce7d2a5163b17_base
+
+{-# NOINLINE sDL_GetAudioStreamGain #-}
+
+-- | Get the gain of an audio stream.
+--
+--     The gain of a stream is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio streams default to a gain of 1.0f (no change in output).
+--
+--     [@stream@]: the 'SDL_AudioStream' to query.
+--
+--     [Returns]: the gain of the stream or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamGain'
+--
+--     [C declaration]: @SDL_GetAudioStreamGain@, defined at @SDL3\/SDL_audio.h 1221:35@
+sDL_GetAudioStreamGain :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CFloat)
+sDL_GetAudioStreamGain =
+  BG.unsafePerformIO hs_bindgen_a83ce7d2a5163b17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamGain@
+foreign import ccall unsafe "hs_bindgen_79a25e2eef272c3b"
+  hs_bindgen_79a25e2eef272c3b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamGain@
+hs_bindgen_79a25e2eef272c3b :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_79a25e2eef272c3b =
+  BG.fromFFIType hs_bindgen_79a25e2eef272c3b_base
+
+{-# NOINLINE sDL_SetAudioStreamGain #-}
+
+-- | Change the gain of an audio stream.
+--
+--     The gain of a stream is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio streams default to a gain of 1.0f (no change in output).
+--
+--     This is applied during SDL_GetAudioStreamData, and can be continuously changed to create various effects.
+--
+--     [@stream@]: the stream on which the gain is being changed.
+--
+--     [@gain@]: the gain. 1.0f is no change, 0.0f is silence.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamGain'
+--
+--     [C declaration]: @SDL_SetAudioStreamGain@, defined at @SDL3\/SDL_audio.h 1246:34@
+sDL_SetAudioStreamGain :: BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.CFloat -> IO BG.CBool)
+sDL_SetAudioStreamGain =
+  BG.unsafePerformIO hs_bindgen_79a25e2eef272c3b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamInputChannelMap@
+foreign import ccall unsafe "hs_bindgen_8335e23836f4112d"
+  hs_bindgen_8335e23836f4112d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamInputChannelMap@
+hs_bindgen_8335e23836f4112d
+  :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.Ptr BG.CInt -> IO (BG.Ptr BG.CInt)))
+hs_bindgen_8335e23836f4112d =
+  BG.fromFFIType hs_bindgen_8335e23836f4112d_base
+
+{-# NOINLINE sDL_GetAudioStreamInputChannelMap #-}
+
+-- | Get the current input channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     Audio streams default to no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [@stream@]: the 'SDL_AudioStream' to query.
+--
+--     [@count@]: On output, set to number of channels in the map. Can be NULL.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_GetAudioStreamInputChannelMap@, defined at @SDL3\/SDL_audio.h 1270:35@
+sDL_GetAudioStreamInputChannelMap
+  :: BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.Ptr BG.CInt -> IO (BG.Ptr BG.CInt))
+sDL_GetAudioStreamInputChannelMap =
+  BG.unsafePerformIO hs_bindgen_8335e23836f4112d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamOutputChannelMap@
+foreign import ccall unsafe "hs_bindgen_fa8ad3c08cbd6973"
+  hs_bindgen_fa8ad3c08cbd6973_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamOutputChannelMap@
+hs_bindgen_fa8ad3c08cbd6973
+  :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.Ptr BG.CInt -> IO (BG.Ptr BG.CInt)))
+hs_bindgen_fa8ad3c08cbd6973 =
+  BG.fromFFIType hs_bindgen_fa8ad3c08cbd6973_base
+
+{-# NOINLINE sDL_GetAudioStreamOutputChannelMap #-}
+
+-- | Get the current output channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     Audio streams default to no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [@stream@]: the 'SDL_AudioStream' to query.
+--
+--     [@count@]: On output, set to number of channels in the map. Can be NULL.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_GetAudioStreamOutputChannelMap@, defined at @SDL3\/SDL_audio.h 1294:35@
+sDL_GetAudioStreamOutputChannelMap
+  :: BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.Ptr BG.CInt -> IO (BG.Ptr BG.CInt))
+sDL_GetAudioStreamOutputChannelMap =
+  BG.unsafePerformIO hs_bindgen_fa8ad3c08cbd6973
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamInputChannelMap@
+foreign import ccall unsafe "hs_bindgen_779c5c09495318d9"
+  hs_bindgen_779c5c09495318d9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamInputChannelMap@
+hs_bindgen_779c5c09495318d9
+  :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> PtrConst.PtrConst BG.CInt -> BG.CInt -> IO BG.CBool))
+hs_bindgen_779c5c09495318d9 =
+  BG.fromFFIType hs_bindgen_779c5c09495318d9_base
+
+{-# NOINLINE sDL_SetAudioStreamInputChannelMap #-}
+
+-- | Set the current input channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     The input channel map reorders data that is added to a stream via SDL_PutAudioStreamData. Future calls to SDL_PutAudioStreamData must provide data in the new channel order.
+--
+--     Each item in the array represents an input channel, and its value is the channel that it should be remapped to. To reverse a stereo signal\'s left and right values, you\'d have an array of @{ 1, 0 }@. It is legal to remap multiple channels to the same thing, so @{ 1, 1 }@ would duplicate the right channel to both channels of a stereo signal. An element in the channel map set to -1 instead of a valid channel will mute that channel, setting it to a silence value.
+--
+--     You cannot change the number of channels through a channel map, just reorder\/mute them.
+--
+--     Data that was previously queued in the stream will still be operated on in the order that was current when it was added, which is to say you can put the end of a sound file in one order to a stream, change orders for the next sound file, and start putting that new data while the previous sound file is still queued, and everything will still play back correctly.
+--
+--     Audio streams default to no remapping applied. Passing a NULL channel map is legal, and turns off remapping.
+--
+--     SDL will copy the channel map; the caller does not have to save this array after this call.
+--
+--     If @count@ is not equal to the current number of channels in the audio stream\'s format, this will fail. This is a safety measure to make sure a race condition hasn\'t changed the format while this call is setting the channel map.
+--
+--     Unlike attempting to change the stream\'s format, the input channel map on a stream bound to a recording device is permitted to change at any time; any data added to the stream from the device after this call will have the new mapping, but previously-added data will still have the prior mapping.
+--
+--     [@stream@]: the 'SDL_AudioStream' to change.
+--
+--     [@chmap@]: the new channel map, NULL to reset to default.
+--
+--     [@count@]: The number of channels in the map.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running. Don\'t change the stream\'s format to have a different number of channels from a different thread at the same time, though!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_SetAudioStreamInputChannelMap@, defined at @SDL3\/SDL_audio.h 1354:34@
+sDL_SetAudioStreamInputChannelMap
+  :: BG.FunPtr (BG.Ptr SDL_AudioStream -> PtrConst.PtrConst BG.CInt -> BG.CInt -> IO BG.CBool)
+sDL_SetAudioStreamInputChannelMap =
+  BG.unsafePerformIO hs_bindgen_779c5c09495318d9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamOutputChannelMap@
+foreign import ccall unsafe "hs_bindgen_aea000b7665d902d"
+  hs_bindgen_aea000b7665d902d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamOutputChannelMap@
+hs_bindgen_aea000b7665d902d
+  :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> PtrConst.PtrConst BG.CInt -> BG.CInt -> IO BG.CBool))
+hs_bindgen_aea000b7665d902d =
+  BG.fromFFIType hs_bindgen_aea000b7665d902d_base
+
+{-# NOINLINE sDL_SetAudioStreamOutputChannelMap #-}
+
+-- | Set the current output channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     The output channel map reorders data that is leaving a stream via SDL_GetAudioStreamData.
+--
+--     Each item in the array represents an input channel, and its value is the channel that it should be remapped to. To reverse a stereo signal\'s left and right values, you\'d have an array of @{ 1, 0 }@. It is legal to remap multiple channels to the same thing, so @{ 1, 1 }@ would duplicate the right channel to both channels of a stereo signal. An element in the channel map set to -1 instead of a valid channel will mute that channel, setting it to a silence value.
+--
+--     You cannot change the number of channels through a channel map, just reorder\/mute them.
+--
+--     The output channel map can be changed at any time, as output remapping is applied during SDL_GetAudioStreamData.
+--
+--     Audio streams default to no remapping applied. Passing a NULL channel map is legal, and turns off remapping.
+--
+--     SDL will copy the channel map; the caller does not have to save this array after this call.
+--
+--     If @count@ is not equal to the current number of channels in the audio stream\'s format, this will fail. This is a safety measure to make sure a race condition hasn\'t changed the format while this call is setting the channel map.
+--
+--     Unlike attempting to change the stream\'s format, the output channel map on a stream bound to a recording device is permitted to change at any time; any data added to the stream after this call will have the new mapping, but previously-added data will still have the prior mapping. When the channel map doesn\'t match the hardware\'s channel layout, SDL will convert the data before feeding it to the device for playback.
+--
+--     [@stream@]: the 'SDL_AudioStream' to change.
+--
+--     [@chmap@]: the new channel map, NULL to reset to default.
+--
+--     [@count@]: The number of channels in the map.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running. Don\'t change the stream\'s format to have a different number of channels from a a different thread at the same time, though!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_SetAudioStreamOutputChannelMap@, defined at @SDL3\/SDL_audio.h 1412:34@
+sDL_SetAudioStreamOutputChannelMap
+  :: BG.FunPtr (BG.Ptr SDL_AudioStream -> PtrConst.PtrConst BG.CInt -> BG.CInt -> IO BG.CBool)
+sDL_SetAudioStreamOutputChannelMap =
+  BG.unsafePerformIO hs_bindgen_aea000b7665d902d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PutAudioStreamData@
+foreign import ccall unsafe "hs_bindgen_958cb85cef653993"
+  hs_bindgen_958cb85cef653993_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PutAudioStreamData@
+hs_bindgen_958cb85cef653993
+  :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO BG.CBool))
+hs_bindgen_958cb85cef653993 =
+  BG.fromFFIType hs_bindgen_958cb85cef653993_base
+
+{-# NOINLINE sDL_PutAudioStreamData #-}
+
+-- | Add data to the stream.
+--
+--     This data must match the format\/channels\/samplerate specified in the latest call to SDL_SetAudioStreamFormat, or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     Note that this call simply copies the unconverted data for later. This is different than SDL2, where data was converted during the Put call and the Get call would just dequeue the previously-converted data.
+--
+--     [@stream@]: the stream the audio data is being added to.
+--
+--     [@buf@]: a pointer to the audio data to add.
+--
+--     [@len@]: the number of bytes to write to the stream.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_FlushAudioStream', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued'
+--
+--     [C declaration]: @SDL_PutAudioStreamData@, defined at @SDL3\/SDL_audio.h 1442:34@
+sDL_PutAudioStreamData
+  :: BG.FunPtr (BG.Ptr SDL_AudioStream -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO BG.CBool)
+sDL_PutAudioStreamData =
+  BG.unsafePerformIO hs_bindgen_958cb85cef653993
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PutAudioStreamDataNoCopy@
+foreign import ccall unsafe "hs_bindgen_29041de46ea3d0a6"
+  hs_bindgen_29041de46ea3d0a6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PutAudioStreamDataNoCopy@
+hs_bindgen_29041de46ea3d0a6
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_AudioStream
+             -> PtrConst.PtrConst BG.Void
+             -> BG.CInt
+             -> SDL_AudioStreamDataCompleteCallback
+             -> BG.Ptr BG.Void
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_29041de46ea3d0a6 =
+  BG.fromFFIType hs_bindgen_29041de46ea3d0a6_base
+
+{-# NOINLINE sDL_PutAudioStreamDataNoCopy #-}
+
+-- | Add external data to an audio stream without copying it.
+--
+--     Unlike @SDL_PutAudioStreamData()@, this function does not make a copy of the provided data, instead storing the provided pointer. This means that the put operation does not need to allocate and copy the data, but the original data must remain available until the stream is done with it, either by being read from the stream in its entirety, or a call to @SDL_ClearAudioStream()@ or @SDL_DestroyAudioStream()@.
+--
+--     The data must match the format\/channels\/samplerate specified in the latest call to SDL_SetAudioStreamFormat, or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     An optional callback may be provided, which is called when the stream no longer needs the data. Once this callback fires, the stream will not access the data again. This callback will fire for any reason the data is no longer needed, including clearing or destroying the stream.
+--
+--     Note that there is still an allocation to store tracking information, so this function is more efficient for larger blocks of data. If you\'re planning to put a few samples at a time, it will be more efficient to use @SDL_PutAudioStreamData()@, which allocates and buffers in blocks.
+--
+--     [@stream@]: the stream the audio data is being added to.
+--
+--     [@buf@]: a pointer to the audio data to add.
+--
+--     [@len@]: the number of bytes to add to the stream.
+--
+--     [@callback@]: the callback function to call when the data is no longer needed by the stream. May be NULL.
+--
+--     [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_FlushAudioStream', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued'
+--
+--     [C declaration]: @SDL_PutAudioStreamDataNoCopy@, defined at @SDL3\/SDL_audio.h 1519:34@
+sDL_PutAudioStreamDataNoCopy
+  :: BG.FunPtr
+       ( BG.Ptr SDL_AudioStream
+         -> PtrConst.PtrConst BG.Void
+         -> BG.CInt
+         -> SDL_AudioStreamDataCompleteCallback
+         -> BG.Ptr BG.Void
+         -> IO BG.CBool
+       )
+sDL_PutAudioStreamDataNoCopy =
+  BG.unsafePerformIO hs_bindgen_29041de46ea3d0a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PutAudioStreamPlanarData@
+foreign import ccall unsafe "hs_bindgen_8d42e0e8a50f7193"
+  hs_bindgen_8d42e0e8a50f7193_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PutAudioStreamPlanarData@
+hs_bindgen_8d42e0e8a50f7193
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_AudioStream
+             -> PtrConst.PtrConst (PtrConst.PtrConst BG.Void)
+             -> BG.CInt
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_8d42e0e8a50f7193 =
+  BG.fromFFIType hs_bindgen_8d42e0e8a50f7193_base
+
+{-# NOINLINE sDL_PutAudioStreamPlanarData #-}
+
+-- | Add data to the stream with each channel in a separate array.
+--
+--     This data must match the format\/channels\/samplerate specified in the latest call to SDL_SetAudioStreamFormat, or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     The data will be interleaved and queued. Note that 'SDL_AudioStream' only operates on interleaved data, so this is simply a convenience function for easily queueing data from sources that provide separate arrays. There is no equivalent function to retrieve planar data.
+--
+--     The arrays in @channel_buffers@ are ordered as they are to be interleaved; the first array will be the first sample in the interleaved data. Any individual array may be NULL; in this case, silence will be interleaved for that channel.
+--
+--     @num_channels@ specifies how many arrays are in @channel_buffers@. This can be used as a safety to prevent overflow, in case the stream format has changed elsewhere. If more channels are specified than the current input spec, they are ignored. If less channels are specified, the missing arrays are treated as if they are NULL (silence is written to those channels). If the count is -1, SDL will assume the array count matches the current input spec.
+--
+--     Note that @num_samples@ is the number of /samples per array/. This can also be thought of as the number of /sample frames/ to be queued. A value of 1 with stereo arrays will queue two samples to the stream. This is different than SDL_PutAudioStreamData, which wants the size of a single array in bytes.
+--
+--     [@stream@]: the stream the audio data is being added to.
+--
+--     [@channel_buffers@]: a pointer to an array of arrays, one array per channel.
+--
+--     [@num_channels@]: the number of arrays in @channel_buffers@ or -1.
+--
+--     [@num_samples@]: the number of /samples/ per array to write to the stream.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_FlushAudioStream', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued'
+--
+--     [C declaration]: @SDL_PutAudioStreamPlanarData@, defined at @SDL3\/SDL_audio.h 1572:34@
+sDL_PutAudioStreamPlanarData
+  :: BG.FunPtr
+       ( BG.Ptr SDL_AudioStream
+         -> PtrConst.PtrConst (PtrConst.PtrConst BG.Void)
+         -> BG.CInt
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_PutAudioStreamPlanarData =
+  BG.unsafePerformIO hs_bindgen_8d42e0e8a50f7193
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamData@
+foreign import ccall unsafe "hs_bindgen_c52b30082bdb58cd"
+  hs_bindgen_c52b30082bdb58cd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamData@
+hs_bindgen_c52b30082bdb58cd
+  :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.Ptr BG.Void -> BG.CInt -> IO BG.CInt))
+hs_bindgen_c52b30082bdb58cd =
+  BG.fromFFIType hs_bindgen_c52b30082bdb58cd_base
+
+{-# NOINLINE sDL_GetAudioStreamData #-}
+
+-- | Get converted\/resampled data from the stream.
+--
+--     The input\/output data format\/channels\/samplerate is specified when creating the stream, and can be changed after creation by calling SDL_SetAudioStreamFormat.
+--
+--     Note that any conversion and resampling necessary is done during this call, and SDL_PutAudioStreamData simply queues unconverted data for later. This is different than SDL2, where that work was done while inputting new data to the stream and requesting the output just copied the converted data.
+--
+--     [@stream@]: the stream the audio is being requested from.
+--
+--     [@buf@]: a buffer to fill with audio data.
+--
+--     [@len@]: the maximum number of bytes to fill.
+--
+--     [Returns]: the number of bytes read from the stream or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_GetAudioStreamAvailable', 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_GetAudioStreamData@, defined at @SDL3\/SDL_audio.h 1602:33@
+sDL_GetAudioStreamData
+  :: BG.FunPtr (BG.Ptr SDL_AudioStream -> BG.Ptr BG.Void -> BG.CInt -> IO BG.CInt)
+sDL_GetAudioStreamData =
+  BG.unsafePerformIO hs_bindgen_c52b30082bdb58cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamAvailable@
+foreign import ccall unsafe "hs_bindgen_887ee267fde7c9f0"
+  hs_bindgen_887ee267fde7c9f0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamAvailable@
+hs_bindgen_887ee267fde7c9f0 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CInt))
+hs_bindgen_887ee267fde7c9f0 =
+  BG.fromFFIType hs_bindgen_887ee267fde7c9f0_base
+
+{-# NOINLINE sDL_GetAudioStreamAvailable #-}
+
+-- | Get the number of converted\/resampled bytes available.
+--
+--     The stream may be buffering data behind the scenes until it has enough to resample correctly, so this number might be lower than what you expect, or even be zero. Add more data or flush the stream if you need the data now.
+--
+--     If the stream has so much data that it would overflow an int, the return value is clamped to a maximum value, but no queued data is lost; if there are gigabytes of data queued, the app might need to read some of it with SDL_GetAudioStreamData before this function\'s return value is no longer clamped.
+--
+--     [@stream@]: the audio stream to query.
+--
+--     [Returns]: the number of converted\/resampled bytes available or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamData', 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_GetAudioStreamAvailable@, defined at @SDL3\/SDL_audio.h 1628:33@
+sDL_GetAudioStreamAvailable :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CInt)
+sDL_GetAudioStreamAvailable =
+  BG.unsafePerformIO hs_bindgen_887ee267fde7c9f0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamQueued@
+foreign import ccall unsafe "hs_bindgen_30f43c9a9503bb9c"
+  hs_bindgen_30f43c9a9503bb9c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioStreamQueued@
+hs_bindgen_30f43c9a9503bb9c :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CInt))
+hs_bindgen_30f43c9a9503bb9c =
+  BG.fromFFIType hs_bindgen_30f43c9a9503bb9c_base
+
+{-# NOINLINE sDL_GetAudioStreamQueued #-}
+
+-- | Get the number of bytes currently queued.
+--
+--     This is the number of bytes put into a stream as input, not the number that can be retrieved as output. Because of several details, it\'s not possible to calculate one number directly from the other. If you need to know how much usable data can be retrieved right now, you should use @SDL_GetAudioStreamAvailable()@ and not this function.
+--
+--     Note that audio streams can change their input format at any time, even if there is still data queued in a different format, so the returned byte count will not necessarily match the number of /sample frames/ available. Users of this API should be aware of format changes they make when feeding a stream and plan accordingly.
+--
+--     Queued data is not converted until it is consumed by SDL_GetAudioStreamData, so this value should be representative of the exact data that was put into the stream.
+--
+--     If the stream has so much data that it would overflow an int, the return value is clamped to a maximum value, but no queued data is lost; if there are gigabytes of data queued, the app might need to read some of it with SDL_GetAudioStreamData before this function\'s return value is no longer clamped.
+--
+--     [@stream@]: the audio stream to query.
+--
+--     [Returns]: the number of bytes queued or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PutAudioStreamData', 'sDL_ClearAudioStream'
+--
+--     [C declaration]: @SDL_GetAudioStreamQueued@, defined at @SDL3\/SDL_audio.h 1667:33@
+sDL_GetAudioStreamQueued :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CInt)
+sDL_GetAudioStreamQueued =
+  BG.unsafePerformIO hs_bindgen_30f43c9a9503bb9c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_FlushAudioStream@
+foreign import ccall unsafe "hs_bindgen_b5a765a41b34efed"
+  hs_bindgen_b5a765a41b34efed_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_FlushAudioStream@
+hs_bindgen_b5a765a41b34efed :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool))
+hs_bindgen_b5a765a41b34efed =
+  BG.fromFFIType hs_bindgen_b5a765a41b34efed_base
+
+{-# NOINLINE sDL_FlushAudioStream #-}
+
+-- | Tell the stream that you\'re done sending data, and anything being buffered should be converted\/resampled and made available immediately.
+--
+--     It is legal to add more data to a stream after flushing, but there may be audio gaps in the output. Generally this is intended to signal the end of input, so the complete output becomes available.
+--
+--     [@stream@]: the audio stream to flush.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_FlushAudioStream@, defined at @SDL3\/SDL_audio.h 1688:34@
+sDL_FlushAudioStream :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool)
+sDL_FlushAudioStream =
+  BG.unsafePerformIO hs_bindgen_b5a765a41b34efed
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ClearAudioStream@
+foreign import ccall unsafe "hs_bindgen_66aa75f68cad1a60"
+  hs_bindgen_66aa75f68cad1a60_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ClearAudioStream@
+hs_bindgen_66aa75f68cad1a60 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool))
+hs_bindgen_66aa75f68cad1a60 =
+  BG.fromFFIType hs_bindgen_66aa75f68cad1a60_base
+
+{-# NOINLINE sDL_ClearAudioStream #-}
+
+-- | Clear any pending data in the stream.
+--
+--     This drops any queued data, so there will be nothing to read from the stream until more is added.
+--
+--     [@stream@]: the audio stream to clear.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamAvailable', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued', 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_ClearAudioStream@, defined at @SDL3\/SDL_audio.h 1709:34@
+sDL_ClearAudioStream :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool)
+sDL_ClearAudioStream =
+  BG.unsafePerformIO hs_bindgen_66aa75f68cad1a60
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PauseAudioStreamDevice@
+foreign import ccall unsafe "hs_bindgen_65bad5f751085af2"
+  hs_bindgen_65bad5f751085af2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_PauseAudioStreamDevice@
+hs_bindgen_65bad5f751085af2 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool))
+hs_bindgen_65bad5f751085af2 =
+  BG.fromFFIType hs_bindgen_65bad5f751085af2_base
+
+{-# NOINLINE sDL_PauseAudioStreamDevice #-}
+
+-- | Use this function to pause audio playback on the audio device associated with an audio stream.
+--
+--     This function pauses audio processing for a given device. Any bound audio streams will not progress, and no audio will be generated. Pausing one device does not prevent other unpaused devices from running.
+--
+--     Pausing a device can be useful to halt all audio without unbinding all the audio streams. This might be useful while a game is paused, or a level is loading, etc.
+--
+--     [@stream@]: the audio stream associated with the audio device to pause.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResumeAudioStreamDevice'
+--
+--     [C declaration]: @SDL_PauseAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1733:34@
+sDL_PauseAudioStreamDevice :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool)
+sDL_PauseAudioStreamDevice =
+  BG.unsafePerformIO hs_bindgen_65bad5f751085af2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ResumeAudioStreamDevice@
+foreign import ccall unsafe "hs_bindgen_3422451103f73d83"
+  hs_bindgen_3422451103f73d83_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ResumeAudioStreamDevice@
+hs_bindgen_3422451103f73d83 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool))
+hs_bindgen_3422451103f73d83 =
+  BG.fromFFIType hs_bindgen_3422451103f73d83_base
+
+{-# NOINLINE sDL_ResumeAudioStreamDevice #-}
+
+-- | Use this function to unpause audio playback on the audio device associated with an audio stream.
+--
+--     This function unpauses audio processing for a given device that has previously been paused. Once unpaused, any bound audio streams will begin to progress again, and audio can be generated.
+--
+--     SDL_OpenAudioDeviceStream opens audio devices in a paused state, so this function call is required for audio playback to begin on such devices.
+--
+--     [@stream@]: the audio stream associated with the audio device to resume.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseAudioStreamDevice'
+--
+--     [C declaration]: @SDL_ResumeAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1756:34@
+sDL_ResumeAudioStreamDevice :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool)
+sDL_ResumeAudioStreamDevice =
+  BG.unsafePerformIO hs_bindgen_3422451103f73d83
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_AudioStreamDevicePaused@
+foreign import ccall unsafe "hs_bindgen_3e6ce96a7f944949"
+  hs_bindgen_3e6ce96a7f944949_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_AudioStreamDevicePaused@
+hs_bindgen_3e6ce96a7f944949 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool))
+hs_bindgen_3e6ce96a7f944949 =
+  BG.fromFFIType hs_bindgen_3e6ce96a7f944949_base
+
+{-# NOINLINE sDL_AudioStreamDevicePaused #-}
+
+-- | Use this function to query if an audio device associated with a stream is paused.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow.
+--
+--     [@stream@]: the audio stream associated with the audio device to query.
+--
+--     [Returns]: true if device is valid and paused, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseAudioStreamDevice', 'sDL_ResumeAudioStreamDevice'
+--
+--     [C declaration]: @SDL_AudioStreamDevicePaused@, defined at @SDL3\/SDL_audio.h 1775:34@
+sDL_AudioStreamDevicePaused :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool)
+sDL_AudioStreamDevicePaused =
+  BG.unsafePerformIO hs_bindgen_3e6ce96a7f944949
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_LockAudioStream@
+foreign import ccall unsafe "hs_bindgen_0d7bbaa2282f61af"
+  hs_bindgen_0d7bbaa2282f61af_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_LockAudioStream@
+hs_bindgen_0d7bbaa2282f61af :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool))
+hs_bindgen_0d7bbaa2282f61af =
+  BG.fromFFIType hs_bindgen_0d7bbaa2282f61af_base
+
+{-# NOINLINE sDL_LockAudioStream #-}
+
+-- | Lock an audio stream for serialized access.
+--
+--     Each 'SDL_AudioStream' has an internal mutex it uses to protect its data structures from threading conflicts. This function allows an app to lock that mutex, which could be useful if registering callbacks on this stream.
+--
+--     One does not need to lock a stream to use in it most cases, as the stream manages this lock internally. However, this lock is held during callbacks, which may run from arbitrary threads at any time, so if an app needs to protect shared data during those callbacks, locking the stream guarantees that the callback is not running while the lock is held.
+--
+--     As this is just a wrapper over SDL_LockMutex for an internal lock; it has all the same attributes (recursive locks are allowed, etc).
+--
+--     [@stream@]: the audio stream to lock.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UnlockAudioStream'
+--
+--     [C declaration]: @SDL_LockAudioStream@, defined at @SDL3\/SDL_audio.h 1804:34@
+sDL_LockAudioStream :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool)
+sDL_LockAudioStream =
+  BG.unsafePerformIO hs_bindgen_0d7bbaa2282f61af
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_UnlockAudioStream@
+foreign import ccall unsafe "hs_bindgen_01197b6703408060"
+  hs_bindgen_01197b6703408060_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_UnlockAudioStream@
+hs_bindgen_01197b6703408060 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool))
+hs_bindgen_01197b6703408060 =
+  BG.fromFFIType hs_bindgen_01197b6703408060_base
+
+{-# NOINLINE sDL_UnlockAudioStream #-}
+
+-- | Unlock an audio stream for serialized access.
+--
+--     This unlocks an audio stream after a call to SDL_LockAudioStream.
+--
+--     [@stream@]: the audio stream to unlock.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: You should only call this from the same thread that previously called SDL_LockAudioStream.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockAudioStream'
+--
+--     [C declaration]: @SDL_UnlockAudioStream@, defined at @SDL3\/SDL_audio.h 1823:34@
+sDL_UnlockAudioStream :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO BG.CBool)
+sDL_UnlockAudioStream =
+  BG.unsafePerformIO hs_bindgen_01197b6703408060
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamGetCallback@
+foreign import ccall unsafe "hs_bindgen_c3613cf8e8649c19"
+  hs_bindgen_c3613cf8e8649c19_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamGetCallback@
+hs_bindgen_c3613cf8e8649c19
+  :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> SDL_AudioStreamCallback -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_c3613cf8e8649c19 =
+  BG.fromFFIType hs_bindgen_c3613cf8e8649c19_base
+
+{-# NOINLINE sDL_SetAudioStreamGetCallback #-}
+
+-- | Set a callback that runs when data is requested from an audio stream.
+--
+--     This callback is called /before/ data is obtained from the stream, giving the callback the chance to add more on-demand.
+--
+--     The callback can (optionally) call @SDL_PutAudioStreamData()@ to add more audio to the stream during this call; if needed, the request that triggered this callback will obtain the new data immediately.
+--
+--     The callback\'s @additional_amount@ argument is roughly how many bytes of /unconverted/ data (in the stream\'s input format) is needed by the caller, although this may overestimate a little for safety. This takes into account how much is already in the stream and only asks for any extra necessary to resolve the request, which means the callback may be asked for zero bytes, and a different amount on each call.
+--
+--     The callback is not required to supply exact amounts; it is allowed to supply too much or too little or none at all. The caller will get what\'s available, up to the amount they requested, regardless of this callback\'s outcome.
+--
+--     Clearing or flushing an audio stream does not call this callback.
+--
+--     This function obtains the stream\'s lock, which means any existing callback (get or put) in progress will finish running before setting the new callback.
+--
+--     Setting a NULL function turns off the callback.
+--
+--     [@stream@]: the audio stream to set the new callback on.
+--
+--     [@callback@]: the new callback function to call when data is requested from the stream.
+--
+--     [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information. This only fails if @stream@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamPutCallback'
+--
+--     [C declaration]: @SDL_SetAudioStreamGetCallback@, defined at @SDL3\/SDL_audio.h 1911:34@
+sDL_SetAudioStreamGetCallback
+  :: BG.FunPtr (BG.Ptr SDL_AudioStream -> SDL_AudioStreamCallback -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_SetAudioStreamGetCallback =
+  BG.unsafePerformIO hs_bindgen_c3613cf8e8649c19
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamPutCallback@
+foreign import ccall unsafe "hs_bindgen_94194526836dd7bc"
+  hs_bindgen_94194526836dd7bc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioStreamPutCallback@
+hs_bindgen_94194526836dd7bc
+  :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> SDL_AudioStreamCallback -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_94194526836dd7bc =
+  BG.fromFFIType hs_bindgen_94194526836dd7bc_base
+
+{-# NOINLINE sDL_SetAudioStreamPutCallback #-}
+
+-- | Set a callback that runs when data is added to an audio stream.
+--
+--     This callback is called /after/ the data is added to the stream, giving the callback the chance to obtain it immediately.
+--
+--     The callback can (optionally) call @SDL_GetAudioStreamData()@ to obtain audio from the stream during this call.
+--
+--     The callback\'s @additional_amount@ argument is how many bytes of /converted/ data (in the stream\'s output format) was provided by the caller, although this may underestimate a little for safety. This value might be less than what is currently available in the stream, if data was already there, and might be less than the caller provided if the stream needs to keep a buffer to aid in resampling. Which means the callback may be provided with zero bytes, and a different amount on each call.
+--
+--     The callback may call SDL_GetAudioStreamAvailable to see the total amount currently available to read from the stream, instead of the total provided by the current call.
+--
+--     The callback is not required to obtain all data. It is allowed to read less or none at all. Anything not read now simply remains in the stream for later access.
+--
+--     Clearing or flushing an audio stream does not call this callback.
+--
+--     This function obtains the stream\'s lock, which means any existing callback (get or put) in progress will finish running before setting the new callback.
+--
+--     Setting a NULL function turns off the callback.
+--
+--     [@stream@]: the audio stream to set the new callback on.
+--
+--     [@callback@]: the new callback function to call when data is added to the stream.
+--
+--     [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information. This only fails if @stream@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamGetCallback'
+--
+--     [C declaration]: @SDL_SetAudioStreamPutCallback@, defined at @SDL3\/SDL_audio.h 1960:34@
+sDL_SetAudioStreamPutCallback
+  :: BG.FunPtr (BG.Ptr SDL_AudioStream -> SDL_AudioStreamCallback -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_SetAudioStreamPutCallback =
+  BG.unsafePerformIO hs_bindgen_94194526836dd7bc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_DestroyAudioStream@
+foreign import ccall unsafe "hs_bindgen_8414956b9aa941e0"
+  hs_bindgen_8414956b9aa941e0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_DestroyAudioStream@
+hs_bindgen_8414956b9aa941e0 :: IO (BG.FunPtr (BG.Ptr SDL_AudioStream -> IO ()))
+hs_bindgen_8414956b9aa941e0 =
+  BG.fromFFIType hs_bindgen_8414956b9aa941e0_base
+
+{-# NOINLINE sDL_DestroyAudioStream #-}
+
+-- | Free an audio stream.
+--
+--     This will release all allocated data, including any audio that is still queued. You do not need to manually clear the stream first.
+--
+--     If this stream was bound to an audio device, it is unbound during this call. If this stream was created with SDL_OpenAudioDeviceStream, the audio device that was opened alongside this stream\'s creation will be closed, too.
+--
+--     [@stream@]: the audio stream to destroy.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAudioStream'
+--
+--     [C declaration]: @SDL_DestroyAudioStream@, defined at @SDL3\/SDL_audio.h 1982:34@
+sDL_DestroyAudioStream :: BG.FunPtr (BG.Ptr SDL_AudioStream -> IO ())
+sDL_DestroyAudioStream =
+  BG.unsafePerformIO hs_bindgen_8414956b9aa941e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_OpenAudioDeviceStream@
+foreign import ccall unsafe "hs_bindgen_e8ad9974dfab54c1"
+  hs_bindgen_e8ad9974dfab54c1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_OpenAudioDeviceStream@
+hs_bindgen_e8ad9974dfab54c1
+  :: IO
+       ( BG.FunPtr
+           ( SDL_AudioDeviceID
+             -> PtrConst.PtrConst SDL_AudioSpec
+             -> SDL_AudioStreamCallback
+             -> BG.Ptr BG.Void
+             -> IO (BG.Ptr SDL_AudioStream)
+           )
+       )
+hs_bindgen_e8ad9974dfab54c1 =
+  BG.fromFFIType hs_bindgen_e8ad9974dfab54c1_base
+
+{-# NOINLINE sDL_OpenAudioDeviceStream #-}
+
+-- | Convenience function for straightforward audio init for the common case.
+--
+--     If all your app intends to do is provide a single source of PCM audio, this function allows you to do all your audio setup in a single call.
+--
+--     This is also intended to be a clean means to migrate apps from SDL2.
+--
+--     This function will open an audio device, create a stream and bind it. Unlike other methods of setup, the audio device will be closed when this stream is destroyed, so the app can treat the returned 'SDL_AudioStream' as the only object needed to manage audio playback.
+--
+--     Also unlike other functions, the audio device begins paused. This is to map more closely to SDL2-style behavior, since there is no extra step here to bind a stream to begin audio flowing. The audio device should be resumed with @SDL_ResumeAudioStreamDevice()@.
+--
+--     This function works with both playback and recording devices.
+--
+--     The @spec@ parameter represents the app\'s side of the audio stream. That is, for recording audio, this will be the output format, and for playing audio, this will be the input format. If spec is NULL, the system will choose the format, and the app can use @SDL_GetAudioStreamFormat()@ to obtain this information later.
+--
+--     If you don\'t care about opening a specific audio device, you can (and probably /should/), use SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK for playback and SDL_AUDIO_DEVICE_DEFAULT_RECORDING for recording.
+--
+--     One can optionally provide a callback function; if NULL, the app is expected to queue audio data for playback (or unqueue audio data if capturing). Otherwise, the callback will begin to fire once the device is unpaused.
+--
+--     Destroying the returned stream with SDL_DestroyAudioStream will also close the audio device associated with this stream.
+--
+--     [@devid@]: an audio device to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING.
+--
+--     [@spec@]: the audio stream\'s data format. Can be NULL.
+--
+--     [@callback@]: a callback where the app will provide new data for playback, or receive new data for recording. Can be NULL, in which case the app will need to call SDL_PutAudioStreamData or SDL_GetAudioStreamData as necessary.
+--
+--     [@userdata@]: app-controlled pointer passed to callback. Can be NULL. Ignored if callback is NULL.
+--
+--     [Returns]: an audio stream on success, ready to use, or NULL on failure; call SDL_GetError() for more information. When done with this stream, call SDL_DestroyAudioStream to free resources and close the device.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamDevice', 'sDL_ResumeAudioStreamDevice'
+--
+--     [C declaration]: @SDL_OpenAudioDeviceStream@, defined at @SDL3\/SDL_audio.h 2045:47@
+sDL_OpenAudioDeviceStream
+  :: BG.FunPtr
+       ( SDL_AudioDeviceID
+         -> PtrConst.PtrConst SDL_AudioSpec
+         -> SDL_AudioStreamCallback
+         -> BG.Ptr BG.Void
+         -> IO (BG.Ptr SDL_AudioStream)
+       )
+sDL_OpenAudioDeviceStream =
+  BG.unsafePerformIO hs_bindgen_e8ad9974dfab54c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioPostmixCallback@
+foreign import ccall unsafe "hs_bindgen_fb49ec8721a9eaae"
+  hs_bindgen_fb49ec8721a9eaae_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_SetAudioPostmixCallback@
+hs_bindgen_fb49ec8721a9eaae
+  :: IO (BG.FunPtr (SDL_AudioDeviceID -> SDL_AudioPostmixCallback -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_fb49ec8721a9eaae =
+  BG.fromFFIType hs_bindgen_fb49ec8721a9eaae_base
+
+{-# NOINLINE sDL_SetAudioPostmixCallback #-}
+
+-- | Set a callback that fires when data is about to be fed to an audio device.
+--
+--     This is useful for accessing the final mix, perhaps for writing a visualizer or applying a final effect to the audio data before playback.
+--
+--     The buffer is the final mix of all bound audio streams on an opened device; this callback will fire regularly for any device that is both opened and unpaused. If there is no new data to mix, either because no streams are bound to the device or all the streams are empty, this callback will still fire with the entire buffer set to silence.
+--
+--     This callback is allowed to make changes to the data; the contents of the buffer after this call is what is ultimately passed along to the hardware.
+--
+--     The callback is always provided the data in float format (values from -1.0f to 1.0f), but the number of channels or sample rate may be different than the format the app requested when opening the device; SDL might have had to manage a conversion behind the scenes, or the playback might have jumped to new physical hardware when a system default changed, etc. These details may change between calls. Accordingly, the size of the buffer might change between calls as well.
+--
+--     This callback can run at any time, and from any thread; if you need to serialize access to your app\'s data, you should provide and use a mutex or other synchronization device.
+--
+--     All of this to say: there are specific needs this callback can fulfill, but it is not the simplest interface. Apps should generally provide audio in their preferred format through an 'SDL_AudioStream' and let SDL handle the difference.
+--
+--     This function is extremely time-sensitive; the callback should do the least amount of work possible and return as quickly as it can. The longer the callback runs, the higher the risk of audio dropouts or other problems.
+--
+--     This function will block until the audio device is in between iterations, so any existing callback that might be running will finish before this function sets the new callback and returns.
+--
+--     Setting a NULL callback function disables any previously-set callback.
+--
+--     [@devid@]: the ID of an opened audio device.
+--
+--     [@callback@]: a callback function to be called. Can be NULL.
+--
+--     [@userdata@]: app-controlled pointer passed to callback. Can be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetAudioPostmixCallback@, defined at @SDL3\/SDL_audio.h 2136:34@
+sDL_SetAudioPostmixCallback
+  :: BG.FunPtr (SDL_AudioDeviceID -> SDL_AudioPostmixCallback -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_SetAudioPostmixCallback =
+  BG.unsafePerformIO hs_bindgen_fb49ec8721a9eaae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_LoadWAV_IO@
+foreign import ccall unsafe "hs_bindgen_aeaf62387043ab14"
+  hs_bindgen_aeaf62387043ab14_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_LoadWAV_IO@
+hs_bindgen_aeaf62387043ab14
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+             -> BG.CBool
+             -> BG.Ptr SDL_AudioSpec
+             -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_aeaf62387043ab14 =
+  BG.fromFFIType hs_bindgen_aeaf62387043ab14_base
+
+{-# NOINLINE sDL_LoadWAV_IO #-}
+
+-- | Load the audio data of a WAVE file into memory.
+--
+--     Loading a WAVE file requires @src@, @spec@, @audio_buf@ and @audio_len@ to be valid pointers. The entire data portion of the file is then loaded into memory and decoded if necessary.
+--
+--     Supported formats are RIFF WAVE files with the formats PCM (8, 16, 24, and 32 bits), IEEE Float (32 bits), Microsoft ADPCM and IMA ADPCM (4 bits), and A-law and mu-law (8 bits). Other formats are currently unsupported and cause an error.
+--
+--     If this function succeeds, the return value is zero and the pointer to the audio data allocated by the function is written to @audio_buf@ and its length in bytes to @audio_len@. The 'SDL_AudioSpec' members @freq@, @channels@, and @format@ are set to the values of the audio data in the buffer.
+--
+--     It\'s necessary to use SDL_free() to free the audio data returned in @audio_buf@ when it is no longer used.
+--
+--     Because of the underspecification of the .WAV format, there are many problematic files in the wild that cause issues with strict decoders. To provide compatibility with these files, this decoder is lenient in regards to the truncation of the file, the fact chunk, and the size of the RIFF chunk. The hints @SDL_HINT_WAVE_RIFF_CHUNK_SIZE@, @SDL_HINT_WAVE_TRUNCATION@, and @SDL_HINT_WAVE_FACT_CHUNK@ can be used to tune the behavior of the loading process.
+--
+--     Any file that is invalid (due to truncation, corruption, or wrong values in the headers), too big, or unsupported causes an error. Additionally, any critical I\/O error from the data source will terminate the loading process with an error. The function returns NULL on error and in all cases (with the exception of @src@ being NULL), an appropriate error message will be set.
+--
+--     It is required that the data source supports seeking.
+--
+--     Example:
+--
+--     @
+--     SDL_LoadWAV_IO(SDL_IOFromFile(\"sample.wav\", \"rb\"), true, &spec, &buf, &len);
+--     @
+--
+--     Note that the SDL_LoadWAV function does this same thing for you, but in a less messy way:
+--
+--     @
+--     SDL_LoadWAV(\"sample.wav\", &spec, &buf, &len);
+--     @
+--
+--     This function returns false if the .WAV file cannot be opened, uses an unknown data format, or is corrupt; call SDL_GetError() for more information.
+--
+--     [@src@]: the data source for the WAVE data.
+--
+--     [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+--
+--     [@spec@]: a pointer to an 'SDL_AudioSpec' that will be set to the WAVE data\'s format details on successful return.
+--
+--     [@audio_buf@]: a pointer filled with the audio data, allocated by the function.
+--
+--     [@audio_len@]: a pointer filled with the length of the audio data buffer in bytes.
+--
+--     [Returns]: true on success. @audio_buf@ will be filled with a pointer to an allocated buffer containing the audio data, and @audio_len@ is filled with the length of that audio buffer in bytes.
+--
+--     When the application is done with the data returned in @audio_buf@, it should call SDL_free() to dispose of it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_free, 'sDL_LoadWAV'
+--
+--     [C declaration]: @SDL_LoadWAV_IO@, defined at @SDL3\/SDL_audio.h 2217:34@
+sDL_LoadWAV_IO
+  :: BG.FunPtr
+       ( BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+         -> BG.CBool
+         -> BG.Ptr SDL_AudioSpec
+         -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_LoadWAV_IO =
+  BG.unsafePerformIO hs_bindgen_aeaf62387043ab14
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_LoadWAV@
+foreign import ccall unsafe "hs_bindgen_23688fb6d15b1a20"
+  hs_bindgen_23688fb6d15b1a20_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_LoadWAV@
+hs_bindgen_23688fb6d15b1a20
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> BG.Ptr SDL_AudioSpec
+             -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_23688fb6d15b1a20 =
+  BG.fromFFIType hs_bindgen_23688fb6d15b1a20_base
+
+{-# NOINLINE sDL_LoadWAV #-}
+
+-- | Loads a WAV from a file path.
+--
+--     This is a convenience function that is effectively the same as:
+--
+--     @
+--     SDL_LoadWAV_IO(SDL_IOFromFile(path, \"rb\"), true, spec, audio_buf, audio_len);
+--     @
+--
+--     This function returns false if the .WAV file cannot be opened, uses an unknown data format, or is corrupt; call SDL_GetError() for more information.
+--
+--     [@path@]: the file path of the WAV file to open.
+--
+--     [@spec@]: a pointer to an 'SDL_AudioSpec' that will be set to the WAVE data\'s format details on successful return.
+--
+--     [@audio_buf@]: a pointer filled with the audio data, allocated by the function.
+--
+--     [@audio_len@]: a pointer filled with the length of the audio data buffer in bytes.
+--
+--     [Returns]: true on success. @audio_buf@ will be filled with a pointer to an allocated buffer containing the audio data, and @audio_len@ is filled with the length of that audio buffer in bytes.
+--
+--     When the application is done with the data returned in @audio_buf@, it should call SDL_free() to dispose of it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_free, 'sDL_LoadWAV_IO'
+--
+--     [C declaration]: @SDL_LoadWAV@, defined at @SDL3\/SDL_audio.h 2253:34@
+sDL_LoadWAV
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> BG.Ptr SDL_AudioSpec
+         -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_LoadWAV =
+  BG.unsafePerformIO hs_bindgen_23688fb6d15b1a20
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_MixAudio@
+foreign import ccall unsafe "hs_bindgen_b67274f0c4cb98dd"
+  hs_bindgen_b67274f0c4cb98dd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_MixAudio@
+hs_bindgen_b67274f0c4cb98dd
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL_AudioFormat
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> BG.CFloat
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_b67274f0c4cb98dd =
+  BG.fromFFIType hs_bindgen_b67274f0c4cb98dd_base
+
+{-# NOINLINE sDL_MixAudio #-}
+
+-- | Mix audio data in a specified format.
+--
+--     This takes an audio buffer @src@ of @len@ bytes of @format@ data and mixes it into @dst@, performing addition, volume adjustment, and overflow clipping. The buffer pointed to by @dst@ must also be @len@ bytes of @format@ data.
+--
+--     This is provided for convenience you can mix your own audio data.
+--
+--     Do not use this function for mixing together more than two streams of sample data. The output from repeated application of this function may be distorted by clipping, because there is no accumulator with greater range than the input (not to mention this being an inefficient way of doing it).
+--
+--     It is a common misconception that this function is required to write audio data to an output stream in an audio callback. While you can do that, @SDL_MixAudio()@ is really only needed when you\'re mixing a single audio stream with a volume adjustment.
+--
+--     [@dst@]: the destination for the mixed audio.
+--
+--     [@src@]: the source audio buffer to be mixed.
+--
+--     [@format@]: the 'SDL_AudioFormat' structure representing the desired audio format.
+--
+--     [@len@]: the length of the audio buffer in bytes.
+--
+--     [@volume@]: ranges from 0.0 - 1.0, and should be set to 1.0 for full audio volume.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_MixAudio@, defined at @SDL3\/SDL_audio.h 2289:34@
+sDL_MixAudio
+  :: BG.FunPtr
+       ( BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL_AudioFormat
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> BG.CFloat
+         -> IO BG.CBool
+       )
+sDL_MixAudio =
+  BG.unsafePerformIO hs_bindgen_b67274f0c4cb98dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ConvertAudioSamples@
+foreign import ccall unsafe "hs_bindgen_94a0a8ff1b94e777"
+  hs_bindgen_94a0a8ff1b94e777_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_ConvertAudioSamples@
+hs_bindgen_94a0a8ff1b94e777
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst SDL_AudioSpec
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.CInt
+             -> PtrConst.PtrConst SDL_AudioSpec
+             -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+             -> BG.Ptr BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_94a0a8ff1b94e777 =
+  BG.fromFFIType hs_bindgen_94a0a8ff1b94e777_base
+
+{-# NOINLINE sDL_ConvertAudioSamples #-}
+
+-- | Convert some audio data of one format to another format.
+--
+--     Please note that this function is for convenience, but should not be used to resample audio in blocks, as it will introduce audio artifacts on the boundaries. You should only use this function if you are converting audio data in its entirety in one call. If you want to convert audio in smaller chunks, use an 'SDL_AudioStream', which is designed for this situation.
+--
+--     Internally, this function creates and destroys an 'SDL_AudioStream' on each use, so it\'s also less efficient than using one directly, if you need to convert multiple times.
+--
+--     [@src_spec@]: the format details of the input audio.
+--
+--     [@src_data@]: the audio data to be converted.
+--
+--     [@src_len@]: the len of src_data.
+--
+--     [@dst_spec@]: the format details of the output audio.
+--
+--     [@dst_data@]: will be filled with a pointer to converted audio data, which should be freed with SDL_free(). On error, it will be NULL.
+--
+--     [@dst_len@]: will be filled with the len of dst_data.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ConvertAudioSamples@, defined at @SDL3\/SDL_audio.h 2319:34@
+sDL_ConvertAudioSamples
+  :: BG.FunPtr
+       ( PtrConst.PtrConst SDL_AudioSpec
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.CInt
+         -> PtrConst.PtrConst SDL_AudioSpec
+         -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+         -> BG.Ptr BG.CInt
+         -> IO BG.CBool
+       )
+sDL_ConvertAudioSamples =
+  BG.unsafePerformIO hs_bindgen_94a0a8ff1b94e777
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioFormatName@
+foreign import ccall unsafe "hs_bindgen_8a62dc82ce668b2b"
+  hs_bindgen_8a62dc82ce668b2b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetAudioFormatName@
+hs_bindgen_8a62dc82ce668b2b :: IO (BG.FunPtr (SDL_AudioFormat -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_8a62dc82ce668b2b =
+  BG.fromFFIType hs_bindgen_8a62dc82ce668b2b_base
+
+{-# NOINLINE sDL_GetAudioFormatName #-}
+
+-- | Get the human readable name of an audio format.
+--
+--     [@format@]: the audio format to query.
+--
+--     [Returns]: the human readable name of the specified audio format or \"SDL_AUDIO_UNKNOWN\" if the format isn\'t recognized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAudioFormatName@, defined at @SDL3\/SDL_audio.h 2332:42@
+sDL_GetAudioFormatName :: BG.FunPtr (SDL_AudioFormat -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetAudioFormatName =
+  BG.unsafePerformIO hs_bindgen_8a62dc82ce668b2b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetSilenceValueForFormat@
+foreign import ccall unsafe "hs_bindgen_733e8e75537d52fb"
+  hs_bindgen_733e8e75537d52fb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_get_SDL_GetSilenceValueForFormat@
+hs_bindgen_733e8e75537d52fb :: IO (BG.FunPtr (SDL_AudioFormat -> IO BG.CInt))
+hs_bindgen_733e8e75537d52fb =
+  BG.fromFFIType hs_bindgen_733e8e75537d52fb_base
+
+{-# NOINLINE sDL_GetSilenceValueForFormat #-}
+
+-- | Get the appropriate memset value for silencing an audio format.
+--
+--     The value returned by this function can be used as the second argument to memset (or SDL_memset) to set an audio buffer in a specific format to silence.
+--
+--     [@format@]: the audio data format to query.
+--
+--     [Returns]: a byte value that can be passed to memset.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSilenceValueForFormat@, defined at @SDL3\/SDL_audio.h 2348:33@
+sDL_GetSilenceValueForFormat :: BG.FunPtr (SDL_AudioFormat -> IO BG.CInt)
+sDL_GetSilenceValueForFormat =
+  BG.unsafePerformIO hs_bindgen_733e8e75537d52fb
diff --git a/src/SDL3/Sys/Bindgen/Audio/Safe.hs b/src/SDL3/Sys/Bindgen/Audio/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Audio/Safe.hs
@@ -0,0 +1,3059 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Audio.Safe (
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetNumAudioDrivers,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioDriver,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetCurrentAudioDriver,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioPlaybackDevices,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioRecordingDevices,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioDeviceName,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioDeviceFormat,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioDeviceChannelMap,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_OpenAudioDevice,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_IsAudioDevicePhysical,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_IsAudioDevicePlayback,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_PauseAudioDevice,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_ResumeAudioDevice,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_AudioDevicePaused,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioDeviceGain,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_SetAudioDeviceGain,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_CloseAudioDevice,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_BindAudioStreams,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_BindAudioStream,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_UnbindAudioStreams,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_UnbindAudioStream,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioStreamDevice,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_CreateAudioStream,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioStreamProperties,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioStreamFormat,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_SetAudioStreamFormat,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioStreamFrequencyRatio,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_SetAudioStreamFrequencyRatio,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioStreamGain,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_SetAudioStreamGain,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioStreamInputChannelMap,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioStreamOutputChannelMap,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_SetAudioStreamInputChannelMap,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_SetAudioStreamOutputChannelMap,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_PutAudioStreamData,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_PutAudioStreamDataNoCopy,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_PutAudioStreamPlanarData,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioStreamData,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioStreamAvailable,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioStreamQueued,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_FlushAudioStream,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_ClearAudioStream,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_PauseAudioStreamDevice,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_ResumeAudioStreamDevice,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_AudioStreamDevicePaused,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_LockAudioStream,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_UnlockAudioStream,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_SetAudioStreamGetCallback,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_SetAudioStreamPutCallback,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_DestroyAudioStream,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_OpenAudioDeviceStream,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_SetAudioPostmixCallback,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_LoadWAV_IO,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_LoadWAV,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_MixAudio,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_ConvertAudioSamples,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetAudioFormatName,
+  SDL3.Sys.Bindgen.Audio.Safe.sDL_GetSilenceValueForFormat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Audio
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_audio.h>"
+         , "signed int hs_bindgen_aec6557cf376f51a (void)"
+         , "{"
+         , "  return (SDL_GetNumAudioDrivers)();"
+         , "}"
+         , "char const *hs_bindgen_a7a9924f3ded1aac ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioDriver)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_eb8c87e3006e6e3e (void)"
+         , "{"
+         , "  return (SDL_GetCurrentAudioDriver)();"
+         , "}"
+         , "SDL_AudioDeviceID *hs_bindgen_116eecdd1dba02ce ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioPlaybackDevices)(arg1);"
+         , "}"
+         , "SDL_AudioDeviceID *hs_bindgen_f9bbcb7cbaba1df7 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioRecordingDevices)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_499713655ad12ded ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioDeviceName)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_1607be856719fe9f ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioSpec *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioDeviceFormat)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int *hs_bindgen_87920ef47db02c9e ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioDeviceChannelMap)(arg1, arg2);"
+         , "}"
+         , "SDL_AudioDeviceID hs_bindgen_7c422eec383d378d ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioSpec const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenAudioDevice)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_9124a0c657594930 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_IsAudioDevicePhysical)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_e66327fd3002e936 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_IsAudioDevicePlayback)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_6dcc3c4ea1398f2b ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_PauseAudioDevice)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_4fce882c920cc91a ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ResumeAudioDevice)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8ece1cc27cedcd76 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AudioDevicePaused)(arg1);"
+         , "}"
+         , "float hs_bindgen_49cef71585b71d2d ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioDeviceGain)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_b40aa45597fa463a ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioDeviceGain)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_e8af3f72de564cf1 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseAudioDevice)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0af2b20aae7d1772 ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioStream *const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_BindAudioStreams)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_63b077caa3c6f246 ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioStream *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_BindAudioStream)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_c2645d811582f0a9 ("
+         , "  SDL_AudioStream *const *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  (SDL_UnbindAudioStreams)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_d4d919dbf9ca4924 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnbindAudioStream)(arg1);"
+         , "}"
+         , "SDL_AudioDeviceID hs_bindgen_8dd61683a1d75595 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamDevice)(arg1);"
+         , "}"
+         , "SDL_AudioStream *hs_bindgen_aca7047ab74c15f6 ("
+         , "  SDL_AudioSpec const *arg1,"
+         , "  SDL_AudioSpec const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateAudioStream)(arg1, arg2);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_cd9dda2135997250 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamProperties)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_5011d0cad394b582 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioSpec *arg2,"
+         , "  SDL_AudioSpec *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamFormat)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_b7e0d40673e5b425 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioSpec const *arg2,"
+         , "  SDL_AudioSpec const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamFormat)(arg1, arg2, arg3);"
+         , "}"
+         , "float hs_bindgen_3c13c77fea7457b6 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamFrequencyRatio)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_7be7b2b980ff1f01 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamFrequencyRatio)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_125acd9c795cad57 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamGain)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_5684b3f0e33987ea ("
+         , "  SDL_AudioStream *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamGain)(arg1, arg2);"
+         , "}"
+         , "signed int *hs_bindgen_92fa355f815c3314 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamInputChannelMap)(arg1, arg2);"
+         , "}"
+         , "signed int *hs_bindgen_9b5ffd54b64ea0ea ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamOutputChannelMap)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d47a0e77e800172e ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamInputChannelMap)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_b53ca7ca85639b18 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamOutputChannelMap)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_aaa4efec7abd5cd4 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_PutAudioStreamData)(arg1, arg2, arg3);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef void *SDL_AudioStreamDataCompleteCallback;"
+         , "#endif"
+         , "_Bool hs_bindgen_619ed51504fee204 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3,"
+         , "  SDL_AudioStreamDataCompleteCallback arg4,"
+         , "  void *arg5"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_PutAudioStreamDataNoCopy)(arg1, arg2, arg3, arg4, arg5);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; (void)arg5; SDL_SetError(\"SDL_PutAudioStreamDataNoCopy requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_a35f9b9040c608a3 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void const *const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_PutAudioStreamPlanarData)(arg1, arg2, arg3, arg4);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; SDL_SetError(\"SDL_PutAudioStreamPlanarData requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "signed int hs_bindgen_80c78d4a6767c5c1 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamData)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_2ddc379eb0f7050b ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamAvailable)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_3c01027250fa0224 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamQueued)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_a08de3ff3d4b6b48 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_FlushAudioStream)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_495b0c63dde7c64f ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ClearAudioStream)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_b5ae37aa80b742a5 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_PauseAudioStreamDevice)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_df0b3314efa54fdd ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ResumeAudioStreamDevice)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_1ff005643c24e6c0 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AudioStreamDevicePaused)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_3d4874ba18717a32 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_LockAudioStream)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0175d2c579f38af7 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_UnlockAudioStream)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_65648a5a73743f2d ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioStreamCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamGetCallback)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_61ea9930449caa3b ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioStreamCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamPutCallback)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_2f2920f372de3f91 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyAudioStream)(arg1);"
+         , "}"
+         , "SDL_AudioStream *hs_bindgen_41a1f387b2d98901 ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioSpec const *arg2,"
+         , "  SDL_AudioStreamCallback arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenAudioDeviceStream)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_4e2802e9ed6e7f25 ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioPostmixCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioPostmixCallback)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_a910288634dd93c9 ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2,"
+         , "  SDL_AudioSpec *arg3,"
+         , "  Uint8 **arg4,"
+         , "  Uint32 *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadWAV_IO)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_9dc1494e309920f0 ("
+         , "  char const *arg1,"
+         , "  SDL_AudioSpec *arg2,"
+         , "  Uint8 **arg3,"
+         , "  Uint32 *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadWAV)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_f90c9509d9c249ee ("
+         , "  Uint8 *arg1,"
+         , "  Uint8 const *arg2,"
+         , "  SDL_AudioFormat arg3,"
+         , "  Uint32 arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_MixAudio)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_ee64493d4496844f ("
+         , "  SDL_AudioSpec const *arg1,"
+         , "  Uint8 const *arg2,"
+         , "  signed int arg3,"
+         , "  SDL_AudioSpec const *arg4,"
+         , "  Uint8 **arg5,"
+         , "  signed int *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertAudioSamples)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "char const *hs_bindgen_427a7131d02ce29b ("
+         , "  SDL_AudioFormat arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioFormatName)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_a78d31ca2af16da3 ("
+         , "  SDL_AudioFormat arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSilenceValueForFormat)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetNumAudioDrivers@
+foreign import ccall safe "hs_bindgen_aec6557cf376f51a"
+  hs_bindgen_aec6557cf376f51a_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetNumAudioDrivers@
+hs_bindgen_aec6557cf376f51a :: IO BG.CInt
+hs_bindgen_aec6557cf376f51a =
+  BG.fromFFIType hs_bindgen_aec6557cf376f51a_base
+
+-- | Use this function to get the number of built-in audio drivers.
+--
+--     This function returns a hardcoded number. This never returns a negative value; if there are no drivers compiled into this build of SDL, this function returns zero. The presence of a driver in this list does not mean it will function, it just means SDL is capable of interacting with that interface. For example, a build of SDL might have esound support, but if there\'s no esound server available, SDL\'s esound driver would fail if used.
+--
+--     By default, SDL tries all drivers, in its preferred order, until one is found to be usable.
+--
+--     [Returns]: the number of built-in audio drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioDriver'
+--
+--     [C declaration]: @SDL_GetNumAudioDrivers@, defined at @SDL3\/SDL_audio.h 477:33@
+sDL_GetNumAudioDrivers :: IO BG.CInt
+sDL_GetNumAudioDrivers = hs_bindgen_aec6557cf376f51a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioDriver@
+foreign import ccall safe "hs_bindgen_a7a9924f3ded1aac"
+  hs_bindgen_a7a9924f3ded1aac_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioDriver@
+hs_bindgen_a7a9924f3ded1aac
+  :: BG.CInt
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_a7a9924f3ded1aac =
+  BG.fromFFIType hs_bindgen_a7a9924f3ded1aac_base
+
+-- | Use this function to get the name of a built in audio driver.
+--
+--     The list of audio drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"alsa\", \"coreaudio\" or \"wasapi\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the audio driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumAudioDrivers'
+--
+--     [C declaration]: @SDL_GetAudioDriver@, defined at @SDL3\/SDL_audio.h 501:42@
+sDL_GetAudioDriver
+  :: BG.CInt
+  -- ^
+  --
+  --           [@index@]: the index of the audio driver; the value ranges from 0 to @SDL_GetNumAudioDrivers()@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetAudioDriver = hs_bindgen_a7a9924f3ded1aac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetCurrentAudioDriver@
+foreign import ccall safe "hs_bindgen_eb8c87e3006e6e3e"
+  hs_bindgen_eb8c87e3006e6e3e_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetCurrentAudioDriver@
+hs_bindgen_eb8c87e3006e6e3e :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_eb8c87e3006e6e3e =
+  BG.fromFFIType hs_bindgen_eb8c87e3006e6e3e_base
+
+-- | Get the name of the current audio driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"alsa\", \"coreaudio\" or \"wasapi\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current audio driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentAudioDriver@, defined at @SDL3\/SDL_audio.h 517:42@
+sDL_GetCurrentAudioDriver :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetCurrentAudioDriver =
+  hs_bindgen_eb8c87e3006e6e3e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioPlaybackDevices@
+foreign import ccall safe "hs_bindgen_116eecdd1dba02ce"
+  hs_bindgen_116eecdd1dba02ce_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioPlaybackDevices@
+hs_bindgen_116eecdd1dba02ce
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+hs_bindgen_116eecdd1dba02ce =
+  BG.fromFFIType hs_bindgen_116eecdd1dba02ce_base
+
+-- | Get a list of currently-connected audio playback devices.
+--
+--     This returns of list of available devices that play sound, perhaps to speakers or headphones (\"playback\" devices). If you want devices that record audio, like a microphone (\"recording\" devices), use @SDL_GetAudioRecordingDevices()@ instead.
+--
+--     This only returns a list of physical devices; it will not have any device IDs returned by @SDL_OpenAudioDevice()@.
+--
+--     If this function returns NULL, to signify an error, @*count@ will be set to zero.
+--
+--     [Returns]: a 0 terminated array of device instance IDs or NULL on error; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenAudioDevice', 'sDL_GetAudioRecordingDevices'
+--
+--     [C declaration]: @SDL_GetAudioPlaybackDevices@, defined at @SDL3\/SDL_audio.h 546:49@
+sDL_GetAudioPlaybackDevices
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+sDL_GetAudioPlaybackDevices =
+  hs_bindgen_116eecdd1dba02ce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioRecordingDevices@
+foreign import ccall safe "hs_bindgen_f9bbcb7cbaba1df7"
+  hs_bindgen_f9bbcb7cbaba1df7_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioRecordingDevices@
+hs_bindgen_f9bbcb7cbaba1df7
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+hs_bindgen_f9bbcb7cbaba1df7 =
+  BG.fromFFIType hs_bindgen_f9bbcb7cbaba1df7_base
+
+-- | Get a list of currently-connected audio recording devices.
+--
+--     This returns of list of available devices that record audio, like a microphone (\"recording\" devices). If you want devices that play sound, perhaps to speakers or headphones (\"playback\" devices), use @SDL_GetAudioPlaybackDevices()@ instead.
+--
+--     This only returns a list of physical devices; it will not have any device IDs returned by @SDL_OpenAudioDevice()@.
+--
+--     If this function returns NULL, to signify an error, @*count@ will be set to zero.
+--
+--     [Returns]: a 0 terminated array of device instance IDs, or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenAudioDevice', 'sDL_GetAudioPlaybackDevices'
+--
+--     [C declaration]: @SDL_GetAudioRecordingDevices@, defined at @SDL3\/SDL_audio.h 575:49@
+sDL_GetAudioRecordingDevices
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+sDL_GetAudioRecordingDevices =
+  hs_bindgen_f9bbcb7cbaba1df7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioDeviceName@
+foreign import ccall safe "hs_bindgen_499713655ad12ded"
+  hs_bindgen_499713655ad12ded_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioDeviceName@
+hs_bindgen_499713655ad12ded
+  :: SDL_AudioDeviceID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_499713655ad12ded =
+  BG.fromFFIType hs_bindgen_499713655ad12ded_base
+
+-- | Get the human-readable name of a specific audio device.
+--
+--     __WARNING__: this function will work with SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK and SDL_AUDIO_DEVICE_DEFAULT_RECORDING, returning the current default physical devices\' names. However, as the default device may change at any time, it is likely better to show a generic name to the user, like \"System default audio device\" or perhaps \"default [currently %s]\". Do not store this name to disk to reidentify the device in a later run of the program, as the default might change in general, and the string will be the name of a specific device and not the abstract system default.
+--
+--     [Returns]: the name of the audio device, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioPlaybackDevices', 'sDL_GetAudioRecordingDevices'
+--
+--     [C declaration]: @SDL_GetAudioDeviceName@, defined at @SDL3\/SDL_audio.h 600:42@
+sDL_GetAudioDeviceName
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetAudioDeviceName = hs_bindgen_499713655ad12ded
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioDeviceFormat@
+foreign import ccall safe "hs_bindgen_1607be856719fe9f"
+  hs_bindgen_1607be856719fe9f_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioDeviceFormat@
+hs_bindgen_1607be856719fe9f
+  :: SDL_AudioDeviceID
+  -> BG.Ptr SDL_AudioSpec
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_1607be856719fe9f =
+  BG.fromFFIType hs_bindgen_1607be856719fe9f_base
+
+-- | Get the current audio format of a specific audio device.
+--
+--     For an opened device, this will report the format the device is currently using. If the device isn\'t yet opened, this will report the device\'s preferred format (or a reasonable default if this can\'t be determined).
+--
+--     You may also specify SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING here, which is useful for getting a reasonable recommendation before opening the system-recommended default device.
+--
+--     You can also use this to request the current device buffer size. This is specified in sample frames and represents the amount of data SDL will feed to the physical hardware in each chunk. This can be converted to milliseconds of audio with the following equation:
+--
+--     @ms = (int) ((((Sint64) frames) * 1000) \/ spec.freq);@
+--
+--     Buffer size is only important if you need low-level control over the audio playback timing. Most apps do not need this.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAudioDeviceFormat@, defined at @SDL3\/SDL_audio.h 635:34@
+sDL_GetAudioDeviceFormat
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: on return, will be filled with device details.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@sample_frames@]: pointer to store device buffer size, in sample frames. Can be NULL.
+  -> IO BG.CBool
+sDL_GetAudioDeviceFormat =
+  hs_bindgen_1607be856719fe9f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioDeviceChannelMap@
+foreign import ccall safe "hs_bindgen_87920ef47db02c9e"
+  hs_bindgen_87920ef47db02c9e_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioDeviceChannelMap@
+hs_bindgen_87920ef47db02c9e
+  :: SDL_AudioDeviceID
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr BG.CInt)
+hs_bindgen_87920ef47db02c9e =
+  BG.fromFFIType hs_bindgen_87920ef47db02c9e_base
+
+-- | Get the current channel map of an audio device.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     Audio devices usually have no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_GetAudioDeviceChannelMap@, defined at @SDL3\/SDL_audio.h 658:35@
+sDL_GetAudioDeviceChannelMap
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+sDL_GetAudioDeviceChannelMap =
+  hs_bindgen_87920ef47db02c9e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_OpenAudioDevice@
+foreign import ccall safe "hs_bindgen_7c422eec383d378d"
+  hs_bindgen_7c422eec383d378d_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_OpenAudioDevice@
+hs_bindgen_7c422eec383d378d
+  :: SDL_AudioDeviceID
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> IO SDL_AudioDeviceID
+hs_bindgen_7c422eec383d378d =
+  BG.fromFFIType hs_bindgen_7c422eec383d378d_base
+
+-- | Open a specific audio device.
+--
+--     You can open both playback and recording devices through this function. Playback devices will take data from bound audio streams, mix it, and send it to the hardware. Recording devices will feed any bound audio streams with a copy of any incoming data.
+--
+--     An opened audio device starts out with no audio streams bound. To start audio playing, bind a stream and supply audio data to it. Unlike SDL2, there is no audio callback; you only bind audio streams and make sure they have data flowing into them (however, you can simulate SDL2\'s semantics fairly closely by using SDL_OpenAudioDeviceStream instead of this function).
+--
+--     If you don\'t care about opening a specific device, pass a @devid@ of either @SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK@ or @SDL_AUDIO_DEVICE_DEFAULT_RECORDING@. In this case, SDL will try to pick the most reasonable default, and may also switch between physical devices seamlessly later, if the most reasonable default changes during the lifetime of this opened device (user changed the default in the OS\'s system preferences, the default got unplugged so the system jumped to a new default, the user plugged in headphones on a mobile device, etc). Unless you have a good reason to choose a specific device, this is probably what you want.
+--
+--     You may request a specific format for the audio device, but there is no promise the device will honor that request for several reasons. As such, it\'s only meant to be a hint as to what data your app will provide. Audio streams will accept data in whatever format you specify and manage conversion for you as appropriate. SDL_GetAudioDeviceFormat can tell you the preferred format for the device before opening and the actual format the device is using after opening.
+--
+--     It\'s legal to open the same device ID more than once; each successful open will generate a new logical 'SDL_AudioDeviceID' that is managed separately from others on the same physical device. This allows libraries to open a device separately from the main app and bind its own streams without conflicting.
+--
+--     It is also legal to open a device ID returned by a previous call to this function; doing so just creates another logical device on the same physical device. This may be useful for making logical groupings of audio streams.
+--
+--     This function returns the opened device ID on success. This is a new, unique 'SDL_AudioDeviceID' that represents a logical device.
+--
+--     Some backends might offer arbitrary devices (for example, a networked audio protocol that can connect to an arbitrary server). For these, as a change from SDL2, you should open a default device ID and use an SDL hint to specify the target if you care, or otherwise let the backend figure out a reasonable default. Most backends don\'t offer anything like this, and often this would be an end user setting an environment variable for their custom need, and not something an application should specifically manage.
+--
+--     When done with an audio device, possibly at the end of the app\'s life, one should call @SDL_CloseAudioDevice()@ on the returned device id.
+--
+--     [Returns]: the device ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseAudioDevice', 'sDL_GetAudioDeviceFormat'
+--
+--     [C declaration]: @SDL_OpenAudioDevice@, defined at @SDL3\/SDL_audio.h 734:47@
+sDL_OpenAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device instance id to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING for the most reasonable default device.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: the requested device configuration. Can be NULL to use reasonable defaults.
+  -> IO SDL_AudioDeviceID
+sDL_OpenAudioDevice = hs_bindgen_7c422eec383d378d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_IsAudioDevicePhysical@
+foreign import ccall safe "hs_bindgen_9124a0c657594930"
+  hs_bindgen_9124a0c657594930_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_IsAudioDevicePhysical@
+hs_bindgen_9124a0c657594930
+  :: SDL_AudioDeviceID
+  -> IO BG.CBool
+hs_bindgen_9124a0c657594930 =
+  BG.fromFFIType hs_bindgen_9124a0c657594930_base
+
+-- | Determine if an audio device is physical (instead of logical).
+--
+--     An 'SDL_AudioDeviceID' that represents physical hardware is a physical device; there is one for each piece of hardware that SDL can see. Logical devices are created by calling SDL_OpenAudioDevice or SDL_OpenAudioDeviceStream, and while each is associated with a physical device, there can be any number of logical devices on one physical device.
+--
+--     For the most part, logical and physical IDs are interchangeable if you try to open a logical device, SDL understands to assign that effort to the underlying physical device, etc. However, it might be useful to know if an arbitrary device ID is physical or logical. This function reports which.
+--
+--     This function may return either true or false for invalid device IDs.
+--
+--     [Returns]: true if devid is a physical device, false if it is logical.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsAudioDevicePhysical@, defined at @SDL3\/SDL_audio.h 759:34@
+sDL_IsAudioDevicePhysical
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device ID to query.
+  -> IO BG.CBool
+sDL_IsAudioDevicePhysical =
+  hs_bindgen_9124a0c657594930
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_IsAudioDevicePlayback@
+foreign import ccall safe "hs_bindgen_e66327fd3002e936"
+  hs_bindgen_e66327fd3002e936_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_IsAudioDevicePlayback@
+hs_bindgen_e66327fd3002e936
+  :: SDL_AudioDeviceID
+  -> IO BG.CBool
+hs_bindgen_e66327fd3002e936 =
+  BG.fromFFIType hs_bindgen_e66327fd3002e936_base
+
+-- | Determine if an audio device is a playback device (instead of recording).
+--
+--     This function may return either true or false for invalid device IDs.
+--
+--     [Returns]: true if devid is a playback device, false if it is recording.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsAudioDevicePlayback@, defined at @SDL3\/SDL_audio.h 773:34@
+sDL_IsAudioDevicePlayback
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device ID to query.
+  -> IO BG.CBool
+sDL_IsAudioDevicePlayback =
+  hs_bindgen_e66327fd3002e936
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_PauseAudioDevice@
+foreign import ccall safe "hs_bindgen_6dcc3c4ea1398f2b"
+  hs_bindgen_6dcc3c4ea1398f2b_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_PauseAudioDevice@
+hs_bindgen_6dcc3c4ea1398f2b
+  :: SDL_AudioDeviceID
+  -> IO BG.CBool
+hs_bindgen_6dcc3c4ea1398f2b =
+  BG.fromFFIType hs_bindgen_6dcc3c4ea1398f2b_base
+
+-- | Use this function to pause audio playback on a specified device.
+--
+--     This function pauses audio processing for a given device. Any bound audio streams will not progress, and no audio will be generated. Pausing one device does not prevent other unpaused devices from running.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow. Pausing a paused device is a legal no-op.
+--
+--     Pausing a device can be useful to halt all audio without unbinding all the audio streams. This might be useful while a game is paused, or a level is loading, etc.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @SDL_OpenAudioDevice()@ can be.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResumeAudioDevice', 'sDL_AudioDevicePaused'
+--
+--     [C declaration]: @SDL_PauseAudioDevice@, defined at @SDL3\/SDL_audio.h 804:34@
+sDL_PauseAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @SDL_OpenAudioDevice()@.
+  -> IO BG.CBool
+sDL_PauseAudioDevice = hs_bindgen_6dcc3c4ea1398f2b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_ResumeAudioDevice@
+foreign import ccall safe "hs_bindgen_4fce882c920cc91a"
+  hs_bindgen_4fce882c920cc91a_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_ResumeAudioDevice@
+hs_bindgen_4fce882c920cc91a
+  :: SDL_AudioDeviceID
+  -> IO BG.CBool
+hs_bindgen_4fce882c920cc91a =
+  BG.fromFFIType hs_bindgen_4fce882c920cc91a_base
+
+-- | Use this function to unpause audio playback on a specified device.
+--
+--     This function unpauses audio processing for a given device that has previously been paused with @SDL_PauseAudioDevice()@. Once unpaused, any bound audio streams will begin to progress again, and audio can be generated.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow. Unpausing an unpaused device is a legal no-op.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @SDL_OpenAudioDevice()@ can be.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AudioDevicePaused', 'sDL_PauseAudioDevice'
+--
+--     [C declaration]: @SDL_ResumeAudioDevice@, defined at @SDL3\/SDL_audio.h 832:34@
+sDL_ResumeAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @SDL_OpenAudioDevice()@.
+  -> IO BG.CBool
+sDL_ResumeAudioDevice = hs_bindgen_4fce882c920cc91a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_AudioDevicePaused@
+foreign import ccall safe "hs_bindgen_8ece1cc27cedcd76"
+  hs_bindgen_8ece1cc27cedcd76_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_AudioDevicePaused@
+hs_bindgen_8ece1cc27cedcd76
+  :: SDL_AudioDeviceID
+  -> IO BG.CBool
+hs_bindgen_8ece1cc27cedcd76 =
+  BG.fromFFIType hs_bindgen_8ece1cc27cedcd76_base
+
+-- | Use this function to query if an audio device is paused.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @SDL_OpenAudioDevice()@ can be. Physical and invalid device IDs will report themselves as unpaused here.
+--
+--     [Returns]: true if device is valid and paused, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseAudioDevice', 'sDL_ResumeAudioDevice'
+--
+--     [C declaration]: @SDL_AudioDevicePaused@, defined at @SDL3\/SDL_audio.h 854:34@
+sDL_AudioDevicePaused
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @SDL_OpenAudioDevice()@.
+  -> IO BG.CBool
+sDL_AudioDevicePaused = hs_bindgen_8ece1cc27cedcd76
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioDeviceGain@
+foreign import ccall safe "hs_bindgen_49cef71585b71d2d"
+  hs_bindgen_49cef71585b71d2d_base
+    :: BG.Word32
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioDeviceGain@
+hs_bindgen_49cef71585b71d2d
+  :: SDL_AudioDeviceID
+  -> IO BG.CFloat
+hs_bindgen_49cef71585b71d2d =
+  BG.fromFFIType hs_bindgen_49cef71585b71d2d_base
+
+-- | Get the gain of an audio device.
+--
+--     The gain of a device is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio devices default to a gain of 1.0f (no change in output).
+--
+--     Physical devices may not have their gain changed, only logical devices, and this function will always return -1.0f when used on physical devices.
+--
+--     [Returns]: the gain of the device or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioDeviceGain'
+--
+--     [C declaration]: @SDL_GetAudioDeviceGain@, defined at @SDL3\/SDL_audio.h 877:35@
+sDL_GetAudioDeviceGain
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the audio device to query.
+  -> IO BG.CFloat
+sDL_GetAudioDeviceGain = hs_bindgen_49cef71585b71d2d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioDeviceGain@
+foreign import ccall safe "hs_bindgen_b40aa45597fa463a"
+  hs_bindgen_b40aa45597fa463a_base
+    :: BG.Word32
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioDeviceGain@
+hs_bindgen_b40aa45597fa463a
+  :: SDL_AudioDeviceID
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_b40aa45597fa463a =
+  BG.fromFFIType hs_bindgen_b40aa45597fa463a_base
+
+-- | Change the gain of an audio device.
+--
+--     The gain of a device is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio devices default to a gain of 1.0f (no change in output).
+--
+--     Physical devices may not have their gain changed, only logical devices, and this function will always return false when used on physical devices. While it might seem attractive to adjust several logical devices at once in this way, it would allow an app or library to interfere with another portion of the program\'s otherwise-isolated devices.
+--
+--     This is applied, along with any per-audiostream gain, during playback to the hardware, and can be continuously changed to create various effects. On recording devices, this will adjust the gain before passing the data into an audiostream; that recording audiostream can then adjust its gain further when outputting the data elsewhere, if it likes, but that second gain is not applied until the data leaves the audiostream again.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioDeviceGain'
+--
+--     [C declaration]: @SDL_SetAudioDeviceGain@, defined at @SDL3\/SDL_audio.h 912:34@
+sDL_SetAudioDeviceGain
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the audio device on which to change gain.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@gain@]: the gain. 1.0f is no change, 0.0f is silence.
+  -> IO BG.CBool
+sDL_SetAudioDeviceGain = hs_bindgen_b40aa45597fa463a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_CloseAudioDevice@
+foreign import ccall safe "hs_bindgen_e8af3f72de564cf1"
+  hs_bindgen_e8af3f72de564cf1_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_CloseAudioDevice@
+hs_bindgen_e8af3f72de564cf1
+  :: SDL_AudioDeviceID
+  -> IO ()
+hs_bindgen_e8af3f72de564cf1 =
+  BG.fromFFIType hs_bindgen_e8af3f72de564cf1_base
+
+-- | Close a previously-opened audio device.
+--
+--     The application should close open audio devices once they are no longer needed.
+--
+--     This function may block briefly while pending audio data is played by the hardware, so that applications don\'t drop the last buffer of data they supplied if terminating immediately afterwards.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenAudioDevice'
+--
+--     [C declaration]: @SDL_CloseAudioDevice@, defined at @SDL3\/SDL_audio.h 933:34@
+sDL_CloseAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device id previously returned by @SDL_OpenAudioDevice()@.
+  -> IO ()
+sDL_CloseAudioDevice = hs_bindgen_e8af3f72de564cf1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_BindAudioStreams@
+foreign import ccall safe "hs_bindgen_0af2b20aae7d1772"
+  hs_bindgen_0af2b20aae7d1772_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_BindAudioStreams@
+hs_bindgen_0af2b20aae7d1772
+  :: SDL_AudioDeviceID
+  -> PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_0af2b20aae7d1772 =
+  BG.fromFFIType hs_bindgen_0af2b20aae7d1772_base
+
+-- | Bind a list of audio streams to an audio device.
+--
+--     Audio data will flow through any bound streams. For a playback device, data for all bound streams will be mixed together and fed to the device. For a recording device, a copy of recorded data will be provided to each bound stream.
+--
+--     Audio streams can only be bound to an open device. This operation is atomic all streams bound in the same call will start processing at the same time, so they can stay in sync. Also: either all streams will be bound or none of them will be.
+--
+--     It is an error to bind an already-bound stream; it must be explicitly unbound first.
+--
+--     Binding a stream to a device will set its output format for playback devices, and its input format for recording devices, so they match the device\'s settings. The caller is welcome to change the other end of the stream\'s format at any time with @SDL_SetAudioStreamFormat()@. If the other end of the stream\'s format has never been set (the audio stream was created with a NULL audio spec), this function will set it to match the device end\'s format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStreams', 'sDL_UnbindAudioStream', 'sDL_GetAudioStreamDevice'
+--
+--     [C declaration]: @SDL_BindAudioStreams@, defined at @SDL3\/SDL_audio.h 973:34@
+sDL_BindAudioStreams
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to bind a stream to.
+  -> PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -- ^
+  --
+  --           [@streams@]: an array of audio streams to bind.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_streams@]: number streams listed in the @streams@ array.
+  -> IO BG.CBool
+sDL_BindAudioStreams = hs_bindgen_0af2b20aae7d1772
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_BindAudioStream@
+foreign import ccall safe "hs_bindgen_63b077caa3c6f246"
+  hs_bindgen_63b077caa3c6f246_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_BindAudioStream@
+hs_bindgen_63b077caa3c6f246
+  :: SDL_AudioDeviceID
+  -> BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_63b077caa3c6f246 =
+  BG.fromFFIType hs_bindgen_63b077caa3c6f246_base
+
+-- | Bind a single audio stream to an audio device.
+--
+--     This is a convenience function, equivalent to calling @'sDL_BindAudioStreams' (devid, &stream, 1)@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStreams', 'sDL_UnbindAudioStream', 'sDL_GetAudioStreamDevice'
+--
+--     [C declaration]: @SDL_BindAudioStream@, defined at @SDL3\/SDL_audio.h 994:34@
+sDL_BindAudioStream
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to bind a stream to.
+  -> BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: an audio stream to bind to a device.
+  -> IO BG.CBool
+sDL_BindAudioStream = hs_bindgen_63b077caa3c6f246
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_UnbindAudioStreams@
+foreign import ccall safe "hs_bindgen_c2645d811582f0a9"
+  hs_bindgen_c2645d811582f0a9_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_UnbindAudioStreams@
+hs_bindgen_c2645d811582f0a9
+  :: PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -> BG.CInt
+  -> IO ()
+hs_bindgen_c2645d811582f0a9 =
+  BG.fromFFIType hs_bindgen_c2645d811582f0a9_base
+
+-- | Unbind a list of audio streams from their audio devices.
+--
+--     The streams being unbound do not all have to be on the same device. All streams on the same device will be unbound atomically (data will stop flowing through all unbound streams on the same device at the same time).
+--
+--     Unbinding a stream that isn\'t bound to a device is a legal no-op.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStreams'
+--
+--     [C declaration]: @SDL_UnbindAudioStreams@, defined at @SDL3\/SDL_audio.h 1015:34@
+sDL_UnbindAudioStreams
+  :: PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -- ^
+  --
+  --           [@streams@]: an array of audio streams to unbind. Can be NULL or contain NULL.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_streams@]: number streams listed in the @streams@ array.
+  -> IO ()
+sDL_UnbindAudioStreams = hs_bindgen_c2645d811582f0a9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_UnbindAudioStream@
+foreign import ccall safe "hs_bindgen_d4d919dbf9ca4924"
+  hs_bindgen_d4d919dbf9ca4924_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_UnbindAudioStream@
+hs_bindgen_d4d919dbf9ca4924
+  :: BG.Ptr SDL_AudioStream
+  -> IO ()
+hs_bindgen_d4d919dbf9ca4924 =
+  BG.fromFFIType hs_bindgen_d4d919dbf9ca4924_base
+
+-- | Unbind a single audio stream from its audio device.
+--
+--     This is a convenience function, equivalent to calling @'sDL_UnbindAudioStreams' (&stream, 1)@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStream'
+--
+--     [C declaration]: @SDL_UnbindAudioStream@, defined at @SDL3\/SDL_audio.h 1031:34@
+sDL_UnbindAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: an audio stream to unbind from a device. Can be NULL.
+  -> IO ()
+sDL_UnbindAudioStream = hs_bindgen_d4d919dbf9ca4924
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamDevice@
+foreign import ccall safe "hs_bindgen_8dd61683a1d75595"
+  hs_bindgen_8dd61683a1d75595_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamDevice@
+hs_bindgen_8dd61683a1d75595
+  :: BG.Ptr SDL_AudioStream
+  -> IO SDL_AudioDeviceID
+hs_bindgen_8dd61683a1d75595 =
+  BG.fromFFIType hs_bindgen_8dd61683a1d75595_base
+
+-- | Query an audio stream for its currently-bound device.
+--
+--     This reports the logical audio device that an audio stream is currently bound to.
+--
+--     If not bound, or invalid, this returns zero, which is not a valid device ID.
+--
+--     [Returns]: the bound audio device, or 0 if not bound or invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStream', 'sDL_BindAudioStreams'
+--
+--     [C declaration]: @SDL_GetAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1052:47@
+sDL_GetAudioStreamDevice
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO SDL_AudioDeviceID
+sDL_GetAudioStreamDevice =
+  hs_bindgen_8dd61683a1d75595
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_CreateAudioStream@
+foreign import ccall safe "hs_bindgen_aca7047ab74c15f6"
+  hs_bindgen_aca7047ab74c15f6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_CreateAudioStream@
+hs_bindgen_aca7047ab74c15f6
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> IO (BG.Ptr SDL_AudioStream)
+hs_bindgen_aca7047ab74c15f6 =
+  BG.fromFFIType hs_bindgen_aca7047ab74c15f6_base
+
+-- | Create a new audio stream.
+--
+--     [Returns]: a new audio stream on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PutAudioStreamData', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamAvailable', 'sDL_FlushAudioStream', 'sDL_ClearAudioStream', 'sDL_SetAudioStreamFormat', 'sDL_DestroyAudioStream'
+--
+--     [C declaration]: @SDL_CreateAudioStream@, defined at @SDL3\/SDL_audio.h 1074:47@
+sDL_CreateAudioStream
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the format details of the input audio.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the format details of the output audio.
+  -> IO (BG.Ptr SDL_AudioStream)
+sDL_CreateAudioStream = hs_bindgen_aca7047ab74c15f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamProperties@
+foreign import ccall safe "hs_bindgen_cd9dda2135997250"
+  hs_bindgen_cd9dda2135997250_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamProperties@
+hs_bindgen_cd9dda2135997250
+  :: BG.Ptr SDL_AudioStream
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_cd9dda2135997250 =
+  BG.fromFFIType hs_bindgen_cd9dda2135997250_base
+
+-- | Get the properties associated with an audio stream.
+--
+--     The application can hang any data it wants here, but the following properties are understood by SDL:
+--
+--     * @'sDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN'@: if true (the default), the stream be automatically cleaned up when the audio subsystem quits. If set to false, the streams will persist beyond that. This property is ignored for streams created through @SDL_OpenAudioDeviceStream()@, and will always be cleaned up. Streams that are not cleaned up will still be unbound from devices when the audio subsystem quits. This property was added in SDL 3.4.0.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAudioStreamProperties@, defined at @SDL3\/SDL_audio.h 1098:46@
+sDL_GetAudioStreamProperties
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetAudioStreamProperties =
+  hs_bindgen_cd9dda2135997250
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamFormat@
+foreign import ccall safe "hs_bindgen_5011d0cad394b582"
+  hs_bindgen_5011d0cad394b582_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamFormat@
+hs_bindgen_5011d0cad394b582
+  :: BG.Ptr SDL_AudioStream
+  -> BG.Ptr SDL_AudioSpec
+  -> BG.Ptr SDL_AudioSpec
+  -> IO BG.CBool
+hs_bindgen_5011d0cad394b582 =
+  BG.fromFFIType hs_bindgen_5011d0cad394b582_base
+
+-- | Query the current format of an audio stream.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamFormat'
+--
+--     [C declaration]: @SDL_GetAudioStreamFormat@, defined at @SDL3\/SDL_audio.h 1119:34@
+sDL_GetAudioStreamFormat
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: where to store the input audio format; ignored if NULL.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: where to store the output audio format; ignored if NULL.
+  -> IO BG.CBool
+sDL_GetAudioStreamFormat =
+  hs_bindgen_5011d0cad394b582
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamFormat@
+foreign import ccall safe "hs_bindgen_b7e0d40673e5b425"
+  hs_bindgen_b7e0d40673e5b425_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamFormat@
+hs_bindgen_b7e0d40673e5b425
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> IO BG.CBool
+hs_bindgen_b7e0d40673e5b425 =
+  BG.fromFFIType hs_bindgen_b7e0d40673e5b425_base
+
+-- | Change the input and output formats of an audio stream.
+--
+--     Future calls to and SDL_GetAudioStreamAvailable and SDL_GetAudioStreamData will reflect the new format, and future calls to SDL_PutAudioStreamData must provide data in the new input formats.
+--
+--     Data that was previously queued in the stream will still be operated on in the format that was current when it was added, which is to say you can put the end of a sound file in one format to a stream, change formats for the next sound file, and start putting that new data while the previous sound file is still queued, and everything will still play back correctly.
+--
+--     If a stream is bound to a device, then the format of the side of the stream bound to a device cannot be changed (src_spec for recording devices, dst_spec for playback devices). Attempts to make a change to this side will be ignored, but this will not report an error. The other side\'s format can be changed.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamFormat', 'sDL_SetAudioStreamFrequencyRatio'
+--
+--     [C declaration]: @SDL_SetAudioStreamFormat@, defined at @SDL3\/SDL_audio.h 1156:34@
+sDL_SetAudioStreamFormat
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the format is being changed.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the new format of the audio input; if NULL, it is not changed.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the new format of the audio output; if NULL, it is not changed.
+  -> IO BG.CBool
+sDL_SetAudioStreamFormat =
+  hs_bindgen_b7e0d40673e5b425
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamFrequencyRatio@
+foreign import ccall safe "hs_bindgen_3c13c77fea7457b6"
+  hs_bindgen_3c13c77fea7457b6_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamFrequencyRatio@
+hs_bindgen_3c13c77fea7457b6
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CFloat
+hs_bindgen_3c13c77fea7457b6 =
+  BG.fromFFIType hs_bindgen_3c13c77fea7457b6_base
+
+-- | Get the frequency ratio of an audio stream.
+--
+--     [Returns]: the frequency ratio of the stream or 0.0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamFrequencyRatio'
+--
+--     [C declaration]: @SDL_GetAudioStreamFrequencyRatio@, defined at @SDL3\/SDL_audio.h 1172:35@
+sDL_GetAudioStreamFrequencyRatio
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO BG.CFloat
+sDL_GetAudioStreamFrequencyRatio =
+  hs_bindgen_3c13c77fea7457b6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamFrequencyRatio@
+foreign import ccall safe "hs_bindgen_7be7b2b980ff1f01"
+  hs_bindgen_7be7b2b980ff1f01_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamFrequencyRatio@
+hs_bindgen_7be7b2b980ff1f01
+  :: BG.Ptr SDL_AudioStream
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_7be7b2b980ff1f01 =
+  BG.fromFFIType hs_bindgen_7be7b2b980ff1f01_base
+
+-- | Change the frequency ratio of an audio stream.
+--
+--     The frequency ratio is used to adjust the rate at which input data is consumed. Changing this effectively modifies the speed and pitch of the audio. A value greater than 1.0f will play the audio faster, and at a higher pitch. A value less than 1.0f will play the audio slower, and at a lower pitch. 1.0f means play at normal speed.
+--
+--     This is applied during SDL_GetAudioStreamData, and can be continuously changed to create various effects.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamFrequencyRatio', 'sDL_SetAudioStreamFormat'
+--
+--     [C declaration]: @SDL_SetAudioStreamFrequencyRatio@, defined at @SDL3\/SDL_audio.h 1200:34@
+sDL_SetAudioStreamFrequencyRatio
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream on which the frequency ratio is being changed.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@ratio@]: the frequency ratio. 1.0 is normal speed. Must be between 0.01 and 100.
+  -> IO BG.CBool
+sDL_SetAudioStreamFrequencyRatio =
+  hs_bindgen_7be7b2b980ff1f01
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamGain@
+foreign import ccall safe "hs_bindgen_125acd9c795cad57"
+  hs_bindgen_125acd9c795cad57_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamGain@
+hs_bindgen_125acd9c795cad57
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CFloat
+hs_bindgen_125acd9c795cad57 =
+  BG.fromFFIType hs_bindgen_125acd9c795cad57_base
+
+-- | Get the gain of an audio stream.
+--
+--     The gain of a stream is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio streams default to a gain of 1.0f (no change in output).
+--
+--     [Returns]: the gain of the stream or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamGain'
+--
+--     [C declaration]: @SDL_GetAudioStreamGain@, defined at @SDL3\/SDL_audio.h 1221:35@
+sDL_GetAudioStreamGain
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO BG.CFloat
+sDL_GetAudioStreamGain = hs_bindgen_125acd9c795cad57
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamGain@
+foreign import ccall safe "hs_bindgen_5684b3f0e33987ea"
+  hs_bindgen_5684b3f0e33987ea_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamGain@
+hs_bindgen_5684b3f0e33987ea
+  :: BG.Ptr SDL_AudioStream
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_5684b3f0e33987ea =
+  BG.fromFFIType hs_bindgen_5684b3f0e33987ea_base
+
+-- | Change the gain of an audio stream.
+--
+--     The gain of a stream is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio streams default to a gain of 1.0f (no change in output).
+--
+--     This is applied during SDL_GetAudioStreamData, and can be continuously changed to create various effects.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamGain'
+--
+--     [C declaration]: @SDL_SetAudioStreamGain@, defined at @SDL3\/SDL_audio.h 1246:34@
+sDL_SetAudioStreamGain
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream on which the gain is being changed.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@gain@]: the gain. 1.0f is no change, 0.0f is silence.
+  -> IO BG.CBool
+sDL_SetAudioStreamGain = hs_bindgen_5684b3f0e33987ea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamInputChannelMap@
+foreign import ccall safe "hs_bindgen_92fa355f815c3314"
+  hs_bindgen_92fa355f815c3314_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamInputChannelMap@
+hs_bindgen_92fa355f815c3314
+  :: BG.Ptr SDL_AudioStream
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr BG.CInt)
+hs_bindgen_92fa355f815c3314 =
+  BG.fromFFIType hs_bindgen_92fa355f815c3314_base
+
+-- | Get the current input channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     Audio streams default to no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_GetAudioStreamInputChannelMap@, defined at @SDL3\/SDL_audio.h 1270:35@
+sDL_GetAudioStreamInputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+sDL_GetAudioStreamInputChannelMap =
+  hs_bindgen_92fa355f815c3314
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamOutputChannelMap@
+foreign import ccall safe "hs_bindgen_9b5ffd54b64ea0ea"
+  hs_bindgen_9b5ffd54b64ea0ea_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamOutputChannelMap@
+hs_bindgen_9b5ffd54b64ea0ea
+  :: BG.Ptr SDL_AudioStream
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr BG.CInt)
+hs_bindgen_9b5ffd54b64ea0ea =
+  BG.fromFFIType hs_bindgen_9b5ffd54b64ea0ea_base
+
+-- | Get the current output channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     Audio streams default to no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_GetAudioStreamOutputChannelMap@, defined at @SDL3\/SDL_audio.h 1294:35@
+sDL_GetAudioStreamOutputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+sDL_GetAudioStreamOutputChannelMap =
+  hs_bindgen_9b5ffd54b64ea0ea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamInputChannelMap@
+foreign import ccall safe "hs_bindgen_d47a0e77e800172e"
+  hs_bindgen_d47a0e77e800172e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamInputChannelMap@
+hs_bindgen_d47a0e77e800172e
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_d47a0e77e800172e =
+  BG.fromFFIType hs_bindgen_d47a0e77e800172e_base
+
+-- | Set the current input channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     The input channel map reorders data that is added to a stream via SDL_PutAudioStreamData. Future calls to SDL_PutAudioStreamData must provide data in the new channel order.
+--
+--     Each item in the array represents an input channel, and its value is the channel that it should be remapped to. To reverse a stereo signal\'s left and right values, you\'d have an array of @{ 1, 0 }@. It is legal to remap multiple channels to the same thing, so @{ 1, 1 }@ would duplicate the right channel to both channels of a stereo signal. An element in the channel map set to -1 instead of a valid channel will mute that channel, setting it to a silence value.
+--
+--     You cannot change the number of channels through a channel map, just reorder\/mute them.
+--
+--     Data that was previously queued in the stream will still be operated on in the order that was current when it was added, which is to say you can put the end of a sound file in one order to a stream, change orders for the next sound file, and start putting that new data while the previous sound file is still queued, and everything will still play back correctly.
+--
+--     Audio streams default to no remapping applied. Passing a NULL channel map is legal, and turns off remapping.
+--
+--     SDL will copy the channel map; the caller does not have to save this array after this call.
+--
+--     If @count@ is not equal to the current number of channels in the audio stream\'s format, this will fail. This is a safety measure to make sure a race condition hasn\'t changed the format while this call is setting the channel map.
+--
+--     Unlike attempting to change the stream\'s format, the input channel map on a stream bound to a recording device is permitted to change at any time; any data added to the stream from the device after this call will have the new mapping, but previously-added data will still have the prior mapping.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running. Don\'t change the stream\'s format to have a different number of channels from a different thread at the same time, though!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_SetAudioStreamInputChannelMap@, defined at @SDL3\/SDL_audio.h 1354:34@
+sDL_SetAudioStreamInputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to change.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@chmap@]: the new channel map, NULL to reset to default.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: The number of channels in the map.
+  -> IO BG.CBool
+sDL_SetAudioStreamInputChannelMap =
+  hs_bindgen_d47a0e77e800172e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamOutputChannelMap@
+foreign import ccall safe "hs_bindgen_b53ca7ca85639b18"
+  hs_bindgen_b53ca7ca85639b18_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamOutputChannelMap@
+hs_bindgen_b53ca7ca85639b18
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_b53ca7ca85639b18 =
+  BG.fromFFIType hs_bindgen_b53ca7ca85639b18_base
+
+-- | Set the current output channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     The output channel map reorders data that is leaving a stream via SDL_GetAudioStreamData.
+--
+--     Each item in the array represents an input channel, and its value is the channel that it should be remapped to. To reverse a stereo signal\'s left and right values, you\'d have an array of @{ 1, 0 }@. It is legal to remap multiple channels to the same thing, so @{ 1, 1 }@ would duplicate the right channel to both channels of a stereo signal. An element in the channel map set to -1 instead of a valid channel will mute that channel, setting it to a silence value.
+--
+--     You cannot change the number of channels through a channel map, just reorder\/mute them.
+--
+--     The output channel map can be changed at any time, as output remapping is applied during SDL_GetAudioStreamData.
+--
+--     Audio streams default to no remapping applied. Passing a NULL channel map is legal, and turns off remapping.
+--
+--     SDL will copy the channel map; the caller does not have to save this array after this call.
+--
+--     If @count@ is not equal to the current number of channels in the audio stream\'s format, this will fail. This is a safety measure to make sure a race condition hasn\'t changed the format while this call is setting the channel map.
+--
+--     Unlike attempting to change the stream\'s format, the output channel map on a stream bound to a recording device is permitted to change at any time; any data added to the stream after this call will have the new mapping, but previously-added data will still have the prior mapping. When the channel map doesn\'t match the hardware\'s channel layout, SDL will convert the data before feeding it to the device for playback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running. Don\'t change the stream\'s format to have a different number of channels from a a different thread at the same time, though!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_SetAudioStreamOutputChannelMap@, defined at @SDL3\/SDL_audio.h 1412:34@
+sDL_SetAudioStreamOutputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to change.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@chmap@]: the new channel map, NULL to reset to default.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: The number of channels in the map.
+  -> IO BG.CBool
+sDL_SetAudioStreamOutputChannelMap =
+  hs_bindgen_b53ca7ca85639b18
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_PutAudioStreamData@
+foreign import ccall safe "hs_bindgen_aaa4efec7abd5cd4"
+  hs_bindgen_aaa4efec7abd5cd4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_PutAudioStreamData@
+hs_bindgen_aaa4efec7abd5cd4
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_aaa4efec7abd5cd4 =
+  BG.fromFFIType hs_bindgen_aaa4efec7abd5cd4_base
+
+-- | Add data to the stream.
+--
+--     This data must match the format\/channels\/samplerate specified in the latest call to SDL_SetAudioStreamFormat, or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     Note that this call simply copies the unconverted data for later. This is different than SDL2, where data was converted during the Put call and the Get call would just dequeue the previously-converted data.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_FlushAudioStream', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued'
+--
+--     [C declaration]: @SDL_PutAudioStreamData@, defined at @SDL3\/SDL_audio.h 1442:34@
+sDL_PutAudioStreamData
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@buf@]: a pointer to the audio data to add.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@len@]: the number of bytes to write to the stream.
+  -> IO BG.CBool
+sDL_PutAudioStreamData = hs_bindgen_aaa4efec7abd5cd4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_PutAudioStreamDataNoCopy@
+foreign import ccall safe "hs_bindgen_619ed51504fee204"
+  hs_bindgen_619ed51504fee204_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_PutAudioStreamDataNoCopy@
+hs_bindgen_619ed51504fee204
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> SDL_AudioStreamDataCompleteCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_619ed51504fee204 =
+  BG.fromFFIType hs_bindgen_619ed51504fee204_base
+
+-- | Add external data to an audio stream without copying it.
+--
+--     Unlike @SDL_PutAudioStreamData()@, this function does not make a copy of the provided data, instead storing the provided pointer. This means that the put operation does not need to allocate and copy the data, but the original data must remain available until the stream is done with it, either by being read from the stream in its entirety, or a call to @SDL_ClearAudioStream()@ or @SDL_DestroyAudioStream()@.
+--
+--     The data must match the format\/channels\/samplerate specified in the latest call to SDL_SetAudioStreamFormat, or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     An optional callback may be provided, which is called when the stream no longer needs the data. Once this callback fires, the stream will not access the data again. This callback will fire for any reason the data is no longer needed, including clearing or destroying the stream.
+--
+--     Note that there is still an allocation to store tracking information, so this function is more efficient for larger blocks of data. If you\'re planning to put a few samples at a time, it will be more efficient to use @SDL_PutAudioStreamData()@, which allocates and buffers in blocks.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_FlushAudioStream', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued'
+--
+--     [C declaration]: @SDL_PutAudioStreamDataNoCopy@, defined at @SDL3\/SDL_audio.h 1519:34@
+sDL_PutAudioStreamDataNoCopy
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@buf@]: a pointer to the audio data to add.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@len@]: the number of bytes to add to the stream.
+  -> SDL_AudioStreamDataCompleteCallback
+  -- ^
+  --
+  --           [@callback@]: the callback function to call when the data is no longer needed by the stream. May be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO BG.CBool
+sDL_PutAudioStreamDataNoCopy =
+  hs_bindgen_619ed51504fee204
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_PutAudioStreamPlanarData@
+foreign import ccall safe "hs_bindgen_a35f9b9040c608a3"
+  hs_bindgen_a35f9b9040c608a3_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_PutAudioStreamPlanarData@
+hs_bindgen_a35f9b9040c608a3
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst (PtrConst.PtrConst BG.Void)
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_a35f9b9040c608a3 =
+  BG.fromFFIType hs_bindgen_a35f9b9040c608a3_base
+
+-- | Add data to the stream with each channel in a separate array.
+--
+--     This data must match the format\/channels\/samplerate specified in the latest call to SDL_SetAudioStreamFormat, or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     The data will be interleaved and queued. Note that 'SDL_AudioStream' only operates on interleaved data, so this is simply a convenience function for easily queueing data from sources that provide separate arrays. There is no equivalent function to retrieve planar data.
+--
+--     The arrays in @channel_buffers@ are ordered as they are to be interleaved; the first array will be the first sample in the interleaved data. Any individual array may be NULL; in this case, silence will be interleaved for that channel.
+--
+--     @num_channels@ specifies how many arrays are in @channel_buffers@. This can be used as a safety to prevent overflow, in case the stream format has changed elsewhere. If more channels are specified than the current input spec, they are ignored. If less channels are specified, the missing arrays are treated as if they are NULL (silence is written to those channels). If the count is -1, SDL will assume the array count matches the current input spec.
+--
+--     Note that @num_samples@ is the number of /samples per array/. This can also be thought of as the number of /sample frames/ to be queued. A value of 1 with stereo arrays will queue two samples to the stream. This is different than SDL_PutAudioStreamData, which wants the size of a single array in bytes.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_FlushAudioStream', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued'
+--
+--     [C declaration]: @SDL_PutAudioStreamPlanarData@, defined at @SDL3\/SDL_audio.h 1572:34@
+sDL_PutAudioStreamPlanarData
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst (PtrConst.PtrConst BG.Void)
+  -- ^
+  --
+  --           [@channel_buffers@]: a pointer to an array of arrays, one array per channel.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_channels@]: the number of arrays in @channel_buffers@ or -1.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_samples@]: the number of /samples/ per array to write to the stream.
+  -> IO BG.CBool
+sDL_PutAudioStreamPlanarData =
+  hs_bindgen_a35f9b9040c608a3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamData@
+foreign import ccall safe "hs_bindgen_80c78d4a6767c5c1"
+  hs_bindgen_80c78d4a6767c5c1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamData@
+hs_bindgen_80c78d4a6767c5c1
+  :: BG.Ptr SDL_AudioStream
+  -> BG.Ptr BG.Void
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_80c78d4a6767c5c1 =
+  BG.fromFFIType hs_bindgen_80c78d4a6767c5c1_base
+
+-- | Get converted\/resampled data from the stream.
+--
+--     The input\/output data format\/channels\/samplerate is specified when creating the stream, and can be changed after creation by calling SDL_SetAudioStreamFormat.
+--
+--     Note that any conversion and resampling necessary is done during this call, and SDL_PutAudioStreamData simply queues unconverted data for later. This is different than SDL2, where that work was done while inputting new data to the stream and requesting the output just copied the converted data.
+--
+--     [Returns]: the number of bytes read from the stream or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_GetAudioStreamAvailable', 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_GetAudioStreamData@, defined at @SDL3\/SDL_audio.h 1602:33@
+sDL_GetAudioStreamData
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio is being requested from.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@buf@]: a buffer to fill with audio data.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@len@]: the maximum number of bytes to fill.
+  -> IO BG.CInt
+sDL_GetAudioStreamData = hs_bindgen_80c78d4a6767c5c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamAvailable@
+foreign import ccall safe "hs_bindgen_2ddc379eb0f7050b"
+  hs_bindgen_2ddc379eb0f7050b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamAvailable@
+hs_bindgen_2ddc379eb0f7050b
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CInt
+hs_bindgen_2ddc379eb0f7050b =
+  BG.fromFFIType hs_bindgen_2ddc379eb0f7050b_base
+
+-- | Get the number of converted\/resampled bytes available.
+--
+--     The stream may be buffering data behind the scenes until it has enough to resample correctly, so this number might be lower than what you expect, or even be zero. Add more data or flush the stream if you need the data now.
+--
+--     If the stream has so much data that it would overflow an int, the return value is clamped to a maximum value, but no queued data is lost; if there are gigabytes of data queued, the app might need to read some of it with SDL_GetAudioStreamData before this function\'s return value is no longer clamped.
+--
+--     [Returns]: the number of converted\/resampled bytes available or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamData', 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_GetAudioStreamAvailable@, defined at @SDL3\/SDL_audio.h 1628:33@
+sDL_GetAudioStreamAvailable
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO BG.CInt
+sDL_GetAudioStreamAvailable =
+  hs_bindgen_2ddc379eb0f7050b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamQueued@
+foreign import ccall safe "hs_bindgen_3c01027250fa0224"
+  hs_bindgen_3c01027250fa0224_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioStreamQueued@
+hs_bindgen_3c01027250fa0224
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CInt
+hs_bindgen_3c01027250fa0224 =
+  BG.fromFFIType hs_bindgen_3c01027250fa0224_base
+
+-- | Get the number of bytes currently queued.
+--
+--     This is the number of bytes put into a stream as input, not the number that can be retrieved as output. Because of several details, it\'s not possible to calculate one number directly from the other. If you need to know how much usable data can be retrieved right now, you should use @SDL_GetAudioStreamAvailable()@ and not this function.
+--
+--     Note that audio streams can change their input format at any time, even if there is still data queued in a different format, so the returned byte count will not necessarily match the number of /sample frames/ available. Users of this API should be aware of format changes they make when feeding a stream and plan accordingly.
+--
+--     Queued data is not converted until it is consumed by SDL_GetAudioStreamData, so this value should be representative of the exact data that was put into the stream.
+--
+--     If the stream has so much data that it would overflow an int, the return value is clamped to a maximum value, but no queued data is lost; if there are gigabytes of data queued, the app might need to read some of it with SDL_GetAudioStreamData before this function\'s return value is no longer clamped.
+--
+--     [Returns]: the number of bytes queued or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PutAudioStreamData', 'sDL_ClearAudioStream'
+--
+--     [C declaration]: @SDL_GetAudioStreamQueued@, defined at @SDL3\/SDL_audio.h 1667:33@
+sDL_GetAudioStreamQueued
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO BG.CInt
+sDL_GetAudioStreamQueued =
+  hs_bindgen_3c01027250fa0224
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_FlushAudioStream@
+foreign import ccall safe "hs_bindgen_a08de3ff3d4b6b48"
+  hs_bindgen_a08de3ff3d4b6b48_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_FlushAudioStream@
+hs_bindgen_a08de3ff3d4b6b48
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_a08de3ff3d4b6b48 =
+  BG.fromFFIType hs_bindgen_a08de3ff3d4b6b48_base
+
+-- | Tell the stream that you\'re done sending data, and anything being buffered should be converted\/resampled and made available immediately.
+--
+--     It is legal to add more data to a stream after flushing, but there may be audio gaps in the output. Generally this is intended to signal the end of input, so the complete output becomes available.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_FlushAudioStream@, defined at @SDL3\/SDL_audio.h 1688:34@
+sDL_FlushAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to flush.
+  -> IO BG.CBool
+sDL_FlushAudioStream = hs_bindgen_a08de3ff3d4b6b48
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_ClearAudioStream@
+foreign import ccall safe "hs_bindgen_495b0c63dde7c64f"
+  hs_bindgen_495b0c63dde7c64f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_ClearAudioStream@
+hs_bindgen_495b0c63dde7c64f
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_495b0c63dde7c64f =
+  BG.fromFFIType hs_bindgen_495b0c63dde7c64f_base
+
+-- | Clear any pending data in the stream.
+--
+--     This drops any queued data, so there will be nothing to read from the stream until more is added.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamAvailable', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued', 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_ClearAudioStream@, defined at @SDL3\/SDL_audio.h 1709:34@
+sDL_ClearAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to clear.
+  -> IO BG.CBool
+sDL_ClearAudioStream = hs_bindgen_495b0c63dde7c64f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_PauseAudioStreamDevice@
+foreign import ccall safe "hs_bindgen_b5ae37aa80b742a5"
+  hs_bindgen_b5ae37aa80b742a5_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_PauseAudioStreamDevice@
+hs_bindgen_b5ae37aa80b742a5
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_b5ae37aa80b742a5 =
+  BG.fromFFIType hs_bindgen_b5ae37aa80b742a5_base
+
+-- | Use this function to pause audio playback on the audio device associated with an audio stream.
+--
+--     This function pauses audio processing for a given device. Any bound audio streams will not progress, and no audio will be generated. Pausing one device does not prevent other unpaused devices from running.
+--
+--     Pausing a device can be useful to halt all audio without unbinding all the audio streams. This might be useful while a game is paused, or a level is loading, etc.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResumeAudioStreamDevice'
+--
+--     [C declaration]: @SDL_PauseAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1733:34@
+sDL_PauseAudioStreamDevice
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to pause.
+  -> IO BG.CBool
+sDL_PauseAudioStreamDevice =
+  hs_bindgen_b5ae37aa80b742a5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_ResumeAudioStreamDevice@
+foreign import ccall safe "hs_bindgen_df0b3314efa54fdd"
+  hs_bindgen_df0b3314efa54fdd_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_ResumeAudioStreamDevice@
+hs_bindgen_df0b3314efa54fdd
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_df0b3314efa54fdd =
+  BG.fromFFIType hs_bindgen_df0b3314efa54fdd_base
+
+-- | Use this function to unpause audio playback on the audio device associated with an audio stream.
+--
+--     This function unpauses audio processing for a given device that has previously been paused. Once unpaused, any bound audio streams will begin to progress again, and audio can be generated.
+--
+--     SDL_OpenAudioDeviceStream opens audio devices in a paused state, so this function call is required for audio playback to begin on such devices.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseAudioStreamDevice'
+--
+--     [C declaration]: @SDL_ResumeAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1756:34@
+sDL_ResumeAudioStreamDevice
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to resume.
+  -> IO BG.CBool
+sDL_ResumeAudioStreamDevice =
+  hs_bindgen_df0b3314efa54fdd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_AudioStreamDevicePaused@
+foreign import ccall safe "hs_bindgen_1ff005643c24e6c0"
+  hs_bindgen_1ff005643c24e6c0_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_AudioStreamDevicePaused@
+hs_bindgen_1ff005643c24e6c0
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_1ff005643c24e6c0 =
+  BG.fromFFIType hs_bindgen_1ff005643c24e6c0_base
+
+-- | Use this function to query if an audio device associated with a stream is paused.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow.
+--
+--     [Returns]: true if device is valid and paused, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseAudioStreamDevice', 'sDL_ResumeAudioStreamDevice'
+--
+--     [C declaration]: @SDL_AudioStreamDevicePaused@, defined at @SDL3\/SDL_audio.h 1775:34@
+sDL_AudioStreamDevicePaused
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to query.
+  -> IO BG.CBool
+sDL_AudioStreamDevicePaused =
+  hs_bindgen_1ff005643c24e6c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_LockAudioStream@
+foreign import ccall safe "hs_bindgen_3d4874ba18717a32"
+  hs_bindgen_3d4874ba18717a32_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_LockAudioStream@
+hs_bindgen_3d4874ba18717a32
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_3d4874ba18717a32 =
+  BG.fromFFIType hs_bindgen_3d4874ba18717a32_base
+
+-- | Lock an audio stream for serialized access.
+--
+--     Each 'SDL_AudioStream' has an internal mutex it uses to protect its data structures from threading conflicts. This function allows an app to lock that mutex, which could be useful if registering callbacks on this stream.
+--
+--     One does not need to lock a stream to use in it most cases, as the stream manages this lock internally. However, this lock is held during callbacks, which may run from arbitrary threads at any time, so if an app needs to protect shared data during those callbacks, locking the stream guarantees that the callback is not running while the lock is held.
+--
+--     As this is just a wrapper over SDL_LockMutex for an internal lock; it has all the same attributes (recursive locks are allowed, etc).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UnlockAudioStream'
+--
+--     [C declaration]: @SDL_LockAudioStream@, defined at @SDL3\/SDL_audio.h 1804:34@
+sDL_LockAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to lock.
+  -> IO BG.CBool
+sDL_LockAudioStream = hs_bindgen_3d4874ba18717a32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_UnlockAudioStream@
+foreign import ccall safe "hs_bindgen_0175d2c579f38af7"
+  hs_bindgen_0175d2c579f38af7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_UnlockAudioStream@
+hs_bindgen_0175d2c579f38af7
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_0175d2c579f38af7 =
+  BG.fromFFIType hs_bindgen_0175d2c579f38af7_base
+
+-- | Unlock an audio stream for serialized access.
+--
+--     This unlocks an audio stream after a call to SDL_LockAudioStream.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: You should only call this from the same thread that previously called SDL_LockAudioStream.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockAudioStream'
+--
+--     [C declaration]: @SDL_UnlockAudioStream@, defined at @SDL3\/SDL_audio.h 1823:34@
+sDL_UnlockAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to unlock.
+  -> IO BG.CBool
+sDL_UnlockAudioStream = hs_bindgen_0175d2c579f38af7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamGetCallback@
+foreign import ccall safe "hs_bindgen_65648a5a73743f2d"
+  hs_bindgen_65648a5a73743f2d_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamGetCallback@
+hs_bindgen_65648a5a73743f2d
+  :: BG.Ptr SDL_AudioStream
+  -> SDL_AudioStreamCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_65648a5a73743f2d =
+  BG.fromFFIType hs_bindgen_65648a5a73743f2d_base
+
+-- | Set a callback that runs when data is requested from an audio stream.
+--
+--     This callback is called /before/ data is obtained from the stream, giving the callback the chance to add more on-demand.
+--
+--     The callback can (optionally) call @SDL_PutAudioStreamData()@ to add more audio to the stream during this call; if needed, the request that triggered this callback will obtain the new data immediately.
+--
+--     The callback\'s @additional_amount@ argument is roughly how many bytes of /unconverted/ data (in the stream\'s input format) is needed by the caller, although this may overestimate a little for safety. This takes into account how much is already in the stream and only asks for any extra necessary to resolve the request, which means the callback may be asked for zero bytes, and a different amount on each call.
+--
+--     The callback is not required to supply exact amounts; it is allowed to supply too much or too little or none at all. The caller will get what\'s available, up to the amount they requested, regardless of this callback\'s outcome.
+--
+--     Clearing or flushing an audio stream does not call this callback.
+--
+--     This function obtains the stream\'s lock, which means any existing callback (get or put) in progress will finish running before setting the new callback.
+--
+--     Setting a NULL function turns off the callback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information. This only fails if @stream@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamPutCallback'
+--
+--     [C declaration]: @SDL_SetAudioStreamGetCallback@, defined at @SDL3\/SDL_audio.h 1911:34@
+sDL_SetAudioStreamGetCallback
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to set the new callback on.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: the new callback function to call when data is requested from the stream.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO BG.CBool
+sDL_SetAudioStreamGetCallback =
+  hs_bindgen_65648a5a73743f2d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamPutCallback@
+foreign import ccall safe "hs_bindgen_61ea9930449caa3b"
+  hs_bindgen_61ea9930449caa3b_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioStreamPutCallback@
+hs_bindgen_61ea9930449caa3b
+  :: BG.Ptr SDL_AudioStream
+  -> SDL_AudioStreamCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_61ea9930449caa3b =
+  BG.fromFFIType hs_bindgen_61ea9930449caa3b_base
+
+-- | Set a callback that runs when data is added to an audio stream.
+--
+--     This callback is called /after/ the data is added to the stream, giving the callback the chance to obtain it immediately.
+--
+--     The callback can (optionally) call @SDL_GetAudioStreamData()@ to obtain audio from the stream during this call.
+--
+--     The callback\'s @additional_amount@ argument is how many bytes of /converted/ data (in the stream\'s output format) was provided by the caller, although this may underestimate a little for safety. This value might be less than what is currently available in the stream, if data was already there, and might be less than the caller provided if the stream needs to keep a buffer to aid in resampling. Which means the callback may be provided with zero bytes, and a different amount on each call.
+--
+--     The callback may call SDL_GetAudioStreamAvailable to see the total amount currently available to read from the stream, instead of the total provided by the current call.
+--
+--     The callback is not required to obtain all data. It is allowed to read less or none at all. Anything not read now simply remains in the stream for later access.
+--
+--     Clearing or flushing an audio stream does not call this callback.
+--
+--     This function obtains the stream\'s lock, which means any existing callback (get or put) in progress will finish running before setting the new callback.
+--
+--     Setting a NULL function turns off the callback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information. This only fails if @stream@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamGetCallback'
+--
+--     [C declaration]: @SDL_SetAudioStreamPutCallback@, defined at @SDL3\/SDL_audio.h 1960:34@
+sDL_SetAudioStreamPutCallback
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to set the new callback on.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: the new callback function to call when data is added to the stream.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO BG.CBool
+sDL_SetAudioStreamPutCallback =
+  hs_bindgen_61ea9930449caa3b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_DestroyAudioStream@
+foreign import ccall safe "hs_bindgen_2f2920f372de3f91"
+  hs_bindgen_2f2920f372de3f91_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_DestroyAudioStream@
+hs_bindgen_2f2920f372de3f91
+  :: BG.Ptr SDL_AudioStream
+  -> IO ()
+hs_bindgen_2f2920f372de3f91 =
+  BG.fromFFIType hs_bindgen_2f2920f372de3f91_base
+
+-- | Free an audio stream.
+--
+--     This will release all allocated data, including any audio that is still queued. You do not need to manually clear the stream first.
+--
+--     If this stream was bound to an audio device, it is unbound during this call. If this stream was created with SDL_OpenAudioDeviceStream, the audio device that was opened alongside this stream\'s creation will be closed, too.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAudioStream'
+--
+--     [C declaration]: @SDL_DestroyAudioStream@, defined at @SDL3\/SDL_audio.h 1982:34@
+sDL_DestroyAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to destroy.
+  -> IO ()
+sDL_DestroyAudioStream = hs_bindgen_2f2920f372de3f91
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_OpenAudioDeviceStream@
+foreign import ccall safe "hs_bindgen_41a1f387b2d98901"
+  hs_bindgen_41a1f387b2d98901_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_OpenAudioDeviceStream@
+hs_bindgen_41a1f387b2d98901
+  :: SDL_AudioDeviceID
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> SDL_AudioStreamCallback
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr SDL_AudioStream)
+hs_bindgen_41a1f387b2d98901 =
+  BG.fromFFIType hs_bindgen_41a1f387b2d98901_base
+
+-- | Convenience function for straightforward audio init for the common case.
+--
+--     If all your app intends to do is provide a single source of PCM audio, this function allows you to do all your audio setup in a single call.
+--
+--     This is also intended to be a clean means to migrate apps from SDL2.
+--
+--     This function will open an audio device, create a stream and bind it. Unlike other methods of setup, the audio device will be closed when this stream is destroyed, so the app can treat the returned 'SDL_AudioStream' as the only object needed to manage audio playback.
+--
+--     Also unlike other functions, the audio device begins paused. This is to map more closely to SDL2-style behavior, since there is no extra step here to bind a stream to begin audio flowing. The audio device should be resumed with @SDL_ResumeAudioStreamDevice()@.
+--
+--     This function works with both playback and recording devices.
+--
+--     The @spec@ parameter represents the app\'s side of the audio stream. That is, for recording audio, this will be the output format, and for playing audio, this will be the input format. If spec is NULL, the system will choose the format, and the app can use @SDL_GetAudioStreamFormat()@ to obtain this information later.
+--
+--     If you don\'t care about opening a specific audio device, you can (and probably /should/), use SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK for playback and SDL_AUDIO_DEVICE_DEFAULT_RECORDING for recording.
+--
+--     One can optionally provide a callback function; if NULL, the app is expected to queue audio data for playback (or unqueue audio data if capturing). Otherwise, the callback will begin to fire once the device is unpaused.
+--
+--     Destroying the returned stream with SDL_DestroyAudioStream will also close the audio device associated with this stream.
+--
+--     [Returns]: an audio stream on success, ready to use, or NULL on failure; call SDL_GetError() for more information. When done with this stream, call SDL_DestroyAudioStream to free resources and close the device.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamDevice', 'sDL_ResumeAudioStreamDevice'
+--
+--     [C declaration]: @SDL_OpenAudioDeviceStream@, defined at @SDL3\/SDL_audio.h 2045:47@
+sDL_OpenAudioDeviceStream
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: the audio stream\'s data format. Can be NULL.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: a callback where the app will provide new data for playback, or receive new data for recording. Can be NULL, in which case the app will need to call SDL_PutAudioStreamData or SDL_GetAudioStreamData as necessary.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: app-controlled pointer passed to callback. Can be NULL. Ignored if callback is NULL.
+  -> IO (BG.Ptr SDL_AudioStream)
+sDL_OpenAudioDeviceStream =
+  hs_bindgen_41a1f387b2d98901
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioPostmixCallback@
+foreign import ccall safe "hs_bindgen_4e2802e9ed6e7f25"
+  hs_bindgen_4e2802e9ed6e7f25_base
+    :: BG.Word32
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_SetAudioPostmixCallback@
+hs_bindgen_4e2802e9ed6e7f25
+  :: SDL_AudioDeviceID
+  -> SDL_AudioPostmixCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_4e2802e9ed6e7f25 =
+  BG.fromFFIType hs_bindgen_4e2802e9ed6e7f25_base
+
+-- | Set a callback that fires when data is about to be fed to an audio device.
+--
+--     This is useful for accessing the final mix, perhaps for writing a visualizer or applying a final effect to the audio data before playback.
+--
+--     The buffer is the final mix of all bound audio streams on an opened device; this callback will fire regularly for any device that is both opened and unpaused. If there is no new data to mix, either because no streams are bound to the device or all the streams are empty, this callback will still fire with the entire buffer set to silence.
+--
+--     This callback is allowed to make changes to the data; the contents of the buffer after this call is what is ultimately passed along to the hardware.
+--
+--     The callback is always provided the data in float format (values from -1.0f to 1.0f), but the number of channels or sample rate may be different than the format the app requested when opening the device; SDL might have had to manage a conversion behind the scenes, or the playback might have jumped to new physical hardware when a system default changed, etc. These details may change between calls. Accordingly, the size of the buffer might change between calls as well.
+--
+--     This callback can run at any time, and from any thread; if you need to serialize access to your app\'s data, you should provide and use a mutex or other synchronization device.
+--
+--     All of this to say: there are specific needs this callback can fulfill, but it is not the simplest interface. Apps should generally provide audio in their preferred format through an 'SDL_AudioStream' and let SDL handle the difference.
+--
+--     This function is extremely time-sensitive; the callback should do the least amount of work possible and return as quickly as it can. The longer the callback runs, the higher the risk of audio dropouts or other problems.
+--
+--     This function will block until the audio device is in between iterations, so any existing callback that might be running will finish before this function sets the new callback and returns.
+--
+--     Setting a NULL callback function disables any previously-set callback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetAudioPostmixCallback@, defined at @SDL3\/SDL_audio.h 2136:34@
+sDL_SetAudioPostmixCallback
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the ID of an opened audio device.
+  -> SDL_AudioPostmixCallback
+  -- ^
+  --
+  --           [@callback@]: a callback function to be called. Can be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: app-controlled pointer passed to callback. Can be NULL.
+  -> IO BG.CBool
+sDL_SetAudioPostmixCallback =
+  hs_bindgen_4e2802e9ed6e7f25
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_LoadWAV_IO@
+foreign import ccall safe "hs_bindgen_a910288634dd93c9"
+  hs_bindgen_a910288634dd93c9_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_LoadWAV_IO@
+hs_bindgen_a910288634dd93c9
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> BG.Ptr SDL_AudioSpec
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_a910288634dd93c9 =
+  BG.fromFFIType hs_bindgen_a910288634dd93c9_base
+
+-- | Load the audio data of a WAVE file into memory.
+--
+--     Loading a WAVE file requires @src@, @spec@, @audio_buf@ and @audio_len@ to be valid pointers. The entire data portion of the file is then loaded into memory and decoded if necessary.
+--
+--     Supported formats are RIFF WAVE files with the formats PCM (8, 16, 24, and 32 bits), IEEE Float (32 bits), Microsoft ADPCM and IMA ADPCM (4 bits), and A-law and mu-law (8 bits). Other formats are currently unsupported and cause an error.
+--
+--     If this function succeeds, the return value is zero and the pointer to the audio data allocated by the function is written to @audio_buf@ and its length in bytes to @audio_len@. The 'SDL_AudioSpec' members @freq@, @channels@, and @format@ are set to the values of the audio data in the buffer.
+--
+--     It\'s necessary to use SDL_free() to free the audio data returned in @audio_buf@ when it is no longer used.
+--
+--     Because of the underspecification of the .WAV format, there are many problematic files in the wild that cause issues with strict decoders. To provide compatibility with these files, this decoder is lenient in regards to the truncation of the file, the fact chunk, and the size of the RIFF chunk. The hints @SDL_HINT_WAVE_RIFF_CHUNK_SIZE@, @SDL_HINT_WAVE_TRUNCATION@, and @SDL_HINT_WAVE_FACT_CHUNK@ can be used to tune the behavior of the loading process.
+--
+--     Any file that is invalid (due to truncation, corruption, or wrong values in the headers), too big, or unsupported causes an error. Additionally, any critical I\/O error from the data source will terminate the loading process with an error. The function returns NULL on error and in all cases (with the exception of @src@ being NULL), an appropriate error message will be set.
+--
+--     It is required that the data source supports seeking.
+--
+--     Example:
+--
+--     @
+--     SDL_LoadWAV_IO(SDL_IOFromFile(\"sample.wav\", \"rb\"), true, &spec, &buf, &len);
+--     @
+--
+--     Note that the SDL_LoadWAV function does this same thing for you, but in a less messy way:
+--
+--     @
+--     SDL_LoadWAV(\"sample.wav\", &spec, &buf, &len);
+--     @
+--
+--     This function returns false if the .WAV file cannot be opened, uses an unknown data format, or is corrupt; call SDL_GetError() for more information.
+--
+--     [Returns]: true on success. @audio_buf@ will be filled with a pointer to an allocated buffer containing the audio data, and @audio_len@ is filled with the length of that audio buffer in bytes.
+--
+--     When the application is done with the data returned in @audio_buf@, it should call SDL_free() to dispose of it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_free, 'sDL_LoadWAV'
+--
+--     [C declaration]: @SDL_LoadWAV_IO@, defined at @SDL3\/SDL_audio.h 2217:34@
+sDL_LoadWAV_IO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data source for the WAVE data.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: a pointer to an 'SDL_AudioSpec' that will be set to the WAVE data\'s format details on successful return.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@audio_buf@]: a pointer filled with the audio data, allocated by the function.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@audio_len@]: a pointer filled with the length of the audio data buffer in bytes.
+  -> IO BG.CBool
+sDL_LoadWAV_IO = hs_bindgen_a910288634dd93c9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_LoadWAV@
+foreign import ccall safe "hs_bindgen_9dc1494e309920f0"
+  hs_bindgen_9dc1494e309920f0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_LoadWAV@
+hs_bindgen_9dc1494e309920f0
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL_AudioSpec
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_9dc1494e309920f0 =
+  BG.fromFFIType hs_bindgen_9dc1494e309920f0_base
+
+-- | Loads a WAV from a file path.
+--
+--     This is a convenience function that is effectively the same as:
+--
+--     @
+--     SDL_LoadWAV_IO(SDL_IOFromFile(path, \"rb\"), true, spec, audio_buf, audio_len);
+--     @
+--
+--     This function returns false if the .WAV file cannot be opened, uses an unknown data format, or is corrupt; call SDL_GetError() for more information.
+--
+--     [Returns]: true on success. @audio_buf@ will be filled with a pointer to an allocated buffer containing the audio data, and @audio_len@ is filled with the length of that audio buffer in bytes.
+--
+--     When the application is done with the data returned in @audio_buf@, it should call SDL_free() to dispose of it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_free, 'sDL_LoadWAV_IO'
+--
+--     [C declaration]: @SDL_LoadWAV@, defined at @SDL3\/SDL_audio.h 2253:34@
+sDL_LoadWAV
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the file path of the WAV file to open.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: a pointer to an 'SDL_AudioSpec' that will be set to the WAVE data\'s format details on successful return.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@audio_buf@]: a pointer filled with the audio data, allocated by the function.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@audio_len@]: a pointer filled with the length of the audio data buffer in bytes.
+  -> IO BG.CBool
+sDL_LoadWAV = hs_bindgen_9dc1494e309920f0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_MixAudio@
+foreign import ccall safe "hs_bindgen_f90c9509d9c249ee"
+  hs_bindgen_f90c9509d9c249ee_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_MixAudio@
+hs_bindgen_f90c9509d9c249ee
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL_AudioFormat
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_f90c9509d9c249ee =
+  BG.fromFFIType hs_bindgen_f90c9509d9c249ee_base
+
+-- | Mix audio data in a specified format.
+--
+--     This takes an audio buffer @src@ of @len@ bytes of @format@ data and mixes it into @dst@, performing addition, volume adjustment, and overflow clipping. The buffer pointed to by @dst@ must also be @len@ bytes of @format@ data.
+--
+--     This is provided for convenience you can mix your own audio data.
+--
+--     Do not use this function for mixing together more than two streams of sample data. The output from repeated application of this function may be distorted by clipping, because there is no accumulator with greater range than the input (not to mention this being an inefficient way of doing it).
+--
+--     It is a common misconception that this function is required to write audio data to an output stream in an audio callback. While you can do that, @SDL_MixAudio()@ is really only needed when you\'re mixing a single audio stream with a volume adjustment.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_MixAudio@, defined at @SDL3\/SDL_audio.h 2289:34@
+sDL_MixAudio
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@dst@]: the destination for the mixed audio.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@src@]: the source audio buffer to be mixed.
+  -> SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the 'SDL_AudioFormat' structure representing the desired audio format.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@len@]: the length of the audio buffer in bytes.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@volume@]: ranges from 0.0 - 1.0, and should be set to 1.0 for full audio volume.
+  -> IO BG.CBool
+sDL_MixAudio = hs_bindgen_f90c9509d9c249ee
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_ConvertAudioSamples@
+foreign import ccall safe "hs_bindgen_ee64493d4496844f"
+  hs_bindgen_ee64493d4496844f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_ConvertAudioSamples@
+hs_bindgen_ee64493d4496844f
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_ee64493d4496844f =
+  BG.fromFFIType hs_bindgen_ee64493d4496844f_base
+
+-- | Convert some audio data of one format to another format.
+--
+--     Please note that this function is for convenience, but should not be used to resample audio in blocks, as it will introduce audio artifacts on the boundaries. You should only use this function if you are converting audio data in its entirety in one call. If you want to convert audio in smaller chunks, use an 'SDL_AudioStream', which is designed for this situation.
+--
+--     Internally, this function creates and destroys an 'SDL_AudioStream' on each use, so it\'s also less efficient than using one directly, if you need to convert multiple times.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ConvertAudioSamples@, defined at @SDL3\/SDL_audio.h 2319:34@
+sDL_ConvertAudioSamples
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the format details of the input audio.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@src_data@]: the audio data to be converted.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@src_len@]: the len of src_data.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the format details of the output audio.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@dst_data@]: will be filled with a pointer to converted audio data, which should be freed with SDL_free(). On error, it will be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dst_len@]: will be filled with the len of dst_data.
+  -> IO BG.CBool
+sDL_ConvertAudioSamples = hs_bindgen_ee64493d4496844f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioFormatName@
+foreign import ccall safe "hs_bindgen_427a7131d02ce29b"
+  hs_bindgen_427a7131d02ce29b_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetAudioFormatName@
+hs_bindgen_427a7131d02ce29b
+  :: SDL_AudioFormat
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_427a7131d02ce29b =
+  BG.fromFFIType hs_bindgen_427a7131d02ce29b_base
+
+-- | Get the human readable name of an audio format.
+--
+--     [Returns]: the human readable name of the specified audio format or \"SDL_AUDIO_UNKNOWN\" if the format isn\'t recognized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAudioFormatName@, defined at @SDL3\/SDL_audio.h 2332:42@
+sDL_GetAudioFormatName
+  :: SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the audio format to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetAudioFormatName = hs_bindgen_427a7131d02ce29b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetSilenceValueForFormat@
+foreign import ccall safe "hs_bindgen_a78d31ca2af16da3"
+  hs_bindgen_a78d31ca2af16da3_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Safe_SDL_GetSilenceValueForFormat@
+hs_bindgen_a78d31ca2af16da3
+  :: SDL_AudioFormat
+  -> IO BG.CInt
+hs_bindgen_a78d31ca2af16da3 =
+  BG.fromFFIType hs_bindgen_a78d31ca2af16da3_base
+
+-- | Get the appropriate memset value for silencing an audio format.
+--
+--     The value returned by this function can be used as the second argument to memset (or SDL_memset) to set an audio buffer in a specific format to silence.
+--
+--     [Returns]: a byte value that can be passed to memset.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSilenceValueForFormat@, defined at @SDL3\/SDL_audio.h 2348:33@
+sDL_GetSilenceValueForFormat
+  :: SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the audio data format to query.
+  -> IO BG.CInt
+sDL_GetSilenceValueForFormat =
+  hs_bindgen_a78d31ca2af16da3
diff --git a/src/SDL3/Sys/Bindgen/Audio/Unsafe.hs b/src/SDL3/Sys/Bindgen/Audio/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Audio/Unsafe.hs
@@ -0,0 +1,3059 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Audio.Unsafe (
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetNumAudioDrivers,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioDriver,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetCurrentAudioDriver,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioPlaybackDevices,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioRecordingDevices,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioDeviceName,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioDeviceFormat,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioDeviceChannelMap,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_OpenAudioDevice,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_IsAudioDevicePhysical,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_IsAudioDevicePlayback,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_PauseAudioDevice,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_ResumeAudioDevice,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_AudioDevicePaused,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioDeviceGain,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_SetAudioDeviceGain,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_CloseAudioDevice,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_BindAudioStreams,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_BindAudioStream,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_UnbindAudioStreams,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_UnbindAudioStream,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioStreamDevice,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_CreateAudioStream,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioStreamProperties,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioStreamFormat,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_SetAudioStreamFormat,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioStreamFrequencyRatio,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_SetAudioStreamFrequencyRatio,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioStreamGain,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_SetAudioStreamGain,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioStreamInputChannelMap,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioStreamOutputChannelMap,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_SetAudioStreamInputChannelMap,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_SetAudioStreamOutputChannelMap,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_PutAudioStreamData,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_PutAudioStreamDataNoCopy,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_PutAudioStreamPlanarData,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioStreamData,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioStreamAvailable,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioStreamQueued,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_FlushAudioStream,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_ClearAudioStream,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_PauseAudioStreamDevice,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_ResumeAudioStreamDevice,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_AudioStreamDevicePaused,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_LockAudioStream,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_UnlockAudioStream,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_SetAudioStreamGetCallback,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_SetAudioStreamPutCallback,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_DestroyAudioStream,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_OpenAudioDeviceStream,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_SetAudioPostmixCallback,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_LoadWAV_IO,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_LoadWAV,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_MixAudio,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_ConvertAudioSamples,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetAudioFormatName,
+  SDL3.Sys.Bindgen.Audio.Unsafe.sDL_GetSilenceValueForFormat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Audio
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_audio.h>"
+         , "signed int hs_bindgen_3fadb766434bf32a (void)"
+         , "{"
+         , "  return (SDL_GetNumAudioDrivers)();"
+         , "}"
+         , "char const *hs_bindgen_088e341c96ec752f ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioDriver)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_8d83991bf7c57ced (void)"
+         , "{"
+         , "  return (SDL_GetCurrentAudioDriver)();"
+         , "}"
+         , "SDL_AudioDeviceID *hs_bindgen_ac01234fb497c823 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioPlaybackDevices)(arg1);"
+         , "}"
+         , "SDL_AudioDeviceID *hs_bindgen_3d763bb9432bd9eb ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioRecordingDevices)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_b2c73ae14aa40e78 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioDeviceName)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8117a6bb4c2d4973 ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioSpec *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioDeviceFormat)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int *hs_bindgen_4c4c9c72b628a61b ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioDeviceChannelMap)(arg1, arg2);"
+         , "}"
+         , "SDL_AudioDeviceID hs_bindgen_b33e26bd03556385 ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioSpec const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenAudioDevice)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_40b4f5474e930396 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_IsAudioDevicePhysical)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_3529c6e832f821e2 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_IsAudioDevicePlayback)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8b915f5bea8027b8 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_PauseAudioDevice)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_459b30881d6df917 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ResumeAudioDevice)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_672dd7353e8716ce ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AudioDevicePaused)(arg1);"
+         , "}"
+         , "float hs_bindgen_c8b5c017b7910d18 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioDeviceGain)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_13f5c18c777458dd ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioDeviceGain)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_1f1d897129d034a7 ("
+         , "  SDL_AudioDeviceID arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseAudioDevice)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_347a950bd3b0f9b2 ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioStream *const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_BindAudioStreams)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_98bc5733fab56d11 ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioStream *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_BindAudioStream)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_ec7f859bb5c9ee4b ("
+         , "  SDL_AudioStream *const *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  (SDL_UnbindAudioStreams)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_4c718e02b5ad1279 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnbindAudioStream)(arg1);"
+         , "}"
+         , "SDL_AudioDeviceID hs_bindgen_caea3c9230448fae ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamDevice)(arg1);"
+         , "}"
+         , "SDL_AudioStream *hs_bindgen_bcc8d812c83afb38 ("
+         , "  SDL_AudioSpec const *arg1,"
+         , "  SDL_AudioSpec const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateAudioStream)(arg1, arg2);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_a513bf944ff78877 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamProperties)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_4b2310dc9f80a9f8 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioSpec *arg2,"
+         , "  SDL_AudioSpec *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamFormat)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_a8488bb9b411fc5d ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioSpec const *arg2,"
+         , "  SDL_AudioSpec const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamFormat)(arg1, arg2, arg3);"
+         , "}"
+         , "float hs_bindgen_15397b18d1ddad29 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamFrequencyRatio)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_86275fb04d01b569 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamFrequencyRatio)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_b0201fb647f1a55c ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamGain)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_90b7daeac2130f28 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamGain)(arg1, arg2);"
+         , "}"
+         , "signed int *hs_bindgen_1b79fdfec2f48b4f ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamInputChannelMap)(arg1, arg2);"
+         , "}"
+         , "signed int *hs_bindgen_0c6aa9ee60372768 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamOutputChannelMap)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c2adfd0bb37d9aa2 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamInputChannelMap)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_b0ed00a566f29be4 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  signed int const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamOutputChannelMap)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_32b25453fa9b8c52 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_PutAudioStreamData)(arg1, arg2, arg3);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef void *SDL_AudioStreamDataCompleteCallback;"
+         , "#endif"
+         , "_Bool hs_bindgen_8e034cb6408bf39f ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3,"
+         , "  SDL_AudioStreamDataCompleteCallback arg4,"
+         , "  void *arg5"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_PutAudioStreamDataNoCopy)(arg1, arg2, arg3, arg4, arg5);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; (void)arg5; SDL_SetError(\"SDL_PutAudioStreamDataNoCopy requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_2517bbaa11deade2 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void const *const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_PutAudioStreamPlanarData)(arg1, arg2, arg3, arg4);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; SDL_SetError(\"SDL_PutAudioStreamPlanarData requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "signed int hs_bindgen_05c01671d414ec35 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  void *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamData)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_6693b5a0bc38b7f9 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamAvailable)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_75fb0631cff6ceae ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioStreamQueued)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ad5616a591f54851 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_FlushAudioStream)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_f4d190bd770b2df3 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ClearAudioStream)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_fa7a02853d833a6c ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_PauseAudioStreamDevice)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0460d36f7042c57a ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ResumeAudioStreamDevice)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ffc6b2bb5b052f6d ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AudioStreamDevicePaused)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0f17d22c674fb4db ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_LockAudioStream)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_03cca6936a438b69 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_UnlockAudioStream)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_dc2f74eae1a93c31 ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioStreamCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamGetCallback)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_146f387abf38d92a ("
+         , "  SDL_AudioStream *arg1,"
+         , "  SDL_AudioStreamCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioStreamPutCallback)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_49f1ea9de2669438 ("
+         , "  SDL_AudioStream *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyAudioStream)(arg1);"
+         , "}"
+         , "SDL_AudioStream *hs_bindgen_c626b93042e17a97 ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioSpec const *arg2,"
+         , "  SDL_AudioStreamCallback arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenAudioDeviceStream)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_2207c9d46d721c22 ("
+         , "  SDL_AudioDeviceID arg1,"
+         , "  SDL_AudioPostmixCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAudioPostmixCallback)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_7d7f4ec89c051bd9 ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2,"
+         , "  SDL_AudioSpec *arg3,"
+         , "  Uint8 **arg4,"
+         , "  Uint32 *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadWAV_IO)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_618ebcf6bf6e8650 ("
+         , "  char const *arg1,"
+         , "  SDL_AudioSpec *arg2,"
+         , "  Uint8 **arg3,"
+         , "  Uint32 *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadWAV)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_da6d00b62c3fdd0b ("
+         , "  Uint8 *arg1,"
+         , "  Uint8 const *arg2,"
+         , "  SDL_AudioFormat arg3,"
+         , "  Uint32 arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_MixAudio)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_a6d61748227d6f0b ("
+         , "  SDL_AudioSpec const *arg1,"
+         , "  Uint8 const *arg2,"
+         , "  signed int arg3,"
+         , "  SDL_AudioSpec const *arg4,"
+         , "  Uint8 **arg5,"
+         , "  signed int *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertAudioSamples)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "char const *hs_bindgen_43b528b55cc775cf ("
+         , "  SDL_AudioFormat arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAudioFormatName)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_0154acf0cb371eab ("
+         , "  SDL_AudioFormat arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSilenceValueForFormat)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetNumAudioDrivers@
+foreign import ccall unsafe "hs_bindgen_3fadb766434bf32a"
+  hs_bindgen_3fadb766434bf32a_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetNumAudioDrivers@
+hs_bindgen_3fadb766434bf32a :: IO BG.CInt
+hs_bindgen_3fadb766434bf32a =
+  BG.fromFFIType hs_bindgen_3fadb766434bf32a_base
+
+-- | Use this function to get the number of built-in audio drivers.
+--
+--     This function returns a hardcoded number. This never returns a negative value; if there are no drivers compiled into this build of SDL, this function returns zero. The presence of a driver in this list does not mean it will function, it just means SDL is capable of interacting with that interface. For example, a build of SDL might have esound support, but if there\'s no esound server available, SDL\'s esound driver would fail if used.
+--
+--     By default, SDL tries all drivers, in its preferred order, until one is found to be usable.
+--
+--     [Returns]: the number of built-in audio drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioDriver'
+--
+--     [C declaration]: @SDL_GetNumAudioDrivers@, defined at @SDL3\/SDL_audio.h 477:33@
+sDL_GetNumAudioDrivers :: IO BG.CInt
+sDL_GetNumAudioDrivers = hs_bindgen_3fadb766434bf32a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioDriver@
+foreign import ccall unsafe "hs_bindgen_088e341c96ec752f"
+  hs_bindgen_088e341c96ec752f_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioDriver@
+hs_bindgen_088e341c96ec752f
+  :: BG.CInt
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_088e341c96ec752f =
+  BG.fromFFIType hs_bindgen_088e341c96ec752f_base
+
+-- | Use this function to get the name of a built in audio driver.
+--
+--     The list of audio drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"alsa\", \"coreaudio\" or \"wasapi\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the audio driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumAudioDrivers'
+--
+--     [C declaration]: @SDL_GetAudioDriver@, defined at @SDL3\/SDL_audio.h 501:42@
+sDL_GetAudioDriver
+  :: BG.CInt
+  -- ^
+  --
+  --           [@index@]: the index of the audio driver; the value ranges from 0 to @SDL_GetNumAudioDrivers()@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetAudioDriver = hs_bindgen_088e341c96ec752f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetCurrentAudioDriver@
+foreign import ccall unsafe "hs_bindgen_8d83991bf7c57ced"
+  hs_bindgen_8d83991bf7c57ced_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetCurrentAudioDriver@
+hs_bindgen_8d83991bf7c57ced :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_8d83991bf7c57ced =
+  BG.fromFFIType hs_bindgen_8d83991bf7c57ced_base
+
+-- | Get the name of the current audio driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"alsa\", \"coreaudio\" or \"wasapi\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current audio driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentAudioDriver@, defined at @SDL3\/SDL_audio.h 517:42@
+sDL_GetCurrentAudioDriver :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetCurrentAudioDriver =
+  hs_bindgen_8d83991bf7c57ced
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioPlaybackDevices@
+foreign import ccall unsafe "hs_bindgen_ac01234fb497c823"
+  hs_bindgen_ac01234fb497c823_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioPlaybackDevices@
+hs_bindgen_ac01234fb497c823
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+hs_bindgen_ac01234fb497c823 =
+  BG.fromFFIType hs_bindgen_ac01234fb497c823_base
+
+-- | Get a list of currently-connected audio playback devices.
+--
+--     This returns of list of available devices that play sound, perhaps to speakers or headphones (\"playback\" devices). If you want devices that record audio, like a microphone (\"recording\" devices), use @SDL_GetAudioRecordingDevices()@ instead.
+--
+--     This only returns a list of physical devices; it will not have any device IDs returned by @SDL_OpenAudioDevice()@.
+--
+--     If this function returns NULL, to signify an error, @*count@ will be set to zero.
+--
+--     [Returns]: a 0 terminated array of device instance IDs or NULL on error; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenAudioDevice', 'sDL_GetAudioRecordingDevices'
+--
+--     [C declaration]: @SDL_GetAudioPlaybackDevices@, defined at @SDL3\/SDL_audio.h 546:49@
+sDL_GetAudioPlaybackDevices
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+sDL_GetAudioPlaybackDevices =
+  hs_bindgen_ac01234fb497c823
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioRecordingDevices@
+foreign import ccall unsafe "hs_bindgen_3d763bb9432bd9eb"
+  hs_bindgen_3d763bb9432bd9eb_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioRecordingDevices@
+hs_bindgen_3d763bb9432bd9eb
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+hs_bindgen_3d763bb9432bd9eb =
+  BG.fromFFIType hs_bindgen_3d763bb9432bd9eb_base
+
+-- | Get a list of currently-connected audio recording devices.
+--
+--     This returns of list of available devices that record audio, like a microphone (\"recording\" devices). If you want devices that play sound, perhaps to speakers or headphones (\"playback\" devices), use @SDL_GetAudioPlaybackDevices()@ instead.
+--
+--     This only returns a list of physical devices; it will not have any device IDs returned by @SDL_OpenAudioDevice()@.
+--
+--     If this function returns NULL, to signify an error, @*count@ will be set to zero.
+--
+--     [Returns]: a 0 terminated array of device instance IDs, or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenAudioDevice', 'sDL_GetAudioPlaybackDevices'
+--
+--     [C declaration]: @SDL_GetAudioRecordingDevices@, defined at @SDL3\/SDL_audio.h 575:49@
+sDL_GetAudioRecordingDevices
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_AudioDeviceID)
+sDL_GetAudioRecordingDevices =
+  hs_bindgen_3d763bb9432bd9eb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioDeviceName@
+foreign import ccall unsafe "hs_bindgen_b2c73ae14aa40e78"
+  hs_bindgen_b2c73ae14aa40e78_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioDeviceName@
+hs_bindgen_b2c73ae14aa40e78
+  :: SDL_AudioDeviceID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_b2c73ae14aa40e78 =
+  BG.fromFFIType hs_bindgen_b2c73ae14aa40e78_base
+
+-- | Get the human-readable name of a specific audio device.
+--
+--     __WARNING__: this function will work with SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK and SDL_AUDIO_DEVICE_DEFAULT_RECORDING, returning the current default physical devices\' names. However, as the default device may change at any time, it is likely better to show a generic name to the user, like \"System default audio device\" or perhaps \"default [currently %s]\". Do not store this name to disk to reidentify the device in a later run of the program, as the default might change in general, and the string will be the name of a specific device and not the abstract system default.
+--
+--     [Returns]: the name of the audio device, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioPlaybackDevices', 'sDL_GetAudioRecordingDevices'
+--
+--     [C declaration]: @SDL_GetAudioDeviceName@, defined at @SDL3\/SDL_audio.h 600:42@
+sDL_GetAudioDeviceName
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetAudioDeviceName = hs_bindgen_b2c73ae14aa40e78
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioDeviceFormat@
+foreign import ccall unsafe "hs_bindgen_8117a6bb4c2d4973"
+  hs_bindgen_8117a6bb4c2d4973_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioDeviceFormat@
+hs_bindgen_8117a6bb4c2d4973
+  :: SDL_AudioDeviceID
+  -> BG.Ptr SDL_AudioSpec
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_8117a6bb4c2d4973 =
+  BG.fromFFIType hs_bindgen_8117a6bb4c2d4973_base
+
+-- | Get the current audio format of a specific audio device.
+--
+--     For an opened device, this will report the format the device is currently using. If the device isn\'t yet opened, this will report the device\'s preferred format (or a reasonable default if this can\'t be determined).
+--
+--     You may also specify SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING here, which is useful for getting a reasonable recommendation before opening the system-recommended default device.
+--
+--     You can also use this to request the current device buffer size. This is specified in sample frames and represents the amount of data SDL will feed to the physical hardware in each chunk. This can be converted to milliseconds of audio with the following equation:
+--
+--     @ms = (int) ((((Sint64) frames) * 1000) \/ spec.freq);@
+--
+--     Buffer size is only important if you need low-level control over the audio playback timing. Most apps do not need this.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAudioDeviceFormat@, defined at @SDL3\/SDL_audio.h 635:34@
+sDL_GetAudioDeviceFormat
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: on return, will be filled with device details.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@sample_frames@]: pointer to store device buffer size, in sample frames. Can be NULL.
+  -> IO BG.CBool
+sDL_GetAudioDeviceFormat =
+  hs_bindgen_8117a6bb4c2d4973
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioDeviceChannelMap@
+foreign import ccall unsafe "hs_bindgen_4c4c9c72b628a61b"
+  hs_bindgen_4c4c9c72b628a61b_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioDeviceChannelMap@
+hs_bindgen_4c4c9c72b628a61b
+  :: SDL_AudioDeviceID
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr BG.CInt)
+hs_bindgen_4c4c9c72b628a61b =
+  BG.fromFFIType hs_bindgen_4c4c9c72b628a61b_base
+
+-- | Get the current channel map of an audio device.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     Audio devices usually have no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_GetAudioDeviceChannelMap@, defined at @SDL3\/SDL_audio.h 658:35@
+sDL_GetAudioDeviceChannelMap
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the instance ID of the device to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+sDL_GetAudioDeviceChannelMap =
+  hs_bindgen_4c4c9c72b628a61b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_OpenAudioDevice@
+foreign import ccall unsafe "hs_bindgen_b33e26bd03556385"
+  hs_bindgen_b33e26bd03556385_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_OpenAudioDevice@
+hs_bindgen_b33e26bd03556385
+  :: SDL_AudioDeviceID
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> IO SDL_AudioDeviceID
+hs_bindgen_b33e26bd03556385 =
+  BG.fromFFIType hs_bindgen_b33e26bd03556385_base
+
+-- | Open a specific audio device.
+--
+--     You can open both playback and recording devices through this function. Playback devices will take data from bound audio streams, mix it, and send it to the hardware. Recording devices will feed any bound audio streams with a copy of any incoming data.
+--
+--     An opened audio device starts out with no audio streams bound. To start audio playing, bind a stream and supply audio data to it. Unlike SDL2, there is no audio callback; you only bind audio streams and make sure they have data flowing into them (however, you can simulate SDL2\'s semantics fairly closely by using SDL_OpenAudioDeviceStream instead of this function).
+--
+--     If you don\'t care about opening a specific device, pass a @devid@ of either @SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK@ or @SDL_AUDIO_DEVICE_DEFAULT_RECORDING@. In this case, SDL will try to pick the most reasonable default, and may also switch between physical devices seamlessly later, if the most reasonable default changes during the lifetime of this opened device (user changed the default in the OS\'s system preferences, the default got unplugged so the system jumped to a new default, the user plugged in headphones on a mobile device, etc). Unless you have a good reason to choose a specific device, this is probably what you want.
+--
+--     You may request a specific format for the audio device, but there is no promise the device will honor that request for several reasons. As such, it\'s only meant to be a hint as to what data your app will provide. Audio streams will accept data in whatever format you specify and manage conversion for you as appropriate. SDL_GetAudioDeviceFormat can tell you the preferred format for the device before opening and the actual format the device is using after opening.
+--
+--     It\'s legal to open the same device ID more than once; each successful open will generate a new logical 'SDL_AudioDeviceID' that is managed separately from others on the same physical device. This allows libraries to open a device separately from the main app and bind its own streams without conflicting.
+--
+--     It is also legal to open a device ID returned by a previous call to this function; doing so just creates another logical device on the same physical device. This may be useful for making logical groupings of audio streams.
+--
+--     This function returns the opened device ID on success. This is a new, unique 'SDL_AudioDeviceID' that represents a logical device.
+--
+--     Some backends might offer arbitrary devices (for example, a networked audio protocol that can connect to an arbitrary server). For these, as a change from SDL2, you should open a default device ID and use an SDL hint to specify the target if you care, or otherwise let the backend figure out a reasonable default. Most backends don\'t offer anything like this, and often this would be an end user setting an environment variable for their custom need, and not something an application should specifically manage.
+--
+--     When done with an audio device, possibly at the end of the app\'s life, one should call @SDL_CloseAudioDevice()@ on the returned device id.
+--
+--     [Returns]: the device ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseAudioDevice', 'sDL_GetAudioDeviceFormat'
+--
+--     [C declaration]: @SDL_OpenAudioDevice@, defined at @SDL3\/SDL_audio.h 734:47@
+sDL_OpenAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device instance id to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING for the most reasonable default device.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: the requested device configuration. Can be NULL to use reasonable defaults.
+  -> IO SDL_AudioDeviceID
+sDL_OpenAudioDevice = hs_bindgen_b33e26bd03556385
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_IsAudioDevicePhysical@
+foreign import ccall unsafe "hs_bindgen_40b4f5474e930396"
+  hs_bindgen_40b4f5474e930396_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_IsAudioDevicePhysical@
+hs_bindgen_40b4f5474e930396
+  :: SDL_AudioDeviceID
+  -> IO BG.CBool
+hs_bindgen_40b4f5474e930396 =
+  BG.fromFFIType hs_bindgen_40b4f5474e930396_base
+
+-- | Determine if an audio device is physical (instead of logical).
+--
+--     An 'SDL_AudioDeviceID' that represents physical hardware is a physical device; there is one for each piece of hardware that SDL can see. Logical devices are created by calling SDL_OpenAudioDevice or SDL_OpenAudioDeviceStream, and while each is associated with a physical device, there can be any number of logical devices on one physical device.
+--
+--     For the most part, logical and physical IDs are interchangeable if you try to open a logical device, SDL understands to assign that effort to the underlying physical device, etc. However, it might be useful to know if an arbitrary device ID is physical or logical. This function reports which.
+--
+--     This function may return either true or false for invalid device IDs.
+--
+--     [Returns]: true if devid is a physical device, false if it is logical.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsAudioDevicePhysical@, defined at @SDL3\/SDL_audio.h 759:34@
+sDL_IsAudioDevicePhysical
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device ID to query.
+  -> IO BG.CBool
+sDL_IsAudioDevicePhysical =
+  hs_bindgen_40b4f5474e930396
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_IsAudioDevicePlayback@
+foreign import ccall unsafe "hs_bindgen_3529c6e832f821e2"
+  hs_bindgen_3529c6e832f821e2_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_IsAudioDevicePlayback@
+hs_bindgen_3529c6e832f821e2
+  :: SDL_AudioDeviceID
+  -> IO BG.CBool
+hs_bindgen_3529c6e832f821e2 =
+  BG.fromFFIType hs_bindgen_3529c6e832f821e2_base
+
+-- | Determine if an audio device is a playback device (instead of recording).
+--
+--     This function may return either true or false for invalid device IDs.
+--
+--     [Returns]: true if devid is a playback device, false if it is recording.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsAudioDevicePlayback@, defined at @SDL3\/SDL_audio.h 773:34@
+sDL_IsAudioDevicePlayback
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the device ID to query.
+  -> IO BG.CBool
+sDL_IsAudioDevicePlayback =
+  hs_bindgen_3529c6e832f821e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_PauseAudioDevice@
+foreign import ccall unsafe "hs_bindgen_8b915f5bea8027b8"
+  hs_bindgen_8b915f5bea8027b8_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_PauseAudioDevice@
+hs_bindgen_8b915f5bea8027b8
+  :: SDL_AudioDeviceID
+  -> IO BG.CBool
+hs_bindgen_8b915f5bea8027b8 =
+  BG.fromFFIType hs_bindgen_8b915f5bea8027b8_base
+
+-- | Use this function to pause audio playback on a specified device.
+--
+--     This function pauses audio processing for a given device. Any bound audio streams will not progress, and no audio will be generated. Pausing one device does not prevent other unpaused devices from running.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow. Pausing a paused device is a legal no-op.
+--
+--     Pausing a device can be useful to halt all audio without unbinding all the audio streams. This might be useful while a game is paused, or a level is loading, etc.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @SDL_OpenAudioDevice()@ can be.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResumeAudioDevice', 'sDL_AudioDevicePaused'
+--
+--     [C declaration]: @SDL_PauseAudioDevice@, defined at @SDL3\/SDL_audio.h 804:34@
+sDL_PauseAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @SDL_OpenAudioDevice()@.
+  -> IO BG.CBool
+sDL_PauseAudioDevice = hs_bindgen_8b915f5bea8027b8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_ResumeAudioDevice@
+foreign import ccall unsafe "hs_bindgen_459b30881d6df917"
+  hs_bindgen_459b30881d6df917_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_ResumeAudioDevice@
+hs_bindgen_459b30881d6df917
+  :: SDL_AudioDeviceID
+  -> IO BG.CBool
+hs_bindgen_459b30881d6df917 =
+  BG.fromFFIType hs_bindgen_459b30881d6df917_base
+
+-- | Use this function to unpause audio playback on a specified device.
+--
+--     This function unpauses audio processing for a given device that has previously been paused with @SDL_PauseAudioDevice()@. Once unpaused, any bound audio streams will begin to progress again, and audio can be generated.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow. Unpausing an unpaused device is a legal no-op.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @SDL_OpenAudioDevice()@ can be.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AudioDevicePaused', 'sDL_PauseAudioDevice'
+--
+--     [C declaration]: @SDL_ResumeAudioDevice@, defined at @SDL3\/SDL_audio.h 832:34@
+sDL_ResumeAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @SDL_OpenAudioDevice()@.
+  -> IO BG.CBool
+sDL_ResumeAudioDevice = hs_bindgen_459b30881d6df917
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_AudioDevicePaused@
+foreign import ccall unsafe "hs_bindgen_672dd7353e8716ce"
+  hs_bindgen_672dd7353e8716ce_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_AudioDevicePaused@
+hs_bindgen_672dd7353e8716ce
+  :: SDL_AudioDeviceID
+  -> IO BG.CBool
+hs_bindgen_672dd7353e8716ce =
+  BG.fromFFIType hs_bindgen_672dd7353e8716ce_base
+
+-- | Use this function to query if an audio device is paused.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow.
+--
+--     Physical devices can not be paused or unpaused, only logical devices created through @SDL_OpenAudioDevice()@ can be. Physical and invalid device IDs will report themselves as unpaused here.
+--
+--     [Returns]: true if device is valid and paused, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseAudioDevice', 'sDL_ResumeAudioDevice'
+--
+--     [C declaration]: @SDL_AudioDevicePaused@, defined at @SDL3\/SDL_audio.h 854:34@
+sDL_AudioDevicePaused
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: a device opened by @SDL_OpenAudioDevice()@.
+  -> IO BG.CBool
+sDL_AudioDevicePaused = hs_bindgen_672dd7353e8716ce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioDeviceGain@
+foreign import ccall unsafe "hs_bindgen_c8b5c017b7910d18"
+  hs_bindgen_c8b5c017b7910d18_base
+    :: BG.Word32
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioDeviceGain@
+hs_bindgen_c8b5c017b7910d18
+  :: SDL_AudioDeviceID
+  -> IO BG.CFloat
+hs_bindgen_c8b5c017b7910d18 =
+  BG.fromFFIType hs_bindgen_c8b5c017b7910d18_base
+
+-- | Get the gain of an audio device.
+--
+--     The gain of a device is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio devices default to a gain of 1.0f (no change in output).
+--
+--     Physical devices may not have their gain changed, only logical devices, and this function will always return -1.0f when used on physical devices.
+--
+--     [Returns]: the gain of the device or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioDeviceGain'
+--
+--     [C declaration]: @SDL_GetAudioDeviceGain@, defined at @SDL3\/SDL_audio.h 877:35@
+sDL_GetAudioDeviceGain
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the audio device to query.
+  -> IO BG.CFloat
+sDL_GetAudioDeviceGain = hs_bindgen_c8b5c017b7910d18
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioDeviceGain@
+foreign import ccall unsafe "hs_bindgen_13f5c18c777458dd"
+  hs_bindgen_13f5c18c777458dd_base
+    :: BG.Word32
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioDeviceGain@
+hs_bindgen_13f5c18c777458dd
+  :: SDL_AudioDeviceID
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_13f5c18c777458dd =
+  BG.fromFFIType hs_bindgen_13f5c18c777458dd_base
+
+-- | Change the gain of an audio device.
+--
+--     The gain of a device is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio devices default to a gain of 1.0f (no change in output).
+--
+--     Physical devices may not have their gain changed, only logical devices, and this function will always return false when used on physical devices. While it might seem attractive to adjust several logical devices at once in this way, it would allow an app or library to interfere with another portion of the program\'s otherwise-isolated devices.
+--
+--     This is applied, along with any per-audiostream gain, during playback to the hardware, and can be continuously changed to create various effects. On recording devices, this will adjust the gain before passing the data into an audiostream; that recording audiostream can then adjust its gain further when outputting the data elsewhere, if it likes, but that second gain is not applied until the data leaves the audiostream again.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioDeviceGain'
+--
+--     [C declaration]: @SDL_SetAudioDeviceGain@, defined at @SDL3\/SDL_audio.h 912:34@
+sDL_SetAudioDeviceGain
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the audio device on which to change gain.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@gain@]: the gain. 1.0f is no change, 0.0f is silence.
+  -> IO BG.CBool
+sDL_SetAudioDeviceGain = hs_bindgen_13f5c18c777458dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_CloseAudioDevice@
+foreign import ccall unsafe "hs_bindgen_1f1d897129d034a7"
+  hs_bindgen_1f1d897129d034a7_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_CloseAudioDevice@
+hs_bindgen_1f1d897129d034a7
+  :: SDL_AudioDeviceID
+  -> IO ()
+hs_bindgen_1f1d897129d034a7 =
+  BG.fromFFIType hs_bindgen_1f1d897129d034a7_base
+
+-- | Close a previously-opened audio device.
+--
+--     The application should close open audio devices once they are no longer needed.
+--
+--     This function may block briefly while pending audio data is played by the hardware, so that applications don\'t drop the last buffer of data they supplied if terminating immediately afterwards.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenAudioDevice'
+--
+--     [C declaration]: @SDL_CloseAudioDevice@, defined at @SDL3\/SDL_audio.h 933:34@
+sDL_CloseAudioDevice
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device id previously returned by @SDL_OpenAudioDevice()@.
+  -> IO ()
+sDL_CloseAudioDevice = hs_bindgen_1f1d897129d034a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_BindAudioStreams@
+foreign import ccall unsafe "hs_bindgen_347a950bd3b0f9b2"
+  hs_bindgen_347a950bd3b0f9b2_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_BindAudioStreams@
+hs_bindgen_347a950bd3b0f9b2
+  :: SDL_AudioDeviceID
+  -> PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_347a950bd3b0f9b2 =
+  BG.fromFFIType hs_bindgen_347a950bd3b0f9b2_base
+
+-- | Bind a list of audio streams to an audio device.
+--
+--     Audio data will flow through any bound streams. For a playback device, data for all bound streams will be mixed together and fed to the device. For a recording device, a copy of recorded data will be provided to each bound stream.
+--
+--     Audio streams can only be bound to an open device. This operation is atomic all streams bound in the same call will start processing at the same time, so they can stay in sync. Also: either all streams will be bound or none of them will be.
+--
+--     It is an error to bind an already-bound stream; it must be explicitly unbound first.
+--
+--     Binding a stream to a device will set its output format for playback devices, and its input format for recording devices, so they match the device\'s settings. The caller is welcome to change the other end of the stream\'s format at any time with @SDL_SetAudioStreamFormat()@. If the other end of the stream\'s format has never been set (the audio stream was created with a NULL audio spec), this function will set it to match the device end\'s format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStreams', 'sDL_UnbindAudioStream', 'sDL_GetAudioStreamDevice'
+--
+--     [C declaration]: @SDL_BindAudioStreams@, defined at @SDL3\/SDL_audio.h 973:34@
+sDL_BindAudioStreams
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to bind a stream to.
+  -> PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -- ^
+  --
+  --           [@streams@]: an array of audio streams to bind.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_streams@]: number streams listed in the @streams@ array.
+  -> IO BG.CBool
+sDL_BindAudioStreams = hs_bindgen_347a950bd3b0f9b2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_BindAudioStream@
+foreign import ccall unsafe "hs_bindgen_98bc5733fab56d11"
+  hs_bindgen_98bc5733fab56d11_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_BindAudioStream@
+hs_bindgen_98bc5733fab56d11
+  :: SDL_AudioDeviceID
+  -> BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_98bc5733fab56d11 =
+  BG.fromFFIType hs_bindgen_98bc5733fab56d11_base
+
+-- | Bind a single audio stream to an audio device.
+--
+--     This is a convenience function, equivalent to calling @'sDL_BindAudioStreams' (devid, &stream, 1)@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStreams', 'sDL_UnbindAudioStream', 'sDL_GetAudioStreamDevice'
+--
+--     [C declaration]: @SDL_BindAudioStream@, defined at @SDL3\/SDL_audio.h 994:34@
+sDL_BindAudioStream
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to bind a stream to.
+  -> BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: an audio stream to bind to a device.
+  -> IO BG.CBool
+sDL_BindAudioStream = hs_bindgen_98bc5733fab56d11
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_UnbindAudioStreams@
+foreign import ccall unsafe "hs_bindgen_ec7f859bb5c9ee4b"
+  hs_bindgen_ec7f859bb5c9ee4b_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_UnbindAudioStreams@
+hs_bindgen_ec7f859bb5c9ee4b
+  :: PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -> BG.CInt
+  -> IO ()
+hs_bindgen_ec7f859bb5c9ee4b =
+  BG.fromFFIType hs_bindgen_ec7f859bb5c9ee4b_base
+
+-- | Unbind a list of audio streams from their audio devices.
+--
+--     The streams being unbound do not all have to be on the same device. All streams on the same device will be unbound atomically (data will stop flowing through all unbound streams on the same device at the same time).
+--
+--     Unbinding a stream that isn\'t bound to a device is a legal no-op.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStreams'
+--
+--     [C declaration]: @SDL_UnbindAudioStreams@, defined at @SDL3\/SDL_audio.h 1015:34@
+sDL_UnbindAudioStreams
+  :: PtrConst.PtrConst (BG.Ptr SDL_AudioStream)
+  -- ^
+  --
+  --           [@streams@]: an array of audio streams to unbind. Can be NULL or contain NULL.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_streams@]: number streams listed in the @streams@ array.
+  -> IO ()
+sDL_UnbindAudioStreams = hs_bindgen_ec7f859bb5c9ee4b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_UnbindAudioStream@
+foreign import ccall unsafe "hs_bindgen_4c718e02b5ad1279"
+  hs_bindgen_4c718e02b5ad1279_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_UnbindAudioStream@
+hs_bindgen_4c718e02b5ad1279
+  :: BG.Ptr SDL_AudioStream
+  -> IO ()
+hs_bindgen_4c718e02b5ad1279 =
+  BG.fromFFIType hs_bindgen_4c718e02b5ad1279_base
+
+-- | Unbind a single audio stream from its audio device.
+--
+--     This is a convenience function, equivalent to calling @'sDL_UnbindAudioStreams' (&stream, 1)@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStream'
+--
+--     [C declaration]: @SDL_UnbindAudioStream@, defined at @SDL3\/SDL_audio.h 1031:34@
+sDL_UnbindAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: an audio stream to unbind from a device. Can be NULL.
+  -> IO ()
+sDL_UnbindAudioStream = hs_bindgen_4c718e02b5ad1279
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamDevice@
+foreign import ccall unsafe "hs_bindgen_caea3c9230448fae"
+  hs_bindgen_caea3c9230448fae_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamDevice@
+hs_bindgen_caea3c9230448fae
+  :: BG.Ptr SDL_AudioStream
+  -> IO SDL_AudioDeviceID
+hs_bindgen_caea3c9230448fae =
+  BG.fromFFIType hs_bindgen_caea3c9230448fae_base
+
+-- | Query an audio stream for its currently-bound device.
+--
+--     This reports the logical audio device that an audio stream is currently bound to.
+--
+--     If not bound, or invalid, this returns zero, which is not a valid device ID.
+--
+--     [Returns]: the bound audio device, or 0 if not bound or invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindAudioStream', 'sDL_BindAudioStreams'
+--
+--     [C declaration]: @SDL_GetAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1052:47@
+sDL_GetAudioStreamDevice
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO SDL_AudioDeviceID
+sDL_GetAudioStreamDevice =
+  hs_bindgen_caea3c9230448fae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_CreateAudioStream@
+foreign import ccall unsafe "hs_bindgen_bcc8d812c83afb38"
+  hs_bindgen_bcc8d812c83afb38_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_CreateAudioStream@
+hs_bindgen_bcc8d812c83afb38
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> IO (BG.Ptr SDL_AudioStream)
+hs_bindgen_bcc8d812c83afb38 =
+  BG.fromFFIType hs_bindgen_bcc8d812c83afb38_base
+
+-- | Create a new audio stream.
+--
+--     [Returns]: a new audio stream on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PutAudioStreamData', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamAvailable', 'sDL_FlushAudioStream', 'sDL_ClearAudioStream', 'sDL_SetAudioStreamFormat', 'sDL_DestroyAudioStream'
+--
+--     [C declaration]: @SDL_CreateAudioStream@, defined at @SDL3\/SDL_audio.h 1074:47@
+sDL_CreateAudioStream
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the format details of the input audio.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the format details of the output audio.
+  -> IO (BG.Ptr SDL_AudioStream)
+sDL_CreateAudioStream = hs_bindgen_bcc8d812c83afb38
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamProperties@
+foreign import ccall unsafe "hs_bindgen_a513bf944ff78877"
+  hs_bindgen_a513bf944ff78877_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamProperties@
+hs_bindgen_a513bf944ff78877
+  :: BG.Ptr SDL_AudioStream
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_a513bf944ff78877 =
+  BG.fromFFIType hs_bindgen_a513bf944ff78877_base
+
+-- | Get the properties associated with an audio stream.
+--
+--     The application can hang any data it wants here, but the following properties are understood by SDL:
+--
+--     * @'sDL_PROP_AUDIOSTREAM_AUTO_CLEANUP_BOOLEAN'@: if true (the default), the stream be automatically cleaned up when the audio subsystem quits. If set to false, the streams will persist beyond that. This property is ignored for streams created through @SDL_OpenAudioDeviceStream()@, and will always be cleaned up. Streams that are not cleaned up will still be unbound from devices when the audio subsystem quits. This property was added in SDL 3.4.0.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAudioStreamProperties@, defined at @SDL3\/SDL_audio.h 1098:46@
+sDL_GetAudioStreamProperties
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetAudioStreamProperties =
+  hs_bindgen_a513bf944ff78877
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamFormat@
+foreign import ccall unsafe "hs_bindgen_4b2310dc9f80a9f8"
+  hs_bindgen_4b2310dc9f80a9f8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamFormat@
+hs_bindgen_4b2310dc9f80a9f8
+  :: BG.Ptr SDL_AudioStream
+  -> BG.Ptr SDL_AudioSpec
+  -> BG.Ptr SDL_AudioSpec
+  -> IO BG.CBool
+hs_bindgen_4b2310dc9f80a9f8 =
+  BG.fromFFIType hs_bindgen_4b2310dc9f80a9f8_base
+
+-- | Query the current format of an audio stream.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamFormat'
+--
+--     [C declaration]: @SDL_GetAudioStreamFormat@, defined at @SDL3\/SDL_audio.h 1119:34@
+sDL_GetAudioStreamFormat
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: where to store the input audio format; ignored if NULL.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: where to store the output audio format; ignored if NULL.
+  -> IO BG.CBool
+sDL_GetAudioStreamFormat =
+  hs_bindgen_4b2310dc9f80a9f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamFormat@
+foreign import ccall unsafe "hs_bindgen_a8488bb9b411fc5d"
+  hs_bindgen_a8488bb9b411fc5d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamFormat@
+hs_bindgen_a8488bb9b411fc5d
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> IO BG.CBool
+hs_bindgen_a8488bb9b411fc5d =
+  BG.fromFFIType hs_bindgen_a8488bb9b411fc5d_base
+
+-- | Change the input and output formats of an audio stream.
+--
+--     Future calls to and SDL_GetAudioStreamAvailable and SDL_GetAudioStreamData will reflect the new format, and future calls to SDL_PutAudioStreamData must provide data in the new input formats.
+--
+--     Data that was previously queued in the stream will still be operated on in the format that was current when it was added, which is to say you can put the end of a sound file in one format to a stream, change formats for the next sound file, and start putting that new data while the previous sound file is still queued, and everything will still play back correctly.
+--
+--     If a stream is bound to a device, then the format of the side of the stream bound to a device cannot be changed (src_spec for recording devices, dst_spec for playback devices). Attempts to make a change to this side will be ignored, but this will not report an error. The other side\'s format can be changed.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamFormat', 'sDL_SetAudioStreamFrequencyRatio'
+--
+--     [C declaration]: @SDL_SetAudioStreamFormat@, defined at @SDL3\/SDL_audio.h 1156:34@
+sDL_SetAudioStreamFormat
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the format is being changed.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the new format of the audio input; if NULL, it is not changed.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the new format of the audio output; if NULL, it is not changed.
+  -> IO BG.CBool
+sDL_SetAudioStreamFormat =
+  hs_bindgen_a8488bb9b411fc5d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamFrequencyRatio@
+foreign import ccall unsafe "hs_bindgen_15397b18d1ddad29"
+  hs_bindgen_15397b18d1ddad29_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamFrequencyRatio@
+hs_bindgen_15397b18d1ddad29
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CFloat
+hs_bindgen_15397b18d1ddad29 =
+  BG.fromFFIType hs_bindgen_15397b18d1ddad29_base
+
+-- | Get the frequency ratio of an audio stream.
+--
+--     [Returns]: the frequency ratio of the stream or 0.0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamFrequencyRatio'
+--
+--     [C declaration]: @SDL_GetAudioStreamFrequencyRatio@, defined at @SDL3\/SDL_audio.h 1172:35@
+sDL_GetAudioStreamFrequencyRatio
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO BG.CFloat
+sDL_GetAudioStreamFrequencyRatio =
+  hs_bindgen_15397b18d1ddad29
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamFrequencyRatio@
+foreign import ccall unsafe "hs_bindgen_86275fb04d01b569"
+  hs_bindgen_86275fb04d01b569_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamFrequencyRatio@
+hs_bindgen_86275fb04d01b569
+  :: BG.Ptr SDL_AudioStream
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_86275fb04d01b569 =
+  BG.fromFFIType hs_bindgen_86275fb04d01b569_base
+
+-- | Change the frequency ratio of an audio stream.
+--
+--     The frequency ratio is used to adjust the rate at which input data is consumed. Changing this effectively modifies the speed and pitch of the audio. A value greater than 1.0f will play the audio faster, and at a higher pitch. A value less than 1.0f will play the audio slower, and at a lower pitch. 1.0f means play at normal speed.
+--
+--     This is applied during SDL_GetAudioStreamData, and can be continuously changed to create various effects.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamFrequencyRatio', 'sDL_SetAudioStreamFormat'
+--
+--     [C declaration]: @SDL_SetAudioStreamFrequencyRatio@, defined at @SDL3\/SDL_audio.h 1200:34@
+sDL_SetAudioStreamFrequencyRatio
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream on which the frequency ratio is being changed.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@ratio@]: the frequency ratio. 1.0 is normal speed. Must be between 0.01 and 100.
+  -> IO BG.CBool
+sDL_SetAudioStreamFrequencyRatio =
+  hs_bindgen_86275fb04d01b569
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamGain@
+foreign import ccall unsafe "hs_bindgen_b0201fb647f1a55c"
+  hs_bindgen_b0201fb647f1a55c_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamGain@
+hs_bindgen_b0201fb647f1a55c
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CFloat
+hs_bindgen_b0201fb647f1a55c =
+  BG.fromFFIType hs_bindgen_b0201fb647f1a55c_base
+
+-- | Get the gain of an audio stream.
+--
+--     The gain of a stream is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio streams default to a gain of 1.0f (no change in output).
+--
+--     [Returns]: the gain of the stream or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamGain'
+--
+--     [C declaration]: @SDL_GetAudioStreamGain@, defined at @SDL3\/SDL_audio.h 1221:35@
+sDL_GetAudioStreamGain
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> IO BG.CFloat
+sDL_GetAudioStreamGain = hs_bindgen_b0201fb647f1a55c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamGain@
+foreign import ccall unsafe "hs_bindgen_90b7daeac2130f28"
+  hs_bindgen_90b7daeac2130f28_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamGain@
+hs_bindgen_90b7daeac2130f28
+  :: BG.Ptr SDL_AudioStream
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_90b7daeac2130f28 =
+  BG.fromFFIType hs_bindgen_90b7daeac2130f28_base
+
+-- | Change the gain of an audio stream.
+--
+--     The gain of a stream is its volume; a larger gain means a louder output, with a gain of zero being silence.
+--
+--     Audio streams default to a gain of 1.0f (no change in output).
+--
+--     This is applied during SDL_GetAudioStreamData, and can be continuously changed to create various effects.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamGain'
+--
+--     [C declaration]: @SDL_SetAudioStreamGain@, defined at @SDL3\/SDL_audio.h 1246:34@
+sDL_SetAudioStreamGain
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream on which the gain is being changed.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@gain@]: the gain. 1.0f is no change, 0.0f is silence.
+  -> IO BG.CBool
+sDL_SetAudioStreamGain = hs_bindgen_90b7daeac2130f28
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamInputChannelMap@
+foreign import ccall unsafe "hs_bindgen_1b79fdfec2f48b4f"
+  hs_bindgen_1b79fdfec2f48b4f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamInputChannelMap@
+hs_bindgen_1b79fdfec2f48b4f
+  :: BG.Ptr SDL_AudioStream
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr BG.CInt)
+hs_bindgen_1b79fdfec2f48b4f =
+  BG.fromFFIType hs_bindgen_1b79fdfec2f48b4f_base
+
+-- | Get the current input channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     Audio streams default to no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_GetAudioStreamInputChannelMap@, defined at @SDL3\/SDL_audio.h 1270:35@
+sDL_GetAudioStreamInputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+sDL_GetAudioStreamInputChannelMap =
+  hs_bindgen_1b79fdfec2f48b4f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamOutputChannelMap@
+foreign import ccall unsafe "hs_bindgen_0c6aa9ee60372768"
+  hs_bindgen_0c6aa9ee60372768_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamOutputChannelMap@
+hs_bindgen_0c6aa9ee60372768
+  :: BG.Ptr SDL_AudioStream
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr BG.CInt)
+hs_bindgen_0c6aa9ee60372768 =
+  BG.fromFFIType hs_bindgen_0c6aa9ee60372768_base
+
+-- | Get the current output channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     Audio streams default to no remapping applied. This is represented by returning NULL, and does not signify an error.
+--
+--     [Returns]: an array of the current channel mapping, with as many elements as the current output spec\'s channels, or NULL if default. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_GetAudioStreamOutputChannelMap@, defined at @SDL3\/SDL_audio.h 1294:35@
+sDL_GetAudioStreamOutputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: On output, set to number of channels in the map. Can be NULL.
+  -> IO (BG.Ptr BG.CInt)
+sDL_GetAudioStreamOutputChannelMap =
+  hs_bindgen_0c6aa9ee60372768
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamInputChannelMap@
+foreign import ccall unsafe "hs_bindgen_c2adfd0bb37d9aa2"
+  hs_bindgen_c2adfd0bb37d9aa2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamInputChannelMap@
+hs_bindgen_c2adfd0bb37d9aa2
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_c2adfd0bb37d9aa2 =
+  BG.fromFFIType hs_bindgen_c2adfd0bb37d9aa2_base
+
+-- | Set the current input channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     The input channel map reorders data that is added to a stream via SDL_PutAudioStreamData. Future calls to SDL_PutAudioStreamData must provide data in the new channel order.
+--
+--     Each item in the array represents an input channel, and its value is the channel that it should be remapped to. To reverse a stereo signal\'s left and right values, you\'d have an array of @{ 1, 0 }@. It is legal to remap multiple channels to the same thing, so @{ 1, 1 }@ would duplicate the right channel to both channels of a stereo signal. An element in the channel map set to -1 instead of a valid channel will mute that channel, setting it to a silence value.
+--
+--     You cannot change the number of channels through a channel map, just reorder\/mute them.
+--
+--     Data that was previously queued in the stream will still be operated on in the order that was current when it was added, which is to say you can put the end of a sound file in one order to a stream, change orders for the next sound file, and start putting that new data while the previous sound file is still queued, and everything will still play back correctly.
+--
+--     Audio streams default to no remapping applied. Passing a NULL channel map is legal, and turns off remapping.
+--
+--     SDL will copy the channel map; the caller does not have to save this array after this call.
+--
+--     If @count@ is not equal to the current number of channels in the audio stream\'s format, this will fail. This is a safety measure to make sure a race condition hasn\'t changed the format while this call is setting the channel map.
+--
+--     Unlike attempting to change the stream\'s format, the input channel map on a stream bound to a recording device is permitted to change at any time; any data added to the stream from the device after this call will have the new mapping, but previously-added data will still have the prior mapping.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running. Don\'t change the stream\'s format to have a different number of channels from a different thread at the same time, though!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_SetAudioStreamInputChannelMap@, defined at @SDL3\/SDL_audio.h 1354:34@
+sDL_SetAudioStreamInputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to change.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@chmap@]: the new channel map, NULL to reset to default.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: The number of channels in the map.
+  -> IO BG.CBool
+sDL_SetAudioStreamInputChannelMap =
+  hs_bindgen_c2adfd0bb37d9aa2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamOutputChannelMap@
+foreign import ccall unsafe "hs_bindgen_b0ed00a566f29be4"
+  hs_bindgen_b0ed00a566f29be4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamOutputChannelMap@
+hs_bindgen_b0ed00a566f29be4
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_b0ed00a566f29be4 =
+  BG.fromFFIType hs_bindgen_b0ed00a566f29be4_base
+
+-- | Set the current output channel map of an audio stream.
+--
+--     Channel maps are optional; most things do not need them, instead passing data in the [order that SDL expects](CategoryAudio#channel-layouts).
+--
+--     The output channel map reorders data that is leaving a stream via SDL_GetAudioStreamData.
+--
+--     Each item in the array represents an input channel, and its value is the channel that it should be remapped to. To reverse a stereo signal\'s left and right values, you\'d have an array of @{ 1, 0 }@. It is legal to remap multiple channels to the same thing, so @{ 1, 1 }@ would duplicate the right channel to both channels of a stereo signal. An element in the channel map set to -1 instead of a valid channel will mute that channel, setting it to a silence value.
+--
+--     You cannot change the number of channels through a channel map, just reorder\/mute them.
+--
+--     The output channel map can be changed at any time, as output remapping is applied during SDL_GetAudioStreamData.
+--
+--     Audio streams default to no remapping applied. Passing a NULL channel map is legal, and turns off remapping.
+--
+--     SDL will copy the channel map; the caller does not have to save this array after this call.
+--
+--     If @count@ is not equal to the current number of channels in the audio stream\'s format, this will fail. This is a safety measure to make sure a race condition hasn\'t changed the format while this call is setting the channel map.
+--
+--     Unlike attempting to change the stream\'s format, the output channel map on a stream bound to a recording device is permitted to change at any time; any data added to the stream after this call will have the new mapping, but previously-added data will still have the prior mapping. When the channel map doesn\'t match the hardware\'s channel layout, SDL will convert the data before feeding it to the device for playback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as it holds a stream-specific mutex while running. Don\'t change the stream\'s format to have a different number of channels from a a different thread at the same time, though!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamInputChannelMap'
+--
+--     [C declaration]: @SDL_SetAudioStreamOutputChannelMap@, defined at @SDL3\/SDL_audio.h 1412:34@
+sDL_SetAudioStreamOutputChannelMap
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the 'SDL_AudioStream' to change.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@chmap@]: the new channel map, NULL to reset to default.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: The number of channels in the map.
+  -> IO BG.CBool
+sDL_SetAudioStreamOutputChannelMap =
+  hs_bindgen_b0ed00a566f29be4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_PutAudioStreamData@
+foreign import ccall unsafe "hs_bindgen_32b25453fa9b8c52"
+  hs_bindgen_32b25453fa9b8c52_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_PutAudioStreamData@
+hs_bindgen_32b25453fa9b8c52
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_32b25453fa9b8c52 =
+  BG.fromFFIType hs_bindgen_32b25453fa9b8c52_base
+
+-- | Add data to the stream.
+--
+--     This data must match the format\/channels\/samplerate specified in the latest call to SDL_SetAudioStreamFormat, or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     Note that this call simply copies the unconverted data for later. This is different than SDL2, where data was converted during the Put call and the Get call would just dequeue the previously-converted data.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_FlushAudioStream', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued'
+--
+--     [C declaration]: @SDL_PutAudioStreamData@, defined at @SDL3\/SDL_audio.h 1442:34@
+sDL_PutAudioStreamData
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@buf@]: a pointer to the audio data to add.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@len@]: the number of bytes to write to the stream.
+  -> IO BG.CBool
+sDL_PutAudioStreamData = hs_bindgen_32b25453fa9b8c52
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_PutAudioStreamDataNoCopy@
+foreign import ccall unsafe "hs_bindgen_8e034cb6408bf39f"
+  hs_bindgen_8e034cb6408bf39f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_PutAudioStreamDataNoCopy@
+hs_bindgen_8e034cb6408bf39f
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> SDL_AudioStreamDataCompleteCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_8e034cb6408bf39f =
+  BG.fromFFIType hs_bindgen_8e034cb6408bf39f_base
+
+-- | Add external data to an audio stream without copying it.
+--
+--     Unlike @SDL_PutAudioStreamData()@, this function does not make a copy of the provided data, instead storing the provided pointer. This means that the put operation does not need to allocate and copy the data, but the original data must remain available until the stream is done with it, either by being read from the stream in its entirety, or a call to @SDL_ClearAudioStream()@ or @SDL_DestroyAudioStream()@.
+--
+--     The data must match the format\/channels\/samplerate specified in the latest call to SDL_SetAudioStreamFormat, or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     An optional callback may be provided, which is called when the stream no longer needs the data. Once this callback fires, the stream will not access the data again. This callback will fire for any reason the data is no longer needed, including clearing or destroying the stream.
+--
+--     Note that there is still an allocation to store tracking information, so this function is more efficient for larger blocks of data. If you\'re planning to put a few samples at a time, it will be more efficient to use @SDL_PutAudioStreamData()@, which allocates and buffers in blocks.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_FlushAudioStream', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued'
+--
+--     [C declaration]: @SDL_PutAudioStreamDataNoCopy@, defined at @SDL3\/SDL_audio.h 1519:34@
+sDL_PutAudioStreamDataNoCopy
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@buf@]: a pointer to the audio data to add.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@len@]: the number of bytes to add to the stream.
+  -> SDL_AudioStreamDataCompleteCallback
+  -- ^
+  --
+  --           [@callback@]: the callback function to call when the data is no longer needed by the stream. May be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO BG.CBool
+sDL_PutAudioStreamDataNoCopy =
+  hs_bindgen_8e034cb6408bf39f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_PutAudioStreamPlanarData@
+foreign import ccall unsafe "hs_bindgen_2517bbaa11deade2"
+  hs_bindgen_2517bbaa11deade2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_PutAudioStreamPlanarData@
+hs_bindgen_2517bbaa11deade2
+  :: BG.Ptr SDL_AudioStream
+  -> PtrConst.PtrConst (PtrConst.PtrConst BG.Void)
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_2517bbaa11deade2 =
+  BG.fromFFIType hs_bindgen_2517bbaa11deade2_base
+
+-- | Add data to the stream with each channel in a separate array.
+--
+--     This data must match the format\/channels\/samplerate specified in the latest call to SDL_SetAudioStreamFormat, or the format specified when creating the stream if it hasn\'t been changed.
+--
+--     The data will be interleaved and queued. Note that 'SDL_AudioStream' only operates on interleaved data, so this is simply a convenience function for easily queueing data from sources that provide separate arrays. There is no equivalent function to retrieve planar data.
+--
+--     The arrays in @channel_buffers@ are ordered as they are to be interleaved; the first array will be the first sample in the interleaved data. Any individual array may be NULL; in this case, silence will be interleaved for that channel.
+--
+--     @num_channels@ specifies how many arrays are in @channel_buffers@. This can be used as a safety to prevent overflow, in case the stream format has changed elsewhere. If more channels are specified than the current input spec, they are ignored. If less channels are specified, the missing arrays are treated as if they are NULL (silence is written to those channels). If the count is -1, SDL will assume the array count matches the current input spec.
+--
+--     Note that @num_samples@ is the number of /samples per array/. This can also be thought of as the number of /sample frames/ to be queued. A value of 1 with stereo arrays will queue two samples to the stream. This is different than SDL_PutAudioStreamData, which wants the size of a single array in bytes.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_FlushAudioStream', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued'
+--
+--     [C declaration]: @SDL_PutAudioStreamPlanarData@, defined at @SDL3\/SDL_audio.h 1572:34@
+sDL_PutAudioStreamPlanarData
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio data is being added to.
+  -> PtrConst.PtrConst (PtrConst.PtrConst BG.Void)
+  -- ^
+  --
+  --           [@channel_buffers@]: a pointer to an array of arrays, one array per channel.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_channels@]: the number of arrays in @channel_buffers@ or -1.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_samples@]: the number of /samples/ per array to write to the stream.
+  -> IO BG.CBool
+sDL_PutAudioStreamPlanarData =
+  hs_bindgen_2517bbaa11deade2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamData@
+foreign import ccall unsafe "hs_bindgen_05c01671d414ec35"
+  hs_bindgen_05c01671d414ec35_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamData@
+hs_bindgen_05c01671d414ec35
+  :: BG.Ptr SDL_AudioStream
+  -> BG.Ptr BG.Void
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_05c01671d414ec35 =
+  BG.fromFFIType hs_bindgen_05c01671d414ec35_base
+
+-- | Get converted\/resampled data from the stream.
+--
+--     The input\/output data format\/channels\/samplerate is specified when creating the stream, and can be changed after creation by calling SDL_SetAudioStreamFormat.
+--
+--     Note that any conversion and resampling necessary is done during this call, and SDL_PutAudioStreamData simply queues unconverted data for later. This is different than SDL2, where that work was done while inputting new data to the stream and requesting the output just copied the converted data.
+--
+--     [Returns]: the number of bytes read from the stream or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but if the stream has a callback set, the caller might need to manage extra locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearAudioStream', 'sDL_GetAudioStreamAvailable', 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_GetAudioStreamData@, defined at @SDL3\/SDL_audio.h 1602:33@
+sDL_GetAudioStreamData
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the stream the audio is being requested from.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@buf@]: a buffer to fill with audio data.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@len@]: the maximum number of bytes to fill.
+  -> IO BG.CInt
+sDL_GetAudioStreamData = hs_bindgen_05c01671d414ec35
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamAvailable@
+foreign import ccall unsafe "hs_bindgen_6693b5a0bc38b7f9"
+  hs_bindgen_6693b5a0bc38b7f9_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamAvailable@
+hs_bindgen_6693b5a0bc38b7f9
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CInt
+hs_bindgen_6693b5a0bc38b7f9 =
+  BG.fromFFIType hs_bindgen_6693b5a0bc38b7f9_base
+
+-- | Get the number of converted\/resampled bytes available.
+--
+--     The stream may be buffering data behind the scenes until it has enough to resample correctly, so this number might be lower than what you expect, or even be zero. Add more data or flush the stream if you need the data now.
+--
+--     If the stream has so much data that it would overflow an int, the return value is clamped to a maximum value, but no queued data is lost; if there are gigabytes of data queued, the app might need to read some of it with SDL_GetAudioStreamData before this function\'s return value is no longer clamped.
+--
+--     [Returns]: the number of converted\/resampled bytes available or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamData', 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_GetAudioStreamAvailable@, defined at @SDL3\/SDL_audio.h 1628:33@
+sDL_GetAudioStreamAvailable
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO BG.CInt
+sDL_GetAudioStreamAvailable =
+  hs_bindgen_6693b5a0bc38b7f9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamQueued@
+foreign import ccall unsafe "hs_bindgen_75fb0631cff6ceae"
+  hs_bindgen_75fb0631cff6ceae_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioStreamQueued@
+hs_bindgen_75fb0631cff6ceae
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CInt
+hs_bindgen_75fb0631cff6ceae =
+  BG.fromFFIType hs_bindgen_75fb0631cff6ceae_base
+
+-- | Get the number of bytes currently queued.
+--
+--     This is the number of bytes put into a stream as input, not the number that can be retrieved as output. Because of several details, it\'s not possible to calculate one number directly from the other. If you need to know how much usable data can be retrieved right now, you should use @SDL_GetAudioStreamAvailable()@ and not this function.
+--
+--     Note that audio streams can change their input format at any time, even if there is still data queued in a different format, so the returned byte count will not necessarily match the number of /sample frames/ available. Users of this API should be aware of format changes they make when feeding a stream and plan accordingly.
+--
+--     Queued data is not converted until it is consumed by SDL_GetAudioStreamData, so this value should be representative of the exact data that was put into the stream.
+--
+--     If the stream has so much data that it would overflow an int, the return value is clamped to a maximum value, but no queued data is lost; if there are gigabytes of data queued, the app might need to read some of it with SDL_GetAudioStreamData before this function\'s return value is no longer clamped.
+--
+--     [Returns]: the number of bytes queued or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PutAudioStreamData', 'sDL_ClearAudioStream'
+--
+--     [C declaration]: @SDL_GetAudioStreamQueued@, defined at @SDL3\/SDL_audio.h 1667:33@
+sDL_GetAudioStreamQueued
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to query.
+  -> IO BG.CInt
+sDL_GetAudioStreamQueued =
+  hs_bindgen_75fb0631cff6ceae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_FlushAudioStream@
+foreign import ccall unsafe "hs_bindgen_ad5616a591f54851"
+  hs_bindgen_ad5616a591f54851_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_FlushAudioStream@
+hs_bindgen_ad5616a591f54851
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_ad5616a591f54851 =
+  BG.fromFFIType hs_bindgen_ad5616a591f54851_base
+
+-- | Tell the stream that you\'re done sending data, and anything being buffered should be converted\/resampled and made available immediately.
+--
+--     It is legal to add more data to a stream after flushing, but there may be audio gaps in the output. Generally this is intended to signal the end of input, so the complete output becomes available.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_FlushAudioStream@, defined at @SDL3\/SDL_audio.h 1688:34@
+sDL_FlushAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to flush.
+  -> IO BG.CBool
+sDL_FlushAudioStream = hs_bindgen_ad5616a591f54851
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_ClearAudioStream@
+foreign import ccall unsafe "hs_bindgen_f4d190bd770b2df3"
+  hs_bindgen_f4d190bd770b2df3_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_ClearAudioStream@
+hs_bindgen_f4d190bd770b2df3
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_f4d190bd770b2df3 =
+  BG.fromFFIType hs_bindgen_f4d190bd770b2df3_base
+
+-- | Clear any pending data in the stream.
+--
+--     This drops any queued data, so there will be nothing to read from the stream until more is added.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamAvailable', 'sDL_GetAudioStreamData', 'sDL_GetAudioStreamQueued', 'sDL_PutAudioStreamData'
+--
+--     [C declaration]: @SDL_ClearAudioStream@, defined at @SDL3\/SDL_audio.h 1709:34@
+sDL_ClearAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to clear.
+  -> IO BG.CBool
+sDL_ClearAudioStream = hs_bindgen_f4d190bd770b2df3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_PauseAudioStreamDevice@
+foreign import ccall unsafe "hs_bindgen_fa7a02853d833a6c"
+  hs_bindgen_fa7a02853d833a6c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_PauseAudioStreamDevice@
+hs_bindgen_fa7a02853d833a6c
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_fa7a02853d833a6c =
+  BG.fromFFIType hs_bindgen_fa7a02853d833a6c_base
+
+-- | Use this function to pause audio playback on the audio device associated with an audio stream.
+--
+--     This function pauses audio processing for a given device. Any bound audio streams will not progress, and no audio will be generated. Pausing one device does not prevent other unpaused devices from running.
+--
+--     Pausing a device can be useful to halt all audio without unbinding all the audio streams. This might be useful while a game is paused, or a level is loading, etc.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResumeAudioStreamDevice'
+--
+--     [C declaration]: @SDL_PauseAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1733:34@
+sDL_PauseAudioStreamDevice
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to pause.
+  -> IO BG.CBool
+sDL_PauseAudioStreamDevice =
+  hs_bindgen_fa7a02853d833a6c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_ResumeAudioStreamDevice@
+foreign import ccall unsafe "hs_bindgen_0460d36f7042c57a"
+  hs_bindgen_0460d36f7042c57a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_ResumeAudioStreamDevice@
+hs_bindgen_0460d36f7042c57a
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_0460d36f7042c57a =
+  BG.fromFFIType hs_bindgen_0460d36f7042c57a_base
+
+-- | Use this function to unpause audio playback on the audio device associated with an audio stream.
+--
+--     This function unpauses audio processing for a given device that has previously been paused. Once unpaused, any bound audio streams will begin to progress again, and audio can be generated.
+--
+--     SDL_OpenAudioDeviceStream opens audio devices in a paused state, so this function call is required for audio playback to begin on such devices.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseAudioStreamDevice'
+--
+--     [C declaration]: @SDL_ResumeAudioStreamDevice@, defined at @SDL3\/SDL_audio.h 1756:34@
+sDL_ResumeAudioStreamDevice
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to resume.
+  -> IO BG.CBool
+sDL_ResumeAudioStreamDevice =
+  hs_bindgen_0460d36f7042c57a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_AudioStreamDevicePaused@
+foreign import ccall unsafe "hs_bindgen_ffc6b2bb5b052f6d"
+  hs_bindgen_ffc6b2bb5b052f6d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_AudioStreamDevicePaused@
+hs_bindgen_ffc6b2bb5b052f6d
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_ffc6b2bb5b052f6d =
+  BG.fromFFIType hs_bindgen_ffc6b2bb5b052f6d_base
+
+-- | Use this function to query if an audio device associated with a stream is paused.
+--
+--     Unlike in SDL2, audio devices start in an /unpaused/ state, since an app has to bind a stream before any audio will flow.
+--
+--     [Returns]: true if device is valid and paused, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseAudioStreamDevice', 'sDL_ResumeAudioStreamDevice'
+--
+--     [C declaration]: @SDL_AudioStreamDevicePaused@, defined at @SDL3\/SDL_audio.h 1775:34@
+sDL_AudioStreamDevicePaused
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream associated with the audio device to query.
+  -> IO BG.CBool
+sDL_AudioStreamDevicePaused =
+  hs_bindgen_ffc6b2bb5b052f6d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_LockAudioStream@
+foreign import ccall unsafe "hs_bindgen_0f17d22c674fb4db"
+  hs_bindgen_0f17d22c674fb4db_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_LockAudioStream@
+hs_bindgen_0f17d22c674fb4db
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_0f17d22c674fb4db =
+  BG.fromFFIType hs_bindgen_0f17d22c674fb4db_base
+
+-- | Lock an audio stream for serialized access.
+--
+--     Each 'SDL_AudioStream' has an internal mutex it uses to protect its data structures from threading conflicts. This function allows an app to lock that mutex, which could be useful if registering callbacks on this stream.
+--
+--     One does not need to lock a stream to use in it most cases, as the stream manages this lock internally. However, this lock is held during callbacks, which may run from arbitrary threads at any time, so if an app needs to protect shared data during those callbacks, locking the stream guarantees that the callback is not running while the lock is held.
+--
+--     As this is just a wrapper over SDL_LockMutex for an internal lock; it has all the same attributes (recursive locks are allowed, etc).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UnlockAudioStream'
+--
+--     [C declaration]: @SDL_LockAudioStream@, defined at @SDL3\/SDL_audio.h 1804:34@
+sDL_LockAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to lock.
+  -> IO BG.CBool
+sDL_LockAudioStream = hs_bindgen_0f17d22c674fb4db
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_UnlockAudioStream@
+foreign import ccall unsafe "hs_bindgen_03cca6936a438b69"
+  hs_bindgen_03cca6936a438b69_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_UnlockAudioStream@
+hs_bindgen_03cca6936a438b69
+  :: BG.Ptr SDL_AudioStream
+  -> IO BG.CBool
+hs_bindgen_03cca6936a438b69 =
+  BG.fromFFIType hs_bindgen_03cca6936a438b69_base
+
+-- | Unlock an audio stream for serialized access.
+--
+--     This unlocks an audio stream after a call to SDL_LockAudioStream.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: You should only call this from the same thread that previously called SDL_LockAudioStream.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockAudioStream'
+--
+--     [C declaration]: @SDL_UnlockAudioStream@, defined at @SDL3\/SDL_audio.h 1823:34@
+sDL_UnlockAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to unlock.
+  -> IO BG.CBool
+sDL_UnlockAudioStream = hs_bindgen_03cca6936a438b69
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamGetCallback@
+foreign import ccall unsafe "hs_bindgen_dc2f74eae1a93c31"
+  hs_bindgen_dc2f74eae1a93c31_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamGetCallback@
+hs_bindgen_dc2f74eae1a93c31
+  :: BG.Ptr SDL_AudioStream
+  -> SDL_AudioStreamCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_dc2f74eae1a93c31 =
+  BG.fromFFIType hs_bindgen_dc2f74eae1a93c31_base
+
+-- | Set a callback that runs when data is requested from an audio stream.
+--
+--     This callback is called /before/ data is obtained from the stream, giving the callback the chance to add more on-demand.
+--
+--     The callback can (optionally) call @SDL_PutAudioStreamData()@ to add more audio to the stream during this call; if needed, the request that triggered this callback will obtain the new data immediately.
+--
+--     The callback\'s @additional_amount@ argument is roughly how many bytes of /unconverted/ data (in the stream\'s input format) is needed by the caller, although this may overestimate a little for safety. This takes into account how much is already in the stream and only asks for any extra necessary to resolve the request, which means the callback may be asked for zero bytes, and a different amount on each call.
+--
+--     The callback is not required to supply exact amounts; it is allowed to supply too much or too little or none at all. The caller will get what\'s available, up to the amount they requested, regardless of this callback\'s outcome.
+--
+--     Clearing or flushing an audio stream does not call this callback.
+--
+--     This function obtains the stream\'s lock, which means any existing callback (get or put) in progress will finish running before setting the new callback.
+--
+--     Setting a NULL function turns off the callback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information. This only fails if @stream@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamPutCallback'
+--
+--     [C declaration]: @SDL_SetAudioStreamGetCallback@, defined at @SDL3\/SDL_audio.h 1911:34@
+sDL_SetAudioStreamGetCallback
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to set the new callback on.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: the new callback function to call when data is requested from the stream.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO BG.CBool
+sDL_SetAudioStreamGetCallback =
+  hs_bindgen_dc2f74eae1a93c31
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamPutCallback@
+foreign import ccall unsafe "hs_bindgen_146f387abf38d92a"
+  hs_bindgen_146f387abf38d92a_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioStreamPutCallback@
+hs_bindgen_146f387abf38d92a
+  :: BG.Ptr SDL_AudioStream
+  -> SDL_AudioStreamCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_146f387abf38d92a =
+  BG.fromFFIType hs_bindgen_146f387abf38d92a_base
+
+-- | Set a callback that runs when data is added to an audio stream.
+--
+--     This callback is called /after/ the data is added to the stream, giving the callback the chance to obtain it immediately.
+--
+--     The callback can (optionally) call @SDL_GetAudioStreamData()@ to obtain audio from the stream during this call.
+--
+--     The callback\'s @additional_amount@ argument is how many bytes of /converted/ data (in the stream\'s output format) was provided by the caller, although this may underestimate a little for safety. This value might be less than what is currently available in the stream, if data was already there, and might be less than the caller provided if the stream needs to keep a buffer to aid in resampling. Which means the callback may be provided with zero bytes, and a different amount on each call.
+--
+--     The callback may call SDL_GetAudioStreamAvailable to see the total amount currently available to read from the stream, instead of the total provided by the current call.
+--
+--     The callback is not required to obtain all data. It is allowed to read less or none at all. Anything not read now simply remains in the stream for later access.
+--
+--     Clearing or flushing an audio stream does not call this callback.
+--
+--     This function obtains the stream\'s lock, which means any existing callback (get or put) in progress will finish running before setting the new callback.
+--
+--     Setting a NULL function turns off the callback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information. This only fails if @stream@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAudioStreamGetCallback'
+--
+--     [C declaration]: @SDL_SetAudioStreamPutCallback@, defined at @SDL3\/SDL_audio.h 1960:34@
+sDL_SetAudioStreamPutCallback
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to set the new callback on.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: the new callback function to call when data is added to the stream.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer provided to the callback for its own personal use.
+  -> IO BG.CBool
+sDL_SetAudioStreamPutCallback =
+  hs_bindgen_146f387abf38d92a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_DestroyAudioStream@
+foreign import ccall unsafe "hs_bindgen_49f1ea9de2669438"
+  hs_bindgen_49f1ea9de2669438_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_DestroyAudioStream@
+hs_bindgen_49f1ea9de2669438
+  :: BG.Ptr SDL_AudioStream
+  -> IO ()
+hs_bindgen_49f1ea9de2669438 =
+  BG.fromFFIType hs_bindgen_49f1ea9de2669438_base
+
+-- | Free an audio stream.
+--
+--     This will release all allocated data, including any audio that is still queued. You do not need to manually clear the stream first.
+--
+--     If this stream was bound to an audio device, it is unbound during this call. If this stream was created with SDL_OpenAudioDeviceStream, the audio device that was opened alongside this stream\'s creation will be closed, too.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAudioStream'
+--
+--     [C declaration]: @SDL_DestroyAudioStream@, defined at @SDL3\/SDL_audio.h 1982:34@
+sDL_DestroyAudioStream
+  :: BG.Ptr SDL_AudioStream
+  -- ^
+  --
+  --           [@stream@]: the audio stream to destroy.
+  -> IO ()
+sDL_DestroyAudioStream = hs_bindgen_49f1ea9de2669438
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_OpenAudioDeviceStream@
+foreign import ccall unsafe "hs_bindgen_c626b93042e17a97"
+  hs_bindgen_c626b93042e17a97_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_OpenAudioDeviceStream@
+hs_bindgen_c626b93042e17a97
+  :: SDL_AudioDeviceID
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> SDL_AudioStreamCallback
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr SDL_AudioStream)
+hs_bindgen_c626b93042e17a97 =
+  BG.fromFFIType hs_bindgen_c626b93042e17a97_base
+
+-- | Convenience function for straightforward audio init for the common case.
+--
+--     If all your app intends to do is provide a single source of PCM audio, this function allows you to do all your audio setup in a single call.
+--
+--     This is also intended to be a clean means to migrate apps from SDL2.
+--
+--     This function will open an audio device, create a stream and bind it. Unlike other methods of setup, the audio device will be closed when this stream is destroyed, so the app can treat the returned 'SDL_AudioStream' as the only object needed to manage audio playback.
+--
+--     Also unlike other functions, the audio device begins paused. This is to map more closely to SDL2-style behavior, since there is no extra step here to bind a stream to begin audio flowing. The audio device should be resumed with @SDL_ResumeAudioStreamDevice()@.
+--
+--     This function works with both playback and recording devices.
+--
+--     The @spec@ parameter represents the app\'s side of the audio stream. That is, for recording audio, this will be the output format, and for playing audio, this will be the input format. If spec is NULL, the system will choose the format, and the app can use @SDL_GetAudioStreamFormat()@ to obtain this information later.
+--
+--     If you don\'t care about opening a specific audio device, you can (and probably /should/), use SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK for playback and SDL_AUDIO_DEVICE_DEFAULT_RECORDING for recording.
+--
+--     One can optionally provide a callback function; if NULL, the app is expected to queue audio data for playback (or unqueue audio data if capturing). Otherwise, the callback will begin to fire once the device is unpaused.
+--
+--     Destroying the returned stream with SDL_DestroyAudioStream will also close the audio device associated with this stream.
+--
+--     [Returns]: an audio stream on success, ready to use, or NULL on failure; call SDL_GetError() for more information. When done with this stream, call SDL_DestroyAudioStream to free resources and close the device.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAudioStreamDevice', 'sDL_ResumeAudioStreamDevice'
+--
+--     [C declaration]: @SDL_OpenAudioDeviceStream@, defined at @SDL3\/SDL_audio.h 2045:47@
+sDL_OpenAudioDeviceStream
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: an audio device to open, or SDL_AUDIO_DEVICE_DEFAULT_PLAYBACK or SDL_AUDIO_DEVICE_DEFAULT_RECORDING.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: the audio stream\'s data format. Can be NULL.
+  -> SDL_AudioStreamCallback
+  -- ^
+  --
+  --           [@callback@]: a callback where the app will provide new data for playback, or receive new data for recording. Can be NULL, in which case the app will need to call SDL_PutAudioStreamData or SDL_GetAudioStreamData as necessary.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: app-controlled pointer passed to callback. Can be NULL. Ignored if callback is NULL.
+  -> IO (BG.Ptr SDL_AudioStream)
+sDL_OpenAudioDeviceStream =
+  hs_bindgen_c626b93042e17a97
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioPostmixCallback@
+foreign import ccall unsafe "hs_bindgen_2207c9d46d721c22"
+  hs_bindgen_2207c9d46d721c22_base
+    :: BG.Word32
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_SetAudioPostmixCallback@
+hs_bindgen_2207c9d46d721c22
+  :: SDL_AudioDeviceID
+  -> SDL_AudioPostmixCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_2207c9d46d721c22 =
+  BG.fromFFIType hs_bindgen_2207c9d46d721c22_base
+
+-- | Set a callback that fires when data is about to be fed to an audio device.
+--
+--     This is useful for accessing the final mix, perhaps for writing a visualizer or applying a final effect to the audio data before playback.
+--
+--     The buffer is the final mix of all bound audio streams on an opened device; this callback will fire regularly for any device that is both opened and unpaused. If there is no new data to mix, either because no streams are bound to the device or all the streams are empty, this callback will still fire with the entire buffer set to silence.
+--
+--     This callback is allowed to make changes to the data; the contents of the buffer after this call is what is ultimately passed along to the hardware.
+--
+--     The callback is always provided the data in float format (values from -1.0f to 1.0f), but the number of channels or sample rate may be different than the format the app requested when opening the device; SDL might have had to manage a conversion behind the scenes, or the playback might have jumped to new physical hardware when a system default changed, etc. These details may change between calls. Accordingly, the size of the buffer might change between calls as well.
+--
+--     This callback can run at any time, and from any thread; if you need to serialize access to your app\'s data, you should provide and use a mutex or other synchronization device.
+--
+--     All of this to say: there are specific needs this callback can fulfill, but it is not the simplest interface. Apps should generally provide audio in their preferred format through an 'SDL_AudioStream' and let SDL handle the difference.
+--
+--     This function is extremely time-sensitive; the callback should do the least amount of work possible and return as quickly as it can. The longer the callback runs, the higher the risk of audio dropouts or other problems.
+--
+--     This function will block until the audio device is in between iterations, so any existing callback that might be running will finish before this function sets the new callback and returns.
+--
+--     Setting a NULL callback function disables any previously-set callback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetAudioPostmixCallback@, defined at @SDL3\/SDL_audio.h 2136:34@
+sDL_SetAudioPostmixCallback
+  :: SDL_AudioDeviceID
+  -- ^
+  --
+  --           [@devid@]: the ID of an opened audio device.
+  -> SDL_AudioPostmixCallback
+  -- ^
+  --
+  --           [@callback@]: a callback function to be called. Can be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: app-controlled pointer passed to callback. Can be NULL.
+  -> IO BG.CBool
+sDL_SetAudioPostmixCallback =
+  hs_bindgen_2207c9d46d721c22
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_LoadWAV_IO@
+foreign import ccall unsafe "hs_bindgen_7d7f4ec89c051bd9"
+  hs_bindgen_7d7f4ec89c051bd9_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_LoadWAV_IO@
+hs_bindgen_7d7f4ec89c051bd9
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> BG.Ptr SDL_AudioSpec
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_7d7f4ec89c051bd9 =
+  BG.fromFFIType hs_bindgen_7d7f4ec89c051bd9_base
+
+-- | Load the audio data of a WAVE file into memory.
+--
+--     Loading a WAVE file requires @src@, @spec@, @audio_buf@ and @audio_len@ to be valid pointers. The entire data portion of the file is then loaded into memory and decoded if necessary.
+--
+--     Supported formats are RIFF WAVE files with the formats PCM (8, 16, 24, and 32 bits), IEEE Float (32 bits), Microsoft ADPCM and IMA ADPCM (4 bits), and A-law and mu-law (8 bits). Other formats are currently unsupported and cause an error.
+--
+--     If this function succeeds, the return value is zero and the pointer to the audio data allocated by the function is written to @audio_buf@ and its length in bytes to @audio_len@. The 'SDL_AudioSpec' members @freq@, @channels@, and @format@ are set to the values of the audio data in the buffer.
+--
+--     It\'s necessary to use SDL_free() to free the audio data returned in @audio_buf@ when it is no longer used.
+--
+--     Because of the underspecification of the .WAV format, there are many problematic files in the wild that cause issues with strict decoders. To provide compatibility with these files, this decoder is lenient in regards to the truncation of the file, the fact chunk, and the size of the RIFF chunk. The hints @SDL_HINT_WAVE_RIFF_CHUNK_SIZE@, @SDL_HINT_WAVE_TRUNCATION@, and @SDL_HINT_WAVE_FACT_CHUNK@ can be used to tune the behavior of the loading process.
+--
+--     Any file that is invalid (due to truncation, corruption, or wrong values in the headers), too big, or unsupported causes an error. Additionally, any critical I\/O error from the data source will terminate the loading process with an error. The function returns NULL on error and in all cases (with the exception of @src@ being NULL), an appropriate error message will be set.
+--
+--     It is required that the data source supports seeking.
+--
+--     Example:
+--
+--     @
+--     SDL_LoadWAV_IO(SDL_IOFromFile(\"sample.wav\", \"rb\"), true, &spec, &buf, &len);
+--     @
+--
+--     Note that the SDL_LoadWAV function does this same thing for you, but in a less messy way:
+--
+--     @
+--     SDL_LoadWAV(\"sample.wav\", &spec, &buf, &len);
+--     @
+--
+--     This function returns false if the .WAV file cannot be opened, uses an unknown data format, or is corrupt; call SDL_GetError() for more information.
+--
+--     [Returns]: true on success. @audio_buf@ will be filled with a pointer to an allocated buffer containing the audio data, and @audio_len@ is filled with the length of that audio buffer in bytes.
+--
+--     When the application is done with the data returned in @audio_buf@, it should call SDL_free() to dispose of it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_free, 'sDL_LoadWAV'
+--
+--     [C declaration]: @SDL_LoadWAV_IO@, defined at @SDL3\/SDL_audio.h 2217:34@
+sDL_LoadWAV_IO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data source for the WAVE data.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: a pointer to an 'SDL_AudioSpec' that will be set to the WAVE data\'s format details on successful return.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@audio_buf@]: a pointer filled with the audio data, allocated by the function.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@audio_len@]: a pointer filled with the length of the audio data buffer in bytes.
+  -> IO BG.CBool
+sDL_LoadWAV_IO = hs_bindgen_7d7f4ec89c051bd9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_LoadWAV@
+foreign import ccall unsafe "hs_bindgen_618ebcf6bf6e8650"
+  hs_bindgen_618ebcf6bf6e8650_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_LoadWAV@
+hs_bindgen_618ebcf6bf6e8650
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL_AudioSpec
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_618ebcf6bf6e8650 =
+  BG.fromFFIType hs_bindgen_618ebcf6bf6e8650_base
+
+-- | Loads a WAV from a file path.
+--
+--     This is a convenience function that is effectively the same as:
+--
+--     @
+--     SDL_LoadWAV_IO(SDL_IOFromFile(path, \"rb\"), true, spec, audio_buf, audio_len);
+--     @
+--
+--     This function returns false if the .WAV file cannot be opened, uses an unknown data format, or is corrupt; call SDL_GetError() for more information.
+--
+--     [Returns]: true on success. @audio_buf@ will be filled with a pointer to an allocated buffer containing the audio data, and @audio_len@ is filled with the length of that audio buffer in bytes.
+--
+--     When the application is done with the data returned in @audio_buf@, it should call SDL_free() to dispose of it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_free, 'sDL_LoadWAV_IO'
+--
+--     [C declaration]: @SDL_LoadWAV@, defined at @SDL3\/SDL_audio.h 2253:34@
+sDL_LoadWAV
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the file path of the WAV file to open.
+  -> BG.Ptr SDL_AudioSpec
+  -- ^
+  --
+  --           [@spec@]: a pointer to an 'SDL_AudioSpec' that will be set to the WAVE data\'s format details on successful return.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@audio_buf@]: a pointer filled with the audio data, allocated by the function.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@audio_len@]: a pointer filled with the length of the audio data buffer in bytes.
+  -> IO BG.CBool
+sDL_LoadWAV = hs_bindgen_618ebcf6bf6e8650
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_MixAudio@
+foreign import ccall unsafe "hs_bindgen_da6d00b62c3fdd0b"
+  hs_bindgen_da6d00b62c3fdd0b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_MixAudio@
+hs_bindgen_da6d00b62c3fdd0b
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL_AudioFormat
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_da6d00b62c3fdd0b =
+  BG.fromFFIType hs_bindgen_da6d00b62c3fdd0b_base
+
+-- | Mix audio data in a specified format.
+--
+--     This takes an audio buffer @src@ of @len@ bytes of @format@ data and mixes it into @dst@, performing addition, volume adjustment, and overflow clipping. The buffer pointed to by @dst@ must also be @len@ bytes of @format@ data.
+--
+--     This is provided for convenience you can mix your own audio data.
+--
+--     Do not use this function for mixing together more than two streams of sample data. The output from repeated application of this function may be distorted by clipping, because there is no accumulator with greater range than the input (not to mention this being an inefficient way of doing it).
+--
+--     It is a common misconception that this function is required to write audio data to an output stream in an audio callback. While you can do that, @SDL_MixAudio()@ is really only needed when you\'re mixing a single audio stream with a volume adjustment.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_MixAudio@, defined at @SDL3\/SDL_audio.h 2289:34@
+sDL_MixAudio
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@dst@]: the destination for the mixed audio.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@src@]: the source audio buffer to be mixed.
+  -> SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the 'SDL_AudioFormat' structure representing the desired audio format.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@len@]: the length of the audio buffer in bytes.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@volume@]: ranges from 0.0 - 1.0, and should be set to 1.0 for full audio volume.
+  -> IO BG.CBool
+sDL_MixAudio = hs_bindgen_da6d00b62c3fdd0b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_ConvertAudioSamples@
+foreign import ccall unsafe "hs_bindgen_a6d61748227d6f0b"
+  hs_bindgen_a6d61748227d6f0b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_ConvertAudioSamples@
+hs_bindgen_a6d61748227d6f0b
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_a6d61748227d6f0b =
+  BG.fromFFIType hs_bindgen_a6d61748227d6f0b_base
+
+-- | Convert some audio data of one format to another format.
+--
+--     Please note that this function is for convenience, but should not be used to resample audio in blocks, as it will introduce audio artifacts on the boundaries. You should only use this function if you are converting audio data in its entirety in one call. If you want to convert audio in smaller chunks, use an 'SDL_AudioStream', which is designed for this situation.
+--
+--     Internally, this function creates and destroys an 'SDL_AudioStream' on each use, so it\'s also less efficient than using one directly, if you need to convert multiple times.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ConvertAudioSamples@, defined at @SDL3\/SDL_audio.h 2319:34@
+sDL_ConvertAudioSamples
+  :: PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@src_spec@]: the format details of the input audio.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@src_data@]: the audio data to be converted.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@src_len@]: the len of src_data.
+  -> PtrConst.PtrConst SDL_AudioSpec
+  -- ^
+  --
+  --           [@dst_spec@]: the format details of the output audio.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8)
+  -- ^
+  --
+  --           [@dst_data@]: will be filled with a pointer to converted audio data, which should be freed with SDL_free(). On error, it will be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dst_len@]: will be filled with the len of dst_data.
+  -> IO BG.CBool
+sDL_ConvertAudioSamples = hs_bindgen_a6d61748227d6f0b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioFormatName@
+foreign import ccall unsafe "hs_bindgen_43b528b55cc775cf"
+  hs_bindgen_43b528b55cc775cf_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetAudioFormatName@
+hs_bindgen_43b528b55cc775cf
+  :: SDL_AudioFormat
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_43b528b55cc775cf =
+  BG.fromFFIType hs_bindgen_43b528b55cc775cf_base
+
+-- | Get the human readable name of an audio format.
+--
+--     [Returns]: the human readable name of the specified audio format or \"SDL_AUDIO_UNKNOWN\" if the format isn\'t recognized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetAudioFormatName@, defined at @SDL3\/SDL_audio.h 2332:42@
+sDL_GetAudioFormatName
+  :: SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the audio format to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetAudioFormatName = hs_bindgen_43b528b55cc775cf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetSilenceValueForFormat@
+foreign import ccall unsafe "hs_bindgen_0154acf0cb371eab"
+  hs_bindgen_0154acf0cb371eab_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Audio_Unsafe_SDL_GetSilenceValueForFormat@
+hs_bindgen_0154acf0cb371eab
+  :: SDL_AudioFormat
+  -> IO BG.CInt
+hs_bindgen_0154acf0cb371eab =
+  BG.fromFFIType hs_bindgen_0154acf0cb371eab_base
+
+-- | Get the appropriate memset value for silencing an audio format.
+--
+--     The value returned by this function can be used as the second argument to memset (or SDL_memset) to set an audio buffer in a specific format to silence.
+--
+--     [Returns]: a byte value that can be passed to memset.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSilenceValueForFormat@, defined at @SDL3\/SDL_audio.h 2348:33@
+sDL_GetSilenceValueForFormat
+  :: SDL_AudioFormat
+  -- ^
+  --
+  --           [@format@]: the audio data format to query.
+  -> IO BG.CInt
+sDL_GetSilenceValueForFormat =
+  hs_bindgen_0154acf0cb371eab
diff --git a/src/SDL3/Sys/Bindgen/Bits/FunPtr.hs b/src/SDL3/Sys/Bindgen/Bits/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Bits/FunPtr.hs
@@ -0,0 +1,84 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Bits.FunPtr (
+  SDL3.Sys.Bindgen.Bits.FunPtr.sDL_MostSignificantBitIndex32,
+  SDL3.Sys.Bindgen.Bits.FunPtr.sDL_HasExactlyOneBitSet32,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_bits.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Bits_get_SDL_MostSignificantBitIndex32 */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_ef0d609239e2f97c (void)) ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_MostSignificantBitIndex32;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Bits_get_SDL_HasExactlyOneBitSet32 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_424cf674227955df (void)) ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_HasExactlyOneBitSet32;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_get_SDL_MostSignificantBitIndex32@
+foreign import ccall unsafe "hs_bindgen_ef0d609239e2f97c"
+  hs_bindgen_ef0d609239e2f97c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_get_SDL_MostSignificantBitIndex32@
+hs_bindgen_ef0d609239e2f97c :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CInt))
+hs_bindgen_ef0d609239e2f97c =
+  BG.fromFFIType hs_bindgen_ef0d609239e2f97c_base
+
+{-# NOINLINE sDL_MostSignificantBitIndex32 #-}
+
+-- | [C declaration]: @SDL_MostSignificantBitIndex32@, defined at @SDL3\/SDL_bits.h 66:22@
+sDL_MostSignificantBitIndex32 :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CInt)
+sDL_MostSignificantBitIndex32 =
+  BG.unsafePerformIO hs_bindgen_ef0d609239e2f97c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_get_SDL_HasExactlyOneBitSet32@
+foreign import ccall unsafe "hs_bindgen_424cf674227955df"
+  hs_bindgen_424cf674227955df_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_get_SDL_HasExactlyOneBitSet32@
+hs_bindgen_424cf674227955df :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_424cf674227955df =
+  BG.fromFFIType hs_bindgen_424cf674227955df_base
+
+{-# NOINLINE sDL_HasExactlyOneBitSet32 #-}
+
+-- | Determine if a unsigned 32-bit value has exactly one bit set.
+--
+--     If there are no bits set (@x@ is zero), or more than one bit set, this returns false. If any one bit is exclusively set, this returns true.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [@x@]: the 32-bit value to examine.
+--
+--     [Returns]: true if exactly one bit is set in @x@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasExactlyOneBitSet32@, defined at @SDL3\/SDL_bits.h 133:23@
+sDL_HasExactlyOneBitSet32 :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_HasExactlyOneBitSet32 =
+  BG.unsafePerformIO hs_bindgen_424cf674227955df
diff --git a/src/SDL3/Sys/Bindgen/Bits/Safe.hs b/src/SDL3/Sys/Bindgen/Bits/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Bits/Safe.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Bits.Safe (
+  SDL3.Sys.Bindgen.Bits.Safe.sDL_MostSignificantBitIndex32,
+  SDL3.Sys.Bindgen.Bits.Safe.sDL_HasExactlyOneBitSet32,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_bits.h>"
+         , "signed int hs_bindgen_456d262a9d645a2c ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_MostSignificantBitIndex32)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_f02b1182f4d7fd03 ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_HasExactlyOneBitSet32)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_Safe_SDL_MostSignificantBitIndex32@
+foreign import ccall safe "hs_bindgen_456d262a9d645a2c"
+  hs_bindgen_456d262a9d645a2c_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_Safe_SDL_MostSignificantBitIndex32@
+hs_bindgen_456d262a9d645a2c
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CInt
+hs_bindgen_456d262a9d645a2c =
+  BG.fromFFIType hs_bindgen_456d262a9d645a2c_base
+
+-- | [C declaration]: @SDL_MostSignificantBitIndex32@, defined at @SDL3\/SDL_bits.h 66:22@
+sDL_MostSignificantBitIndex32
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @x@
+  -> IO BG.CInt
+sDL_MostSignificantBitIndex32 =
+  hs_bindgen_456d262a9d645a2c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_Safe_SDL_HasExactlyOneBitSet32@
+foreign import ccall safe "hs_bindgen_f02b1182f4d7fd03"
+  hs_bindgen_f02b1182f4d7fd03_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_Safe_SDL_HasExactlyOneBitSet32@
+hs_bindgen_f02b1182f4d7fd03
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_f02b1182f4d7fd03 =
+  BG.fromFFIType hs_bindgen_f02b1182f4d7fd03_base
+
+-- | Determine if a unsigned 32-bit value has exactly one bit set.
+--
+--     If there are no bits set (@x@ is zero), or more than one bit set, this returns false. If any one bit is exclusively set, this returns true.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if exactly one bit is set in @x@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasExactlyOneBitSet32@, defined at @SDL3\/SDL_bits.h 133:23@
+sDL_HasExactlyOneBitSet32
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@x@]: the 32-bit value to examine.
+  -> IO BG.CBool
+sDL_HasExactlyOneBitSet32 =
+  hs_bindgen_f02b1182f4d7fd03
diff --git a/src/SDL3/Sys/Bindgen/Bits/Unsafe.hs b/src/SDL3/Sys/Bindgen/Bits/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Bits/Unsafe.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Bits.Unsafe (
+  SDL3.Sys.Bindgen.Bits.Unsafe.sDL_MostSignificantBitIndex32,
+  SDL3.Sys.Bindgen.Bits.Unsafe.sDL_HasExactlyOneBitSet32,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_bits.h>"
+         , "signed int hs_bindgen_f46c1724b0f07dbc ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_MostSignificantBitIndex32)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_f449555941bbc6ef ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_HasExactlyOneBitSet32)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_Unsafe_SDL_MostSignificantBitIndex32@
+foreign import ccall unsafe "hs_bindgen_f46c1724b0f07dbc"
+  hs_bindgen_f46c1724b0f07dbc_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_Unsafe_SDL_MostSignificantBitIndex32@
+hs_bindgen_f46c1724b0f07dbc
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CInt
+hs_bindgen_f46c1724b0f07dbc =
+  BG.fromFFIType hs_bindgen_f46c1724b0f07dbc_base
+
+-- | [C declaration]: @SDL_MostSignificantBitIndex32@, defined at @SDL3\/SDL_bits.h 66:22@
+sDL_MostSignificantBitIndex32
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @x@
+  -> IO BG.CInt
+sDL_MostSignificantBitIndex32 =
+  hs_bindgen_f46c1724b0f07dbc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_Unsafe_SDL_HasExactlyOneBitSet32@
+foreign import ccall unsafe "hs_bindgen_f449555941bbc6ef"
+  hs_bindgen_f449555941bbc6ef_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Bits_Unsafe_SDL_HasExactlyOneBitSet32@
+hs_bindgen_f449555941bbc6ef
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_f449555941bbc6ef =
+  BG.fromFFIType hs_bindgen_f449555941bbc6ef_base
+
+-- | Determine if a unsigned 32-bit value has exactly one bit set.
+--
+--     If there are no bits set (@x@ is zero), or more than one bit set, this returns false. If any one bit is exclusively set, this returns true.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if exactly one bit is set in @x@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasExactlyOneBitSet32@, defined at @SDL3\/SDL_bits.h 133:23@
+sDL_HasExactlyOneBitSet32
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@x@]: the 32-bit value to examine.
+  -> IO BG.CBool
+sDL_HasExactlyOneBitSet32 =
+  hs_bindgen_f449555941bbc6ef
diff --git a/src/SDL3/Sys/Bindgen/Blendmode.hs b/src/SDL3/Sys/Bindgen/Blendmode.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Blendmode.hs
@@ -0,0 +1,454 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Blend modes decide how two colors will mix together. There are both standard modes for basic needs and a means to create custom modes, dictating what sort of math to do on what color components. A set of blend modes used in drawing operations.
+--
+--     These predefined blend modes are supported everywhere.
+--
+--     Additional values may be obtained from SDL_ComposeCustomBlendMode.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ComposeCustomBlendMode'
+module SDL3.Sys.Bindgen.Blendmode (
+  SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode (..),
+  SDL3.Sys.Bindgen.Blendmode.sDL_BLENDMODE_NONE,
+  SDL3.Sys.Bindgen.Blendmode.sDL_BLENDMODE_BLEND,
+  SDL3.Sys.Bindgen.Blendmode.sDL_BLENDMODE_BLEND_PREMULTIPLIED,
+  SDL3.Sys.Bindgen.Blendmode.sDL_BLENDMODE_ADD,
+  SDL3.Sys.Bindgen.Blendmode.sDL_BLENDMODE_ADD_PREMULTIPLIED,
+  SDL3.Sys.Bindgen.Blendmode.sDL_BLENDMODE_MOD,
+  SDL3.Sys.Bindgen.Blendmode.sDL_BLENDMODE_MUL,
+  SDL3.Sys.Bindgen.Blendmode.sDL_BLENDMODE_INVALID,
+  SDL3.Sys.Bindgen.Blendmode.SDL_BlendOperation (..),
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDOPERATION_ADD,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDOPERATION_SUBTRACT,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDOPERATION_REV_SUBTRACT,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDOPERATION_MINIMUM,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDOPERATION_MAXIMUM,
+  SDL3.Sys.Bindgen.Blendmode.SDL_BlendFactor (..),
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDFACTOR_ZERO,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDFACTOR_ONE,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDFACTOR_SRC_COLOR,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDFACTOR_SRC_ALPHA,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDFACTOR_DST_COLOR,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDFACTOR_DST_ALPHA,
+  pattern SDL3.Sys.Bindgen.Blendmode.SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_BlendMode@, defined at @SDL3\/SDL_blendmode.h 52:16@
+newtype SDL_BlendMode = SDL_BlendMode
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_BlendMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_BlendMode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_BlendMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_BlendMode "unwrap" where
+  type
+    CFieldType SDL_BlendMode "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | no blending: dstRGBA = srcRGBA
+--
+--     [C declaration]: @macro SDL_BLENDMODE_NONE@, defined at @SDL3\/SDL_blendmode.h 54:9@
+sDL_BLENDMODE_NONE :: BG.CUInt
+sDL_BLENDMODE_NONE = (0 :: BG.CUInt)
+
+-- | alpha blending: dstRGB = (srcRGB * srcA) + (dstRGB * (1-srcA)), dstA = srcA + (dstA * (1-srcA))
+--
+--     [C declaration]: @macro SDL_BLENDMODE_BLEND@, defined at @SDL3\/SDL_blendmode.h 55:9@
+sDL_BLENDMODE_BLEND :: BG.CUInt
+sDL_BLENDMODE_BLEND = (1 :: BG.CUInt)
+
+-- | pre-multiplied alpha blending: dstRGBA = srcRGBA + (dstRGBA * (1-srcA))
+--
+--     [C declaration]: @macro SDL_BLENDMODE_BLEND_PREMULTIPLIED@, defined at @SDL3\/SDL_blendmode.h 56:9@
+sDL_BLENDMODE_BLEND_PREMULTIPLIED :: BG.CUInt
+sDL_BLENDMODE_BLEND_PREMULTIPLIED = (16 :: BG.CUInt)
+
+-- | additive blending: dstRGB = (srcRGB * srcA) + dstRGB, dstA = dstA
+--
+--     [C declaration]: @macro SDL_BLENDMODE_ADD@, defined at @SDL3\/SDL_blendmode.h 57:9@
+sDL_BLENDMODE_ADD :: BG.CUInt
+sDL_BLENDMODE_ADD = (2 :: BG.CUInt)
+
+-- | pre-multiplied additive blending: dstRGB = srcRGB + dstRGB, dstA = dstA
+--
+--     [C declaration]: @macro SDL_BLENDMODE_ADD_PREMULTIPLIED@, defined at @SDL3\/SDL_blendmode.h 58:9@
+sDL_BLENDMODE_ADD_PREMULTIPLIED :: BG.CUInt
+sDL_BLENDMODE_ADD_PREMULTIPLIED = (32 :: BG.CUInt)
+
+-- | color modulate: dstRGB = srcRGB * dstRGB, dstA = dstA
+--
+--     [C declaration]: @macro SDL_BLENDMODE_MOD@, defined at @SDL3\/SDL_blendmode.h 59:9@
+sDL_BLENDMODE_MOD :: BG.CUInt
+sDL_BLENDMODE_MOD = (4 :: BG.CUInt)
+
+-- | color multiply: dstRGB = (srcRGB * dstRGB) + (dstRGB * (1-srcA)), dstA = dstA
+--
+--     [C declaration]: @macro SDL_BLENDMODE_MUL@, defined at @SDL3\/SDL_blendmode.h 60:9@
+sDL_BLENDMODE_MUL :: BG.CUInt
+sDL_BLENDMODE_MUL = (8 :: BG.CUInt)
+
+-- | [C declaration]: @macro SDL_BLENDMODE_INVALID@, defined at @SDL3\/SDL_blendmode.h 61:9@
+sDL_BLENDMODE_INVALID :: BG.CUInt
+sDL_BLENDMODE_INVALID = (2147483647 :: BG.CUInt)
+
+-- | The blend operation used when combining source and destination pixel components.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_BlendOperation@, defined at @SDL3\/SDL_blendmode.h 69:14@
+newtype SDL_BlendOperation = SDL_BlendOperation
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_BlendOperation where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_BlendOperation where
+  readRaw =
+    \ptr0 ->
+      pure SDL_BlendOperation
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_BlendOperation where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_BlendOperation unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_BlendOperation instance BG.Storable SDL_BlendOperation
+
+deriving via BG.CUInt instance BG.Prim SDL_BlendOperation
+
+instance CEnum.CEnum SDL_BlendOperation where
+  type CEnumZ SDL_BlendOperation = BG.CUInt
+
+  toCEnum = SDL_BlendOperation
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (1, BG.singleton "SDL_BLENDOPERATION_ADD")
+        , (2, BG.singleton "SDL_BLENDOPERATION_SUBTRACT")
+        , (3, BG.singleton "SDL_BLENDOPERATION_REV_SUBTRACT")
+        , (4, BG.singleton "SDL_BLENDOPERATION_MINIMUM")
+        , (5, BG.singleton "SDL_BLENDOPERATION_MAXIMUM")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_BlendOperation"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_BlendOperation"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_BlendOperation where
+  minDeclaredValue = SDL_BLENDOPERATION_ADD
+
+  maxDeclaredValue = SDL_BLENDOPERATION_MAXIMUM
+
+instance Show SDL_BlendOperation where
+  showsPrec = CEnum.shows
+
+instance Read SDL_BlendOperation where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_BlendOperation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_BlendOperation{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_BlendOperation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_BlendOperation "unwrap" where
+  type
+    CFieldType SDL_BlendOperation "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | dst + src: supported by all renderers
+--
+--     [C declaration]: @SDL_BLENDOPERATION_ADD@, defined at @SDL3\/SDL_blendmode.h 71:5@
+pattern SDL_BLENDOPERATION_ADD :: SDL_BlendOperation
+pattern SDL_BLENDOPERATION_ADD = SDL_BlendOperation 1
+
+-- | src - dst : supported by D3D, OpenGL, OpenGLES, and Vulkan
+--
+--     [C declaration]: @SDL_BLENDOPERATION_SUBTRACT@, defined at @SDL3\/SDL_blendmode.h 72:5@
+pattern SDL_BLENDOPERATION_SUBTRACT :: SDL_BlendOperation
+pattern SDL_BLENDOPERATION_SUBTRACT = SDL_BlendOperation 2
+
+-- | dst - src : supported by D3D, OpenGL, OpenGLES, and Vulkan
+--
+--     [C declaration]: @SDL_BLENDOPERATION_REV_SUBTRACT@, defined at @SDL3\/SDL_blendmode.h 73:5@
+pattern SDL_BLENDOPERATION_REV_SUBTRACT :: SDL_BlendOperation
+pattern SDL_BLENDOPERATION_REV_SUBTRACT = SDL_BlendOperation 3
+
+-- | min(dst, src) : supported by D3D, OpenGL, OpenGLES, and Vulkan
+--
+--     [C declaration]: @SDL_BLENDOPERATION_MINIMUM@, defined at @SDL3\/SDL_blendmode.h 74:5@
+pattern SDL_BLENDOPERATION_MINIMUM :: SDL_BlendOperation
+pattern SDL_BLENDOPERATION_MINIMUM = SDL_BlendOperation 4
+
+-- | max(dst, src) : supported by D3D, OpenGL, OpenGLES, and Vulkan
+--
+--     [C declaration]: @SDL_BLENDOPERATION_MAXIMUM@, defined at @SDL3\/SDL_blendmode.h 75:5@
+pattern SDL_BLENDOPERATION_MAXIMUM :: SDL_BlendOperation
+pattern SDL_BLENDOPERATION_MAXIMUM = SDL_BlendOperation 5
+
+-- | The normalized factor used to multiply pixel components.
+--
+--     The blend factors are multiplied with the pixels from a drawing operation (src) and the pixels from the render target (dst) before the blend operation. The comma-separated factors listed above are always applied in the component order red, green, blue, and alpha.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_BlendFactor@, defined at @SDL3\/SDL_blendmode.h 88:14@
+newtype SDL_BlendFactor = SDL_BlendFactor
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_BlendFactor where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_BlendFactor where
+  readRaw =
+    \ptr0 ->
+      pure SDL_BlendFactor
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_BlendFactor where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_BlendFactor unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_BlendFactor instance BG.Storable SDL_BlendFactor
+
+deriving via BG.CUInt instance BG.Prim SDL_BlendFactor
+
+instance CEnum.CEnum SDL_BlendFactor where
+  type CEnumZ SDL_BlendFactor = BG.CUInt
+
+  toCEnum = SDL_BlendFactor
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (1, BG.singleton "SDL_BLENDFACTOR_ZERO")
+        , (2, BG.singleton "SDL_BLENDFACTOR_ONE")
+        , (3, BG.singleton "SDL_BLENDFACTOR_SRC_COLOR")
+        , (4, BG.singleton "SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR")
+        , (5, BG.singleton "SDL_BLENDFACTOR_SRC_ALPHA")
+        , (6, BG.singleton "SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA")
+        , (7, BG.singleton "SDL_BLENDFACTOR_DST_COLOR")
+        , (8, BG.singleton "SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR")
+        , (9, BG.singleton "SDL_BLENDFACTOR_DST_ALPHA")
+        , (10, BG.singleton "SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_BlendFactor"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_BlendFactor"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_BlendFactor where
+  minDeclaredValue = SDL_BLENDFACTOR_ZERO
+
+  maxDeclaredValue =
+    SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA
+
+instance Show SDL_BlendFactor where
+  showsPrec = CEnum.shows
+
+instance Read SDL_BlendFactor where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_BlendFactor ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_BlendFactor{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_BlendFactor) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_BlendFactor "unwrap" where
+  type CFieldType SDL_BlendFactor "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | 0, 0, 0, 0
+--
+--     [C declaration]: @SDL_BLENDFACTOR_ZERO@, defined at @SDL3\/SDL_blendmode.h 90:5@
+pattern SDL_BLENDFACTOR_ZERO :: SDL_BlendFactor
+pattern SDL_BLENDFACTOR_ZERO = SDL_BlendFactor 1
+
+-- | 1, 1, 1, 1
+--
+--     [C declaration]: @SDL_BLENDFACTOR_ONE@, defined at @SDL3\/SDL_blendmode.h 91:5@
+pattern SDL_BLENDFACTOR_ONE :: SDL_BlendFactor
+pattern SDL_BLENDFACTOR_ONE = SDL_BlendFactor 2
+
+-- | srcR, srcG, srcB, srcA
+--
+--     [C declaration]: @SDL_BLENDFACTOR_SRC_COLOR@, defined at @SDL3\/SDL_blendmode.h 92:5@
+pattern SDL_BLENDFACTOR_SRC_COLOR :: SDL_BlendFactor
+pattern SDL_BLENDFACTOR_SRC_COLOR = SDL_BlendFactor 3
+
+-- | 1-srcR, 1-srcG, 1-srcB, 1-srcA
+--
+--     [C declaration]: @SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR@, defined at @SDL3\/SDL_blendmode.h 93:5@
+pattern SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR :: SDL_BlendFactor
+pattern SDL_BLENDFACTOR_ONE_MINUS_SRC_COLOR = SDL_BlendFactor 4
+
+-- | srcA, srcA, srcA, srcA
+--
+--     [C declaration]: @SDL_BLENDFACTOR_SRC_ALPHA@, defined at @SDL3\/SDL_blendmode.h 94:5@
+pattern SDL_BLENDFACTOR_SRC_ALPHA :: SDL_BlendFactor
+pattern SDL_BLENDFACTOR_SRC_ALPHA = SDL_BlendFactor 5
+
+-- | 1-srcA, 1-srcA, 1-srcA, 1-srcA
+--
+--     [C declaration]: @SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA@, defined at @SDL3\/SDL_blendmode.h 95:5@
+pattern SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA :: SDL_BlendFactor
+pattern SDL_BLENDFACTOR_ONE_MINUS_SRC_ALPHA = SDL_BlendFactor 6
+
+-- | dstR, dstG, dstB, dstA
+--
+--     [C declaration]: @SDL_BLENDFACTOR_DST_COLOR@, defined at @SDL3\/SDL_blendmode.h 96:5@
+pattern SDL_BLENDFACTOR_DST_COLOR :: SDL_BlendFactor
+pattern SDL_BLENDFACTOR_DST_COLOR = SDL_BlendFactor 7
+
+-- | 1-dstR, 1-dstG, 1-dstB, 1-dstA
+--
+--     [C declaration]: @SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR@, defined at @SDL3\/SDL_blendmode.h 97:5@
+pattern SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR :: SDL_BlendFactor
+pattern SDL_BLENDFACTOR_ONE_MINUS_DST_COLOR = SDL_BlendFactor 8
+
+-- | dstA, dstA, dstA, dstA
+--
+--     [C declaration]: @SDL_BLENDFACTOR_DST_ALPHA@, defined at @SDL3\/SDL_blendmode.h 98:5@
+pattern SDL_BLENDFACTOR_DST_ALPHA :: SDL_BlendFactor
+pattern SDL_BLENDFACTOR_DST_ALPHA = SDL_BlendFactor 9
+
+-- | 1-dstA, 1-dstA, 1-dstA, 1-dstA
+--
+--     [C declaration]: @SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA@, defined at @SDL3\/SDL_blendmode.h 99:5@
+pattern SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA :: SDL_BlendFactor
+pattern SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA = SDL_BlendFactor 10
diff --git a/src/SDL3/Sys/Bindgen/Blendmode/FunPtr.hs b/src/SDL3/Sys/Bindgen/Blendmode/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Blendmode/FunPtr.hs
@@ -0,0 +1,136 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Blendmode.FunPtr (
+  SDL3.Sys.Bindgen.Blendmode.FunPtr.sDL_ComposeCustomBlendMode,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Blendmode
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_blendmode.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Blendmode_get_SDL_ComposeCustomBlendMode */"
+         , "__attribute__ ((const))"
+         , "SDL_BlendMode (*hs_bindgen_472d1766983a7c58 (void)) ("
+         , "  SDL_BlendFactor arg1,"
+         , "  SDL_BlendFactor arg2,"
+         , "  SDL_BlendOperation arg3,"
+         , "  SDL_BlendFactor arg4,"
+         , "  SDL_BlendFactor arg5,"
+         , "  SDL_BlendOperation arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_ComposeCustomBlendMode;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Blendmode_get_SDL_ComposeCustomBlendMode@
+foreign import ccall unsafe "hs_bindgen_472d1766983a7c58"
+  hs_bindgen_472d1766983a7c58_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Blendmode_get_SDL_ComposeCustomBlendMode@
+hs_bindgen_472d1766983a7c58
+  :: IO
+       ( BG.FunPtr
+           ( SDL_BlendFactor
+             -> SDL_BlendFactor
+             -> SDL_BlendOperation
+             -> SDL_BlendFactor
+             -> SDL_BlendFactor
+             -> SDL_BlendOperation
+             -> IO SDL_BlendMode
+           )
+       )
+hs_bindgen_472d1766983a7c58 =
+  BG.fromFFIType hs_bindgen_472d1766983a7c58_base
+
+{-# NOINLINE sDL_ComposeCustomBlendMode #-}
+
+-- | Compose a custom blend mode for renderers.
+--
+--     The functions SDL_SetRenderDrawBlendMode and SDL_SetTextureBlendMode accept the 'SDL_BlendMode' returned by this function if the renderer supports it.
+--
+--     A blend mode controls how the pixels from a drawing operation (source) get combined with the pixels from the render target (destination). First, the components of the source and destination pixels get multiplied with their blend factors. Then, the blend operation takes the two products and calculates the result that will get stored in the render target.
+--
+--     Expressed in pseudocode, it would look like this:
+--
+--     @
+--     dstRGB = colorOperation(srcRGB * srcColorFactor, dstRGB * dstColorFactor);
+--     dstA = alphaOperation(srcA * srcAlphaFactor, dstA * dstAlphaFactor);
+--     @
+--
+--     Where the functions @colorOperation(src, dst)@ and @alphaOperation(src, dst)@ can return one of the following:
+--
+--     * @src + dst@
+--
+--     * @src - dst@
+--
+--     * @dst - src@
+--
+--     * @min(src, dst)@
+--
+--     * @max(src, dst)@
+--
+--     The red, green, and blue components are always multiplied with the first, second, and third components of the 'SDL_BlendFactor', respectively. The fourth component is not used.
+--
+--     The alpha component is always multiplied with the fourth component of the 'SDL_BlendFactor'. The other components are not used in the alpha calculation.
+--
+--     Support for these blend modes varies for each renderer. To check if a specific 'SDL_BlendMode' is supported, create a renderer and pass it to either SDL_SetRenderDrawBlendMode or SDL_SetTextureBlendMode. They will return with an error if the blend mode is not supported.
+--
+--     This list describes the support of custom blend modes for each renderer. All renderers support the four blend modes listed in the 'SDL_BlendMode' enumeration.
+--
+--     * __direct3d__: Supports all operations with all factors. However, some factors produce unexpected results with @SDL_BLENDOPERATION_MINIMUM@ and @SDL_BLENDOPERATION_MAXIMUM@.
+--
+--     * __direct3d11__: Same as Direct3D 9.
+--
+--     * __opengl__: Supports the @SDL_BLENDOPERATION_ADD@ operation with all factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly here.
+--
+--     * __opengles2__: Supports the @SDL_BLENDOPERATION_ADD@, @SDL_BLENDOPERATION_SUBTRACT@, @SDL_BLENDOPERATION_REV_SUBTRACT@ operations with all factors.
+--
+--     * __psp__: No custom blend mode support.
+--
+--     * __software__: No custom blend mode support.
+--
+--     Some renderers do not provide an alpha component for the default render target. The @SDL_BLENDFACTOR_DST_ALPHA@ and @SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA@ factors do not have an effect in this case.
+--
+--     [@srcColorFactor@]: the 'SDL_BlendFactor' applied to the red, green, and blue components of the source pixels.
+--
+--     [@dstColorFactor@]: the 'SDL_BlendFactor' applied to the red, green, and blue components of the destination pixels.
+--
+--     [@colorOperation@]: the 'SDL_BlendOperation' used to combine the red, green, and blue components of the source and destination pixels.
+--
+--     [@srcAlphaFactor@]: the 'SDL_BlendFactor' applied to the alpha component of the source pixels.
+--
+--     [@dstAlphaFactor@]: the 'SDL_BlendFactor' applied to the alpha component of the destination pixels.
+--
+--     [@alphaOperation@]: the 'SDL_BlendOperation' used to combine the alpha component of the source and destination pixels.
+--
+--     [Returns]: an 'SDL_BlendMode' that represents the chosen factors and operations.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_SetRenderDrawBlendMode, SDL_GetRenderDrawBlendMode, SDL_SetTextureBlendMode, SDL_GetTextureBlendMode
+--
+--     [C declaration]: @SDL_ComposeCustomBlendMode@, defined at @SDL3\/SDL_blendmode.h 189:43@
+sDL_ComposeCustomBlendMode
+  :: BG.FunPtr
+       ( SDL_BlendFactor
+         -> SDL_BlendFactor
+         -> SDL_BlendOperation
+         -> SDL_BlendFactor
+         -> SDL_BlendFactor
+         -> SDL_BlendOperation
+         -> IO SDL_BlendMode
+       )
+sDL_ComposeCustomBlendMode =
+  BG.unsafePerformIO hs_bindgen_472d1766983a7c58
diff --git a/src/SDL3/Sys/Bindgen/Blendmode/Safe.hs b/src/SDL3/Sys/Bindgen/Blendmode/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Blendmode/Safe.hs
@@ -0,0 +1,138 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Blendmode.Safe (
+  SDL3.Sys.Bindgen.Blendmode.Safe.sDL_ComposeCustomBlendMode,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Blendmode
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_blendmode.h>"
+         , "SDL_BlendMode hs_bindgen_c265ba8d4db542f2 ("
+         , "  SDL_BlendFactor arg1,"
+         , "  SDL_BlendFactor arg2,"
+         , "  SDL_BlendOperation arg3,"
+         , "  SDL_BlendFactor arg4,"
+         , "  SDL_BlendFactor arg5,"
+         , "  SDL_BlendOperation arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_ComposeCustomBlendMode)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Blendmode_Safe_SDL_ComposeCustomBlendMode@
+foreign import ccall safe "hs_bindgen_c265ba8d4db542f2"
+  hs_bindgen_c265ba8d4db542f2_base
+    :: BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Blendmode_Safe_SDL_ComposeCustomBlendMode@
+hs_bindgen_c265ba8d4db542f2
+  :: SDL_BlendFactor
+  -> SDL_BlendFactor
+  -> SDL_BlendOperation
+  -> SDL_BlendFactor
+  -> SDL_BlendFactor
+  -> SDL_BlendOperation
+  -> IO SDL_BlendMode
+hs_bindgen_c265ba8d4db542f2 =
+  BG.fromFFIType hs_bindgen_c265ba8d4db542f2_base
+
+-- | Compose a custom blend mode for renderers.
+--
+--     The functions SDL_SetRenderDrawBlendMode and SDL_SetTextureBlendMode accept the 'SDL_BlendMode' returned by this function if the renderer supports it.
+--
+--     A blend mode controls how the pixels from a drawing operation (source) get combined with the pixels from the render target (destination). First, the components of the source and destination pixels get multiplied with their blend factors. Then, the blend operation takes the two products and calculates the result that will get stored in the render target.
+--
+--     Expressed in pseudocode, it would look like this:
+--
+--     @
+--     dstRGB = colorOperation(srcRGB * srcColorFactor, dstRGB * dstColorFactor);
+--     dstA = alphaOperation(srcA * srcAlphaFactor, dstA * dstAlphaFactor);
+--     @
+--
+--     Where the functions @colorOperation(src, dst)@ and @alphaOperation(src, dst)@ can return one of the following:
+--
+--     * @src + dst@
+--
+--     * @src - dst@
+--
+--     * @dst - src@
+--
+--     * @min(src, dst)@
+--
+--     * @max(src, dst)@
+--
+--     The red, green, and blue components are always multiplied with the first, second, and third components of the 'SDL_BlendFactor', respectively. The fourth component is not used.
+--
+--     The alpha component is always multiplied with the fourth component of the 'SDL_BlendFactor'. The other components are not used in the alpha calculation.
+--
+--     Support for these blend modes varies for each renderer. To check if a specific 'SDL_BlendMode' is supported, create a renderer and pass it to either SDL_SetRenderDrawBlendMode or SDL_SetTextureBlendMode. They will return with an error if the blend mode is not supported.
+--
+--     This list describes the support of custom blend modes for each renderer. All renderers support the four blend modes listed in the 'SDL_BlendMode' enumeration.
+--
+--     * __direct3d__: Supports all operations with all factors. However, some factors produce unexpected results with @SDL_BLENDOPERATION_MINIMUM@ and @SDL_BLENDOPERATION_MAXIMUM@.
+--
+--     * __direct3d11__: Same as Direct3D 9.
+--
+--     * __opengl__: Supports the @SDL_BLENDOPERATION_ADD@ operation with all factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly here.
+--
+--     * __opengles2__: Supports the @SDL_BLENDOPERATION_ADD@, @SDL_BLENDOPERATION_SUBTRACT@, @SDL_BLENDOPERATION_REV_SUBTRACT@ operations with all factors.
+--
+--     * __psp__: No custom blend mode support.
+--
+--     * __software__: No custom blend mode support.
+--
+--     Some renderers do not provide an alpha component for the default render target. The @SDL_BLENDFACTOR_DST_ALPHA@ and @SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA@ factors do not have an effect in this case.
+--
+--     [Returns]: an 'SDL_BlendMode' that represents the chosen factors and operations.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_SetRenderDrawBlendMode, SDL_GetRenderDrawBlendMode, SDL_SetTextureBlendMode, SDL_GetTextureBlendMode
+--
+--     [C declaration]: @SDL_ComposeCustomBlendMode@, defined at @SDL3\/SDL_blendmode.h 189:43@
+sDL_ComposeCustomBlendMode
+  :: SDL_BlendFactor
+  -- ^
+  --
+  --           [@srcColorFactor@]: the 'SDL_BlendFactor' applied to the red, green, and blue components of the source pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@dstColorFactor@]: the 'SDL_BlendFactor' applied to the red, green, and blue components of the destination pixels.
+  -> SDL_BlendOperation
+  -- ^
+  --
+  --           [@colorOperation@]: the 'SDL_BlendOperation' used to combine the red, green, and blue components of the source and destination pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@srcAlphaFactor@]: the 'SDL_BlendFactor' applied to the alpha component of the source pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@dstAlphaFactor@]: the 'SDL_BlendFactor' applied to the alpha component of the destination pixels.
+  -> SDL_BlendOperation
+  -- ^
+  --
+  --           [@alphaOperation@]: the 'SDL_BlendOperation' used to combine the alpha component of the source and destination pixels.
+  -> IO SDL_BlendMode
+sDL_ComposeCustomBlendMode =
+  hs_bindgen_c265ba8d4db542f2
diff --git a/src/SDL3/Sys/Bindgen/Blendmode/Unsafe.hs b/src/SDL3/Sys/Bindgen/Blendmode/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Blendmode/Unsafe.hs
@@ -0,0 +1,138 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Blendmode.Unsafe (
+  SDL3.Sys.Bindgen.Blendmode.Unsafe.sDL_ComposeCustomBlendMode,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Blendmode
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_blendmode.h>"
+         , "SDL_BlendMode hs_bindgen_02a1b148e92e150f ("
+         , "  SDL_BlendFactor arg1,"
+         , "  SDL_BlendFactor arg2,"
+         , "  SDL_BlendOperation arg3,"
+         , "  SDL_BlendFactor arg4,"
+         , "  SDL_BlendFactor arg5,"
+         , "  SDL_BlendOperation arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_ComposeCustomBlendMode)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Blendmode_Unsafe_SDL_ComposeCustomBlendMode@
+foreign import ccall unsafe "hs_bindgen_02a1b148e92e150f"
+  hs_bindgen_02a1b148e92e150f_base
+    :: BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Blendmode_Unsafe_SDL_ComposeCustomBlendMode@
+hs_bindgen_02a1b148e92e150f
+  :: SDL_BlendFactor
+  -> SDL_BlendFactor
+  -> SDL_BlendOperation
+  -> SDL_BlendFactor
+  -> SDL_BlendFactor
+  -> SDL_BlendOperation
+  -> IO SDL_BlendMode
+hs_bindgen_02a1b148e92e150f =
+  BG.fromFFIType hs_bindgen_02a1b148e92e150f_base
+
+-- | Compose a custom blend mode for renderers.
+--
+--     The functions SDL_SetRenderDrawBlendMode and SDL_SetTextureBlendMode accept the 'SDL_BlendMode' returned by this function if the renderer supports it.
+--
+--     A blend mode controls how the pixels from a drawing operation (source) get combined with the pixels from the render target (destination). First, the components of the source and destination pixels get multiplied with their blend factors. Then, the blend operation takes the two products and calculates the result that will get stored in the render target.
+--
+--     Expressed in pseudocode, it would look like this:
+--
+--     @
+--     dstRGB = colorOperation(srcRGB * srcColorFactor, dstRGB * dstColorFactor);
+--     dstA = alphaOperation(srcA * srcAlphaFactor, dstA * dstAlphaFactor);
+--     @
+--
+--     Where the functions @colorOperation(src, dst)@ and @alphaOperation(src, dst)@ can return one of the following:
+--
+--     * @src + dst@
+--
+--     * @src - dst@
+--
+--     * @dst - src@
+--
+--     * @min(src, dst)@
+--
+--     * @max(src, dst)@
+--
+--     The red, green, and blue components are always multiplied with the first, second, and third components of the 'SDL_BlendFactor', respectively. The fourth component is not used.
+--
+--     The alpha component is always multiplied with the fourth component of the 'SDL_BlendFactor'. The other components are not used in the alpha calculation.
+--
+--     Support for these blend modes varies for each renderer. To check if a specific 'SDL_BlendMode' is supported, create a renderer and pass it to either SDL_SetRenderDrawBlendMode or SDL_SetTextureBlendMode. They will return with an error if the blend mode is not supported.
+--
+--     This list describes the support of custom blend modes for each renderer. All renderers support the four blend modes listed in the 'SDL_BlendMode' enumeration.
+--
+--     * __direct3d__: Supports all operations with all factors. However, some factors produce unexpected results with @SDL_BLENDOPERATION_MINIMUM@ and @SDL_BLENDOPERATION_MAXIMUM@.
+--
+--     * __direct3d11__: Same as Direct3D 9.
+--
+--     * __opengl__: Supports the @SDL_BLENDOPERATION_ADD@ operation with all factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly here.
+--
+--     * __opengles2__: Supports the @SDL_BLENDOPERATION_ADD@, @SDL_BLENDOPERATION_SUBTRACT@, @SDL_BLENDOPERATION_REV_SUBTRACT@ operations with all factors.
+--
+--     * __psp__: No custom blend mode support.
+--
+--     * __software__: No custom blend mode support.
+--
+--     Some renderers do not provide an alpha component for the default render target. The @SDL_BLENDFACTOR_DST_ALPHA@ and @SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA@ factors do not have an effect in this case.
+--
+--     [Returns]: an 'SDL_BlendMode' that represents the chosen factors and operations.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_SetRenderDrawBlendMode, SDL_GetRenderDrawBlendMode, SDL_SetTextureBlendMode, SDL_GetTextureBlendMode
+--
+--     [C declaration]: @SDL_ComposeCustomBlendMode@, defined at @SDL3\/SDL_blendmode.h 189:43@
+sDL_ComposeCustomBlendMode
+  :: SDL_BlendFactor
+  -- ^
+  --
+  --           [@srcColorFactor@]: the 'SDL_BlendFactor' applied to the red, green, and blue components of the source pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@dstColorFactor@]: the 'SDL_BlendFactor' applied to the red, green, and blue components of the destination pixels.
+  -> SDL_BlendOperation
+  -- ^
+  --
+  --           [@colorOperation@]: the 'SDL_BlendOperation' used to combine the red, green, and blue components of the source and destination pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@srcAlphaFactor@]: the 'SDL_BlendFactor' applied to the alpha component of the source pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@dstAlphaFactor@]: the 'SDL_BlendFactor' applied to the alpha component of the destination pixels.
+  -> SDL_BlendOperation
+  -- ^
+  --
+  --           [@alphaOperation@]: the 'SDL_BlendOperation' used to combine the alpha component of the source and destination pixels.
+  -> IO SDL_BlendMode
+sDL_ComposeCustomBlendMode =
+  hs_bindgen_02a1b148e92e150f
diff --git a/src/SDL3/Sys/Bindgen/Camera.hs b/src/SDL3/Sys/Bindgen/Camera.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Camera.hs
@@ -0,0 +1,603 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Video capture for the SDL library.
+--
+--     This API lets apps read input from video sources, like webcams. Camera devices can be enumerated, queried, and opened. Once opened, it will provide SDL_Surface objects as new frames of video come in. These surfaces can be uploaded to an SDL_Texture or processed as pixels in memory.
+--
+--     Several platforms will alert the user if an app tries to access a camera, and some will present a UI asking the user if your application should be allowed to obtain images at all, which they can deny. A successfully opened camera will not provide images until permission is granted. Applications, after opening a camera device, can see if they were granted access by either polling with the @SDL_GetCameraPermissionState()@ function, or waiting for an SDL_EVENT_CAMERA_DEVICE_APPROVED or SDL_EVENT_CAMERA_DEVICE_DENIED event. Platforms that don\'t have any user approval process will report approval immediately.
+--
+--     Note that SDL cameras only provide video as individual frames; they will not provide full-motion video encoded in a movie file format, although an app is free to encode the acquired frames into any format it likes. It also does not provide audio from the camera hardware through this API; not only do many webcams not have microphones at all, many people from streamers to people on Zoom calls will want to use a separate microphone regardless of the camera. In any case, recorded audio will be available through SDL\'s audio API no matter what hardware provides the microphone.
+--
+--     Camera gotchas
+--
+--     Consumer-level camera hardware tends to take a little while to warm up, once the device has been opened. Generally most camera apps have some sort of UI to take a picture (a button to snap a pic while a preview is showing, some sort of multi-second countdown for the user to pose, like a photo booth), which puts control in the users\' hands, or they are intended to stay on for long times (Pokemon Go, etc).
+--
+--     It\'s not uncommon that a newly-opened camera will provide a couple of completely black frames, maybe followed by some under-exposed images. If taking a single frame automatically, or recording video from a camera\'s input without the user initiating it from a preview, it could be wise to drop the first several frames (if not the first several /seconds/ worth of frames!) before using images from a camera. This is a unique ID for a camera device for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     If the device is disconnected and reconnected, it will get a new ID.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras'
+module SDL3.Sys.Bindgen.Camera (
+  SDL3.Sys.Bindgen.Camera.SDL_CameraID (..),
+  SDL3.Sys.Bindgen.Camera.SDL_Camera,
+  SDL3.Sys.Bindgen.Camera.SDL_CameraSpec (..),
+  SDL3.Sys.Bindgen.Camera.SDL_CameraPosition (..),
+  pattern SDL3.Sys.Bindgen.Camera.SDL_CAMERA_POSITION_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Camera.SDL_CAMERA_POSITION_FRONT_FACING,
+  pattern SDL3.Sys.Bindgen.Camera.SDL_CAMERA_POSITION_BACK_FACING,
+  SDL3.Sys.Bindgen.Camera.SDL_CameraPermissionState (..),
+  pattern SDL3.Sys.Bindgen.Camera.SDL_CAMERA_PERMISSION_STATE_DENIED,
+  pattern SDL3.Sys.Bindgen.Camera.SDL_CAMERA_PERMISSION_STATE_PENDING,
+  pattern SDL3.Sys.Bindgen.Camera.SDL_CAMERA_PERMISSION_STATE_APPROVED,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_CameraID@, defined at @SDL3\/SDL_camera.h 95:16@
+newtype SDL_CameraID = SDL_CameraID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_CameraID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_CameraID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_CameraID "unwrap" where
+  type
+    CFieldType SDL_CameraID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | The opaque structure used to identify an opened SDL camera.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_Camera@, defined at @SDL3\/SDL_camera.h 102:16@
+data SDL_Camera
+
+-- | The details of an output format for a camera device.
+--
+--     Cameras often support multiple formats; each one will be encapsulated in this struct.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameraSupportedFormats', 'sDL_GetCameraFormat'
+--
+--     [C declaration]: @struct SDL_CameraSpec@, defined at @SDL3\/SDL_camera.h 115:16@
+data SDL_CameraSpec = SDL_CameraSpec
+  { format :: SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^ Frame format
+  --
+  --          [C declaration]: @format@, defined at @SDL3\/SDL_camera.h 117:21@
+  , colorspace :: SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^ Frame colorspace
+  --
+  --          [C declaration]: @colorspace@, defined at @SDL3\/SDL_camera.h 118:20@
+  , width :: BG.CInt
+  -- ^ Frame width
+  --
+  --          [C declaration]: @width@, defined at @SDL3\/SDL_camera.h 119:9@
+  , height :: BG.CInt
+  -- ^ Frame height
+  --
+  --          [C declaration]: @height@, defined at @SDL3\/SDL_camera.h 120:9@
+  , framerate_numerator :: BG.CInt
+  -- ^ Frame rate numerator ((num \/ denom) == FPS, (denom \/ num) == duration in seconds)
+  --
+  --          [C declaration]: @framerate_numerator@, defined at @SDL3\/SDL_camera.h 121:9@
+  , framerate_denominator :: BG.CInt
+  -- ^ Frame rate denominator ((num \/ denom) == FPS, (denom \/ num) == duration in seconds)
+  --
+  --          [C declaration]: @framerate_denominator@, defined at @SDL3\/SDL_camera.h 122:9@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_CameraSpec where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_CameraSpec where
+  readRaw =
+    \ptr0 ->
+      pure SDL_CameraSpec
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"colorspace") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"width") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"height") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"framerate_numerator") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"framerate_denominator") ptr0
+
+instance Marshal.WriteRaw SDL_CameraSpec where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_CameraSpec
+            format2
+            colorspace3
+            width4
+            height5
+            framerate_numerator6
+            framerate_denominator7 ->
+              HasCField.writeRaw (BG.Proxy @"format") ptr0 format2
+                >> HasCField.writeRaw (BG.Proxy @"colorspace") ptr0 colorspace3
+                >> HasCField.writeRaw (BG.Proxy @"width") ptr0 width4
+                >> HasCField.writeRaw (BG.Proxy @"height") ptr0 height5
+                >> HasCField.writeRaw (BG.Proxy @"framerate_numerator") ptr0 framerate_numerator6
+                >> HasCField.writeRaw (BG.Proxy @"framerate_denominator") ptr0 framerate_denominator7
+
+deriving via Marshal.EquivStorable SDL_CameraSpec instance BG.Storable SDL_CameraSpec
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat)
+  => BG.CompatHasField.HasField "format" SDL_CameraSpec ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraSpec
+            { format = y1
+            , colorspace = BG.getField @"colorspace" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , framerate_numerator = BG.getField @"framerate_numerator" x0
+            , framerate_denominator = BG.getField @"framerate_denominator" x0
+            }
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat)
+  => BG.HasField "format" (BG.Ptr SDL_CameraSpec) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_CameraSpec "format" where
+  type
+    CFieldType SDL_CameraSpec "format" =
+      SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_Colorspace)
+  => BG.CompatHasField.HasField "colorspace" SDL_CameraSpec ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraSpec
+            { colorspace = y1
+            , format = BG.getField @"format" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , framerate_numerator = BG.getField @"framerate_numerator" x0
+            , framerate_denominator = BG.getField @"framerate_denominator" x0
+            }
+      , BG.getField @"colorspace" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_Colorspace)
+  => BG.HasField "colorspace" (BG.Ptr SDL_CameraSpec) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"colorspace")
+
+instance HasCField.HasCField SDL_CameraSpec "colorspace" where
+  type
+    CFieldType SDL_CameraSpec "colorspace" =
+      SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "width" SDL_CameraSpec ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraSpec
+            { width = y1
+            , format = BG.getField @"format" x0
+            , colorspace = BG.getField @"colorspace" x0
+            , height = BG.getField @"height" x0
+            , framerate_numerator = BG.getField @"framerate_numerator" x0
+            , framerate_denominator = BG.getField @"framerate_denominator" x0
+            }
+      , BG.getField @"width" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "width" (BG.Ptr SDL_CameraSpec) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"width")
+
+instance HasCField.HasCField SDL_CameraSpec "width" where
+  type CFieldType SDL_CameraSpec "width" = BG.CInt
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "height" SDL_CameraSpec ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraSpec
+            { height = y1
+            , format = BG.getField @"format" x0
+            , colorspace = BG.getField @"colorspace" x0
+            , width = BG.getField @"width" x0
+            , framerate_numerator = BG.getField @"framerate_numerator" x0
+            , framerate_denominator = BG.getField @"framerate_denominator" x0
+            }
+      , BG.getField @"height" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "height" (BG.Ptr SDL_CameraSpec) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"height")
+
+instance HasCField.HasCField SDL_CameraSpec "height" where
+  type CFieldType SDL_CameraSpec "height" = BG.CInt
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "framerate_numerator" SDL_CameraSpec ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraSpec
+            { framerate_numerator = y1
+            , format = BG.getField @"format" x0
+            , colorspace = BG.getField @"colorspace" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , framerate_denominator = BG.getField @"framerate_denominator" x0
+            }
+      , BG.getField @"framerate_numerator" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "framerate_numerator" (BG.Ptr SDL_CameraSpec) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"framerate_numerator")
+
+instance HasCField.HasCField SDL_CameraSpec "framerate_numerator" where
+  type
+    CFieldType SDL_CameraSpec "framerate_numerator" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "framerate_denominator" SDL_CameraSpec ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraSpec
+            { framerate_denominator = y1
+            , format = BG.getField @"format" x0
+            , colorspace = BG.getField @"colorspace" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , framerate_numerator = BG.getField @"framerate_numerator" x0
+            }
+      , BG.getField @"framerate_denominator" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "framerate_denominator" (BG.Ptr SDL_CameraSpec) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"framerate_denominator")
+
+instance HasCField.HasCField SDL_CameraSpec "framerate_denominator" where
+  type
+    CFieldType SDL_CameraSpec "framerate_denominator" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 20
+
+-- | The position of camera in relation to system device.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameraPosition'
+--
+--     [C declaration]: @enum SDL_CameraPosition@, defined at @SDL3\/SDL_camera.h 132:14@
+newtype SDL_CameraPosition = SDL_CameraPosition
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_CameraPosition where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_CameraPosition where
+  readRaw =
+    \ptr0 ->
+      pure SDL_CameraPosition
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_CameraPosition where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_CameraPosition unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_CameraPosition instance BG.Storable SDL_CameraPosition
+
+deriving via BG.CUInt instance BG.Prim SDL_CameraPosition
+
+instance CEnum.CEnum SDL_CameraPosition where
+  type CEnumZ SDL_CameraPosition = BG.CUInt
+
+  toCEnum = SDL_CameraPosition
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_CAMERA_POSITION_UNKNOWN")
+        , (1, BG.singleton "SDL_CAMERA_POSITION_FRONT_FACING")
+        , (2, BG.singleton "SDL_CAMERA_POSITION_BACK_FACING")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_CameraPosition"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_CameraPosition"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_CameraPosition where
+  minDeclaredValue = SDL_CAMERA_POSITION_UNKNOWN
+
+  maxDeclaredValue = SDL_CAMERA_POSITION_BACK_FACING
+
+instance Show SDL_CameraPosition where
+  showsPrec = CEnum.shows
+
+instance Read SDL_CameraPosition where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_CameraPosition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraPosition{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_CameraPosition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_CameraPosition "unwrap" where
+  type
+    CFieldType SDL_CameraPosition "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_CAMERA_POSITION_UNKNOWN@, defined at @SDL3\/SDL_camera.h 134:5@
+pattern SDL_CAMERA_POSITION_UNKNOWN :: SDL_CameraPosition
+pattern SDL_CAMERA_POSITION_UNKNOWN = SDL_CameraPosition 0
+
+-- | [C declaration]: @SDL_CAMERA_POSITION_FRONT_FACING@, defined at @SDL3\/SDL_camera.h 135:5@
+pattern SDL_CAMERA_POSITION_FRONT_FACING :: SDL_CameraPosition
+pattern SDL_CAMERA_POSITION_FRONT_FACING = SDL_CameraPosition 1
+
+-- | [C declaration]: @SDL_CAMERA_POSITION_BACK_FACING@, defined at @SDL3\/SDL_camera.h 136:5@
+pattern SDL_CAMERA_POSITION_BACK_FACING :: SDL_CameraPosition
+pattern SDL_CAMERA_POSITION_BACK_FACING = SDL_CameraPosition 2
+
+-- | The current state of a request for camera access.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_GetCameraPermissionState'
+--
+--     [C declaration]: @enum SDL_CameraPermissionState@, defined at @SDL3\/SDL_camera.h 146:14@
+newtype SDL_CameraPermissionState = SDL_CameraPermissionState
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_CameraPermissionState where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_CameraPermissionState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_CameraPermissionState
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_CameraPermissionState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_CameraPermissionState unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_CameraPermissionState
+  instance
+    BG.Storable SDL_CameraPermissionState
+
+deriving via BG.CInt instance BG.Prim SDL_CameraPermissionState
+
+instance CEnum.CEnum SDL_CameraPermissionState where
+  type CEnumZ SDL_CameraPermissionState = BG.CInt
+
+  toCEnum = SDL_CameraPermissionState
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_CAMERA_PERMISSION_STATE_DENIED")
+        , (0, BG.singleton "SDL_CAMERA_PERMISSION_STATE_PENDING")
+        , (1, BG.singleton "SDL_CAMERA_PERMISSION_STATE_APPROVED")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_CameraPermissionState"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_CameraPermissionState"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_CameraPermissionState where
+  minDeclaredValue = SDL_CAMERA_PERMISSION_STATE_DENIED
+
+  maxDeclaredValue =
+    SDL_CAMERA_PERMISSION_STATE_APPROVED
+
+instance Show SDL_CameraPermissionState where
+  showsPrec = CEnum.shows
+
+instance Read SDL_CameraPermissionState where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_CameraPermissionState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraPermissionState{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_CameraPermissionState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_CameraPermissionState "unwrap" where
+  type
+    CFieldType SDL_CameraPermissionState "unwrap" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_CAMERA_PERMISSION_STATE_DENIED@, defined at @SDL3\/SDL_camera.h 148:5@
+pattern SDL_CAMERA_PERMISSION_STATE_DENIED :: SDL_CameraPermissionState
+pattern SDL_CAMERA_PERMISSION_STATE_DENIED = SDL_CameraPermissionState (-1)
+
+-- | [C declaration]: @SDL_CAMERA_PERMISSION_STATE_PENDING@, defined at @SDL3\/SDL_camera.h 149:5@
+pattern SDL_CAMERA_PERMISSION_STATE_PENDING :: SDL_CameraPermissionState
+pattern SDL_CAMERA_PERMISSION_STATE_PENDING = SDL_CameraPermissionState 0
+
+-- | [C declaration]: @SDL_CAMERA_PERMISSION_STATE_APPROVED@, defined at @SDL3\/SDL_camera.h 150:5@
+pattern SDL_CAMERA_PERMISSION_STATE_APPROVED :: SDL_CameraPermissionState
+pattern SDL_CAMERA_PERMISSION_STATE_APPROVED = SDL_CameraPermissionState 1
diff --git a/src/SDL3/Sys/Bindgen/Camera/FunPtr.hs b/src/SDL3/Sys/Bindgen/Camera/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Camera/FunPtr.hs
@@ -0,0 +1,678 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Camera.FunPtr (
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetNumCameraDrivers,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetCameraDriver,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetCurrentCameraDriver,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetCameras,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetCameraSupportedFormats,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetCameraName,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetCameraPosition,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_OpenCamera,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetCameraPermissionState,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetCameraID,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetCameraProperties,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_GetCameraFormat,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_AcquireCameraFrame,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_ReleaseCameraFrame,
+  SDL3.Sys.Bindgen.Camera.FunPtr.sDL_CloseCamera,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Camera
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_camera.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetNumCameraDrivers */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_2fe56f3f652d0579 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetNumCameraDrivers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraDriver */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_c446a6779ba24477 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCameraDriver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCurrentCameraDriver */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_450b62c8a8bdad25 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetCurrentCameraDriver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameras */"
+         , "__attribute__ ((const))"
+         , "SDL_CameraID *(*hs_bindgen_bc1a5321dad7fcb1 (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCameras;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraSupportedFormats */"
+         , "__attribute__ ((const))"
+         , "SDL_CameraSpec **(*hs_bindgen_bf28278a90a763f1 (void)) ("
+         , "  SDL_CameraID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCameraSupportedFormats;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_55dbe06bac2f3a2a (void)) ("
+         , "  SDL_CameraID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCameraName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraPosition */"
+         , "__attribute__ ((const))"
+         , "SDL_CameraPosition (*hs_bindgen_9aa8f16a3313e368 (void)) ("
+         , "  SDL_CameraID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCameraPosition;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_OpenCamera */"
+         , "__attribute__ ((const))"
+         , "SDL_Camera *(*hs_bindgen_b00c5599a7791662 (void)) ("
+         , "  SDL_CameraID arg1,"
+         , "  SDL_CameraSpec const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenCamera;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_CameraPermissionState;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraPermissionState */"
+         , "__attribute__ ((const))"
+         , "SDL_CameraPermissionState (*hs_bindgen_48f0024f18d7e07c (void)) ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCameraPermissionState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraID */"
+         , "__attribute__ ((const))"
+         , "SDL_CameraID (*hs_bindgen_0229aa426471e9f3 (void)) ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCameraID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_811d109afab05470 (void)) ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCameraProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraFormat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c31156109d01dac2 (void)) ("
+         , "  SDL_Camera *arg1,"
+         , "  SDL_CameraSpec *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCameraFormat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_AcquireCameraFrame */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_15418e0f8c1b74ab (void)) ("
+         , "  SDL_Camera *arg1,"
+         , "  Uint64 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_AcquireCameraFrame;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_ReleaseCameraFrame */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_e130359542808d09 (void)) ("
+         , "  SDL_Camera *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReleaseCameraFrame;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_CloseCamera */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_bdcef6daeaf762cd (void)) ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CloseCamera;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetNumCameraDrivers@
+foreign import ccall unsafe "hs_bindgen_2fe56f3f652d0579"
+  hs_bindgen_2fe56f3f652d0579_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetNumCameraDrivers@
+hs_bindgen_2fe56f3f652d0579 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_2fe56f3f652d0579 =
+  BG.fromFFIType hs_bindgen_2fe56f3f652d0579_base
+
+{-# NOINLINE sDL_GetNumCameraDrivers #-}
+
+-- | Use this function to get the number of built-in camera drivers.
+--
+--     This function returns a hardcoded number. This never returns a negative value; if there are no drivers compiled into this build of SDL, this function returns zero. The presence of a driver in this list does not mean it will function, it just means SDL is capable of interacting with that interface. For example, a build of SDL might have v4l2 support, but if there\'s no kernel support available, SDL\'s v4l2 driver would fail if used.
+--
+--     By default, SDL tries all drivers, in its preferred order, until one is found to be usable.
+--
+--     [Returns]: the number of built-in camera drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameraDriver'
+--
+--     [C declaration]: @SDL_GetNumCameraDrivers@, defined at @SDL3\/SDL_camera.h 175:33@
+sDL_GetNumCameraDrivers :: BG.FunPtr (IO BG.CInt)
+sDL_GetNumCameraDrivers =
+  BG.unsafePerformIO hs_bindgen_2fe56f3f652d0579
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraDriver@
+foreign import ccall unsafe "hs_bindgen_c446a6779ba24477"
+  hs_bindgen_c446a6779ba24477_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraDriver@
+hs_bindgen_c446a6779ba24477 :: IO (BG.FunPtr (BG.CInt -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_c446a6779ba24477 =
+  BG.fromFFIType hs_bindgen_c446a6779ba24477_base
+
+{-# NOINLINE sDL_GetCameraDriver #-}
+
+-- | Use this function to get the name of a built in camera driver.
+--
+--     The list of camera drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"v4l2\", \"coremedia\" or \"android\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [@index@]: the index of the camera driver; the value ranges from 0 to @SDL_GetNumCameraDrivers()@ - 1.
+--
+--     [Returns]: the name of the camera driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumCameraDrivers'
+--
+--     [C declaration]: @SDL_GetCameraDriver@, defined at @SDL3\/SDL_camera.h 199:42@
+sDL_GetCameraDriver :: BG.FunPtr (BG.CInt -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetCameraDriver =
+  BG.unsafePerformIO hs_bindgen_c446a6779ba24477
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCurrentCameraDriver@
+foreign import ccall unsafe "hs_bindgen_450b62c8a8bdad25"
+  hs_bindgen_450b62c8a8bdad25_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCurrentCameraDriver@
+hs_bindgen_450b62c8a8bdad25 :: IO (BG.FunPtr (IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_450b62c8a8bdad25 =
+  BG.fromFFIType hs_bindgen_450b62c8a8bdad25_base
+
+{-# NOINLINE sDL_GetCurrentCameraDriver #-}
+
+-- | Get the name of the current camera driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"v4l2\", \"coremedia\" or \"android\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current camera driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentCameraDriver@, defined at @SDL3\/SDL_camera.h 215:42@
+sDL_GetCurrentCameraDriver :: BG.FunPtr (IO (PtrConst.PtrConst BG.CChar))
+sDL_GetCurrentCameraDriver =
+  BG.unsafePerformIO hs_bindgen_450b62c8a8bdad25
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameras@
+foreign import ccall unsafe "hs_bindgen_bc1a5321dad7fcb1"
+  hs_bindgen_bc1a5321dad7fcb1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameras@
+hs_bindgen_bc1a5321dad7fcb1 :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_CameraID)))
+hs_bindgen_bc1a5321dad7fcb1 =
+  BG.fromFFIType hs_bindgen_bc1a5321dad7fcb1_base
+
+{-# NOINLINE sDL_GetCameras #-}
+
+-- | Get a list of currently connected camera devices.
+--
+--     [@count@]: a pointer filled in with the number of cameras returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of camera instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameras@, defined at @SDL3\/SDL_camera.h 232:44@
+sDL_GetCameras :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_CameraID))
+sDL_GetCameras =
+  BG.unsafePerformIO hs_bindgen_bc1a5321dad7fcb1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraSupportedFormats@
+foreign import ccall unsafe "hs_bindgen_bf28278a90a763f1"
+  hs_bindgen_bf28278a90a763f1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraSupportedFormats@
+hs_bindgen_bf28278a90a763f1
+  :: IO (BG.FunPtr (SDL_CameraID -> BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_CameraSpec))))
+hs_bindgen_bf28278a90a763f1 =
+  BG.fromFFIType hs_bindgen_bf28278a90a763f1_base
+
+{-# NOINLINE sDL_GetCameraSupportedFormats #-}
+
+-- | Get the list of native formats\/sizes a camera supports.
+--
+--     This returns a list of all formats and frame sizes that a specific camera can offer. This is useful if your app can accept a variety of image formats and sizes and so want to find the optimal spec that doesn\'t require conversion.
+--
+--     This function isn\'t strictly required; if you call SDL_OpenCamera with a NULL spec, SDL will choose a native format for you, and if you instead specify a desired format, it will transparently convert to the requested format on your behalf.
+--
+--     If @count@ is not NULL, it will be filled with the number of elements in the returned array.
+--
+--     Note that it\'s legal for a camera to supply an empty list. This is what will happen on Emscripten builds, since that platform won\'t tell /anything/ about available cameras until you\'ve opened one, and won\'t even tell if there /is/ a camera until the user has given you permission to check through a scary warning popup.
+--
+--     [@instance_id@]: the camera device instance ID.
+--
+--     [@count@]: a pointer filled in with the number of elements in the list, may be NULL.
+--
+--     [Returns]: a NULL terminated array of pointers to 'SDL_CameraSpec' or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras', 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameraSupportedFormats@, defined at @SDL3\/SDL_camera.h 271:47@
+sDL_GetCameraSupportedFormats
+  :: BG.FunPtr (SDL_CameraID -> BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_CameraSpec)))
+sDL_GetCameraSupportedFormats =
+  BG.unsafePerformIO hs_bindgen_bf28278a90a763f1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraName@
+foreign import ccall unsafe "hs_bindgen_55dbe06bac2f3a2a"
+  hs_bindgen_55dbe06bac2f3a2a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraName@
+hs_bindgen_55dbe06bac2f3a2a :: IO (BG.FunPtr (SDL_CameraID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_55dbe06bac2f3a2a =
+  BG.fromFFIType hs_bindgen_55dbe06bac2f3a2a_base
+
+{-# NOINLINE sDL_GetCameraName #-}
+
+-- | Get the human-readable device name for a camera.
+--
+--     [@instance_id@]: the camera device instance ID.
+--
+--     [Returns]: a human-readable device name or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras'
+--
+--     [C declaration]: @SDL_GetCameraName@, defined at @SDL3\/SDL_camera.h 286:42@
+sDL_GetCameraName :: BG.FunPtr (SDL_CameraID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetCameraName =
+  BG.unsafePerformIO hs_bindgen_55dbe06bac2f3a2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraPosition@
+foreign import ccall unsafe "hs_bindgen_9aa8f16a3313e368"
+  hs_bindgen_9aa8f16a3313e368_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraPosition@
+hs_bindgen_9aa8f16a3313e368 :: IO (BG.FunPtr (SDL_CameraID -> IO SDL_CameraPosition))
+hs_bindgen_9aa8f16a3313e368 =
+  BG.fromFFIType hs_bindgen_9aa8f16a3313e368_base
+
+{-# NOINLINE sDL_GetCameraPosition #-}
+
+-- | Get the position of the camera in relation to the system.
+--
+--     Most platforms will report UNKNOWN, but mobile devices, like phones, can often make a distinction between cameras on the front of the device (that points towards the user, for taking \"selfies\") and cameras on the back (for filming in the direction the user is facing).
+--
+--     [@instance_id@]: the camera device instance ID.
+--
+--     [Returns]: the position of the camera on the system hardware.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras'
+--
+--     [C declaration]: @SDL_GetCameraPosition@, defined at @SDL3\/SDL_camera.h 305:48@
+sDL_GetCameraPosition :: BG.FunPtr (SDL_CameraID -> IO SDL_CameraPosition)
+sDL_GetCameraPosition =
+  BG.unsafePerformIO hs_bindgen_9aa8f16a3313e368
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_OpenCamera@
+foreign import ccall unsafe "hs_bindgen_b00c5599a7791662"
+  hs_bindgen_b00c5599a7791662_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_OpenCamera@
+hs_bindgen_b00c5599a7791662
+  :: IO (BG.FunPtr (SDL_CameraID -> PtrConst.PtrConst SDL_CameraSpec -> IO (BG.Ptr SDL_Camera)))
+hs_bindgen_b00c5599a7791662 =
+  BG.fromFFIType hs_bindgen_b00c5599a7791662_base
+
+{-# NOINLINE sDL_OpenCamera #-}
+
+-- | Open a video recording device (a \"camera\").
+--
+--     You can open the device with any reasonable spec, and if the hardware can\'t directly support it, it will convert data seamlessly to the requested format. This might incur overhead, including scaling of image data.
+--
+--     If you would rather accept whatever format the device offers, you can pass a NULL spec here and it will choose one for you (and you can use SDL_Surface\'s conversion\/scaling functions directly if necessary).
+--
+--     You can call @SDL_GetCameraFormat()@ to get the actual data format if passing a NULL spec here. You can see the exact specs a device can support without conversion with @SDL_GetCameraSupportedFormats()@.
+--
+--     SDL will not attempt to emulate framerate; it will try to set the hardware to the rate closest to the requested speed, but it won\'t attempt to limit or duplicate frames artificially; call @SDL_GetCameraFormat()@ to see the actual framerate of the opened the device, and check your timestamps if this is crucial to your app!
+--
+--     Note that the camera is not usable until the user approves its use! On some platforms, the operating system will prompt the user to permit access to the camera, and they can choose Yes or No at that point. Until they do, the camera will not be usable. The app should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @SDL_GetCameraPermissionState()@ occasionally until it returns non-zero. On platforms that don\'t require explicit user approval (and perhaps in places where the user previously permitted access), the approval event might come immediately, but it might come seconds, minutes, or hours later!
+--
+--     [@instance_id@]: the camera device instance ID.
+--
+--     [@spec@]: the desired format for data the device will provide. Can be NULL.
+--
+--     [Returns]: an 'SDL_Camera' object or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras', 'sDL_GetCameraFormat'
+--
+--     [C declaration]: @SDL_OpenCamera@, defined at @SDL3\/SDL_camera.h 352:42@
+sDL_OpenCamera
+  :: BG.FunPtr (SDL_CameraID -> PtrConst.PtrConst SDL_CameraSpec -> IO (BG.Ptr SDL_Camera))
+sDL_OpenCamera =
+  BG.unsafePerformIO hs_bindgen_b00c5599a7791662
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraPermissionState@
+foreign import ccall unsafe "hs_bindgen_48f0024f18d7e07c"
+  hs_bindgen_48f0024f18d7e07c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraPermissionState@
+hs_bindgen_48f0024f18d7e07c :: IO (BG.FunPtr (BG.Ptr SDL_Camera -> IO SDL_CameraPermissionState))
+hs_bindgen_48f0024f18d7e07c =
+  BG.fromFFIType hs_bindgen_48f0024f18d7e07c_base
+
+{-# NOINLINE sDL_GetCameraPermissionState #-}
+
+-- | Query if camera access has been approved by the user.
+--
+--     Cameras will not function between when the device is opened by the app and when the user permits access to the hardware. On some platforms, this presents as a popup dialog where the user has to explicitly approve access; on others the approval might be implicit and not alert the user at all.
+--
+--     This function can be used to check the status of that approval. It will return SDL_CAMERA_PERMISSION_STATE_PENDING if waiting for user response, SDL_CAMERA_PERMISSION_STATE_APPROVED if the camera is approved for use, and SDL_CAMERA_PERMISSION_STATE_DENIED if the user denied access.
+--
+--     Instead of polling with this function, you can wait for a SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event in the standard SDL event loop, which is guaranteed to be sent once when permission to use the camera is decided.
+--
+--     If a camera is declined, there\'s nothing to be done but call @SDL_CloseCamera()@ to dispose of it.
+--
+--     [@camera@]: the opened camera device to query.
+--
+--     [Returns]: an 'SDL_CameraPermissionState' value indicating if access is granted, or @SDL_CAMERA_PERMISSION_STATE_PENDING@ if the decision is still pending.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera', 'sDL_CloseCamera'
+--
+--     [C declaration]: @SDL_GetCameraPermissionState@, defined at @SDL3\/SDL_camera.h 387:55@
+sDL_GetCameraPermissionState :: BG.FunPtr (BG.Ptr SDL_Camera -> IO SDL_CameraPermissionState)
+sDL_GetCameraPermissionState =
+  BG.unsafePerformIO hs_bindgen_48f0024f18d7e07c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraID@
+foreign import ccall unsafe "hs_bindgen_0229aa426471e9f3"
+  hs_bindgen_0229aa426471e9f3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraID@
+hs_bindgen_0229aa426471e9f3 :: IO (BG.FunPtr (BG.Ptr SDL_Camera -> IO SDL_CameraID))
+hs_bindgen_0229aa426471e9f3 =
+  BG.fromFFIType hs_bindgen_0229aa426471e9f3_base
+
+{-# NOINLINE sDL_GetCameraID #-}
+
+-- | Get the instance ID of an opened camera.
+--
+--     [@camera@]: an 'SDL_Camera' to query.
+--
+--     [Returns]: the instance ID of the specified camera on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameraID@, defined at @SDL3\/SDL_camera.h 402:42@
+sDL_GetCameraID :: BG.FunPtr (BG.Ptr SDL_Camera -> IO SDL_CameraID)
+sDL_GetCameraID =
+  BG.unsafePerformIO hs_bindgen_0229aa426471e9f3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraProperties@
+foreign import ccall unsafe "hs_bindgen_811d109afab05470"
+  hs_bindgen_811d109afab05470_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraProperties@
+hs_bindgen_811d109afab05470
+  :: IO (BG.FunPtr (BG.Ptr SDL_Camera -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_811d109afab05470 =
+  BG.fromFFIType hs_bindgen_811d109afab05470_base
+
+{-# NOINLINE sDL_GetCameraProperties #-}
+
+-- | Get the properties associated with an opened camera.
+--
+--     [@camera@]: the 'SDL_Camera' obtained from @SDL_OpenCamera()@.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCameraProperties@, defined at @SDL3\/SDL_camera.h 415:46@
+sDL_GetCameraProperties
+  :: BG.FunPtr (BG.Ptr SDL_Camera -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetCameraProperties =
+  BG.unsafePerformIO hs_bindgen_811d109afab05470
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraFormat@
+foreign import ccall unsafe "hs_bindgen_c31156109d01dac2"
+  hs_bindgen_c31156109d01dac2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_GetCameraFormat@
+hs_bindgen_c31156109d01dac2
+  :: IO (BG.FunPtr (BG.Ptr SDL_Camera -> BG.Ptr SDL_CameraSpec -> IO BG.CBool))
+hs_bindgen_c31156109d01dac2 =
+  BG.fromFFIType hs_bindgen_c31156109d01dac2_base
+
+{-# NOINLINE sDL_GetCameraFormat #-}
+
+-- | Get the spec that a camera is using when generating images.
+--
+--     Note that this might not be the native format of the hardware, as SDL might be converting to this format behind the scenes.
+--
+--     If the system is waiting for the user to approve access to the camera, as some platforms require, this will return false, but this isn\'t necessarily a fatal error; you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @SDL_GetCameraPermissionState()@ occasionally until it returns non-zero.
+--
+--     [@camera@]: opened camera device.
+--
+--     [@spec@]: the 'SDL_CameraSpec' to be initialized by this function.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameraFormat@, defined at @SDL3\/SDL_camera.h 441:34@
+sDL_GetCameraFormat :: BG.FunPtr (BG.Ptr SDL_Camera -> BG.Ptr SDL_CameraSpec -> IO BG.CBool)
+sDL_GetCameraFormat =
+  BG.unsafePerformIO hs_bindgen_c31156109d01dac2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_AcquireCameraFrame@
+foreign import ccall unsafe "hs_bindgen_15418e0f8c1b74ab"
+  hs_bindgen_15418e0f8c1b74ab_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_AcquireCameraFrame@
+hs_bindgen_15418e0f8c1b74ab
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Camera
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+           )
+       )
+hs_bindgen_15418e0f8c1b74ab =
+  BG.fromFFIType hs_bindgen_15418e0f8c1b74ab_base
+
+{-# NOINLINE sDL_AcquireCameraFrame #-}
+
+-- | Acquire a frame.
+--
+--     The frame is a memory pointer to the image data, whose size and format are given by the spec requested when opening the device.
+--
+--     This is a non blocking API. If there is a frame available, a non-NULL surface is returned, and timestampNS will be filled with a non-zero value.
+--
+--     Note that an error case can also return NULL, but a NULL by itself is normal and just signifies that a new frame is not yet available. Note that even if a camera device fails outright (a USB camera is unplugged while in use, etc), SDL will send an event separately to notify the app, but continue to provide blank frames at ongoing intervals until @SDL_CloseCamera()@ is called, so real failure here is almost always an out of memory condition.
+--
+--     After use, the frame should be released with @SDL_ReleaseCameraFrame()@. If you don\'t do this, the system may stop providing more video!
+--
+--     Do not call SDL_DestroySurface() on the returned surface! It must be given back to the camera subsystem with SDL_ReleaseCameraFrame!
+--
+--     If the system is waiting for the user to approve access to the camera, as some platforms require, this will return NULL (no frames available); you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @SDL_GetCameraPermissionState()@ occasionally until it returns non-zero.
+--
+--     [@camera@]: opened camera device.
+--
+--     [@timestampNS@]: a pointer filled in with the frame\'s timestamp, or 0 on error. Can be NULL.
+--
+--     [Returns]: a new frame of video on success, NULL if none is currently available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ReleaseCameraFrame'
+--
+--     [C declaration]: @SDL_AcquireCameraFrame@, defined at @SDL3\/SDL_camera.h 484:43@
+sDL_AcquireCameraFrame
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Camera
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+         -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+       )
+sDL_AcquireCameraFrame =
+  BG.unsafePerformIO hs_bindgen_15418e0f8c1b74ab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_ReleaseCameraFrame@
+foreign import ccall unsafe "hs_bindgen_e130359542808d09"
+  hs_bindgen_e130359542808d09_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_ReleaseCameraFrame@
+hs_bindgen_e130359542808d09
+  :: IO (BG.FunPtr (BG.Ptr SDL_Camera -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO ()))
+hs_bindgen_e130359542808d09 =
+  BG.fromFFIType hs_bindgen_e130359542808d09_base
+
+{-# NOINLINE sDL_ReleaseCameraFrame #-}
+
+-- | Release a frame of video acquired from a camera.
+--
+--     Let the back-end re-use the internal buffer for camera.
+--
+--     This function /must/ be called only on surface objects returned by @SDL_AcquireCameraFrame()@. This function should be called as quickly as possible after acquisition, as SDL keeps a small FIFO queue of surfaces for video frames; if surfaces aren\'t released in a timely manner, SDL may drop upcoming video frames from the camera.
+--
+--     If the app needs to keep the surface for a significant time, they should make a copy of it and release the original.
+--
+--     The app should not use the surface again after calling this function; assume the surface is freed and the pointer is invalid.
+--
+--     [@camera@]: opened camera device.
+--
+--     [@frame@]: the video frame surface to release.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireCameraFrame'
+--
+--     [C declaration]: @SDL_ReleaseCameraFrame@, defined at @SDL3\/SDL_camera.h 512:34@
+sDL_ReleaseCameraFrame
+  :: BG.FunPtr (BG.Ptr SDL_Camera -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO ())
+sDL_ReleaseCameraFrame =
+  BG.unsafePerformIO hs_bindgen_e130359542808d09
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_CloseCamera@
+foreign import ccall unsafe "hs_bindgen_bdcef6daeaf762cd"
+  hs_bindgen_bdcef6daeaf762cd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_get_SDL_CloseCamera@
+hs_bindgen_bdcef6daeaf762cd :: IO (BG.FunPtr (BG.Ptr SDL_Camera -> IO ()))
+hs_bindgen_bdcef6daeaf762cd =
+  BG.fromFFIType hs_bindgen_bdcef6daeaf762cd_base
+
+{-# NOINLINE sDL_CloseCamera #-}
+
+-- | Use this function to shut down camera processing and close the camera device.
+--
+--     [@camera@]: opened camera device.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but no thread may reference @device@ once this function is called.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_CloseCamera@, defined at @SDL3\/SDL_camera.h 527:34@
+sDL_CloseCamera :: BG.FunPtr (BG.Ptr SDL_Camera -> IO ())
+sDL_CloseCamera =
+  BG.unsafePerformIO hs_bindgen_bdcef6daeaf762cd
diff --git a/src/SDL3/Sys/Bindgen/Camera/Safe.hs b/src/SDL3/Sys/Bindgen/Camera/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Camera/Safe.hs
@@ -0,0 +1,683 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Camera.Safe (
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetNumCameraDrivers,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetCameraDriver,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetCurrentCameraDriver,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetCameras,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetCameraSupportedFormats,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetCameraName,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetCameraPosition,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_OpenCamera,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetCameraPermissionState,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetCameraID,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetCameraProperties,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_GetCameraFormat,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_AcquireCameraFrame,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_ReleaseCameraFrame,
+  SDL3.Sys.Bindgen.Camera.Safe.sDL_CloseCamera,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Camera
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_camera.h>"
+         , "signed int hs_bindgen_cd72562c40895f9d (void)"
+         , "{"
+         , "  return (SDL_GetNumCameraDrivers)();"
+         , "}"
+         , "char const *hs_bindgen_1b2353edfbc61157 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraDriver)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_eb2b917f28fc96fd (void)"
+         , "{"
+         , "  return (SDL_GetCurrentCameraDriver)();"
+         , "}"
+         , "SDL_CameraID *hs_bindgen_1ba2aef0a8cc6032 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameras)(arg1);"
+         , "}"
+         , "SDL_CameraSpec **hs_bindgen_5a031667f9d45a0d ("
+         , "  SDL_CameraID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraSupportedFormats)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_1fe2503ad9612c29 ("
+         , "  SDL_CameraID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraName)(arg1);"
+         , "}"
+         , "SDL_CameraPosition hs_bindgen_53c0436c6140f231 ("
+         , "  SDL_CameraID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraPosition)(arg1);"
+         , "}"
+         , "SDL_Camera *hs_bindgen_9c29b271631f7c6f ("
+         , "  SDL_CameraID arg1,"
+         , "  SDL_CameraSpec const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenCamera)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_CameraPermissionState;"
+         , "#endif"
+         , "SDL_CameraPermissionState hs_bindgen_77d5a87752cf6936 ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraPermissionState)(arg1);"
+         , "}"
+         , "SDL_CameraID hs_bindgen_bcdd620eca919b2e ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraID)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_052b8e57c4e6c7b6 ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraProperties)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_077520cc55e1919f ("
+         , "  SDL_Camera *arg1,"
+         , "  SDL_CameraSpec *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraFormat)(arg1, arg2);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_ea5de39cea6d2cc9 ("
+         , "  SDL_Camera *arg1,"
+         , "  Uint64 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AcquireCameraFrame)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_9abaf64e06b4eeb3 ("
+         , "  SDL_Camera *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseCameraFrame)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_2ca914bb2dfa2f4d ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseCamera)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetNumCameraDrivers@
+foreign import ccall safe "hs_bindgen_cd72562c40895f9d"
+  hs_bindgen_cd72562c40895f9d_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetNumCameraDrivers@
+hs_bindgen_cd72562c40895f9d :: IO BG.CInt
+hs_bindgen_cd72562c40895f9d =
+  BG.fromFFIType hs_bindgen_cd72562c40895f9d_base
+
+-- | Use this function to get the number of built-in camera drivers.
+--
+--     This function returns a hardcoded number. This never returns a negative value; if there are no drivers compiled into this build of SDL, this function returns zero. The presence of a driver in this list does not mean it will function, it just means SDL is capable of interacting with that interface. For example, a build of SDL might have v4l2 support, but if there\'s no kernel support available, SDL\'s v4l2 driver would fail if used.
+--
+--     By default, SDL tries all drivers, in its preferred order, until one is found to be usable.
+--
+--     [Returns]: the number of built-in camera drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameraDriver'
+--
+--     [C declaration]: @SDL_GetNumCameraDrivers@, defined at @SDL3\/SDL_camera.h 175:33@
+sDL_GetNumCameraDrivers :: IO BG.CInt
+sDL_GetNumCameraDrivers = hs_bindgen_cd72562c40895f9d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraDriver@
+foreign import ccall safe "hs_bindgen_1b2353edfbc61157"
+  hs_bindgen_1b2353edfbc61157_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraDriver@
+hs_bindgen_1b2353edfbc61157
+  :: BG.CInt
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_1b2353edfbc61157 =
+  BG.fromFFIType hs_bindgen_1b2353edfbc61157_base
+
+-- | Use this function to get the name of a built in camera driver.
+--
+--     The list of camera drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"v4l2\", \"coremedia\" or \"android\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the camera driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumCameraDrivers'
+--
+--     [C declaration]: @SDL_GetCameraDriver@, defined at @SDL3\/SDL_camera.h 199:42@
+sDL_GetCameraDriver
+  :: BG.CInt
+  -- ^
+  --
+  --           [@index@]: the index of the camera driver; the value ranges from 0 to @SDL_GetNumCameraDrivers()@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetCameraDriver = hs_bindgen_1b2353edfbc61157
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCurrentCameraDriver@
+foreign import ccall safe "hs_bindgen_eb2b917f28fc96fd"
+  hs_bindgen_eb2b917f28fc96fd_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCurrentCameraDriver@
+hs_bindgen_eb2b917f28fc96fd :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_eb2b917f28fc96fd =
+  BG.fromFFIType hs_bindgen_eb2b917f28fc96fd_base
+
+-- | Get the name of the current camera driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"v4l2\", \"coremedia\" or \"android\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current camera driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentCameraDriver@, defined at @SDL3\/SDL_camera.h 215:42@
+sDL_GetCurrentCameraDriver :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetCurrentCameraDriver =
+  hs_bindgen_eb2b917f28fc96fd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameras@
+foreign import ccall safe "hs_bindgen_1ba2aef0a8cc6032"
+  hs_bindgen_1ba2aef0a8cc6032_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameras@
+hs_bindgen_1ba2aef0a8cc6032
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_CameraID)
+hs_bindgen_1ba2aef0a8cc6032 =
+  BG.fromFFIType hs_bindgen_1ba2aef0a8cc6032_base
+
+-- | Get a list of currently connected camera devices.
+--
+--     [Returns]: a 0 terminated array of camera instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameras@, defined at @SDL3\/SDL_camera.h 232:44@
+sDL_GetCameras
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of cameras returned, may be NULL.
+  -> IO (BG.Ptr SDL_CameraID)
+sDL_GetCameras = hs_bindgen_1ba2aef0a8cc6032
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraSupportedFormats@
+foreign import ccall safe "hs_bindgen_5a031667f9d45a0d"
+  hs_bindgen_5a031667f9d45a0d_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraSupportedFormats@
+hs_bindgen_5a031667f9d45a0d
+  :: SDL_CameraID
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_CameraSpec))
+hs_bindgen_5a031667f9d45a0d =
+  BG.fromFFIType hs_bindgen_5a031667f9d45a0d_base
+
+-- | Get the list of native formats\/sizes a camera supports.
+--
+--     This returns a list of all formats and frame sizes that a specific camera can offer. This is useful if your app can accept a variety of image formats and sizes and so want to find the optimal spec that doesn\'t require conversion.
+--
+--     This function isn\'t strictly required; if you call SDL_OpenCamera with a NULL spec, SDL will choose a native format for you, and if you instead specify a desired format, it will transparently convert to the requested format on your behalf.
+--
+--     If @count@ is not NULL, it will be filled with the number of elements in the returned array.
+--
+--     Note that it\'s legal for a camera to supply an empty list. This is what will happen on Emscripten builds, since that platform won\'t tell /anything/ about available cameras until you\'ve opened one, and won\'t even tell if there /is/ a camera until the user has given you permission to check through a scary warning popup.
+--
+--     [Returns]: a NULL terminated array of pointers to 'SDL_CameraSpec' or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras', 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameraSupportedFormats@, defined at @SDL3\/SDL_camera.h 271:47@
+sDL_GetCameraSupportedFormats
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of elements in the list, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_CameraSpec))
+sDL_GetCameraSupportedFormats =
+  hs_bindgen_5a031667f9d45a0d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraName@
+foreign import ccall safe "hs_bindgen_1fe2503ad9612c29"
+  hs_bindgen_1fe2503ad9612c29_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraName@
+hs_bindgen_1fe2503ad9612c29
+  :: SDL_CameraID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_1fe2503ad9612c29 =
+  BG.fromFFIType hs_bindgen_1fe2503ad9612c29_base
+
+-- | Get the human-readable device name for a camera.
+--
+--     [Returns]: a human-readable device name or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras'
+--
+--     [C declaration]: @SDL_GetCameraName@, defined at @SDL3\/SDL_camera.h 286:42@
+sDL_GetCameraName
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetCameraName = hs_bindgen_1fe2503ad9612c29
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraPosition@
+foreign import ccall safe "hs_bindgen_53c0436c6140f231"
+  hs_bindgen_53c0436c6140f231_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraPosition@
+hs_bindgen_53c0436c6140f231
+  :: SDL_CameraID
+  -> IO SDL_CameraPosition
+hs_bindgen_53c0436c6140f231 =
+  BG.fromFFIType hs_bindgen_53c0436c6140f231_base
+
+-- | Get the position of the camera in relation to the system.
+--
+--     Most platforms will report UNKNOWN, but mobile devices, like phones, can often make a distinction between cameras on the front of the device (that points towards the user, for taking \"selfies\") and cameras on the back (for filming in the direction the user is facing).
+--
+--     [Returns]: the position of the camera on the system hardware.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras'
+--
+--     [C declaration]: @SDL_GetCameraPosition@, defined at @SDL3\/SDL_camera.h 305:48@
+sDL_GetCameraPosition
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> IO SDL_CameraPosition
+sDL_GetCameraPosition = hs_bindgen_53c0436c6140f231
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_OpenCamera@
+foreign import ccall safe "hs_bindgen_9c29b271631f7c6f"
+  hs_bindgen_9c29b271631f7c6f_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_OpenCamera@
+hs_bindgen_9c29b271631f7c6f
+  :: SDL_CameraID
+  -> PtrConst.PtrConst SDL_CameraSpec
+  -> IO (BG.Ptr SDL_Camera)
+hs_bindgen_9c29b271631f7c6f =
+  BG.fromFFIType hs_bindgen_9c29b271631f7c6f_base
+
+-- | Open a video recording device (a \"camera\").
+--
+--     You can open the device with any reasonable spec, and if the hardware can\'t directly support it, it will convert data seamlessly to the requested format. This might incur overhead, including scaling of image data.
+--
+--     If you would rather accept whatever format the device offers, you can pass a NULL spec here and it will choose one for you (and you can use SDL_Surface\'s conversion\/scaling functions directly if necessary).
+--
+--     You can call @SDL_GetCameraFormat()@ to get the actual data format if passing a NULL spec here. You can see the exact specs a device can support without conversion with @SDL_GetCameraSupportedFormats()@.
+--
+--     SDL will not attempt to emulate framerate; it will try to set the hardware to the rate closest to the requested speed, but it won\'t attempt to limit or duplicate frames artificially; call @SDL_GetCameraFormat()@ to see the actual framerate of the opened the device, and check your timestamps if this is crucial to your app!
+--
+--     Note that the camera is not usable until the user approves its use! On some platforms, the operating system will prompt the user to permit access to the camera, and they can choose Yes or No at that point. Until they do, the camera will not be usable. The app should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @SDL_GetCameraPermissionState()@ occasionally until it returns non-zero. On platforms that don\'t require explicit user approval (and perhaps in places where the user previously permitted access), the approval event might come immediately, but it might come seconds, minutes, or hours later!
+--
+--     [Returns]: an 'SDL_Camera' object or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras', 'sDL_GetCameraFormat'
+--
+--     [C declaration]: @SDL_OpenCamera@, defined at @SDL3\/SDL_camera.h 352:42@
+sDL_OpenCamera
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> PtrConst.PtrConst SDL_CameraSpec
+  -- ^
+  --
+  --           [@spec@]: the desired format for data the device will provide. Can be NULL.
+  -> IO (BG.Ptr SDL_Camera)
+sDL_OpenCamera = hs_bindgen_9c29b271631f7c6f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraPermissionState@
+foreign import ccall safe "hs_bindgen_77d5a87752cf6936"
+  hs_bindgen_77d5a87752cf6936_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraPermissionState@
+hs_bindgen_77d5a87752cf6936
+  :: BG.Ptr SDL_Camera
+  -> IO SDL_CameraPermissionState
+hs_bindgen_77d5a87752cf6936 =
+  BG.fromFFIType hs_bindgen_77d5a87752cf6936_base
+
+-- | Query if camera access has been approved by the user.
+--
+--     Cameras will not function between when the device is opened by the app and when the user permits access to the hardware. On some platforms, this presents as a popup dialog where the user has to explicitly approve access; on others the approval might be implicit and not alert the user at all.
+--
+--     This function can be used to check the status of that approval. It will return SDL_CAMERA_PERMISSION_STATE_PENDING if waiting for user response, SDL_CAMERA_PERMISSION_STATE_APPROVED if the camera is approved for use, and SDL_CAMERA_PERMISSION_STATE_DENIED if the user denied access.
+--
+--     Instead of polling with this function, you can wait for a SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event in the standard SDL event loop, which is guaranteed to be sent once when permission to use the camera is decided.
+--
+--     If a camera is declined, there\'s nothing to be done but call @SDL_CloseCamera()@ to dispose of it.
+--
+--     [Returns]: an 'SDL_CameraPermissionState' value indicating if access is granted, or @SDL_CAMERA_PERMISSION_STATE_PENDING@ if the decision is still pending.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera', 'sDL_CloseCamera'
+--
+--     [C declaration]: @SDL_GetCameraPermissionState@, defined at @SDL3\/SDL_camera.h 387:55@
+sDL_GetCameraPermissionState
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: the opened camera device to query.
+  -> IO SDL_CameraPermissionState
+sDL_GetCameraPermissionState =
+  hs_bindgen_77d5a87752cf6936
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraID@
+foreign import ccall safe "hs_bindgen_bcdd620eca919b2e"
+  hs_bindgen_bcdd620eca919b2e_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraID@
+hs_bindgen_bcdd620eca919b2e
+  :: BG.Ptr SDL_Camera
+  -> IO SDL_CameraID
+hs_bindgen_bcdd620eca919b2e =
+  BG.fromFFIType hs_bindgen_bcdd620eca919b2e_base
+
+-- | Get the instance ID of an opened camera.
+--
+--     [Returns]: the instance ID of the specified camera on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameraID@, defined at @SDL3\/SDL_camera.h 402:42@
+sDL_GetCameraID
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: an 'SDL_Camera' to query.
+  -> IO SDL_CameraID
+sDL_GetCameraID = hs_bindgen_bcdd620eca919b2e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraProperties@
+foreign import ccall safe "hs_bindgen_052b8e57c4e6c7b6"
+  hs_bindgen_052b8e57c4e6c7b6_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraProperties@
+hs_bindgen_052b8e57c4e6c7b6
+  :: BG.Ptr SDL_Camera
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_052b8e57c4e6c7b6 =
+  BG.fromFFIType hs_bindgen_052b8e57c4e6c7b6_base
+
+-- | Get the properties associated with an opened camera.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCameraProperties@, defined at @SDL3\/SDL_camera.h 415:46@
+sDL_GetCameraProperties
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: the 'SDL_Camera' obtained from @SDL_OpenCamera()@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetCameraProperties = hs_bindgen_052b8e57c4e6c7b6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraFormat@
+foreign import ccall safe "hs_bindgen_077520cc55e1919f"
+  hs_bindgen_077520cc55e1919f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_GetCameraFormat@
+hs_bindgen_077520cc55e1919f
+  :: BG.Ptr SDL_Camera
+  -> BG.Ptr SDL_CameraSpec
+  -> IO BG.CBool
+hs_bindgen_077520cc55e1919f =
+  BG.fromFFIType hs_bindgen_077520cc55e1919f_base
+
+-- | Get the spec that a camera is using when generating images.
+--
+--     Note that this might not be the native format of the hardware, as SDL might be converting to this format behind the scenes.
+--
+--     If the system is waiting for the user to approve access to the camera, as some platforms require, this will return false, but this isn\'t necessarily a fatal error; you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @SDL_GetCameraPermissionState()@ occasionally until it returns non-zero.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameraFormat@, defined at @SDL3\/SDL_camera.h 441:34@
+sDL_GetCameraFormat
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL_CameraSpec
+  -- ^
+  --
+  --           [@spec@]: the 'SDL_CameraSpec' to be initialized by this function.
+  -> IO BG.CBool
+sDL_GetCameraFormat = hs_bindgen_077520cc55e1919f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_AcquireCameraFrame@
+foreign import ccall safe "hs_bindgen_ea5de39cea6d2cc9"
+  hs_bindgen_ea5de39cea6d2cc9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_AcquireCameraFrame@
+hs_bindgen_ea5de39cea6d2cc9
+  :: BG.Ptr SDL_Camera
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+hs_bindgen_ea5de39cea6d2cc9 =
+  BG.fromFFIType hs_bindgen_ea5de39cea6d2cc9_base
+
+-- | Acquire a frame.
+--
+--     The frame is a memory pointer to the image data, whose size and format are given by the spec requested when opening the device.
+--
+--     This is a non blocking API. If there is a frame available, a non-NULL surface is returned, and timestampNS will be filled with a non-zero value.
+--
+--     Note that an error case can also return NULL, but a NULL by itself is normal and just signifies that a new frame is not yet available. Note that even if a camera device fails outright (a USB camera is unplugged while in use, etc), SDL will send an event separately to notify the app, but continue to provide blank frames at ongoing intervals until @SDL_CloseCamera()@ is called, so real failure here is almost always an out of memory condition.
+--
+--     After use, the frame should be released with @SDL_ReleaseCameraFrame()@. If you don\'t do this, the system may stop providing more video!
+--
+--     Do not call SDL_DestroySurface() on the returned surface! It must be given back to the camera subsystem with SDL_ReleaseCameraFrame!
+--
+--     If the system is waiting for the user to approve access to the camera, as some platforms require, this will return NULL (no frames available); you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @SDL_GetCameraPermissionState()@ occasionally until it returns non-zero.
+--
+--     [Returns]: a new frame of video on success, NULL if none is currently available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ReleaseCameraFrame'
+--
+--     [C declaration]: @SDL_AcquireCameraFrame@, defined at @SDL3\/SDL_camera.h 484:43@
+sDL_AcquireCameraFrame
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@timestampNS@]: a pointer filled in with the frame\'s timestamp, or 0 on error. Can be NULL.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+sDL_AcquireCameraFrame = hs_bindgen_ea5de39cea6d2cc9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_ReleaseCameraFrame@
+foreign import ccall safe "hs_bindgen_9abaf64e06b4eeb3"
+  hs_bindgen_9abaf64e06b4eeb3_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_ReleaseCameraFrame@
+hs_bindgen_9abaf64e06b4eeb3
+  :: BG.Ptr SDL_Camera
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO ()
+hs_bindgen_9abaf64e06b4eeb3 =
+  BG.fromFFIType hs_bindgen_9abaf64e06b4eeb3_base
+
+-- | Release a frame of video acquired from a camera.
+--
+--     Let the back-end re-use the internal buffer for camera.
+--
+--     This function /must/ be called only on surface objects returned by @SDL_AcquireCameraFrame()@. This function should be called as quickly as possible after acquisition, as SDL keeps a small FIFO queue of surfaces for video frames; if surfaces aren\'t released in a timely manner, SDL may drop upcoming video frames from the camera.
+--
+--     If the app needs to keep the surface for a significant time, they should make a copy of it and release the original.
+--
+--     The app should not use the surface again after calling this function; assume the surface is freed and the pointer is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireCameraFrame'
+--
+--     [C declaration]: @SDL_ReleaseCameraFrame@, defined at @SDL3\/SDL_camera.h 512:34@
+sDL_ReleaseCameraFrame
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@frame@]: the video frame surface to release.
+  -> IO ()
+sDL_ReleaseCameraFrame = hs_bindgen_9abaf64e06b4eeb3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_CloseCamera@
+foreign import ccall safe "hs_bindgen_2ca914bb2dfa2f4d"
+  hs_bindgen_2ca914bb2dfa2f4d_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Safe_SDL_CloseCamera@
+hs_bindgen_2ca914bb2dfa2f4d
+  :: BG.Ptr SDL_Camera
+  -> IO ()
+hs_bindgen_2ca914bb2dfa2f4d =
+  BG.fromFFIType hs_bindgen_2ca914bb2dfa2f4d_base
+
+-- | Use this function to shut down camera processing and close the camera device.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but no thread may reference @device@ once this function is called.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_CloseCamera@, defined at @SDL3\/SDL_camera.h 527:34@
+sDL_CloseCamera
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> IO ()
+sDL_CloseCamera = hs_bindgen_2ca914bb2dfa2f4d
diff --git a/src/SDL3/Sys/Bindgen/Camera/Unsafe.hs b/src/SDL3/Sys/Bindgen/Camera/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Camera/Unsafe.hs
@@ -0,0 +1,683 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Camera.Unsafe (
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetNumCameraDrivers,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetCameraDriver,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetCurrentCameraDriver,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetCameras,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetCameraSupportedFormats,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetCameraName,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetCameraPosition,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_OpenCamera,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetCameraPermissionState,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetCameraID,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetCameraProperties,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_GetCameraFormat,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_AcquireCameraFrame,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_ReleaseCameraFrame,
+  SDL3.Sys.Bindgen.Camera.Unsafe.sDL_CloseCamera,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Camera
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_camera.h>"
+         , "signed int hs_bindgen_d6f6e8f18fc1b811 (void)"
+         , "{"
+         , "  return (SDL_GetNumCameraDrivers)();"
+         , "}"
+         , "char const *hs_bindgen_fab707b0b898d9a8 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraDriver)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_f63a9ad2baa64d58 (void)"
+         , "{"
+         , "  return (SDL_GetCurrentCameraDriver)();"
+         , "}"
+         , "SDL_CameraID *hs_bindgen_6eb690904608f448 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameras)(arg1);"
+         , "}"
+         , "SDL_CameraSpec **hs_bindgen_298ed5d6dee5e9d7 ("
+         , "  SDL_CameraID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraSupportedFormats)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_13f9855710ed88cb ("
+         , "  SDL_CameraID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraName)(arg1);"
+         , "}"
+         , "SDL_CameraPosition hs_bindgen_cb5fce5ed4c39502 ("
+         , "  SDL_CameraID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraPosition)(arg1);"
+         , "}"
+         , "SDL_Camera *hs_bindgen_7076142551220212 ("
+         , "  SDL_CameraID arg1,"
+         , "  SDL_CameraSpec const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenCamera)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_CameraPermissionState;"
+         , "#endif"
+         , "SDL_CameraPermissionState hs_bindgen_43f06cfe20bf363a ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraPermissionState)(arg1);"
+         , "}"
+         , "SDL_CameraID hs_bindgen_ece1966e90c73584 ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraID)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_f62fda07cbce2ead ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraProperties)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_42178ba967905119 ("
+         , "  SDL_Camera *arg1,"
+         , "  SDL_CameraSpec *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCameraFormat)(arg1, arg2);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_c2cdd3ce6b7ef7cd ("
+         , "  SDL_Camera *arg1,"
+         , "  Uint64 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AcquireCameraFrame)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_faf5d2c09f75fa1b ("
+         , "  SDL_Camera *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseCameraFrame)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_4e7f7c3353027126 ("
+         , "  SDL_Camera *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseCamera)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetNumCameraDrivers@
+foreign import ccall unsafe "hs_bindgen_d6f6e8f18fc1b811"
+  hs_bindgen_d6f6e8f18fc1b811_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetNumCameraDrivers@
+hs_bindgen_d6f6e8f18fc1b811 :: IO BG.CInt
+hs_bindgen_d6f6e8f18fc1b811 =
+  BG.fromFFIType hs_bindgen_d6f6e8f18fc1b811_base
+
+-- | Use this function to get the number of built-in camera drivers.
+--
+--     This function returns a hardcoded number. This never returns a negative value; if there are no drivers compiled into this build of SDL, this function returns zero. The presence of a driver in this list does not mean it will function, it just means SDL is capable of interacting with that interface. For example, a build of SDL might have v4l2 support, but if there\'s no kernel support available, SDL\'s v4l2 driver would fail if used.
+--
+--     By default, SDL tries all drivers, in its preferred order, until one is found to be usable.
+--
+--     [Returns]: the number of built-in camera drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameraDriver'
+--
+--     [C declaration]: @SDL_GetNumCameraDrivers@, defined at @SDL3\/SDL_camera.h 175:33@
+sDL_GetNumCameraDrivers :: IO BG.CInt
+sDL_GetNumCameraDrivers = hs_bindgen_d6f6e8f18fc1b811
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraDriver@
+foreign import ccall unsafe "hs_bindgen_fab707b0b898d9a8"
+  hs_bindgen_fab707b0b898d9a8_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraDriver@
+hs_bindgen_fab707b0b898d9a8
+  :: BG.CInt
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_fab707b0b898d9a8 =
+  BG.fromFFIType hs_bindgen_fab707b0b898d9a8_base
+
+-- | Use this function to get the name of a built in camera driver.
+--
+--     The list of camera drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"v4l2\", \"coremedia\" or \"android\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the camera driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumCameraDrivers'
+--
+--     [C declaration]: @SDL_GetCameraDriver@, defined at @SDL3\/SDL_camera.h 199:42@
+sDL_GetCameraDriver
+  :: BG.CInt
+  -- ^
+  --
+  --           [@index@]: the index of the camera driver; the value ranges from 0 to @SDL_GetNumCameraDrivers()@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetCameraDriver = hs_bindgen_fab707b0b898d9a8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCurrentCameraDriver@
+foreign import ccall unsafe "hs_bindgen_f63a9ad2baa64d58"
+  hs_bindgen_f63a9ad2baa64d58_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCurrentCameraDriver@
+hs_bindgen_f63a9ad2baa64d58 :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_f63a9ad2baa64d58 =
+  BG.fromFFIType hs_bindgen_f63a9ad2baa64d58_base
+
+-- | Get the name of the current camera driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"v4l2\", \"coremedia\" or \"android\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current camera driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentCameraDriver@, defined at @SDL3\/SDL_camera.h 215:42@
+sDL_GetCurrentCameraDriver :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetCurrentCameraDriver =
+  hs_bindgen_f63a9ad2baa64d58
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameras@
+foreign import ccall unsafe "hs_bindgen_6eb690904608f448"
+  hs_bindgen_6eb690904608f448_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameras@
+hs_bindgen_6eb690904608f448
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_CameraID)
+hs_bindgen_6eb690904608f448 =
+  BG.fromFFIType hs_bindgen_6eb690904608f448_base
+
+-- | Get a list of currently connected camera devices.
+--
+--     [Returns]: a 0 terminated array of camera instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameras@, defined at @SDL3\/SDL_camera.h 232:44@
+sDL_GetCameras
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of cameras returned, may be NULL.
+  -> IO (BG.Ptr SDL_CameraID)
+sDL_GetCameras = hs_bindgen_6eb690904608f448
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraSupportedFormats@
+foreign import ccall unsafe "hs_bindgen_298ed5d6dee5e9d7"
+  hs_bindgen_298ed5d6dee5e9d7_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraSupportedFormats@
+hs_bindgen_298ed5d6dee5e9d7
+  :: SDL_CameraID
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_CameraSpec))
+hs_bindgen_298ed5d6dee5e9d7 =
+  BG.fromFFIType hs_bindgen_298ed5d6dee5e9d7_base
+
+-- | Get the list of native formats\/sizes a camera supports.
+--
+--     This returns a list of all formats and frame sizes that a specific camera can offer. This is useful if your app can accept a variety of image formats and sizes and so want to find the optimal spec that doesn\'t require conversion.
+--
+--     This function isn\'t strictly required; if you call SDL_OpenCamera with a NULL spec, SDL will choose a native format for you, and if you instead specify a desired format, it will transparently convert to the requested format on your behalf.
+--
+--     If @count@ is not NULL, it will be filled with the number of elements in the returned array.
+--
+--     Note that it\'s legal for a camera to supply an empty list. This is what will happen on Emscripten builds, since that platform won\'t tell /anything/ about available cameras until you\'ve opened one, and won\'t even tell if there /is/ a camera until the user has given you permission to check through a scary warning popup.
+--
+--     [Returns]: a NULL terminated array of pointers to 'SDL_CameraSpec' or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras', 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameraSupportedFormats@, defined at @SDL3\/SDL_camera.h 271:47@
+sDL_GetCameraSupportedFormats
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of elements in the list, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_CameraSpec))
+sDL_GetCameraSupportedFormats =
+  hs_bindgen_298ed5d6dee5e9d7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraName@
+foreign import ccall unsafe "hs_bindgen_13f9855710ed88cb"
+  hs_bindgen_13f9855710ed88cb_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraName@
+hs_bindgen_13f9855710ed88cb
+  :: SDL_CameraID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_13f9855710ed88cb =
+  BG.fromFFIType hs_bindgen_13f9855710ed88cb_base
+
+-- | Get the human-readable device name for a camera.
+--
+--     [Returns]: a human-readable device name or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras'
+--
+--     [C declaration]: @SDL_GetCameraName@, defined at @SDL3\/SDL_camera.h 286:42@
+sDL_GetCameraName
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetCameraName = hs_bindgen_13f9855710ed88cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraPosition@
+foreign import ccall unsafe "hs_bindgen_cb5fce5ed4c39502"
+  hs_bindgen_cb5fce5ed4c39502_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraPosition@
+hs_bindgen_cb5fce5ed4c39502
+  :: SDL_CameraID
+  -> IO SDL_CameraPosition
+hs_bindgen_cb5fce5ed4c39502 =
+  BG.fromFFIType hs_bindgen_cb5fce5ed4c39502_base
+
+-- | Get the position of the camera in relation to the system.
+--
+--     Most platforms will report UNKNOWN, but mobile devices, like phones, can often make a distinction between cameras on the front of the device (that points towards the user, for taking \"selfies\") and cameras on the back (for filming in the direction the user is facing).
+--
+--     [Returns]: the position of the camera on the system hardware.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras'
+--
+--     [C declaration]: @SDL_GetCameraPosition@, defined at @SDL3\/SDL_camera.h 305:48@
+sDL_GetCameraPosition
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> IO SDL_CameraPosition
+sDL_GetCameraPosition = hs_bindgen_cb5fce5ed4c39502
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_OpenCamera@
+foreign import ccall unsafe "hs_bindgen_7076142551220212"
+  hs_bindgen_7076142551220212_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_OpenCamera@
+hs_bindgen_7076142551220212
+  :: SDL_CameraID
+  -> PtrConst.PtrConst SDL_CameraSpec
+  -> IO (BG.Ptr SDL_Camera)
+hs_bindgen_7076142551220212 =
+  BG.fromFFIType hs_bindgen_7076142551220212_base
+
+-- | Open a video recording device (a \"camera\").
+--
+--     You can open the device with any reasonable spec, and if the hardware can\'t directly support it, it will convert data seamlessly to the requested format. This might incur overhead, including scaling of image data.
+--
+--     If you would rather accept whatever format the device offers, you can pass a NULL spec here and it will choose one for you (and you can use SDL_Surface\'s conversion\/scaling functions directly if necessary).
+--
+--     You can call @SDL_GetCameraFormat()@ to get the actual data format if passing a NULL spec here. You can see the exact specs a device can support without conversion with @SDL_GetCameraSupportedFormats()@.
+--
+--     SDL will not attempt to emulate framerate; it will try to set the hardware to the rate closest to the requested speed, but it won\'t attempt to limit or duplicate frames artificially; call @SDL_GetCameraFormat()@ to see the actual framerate of the opened the device, and check your timestamps if this is crucial to your app!
+--
+--     Note that the camera is not usable until the user approves its use! On some platforms, the operating system will prompt the user to permit access to the camera, and they can choose Yes or No at that point. Until they do, the camera will not be usable. The app should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @SDL_GetCameraPermissionState()@ occasionally until it returns non-zero. On platforms that don\'t require explicit user approval (and perhaps in places where the user previously permitted access), the approval event might come immediately, but it might come seconds, minutes, or hours later!
+--
+--     [Returns]: an 'SDL_Camera' object or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCameras', 'sDL_GetCameraFormat'
+--
+--     [C declaration]: @SDL_OpenCamera@, defined at @SDL3\/SDL_camera.h 352:42@
+sDL_OpenCamera
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> PtrConst.PtrConst SDL_CameraSpec
+  -- ^
+  --
+  --           [@spec@]: the desired format for data the device will provide. Can be NULL.
+  -> IO (BG.Ptr SDL_Camera)
+sDL_OpenCamera = hs_bindgen_7076142551220212
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraPermissionState@
+foreign import ccall unsafe "hs_bindgen_43f06cfe20bf363a"
+  hs_bindgen_43f06cfe20bf363a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraPermissionState@
+hs_bindgen_43f06cfe20bf363a
+  :: BG.Ptr SDL_Camera
+  -> IO SDL_CameraPermissionState
+hs_bindgen_43f06cfe20bf363a =
+  BG.fromFFIType hs_bindgen_43f06cfe20bf363a_base
+
+-- | Query if camera access has been approved by the user.
+--
+--     Cameras will not function between when the device is opened by the app and when the user permits access to the hardware. On some platforms, this presents as a popup dialog where the user has to explicitly approve access; on others the approval might be implicit and not alert the user at all.
+--
+--     This function can be used to check the status of that approval. It will return SDL_CAMERA_PERMISSION_STATE_PENDING if waiting for user response, SDL_CAMERA_PERMISSION_STATE_APPROVED if the camera is approved for use, and SDL_CAMERA_PERMISSION_STATE_DENIED if the user denied access.
+--
+--     Instead of polling with this function, you can wait for a SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event in the standard SDL event loop, which is guaranteed to be sent once when permission to use the camera is decided.
+--
+--     If a camera is declined, there\'s nothing to be done but call @SDL_CloseCamera()@ to dispose of it.
+--
+--     [Returns]: an 'SDL_CameraPermissionState' value indicating if access is granted, or @SDL_CAMERA_PERMISSION_STATE_PENDING@ if the decision is still pending.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera', 'sDL_CloseCamera'
+--
+--     [C declaration]: @SDL_GetCameraPermissionState@, defined at @SDL3\/SDL_camera.h 387:55@
+sDL_GetCameraPermissionState
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: the opened camera device to query.
+  -> IO SDL_CameraPermissionState
+sDL_GetCameraPermissionState =
+  hs_bindgen_43f06cfe20bf363a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraID@
+foreign import ccall unsafe "hs_bindgen_ece1966e90c73584"
+  hs_bindgen_ece1966e90c73584_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraID@
+hs_bindgen_ece1966e90c73584
+  :: BG.Ptr SDL_Camera
+  -> IO SDL_CameraID
+hs_bindgen_ece1966e90c73584 =
+  BG.fromFFIType hs_bindgen_ece1966e90c73584_base
+
+-- | Get the instance ID of an opened camera.
+--
+--     [Returns]: the instance ID of the specified camera on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameraID@, defined at @SDL3\/SDL_camera.h 402:42@
+sDL_GetCameraID
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: an 'SDL_Camera' to query.
+  -> IO SDL_CameraID
+sDL_GetCameraID = hs_bindgen_ece1966e90c73584
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraProperties@
+foreign import ccall unsafe "hs_bindgen_f62fda07cbce2ead"
+  hs_bindgen_f62fda07cbce2ead_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraProperties@
+hs_bindgen_f62fda07cbce2ead
+  :: BG.Ptr SDL_Camera
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_f62fda07cbce2ead =
+  BG.fromFFIType hs_bindgen_f62fda07cbce2ead_base
+
+-- | Get the properties associated with an opened camera.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCameraProperties@, defined at @SDL3\/SDL_camera.h 415:46@
+sDL_GetCameraProperties
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: the 'SDL_Camera' obtained from @SDL_OpenCamera()@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetCameraProperties = hs_bindgen_f62fda07cbce2ead
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraFormat@
+foreign import ccall unsafe "hs_bindgen_42178ba967905119"
+  hs_bindgen_42178ba967905119_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_GetCameraFormat@
+hs_bindgen_42178ba967905119
+  :: BG.Ptr SDL_Camera
+  -> BG.Ptr SDL_CameraSpec
+  -> IO BG.CBool
+hs_bindgen_42178ba967905119 =
+  BG.fromFFIType hs_bindgen_42178ba967905119_base
+
+-- | Get the spec that a camera is using when generating images.
+--
+--     Note that this might not be the native format of the hardware, as SDL might be converting to this format behind the scenes.
+--
+--     If the system is waiting for the user to approve access to the camera, as some platforms require, this will return false, but this isn\'t necessarily a fatal error; you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @SDL_GetCameraPermissionState()@ occasionally until it returns non-zero.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_GetCameraFormat@, defined at @SDL3\/SDL_camera.h 441:34@
+sDL_GetCameraFormat
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL_CameraSpec
+  -- ^
+  --
+  --           [@spec@]: the 'SDL_CameraSpec' to be initialized by this function.
+  -> IO BG.CBool
+sDL_GetCameraFormat = hs_bindgen_42178ba967905119
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_AcquireCameraFrame@
+foreign import ccall unsafe "hs_bindgen_c2cdd3ce6b7ef7cd"
+  hs_bindgen_c2cdd3ce6b7ef7cd_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_AcquireCameraFrame@
+hs_bindgen_c2cdd3ce6b7ef7cd
+  :: BG.Ptr SDL_Camera
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+hs_bindgen_c2cdd3ce6b7ef7cd =
+  BG.fromFFIType hs_bindgen_c2cdd3ce6b7ef7cd_base
+
+-- | Acquire a frame.
+--
+--     The frame is a memory pointer to the image data, whose size and format are given by the spec requested when opening the device.
+--
+--     This is a non blocking API. If there is a frame available, a non-NULL surface is returned, and timestampNS will be filled with a non-zero value.
+--
+--     Note that an error case can also return NULL, but a NULL by itself is normal and just signifies that a new frame is not yet available. Note that even if a camera device fails outright (a USB camera is unplugged while in use, etc), SDL will send an event separately to notify the app, but continue to provide blank frames at ongoing intervals until @SDL_CloseCamera()@ is called, so real failure here is almost always an out of memory condition.
+--
+--     After use, the frame should be released with @SDL_ReleaseCameraFrame()@. If you don\'t do this, the system may stop providing more video!
+--
+--     Do not call SDL_DestroySurface() on the returned surface! It must be given back to the camera subsystem with SDL_ReleaseCameraFrame!
+--
+--     If the system is waiting for the user to approve access to the camera, as some platforms require, this will return NULL (no frames available); you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @SDL_GetCameraPermissionState()@ occasionally until it returns non-zero.
+--
+--     [Returns]: a new frame of video on success, NULL if none is currently available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ReleaseCameraFrame'
+--
+--     [C declaration]: @SDL_AcquireCameraFrame@, defined at @SDL3\/SDL_camera.h 484:43@
+sDL_AcquireCameraFrame
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@timestampNS@]: a pointer filled in with the frame\'s timestamp, or 0 on error. Can be NULL.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+sDL_AcquireCameraFrame = hs_bindgen_c2cdd3ce6b7ef7cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_ReleaseCameraFrame@
+foreign import ccall unsafe "hs_bindgen_faf5d2c09f75fa1b"
+  hs_bindgen_faf5d2c09f75fa1b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_ReleaseCameraFrame@
+hs_bindgen_faf5d2c09f75fa1b
+  :: BG.Ptr SDL_Camera
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO ()
+hs_bindgen_faf5d2c09f75fa1b =
+  BG.fromFFIType hs_bindgen_faf5d2c09f75fa1b_base
+
+-- | Release a frame of video acquired from a camera.
+--
+--     Let the back-end re-use the internal buffer for camera.
+--
+--     This function /must/ be called only on surface objects returned by @SDL_AcquireCameraFrame()@. This function should be called as quickly as possible after acquisition, as SDL keeps a small FIFO queue of surfaces for video frames; if surfaces aren\'t released in a timely manner, SDL may drop upcoming video frames from the camera.
+--
+--     If the app needs to keep the surface for a significant time, they should make a copy of it and release the original.
+--
+--     The app should not use the surface again after calling this function; assume the surface is freed and the pointer is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireCameraFrame'
+--
+--     [C declaration]: @SDL_ReleaseCameraFrame@, defined at @SDL3\/SDL_camera.h 512:34@
+sDL_ReleaseCameraFrame
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@frame@]: the video frame surface to release.
+  -> IO ()
+sDL_ReleaseCameraFrame = hs_bindgen_faf5d2c09f75fa1b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_CloseCamera@
+foreign import ccall unsafe "hs_bindgen_4e7f7c3353027126"
+  hs_bindgen_4e7f7c3353027126_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Camera_Unsafe_SDL_CloseCamera@
+hs_bindgen_4e7f7c3353027126
+  :: BG.Ptr SDL_Camera
+  -> IO ()
+hs_bindgen_4e7f7c3353027126 =
+  BG.fromFFIType hs_bindgen_4e7f7c3353027126_base
+
+-- | Use this function to shut down camera processing and close the camera device.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but no thread may reference @device@ once this function is called.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenCamera'
+--
+--     [C declaration]: @SDL_CloseCamera@, defined at @SDL3\/SDL_camera.h 527:34@
+sDL_CloseCamera
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> IO ()
+sDL_CloseCamera = hs_bindgen_4e7f7c3353027126
diff --git a/src/SDL3/Sys/Bindgen/Clipboard.hs b/src/SDL3/Sys/Bindgen/Clipboard.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Clipboard.hs
@@ -0,0 +1,314 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL provides access to the system clipboard, both for reading information from other processes and publishing information of its own.
+--
+--     This is not just text! SDL apps can access and publish data by mimetype.
+--
+--     Basic use (text)
+--
+--     Obtaining and publishing simple text to the system clipboard is as easy as calling @SDL_GetClipboardText()@ and @SDL_SetClipboardText()@, respectively. These deal with C strings in UTF-8 encoding. Data transmission and encoding conversion is completely managed by SDL.
+--
+--     Clipboard callbacks (data other than text)
+--
+--     Things get more complicated when the clipboard contains something other than text. Not only can the system clipboard contain data of any type, in some cases it can contain the same data in different formats! For example, an image painting app might let the user copy a graphic to the clipboard, and offers it in .BMP, .JPG, or .PNG format for other apps to consume.
+--
+--     Obtaining clipboard data (\"pasting\") like this is a matter of calling @SDL_GetClipboardData()@ and telling it the mimetype of the data you want. But how does one know if that format is available? @SDL_HasClipboardData()@ can report if a specific mimetype is offered, and @SDL_GetClipboardMimeTypes()@ can provide the entire list of mimetypes available, so the app can decide what to do with the data and what formats it can support.
+--
+--     Setting the clipboard (\"copying\") to arbitrary data is done with SDL_SetClipboardData. The app does not provide the data in this call, but rather the mimetypes it is willing to provide and a callback function. During the callback, the app will generate the data. This allows massive data sets to be provided to the clipboard, without any data being copied before it is explicitly requested. More specifically, it allows an app to offer data in multiple formats without providing a copy of all of them upfront. If the app has an image that it could provide in PNG or JPG format, it doesn\'t have to encode it to either of those unless and until something tries to paste it.
+--
+--     Primary Selection
+--
+--     The X11 and Wayland video targets have a concept of the \"primary selection\" in addition to the usual clipboard. This is generally highlighted (but not explicitly copied) text from various apps. SDL offers APIs for this through @SDL_GetPrimarySelectionText()@ and @SDL_SetPrimarySelectionText()@. SDL offers these APIs on platforms without this concept, too, but only so far that it will keep a copy of a string that the app sets for later retrieval; the operating system will not ever attempt to change the string externally if it doesn\'t support a primary selection. Put UTF-8 text into the clipboard.
+--
+--     [@text@]: the text to store in the clipboard.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetClipboardText'
+--
+--     [See also]: 'sDL_HasClipboardText'
+module SDL3.Sys.Bindgen.Clipboard (
+  SDL3.Sys.Bindgen.Clipboard.SDL_ClipboardDataCallback_Aux (..),
+  SDL3.Sys.Bindgen.Clipboard.SDL_ClipboardDataCallback (..),
+  SDL3.Sys.Bindgen.Clipboard.SDL_ClipboardCleanupCallback_Aux (..),
+  SDL3.Sys.Bindgen.Clipboard.SDL_ClipboardCleanupCallback (..),
+)
+where
+
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | Auxiliary type used by 'SDL_ClipboardDataCallback'
+--
+--     [C declaration]: @SDL_ClipboardDataCallback@, defined at @SDL3\/SDL_clipboard.h 210:31@
+newtype SDL_ClipboardDataCallback_Aux = SDL_ClipboardDataCallback_Aux
+  { unwrap
+      :: BG.Ptr BG.Void
+      -> PtrConst.PtrConst BG.CChar
+      -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+      -> IO (PtrConst.PtrConst BG.Void)
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_ClipboardDataCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_4dc4029500cc2362_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO (BG.Ptr BG.Void))
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO (BG.Ptr BG.Void)))
+
+-- __unique:__ @toSDL_ClipboardDataCallback_Aux@
+hs_bindgen_4dc4029500cc2362
+  :: SDL_ClipboardDataCallback_Aux
+  -> IO (BG.FunPtr SDL_ClipboardDataCallback_Aux)
+hs_bindgen_4dc4029500cc2362 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_4dc4029500cc2362_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_ClipboardDataCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_941a517724689596_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO (BG.Ptr BG.Void))
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @fromSDL_ClipboardDataCallback_Aux@
+hs_bindgen_941a517724689596
+  :: BG.FunPtr SDL_ClipboardDataCallback_Aux
+  -> SDL_ClipboardDataCallback_Aux
+hs_bindgen_941a517724689596 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_941a517724689596_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_ClipboardDataCallback_Aux where
+  toFunPtr = hs_bindgen_4dc4029500cc2362
+
+instance BG.FromFunPtr SDL_ClipboardDataCallback_Aux where
+  fromFunPtr = hs_bindgen_941a517724689596
+
+instance
+  ( ty
+      ~ ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.CChar
+          -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+          -> IO (PtrConst.PtrConst BG.Void)
+        )
+  )
+  => BG.CompatHasField.HasField "unwrap" SDL_ClipboardDataCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 -> SDL_ClipboardDataCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  ( ty
+      ~ ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.CChar
+          -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+          -> IO (PtrConst.PtrConst BG.Void)
+        )
+  )
+  => BG.HasField "unwrap" (BG.Ptr SDL_ClipboardDataCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ClipboardDataCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_ClipboardDataCallback_Aux "unwrap" =
+      BG.Ptr BG.Void
+      -> PtrConst.PtrConst BG.CChar
+      -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+      -> IO (PtrConst.PtrConst BG.Void)
+
+  offset# = \_ -> \_ -> 0
+
+-- | Callback function that will be called when data for the specified mime-type is requested by the OS.
+--
+--     The callback function is called with NULL as the mime_type when the clipboard is cleared or new data is set. The clipboard is automatically cleared in SDL_Quit().
+--
+--     [@userdata@]: a pointer to the provided user data.
+--
+--     [@mime_type@]: the requested mime-type.
+--
+--     [@size@]: a pointer filled in with the length of the returned data.
+--
+--     [Returns]: a pointer to the data for the provided mime-type. Returning NULL or setting the length to 0 will cause zero length data to be sent to the \"receiver\", which should be able to handle this. The returned data will not be freed, so it needs to be retained and dealt with internally.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_ClipboardDataCallback@, defined at @SDL3\/SDL_clipboard.h 210:31@
+newtype SDL_ClipboardDataCallback = SDL_ClipboardDataCallback
+  { unwrap :: BG.FunPtr SDL_ClipboardDataCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_ClipboardDataCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_ClipboardDataCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ClipboardDataCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_ClipboardDataCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ClipboardDataCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ClipboardDataCallback "unwrap" where
+  type
+    CFieldType SDL_ClipboardDataCallback "unwrap" =
+      BG.FunPtr SDL_ClipboardDataCallback_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_ClipboardCleanupCallback'
+--
+--     [C declaration]: @SDL_ClipboardCleanupCallback@, defined at @SDL3\/SDL_clipboard.h 222:24@
+newtype SDL_ClipboardCleanupCallback_Aux = SDL_ClipboardCleanupCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_ClipboardCleanupCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_dec1734c1f7f2a3f_base
+    :: (BG.Ptr BG.Void -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> IO ()))
+
+-- __unique:__ @toSDL_ClipboardCleanupCallback_Aux@
+hs_bindgen_dec1734c1f7f2a3f
+  :: SDL_ClipboardCleanupCallback_Aux
+  -> IO (BG.FunPtr SDL_ClipboardCleanupCallback_Aux)
+hs_bindgen_dec1734c1f7f2a3f =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_dec1734c1f7f2a3f_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_ClipboardCleanupCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_0ab064059cf117ee_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> IO ())
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @fromSDL_ClipboardCleanupCallback_Aux@
+hs_bindgen_0ab064059cf117ee
+  :: BG.FunPtr SDL_ClipboardCleanupCallback_Aux
+  -> SDL_ClipboardCleanupCallback_Aux
+hs_bindgen_0ab064059cf117ee =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_0ab064059cf117ee_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_ClipboardCleanupCallback_Aux where
+  toFunPtr = hs_bindgen_dec1734c1f7f2a3f
+
+instance BG.FromFunPtr SDL_ClipboardCleanupCallback_Aux where
+  fromFunPtr = hs_bindgen_0ab064059cf117ee
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_ClipboardCleanupCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ClipboardCleanupCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_ClipboardCleanupCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ClipboardCleanupCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_ClipboardCleanupCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | Callback function that will be called when the clipboard is cleared, or when new data is set.
+--
+--     [@userdata@]: a pointer to the provided user data.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_ClipboardCleanupCallback@, defined at @SDL3\/SDL_clipboard.h 222:24@
+newtype SDL_ClipboardCleanupCallback = SDL_ClipboardCleanupCallback
+  { unwrap :: BG.FunPtr SDL_ClipboardCleanupCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_ClipboardCleanupCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_ClipboardCleanupCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ClipboardCleanupCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_ClipboardCleanupCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ClipboardCleanupCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ClipboardCleanupCallback "unwrap" where
+  type
+    CFieldType SDL_ClipboardCleanupCallback "unwrap" =
+      BG.FunPtr SDL_ClipboardCleanupCallback_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Clipboard/FunPtr.hs b/src/SDL3/Sys/Bindgen/Clipboard/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Clipboard/FunPtr.hs
@@ -0,0 +1,454 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Clipboard.FunPtr (
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_SetClipboardText,
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_GetClipboardText,
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_HasClipboardText,
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_SetPrimarySelectionText,
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_GetPrimarySelectionText,
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_HasPrimarySelectionText,
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_SetClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_ClearClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_GetClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_HasClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.FunPtr.sDL_GetClipboardMimeTypes,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Clipboard
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_clipboard.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_SetClipboardText */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e6a081b49815ff9d (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SetClipboardText;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetClipboardText */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_e073f17299d97161 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetClipboardText;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_HasClipboardText */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_0110b0e19d65293a (void)) (void)"
+         , "{"
+         , "  return &SDL_HasClipboardText;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_SetPrimarySelectionText */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2780901b25e68105 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SetPrimarySelectionText;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetPrimarySelectionText */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_a50a077372a1275b (void)) (void)"
+         , "{"
+         , "  return &SDL_GetPrimarySelectionText;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_HasPrimarySelectionText */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ed5cec4a17949538 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasPrimarySelectionText;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_SetClipboardData */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_407833da207603f1 (void)) ("
+         , "  SDL_ClipboardDataCallback arg1,"
+         , "  SDL_ClipboardCleanupCallback arg2,"
+         , "  void *arg3,"
+         , "  char const **arg4,"
+         , "  size_t arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_SetClipboardData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_ClearClipboardData */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6b6d9f04b710100d (void)) (void)"
+         , "{"
+         , "  return &SDL_ClearClipboardData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetClipboardData */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_4936992218b0c564 (void)) ("
+         , "  char const *arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetClipboardData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_HasClipboardData */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a0c05f57097b9fe0 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_HasClipboardData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetClipboardMimeTypes */"
+         , "__attribute__ ((const))"
+         , "char **(*hs_bindgen_fa141967047535cc (void)) ("
+         , "  size_t *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetClipboardMimeTypes;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_SetClipboardText@
+foreign import ccall unsafe "hs_bindgen_e6a081b49815ff9d"
+  hs_bindgen_e6a081b49815ff9d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_SetClipboardText@
+hs_bindgen_e6a081b49815ff9d :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_e6a081b49815ff9d =
+  BG.fromFFIType hs_bindgen_e6a081b49815ff9d_base
+
+{-# NOINLINE sDL_SetClipboardText #-}
+
+-- | [C declaration]: @SDL_SetClipboardText@, defined at @SDL3\/SDL_clipboard.h 104:34@
+sDL_SetClipboardText :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SetClipboardText =
+  BG.unsafePerformIO hs_bindgen_e6a081b49815ff9d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetClipboardText@
+foreign import ccall unsafe "hs_bindgen_e073f17299d97161"
+  hs_bindgen_e073f17299d97161_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetClipboardText@
+hs_bindgen_e073f17299d97161 :: IO (BG.FunPtr (IO (BG.Ptr BG.CChar)))
+hs_bindgen_e073f17299d97161 =
+  BG.fromFFIType hs_bindgen_e073f17299d97161_base
+
+{-# NOINLINE sDL_GetClipboardText #-}
+
+-- | Get UTF-8 text from the clipboard.
+--
+--     This function returns an empty string if there is not enough memory left for a copy of the clipboard\'s content.
+--
+--     [Returns]: the clipboard text on success or an empty string on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasClipboardText', 'sDL_SetClipboardText'
+--
+--     [C declaration]: @SDL_GetClipboardText@, defined at @SDL3\/SDL_clipboard.h 123:36@
+sDL_GetClipboardText :: BG.FunPtr (IO (BG.Ptr BG.CChar))
+sDL_GetClipboardText =
+  BG.unsafePerformIO hs_bindgen_e073f17299d97161
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_HasClipboardText@
+foreign import ccall unsafe "hs_bindgen_0110b0e19d65293a"
+  hs_bindgen_0110b0e19d65293a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_HasClipboardText@
+hs_bindgen_0110b0e19d65293a :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_0110b0e19d65293a =
+  BG.fromFFIType hs_bindgen_0110b0e19d65293a_base
+
+{-# NOINLINE sDL_HasClipboardText #-}
+
+-- | Query whether the clipboard exists and contains a non-empty text string.
+--
+--     [Returns]: true if the clipboard has text, or false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetClipboardText', 'sDL_SetClipboardText'
+--
+--     [C declaration]: @SDL_HasClipboardText@, defined at @SDL3\/SDL_clipboard.h 137:34@
+sDL_HasClipboardText :: BG.FunPtr (IO BG.CBool)
+sDL_HasClipboardText =
+  BG.unsafePerformIO hs_bindgen_0110b0e19d65293a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_SetPrimarySelectionText@
+foreign import ccall unsafe "hs_bindgen_2780901b25e68105"
+  hs_bindgen_2780901b25e68105_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_SetPrimarySelectionText@
+hs_bindgen_2780901b25e68105 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_2780901b25e68105 =
+  BG.fromFFIType hs_bindgen_2780901b25e68105_base
+
+{-# NOINLINE sDL_SetPrimarySelectionText #-}
+
+-- | Put UTF-8 text into the primary selection.
+--
+--     [@text@]: the text to store in the primary selection.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPrimarySelectionText', 'sDL_HasPrimarySelectionText'
+--
+--     [C declaration]: @SDL_SetPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 153:34@
+sDL_SetPrimarySelectionText :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SetPrimarySelectionText =
+  BG.unsafePerformIO hs_bindgen_2780901b25e68105
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetPrimarySelectionText@
+foreign import ccall unsafe "hs_bindgen_a50a077372a1275b"
+  hs_bindgen_a50a077372a1275b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetPrimarySelectionText@
+hs_bindgen_a50a077372a1275b :: IO (BG.FunPtr (IO (BG.Ptr BG.CChar)))
+hs_bindgen_a50a077372a1275b =
+  BG.fromFFIType hs_bindgen_a50a077372a1275b_base
+
+{-# NOINLINE sDL_GetPrimarySelectionText #-}
+
+-- | Get UTF-8 text from the primary selection.
+--
+--     This function returns an empty string if there is not enough memory left for a copy of the primary selection\'s content.
+--
+--     [Returns]: the primary selection text on success or an empty string on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasPrimarySelectionText', 'sDL_SetPrimarySelectionText'
+--
+--     [C declaration]: @SDL_GetPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 172:36@
+sDL_GetPrimarySelectionText :: BG.FunPtr (IO (BG.Ptr BG.CChar))
+sDL_GetPrimarySelectionText =
+  BG.unsafePerformIO hs_bindgen_a50a077372a1275b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_HasPrimarySelectionText@
+foreign import ccall unsafe "hs_bindgen_ed5cec4a17949538"
+  hs_bindgen_ed5cec4a17949538_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_HasPrimarySelectionText@
+hs_bindgen_ed5cec4a17949538 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_ed5cec4a17949538 =
+  BG.fromFFIType hs_bindgen_ed5cec4a17949538_base
+
+{-# NOINLINE sDL_HasPrimarySelectionText #-}
+
+-- | Query whether the primary selection exists and contains a non-empty text string.
+--
+--     [Returns]: true if the primary selection has text, or false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPrimarySelectionText', 'sDL_SetPrimarySelectionText'
+--
+--     [C declaration]: @SDL_HasPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 187:34@
+sDL_HasPrimarySelectionText :: BG.FunPtr (IO BG.CBool)
+sDL_HasPrimarySelectionText =
+  BG.unsafePerformIO hs_bindgen_ed5cec4a17949538
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_SetClipboardData@
+foreign import ccall unsafe "hs_bindgen_407833da207603f1"
+  hs_bindgen_407833da207603f1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_SetClipboardData@
+hs_bindgen_407833da207603f1
+  :: IO
+       ( BG.FunPtr
+           ( SDL_ClipboardDataCallback
+             -> SDL_ClipboardCleanupCallback
+             -> BG.Ptr BG.Void
+             -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_407833da207603f1 =
+  BG.fromFFIType hs_bindgen_407833da207603f1_base
+
+{-# NOINLINE sDL_SetClipboardData #-}
+
+-- | Offer clipboard data to the OS.
+--
+--     Tell the operating system that the application is offering clipboard data for each of the provided mime-types. Once another application requests the data the callback function will be called, allowing it to generate and respond with the data for the requested mime-type.
+--
+--     The size of text data does not include any terminator, and the text does not need to be null-terminated (e.g., you can directly copy a portion of a document).
+--
+--     [@callback@]: a function pointer to the function that provides the clipboard data.
+--
+--     [@cleanup@]: a function pointer to the function that cleans up the clipboard data.
+--
+--     [@userdata@]: an opaque pointer that will be forwarded to the callbacks.
+--
+--     [@mime_types@]: a list of mime-types that are being offered. SDL copies the given list.
+--
+--     [@num_mime_types@]: the number of mime-types in the mime_types list.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearClipboardData', 'sDL_GetClipboardData', 'sDL_HasClipboardData'
+--
+--     [C declaration]: @SDL_SetClipboardData@, defined at @SDL3\/SDL_clipboard.h 255:34@
+sDL_SetClipboardData
+  :: BG.FunPtr
+       ( SDL_ClipboardDataCallback
+         -> SDL_ClipboardCleanupCallback
+         -> BG.Ptr BG.Void
+         -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CBool
+       )
+sDL_SetClipboardData =
+  BG.unsafePerformIO hs_bindgen_407833da207603f1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_ClearClipboardData@
+foreign import ccall unsafe "hs_bindgen_6b6d9f04b710100d"
+  hs_bindgen_6b6d9f04b710100d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_ClearClipboardData@
+hs_bindgen_6b6d9f04b710100d :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_6b6d9f04b710100d =
+  BG.fromFFIType hs_bindgen_6b6d9f04b710100d_base
+
+{-# NOINLINE sDL_ClearClipboardData #-}
+
+-- | Clear the clipboard data.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_ClearClipboardData@, defined at @SDL3\/SDL_clipboard.h 269:34@
+sDL_ClearClipboardData :: BG.FunPtr (IO BG.CBool)
+sDL_ClearClipboardData =
+  BG.unsafePerformIO hs_bindgen_6b6d9f04b710100d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetClipboardData@
+foreign import ccall unsafe "hs_bindgen_4936992218b0c564"
+  hs_bindgen_4936992218b0c564_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetClipboardData@
+hs_bindgen_4936992218b0c564
+  :: IO
+       (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+hs_bindgen_4936992218b0c564 =
+  BG.fromFFIType hs_bindgen_4936992218b0c564_base
+
+{-# NOINLINE sDL_GetClipboardData #-}
+
+-- | Get the data from the clipboard for a given mime type.
+--
+--     The size of text data does not include the terminator, but the text is guaranteed to be null-terminated.
+--
+--     [@mime_type@]: the mime type to read from the clipboard.
+--
+--     [@size@]: a pointer filled in with the length of the returned data.
+--
+--     [Returns]: the retrieved data buffer or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasClipboardData', 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_GetClipboardData@, defined at @SDL3\/SDL_clipboard.h 290:36@
+sDL_GetClipboardData
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void))
+sDL_GetClipboardData =
+  BG.unsafePerformIO hs_bindgen_4936992218b0c564
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_HasClipboardData@
+foreign import ccall unsafe "hs_bindgen_a0c05f57097b9fe0"
+  hs_bindgen_a0c05f57097b9fe0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_HasClipboardData@
+hs_bindgen_a0c05f57097b9fe0 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_a0c05f57097b9fe0 =
+  BG.fromFFIType hs_bindgen_a0c05f57097b9fe0_base
+
+{-# NOINLINE sDL_HasClipboardData #-}
+
+-- | Query whether there is data in the clipboard for the provided mime type.
+--
+--     [@mime_type@]: the mime type to check for data.
+--
+--     [Returns]: true if data exists in the clipboard for the provided mime type, false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData', 'sDL_GetClipboardData'
+--
+--     [C declaration]: @SDL_HasClipboardData@, defined at @SDL3\/SDL_clipboard.h 306:34@
+sDL_HasClipboardData :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_HasClipboardData =
+  BG.unsafePerformIO hs_bindgen_a0c05f57097b9fe0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetClipboardMimeTypes@
+foreign import ccall unsafe "hs_bindgen_fa141967047535cc"
+  hs_bindgen_fa141967047535cc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_get_SDL_GetClipboardMimeTypes@
+hs_bindgen_fa141967047535cc
+  :: IO (BG.FunPtr (BG.Ptr HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr (BG.Ptr BG.CChar))))
+hs_bindgen_fa141967047535cc =
+  BG.fromFFIType hs_bindgen_fa141967047535cc_base
+
+{-# NOINLINE sDL_GetClipboardMimeTypes #-}
+
+-- | Retrieve the list of mime types available in the clipboard.
+--
+--     [@num_mime_types@]: a pointer filled with the number of mime types, may be NULL.
+--
+--     [Returns]: a null-terminated array of strings with mime types, or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_GetClipboardMimeTypes@, defined at @SDL3\/SDL_clipboard.h 323:37@
+sDL_GetClipboardMimeTypes
+  :: BG.FunPtr (BG.Ptr HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr (BG.Ptr BG.CChar)))
+sDL_GetClipboardMimeTypes =
+  BG.unsafePerformIO hs_bindgen_fa141967047535cc
diff --git a/src/SDL3/Sys/Bindgen/Clipboard/Safe.hs b/src/SDL3/Sys/Bindgen/Clipboard/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Clipboard/Safe.hs
@@ -0,0 +1,436 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Clipboard.Safe (
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_SetClipboardText,
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_GetClipboardText,
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_HasClipboardText,
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_SetPrimarySelectionText,
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_GetPrimarySelectionText,
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_HasPrimarySelectionText,
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_SetClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_ClearClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_GetClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_HasClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.Safe.sDL_GetClipboardMimeTypes,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Clipboard
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_clipboard.h>"
+         , "_Bool hs_bindgen_b1150c42ea076e8c ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SetClipboardText)(arg1);"
+         , "}"
+         , "char *hs_bindgen_280a176c02a40213 (void)"
+         , "{"
+         , "  return (SDL_GetClipboardText)();"
+         , "}"
+         , "_Bool hs_bindgen_0a5b78c7f4d4d82d (void)"
+         , "{"
+         , "  return (SDL_HasClipboardText)();"
+         , "}"
+         , "_Bool hs_bindgen_296e622e9e7c041e ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SetPrimarySelectionText)(arg1);"
+         , "}"
+         , "char *hs_bindgen_b29f4f6c44c760ae (void)"
+         , "{"
+         , "  return (SDL_GetPrimarySelectionText)();"
+         , "}"
+         , "_Bool hs_bindgen_72e968e77e5a4b30 (void)"
+         , "{"
+         , "  return (SDL_HasPrimarySelectionText)();"
+         , "}"
+         , "_Bool hs_bindgen_36bebff7824b1300 ("
+         , "  SDL_ClipboardDataCallback arg1,"
+         , "  SDL_ClipboardCleanupCallback arg2,"
+         , "  void *arg3,"
+         , "  char const **arg4,"
+         , "  size_t arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_SetClipboardData)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_acd3467dd81bcf1b (void)"
+         , "{"
+         , "  return (SDL_ClearClipboardData)();"
+         , "}"
+         , "void *hs_bindgen_d971d4d8159c9733 ("
+         , "  char const *arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetClipboardData)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7056b6a1011e4cda ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_HasClipboardData)(arg1);"
+         , "}"
+         , "char **hs_bindgen_333d0a0010885f59 ("
+         , "  size_t *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetClipboardMimeTypes)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_SetClipboardText@
+foreign import ccall safe "hs_bindgen_b1150c42ea076e8c"
+  hs_bindgen_b1150c42ea076e8c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_SetClipboardText@
+hs_bindgen_b1150c42ea076e8c
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_b1150c42ea076e8c =
+  BG.fromFFIType hs_bindgen_b1150c42ea076e8c_base
+
+-- | [C declaration]: @SDL_SetClipboardText@, defined at @SDL3\/SDL_clipboard.h 104:34@
+sDL_SetClipboardText
+  :: PtrConst.PtrConst BG.CChar
+  -- ^ [C declaration]: @text@
+  -> IO BG.CBool
+sDL_SetClipboardText = hs_bindgen_b1150c42ea076e8c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_GetClipboardText@
+foreign import ccall safe "hs_bindgen_280a176c02a40213"
+  hs_bindgen_280a176c02a40213_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_GetClipboardText@
+hs_bindgen_280a176c02a40213 :: IO (BG.Ptr BG.CChar)
+hs_bindgen_280a176c02a40213 =
+  BG.fromFFIType hs_bindgen_280a176c02a40213_base
+
+-- | Get UTF-8 text from the clipboard.
+--
+--     This function returns an empty string if there is not enough memory left for a copy of the clipboard\'s content.
+--
+--     [Returns]: the clipboard text on success or an empty string on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasClipboardText', 'sDL_SetClipboardText'
+--
+--     [C declaration]: @SDL_GetClipboardText@, defined at @SDL3\/SDL_clipboard.h 123:36@
+sDL_GetClipboardText :: IO (BG.Ptr BG.CChar)
+sDL_GetClipboardText = hs_bindgen_280a176c02a40213
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_HasClipboardText@
+foreign import ccall safe "hs_bindgen_0a5b78c7f4d4d82d"
+  hs_bindgen_0a5b78c7f4d4d82d_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_HasClipboardText@
+hs_bindgen_0a5b78c7f4d4d82d :: IO BG.CBool
+hs_bindgen_0a5b78c7f4d4d82d =
+  BG.fromFFIType hs_bindgen_0a5b78c7f4d4d82d_base
+
+-- | Query whether the clipboard exists and contains a non-empty text string.
+--
+--     [Returns]: true if the clipboard has text, or false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetClipboardText', 'sDL_SetClipboardText'
+--
+--     [C declaration]: @SDL_HasClipboardText@, defined at @SDL3\/SDL_clipboard.h 137:34@
+sDL_HasClipboardText :: IO BG.CBool
+sDL_HasClipboardText = hs_bindgen_0a5b78c7f4d4d82d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_SetPrimarySelectionText@
+foreign import ccall safe "hs_bindgen_296e622e9e7c041e"
+  hs_bindgen_296e622e9e7c041e_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_SetPrimarySelectionText@
+hs_bindgen_296e622e9e7c041e
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_296e622e9e7c041e =
+  BG.fromFFIType hs_bindgen_296e622e9e7c041e_base
+
+-- | Put UTF-8 text into the primary selection.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPrimarySelectionText', 'sDL_HasPrimarySelectionText'
+--
+--     [C declaration]: @SDL_SetPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 153:34@
+sDL_SetPrimarySelectionText
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: the text to store in the primary selection.
+  -> IO BG.CBool
+sDL_SetPrimarySelectionText =
+  hs_bindgen_296e622e9e7c041e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_GetPrimarySelectionText@
+foreign import ccall safe "hs_bindgen_b29f4f6c44c760ae"
+  hs_bindgen_b29f4f6c44c760ae_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_GetPrimarySelectionText@
+hs_bindgen_b29f4f6c44c760ae :: IO (BG.Ptr BG.CChar)
+hs_bindgen_b29f4f6c44c760ae =
+  BG.fromFFIType hs_bindgen_b29f4f6c44c760ae_base
+
+-- | Get UTF-8 text from the primary selection.
+--
+--     This function returns an empty string if there is not enough memory left for a copy of the primary selection\'s content.
+--
+--     [Returns]: the primary selection text on success or an empty string on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasPrimarySelectionText', 'sDL_SetPrimarySelectionText'
+--
+--     [C declaration]: @SDL_GetPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 172:36@
+sDL_GetPrimarySelectionText :: IO (BG.Ptr BG.CChar)
+sDL_GetPrimarySelectionText =
+  hs_bindgen_b29f4f6c44c760ae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_HasPrimarySelectionText@
+foreign import ccall safe "hs_bindgen_72e968e77e5a4b30"
+  hs_bindgen_72e968e77e5a4b30_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_HasPrimarySelectionText@
+hs_bindgen_72e968e77e5a4b30 :: IO BG.CBool
+hs_bindgen_72e968e77e5a4b30 =
+  BG.fromFFIType hs_bindgen_72e968e77e5a4b30_base
+
+-- | Query whether the primary selection exists and contains a non-empty text string.
+--
+--     [Returns]: true if the primary selection has text, or false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPrimarySelectionText', 'sDL_SetPrimarySelectionText'
+--
+--     [C declaration]: @SDL_HasPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 187:34@
+sDL_HasPrimarySelectionText :: IO BG.CBool
+sDL_HasPrimarySelectionText =
+  hs_bindgen_72e968e77e5a4b30
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_SetClipboardData@
+foreign import ccall safe "hs_bindgen_36bebff7824b1300"
+  hs_bindgen_36bebff7824b1300_base
+    :: BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_SetClipboardData@
+hs_bindgen_36bebff7824b1300
+  :: SDL_ClipboardDataCallback
+  -> SDL_ClipboardCleanupCallback
+  -> BG.Ptr BG.Void
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CBool
+hs_bindgen_36bebff7824b1300 =
+  BG.fromFFIType hs_bindgen_36bebff7824b1300_base
+
+-- | Offer clipboard data to the OS.
+--
+--     Tell the operating system that the application is offering clipboard data for each of the provided mime-types. Once another application requests the data the callback function will be called, allowing it to generate and respond with the data for the requested mime-type.
+--
+--     The size of text data does not include any terminator, and the text does not need to be null-terminated (e.g., you can directly copy a portion of a document).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearClipboardData', 'sDL_GetClipboardData', 'sDL_HasClipboardData'
+--
+--     [C declaration]: @SDL_SetClipboardData@, defined at @SDL3\/SDL_clipboard.h 255:34@
+sDL_SetClipboardData
+  :: SDL_ClipboardDataCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to the function that provides the clipboard data.
+  -> SDL_ClipboardCleanupCallback
+  -- ^
+  --
+  --           [@cleanup@]: a function pointer to the function that cleans up the clipboard data.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer that will be forwarded to the callbacks.
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@mime_types@]: a list of mime-types that are being offered. SDL copies the given list.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@num_mime_types@]: the number of mime-types in the mime_types list.
+  -> IO BG.CBool
+sDL_SetClipboardData = hs_bindgen_36bebff7824b1300
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_ClearClipboardData@
+foreign import ccall safe "hs_bindgen_acd3467dd81bcf1b"
+  hs_bindgen_acd3467dd81bcf1b_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_ClearClipboardData@
+hs_bindgen_acd3467dd81bcf1b :: IO BG.CBool
+hs_bindgen_acd3467dd81bcf1b =
+  BG.fromFFIType hs_bindgen_acd3467dd81bcf1b_base
+
+-- | Clear the clipboard data.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_ClearClipboardData@, defined at @SDL3\/SDL_clipboard.h 269:34@
+sDL_ClearClipboardData :: IO BG.CBool
+sDL_ClearClipboardData = hs_bindgen_acd3467dd81bcf1b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_GetClipboardData@
+foreign import ccall safe "hs_bindgen_d971d4d8159c9733"
+  hs_bindgen_d971d4d8159c9733_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_GetClipboardData@
+hs_bindgen_d971d4d8159c9733
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_d971d4d8159c9733 =
+  BG.fromFFIType hs_bindgen_d971d4d8159c9733_base
+
+-- | Get the data from the clipboard for a given mime type.
+--
+--     The size of text data does not include the terminator, but the text is guaranteed to be null-terminated.
+--
+--     [Returns]: the retrieved data buffer or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasClipboardData', 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_GetClipboardData@, defined at @SDL3\/SDL_clipboard.h 290:36@
+sDL_GetClipboardData
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mime_type@]: the mime type to read from the clipboard.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: a pointer filled in with the length of the returned data.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetClipboardData = hs_bindgen_d971d4d8159c9733
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_HasClipboardData@
+foreign import ccall safe "hs_bindgen_7056b6a1011e4cda"
+  hs_bindgen_7056b6a1011e4cda_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_HasClipboardData@
+hs_bindgen_7056b6a1011e4cda
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_7056b6a1011e4cda =
+  BG.fromFFIType hs_bindgen_7056b6a1011e4cda_base
+
+-- | Query whether there is data in the clipboard for the provided mime type.
+--
+--     [Returns]: true if data exists in the clipboard for the provided mime type, false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData', 'sDL_GetClipboardData'
+--
+--     [C declaration]: @SDL_HasClipboardData@, defined at @SDL3\/SDL_clipboard.h 306:34@
+sDL_HasClipboardData
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mime_type@]: the mime type to check for data.
+  -> IO BG.CBool
+sDL_HasClipboardData = hs_bindgen_7056b6a1011e4cda
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_GetClipboardMimeTypes@
+foreign import ccall safe "hs_bindgen_333d0a0010885f59"
+  hs_bindgen_333d0a0010885f59_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Safe_SDL_GetClipboardMimeTypes@
+hs_bindgen_333d0a0010885f59
+  :: BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+hs_bindgen_333d0a0010885f59 =
+  BG.fromFFIType hs_bindgen_333d0a0010885f59_base
+
+-- | Retrieve the list of mime types available in the clipboard.
+--
+--     [Returns]: a null-terminated array of strings with mime types, or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_GetClipboardMimeTypes@, defined at @SDL3\/SDL_clipboard.h 323:37@
+sDL_GetClipboardMimeTypes
+  :: BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@num_mime_types@]: a pointer filled with the number of mime types, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+sDL_GetClipboardMimeTypes =
+  hs_bindgen_333d0a0010885f59
diff --git a/src/SDL3/Sys/Bindgen/Clipboard/Unsafe.hs b/src/SDL3/Sys/Bindgen/Clipboard/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Clipboard/Unsafe.hs
@@ -0,0 +1,436 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Clipboard.Unsafe (
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_SetClipboardText,
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_GetClipboardText,
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_HasClipboardText,
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_SetPrimarySelectionText,
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_GetPrimarySelectionText,
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_HasPrimarySelectionText,
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_SetClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_ClearClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_GetClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_HasClipboardData,
+  SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_GetClipboardMimeTypes,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Clipboard
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_clipboard.h>"
+         , "_Bool hs_bindgen_9f2a95dedb650832 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SetClipboardText)(arg1);"
+         , "}"
+         , "char *hs_bindgen_421a57638d4c3dac (void)"
+         , "{"
+         , "  return (SDL_GetClipboardText)();"
+         , "}"
+         , "_Bool hs_bindgen_98d342e69ea4a567 (void)"
+         , "{"
+         , "  return (SDL_HasClipboardText)();"
+         , "}"
+         , "_Bool hs_bindgen_6488f17232c683bf ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SetPrimarySelectionText)(arg1);"
+         , "}"
+         , "char *hs_bindgen_5e7b06376b2e9bbd (void)"
+         , "{"
+         , "  return (SDL_GetPrimarySelectionText)();"
+         , "}"
+         , "_Bool hs_bindgen_219ce6e82c7fc2f7 (void)"
+         , "{"
+         , "  return (SDL_HasPrimarySelectionText)();"
+         , "}"
+         , "_Bool hs_bindgen_d48cb2fd87e5c697 ("
+         , "  SDL_ClipboardDataCallback arg1,"
+         , "  SDL_ClipboardCleanupCallback arg2,"
+         , "  void *arg3,"
+         , "  char const **arg4,"
+         , "  size_t arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_SetClipboardData)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_c332ca2219d94718 (void)"
+         , "{"
+         , "  return (SDL_ClearClipboardData)();"
+         , "}"
+         , "void *hs_bindgen_c38a6cca511b3536 ("
+         , "  char const *arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetClipboardData)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5aacfbaa2a2e29f4 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_HasClipboardData)(arg1);"
+         , "}"
+         , "char **hs_bindgen_936644e3f850ec42 ("
+         , "  size_t *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetClipboardMimeTypes)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_SetClipboardText@
+foreign import ccall unsafe "hs_bindgen_9f2a95dedb650832"
+  hs_bindgen_9f2a95dedb650832_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_SetClipboardText@
+hs_bindgen_9f2a95dedb650832
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_9f2a95dedb650832 =
+  BG.fromFFIType hs_bindgen_9f2a95dedb650832_base
+
+-- | [C declaration]: @SDL_SetClipboardText@, defined at @SDL3\/SDL_clipboard.h 104:34@
+sDL_SetClipboardText
+  :: PtrConst.PtrConst BG.CChar
+  -- ^ [C declaration]: @text@
+  -> IO BG.CBool
+sDL_SetClipboardText = hs_bindgen_9f2a95dedb650832
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_GetClipboardText@
+foreign import ccall unsafe "hs_bindgen_421a57638d4c3dac"
+  hs_bindgen_421a57638d4c3dac_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_GetClipboardText@
+hs_bindgen_421a57638d4c3dac :: IO (BG.Ptr BG.CChar)
+hs_bindgen_421a57638d4c3dac =
+  BG.fromFFIType hs_bindgen_421a57638d4c3dac_base
+
+-- | Get UTF-8 text from the clipboard.
+--
+--     This function returns an empty string if there is not enough memory left for a copy of the clipboard\'s content.
+--
+--     [Returns]: the clipboard text on success or an empty string on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasClipboardText', 'sDL_SetClipboardText'
+--
+--     [C declaration]: @SDL_GetClipboardText@, defined at @SDL3\/SDL_clipboard.h 123:36@
+sDL_GetClipboardText :: IO (BG.Ptr BG.CChar)
+sDL_GetClipboardText = hs_bindgen_421a57638d4c3dac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_HasClipboardText@
+foreign import ccall unsafe "hs_bindgen_98d342e69ea4a567"
+  hs_bindgen_98d342e69ea4a567_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_HasClipboardText@
+hs_bindgen_98d342e69ea4a567 :: IO BG.CBool
+hs_bindgen_98d342e69ea4a567 =
+  BG.fromFFIType hs_bindgen_98d342e69ea4a567_base
+
+-- | Query whether the clipboard exists and contains a non-empty text string.
+--
+--     [Returns]: true if the clipboard has text, or false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetClipboardText', 'sDL_SetClipboardText'
+--
+--     [C declaration]: @SDL_HasClipboardText@, defined at @SDL3\/SDL_clipboard.h 137:34@
+sDL_HasClipboardText :: IO BG.CBool
+sDL_HasClipboardText = hs_bindgen_98d342e69ea4a567
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_SetPrimarySelectionText@
+foreign import ccall unsafe "hs_bindgen_6488f17232c683bf"
+  hs_bindgen_6488f17232c683bf_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_SetPrimarySelectionText@
+hs_bindgen_6488f17232c683bf
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_6488f17232c683bf =
+  BG.fromFFIType hs_bindgen_6488f17232c683bf_base
+
+-- | Put UTF-8 text into the primary selection.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPrimarySelectionText', 'sDL_HasPrimarySelectionText'
+--
+--     [C declaration]: @SDL_SetPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 153:34@
+sDL_SetPrimarySelectionText
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: the text to store in the primary selection.
+  -> IO BG.CBool
+sDL_SetPrimarySelectionText =
+  hs_bindgen_6488f17232c683bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_GetPrimarySelectionText@
+foreign import ccall unsafe "hs_bindgen_5e7b06376b2e9bbd"
+  hs_bindgen_5e7b06376b2e9bbd_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_GetPrimarySelectionText@
+hs_bindgen_5e7b06376b2e9bbd :: IO (BG.Ptr BG.CChar)
+hs_bindgen_5e7b06376b2e9bbd =
+  BG.fromFFIType hs_bindgen_5e7b06376b2e9bbd_base
+
+-- | Get UTF-8 text from the primary selection.
+--
+--     This function returns an empty string if there is not enough memory left for a copy of the primary selection\'s content.
+--
+--     [Returns]: the primary selection text on success or an empty string on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasPrimarySelectionText', 'sDL_SetPrimarySelectionText'
+--
+--     [C declaration]: @SDL_GetPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 172:36@
+sDL_GetPrimarySelectionText :: IO (BG.Ptr BG.CChar)
+sDL_GetPrimarySelectionText =
+  hs_bindgen_5e7b06376b2e9bbd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_HasPrimarySelectionText@
+foreign import ccall unsafe "hs_bindgen_219ce6e82c7fc2f7"
+  hs_bindgen_219ce6e82c7fc2f7_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_HasPrimarySelectionText@
+hs_bindgen_219ce6e82c7fc2f7 :: IO BG.CBool
+hs_bindgen_219ce6e82c7fc2f7 =
+  BG.fromFFIType hs_bindgen_219ce6e82c7fc2f7_base
+
+-- | Query whether the primary selection exists and contains a non-empty text string.
+--
+--     [Returns]: true if the primary selection has text, or false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPrimarySelectionText', 'sDL_SetPrimarySelectionText'
+--
+--     [C declaration]: @SDL_HasPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 187:34@
+sDL_HasPrimarySelectionText :: IO BG.CBool
+sDL_HasPrimarySelectionText =
+  hs_bindgen_219ce6e82c7fc2f7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_SetClipboardData@
+foreign import ccall unsafe "hs_bindgen_d48cb2fd87e5c697"
+  hs_bindgen_d48cb2fd87e5c697_base
+    :: BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_SetClipboardData@
+hs_bindgen_d48cb2fd87e5c697
+  :: SDL_ClipboardDataCallback
+  -> SDL_ClipboardCleanupCallback
+  -> BG.Ptr BG.Void
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CBool
+hs_bindgen_d48cb2fd87e5c697 =
+  BG.fromFFIType hs_bindgen_d48cb2fd87e5c697_base
+
+-- | Offer clipboard data to the OS.
+--
+--     Tell the operating system that the application is offering clipboard data for each of the provided mime-types. Once another application requests the data the callback function will be called, allowing it to generate and respond with the data for the requested mime-type.
+--
+--     The size of text data does not include any terminator, and the text does not need to be null-terminated (e.g., you can directly copy a portion of a document).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearClipboardData', 'sDL_GetClipboardData', 'sDL_HasClipboardData'
+--
+--     [C declaration]: @SDL_SetClipboardData@, defined at @SDL3\/SDL_clipboard.h 255:34@
+sDL_SetClipboardData
+  :: SDL_ClipboardDataCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to the function that provides the clipboard data.
+  -> SDL_ClipboardCleanupCallback
+  -- ^
+  --
+  --           [@cleanup@]: a function pointer to the function that cleans up the clipboard data.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer that will be forwarded to the callbacks.
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@mime_types@]: a list of mime-types that are being offered. SDL copies the given list.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@num_mime_types@]: the number of mime-types in the mime_types list.
+  -> IO BG.CBool
+sDL_SetClipboardData = hs_bindgen_d48cb2fd87e5c697
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_ClearClipboardData@
+foreign import ccall unsafe "hs_bindgen_c332ca2219d94718"
+  hs_bindgen_c332ca2219d94718_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_ClearClipboardData@
+hs_bindgen_c332ca2219d94718 :: IO BG.CBool
+hs_bindgen_c332ca2219d94718 =
+  BG.fromFFIType hs_bindgen_c332ca2219d94718_base
+
+-- | Clear the clipboard data.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_ClearClipboardData@, defined at @SDL3\/SDL_clipboard.h 269:34@
+sDL_ClearClipboardData :: IO BG.CBool
+sDL_ClearClipboardData = hs_bindgen_c332ca2219d94718
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_GetClipboardData@
+foreign import ccall unsafe "hs_bindgen_c38a6cca511b3536"
+  hs_bindgen_c38a6cca511b3536_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_GetClipboardData@
+hs_bindgen_c38a6cca511b3536
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_c38a6cca511b3536 =
+  BG.fromFFIType hs_bindgen_c38a6cca511b3536_base
+
+-- | Get the data from the clipboard for a given mime type.
+--
+--     The size of text data does not include the terminator, but the text is guaranteed to be null-terminated.
+--
+--     [Returns]: the retrieved data buffer or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasClipboardData', 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_GetClipboardData@, defined at @SDL3\/SDL_clipboard.h 290:36@
+sDL_GetClipboardData
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mime_type@]: the mime type to read from the clipboard.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: a pointer filled in with the length of the returned data.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetClipboardData = hs_bindgen_c38a6cca511b3536
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_HasClipboardData@
+foreign import ccall unsafe "hs_bindgen_5aacfbaa2a2e29f4"
+  hs_bindgen_5aacfbaa2a2e29f4_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_HasClipboardData@
+hs_bindgen_5aacfbaa2a2e29f4
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_5aacfbaa2a2e29f4 =
+  BG.fromFFIType hs_bindgen_5aacfbaa2a2e29f4_base
+
+-- | Query whether there is data in the clipboard for the provided mime type.
+--
+--     [Returns]: true if data exists in the clipboard for the provided mime type, false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData', 'sDL_GetClipboardData'
+--
+--     [C declaration]: @SDL_HasClipboardData@, defined at @SDL3\/SDL_clipboard.h 306:34@
+sDL_HasClipboardData
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mime_type@]: the mime type to check for data.
+  -> IO BG.CBool
+sDL_HasClipboardData = hs_bindgen_5aacfbaa2a2e29f4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_GetClipboardMimeTypes@
+foreign import ccall unsafe "hs_bindgen_936644e3f850ec42"
+  hs_bindgen_936644e3f850ec42_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Clipboard_Unsafe_SDL_GetClipboardMimeTypes@
+hs_bindgen_936644e3f850ec42
+  :: BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+hs_bindgen_936644e3f850ec42 =
+  BG.fromFFIType hs_bindgen_936644e3f850ec42_base
+
+-- | Retrieve the list of mime types available in the clipboard.
+--
+--     [Returns]: a null-terminated array of strings with mime types, or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetClipboardData'
+--
+--     [C declaration]: @SDL_GetClipboardMimeTypes@, defined at @SDL3\/SDL_clipboard.h 323:37@
+sDL_GetClipboardMimeTypes
+  :: BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@num_mime_types@]: a pointer filled with the number of mime types, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+sDL_GetClipboardMimeTypes =
+  hs_bindgen_936644e3f850ec42
diff --git a/src/SDL3/Sys/Bindgen/Cpuinfo.hs b/src/SDL3/Sys/Bindgen/Cpuinfo.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Cpuinfo.hs
@@ -0,0 +1,22 @@
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | CPU feature detection for SDL.
+--
+--     These functions are largely concerned with reporting if the system has access to various SIMD instruction sets, but also has other important info to share, such as system RAM size and number of logical CPU cores.
+--
+--     CPU instruction set checks, like @SDL_HasSSE()@ and @SDL_HasNEON()@, are available on all platforms, even if they don\'t make sense (an ARM processor will never have SSE and an x86 processor will never have NEON, for example, but these functions still exist and will simply return false in these cases). A guess for the cacheline size used for padding.
+--
+--     Most x86 processors have a 64 byte cache line. The 64-bit PowerPC processors have a 128 byte cache line. We use the larger value to be generally safe.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Cpuinfo (
+  SDL3.Sys.Bindgen.Cpuinfo.sDL_CACHELINE_SIZE,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+
+-- | [C declaration]: @macro SDL_CACHELINE_SIZE@, defined at @SDL3\/SDL_cpuinfo.h 60:9@
+sDL_CACHELINE_SIZE :: BG.CInt
+sDL_CACHELINE_SIZE = (128 :: BG.CInt)
diff --git a/src/SDL3/Sys/Bindgen/Cpuinfo/FunPtr.hs b/src/SDL3/Sys/Bindgen/Cpuinfo/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Cpuinfo/FunPtr.hs
@@ -0,0 +1,690 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Cpuinfo.FunPtr (
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_GetNumLogicalCPUCores,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_GetCPUCacheLineSize,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasAltiVec,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasMMX,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasSSE,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasSSE2,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasSSE3,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasSSE41,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasSSE42,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasAVX,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasAVX2,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasAVX512F,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasARMSIMD,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasNEON,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasLSX,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_HasLASX,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_GetSystemRAM,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_GetSIMDAlignment,
+  SDL3.Sys.Bindgen.Cpuinfo.FunPtr.sDL_GetSystemPageSize,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_cpuinfo.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetNumLogicalCPUCores */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_c4c2c993acb58488 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetNumLogicalCPUCores;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetCPUCacheLineSize */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_2391090357def4cf (void)) (void)"
+         , "{"
+         , "  return &SDL_GetCPUCacheLineSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAltiVec */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9f39d5a7368376a4 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasAltiVec;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasMMX */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fa412e7652139df5 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasMMX;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_05d08b5690b4e001 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasSSE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE2 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ad213f4961990d26 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasSSE2;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE3 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a58ea737867abc40 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasSSE3;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE41 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_29ae5cbdbd616ec9 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasSSE41;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE42 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a3625752abd98954 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasSSE42;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAVX */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b930b79d23d9a864 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasAVX;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAVX2 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7d7f442924af51db (void)) (void)"
+         , "{"
+         , "  return &SDL_HasAVX2;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAVX512F */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_95bef25f1d596e41 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasAVX512F;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasARMSIMD */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_37e83b09e5180d73 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasARMSIMD;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasNEON */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f1637d681990a151 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasNEON;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasLSX */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_aeeccb148a52761c (void)) (void)"
+         , "{"
+         , "  return &SDL_HasLSX;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasLASX */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d5a4bc1d40b5d505 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasLASX;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetSystemRAM */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_393a56703dc32628 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetSystemRAM;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetSIMDAlignment */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_893e4a7de858042c (void)) (void)"
+         , "{"
+         , "  return &SDL_GetSIMDAlignment;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetSystemPageSize */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_0f2dc2f831cb5d73 (void)) (void)"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetSystemPageSize;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetSystemPageSize requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetNumLogicalCPUCores@
+foreign import ccall unsafe "hs_bindgen_c4c2c993acb58488"
+  hs_bindgen_c4c2c993acb58488_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetNumLogicalCPUCores@
+hs_bindgen_c4c2c993acb58488 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_c4c2c993acb58488 =
+  BG.fromFFIType hs_bindgen_c4c2c993acb58488_base
+
+{-# NOINLINE sDL_GetNumLogicalCPUCores #-}
+
+-- | Get the number of logical CPU cores available.
+--
+--     [Returns]: the total number of logical CPU cores. On CPUs that include technologies such as hyperthreading, the number of logical cores may be more than the number of physical cores.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetNumLogicalCPUCores@, defined at @SDL3\/SDL_cpuinfo.h 73:33@
+sDL_GetNumLogicalCPUCores :: BG.FunPtr (IO BG.CInt)
+sDL_GetNumLogicalCPUCores =
+  BG.unsafePerformIO hs_bindgen_c4c2c993acb58488
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetCPUCacheLineSize@
+foreign import ccall unsafe "hs_bindgen_2391090357def4cf"
+  hs_bindgen_2391090357def4cf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetCPUCacheLineSize@
+hs_bindgen_2391090357def4cf :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_2391090357def4cf =
+  BG.fromFFIType hs_bindgen_2391090357def4cf_base
+
+{-# NOINLINE sDL_GetCPUCacheLineSize #-}
+
+-- | Determine the L1 cache line size of the CPU.
+--
+--     This is useful for determining multi-threaded structure padding or SIMD prefetch sizes.
+--
+--     [Returns]: the L1 cache line size of the CPU, in bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCPUCacheLineSize@, defined at @SDL3\/SDL_cpuinfo.h 87:33@
+sDL_GetCPUCacheLineSize :: BG.FunPtr (IO BG.CInt)
+sDL_GetCPUCacheLineSize =
+  BG.unsafePerformIO hs_bindgen_2391090357def4cf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAltiVec@
+foreign import ccall unsafe "hs_bindgen_9f39d5a7368376a4"
+  hs_bindgen_9f39d5a7368376a4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAltiVec@
+hs_bindgen_9f39d5a7368376a4 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_9f39d5a7368376a4 =
+  BG.fromFFIType hs_bindgen_9f39d5a7368376a4_base
+
+{-# NOINLINE sDL_HasAltiVec #-}
+
+-- | Determine whether the CPU has AltiVec features.
+--
+--     This always returns false on CPUs that aren\'t using PowerPC instruction sets.
+--
+--     [Returns]: true if the CPU has AltiVec features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasAltiVec@, defined at @SDL3\/SDL_cpuinfo.h 101:34@
+sDL_HasAltiVec :: BG.FunPtr (IO BG.CBool)
+sDL_HasAltiVec =
+  BG.unsafePerformIO hs_bindgen_9f39d5a7368376a4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasMMX@
+foreign import ccall unsafe "hs_bindgen_fa412e7652139df5"
+  hs_bindgen_fa412e7652139df5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasMMX@
+hs_bindgen_fa412e7652139df5 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_fa412e7652139df5 =
+  BG.fromFFIType hs_bindgen_fa412e7652139df5_base
+
+{-# NOINLINE sDL_HasMMX #-}
+
+-- | Determine whether the CPU has MMX features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has MMX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasMMX@, defined at @SDL3\/SDL_cpuinfo.h 114:34@
+sDL_HasMMX :: BG.FunPtr (IO BG.CBool)
+sDL_HasMMX =
+  BG.unsafePerformIO hs_bindgen_fa412e7652139df5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE@
+foreign import ccall unsafe "hs_bindgen_05d08b5690b4e001"
+  hs_bindgen_05d08b5690b4e001_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE@
+hs_bindgen_05d08b5690b4e001 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_05d08b5690b4e001 =
+  BG.fromFFIType hs_bindgen_05d08b5690b4e001_base
+
+{-# NOINLINE sDL_HasSSE #-}
+
+-- | Determine whether the CPU has SSE features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE2', 'sDL_HasSSE3', 'sDL_HasSSE41', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE@, defined at @SDL3\/SDL_cpuinfo.h 132:34@
+sDL_HasSSE :: BG.FunPtr (IO BG.CBool)
+sDL_HasSSE =
+  BG.unsafePerformIO hs_bindgen_05d08b5690b4e001
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE2@
+foreign import ccall unsafe "hs_bindgen_ad213f4961990d26"
+  hs_bindgen_ad213f4961990d26_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE2@
+hs_bindgen_ad213f4961990d26 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_ad213f4961990d26 =
+  BG.fromFFIType hs_bindgen_ad213f4961990d26_base
+
+{-# NOINLINE sDL_HasSSE2 #-}
+
+-- | Determine whether the CPU has SSE2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE3', 'sDL_HasSSE41', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE2@, defined at @SDL3\/SDL_cpuinfo.h 150:34@
+sDL_HasSSE2 :: BG.FunPtr (IO BG.CBool)
+sDL_HasSSE2 =
+  BG.unsafePerformIO hs_bindgen_ad213f4961990d26
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE3@
+foreign import ccall unsafe "hs_bindgen_a58ea737867abc40"
+  hs_bindgen_a58ea737867abc40_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE3@
+hs_bindgen_a58ea737867abc40 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_a58ea737867abc40 =
+  BG.fromFFIType hs_bindgen_a58ea737867abc40_base
+
+{-# NOINLINE sDL_HasSSE3 #-}
+
+-- | Determine whether the CPU has SSE3 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE3 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE2', 'sDL_HasSSE41', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE3@, defined at @SDL3\/SDL_cpuinfo.h 168:34@
+sDL_HasSSE3 :: BG.FunPtr (IO BG.CBool)
+sDL_HasSSE3 =
+  BG.unsafePerformIO hs_bindgen_a58ea737867abc40
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE41@
+foreign import ccall unsafe "hs_bindgen_29ae5cbdbd616ec9"
+  hs_bindgen_29ae5cbdbd616ec9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE41@
+hs_bindgen_29ae5cbdbd616ec9 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_29ae5cbdbd616ec9 =
+  BG.fromFFIType hs_bindgen_29ae5cbdbd616ec9_base
+
+{-# NOINLINE sDL_HasSSE41 #-}
+
+-- | Determine whether the CPU has SSE4.1 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE4.1 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE2', 'sDL_HasSSE3', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE41@, defined at @SDL3\/SDL_cpuinfo.h 186:34@
+sDL_HasSSE41 :: BG.FunPtr (IO BG.CBool)
+sDL_HasSSE41 =
+  BG.unsafePerformIO hs_bindgen_29ae5cbdbd616ec9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE42@
+foreign import ccall unsafe "hs_bindgen_a3625752abd98954"
+  hs_bindgen_a3625752abd98954_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasSSE42@
+hs_bindgen_a3625752abd98954 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_a3625752abd98954 =
+  BG.fromFFIType hs_bindgen_a3625752abd98954_base
+
+{-# NOINLINE sDL_HasSSE42 #-}
+
+-- | Determine whether the CPU has SSE4.2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE4.2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE2', 'sDL_HasSSE3', 'sDL_HasSSE41'
+--
+--     [C declaration]: @SDL_HasSSE42@, defined at @SDL3\/SDL_cpuinfo.h 204:34@
+sDL_HasSSE42 :: BG.FunPtr (IO BG.CBool)
+sDL_HasSSE42 =
+  BG.unsafePerformIO hs_bindgen_a3625752abd98954
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAVX@
+foreign import ccall unsafe "hs_bindgen_b930b79d23d9a864"
+  hs_bindgen_b930b79d23d9a864_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAVX@
+hs_bindgen_b930b79d23d9a864 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_b930b79d23d9a864 =
+  BG.fromFFIType hs_bindgen_b930b79d23d9a864_base
+
+{-# NOINLINE sDL_HasAVX #-}
+
+-- | Determine whether the CPU has AVX features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasAVX2', 'sDL_HasAVX512F'
+--
+--     [C declaration]: @SDL_HasAVX@, defined at @SDL3\/SDL_cpuinfo.h 220:34@
+sDL_HasAVX :: BG.FunPtr (IO BG.CBool)
+sDL_HasAVX =
+  BG.unsafePerformIO hs_bindgen_b930b79d23d9a864
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAVX2@
+foreign import ccall unsafe "hs_bindgen_7d7f442924af51db"
+  hs_bindgen_7d7f442924af51db_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAVX2@
+hs_bindgen_7d7f442924af51db :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_7d7f442924af51db =
+  BG.fromFFIType hs_bindgen_7d7f442924af51db_base
+
+{-# NOINLINE sDL_HasAVX2 #-}
+
+-- | Determine whether the CPU has AVX2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasAVX', 'sDL_HasAVX512F'
+--
+--     [C declaration]: @SDL_HasAVX2@, defined at @SDL3\/SDL_cpuinfo.h 236:34@
+sDL_HasAVX2 :: BG.FunPtr (IO BG.CBool)
+sDL_HasAVX2 =
+  BG.unsafePerformIO hs_bindgen_7d7f442924af51db
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAVX512F@
+foreign import ccall unsafe "hs_bindgen_95bef25f1d596e41"
+  hs_bindgen_95bef25f1d596e41_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasAVX512F@
+hs_bindgen_95bef25f1d596e41 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_95bef25f1d596e41 =
+  BG.fromFFIType hs_bindgen_95bef25f1d596e41_base
+
+{-# NOINLINE sDL_HasAVX512F #-}
+
+-- | Determine whether the CPU has AVX-512F (foundation) features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX-512F features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasAVX', 'sDL_HasAVX2'
+--
+--     [C declaration]: @SDL_HasAVX512F@, defined at @SDL3\/SDL_cpuinfo.h 252:34@
+sDL_HasAVX512F :: BG.FunPtr (IO BG.CBool)
+sDL_HasAVX512F =
+  BG.unsafePerformIO hs_bindgen_95bef25f1d596e41
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasARMSIMD@
+foreign import ccall unsafe "hs_bindgen_37e83b09e5180d73"
+  hs_bindgen_37e83b09e5180d73_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasARMSIMD@
+hs_bindgen_37e83b09e5180d73 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_37e83b09e5180d73 =
+  BG.fromFFIType hs_bindgen_37e83b09e5180d73_base
+
+{-# NOINLINE sDL_HasARMSIMD #-}
+
+-- | Determine whether the CPU has ARM SIMD (ARMv6) features.
+--
+--     This is different from ARM NEON, which is a different instruction set.
+--
+--     This always returns false on CPUs that aren\'t using ARM instruction sets.
+--
+--     [Returns]: true if the CPU has ARM SIMD features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasNEON'
+--
+--     [C declaration]: @SDL_HasARMSIMD@, defined at @SDL3\/SDL_cpuinfo.h 269:34@
+sDL_HasARMSIMD :: BG.FunPtr (IO BG.CBool)
+sDL_HasARMSIMD =
+  BG.unsafePerformIO hs_bindgen_37e83b09e5180d73
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasNEON@
+foreign import ccall unsafe "hs_bindgen_f1637d681990a151"
+  hs_bindgen_f1637d681990a151_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasNEON@
+hs_bindgen_f1637d681990a151 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_f1637d681990a151 =
+  BG.fromFFIType hs_bindgen_f1637d681990a151_base
+
+{-# NOINLINE sDL_HasNEON #-}
+
+-- | Determine whether the CPU has NEON (ARM SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using ARM instruction sets.
+--
+--     [Returns]: true if the CPU has ARM NEON features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasNEON@, defined at @SDL3\/SDL_cpuinfo.h 282:34@
+sDL_HasNEON :: BG.FunPtr (IO BG.CBool)
+sDL_HasNEON =
+  BG.unsafePerformIO hs_bindgen_f1637d681990a151
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasLSX@
+foreign import ccall unsafe "hs_bindgen_aeeccb148a52761c"
+  hs_bindgen_aeeccb148a52761c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasLSX@
+hs_bindgen_aeeccb148a52761c :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_aeeccb148a52761c =
+  BG.fromFFIType hs_bindgen_aeeccb148a52761c_base
+
+{-# NOINLINE sDL_HasLSX #-}
+
+-- | Determine whether the CPU has LSX (LOONGARCH SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using LOONGARCH instruction sets.
+--
+--     [Returns]: true if the CPU has LOONGARCH LSX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasLSX@, defined at @SDL3\/SDL_cpuinfo.h 296:34@
+sDL_HasLSX :: BG.FunPtr (IO BG.CBool)
+sDL_HasLSX =
+  BG.unsafePerformIO hs_bindgen_aeeccb148a52761c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasLASX@
+foreign import ccall unsafe "hs_bindgen_d5a4bc1d40b5d505"
+  hs_bindgen_d5a4bc1d40b5d505_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_HasLASX@
+hs_bindgen_d5a4bc1d40b5d505 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_d5a4bc1d40b5d505 =
+  BG.fromFFIType hs_bindgen_d5a4bc1d40b5d505_base
+
+{-# NOINLINE sDL_HasLASX #-}
+
+-- | Determine whether the CPU has LASX (LOONGARCH SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using LOONGARCH instruction sets.
+--
+--     [Returns]: true if the CPU has LOONGARCH LASX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasLASX@, defined at @SDL3\/SDL_cpuinfo.h 310:34@
+sDL_HasLASX :: BG.FunPtr (IO BG.CBool)
+sDL_HasLASX =
+  BG.unsafePerformIO hs_bindgen_d5a4bc1d40b5d505
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetSystemRAM@
+foreign import ccall unsafe "hs_bindgen_393a56703dc32628"
+  hs_bindgen_393a56703dc32628_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetSystemRAM@
+hs_bindgen_393a56703dc32628 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_393a56703dc32628 =
+  BG.fromFFIType hs_bindgen_393a56703dc32628_base
+
+{-# NOINLINE sDL_GetSystemRAM #-}
+
+-- | Get the amount of RAM configured in the system.
+--
+--     [Returns]: the amount of RAM configured in the system in MiB.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSystemRAM@, defined at @SDL3\/SDL_cpuinfo.h 321:33@
+sDL_GetSystemRAM :: BG.FunPtr (IO BG.CInt)
+sDL_GetSystemRAM =
+  BG.unsafePerformIO hs_bindgen_393a56703dc32628
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetSIMDAlignment@
+foreign import ccall unsafe "hs_bindgen_893e4a7de858042c"
+  hs_bindgen_893e4a7de858042c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetSIMDAlignment@
+hs_bindgen_893e4a7de858042c :: IO (BG.FunPtr (IO HsBindgen.Runtime.LibC.CSize))
+hs_bindgen_893e4a7de858042c =
+  BG.fromFFIType hs_bindgen_893e4a7de858042c_base
+
+{-# NOINLINE sDL_GetSIMDAlignment #-}
+
+-- | Report the alignment this system needs for SIMD allocations.
+--
+--     This will return the minimum number of bytes to which a pointer must be aligned to be compatible with SIMD instructions on the current machine. For example, if the machine supports SSE only, it will return 16, but if it supports AVX-512F, it\'ll return 64 (etc). This only reports values for instruction sets SDL knows about, so if your SDL build doesn\'t have @SDL_HasAVX512F()@, then it might return 16 for the SSE support it sees and not 64 for the AVX-512 instructions that exist but SDL doesn\'t know about. Plan accordingly.
+--
+--     [Returns]: the alignment in bytes needed for available, known SIMD instructions.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_aligned_alloc, SDL_aligned_free
+--
+--     [C declaration]: @SDL_GetSIMDAlignment@, defined at @SDL3\/SDL_cpuinfo.h 345:36@
+sDL_GetSIMDAlignment :: BG.FunPtr (IO HsBindgen.Runtime.LibC.CSize)
+sDL_GetSIMDAlignment =
+  BG.unsafePerformIO hs_bindgen_893e4a7de858042c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetSystemPageSize@
+foreign import ccall unsafe "hs_bindgen_0f2dc2f831cb5d73"
+  hs_bindgen_0f2dc2f831cb5d73_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_get_SDL_GetSystemPageSize@
+hs_bindgen_0f2dc2f831cb5d73 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_0f2dc2f831cb5d73 =
+  BG.fromFFIType hs_bindgen_0f2dc2f831cb5d73_base
+
+{-# NOINLINE sDL_GetSystemPageSize #-}
+
+-- | Report the size of a page of memory.
+--
+--     Different platforms might have different memory page sizes. In current times, 4 kilobytes is not unusual, but newer systems are moving to larger page sizes, and esoteric platforms might have any unexpected size.
+--
+--     Note that this function can return 0, which means SDL can\'t determine the page size on this platform. It will /not/ set an error string to be retrieved with SDL_GetError() in this case! In this case, defaulting to 4096 is often a reasonable option.
+--
+--     [Returns]: the size of a single page of memory, in bytes, or 0 if SDL can\'t determine this information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetSystemPageSize@, defined at @SDL3\/SDL_cpuinfo.h 366:33@
+sDL_GetSystemPageSize :: BG.FunPtr (IO BG.CInt)
+sDL_GetSystemPageSize =
+  BG.unsafePerformIO hs_bindgen_0f2dc2f831cb5d73
diff --git a/src/SDL3/Sys/Bindgen/Cpuinfo/Safe.hs b/src/SDL3/Sys/Bindgen/Cpuinfo/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Cpuinfo/Safe.hs
@@ -0,0 +1,596 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Cpuinfo.Safe (
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_GetNumLogicalCPUCores,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_GetCPUCacheLineSize,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasAltiVec,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasMMX,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasSSE,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasSSE2,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasSSE3,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasSSE41,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasSSE42,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasAVX,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasAVX2,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasAVX512F,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasARMSIMD,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasNEON,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasLSX,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_HasLASX,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_GetSystemRAM,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_GetSIMDAlignment,
+  SDL3.Sys.Bindgen.Cpuinfo.Safe.sDL_GetSystemPageSize,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_cpuinfo.h>"
+         , "signed int hs_bindgen_021d38423efa2894 (void)"
+         , "{"
+         , "  return (SDL_GetNumLogicalCPUCores)();"
+         , "}"
+         , "signed int hs_bindgen_0ca909a81c077ab1 (void)"
+         , "{"
+         , "  return (SDL_GetCPUCacheLineSize)();"
+         , "}"
+         , "_Bool hs_bindgen_12f0f738ad7e36de (void)"
+         , "{"
+         , "  return (SDL_HasAltiVec)();"
+         , "}"
+         , "_Bool hs_bindgen_7b773ae3e33864af (void)"
+         , "{"
+         , "  return (SDL_HasMMX)();"
+         , "}"
+         , "_Bool hs_bindgen_9fc6d41bd7e06a8c (void)"
+         , "{"
+         , "  return (SDL_HasSSE)();"
+         , "}"
+         , "_Bool hs_bindgen_87bc5fc8be1bca92 (void)"
+         , "{"
+         , "  return (SDL_HasSSE2)();"
+         , "}"
+         , "_Bool hs_bindgen_8c78b2fb7d6ba035 (void)"
+         , "{"
+         , "  return (SDL_HasSSE3)();"
+         , "}"
+         , "_Bool hs_bindgen_ad68eac9c65daa8b (void)"
+         , "{"
+         , "  return (SDL_HasSSE41)();"
+         , "}"
+         , "_Bool hs_bindgen_45773d656848547a (void)"
+         , "{"
+         , "  return (SDL_HasSSE42)();"
+         , "}"
+         , "_Bool hs_bindgen_09d9c1ee75214203 (void)"
+         , "{"
+         , "  return (SDL_HasAVX)();"
+         , "}"
+         , "_Bool hs_bindgen_dccd2628b251a266 (void)"
+         , "{"
+         , "  return (SDL_HasAVX2)();"
+         , "}"
+         , "_Bool hs_bindgen_963390989096b612 (void)"
+         , "{"
+         , "  return (SDL_HasAVX512F)();"
+         , "}"
+         , "_Bool hs_bindgen_7f5bde151d49ba8f (void)"
+         , "{"
+         , "  return (SDL_HasARMSIMD)();"
+         , "}"
+         , "_Bool hs_bindgen_4bb569121e6831a2 (void)"
+         , "{"
+         , "  return (SDL_HasNEON)();"
+         , "}"
+         , "_Bool hs_bindgen_56a380fc3630f88f (void)"
+         , "{"
+         , "  return (SDL_HasLSX)();"
+         , "}"
+         , "_Bool hs_bindgen_18257ff80297cf49 (void)"
+         , "{"
+         , "  return (SDL_HasLASX)();"
+         , "}"
+         , "signed int hs_bindgen_cd53f670bd0bc729 (void)"
+         , "{"
+         , "  return (SDL_GetSystemRAM)();"
+         , "}"
+         , "size_t hs_bindgen_db11c36832e4fbf2 (void)"
+         , "{"
+         , "  return (SDL_GetSIMDAlignment)();"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "signed int hs_bindgen_a5c1dbf29e777b88 (void)"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetSystemPageSize)();"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetSystemPageSize requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_GetNumLogicalCPUCores@
+foreign import ccall safe "hs_bindgen_021d38423efa2894"
+  hs_bindgen_021d38423efa2894_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_GetNumLogicalCPUCores@
+hs_bindgen_021d38423efa2894 :: IO BG.CInt
+hs_bindgen_021d38423efa2894 =
+  BG.fromFFIType hs_bindgen_021d38423efa2894_base
+
+-- | Get the number of logical CPU cores available.
+--
+--     [Returns]: the total number of logical CPU cores. On CPUs that include technologies such as hyperthreading, the number of logical cores may be more than the number of physical cores.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetNumLogicalCPUCores@, defined at @SDL3\/SDL_cpuinfo.h 73:33@
+sDL_GetNumLogicalCPUCores :: IO BG.CInt
+sDL_GetNumLogicalCPUCores =
+  hs_bindgen_021d38423efa2894
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_GetCPUCacheLineSize@
+foreign import ccall safe "hs_bindgen_0ca909a81c077ab1"
+  hs_bindgen_0ca909a81c077ab1_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_GetCPUCacheLineSize@
+hs_bindgen_0ca909a81c077ab1 :: IO BG.CInt
+hs_bindgen_0ca909a81c077ab1 =
+  BG.fromFFIType hs_bindgen_0ca909a81c077ab1_base
+
+-- | Determine the L1 cache line size of the CPU.
+--
+--     This is useful for determining multi-threaded structure padding or SIMD prefetch sizes.
+--
+--     [Returns]: the L1 cache line size of the CPU, in bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCPUCacheLineSize@, defined at @SDL3\/SDL_cpuinfo.h 87:33@
+sDL_GetCPUCacheLineSize :: IO BG.CInt
+sDL_GetCPUCacheLineSize = hs_bindgen_0ca909a81c077ab1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasAltiVec@
+foreign import ccall safe "hs_bindgen_12f0f738ad7e36de"
+  hs_bindgen_12f0f738ad7e36de_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasAltiVec@
+hs_bindgen_12f0f738ad7e36de :: IO BG.CBool
+hs_bindgen_12f0f738ad7e36de =
+  BG.fromFFIType hs_bindgen_12f0f738ad7e36de_base
+
+-- | Determine whether the CPU has AltiVec features.
+--
+--     This always returns false on CPUs that aren\'t using PowerPC instruction sets.
+--
+--     [Returns]: true if the CPU has AltiVec features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasAltiVec@, defined at @SDL3\/SDL_cpuinfo.h 101:34@
+sDL_HasAltiVec :: IO BG.CBool
+sDL_HasAltiVec = hs_bindgen_12f0f738ad7e36de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasMMX@
+foreign import ccall safe "hs_bindgen_7b773ae3e33864af"
+  hs_bindgen_7b773ae3e33864af_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasMMX@
+hs_bindgen_7b773ae3e33864af :: IO BG.CBool
+hs_bindgen_7b773ae3e33864af =
+  BG.fromFFIType hs_bindgen_7b773ae3e33864af_base
+
+-- | Determine whether the CPU has MMX features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has MMX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasMMX@, defined at @SDL3\/SDL_cpuinfo.h 114:34@
+sDL_HasMMX :: IO BG.CBool
+sDL_HasMMX = hs_bindgen_7b773ae3e33864af
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasSSE@
+foreign import ccall safe "hs_bindgen_9fc6d41bd7e06a8c"
+  hs_bindgen_9fc6d41bd7e06a8c_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasSSE@
+hs_bindgen_9fc6d41bd7e06a8c :: IO BG.CBool
+hs_bindgen_9fc6d41bd7e06a8c =
+  BG.fromFFIType hs_bindgen_9fc6d41bd7e06a8c_base
+
+-- | Determine whether the CPU has SSE features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE2', 'sDL_HasSSE3', 'sDL_HasSSE41', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE@, defined at @SDL3\/SDL_cpuinfo.h 132:34@
+sDL_HasSSE :: IO BG.CBool
+sDL_HasSSE = hs_bindgen_9fc6d41bd7e06a8c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasSSE2@
+foreign import ccall safe "hs_bindgen_87bc5fc8be1bca92"
+  hs_bindgen_87bc5fc8be1bca92_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasSSE2@
+hs_bindgen_87bc5fc8be1bca92 :: IO BG.CBool
+hs_bindgen_87bc5fc8be1bca92 =
+  BG.fromFFIType hs_bindgen_87bc5fc8be1bca92_base
+
+-- | Determine whether the CPU has SSE2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE3', 'sDL_HasSSE41', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE2@, defined at @SDL3\/SDL_cpuinfo.h 150:34@
+sDL_HasSSE2 :: IO BG.CBool
+sDL_HasSSE2 = hs_bindgen_87bc5fc8be1bca92
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasSSE3@
+foreign import ccall safe "hs_bindgen_8c78b2fb7d6ba035"
+  hs_bindgen_8c78b2fb7d6ba035_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasSSE3@
+hs_bindgen_8c78b2fb7d6ba035 :: IO BG.CBool
+hs_bindgen_8c78b2fb7d6ba035 =
+  BG.fromFFIType hs_bindgen_8c78b2fb7d6ba035_base
+
+-- | Determine whether the CPU has SSE3 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE3 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE2', 'sDL_HasSSE41', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE3@, defined at @SDL3\/SDL_cpuinfo.h 168:34@
+sDL_HasSSE3 :: IO BG.CBool
+sDL_HasSSE3 = hs_bindgen_8c78b2fb7d6ba035
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasSSE41@
+foreign import ccall safe "hs_bindgen_ad68eac9c65daa8b"
+  hs_bindgen_ad68eac9c65daa8b_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasSSE41@
+hs_bindgen_ad68eac9c65daa8b :: IO BG.CBool
+hs_bindgen_ad68eac9c65daa8b =
+  BG.fromFFIType hs_bindgen_ad68eac9c65daa8b_base
+
+-- | Determine whether the CPU has SSE4.1 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE4.1 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE2', 'sDL_HasSSE3', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE41@, defined at @SDL3\/SDL_cpuinfo.h 186:34@
+sDL_HasSSE41 :: IO BG.CBool
+sDL_HasSSE41 = hs_bindgen_ad68eac9c65daa8b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasSSE42@
+foreign import ccall safe "hs_bindgen_45773d656848547a"
+  hs_bindgen_45773d656848547a_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasSSE42@
+hs_bindgen_45773d656848547a :: IO BG.CBool
+hs_bindgen_45773d656848547a =
+  BG.fromFFIType hs_bindgen_45773d656848547a_base
+
+-- | Determine whether the CPU has SSE4.2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE4.2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE2', 'sDL_HasSSE3', 'sDL_HasSSE41'
+--
+--     [C declaration]: @SDL_HasSSE42@, defined at @SDL3\/SDL_cpuinfo.h 204:34@
+sDL_HasSSE42 :: IO BG.CBool
+sDL_HasSSE42 = hs_bindgen_45773d656848547a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasAVX@
+foreign import ccall safe "hs_bindgen_09d9c1ee75214203"
+  hs_bindgen_09d9c1ee75214203_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasAVX@
+hs_bindgen_09d9c1ee75214203 :: IO BG.CBool
+hs_bindgen_09d9c1ee75214203 =
+  BG.fromFFIType hs_bindgen_09d9c1ee75214203_base
+
+-- | Determine whether the CPU has AVX features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasAVX2', 'sDL_HasAVX512F'
+--
+--     [C declaration]: @SDL_HasAVX@, defined at @SDL3\/SDL_cpuinfo.h 220:34@
+sDL_HasAVX :: IO BG.CBool
+sDL_HasAVX = hs_bindgen_09d9c1ee75214203
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasAVX2@
+foreign import ccall safe "hs_bindgen_dccd2628b251a266"
+  hs_bindgen_dccd2628b251a266_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasAVX2@
+hs_bindgen_dccd2628b251a266 :: IO BG.CBool
+hs_bindgen_dccd2628b251a266 =
+  BG.fromFFIType hs_bindgen_dccd2628b251a266_base
+
+-- | Determine whether the CPU has AVX2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasAVX', 'sDL_HasAVX512F'
+--
+--     [C declaration]: @SDL_HasAVX2@, defined at @SDL3\/SDL_cpuinfo.h 236:34@
+sDL_HasAVX2 :: IO BG.CBool
+sDL_HasAVX2 = hs_bindgen_dccd2628b251a266
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasAVX512F@
+foreign import ccall safe "hs_bindgen_963390989096b612"
+  hs_bindgen_963390989096b612_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasAVX512F@
+hs_bindgen_963390989096b612 :: IO BG.CBool
+hs_bindgen_963390989096b612 =
+  BG.fromFFIType hs_bindgen_963390989096b612_base
+
+-- | Determine whether the CPU has AVX-512F (foundation) features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX-512F features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasAVX', 'sDL_HasAVX2'
+--
+--     [C declaration]: @SDL_HasAVX512F@, defined at @SDL3\/SDL_cpuinfo.h 252:34@
+sDL_HasAVX512F :: IO BG.CBool
+sDL_HasAVX512F = hs_bindgen_963390989096b612
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasARMSIMD@
+foreign import ccall safe "hs_bindgen_7f5bde151d49ba8f"
+  hs_bindgen_7f5bde151d49ba8f_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasARMSIMD@
+hs_bindgen_7f5bde151d49ba8f :: IO BG.CBool
+hs_bindgen_7f5bde151d49ba8f =
+  BG.fromFFIType hs_bindgen_7f5bde151d49ba8f_base
+
+-- | Determine whether the CPU has ARM SIMD (ARMv6) features.
+--
+--     This is different from ARM NEON, which is a different instruction set.
+--
+--     This always returns false on CPUs that aren\'t using ARM instruction sets.
+--
+--     [Returns]: true if the CPU has ARM SIMD features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasNEON'
+--
+--     [C declaration]: @SDL_HasARMSIMD@, defined at @SDL3\/SDL_cpuinfo.h 269:34@
+sDL_HasARMSIMD :: IO BG.CBool
+sDL_HasARMSIMD = hs_bindgen_7f5bde151d49ba8f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasNEON@
+foreign import ccall safe "hs_bindgen_4bb569121e6831a2"
+  hs_bindgen_4bb569121e6831a2_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasNEON@
+hs_bindgen_4bb569121e6831a2 :: IO BG.CBool
+hs_bindgen_4bb569121e6831a2 =
+  BG.fromFFIType hs_bindgen_4bb569121e6831a2_base
+
+-- | Determine whether the CPU has NEON (ARM SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using ARM instruction sets.
+--
+--     [Returns]: true if the CPU has ARM NEON features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasNEON@, defined at @SDL3\/SDL_cpuinfo.h 282:34@
+sDL_HasNEON :: IO BG.CBool
+sDL_HasNEON = hs_bindgen_4bb569121e6831a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasLSX@
+foreign import ccall safe "hs_bindgen_56a380fc3630f88f"
+  hs_bindgen_56a380fc3630f88f_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasLSX@
+hs_bindgen_56a380fc3630f88f :: IO BG.CBool
+hs_bindgen_56a380fc3630f88f =
+  BG.fromFFIType hs_bindgen_56a380fc3630f88f_base
+
+-- | Determine whether the CPU has LSX (LOONGARCH SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using LOONGARCH instruction sets.
+--
+--     [Returns]: true if the CPU has LOONGARCH LSX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasLSX@, defined at @SDL3\/SDL_cpuinfo.h 296:34@
+sDL_HasLSX :: IO BG.CBool
+sDL_HasLSX = hs_bindgen_56a380fc3630f88f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasLASX@
+foreign import ccall safe "hs_bindgen_18257ff80297cf49"
+  hs_bindgen_18257ff80297cf49_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_HasLASX@
+hs_bindgen_18257ff80297cf49 :: IO BG.CBool
+hs_bindgen_18257ff80297cf49 =
+  BG.fromFFIType hs_bindgen_18257ff80297cf49_base
+
+-- | Determine whether the CPU has LASX (LOONGARCH SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using LOONGARCH instruction sets.
+--
+--     [Returns]: true if the CPU has LOONGARCH LASX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasLASX@, defined at @SDL3\/SDL_cpuinfo.h 310:34@
+sDL_HasLASX :: IO BG.CBool
+sDL_HasLASX = hs_bindgen_18257ff80297cf49
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_GetSystemRAM@
+foreign import ccall safe "hs_bindgen_cd53f670bd0bc729"
+  hs_bindgen_cd53f670bd0bc729_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_GetSystemRAM@
+hs_bindgen_cd53f670bd0bc729 :: IO BG.CInt
+hs_bindgen_cd53f670bd0bc729 =
+  BG.fromFFIType hs_bindgen_cd53f670bd0bc729_base
+
+-- | Get the amount of RAM configured in the system.
+--
+--     [Returns]: the amount of RAM configured in the system in MiB.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSystemRAM@, defined at @SDL3\/SDL_cpuinfo.h 321:33@
+sDL_GetSystemRAM :: IO BG.CInt
+sDL_GetSystemRAM = hs_bindgen_cd53f670bd0bc729
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_GetSIMDAlignment@
+foreign import ccall safe "hs_bindgen_db11c36832e4fbf2"
+  hs_bindgen_db11c36832e4fbf2_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_GetSIMDAlignment@
+hs_bindgen_db11c36832e4fbf2 :: IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_db11c36832e4fbf2 =
+  BG.fromFFIType hs_bindgen_db11c36832e4fbf2_base
+
+-- | Report the alignment this system needs for SIMD allocations.
+--
+--     This will return the minimum number of bytes to which a pointer must be aligned to be compatible with SIMD instructions on the current machine. For example, if the machine supports SSE only, it will return 16, but if it supports AVX-512F, it\'ll return 64 (etc). This only reports values for instruction sets SDL knows about, so if your SDL build doesn\'t have @SDL_HasAVX512F()@, then it might return 16 for the SSE support it sees and not 64 for the AVX-512 instructions that exist but SDL doesn\'t know about. Plan accordingly.
+--
+--     [Returns]: the alignment in bytes needed for available, known SIMD instructions.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_aligned_alloc, SDL_aligned_free
+--
+--     [C declaration]: @SDL_GetSIMDAlignment@, defined at @SDL3\/SDL_cpuinfo.h 345:36@
+sDL_GetSIMDAlignment :: IO HsBindgen.Runtime.LibC.CSize
+sDL_GetSIMDAlignment = hs_bindgen_db11c36832e4fbf2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_GetSystemPageSize@
+foreign import ccall safe "hs_bindgen_a5c1dbf29e777b88"
+  hs_bindgen_a5c1dbf29e777b88_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Safe_SDL_GetSystemPageSize@
+hs_bindgen_a5c1dbf29e777b88 :: IO BG.CInt
+hs_bindgen_a5c1dbf29e777b88 =
+  BG.fromFFIType hs_bindgen_a5c1dbf29e777b88_base
+
+-- | Report the size of a page of memory.
+--
+--     Different platforms might have different memory page sizes. In current times, 4 kilobytes is not unusual, but newer systems are moving to larger page sizes, and esoteric platforms might have any unexpected size.
+--
+--     Note that this function can return 0, which means SDL can\'t determine the page size on this platform. It will /not/ set an error string to be retrieved with SDL_GetError() in this case! In this case, defaulting to 4096 is often a reasonable option.
+--
+--     [Returns]: the size of a single page of memory, in bytes, or 0 if SDL can\'t determine this information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetSystemPageSize@, defined at @SDL3\/SDL_cpuinfo.h 366:33@
+sDL_GetSystemPageSize :: IO BG.CInt
+sDL_GetSystemPageSize = hs_bindgen_a5c1dbf29e777b88
diff --git a/src/SDL3/Sys/Bindgen/Cpuinfo/Unsafe.hs b/src/SDL3/Sys/Bindgen/Cpuinfo/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Cpuinfo/Unsafe.hs
@@ -0,0 +1,596 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Cpuinfo.Unsafe (
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_GetNumLogicalCPUCores,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_GetCPUCacheLineSize,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasAltiVec,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasMMX,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasSSE,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasSSE2,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasSSE3,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasSSE41,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasSSE42,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasAVX,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasAVX2,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasAVX512F,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasARMSIMD,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasNEON,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasLSX,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_HasLASX,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_GetSystemRAM,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_GetSIMDAlignment,
+  SDL3.Sys.Bindgen.Cpuinfo.Unsafe.sDL_GetSystemPageSize,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_cpuinfo.h>"
+         , "signed int hs_bindgen_2dccacbd66e2901a (void)"
+         , "{"
+         , "  return (SDL_GetNumLogicalCPUCores)();"
+         , "}"
+         , "signed int hs_bindgen_e03244111b7a5e58 (void)"
+         , "{"
+         , "  return (SDL_GetCPUCacheLineSize)();"
+         , "}"
+         , "_Bool hs_bindgen_c02ac9b5929c16b4 (void)"
+         , "{"
+         , "  return (SDL_HasAltiVec)();"
+         , "}"
+         , "_Bool hs_bindgen_28aa2bda36b5aa4c (void)"
+         , "{"
+         , "  return (SDL_HasMMX)();"
+         , "}"
+         , "_Bool hs_bindgen_eaac9231c0bcefbd (void)"
+         , "{"
+         , "  return (SDL_HasSSE)();"
+         , "}"
+         , "_Bool hs_bindgen_45752d13431081c5 (void)"
+         , "{"
+         , "  return (SDL_HasSSE2)();"
+         , "}"
+         , "_Bool hs_bindgen_c6c39cde5a6c6617 (void)"
+         , "{"
+         , "  return (SDL_HasSSE3)();"
+         , "}"
+         , "_Bool hs_bindgen_e0ea6c3ffa969fb3 (void)"
+         , "{"
+         , "  return (SDL_HasSSE41)();"
+         , "}"
+         , "_Bool hs_bindgen_963abd764eea230e (void)"
+         , "{"
+         , "  return (SDL_HasSSE42)();"
+         , "}"
+         , "_Bool hs_bindgen_9fd691470d9db666 (void)"
+         , "{"
+         , "  return (SDL_HasAVX)();"
+         , "}"
+         , "_Bool hs_bindgen_124690c686028ea3 (void)"
+         , "{"
+         , "  return (SDL_HasAVX2)();"
+         , "}"
+         , "_Bool hs_bindgen_3ae539db5deb14c3 (void)"
+         , "{"
+         , "  return (SDL_HasAVX512F)();"
+         , "}"
+         , "_Bool hs_bindgen_b00e33aa275d2caa (void)"
+         , "{"
+         , "  return (SDL_HasARMSIMD)();"
+         , "}"
+         , "_Bool hs_bindgen_1bc7c765b1884ac6 (void)"
+         , "{"
+         , "  return (SDL_HasNEON)();"
+         , "}"
+         , "_Bool hs_bindgen_d7682979762c8eba (void)"
+         , "{"
+         , "  return (SDL_HasLSX)();"
+         , "}"
+         , "_Bool hs_bindgen_d5a768a4b808f80b (void)"
+         , "{"
+         , "  return (SDL_HasLASX)();"
+         , "}"
+         , "signed int hs_bindgen_677c5a21a3ebeb42 (void)"
+         , "{"
+         , "  return (SDL_GetSystemRAM)();"
+         , "}"
+         , "size_t hs_bindgen_0e3c01d452c69d72 (void)"
+         , "{"
+         , "  return (SDL_GetSIMDAlignment)();"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "signed int hs_bindgen_d276a10dc866cd76 (void)"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetSystemPageSize)();"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetSystemPageSize requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_GetNumLogicalCPUCores@
+foreign import ccall unsafe "hs_bindgen_2dccacbd66e2901a"
+  hs_bindgen_2dccacbd66e2901a_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_GetNumLogicalCPUCores@
+hs_bindgen_2dccacbd66e2901a :: IO BG.CInt
+hs_bindgen_2dccacbd66e2901a =
+  BG.fromFFIType hs_bindgen_2dccacbd66e2901a_base
+
+-- | Get the number of logical CPU cores available.
+--
+--     [Returns]: the total number of logical CPU cores. On CPUs that include technologies such as hyperthreading, the number of logical cores may be more than the number of physical cores.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetNumLogicalCPUCores@, defined at @SDL3\/SDL_cpuinfo.h 73:33@
+sDL_GetNumLogicalCPUCores :: IO BG.CInt
+sDL_GetNumLogicalCPUCores =
+  hs_bindgen_2dccacbd66e2901a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_GetCPUCacheLineSize@
+foreign import ccall unsafe "hs_bindgen_e03244111b7a5e58"
+  hs_bindgen_e03244111b7a5e58_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_GetCPUCacheLineSize@
+hs_bindgen_e03244111b7a5e58 :: IO BG.CInt
+hs_bindgen_e03244111b7a5e58 =
+  BG.fromFFIType hs_bindgen_e03244111b7a5e58_base
+
+-- | Determine the L1 cache line size of the CPU.
+--
+--     This is useful for determining multi-threaded structure padding or SIMD prefetch sizes.
+--
+--     [Returns]: the L1 cache line size of the CPU, in bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCPUCacheLineSize@, defined at @SDL3\/SDL_cpuinfo.h 87:33@
+sDL_GetCPUCacheLineSize :: IO BG.CInt
+sDL_GetCPUCacheLineSize = hs_bindgen_e03244111b7a5e58
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasAltiVec@
+foreign import ccall unsafe "hs_bindgen_c02ac9b5929c16b4"
+  hs_bindgen_c02ac9b5929c16b4_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasAltiVec@
+hs_bindgen_c02ac9b5929c16b4 :: IO BG.CBool
+hs_bindgen_c02ac9b5929c16b4 =
+  BG.fromFFIType hs_bindgen_c02ac9b5929c16b4_base
+
+-- | Determine whether the CPU has AltiVec features.
+--
+--     This always returns false on CPUs that aren\'t using PowerPC instruction sets.
+--
+--     [Returns]: true if the CPU has AltiVec features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasAltiVec@, defined at @SDL3\/SDL_cpuinfo.h 101:34@
+sDL_HasAltiVec :: IO BG.CBool
+sDL_HasAltiVec = hs_bindgen_c02ac9b5929c16b4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasMMX@
+foreign import ccall unsafe "hs_bindgen_28aa2bda36b5aa4c"
+  hs_bindgen_28aa2bda36b5aa4c_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasMMX@
+hs_bindgen_28aa2bda36b5aa4c :: IO BG.CBool
+hs_bindgen_28aa2bda36b5aa4c =
+  BG.fromFFIType hs_bindgen_28aa2bda36b5aa4c_base
+
+-- | Determine whether the CPU has MMX features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has MMX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasMMX@, defined at @SDL3\/SDL_cpuinfo.h 114:34@
+sDL_HasMMX :: IO BG.CBool
+sDL_HasMMX = hs_bindgen_28aa2bda36b5aa4c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasSSE@
+foreign import ccall unsafe "hs_bindgen_eaac9231c0bcefbd"
+  hs_bindgen_eaac9231c0bcefbd_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasSSE@
+hs_bindgen_eaac9231c0bcefbd :: IO BG.CBool
+hs_bindgen_eaac9231c0bcefbd =
+  BG.fromFFIType hs_bindgen_eaac9231c0bcefbd_base
+
+-- | Determine whether the CPU has SSE features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE2', 'sDL_HasSSE3', 'sDL_HasSSE41', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE@, defined at @SDL3\/SDL_cpuinfo.h 132:34@
+sDL_HasSSE :: IO BG.CBool
+sDL_HasSSE = hs_bindgen_eaac9231c0bcefbd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasSSE2@
+foreign import ccall unsafe "hs_bindgen_45752d13431081c5"
+  hs_bindgen_45752d13431081c5_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasSSE2@
+hs_bindgen_45752d13431081c5 :: IO BG.CBool
+hs_bindgen_45752d13431081c5 =
+  BG.fromFFIType hs_bindgen_45752d13431081c5_base
+
+-- | Determine whether the CPU has SSE2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE3', 'sDL_HasSSE41', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE2@, defined at @SDL3\/SDL_cpuinfo.h 150:34@
+sDL_HasSSE2 :: IO BG.CBool
+sDL_HasSSE2 = hs_bindgen_45752d13431081c5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasSSE3@
+foreign import ccall unsafe "hs_bindgen_c6c39cde5a6c6617"
+  hs_bindgen_c6c39cde5a6c6617_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasSSE3@
+hs_bindgen_c6c39cde5a6c6617 :: IO BG.CBool
+hs_bindgen_c6c39cde5a6c6617 =
+  BG.fromFFIType hs_bindgen_c6c39cde5a6c6617_base
+
+-- | Determine whether the CPU has SSE3 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE3 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE2', 'sDL_HasSSE41', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE3@, defined at @SDL3\/SDL_cpuinfo.h 168:34@
+sDL_HasSSE3 :: IO BG.CBool
+sDL_HasSSE3 = hs_bindgen_c6c39cde5a6c6617
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasSSE41@
+foreign import ccall unsafe "hs_bindgen_e0ea6c3ffa969fb3"
+  hs_bindgen_e0ea6c3ffa969fb3_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasSSE41@
+hs_bindgen_e0ea6c3ffa969fb3 :: IO BG.CBool
+hs_bindgen_e0ea6c3ffa969fb3 =
+  BG.fromFFIType hs_bindgen_e0ea6c3ffa969fb3_base
+
+-- | Determine whether the CPU has SSE4.1 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE4.1 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE2', 'sDL_HasSSE3', 'sDL_HasSSE42'
+--
+--     [C declaration]: @SDL_HasSSE41@, defined at @SDL3\/SDL_cpuinfo.h 186:34@
+sDL_HasSSE41 :: IO BG.CBool
+sDL_HasSSE41 = hs_bindgen_e0ea6c3ffa969fb3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasSSE42@
+foreign import ccall unsafe "hs_bindgen_963abd764eea230e"
+  hs_bindgen_963abd764eea230e_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasSSE42@
+hs_bindgen_963abd764eea230e :: IO BG.CBool
+hs_bindgen_963abd764eea230e =
+  BG.fromFFIType hs_bindgen_963abd764eea230e_base
+
+-- | Determine whether the CPU has SSE4.2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE4.2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasSSE', 'sDL_HasSSE2', 'sDL_HasSSE3', 'sDL_HasSSE41'
+--
+--     [C declaration]: @SDL_HasSSE42@, defined at @SDL3\/SDL_cpuinfo.h 204:34@
+sDL_HasSSE42 :: IO BG.CBool
+sDL_HasSSE42 = hs_bindgen_963abd764eea230e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasAVX@
+foreign import ccall unsafe "hs_bindgen_9fd691470d9db666"
+  hs_bindgen_9fd691470d9db666_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasAVX@
+hs_bindgen_9fd691470d9db666 :: IO BG.CBool
+hs_bindgen_9fd691470d9db666 =
+  BG.fromFFIType hs_bindgen_9fd691470d9db666_base
+
+-- | Determine whether the CPU has AVX features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasAVX2', 'sDL_HasAVX512F'
+--
+--     [C declaration]: @SDL_HasAVX@, defined at @SDL3\/SDL_cpuinfo.h 220:34@
+sDL_HasAVX :: IO BG.CBool
+sDL_HasAVX = hs_bindgen_9fd691470d9db666
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasAVX2@
+foreign import ccall unsafe "hs_bindgen_124690c686028ea3"
+  hs_bindgen_124690c686028ea3_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasAVX2@
+hs_bindgen_124690c686028ea3 :: IO BG.CBool
+hs_bindgen_124690c686028ea3 =
+  BG.fromFFIType hs_bindgen_124690c686028ea3_base
+
+-- | Determine whether the CPU has AVX2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasAVX', 'sDL_HasAVX512F'
+--
+--     [C declaration]: @SDL_HasAVX2@, defined at @SDL3\/SDL_cpuinfo.h 236:34@
+sDL_HasAVX2 :: IO BG.CBool
+sDL_HasAVX2 = hs_bindgen_124690c686028ea3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasAVX512F@
+foreign import ccall unsafe "hs_bindgen_3ae539db5deb14c3"
+  hs_bindgen_3ae539db5deb14c3_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasAVX512F@
+hs_bindgen_3ae539db5deb14c3 :: IO BG.CBool
+hs_bindgen_3ae539db5deb14c3 =
+  BG.fromFFIType hs_bindgen_3ae539db5deb14c3_base
+
+-- | Determine whether the CPU has AVX-512F (foundation) features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX-512F features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasAVX', 'sDL_HasAVX2'
+--
+--     [C declaration]: @SDL_HasAVX512F@, defined at @SDL3\/SDL_cpuinfo.h 252:34@
+sDL_HasAVX512F :: IO BG.CBool
+sDL_HasAVX512F = hs_bindgen_3ae539db5deb14c3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasARMSIMD@
+foreign import ccall unsafe "hs_bindgen_b00e33aa275d2caa"
+  hs_bindgen_b00e33aa275d2caa_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasARMSIMD@
+hs_bindgen_b00e33aa275d2caa :: IO BG.CBool
+hs_bindgen_b00e33aa275d2caa =
+  BG.fromFFIType hs_bindgen_b00e33aa275d2caa_base
+
+-- | Determine whether the CPU has ARM SIMD (ARMv6) features.
+--
+--     This is different from ARM NEON, which is a different instruction set.
+--
+--     This always returns false on CPUs that aren\'t using ARM instruction sets.
+--
+--     [Returns]: true if the CPU has ARM SIMD features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasNEON'
+--
+--     [C declaration]: @SDL_HasARMSIMD@, defined at @SDL3\/SDL_cpuinfo.h 269:34@
+sDL_HasARMSIMD :: IO BG.CBool
+sDL_HasARMSIMD = hs_bindgen_b00e33aa275d2caa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasNEON@
+foreign import ccall unsafe "hs_bindgen_1bc7c765b1884ac6"
+  hs_bindgen_1bc7c765b1884ac6_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasNEON@
+hs_bindgen_1bc7c765b1884ac6 :: IO BG.CBool
+hs_bindgen_1bc7c765b1884ac6 =
+  BG.fromFFIType hs_bindgen_1bc7c765b1884ac6_base
+
+-- | Determine whether the CPU has NEON (ARM SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using ARM instruction sets.
+--
+--     [Returns]: true if the CPU has ARM NEON features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasNEON@, defined at @SDL3\/SDL_cpuinfo.h 282:34@
+sDL_HasNEON :: IO BG.CBool
+sDL_HasNEON = hs_bindgen_1bc7c765b1884ac6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasLSX@
+foreign import ccall unsafe "hs_bindgen_d7682979762c8eba"
+  hs_bindgen_d7682979762c8eba_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasLSX@
+hs_bindgen_d7682979762c8eba :: IO BG.CBool
+hs_bindgen_d7682979762c8eba =
+  BG.fromFFIType hs_bindgen_d7682979762c8eba_base
+
+-- | Determine whether the CPU has LSX (LOONGARCH SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using LOONGARCH instruction sets.
+--
+--     [Returns]: true if the CPU has LOONGARCH LSX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasLSX@, defined at @SDL3\/SDL_cpuinfo.h 296:34@
+sDL_HasLSX :: IO BG.CBool
+sDL_HasLSX = hs_bindgen_d7682979762c8eba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasLASX@
+foreign import ccall unsafe "hs_bindgen_d5a768a4b808f80b"
+  hs_bindgen_d5a768a4b808f80b_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_HasLASX@
+hs_bindgen_d5a768a4b808f80b :: IO BG.CBool
+hs_bindgen_d5a768a4b808f80b =
+  BG.fromFFIType hs_bindgen_d5a768a4b808f80b_base
+
+-- | Determine whether the CPU has LASX (LOONGARCH SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using LOONGARCH instruction sets.
+--
+--     [Returns]: true if the CPU has LOONGARCH LASX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HasLASX@, defined at @SDL3\/SDL_cpuinfo.h 310:34@
+sDL_HasLASX :: IO BG.CBool
+sDL_HasLASX = hs_bindgen_d5a768a4b808f80b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_GetSystemRAM@
+foreign import ccall unsafe "hs_bindgen_677c5a21a3ebeb42"
+  hs_bindgen_677c5a21a3ebeb42_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_GetSystemRAM@
+hs_bindgen_677c5a21a3ebeb42 :: IO BG.CInt
+hs_bindgen_677c5a21a3ebeb42 =
+  BG.fromFFIType hs_bindgen_677c5a21a3ebeb42_base
+
+-- | Get the amount of RAM configured in the system.
+--
+--     [Returns]: the amount of RAM configured in the system in MiB.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSystemRAM@, defined at @SDL3\/SDL_cpuinfo.h 321:33@
+sDL_GetSystemRAM :: IO BG.CInt
+sDL_GetSystemRAM = hs_bindgen_677c5a21a3ebeb42
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_GetSIMDAlignment@
+foreign import ccall unsafe "hs_bindgen_0e3c01d452c69d72"
+  hs_bindgen_0e3c01d452c69d72_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_GetSIMDAlignment@
+hs_bindgen_0e3c01d452c69d72 :: IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_0e3c01d452c69d72 =
+  BG.fromFFIType hs_bindgen_0e3c01d452c69d72_base
+
+-- | Report the alignment this system needs for SIMD allocations.
+--
+--     This will return the minimum number of bytes to which a pointer must be aligned to be compatible with SIMD instructions on the current machine. For example, if the machine supports SSE only, it will return 16, but if it supports AVX-512F, it\'ll return 64 (etc). This only reports values for instruction sets SDL knows about, so if your SDL build doesn\'t have @SDL_HasAVX512F()@, then it might return 16 for the SSE support it sees and not 64 for the AVX-512 instructions that exist but SDL doesn\'t know about. Plan accordingly.
+--
+--     [Returns]: the alignment in bytes needed for available, known SIMD instructions.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_aligned_alloc, SDL_aligned_free
+--
+--     [C declaration]: @SDL_GetSIMDAlignment@, defined at @SDL3\/SDL_cpuinfo.h 345:36@
+sDL_GetSIMDAlignment :: IO HsBindgen.Runtime.LibC.CSize
+sDL_GetSIMDAlignment = hs_bindgen_0e3c01d452c69d72
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_GetSystemPageSize@
+foreign import ccall unsafe "hs_bindgen_d276a10dc866cd76"
+  hs_bindgen_d276a10dc866cd76_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Cpuinfo_Unsafe_SDL_GetSystemPageSize@
+hs_bindgen_d276a10dc866cd76 :: IO BG.CInt
+hs_bindgen_d276a10dc866cd76 =
+  BG.fromFFIType hs_bindgen_d276a10dc866cd76_base
+
+-- | Report the size of a page of memory.
+--
+--     Different platforms might have different memory page sizes. In current times, 4 kilobytes is not unusual, but newer systems are moving to larger page sizes, and esoteric platforms might have any unexpected size.
+--
+--     Note that this function can return 0, which means SDL can\'t determine the page size on this platform. It will /not/ set an error string to be retrieved with SDL_GetError() in this case! In this case, defaulting to 4096 is often a reasonable option.
+--
+--     [Returns]: the size of a single page of memory, in bytes, or 0 if SDL can\'t determine this information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetSystemPageSize@, defined at @SDL3\/SDL_cpuinfo.h 366:33@
+sDL_GetSystemPageSize :: IO BG.CInt
+sDL_GetSystemPageSize = hs_bindgen_d276a10dc866cd76
diff --git a/src/SDL3/Sys/Bindgen/Dialog.hs b/src/SDL3/Sys/Bindgen/Dialog.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Dialog.hs
@@ -0,0 +1,605 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | File dialog support.
+--
+--     SDL offers file dialogs, to let users select files with native GUI interfaces. There are \"open\" dialogs, \"save\" dialogs, and folder selection dialogs. The app can control some details, such as filtering to specific files, or whether multiple files can be selected by the user.
+--
+--     Note that launching a file dialog is a non-blocking operation; control returns to the app immediately, and a callback is called later (possibly in another thread) when the user makes a choice. An entry for filters for file dialogs.
+--
+--     @name@ is a user-readable label for the filter (for example, \"Office document\").
+--
+--     @pattern@ is a semicolon-separated list of file extensions (for example, \"doc;docx\"). File extensions may only contain alphanumeric characters, hyphens, underscores and periods. Alternatively, the whole string can be a single asterisk (\"*\"), which serves as an \"All files\" filter.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'sDL_ShowOpenFileDialog', 'sDL_ShowSaveFileDialog', 'sDL_ShowOpenFolderDialog', 'sDL_ShowFileDialogWithProperties'
+module SDL3.Sys.Bindgen.Dialog (
+  SDL3.Sys.Bindgen.Dialog.SDL_DialogFileFilter (..),
+  SDL3.Sys.Bindgen.Dialog.SDL_DialogFileCallback_Aux (..),
+  SDL3.Sys.Bindgen.Dialog.SDL_DialogFileCallback (..),
+  SDL3.Sys.Bindgen.Dialog.SDL_FileDialogType (..),
+  pattern SDL3.Sys.Bindgen.Dialog.SDL_FILEDIALOG_OPENFILE,
+  pattern SDL3.Sys.Bindgen.Dialog.SDL_FILEDIALOG_SAVEFILE,
+  pattern SDL3.Sys.Bindgen.Dialog.SDL_FILEDIALOG_OPENFOLDER,
+  SDL3.Sys.Bindgen.Dialog.sDL_PROP_FILE_DIALOG_FILTERS_POINTER,
+  SDL3.Sys.Bindgen.Dialog.sDL_PROP_FILE_DIALOG_NFILTERS_NUMBER,
+  SDL3.Sys.Bindgen.Dialog.sDL_PROP_FILE_DIALOG_WINDOW_POINTER,
+  SDL3.Sys.Bindgen.Dialog.sDL_PROP_FILE_DIALOG_LOCATION_STRING,
+  SDL3.Sys.Bindgen.Dialog.sDL_PROP_FILE_DIALOG_MANY_BOOLEAN,
+  SDL3.Sys.Bindgen.Dialog.sDL_PROP_FILE_DIALOG_TITLE_STRING,
+  SDL3.Sys.Bindgen.Dialog.sDL_PROP_FILE_DIALOG_ACCEPT_STRING,
+  SDL3.Sys.Bindgen.Dialog.sDL_PROP_FILE_DIALOG_CANCEL_STRING,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @struct SDL_DialogFileFilter@, defined at @SDL3\/SDL_dialog.h 70:16@
+data SDL_DialogFileFilter = SDL_DialogFileFilter
+  { name :: PtrConst.PtrConst BG.CChar
+  -- ^ [C declaration]: @name@, defined at @SDL3\/SDL_dialog.h 72:17@
+  , pattern' :: PtrConst.PtrConst BG.CChar
+  -- ^ [C declaration]: @pattern@, defined at @SDL3\/SDL_dialog.h 73:17@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_DialogFileFilter where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_DialogFileFilter where
+  readRaw =
+    \ptr0 ->
+      pure SDL_DialogFileFilter
+        <*> HasCField.readRaw (BG.Proxy @"name") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pattern'") ptr0
+
+instance Marshal.WriteRaw SDL_DialogFileFilter where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_DialogFileFilter name2 pattern'3 ->
+            HasCField.writeRaw (BG.Proxy @"name") ptr0 name2
+              >> HasCField.writeRaw (BG.Proxy @"pattern'") ptr0 pattern'3
+
+deriving via Marshal.EquivStorable SDL_DialogFileFilter instance BG.Storable SDL_DialogFileFilter
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "name" SDL_DialogFileFilter ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DialogFileFilter{name = y1, pattern' = BG.getField @"pattern'" x0}
+      , BG.getField @"name" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "name" (BG.Ptr SDL_DialogFileFilter) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"name")
+
+instance HasCField.HasCField SDL_DialogFileFilter "name" where
+  type
+    CFieldType SDL_DialogFileFilter "name" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "pattern'" SDL_DialogFileFilter ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DialogFileFilter{pattern' = y1, name = BG.getField @"name" x0}
+      , BG.getField @"pattern'" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "pattern'" (BG.Ptr SDL_DialogFileFilter) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pattern'")
+
+instance HasCField.HasCField SDL_DialogFileFilter "pattern'" where
+  type
+    CFieldType SDL_DialogFileFilter "pattern'" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 8
+
+-- | Auxiliary type used by 'SDL_DialogFileCallback'
+--
+--     [C declaration]: @SDL_DialogFileCallback@, defined at @SDL3\/SDL_dialog.h 113:24@
+newtype SDL_DialogFileCallback_Aux = SDL_DialogFileCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> PtrConst.PtrConst (PtrConst.PtrConst BG.CChar) -> BG.CInt -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_DialogFileCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_99f6498d5c37dad6_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> IO ()))
+
+-- __unique:__ @toSDL_DialogFileCallback_Aux@
+hs_bindgen_99f6498d5c37dad6
+  :: SDL_DialogFileCallback_Aux
+  -> IO (BG.FunPtr SDL_DialogFileCallback_Aux)
+hs_bindgen_99f6498d5c37dad6 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_99f6498d5c37dad6_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_DialogFileCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_10f8f9d1eb0aafd5_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Int32 -> IO ())
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO ()
+
+-- __unique:__ @fromSDL_DialogFileCallback_Aux@
+hs_bindgen_10f8f9d1eb0aafd5
+  :: BG.FunPtr SDL_DialogFileCallback_Aux
+  -> SDL_DialogFileCallback_Aux
+hs_bindgen_10f8f9d1eb0aafd5 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_10f8f9d1eb0aafd5_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_DialogFileCallback_Aux where
+  toFunPtr = hs_bindgen_99f6498d5c37dad6
+
+instance BG.FromFunPtr SDL_DialogFileCallback_Aux where
+  fromFunPtr = hs_bindgen_10f8f9d1eb0aafd5
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> PtrConst.PtrConst (PtrConst.PtrConst BG.CChar) -> BG.CInt -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_DialogFileCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DialogFileCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> PtrConst.PtrConst (PtrConst.PtrConst BG.CChar) -> BG.CInt -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_DialogFileCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_DialogFileCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_DialogFileCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> PtrConst.PtrConst (PtrConst.PtrConst BG.CChar) -> BG.CInt -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | Callback used by file dialog functions.
+--
+--     The specific usage is described in each function.
+--
+--     If @filelist@ is:
+--
+--     * NULL, an error occurred. Details can be obtained with SDL_GetError().
+--
+--     * A pointer to NULL, the user either didn\'t choose any file or canceled the dialog.
+--
+--     * A pointer to non- @NULL@, the user chose one or more files. The argument is a null-terminated array of pointers to UTF-8 encoded strings, each containing a path.
+--
+--     The filelist argument should not be freed; it will automatically be freed when the callback returns.
+--
+--     The filter argument is the index of the filter that was selected, or -1 if no filter was selected or if the platform or method doesn\'t support fetching the selected filter.
+--
+--     In Android, the @filelist@ are @content:\/\/@ URIs. They should be opened using SDL_IOFromFile() with appropriate modes. This applies both to open and save file dialog.
+--
+--     [@userdata@]: an app-provided pointer, for the callback\'s use.
+--
+--     [@filelist@]: the file(s) chosen by the user.
+--
+--     [@filter@]: index of the selected filter.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileFilter', 'sDL_ShowOpenFileDialog', 'sDL_ShowSaveFileDialog', 'sDL_ShowOpenFolderDialog', 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @SDL_DialogFileCallback@, defined at @SDL3\/SDL_dialog.h 113:24@
+newtype SDL_DialogFileCallback = SDL_DialogFileCallback
+  { unwrap :: BG.FunPtr SDL_DialogFileCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_DialogFileCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_DialogFileCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DialogFileCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_DialogFileCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_DialogFileCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_DialogFileCallback "unwrap" where
+  type
+    CFieldType SDL_DialogFileCallback "unwrap" =
+      BG.FunPtr SDL_DialogFileCallback_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Various types of file dialogs.
+--
+--     This is used by @SDL_ShowFileDialogWithProperties()@ to decide what kind of dialog to present to the user.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @enum SDL_FileDialogType@, defined at @SDL3\/SDL_dialog.h 272:14@
+newtype SDL_FileDialogType = SDL_FileDialogType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_FileDialogType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_FileDialogType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_FileDialogType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_FileDialogType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_FileDialogType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_FileDialogType instance BG.Storable SDL_FileDialogType
+
+deriving via BG.CUInt instance BG.Prim SDL_FileDialogType
+
+instance CEnum.CEnum SDL_FileDialogType where
+  type CEnumZ SDL_FileDialogType = BG.CUInt
+
+  toCEnum = SDL_FileDialogType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_FILEDIALOG_OPENFILE")
+        , (1, BG.singleton "SDL_FILEDIALOG_SAVEFILE")
+        , (2, BG.singleton "SDL_FILEDIALOG_OPENFOLDER")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_FileDialogType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_FileDialogType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_FileDialogType where
+  minDeclaredValue = SDL_FILEDIALOG_OPENFILE
+
+  maxDeclaredValue = SDL_FILEDIALOG_OPENFOLDER
+
+instance Show SDL_FileDialogType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_FileDialogType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_FileDialogType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FileDialogType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_FileDialogType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_FileDialogType "unwrap" where
+  type
+    CFieldType SDL_FileDialogType "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_FILEDIALOG_OPENFILE@, defined at @SDL3\/SDL_dialog.h 274:5@
+pattern SDL_FILEDIALOG_OPENFILE :: SDL_FileDialogType
+pattern SDL_FILEDIALOG_OPENFILE = SDL_FileDialogType 0
+
+-- | [C declaration]: @SDL_FILEDIALOG_SAVEFILE@, defined at @SDL3\/SDL_dialog.h 275:5@
+pattern SDL_FILEDIALOG_SAVEFILE :: SDL_FileDialogType
+pattern SDL_FILEDIALOG_SAVEFILE = SDL_FileDialogType 1
+
+-- | [C declaration]: @SDL_FILEDIALOG_OPENFOLDER@, defined at @SDL3\/SDL_dialog.h 276:5@
+pattern SDL_FILEDIALOG_OPENFOLDER :: SDL_FileDialogType
+pattern SDL_FILEDIALOG_OPENFOLDER = SDL_FileDialogType 2
+
+-- | [C declaration]: @macro SDL_PROP_FILE_DIALOG_FILTERS_POINTER@, literal @\"SDL.filedialog.filters\"@, defined at @SDL3\/SDL_dialog.h 328:9@
+sDL_PROP_FILE_DIALOG_FILTERS_POINTER :: BG.ByteString
+sDL_PROP_FILE_DIALOG_FILTERS_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x65
+    , 0x64
+    , 0x69
+    , 0x61
+    , 0x6C
+    , 0x6F
+    , 0x67
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x74
+    , 0x65
+    , 0x72
+    , 0x73
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_FILE_DIALOG_NFILTERS_NUMBER@, literal @\"SDL.filedialog.nfilters\"@, defined at @SDL3\/SDL_dialog.h 329:9@
+sDL_PROP_FILE_DIALOG_NFILTERS_NUMBER :: BG.ByteString
+sDL_PROP_FILE_DIALOG_NFILTERS_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x65
+    , 0x64
+    , 0x69
+    , 0x61
+    , 0x6C
+    , 0x6F
+    , 0x67
+    , 0x2E
+    , 0x6E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x74
+    , 0x65
+    , 0x72
+    , 0x73
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_FILE_DIALOG_WINDOW_POINTER@, literal @\"SDL.filedialog.window\"@, defined at @SDL3\/SDL_dialog.h 330:9@
+sDL_PROP_FILE_DIALOG_WINDOW_POINTER :: BG.ByteString
+sDL_PROP_FILE_DIALOG_WINDOW_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x65
+    , 0x64
+    , 0x69
+    , 0x61
+    , 0x6C
+    , 0x6F
+    , 0x67
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_FILE_DIALOG_LOCATION_STRING@, literal @\"SDL.filedialog.location\"@, defined at @SDL3\/SDL_dialog.h 331:9@
+sDL_PROP_FILE_DIALOG_LOCATION_STRING :: BG.ByteString
+sDL_PROP_FILE_DIALOG_LOCATION_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x65
+    , 0x64
+    , 0x69
+    , 0x61
+    , 0x6C
+    , 0x6F
+    , 0x67
+    , 0x2E
+    , 0x6C
+    , 0x6F
+    , 0x63
+    , 0x61
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_FILE_DIALOG_MANY_BOOLEAN@, literal @\"SDL.filedialog.many\"@, defined at @SDL3\/SDL_dialog.h 332:9@
+sDL_PROP_FILE_DIALOG_MANY_BOOLEAN :: BG.ByteString
+sDL_PROP_FILE_DIALOG_MANY_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x65
+    , 0x64
+    , 0x69
+    , 0x61
+    , 0x6C
+    , 0x6F
+    , 0x67
+    , 0x2E
+    , 0x6D
+    , 0x61
+    , 0x6E
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_FILE_DIALOG_TITLE_STRING@, literal @\"SDL.filedialog.title\"@, defined at @SDL3\/SDL_dialog.h 333:9@
+sDL_PROP_FILE_DIALOG_TITLE_STRING :: BG.ByteString
+sDL_PROP_FILE_DIALOG_TITLE_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x65
+    , 0x64
+    , 0x69
+    , 0x61
+    , 0x6C
+    , 0x6F
+    , 0x67
+    , 0x2E
+    , 0x74
+    , 0x69
+    , 0x74
+    , 0x6C
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_FILE_DIALOG_ACCEPT_STRING@, literal @\"SDL.filedialog.accept\"@, defined at @SDL3\/SDL_dialog.h 334:9@
+sDL_PROP_FILE_DIALOG_ACCEPT_STRING :: BG.ByteString
+sDL_PROP_FILE_DIALOG_ACCEPT_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x65
+    , 0x64
+    , 0x69
+    , 0x61
+    , 0x6C
+    , 0x6F
+    , 0x67
+    , 0x2E
+    , 0x61
+    , 0x63
+    , 0x63
+    , 0x65
+    , 0x70
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_FILE_DIALOG_CANCEL_STRING@, literal @\"SDL.filedialog.cancel\"@, defined at @SDL3\/SDL_dialog.h 335:9@
+sDL_PROP_FILE_DIALOG_CANCEL_STRING :: BG.ByteString
+sDL_PROP_FILE_DIALOG_CANCEL_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x65
+    , 0x64
+    , 0x69
+    , 0x61
+    , 0x6C
+    , 0x6F
+    , 0x67
+    , 0x2E
+    , 0x63
+    , 0x61
+    , 0x6E
+    , 0x63
+    , 0x65
+    , 0x6C
+    ]
diff --git a/src/SDL3/Sys/Bindgen/Dialog/FunPtr.hs b/src/SDL3/Sys/Bindgen/Dialog/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Dialog/FunPtr.hs
@@ -0,0 +1,345 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Dialog.FunPtr (
+  SDL3.Sys.Bindgen.Dialog.FunPtr.sDL_ShowOpenFileDialog,
+  SDL3.Sys.Bindgen.Dialog.FunPtr.sDL_ShowSaveFileDialog,
+  SDL3.Sys.Bindgen.Dialog.FunPtr.sDL_ShowOpenFolderDialog,
+  SDL3.Sys.Bindgen.Dialog.FunPtr.sDL_ShowFileDialogWithProperties,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Dialog
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_dialog.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowOpenFileDialog */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_6641ec3e92287ca2 (void)) ("
+         , "  SDL_DialogFileCallback arg1,"
+         , "  void *arg2,"
+         , "  SDL_Window *arg3,"
+         , "  SDL_DialogFileFilter const *arg4,"
+         , "  signed int arg5,"
+         , "  char const *arg6,"
+         , "  _Bool arg7"
+         , ")"
+         , "{"
+         , "  return &SDL_ShowOpenFileDialog;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowSaveFileDialog */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_a4a801b9d3bede11 (void)) ("
+         , "  SDL_DialogFileCallback arg1,"
+         , "  void *arg2,"
+         , "  SDL_Window *arg3,"
+         , "  SDL_DialogFileFilter const *arg4,"
+         , "  signed int arg5,"
+         , "  char const *arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_ShowSaveFileDialog;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowOpenFolderDialog */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_87c736a1fcfa392e (void)) ("
+         , "  SDL_DialogFileCallback arg1,"
+         , "  void *arg2,"
+         , "  SDL_Window *arg3,"
+         , "  char const *arg4,"
+         , "  _Bool arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_ShowOpenFolderDialog;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowFileDialogWithProperties */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_f3b5f0c530765109 (void)) ("
+         , "  SDL_FileDialogType arg1,"
+         , "  SDL_DialogFileCallback arg2,"
+         , "  void *arg3,"
+         , "  SDL_PropertiesID arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_ShowFileDialogWithProperties;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowOpenFileDialog@
+foreign import ccall unsafe "hs_bindgen_6641ec3e92287ca2"
+  hs_bindgen_6641ec3e92287ca2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowOpenFileDialog@
+hs_bindgen_6641ec3e92287ca2
+  :: IO
+       ( BG.FunPtr
+           ( SDL_DialogFileCallback
+             -> BG.Ptr BG.Void
+             -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> PtrConst.PtrConst SDL_DialogFileFilter
+             -> BG.CInt
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.CBool
+             -> IO ()
+           )
+       )
+hs_bindgen_6641ec3e92287ca2 =
+  BG.fromFFIType hs_bindgen_6641ec3e92287ca2_base
+
+{-# NOINLINE sDL_ShowOpenFileDialog #-}
+
+-- | Displays a dialog that lets the user select a file on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     Depending on the platform, the user may be allowed to input paths that don\'t yet exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to SDL_PumpEvents in their main loop.
+--
+--     [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+--
+--     [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+--
+--     [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+--
+--     [@filters@]: a list of filters, may be NULL. See the [@SDL_DialogFileFilter@](SDL_DialogFileFilter#code-examples) documentation for examples]. Not all platforms support this option, and platforms that do support it may allow the user to ignore the filters. If non-NULL, it must remain valid at least until the callback is invoked.
+--
+--     [@nfilters@]: the number of filters. Ignored if filters is NULL.
+--
+--     [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+--
+--     [@allow_many@]: if non-zero, the user will be allowed to select multiple entries. Not all platforms support this option.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'sDL_ShowSaveFileDialog', 'sDL_ShowOpenFolderDialog', 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @SDL_ShowOpenFileDialog@, defined at @SDL3\/SDL_dialog.h 166:34@
+sDL_ShowOpenFileDialog
+  :: BG.FunPtr
+       ( SDL_DialogFileCallback
+         -> BG.Ptr BG.Void
+         -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> PtrConst.PtrConst SDL_DialogFileFilter
+         -> BG.CInt
+         -> PtrConst.PtrConst BG.CChar
+         -> BG.CBool
+         -> IO ()
+       )
+sDL_ShowOpenFileDialog =
+  BG.unsafePerformIO hs_bindgen_6641ec3e92287ca2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowSaveFileDialog@
+foreign import ccall unsafe "hs_bindgen_a4a801b9d3bede11"
+  hs_bindgen_a4a801b9d3bede11_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowSaveFileDialog@
+hs_bindgen_a4a801b9d3bede11
+  :: IO
+       ( BG.FunPtr
+           ( SDL_DialogFileCallback
+             -> BG.Ptr BG.Void
+             -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> PtrConst.PtrConst SDL_DialogFileFilter
+             -> BG.CInt
+             -> PtrConst.PtrConst BG.CChar
+             -> IO ()
+           )
+       )
+hs_bindgen_a4a801b9d3bede11 =
+  BG.fromFFIType hs_bindgen_a4a801b9d3bede11_base
+
+{-# NOINLINE sDL_ShowSaveFileDialog #-}
+
+-- | Displays a dialog that lets the user choose a new or existing file on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     The chosen file may or may not already exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to SDL_PumpEvents in their main loop.
+--
+--     [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+--
+--     [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+--
+--     [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+--
+--     [@filters@]: a list of filters, may be NULL. Not all platforms support this option, and platforms that do support it may allow the user to ignore the filters. If non-NULL, it must remain valid at least until the callback is invoked.
+--
+--     [@nfilters@]: the number of filters. Ignored if filters is NULL.
+--
+--     [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'sDL_ShowOpenFileDialog', 'sDL_ShowOpenFolderDialog', 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @SDL_ShowSaveFileDialog@, defined at @SDL3\/SDL_dialog.h 215:34@
+sDL_ShowSaveFileDialog
+  :: BG.FunPtr
+       ( SDL_DialogFileCallback
+         -> BG.Ptr BG.Void
+         -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> PtrConst.PtrConst SDL_DialogFileFilter
+         -> BG.CInt
+         -> PtrConst.PtrConst BG.CChar
+         -> IO ()
+       )
+sDL_ShowSaveFileDialog =
+  BG.unsafePerformIO hs_bindgen_a4a801b9d3bede11
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowOpenFolderDialog@
+foreign import ccall unsafe "hs_bindgen_87c736a1fcfa392e"
+  hs_bindgen_87c736a1fcfa392e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowOpenFolderDialog@
+hs_bindgen_87c736a1fcfa392e
+  :: IO
+       ( BG.FunPtr
+           ( SDL_DialogFileCallback
+             -> BG.Ptr BG.Void
+             -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.CBool
+             -> IO ()
+           )
+       )
+hs_bindgen_87c736a1fcfa392e =
+  BG.fromFFIType hs_bindgen_87c736a1fcfa392e_base
+
+{-# NOINLINE sDL_ShowOpenFolderDialog #-}
+
+-- | Displays a dialog that lets the user select a folder on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     Depending on the platform, the user may be allowed to input paths that don\'t yet exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to SDL_PumpEvents in their main loop.
+--
+--     [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+--
+--     [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+--
+--     [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+--
+--     [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+--
+--     [@allow_many@]: if non-zero, the user will be allowed to select multiple entries. Not all platforms support this option.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'sDL_ShowOpenFileDialog', 'sDL_ShowSaveFileDialog', 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @SDL_ShowOpenFolderDialog@, defined at @SDL3\/SDL_dialog.h 260:34@
+sDL_ShowOpenFolderDialog
+  :: BG.FunPtr
+       ( SDL_DialogFileCallback
+         -> BG.Ptr BG.Void
+         -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> PtrConst.PtrConst BG.CChar
+         -> BG.CBool
+         -> IO ()
+       )
+sDL_ShowOpenFolderDialog =
+  BG.unsafePerformIO hs_bindgen_87c736a1fcfa392e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowFileDialogWithProperties@
+foreign import ccall unsafe "hs_bindgen_f3b5f0c530765109"
+  hs_bindgen_f3b5f0c530765109_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_get_SDL_ShowFileDialogWithProperties@
+hs_bindgen_f3b5f0c530765109
+  :: IO
+       ( BG.FunPtr
+           ( SDL_FileDialogType
+             -> SDL_DialogFileCallback
+             -> BG.Ptr BG.Void
+             -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+             -> IO ()
+           )
+       )
+hs_bindgen_f3b5f0c530765109 =
+  BG.fromFFIType hs_bindgen_f3b5f0c530765109_base
+
+{-# NOINLINE sDL_ShowFileDialogWithProperties #-}
+
+-- | Create and launch a file dialog with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_FILE_DIALOG_FILTERS_POINTER'@: a pointer to a list of 'SDL_DialogFileFilter' structs, which will be used as filters for file-based selections. Ignored if the dialog is an \"Open Folder\" dialog. If non-NULL, the array of filters must remain valid at least until the callback is invoked.
+--
+--     * @'sDL_PROP_FILE_DIALOG_NFILTERS_NUMBER'@: the number of filters in the array of filters, if it exists.
+--
+--     * @'sDL_PROP_FILE_DIALOG_WINDOW_POINTER'@: the window that the dialog should be modal for.
+--
+--     * @'sDL_PROP_FILE_DIALOG_LOCATION_STRING'@: the default folder or file to start the dialog at.
+--
+--     * @'sDL_PROP_FILE_DIALOG_MANY_BOOLEAN'@: true to allow the user to select more than one entry.
+--
+--     * @'sDL_PROP_FILE_DIALOG_TITLE_STRING'@: the title for the dialog.
+--
+--     * @'sDL_PROP_FILE_DIALOG_ACCEPT_STRING'@: the label that the accept button should have.
+--
+--     * @'sDL_PROP_FILE_DIALOG_CANCEL_STRING'@: the label that the cancel button should have.
+--
+--     Note that each platform may or may not support any of the properties.
+--
+--     [@type@]: the type of file dialog.
+--
+--     [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+--
+--     [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+--
+--     [@props@]: the properties to use.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_FileDialogType', 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'sDL_ShowOpenFileDialog', 'sDL_ShowSaveFileDialog', 'sDL_ShowOpenFolderDialog'
+--
+--     [C declaration]: @SDL_ShowFileDialogWithProperties@, defined at @SDL3\/SDL_dialog.h 326:34@
+sDL_ShowFileDialogWithProperties
+  :: BG.FunPtr
+       ( SDL_FileDialogType
+         -> SDL_DialogFileCallback
+         -> BG.Ptr BG.Void
+         -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+         -> IO ()
+       )
+sDL_ShowFileDialogWithProperties =
+  BG.unsafePerformIO hs_bindgen_f3b5f0c530765109
diff --git a/src/SDL3/Sys/Bindgen/Dialog/Safe.hs b/src/SDL3/Sys/Bindgen/Dialog/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Dialog/Safe.hs
@@ -0,0 +1,347 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Dialog.Safe (
+  SDL3.Sys.Bindgen.Dialog.Safe.sDL_ShowOpenFileDialog,
+  SDL3.Sys.Bindgen.Dialog.Safe.sDL_ShowSaveFileDialog,
+  SDL3.Sys.Bindgen.Dialog.Safe.sDL_ShowOpenFolderDialog,
+  SDL3.Sys.Bindgen.Dialog.Safe.sDL_ShowFileDialogWithProperties,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Dialog
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_dialog.h>"
+         , "void hs_bindgen_bb279e07edff0c05 ("
+         , "  SDL_DialogFileCallback arg1,"
+         , "  void *arg2,"
+         , "  SDL_Window *arg3,"
+         , "  SDL_DialogFileFilter const *arg4,"
+         , "  signed int arg5,"
+         , "  char const *arg6,"
+         , "  _Bool arg7"
+         , ")"
+         , "{"
+         , "  (SDL_ShowOpenFileDialog)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "void hs_bindgen_5f9b8c9a23decdee ("
+         , "  SDL_DialogFileCallback arg1,"
+         , "  void *arg2,"
+         , "  SDL_Window *arg3,"
+         , "  SDL_DialogFileFilter const *arg4,"
+         , "  signed int arg5,"
+         , "  char const *arg6"
+         , ")"
+         , "{"
+         , "  (SDL_ShowSaveFileDialog)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "void hs_bindgen_ed60a60f5fbee19e ("
+         , "  SDL_DialogFileCallback arg1,"
+         , "  void *arg2,"
+         , "  SDL_Window *arg3,"
+         , "  char const *arg4,"
+         , "  _Bool arg5"
+         , ")"
+         , "{"
+         , "  (SDL_ShowOpenFolderDialog)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_af795bc446bca49d ("
+         , "  SDL_FileDialogType arg1,"
+         , "  SDL_DialogFileCallback arg2,"
+         , "  void *arg3,"
+         , "  SDL_PropertiesID arg4"
+         , ")"
+         , "{"
+         , "  (SDL_ShowFileDialogWithProperties)(arg1, arg2, arg3, arg4);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Safe_SDL_ShowOpenFileDialog@
+foreign import ccall safe "hs_bindgen_bb279e07edff0c05"
+  hs_bindgen_bb279e07edff0c05_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Safe_SDL_ShowOpenFileDialog@
+hs_bindgen_bb279e07edff0c05
+  :: SDL_DialogFileCallback
+  -> BG.Ptr BG.Void
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> PtrConst.PtrConst SDL_DialogFileFilter
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_bb279e07edff0c05 =
+  BG.fromFFIType hs_bindgen_bb279e07edff0c05_base
+
+-- | Displays a dialog that lets the user select a file on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     Depending on the platform, the user may be allowed to input paths that don\'t yet exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to SDL_PumpEvents in their main loop.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'sDL_ShowSaveFileDialog', 'sDL_ShowOpenFolderDialog', 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @SDL_ShowOpenFileDialog@, defined at @SDL3\/SDL_dialog.h 166:34@
+sDL_ShowOpenFileDialog
+  :: SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+  -> PtrConst.PtrConst SDL_DialogFileFilter
+  -- ^
+  --
+  --           [@filters@]: a list of filters, may be NULL. See the [@SDL_DialogFileFilter@](SDL_DialogFileFilter#code-examples) documentation for examples]. Not all platforms support this option, and platforms that do support it may allow the user to ignore the filters. If non-NULL, it must remain valid at least until the callback is invoked.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@nfilters@]: the number of filters. Ignored if filters is NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@allow_many@]: if non-zero, the user will be allowed to select multiple entries. Not all platforms support this option.
+  -> IO ()
+sDL_ShowOpenFileDialog = hs_bindgen_bb279e07edff0c05
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Safe_SDL_ShowSaveFileDialog@
+foreign import ccall safe "hs_bindgen_5f9b8c9a23decdee"
+  hs_bindgen_5f9b8c9a23decdee_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Safe_SDL_ShowSaveFileDialog@
+hs_bindgen_5f9b8c9a23decdee
+  :: SDL_DialogFileCallback
+  -> BG.Ptr BG.Void
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> PtrConst.PtrConst SDL_DialogFileFilter
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_5f9b8c9a23decdee =
+  BG.fromFFIType hs_bindgen_5f9b8c9a23decdee_base
+
+-- | Displays a dialog that lets the user choose a new or existing file on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     The chosen file may or may not already exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to SDL_PumpEvents in their main loop.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'sDL_ShowOpenFileDialog', 'sDL_ShowOpenFolderDialog', 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @SDL_ShowSaveFileDialog@, defined at @SDL3\/SDL_dialog.h 215:34@
+sDL_ShowSaveFileDialog
+  :: SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+  -> PtrConst.PtrConst SDL_DialogFileFilter
+  -- ^
+  --
+  --           [@filters@]: a list of filters, may be NULL. Not all platforms support this option, and platforms that do support it may allow the user to ignore the filters. If non-NULL, it must remain valid at least until the callback is invoked.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@nfilters@]: the number of filters. Ignored if filters is NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+  -> IO ()
+sDL_ShowSaveFileDialog = hs_bindgen_5f9b8c9a23decdee
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Safe_SDL_ShowOpenFolderDialog@
+foreign import ccall safe "hs_bindgen_ed60a60f5fbee19e"
+  hs_bindgen_ed60a60f5fbee19e_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Safe_SDL_ShowOpenFolderDialog@
+hs_bindgen_ed60a60f5fbee19e
+  :: SDL_DialogFileCallback
+  -> BG.Ptr BG.Void
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_ed60a60f5fbee19e =
+  BG.fromFFIType hs_bindgen_ed60a60f5fbee19e_base
+
+-- | Displays a dialog that lets the user select a folder on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     Depending on the platform, the user may be allowed to input paths that don\'t yet exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to SDL_PumpEvents in their main loop.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'sDL_ShowOpenFileDialog', 'sDL_ShowSaveFileDialog', 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @SDL_ShowOpenFolderDialog@, defined at @SDL3\/SDL_dialog.h 260:34@
+sDL_ShowOpenFolderDialog
+  :: SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@allow_many@]: if non-zero, the user will be allowed to select multiple entries. Not all platforms support this option.
+  -> IO ()
+sDL_ShowOpenFolderDialog =
+  hs_bindgen_ed60a60f5fbee19e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Safe_SDL_ShowFileDialogWithProperties@
+foreign import ccall safe "hs_bindgen_af795bc446bca49d"
+  hs_bindgen_af795bc446bca49d_base
+    :: BG.Word32
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Safe_SDL_ShowFileDialogWithProperties@
+hs_bindgen_af795bc446bca49d
+  :: SDL_FileDialogType
+  -> SDL_DialogFileCallback
+  -> BG.Ptr BG.Void
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO ()
+hs_bindgen_af795bc446bca49d =
+  BG.fromFFIType hs_bindgen_af795bc446bca49d_base
+
+-- | Create and launch a file dialog with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_FILE_DIALOG_FILTERS_POINTER'@: a pointer to a list of 'SDL_DialogFileFilter' structs, which will be used as filters for file-based selections. Ignored if the dialog is an \"Open Folder\" dialog. If non-NULL, the array of filters must remain valid at least until the callback is invoked.
+--
+--     * @'sDL_PROP_FILE_DIALOG_NFILTERS_NUMBER'@: the number of filters in the array of filters, if it exists.
+--
+--     * @'sDL_PROP_FILE_DIALOG_WINDOW_POINTER'@: the window that the dialog should be modal for.
+--
+--     * @'sDL_PROP_FILE_DIALOG_LOCATION_STRING'@: the default folder or file to start the dialog at.
+--
+--     * @'sDL_PROP_FILE_DIALOG_MANY_BOOLEAN'@: true to allow the user to select more than one entry.
+--
+--     * @'sDL_PROP_FILE_DIALOG_TITLE_STRING'@: the title for the dialog.
+--
+--     * @'sDL_PROP_FILE_DIALOG_ACCEPT_STRING'@: the label that the accept button should have.
+--
+--     * @'sDL_PROP_FILE_DIALOG_CANCEL_STRING'@: the label that the cancel button should have.
+--
+--     Note that each platform may or may not support any of the properties.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_FileDialogType', 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'sDL_ShowOpenFileDialog', 'sDL_ShowSaveFileDialog', 'sDL_ShowOpenFolderDialog'
+--
+--     [C declaration]: @SDL_ShowFileDialogWithProperties@, defined at @SDL3\/SDL_dialog.h 326:34@
+sDL_ShowFileDialogWithProperties
+  :: SDL_FileDialogType
+  -- ^
+  --
+  --           [@type@]: the type of file dialog.
+  -> SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO ()
+sDL_ShowFileDialogWithProperties =
+  hs_bindgen_af795bc446bca49d
diff --git a/src/SDL3/Sys/Bindgen/Dialog/Unsafe.hs b/src/SDL3/Sys/Bindgen/Dialog/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Dialog/Unsafe.hs
@@ -0,0 +1,347 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Dialog.Unsafe (
+  SDL3.Sys.Bindgen.Dialog.Unsafe.sDL_ShowOpenFileDialog,
+  SDL3.Sys.Bindgen.Dialog.Unsafe.sDL_ShowSaveFileDialog,
+  SDL3.Sys.Bindgen.Dialog.Unsafe.sDL_ShowOpenFolderDialog,
+  SDL3.Sys.Bindgen.Dialog.Unsafe.sDL_ShowFileDialogWithProperties,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Dialog
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_dialog.h>"
+         , "void hs_bindgen_fda0993ea7af1749 ("
+         , "  SDL_DialogFileCallback arg1,"
+         , "  void *arg2,"
+         , "  SDL_Window *arg3,"
+         , "  SDL_DialogFileFilter const *arg4,"
+         , "  signed int arg5,"
+         , "  char const *arg6,"
+         , "  _Bool arg7"
+         , ")"
+         , "{"
+         , "  (SDL_ShowOpenFileDialog)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "void hs_bindgen_d0854a0f4506ac27 ("
+         , "  SDL_DialogFileCallback arg1,"
+         , "  void *arg2,"
+         , "  SDL_Window *arg3,"
+         , "  SDL_DialogFileFilter const *arg4,"
+         , "  signed int arg5,"
+         , "  char const *arg6"
+         , ")"
+         , "{"
+         , "  (SDL_ShowSaveFileDialog)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "void hs_bindgen_ff283a0c567ee6a6 ("
+         , "  SDL_DialogFileCallback arg1,"
+         , "  void *arg2,"
+         , "  SDL_Window *arg3,"
+         , "  char const *arg4,"
+         , "  _Bool arg5"
+         , ")"
+         , "{"
+         , "  (SDL_ShowOpenFolderDialog)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_18ab411c9e9de6d3 ("
+         , "  SDL_FileDialogType arg1,"
+         , "  SDL_DialogFileCallback arg2,"
+         , "  void *arg3,"
+         , "  SDL_PropertiesID arg4"
+         , ")"
+         , "{"
+         , "  (SDL_ShowFileDialogWithProperties)(arg1, arg2, arg3, arg4);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Unsafe_SDL_ShowOpenFileDialog@
+foreign import ccall unsafe "hs_bindgen_fda0993ea7af1749"
+  hs_bindgen_fda0993ea7af1749_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Unsafe_SDL_ShowOpenFileDialog@
+hs_bindgen_fda0993ea7af1749
+  :: SDL_DialogFileCallback
+  -> BG.Ptr BG.Void
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> PtrConst.PtrConst SDL_DialogFileFilter
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_fda0993ea7af1749 =
+  BG.fromFFIType hs_bindgen_fda0993ea7af1749_base
+
+-- | Displays a dialog that lets the user select a file on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     Depending on the platform, the user may be allowed to input paths that don\'t yet exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to SDL_PumpEvents in their main loop.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'sDL_ShowSaveFileDialog', 'sDL_ShowOpenFolderDialog', 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @SDL_ShowOpenFileDialog@, defined at @SDL3\/SDL_dialog.h 166:34@
+sDL_ShowOpenFileDialog
+  :: SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+  -> PtrConst.PtrConst SDL_DialogFileFilter
+  -- ^
+  --
+  --           [@filters@]: a list of filters, may be NULL. See the [@SDL_DialogFileFilter@](SDL_DialogFileFilter#code-examples) documentation for examples]. Not all platforms support this option, and platforms that do support it may allow the user to ignore the filters. If non-NULL, it must remain valid at least until the callback is invoked.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@nfilters@]: the number of filters. Ignored if filters is NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@allow_many@]: if non-zero, the user will be allowed to select multiple entries. Not all platforms support this option.
+  -> IO ()
+sDL_ShowOpenFileDialog = hs_bindgen_fda0993ea7af1749
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Unsafe_SDL_ShowSaveFileDialog@
+foreign import ccall unsafe "hs_bindgen_d0854a0f4506ac27"
+  hs_bindgen_d0854a0f4506ac27_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Unsafe_SDL_ShowSaveFileDialog@
+hs_bindgen_d0854a0f4506ac27
+  :: SDL_DialogFileCallback
+  -> BG.Ptr BG.Void
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> PtrConst.PtrConst SDL_DialogFileFilter
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_d0854a0f4506ac27 =
+  BG.fromFFIType hs_bindgen_d0854a0f4506ac27_base
+
+-- | Displays a dialog that lets the user choose a new or existing file on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     The chosen file may or may not already exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to SDL_PumpEvents in their main loop.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'sDL_ShowOpenFileDialog', 'sDL_ShowOpenFolderDialog', 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @SDL_ShowSaveFileDialog@, defined at @SDL3\/SDL_dialog.h 215:34@
+sDL_ShowSaveFileDialog
+  :: SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+  -> PtrConst.PtrConst SDL_DialogFileFilter
+  -- ^
+  --
+  --           [@filters@]: a list of filters, may be NULL. Not all platforms support this option, and platforms that do support it may allow the user to ignore the filters. If non-NULL, it must remain valid at least until the callback is invoked.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@nfilters@]: the number of filters. Ignored if filters is NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+  -> IO ()
+sDL_ShowSaveFileDialog = hs_bindgen_d0854a0f4506ac27
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Unsafe_SDL_ShowOpenFolderDialog@
+foreign import ccall unsafe "hs_bindgen_ff283a0c567ee6a6"
+  hs_bindgen_ff283a0c567ee6a6_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Unsafe_SDL_ShowOpenFolderDialog@
+hs_bindgen_ff283a0c567ee6a6
+  :: SDL_DialogFileCallback
+  -> BG.Ptr BG.Void
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_ff283a0c567ee6a6 =
+  BG.fromFFIType hs_bindgen_ff283a0c567ee6a6_base
+
+-- | Displays a dialog that lets the user select a folder on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     Depending on the platform, the user may be allowed to input paths that don\'t yet exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to SDL_PumpEvents in their main loop.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'sDL_ShowOpenFileDialog', 'sDL_ShowSaveFileDialog', 'sDL_ShowFileDialogWithProperties'
+--
+--     [C declaration]: @SDL_ShowOpenFolderDialog@, defined at @SDL3\/SDL_dialog.h 260:34@
+sDL_ShowOpenFolderDialog
+  :: SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@allow_many@]: if non-zero, the user will be allowed to select multiple entries. Not all platforms support this option.
+  -> IO ()
+sDL_ShowOpenFolderDialog =
+  hs_bindgen_ff283a0c567ee6a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Unsafe_SDL_ShowFileDialogWithProperties@
+foreign import ccall unsafe "hs_bindgen_18ab411c9e9de6d3"
+  hs_bindgen_18ab411c9e9de6d3_base
+    :: BG.Word32
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Dialog_Unsafe_SDL_ShowFileDialogWithProperties@
+hs_bindgen_18ab411c9e9de6d3
+  :: SDL_FileDialogType
+  -> SDL_DialogFileCallback
+  -> BG.Ptr BG.Void
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO ()
+hs_bindgen_18ab411c9e9de6d3 =
+  BG.fromFFIType hs_bindgen_18ab411c9e9de6d3_base
+
+-- | Create and launch a file dialog with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_FILE_DIALOG_FILTERS_POINTER'@: a pointer to a list of 'SDL_DialogFileFilter' structs, which will be used as filters for file-based selections. Ignored if the dialog is an \"Open Folder\" dialog. If non-NULL, the array of filters must remain valid at least until the callback is invoked.
+--
+--     * @'sDL_PROP_FILE_DIALOG_NFILTERS_NUMBER'@: the number of filters in the array of filters, if it exists.
+--
+--     * @'sDL_PROP_FILE_DIALOG_WINDOW_POINTER'@: the window that the dialog should be modal for.
+--
+--     * @'sDL_PROP_FILE_DIALOG_LOCATION_STRING'@: the default folder or file to start the dialog at.
+--
+--     * @'sDL_PROP_FILE_DIALOG_MANY_BOOLEAN'@: true to allow the user to select more than one entry.
+--
+--     * @'sDL_PROP_FILE_DIALOG_TITLE_STRING'@: the title for the dialog.
+--
+--     * @'sDL_PROP_FILE_DIALOG_ACCEPT_STRING'@: the label that the accept button should have.
+--
+--     * @'sDL_PROP_FILE_DIALOG_CANCEL_STRING'@: the label that the cancel button should have.
+--
+--     Note that each platform may or may not support any of the properties.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_FileDialogType', 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'sDL_ShowOpenFileDialog', 'sDL_ShowSaveFileDialog', 'sDL_ShowOpenFolderDialog'
+--
+--     [C declaration]: @SDL_ShowFileDialogWithProperties@, defined at @SDL3\/SDL_dialog.h 326:34@
+sDL_ShowFileDialogWithProperties
+  :: SDL_FileDialogType
+  -- ^
+  --
+  --           [@type@]: the type of file dialog.
+  -> SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO ()
+sDL_ShowFileDialogWithProperties =
+  hs_bindgen_18ab411c9e9de6d3
diff --git a/src/SDL3/Sys/Bindgen/Dlopennote.hs b/src/SDL3/Sys/Bindgen/Dlopennote.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Dlopennote.hs
@@ -0,0 +1,73 @@
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | This header allows you to annotate your code so external tools know about dynamic shared library dependencies.
+--
+--     If you determine that your toolchain doesn\'t support dlopen notes, you can disable this feature by defining @SDL_DISABLE_DLOPEN_NOTES@. You can use this CMake snippet to check for support:
+--
+--     Use this macro with @SDL_ELF_NOTE_DLOPEN()@ to note that a dynamic shared library dependency is optional.
+--
+--     @
+--     include(CheckCSourceCompiles)
+--     find_package(SDL3 REQUIRED CONFIG COMPONENTS Headers)
+--     list(APPEND CMAKE_REQUIRED_LIBRARIES SDL3::Headers)
+--     check_c_source_compiles([==[
+--       \#include \<SDL3\/SDL_dlopennote.h>
+--       SDL_ELF_NOTE_DLOPEN(\"sdl-video\",
+--         \"Support for video through SDL\",
+--         SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED,
+--         \"libSDL-1.2.so.0\", \"libSDL-2.0.so.0\", \"libSDL3.so.0\"
+--       )
+--       int main(int argc, char *argv[]) {
+--         return argc + argv[0][1];
+--       }
+--     ]==] COMPILER_SUPPORTS_SDL_ELF_NOTE_DLOPEN)
+--     if(NOT COMPILER_SUPPORTS_SDL_ELF_NOTE_DLOPEN)
+--       add_compile_definitions(-DSDL_DISABLE_DLOPEN_NOTE)
+--     endif()
+--     @
+--
+--     Optional functionality uses the dependency, the binary will work and the dependency is only needed for full-featured installations.
+--
+--     @since 3.4.0
+--
+--     [See also]: @SDL_ELF_NOTE_DLOPEN@, 'sDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED', 'sDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED'
+module SDL3.Sys.Bindgen.Dlopennote (
+  SDL3.Sys.Bindgen.Dlopennote.sDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED,
+  SDL3.Sys.Bindgen.Dlopennote.sDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED,
+  SDL3.Sys.Bindgen.Dlopennote.sDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+
+-- | [C declaration]: @macro SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED@, literal @\"suggested\"@, defined at @SDL3\/SDL_dlopennote.h 71:9@
+sDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED :: BG.ByteString
+sDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED =
+  BG.pack [0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64]
+
+-- | Use this macro with @SDL_ELF_NOTE_DLOPEN()@ to note that a dynamic shared library dependency is recommended.
+--
+--     Important functionality needs the dependency, the binary will work but in most cases the dependency should be provided.
+--
+--     @since 3.4.0
+--
+--     [See also]: @SDL_ELF_NOTE_DLOPEN@, 'sDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED', 'sDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED'
+--
+--     [C declaration]: @macro SDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED@, literal @\"recommended\"@, defined at @SDL3\/SDL_dlopennote.h 86:9@
+sDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED :: BG.ByteString
+sDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED =
+  BG.pack [0x72, 0x65, 0x63, 0x6F, 0x6D, 0x6D, 0x65, 0x6E, 0x64, 0x65, 0x64]
+
+-- | Use this macro with @SDL_ELF_NOTE_DLOPEN()@ to note that a dynamic shared library dependency is required.
+--
+--     Core functionality needs the dependency, the binary will not work if it cannot be found.
+--
+--     @since 3.4.0
+--
+--     [See also]: @SDL_ELF_NOTE_DLOPEN@, 'sDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED', 'sDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED'
+--
+--     [C declaration]: @macro SDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED@, literal @\"required\"@, defined at @SDL3\/SDL_dlopennote.h 101:9@
+sDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED :: BG.ByteString
+sDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED =
+  BG.pack [0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64]
diff --git a/src/SDL3/Sys/Bindgen/Endian.hs b/src/SDL3/Sys/Bindgen/Endian.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Endian.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+module SDL3.Sys.Bindgen.Endian (
+  SDL3.Sys.Bindgen.Endian.sDL_LIL_ENDIAN,
+  SDL3.Sys.Bindgen.Endian.sDL_BIG_ENDIAN,
+  SDL3.Sys.Bindgen.Endian.sDL_Swap16LE,
+  SDL3.Sys.Bindgen.Endian.sDL_Swap32LE,
+  SDL3.Sys.Bindgen.Endian.sDL_Swap64LE,
+  SDL3.Sys.Bindgen.Endian.sDL_SwapFloatLE,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+
+-- | A value to represent littleendian byteorder.
+--
+--     This is used with the preprocessor macro SDL_BYTEORDER, to determine a platform\'s byte ordering:
+--
+--     @
+--     \#if SDL_BYTEORDER == SDL_LIL_ENDIAN
+--     SDL_Log(\"This system is littleendian.\");
+--     \#endif
+--     @
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BYTEORDER', 'sDL_BIG_ENDIAN'
+--
+--     [C declaration]: @macro SDL_LIL_ENDIAN@, defined at @SDL3\/SDL_endian.h 86:9@
+sDL_LIL_ENDIAN :: BG.CInt
+sDL_LIL_ENDIAN = (1234 :: BG.CInt)
+
+-- | A value to represent bigendian byteorder.
+--
+--     This is used with the preprocessor macro SDL_BYTEORDER, to determine a platform\'s byte ordering:
+--
+--     @
+--     \#if SDL_BYTEORDER == SDL_BIG_ENDIAN
+--     SDL_Log(\"This system is bigendian.\");
+--     \#endif
+--     @
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BYTEORDER', 'sDL_LIL_ENDIAN'
+--
+--     [C declaration]: @macro SDL_BIG_ENDIAN@, defined at @SDL3\/SDL_endian.h 105:9@
+sDL_BIG_ENDIAN :: BG.CInt
+sDL_BIG_ENDIAN = (4321 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_Swap16LE@, defined at @SDL3\/SDL_endian.h 620:9@
+sDL_Swap16LE :: forall a0. a0 -> a0
+sDL_Swap16LE = \x0 -> x0
+
+-- | [C declaration]: @macro SDL_Swap32LE@, defined at @SDL3\/SDL_endian.h 621:9@
+sDL_Swap32LE :: forall a0. a0 -> a0
+sDL_Swap32LE = \x0 -> x0
+
+-- | [C declaration]: @macro SDL_Swap64LE@, defined at @SDL3\/SDL_endian.h 622:9@
+sDL_Swap64LE :: forall a0. a0 -> a0
+sDL_Swap64LE = \x0 -> x0
+
+-- | [C declaration]: @macro SDL_SwapFloatLE@, defined at @SDL3\/SDL_endian.h 623:9@
+sDL_SwapFloatLE :: forall a0. a0 -> a0
+sDL_SwapFloatLE = \x0 -> x0
diff --git a/src/SDL3/Sys/Bindgen/Endian/FunPtr.hs b/src/SDL3/Sys/Bindgen/Endian/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Endian/FunPtr.hs
@@ -0,0 +1,57 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Endian.FunPtr (
+  SDL3.Sys.Bindgen.Endian.FunPtr.sDL_SwapFloat,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_endian.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Endian_get_SDL_SwapFloat */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_a0e501e24aab59b4 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SwapFloat;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Endian_get_SDL_SwapFloat@
+foreign import ccall unsafe "hs_bindgen_a0e501e24aab59b4"
+  hs_bindgen_a0e501e24aab59b4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Endian_get_SDL_SwapFloat@
+hs_bindgen_a0e501e24aab59b4 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_a0e501e24aab59b4 =
+  BG.fromFFIType hs_bindgen_a0e501e24aab59b4_base
+
+{-# NOINLINE sDL_SwapFloat #-}
+
+-- | Byte-swap a floating point number.
+--
+--     This will always byte-swap the value, whether it\'s currently in the native byteorder of the system or not. You should use SDL_SwapFloatLE or SDL_SwapFloatBE instead, in most cases.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [@x@]: the value to byte-swap.
+--
+--     [Returns]: x, with its bytes in the opposite endian order.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SwapFloat@, defined at @SDL3\/SDL_endian.h 408:24@
+sDL_SwapFloat :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_SwapFloat =
+  BG.unsafePerformIO hs_bindgen_a0e501e24aab59b4
diff --git a/src/SDL3/Sys/Bindgen/Endian/Safe.hs b/src/SDL3/Sys/Bindgen/Endian/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Endian/Safe.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Endian.Safe (
+  SDL3.Sys.Bindgen.Endian.Safe.sDL_SwapFloat,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_endian.h>"
+         , "float hs_bindgen_3b15c524a04a103e ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SwapFloat)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Endian_Safe_SDL_SwapFloat@
+foreign import ccall safe "hs_bindgen_3b15c524a04a103e"
+  hs_bindgen_3b15c524a04a103e_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Endian_Safe_SDL_SwapFloat@
+hs_bindgen_3b15c524a04a103e
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_3b15c524a04a103e =
+  BG.fromFFIType hs_bindgen_3b15c524a04a103e_base
+
+-- | Byte-swap a floating point number.
+--
+--     This will always byte-swap the value, whether it\'s currently in the native byteorder of the system or not. You should use SDL_SwapFloatLE or SDL_SwapFloatBE instead, in most cases.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: x, with its bytes in the opposite endian order.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SwapFloat@, defined at @SDL3\/SDL_endian.h 408:24@
+sDL_SwapFloat
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the value to byte-swap.
+  -> IO BG.CFloat
+sDL_SwapFloat = hs_bindgen_3b15c524a04a103e
diff --git a/src/SDL3/Sys/Bindgen/Endian/Unsafe.hs b/src/SDL3/Sys/Bindgen/Endian/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Endian/Unsafe.hs
@@ -0,0 +1,58 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Endian.Unsafe (
+  SDL3.Sys.Bindgen.Endian.Unsafe.sDL_SwapFloat,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_endian.h>"
+         , "float hs_bindgen_0b945d9b61dbd23c ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SwapFloat)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Endian_Unsafe_SDL_SwapFloat@
+foreign import ccall unsafe "hs_bindgen_0b945d9b61dbd23c"
+  hs_bindgen_0b945d9b61dbd23c_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Endian_Unsafe_SDL_SwapFloat@
+hs_bindgen_0b945d9b61dbd23c
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_0b945d9b61dbd23c =
+  BG.fromFFIType hs_bindgen_0b945d9b61dbd23c_base
+
+-- | Byte-swap a floating point number.
+--
+--     This will always byte-swap the value, whether it\'s currently in the native byteorder of the system or not. You should use SDL_SwapFloatLE or SDL_SwapFloatBE instead, in most cases.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: x, with its bytes in the opposite endian order.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SwapFloat@, defined at @SDL3\/SDL_endian.h 408:24@
+sDL_SwapFloat
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the value to byte-swap.
+  -> IO BG.CFloat
+sDL_SwapFloat = hs_bindgen_0b945d9b61dbd23c
diff --git a/src/SDL3/Sys/Bindgen/Error/FunPtr.hs b/src/SDL3/Sys/Bindgen/Error/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Error/FunPtr.hs
@@ -0,0 +1,130 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Error.FunPtr (
+  SDL3.Sys.Bindgen.Error.FunPtr.sDL_OutOfMemory,
+  SDL3.Sys.Bindgen.Error.FunPtr.sDL_GetError,
+  SDL3.Sys.Bindgen.Error.FunPtr.sDL_ClearError,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Error_get_SDL_OutOfMemory */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c1c2f6095b18fb13 (void)) (void)"
+         , "{"
+         , "  return &SDL_OutOfMemory;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Error_get_SDL_GetError */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_030d67d7c033781b (void)) (void)"
+         , "{"
+         , "  return &SDL_GetError;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Error_get_SDL_ClearError */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_000d9156b04d2f47 (void)) (void)"
+         , "{"
+         , "  return &SDL_ClearError;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_get_SDL_OutOfMemory@
+foreign import ccall unsafe "hs_bindgen_c1c2f6095b18fb13"
+  hs_bindgen_c1c2f6095b18fb13_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_get_SDL_OutOfMemory@
+hs_bindgen_c1c2f6095b18fb13 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_c1c2f6095b18fb13 =
+  BG.fromFFIType hs_bindgen_c1c2f6095b18fb13_base
+
+{-# NOINLINE sDL_OutOfMemory #-}
+
+-- | Set an error indicating that memory allocation failed.
+--
+--     This function does not do any memory allocation.
+--
+--     [Returns]: false.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OutOfMemory@, defined at @SDL3\/SDL_error.h 121:34@
+sDL_OutOfMemory :: BG.FunPtr (IO BG.CBool)
+sDL_OutOfMemory =
+  BG.unsafePerformIO hs_bindgen_c1c2f6095b18fb13
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_get_SDL_GetError@
+foreign import ccall unsafe "hs_bindgen_030d67d7c033781b"
+  hs_bindgen_030d67d7c033781b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_get_SDL_GetError@
+hs_bindgen_030d67d7c033781b :: IO (BG.FunPtr (IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_030d67d7c033781b =
+  BG.fromFFIType hs_bindgen_030d67d7c033781b_base
+
+{-# NOINLINE sDL_GetError #-}
+
+-- | Retrieve a message about the last error that occurred on the current thread.
+--
+--     It is possible for multiple errors to occur before calling @SDL_GetError()@. Only the last error is returned.
+--
+--     The message is only applicable when an SDL function has signaled an error. You must check the return values of SDL function calls to determine when to appropriately call @SDL_GetError()@. You should /not/ use the results of @SDL_GetError()@ to decide if an error has occurred! Sometimes SDL will set an error string even when reporting success.
+--
+--     SDL will /not/ clear the error string for successful API calls. You /must/ check return values for failure cases before you can assume the error string applies.
+--
+--     Error strings are set per-thread, so an error set in a different thread will not interfere with the current thread\'s operation.
+--
+--     The returned value is a thread-local string which will remain valid until the current thread\'s error string is changed. The caller should make a copy if the value is needed after the next SDL API call.
+--
+--     [Returns]: a message with information about the specific error that occurred, or an empty string if there hasn\'t been an error message set since the last call to @SDL_ClearError()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearError', @SDL_SetError@
+--
+--     [C declaration]: @SDL_GetError@, defined at @SDL3\/SDL_error.h 158:42@
+sDL_GetError :: BG.FunPtr (IO (PtrConst.PtrConst BG.CChar))
+sDL_GetError =
+  BG.unsafePerformIO hs_bindgen_030d67d7c033781b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_get_SDL_ClearError@
+foreign import ccall unsafe "hs_bindgen_000d9156b04d2f47"
+  hs_bindgen_000d9156b04d2f47_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_get_SDL_ClearError@
+hs_bindgen_000d9156b04d2f47 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_000d9156b04d2f47 =
+  BG.fromFFIType hs_bindgen_000d9156b04d2f47_base
+
+{-# NOINLINE sDL_ClearError #-}
+
+-- | Clear any previous error message for this thread.
+--
+--     [Returns]: true.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetError', @SDL_SetError@
+--
+--     [C declaration]: @SDL_ClearError@, defined at @SDL3\/SDL_error.h 172:34@
+sDL_ClearError :: BG.FunPtr (IO BG.CBool)
+sDL_ClearError =
+  BG.unsafePerformIO hs_bindgen_000d9156b04d2f47
diff --git a/src/SDL3/Sys/Bindgen/Error/Safe.hs b/src/SDL3/Sys/Bindgen/Error/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Error/Safe.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Error.Safe (
+  SDL3.Sys.Bindgen.Error.Safe.sDL_OutOfMemory,
+  SDL3.Sys.Bindgen.Error.Safe.sDL_GetError,
+  SDL3.Sys.Bindgen.Error.Safe.sDL_ClearError,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_b76f69013e6d2cc4 (void)"
+         , "{"
+         , "  return (SDL_OutOfMemory)();"
+         , "}"
+         , "char const *hs_bindgen_af9c22d77d37c96f (void)"
+         , "{"
+         , "  return (SDL_GetError)();"
+         , "}"
+         , "_Bool hs_bindgen_ee4e13eee0d070cc (void)"
+         , "{"
+         , "  return (SDL_ClearError)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Safe_SDL_OutOfMemory@
+foreign import ccall safe "hs_bindgen_b76f69013e6d2cc4"
+  hs_bindgen_b76f69013e6d2cc4_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Safe_SDL_OutOfMemory@
+hs_bindgen_b76f69013e6d2cc4 :: IO BG.CBool
+hs_bindgen_b76f69013e6d2cc4 =
+  BG.fromFFIType hs_bindgen_b76f69013e6d2cc4_base
+
+-- | Set an error indicating that memory allocation failed.
+--
+--     This function does not do any memory allocation.
+--
+--     [Returns]: false.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OutOfMemory@, defined at @SDL3\/SDL_error.h 121:34@
+sDL_OutOfMemory :: IO BG.CBool
+sDL_OutOfMemory = hs_bindgen_b76f69013e6d2cc4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Safe_SDL_GetError@
+foreign import ccall safe "hs_bindgen_af9c22d77d37c96f"
+  hs_bindgen_af9c22d77d37c96f_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Safe_SDL_GetError@
+hs_bindgen_af9c22d77d37c96f :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_af9c22d77d37c96f =
+  BG.fromFFIType hs_bindgen_af9c22d77d37c96f_base
+
+-- | Retrieve a message about the last error that occurred on the current thread.
+--
+--     It is possible for multiple errors to occur before calling @SDL_GetError()@. Only the last error is returned.
+--
+--     The message is only applicable when an SDL function has signaled an error. You must check the return values of SDL function calls to determine when to appropriately call @SDL_GetError()@. You should /not/ use the results of @SDL_GetError()@ to decide if an error has occurred! Sometimes SDL will set an error string even when reporting success.
+--
+--     SDL will /not/ clear the error string for successful API calls. You /must/ check return values for failure cases before you can assume the error string applies.
+--
+--     Error strings are set per-thread, so an error set in a different thread will not interfere with the current thread\'s operation.
+--
+--     The returned value is a thread-local string which will remain valid until the current thread\'s error string is changed. The caller should make a copy if the value is needed after the next SDL API call.
+--
+--     [Returns]: a message with information about the specific error that occurred, or an empty string if there hasn\'t been an error message set since the last call to @SDL_ClearError()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearError', @SDL_SetError@
+--
+--     [C declaration]: @SDL_GetError@, defined at @SDL3\/SDL_error.h 158:42@
+sDL_GetError :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetError = hs_bindgen_af9c22d77d37c96f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Safe_SDL_ClearError@
+foreign import ccall safe "hs_bindgen_ee4e13eee0d070cc"
+  hs_bindgen_ee4e13eee0d070cc_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Safe_SDL_ClearError@
+hs_bindgen_ee4e13eee0d070cc :: IO BG.CBool
+hs_bindgen_ee4e13eee0d070cc =
+  BG.fromFFIType hs_bindgen_ee4e13eee0d070cc_base
+
+-- | Clear any previous error message for this thread.
+--
+--     [Returns]: true.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetError', @SDL_SetError@
+--
+--     [C declaration]: @SDL_ClearError@, defined at @SDL3\/SDL_error.h 172:34@
+sDL_ClearError :: IO BG.CBool
+sDL_ClearError = hs_bindgen_ee4e13eee0d070cc
diff --git a/src/SDL3/Sys/Bindgen/Error/Unsafe.hs b/src/SDL3/Sys/Bindgen/Error/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Error/Unsafe.hs
@@ -0,0 +1,115 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Error.Unsafe (
+  SDL3.Sys.Bindgen.Error.Unsafe.sDL_OutOfMemory,
+  SDL3.Sys.Bindgen.Error.Unsafe.sDL_GetError,
+  SDL3.Sys.Bindgen.Error.Unsafe.sDL_ClearError,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_bdcf7fcfe4f61e9a (void)"
+         , "{"
+         , "  return (SDL_OutOfMemory)();"
+         , "}"
+         , "char const *hs_bindgen_f0d75ef957ae5815 (void)"
+         , "{"
+         , "  return (SDL_GetError)();"
+         , "}"
+         , "_Bool hs_bindgen_c7e60181e6f1a240 (void)"
+         , "{"
+         , "  return (SDL_ClearError)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Unsafe_SDL_OutOfMemory@
+foreign import ccall unsafe "hs_bindgen_bdcf7fcfe4f61e9a"
+  hs_bindgen_bdcf7fcfe4f61e9a_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Unsafe_SDL_OutOfMemory@
+hs_bindgen_bdcf7fcfe4f61e9a :: IO BG.CBool
+hs_bindgen_bdcf7fcfe4f61e9a =
+  BG.fromFFIType hs_bindgen_bdcf7fcfe4f61e9a_base
+
+-- | Set an error indicating that memory allocation failed.
+--
+--     This function does not do any memory allocation.
+--
+--     [Returns]: false.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OutOfMemory@, defined at @SDL3\/SDL_error.h 121:34@
+sDL_OutOfMemory :: IO BG.CBool
+sDL_OutOfMemory = hs_bindgen_bdcf7fcfe4f61e9a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Unsafe_SDL_GetError@
+foreign import ccall unsafe "hs_bindgen_f0d75ef957ae5815"
+  hs_bindgen_f0d75ef957ae5815_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Unsafe_SDL_GetError@
+hs_bindgen_f0d75ef957ae5815 :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_f0d75ef957ae5815 =
+  BG.fromFFIType hs_bindgen_f0d75ef957ae5815_base
+
+-- | Retrieve a message about the last error that occurred on the current thread.
+--
+--     It is possible for multiple errors to occur before calling @SDL_GetError()@. Only the last error is returned.
+--
+--     The message is only applicable when an SDL function has signaled an error. You must check the return values of SDL function calls to determine when to appropriately call @SDL_GetError()@. You should /not/ use the results of @SDL_GetError()@ to decide if an error has occurred! Sometimes SDL will set an error string even when reporting success.
+--
+--     SDL will /not/ clear the error string for successful API calls. You /must/ check return values for failure cases before you can assume the error string applies.
+--
+--     Error strings are set per-thread, so an error set in a different thread will not interfere with the current thread\'s operation.
+--
+--     The returned value is a thread-local string which will remain valid until the current thread\'s error string is changed. The caller should make a copy if the value is needed after the next SDL API call.
+--
+--     [Returns]: a message with information about the specific error that occurred, or an empty string if there hasn\'t been an error message set since the last call to @SDL_ClearError()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClearError', @SDL_SetError@
+--
+--     [C declaration]: @SDL_GetError@, defined at @SDL3\/SDL_error.h 158:42@
+sDL_GetError :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetError = hs_bindgen_f0d75ef957ae5815
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Unsafe_SDL_ClearError@
+foreign import ccall unsafe "hs_bindgen_c7e60181e6f1a240"
+  hs_bindgen_c7e60181e6f1a240_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Error_Unsafe_SDL_ClearError@
+hs_bindgen_c7e60181e6f1a240 :: IO BG.CBool
+hs_bindgen_c7e60181e6f1a240 =
+  BG.fromFFIType hs_bindgen_c7e60181e6f1a240_base
+
+-- | Clear any previous error message for this thread.
+--
+--     [Returns]: true.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetError', @SDL_SetError@
+--
+--     [C declaration]: @SDL_ClearError@, defined at @SDL3\/SDL_error.h 172:34@
+sDL_ClearError :: IO BG.CBool
+sDL_ClearError = hs_bindgen_c7e60181e6f1a240
diff --git a/src/SDL3/Sys/Bindgen/Events.hs b/src/SDL3/Sys/Bindgen/Events.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Events.hs
@@ -0,0 +1,14678 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Event queue management.
+--
+--     It\'s extremely common often required that an app deal with SDL\'s event queue. Almost all useful information about interactions with the real world flow through here: the user interacting with the computer and app, hardware coming and going, the system changing in some way, etc.
+--
+--     An app generally takes a moment, perhaps at the start of a new frame, to examine any events that have occurred since the last time and process or ignore them. This is generally done by calling @SDL_PollEvent()@ in a loop until it returns false (or, if using the main callbacks, events are provided one at a time in calls to SDL_AppEvent() before the next call to SDL_AppIterate(); in this scenario, the app does not call @SDL_PollEvent()@ at all).
+--
+--     There is other forms of control, too: @SDL_PeepEvents()@ has more functionality at the cost of more complexity, and @SDL_WaitEvent()@ can block the process until something interesting happens, which might be beneficial for certain types of programs on low-power hardware. One may also call @SDL_AddEventWatch()@ to set a callback when new events arrive.
+--
+--     The app is free to generate their own events, too: SDL_PushEvent allows the app to put events onto the queue for later retrieval; SDL_RegisterEvents can guarantee that these events have a type that isn\'t in use by other parts of the system. The types of events that can be delivered.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Events (
+  SDL3.Sys.Bindgen.Events.SDL_EventType (..),
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_FIRST,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_QUIT,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_TERMINATING,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_LOW_MEMORY,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WILL_ENTER_BACKGROUND,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DID_ENTER_BACKGROUND,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WILL_ENTER_FOREGROUND,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DID_ENTER_FOREGROUND,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_LOCALE_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_SYSTEM_THEME_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DISPLAY_ORIENTATION,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DISPLAY_ADDED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DISPLAY_REMOVED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DISPLAY_MOVED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DISPLAY_FIRST,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DISPLAY_LAST,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_SHOWN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_HIDDEN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_EXPOSED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_MOVED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_RESIZED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_METAL_VIEW_RESIZED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_MINIMIZED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_MAXIMIZED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_RESTORED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_MOUSE_ENTER,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_MOUSE_LEAVE,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_FOCUS_GAINED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_FOCUS_LOST,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_CLOSE_REQUESTED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_HIT_TEST,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_ICCPROF_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_DISPLAY_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_SAFE_AREA_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_OCCLUDED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_ENTER_FULLSCREEN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_LEAVE_FULLSCREEN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_DESTROYED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_HDR_STATE_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_FIRST,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_WINDOW_LAST,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_KEY_DOWN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_KEY_UP,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_TEXT_EDITING,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_TEXT_INPUT,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_KEYMAP_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_KEYBOARD_ADDED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_KEYBOARD_REMOVED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_TEXT_EDITING_CANDIDATES,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_SCREEN_KEYBOARD_SHOWN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_SCREEN_KEYBOARD_HIDDEN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_MOUSE_MOTION,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_MOUSE_BUTTON_DOWN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_MOUSE_BUTTON_UP,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_MOUSE_WHEEL,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_MOUSE_ADDED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_MOUSE_REMOVED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_JOYSTICK_AXIS_MOTION,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_JOYSTICK_BALL_MOTION,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_JOYSTICK_HAT_MOTION,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_JOYSTICK_BUTTON_DOWN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_JOYSTICK_BUTTON_UP,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_JOYSTICK_ADDED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_JOYSTICK_REMOVED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_JOYSTICK_BATTERY_UPDATED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_JOYSTICK_UPDATE_COMPLETE,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_AXIS_MOTION,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_BUTTON_DOWN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_BUTTON_UP,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_ADDED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_REMOVED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_REMAPPED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_TOUCHPAD_UP,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_SENSOR_UPDATE,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_UPDATE_COMPLETE,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_FINGER_DOWN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_FINGER_UP,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_FINGER_MOTION,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_FINGER_CANCELED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PINCH_BEGIN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PINCH_UPDATE,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PINCH_END,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_CLIPBOARD_UPDATE,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DROP_FILE,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DROP_TEXT,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DROP_BEGIN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DROP_COMPLETE,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_DROP_POSITION,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_AUDIO_DEVICE_ADDED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_AUDIO_DEVICE_REMOVED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_SENSOR_UPDATE,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PEN_PROXIMITY_IN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PEN_PROXIMITY_OUT,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PEN_DOWN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PEN_UP,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PEN_BUTTON_DOWN,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PEN_BUTTON_UP,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PEN_MOTION,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PEN_AXIS,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_CAMERA_DEVICE_ADDED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_CAMERA_DEVICE_REMOVED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_CAMERA_DEVICE_APPROVED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_CAMERA_DEVICE_DENIED,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_RENDER_TARGETS_RESET,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_RENDER_DEVICE_RESET,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_RENDER_DEVICE_LOST,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PRIVATE0,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PRIVATE1,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PRIVATE2,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_PRIVATE3,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_POLL_SENTINEL,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_USER,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_LAST,
+  pattern SDL3.Sys.Bindgen.Events.SDL_EVENT_ENUM_PADDING,
+  SDL3.Sys.Bindgen.Events.SDL_CommonEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_DisplayEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_WindowEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_KeyboardDeviceEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_KeyboardEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_TextEditingEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_TextEditingCandidatesEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_TextInputEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_MouseDeviceEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_MouseMotionEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_MouseButtonEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_MouseWheelEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_JoyAxisEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_JoyBallEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_JoyHatEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_JoyButtonEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_JoyDeviceEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_JoyBatteryEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_GamepadAxisEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_GamepadButtonEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_GamepadDeviceEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_GamepadTouchpadEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_GamepadSensorEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_AudioDeviceEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_CameraDeviceEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_RenderEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_TouchFingerEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_PinchFingerEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_PenProximityEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_PenMotionEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_PenTouchEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_PenButtonEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_PenAxisEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_DropEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_ClipboardEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_SensorEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_QuitEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_UserEvent (..),
+  SDL3.Sys.Bindgen.Events.SDL_Event (..),
+  SDL3.Sys.Bindgen.Events.SDL_EventAction (..),
+  pattern SDL3.Sys.Bindgen.Events.SDL_ADDEVENT,
+  pattern SDL3.Sys.Bindgen.Events.SDL_PEEKEVENT,
+  pattern SDL3.Sys.Bindgen.Events.SDL_GETEVENT,
+  SDL3.Sys.Bindgen.Events.SDL_EventFilter_Aux (..),
+  SDL3.Sys.Bindgen.Events.SDL_EventFilter (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.ConstantArray qualified as CA
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import HsBindgen.Runtime.Union qualified as Union
+import SDL3.Sys.Bindgen.Audio qualified
+import SDL3.Sys.Bindgen.Camera qualified
+import SDL3.Sys.Bindgen.Joystick qualified
+import SDL3.Sys.Bindgen.Keyboard qualified
+import SDL3.Sys.Bindgen.Keycode qualified
+import SDL3.Sys.Bindgen.Mouse qualified
+import SDL3.Sys.Bindgen.Pen qualified
+import SDL3.Sys.Bindgen.Power qualified
+import SDL3.Sys.Bindgen.Scancode qualified
+import SDL3.Sys.Bindgen.Sensor qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Touch qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | [C declaration]: @enum SDL_EventType@, defined at @SDL3\/SDL_events.h 84:14@
+newtype SDL_EventType = SDL_EventType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_EventType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_EventType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_EventType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_EventType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_EventType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_EventType instance BG.Storable SDL_EventType
+
+deriving via BG.CUInt instance BG.Prim SDL_EventType
+
+instance CEnum.CEnum SDL_EventType where
+  type CEnumZ SDL_EventType = BG.CUInt
+
+  toCEnum = SDL_EventType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_EVENT_FIRST")
+        , (256, BG.singleton "SDL_EVENT_QUIT")
+        , (257, BG.singleton "SDL_EVENT_TERMINATING")
+        , (258, BG.singleton "SDL_EVENT_LOW_MEMORY")
+        , (259, BG.singleton "SDL_EVENT_WILL_ENTER_BACKGROUND")
+        , (260, BG.singleton "SDL_EVENT_DID_ENTER_BACKGROUND")
+        , (261, BG.singleton "SDL_EVENT_WILL_ENTER_FOREGROUND")
+        , (262, BG.singleton "SDL_EVENT_DID_ENTER_FOREGROUND")
+        , (263, BG.singleton "SDL_EVENT_LOCALE_CHANGED")
+        , (264, BG.singleton "SDL_EVENT_SYSTEM_THEME_CHANGED")
+        , (337, ("SDL_EVENT_DISPLAY_ORIENTATION" BG.:| ["SDL_EVENT_DISPLAY_FIRST"]))
+        , (338, BG.singleton "SDL_EVENT_DISPLAY_ADDED")
+        , (339, BG.singleton "SDL_EVENT_DISPLAY_REMOVED")
+        , (340, BG.singleton "SDL_EVENT_DISPLAY_MOVED")
+        , (341, BG.singleton "SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED")
+        , (342, BG.singleton "SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED")
+        , (343, BG.singleton "SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED")
+        ,
+          ( 344
+          , ("SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGED" BG.:| ["SDL_EVENT_DISPLAY_LAST"])
+          )
+        , (514, ("SDL_EVENT_WINDOW_SHOWN" BG.:| ["SDL_EVENT_WINDOW_FIRST"]))
+        , (515, BG.singleton "SDL_EVENT_WINDOW_HIDDEN")
+        , (516, BG.singleton "SDL_EVENT_WINDOW_EXPOSED")
+        , (517, BG.singleton "SDL_EVENT_WINDOW_MOVED")
+        , (518, BG.singleton "SDL_EVENT_WINDOW_RESIZED")
+        , (519, BG.singleton "SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED")
+        , (520, BG.singleton "SDL_EVENT_WINDOW_METAL_VIEW_RESIZED")
+        , (521, BG.singleton "SDL_EVENT_WINDOW_MINIMIZED")
+        , (522, BG.singleton "SDL_EVENT_WINDOW_MAXIMIZED")
+        , (523, BG.singleton "SDL_EVENT_WINDOW_RESTORED")
+        , (524, BG.singleton "SDL_EVENT_WINDOW_MOUSE_ENTER")
+        , (525, BG.singleton "SDL_EVENT_WINDOW_MOUSE_LEAVE")
+        , (526, BG.singleton "SDL_EVENT_WINDOW_FOCUS_GAINED")
+        , (527, BG.singleton "SDL_EVENT_WINDOW_FOCUS_LOST")
+        , (528, BG.singleton "SDL_EVENT_WINDOW_CLOSE_REQUESTED")
+        , (529, BG.singleton "SDL_EVENT_WINDOW_HIT_TEST")
+        , (530, BG.singleton "SDL_EVENT_WINDOW_ICCPROF_CHANGED")
+        , (531, BG.singleton "SDL_EVENT_WINDOW_DISPLAY_CHANGED")
+        , (532, BG.singleton "SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED")
+        , (533, BG.singleton "SDL_EVENT_WINDOW_SAFE_AREA_CHANGED")
+        , (534, BG.singleton "SDL_EVENT_WINDOW_OCCLUDED")
+        , (535, BG.singleton "SDL_EVENT_WINDOW_ENTER_FULLSCREEN")
+        , (536, BG.singleton "SDL_EVENT_WINDOW_LEAVE_FULLSCREEN")
+        , (537, BG.singleton "SDL_EVENT_WINDOW_DESTROYED")
+        , (538, ("SDL_EVENT_WINDOW_HDR_STATE_CHANGED" BG.:| ["SDL_EVENT_WINDOW_LAST"]))
+        , (768, BG.singleton "SDL_EVENT_KEY_DOWN")
+        , (769, BG.singleton "SDL_EVENT_KEY_UP")
+        , (770, BG.singleton "SDL_EVENT_TEXT_EDITING")
+        , (771, BG.singleton "SDL_EVENT_TEXT_INPUT")
+        , (772, BG.singleton "SDL_EVENT_KEYMAP_CHANGED")
+        , (773, BG.singleton "SDL_EVENT_KEYBOARD_ADDED")
+        , (774, BG.singleton "SDL_EVENT_KEYBOARD_REMOVED")
+        , (775, BG.singleton "SDL_EVENT_TEXT_EDITING_CANDIDATES")
+        , (776, BG.singleton "SDL_EVENT_SCREEN_KEYBOARD_SHOWN")
+        , (777, BG.singleton "SDL_EVENT_SCREEN_KEYBOARD_HIDDEN")
+        , (1024, BG.singleton "SDL_EVENT_MOUSE_MOTION")
+        , (1025, BG.singleton "SDL_EVENT_MOUSE_BUTTON_DOWN")
+        , (1026, BG.singleton "SDL_EVENT_MOUSE_BUTTON_UP")
+        , (1027, BG.singleton "SDL_EVENT_MOUSE_WHEEL")
+        , (1028, BG.singleton "SDL_EVENT_MOUSE_ADDED")
+        , (1029, BG.singleton "SDL_EVENT_MOUSE_REMOVED")
+        , (1536, BG.singleton "SDL_EVENT_JOYSTICK_AXIS_MOTION")
+        , (1537, BG.singleton "SDL_EVENT_JOYSTICK_BALL_MOTION")
+        , (1538, BG.singleton "SDL_EVENT_JOYSTICK_HAT_MOTION")
+        , (1539, BG.singleton "SDL_EVENT_JOYSTICK_BUTTON_DOWN")
+        , (1540, BG.singleton "SDL_EVENT_JOYSTICK_BUTTON_UP")
+        , (1541, BG.singleton "SDL_EVENT_JOYSTICK_ADDED")
+        , (1542, BG.singleton "SDL_EVENT_JOYSTICK_REMOVED")
+        , (1543, BG.singleton "SDL_EVENT_JOYSTICK_BATTERY_UPDATED")
+        , (1544, BG.singleton "SDL_EVENT_JOYSTICK_UPDATE_COMPLETE")
+        , (1616, BG.singleton "SDL_EVENT_GAMEPAD_AXIS_MOTION")
+        , (1617, BG.singleton "SDL_EVENT_GAMEPAD_BUTTON_DOWN")
+        , (1618, BG.singleton "SDL_EVENT_GAMEPAD_BUTTON_UP")
+        , (1619, BG.singleton "SDL_EVENT_GAMEPAD_ADDED")
+        , (1620, BG.singleton "SDL_EVENT_GAMEPAD_REMOVED")
+        , (1621, BG.singleton "SDL_EVENT_GAMEPAD_REMAPPED")
+        , (1622, BG.singleton "SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN")
+        , (1623, BG.singleton "SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION")
+        , (1624, BG.singleton "SDL_EVENT_GAMEPAD_TOUCHPAD_UP")
+        , (1625, BG.singleton "SDL_EVENT_GAMEPAD_SENSOR_UPDATE")
+        , (1626, BG.singleton "SDL_EVENT_GAMEPAD_UPDATE_COMPLETE")
+        , (1627, BG.singleton "SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED")
+        , (1792, BG.singleton "SDL_EVENT_FINGER_DOWN")
+        , (1793, BG.singleton "SDL_EVENT_FINGER_UP")
+        , (1794, BG.singleton "SDL_EVENT_FINGER_MOTION")
+        , (1795, BG.singleton "SDL_EVENT_FINGER_CANCELED")
+        , (1808, BG.singleton "SDL_EVENT_PINCH_BEGIN")
+        , (1809, BG.singleton "SDL_EVENT_PINCH_UPDATE")
+        , (1810, BG.singleton "SDL_EVENT_PINCH_END")
+        , (2304, BG.singleton "SDL_EVENT_CLIPBOARD_UPDATE")
+        , (4096, BG.singleton "SDL_EVENT_DROP_FILE")
+        , (4097, BG.singleton "SDL_EVENT_DROP_TEXT")
+        , (4098, BG.singleton "SDL_EVENT_DROP_BEGIN")
+        , (4099, BG.singleton "SDL_EVENT_DROP_COMPLETE")
+        , (4100, BG.singleton "SDL_EVENT_DROP_POSITION")
+        , (4352, BG.singleton "SDL_EVENT_AUDIO_DEVICE_ADDED")
+        , (4353, BG.singleton "SDL_EVENT_AUDIO_DEVICE_REMOVED")
+        , (4354, BG.singleton "SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED")
+        , (4608, BG.singleton "SDL_EVENT_SENSOR_UPDATE")
+        , (4864, BG.singleton "SDL_EVENT_PEN_PROXIMITY_IN")
+        , (4865, BG.singleton "SDL_EVENT_PEN_PROXIMITY_OUT")
+        , (4866, BG.singleton "SDL_EVENT_PEN_DOWN")
+        , (4867, BG.singleton "SDL_EVENT_PEN_UP")
+        , (4868, BG.singleton "SDL_EVENT_PEN_BUTTON_DOWN")
+        , (4869, BG.singleton "SDL_EVENT_PEN_BUTTON_UP")
+        , (4870, BG.singleton "SDL_EVENT_PEN_MOTION")
+        , (4871, BG.singleton "SDL_EVENT_PEN_AXIS")
+        , (5120, BG.singleton "SDL_EVENT_CAMERA_DEVICE_ADDED")
+        , (5121, BG.singleton "SDL_EVENT_CAMERA_DEVICE_REMOVED")
+        , (5122, BG.singleton "SDL_EVENT_CAMERA_DEVICE_APPROVED")
+        , (5123, BG.singleton "SDL_EVENT_CAMERA_DEVICE_DENIED")
+        , (8192, BG.singleton "SDL_EVENT_RENDER_TARGETS_RESET")
+        , (8193, BG.singleton "SDL_EVENT_RENDER_DEVICE_RESET")
+        , (8194, BG.singleton "SDL_EVENT_RENDER_DEVICE_LOST")
+        , (16384, BG.singleton "SDL_EVENT_PRIVATE0")
+        , (16385, BG.singleton "SDL_EVENT_PRIVATE1")
+        , (16386, BG.singleton "SDL_EVENT_PRIVATE2")
+        , (16387, BG.singleton "SDL_EVENT_PRIVATE3")
+        , (32512, BG.singleton "SDL_EVENT_POLL_SENTINEL")
+        , (32768, BG.singleton "SDL_EVENT_USER")
+        , (65535, BG.singleton "SDL_EVENT_LAST")
+        , (2147483647, BG.singleton "SDL_EVENT_ENUM_PADDING")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_EventType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_EventType"
+
+instance Show SDL_EventType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_EventType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_EventType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EventType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EventType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EventType "unwrap" where
+  type CFieldType SDL_EventType "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Unused (do not remove)
+--
+--     [C declaration]: @SDL_EVENT_FIRST@, defined at @SDL3\/SDL_events.h 86:5@
+pattern SDL_EVENT_FIRST :: SDL_EventType
+pattern SDL_EVENT_FIRST = SDL_EventType 0
+
+-- | User-requested quit
+--
+--     [C declaration]: @SDL_EVENT_QUIT@, defined at @SDL3\/SDL_events.h 89:5@
+pattern SDL_EVENT_QUIT :: SDL_EventType
+pattern SDL_EVENT_QUIT = SDL_EventType 256
+
+-- | The application is being terminated by the OS. This event must be handled in a callback set with @SDL_AddEventWatch()@. Called on iOS in applicationWillTerminate() Called on Android in onDestroy()
+--
+--     [C declaration]: @SDL_EVENT_TERMINATING@, defined at @SDL3\/SDL_events.h 92:5@
+pattern SDL_EVENT_TERMINATING :: SDL_EventType
+pattern SDL_EVENT_TERMINATING = SDL_EventType 257
+
+-- | The application is low on memory, free memory if possible. This event must be handled in a callback set with @SDL_AddEventWatch()@. Called on iOS in applicationDidReceiveMemoryWarning() Called on Android in onTrimMemory()
+--
+--     [C declaration]: @SDL_EVENT_LOW_MEMORY@, defined at @SDL3\/SDL_events.h 96:5@
+pattern SDL_EVENT_LOW_MEMORY :: SDL_EventType
+pattern SDL_EVENT_LOW_MEMORY = SDL_EventType 258
+
+-- | The application is about to enter the background. This event must be handled in a callback set with @SDL_AddEventWatch()@. Called on iOS in applicationWillResignActive() Called on Android in onPause()
+--
+--     [C declaration]: @SDL_EVENT_WILL_ENTER_BACKGROUND@, defined at @SDL3\/SDL_events.h 100:5@
+pattern SDL_EVENT_WILL_ENTER_BACKGROUND :: SDL_EventType
+pattern SDL_EVENT_WILL_ENTER_BACKGROUND = SDL_EventType 259
+
+-- | The application did enter the background and may not get CPU for some time. This event must be handled in a callback set with @SDL_AddEventWatch()@. Called on iOS in applicationDidEnterBackground() Called on Android in onPause()
+--
+--     [C declaration]: @SDL_EVENT_DID_ENTER_BACKGROUND@, defined at @SDL3\/SDL_events.h 104:5@
+pattern SDL_EVENT_DID_ENTER_BACKGROUND :: SDL_EventType
+pattern SDL_EVENT_DID_ENTER_BACKGROUND = SDL_EventType 260
+
+-- | The application is about to enter the foreground. This event must be handled in a callback set with @SDL_AddEventWatch()@. Called on iOS in applicationWillEnterForeground() Called on Android in onResume()
+--
+--     [C declaration]: @SDL_EVENT_WILL_ENTER_FOREGROUND@, defined at @SDL3\/SDL_events.h 108:5@
+pattern SDL_EVENT_WILL_ENTER_FOREGROUND :: SDL_EventType
+pattern SDL_EVENT_WILL_ENTER_FOREGROUND = SDL_EventType 261
+
+-- | The application is now interactive. This event must be handled in a callback set with @SDL_AddEventWatch()@. Called on iOS in applicationDidBecomeActive() Called on Android in onResume()
+--
+--     [C declaration]: @SDL_EVENT_DID_ENTER_FOREGROUND@, defined at @SDL3\/SDL_events.h 112:5@
+pattern SDL_EVENT_DID_ENTER_FOREGROUND :: SDL_EventType
+pattern SDL_EVENT_DID_ENTER_FOREGROUND = SDL_EventType 262
+
+-- | The user\'s locale preferences have changed.
+--
+--     [C declaration]: @SDL_EVENT_LOCALE_CHANGED@, defined at @SDL3\/SDL_events.h 117:5@
+pattern SDL_EVENT_LOCALE_CHANGED :: SDL_EventType
+pattern SDL_EVENT_LOCALE_CHANGED = SDL_EventType 263
+
+-- | The system theme changed
+--
+--     [C declaration]: @SDL_EVENT_SYSTEM_THEME_CHANGED@, defined at @SDL3\/SDL_events.h 119:5@
+pattern SDL_EVENT_SYSTEM_THEME_CHANGED :: SDL_EventType
+pattern SDL_EVENT_SYSTEM_THEME_CHANGED = SDL_EventType 264
+
+-- | Display orientation has changed to data1
+--
+--     [C declaration]: @SDL_EVENT_DISPLAY_ORIENTATION@, defined at @SDL3\/SDL_events.h 123:5@
+pattern SDL_EVENT_DISPLAY_ORIENTATION :: SDL_EventType
+pattern SDL_EVENT_DISPLAY_ORIENTATION = SDL_EventType 337
+
+-- | Display has been added to the system
+--
+--     [C declaration]: @SDL_EVENT_DISPLAY_ADDED@, defined at @SDL3\/SDL_events.h 124:5@
+pattern SDL_EVENT_DISPLAY_ADDED :: SDL_EventType
+pattern SDL_EVENT_DISPLAY_ADDED = SDL_EventType 338
+
+-- | Display has been removed from the system
+--
+--     [C declaration]: @SDL_EVENT_DISPLAY_REMOVED@, defined at @SDL3\/SDL_events.h 125:5@
+pattern SDL_EVENT_DISPLAY_REMOVED :: SDL_EventType
+pattern SDL_EVENT_DISPLAY_REMOVED = SDL_EventType 339
+
+-- | Display has changed position
+--
+--     [C declaration]: @SDL_EVENT_DISPLAY_MOVED@, defined at @SDL3\/SDL_events.h 126:5@
+pattern SDL_EVENT_DISPLAY_MOVED :: SDL_EventType
+pattern SDL_EVENT_DISPLAY_MOVED = SDL_EventType 340
+
+-- | Display has changed desktop mode
+--
+--     [C declaration]: @SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED@, defined at @SDL3\/SDL_events.h 127:5@
+pattern SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED :: SDL_EventType
+pattern SDL_EVENT_DISPLAY_DESKTOP_MODE_CHANGED = SDL_EventType 341
+
+-- | Display has changed current mode
+--
+--     [C declaration]: @SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED@, defined at @SDL3\/SDL_events.h 128:5@
+pattern SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED :: SDL_EventType
+pattern SDL_EVENT_DISPLAY_CURRENT_MODE_CHANGED = SDL_EventType 342
+
+-- | Display has changed content scale
+--
+--     [C declaration]: @SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED@, defined at @SDL3\/SDL_events.h 129:5@
+pattern SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED :: SDL_EventType
+pattern SDL_EVENT_DISPLAY_CONTENT_SCALE_CHANGED = SDL_EventType 343
+
+-- | Display has changed usable bounds
+--
+--     [C declaration]: @SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGED@, defined at @SDL3\/SDL_events.h 130:5@
+pattern SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGED :: SDL_EventType
+pattern SDL_EVENT_DISPLAY_USABLE_BOUNDS_CHANGED = SDL_EventType 344
+
+-- | [C declaration]: @SDL_EVENT_DISPLAY_FIRST@, defined at @SDL3\/SDL_events.h 131:5@
+pattern SDL_EVENT_DISPLAY_FIRST :: SDL_EventType
+pattern SDL_EVENT_DISPLAY_FIRST = SDL_EventType 337
+
+-- | [C declaration]: @SDL_EVENT_DISPLAY_LAST@, defined at @SDL3\/SDL_events.h 132:5@
+pattern SDL_EVENT_DISPLAY_LAST :: SDL_EventType
+pattern SDL_EVENT_DISPLAY_LAST = SDL_EventType 344
+
+-- | Window has been shown
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_SHOWN@, defined at @SDL3\/SDL_events.h 137:5@
+pattern SDL_EVENT_WINDOW_SHOWN :: SDL_EventType
+pattern SDL_EVENT_WINDOW_SHOWN = SDL_EventType 514
+
+-- | Window has been hidden
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_HIDDEN@, defined at @SDL3\/SDL_events.h 138:5@
+pattern SDL_EVENT_WINDOW_HIDDEN :: SDL_EventType
+pattern SDL_EVENT_WINDOW_HIDDEN = SDL_EventType 515
+
+-- | Window has been exposed and should be redrawn, and can be redrawn directly from event watchers for this event. data1 is 1 for live-resize expose events, 0 otherwise.
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_EXPOSED@, defined at @SDL3\/SDL_events.h 139:5@
+pattern SDL_EVENT_WINDOW_EXPOSED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_EXPOSED = SDL_EventType 516
+
+-- | Window has been moved to data1, data2
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_MOVED@, defined at @SDL3\/SDL_events.h 141:5@
+pattern SDL_EVENT_WINDOW_MOVED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_MOVED = SDL_EventType 517
+
+-- | Window has been resized to data1xdata2
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_RESIZED@, defined at @SDL3\/SDL_events.h 142:5@
+pattern SDL_EVENT_WINDOW_RESIZED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_RESIZED = SDL_EventType 518
+
+-- | The pixel size of the window has changed to data1xdata2
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED@, defined at @SDL3\/SDL_events.h 143:5@
+pattern SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED = SDL_EventType 519
+
+-- | The pixel size of a Metal view associated with the window has changed
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_METAL_VIEW_RESIZED@, defined at @SDL3\/SDL_events.h 144:5@
+pattern SDL_EVENT_WINDOW_METAL_VIEW_RESIZED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_METAL_VIEW_RESIZED = SDL_EventType 520
+
+-- | Window has been minimized
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_MINIMIZED@, defined at @SDL3\/SDL_events.h 145:5@
+pattern SDL_EVENT_WINDOW_MINIMIZED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_MINIMIZED = SDL_EventType 521
+
+-- | Window has been maximized
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_MAXIMIZED@, defined at @SDL3\/SDL_events.h 146:5@
+pattern SDL_EVENT_WINDOW_MAXIMIZED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_MAXIMIZED = SDL_EventType 522
+
+-- | Window has been restored to normal size and position
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_RESTORED@, defined at @SDL3\/SDL_events.h 147:5@
+pattern SDL_EVENT_WINDOW_RESTORED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_RESTORED = SDL_EventType 523
+
+-- | Window has gained mouse focus
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_MOUSE_ENTER@, defined at @SDL3\/SDL_events.h 148:5@
+pattern SDL_EVENT_WINDOW_MOUSE_ENTER :: SDL_EventType
+pattern SDL_EVENT_WINDOW_MOUSE_ENTER = SDL_EventType 524
+
+-- | Window has lost mouse focus
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_MOUSE_LEAVE@, defined at @SDL3\/SDL_events.h 149:5@
+pattern SDL_EVENT_WINDOW_MOUSE_LEAVE :: SDL_EventType
+pattern SDL_EVENT_WINDOW_MOUSE_LEAVE = SDL_EventType 525
+
+-- | Window has gained keyboard focus
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_FOCUS_GAINED@, defined at @SDL3\/SDL_events.h 150:5@
+pattern SDL_EVENT_WINDOW_FOCUS_GAINED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_FOCUS_GAINED = SDL_EventType 526
+
+-- | Window has lost keyboard focus
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_FOCUS_LOST@, defined at @SDL3\/SDL_events.h 151:5@
+pattern SDL_EVENT_WINDOW_FOCUS_LOST :: SDL_EventType
+pattern SDL_EVENT_WINDOW_FOCUS_LOST = SDL_EventType 527
+
+-- | The window manager requests that the window be closed
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_CLOSE_REQUESTED@, defined at @SDL3\/SDL_events.h 152:5@
+pattern SDL_EVENT_WINDOW_CLOSE_REQUESTED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_CLOSE_REQUESTED = SDL_EventType 528
+
+-- | Window had a hit test that wasn\'t SDL_HITTEST_NORMAL
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_HIT_TEST@, defined at @SDL3\/SDL_events.h 153:5@
+pattern SDL_EVENT_WINDOW_HIT_TEST :: SDL_EventType
+pattern SDL_EVENT_WINDOW_HIT_TEST = SDL_EventType 529
+
+-- | The ICC profile of the window\'s display has changed
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_ICCPROF_CHANGED@, defined at @SDL3\/SDL_events.h 154:5@
+pattern SDL_EVENT_WINDOW_ICCPROF_CHANGED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_ICCPROF_CHANGED = SDL_EventType 530
+
+-- | Window has been moved to display data1
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_DISPLAY_CHANGED@, defined at @SDL3\/SDL_events.h 155:5@
+pattern SDL_EVENT_WINDOW_DISPLAY_CHANGED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_DISPLAY_CHANGED = SDL_EventType 531
+
+-- | Window display scale has been changed
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED@, defined at @SDL3\/SDL_events.h 156:5@
+pattern SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_DISPLAY_SCALE_CHANGED = SDL_EventType 532
+
+-- | The window safe area has been changed
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_SAFE_AREA_CHANGED@, defined at @SDL3\/SDL_events.h 157:5@
+pattern SDL_EVENT_WINDOW_SAFE_AREA_CHANGED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_SAFE_AREA_CHANGED = SDL_EventType 533
+
+-- | The window has been occluded
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_OCCLUDED@, defined at @SDL3\/SDL_events.h 158:5@
+pattern SDL_EVENT_WINDOW_OCCLUDED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_OCCLUDED = SDL_EventType 534
+
+-- | The window has entered fullscreen mode
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_ENTER_FULLSCREEN@, defined at @SDL3\/SDL_events.h 159:5@
+pattern SDL_EVENT_WINDOW_ENTER_FULLSCREEN :: SDL_EventType
+pattern SDL_EVENT_WINDOW_ENTER_FULLSCREEN = SDL_EventType 535
+
+-- | The window has left fullscreen mode
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_LEAVE_FULLSCREEN@, defined at @SDL3\/SDL_events.h 160:5@
+pattern SDL_EVENT_WINDOW_LEAVE_FULLSCREEN :: SDL_EventType
+pattern SDL_EVENT_WINDOW_LEAVE_FULLSCREEN = SDL_EventType 536
+
+-- | The window with the associated ID is being or has been destroyed. If this message is being handled in an event watcher, the window handle is still valid and can still be used to retrieve any properties associated with the window. Otherwise, the handle has already been destroyed and all resources associated with it are invalid
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_DESTROYED@, defined at @SDL3\/SDL_events.h 161:5@
+pattern SDL_EVENT_WINDOW_DESTROYED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_DESTROYED = SDL_EventType 537
+
+-- | Window HDR properties have changed
+--
+--     [C declaration]: @SDL_EVENT_WINDOW_HDR_STATE_CHANGED@, defined at @SDL3\/SDL_events.h 165:5@
+pattern SDL_EVENT_WINDOW_HDR_STATE_CHANGED :: SDL_EventType
+pattern SDL_EVENT_WINDOW_HDR_STATE_CHANGED = SDL_EventType 538
+
+-- | [C declaration]: @SDL_EVENT_WINDOW_FIRST@, defined at @SDL3\/SDL_events.h 166:5@
+pattern SDL_EVENT_WINDOW_FIRST :: SDL_EventType
+pattern SDL_EVENT_WINDOW_FIRST = SDL_EventType 514
+
+-- | [C declaration]: @SDL_EVENT_WINDOW_LAST@, defined at @SDL3\/SDL_events.h 167:5@
+pattern SDL_EVENT_WINDOW_LAST :: SDL_EventType
+pattern SDL_EVENT_WINDOW_LAST = SDL_EventType 538
+
+-- | Key pressed
+--
+--     [C declaration]: @SDL_EVENT_KEY_DOWN@, defined at @SDL3\/SDL_events.h 170:5@
+pattern SDL_EVENT_KEY_DOWN :: SDL_EventType
+pattern SDL_EVENT_KEY_DOWN = SDL_EventType 768
+
+-- | Key released
+--
+--     [C declaration]: @SDL_EVENT_KEY_UP@, defined at @SDL3\/SDL_events.h 171:5@
+pattern SDL_EVENT_KEY_UP :: SDL_EventType
+pattern SDL_EVENT_KEY_UP = SDL_EventType 769
+
+-- | Keyboard text editing (composition)
+--
+--     [C declaration]: @SDL_EVENT_TEXT_EDITING@, defined at @SDL3\/SDL_events.h 172:5@
+pattern SDL_EVENT_TEXT_EDITING :: SDL_EventType
+pattern SDL_EVENT_TEXT_EDITING = SDL_EventType 770
+
+-- | Keyboard text input
+--
+--     [C declaration]: @SDL_EVENT_TEXT_INPUT@, defined at @SDL3\/SDL_events.h 173:5@
+pattern SDL_EVENT_TEXT_INPUT :: SDL_EventType
+pattern SDL_EVENT_TEXT_INPUT = SDL_EventType 771
+
+-- | Keymap changed due to a system event such as an input language or keyboard layout change.
+--
+--     [C declaration]: @SDL_EVENT_KEYMAP_CHANGED@, defined at @SDL3\/SDL_events.h 174:5@
+pattern SDL_EVENT_KEYMAP_CHANGED :: SDL_EventType
+pattern SDL_EVENT_KEYMAP_CHANGED = SDL_EventType 772
+
+-- | A new keyboard has been inserted into the system
+--
+--     [C declaration]: @SDL_EVENT_KEYBOARD_ADDED@, defined at @SDL3\/SDL_events.h 176:5@
+pattern SDL_EVENT_KEYBOARD_ADDED :: SDL_EventType
+pattern SDL_EVENT_KEYBOARD_ADDED = SDL_EventType 773
+
+-- | A keyboard has been removed
+--
+--     [C declaration]: @SDL_EVENT_KEYBOARD_REMOVED@, defined at @SDL3\/SDL_events.h 177:5@
+pattern SDL_EVENT_KEYBOARD_REMOVED :: SDL_EventType
+pattern SDL_EVENT_KEYBOARD_REMOVED = SDL_EventType 774
+
+-- | Keyboard text editing candidates
+--
+--     [C declaration]: @SDL_EVENT_TEXT_EDITING_CANDIDATES@, defined at @SDL3\/SDL_events.h 178:5@
+pattern SDL_EVENT_TEXT_EDITING_CANDIDATES :: SDL_EventType
+pattern SDL_EVENT_TEXT_EDITING_CANDIDATES = SDL_EventType 775
+
+-- | The on-screen keyboard has been shown
+--
+--     [C declaration]: @SDL_EVENT_SCREEN_KEYBOARD_SHOWN@, defined at @SDL3\/SDL_events.h 179:5@
+pattern SDL_EVENT_SCREEN_KEYBOARD_SHOWN :: SDL_EventType
+pattern SDL_EVENT_SCREEN_KEYBOARD_SHOWN = SDL_EventType 776
+
+-- | The on-screen keyboard has been hidden
+--
+--     [C declaration]: @SDL_EVENT_SCREEN_KEYBOARD_HIDDEN@, defined at @SDL3\/SDL_events.h 180:5@
+pattern SDL_EVENT_SCREEN_KEYBOARD_HIDDEN :: SDL_EventType
+pattern SDL_EVENT_SCREEN_KEYBOARD_HIDDEN = SDL_EventType 777
+
+-- | Mouse moved
+--
+--     [C declaration]: @SDL_EVENT_MOUSE_MOTION@, defined at @SDL3\/SDL_events.h 183:5@
+pattern SDL_EVENT_MOUSE_MOTION :: SDL_EventType
+pattern SDL_EVENT_MOUSE_MOTION = SDL_EventType 1024
+
+-- | Mouse button pressed
+--
+--     [C declaration]: @SDL_EVENT_MOUSE_BUTTON_DOWN@, defined at @SDL3\/SDL_events.h 184:5@
+pattern SDL_EVENT_MOUSE_BUTTON_DOWN :: SDL_EventType
+pattern SDL_EVENT_MOUSE_BUTTON_DOWN = SDL_EventType 1025
+
+-- | Mouse button released
+--
+--     [C declaration]: @SDL_EVENT_MOUSE_BUTTON_UP@, defined at @SDL3\/SDL_events.h 185:5@
+pattern SDL_EVENT_MOUSE_BUTTON_UP :: SDL_EventType
+pattern SDL_EVENT_MOUSE_BUTTON_UP = SDL_EventType 1026
+
+-- | Mouse wheel motion
+--
+--     [C declaration]: @SDL_EVENT_MOUSE_WHEEL@, defined at @SDL3\/SDL_events.h 186:5@
+pattern SDL_EVENT_MOUSE_WHEEL :: SDL_EventType
+pattern SDL_EVENT_MOUSE_WHEEL = SDL_EventType 1027
+
+-- | A new mouse has been inserted into the system
+--
+--     [C declaration]: @SDL_EVENT_MOUSE_ADDED@, defined at @SDL3\/SDL_events.h 187:5@
+pattern SDL_EVENT_MOUSE_ADDED :: SDL_EventType
+pattern SDL_EVENT_MOUSE_ADDED = SDL_EventType 1028
+
+-- | A mouse has been removed
+--
+--     [C declaration]: @SDL_EVENT_MOUSE_REMOVED@, defined at @SDL3\/SDL_events.h 188:5@
+pattern SDL_EVENT_MOUSE_REMOVED :: SDL_EventType
+pattern SDL_EVENT_MOUSE_REMOVED = SDL_EventType 1029
+
+-- | Joystick axis motion
+--
+--     [C declaration]: @SDL_EVENT_JOYSTICK_AXIS_MOTION@, defined at @SDL3\/SDL_events.h 191:5@
+pattern SDL_EVENT_JOYSTICK_AXIS_MOTION :: SDL_EventType
+pattern SDL_EVENT_JOYSTICK_AXIS_MOTION = SDL_EventType 1536
+
+-- | Joystick trackball motion
+--
+--     [C declaration]: @SDL_EVENT_JOYSTICK_BALL_MOTION@, defined at @SDL3\/SDL_events.h 192:5@
+pattern SDL_EVENT_JOYSTICK_BALL_MOTION :: SDL_EventType
+pattern SDL_EVENT_JOYSTICK_BALL_MOTION = SDL_EventType 1537
+
+-- | Joystick hat position change
+--
+--     [C declaration]: @SDL_EVENT_JOYSTICK_HAT_MOTION@, defined at @SDL3\/SDL_events.h 193:5@
+pattern SDL_EVENT_JOYSTICK_HAT_MOTION :: SDL_EventType
+pattern SDL_EVENT_JOYSTICK_HAT_MOTION = SDL_EventType 1538
+
+-- | Joystick button pressed
+--
+--     [C declaration]: @SDL_EVENT_JOYSTICK_BUTTON_DOWN@, defined at @SDL3\/SDL_events.h 194:5@
+pattern SDL_EVENT_JOYSTICK_BUTTON_DOWN :: SDL_EventType
+pattern SDL_EVENT_JOYSTICK_BUTTON_DOWN = SDL_EventType 1539
+
+-- | Joystick button released
+--
+--     [C declaration]: @SDL_EVENT_JOYSTICK_BUTTON_UP@, defined at @SDL3\/SDL_events.h 195:5@
+pattern SDL_EVENT_JOYSTICK_BUTTON_UP :: SDL_EventType
+pattern SDL_EVENT_JOYSTICK_BUTTON_UP = SDL_EventType 1540
+
+-- | A new joystick has been inserted into the system
+--
+--     [C declaration]: @SDL_EVENT_JOYSTICK_ADDED@, defined at @SDL3\/SDL_events.h 196:5@
+pattern SDL_EVENT_JOYSTICK_ADDED :: SDL_EventType
+pattern SDL_EVENT_JOYSTICK_ADDED = SDL_EventType 1541
+
+-- | An opened joystick has been removed
+--
+--     [C declaration]: @SDL_EVENT_JOYSTICK_REMOVED@, defined at @SDL3\/SDL_events.h 197:5@
+pattern SDL_EVENT_JOYSTICK_REMOVED :: SDL_EventType
+pattern SDL_EVENT_JOYSTICK_REMOVED = SDL_EventType 1542
+
+-- | Joystick battery level change
+--
+--     [C declaration]: @SDL_EVENT_JOYSTICK_BATTERY_UPDATED@, defined at @SDL3\/SDL_events.h 198:5@
+pattern SDL_EVENT_JOYSTICK_BATTERY_UPDATED :: SDL_EventType
+pattern SDL_EVENT_JOYSTICK_BATTERY_UPDATED = SDL_EventType 1543
+
+-- | Joystick update is complete
+--
+--     [C declaration]: @SDL_EVENT_JOYSTICK_UPDATE_COMPLETE@, defined at @SDL3\/SDL_events.h 199:5@
+pattern SDL_EVENT_JOYSTICK_UPDATE_COMPLETE :: SDL_EventType
+pattern SDL_EVENT_JOYSTICK_UPDATE_COMPLETE = SDL_EventType 1544
+
+-- | Gamepad axis motion
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_AXIS_MOTION@, defined at @SDL3\/SDL_events.h 202:5@
+pattern SDL_EVENT_GAMEPAD_AXIS_MOTION :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_AXIS_MOTION = SDL_EventType 1616
+
+-- | Gamepad button pressed
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_BUTTON_DOWN@, defined at @SDL3\/SDL_events.h 203:5@
+pattern SDL_EVENT_GAMEPAD_BUTTON_DOWN :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_BUTTON_DOWN = SDL_EventType 1617
+
+-- | Gamepad button released
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_BUTTON_UP@, defined at @SDL3\/SDL_events.h 204:5@
+pattern SDL_EVENT_GAMEPAD_BUTTON_UP :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_BUTTON_UP = SDL_EventType 1618
+
+-- | A new gamepad has been inserted into the system
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_ADDED@, defined at @SDL3\/SDL_events.h 205:5@
+pattern SDL_EVENT_GAMEPAD_ADDED :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_ADDED = SDL_EventType 1619
+
+-- | A gamepad has been removed
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_REMOVED@, defined at @SDL3\/SDL_events.h 206:5@
+pattern SDL_EVENT_GAMEPAD_REMOVED :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_REMOVED = SDL_EventType 1620
+
+-- | The gamepad mapping was updated
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_REMAPPED@, defined at @SDL3\/SDL_events.h 207:5@
+pattern SDL_EVENT_GAMEPAD_REMAPPED :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_REMAPPED = SDL_EventType 1621
+
+-- | Gamepad touchpad was touched
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN@, defined at @SDL3\/SDL_events.h 208:5@
+pattern SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN = SDL_EventType 1622
+
+-- | Gamepad touchpad finger was moved
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION@, defined at @SDL3\/SDL_events.h 209:5@
+pattern SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION = SDL_EventType 1623
+
+-- | Gamepad touchpad finger was lifted
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_TOUCHPAD_UP@, defined at @SDL3\/SDL_events.h 210:5@
+pattern SDL_EVENT_GAMEPAD_TOUCHPAD_UP :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_TOUCHPAD_UP = SDL_EventType 1624
+
+-- | Gamepad sensor was updated
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_SENSOR_UPDATE@, defined at @SDL3\/SDL_events.h 211:5@
+pattern SDL_EVENT_GAMEPAD_SENSOR_UPDATE :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_SENSOR_UPDATE = SDL_EventType 1625
+
+-- | Gamepad update is complete
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_UPDATE_COMPLETE@, defined at @SDL3\/SDL_events.h 212:5@
+pattern SDL_EVENT_GAMEPAD_UPDATE_COMPLETE :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_UPDATE_COMPLETE = SDL_EventType 1626
+
+-- | Gamepad Steam handle has changed
+--
+--     [C declaration]: @SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED@, defined at @SDL3\/SDL_events.h 213:5@
+pattern SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED :: SDL_EventType
+pattern SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED = SDL_EventType 1627
+
+-- | [C declaration]: @SDL_EVENT_FINGER_DOWN@, defined at @SDL3\/SDL_events.h 216:5@
+pattern SDL_EVENT_FINGER_DOWN :: SDL_EventType
+pattern SDL_EVENT_FINGER_DOWN = SDL_EventType 1792
+
+-- | [C declaration]: @SDL_EVENT_FINGER_UP@, defined at @SDL3\/SDL_events.h 217:5@
+pattern SDL_EVENT_FINGER_UP :: SDL_EventType
+pattern SDL_EVENT_FINGER_UP = SDL_EventType 1793
+
+-- | [C declaration]: @SDL_EVENT_FINGER_MOTION@, defined at @SDL3\/SDL_events.h 218:5@
+pattern SDL_EVENT_FINGER_MOTION :: SDL_EventType
+pattern SDL_EVENT_FINGER_MOTION = SDL_EventType 1794
+
+-- | [C declaration]: @SDL_EVENT_FINGER_CANCELED@, defined at @SDL3\/SDL_events.h 219:5@
+pattern SDL_EVENT_FINGER_CANCELED :: SDL_EventType
+pattern SDL_EVENT_FINGER_CANCELED = SDL_EventType 1795
+
+-- | Pinch gesture started
+--
+--     [C declaration]: @SDL_EVENT_PINCH_BEGIN@, defined at @SDL3\/SDL_events.h 222:5@
+pattern SDL_EVENT_PINCH_BEGIN :: SDL_EventType
+pattern SDL_EVENT_PINCH_BEGIN = SDL_EventType 1808
+
+-- | Pinch gesture updated
+--
+--     [C declaration]: @SDL_EVENT_PINCH_UPDATE@, defined at @SDL3\/SDL_events.h 223:5@
+pattern SDL_EVENT_PINCH_UPDATE :: SDL_EventType
+pattern SDL_EVENT_PINCH_UPDATE = SDL_EventType 1809
+
+-- | Pinch gesture ended
+--
+--     [C declaration]: @SDL_EVENT_PINCH_END@, defined at @SDL3\/SDL_events.h 224:5@
+pattern SDL_EVENT_PINCH_END :: SDL_EventType
+pattern SDL_EVENT_PINCH_END = SDL_EventType 1810
+
+-- | The clipboard changed
+--
+--     [C declaration]: @SDL_EVENT_CLIPBOARD_UPDATE@, defined at @SDL3\/SDL_events.h 229:5@
+pattern SDL_EVENT_CLIPBOARD_UPDATE :: SDL_EventType
+pattern SDL_EVENT_CLIPBOARD_UPDATE = SDL_EventType 2304
+
+-- | The system requests a file open
+--
+--     [C declaration]: @SDL_EVENT_DROP_FILE@, defined at @SDL3\/SDL_events.h 232:5@
+pattern SDL_EVENT_DROP_FILE :: SDL_EventType
+pattern SDL_EVENT_DROP_FILE = SDL_EventType 4096
+
+-- | text\/plain drag-and-drop event
+--
+--     [C declaration]: @SDL_EVENT_DROP_TEXT@, defined at @SDL3\/SDL_events.h 233:5@
+pattern SDL_EVENT_DROP_TEXT :: SDL_EventType
+pattern SDL_EVENT_DROP_TEXT = SDL_EventType 4097
+
+-- | A new set of drops is beginning (NULL filename)
+--
+--     [C declaration]: @SDL_EVENT_DROP_BEGIN@, defined at @SDL3\/SDL_events.h 234:5@
+pattern SDL_EVENT_DROP_BEGIN :: SDL_EventType
+pattern SDL_EVENT_DROP_BEGIN = SDL_EventType 4098
+
+-- | Current set of drops is now complete (NULL filename)
+--
+--     [C declaration]: @SDL_EVENT_DROP_COMPLETE@, defined at @SDL3\/SDL_events.h 235:5@
+pattern SDL_EVENT_DROP_COMPLETE :: SDL_EventType
+pattern SDL_EVENT_DROP_COMPLETE = SDL_EventType 4099
+
+-- | Position while moving over the window
+--
+--     [C declaration]: @SDL_EVENT_DROP_POSITION@, defined at @SDL3\/SDL_events.h 236:5@
+pattern SDL_EVENT_DROP_POSITION :: SDL_EventType
+pattern SDL_EVENT_DROP_POSITION = SDL_EventType 4100
+
+-- | A new audio device is available
+--
+--     [C declaration]: @SDL_EVENT_AUDIO_DEVICE_ADDED@, defined at @SDL3\/SDL_events.h 239:5@
+pattern SDL_EVENT_AUDIO_DEVICE_ADDED :: SDL_EventType
+pattern SDL_EVENT_AUDIO_DEVICE_ADDED = SDL_EventType 4352
+
+-- | An audio device has been removed.
+--
+--     [C declaration]: @SDL_EVENT_AUDIO_DEVICE_REMOVED@, defined at @SDL3\/SDL_events.h 240:5@
+pattern SDL_EVENT_AUDIO_DEVICE_REMOVED :: SDL_EventType
+pattern SDL_EVENT_AUDIO_DEVICE_REMOVED = SDL_EventType 4353
+
+-- | An audio device\'s format has been changed by the system.
+--
+--     [C declaration]: @SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED@, defined at @SDL3\/SDL_events.h 241:5@
+pattern SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED :: SDL_EventType
+pattern SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED = SDL_EventType 4354
+
+-- | A sensor was updated
+--
+--     [C declaration]: @SDL_EVENT_SENSOR_UPDATE@, defined at @SDL3\/SDL_events.h 244:5@
+pattern SDL_EVENT_SENSOR_UPDATE :: SDL_EventType
+pattern SDL_EVENT_SENSOR_UPDATE = SDL_EventType 4608
+
+-- | Pressure-sensitive pen has become available
+--
+--     [C declaration]: @SDL_EVENT_PEN_PROXIMITY_IN@, defined at @SDL3\/SDL_events.h 247:5@
+pattern SDL_EVENT_PEN_PROXIMITY_IN :: SDL_EventType
+pattern SDL_EVENT_PEN_PROXIMITY_IN = SDL_EventType 4864
+
+-- | Pressure-sensitive pen has become unavailable
+--
+--     [C declaration]: @SDL_EVENT_PEN_PROXIMITY_OUT@, defined at @SDL3\/SDL_events.h 248:5@
+pattern SDL_EVENT_PEN_PROXIMITY_OUT :: SDL_EventType
+pattern SDL_EVENT_PEN_PROXIMITY_OUT = SDL_EventType 4865
+
+-- | Pressure-sensitive pen touched drawing surface
+--
+--     [C declaration]: @SDL_EVENT_PEN_DOWN@, defined at @SDL3\/SDL_events.h 249:5@
+pattern SDL_EVENT_PEN_DOWN :: SDL_EventType
+pattern SDL_EVENT_PEN_DOWN = SDL_EventType 4866
+
+-- | Pressure-sensitive pen stopped touching drawing surface
+--
+--     [C declaration]: @SDL_EVENT_PEN_UP@, defined at @SDL3\/SDL_events.h 250:5@
+pattern SDL_EVENT_PEN_UP :: SDL_EventType
+pattern SDL_EVENT_PEN_UP = SDL_EventType 4867
+
+-- | Pressure-sensitive pen button pressed
+--
+--     [C declaration]: @SDL_EVENT_PEN_BUTTON_DOWN@, defined at @SDL3\/SDL_events.h 251:5@
+pattern SDL_EVENT_PEN_BUTTON_DOWN :: SDL_EventType
+pattern SDL_EVENT_PEN_BUTTON_DOWN = SDL_EventType 4868
+
+-- | Pressure-sensitive pen button released
+--
+--     [C declaration]: @SDL_EVENT_PEN_BUTTON_UP@, defined at @SDL3\/SDL_events.h 252:5@
+pattern SDL_EVENT_PEN_BUTTON_UP :: SDL_EventType
+pattern SDL_EVENT_PEN_BUTTON_UP = SDL_EventType 4869
+
+-- | Pressure-sensitive pen is moving on the tablet
+--
+--     [C declaration]: @SDL_EVENT_PEN_MOTION@, defined at @SDL3\/SDL_events.h 253:5@
+pattern SDL_EVENT_PEN_MOTION :: SDL_EventType
+pattern SDL_EVENT_PEN_MOTION = SDL_EventType 4870
+
+-- | Pressure-sensitive pen angle\/pressure\/etc changed
+--
+--     [C declaration]: @SDL_EVENT_PEN_AXIS@, defined at @SDL3\/SDL_events.h 254:5@
+pattern SDL_EVENT_PEN_AXIS :: SDL_EventType
+pattern SDL_EVENT_PEN_AXIS = SDL_EventType 4871
+
+-- | A new camera device is available
+--
+--     [C declaration]: @SDL_EVENT_CAMERA_DEVICE_ADDED@, defined at @SDL3\/SDL_events.h 257:5@
+pattern SDL_EVENT_CAMERA_DEVICE_ADDED :: SDL_EventType
+pattern SDL_EVENT_CAMERA_DEVICE_ADDED = SDL_EventType 5120
+
+-- | A camera device has been removed.
+--
+--     [C declaration]: @SDL_EVENT_CAMERA_DEVICE_REMOVED@, defined at @SDL3\/SDL_events.h 258:5@
+pattern SDL_EVENT_CAMERA_DEVICE_REMOVED :: SDL_EventType
+pattern SDL_EVENT_CAMERA_DEVICE_REMOVED = SDL_EventType 5121
+
+-- | A camera device has been approved for use by the user.
+--
+--     [C declaration]: @SDL_EVENT_CAMERA_DEVICE_APPROVED@, defined at @SDL3\/SDL_events.h 259:5@
+pattern SDL_EVENT_CAMERA_DEVICE_APPROVED :: SDL_EventType
+pattern SDL_EVENT_CAMERA_DEVICE_APPROVED = SDL_EventType 5122
+
+-- | A camera device has been denied for use by the user.
+--
+--     [C declaration]: @SDL_EVENT_CAMERA_DEVICE_DENIED@, defined at @SDL3\/SDL_events.h 260:5@
+pattern SDL_EVENT_CAMERA_DEVICE_DENIED :: SDL_EventType
+pattern SDL_EVENT_CAMERA_DEVICE_DENIED = SDL_EventType 5123
+
+-- | The render targets have been reset and their contents need to be updated
+--
+--     [C declaration]: @SDL_EVENT_RENDER_TARGETS_RESET@, defined at @SDL3\/SDL_events.h 263:5@
+pattern SDL_EVENT_RENDER_TARGETS_RESET :: SDL_EventType
+pattern SDL_EVENT_RENDER_TARGETS_RESET = SDL_EventType 8192
+
+-- | The device has been reset and all textures need to be recreated
+--
+--     [C declaration]: @SDL_EVENT_RENDER_DEVICE_RESET@, defined at @SDL3\/SDL_events.h 264:5@
+pattern SDL_EVENT_RENDER_DEVICE_RESET :: SDL_EventType
+pattern SDL_EVENT_RENDER_DEVICE_RESET = SDL_EventType 8193
+
+-- | The device has been lost and can\'t be recovered.
+--
+--     [C declaration]: @SDL_EVENT_RENDER_DEVICE_LOST@, defined at @SDL3\/SDL_events.h 265:5@
+pattern SDL_EVENT_RENDER_DEVICE_LOST :: SDL_EventType
+pattern SDL_EVENT_RENDER_DEVICE_LOST = SDL_EventType 8194
+
+-- | [C declaration]: @SDL_EVENT_PRIVATE0@, defined at @SDL3\/SDL_events.h 268:5@
+pattern SDL_EVENT_PRIVATE0 :: SDL_EventType
+pattern SDL_EVENT_PRIVATE0 = SDL_EventType 16384
+
+-- | [C declaration]: @SDL_EVENT_PRIVATE1@, defined at @SDL3\/SDL_events.h 269:5@
+pattern SDL_EVENT_PRIVATE1 :: SDL_EventType
+pattern SDL_EVENT_PRIVATE1 = SDL_EventType 16385
+
+-- | [C declaration]: @SDL_EVENT_PRIVATE2@, defined at @SDL3\/SDL_events.h 270:5@
+pattern SDL_EVENT_PRIVATE2 :: SDL_EventType
+pattern SDL_EVENT_PRIVATE2 = SDL_EventType 16386
+
+-- | [C declaration]: @SDL_EVENT_PRIVATE3@, defined at @SDL3\/SDL_events.h 271:5@
+pattern SDL_EVENT_PRIVATE3 :: SDL_EventType
+pattern SDL_EVENT_PRIVATE3 = SDL_EventType 16387
+
+-- | Signals the end of an event poll cycle
+--
+--     [C declaration]: @SDL_EVENT_POLL_SENTINEL@, defined at @SDL3\/SDL_events.h 274:5@
+pattern SDL_EVENT_POLL_SENTINEL :: SDL_EventType
+pattern SDL_EVENT_POLL_SENTINEL = SDL_EventType 32512
+
+-- | Events SDL_EVENT_USER through SDL_EVENT_LAST are for your use, and should be allocated with @SDL_RegisterEvents()@
+--
+--     [C declaration]: @SDL_EVENT_USER@, defined at @SDL3\/SDL_events.h 279:5@
+pattern SDL_EVENT_USER :: SDL_EventType
+pattern SDL_EVENT_USER = SDL_EventType 32768
+
+-- | This last event is only for bounding internal arrays
+--
+--     [C declaration]: @SDL_EVENT_LAST@, defined at @SDL3\/SDL_events.h 284:5@
+pattern SDL_EVENT_LAST :: SDL_EventType
+pattern SDL_EVENT_LAST = SDL_EventType 65535
+
+-- | [C declaration]: @SDL_EVENT_ENUM_PADDING@, defined at @SDL3\/SDL_events.h 287:5@
+pattern SDL_EVENT_ENUM_PADDING :: SDL_EventType
+pattern SDL_EVENT_ENUM_PADDING = SDL_EventType 2147483647
+
+-- | Fields shared by every event
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_CommonEvent@, defined at @SDL3\/SDL_events.h 296:16@
+data SDL_CommonEvent = SDL_CommonEvent
+  { type' :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Event type, shared with all events, Uint32 to cover user events which are not in the 'SDL_EventType' enumeration
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 298:12@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 299:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 300:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_CommonEvent where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_CommonEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_CommonEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+
+instance Marshal.WriteRaw SDL_CommonEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_CommonEvent type'2 reserved3 timestamp4 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+
+deriving via Marshal.EquivStorable SDL_CommonEvent instance BG.Storable SDL_CommonEvent
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "type'" SDL_CommonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CommonEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "type'" (BG.Ptr SDL_CommonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_CommonEvent "type'" where
+  type
+    CFieldType SDL_CommonEvent "type'" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_CommonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CommonEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_CommonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_CommonEvent "reserved" where
+  type
+    CFieldType SDL_CommonEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_CommonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CommonEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_CommonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_CommonEvent "timestamp" where
+  type
+    CFieldType SDL_CommonEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+-- | Display state change event data (event.display.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_DisplayEvent@, defined at @SDL3\/SDL_events.h 308:16@
+data SDL_DisplayEvent = SDL_DisplayEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_DISPLAY_*
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 310:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 311:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 312:12@
+  , displayID :: SDL3.Sys.Bindgen.Video.SDL_DisplayID
+  -- ^ The associated display
+  --
+  --          [C declaration]: @displayID@, defined at @SDL3\/SDL_events.h 313:19@
+  , data1 :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ event dependent data
+  --
+  --          [C declaration]: @data1@, defined at @SDL3\/SDL_events.h 314:12@
+  , data2 :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ event dependent data
+  --
+  --          [C declaration]: @data2@, defined at @SDL3\/SDL_events.h 315:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_DisplayEvent where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_DisplayEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_DisplayEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"displayID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"data1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"data2") ptr0
+
+instance Marshal.WriteRaw SDL_DisplayEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_DisplayEvent type'2 reserved3 timestamp4 displayID5 data16 data27 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"displayID") ptr0 displayID5
+              >> HasCField.writeRaw (BG.Proxy @"data1") ptr0 data16
+              >> HasCField.writeRaw (BG.Proxy @"data2") ptr0 data27
+
+deriving via Marshal.EquivStorable SDL_DisplayEvent instance BG.Storable SDL_DisplayEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_DisplayEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , displayID = BG.getField @"displayID" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_DisplayEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_DisplayEvent "type'" where
+  type
+    CFieldType SDL_DisplayEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_DisplayEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , displayID = BG.getField @"displayID" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_DisplayEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_DisplayEvent "reserved" where
+  type
+    CFieldType SDL_DisplayEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_DisplayEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , displayID = BG.getField @"displayID" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_DisplayEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_DisplayEvent "timestamp" where
+  type
+    CFieldType SDL_DisplayEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_DisplayID)
+  => BG.CompatHasField.HasField "displayID" SDL_DisplayEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayEvent
+            { displayID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"displayID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_DisplayID)
+  => BG.HasField "displayID" (BG.Ptr SDL_DisplayEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"displayID")
+
+instance HasCField.HasCField SDL_DisplayEvent "displayID" where
+  type
+    CFieldType SDL_DisplayEvent "displayID" =
+      SDL3.Sys.Bindgen.Video.SDL_DisplayID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "data1" SDL_DisplayEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayEvent
+            { data1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , displayID = BG.getField @"displayID" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"data1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "data1" (BG.Ptr SDL_DisplayEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data1")
+
+instance HasCField.HasCField SDL_DisplayEvent "data1" where
+  type
+    CFieldType SDL_DisplayEvent "data1" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "data2" SDL_DisplayEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayEvent
+            { data2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , displayID = BG.getField @"displayID" x0
+            , data1 = BG.getField @"data1" x0
+            }
+      , BG.getField @"data2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "data2" (BG.Ptr SDL_DisplayEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data2")
+
+instance HasCField.HasCField SDL_DisplayEvent "data2" where
+  type
+    CFieldType SDL_DisplayEvent "data2" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 24
+
+-- | Window state change event data (event.window.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_WindowEvent@, defined at @SDL3\/SDL_events.h 323:16@
+data SDL_WindowEvent = SDL_WindowEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_WINDOW_*
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 325:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 326:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 327:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The associated window
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 328:18@
+  , data1 :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ event dependent data
+  --
+  --          [C declaration]: @data1@, defined at @SDL3\/SDL_events.h 329:12@
+  , data2 :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ event dependent data
+  --
+  --          [C declaration]: @data2@, defined at @SDL3\/SDL_events.h 330:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_WindowEvent where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_WindowEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_WindowEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"data1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"data2") ptr0
+
+instance Marshal.WriteRaw SDL_WindowEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_WindowEvent type'2 reserved3 timestamp4 windowID5 data16 data27 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+              >> HasCField.writeRaw (BG.Proxy @"data1") ptr0 data16
+              >> HasCField.writeRaw (BG.Proxy @"data2") ptr0 data27
+
+deriving via Marshal.EquivStorable SDL_WindowEvent instance BG.Storable SDL_WindowEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_WindowEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_WindowEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_WindowEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_WindowEvent "type'" where
+  type
+    CFieldType SDL_WindowEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_WindowEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_WindowEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_WindowEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_WindowEvent "reserved" where
+  type
+    CFieldType SDL_WindowEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_WindowEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_WindowEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_WindowEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_WindowEvent "timestamp" where
+  type
+    CFieldType SDL_WindowEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_WindowEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_WindowEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_WindowEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_WindowEvent "windowID" where
+  type
+    CFieldType SDL_WindowEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "data1" SDL_WindowEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_WindowEvent
+            { data1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"data1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "data1" (BG.Ptr SDL_WindowEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data1")
+
+instance HasCField.HasCField SDL_WindowEvent "data1" where
+  type
+    CFieldType SDL_WindowEvent "data1" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "data2" SDL_WindowEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_WindowEvent
+            { data2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , data1 = BG.getField @"data1" x0
+            }
+      , BG.getField @"data2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "data2" (BG.Ptr SDL_WindowEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data2")
+
+instance HasCField.HasCField SDL_WindowEvent "data2" where
+  type
+    CFieldType SDL_WindowEvent "data2" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 24
+
+-- | Keyboard device event structure (event.kdevice.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_KeyboardDeviceEvent@, defined at @SDL3\/SDL_events.h 338:16@
+data SDL_KeyboardDeviceEvent = SDL_KeyboardDeviceEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_KEYBOARD_ADDED or SDL_EVENT_KEYBOARD_REMOVED
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 340:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 341:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 342:12@
+  , which :: SDL3.Sys.Bindgen.Keyboard.SDL_KeyboardID
+  -- ^ The keyboard instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 343:20@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_KeyboardDeviceEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_KeyboardDeviceEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_KeyboardDeviceEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+
+instance Marshal.WriteRaw SDL_KeyboardDeviceEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_KeyboardDeviceEvent type'2 reserved3 timestamp4 which5 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+
+deriving via
+  Marshal.EquivStorable SDL_KeyboardDeviceEvent
+  instance
+    BG.Storable SDL_KeyboardDeviceEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_KeyboardDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardDeviceEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_KeyboardDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_KeyboardDeviceEvent "type'" where
+  type
+    CFieldType SDL_KeyboardDeviceEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_KeyboardDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardDeviceEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_KeyboardDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_KeyboardDeviceEvent "reserved" where
+  type
+    CFieldType SDL_KeyboardDeviceEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_KeyboardDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardDeviceEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_KeyboardDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_KeyboardDeviceEvent "timestamp" where
+  type
+    CFieldType SDL_KeyboardDeviceEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Keyboard.SDL_KeyboardID)
+  => BG.CompatHasField.HasField "which" SDL_KeyboardDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardDeviceEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Keyboard.SDL_KeyboardID)
+  => BG.HasField "which" (BG.Ptr SDL_KeyboardDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_KeyboardDeviceEvent "which" where
+  type
+    CFieldType SDL_KeyboardDeviceEvent "which" =
+      SDL3.Sys.Bindgen.Keyboard.SDL_KeyboardID
+
+  offset# = \_ -> \_ -> 16
+
+-- | Keyboard button event structure (event.key.*)
+--
+--     The @key@ is the base SDL_Keycode generated by pressing the @scancode@ using the current keyboard layout, applying any options specified in SDL_HINT_KEYCODE_OPTIONS. You can get the SDL_Keycode corresponding to the event scancode and modifiers directly from the keyboard layout, bypassing SDL_HINT_KEYCODE_OPTIONS, by calling SDL_GetKeyFromScancode().
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetKeyFromScancode, SDL_HINT_KEYCODE_OPTIONS
+--
+--     [C declaration]: @struct SDL_KeyboardEvent@, defined at @SDL3\/SDL_events.h 360:16@
+data SDL_KeyboardEvent = SDL_KeyboardEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_KEY_DOWN or SDL_EVENT_KEY_UP
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 362:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 363:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 364:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with keyboard focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 365:18@
+  , which :: SDL3.Sys.Bindgen.Keyboard.SDL_KeyboardID
+  -- ^ The keyboard instance id, or 0 if unknown or virtual
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 366:20@
+  , scancode :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^ SDL physical key code
+  --
+  --          [C declaration]: @scancode@, defined at @SDL3\/SDL_events.h 367:18@
+  , key :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -- ^ SDL virtual key code
+  --
+  --          [C declaration]: @key@, defined at @SDL3\/SDL_events.h 368:17@
+  , mod :: SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^ current key modifiers
+  --
+  --          [C declaration]: @mod@, defined at @SDL3\/SDL_events.h 369:16@
+  , raw :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ The platform dependent scancode for this event
+  --
+  --          [C declaration]: @raw@, defined at @SDL3\/SDL_events.h 370:12@
+  , down :: BG.CBool
+  -- ^ true if the key is pressed
+  --
+  --          [C declaration]: @down@, defined at @SDL3\/SDL_events.h 371:10@
+  , repeat :: BG.CBool
+  -- ^ true if this is a key repeat
+  --
+  --          [C declaration]: @repeat@, defined at @SDL3\/SDL_events.h 372:10@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_KeyboardEvent where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_KeyboardEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_KeyboardEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"scancode") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"key") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mod") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"raw") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"down") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"repeat") ptr0
+
+instance Marshal.WriteRaw SDL_KeyboardEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_KeyboardEvent
+            type'2
+            reserved3
+            timestamp4
+            windowID5
+            which6
+            scancode7
+            key8
+            mod9
+            raw10
+            down11
+            repeat12 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which6
+                >> HasCField.writeRaw (BG.Proxy @"scancode") ptr0 scancode7
+                >> HasCField.writeRaw (BG.Proxy @"key") ptr0 key8
+                >> HasCField.writeRaw (BG.Proxy @"mod") ptr0 mod9
+                >> HasCField.writeRaw (BG.Proxy @"raw") ptr0 raw10
+                >> HasCField.writeRaw (BG.Proxy @"down") ptr0 down11
+                >> HasCField.writeRaw (BG.Proxy @"repeat") ptr0 repeat12
+
+deriving via Marshal.EquivStorable SDL_KeyboardEvent instance BG.Storable SDL_KeyboardEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , scancode = BG.getField @"scancode" x0
+            , key = BG.getField @"key" x0
+            , mod = BG.getField @"mod" x0
+            , raw = BG.getField @"raw" x0
+            , down = BG.getField @"down" x0
+            , repeat = BG.getField @"repeat" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_KeyboardEvent "type'" where
+  type
+    CFieldType SDL_KeyboardEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , scancode = BG.getField @"scancode" x0
+            , key = BG.getField @"key" x0
+            , mod = BG.getField @"mod" x0
+            , raw = BG.getField @"raw" x0
+            , down = BG.getField @"down" x0
+            , repeat = BG.getField @"repeat" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_KeyboardEvent "reserved" where
+  type
+    CFieldType SDL_KeyboardEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , scancode = BG.getField @"scancode" x0
+            , key = BG.getField @"key" x0
+            , mod = BG.getField @"mod" x0
+            , raw = BG.getField @"raw" x0
+            , down = BG.getField @"down" x0
+            , repeat = BG.getField @"repeat" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_KeyboardEvent "timestamp" where
+  type
+    CFieldType SDL_KeyboardEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , scancode = BG.getField @"scancode" x0
+            , key = BG.getField @"key" x0
+            , mod = BG.getField @"mod" x0
+            , raw = BG.getField @"raw" x0
+            , down = BG.getField @"down" x0
+            , repeat = BG.getField @"repeat" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_KeyboardEvent "windowID" where
+  type
+    CFieldType SDL_KeyboardEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Keyboard.SDL_KeyboardID)
+  => BG.CompatHasField.HasField "which" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , scancode = BG.getField @"scancode" x0
+            , key = BG.getField @"key" x0
+            , mod = BG.getField @"mod" x0
+            , raw = BG.getField @"raw" x0
+            , down = BG.getField @"down" x0
+            , repeat = BG.getField @"repeat" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Keyboard.SDL_KeyboardID)
+  => BG.HasField "which" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_KeyboardEvent "which" where
+  type
+    CFieldType SDL_KeyboardEvent "which" =
+      SDL3.Sys.Bindgen.Keyboard.SDL_KeyboardID
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Scancode.SDL_Scancode)
+  => BG.CompatHasField.HasField "scancode" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { scancode = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , key = BG.getField @"key" x0
+            , mod = BG.getField @"mod" x0
+            , raw = BG.getField @"raw" x0
+            , down = BG.getField @"down" x0
+            , repeat = BG.getField @"repeat" x0
+            }
+      , BG.getField @"scancode" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Scancode.SDL_Scancode)
+  => BG.HasField "scancode" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"scancode")
+
+instance HasCField.HasCField SDL_KeyboardEvent "scancode" where
+  type
+    CFieldType SDL_KeyboardEvent "scancode" =
+      SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Keycode.SDL_Keycode)
+  => BG.CompatHasField.HasField "key" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { key = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , scancode = BG.getField @"scancode" x0
+            , mod = BG.getField @"mod" x0
+            , raw = BG.getField @"raw" x0
+            , down = BG.getField @"down" x0
+            , repeat = BG.getField @"repeat" x0
+            }
+      , BG.getField @"key" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Keycode.SDL_Keycode)
+  => BG.HasField "key" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"key")
+
+instance HasCField.HasCField SDL_KeyboardEvent "key" where
+  type
+    CFieldType SDL_KeyboardEvent "key" =
+      SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Keycode.SDL_Keymod)
+  => BG.CompatHasField.HasField "mod" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { mod = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , scancode = BG.getField @"scancode" x0
+            , key = BG.getField @"key" x0
+            , raw = BG.getField @"raw" x0
+            , down = BG.getField @"down" x0
+            , repeat = BG.getField @"repeat" x0
+            }
+      , BG.getField @"mod" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Keycode.SDL_Keymod)
+  => BG.HasField "mod" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mod")
+
+instance HasCField.HasCField SDL_KeyboardEvent "mod" where
+  type
+    CFieldType SDL_KeyboardEvent "mod" =
+      SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "raw" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { raw = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , scancode = BG.getField @"scancode" x0
+            , key = BG.getField @"key" x0
+            , mod = BG.getField @"mod" x0
+            , down = BG.getField @"down" x0
+            , repeat = BG.getField @"repeat" x0
+            }
+      , BG.getField @"raw" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "raw" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"raw")
+
+instance HasCField.HasCField SDL_KeyboardEvent "raw" where
+  type
+    CFieldType SDL_KeyboardEvent "raw" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 34
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "down" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { down = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , scancode = BG.getField @"scancode" x0
+            , key = BG.getField @"key" x0
+            , mod = BG.getField @"mod" x0
+            , raw = BG.getField @"raw" x0
+            , repeat = BG.getField @"repeat" x0
+            }
+      , BG.getField @"down" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "down" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"down")
+
+instance HasCField.HasCField SDL_KeyboardEvent "down" where
+  type CFieldType SDL_KeyboardEvent "down" = BG.CBool
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "repeat" SDL_KeyboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardEvent
+            { repeat = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , scancode = BG.getField @"scancode" x0
+            , key = BG.getField @"key" x0
+            , mod = BG.getField @"mod" x0
+            , raw = BG.getField @"raw" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"repeat" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "repeat" (BG.Ptr SDL_KeyboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"repeat")
+
+instance HasCField.HasCField SDL_KeyboardEvent "repeat" where
+  type CFieldType SDL_KeyboardEvent "repeat" = BG.CBool
+
+  offset# = \_ -> \_ -> 37
+
+-- | Keyboard text editing event structure (event.edit.*)
+--
+--     The start cursor is the position, in UTF-8 characters, where new typing will be inserted into the editing text. The length is the number of UTF-8 characters that will be replaced by new typing.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_TextEditingEvent@, defined at @SDL3\/SDL_events.h 384:16@
+data SDL_TextEditingEvent = SDL_TextEditingEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_TEXT_EDITING
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 386:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 387:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 388:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with keyboard focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 389:18@
+  , text :: PtrConst.PtrConst BG.CChar
+  -- ^ The editing text
+  --
+  --          [C declaration]: @text@, defined at @SDL3\/SDL_events.h 390:17@
+  , start :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The start cursor of selected editing text, or -1 if not set
+  --
+  --          [C declaration]: @start@, defined at @SDL3\/SDL_events.h 391:12@
+  , length :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The length of selected editing text, or -1 if not set
+  --
+  --          [C declaration]: @length@, defined at @SDL3\/SDL_events.h 392:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_TextEditingEvent where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_TextEditingEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_TextEditingEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"text") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"start") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"length") ptr0
+
+instance Marshal.WriteRaw SDL_TextEditingEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_TextEditingEvent
+            type'2
+            reserved3
+            timestamp4
+            windowID5
+            text6
+            start7
+            length8 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+                >> HasCField.writeRaw (BG.Proxy @"text") ptr0 text6
+                >> HasCField.writeRaw (BG.Proxy @"start") ptr0 start7
+                >> HasCField.writeRaw (BG.Proxy @"length") ptr0 length8
+
+deriving via Marshal.EquivStorable SDL_TextEditingEvent instance BG.Storable SDL_TextEditingEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_TextEditingEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , text = BG.getField @"text" x0
+            , start = BG.getField @"start" x0
+            , length = BG.getField @"length" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_TextEditingEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_TextEditingEvent "type'" where
+  type
+    CFieldType SDL_TextEditingEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_TextEditingEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , text = BG.getField @"text" x0
+            , start = BG.getField @"start" x0
+            , length = BG.getField @"length" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_TextEditingEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_TextEditingEvent "reserved" where
+  type
+    CFieldType SDL_TextEditingEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_TextEditingEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , text = BG.getField @"text" x0
+            , start = BG.getField @"start" x0
+            , length = BG.getField @"length" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_TextEditingEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_TextEditingEvent "timestamp" where
+  type
+    CFieldType SDL_TextEditingEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_TextEditingEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , text = BG.getField @"text" x0
+            , start = BG.getField @"start" x0
+            , length = BG.getField @"length" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_TextEditingEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_TextEditingEvent "windowID" where
+  type
+    CFieldType SDL_TextEditingEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "text" SDL_TextEditingEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingEvent
+            { text = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , start = BG.getField @"start" x0
+            , length = BG.getField @"length" x0
+            }
+      , BG.getField @"text" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "text" (BG.Ptr SDL_TextEditingEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"text")
+
+instance HasCField.HasCField SDL_TextEditingEvent "text" where
+  type
+    CFieldType SDL_TextEditingEvent "text" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "start" SDL_TextEditingEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingEvent
+            { start = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , text = BG.getField @"text" x0
+            , length = BG.getField @"length" x0
+            }
+      , BG.getField @"start" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "start" (BG.Ptr SDL_TextEditingEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"start")
+
+instance HasCField.HasCField SDL_TextEditingEvent "start" where
+  type
+    CFieldType SDL_TextEditingEvent "start" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "length" SDL_TextEditingEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingEvent
+            { length = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , text = BG.getField @"text" x0
+            , start = BG.getField @"start" x0
+            }
+      , BG.getField @"length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "length" (BG.Ptr SDL_TextEditingEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"length")
+
+instance HasCField.HasCField SDL_TextEditingEvent "length" where
+  type
+    CFieldType SDL_TextEditingEvent "length" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 36
+
+-- | Keyboard IME candidates event structure (event.edit_candidates.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_TextEditingCandidatesEvent@, defined at @SDL3\/SDL_events.h 400:16@
+data SDL_TextEditingCandidatesEvent = SDL_TextEditingCandidatesEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_TEXT_EDITING_CANDIDATES
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 402:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 403:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 404:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with keyboard focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 405:18@
+  , candidates :: PtrConst.PtrConst (PtrConst.PtrConst BG.CChar)
+  -- ^ The list of candidates, or NULL if there are no candidates available
+  --
+  --          [C declaration]: @candidates@, defined at @SDL3\/SDL_events.h 406:25@
+  , num_candidates :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The number of strings in @candidates@
+  --
+  --          [C declaration]: @num_candidates@, defined at @SDL3\/SDL_events.h 407:12@
+  , selected_candidate :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The index of the selected candidate, or -1 if no candidate is selected
+  --
+  --          [C declaration]: @selected_candidate@, defined at @SDL3\/SDL_events.h 408:12@
+  , horizontal :: BG.CBool
+  -- ^ true if the list is horizontal, false if it\'s vertical
+  --
+  --          [C declaration]: @horizontal@, defined at @SDL3\/SDL_events.h 409:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_events.h 410:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_events.h 411:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_events.h 412:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_TextEditingCandidatesEvent where
+  staticSizeOf = \_ -> (48 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_TextEditingCandidatesEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_TextEditingCandidatesEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"candidates") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_candidates") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"selected_candidate") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"horizontal") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+
+instance Marshal.WriteRaw SDL_TextEditingCandidatesEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_TextEditingCandidatesEvent
+            type'2
+            reserved3
+            timestamp4
+            windowID5
+            candidates6
+            num_candidates7
+            selected_candidate8
+            horizontal9
+            padding110
+            padding211
+            padding312 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+                >> HasCField.writeRaw (BG.Proxy @"candidates") ptr0 candidates6
+                >> HasCField.writeRaw (BG.Proxy @"num_candidates") ptr0 num_candidates7
+                >> HasCField.writeRaw (BG.Proxy @"selected_candidate") ptr0 selected_candidate8
+                >> HasCField.writeRaw (BG.Proxy @"horizontal") ptr0 horizontal9
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding110
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding211
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding312
+
+deriving via
+  Marshal.EquivStorable SDL_TextEditingCandidatesEvent
+  instance
+    BG.Storable SDL_TextEditingCandidatesEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , candidates = BG.getField @"candidates" x0
+            , num_candidates = BG.getField @"num_candidates" x0
+            , selected_candidate = BG.getField @"selected_candidate" x0
+            , horizontal = BG.getField @"horizontal" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "type'" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , candidates = BG.getField @"candidates" x0
+            , num_candidates = BG.getField @"num_candidates" x0
+            , selected_candidate = BG.getField @"selected_candidate" x0
+            , horizontal = BG.getField @"horizontal" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "reserved" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , candidates = BG.getField @"candidates" x0
+            , num_candidates = BG.getField @"num_candidates" x0
+            , selected_candidate = BG.getField @"selected_candidate" x0
+            , horizontal = BG.getField @"horizontal" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "timestamp" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , candidates = BG.getField @"candidates" x0
+            , num_candidates = BG.getField @"num_candidates" x0
+            , selected_candidate = BG.getField @"selected_candidate" x0
+            , horizontal = BG.getField @"horizontal" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "windowID" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ PtrConst.PtrConst (PtrConst.PtrConst BG.CChar))
+  => BG.CompatHasField.HasField "candidates" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { candidates = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , num_candidates = BG.getField @"num_candidates" x0
+            , selected_candidate = BG.getField @"selected_candidate" x0
+            , horizontal = BG.getField @"horizontal" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"candidates" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst (PtrConst.PtrConst BG.CChar))
+  => BG.HasField "candidates" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"candidates")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "candidates" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "candidates" =
+      PtrConst.PtrConst (PtrConst.PtrConst BG.CChar)
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "num_candidates" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { num_candidates = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , candidates = BG.getField @"candidates" x0
+            , selected_candidate = BG.getField @"selected_candidate" x0
+            , horizontal = BG.getField @"horizontal" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"num_candidates" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "num_candidates" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_candidates")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "num_candidates" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "num_candidates" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "selected_candidate" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { selected_candidate = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , candidates = BG.getField @"candidates" x0
+            , num_candidates = BG.getField @"num_candidates" x0
+            , horizontal = BG.getField @"horizontal" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"selected_candidate" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "selected_candidate" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"selected_candidate")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "selected_candidate" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "selected_candidate" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "horizontal" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { horizontal = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , candidates = BG.getField @"candidates" x0
+            , num_candidates = BG.getField @"num_candidates" x0
+            , selected_candidate = BG.getField @"selected_candidate" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"horizontal" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "horizontal" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"horizontal")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "horizontal" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "horizontal" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { padding1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , candidates = BG.getField @"candidates" x0
+            , num_candidates = BG.getField @"num_candidates" x0
+            , selected_candidate = BG.getField @"selected_candidate" x0
+            , horizontal = BG.getField @"horizontal" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "padding1" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 41
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { padding2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , candidates = BG.getField @"candidates" x0
+            , num_candidates = BG.getField @"num_candidates" x0
+            , selected_candidate = BG.getField @"selected_candidate" x0
+            , horizontal = BG.getField @"horizontal" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "padding2" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 42
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_TextEditingCandidatesEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextEditingCandidatesEvent
+            { padding3 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , candidates = BG.getField @"candidates" x0
+            , num_candidates = BG.getField @"num_candidates" x0
+            , selected_candidate = BG.getField @"selected_candidate" x0
+            , horizontal = BG.getField @"horizontal" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_TextEditingCandidatesEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_TextEditingCandidatesEvent "padding3" where
+  type
+    CFieldType SDL_TextEditingCandidatesEvent "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 43
+
+-- | Keyboard text input event structure (event.text.*)
+--
+--     This event will never be delivered unless text input is enabled by calling SDL_StartTextInput(). Text input is disabled by default!
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_StartTextInput, SDL_StopTextInput
+--
+--     [C declaration]: @struct SDL_TextInputEvent@, defined at @SDL3\/SDL_events.h 426:16@
+data SDL_TextInputEvent = SDL_TextInputEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_TEXT_INPUT
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 428:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 429:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 430:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with keyboard focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 431:18@
+  , text :: PtrConst.PtrConst BG.CChar
+  -- ^ The input text, UTF-8 encoded
+  --
+  --          [C declaration]: @text@, defined at @SDL3\/SDL_events.h 432:17@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_TextInputEvent where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_TextInputEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_TextInputEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"text") ptr0
+
+instance Marshal.WriteRaw SDL_TextInputEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_TextInputEvent type'2 reserved3 timestamp4 windowID5 text6 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+              >> HasCField.writeRaw (BG.Proxy @"text") ptr0 text6
+
+deriving via Marshal.EquivStorable SDL_TextInputEvent instance BG.Storable SDL_TextInputEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_TextInputEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextInputEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , text = BG.getField @"text" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_TextInputEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_TextInputEvent "type'" where
+  type
+    CFieldType SDL_TextInputEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_TextInputEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextInputEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , text = BG.getField @"text" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_TextInputEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_TextInputEvent "reserved" where
+  type
+    CFieldType SDL_TextInputEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_TextInputEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextInputEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , text = BG.getField @"text" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_TextInputEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_TextInputEvent "timestamp" where
+  type
+    CFieldType SDL_TextInputEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_TextInputEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextInputEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , text = BG.getField @"text" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_TextInputEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_TextInputEvent "windowID" where
+  type
+    CFieldType SDL_TextInputEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "text" SDL_TextInputEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextInputEvent
+            { text = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"text" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "text" (BG.Ptr SDL_TextInputEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"text")
+
+instance HasCField.HasCField SDL_TextInputEvent "text" where
+  type
+    CFieldType SDL_TextInputEvent "text" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 24
+
+-- | Mouse device event structure (event.mdevice.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_MouseDeviceEvent@, defined at @SDL3\/SDL_events.h 440:16@
+data SDL_MouseDeviceEvent = SDL_MouseDeviceEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_MOUSE_ADDED or SDL_EVENT_MOUSE_REMOVED
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 442:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 443:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 444:12@
+  , which :: SDL3.Sys.Bindgen.Mouse.SDL_MouseID
+  -- ^ The mouse instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 445:17@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_MouseDeviceEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_MouseDeviceEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MouseDeviceEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+
+instance Marshal.WriteRaw SDL_MouseDeviceEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MouseDeviceEvent type'2 reserved3 timestamp4 which5 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+
+deriving via Marshal.EquivStorable SDL_MouseDeviceEvent instance BG.Storable SDL_MouseDeviceEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_MouseDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseDeviceEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_MouseDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_MouseDeviceEvent "type'" where
+  type
+    CFieldType SDL_MouseDeviceEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_MouseDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseDeviceEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_MouseDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_MouseDeviceEvent "reserved" where
+  type
+    CFieldType SDL_MouseDeviceEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_MouseDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseDeviceEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_MouseDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_MouseDeviceEvent "timestamp" where
+  type
+    CFieldType SDL_MouseDeviceEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseID)
+  => BG.CompatHasField.HasField "which" SDL_MouseDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseDeviceEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseID)
+  => BG.HasField "which" (BG.Ptr SDL_MouseDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_MouseDeviceEvent "which" where
+  type
+    CFieldType SDL_MouseDeviceEvent "which" =
+      SDL3.Sys.Bindgen.Mouse.SDL_MouseID
+
+  offset# = \_ -> \_ -> 16
+
+-- | Mouse motion event structure (event.motion.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_MouseMotionEvent@, defined at @SDL3\/SDL_events.h 453:16@
+data SDL_MouseMotionEvent = SDL_MouseMotionEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_MOUSE_MOTION
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 455:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 456:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 457:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with mouse focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 458:18@
+  , which :: SDL3.Sys.Bindgen.Mouse.SDL_MouseID
+  -- ^ The mouse instance id in relative mode, SDL_TOUCH_MOUSEID for touch events, or 0
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 459:17@
+  , state :: SDL3.Sys.Bindgen.Mouse.SDL_MouseButtonFlags
+  -- ^ The current button state
+  --
+  --          [C declaration]: @state@, defined at @SDL3\/SDL_events.h 460:26@
+  , x :: BG.CFloat
+  -- ^ X coordinate, relative to window
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_events.h 461:11@
+  , y :: BG.CFloat
+  -- ^ Y coordinate, relative to window
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_events.h 462:11@
+  , xrel :: BG.CFloat
+  -- ^ The relative motion in the X direction
+  --
+  --          [C declaration]: @xrel@, defined at @SDL3\/SDL_events.h 463:11@
+  , yrel :: BG.CFloat
+  -- ^ The relative motion in the Y direction
+  --
+  --          [C declaration]: @yrel@, defined at @SDL3\/SDL_events.h 464:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_MouseMotionEvent where
+  staticSizeOf = \_ -> (48 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_MouseMotionEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MouseMotionEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"xrel") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"yrel") ptr0
+
+instance Marshal.WriteRaw SDL_MouseMotionEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MouseMotionEvent
+            type'2
+            reserved3
+            timestamp4
+            windowID5
+            which6
+            state7
+            x8
+            y9
+            xrel10
+            yrel11 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which6
+                >> HasCField.writeRaw (BG.Proxy @"state") ptr0 state7
+                >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x8
+                >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y9
+                >> HasCField.writeRaw (BG.Proxy @"xrel") ptr0 xrel10
+                >> HasCField.writeRaw (BG.Proxy @"yrel") ptr0 yrel11
+
+deriving via Marshal.EquivStorable SDL_MouseMotionEvent instance BG.Storable SDL_MouseMotionEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_MouseMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_MouseMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_MouseMotionEvent "type'" where
+  type
+    CFieldType SDL_MouseMotionEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_MouseMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_MouseMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_MouseMotionEvent "reserved" where
+  type
+    CFieldType SDL_MouseMotionEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_MouseMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_MouseMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_MouseMotionEvent "timestamp" where
+  type
+    CFieldType SDL_MouseMotionEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_MouseMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_MouseMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_MouseMotionEvent "windowID" where
+  type
+    CFieldType SDL_MouseMotionEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseID)
+  => BG.CompatHasField.HasField "which" SDL_MouseMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , state = BG.getField @"state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseID)
+  => BG.HasField "which" (BG.Ptr SDL_MouseMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_MouseMotionEvent "which" where
+  type
+    CFieldType SDL_MouseMotionEvent "which" =
+      SDL3.Sys.Bindgen.Mouse.SDL_MouseID
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseButtonFlags)
+  => BG.CompatHasField.HasField "state" SDL_MouseMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionEvent
+            { state = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"state" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseButtonFlags)
+  => BG.HasField "state" (BG.Ptr SDL_MouseMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"state")
+
+instance HasCField.HasCField SDL_MouseMotionEvent "state" where
+  type
+    CFieldType SDL_MouseMotionEvent "state" =
+      SDL3.Sys.Bindgen.Mouse.SDL_MouseButtonFlags
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_MouseMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionEvent
+            { x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , y = BG.getField @"y" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_MouseMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_MouseMotionEvent "x" where
+  type CFieldType SDL_MouseMotionEvent "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_MouseMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionEvent
+            { y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , x = BG.getField @"x" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_MouseMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_MouseMotionEvent "y" where
+  type CFieldType SDL_MouseMotionEvent "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "xrel" SDL_MouseMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionEvent
+            { xrel = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"xrel" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "xrel" (BG.Ptr SDL_MouseMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"xrel")
+
+instance HasCField.HasCField SDL_MouseMotionEvent "xrel" where
+  type
+    CFieldType SDL_MouseMotionEvent "xrel" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "yrel" SDL_MouseMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionEvent
+            { yrel = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , xrel = BG.getField @"xrel" x0
+            }
+      , BG.getField @"yrel" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "yrel" (BG.Ptr SDL_MouseMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"yrel")
+
+instance HasCField.HasCField SDL_MouseMotionEvent "yrel" where
+  type
+    CFieldType SDL_MouseMotionEvent "yrel" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 40
+
+-- | Mouse button event structure (event.button.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_MouseButtonEvent@, defined at @SDL3\/SDL_events.h 472:16@
+data SDL_MouseButtonEvent = SDL_MouseButtonEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_MOUSE_BUTTON_DOWN or SDL_EVENT_MOUSE_BUTTON_UP
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 474:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 475:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 476:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with mouse focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 477:18@
+  , which :: SDL3.Sys.Bindgen.Mouse.SDL_MouseID
+  -- ^ The mouse instance id in relative mode, SDL_TOUCH_MOUSEID for touch events, or 0
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 478:17@
+  , button :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The mouse button index
+  --
+  --          [C declaration]: @button@, defined at @SDL3\/SDL_events.h 479:11@
+  , down :: BG.CBool
+  -- ^ true if the button is pressed
+  --
+  --          [C declaration]: @down@, defined at @SDL3\/SDL_events.h 480:10@
+  , clicks :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ 1 for single-click, 2 for double-click, etc.
+  --
+  --          [C declaration]: @clicks@, defined at @SDL3\/SDL_events.h 481:11@
+  , padding :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding@, defined at @SDL3\/SDL_events.h 482:11@
+  , x :: BG.CFloat
+  -- ^ X coordinate, relative to window
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_events.h 483:11@
+  , y :: BG.CFloat
+  -- ^ Y coordinate, relative to window
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_events.h 484:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_MouseButtonEvent where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_MouseButtonEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MouseButtonEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"button") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"down") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"clicks") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+
+instance Marshal.WriteRaw SDL_MouseButtonEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MouseButtonEvent
+            type'2
+            reserved3
+            timestamp4
+            windowID5
+            which6
+            button7
+            down8
+            clicks9
+            padding10
+            x11
+            y12 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which6
+                >> HasCField.writeRaw (BG.Proxy @"button") ptr0 button7
+                >> HasCField.writeRaw (BG.Proxy @"down") ptr0 down8
+                >> HasCField.writeRaw (BG.Proxy @"clicks") ptr0 clicks9
+                >> HasCField.writeRaw (BG.Proxy @"padding") ptr0 padding10
+                >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x11
+                >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y12
+
+deriving via Marshal.EquivStorable SDL_MouseButtonEvent instance BG.Storable SDL_MouseButtonEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , clicks = BG.getField @"clicks" x0
+            , padding = BG.getField @"padding" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "type'" where
+  type
+    CFieldType SDL_MouseButtonEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , clicks = BG.getField @"clicks" x0
+            , padding = BG.getField @"padding" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "reserved" where
+  type
+    CFieldType SDL_MouseButtonEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , clicks = BG.getField @"clicks" x0
+            , padding = BG.getField @"padding" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "timestamp" where
+  type
+    CFieldType SDL_MouseButtonEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , clicks = BG.getField @"clicks" x0
+            , padding = BG.getField @"padding" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "windowID" where
+  type
+    CFieldType SDL_MouseButtonEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseID)
+  => BG.CompatHasField.HasField "which" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , clicks = BG.getField @"clicks" x0
+            , padding = BG.getField @"padding" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseID)
+  => BG.HasField "which" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "which" where
+  type
+    CFieldType SDL_MouseButtonEvent "which" =
+      SDL3.Sys.Bindgen.Mouse.SDL_MouseID
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "button" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { button = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , down = BG.getField @"down" x0
+            , clicks = BG.getField @"clicks" x0
+            , padding = BG.getField @"padding" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"button" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "button" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "button" where
+  type
+    CFieldType SDL_MouseButtonEvent "button" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "down" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { down = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , clicks = BG.getField @"clicks" x0
+            , padding = BG.getField @"padding" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"down" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "down" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"down")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "down" where
+  type
+    CFieldType SDL_MouseButtonEvent "down" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 25
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "clicks" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { clicks = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding = BG.getField @"padding" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"clicks" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "clicks" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"clicks")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "clicks" where
+  type
+    CFieldType SDL_MouseButtonEvent "clicks" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 26
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { padding = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , clicks = BG.getField @"clicks" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"padding" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "padding" where
+  type
+    CFieldType SDL_MouseButtonEvent "padding" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 27
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , clicks = BG.getField @"clicks" x0
+            , padding = BG.getField @"padding" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "x" where
+  type CFieldType SDL_MouseButtonEvent "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_MouseButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonEvent
+            { y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , clicks = BG.getField @"clicks" x0
+            , padding = BG.getField @"padding" x0
+            , x = BG.getField @"x" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_MouseButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_MouseButtonEvent "y" where
+  type CFieldType SDL_MouseButtonEvent "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 32
+
+-- | Mouse wheel event structure (event.wheel.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_MouseWheelEvent@, defined at @SDL3\/SDL_events.h 492:16@
+data SDL_MouseWheelEvent = SDL_MouseWheelEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_MOUSE_WHEEL
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 494:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 495:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 496:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with mouse focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 497:18@
+  , which :: SDL3.Sys.Bindgen.Mouse.SDL_MouseID
+  -- ^ The mouse instance id in relative mode or 0
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 498:17@
+  , x :: BG.CFloat
+  -- ^ The amount scrolled horizontally, positive to the right and negative to the left
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_events.h 499:11@
+  , y :: BG.CFloat
+  -- ^ The amount scrolled vertically, positive away from the user and negative toward the user
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_events.h 500:11@
+  , direction :: SDL3.Sys.Bindgen.Mouse.SDL_MouseWheelDirection
+  -- ^ Set to one of the SDL_MOUSEWHEEL_* defines. When FLIPPED the values in X and Y will be opposite. Multiply by -1 to change them back
+  --
+  --          [C declaration]: @direction@, defined at @SDL3\/SDL_events.h 501:29@
+  , mouse_x :: BG.CFloat
+  -- ^ X coordinate, relative to window
+  --
+  --          [C declaration]: @mouse_x@, defined at @SDL3\/SDL_events.h 502:11@
+  , mouse_y :: BG.CFloat
+  -- ^ Y coordinate, relative to window
+  --
+  --          [C declaration]: @mouse_y@, defined at @SDL3\/SDL_events.h 503:11@
+  , integer_x :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The amount scrolled horizontally, accumulated to whole scroll \"ticks\" (added in 3.2.12)
+  --
+  --          [C declaration]: @integer_x@, defined at @SDL3\/SDL_events.h 504:12@
+  , integer_y :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The amount scrolled vertically, accumulated to whole scroll \"ticks\" (added in 3.2.12)
+  --
+  --          [C declaration]: @integer_y@, defined at @SDL3\/SDL_events.h 505:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_MouseWheelEvent where
+  staticSizeOf = \_ -> (56 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_MouseWheelEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MouseWheelEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"direction") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mouse_x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mouse_y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"integer_x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"integer_y") ptr0
+
+instance Marshal.WriteRaw SDL_MouseWheelEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MouseWheelEvent
+            type'2
+            reserved3
+            timestamp4
+            windowID5
+            which6
+            x7
+            y8
+            direction9
+            mouse_x10
+            mouse_y11
+            integer_x12
+            integer_y13 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which6
+                >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x7
+                >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y8
+                >> HasCField.writeRaw (BG.Proxy @"direction") ptr0 direction9
+                >> HasCField.writeRaw (BG.Proxy @"mouse_x") ptr0 mouse_x10
+                >> HasCField.writeRaw (BG.Proxy @"mouse_y") ptr0 mouse_y11
+                >> HasCField.writeRaw (BG.Proxy @"integer_x") ptr0 integer_x12
+                >> HasCField.writeRaw (BG.Proxy @"integer_y") ptr0 integer_y13
+
+deriving via Marshal.EquivStorable SDL_MouseWheelEvent instance BG.Storable SDL_MouseWheelEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_x = BG.getField @"integer_x" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "type'" where
+  type
+    CFieldType SDL_MouseWheelEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_x = BG.getField @"integer_x" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "reserved" where
+  type
+    CFieldType SDL_MouseWheelEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_x = BG.getField @"integer_x" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "timestamp" where
+  type
+    CFieldType SDL_MouseWheelEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_x = BG.getField @"integer_x" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "windowID" where
+  type
+    CFieldType SDL_MouseWheelEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseID)
+  => BG.CompatHasField.HasField "which" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_x = BG.getField @"integer_x" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseID)
+  => BG.HasField "which" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "which" where
+  type
+    CFieldType SDL_MouseWheelEvent "which" =
+      SDL3.Sys.Bindgen.Mouse.SDL_MouseID
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , y = BG.getField @"y" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_x = BG.getField @"integer_x" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "x" where
+  type CFieldType SDL_MouseWheelEvent "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_x = BG.getField @"integer_x" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "y" where
+  type CFieldType SDL_MouseWheelEvent "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseWheelDirection)
+  => BG.CompatHasField.HasField "direction" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { direction = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_x = BG.getField @"integer_x" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"direction" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Mouse.SDL_MouseWheelDirection)
+  => BG.HasField "direction" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"direction")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "direction" where
+  type
+    CFieldType SDL_MouseWheelEvent "direction" =
+      SDL3.Sys.Bindgen.Mouse.SDL_MouseWheelDirection
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "mouse_x" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { mouse_x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_x = BG.getField @"integer_x" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"mouse_x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "mouse_x" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mouse_x")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "mouse_x" where
+  type
+    CFieldType SDL_MouseWheelEvent "mouse_x" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "mouse_y" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { mouse_y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , integer_x = BG.getField @"integer_x" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"mouse_y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "mouse_y" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mouse_y")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "mouse_y" where
+  type
+    CFieldType SDL_MouseWheelEvent "mouse_y" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "integer_x" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { integer_x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_y = BG.getField @"integer_y" x0
+            }
+      , BG.getField @"integer_x" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "integer_x" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"integer_x")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "integer_x" where
+  type
+    CFieldType SDL_MouseWheelEvent "integer_x" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 44
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "integer_y" SDL_MouseWheelEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelEvent
+            { integer_y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , direction = BG.getField @"direction" x0
+            , mouse_x = BG.getField @"mouse_x" x0
+            , mouse_y = BG.getField @"mouse_y" x0
+            , integer_x = BG.getField @"integer_x" x0
+            }
+      , BG.getField @"integer_y" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "integer_y" (BG.Ptr SDL_MouseWheelEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"integer_y")
+
+instance HasCField.HasCField SDL_MouseWheelEvent "integer_y" where
+  type
+    CFieldType SDL_MouseWheelEvent "integer_y" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 48
+
+-- | Joystick axis motion event structure (event.jaxis.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_JoyAxisEvent@, defined at @SDL3\/SDL_events.h 513:16@
+data SDL_JoyAxisEvent = SDL_JoyAxisEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_JOYSTICK_AXIS_MOTION
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 515:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 516:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 517:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 518:20@
+  , axis :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The joystick axis index
+  --
+  --          [C declaration]: @axis@, defined at @SDL3\/SDL_events.h 519:11@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_events.h 520:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_events.h 521:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_events.h 522:11@
+  , value :: SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ The axis value (range: -32768 to 32767)
+  --
+  --          [C declaration]: @value@, defined at @SDL3\/SDL_events.h 523:12@
+  , padding4 :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ [C declaration]: @padding4@, defined at @SDL3\/SDL_events.h 524:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_JoyAxisEvent where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_JoyAxisEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_JoyAxisEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"axis") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"value") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding4") ptr0
+
+instance Marshal.WriteRaw SDL_JoyAxisEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_JoyAxisEvent
+            type'2
+            reserved3
+            timestamp4
+            which5
+            axis6
+            padding17
+            padding28
+            padding39
+            value10
+            padding411 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+                >> HasCField.writeRaw (BG.Proxy @"axis") ptr0 axis6
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding17
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding28
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding39
+                >> HasCField.writeRaw (BG.Proxy @"value") ptr0 value10
+                >> HasCField.writeRaw (BG.Proxy @"padding4") ptr0 padding411
+
+deriving via Marshal.EquivStorable SDL_JoyAxisEvent instance BG.Storable SDL_JoyAxisEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_JoyAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyAxisEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_JoyAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_JoyAxisEvent "type'" where
+  type
+    CFieldType SDL_JoyAxisEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_JoyAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyAxisEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_JoyAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_JoyAxisEvent "reserved" where
+  type
+    CFieldType SDL_JoyAxisEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_JoyAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyAxisEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_JoyAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_JoyAxisEvent "timestamp" where
+  type
+    CFieldType SDL_JoyAxisEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_JoyAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyAxisEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_JoyAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_JoyAxisEvent "which" where
+  type
+    CFieldType SDL_JoyAxisEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "axis" SDL_JoyAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyAxisEvent
+            { axis = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"axis" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "axis" (BG.Ptr SDL_JoyAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis")
+
+instance HasCField.HasCField SDL_JoyAxisEvent "axis" where
+  type
+    CFieldType SDL_JoyAxisEvent "axis" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_JoyAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyAxisEvent
+            { padding1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_JoyAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_JoyAxisEvent "padding1" where
+  type
+    CFieldType SDL_JoyAxisEvent "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 21
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_JoyAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyAxisEvent
+            { padding2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_JoyAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_JoyAxisEvent "padding2" where
+  type
+    CFieldType SDL_JoyAxisEvent "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 22
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_JoyAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyAxisEvent
+            { padding3 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_JoyAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_JoyAxisEvent "padding3" where
+  type
+    CFieldType SDL_JoyAxisEvent "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 23
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "value" SDL_JoyAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyAxisEvent
+            { value = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"value" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "value" (BG.Ptr SDL_JoyAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"value")
+
+instance HasCField.HasCField SDL_JoyAxisEvent "value" where
+  type
+    CFieldType SDL_JoyAxisEvent "value" =
+      SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "padding4" SDL_JoyAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyAxisEvent
+            { padding4 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"padding4" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "padding4" (BG.Ptr SDL_JoyAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding4")
+
+instance HasCField.HasCField SDL_JoyAxisEvent "padding4" where
+  type
+    CFieldType SDL_JoyAxisEvent "padding4" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 26
+
+-- | Joystick trackball motion event structure (event.jball.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_JoyBallEvent@, defined at @SDL3\/SDL_events.h 532:16@
+data SDL_JoyBallEvent = SDL_JoyBallEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_JOYSTICK_BALL_MOTION
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 534:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 535:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 536:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 537:20@
+  , ball :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The joystick trackball index
+  --
+  --          [C declaration]: @ball@, defined at @SDL3\/SDL_events.h 538:11@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_events.h 539:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_events.h 540:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_events.h 541:11@
+  , xrel :: SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ The relative motion in the X direction
+  --
+  --          [C declaration]: @xrel@, defined at @SDL3\/SDL_events.h 542:12@
+  , yrel :: SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ The relative motion in the Y direction
+  --
+  --          [C declaration]: @yrel@, defined at @SDL3\/SDL_events.h 543:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_JoyBallEvent where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_JoyBallEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_JoyBallEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"ball") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"xrel") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"yrel") ptr0
+
+instance Marshal.WriteRaw SDL_JoyBallEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_JoyBallEvent
+            type'2
+            reserved3
+            timestamp4
+            which5
+            ball6
+            padding17
+            padding28
+            padding39
+            xrel10
+            yrel11 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+                >> HasCField.writeRaw (BG.Proxy @"ball") ptr0 ball6
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding17
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding28
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding39
+                >> HasCField.writeRaw (BG.Proxy @"xrel") ptr0 xrel10
+                >> HasCField.writeRaw (BG.Proxy @"yrel") ptr0 yrel11
+
+deriving via Marshal.EquivStorable SDL_JoyBallEvent instance BG.Storable SDL_JoyBallEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_JoyBallEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBallEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , ball = BG.getField @"ball" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_JoyBallEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_JoyBallEvent "type'" where
+  type
+    CFieldType SDL_JoyBallEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_JoyBallEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBallEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , ball = BG.getField @"ball" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_JoyBallEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_JoyBallEvent "reserved" where
+  type
+    CFieldType SDL_JoyBallEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_JoyBallEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBallEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , ball = BG.getField @"ball" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_JoyBallEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_JoyBallEvent "timestamp" where
+  type
+    CFieldType SDL_JoyBallEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_JoyBallEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBallEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , ball = BG.getField @"ball" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_JoyBallEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_JoyBallEvent "which" where
+  type
+    CFieldType SDL_JoyBallEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "ball" SDL_JoyBallEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBallEvent
+            { ball = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"ball" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "ball" (BG.Ptr SDL_JoyBallEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"ball")
+
+instance HasCField.HasCField SDL_JoyBallEvent "ball" where
+  type
+    CFieldType SDL_JoyBallEvent "ball" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_JoyBallEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBallEvent
+            { padding1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , ball = BG.getField @"ball" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_JoyBallEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_JoyBallEvent "padding1" where
+  type
+    CFieldType SDL_JoyBallEvent "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 21
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_JoyBallEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBallEvent
+            { padding2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , ball = BG.getField @"ball" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding3 = BG.getField @"padding3" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_JoyBallEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_JoyBallEvent "padding2" where
+  type
+    CFieldType SDL_JoyBallEvent "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 22
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_JoyBallEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBallEvent
+            { padding3 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , ball = BG.getField @"ball" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , xrel = BG.getField @"xrel" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_JoyBallEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_JoyBallEvent "padding3" where
+  type
+    CFieldType SDL_JoyBallEvent "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 23
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "xrel" SDL_JoyBallEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBallEvent
+            { xrel = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , ball = BG.getField @"ball" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , yrel = BG.getField @"yrel" x0
+            }
+      , BG.getField @"xrel" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "xrel" (BG.Ptr SDL_JoyBallEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"xrel")
+
+instance HasCField.HasCField SDL_JoyBallEvent "xrel" where
+  type
+    CFieldType SDL_JoyBallEvent "xrel" =
+      SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "yrel" SDL_JoyBallEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBallEvent
+            { yrel = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , ball = BG.getField @"ball" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , xrel = BG.getField @"xrel" x0
+            }
+      , BG.getField @"yrel" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "yrel" (BG.Ptr SDL_JoyBallEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"yrel")
+
+instance HasCField.HasCField SDL_JoyBallEvent "yrel" where
+  type
+    CFieldType SDL_JoyBallEvent "yrel" =
+      SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 26
+
+-- | Joystick hat position change event structure (event.jhat.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_JoyHatEvent@, defined at @SDL3\/SDL_events.h 551:16@
+data SDL_JoyHatEvent = SDL_JoyHatEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_JOYSTICK_HAT_MOTION
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 553:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 554:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 555:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 556:20@
+  , hat :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The joystick hat index
+  --
+  --          [C declaration]: @hat@, defined at @SDL3\/SDL_events.h 557:11@
+  , value :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The hat position value. Note that zero means the POV is centered.
+  --
+  --          [See also]: SDL_HAT_LEFTUP SDL_HAT_UP SDL_HAT_RIGHTUP, SDL_HAT_LEFT SDL_HAT_CENTERED SDL_HAT_RIGHT, SDL_HAT_LEFTDOWN SDL_HAT_DOWN SDL_HAT_RIGHTDOWN
+  --
+  --          [C declaration]: @value@, defined at @SDL3\/SDL_events.h 558:11@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_events.h 565:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_events.h 566:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_JoyHatEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_JoyHatEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_JoyHatEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"hat") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"value") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+
+instance Marshal.WriteRaw SDL_JoyHatEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_JoyHatEvent
+            type'2
+            reserved3
+            timestamp4
+            which5
+            hat6
+            value7
+            padding18
+            padding29 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+                >> HasCField.writeRaw (BG.Proxy @"hat") ptr0 hat6
+                >> HasCField.writeRaw (BG.Proxy @"value") ptr0 value7
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding18
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding29
+
+deriving via Marshal.EquivStorable SDL_JoyHatEvent instance BG.Storable SDL_JoyHatEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_JoyHatEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyHatEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , hat = BG.getField @"hat" x0
+            , value = BG.getField @"value" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_JoyHatEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_JoyHatEvent "type'" where
+  type
+    CFieldType SDL_JoyHatEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_JoyHatEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyHatEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , hat = BG.getField @"hat" x0
+            , value = BG.getField @"value" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_JoyHatEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_JoyHatEvent "reserved" where
+  type
+    CFieldType SDL_JoyHatEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_JoyHatEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyHatEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , hat = BG.getField @"hat" x0
+            , value = BG.getField @"value" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_JoyHatEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_JoyHatEvent "timestamp" where
+  type
+    CFieldType SDL_JoyHatEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_JoyHatEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyHatEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , hat = BG.getField @"hat" x0
+            , value = BG.getField @"value" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_JoyHatEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_JoyHatEvent "which" where
+  type
+    CFieldType SDL_JoyHatEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "hat" SDL_JoyHatEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyHatEvent
+            { hat = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , value = BG.getField @"value" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"hat" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "hat" (BG.Ptr SDL_JoyHatEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"hat")
+
+instance HasCField.HasCField SDL_JoyHatEvent "hat" where
+  type
+    CFieldType SDL_JoyHatEvent "hat" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "value" SDL_JoyHatEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyHatEvent
+            { value = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , hat = BG.getField @"hat" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"value" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "value" (BG.Ptr SDL_JoyHatEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"value")
+
+instance HasCField.HasCField SDL_JoyHatEvent "value" where
+  type
+    CFieldType SDL_JoyHatEvent "value" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 21
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_JoyHatEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyHatEvent
+            { padding1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , hat = BG.getField @"hat" x0
+            , value = BG.getField @"value" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_JoyHatEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_JoyHatEvent "padding1" where
+  type
+    CFieldType SDL_JoyHatEvent "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 22
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_JoyHatEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyHatEvent
+            { padding2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , hat = BG.getField @"hat" x0
+            , value = BG.getField @"value" x0
+            , padding1 = BG.getField @"padding1" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_JoyHatEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_JoyHatEvent "padding2" where
+  type
+    CFieldType SDL_JoyHatEvent "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 23
+
+-- | Joystick button event structure (event.jbutton.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_JoyButtonEvent@, defined at @SDL3\/SDL_events.h 574:16@
+data SDL_JoyButtonEvent = SDL_JoyButtonEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_JOYSTICK_BUTTON_DOWN or SDL_EVENT_JOYSTICK_BUTTON_UP
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 576:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 577:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 578:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 579:20@
+  , button :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The joystick button index
+  --
+  --          [C declaration]: @button@, defined at @SDL3\/SDL_events.h 580:11@
+  , down :: BG.CBool
+  -- ^ true if the button is pressed
+  --
+  --          [C declaration]: @down@, defined at @SDL3\/SDL_events.h 581:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_events.h 582:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_events.h 583:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_JoyButtonEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_JoyButtonEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_JoyButtonEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"button") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"down") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+
+instance Marshal.WriteRaw SDL_JoyButtonEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_JoyButtonEvent
+            type'2
+            reserved3
+            timestamp4
+            which5
+            button6
+            down7
+            padding18
+            padding29 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+                >> HasCField.writeRaw (BG.Proxy @"button") ptr0 button6
+                >> HasCField.writeRaw (BG.Proxy @"down") ptr0 down7
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding18
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding29
+
+deriving via Marshal.EquivStorable SDL_JoyButtonEvent instance BG.Storable SDL_JoyButtonEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_JoyButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyButtonEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_JoyButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_JoyButtonEvent "type'" where
+  type
+    CFieldType SDL_JoyButtonEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_JoyButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyButtonEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_JoyButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_JoyButtonEvent "reserved" where
+  type
+    CFieldType SDL_JoyButtonEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_JoyButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyButtonEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_JoyButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_JoyButtonEvent "timestamp" where
+  type
+    CFieldType SDL_JoyButtonEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_JoyButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyButtonEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_JoyButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_JoyButtonEvent "which" where
+  type
+    CFieldType SDL_JoyButtonEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "button" SDL_JoyButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyButtonEvent
+            { button = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"button" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "button" (BG.Ptr SDL_JoyButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_JoyButtonEvent "button" where
+  type
+    CFieldType SDL_JoyButtonEvent "button" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "down" SDL_JoyButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyButtonEvent
+            { down = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"down" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "down" (BG.Ptr SDL_JoyButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"down")
+
+instance HasCField.HasCField SDL_JoyButtonEvent "down" where
+  type CFieldType SDL_JoyButtonEvent "down" = BG.CBool
+
+  offset# = \_ -> \_ -> 21
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_JoyButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyButtonEvent
+            { padding1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_JoyButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_JoyButtonEvent "padding1" where
+  type
+    CFieldType SDL_JoyButtonEvent "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 22
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_JoyButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyButtonEvent
+            { padding2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_JoyButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_JoyButtonEvent "padding2" where
+  type
+    CFieldType SDL_JoyButtonEvent "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 23
+
+-- | Joystick device event structure (event.jdevice.*)
+--
+--     SDL will send JOYSTICK_ADDED events for devices that are already plugged in during SDL_Init.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GamepadDeviceEvent'
+--
+--     [C declaration]: @struct SDL_JoyDeviceEvent@, defined at @SDL3\/SDL_events.h 596:16@
+data SDL_JoyDeviceEvent = SDL_JoyDeviceEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_JOYSTICK_ADDED or SDL_EVENT_JOYSTICK_REMOVED or SDL_EVENT_JOYSTICK_UPDATE_COMPLETE
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 598:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 599:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 600:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 601:20@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_JoyDeviceEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_JoyDeviceEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_JoyDeviceEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+
+instance Marshal.WriteRaw SDL_JoyDeviceEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_JoyDeviceEvent type'2 reserved3 timestamp4 which5 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+
+deriving via Marshal.EquivStorable SDL_JoyDeviceEvent instance BG.Storable SDL_JoyDeviceEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_JoyDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyDeviceEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_JoyDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_JoyDeviceEvent "type'" where
+  type
+    CFieldType SDL_JoyDeviceEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_JoyDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyDeviceEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_JoyDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_JoyDeviceEvent "reserved" where
+  type
+    CFieldType SDL_JoyDeviceEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_JoyDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyDeviceEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_JoyDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_JoyDeviceEvent "timestamp" where
+  type
+    CFieldType SDL_JoyDeviceEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_JoyDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyDeviceEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_JoyDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_JoyDeviceEvent "which" where
+  type
+    CFieldType SDL_JoyDeviceEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+-- | Joystick battery level change event structure (event.jbattery.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_JoyBatteryEvent@, defined at @SDL3\/SDL_events.h 609:16@
+data SDL_JoyBatteryEvent = SDL_JoyBatteryEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_JOYSTICK_BATTERY_UPDATED
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 611:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 612:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 613:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 614:20@
+  , state :: SDL3.Sys.Bindgen.Power.SDL_PowerState
+  -- ^ The joystick battery state
+  --
+  --          [C declaration]: @state@, defined at @SDL3\/SDL_events.h 615:20@
+  , percent :: BG.CInt
+  -- ^ The joystick battery percent charge remaining
+  --
+  --          [C declaration]: @percent@, defined at @SDL3\/SDL_events.h 616:9@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_JoyBatteryEvent where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_JoyBatteryEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_JoyBatteryEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"percent") ptr0
+
+instance Marshal.WriteRaw SDL_JoyBatteryEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_JoyBatteryEvent type'2 reserved3 timestamp4 which5 state6 percent7 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+              >> HasCField.writeRaw (BG.Proxy @"state") ptr0 state6
+              >> HasCField.writeRaw (BG.Proxy @"percent") ptr0 percent7
+
+deriving via Marshal.EquivStorable SDL_JoyBatteryEvent instance BG.Storable SDL_JoyBatteryEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_JoyBatteryEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBatteryEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , percent = BG.getField @"percent" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_JoyBatteryEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_JoyBatteryEvent "type'" where
+  type
+    CFieldType SDL_JoyBatteryEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_JoyBatteryEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBatteryEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , percent = BG.getField @"percent" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_JoyBatteryEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_JoyBatteryEvent "reserved" where
+  type
+    CFieldType SDL_JoyBatteryEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_JoyBatteryEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBatteryEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            , percent = BG.getField @"percent" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_JoyBatteryEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_JoyBatteryEvent "timestamp" where
+  type
+    CFieldType SDL_JoyBatteryEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_JoyBatteryEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBatteryEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , state = BG.getField @"state" x0
+            , percent = BG.getField @"percent" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_JoyBatteryEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_JoyBatteryEvent "which" where
+  type
+    CFieldType SDL_JoyBatteryEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Power.SDL_PowerState)
+  => BG.CompatHasField.HasField "state" SDL_JoyBatteryEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBatteryEvent
+            { state = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , percent = BG.getField @"percent" x0
+            }
+      , BG.getField @"state" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Power.SDL_PowerState)
+  => BG.HasField "state" (BG.Ptr SDL_JoyBatteryEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"state")
+
+instance HasCField.HasCField SDL_JoyBatteryEvent "state" where
+  type
+    CFieldType SDL_JoyBatteryEvent "state" =
+      SDL3.Sys.Bindgen.Power.SDL_PowerState
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "percent" SDL_JoyBatteryEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoyBatteryEvent
+            { percent = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , state = BG.getField @"state" x0
+            }
+      , BG.getField @"percent" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "percent" (BG.Ptr SDL_JoyBatteryEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"percent")
+
+instance HasCField.HasCField SDL_JoyBatteryEvent "percent" where
+  type
+    CFieldType SDL_JoyBatteryEvent "percent" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 24
+
+-- | Gamepad axis motion event structure (event.gaxis.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_GamepadAxisEvent@, defined at @SDL3\/SDL_events.h 624:16@
+data SDL_GamepadAxisEvent = SDL_GamepadAxisEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_GAMEPAD_AXIS_MOTION
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 626:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 627:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 628:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 629:20@
+  , axis :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The gamepad axis (SDL_GamepadAxis)
+  --
+  --          [C declaration]: @axis@, defined at @SDL3\/SDL_events.h 630:11@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_events.h 631:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_events.h 632:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_events.h 633:11@
+  , value :: SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ The axis value (range: -32768 to 32767)
+  --
+  --          [C declaration]: @value@, defined at @SDL3\/SDL_events.h 634:12@
+  , padding4 :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ [C declaration]: @padding4@, defined at @SDL3\/SDL_events.h 635:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GamepadAxisEvent where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadAxisEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadAxisEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"axis") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"value") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding4") ptr0
+
+instance Marshal.WriteRaw SDL_GamepadAxisEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadAxisEvent
+            type'2
+            reserved3
+            timestamp4
+            which5
+            axis6
+            padding17
+            padding28
+            padding39
+            value10
+            padding411 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+                >> HasCField.writeRaw (BG.Proxy @"axis") ptr0 axis6
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding17
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding28
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding39
+                >> HasCField.writeRaw (BG.Proxy @"value") ptr0 value10
+                >> HasCField.writeRaw (BG.Proxy @"padding4") ptr0 padding411
+
+deriving via Marshal.EquivStorable SDL_GamepadAxisEvent instance BG.Storable SDL_GamepadAxisEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_GamepadAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxisEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_GamepadAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_GamepadAxisEvent "type'" where
+  type
+    CFieldType SDL_GamepadAxisEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_GamepadAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxisEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_GamepadAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_GamepadAxisEvent "reserved" where
+  type
+    CFieldType SDL_GamepadAxisEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_GamepadAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxisEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_GamepadAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_GamepadAxisEvent "timestamp" where
+  type
+    CFieldType SDL_GamepadAxisEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_GamepadAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxisEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_GamepadAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_GamepadAxisEvent "which" where
+  type
+    CFieldType SDL_GamepadAxisEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "axis" SDL_GamepadAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxisEvent
+            { axis = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"axis" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "axis" (BG.Ptr SDL_GamepadAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis")
+
+instance HasCField.HasCField SDL_GamepadAxisEvent "axis" where
+  type
+    CFieldType SDL_GamepadAxisEvent "axis" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GamepadAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxisEvent
+            { padding1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GamepadAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GamepadAxisEvent "padding1" where
+  type
+    CFieldType SDL_GamepadAxisEvent "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 21
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GamepadAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxisEvent
+            { padding2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GamepadAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GamepadAxisEvent "padding2" where
+  type
+    CFieldType SDL_GamepadAxisEvent "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 22
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_GamepadAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxisEvent
+            { padding3 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , value = BG.getField @"value" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_GamepadAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_GamepadAxisEvent "padding3" where
+  type
+    CFieldType SDL_GamepadAxisEvent "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 23
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "value" SDL_GamepadAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxisEvent
+            { value = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , padding4 = BG.getField @"padding4" x0
+            }
+      , BG.getField @"value" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "value" (BG.Ptr SDL_GamepadAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"value")
+
+instance HasCField.HasCField SDL_GamepadAxisEvent "value" where
+  type
+    CFieldType SDL_GamepadAxisEvent "value" =
+      SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "padding4" SDL_GamepadAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxisEvent
+            { padding4 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , axis = BG.getField @"axis" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"padding4" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "padding4" (BG.Ptr SDL_GamepadAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding4")
+
+instance HasCField.HasCField SDL_GamepadAxisEvent "padding4" where
+  type
+    CFieldType SDL_GamepadAxisEvent "padding4" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 26
+
+-- | Gamepad button event structure (event.gbutton.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_GamepadButtonEvent@, defined at @SDL3\/SDL_events.h 644:16@
+data SDL_GamepadButtonEvent = SDL_GamepadButtonEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_GAMEPAD_BUTTON_DOWN or SDL_EVENT_GAMEPAD_BUTTON_UP
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 646:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 647:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 648:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 649:20@
+  , button :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The gamepad button (SDL_GamepadButton)
+  --
+  --          [C declaration]: @button@, defined at @SDL3\/SDL_events.h 650:11@
+  , down :: BG.CBool
+  -- ^ true if the button is pressed
+  --
+  --          [C declaration]: @down@, defined at @SDL3\/SDL_events.h 651:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_events.h 652:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_events.h 653:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GamepadButtonEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadButtonEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadButtonEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"button") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"down") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+
+instance Marshal.WriteRaw SDL_GamepadButtonEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadButtonEvent
+            type'2
+            reserved3
+            timestamp4
+            which5
+            button6
+            down7
+            padding18
+            padding29 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+                >> HasCField.writeRaw (BG.Proxy @"button") ptr0 button6
+                >> HasCField.writeRaw (BG.Proxy @"down") ptr0 down7
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding18
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding29
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadButtonEvent
+  instance
+    BG.Storable SDL_GamepadButtonEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_GamepadButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadButtonEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_GamepadButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_GamepadButtonEvent "type'" where
+  type
+    CFieldType SDL_GamepadButtonEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_GamepadButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadButtonEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_GamepadButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_GamepadButtonEvent "reserved" where
+  type
+    CFieldType SDL_GamepadButtonEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_GamepadButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadButtonEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_GamepadButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_GamepadButtonEvent "timestamp" where
+  type
+    CFieldType SDL_GamepadButtonEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_GamepadButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadButtonEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_GamepadButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_GamepadButtonEvent "which" where
+  type
+    CFieldType SDL_GamepadButtonEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "button" SDL_GamepadButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadButtonEvent
+            { button = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"button" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "button" (BG.Ptr SDL_GamepadButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_GamepadButtonEvent "button" where
+  type
+    CFieldType SDL_GamepadButtonEvent "button" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "down" SDL_GamepadButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadButtonEvent
+            { down = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"down" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "down" (BG.Ptr SDL_GamepadButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"down")
+
+instance HasCField.HasCField SDL_GamepadButtonEvent "down" where
+  type
+    CFieldType SDL_GamepadButtonEvent "down" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 21
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GamepadButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadButtonEvent
+            { padding1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GamepadButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GamepadButtonEvent "padding1" where
+  type
+    CFieldType SDL_GamepadButtonEvent "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 22
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GamepadButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadButtonEvent
+            { padding2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            , padding1 = BG.getField @"padding1" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GamepadButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GamepadButtonEvent "padding2" where
+  type
+    CFieldType SDL_GamepadButtonEvent "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 23
+
+-- | Gamepad device event structure (event.gdevice.*)
+--
+--     Joysticks that are supported gamepads receive both an 'SDL_JoyDeviceEvent' and an 'SDL_GamepadDeviceEvent'.
+--
+--     SDL will send GAMEPAD_ADDED events for joysticks that are already plugged in during SDL_Init() and are recognized as gamepads. It will also send events for joysticks that get gamepad mappings at runtime.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_JoyDeviceEvent'
+--
+--     [C declaration]: @struct SDL_GamepadDeviceEvent@, defined at @SDL3\/SDL_events.h 671:16@
+data SDL_GamepadDeviceEvent = SDL_GamepadDeviceEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_GAMEPAD_ADDED, SDL_EVENT_GAMEPAD_REMOVED, or SDL_EVENT_GAMEPAD_REMAPPED, SDL_EVENT_GAMEPAD_UPDATE_COMPLETE or SDL_EVENT_GAMEPAD_STEAM_HANDLE_UPDATED
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 673:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 674:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 675:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 676:20@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GamepadDeviceEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadDeviceEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadDeviceEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+
+instance Marshal.WriteRaw SDL_GamepadDeviceEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadDeviceEvent type'2 reserved3 timestamp4 which5 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadDeviceEvent
+  instance
+    BG.Storable SDL_GamepadDeviceEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_GamepadDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadDeviceEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_GamepadDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_GamepadDeviceEvent "type'" where
+  type
+    CFieldType SDL_GamepadDeviceEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_GamepadDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadDeviceEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_GamepadDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_GamepadDeviceEvent "reserved" where
+  type
+    CFieldType SDL_GamepadDeviceEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_GamepadDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadDeviceEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_GamepadDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_GamepadDeviceEvent "timestamp" where
+  type
+    CFieldType SDL_GamepadDeviceEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_GamepadDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadDeviceEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_GamepadDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_GamepadDeviceEvent "which" where
+  type
+    CFieldType SDL_GamepadDeviceEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+-- | Gamepad touchpad event structure (event.gtouchpad.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_GamepadTouchpadEvent@, defined at @SDL3\/SDL_events.h 684:16@
+data SDL_GamepadTouchpadEvent = SDL_GamepadTouchpadEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_GAMEPAD_TOUCHPAD_DOWN or SDL_EVENT_GAMEPAD_TOUCHPAD_MOTION or SDL_EVENT_GAMEPAD_TOUCHPAD_UP
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 686:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 687:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 688:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 689:20@
+  , touchpad :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The index of the touchpad
+  --
+  --          [C declaration]: @touchpad@, defined at @SDL3\/SDL_events.h 690:12@
+  , finger :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The index of the finger on the touchpad
+  --
+  --          [C declaration]: @finger@, defined at @SDL3\/SDL_events.h 691:12@
+  , x :: BG.CFloat
+  -- ^ Normalized in the range 0...1 with 0 being on the left
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_events.h 692:11@
+  , y :: BG.CFloat
+  -- ^ Normalized in the range 0...1 with 0 being at the top
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_events.h 693:11@
+  , pressure :: BG.CFloat
+  -- ^ Normalized in the range 0...1
+  --
+  --          [C declaration]: @pressure@, defined at @SDL3\/SDL_events.h 694:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GamepadTouchpadEvent where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadTouchpadEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadTouchpadEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"touchpad") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"finger") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pressure") ptr0
+
+instance Marshal.WriteRaw SDL_GamepadTouchpadEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadTouchpadEvent
+            type'2
+            reserved3
+            timestamp4
+            which5
+            touchpad6
+            finger7
+            x8
+            y9
+            pressure10 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+                >> HasCField.writeRaw (BG.Proxy @"touchpad") ptr0 touchpad6
+                >> HasCField.writeRaw (BG.Proxy @"finger") ptr0 finger7
+                >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x8
+                >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y9
+                >> HasCField.writeRaw (BG.Proxy @"pressure") ptr0 pressure10
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadTouchpadEvent
+  instance
+    BG.Storable SDL_GamepadTouchpadEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_GamepadTouchpadEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadTouchpadEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , touchpad = BG.getField @"touchpad" x0
+            , finger = BG.getField @"finger" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_GamepadTouchpadEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_GamepadTouchpadEvent "type'" where
+  type
+    CFieldType SDL_GamepadTouchpadEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_GamepadTouchpadEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadTouchpadEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , touchpad = BG.getField @"touchpad" x0
+            , finger = BG.getField @"finger" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_GamepadTouchpadEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_GamepadTouchpadEvent "reserved" where
+  type
+    CFieldType SDL_GamepadTouchpadEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_GamepadTouchpadEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadTouchpadEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , touchpad = BG.getField @"touchpad" x0
+            , finger = BG.getField @"finger" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_GamepadTouchpadEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_GamepadTouchpadEvent "timestamp" where
+  type
+    CFieldType SDL_GamepadTouchpadEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_GamepadTouchpadEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadTouchpadEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , touchpad = BG.getField @"touchpad" x0
+            , finger = BG.getField @"finger" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_GamepadTouchpadEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_GamepadTouchpadEvent "which" where
+  type
+    CFieldType SDL_GamepadTouchpadEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "touchpad" SDL_GamepadTouchpadEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadTouchpadEvent
+            { touchpad = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , finger = BG.getField @"finger" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"touchpad" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "touchpad" (BG.Ptr SDL_GamepadTouchpadEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"touchpad")
+
+instance HasCField.HasCField SDL_GamepadTouchpadEvent "touchpad" where
+  type
+    CFieldType SDL_GamepadTouchpadEvent "touchpad" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "finger" SDL_GamepadTouchpadEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadTouchpadEvent
+            { finger = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , touchpad = BG.getField @"touchpad" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"finger" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "finger" (BG.Ptr SDL_GamepadTouchpadEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"finger")
+
+instance HasCField.HasCField SDL_GamepadTouchpadEvent "finger" where
+  type
+    CFieldType SDL_GamepadTouchpadEvent "finger" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_GamepadTouchpadEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadTouchpadEvent
+            { x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , touchpad = BG.getField @"touchpad" x0
+            , finger = BG.getField @"finger" x0
+            , y = BG.getField @"y" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_GamepadTouchpadEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_GamepadTouchpadEvent "x" where
+  type
+    CFieldType SDL_GamepadTouchpadEvent "x" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_GamepadTouchpadEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadTouchpadEvent
+            { y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , touchpad = BG.getField @"touchpad" x0
+            , finger = BG.getField @"finger" x0
+            , x = BG.getField @"x" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_GamepadTouchpadEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_GamepadTouchpadEvent "y" where
+  type
+    CFieldType SDL_GamepadTouchpadEvent "y" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "pressure" SDL_GamepadTouchpadEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadTouchpadEvent
+            { pressure = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , touchpad = BG.getField @"touchpad" x0
+            , finger = BG.getField @"finger" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"pressure" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "pressure" (BG.Ptr SDL_GamepadTouchpadEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pressure")
+
+instance HasCField.HasCField SDL_GamepadTouchpadEvent "pressure" where
+  type
+    CFieldType SDL_GamepadTouchpadEvent "pressure" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 36
+
+-- | Gamepad sensor event structure (event.gsensor.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_GamepadSensorEvent@, defined at @SDL3\/SDL_events.h 702:16@
+data SDL_GamepadSensorEvent = SDL_GamepadSensorEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_GAMEPAD_SENSOR_UPDATE
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 704:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 705:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 706:12@
+  , which :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^ The joystick instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 707:20@
+  , sensor :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The type of the sensor, one of the values of SDL_SensorType
+  --
+  --          [C declaration]: @sensor@, defined at @SDL3\/SDL_events.h 708:12@
+  , data' :: CA.ConstantArray 3 BG.CFloat
+  -- ^ Up to 3 values from the sensor, as defined in SDL_sensor.h
+  --
+  --          [C declaration]: @data@, defined at @SDL3\/SDL_events.h 709:11@
+  , sensor_timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ The timestamp of the sensor reading in nanoseconds, not necessarily synchronized with the system clock
+  --
+  --          [C declaration]: @sensor_timestamp@, defined at @SDL3\/SDL_events.h 710:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GamepadSensorEvent where
+  staticSizeOf = \_ -> (48 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadSensorEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadSensorEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"sensor") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"data'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"sensor_timestamp") ptr0
+
+instance Marshal.WriteRaw SDL_GamepadSensorEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadSensorEvent
+            type'2
+            reserved3
+            timestamp4
+            which5
+            sensor6
+            data'7
+            sensor_timestamp8 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+                >> HasCField.writeRaw (BG.Proxy @"sensor") ptr0 sensor6
+                >> HasCField.writeRaw (BG.Proxy @"data'") ptr0 data'7
+                >> HasCField.writeRaw (BG.Proxy @"sensor_timestamp") ptr0 sensor_timestamp8
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadSensorEvent
+  instance
+    BG.Storable SDL_GamepadSensorEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_GamepadSensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadSensorEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , sensor = BG.getField @"sensor" x0
+            , data' = BG.getField @"data'" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_GamepadSensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_GamepadSensorEvent "type'" where
+  type
+    CFieldType SDL_GamepadSensorEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_GamepadSensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadSensorEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , sensor = BG.getField @"sensor" x0
+            , data' = BG.getField @"data'" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_GamepadSensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_GamepadSensorEvent "reserved" where
+  type
+    CFieldType SDL_GamepadSensorEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_GamepadSensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadSensorEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , sensor = BG.getField @"sensor" x0
+            , data' = BG.getField @"data'" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_GamepadSensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_GamepadSensorEvent "timestamp" where
+  type
+    CFieldType SDL_GamepadSensorEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.CompatHasField.HasField "which" SDL_GamepadSensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadSensorEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , sensor = BG.getField @"sensor" x0
+            , data' = BG.getField @"data'" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+  => BG.HasField "which" (BG.Ptr SDL_GamepadSensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_GamepadSensorEvent "which" where
+  type
+    CFieldType SDL_GamepadSensorEvent "which" =
+      SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "sensor" SDL_GamepadSensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadSensorEvent
+            { sensor = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , data' = BG.getField @"data'" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"sensor" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "sensor" (BG.Ptr SDL_GamepadSensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"sensor")
+
+instance HasCField.HasCField SDL_GamepadSensorEvent "sensor" where
+  type
+    CFieldType SDL_GamepadSensorEvent "sensor" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ CA.ConstantArray 3 BG.CFloat)
+  => BG.CompatHasField.HasField "data'" SDL_GamepadSensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadSensorEvent
+            { data' = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , sensor = BG.getField @"sensor" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"data'" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 3 BG.CFloat)
+  => BG.HasField "data'" (BG.Ptr SDL_GamepadSensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data'")
+
+instance HasCField.HasCField SDL_GamepadSensorEvent "data'" where
+  type
+    CFieldType SDL_GamepadSensorEvent "data'" =
+      CA.ConstantArray 3 BG.CFloat
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "sensor_timestamp" SDL_GamepadSensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadSensorEvent
+            { sensor_timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , sensor = BG.getField @"sensor" x0
+            , data' = BG.getField @"data'" x0
+            }
+      , BG.getField @"sensor_timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "sensor_timestamp" (BG.Ptr SDL_GamepadSensorEvent) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"sensor_timestamp")
+
+instance HasCField.HasCField SDL_GamepadSensorEvent "sensor_timestamp" where
+  type
+    CFieldType SDL_GamepadSensorEvent "sensor_timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 40
+
+-- | Audio device event structure (event.adevice.*)
+--
+--     Note that SDL will send a SDL_EVENT_AUDIO_DEVICE_ADDED event for every device it discovers during initialization. After that, this event will only arrive when a device is hotplugged during the program\'s run.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_AudioDeviceEvent@, defined at @SDL3\/SDL_events.h 722:16@
+data SDL_AudioDeviceEvent = SDL_AudioDeviceEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_AUDIO_DEVICE_ADDED, or SDL_EVENT_AUDIO_DEVICE_REMOVED, or SDL_EVENT_AUDIO_DEVICE_FORMAT_CHANGED
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 724:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 725:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 726:12@
+  , which :: SDL3.Sys.Bindgen.Audio.SDL_AudioDeviceID
+  -- ^ SDL_AudioDeviceID for the device being added or removed or changing
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 727:23@
+  , recording :: BG.CBool
+  -- ^ false if a playback device, true if a recording device.
+  --
+  --          [C declaration]: @recording@, defined at @SDL3\/SDL_events.h 728:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_events.h 729:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_events.h 730:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_events.h 731:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_AudioDeviceEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_AudioDeviceEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AudioDeviceEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"recording") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+
+instance Marshal.WriteRaw SDL_AudioDeviceEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AudioDeviceEvent
+            type'2
+            reserved3
+            timestamp4
+            which5
+            recording6
+            padding17
+            padding28
+            padding39 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+                >> HasCField.writeRaw (BG.Proxy @"recording") ptr0 recording6
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding17
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding28
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding39
+
+deriving via Marshal.EquivStorable SDL_AudioDeviceEvent instance BG.Storable SDL_AudioDeviceEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_AudioDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioDeviceEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , recording = BG.getField @"recording" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_AudioDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_AudioDeviceEvent "type'" where
+  type
+    CFieldType SDL_AudioDeviceEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_AudioDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioDeviceEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , recording = BG.getField @"recording" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_AudioDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_AudioDeviceEvent "reserved" where
+  type
+    CFieldType SDL_AudioDeviceEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_AudioDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioDeviceEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , recording = BG.getField @"recording" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_AudioDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_AudioDeviceEvent "timestamp" where
+  type
+    CFieldType SDL_AudioDeviceEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Audio.SDL_AudioDeviceID)
+  => BG.CompatHasField.HasField "which" SDL_AudioDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioDeviceEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , recording = BG.getField @"recording" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Audio.SDL_AudioDeviceID)
+  => BG.HasField "which" (BG.Ptr SDL_AudioDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_AudioDeviceEvent "which" where
+  type
+    CFieldType SDL_AudioDeviceEvent "which" =
+      SDL3.Sys.Bindgen.Audio.SDL_AudioDeviceID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "recording" SDL_AudioDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioDeviceEvent
+            { recording = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"recording" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "recording" (BG.Ptr SDL_AudioDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"recording")
+
+instance HasCField.HasCField SDL_AudioDeviceEvent "recording" where
+  type
+    CFieldType SDL_AudioDeviceEvent "recording" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_AudioDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioDeviceEvent
+            { padding1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , recording = BG.getField @"recording" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_AudioDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_AudioDeviceEvent "padding1" where
+  type
+    CFieldType SDL_AudioDeviceEvent "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 21
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_AudioDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioDeviceEvent
+            { padding2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , recording = BG.getField @"recording" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_AudioDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_AudioDeviceEvent "padding2" where
+  type
+    CFieldType SDL_AudioDeviceEvent "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 22
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_AudioDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AudioDeviceEvent
+            { padding3 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , recording = BG.getField @"recording" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_AudioDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_AudioDeviceEvent "padding3" where
+  type
+    CFieldType SDL_AudioDeviceEvent "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 23
+
+-- | Camera device event structure (event.cdevice.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_CameraDeviceEvent@, defined at @SDL3\/SDL_events.h 739:16@
+data SDL_CameraDeviceEvent = SDL_CameraDeviceEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_CAMERA_DEVICE_ADDED, SDL_EVENT_CAMERA_DEVICE_REMOVED, SDL_EVENT_CAMERA_DEVICE_APPROVED, SDL_EVENT_CAMERA_DEVICE_DENIED
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 741:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 742:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 743:12@
+  , which :: SDL3.Sys.Bindgen.Camera.SDL_CameraID
+  -- ^ SDL_CameraID for the device being added or removed or changing
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 744:18@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_CameraDeviceEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_CameraDeviceEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_CameraDeviceEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+
+instance Marshal.WriteRaw SDL_CameraDeviceEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_CameraDeviceEvent type'2 reserved3 timestamp4 which5 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+
+deriving via Marshal.EquivStorable SDL_CameraDeviceEvent instance BG.Storable SDL_CameraDeviceEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_CameraDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraDeviceEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_CameraDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_CameraDeviceEvent "type'" where
+  type
+    CFieldType SDL_CameraDeviceEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_CameraDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraDeviceEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_CameraDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_CameraDeviceEvent "reserved" where
+  type
+    CFieldType SDL_CameraDeviceEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_CameraDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraDeviceEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_CameraDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_CameraDeviceEvent "timestamp" where
+  type
+    CFieldType SDL_CameraDeviceEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Camera.SDL_CameraID)
+  => BG.CompatHasField.HasField "which" SDL_CameraDeviceEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CameraDeviceEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Camera.SDL_CameraID)
+  => BG.HasField "which" (BG.Ptr SDL_CameraDeviceEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_CameraDeviceEvent "which" where
+  type
+    CFieldType SDL_CameraDeviceEvent "which" =
+      SDL3.Sys.Bindgen.Camera.SDL_CameraID
+
+  offset# = \_ -> \_ -> 16
+
+-- | Renderer event structure (event.render.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_RenderEvent@, defined at @SDL3\/SDL_events.h 753:16@
+data SDL_RenderEvent = SDL_RenderEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_RENDER_TARGETS_RESET, SDL_EVENT_RENDER_DEVICE_RESET, SDL_EVENT_RENDER_DEVICE_LOST
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 755:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 756:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 757:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window containing the renderer in question.
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 758:18@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_RenderEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_RenderEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_RenderEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+
+instance Marshal.WriteRaw SDL_RenderEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_RenderEvent type'2 reserved3 timestamp4 windowID5 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+
+deriving via Marshal.EquivStorable SDL_RenderEvent instance BG.Storable SDL_RenderEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_RenderEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_RenderEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_RenderEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_RenderEvent "type'" where
+  type
+    CFieldType SDL_RenderEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_RenderEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_RenderEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_RenderEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_RenderEvent "reserved" where
+  type
+    CFieldType SDL_RenderEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_RenderEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_RenderEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_RenderEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_RenderEvent "timestamp" where
+  type
+    CFieldType SDL_RenderEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_RenderEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_RenderEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_RenderEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_RenderEvent "windowID" where
+  type
+    CFieldType SDL_RenderEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+-- | Touch finger event structure (event.tfinger.*)
+--
+--     Coordinates in this event are normalized. @x@ and @y@ are normalized to a range between 0.0f and 1.0f, relative to the window, so (0,0) is the top left and (1,1) is the bottom right. Delta coordinates @dx@ and @dy@ are normalized in the ranges of -1.0f (traversed all the way from the bottom or right to all the way up or left) to 1.0f (traversed all the way from the top or left to all the way down or right).
+--
+--     Note that while the coordinates are /normalized/, they are not /clamped/, which means in some circumstances you can get a value outside of this range. For example, a renderer using logical presentation might give a negative value when the touch is in the letterboxing. Some platforms might report a touch outside of the window, which will also be outside of the range.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_TouchFingerEvent@, defined at @SDL3\/SDL_events.h 781:16@
+data SDL_TouchFingerEvent = SDL_TouchFingerEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_FINGER_DOWN, SDL_EVENT_FINGER_UP, SDL_EVENT_FINGER_MOTION, or SDL_EVENT_FINGER_CANCELED
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 783:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 784:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 785:12@
+  , touchID :: SDL3.Sys.Bindgen.Touch.SDL_TouchID
+  -- ^ The touch device id
+  --
+  --          [C declaration]: @touchID@, defined at @SDL3\/SDL_events.h 786:17@
+  , fingerID :: SDL3.Sys.Bindgen.Touch.SDL_FingerID
+  -- ^ [C declaration]: @fingerID@, defined at @SDL3\/SDL_events.h 787:18@
+  , x :: BG.CFloat
+  -- ^ Normalized in the range 0...1
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_events.h 788:11@
+  , y :: BG.CFloat
+  -- ^ Normalized in the range 0...1
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_events.h 789:11@
+  , dx :: BG.CFloat
+  -- ^ Normalized in the range -1...1
+  --
+  --          [C declaration]: @dx@, defined at @SDL3\/SDL_events.h 790:11@
+  , dy :: BG.CFloat
+  -- ^ Normalized in the range -1...1
+  --
+  --          [C declaration]: @dy@, defined at @SDL3\/SDL_events.h 791:11@
+  , pressure :: BG.CFloat
+  -- ^ Normalized in the range 0...1
+  --
+  --          [C declaration]: @pressure@, defined at @SDL3\/SDL_events.h 792:11@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window underneath the finger, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 793:18@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_TouchFingerEvent where
+  staticSizeOf = \_ -> (56 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_TouchFingerEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_TouchFingerEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"touchID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"fingerID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"dx") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"dy") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pressure") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+
+instance Marshal.WriteRaw SDL_TouchFingerEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_TouchFingerEvent
+            type'2
+            reserved3
+            timestamp4
+            touchID5
+            fingerID6
+            x7
+            y8
+            dx9
+            dy10
+            pressure11
+            windowID12 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"touchID") ptr0 touchID5
+                >> HasCField.writeRaw (BG.Proxy @"fingerID") ptr0 fingerID6
+                >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x7
+                >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y8
+                >> HasCField.writeRaw (BG.Proxy @"dx") ptr0 dx9
+                >> HasCField.writeRaw (BG.Proxy @"dy") ptr0 dy10
+                >> HasCField.writeRaw (BG.Proxy @"pressure") ptr0 pressure11
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID12
+
+deriving via Marshal.EquivStorable SDL_TouchFingerEvent instance BG.Storable SDL_TouchFingerEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , touchID = BG.getField @"touchID" x0
+            , fingerID = BG.getField @"fingerID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , dx = BG.getField @"dx" x0
+            , dy = BG.getField @"dy" x0
+            , pressure = BG.getField @"pressure" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "type'" where
+  type
+    CFieldType SDL_TouchFingerEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , touchID = BG.getField @"touchID" x0
+            , fingerID = BG.getField @"fingerID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , dx = BG.getField @"dx" x0
+            , dy = BG.getField @"dy" x0
+            , pressure = BG.getField @"pressure" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "reserved" where
+  type
+    CFieldType SDL_TouchFingerEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , touchID = BG.getField @"touchID" x0
+            , fingerID = BG.getField @"fingerID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , dx = BG.getField @"dx" x0
+            , dy = BG.getField @"dy" x0
+            , pressure = BG.getField @"pressure" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "timestamp" where
+  type
+    CFieldType SDL_TouchFingerEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Touch.SDL_TouchID)
+  => BG.CompatHasField.HasField "touchID" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { touchID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , fingerID = BG.getField @"fingerID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , dx = BG.getField @"dx" x0
+            , dy = BG.getField @"dy" x0
+            , pressure = BG.getField @"pressure" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"touchID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Touch.SDL_TouchID)
+  => BG.HasField "touchID" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"touchID")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "touchID" where
+  type
+    CFieldType SDL_TouchFingerEvent "touchID" =
+      SDL3.Sys.Bindgen.Touch.SDL_TouchID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Touch.SDL_FingerID)
+  => BG.CompatHasField.HasField "fingerID" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { fingerID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , touchID = BG.getField @"touchID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , dx = BG.getField @"dx" x0
+            , dy = BG.getField @"dy" x0
+            , pressure = BG.getField @"pressure" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"fingerID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Touch.SDL_FingerID)
+  => BG.HasField "fingerID" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"fingerID")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "fingerID" where
+  type
+    CFieldType SDL_TouchFingerEvent "fingerID" =
+      SDL3.Sys.Bindgen.Touch.SDL_FingerID
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , touchID = BG.getField @"touchID" x0
+            , fingerID = BG.getField @"fingerID" x0
+            , y = BG.getField @"y" x0
+            , dx = BG.getField @"dx" x0
+            , dy = BG.getField @"dy" x0
+            , pressure = BG.getField @"pressure" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "x" where
+  type CFieldType SDL_TouchFingerEvent "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , touchID = BG.getField @"touchID" x0
+            , fingerID = BG.getField @"fingerID" x0
+            , x = BG.getField @"x" x0
+            , dx = BG.getField @"dx" x0
+            , dy = BG.getField @"dy" x0
+            , pressure = BG.getField @"pressure" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "y" where
+  type CFieldType SDL_TouchFingerEvent "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "dx" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { dx = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , touchID = BG.getField @"touchID" x0
+            , fingerID = BG.getField @"fingerID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , dy = BG.getField @"dy" x0
+            , pressure = BG.getField @"pressure" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"dx" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "dx" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"dx")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "dx" where
+  type CFieldType SDL_TouchFingerEvent "dx" = BG.CFloat
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "dy" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { dy = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , touchID = BG.getField @"touchID" x0
+            , fingerID = BG.getField @"fingerID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , dx = BG.getField @"dx" x0
+            , pressure = BG.getField @"pressure" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"dy" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "dy" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"dy")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "dy" where
+  type CFieldType SDL_TouchFingerEvent "dy" = BG.CFloat
+
+  offset# = \_ -> \_ -> 44
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "pressure" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { pressure = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , touchID = BG.getField @"touchID" x0
+            , fingerID = BG.getField @"fingerID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , dx = BG.getField @"dx" x0
+            , dy = BG.getField @"dy" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"pressure" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "pressure" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pressure")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "pressure" where
+  type
+    CFieldType SDL_TouchFingerEvent "pressure" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 48
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_TouchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchFingerEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , touchID = BG.getField @"touchID" x0
+            , fingerID = BG.getField @"fingerID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , dx = BG.getField @"dx" x0
+            , dy = BG.getField @"dy" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_TouchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_TouchFingerEvent "windowID" where
+  type
+    CFieldType SDL_TouchFingerEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 52
+
+-- | Pinch event structure (event.pinch.*)
+--
+--     [C declaration]: @struct SDL_PinchFingerEvent@, defined at @SDL3\/SDL_events.h 799:16@
+data SDL_PinchFingerEvent = SDL_PinchFingerEvent
+  { type' :: SDL_EventType
+  -- ^ @SDL_EVENT_PINCH_BEGIN@ or @SDL_EVENT_PINCH_UPDATE@ or @SDL_EVENT_PINCH_END@
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 801:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 802:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 803:12@
+  , scale :: BG.CFloat
+  -- ^ The scale change since the last SDL_EVENT_PINCH_UPDATE. Scale \< 1 is \"zoom out\". Scale > 1 is \"zoom in\".
+  --
+  --          [C declaration]: @scale@, defined at @SDL3\/SDL_events.h 804:11@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window underneath the finger, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 805:18@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_PinchFingerEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_PinchFingerEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PinchFingerEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"scale") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+
+instance Marshal.WriteRaw SDL_PinchFingerEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PinchFingerEvent type'2 reserved3 timestamp4 scale5 windowID6 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"scale") ptr0 scale5
+              >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID6
+
+deriving via Marshal.EquivStorable SDL_PinchFingerEvent instance BG.Storable SDL_PinchFingerEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_PinchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PinchFingerEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , scale = BG.getField @"scale" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_PinchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_PinchFingerEvent "type'" where
+  type
+    CFieldType SDL_PinchFingerEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_PinchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PinchFingerEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , scale = BG.getField @"scale" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_PinchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_PinchFingerEvent "reserved" where
+  type
+    CFieldType SDL_PinchFingerEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_PinchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PinchFingerEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , scale = BG.getField @"scale" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_PinchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_PinchFingerEvent "timestamp" where
+  type
+    CFieldType SDL_PinchFingerEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "scale" SDL_PinchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PinchFingerEvent
+            { scale = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"scale" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "scale" (BG.Ptr SDL_PinchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"scale")
+
+instance HasCField.HasCField SDL_PinchFingerEvent "scale" where
+  type
+    CFieldType SDL_PinchFingerEvent "scale" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_PinchFingerEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PinchFingerEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , scale = BG.getField @"scale" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_PinchFingerEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_PinchFingerEvent "windowID" where
+  type
+    CFieldType SDL_PinchFingerEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 20
+
+-- | Pressure-sensitive pen proximity event structure (event.pproximity.*)
+--
+--     When a pen becomes visible to the system (it is close enough to a tablet, etc), SDL will send an SDL_EVENT_PEN_PROXIMITY_IN event with the new pen\'s ID. This ID is valid until the pen leaves proximity again (has been removed from the tablet\'s area, the tablet has been unplugged, etc). If the same pen reenters proximity again, it will be given a new ID.
+--
+--     Note that \"proximity\" means \"close enough for the tablet to know the tool is there.\" The pen touching and lifting off from the tablet while not leaving the area are handled by SDL_EVENT_PEN_DOWN and SDL_EVENT_PEN_UP.
+--
+--     Not all platforms have a window associated with the pen during proximity events. Some wait until motion\/button\/etc events to offer this info.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_PenProximityEvent@, defined at @SDL3\/SDL_events.h 826:16@
+data SDL_PenProximityEvent = SDL_PenProximityEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_PEN_PROXIMITY_IN or SDL_EVENT_PEN_PROXIMITY_OUT
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 828:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 829:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 830:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with pen focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 831:18@
+  , which :: SDL3.Sys.Bindgen.Pen.SDL_PenID
+  -- ^ The pen instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 832:15@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_PenProximityEvent where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_PenProximityEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PenProximityEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+
+instance Marshal.WriteRaw SDL_PenProximityEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PenProximityEvent type'2 reserved3 timestamp4 windowID5 which6 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+              >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which6
+
+deriving via Marshal.EquivStorable SDL_PenProximityEvent instance BG.Storable SDL_PenProximityEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_PenProximityEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenProximityEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_PenProximityEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_PenProximityEvent "type'" where
+  type
+    CFieldType SDL_PenProximityEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_PenProximityEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenProximityEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_PenProximityEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_PenProximityEvent "reserved" where
+  type
+    CFieldType SDL_PenProximityEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_PenProximityEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenProximityEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_PenProximityEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_PenProximityEvent "timestamp" where
+  type
+    CFieldType SDL_PenProximityEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_PenProximityEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenProximityEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_PenProximityEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_PenProximityEvent "windowID" where
+  type
+    CFieldType SDL_PenProximityEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenID)
+  => BG.CompatHasField.HasField "which" SDL_PenProximityEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenProximityEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenID)
+  => BG.HasField "which" (BG.Ptr SDL_PenProximityEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_PenProximityEvent "which" where
+  type
+    CFieldType SDL_PenProximityEvent "which" =
+      SDL3.Sys.Bindgen.Pen.SDL_PenID
+
+  offset# = \_ -> \_ -> 20
+
+-- | Pressure-sensitive pen motion event structure (event.pmotion.*)
+--
+--     Depending on the hardware, you may get motion events when the pen is not touching a tablet, for tracking a pen even when it isn\'t drawing. You should listen for SDL_EVENT_PEN_DOWN and SDL_EVENT_PEN_UP events, or check @pen_state & SDL_PEN_INPUT_DOWN@ to decide if a pen is \"drawing\" when dealing with pen motion.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_PenMotionEvent@, defined at @SDL3\/SDL_events.h 846:16@
+data SDL_PenMotionEvent = SDL_PenMotionEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_PEN_MOTION
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 848:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 849:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 850:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with pen focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 851:18@
+  , which :: SDL3.Sys.Bindgen.Pen.SDL_PenID
+  -- ^ The pen instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 852:15@
+  , pen_state :: SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags
+  -- ^ Complete pen input state at time of event
+  --
+  --          [C declaration]: @pen_state@, defined at @SDL3\/SDL_events.h 853:23@
+  , x :: BG.CFloat
+  -- ^ X coordinate, relative to window
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_events.h 854:11@
+  , y :: BG.CFloat
+  -- ^ Y coordinate, relative to window
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_events.h 855:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_PenMotionEvent where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_PenMotionEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PenMotionEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pen_state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+
+instance Marshal.WriteRaw SDL_PenMotionEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PenMotionEvent
+            type'2
+            reserved3
+            timestamp4
+            windowID5
+            which6
+            pen_state7
+            x8
+            y9 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which6
+                >> HasCField.writeRaw (BG.Proxy @"pen_state") ptr0 pen_state7
+                >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x8
+                >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y9
+
+deriving via Marshal.EquivStorable SDL_PenMotionEvent instance BG.Storable SDL_PenMotionEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_PenMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenMotionEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_PenMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_PenMotionEvent "type'" where
+  type
+    CFieldType SDL_PenMotionEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_PenMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenMotionEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_PenMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_PenMotionEvent "reserved" where
+  type
+    CFieldType SDL_PenMotionEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_PenMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenMotionEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_PenMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_PenMotionEvent "timestamp" where
+  type
+    CFieldType SDL_PenMotionEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_PenMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenMotionEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_PenMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_PenMotionEvent "windowID" where
+  type
+    CFieldType SDL_PenMotionEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenID)
+  => BG.CompatHasField.HasField "which" SDL_PenMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenMotionEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenID)
+  => BG.HasField "which" (BG.Ptr SDL_PenMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_PenMotionEvent "which" where
+  type
+    CFieldType SDL_PenMotionEvent "which" =
+      SDL3.Sys.Bindgen.Pen.SDL_PenID
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags)
+  => BG.CompatHasField.HasField "pen_state" SDL_PenMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenMotionEvent
+            { pen_state = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"pen_state" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags)
+  => BG.HasField "pen_state" (BG.Ptr SDL_PenMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pen_state")
+
+instance HasCField.HasCField SDL_PenMotionEvent "pen_state" where
+  type
+    CFieldType SDL_PenMotionEvent "pen_state" =
+      SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_PenMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenMotionEvent
+            { x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_PenMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_PenMotionEvent "x" where
+  type CFieldType SDL_PenMotionEvent "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_PenMotionEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenMotionEvent
+            { y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_PenMotionEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_PenMotionEvent "y" where
+  type CFieldType SDL_PenMotionEvent "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 32
+
+-- | Pressure-sensitive pen touched event structure (event.ptouch.*)
+--
+--     These events come when a pen touches a surface (a tablet, etc), or lifts off from one.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_PenTouchEvent@, defined at @SDL3\/SDL_events.h 866:16@
+data SDL_PenTouchEvent = SDL_PenTouchEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_PEN_DOWN or SDL_EVENT_PEN_UP
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 868:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 869:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 870:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with pen focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 871:18@
+  , which :: SDL3.Sys.Bindgen.Pen.SDL_PenID
+  -- ^ The pen instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 872:15@
+  , pen_state :: SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags
+  -- ^ Complete pen input state at time of event
+  --
+  --          [C declaration]: @pen_state@, defined at @SDL3\/SDL_events.h 873:23@
+  , x :: BG.CFloat
+  -- ^ X coordinate, relative to window
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_events.h 874:11@
+  , y :: BG.CFloat
+  -- ^ Y coordinate, relative to window
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_events.h 875:11@
+  , eraser :: BG.CBool
+  -- ^ true if eraser end is used (not all pens support this).
+  --
+  --          [C declaration]: @eraser@, defined at @SDL3\/SDL_events.h 876:10@
+  , down :: BG.CBool
+  -- ^ true if the pen is touching or false if the pen is lifted off
+  --
+  --          [C declaration]: @down@, defined at @SDL3\/SDL_events.h 877:10@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_PenTouchEvent where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_PenTouchEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PenTouchEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pen_state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"eraser") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"down") ptr0
+
+instance Marshal.WriteRaw SDL_PenTouchEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PenTouchEvent
+            type'2
+            reserved3
+            timestamp4
+            windowID5
+            which6
+            pen_state7
+            x8
+            y9
+            eraser10
+            down11 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which6
+                >> HasCField.writeRaw (BG.Proxy @"pen_state") ptr0 pen_state7
+                >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x8
+                >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y9
+                >> HasCField.writeRaw (BG.Proxy @"eraser") ptr0 eraser10
+                >> HasCField.writeRaw (BG.Proxy @"down") ptr0 down11
+
+deriving via Marshal.EquivStorable SDL_PenTouchEvent instance BG.Storable SDL_PenTouchEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_PenTouchEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenTouchEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , eraser = BG.getField @"eraser" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_PenTouchEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_PenTouchEvent "type'" where
+  type
+    CFieldType SDL_PenTouchEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_PenTouchEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenTouchEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , eraser = BG.getField @"eraser" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_PenTouchEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_PenTouchEvent "reserved" where
+  type
+    CFieldType SDL_PenTouchEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_PenTouchEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenTouchEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , eraser = BG.getField @"eraser" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_PenTouchEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_PenTouchEvent "timestamp" where
+  type
+    CFieldType SDL_PenTouchEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_PenTouchEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenTouchEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , eraser = BG.getField @"eraser" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_PenTouchEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_PenTouchEvent "windowID" where
+  type
+    CFieldType SDL_PenTouchEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenID)
+  => BG.CompatHasField.HasField "which" SDL_PenTouchEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenTouchEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , eraser = BG.getField @"eraser" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenID)
+  => BG.HasField "which" (BG.Ptr SDL_PenTouchEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_PenTouchEvent "which" where
+  type
+    CFieldType SDL_PenTouchEvent "which" =
+      SDL3.Sys.Bindgen.Pen.SDL_PenID
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags)
+  => BG.CompatHasField.HasField "pen_state" SDL_PenTouchEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenTouchEvent
+            { pen_state = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , eraser = BG.getField @"eraser" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"pen_state" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags)
+  => BG.HasField "pen_state" (BG.Ptr SDL_PenTouchEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pen_state")
+
+instance HasCField.HasCField SDL_PenTouchEvent "pen_state" where
+  type
+    CFieldType SDL_PenTouchEvent "pen_state" =
+      SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_PenTouchEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenTouchEvent
+            { x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , y = BG.getField @"y" x0
+            , eraser = BG.getField @"eraser" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_PenTouchEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_PenTouchEvent "x" where
+  type CFieldType SDL_PenTouchEvent "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_PenTouchEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenTouchEvent
+            { y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , eraser = BG.getField @"eraser" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_PenTouchEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_PenTouchEvent "y" where
+  type CFieldType SDL_PenTouchEvent "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "eraser" SDL_PenTouchEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenTouchEvent
+            { eraser = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"eraser" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "eraser" (BG.Ptr SDL_PenTouchEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"eraser")
+
+instance HasCField.HasCField SDL_PenTouchEvent "eraser" where
+  type CFieldType SDL_PenTouchEvent "eraser" = BG.CBool
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "down" SDL_PenTouchEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenTouchEvent
+            { down = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , eraser = BG.getField @"eraser" x0
+            }
+      , BG.getField @"down" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "down" (BG.Ptr SDL_PenTouchEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"down")
+
+instance HasCField.HasCField SDL_PenTouchEvent "down" where
+  type CFieldType SDL_PenTouchEvent "down" = BG.CBool
+
+  offset# = \_ -> \_ -> 37
+
+-- | Pressure-sensitive pen button event structure (event.pbutton.*)
+--
+--     This is for buttons on the pen itself that the user might click. The pen itself pressing down to draw triggers a SDL_EVENT_PEN_DOWN event instead.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_PenButtonEvent@, defined at @SDL3\/SDL_events.h 888:16@
+data SDL_PenButtonEvent = SDL_PenButtonEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_PEN_BUTTON_DOWN or SDL_EVENT_PEN_BUTTON_UP
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 890:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 891:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 892:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with mouse focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 893:18@
+  , which :: SDL3.Sys.Bindgen.Pen.SDL_PenID
+  -- ^ The pen instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 894:15@
+  , pen_state :: SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags
+  -- ^ Complete pen input state at time of event
+  --
+  --          [C declaration]: @pen_state@, defined at @SDL3\/SDL_events.h 895:23@
+  , x :: BG.CFloat
+  -- ^ X coordinate, relative to window
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_events.h 896:11@
+  , y :: BG.CFloat
+  -- ^ Y coordinate, relative to window
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_events.h 897:11@
+  , button :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The pen button index (first button is 1).
+  --
+  --          [C declaration]: @button@, defined at @SDL3\/SDL_events.h 898:11@
+  , down :: BG.CBool
+  -- ^ true if the button is pressed
+  --
+  --          [C declaration]: @down@, defined at @SDL3\/SDL_events.h 899:10@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_PenButtonEvent where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_PenButtonEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PenButtonEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pen_state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"button") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"down") ptr0
+
+instance Marshal.WriteRaw SDL_PenButtonEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PenButtonEvent
+            type'2
+            reserved3
+            timestamp4
+            windowID5
+            which6
+            pen_state7
+            x8
+            y9
+            button10
+            down11 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which6
+                >> HasCField.writeRaw (BG.Proxy @"pen_state") ptr0 pen_state7
+                >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x8
+                >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y9
+                >> HasCField.writeRaw (BG.Proxy @"button") ptr0 button10
+                >> HasCField.writeRaw (BG.Proxy @"down") ptr0 down11
+
+deriving via Marshal.EquivStorable SDL_PenButtonEvent instance BG.Storable SDL_PenButtonEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_PenButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenButtonEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_PenButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_PenButtonEvent "type'" where
+  type
+    CFieldType SDL_PenButtonEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_PenButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenButtonEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_PenButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_PenButtonEvent "reserved" where
+  type
+    CFieldType SDL_PenButtonEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_PenButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenButtonEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_PenButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_PenButtonEvent "timestamp" where
+  type
+    CFieldType SDL_PenButtonEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_PenButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenButtonEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_PenButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_PenButtonEvent "windowID" where
+  type
+    CFieldType SDL_PenButtonEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenID)
+  => BG.CompatHasField.HasField "which" SDL_PenButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenButtonEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenID)
+  => BG.HasField "which" (BG.Ptr SDL_PenButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_PenButtonEvent "which" where
+  type
+    CFieldType SDL_PenButtonEvent "which" =
+      SDL3.Sys.Bindgen.Pen.SDL_PenID
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags)
+  => BG.CompatHasField.HasField "pen_state" SDL_PenButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenButtonEvent
+            { pen_state = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"pen_state" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags)
+  => BG.HasField "pen_state" (BG.Ptr SDL_PenButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pen_state")
+
+instance HasCField.HasCField SDL_PenButtonEvent "pen_state" where
+  type
+    CFieldType SDL_PenButtonEvent "pen_state" =
+      SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_PenButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenButtonEvent
+            { x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , y = BG.getField @"y" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_PenButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_PenButtonEvent "x" where
+  type CFieldType SDL_PenButtonEvent "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_PenButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenButtonEvent
+            { y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , button = BG.getField @"button" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_PenButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_PenButtonEvent "y" where
+  type CFieldType SDL_PenButtonEvent "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "button" SDL_PenButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenButtonEvent
+            { button = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , down = BG.getField @"down" x0
+            }
+      , BG.getField @"button" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "button" (BG.Ptr SDL_PenButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_PenButtonEvent "button" where
+  type
+    CFieldType SDL_PenButtonEvent "button" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "down" SDL_PenButtonEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenButtonEvent
+            { down = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , button = BG.getField @"button" x0
+            }
+      , BG.getField @"down" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "down" (BG.Ptr SDL_PenButtonEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"down")
+
+instance HasCField.HasCField SDL_PenButtonEvent "down" where
+  type CFieldType SDL_PenButtonEvent "down" = BG.CBool
+
+  offset# = \_ -> \_ -> 37
+
+-- | Pressure-sensitive pen pressure \/ angle event structure (event.paxis.*)
+--
+--     You might get some of these events even if the pen isn\'t touching the tablet.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_PenAxisEvent@, defined at @SDL3\/SDL_events.h 910:16@
+data SDL_PenAxisEvent = SDL_PenAxisEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_PEN_AXIS
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 912:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 913:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 914:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window with pen focus, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 915:18@
+  , which :: SDL3.Sys.Bindgen.Pen.SDL_PenID
+  -- ^ The pen instance id
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 916:15@
+  , pen_state :: SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags
+  -- ^ Complete pen input state at time of event
+  --
+  --          [C declaration]: @pen_state@, defined at @SDL3\/SDL_events.h 917:23@
+  , x :: BG.CFloat
+  -- ^ X coordinate, relative to window
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_events.h 918:11@
+  , y :: BG.CFloat
+  -- ^ Y coordinate, relative to window
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_events.h 919:11@
+  , axis :: SDL3.Sys.Bindgen.Pen.SDL_PenAxis
+  -- ^ Axis that has changed
+  --
+  --          [C declaration]: @axis@, defined at @SDL3\/SDL_events.h 920:17@
+  , value :: BG.CFloat
+  -- ^ New value of axis
+  --
+  --          [C declaration]: @value@, defined at @SDL3\/SDL_events.h 921:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_PenAxisEvent where
+  staticSizeOf = \_ -> (48 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_PenAxisEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PenAxisEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pen_state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"axis") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"value") ptr0
+
+instance Marshal.WriteRaw SDL_PenAxisEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PenAxisEvent
+            type'2
+            reserved3
+            timestamp4
+            windowID5
+            which6
+            pen_state7
+            x8
+            y9
+            axis10
+            value11 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+                >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which6
+                >> HasCField.writeRaw (BG.Proxy @"pen_state") ptr0 pen_state7
+                >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x8
+                >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y9
+                >> HasCField.writeRaw (BG.Proxy @"axis") ptr0 axis10
+                >> HasCField.writeRaw (BG.Proxy @"value") ptr0 value11
+
+deriving via Marshal.EquivStorable SDL_PenAxisEvent instance BG.Storable SDL_PenAxisEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_PenAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxisEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , axis = BG.getField @"axis" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_PenAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_PenAxisEvent "type'" where
+  type
+    CFieldType SDL_PenAxisEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_PenAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxisEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , axis = BG.getField @"axis" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_PenAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_PenAxisEvent "reserved" where
+  type
+    CFieldType SDL_PenAxisEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_PenAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxisEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , axis = BG.getField @"axis" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_PenAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_PenAxisEvent "timestamp" where
+  type
+    CFieldType SDL_PenAxisEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_PenAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxisEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , axis = BG.getField @"axis" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_PenAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_PenAxisEvent "windowID" where
+  type
+    CFieldType SDL_PenAxisEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenID)
+  => BG.CompatHasField.HasField "which" SDL_PenAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxisEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , axis = BG.getField @"axis" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenID)
+  => BG.HasField "which" (BG.Ptr SDL_PenAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_PenAxisEvent "which" where
+  type
+    CFieldType SDL_PenAxisEvent "which" =
+      SDL3.Sys.Bindgen.Pen.SDL_PenID
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags)
+  => BG.CompatHasField.HasField "pen_state" SDL_PenAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxisEvent
+            { pen_state = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , axis = BG.getField @"axis" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"pen_state" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags)
+  => BG.HasField "pen_state" (BG.Ptr SDL_PenAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pen_state")
+
+instance HasCField.HasCField SDL_PenAxisEvent "pen_state" where
+  type
+    CFieldType SDL_PenAxisEvent "pen_state" =
+      SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_PenAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxisEvent
+            { x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , y = BG.getField @"y" x0
+            , axis = BG.getField @"axis" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_PenAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_PenAxisEvent "x" where
+  type CFieldType SDL_PenAxisEvent "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_PenAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxisEvent
+            { y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , axis = BG.getField @"axis" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_PenAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_PenAxisEvent "y" where
+  type CFieldType SDL_PenAxisEvent "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenAxis)
+  => BG.CompatHasField.HasField "axis" SDL_PenAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxisEvent
+            { axis = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , value = BG.getField @"value" x0
+            }
+      , BG.getField @"axis" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pen.SDL_PenAxis)
+  => BG.HasField "axis" (BG.Ptr SDL_PenAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis")
+
+instance HasCField.HasCField SDL_PenAxisEvent "axis" where
+  type
+    CFieldType SDL_PenAxisEvent "axis" =
+      SDL3.Sys.Bindgen.Pen.SDL_PenAxis
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "value" SDL_PenAxisEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxisEvent
+            { value = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , which = BG.getField @"which" x0
+            , pen_state = BG.getField @"pen_state" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , axis = BG.getField @"axis" x0
+            }
+      , BG.getField @"value" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "value" (BG.Ptr SDL_PenAxisEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"value")
+
+instance HasCField.HasCField SDL_PenAxisEvent "value" where
+  type CFieldType SDL_PenAxisEvent "value" = BG.CFloat
+
+  offset# = \_ -> \_ -> 40
+
+-- | An event used to drop text or request a file open by the system (event.drop.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_DropEvent@, defined at @SDL3\/SDL_events.h 930:16@
+data SDL_DropEvent = SDL_DropEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_DROP_BEGIN or SDL_EVENT_DROP_FILE or SDL_EVENT_DROP_TEXT or SDL_EVENT_DROP_COMPLETE or SDL_EVENT_DROP_POSITION
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 932:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 933:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 934:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The window that was dropped on, if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 935:18@
+  , x :: BG.CFloat
+  -- ^ X coordinate, relative to window (not on begin)
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_events.h 936:11@
+  , y :: BG.CFloat
+  -- ^ Y coordinate, relative to window (not on begin)
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_events.h 937:11@
+  , source :: PtrConst.PtrConst BG.CChar
+  -- ^ The source app that sent this drop event, or NULL if that isn\'t available
+  --
+  --          [C declaration]: @source@, defined at @SDL3\/SDL_events.h 938:17@
+  , data' :: PtrConst.PtrConst BG.CChar
+  -- ^ The text for SDL_EVENT_DROP_TEXT and the file name for SDL_EVENT_DROP_FILE, NULL for other events
+  --
+  --          [C declaration]: @data@, defined at @SDL3\/SDL_events.h 939:17@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_DropEvent where
+  staticSizeOf = \_ -> (48 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_DropEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_DropEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"source") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"data'") ptr0
+
+instance Marshal.WriteRaw SDL_DropEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_DropEvent type'2 reserved3 timestamp4 windowID5 x6 y7 source8 data'9 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+              >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x6
+              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y7
+              >> HasCField.writeRaw (BG.Proxy @"source") ptr0 source8
+              >> HasCField.writeRaw (BG.Proxy @"data'") ptr0 data'9
+
+deriving via Marshal.EquivStorable SDL_DropEvent instance BG.Storable SDL_DropEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_DropEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DropEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , source = BG.getField @"source" x0
+            , data' = BG.getField @"data'" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_DropEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_DropEvent "type'" where
+  type CFieldType SDL_DropEvent "type'" = SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_DropEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DropEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , source = BG.getField @"source" x0
+            , data' = BG.getField @"data'" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_DropEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_DropEvent "reserved" where
+  type
+    CFieldType SDL_DropEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_DropEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DropEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , source = BG.getField @"source" x0
+            , data' = BG.getField @"data'" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_DropEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_DropEvent "timestamp" where
+  type
+    CFieldType SDL_DropEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_DropEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DropEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , source = BG.getField @"source" x0
+            , data' = BG.getField @"data'" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_DropEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_DropEvent "windowID" where
+  type
+    CFieldType SDL_DropEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_DropEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DropEvent
+            { x = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , y = BG.getField @"y" x0
+            , source = BG.getField @"source" x0
+            , data' = BG.getField @"data'" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_DropEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_DropEvent "x" where
+  type CFieldType SDL_DropEvent "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_DropEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DropEvent
+            { y = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , x = BG.getField @"x" x0
+            , source = BG.getField @"source" x0
+            , data' = BG.getField @"data'" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_DropEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_DropEvent "y" where
+  type CFieldType SDL_DropEvent "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "source" SDL_DropEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DropEvent
+            { source = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , data' = BG.getField @"data'" x0
+            }
+      , BG.getField @"source" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "source" (BG.Ptr SDL_DropEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"source")
+
+instance HasCField.HasCField SDL_DropEvent "source" where
+  type
+    CFieldType SDL_DropEvent "source" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "data'" SDL_DropEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DropEvent
+            { data' = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , source = BG.getField @"source" x0
+            }
+      , BG.getField @"data'" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "data'" (BG.Ptr SDL_DropEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data'")
+
+instance HasCField.HasCField SDL_DropEvent "data'" where
+  type
+    CFieldType SDL_DropEvent "data'" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 40
+
+-- | An event triggered when the clipboard contents have changed (event.clipboard.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_ClipboardEvent@, defined at @SDL3\/SDL_events.h 948:16@
+data SDL_ClipboardEvent = SDL_ClipboardEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_CLIPBOARD_UPDATE
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 950:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 951:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 952:12@
+  , owner :: BG.CBool
+  -- ^ are we owning the clipboard (internal update)
+  --
+  --          [C declaration]: @owner@, defined at @SDL3\/SDL_events.h 953:10@
+  , num_mime_types :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ number of mime types
+  --
+  --          [C declaration]: @num_mime_types@, defined at @SDL3\/SDL_events.h 954:12@
+  , mime_types :: BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^ current mime types
+  --
+  --          [C declaration]: @mime_types@, defined at @SDL3\/SDL_events.h 955:18@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_ClipboardEvent where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_ClipboardEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ClipboardEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"owner") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_mime_types") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mime_types") ptr0
+
+instance Marshal.WriteRaw SDL_ClipboardEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ClipboardEvent
+            type'2
+            reserved3
+            timestamp4
+            owner5
+            num_mime_types6
+            mime_types7 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+                >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+                >> HasCField.writeRaw (BG.Proxy @"owner") ptr0 owner5
+                >> HasCField.writeRaw (BG.Proxy @"num_mime_types") ptr0 num_mime_types6
+                >> HasCField.writeRaw (BG.Proxy @"mime_types") ptr0 mime_types7
+
+deriving via Marshal.EquivStorable SDL_ClipboardEvent instance BG.Storable SDL_ClipboardEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_ClipboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ClipboardEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , owner = BG.getField @"owner" x0
+            , num_mime_types = BG.getField @"num_mime_types" x0
+            , mime_types = BG.getField @"mime_types" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_ClipboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_ClipboardEvent "type'" where
+  type
+    CFieldType SDL_ClipboardEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_ClipboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ClipboardEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , owner = BG.getField @"owner" x0
+            , num_mime_types = BG.getField @"num_mime_types" x0
+            , mime_types = BG.getField @"mime_types" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_ClipboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_ClipboardEvent "reserved" where
+  type
+    CFieldType SDL_ClipboardEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_ClipboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ClipboardEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , owner = BG.getField @"owner" x0
+            , num_mime_types = BG.getField @"num_mime_types" x0
+            , mime_types = BG.getField @"mime_types" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_ClipboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_ClipboardEvent "timestamp" where
+  type
+    CFieldType SDL_ClipboardEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "owner" SDL_ClipboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ClipboardEvent
+            { owner = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , num_mime_types = BG.getField @"num_mime_types" x0
+            , mime_types = BG.getField @"mime_types" x0
+            }
+      , BG.getField @"owner" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "owner" (BG.Ptr SDL_ClipboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"owner")
+
+instance HasCField.HasCField SDL_ClipboardEvent "owner" where
+  type CFieldType SDL_ClipboardEvent "owner" = BG.CBool
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "num_mime_types" SDL_ClipboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ClipboardEvent
+            { num_mime_types = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , owner = BG.getField @"owner" x0
+            , mime_types = BG.getField @"mime_types" x0
+            }
+      , BG.getField @"num_mime_types" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "num_mime_types" (BG.Ptr SDL_ClipboardEvent) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_mime_types")
+
+instance HasCField.HasCField SDL_ClipboardEvent "num_mime_types" where
+  type
+    CFieldType SDL_ClipboardEvent "num_mime_types" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.Ptr (PtrConst.PtrConst BG.CChar))
+  => BG.CompatHasField.HasField "mime_types" SDL_ClipboardEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ClipboardEvent
+            { mime_types = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , owner = BG.getField @"owner" x0
+            , num_mime_types = BG.getField @"num_mime_types" x0
+            }
+      , BG.getField @"mime_types" x0
+      )
+
+instance
+  (ty ~ BG.Ptr (PtrConst.PtrConst BG.CChar))
+  => BG.HasField "mime_types" (BG.Ptr SDL_ClipboardEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mime_types")
+
+instance HasCField.HasCField SDL_ClipboardEvent "mime_types" where
+  type
+    CFieldType SDL_ClipboardEvent "mime_types" =
+      BG.Ptr (PtrConst.PtrConst BG.CChar)
+
+  offset# = \_ -> \_ -> 24
+
+-- | Sensor event structure (event.sensor.*)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_SensorEvent@, defined at @SDL3\/SDL_events.h 963:16@
+data SDL_SensorEvent = SDL_SensorEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_SENSOR_UPDATE
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 965:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 966:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 967:12@
+  , which :: SDL3.Sys.Bindgen.Sensor.SDL_SensorID
+  -- ^ The instance ID of the sensor
+  --
+  --          [C declaration]: @which@, defined at @SDL3\/SDL_events.h 968:18@
+  , data' :: CA.ConstantArray 6 BG.CFloat
+  -- ^ Up to 6 values from the sensor - additional values can be queried using SDL_GetSensorData()
+  --
+  --          [C declaration]: @data@, defined at @SDL3\/SDL_events.h 969:11@
+  , sensor_timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ The timestamp of the sensor reading in nanoseconds, not necessarily synchronized with the system clock
+  --
+  --          [C declaration]: @sensor_timestamp@, defined at @SDL3\/SDL_events.h 970:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_SensorEvent where
+  staticSizeOf = \_ -> (56 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_SensorEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_SensorEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"which") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"data'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"sensor_timestamp") ptr0
+
+instance Marshal.WriteRaw SDL_SensorEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_SensorEvent type'2 reserved3 timestamp4 which5 data'6 sensor_timestamp7 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"which") ptr0 which5
+              >> HasCField.writeRaw (BG.Proxy @"data'") ptr0 data'6
+              >> HasCField.writeRaw (BG.Proxy @"sensor_timestamp") ptr0 sensor_timestamp7
+
+deriving via Marshal.EquivStorable SDL_SensorEvent instance BG.Storable SDL_SensorEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_SensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SensorEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , data' = BG.getField @"data'" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_SensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_SensorEvent "type'" where
+  type
+    CFieldType SDL_SensorEvent "type'" =
+      SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_SensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SensorEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , data' = BG.getField @"data'" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_SensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_SensorEvent "reserved" where
+  type
+    CFieldType SDL_SensorEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_SensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SensorEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , which = BG.getField @"which" x0
+            , data' = BG.getField @"data'" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_SensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_SensorEvent "timestamp" where
+  type
+    CFieldType SDL_SensorEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Sensor.SDL_SensorID)
+  => BG.CompatHasField.HasField "which" SDL_SensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SensorEvent
+            { which = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , data' = BG.getField @"data'" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"which" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Sensor.SDL_SensorID)
+  => BG.HasField "which" (BG.Ptr SDL_SensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"which")
+
+instance HasCField.HasCField SDL_SensorEvent "which" where
+  type
+    CFieldType SDL_SensorEvent "which" =
+      SDL3.Sys.Bindgen.Sensor.SDL_SensorID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ CA.ConstantArray 6 BG.CFloat)
+  => BG.CompatHasField.HasField "data'" SDL_SensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SensorEvent
+            { data' = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , sensor_timestamp = BG.getField @"sensor_timestamp" x0
+            }
+      , BG.getField @"data'" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 6 BG.CFloat)
+  => BG.HasField "data'" (BG.Ptr SDL_SensorEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data'")
+
+instance HasCField.HasCField SDL_SensorEvent "data'" where
+  type
+    CFieldType SDL_SensorEvent "data'" =
+      CA.ConstantArray 6 BG.CFloat
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "sensor_timestamp" SDL_SensorEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SensorEvent
+            { sensor_timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , which = BG.getField @"which" x0
+            , data' = BG.getField @"data'" x0
+            }
+      , BG.getField @"sensor_timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "sensor_timestamp" (BG.Ptr SDL_SensorEvent) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"sensor_timestamp")
+
+instance HasCField.HasCField SDL_SensorEvent "sensor_timestamp" where
+  type
+    CFieldType SDL_SensorEvent "sensor_timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 48
+
+-- | The \"quit requested\" event
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_QuitEvent@, defined at @SDL3\/SDL_events.h 978:16@
+data SDL_QuitEvent = SDL_QuitEvent
+  { type' :: SDL_EventType
+  -- ^ SDL_EVENT_QUIT
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 980:19@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 981:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 982:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_QuitEvent where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_QuitEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_QuitEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+
+instance Marshal.WriteRaw SDL_QuitEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_QuitEvent type'2 reserved3 timestamp4 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+
+deriving via Marshal.EquivStorable SDL_QuitEvent instance BG.Storable SDL_QuitEvent
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.CompatHasField.HasField "type'" SDL_QuitEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_QuitEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_EventType)
+  => BG.HasField "type'" (BG.Ptr SDL_QuitEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_QuitEvent "type'" where
+  type CFieldType SDL_QuitEvent "type'" = SDL_EventType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_QuitEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_QuitEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_QuitEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_QuitEvent "reserved" where
+  type
+    CFieldType SDL_QuitEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_QuitEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_QuitEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_QuitEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_QuitEvent "timestamp" where
+  type
+    CFieldType SDL_QuitEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+-- | A user-defined event type (event.user.*)
+--
+--     This event is unique; it is never created by SDL, but only by the application. The event can be pushed onto the event queue using @SDL_PushEvent()@. The contents of the structure members are completely up to the programmer; the only requirement is that \'\'\'type\'\'\' is a value obtained from @SDL_RegisterEvents()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_UserEvent@, defined at @SDL3\/SDL_events.h 996:16@
+data SDL_UserEvent = SDL_UserEvent
+  { type' :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ SDL_EVENT_USER through SDL_EVENT_LAST, Uint32 because these are not in the 'SDL_EventType' enumeration
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_events.h 998:12@
+  , reserved :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_events.h 999:12@
+  , timestamp :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ In nanoseconds, populated using SDL_GetTicksNS()
+  --
+  --          [C declaration]: @timestamp@, defined at @SDL3\/SDL_events.h 1000:12@
+  , windowID :: SDL3.Sys.Bindgen.Video.SDL_WindowID
+  -- ^ The associated window if any
+  --
+  --          [C declaration]: @windowID@, defined at @SDL3\/SDL_events.h 1001:18@
+  , code :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ User defined event code
+  --
+  --          [C declaration]: @code@, defined at @SDL3\/SDL_events.h 1002:12@
+  , data1 :: BG.Ptr BG.Void
+  -- ^ User defined data pointer
+  --
+  --          [C declaration]: @data1@, defined at @SDL3\/SDL_events.h 1003:11@
+  , data2 :: BG.Ptr BG.Void
+  -- ^ User defined data pointer
+  --
+  --          [C declaration]: @data2@, defined at @SDL3\/SDL_events.h 1004:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_UserEvent where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_UserEvent where
+  readRaw =
+    \ptr0 ->
+      pure SDL_UserEvent
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"timestamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"windowID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"code") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"data1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"data2") ptr0
+
+instance Marshal.WriteRaw SDL_UserEvent where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_UserEvent type'2 reserved3 timestamp4 windowID5 code6 data17 data28 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved3
+              >> HasCField.writeRaw (BG.Proxy @"timestamp") ptr0 timestamp4
+              >> HasCField.writeRaw (BG.Proxy @"windowID") ptr0 windowID5
+              >> HasCField.writeRaw (BG.Proxy @"code") ptr0 code6
+              >> HasCField.writeRaw (BG.Proxy @"data1") ptr0 data17
+              >> HasCField.writeRaw (BG.Proxy @"data2") ptr0 data28
+
+deriving via Marshal.EquivStorable SDL_UserEvent instance BG.Storable SDL_UserEvent
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "type'" SDL_UserEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_UserEvent
+            { type' = y1
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , code = BG.getField @"code" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "type'" (BG.Ptr SDL_UserEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_UserEvent "type'" where
+  type
+    CFieldType SDL_UserEvent "type'" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "reserved" SDL_UserEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_UserEvent
+            { reserved = y1
+            , type' = BG.getField @"type'" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , code = BG.getField @"code" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "reserved" (BG.Ptr SDL_UserEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_UserEvent "reserved" where
+  type
+    CFieldType SDL_UserEvent "reserved" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "timestamp" SDL_UserEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_UserEvent
+            { timestamp = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , windowID = BG.getField @"windowID" x0
+            , code = BG.getField @"code" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"timestamp" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "timestamp" (BG.Ptr SDL_UserEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"timestamp")
+
+instance HasCField.HasCField SDL_UserEvent "timestamp" where
+  type
+    CFieldType SDL_UserEvent "timestamp" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.CompatHasField.HasField "windowID" SDL_UserEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_UserEvent
+            { windowID = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , code = BG.getField @"code" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"windowID" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Video.SDL_WindowID)
+  => BG.HasField "windowID" (BG.Ptr SDL_UserEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"windowID")
+
+instance HasCField.HasCField SDL_UserEvent "windowID" where
+  type
+    CFieldType SDL_UserEvent "windowID" =
+      SDL3.Sys.Bindgen.Video.SDL_WindowID
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "code" SDL_UserEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_UserEvent
+            { code = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , data1 = BG.getField @"data1" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"code" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "code" (BG.Ptr SDL_UserEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"code")
+
+instance HasCField.HasCField SDL_UserEvent "code" where
+  type
+    CFieldType SDL_UserEvent "code" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "data1" SDL_UserEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_UserEvent
+            { data1 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , code = BG.getField @"code" x0
+            , data2 = BG.getField @"data2" x0
+            }
+      , BG.getField @"data1" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "data1" (BG.Ptr SDL_UserEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data1")
+
+instance HasCField.HasCField SDL_UserEvent "data1" where
+  type
+    CFieldType SDL_UserEvent "data1" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "data2" SDL_UserEvent ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_UserEvent
+            { data2 = y1
+            , type' = BG.getField @"type'" x0
+            , reserved = BG.getField @"reserved" x0
+            , timestamp = BG.getField @"timestamp" x0
+            , windowID = BG.getField @"windowID" x0
+            , code = BG.getField @"code" x0
+            , data1 = BG.getField @"data1" x0
+            }
+      , BG.getField @"data2" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "data2" (BG.Ptr SDL_UserEvent) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data2")
+
+instance HasCField.HasCField SDL_UserEvent "data2" where
+  type
+    CFieldType SDL_UserEvent "data2" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 32
+
+-- | The structure for all events in SDL.
+--
+--     The 'SDL_Event' structure is the core of all event handling in SDL. 'SDL_Event' is a union of all event structures used in SDL.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @union SDL_Event@, defined at @SDL3\/SDL_events.h 1016:15@
+newtype SDL_Event = SDL_Event
+  { unwrap :: BG.ByteArray
+  }
+  deriving stock (BG.Generic)
+
+deriving via BG.SizedByteArray 128 8 instance Marshal.StaticSize SDL_Event
+
+deriving via BG.SizedByteArray 128 8 instance Marshal.ReadRaw SDL_Event
+
+deriving via BG.SizedByteArray 128 8 instance Marshal.WriteRaw SDL_Event
+
+deriving via Marshal.EquivStorable SDL_Event instance BG.Storable SDL_Event
+
+deriving via BG.SizedByteArray 128 8 instance Union.IsUnion SDL_Event
+
+-- | Event type, shared with all events, Uint32 to cover user events which are not in the 'SDL_EventType' enumeration
+--
+--     [C declaration]: @type@, defined at @SDL3\/SDL_events.h 1018:12@
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "type'" SDL_Event ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Event type, shared with all events, Uint32 to cover user events which are not in the 'SDL_EventType' enumeration
+--
+--     [C declaration]: @type@, defined at @SDL3\/SDL_events.h 1018:12@
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "type'" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"type'" x0)
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "type'" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_Event "type'" where
+  type
+    CFieldType SDL_Event "type'" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Common event data
+--
+--     [C declaration]: @common@, defined at @SDL3\/SDL_events.h 1019:21@
+instance (ty ~ SDL_CommonEvent) => BG.HasField "common" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Common event data
+--
+--     [C declaration]: @common@, defined at @SDL3\/SDL_events.h 1019:21@
+instance
+  (ty ~ SDL_CommonEvent)
+  => BG.CompatHasField.HasField "common" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"common" x0)
+
+instance
+  (ty ~ SDL_CommonEvent)
+  => BG.HasField "common" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"common")
+
+instance HasCField.HasCField SDL_Event "common" where
+  type CFieldType SDL_Event "common" = SDL_CommonEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Display event data
+--
+--     [C declaration]: @display@, defined at @SDL3\/SDL_events.h 1020:22@
+instance (ty ~ SDL_DisplayEvent) => BG.HasField "display" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Display event data
+--
+--     [C declaration]: @display@, defined at @SDL3\/SDL_events.h 1020:22@
+instance
+  (ty ~ SDL_DisplayEvent)
+  => BG.CompatHasField.HasField "display" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"display" x0)
+
+instance
+  (ty ~ SDL_DisplayEvent)
+  => BG.HasField "display" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"display")
+
+instance HasCField.HasCField SDL_Event "display" where
+  type
+    CFieldType SDL_Event "display" =
+      SDL_DisplayEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Window event data
+--
+--     [C declaration]: @window@, defined at @SDL3\/SDL_events.h 1021:21@
+instance (ty ~ SDL_WindowEvent) => BG.HasField "window" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Window event data
+--
+--     [C declaration]: @window@, defined at @SDL3\/SDL_events.h 1021:21@
+instance
+  (ty ~ SDL_WindowEvent)
+  => BG.CompatHasField.HasField "window" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"window" x0)
+
+instance
+  (ty ~ SDL_WindowEvent)
+  => BG.HasField "window" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"window")
+
+instance HasCField.HasCField SDL_Event "window" where
+  type CFieldType SDL_Event "window" = SDL_WindowEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Keyboard device change event data
+--
+--     [C declaration]: @kdevice@, defined at @SDL3\/SDL_events.h 1022:29@
+instance
+  (ty ~ SDL_KeyboardDeviceEvent)
+  => BG.HasField "kdevice" SDL_Event ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Keyboard device change event data
+--
+--     [C declaration]: @kdevice@, defined at @SDL3\/SDL_events.h 1022:29@
+instance
+  (ty ~ SDL_KeyboardDeviceEvent)
+  => BG.CompatHasField.HasField "kdevice" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"kdevice" x0)
+
+instance
+  (ty ~ SDL_KeyboardDeviceEvent)
+  => BG.HasField "kdevice" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"kdevice")
+
+instance HasCField.HasCField SDL_Event "kdevice" where
+  type
+    CFieldType SDL_Event "kdevice" =
+      SDL_KeyboardDeviceEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Keyboard event data
+--
+--     [C declaration]: @key@, defined at @SDL3\/SDL_events.h 1023:23@
+instance (ty ~ SDL_KeyboardEvent) => BG.HasField "key" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Keyboard event data
+--
+--     [C declaration]: @key@, defined at @SDL3\/SDL_events.h 1023:23@
+instance
+  (ty ~ SDL_KeyboardEvent)
+  => BG.CompatHasField.HasField "key" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"key" x0)
+
+instance
+  (ty ~ SDL_KeyboardEvent)
+  => BG.HasField "key" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"key")
+
+instance HasCField.HasCField SDL_Event "key" where
+  type CFieldType SDL_Event "key" = SDL_KeyboardEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Text editing event data
+--
+--     [C declaration]: @edit@, defined at @SDL3\/SDL_events.h 1024:26@
+instance (ty ~ SDL_TextEditingEvent) => BG.HasField "edit" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Text editing event data
+--
+--     [C declaration]: @edit@, defined at @SDL3\/SDL_events.h 1024:26@
+instance
+  (ty ~ SDL_TextEditingEvent)
+  => BG.CompatHasField.HasField "edit" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"edit" x0)
+
+instance
+  (ty ~ SDL_TextEditingEvent)
+  => BG.HasField "edit" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"edit")
+
+instance HasCField.HasCField SDL_Event "edit" where
+  type
+    CFieldType SDL_Event "edit" =
+      SDL_TextEditingEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Text editing candidates event data
+--
+--     [C declaration]: @edit_candidates@, defined at @SDL3\/SDL_events.h 1025:36@
+instance
+  (ty ~ SDL_TextEditingCandidatesEvent)
+  => BG.HasField "edit_candidates" SDL_Event ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Text editing candidates event data
+--
+--     [C declaration]: @edit_candidates@, defined at @SDL3\/SDL_events.h 1025:36@
+instance
+  (ty ~ SDL_TextEditingCandidatesEvent)
+  => BG.CompatHasField.HasField "edit_candidates" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"edit_candidates" x0)
+
+instance
+  (ty ~ SDL_TextEditingCandidatesEvent)
+  => BG.HasField "edit_candidates" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"edit_candidates")
+
+instance HasCField.HasCField SDL_Event "edit_candidates" where
+  type
+    CFieldType SDL_Event "edit_candidates" =
+      SDL_TextEditingCandidatesEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Text input event data
+--
+--     [C declaration]: @text@, defined at @SDL3\/SDL_events.h 1026:24@
+instance (ty ~ SDL_TextInputEvent) => BG.HasField "text" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Text input event data
+--
+--     [C declaration]: @text@, defined at @SDL3\/SDL_events.h 1026:24@
+instance
+  (ty ~ SDL_TextInputEvent)
+  => BG.CompatHasField.HasField "text" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"text" x0)
+
+instance
+  (ty ~ SDL_TextInputEvent)
+  => BG.HasField "text" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"text")
+
+instance HasCField.HasCField SDL_Event "text" where
+  type CFieldType SDL_Event "text" = SDL_TextInputEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Mouse device change event data
+--
+--     [C declaration]: @mdevice@, defined at @SDL3\/SDL_events.h 1027:26@
+instance (ty ~ SDL_MouseDeviceEvent) => BG.HasField "mdevice" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Mouse device change event data
+--
+--     [C declaration]: @mdevice@, defined at @SDL3\/SDL_events.h 1027:26@
+instance
+  (ty ~ SDL_MouseDeviceEvent)
+  => BG.CompatHasField.HasField "mdevice" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"mdevice" x0)
+
+instance
+  (ty ~ SDL_MouseDeviceEvent)
+  => BG.HasField "mdevice" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mdevice")
+
+instance HasCField.HasCField SDL_Event "mdevice" where
+  type
+    CFieldType SDL_Event "mdevice" =
+      SDL_MouseDeviceEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Mouse motion event data
+--
+--     [C declaration]: @motion@, defined at @SDL3\/SDL_events.h 1028:26@
+instance (ty ~ SDL_MouseMotionEvent) => BG.HasField "motion" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Mouse motion event data
+--
+--     [C declaration]: @motion@, defined at @SDL3\/SDL_events.h 1028:26@
+instance
+  (ty ~ SDL_MouseMotionEvent)
+  => BG.CompatHasField.HasField "motion" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"motion" x0)
+
+instance
+  (ty ~ SDL_MouseMotionEvent)
+  => BG.HasField "motion" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"motion")
+
+instance HasCField.HasCField SDL_Event "motion" where
+  type
+    CFieldType SDL_Event "motion" =
+      SDL_MouseMotionEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Mouse button event data
+--
+--     [C declaration]: @button@, defined at @SDL3\/SDL_events.h 1029:26@
+instance (ty ~ SDL_MouseButtonEvent) => BG.HasField "button" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Mouse button event data
+--
+--     [C declaration]: @button@, defined at @SDL3\/SDL_events.h 1029:26@
+instance
+  (ty ~ SDL_MouseButtonEvent)
+  => BG.CompatHasField.HasField "button" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"button" x0)
+
+instance
+  (ty ~ SDL_MouseButtonEvent)
+  => BG.HasField "button" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_Event "button" where
+  type
+    CFieldType SDL_Event "button" =
+      SDL_MouseButtonEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Mouse wheel event data
+--
+--     [C declaration]: @wheel@, defined at @SDL3\/SDL_events.h 1030:25@
+instance (ty ~ SDL_MouseWheelEvent) => BG.HasField "wheel" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Mouse wheel event data
+--
+--     [C declaration]: @wheel@, defined at @SDL3\/SDL_events.h 1030:25@
+instance
+  (ty ~ SDL_MouseWheelEvent)
+  => BG.CompatHasField.HasField "wheel" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"wheel" x0)
+
+instance
+  (ty ~ SDL_MouseWheelEvent)
+  => BG.HasField "wheel" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"wheel")
+
+instance HasCField.HasCField SDL_Event "wheel" where
+  type
+    CFieldType SDL_Event "wheel" =
+      SDL_MouseWheelEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Joystick device change event data
+--
+--     [C declaration]: @jdevice@, defined at @SDL3\/SDL_events.h 1031:24@
+instance (ty ~ SDL_JoyDeviceEvent) => BG.HasField "jdevice" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Joystick device change event data
+--
+--     [C declaration]: @jdevice@, defined at @SDL3\/SDL_events.h 1031:24@
+instance
+  (ty ~ SDL_JoyDeviceEvent)
+  => BG.CompatHasField.HasField "jdevice" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"jdevice" x0)
+
+instance
+  (ty ~ SDL_JoyDeviceEvent)
+  => BG.HasField "jdevice" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"jdevice")
+
+instance HasCField.HasCField SDL_Event "jdevice" where
+  type
+    CFieldType SDL_Event "jdevice" =
+      SDL_JoyDeviceEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Joystick axis event data
+--
+--     [C declaration]: @jaxis@, defined at @SDL3\/SDL_events.h 1032:22@
+instance (ty ~ SDL_JoyAxisEvent) => BG.HasField "jaxis" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Joystick axis event data
+--
+--     [C declaration]: @jaxis@, defined at @SDL3\/SDL_events.h 1032:22@
+instance
+  (ty ~ SDL_JoyAxisEvent)
+  => BG.CompatHasField.HasField "jaxis" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"jaxis" x0)
+
+instance
+  (ty ~ SDL_JoyAxisEvent)
+  => BG.HasField "jaxis" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"jaxis")
+
+instance HasCField.HasCField SDL_Event "jaxis" where
+  type CFieldType SDL_Event "jaxis" = SDL_JoyAxisEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Joystick ball event data
+--
+--     [C declaration]: @jball@, defined at @SDL3\/SDL_events.h 1033:22@
+instance (ty ~ SDL_JoyBallEvent) => BG.HasField "jball" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Joystick ball event data
+--
+--     [C declaration]: @jball@, defined at @SDL3\/SDL_events.h 1033:22@
+instance
+  (ty ~ SDL_JoyBallEvent)
+  => BG.CompatHasField.HasField "jball" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"jball" x0)
+
+instance
+  (ty ~ SDL_JoyBallEvent)
+  => BG.HasField "jball" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"jball")
+
+instance HasCField.HasCField SDL_Event "jball" where
+  type CFieldType SDL_Event "jball" = SDL_JoyBallEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Joystick hat event data
+--
+--     [C declaration]: @jhat@, defined at @SDL3\/SDL_events.h 1034:21@
+instance (ty ~ SDL_JoyHatEvent) => BG.HasField "jhat" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Joystick hat event data
+--
+--     [C declaration]: @jhat@, defined at @SDL3\/SDL_events.h 1034:21@
+instance
+  (ty ~ SDL_JoyHatEvent)
+  => BG.CompatHasField.HasField "jhat" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"jhat" x0)
+
+instance
+  (ty ~ SDL_JoyHatEvent)
+  => BG.HasField "jhat" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"jhat")
+
+instance HasCField.HasCField SDL_Event "jhat" where
+  type CFieldType SDL_Event "jhat" = SDL_JoyHatEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Joystick button event data
+--
+--     [C declaration]: @jbutton@, defined at @SDL3\/SDL_events.h 1035:24@
+instance (ty ~ SDL_JoyButtonEvent) => BG.HasField "jbutton" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Joystick button event data
+--
+--     [C declaration]: @jbutton@, defined at @SDL3\/SDL_events.h 1035:24@
+instance
+  (ty ~ SDL_JoyButtonEvent)
+  => BG.CompatHasField.HasField "jbutton" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"jbutton" x0)
+
+instance
+  (ty ~ SDL_JoyButtonEvent)
+  => BG.HasField "jbutton" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"jbutton")
+
+instance HasCField.HasCField SDL_Event "jbutton" where
+  type
+    CFieldType SDL_Event "jbutton" =
+      SDL_JoyButtonEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Joystick battery event data
+--
+--     [C declaration]: @jbattery@, defined at @SDL3\/SDL_events.h 1036:25@
+instance (ty ~ SDL_JoyBatteryEvent) => BG.HasField "jbattery" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Joystick battery event data
+--
+--     [C declaration]: @jbattery@, defined at @SDL3\/SDL_events.h 1036:25@
+instance
+  (ty ~ SDL_JoyBatteryEvent)
+  => BG.CompatHasField.HasField "jbattery" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"jbattery" x0)
+
+instance
+  (ty ~ SDL_JoyBatteryEvent)
+  => BG.HasField "jbattery" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"jbattery")
+
+instance HasCField.HasCField SDL_Event "jbattery" where
+  type
+    CFieldType SDL_Event "jbattery" =
+      SDL_JoyBatteryEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Gamepad device event data
+--
+--     [C declaration]: @gdevice@, defined at @SDL3\/SDL_events.h 1037:28@
+instance
+  (ty ~ SDL_GamepadDeviceEvent)
+  => BG.HasField "gdevice" SDL_Event ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Gamepad device event data
+--
+--     [C declaration]: @gdevice@, defined at @SDL3\/SDL_events.h 1037:28@
+instance
+  (ty ~ SDL_GamepadDeviceEvent)
+  => BG.CompatHasField.HasField "gdevice" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"gdevice" x0)
+
+instance
+  (ty ~ SDL_GamepadDeviceEvent)
+  => BG.HasField "gdevice" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"gdevice")
+
+instance HasCField.HasCField SDL_Event "gdevice" where
+  type
+    CFieldType SDL_Event "gdevice" =
+      SDL_GamepadDeviceEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Gamepad axis event data
+--
+--     [C declaration]: @gaxis@, defined at @SDL3\/SDL_events.h 1038:26@
+instance (ty ~ SDL_GamepadAxisEvent) => BG.HasField "gaxis" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Gamepad axis event data
+--
+--     [C declaration]: @gaxis@, defined at @SDL3\/SDL_events.h 1038:26@
+instance
+  (ty ~ SDL_GamepadAxisEvent)
+  => BG.CompatHasField.HasField "gaxis" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"gaxis" x0)
+
+instance
+  (ty ~ SDL_GamepadAxisEvent)
+  => BG.HasField "gaxis" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"gaxis")
+
+instance HasCField.HasCField SDL_Event "gaxis" where
+  type
+    CFieldType SDL_Event "gaxis" =
+      SDL_GamepadAxisEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Gamepad button event data
+--
+--     [C declaration]: @gbutton@, defined at @SDL3\/SDL_events.h 1039:28@
+instance
+  (ty ~ SDL_GamepadButtonEvent)
+  => BG.HasField "gbutton" SDL_Event ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Gamepad button event data
+--
+--     [C declaration]: @gbutton@, defined at @SDL3\/SDL_events.h 1039:28@
+instance
+  (ty ~ SDL_GamepadButtonEvent)
+  => BG.CompatHasField.HasField "gbutton" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"gbutton" x0)
+
+instance
+  (ty ~ SDL_GamepadButtonEvent)
+  => BG.HasField "gbutton" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"gbutton")
+
+instance HasCField.HasCField SDL_Event "gbutton" where
+  type
+    CFieldType SDL_Event "gbutton" =
+      SDL_GamepadButtonEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Gamepad touchpad event data
+--
+--     [C declaration]: @gtouchpad@, defined at @SDL3\/SDL_events.h 1040:30@
+instance
+  (ty ~ SDL_GamepadTouchpadEvent)
+  => BG.HasField "gtouchpad" SDL_Event ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Gamepad touchpad event data
+--
+--     [C declaration]: @gtouchpad@, defined at @SDL3\/SDL_events.h 1040:30@
+instance
+  (ty ~ SDL_GamepadTouchpadEvent)
+  => BG.CompatHasField.HasField "gtouchpad" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"gtouchpad" x0)
+
+instance
+  (ty ~ SDL_GamepadTouchpadEvent)
+  => BG.HasField "gtouchpad" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"gtouchpad")
+
+instance HasCField.HasCField SDL_Event "gtouchpad" where
+  type
+    CFieldType SDL_Event "gtouchpad" =
+      SDL_GamepadTouchpadEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Gamepad sensor event data
+--
+--     [C declaration]: @gsensor@, defined at @SDL3\/SDL_events.h 1041:28@
+instance
+  (ty ~ SDL_GamepadSensorEvent)
+  => BG.HasField "gsensor" SDL_Event ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Gamepad sensor event data
+--
+--     [C declaration]: @gsensor@, defined at @SDL3\/SDL_events.h 1041:28@
+instance
+  (ty ~ SDL_GamepadSensorEvent)
+  => BG.CompatHasField.HasField "gsensor" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"gsensor" x0)
+
+instance
+  (ty ~ SDL_GamepadSensorEvent)
+  => BG.HasField "gsensor" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"gsensor")
+
+instance HasCField.HasCField SDL_Event "gsensor" where
+  type
+    CFieldType SDL_Event "gsensor" =
+      SDL_GamepadSensorEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Audio device event data
+--
+--     [C declaration]: @adevice@, defined at @SDL3\/SDL_events.h 1042:26@
+instance (ty ~ SDL_AudioDeviceEvent) => BG.HasField "adevice" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Audio device event data
+--
+--     [C declaration]: @adevice@, defined at @SDL3\/SDL_events.h 1042:26@
+instance
+  (ty ~ SDL_AudioDeviceEvent)
+  => BG.CompatHasField.HasField "adevice" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"adevice" x0)
+
+instance
+  (ty ~ SDL_AudioDeviceEvent)
+  => BG.HasField "adevice" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"adevice")
+
+instance HasCField.HasCField SDL_Event "adevice" where
+  type
+    CFieldType SDL_Event "adevice" =
+      SDL_AudioDeviceEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Camera device event data
+--
+--     [C declaration]: @cdevice@, defined at @SDL3\/SDL_events.h 1043:27@
+instance
+  (ty ~ SDL_CameraDeviceEvent)
+  => BG.HasField "cdevice" SDL_Event ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Camera device event data
+--
+--     [C declaration]: @cdevice@, defined at @SDL3\/SDL_events.h 1043:27@
+instance
+  (ty ~ SDL_CameraDeviceEvent)
+  => BG.CompatHasField.HasField "cdevice" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"cdevice" x0)
+
+instance
+  (ty ~ SDL_CameraDeviceEvent)
+  => BG.HasField "cdevice" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"cdevice")
+
+instance HasCField.HasCField SDL_Event "cdevice" where
+  type
+    CFieldType SDL_Event "cdevice" =
+      SDL_CameraDeviceEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Sensor event data
+--
+--     [C declaration]: @sensor@, defined at @SDL3\/SDL_events.h 1044:21@
+instance (ty ~ SDL_SensorEvent) => BG.HasField "sensor" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Sensor event data
+--
+--     [C declaration]: @sensor@, defined at @SDL3\/SDL_events.h 1044:21@
+instance
+  (ty ~ SDL_SensorEvent)
+  => BG.CompatHasField.HasField "sensor" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"sensor" x0)
+
+instance
+  (ty ~ SDL_SensorEvent)
+  => BG.HasField "sensor" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"sensor")
+
+instance HasCField.HasCField SDL_Event "sensor" where
+  type CFieldType SDL_Event "sensor" = SDL_SensorEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Quit request event data
+--
+--     [C declaration]: @quit@, defined at @SDL3\/SDL_events.h 1045:19@
+instance (ty ~ SDL_QuitEvent) => BG.HasField "quit" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Quit request event data
+--
+--     [C declaration]: @quit@, defined at @SDL3\/SDL_events.h 1045:19@
+instance
+  (ty ~ SDL_QuitEvent)
+  => BG.CompatHasField.HasField "quit" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"quit" x0)
+
+instance
+  (ty ~ SDL_QuitEvent)
+  => BG.HasField "quit" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"quit")
+
+instance HasCField.HasCField SDL_Event "quit" where
+  type CFieldType SDL_Event "quit" = SDL_QuitEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Custom event data
+--
+--     [C declaration]: @user@, defined at @SDL3\/SDL_events.h 1046:19@
+instance (ty ~ SDL_UserEvent) => BG.HasField "user" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Custom event data
+--
+--     [C declaration]: @user@, defined at @SDL3\/SDL_events.h 1046:19@
+instance
+  (ty ~ SDL_UserEvent)
+  => BG.CompatHasField.HasField "user" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"user" x0)
+
+instance
+  (ty ~ SDL_UserEvent)
+  => BG.HasField "user" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"user")
+
+instance HasCField.HasCField SDL_Event "user" where
+  type CFieldType SDL_Event "user" = SDL_UserEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Touch finger event data
+--
+--     [C declaration]: @tfinger@, defined at @SDL3\/SDL_events.h 1047:26@
+instance (ty ~ SDL_TouchFingerEvent) => BG.HasField "tfinger" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Touch finger event data
+--
+--     [C declaration]: @tfinger@, defined at @SDL3\/SDL_events.h 1047:26@
+instance
+  (ty ~ SDL_TouchFingerEvent)
+  => BG.CompatHasField.HasField "tfinger" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"tfinger" x0)
+
+instance
+  (ty ~ SDL_TouchFingerEvent)
+  => BG.HasField "tfinger" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"tfinger")
+
+instance HasCField.HasCField SDL_Event "tfinger" where
+  type
+    CFieldType SDL_Event "tfinger" =
+      SDL_TouchFingerEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Pinch event data
+--
+--     [C declaration]: @pinch@, defined at @SDL3\/SDL_events.h 1048:26@
+instance (ty ~ SDL_PinchFingerEvent) => BG.HasField "pinch" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Pinch event data
+--
+--     [C declaration]: @pinch@, defined at @SDL3\/SDL_events.h 1048:26@
+instance
+  (ty ~ SDL_PinchFingerEvent)
+  => BG.CompatHasField.HasField "pinch" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"pinch" x0)
+
+instance
+  (ty ~ SDL_PinchFingerEvent)
+  => BG.HasField "pinch" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pinch")
+
+instance HasCField.HasCField SDL_Event "pinch" where
+  type
+    CFieldType SDL_Event "pinch" =
+      SDL_PinchFingerEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Pen proximity event data
+--
+--     [C declaration]: @pproximity@, defined at @SDL3\/SDL_events.h 1049:27@
+instance
+  (ty ~ SDL_PenProximityEvent)
+  => BG.HasField "pproximity" SDL_Event ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Pen proximity event data
+--
+--     [C declaration]: @pproximity@, defined at @SDL3\/SDL_events.h 1049:27@
+instance
+  (ty ~ SDL_PenProximityEvent)
+  => BG.CompatHasField.HasField "pproximity" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"pproximity" x0)
+
+instance
+  (ty ~ SDL_PenProximityEvent)
+  => BG.HasField "pproximity" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pproximity")
+
+instance HasCField.HasCField SDL_Event "pproximity" where
+  type
+    CFieldType SDL_Event "pproximity" =
+      SDL_PenProximityEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Pen tip touching event data
+--
+--     [C declaration]: @ptouch@, defined at @SDL3\/SDL_events.h 1050:23@
+instance (ty ~ SDL_PenTouchEvent) => BG.HasField "ptouch" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Pen tip touching event data
+--
+--     [C declaration]: @ptouch@, defined at @SDL3\/SDL_events.h 1050:23@
+instance
+  (ty ~ SDL_PenTouchEvent)
+  => BG.CompatHasField.HasField "ptouch" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"ptouch" x0)
+
+instance
+  (ty ~ SDL_PenTouchEvent)
+  => BG.HasField "ptouch" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"ptouch")
+
+instance HasCField.HasCField SDL_Event "ptouch" where
+  type
+    CFieldType SDL_Event "ptouch" =
+      SDL_PenTouchEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Pen motion event data
+--
+--     [C declaration]: @pmotion@, defined at @SDL3\/SDL_events.h 1051:24@
+instance (ty ~ SDL_PenMotionEvent) => BG.HasField "pmotion" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Pen motion event data
+--
+--     [C declaration]: @pmotion@, defined at @SDL3\/SDL_events.h 1051:24@
+instance
+  (ty ~ SDL_PenMotionEvent)
+  => BG.CompatHasField.HasField "pmotion" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"pmotion" x0)
+
+instance
+  (ty ~ SDL_PenMotionEvent)
+  => BG.HasField "pmotion" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pmotion")
+
+instance HasCField.HasCField SDL_Event "pmotion" where
+  type
+    CFieldType SDL_Event "pmotion" =
+      SDL_PenMotionEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Pen button event data
+--
+--     [C declaration]: @pbutton@, defined at @SDL3\/SDL_events.h 1052:24@
+instance (ty ~ SDL_PenButtonEvent) => BG.HasField "pbutton" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Pen button event data
+--
+--     [C declaration]: @pbutton@, defined at @SDL3\/SDL_events.h 1052:24@
+instance
+  (ty ~ SDL_PenButtonEvent)
+  => BG.CompatHasField.HasField "pbutton" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"pbutton" x0)
+
+instance
+  (ty ~ SDL_PenButtonEvent)
+  => BG.HasField "pbutton" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pbutton")
+
+instance HasCField.HasCField SDL_Event "pbutton" where
+  type
+    CFieldType SDL_Event "pbutton" =
+      SDL_PenButtonEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Pen axis event data
+--
+--     [C declaration]: @paxis@, defined at @SDL3\/SDL_events.h 1053:22@
+instance (ty ~ SDL_PenAxisEvent) => BG.HasField "paxis" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Pen axis event data
+--
+--     [C declaration]: @paxis@, defined at @SDL3\/SDL_events.h 1053:22@
+instance
+  (ty ~ SDL_PenAxisEvent)
+  => BG.CompatHasField.HasField "paxis" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"paxis" x0)
+
+instance
+  (ty ~ SDL_PenAxisEvent)
+  => BG.HasField "paxis" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"paxis")
+
+instance HasCField.HasCField SDL_Event "paxis" where
+  type CFieldType SDL_Event "paxis" = SDL_PenAxisEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Render event data
+--
+--     [C declaration]: @render@, defined at @SDL3\/SDL_events.h 1054:21@
+instance (ty ~ SDL_RenderEvent) => BG.HasField "render" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Render event data
+--
+--     [C declaration]: @render@, defined at @SDL3\/SDL_events.h 1054:21@
+instance
+  (ty ~ SDL_RenderEvent)
+  => BG.CompatHasField.HasField "render" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"render" x0)
+
+instance
+  (ty ~ SDL_RenderEvent)
+  => BG.HasField "render" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"render")
+
+instance HasCField.HasCField SDL_Event "render" where
+  type CFieldType SDL_Event "render" = SDL_RenderEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Drag and drop event data
+--
+--     [C declaration]: @drop@, defined at @SDL3\/SDL_events.h 1055:19@
+instance (ty ~ SDL_DropEvent) => BG.HasField "drop" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Drag and drop event data
+--
+--     [C declaration]: @drop@, defined at @SDL3\/SDL_events.h 1055:19@
+instance
+  (ty ~ SDL_DropEvent)
+  => BG.CompatHasField.HasField "drop" SDL_Event ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"drop" x0)
+
+instance
+  (ty ~ SDL_DropEvent)
+  => BG.HasField "drop" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"drop")
+
+instance HasCField.HasCField SDL_Event "drop" where
+  type CFieldType SDL_Event "drop" = SDL_DropEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | Clipboard event data
+--
+--     [C declaration]: @clipboard@, defined at @SDL3\/SDL_events.h 1056:24@
+instance (ty ~ SDL_ClipboardEvent) => BG.HasField "clipboard" SDL_Event ty where
+  getField = BG.getUnionPayload
+
+-- | Clipboard event data
+--
+--     [C declaration]: @clipboard@, defined at @SDL3\/SDL_events.h 1056:24@
+instance
+  (ty ~ SDL_ClipboardEvent)
+  => BG.CompatHasField.HasField "clipboard" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"clipboard" x0)
+
+instance
+  (ty ~ SDL_ClipboardEvent)
+  => BG.HasField "clipboard" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"clipboard")
+
+instance HasCField.HasCField SDL_Event "clipboard" where
+  type
+    CFieldType SDL_Event "clipboard" =
+      SDL_ClipboardEvent
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @padding@, defined at @SDL3\/SDL_events.h 1071:11@
+instance
+  (ty ~ CA.ConstantArray 128 SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding" SDL_Event ty
+  where
+  getField = BG.getUnionPayload
+
+-- | [C declaration]: @padding@, defined at @SDL3\/SDL_events.h 1071:11@
+instance
+  (ty ~ CA.ConstantArray 128 SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding" SDL_Event ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"padding" x0)
+
+instance
+  (ty ~ CA.ConstantArray 128 SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding" (BG.Ptr SDL_Event) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding")
+
+instance HasCField.HasCField SDL_Event "padding" where
+  type
+    CFieldType SDL_Event "padding" =
+      CA.ConstantArray 128 SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 0
+
+-- | The type of action to request from @SDL_PeepEvents()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_EventAction@, defined at @SDL3\/SDL_events.h 1109:14@
+newtype SDL_EventAction = SDL_EventAction
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_EventAction where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_EventAction where
+  readRaw =
+    \ptr0 ->
+      pure SDL_EventAction
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_EventAction where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_EventAction unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_EventAction instance BG.Storable SDL_EventAction
+
+deriving via BG.CUInt instance BG.Prim SDL_EventAction
+
+instance CEnum.CEnum SDL_EventAction where
+  type CEnumZ SDL_EventAction = BG.CUInt
+
+  toCEnum = SDL_EventAction
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_ADDEVENT")
+        , (1, BG.singleton "SDL_PEEKEVENT")
+        , (2, BG.singleton "SDL_GETEVENT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_EventAction"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_EventAction"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_EventAction where
+  minDeclaredValue = SDL_ADDEVENT
+
+  maxDeclaredValue = SDL_GETEVENT
+
+instance Show SDL_EventAction where
+  showsPrec = CEnum.shows
+
+instance Read SDL_EventAction where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_EventAction ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EventAction{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EventAction) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EventAction "unwrap" where
+  type CFieldType SDL_EventAction "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Add events to the back of the queue.
+--
+--     [C declaration]: @SDL_ADDEVENT@, defined at @SDL3\/SDL_events.h 1111:5@
+pattern SDL_ADDEVENT :: SDL_EventAction
+pattern SDL_ADDEVENT = SDL_EventAction 0
+
+-- | Check but don\'t remove events from the queue front.
+--
+--     [C declaration]: @SDL_PEEKEVENT@, defined at @SDL3\/SDL_events.h 1112:5@
+pattern SDL_PEEKEVENT :: SDL_EventAction
+pattern SDL_PEEKEVENT = SDL_EventAction 1
+
+-- | Retrieve\/remove events from the front of the queue.
+--
+--     [C declaration]: @SDL_GETEVENT@, defined at @SDL3\/SDL_events.h 1113:5@
+pattern SDL_GETEVENT :: SDL_EventAction
+pattern SDL_GETEVENT = SDL_EventAction 2
+
+-- | Auxiliary type used by 'SDL_EventFilter'
+--
+--     [C declaration]: @SDL_EventFilter@, defined at @SDL3\/SDL_events.h 1413:24@
+newtype SDL_EventFilter_Aux = SDL_EventFilter_Aux
+  { unwrap :: BG.Ptr BG.Void -> BG.Ptr SDL_Event -> IO BG.CBool
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_EventFilter_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_eb1994b3ef52d185_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word8)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word8))
+
+-- __unique:__ @toSDL_EventFilter_Aux@
+hs_bindgen_eb1994b3ef52d185
+  :: SDL_EventFilter_Aux
+  -> IO (BG.FunPtr SDL_EventFilter_Aux)
+hs_bindgen_eb1994b3ef52d185 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_eb1994b3ef52d185_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_EventFilter_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_fff801095df0ae67_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word8)
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @fromSDL_EventFilter_Aux@
+hs_bindgen_fff801095df0ae67
+  :: BG.FunPtr SDL_EventFilter_Aux
+  -> SDL_EventFilter_Aux
+hs_bindgen_fff801095df0ae67 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_fff801095df0ae67_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_EventFilter_Aux where
+  toFunPtr = hs_bindgen_eb1994b3ef52d185
+
+instance BG.FromFunPtr SDL_EventFilter_Aux where
+  fromFunPtr = hs_bindgen_fff801095df0ae67
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr SDL_Event -> IO BG.CBool))
+  => BG.CompatHasField.HasField "unwrap" SDL_EventFilter_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EventFilter_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr SDL_Event -> IO BG.CBool))
+  => BG.HasField "unwrap" (BG.Ptr SDL_EventFilter_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EventFilter_Aux "unwrap" where
+  type
+    CFieldType SDL_EventFilter_Aux "unwrap" =
+      BG.Ptr BG.Void -> BG.Ptr SDL_Event -> IO BG.CBool
+
+  offset# = \_ -> \_ -> 0
+
+-- | A function pointer used for callbacks that watch the event queue.
+--
+--     [@userdata@]: what was passed as @userdata@ to @SDL_SetEventFilter()@ or SDL_AddEventWatch, etc.
+--
+--     [@event@]: the event that triggered the callback.
+--
+--     [Returns]: true to permit event to be added to the queue, and false to disallow it. When used with SDL_AddEventWatch, the return value is ignored.
+--
+--     [Thread safety]: SDL may call this callback at any time from any thread; the application is responsible for locking resources the callback touches that need to be protected.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetEventFilter', 'sDL_AddEventWatch'
+--
+--     [C declaration]: @SDL_EventFilter@, defined at @SDL3\/SDL_events.h 1413:24@
+newtype SDL_EventFilter = SDL_EventFilter
+  { unwrap :: BG.FunPtr SDL_EventFilter_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_EventFilter_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_EventFilter ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EventFilter{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_EventFilter_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EventFilter) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EventFilter "unwrap" where
+  type
+    CFieldType SDL_EventFilter "unwrap" =
+      BG.FunPtr SDL_EventFilter_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Events/FunPtr.hs b/src/SDL3/Sys/Bindgen/Events/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Events/FunPtr.hs
@@ -0,0 +1,952 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Events.FunPtr (
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_PumpEvents,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_PeepEvents,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_HasEvent,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_HasEvents,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_FlushEvent,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_FlushEvents,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_PollEvent,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_WaitEvent,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_WaitEventTimeout,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_PushEvent,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_SetEventFilter,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_GetEventFilter,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_AddEventWatch,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_RemoveEventWatch,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_FilterEvents,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_SetEventEnabled,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_EventEnabled,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_RegisterEvents,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_GetWindowFromEvent,
+  SDL3.Sys.Bindgen.Events.FunPtr.sDL_GetEventDescription,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Events
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_events.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PumpEvents */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_9917baac4ce08ba8 (void)) (void)"
+         , "{"
+         , "  return &SDL_PumpEvents;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PeepEvents */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_a86a903c6648c81b (void)) ("
+         , "  SDL_Event *arg1,"
+         , "  signed int arg2,"
+         , "  SDL_EventAction arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_PeepEvents;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_HasEvent */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7e16852183b91d19 (void)) ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_HasEvent;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_HasEvents */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_87deab19d987ab47 (void)) ("
+         , "  Uint32 arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_HasEvents;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_FlushEvent */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_3d397e2de8f614cb (void)) ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_FlushEvent;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_FlushEvents */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_7409f3af10ababea (void)) ("
+         , "  Uint32 arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_FlushEvents;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PollEvent */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e695618acb9426fb (void)) ("
+         , "  SDL_Event *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_PollEvent;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_WaitEvent */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_94029194304d5c31 (void)) ("
+         , "  SDL_Event *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitEvent;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_WaitEventTimeout */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7e78b9d3527f4720 (void)) ("
+         , "  SDL_Event *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitEventTimeout;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PushEvent */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_949def362b6a6d49 (void)) ("
+         , "  SDL_Event *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_PushEvent;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_SetEventFilter */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_b512227bb5014eea (void)) ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetEventFilter;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_GetEventFilter */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_55ed84f0612cc8ac (void)) ("
+         , "  SDL_EventFilter *arg1,"
+         , "  void **arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetEventFilter;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_AddEventWatch */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a03e121760f6b6d3 (void)) ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_AddEventWatch;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_RemoveEventWatch */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_25dfb37d4e519ab9 (void)) ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_RemoveEventWatch;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_FilterEvents */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_53f4b12fdab2103a (void)) ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_FilterEvents;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_SetEventEnabled */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_aa066d1126b2d52a (void)) ("
+         , "  Uint32 arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetEventEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_EventEnabled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_22ccd2bcfeb8819e (void)) ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_EventEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_RegisterEvents */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_1bc1c2cf7c7f16d2 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RegisterEvents;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_GetWindowFromEvent */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_9835b9a553ca5082 (void)) ("
+         , "  SDL_Event const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowFromEvent;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_GetEventDescription */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_1326a7cde53572c5 (void)) ("
+         , "  SDL_Event const *arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetEventDescription;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetEventDescription requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PumpEvents@
+foreign import ccall unsafe "hs_bindgen_9917baac4ce08ba8"
+  hs_bindgen_9917baac4ce08ba8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PumpEvents@
+hs_bindgen_9917baac4ce08ba8 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_9917baac4ce08ba8 =
+  BG.fromFFIType hs_bindgen_9917baac4ce08ba8_base
+
+{-# NOINLINE sDL_PumpEvents #-}
+
+-- | Pump the event loop, gathering events from the input devices.
+--
+--     This function updates the event queue and internal input device state.
+--
+--     @SDL_PumpEvents()@ gathers all the pending input information from devices and places it in the event queue. Without calls to @SDL_PumpEvents()@ no events would ever be placed on the queue. Often the need for calls to @SDL_PumpEvents()@ is hidden from the user since @SDL_PollEvent()@ and @SDL_WaitEvent()@ implicitly call @SDL_PumpEvents()@. However, if you are not polling or waiting for events (e.g. you are filtering them), then you must call @SDL_PumpEvents()@ to force an event queue update.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_WaitEvent'
+--
+--     [C declaration]: @SDL_PumpEvents@, defined at @SDL3\/SDL_events.h 1100:34@
+sDL_PumpEvents :: BG.FunPtr (IO ())
+sDL_PumpEvents =
+  BG.unsafePerformIO hs_bindgen_9917baac4ce08ba8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PeepEvents@
+foreign import ccall unsafe "hs_bindgen_a86a903c6648c81b"
+  hs_bindgen_a86a903c6648c81b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PeepEvents@
+hs_bindgen_a86a903c6648c81b
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Event
+             -> BG.CInt
+             -> SDL_EventAction
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_a86a903c6648c81b =
+  BG.fromFFIType hs_bindgen_a86a903c6648c81b_base
+
+{-# NOINLINE sDL_PeepEvents #-}
+
+-- | Check the event queue for messages and optionally return them.
+--
+--     @action@ may be any of the following:
+--
+--     * @SDL_ADDEVENT@: up to @numevents@ events will be added to the back of the event queue.
+--
+--     * @SDL_PEEKEVENT@: @numevents@ events at the front of the event queue, within the specified minimum and maximum type, will be returned to the caller and will /not/ be removed from the queue. If you pass NULL for @events@, then @numevents@ is ignored and the total number of matching events will be returned.
+--
+--     * @SDL_GETEVENT@: up to @numevents@ events at the front of the event queue, within the specified minimum and maximum type, will be returned to the caller and will be removed from the queue.
+--
+--     You may have to call @SDL_PumpEvents()@ before calling this function. Otherwise, the events may not be ready to be filtered when you call @SDL_PeepEvents()@.
+--
+--     [@events@]: destination buffer for the retrieved events, may be NULL to leave the events in the queue and return the number of events that would have been stored.
+--
+--     [@numevents@]: if action is SDL_ADDEVENT, the number of events to add back to the event queue; if action is SDL_PEEKEVENT or SDL_GETEVENT, the maximum number of events to retrieve.
+--
+--     [@action@]: action to take; see Remarks for details.
+--
+--     [@minType@]: minimum value of the event type to be considered; SDL_EVENT_FIRST is a safe choice.
+--
+--     [@maxType@]: maximum value of the event type to be considered; SDL_EVENT_LAST is a safe choice.
+--
+--     [Returns]: the number of events actually stored or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_PumpEvents', 'sDL_PushEvent'
+--
+--     [C declaration]: @SDL_PeepEvents@, defined at @SDL3\/SDL_events.h 1158:33@
+sDL_PeepEvents
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Event
+         -> BG.CInt
+         -> SDL_EventAction
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CInt
+       )
+sDL_PeepEvents =
+  BG.unsafePerformIO hs_bindgen_a86a903c6648c81b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_HasEvent@
+foreign import ccall unsafe "hs_bindgen_7e16852183b91d19"
+  hs_bindgen_7e16852183b91d19_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_HasEvent@
+hs_bindgen_7e16852183b91d19 :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_7e16852183b91d19 =
+  BG.fromFFIType hs_bindgen_7e16852183b91d19_base
+
+{-# NOINLINE sDL_HasEvent #-}
+
+-- | Check for the existence of a certain event type in the event queue.
+--
+--     If you need to check for a range of event types, use @SDL_HasEvents()@ instead.
+--
+--     [@type@]: the type of event to be queried; see 'SDL_EventType' for details.
+--
+--     [Returns]: true if events matching @type@ are present, or false if events matching @type@ are not present.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasEvents'
+--
+--     [C declaration]: @SDL_HasEvent@, defined at @SDL3\/SDL_events.h 1177:34@
+sDL_HasEvent :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_HasEvent =
+  BG.unsafePerformIO hs_bindgen_7e16852183b91d19
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_HasEvents@
+foreign import ccall unsafe "hs_bindgen_87deab19d987ab47"
+  hs_bindgen_87deab19d987ab47_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_HasEvents@
+hs_bindgen_87deab19d987ab47
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_87deab19d987ab47 =
+  BG.fromFFIType hs_bindgen_87deab19d987ab47_base
+
+{-# NOINLINE sDL_HasEvents #-}
+
+-- | Check for the existence of certain event types in the event queue.
+--
+--     If you need to check for a single event type, use @SDL_HasEvent()@ instead.
+--
+--     [@minType@]: the low end of event type to be queried, inclusive; see 'SDL_EventType' for details.
+--
+--     [@maxType@]: the high end of event type to be queried, inclusive; see 'SDL_EventType' for details.
+--
+--     [Returns]: true if events with type >= @minType@ and \<= @maxType@ are present, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasEvents'
+--
+--     [C declaration]: @SDL_HasEvents@, defined at @SDL3\/SDL_events.h 1198:34@
+sDL_HasEvents
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_HasEvents =
+  BG.unsafePerformIO hs_bindgen_87deab19d987ab47
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_FlushEvent@
+foreign import ccall unsafe "hs_bindgen_3d397e2de8f614cb"
+  hs_bindgen_3d397e2de8f614cb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_FlushEvent@
+hs_bindgen_3d397e2de8f614cb :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO ()))
+hs_bindgen_3d397e2de8f614cb =
+  BG.fromFFIType hs_bindgen_3d397e2de8f614cb_base
+
+{-# NOINLINE sDL_FlushEvent #-}
+
+-- | Clear events of a specific type from the event queue.
+--
+--     This will unconditionally remove any events from the queue that match @type@. If you need to remove a range of event types, use @SDL_FlushEvents()@ instead.
+--
+--     It\'s also normal to just ignore events you don\'t care about in your event loop without calling this function.
+--
+--     This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call @SDL_PumpEvents()@ on the main thread immediately before the flush call.
+--
+--     If you have user events with custom data that needs to be freed, you should use @SDL_PeepEvents()@ to remove and clean up those events before calling this function.
+--
+--     [@type@]: the type of event to be cleared; see 'SDL_EventType' for details.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FlushEvents'
+--
+--     [C declaration]: @SDL_FlushEvent@, defined at @SDL3\/SDL_events.h 1226:34@
+sDL_FlushEvent :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO ())
+sDL_FlushEvent =
+  BG.unsafePerformIO hs_bindgen_3d397e2de8f614cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_FlushEvents@
+foreign import ccall unsafe "hs_bindgen_7409f3af10ababea"
+  hs_bindgen_7409f3af10ababea_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_FlushEvents@
+hs_bindgen_7409f3af10ababea
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO ()))
+hs_bindgen_7409f3af10ababea =
+  BG.fromFFIType hs_bindgen_7409f3af10ababea_base
+
+{-# NOINLINE sDL_FlushEvents #-}
+
+-- | Clear events of a range of types from the event queue.
+--
+--     This will unconditionally remove any events from the queue that are in the range of @minType@ to @maxType@, inclusive. If you need to remove a single event type, use @SDL_FlushEvent()@ instead.
+--
+--     It\'s also normal to just ignore events you don\'t care about in your event loop without calling this function.
+--
+--     This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call @SDL_PumpEvents()@ on the main thread immediately before the flush call.
+--
+--     [@minType@]: the low end of event type to be cleared, inclusive; see 'SDL_EventType' for details.
+--
+--     [@maxType@]: the high end of event type to be cleared, inclusive; see 'SDL_EventType' for details.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FlushEvent'
+--
+--     [C declaration]: @SDL_FlushEvents@, defined at @SDL3\/SDL_events.h 1253:34@
+sDL_FlushEvents
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO ())
+sDL_FlushEvents =
+  BG.unsafePerformIO hs_bindgen_7409f3af10ababea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PollEvent@
+foreign import ccall unsafe "hs_bindgen_e695618acb9426fb"
+  hs_bindgen_e695618acb9426fb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PollEvent@
+hs_bindgen_e695618acb9426fb :: IO (BG.FunPtr (BG.Ptr SDL_Event -> IO BG.CBool))
+hs_bindgen_e695618acb9426fb =
+  BG.fromFFIType hs_bindgen_e695618acb9426fb_base
+
+{-# NOINLINE sDL_PollEvent #-}
+
+-- | Poll for currently pending events.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     If @event@ is NULL, it simply returns true if there is an event in the queue, but will not remove it from the queue.
+--
+--     As this function may implicitly call @SDL_PumpEvents()@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     @SDL_PollEvent()@ is the favored way of receiving system events since it can be done from the main loop and does not suspend the main loop while waiting on an event to be posted.
+--
+--     The common practice is to fully process the event queue once every frame, usually as a first step before updating the game\'s state:
+--
+--     @
+--     while (game_is_still_running) {
+--         SDL_Event event;
+--         while (SDL_PollEvent(&event)) {  \/\/ poll until all events are handled!
+--             \/\/ decide what to do with this event.
+--         }
+--
+--         \/\/ update game state, draw the current frame
+--     }
+--     @
+--
+--     Note that Windows (and possibly other platforms) has a quirk about how it handles events while dragging\/resizing a window, which can cause this function to block for significant amounts of time. Technical explanations and solutions are discussed on the wiki:
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/AppFreezeDuringDrag](https://wiki.libsdl.org/SDL3/AppFreezeDuringDrag)
+--
+--     [@event@]: the 'SDL_Event' structure to be filled with the next event from the queue, or NULL.
+--
+--     [Returns]: true if this got an event or false if there are none available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PushEvent', 'sDL_WaitEvent', 'sDL_WaitEventTimeout'
+--
+--     [C declaration]: @SDL_PollEvent@, defined at @SDL3\/SDL_events.h 1304:34@
+sDL_PollEvent :: BG.FunPtr (BG.Ptr SDL_Event -> IO BG.CBool)
+sDL_PollEvent =
+  BG.unsafePerformIO hs_bindgen_e695618acb9426fb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_WaitEvent@
+foreign import ccall unsafe "hs_bindgen_94029194304d5c31"
+  hs_bindgen_94029194304d5c31_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_WaitEvent@
+hs_bindgen_94029194304d5c31 :: IO (BG.FunPtr (BG.Ptr SDL_Event -> IO BG.CBool))
+hs_bindgen_94029194304d5c31 =
+  BG.fromFFIType hs_bindgen_94029194304d5c31_base
+
+{-# NOINLINE sDL_WaitEvent #-}
+
+-- | Wait indefinitely for the next available event.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     As this function may implicitly call @SDL_PumpEvents()@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     [@event@]: the 'SDL_Event' structure to be filled in with the next event from the queue, or NULL.
+--
+--     [Returns]: true on success or false if there was an error while waiting for events; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_PushEvent', 'sDL_WaitEventTimeout'
+--
+--     [C declaration]: @SDL_WaitEvent@, defined at @SDL3\/SDL_events.h 1328:34@
+sDL_WaitEvent :: BG.FunPtr (BG.Ptr SDL_Event -> IO BG.CBool)
+sDL_WaitEvent =
+  BG.unsafePerformIO hs_bindgen_94029194304d5c31
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_WaitEventTimeout@
+foreign import ccall unsafe "hs_bindgen_7e78b9d3527f4720"
+  hs_bindgen_7e78b9d3527f4720_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_WaitEventTimeout@
+hs_bindgen_7e78b9d3527f4720
+  :: IO (BG.FunPtr (BG.Ptr SDL_Event -> SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool))
+hs_bindgen_7e78b9d3527f4720 =
+  BG.fromFFIType hs_bindgen_7e78b9d3527f4720_base
+
+{-# NOINLINE sDL_WaitEventTimeout #-}
+
+-- | Wait until the specified timeout (in milliseconds) for the next available event.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     As this function may implicitly call @SDL_PumpEvents()@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     The timeout is not guaranteed, the actual wait time could be longer due to system scheduling.
+--
+--     [@event@]: the 'SDL_Event' structure to be filled in with the next event from the queue, or NULL.
+--
+--     [@timeoutMS@]: the maximum number of milliseconds to wait for the next available event.
+--
+--     [Returns]: true if this got an event or false if the timeout elapsed without any events available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_PushEvent', 'sDL_WaitEvent'
+--
+--     [C declaration]: @SDL_WaitEventTimeout@, defined at @SDL3\/SDL_events.h 1358:34@
+sDL_WaitEventTimeout
+  :: BG.FunPtr (BG.Ptr SDL_Event -> SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool)
+sDL_WaitEventTimeout =
+  BG.unsafePerformIO hs_bindgen_7e78b9d3527f4720
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PushEvent@
+foreign import ccall unsafe "hs_bindgen_949def362b6a6d49"
+  hs_bindgen_949def362b6a6d49_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_PushEvent@
+hs_bindgen_949def362b6a6d49 :: IO (BG.FunPtr (BG.Ptr SDL_Event -> IO BG.CBool))
+hs_bindgen_949def362b6a6d49 =
+  BG.fromFFIType hs_bindgen_949def362b6a6d49_base
+
+{-# NOINLINE sDL_PushEvent #-}
+
+-- | Add an event to the event queue.
+--
+--     The event queue can actually be used as a two way communication channel. Not only can events be read from the queue, but the user can also push their own events onto it. @event@ is a pointer to the event structure you wish to push onto the queue. The event is copied into the queue, and the caller may dispose of the memory pointed to after @SDL_PushEvent()@ returns.
+--
+--     Note: Pushing device input events onto the queue doesn\'t modify the state of the device within SDL.
+--
+--     Note: Events pushed onto the queue with @SDL_PushEvent()@ get passed through the event filter but events added with @SDL_PeepEvents()@ do not.
+--
+--     For pushing application-specific events, please use @SDL_RegisterEvents()@ to get an event type that does not conflict with other code that also wants its own custom event types.
+--
+--     [@event@]: the 'SDL_Event' to be added to the queue.
+--
+--     [Returns]: true on success, false if the event was filtered or on failure; call SDL_GetError() for more information. A common reason for error is the event queue being full.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PeepEvents', 'sDL_PollEvent', 'sDL_RegisterEvents'
+--
+--     [C declaration]: @SDL_PushEvent@, defined at @SDL3\/SDL_events.h 1392:34@
+sDL_PushEvent :: BG.FunPtr (BG.Ptr SDL_Event -> IO BG.CBool)
+sDL_PushEvent =
+  BG.unsafePerformIO hs_bindgen_949def362b6a6d49
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_SetEventFilter@
+foreign import ccall unsafe "hs_bindgen_b512227bb5014eea"
+  hs_bindgen_b512227bb5014eea_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_SetEventFilter@
+hs_bindgen_b512227bb5014eea :: IO (BG.FunPtr (SDL_EventFilter -> BG.Ptr BG.Void -> IO ()))
+hs_bindgen_b512227bb5014eea =
+  BG.fromFFIType hs_bindgen_b512227bb5014eea_base
+
+{-# NOINLINE sDL_SetEventFilter #-}
+
+-- | Set up a filter to process all events before they are added to the internal event queue.
+--
+--     If you just want to see events without modifying them or preventing them from being queued, you should use @SDL_AddEventWatch()@ instead.
+--
+--     If the filter function returns true when called, then the event will be added to the internal queue. If it returns false, then the event will be dropped from the queue, but the internal state will still be updated. This allows selective filtering of dynamically arriving events.
+--
+--     __WARNING__: Be very careful of what you do in the event filter function, as it may run in a different thread! The exception is handling of SDL_EVENT_WINDOW_EXPOSED, which is guaranteed to be sent from the OS on the main thread and you are expected to redraw your window in response to this event.
+--
+--     On platforms that support it, if the quit event is generated by an interrupt signal (e.g. pressing Ctrl-C), it will be delivered to the application at the next event poll.
+--
+--     Note: Disabled events never make it to the event filter function; see @SDL_SetEventEnabled()@.
+--
+--     Note: Events pushed onto the queue with @SDL_PushEvent()@ get passed through the event filter, but events pushed onto the queue with @SDL_PeepEvents()@ do not.
+--
+--     [@filter@]: a function to call when an event happens.
+--
+--     [@userdata@]: a pointer that is passed to @filter@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddEventWatch', 'sDL_SetEventEnabled', 'sDL_GetEventFilter', 'sDL_PeepEvents', 'sDL_PushEvent'
+--
+--     [C declaration]: @SDL_SetEventFilter@, defined at @SDL3\/SDL_events.h 1457:34@
+sDL_SetEventFilter :: BG.FunPtr (SDL_EventFilter -> BG.Ptr BG.Void -> IO ())
+sDL_SetEventFilter =
+  BG.unsafePerformIO hs_bindgen_b512227bb5014eea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_GetEventFilter@
+foreign import ccall unsafe "hs_bindgen_55ed84f0612cc8ac"
+  hs_bindgen_55ed84f0612cc8ac_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_GetEventFilter@
+hs_bindgen_55ed84f0612cc8ac
+  :: IO (BG.FunPtr (BG.Ptr SDL_EventFilter -> BG.Ptr (BG.Ptr BG.Void) -> IO BG.CBool))
+hs_bindgen_55ed84f0612cc8ac =
+  BG.fromFFIType hs_bindgen_55ed84f0612cc8ac_base
+
+{-# NOINLINE sDL_GetEventFilter #-}
+
+-- | Query the current event filter.
+--
+--     This function can be used to \"chain\" filters, by saving the existing filter before replacing it with a function that will call that saved filter.
+--
+--     [@filter@]: the current callback function will be stored here.
+--
+--     [@userdata@]: the pointer that is passed to the current event filter will be stored here.
+--
+--     [Returns]: true on success or false if there is no event filter set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetEventFilter'
+--
+--     [C declaration]: @SDL_GetEventFilter@, defined at @SDL3\/SDL_events.h 1476:34@
+sDL_GetEventFilter :: BG.FunPtr (BG.Ptr SDL_EventFilter -> BG.Ptr (BG.Ptr BG.Void) -> IO BG.CBool)
+sDL_GetEventFilter =
+  BG.unsafePerformIO hs_bindgen_55ed84f0612cc8ac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_AddEventWatch@
+foreign import ccall unsafe "hs_bindgen_a03e121760f6b6d3"
+  hs_bindgen_a03e121760f6b6d3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_AddEventWatch@
+hs_bindgen_a03e121760f6b6d3 :: IO (BG.FunPtr (SDL_EventFilter -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_a03e121760f6b6d3 =
+  BG.fromFFIType hs_bindgen_a03e121760f6b6d3_base
+
+{-# NOINLINE sDL_AddEventWatch #-}
+
+-- | Add a callback to be triggered when an event is added to the event queue.
+--
+--     @filter@ will be called when an event happens, and its return value is ignored.
+--
+--     __WARNING__: Be very careful of what you do in the event filter function, as it may run in a different thread!
+--
+--     If the quit event is generated by a signal (e.g. SIGINT), it will bypass the internal queue and be delivered to the watch callback immediately, and arrive at the next event poll.
+--
+--     Note: the callback is called for events posted by the user through @SDL_PushEvent()@, but not for disabled events, nor for events by a filter callback set with @SDL_SetEventFilter()@, nor for events posted by the user through @SDL_PeepEvents()@.
+--
+--     [@filter@]: an 'SDL_EventFilter' function to call when an event happens.
+--
+--     [@userdata@]: a pointer that is passed to @filter@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveEventWatch', 'sDL_SetEventFilter'
+--
+--     [C declaration]: @SDL_AddEventWatch@, defined at @SDL3\/SDL_events.h 1508:34@
+sDL_AddEventWatch :: BG.FunPtr (SDL_EventFilter -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_AddEventWatch =
+  BG.unsafePerformIO hs_bindgen_a03e121760f6b6d3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_RemoveEventWatch@
+foreign import ccall unsafe "hs_bindgen_25dfb37d4e519ab9"
+  hs_bindgen_25dfb37d4e519ab9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_RemoveEventWatch@
+hs_bindgen_25dfb37d4e519ab9 :: IO (BG.FunPtr (SDL_EventFilter -> BG.Ptr BG.Void -> IO ()))
+hs_bindgen_25dfb37d4e519ab9 =
+  BG.fromFFIType hs_bindgen_25dfb37d4e519ab9_base
+
+{-# NOINLINE sDL_RemoveEventWatch #-}
+
+-- | Remove an event watch callback added with @SDL_AddEventWatch()@.
+--
+--     This function takes the same input as @SDL_AddEventWatch()@ to identify and delete the corresponding callback.
+--
+--     [@filter@]: the function originally passed to @SDL_AddEventWatch()@.
+--
+--     [@userdata@]: the pointer originally passed to @SDL_AddEventWatch()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddEventWatch'
+--
+--     [C declaration]: @SDL_RemoveEventWatch@, defined at @SDL3\/SDL_events.h 1525:34@
+sDL_RemoveEventWatch :: BG.FunPtr (SDL_EventFilter -> BG.Ptr BG.Void -> IO ())
+sDL_RemoveEventWatch =
+  BG.unsafePerformIO hs_bindgen_25dfb37d4e519ab9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_FilterEvents@
+foreign import ccall unsafe "hs_bindgen_53f4b12fdab2103a"
+  hs_bindgen_53f4b12fdab2103a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_FilterEvents@
+hs_bindgen_53f4b12fdab2103a :: IO (BG.FunPtr (SDL_EventFilter -> BG.Ptr BG.Void -> IO ()))
+hs_bindgen_53f4b12fdab2103a =
+  BG.fromFFIType hs_bindgen_53f4b12fdab2103a_base
+
+{-# NOINLINE sDL_FilterEvents #-}
+
+-- | Run a specific filter function on the current event queue, removing any events for which the filter returns false.
+--
+--     See @SDL_SetEventFilter()@ for more information. Unlike @SDL_SetEventFilter()@, this function does not change the filter permanently, it only uses the supplied filter until this function returns.
+--
+--     [@filter@]: the 'SDL_EventFilter' function to call when an event happens.
+--
+--     [@userdata@]: a pointer that is passed to @filter@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEventFilter', 'sDL_SetEventFilter'
+--
+--     [C declaration]: @SDL_FilterEvents@, defined at @SDL3\/SDL_events.h 1545:34@
+sDL_FilterEvents :: BG.FunPtr (SDL_EventFilter -> BG.Ptr BG.Void -> IO ())
+sDL_FilterEvents =
+  BG.unsafePerformIO hs_bindgen_53f4b12fdab2103a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_SetEventEnabled@
+foreign import ccall unsafe "hs_bindgen_aa066d1126b2d52a"
+  hs_bindgen_aa066d1126b2d52a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_SetEventEnabled@
+hs_bindgen_aa066d1126b2d52a :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> BG.CBool -> IO ()))
+hs_bindgen_aa066d1126b2d52a =
+  BG.fromFFIType hs_bindgen_aa066d1126b2d52a_base
+
+{-# NOINLINE sDL_SetEventEnabled #-}
+
+-- | Set the state of processing events by type.
+--
+--     [@type@]: the type of event; see 'SDL_EventType' for details.
+--
+--     [@enabled@]: whether to process the event or not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EventEnabled'
+--
+--     [C declaration]: @SDL_SetEventEnabled@, defined at @SDL3\/SDL_events.h 1559:34@
+sDL_SetEventEnabled :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> BG.CBool -> IO ())
+sDL_SetEventEnabled =
+  BG.unsafePerformIO hs_bindgen_aa066d1126b2d52a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_EventEnabled@
+foreign import ccall unsafe "hs_bindgen_22ccd2bcfeb8819e"
+  hs_bindgen_22ccd2bcfeb8819e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_EventEnabled@
+hs_bindgen_22ccd2bcfeb8819e :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_22ccd2bcfeb8819e =
+  BG.fromFFIType hs_bindgen_22ccd2bcfeb8819e_base
+
+{-# NOINLINE sDL_EventEnabled #-}
+
+-- | Query the state of processing events by type.
+--
+--     [@type@]: the type of event; see 'SDL_EventType' for details.
+--
+--     [Returns]: true if the event is being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetEventEnabled'
+--
+--     [C declaration]: @SDL_EventEnabled@, defined at @SDL3\/SDL_events.h 1573:34@
+sDL_EventEnabled :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_EventEnabled =
+  BG.unsafePerformIO hs_bindgen_22ccd2bcfeb8819e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_RegisterEvents@
+foreign import ccall unsafe "hs_bindgen_1bc1c2cf7c7f16d2"
+  hs_bindgen_1bc1c2cf7c7f16d2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_RegisterEvents@
+hs_bindgen_1bc1c2cf7c7f16d2 :: IO (BG.FunPtr (BG.CInt -> IO SDL3.Sys.Bindgen.Stdinc.Uint32))
+hs_bindgen_1bc1c2cf7c7f16d2 =
+  BG.fromFFIType hs_bindgen_1bc1c2cf7c7f16d2_base
+
+{-# NOINLINE sDL_RegisterEvents #-}
+
+-- | Allocate a set of user-defined events, and return the beginning event number for that set of events.
+--
+--     [@numevents@]: the number of events to be allocated.
+--
+--     [Returns]: the beginning event number, or 0 if numevents is invalid or if there are not enough user-defined events left.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PushEvent'
+--
+--     [C declaration]: @SDL_RegisterEvents@, defined at @SDL3\/SDL_events.h 1589:36@
+sDL_RegisterEvents :: BG.FunPtr (BG.CInt -> IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+sDL_RegisterEvents =
+  BG.unsafePerformIO hs_bindgen_1bc1c2cf7c7f16d2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_GetWindowFromEvent@
+foreign import ccall unsafe "hs_bindgen_9835b9a553ca5082"
+  hs_bindgen_9835b9a553ca5082_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_GetWindowFromEvent@
+hs_bindgen_9835b9a553ca5082
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_Event -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)))
+hs_bindgen_9835b9a553ca5082 =
+  BG.fromFFIType hs_bindgen_9835b9a553ca5082_base
+
+{-# NOINLINE sDL_GetWindowFromEvent #-}
+
+-- | Get window associated with an event.
+--
+--     [@event@]: an event containing a @windowID@.
+--
+--     [Returns]: the associated window on success or NULL if there is none.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_WaitEvent', 'sDL_WaitEventTimeout'
+--
+--     [C declaration]: @SDL_GetWindowFromEvent@, defined at @SDL3\/SDL_events.h 1605:42@
+sDL_GetWindowFromEvent
+  :: BG.FunPtr (PtrConst.PtrConst SDL_Event -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window))
+sDL_GetWindowFromEvent =
+  BG.unsafePerformIO hs_bindgen_9835b9a553ca5082
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_GetEventDescription@
+foreign import ccall unsafe "hs_bindgen_1326a7cde53572c5"
+  hs_bindgen_1326a7cde53572c5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_get_SDL_GetEventDescription@
+hs_bindgen_1326a7cde53572c5
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_Event -> BG.Ptr BG.CChar -> BG.CInt -> IO BG.CInt))
+hs_bindgen_1326a7cde53572c5 =
+  BG.fromFFIType hs_bindgen_1326a7cde53572c5_base
+
+{-# NOINLINE sDL_GetEventDescription #-}
+
+-- | Generate an English description of an event.
+--
+--     This will fill @buf@ with a null-terminated string that might look something like this:
+--
+--     @
+--     SDL_EVENT_MOUSE_MOTION (timestamp=1140256324 windowid=2 which=0 state=0 x=492.99 y=139.09 xrel=52 yrel=6)
+--     @
+--
+--     The exact format of the string is not guaranteed; it is intended for logging purposes, to be read by a human, and not parsed by a computer.
+--
+--     The returned value follows the same rules as SDL_snprintf(): @buf@ will always be NULL-terminated (unless @buflen@ is zero), and will be truncated if @buflen@ is too small. The return code is the number of bytes needed for the complete string, not counting the NULL-terminator, whether the string was truncated or not. Unlike SDL_snprintf(), though, this function never returns -1.
+--
+--     [@event@]: an event to describe. May be NULL.
+--
+--     [@buf@]: the buffer to fill with the description string. May be NULL.
+--
+--     [@buflen@]: the maximum bytes that can be written to @buf@.
+--
+--     [Returns]: number of bytes needed for the full string, not counting the null-terminator byte.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetEventDescription@, defined at @SDL3\/SDL_events.h 1637:33@
+sDL_GetEventDescription
+  :: BG.FunPtr (PtrConst.PtrConst SDL_Event -> BG.Ptr BG.CChar -> BG.CInt -> IO BG.CInt)
+sDL_GetEventDescription =
+  BG.unsafePerformIO hs_bindgen_1326a7cde53572c5
diff --git a/src/SDL3/Sys/Bindgen/Events/Safe.hs b/src/SDL3/Sys/Bindgen/Events/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Events/Safe.hs
@@ -0,0 +1,997 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Events.Safe (
+  SDL3.Sys.Bindgen.Events.Safe.sDL_PumpEvents,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_PeepEvents,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_HasEvent,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_HasEvents,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_FlushEvent,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_FlushEvents,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_PollEvent,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_WaitEvent,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_WaitEventTimeout,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_PushEvent,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_SetEventFilter,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_GetEventFilter,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_AddEventWatch,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_RemoveEventWatch,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_FilterEvents,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_SetEventEnabled,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_EventEnabled,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_RegisterEvents,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_GetWindowFromEvent,
+  SDL3.Sys.Bindgen.Events.Safe.sDL_GetEventDescription,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Events
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_events.h>"
+         , "void hs_bindgen_1f67d12e30b7c737 (void)"
+         , "{"
+         , "  (SDL_PumpEvents)();"
+         , "}"
+         , "signed int hs_bindgen_955ad135478289d8 ("
+         , "  SDL_Event *arg1,"
+         , "  signed int arg2,"
+         , "  SDL_EventAction arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_PeepEvents)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_97c2d6376377c17b ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_HasEvent)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_313622652a8473b1 ("
+         , "  Uint32 arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_HasEvents)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_2d03a2b249bf7669 ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  (SDL_FlushEvent)(arg1);"
+         , "}"
+         , "void hs_bindgen_445ea0272a2d7d08 ("
+         , "  Uint32 arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  (SDL_FlushEvents)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ceef91a4b9f5e02b ("
+         , "  SDL_Event *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_PollEvent)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_23e78ed0fb51a6da ("
+         , "  SDL_Event *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitEvent)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_556eff19f5f71f6a ("
+         , "  SDL_Event *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitEventTimeout)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b43b72b75f8fc0a4 ("
+         , "  SDL_Event *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_PushEvent)(arg1);"
+         , "}"
+         , "void hs_bindgen_2af28699d7398805 ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetEventFilter)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_be8f273c9471fe63 ("
+         , "  SDL_EventFilter *arg1,"
+         , "  void **arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetEventFilter)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_1032b9b1e1b3559e ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AddEventWatch)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_3dfeb3d0c0d67825 ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_RemoveEventWatch)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_6c8e2afc32ccc02a ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_FilterEvents)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_980b7ed1ad20c98e ("
+         , "  Uint32 arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetEventEnabled)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_581f5ed4b389f9ad ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_EventEnabled)(arg1);"
+         , "}"
+         , "Uint32 hs_bindgen_68df500d3720ae65 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RegisterEvents)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_bf32d25772bf7533 ("
+         , "  SDL_Event const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowFromEvent)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "signed int hs_bindgen_791dc84efb7c9255 ("
+         , "  SDL_Event const *arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetEventDescription)(arg1, arg2, arg3);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; SDL_SetError(\"SDL_GetEventDescription requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_PumpEvents@
+foreign import ccall safe "hs_bindgen_1f67d12e30b7c737"
+  hs_bindgen_1f67d12e30b7c737_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_PumpEvents@
+hs_bindgen_1f67d12e30b7c737 :: IO ()
+hs_bindgen_1f67d12e30b7c737 =
+  BG.fromFFIType hs_bindgen_1f67d12e30b7c737_base
+
+-- | Pump the event loop, gathering events from the input devices.
+--
+--     This function updates the event queue and internal input device state.
+--
+--     @SDL_PumpEvents()@ gathers all the pending input information from devices and places it in the event queue. Without calls to @SDL_PumpEvents()@ no events would ever be placed on the queue. Often the need for calls to @SDL_PumpEvents()@ is hidden from the user since @SDL_PollEvent()@ and @SDL_WaitEvent()@ implicitly call @SDL_PumpEvents()@. However, if you are not polling or waiting for events (e.g. you are filtering them), then you must call @SDL_PumpEvents()@ to force an event queue update.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_WaitEvent'
+--
+--     [C declaration]: @SDL_PumpEvents@, defined at @SDL3\/SDL_events.h 1100:34@
+sDL_PumpEvents :: IO ()
+sDL_PumpEvents = hs_bindgen_1f67d12e30b7c737
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_PeepEvents@
+foreign import ccall safe "hs_bindgen_955ad135478289d8"
+  hs_bindgen_955ad135478289d8_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_PeepEvents@
+hs_bindgen_955ad135478289d8
+  :: BG.Ptr SDL_Event
+  -> BG.CInt
+  -> SDL_EventAction
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CInt
+hs_bindgen_955ad135478289d8 =
+  BG.fromFFIType hs_bindgen_955ad135478289d8_base
+
+-- | Check the event queue for messages and optionally return them.
+--
+--     @action@ may be any of the following:
+--
+--     * @SDL_ADDEVENT@: up to @numevents@ events will be added to the back of the event queue.
+--
+--     * @SDL_PEEKEVENT@: @numevents@ events at the front of the event queue, within the specified minimum and maximum type, will be returned to the caller and will /not/ be removed from the queue. If you pass NULL for @events@, then @numevents@ is ignored and the total number of matching events will be returned.
+--
+--     * @SDL_GETEVENT@: up to @numevents@ events at the front of the event queue, within the specified minimum and maximum type, will be returned to the caller and will be removed from the queue.
+--
+--     You may have to call @SDL_PumpEvents()@ before calling this function. Otherwise, the events may not be ready to be filtered when you call @SDL_PeepEvents()@.
+--
+--     [Returns]: the number of events actually stored or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_PumpEvents', 'sDL_PushEvent'
+--
+--     [C declaration]: @SDL_PeepEvents@, defined at @SDL3\/SDL_events.h 1158:33@
+sDL_PeepEvents
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@events@]: destination buffer for the retrieved events, may be NULL to leave the events in the queue and return the number of events that would have been stored.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@numevents@]: if action is SDL_ADDEVENT, the number of events to add back to the event queue; if action is SDL_PEEKEVENT or SDL_GETEVENT, the maximum number of events to retrieve.
+  -> SDL_EventAction
+  -- ^
+  --
+  --           [@action@]: action to take; see Remarks for details.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@minType@]: minimum value of the event type to be considered; SDL_EVENT_FIRST is a safe choice.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@maxType@]: maximum value of the event type to be considered; SDL_EVENT_LAST is a safe choice.
+  -> IO BG.CInt
+sDL_PeepEvents = hs_bindgen_955ad135478289d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_HasEvent@
+foreign import ccall safe "hs_bindgen_97c2d6376377c17b"
+  hs_bindgen_97c2d6376377c17b_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_HasEvent@
+hs_bindgen_97c2d6376377c17b
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_97c2d6376377c17b =
+  BG.fromFFIType hs_bindgen_97c2d6376377c17b_base
+
+-- | Check for the existence of a certain event type in the event queue.
+--
+--     If you need to check for a range of event types, use @SDL_HasEvents()@ instead.
+--
+--     [Returns]: true if events matching @type@ are present, or false if events matching @type@ are not present.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasEvents'
+--
+--     [C declaration]: @SDL_HasEvent@, defined at @SDL3\/SDL_events.h 1177:34@
+sDL_HasEvent
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@type@]: the type of event to be queried; see 'SDL_EventType' for details.
+  -> IO BG.CBool
+sDL_HasEvent = hs_bindgen_97c2d6376377c17b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_HasEvents@
+foreign import ccall safe "hs_bindgen_313622652a8473b1"
+  hs_bindgen_313622652a8473b1_base
+    :: BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_HasEvents@
+hs_bindgen_313622652a8473b1
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_313622652a8473b1 =
+  BG.fromFFIType hs_bindgen_313622652a8473b1_base
+
+-- | Check for the existence of certain event types in the event queue.
+--
+--     If you need to check for a single event type, use @SDL_HasEvent()@ instead.
+--
+--     [Returns]: true if events with type >= @minType@ and \<= @maxType@ are present, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasEvents'
+--
+--     [C declaration]: @SDL_HasEvents@, defined at @SDL3\/SDL_events.h 1198:34@
+sDL_HasEvents
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@minType@]: the low end of event type to be queried, inclusive; see 'SDL_EventType' for details.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@maxType@]: the high end of event type to be queried, inclusive; see 'SDL_EventType' for details.
+  -> IO BG.CBool
+sDL_HasEvents = hs_bindgen_313622652a8473b1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_FlushEvent@
+foreign import ccall safe "hs_bindgen_2d03a2b249bf7669"
+  hs_bindgen_2d03a2b249bf7669_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_FlushEvent@
+hs_bindgen_2d03a2b249bf7669
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_2d03a2b249bf7669 =
+  BG.fromFFIType hs_bindgen_2d03a2b249bf7669_base
+
+-- | Clear events of a specific type from the event queue.
+--
+--     This will unconditionally remove any events from the queue that match @type@. If you need to remove a range of event types, use @SDL_FlushEvents()@ instead.
+--
+--     It\'s also normal to just ignore events you don\'t care about in your event loop without calling this function.
+--
+--     This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call @SDL_PumpEvents()@ on the main thread immediately before the flush call.
+--
+--     If you have user events with custom data that needs to be freed, you should use @SDL_PeepEvents()@ to remove and clean up those events before calling this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FlushEvents'
+--
+--     [C declaration]: @SDL_FlushEvent@, defined at @SDL3\/SDL_events.h 1226:34@
+sDL_FlushEvent
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@type@]: the type of event to be cleared; see 'SDL_EventType' for details.
+  -> IO ()
+sDL_FlushEvent = hs_bindgen_2d03a2b249bf7669
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_FlushEvents@
+foreign import ccall safe "hs_bindgen_445ea0272a2d7d08"
+  hs_bindgen_445ea0272a2d7d08_base
+    :: BG.Word32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_FlushEvents@
+hs_bindgen_445ea0272a2d7d08
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_445ea0272a2d7d08 =
+  BG.fromFFIType hs_bindgen_445ea0272a2d7d08_base
+
+-- | Clear events of a range of types from the event queue.
+--
+--     This will unconditionally remove any events from the queue that are in the range of @minType@ to @maxType@, inclusive. If you need to remove a single event type, use @SDL_FlushEvent()@ instead.
+--
+--     It\'s also normal to just ignore events you don\'t care about in your event loop without calling this function.
+--
+--     This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call @SDL_PumpEvents()@ on the main thread immediately before the flush call.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FlushEvent'
+--
+--     [C declaration]: @SDL_FlushEvents@, defined at @SDL3\/SDL_events.h 1253:34@
+sDL_FlushEvents
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@minType@]: the low end of event type to be cleared, inclusive; see 'SDL_EventType' for details.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@maxType@]: the high end of event type to be cleared, inclusive; see 'SDL_EventType' for details.
+  -> IO ()
+sDL_FlushEvents = hs_bindgen_445ea0272a2d7d08
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_PollEvent@
+foreign import ccall safe "hs_bindgen_ceef91a4b9f5e02b"
+  hs_bindgen_ceef91a4b9f5e02b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_PollEvent@
+hs_bindgen_ceef91a4b9f5e02b
+  :: BG.Ptr SDL_Event
+  -> IO BG.CBool
+hs_bindgen_ceef91a4b9f5e02b =
+  BG.fromFFIType hs_bindgen_ceef91a4b9f5e02b_base
+
+-- | Poll for currently pending events.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     If @event@ is NULL, it simply returns true if there is an event in the queue, but will not remove it from the queue.
+--
+--     As this function may implicitly call @SDL_PumpEvents()@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     @SDL_PollEvent()@ is the favored way of receiving system events since it can be done from the main loop and does not suspend the main loop while waiting on an event to be posted.
+--
+--     The common practice is to fully process the event queue once every frame, usually as a first step before updating the game\'s state:
+--
+--     @
+--     while (game_is_still_running) {
+--         SDL_Event event;
+--         while (SDL_PollEvent(&event)) {  \/\/ poll until all events are handled!
+--             \/\/ decide what to do with this event.
+--         }
+--
+--         \/\/ update game state, draw the current frame
+--     }
+--     @
+--
+--     Note that Windows (and possibly other platforms) has a quirk about how it handles events while dragging\/resizing a window, which can cause this function to block for significant amounts of time. Technical explanations and solutions are discussed on the wiki:
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/AppFreezeDuringDrag](https://wiki.libsdl.org/SDL3/AppFreezeDuringDrag)
+--
+--     [Returns]: true if this got an event or false if there are none available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PushEvent', 'sDL_WaitEvent', 'sDL_WaitEventTimeout'
+--
+--     [C declaration]: @SDL_PollEvent@, defined at @SDL3\/SDL_events.h 1304:34@
+sDL_PollEvent
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled with the next event from the queue, or NULL.
+  -> IO BG.CBool
+sDL_PollEvent = hs_bindgen_ceef91a4b9f5e02b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_WaitEvent@
+foreign import ccall safe "hs_bindgen_23e78ed0fb51a6da"
+  hs_bindgen_23e78ed0fb51a6da_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_WaitEvent@
+hs_bindgen_23e78ed0fb51a6da
+  :: BG.Ptr SDL_Event
+  -> IO BG.CBool
+hs_bindgen_23e78ed0fb51a6da =
+  BG.fromFFIType hs_bindgen_23e78ed0fb51a6da_base
+
+-- | Wait indefinitely for the next available event.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     As this function may implicitly call @SDL_PumpEvents()@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     [Returns]: true on success or false if there was an error while waiting for events; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_PushEvent', 'sDL_WaitEventTimeout'
+--
+--     [C declaration]: @SDL_WaitEvent@, defined at @SDL3\/SDL_events.h 1328:34@
+sDL_WaitEvent
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled in with the next event from the queue, or NULL.
+  -> IO BG.CBool
+sDL_WaitEvent = hs_bindgen_23e78ed0fb51a6da
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_WaitEventTimeout@
+foreign import ccall safe "hs_bindgen_556eff19f5f71f6a"
+  hs_bindgen_556eff19f5f71f6a_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_WaitEventTimeout@
+hs_bindgen_556eff19f5f71f6a
+  :: BG.Ptr SDL_Event
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_556eff19f5f71f6a =
+  BG.fromFFIType hs_bindgen_556eff19f5f71f6a_base
+
+-- | Wait until the specified timeout (in milliseconds) for the next available event.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     As this function may implicitly call @SDL_PumpEvents()@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     The timeout is not guaranteed, the actual wait time could be longer due to system scheduling.
+--
+--     [Returns]: true if this got an event or false if the timeout elapsed without any events available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_PushEvent', 'sDL_WaitEvent'
+--
+--     [C declaration]: @SDL_WaitEventTimeout@, defined at @SDL3\/SDL_events.h 1358:34@
+sDL_WaitEventTimeout
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled in with the next event from the queue, or NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum number of milliseconds to wait for the next available event.
+  -> IO BG.CBool
+sDL_WaitEventTimeout = hs_bindgen_556eff19f5f71f6a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_PushEvent@
+foreign import ccall safe "hs_bindgen_b43b72b75f8fc0a4"
+  hs_bindgen_b43b72b75f8fc0a4_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_PushEvent@
+hs_bindgen_b43b72b75f8fc0a4
+  :: BG.Ptr SDL_Event
+  -> IO BG.CBool
+hs_bindgen_b43b72b75f8fc0a4 =
+  BG.fromFFIType hs_bindgen_b43b72b75f8fc0a4_base
+
+-- | Add an event to the event queue.
+--
+--     The event queue can actually be used as a two way communication channel. Not only can events be read from the queue, but the user can also push their own events onto it. @event@ is a pointer to the event structure you wish to push onto the queue. The event is copied into the queue, and the caller may dispose of the memory pointed to after @SDL_PushEvent()@ returns.
+--
+--     Note: Pushing device input events onto the queue doesn\'t modify the state of the device within SDL.
+--
+--     Note: Events pushed onto the queue with @SDL_PushEvent()@ get passed through the event filter but events added with @SDL_PeepEvents()@ do not.
+--
+--     For pushing application-specific events, please use @SDL_RegisterEvents()@ to get an event type that does not conflict with other code that also wants its own custom event types.
+--
+--     [Returns]: true on success, false if the event was filtered or on failure; call SDL_GetError() for more information. A common reason for error is the event queue being full.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PeepEvents', 'sDL_PollEvent', 'sDL_RegisterEvents'
+--
+--     [C declaration]: @SDL_PushEvent@, defined at @SDL3\/SDL_events.h 1392:34@
+sDL_PushEvent
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' to be added to the queue.
+  -> IO BG.CBool
+sDL_PushEvent = hs_bindgen_b43b72b75f8fc0a4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_SetEventFilter@
+foreign import ccall safe "hs_bindgen_2af28699d7398805"
+  hs_bindgen_2af28699d7398805_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_SetEventFilter@
+hs_bindgen_2af28699d7398805
+  :: SDL_EventFilter
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_2af28699d7398805 =
+  BG.fromFFIType hs_bindgen_2af28699d7398805_base
+
+-- | Set up a filter to process all events before they are added to the internal event queue.
+--
+--     If you just want to see events without modifying them or preventing them from being queued, you should use @SDL_AddEventWatch()@ instead.
+--
+--     If the filter function returns true when called, then the event will be added to the internal queue. If it returns false, then the event will be dropped from the queue, but the internal state will still be updated. This allows selective filtering of dynamically arriving events.
+--
+--     __WARNING__: Be very careful of what you do in the event filter function, as it may run in a different thread! The exception is handling of SDL_EVENT_WINDOW_EXPOSED, which is guaranteed to be sent from the OS on the main thread and you are expected to redraw your window in response to this event.
+--
+--     On platforms that support it, if the quit event is generated by an interrupt signal (e.g. pressing Ctrl-C), it will be delivered to the application at the next event poll.
+--
+--     Note: Disabled events never make it to the event filter function; see @SDL_SetEventEnabled()@.
+--
+--     Note: Events pushed onto the queue with @SDL_PushEvent()@ get passed through the event filter, but events pushed onto the queue with @SDL_PeepEvents()@ do not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddEventWatch', 'sDL_SetEventEnabled', 'sDL_GetEventFilter', 'sDL_PeepEvents', 'sDL_PushEvent'
+--
+--     [C declaration]: @SDL_SetEventFilter@, defined at @SDL3\/SDL_events.h 1457:34@
+sDL_SetEventFilter
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: a function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO ()
+sDL_SetEventFilter = hs_bindgen_2af28699d7398805
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_GetEventFilter@
+foreign import ccall safe "hs_bindgen_be8f273c9471fe63"
+  hs_bindgen_be8f273c9471fe63_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_GetEventFilter@
+hs_bindgen_be8f273c9471fe63
+  :: BG.Ptr SDL_EventFilter
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -> IO BG.CBool
+hs_bindgen_be8f273c9471fe63 =
+  BG.fromFFIType hs_bindgen_be8f273c9471fe63_base
+
+-- | Query the current event filter.
+--
+--     This function can be used to \"chain\" filters, by saving the existing filter before replacing it with a function that will call that saved filter.
+--
+--     [Returns]: true on success or false if there is no event filter set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetEventFilter'
+--
+--     [C declaration]: @SDL_GetEventFilter@, defined at @SDL3\/SDL_events.h 1476:34@
+sDL_GetEventFilter
+  :: BG.Ptr SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the current callback function will be stored here.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@userdata@]: the pointer that is passed to the current event filter will be stored here.
+  -> IO BG.CBool
+sDL_GetEventFilter = hs_bindgen_be8f273c9471fe63
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_AddEventWatch@
+foreign import ccall safe "hs_bindgen_1032b9b1e1b3559e"
+  hs_bindgen_1032b9b1e1b3559e_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_AddEventWatch@
+hs_bindgen_1032b9b1e1b3559e
+  :: SDL_EventFilter
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_1032b9b1e1b3559e =
+  BG.fromFFIType hs_bindgen_1032b9b1e1b3559e_base
+
+-- | Add a callback to be triggered when an event is added to the event queue.
+--
+--     @filter@ will be called when an event happens, and its return value is ignored.
+--
+--     __WARNING__: Be very careful of what you do in the event filter function, as it may run in a different thread!
+--
+--     If the quit event is generated by a signal (e.g. SIGINT), it will bypass the internal queue and be delivered to the watch callback immediately, and arrive at the next event poll.
+--
+--     Note: the callback is called for events posted by the user through @SDL_PushEvent()@, but not for disabled events, nor for events by a filter callback set with @SDL_SetEventFilter()@, nor for events posted by the user through @SDL_PeepEvents()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveEventWatch', 'sDL_SetEventFilter'
+--
+--     [C declaration]: @SDL_AddEventWatch@, defined at @SDL3\/SDL_events.h 1508:34@
+sDL_AddEventWatch
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: an 'SDL_EventFilter' function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO BG.CBool
+sDL_AddEventWatch = hs_bindgen_1032b9b1e1b3559e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_RemoveEventWatch@
+foreign import ccall safe "hs_bindgen_3dfeb3d0c0d67825"
+  hs_bindgen_3dfeb3d0c0d67825_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_RemoveEventWatch@
+hs_bindgen_3dfeb3d0c0d67825
+  :: SDL_EventFilter
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_3dfeb3d0c0d67825 =
+  BG.fromFFIType hs_bindgen_3dfeb3d0c0d67825_base
+
+-- | Remove an event watch callback added with @SDL_AddEventWatch()@.
+--
+--     This function takes the same input as @SDL_AddEventWatch()@ to identify and delete the corresponding callback.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddEventWatch'
+--
+--     [C declaration]: @SDL_RemoveEventWatch@, defined at @SDL3\/SDL_events.h 1525:34@
+sDL_RemoveEventWatch
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the function originally passed to @SDL_AddEventWatch()@.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer originally passed to @SDL_AddEventWatch()@.
+  -> IO ()
+sDL_RemoveEventWatch = hs_bindgen_3dfeb3d0c0d67825
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_FilterEvents@
+foreign import ccall safe "hs_bindgen_6c8e2afc32ccc02a"
+  hs_bindgen_6c8e2afc32ccc02a_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_FilterEvents@
+hs_bindgen_6c8e2afc32ccc02a
+  :: SDL_EventFilter
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_6c8e2afc32ccc02a =
+  BG.fromFFIType hs_bindgen_6c8e2afc32ccc02a_base
+
+-- | Run a specific filter function on the current event queue, removing any events for which the filter returns false.
+--
+--     See @SDL_SetEventFilter()@ for more information. Unlike @SDL_SetEventFilter()@, this function does not change the filter permanently, it only uses the supplied filter until this function returns.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEventFilter', 'sDL_SetEventFilter'
+--
+--     [C declaration]: @SDL_FilterEvents@, defined at @SDL3\/SDL_events.h 1545:34@
+sDL_FilterEvents
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the 'SDL_EventFilter' function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO ()
+sDL_FilterEvents = hs_bindgen_6c8e2afc32ccc02a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_SetEventEnabled@
+foreign import ccall safe "hs_bindgen_980b7ed1ad20c98e"
+  hs_bindgen_980b7ed1ad20c98e_base
+    :: BG.Word32
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_SetEventEnabled@
+hs_bindgen_980b7ed1ad20c98e
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_980b7ed1ad20c98e =
+  BG.fromFFIType hs_bindgen_980b7ed1ad20c98e_base
+
+-- | Set the state of processing events by type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EventEnabled'
+--
+--     [C declaration]: @SDL_SetEventEnabled@, defined at @SDL3\/SDL_events.h 1559:34@
+sDL_SetEventEnabled
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@type@]: the type of event; see 'SDL_EventType' for details.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: whether to process the event or not.
+  -> IO ()
+sDL_SetEventEnabled = hs_bindgen_980b7ed1ad20c98e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_EventEnabled@
+foreign import ccall safe "hs_bindgen_581f5ed4b389f9ad"
+  hs_bindgen_581f5ed4b389f9ad_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_EventEnabled@
+hs_bindgen_581f5ed4b389f9ad
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_581f5ed4b389f9ad =
+  BG.fromFFIType hs_bindgen_581f5ed4b389f9ad_base
+
+-- | Query the state of processing events by type.
+--
+--     [Returns]: true if the event is being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetEventEnabled'
+--
+--     [C declaration]: @SDL_EventEnabled@, defined at @SDL3\/SDL_events.h 1573:34@
+sDL_EventEnabled
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@type@]: the type of event; see 'SDL_EventType' for details.
+  -> IO BG.CBool
+sDL_EventEnabled = hs_bindgen_581f5ed4b389f9ad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_RegisterEvents@
+foreign import ccall safe "hs_bindgen_68df500d3720ae65"
+  hs_bindgen_68df500d3720ae65_base
+    :: BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_RegisterEvents@
+hs_bindgen_68df500d3720ae65
+  :: BG.CInt
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_68df500d3720ae65 =
+  BG.fromFFIType hs_bindgen_68df500d3720ae65_base
+
+-- | Allocate a set of user-defined events, and return the beginning event number for that set of events.
+--
+--     [Returns]: the beginning event number, or 0 if numevents is invalid or if there are not enough user-defined events left.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PushEvent'
+--
+--     [C declaration]: @SDL_RegisterEvents@, defined at @SDL3\/SDL_events.h 1589:36@
+sDL_RegisterEvents
+  :: BG.CInt
+  -- ^
+  --
+  --           [@numevents@]: the number of events to be allocated.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_RegisterEvents = hs_bindgen_68df500d3720ae65
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_GetWindowFromEvent@
+foreign import ccall safe "hs_bindgen_bf32d25772bf7533"
+  hs_bindgen_bf32d25772bf7533_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_GetWindowFromEvent@
+hs_bindgen_bf32d25772bf7533
+  :: PtrConst.PtrConst SDL_Event
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+hs_bindgen_bf32d25772bf7533 =
+  BG.fromFFIType hs_bindgen_bf32d25772bf7533_base
+
+-- | Get window associated with an event.
+--
+--     [Returns]: the associated window on success or NULL if there is none.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_WaitEvent', 'sDL_WaitEventTimeout'
+--
+--     [C declaration]: @SDL_GetWindowFromEvent@, defined at @SDL3\/SDL_events.h 1605:42@
+sDL_GetWindowFromEvent
+  :: PtrConst.PtrConst SDL_Event
+  -- ^
+  --
+  --           [@event@]: an event containing a @windowID@.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+sDL_GetWindowFromEvent = hs_bindgen_bf32d25772bf7533
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_GetEventDescription@
+foreign import ccall safe "hs_bindgen_791dc84efb7c9255"
+  hs_bindgen_791dc84efb7c9255_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Safe_SDL_GetEventDescription@
+hs_bindgen_791dc84efb7c9255
+  :: PtrConst.PtrConst SDL_Event
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_791dc84efb7c9255 =
+  BG.fromFFIType hs_bindgen_791dc84efb7c9255_base
+
+-- | Generate an English description of an event.
+--
+--     This will fill @buf@ with a null-terminated string that might look something like this:
+--
+--     @
+--     SDL_EVENT_MOUSE_MOTION (timestamp=1140256324 windowid=2 which=0 state=0 x=492.99 y=139.09 xrel=52 yrel=6)
+--     @
+--
+--     The exact format of the string is not guaranteed; it is intended for logging purposes, to be read by a human, and not parsed by a computer.
+--
+--     The returned value follows the same rules as SDL_snprintf(): @buf@ will always be NULL-terminated (unless @buflen@ is zero), and will be truncated if @buflen@ is too small. The return code is the number of bytes needed for the complete string, not counting the NULL-terminator, whether the string was truncated or not. Unlike SDL_snprintf(), though, this function never returns -1.
+--
+--     [Returns]: number of bytes needed for the full string, not counting the null-terminator byte.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetEventDescription@, defined at @SDL3\/SDL_events.h 1637:33@
+sDL_GetEventDescription
+  :: PtrConst.PtrConst SDL_Event
+  -- ^
+  --
+  --           [@event@]: an event to describe. May be NULL.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@buf@]: the buffer to fill with the description string. May be NULL.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@buflen@]: the maximum bytes that can be written to @buf@.
+  -> IO BG.CInt
+sDL_GetEventDescription = hs_bindgen_791dc84efb7c9255
diff --git a/src/SDL3/Sys/Bindgen/Events/Unsafe.hs b/src/SDL3/Sys/Bindgen/Events/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Events/Unsafe.hs
@@ -0,0 +1,997 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Events.Unsafe (
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_PumpEvents,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_PeepEvents,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_HasEvent,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_HasEvents,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_FlushEvent,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_FlushEvents,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_PollEvent,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_WaitEvent,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_WaitEventTimeout,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_PushEvent,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_SetEventFilter,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_GetEventFilter,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_AddEventWatch,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_RemoveEventWatch,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_FilterEvents,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_SetEventEnabled,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_EventEnabled,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_RegisterEvents,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_GetWindowFromEvent,
+  SDL3.Sys.Bindgen.Events.Unsafe.sDL_GetEventDescription,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Events
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_events.h>"
+         , "void hs_bindgen_f4dc61bd10a4e23c (void)"
+         , "{"
+         , "  (SDL_PumpEvents)();"
+         , "}"
+         , "signed int hs_bindgen_8b3ec00d9b882e6d ("
+         , "  SDL_Event *arg1,"
+         , "  signed int arg2,"
+         , "  SDL_EventAction arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_PeepEvents)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_96f81eae40ffdcd6 ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_HasEvent)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_1f3c013ef4ec1fa8 ("
+         , "  Uint32 arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_HasEvents)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_fd83204a82d42e64 ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  (SDL_FlushEvent)(arg1);"
+         , "}"
+         , "void hs_bindgen_40cd8ce8fa388aa3 ("
+         , "  Uint32 arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  (SDL_FlushEvents)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_74af0be08528ef8b ("
+         , "  SDL_Event *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_PollEvent)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_26650dda1162c384 ("
+         , "  SDL_Event *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitEvent)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8361c3f62bddca27 ("
+         , "  SDL_Event *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitEventTimeout)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a3e2f1b85c30cc66 ("
+         , "  SDL_Event *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_PushEvent)(arg1);"
+         , "}"
+         , "void hs_bindgen_0f7b893d64f3610c ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetEventFilter)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_610e4665d1826427 ("
+         , "  SDL_EventFilter *arg1,"
+         , "  void **arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetEventFilter)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_33f96eba42fcb36e ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AddEventWatch)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_7be0009aedee08c7 ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_RemoveEventWatch)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_388ecd1fb86ecfc7 ("
+         , "  SDL_EventFilter arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_FilterEvents)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_1e0e42e966f91945 ("
+         , "  Uint32 arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetEventEnabled)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_448bb1465977146b ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_EventEnabled)(arg1);"
+         , "}"
+         , "Uint32 hs_bindgen_f5d1c83cd76363fe ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RegisterEvents)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_ad9a414b46378fd2 ("
+         , "  SDL_Event const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowFromEvent)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "signed int hs_bindgen_ff6611a2bb261892 ("
+         , "  SDL_Event const *arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetEventDescription)(arg1, arg2, arg3);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; SDL_SetError(\"SDL_GetEventDescription requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_PumpEvents@
+foreign import ccall unsafe "hs_bindgen_f4dc61bd10a4e23c"
+  hs_bindgen_f4dc61bd10a4e23c_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_PumpEvents@
+hs_bindgen_f4dc61bd10a4e23c :: IO ()
+hs_bindgen_f4dc61bd10a4e23c =
+  BG.fromFFIType hs_bindgen_f4dc61bd10a4e23c_base
+
+-- | Pump the event loop, gathering events from the input devices.
+--
+--     This function updates the event queue and internal input device state.
+--
+--     @SDL_PumpEvents()@ gathers all the pending input information from devices and places it in the event queue. Without calls to @SDL_PumpEvents()@ no events would ever be placed on the queue. Often the need for calls to @SDL_PumpEvents()@ is hidden from the user since @SDL_PollEvent()@ and @SDL_WaitEvent()@ implicitly call @SDL_PumpEvents()@. However, if you are not polling or waiting for events (e.g. you are filtering them), then you must call @SDL_PumpEvents()@ to force an event queue update.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_WaitEvent'
+--
+--     [C declaration]: @SDL_PumpEvents@, defined at @SDL3\/SDL_events.h 1100:34@
+sDL_PumpEvents :: IO ()
+sDL_PumpEvents = hs_bindgen_f4dc61bd10a4e23c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_PeepEvents@
+foreign import ccall unsafe "hs_bindgen_8b3ec00d9b882e6d"
+  hs_bindgen_8b3ec00d9b882e6d_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_PeepEvents@
+hs_bindgen_8b3ec00d9b882e6d
+  :: BG.Ptr SDL_Event
+  -> BG.CInt
+  -> SDL_EventAction
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CInt
+hs_bindgen_8b3ec00d9b882e6d =
+  BG.fromFFIType hs_bindgen_8b3ec00d9b882e6d_base
+
+-- | Check the event queue for messages and optionally return them.
+--
+--     @action@ may be any of the following:
+--
+--     * @SDL_ADDEVENT@: up to @numevents@ events will be added to the back of the event queue.
+--
+--     * @SDL_PEEKEVENT@: @numevents@ events at the front of the event queue, within the specified minimum and maximum type, will be returned to the caller and will /not/ be removed from the queue. If you pass NULL for @events@, then @numevents@ is ignored and the total number of matching events will be returned.
+--
+--     * @SDL_GETEVENT@: up to @numevents@ events at the front of the event queue, within the specified minimum and maximum type, will be returned to the caller and will be removed from the queue.
+--
+--     You may have to call @SDL_PumpEvents()@ before calling this function. Otherwise, the events may not be ready to be filtered when you call @SDL_PeepEvents()@.
+--
+--     [Returns]: the number of events actually stored or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_PumpEvents', 'sDL_PushEvent'
+--
+--     [C declaration]: @SDL_PeepEvents@, defined at @SDL3\/SDL_events.h 1158:33@
+sDL_PeepEvents
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@events@]: destination buffer for the retrieved events, may be NULL to leave the events in the queue and return the number of events that would have been stored.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@numevents@]: if action is SDL_ADDEVENT, the number of events to add back to the event queue; if action is SDL_PEEKEVENT or SDL_GETEVENT, the maximum number of events to retrieve.
+  -> SDL_EventAction
+  -- ^
+  --
+  --           [@action@]: action to take; see Remarks for details.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@minType@]: minimum value of the event type to be considered; SDL_EVENT_FIRST is a safe choice.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@maxType@]: maximum value of the event type to be considered; SDL_EVENT_LAST is a safe choice.
+  -> IO BG.CInt
+sDL_PeepEvents = hs_bindgen_8b3ec00d9b882e6d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_HasEvent@
+foreign import ccall unsafe "hs_bindgen_96f81eae40ffdcd6"
+  hs_bindgen_96f81eae40ffdcd6_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_HasEvent@
+hs_bindgen_96f81eae40ffdcd6
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_96f81eae40ffdcd6 =
+  BG.fromFFIType hs_bindgen_96f81eae40ffdcd6_base
+
+-- | Check for the existence of a certain event type in the event queue.
+--
+--     If you need to check for a range of event types, use @SDL_HasEvents()@ instead.
+--
+--     [Returns]: true if events matching @type@ are present, or false if events matching @type@ are not present.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasEvents'
+--
+--     [C declaration]: @SDL_HasEvent@, defined at @SDL3\/SDL_events.h 1177:34@
+sDL_HasEvent
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@type@]: the type of event to be queried; see 'SDL_EventType' for details.
+  -> IO BG.CBool
+sDL_HasEvent = hs_bindgen_96f81eae40ffdcd6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_HasEvents@
+foreign import ccall unsafe "hs_bindgen_1f3c013ef4ec1fa8"
+  hs_bindgen_1f3c013ef4ec1fa8_base
+    :: BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_HasEvents@
+hs_bindgen_1f3c013ef4ec1fa8
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_1f3c013ef4ec1fa8 =
+  BG.fromFFIType hs_bindgen_1f3c013ef4ec1fa8_base
+
+-- | Check for the existence of certain event types in the event queue.
+--
+--     If you need to check for a single event type, use @SDL_HasEvent()@ instead.
+--
+--     [Returns]: true if events with type >= @minType@ and \<= @maxType@ are present, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasEvents'
+--
+--     [C declaration]: @SDL_HasEvents@, defined at @SDL3\/SDL_events.h 1198:34@
+sDL_HasEvents
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@minType@]: the low end of event type to be queried, inclusive; see 'SDL_EventType' for details.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@maxType@]: the high end of event type to be queried, inclusive; see 'SDL_EventType' for details.
+  -> IO BG.CBool
+sDL_HasEvents = hs_bindgen_1f3c013ef4ec1fa8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_FlushEvent@
+foreign import ccall unsafe "hs_bindgen_fd83204a82d42e64"
+  hs_bindgen_fd83204a82d42e64_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_FlushEvent@
+hs_bindgen_fd83204a82d42e64
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_fd83204a82d42e64 =
+  BG.fromFFIType hs_bindgen_fd83204a82d42e64_base
+
+-- | Clear events of a specific type from the event queue.
+--
+--     This will unconditionally remove any events from the queue that match @type@. If you need to remove a range of event types, use @SDL_FlushEvents()@ instead.
+--
+--     It\'s also normal to just ignore events you don\'t care about in your event loop without calling this function.
+--
+--     This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call @SDL_PumpEvents()@ on the main thread immediately before the flush call.
+--
+--     If you have user events with custom data that needs to be freed, you should use @SDL_PeepEvents()@ to remove and clean up those events before calling this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FlushEvents'
+--
+--     [C declaration]: @SDL_FlushEvent@, defined at @SDL3\/SDL_events.h 1226:34@
+sDL_FlushEvent
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@type@]: the type of event to be cleared; see 'SDL_EventType' for details.
+  -> IO ()
+sDL_FlushEvent = hs_bindgen_fd83204a82d42e64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_FlushEvents@
+foreign import ccall unsafe "hs_bindgen_40cd8ce8fa388aa3"
+  hs_bindgen_40cd8ce8fa388aa3_base
+    :: BG.Word32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_FlushEvents@
+hs_bindgen_40cd8ce8fa388aa3
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_40cd8ce8fa388aa3 =
+  BG.fromFFIType hs_bindgen_40cd8ce8fa388aa3_base
+
+-- | Clear events of a range of types from the event queue.
+--
+--     This will unconditionally remove any events from the queue that are in the range of @minType@ to @maxType@, inclusive. If you need to remove a single event type, use @SDL_FlushEvent()@ instead.
+--
+--     It\'s also normal to just ignore events you don\'t care about in your event loop without calling this function.
+--
+--     This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call @SDL_PumpEvents()@ on the main thread immediately before the flush call.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FlushEvent'
+--
+--     [C declaration]: @SDL_FlushEvents@, defined at @SDL3\/SDL_events.h 1253:34@
+sDL_FlushEvents
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@minType@]: the low end of event type to be cleared, inclusive; see 'SDL_EventType' for details.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@maxType@]: the high end of event type to be cleared, inclusive; see 'SDL_EventType' for details.
+  -> IO ()
+sDL_FlushEvents = hs_bindgen_40cd8ce8fa388aa3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_PollEvent@
+foreign import ccall unsafe "hs_bindgen_74af0be08528ef8b"
+  hs_bindgen_74af0be08528ef8b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_PollEvent@
+hs_bindgen_74af0be08528ef8b
+  :: BG.Ptr SDL_Event
+  -> IO BG.CBool
+hs_bindgen_74af0be08528ef8b =
+  BG.fromFFIType hs_bindgen_74af0be08528ef8b_base
+
+-- | Poll for currently pending events.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     If @event@ is NULL, it simply returns true if there is an event in the queue, but will not remove it from the queue.
+--
+--     As this function may implicitly call @SDL_PumpEvents()@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     @SDL_PollEvent()@ is the favored way of receiving system events since it can be done from the main loop and does not suspend the main loop while waiting on an event to be posted.
+--
+--     The common practice is to fully process the event queue once every frame, usually as a first step before updating the game\'s state:
+--
+--     @
+--     while (game_is_still_running) {
+--         SDL_Event event;
+--         while (SDL_PollEvent(&event)) {  \/\/ poll until all events are handled!
+--             \/\/ decide what to do with this event.
+--         }
+--
+--         \/\/ update game state, draw the current frame
+--     }
+--     @
+--
+--     Note that Windows (and possibly other platforms) has a quirk about how it handles events while dragging\/resizing a window, which can cause this function to block for significant amounts of time. Technical explanations and solutions are discussed on the wiki:
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/AppFreezeDuringDrag](https://wiki.libsdl.org/SDL3/AppFreezeDuringDrag)
+--
+--     [Returns]: true if this got an event or false if there are none available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PushEvent', 'sDL_WaitEvent', 'sDL_WaitEventTimeout'
+--
+--     [C declaration]: @SDL_PollEvent@, defined at @SDL3\/SDL_events.h 1304:34@
+sDL_PollEvent
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled with the next event from the queue, or NULL.
+  -> IO BG.CBool
+sDL_PollEvent = hs_bindgen_74af0be08528ef8b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_WaitEvent@
+foreign import ccall unsafe "hs_bindgen_26650dda1162c384"
+  hs_bindgen_26650dda1162c384_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_WaitEvent@
+hs_bindgen_26650dda1162c384
+  :: BG.Ptr SDL_Event
+  -> IO BG.CBool
+hs_bindgen_26650dda1162c384 =
+  BG.fromFFIType hs_bindgen_26650dda1162c384_base
+
+-- | Wait indefinitely for the next available event.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     As this function may implicitly call @SDL_PumpEvents()@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     [Returns]: true on success or false if there was an error while waiting for events; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_PushEvent', 'sDL_WaitEventTimeout'
+--
+--     [C declaration]: @SDL_WaitEvent@, defined at @SDL3\/SDL_events.h 1328:34@
+sDL_WaitEvent
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled in with the next event from the queue, or NULL.
+  -> IO BG.CBool
+sDL_WaitEvent = hs_bindgen_26650dda1162c384
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_WaitEventTimeout@
+foreign import ccall unsafe "hs_bindgen_8361c3f62bddca27"
+  hs_bindgen_8361c3f62bddca27_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_WaitEventTimeout@
+hs_bindgen_8361c3f62bddca27
+  :: BG.Ptr SDL_Event
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_8361c3f62bddca27 =
+  BG.fromFFIType hs_bindgen_8361c3f62bddca27_base
+
+-- | Wait until the specified timeout (in milliseconds) for the next available event.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     As this function may implicitly call @SDL_PumpEvents()@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     The timeout is not guaranteed, the actual wait time could be longer due to system scheduling.
+--
+--     [Returns]: true if this got an event or false if the timeout elapsed without any events available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_PushEvent', 'sDL_WaitEvent'
+--
+--     [C declaration]: @SDL_WaitEventTimeout@, defined at @SDL3\/SDL_events.h 1358:34@
+sDL_WaitEventTimeout
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled in with the next event from the queue, or NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum number of milliseconds to wait for the next available event.
+  -> IO BG.CBool
+sDL_WaitEventTimeout = hs_bindgen_8361c3f62bddca27
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_PushEvent@
+foreign import ccall unsafe "hs_bindgen_a3e2f1b85c30cc66"
+  hs_bindgen_a3e2f1b85c30cc66_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_PushEvent@
+hs_bindgen_a3e2f1b85c30cc66
+  :: BG.Ptr SDL_Event
+  -> IO BG.CBool
+hs_bindgen_a3e2f1b85c30cc66 =
+  BG.fromFFIType hs_bindgen_a3e2f1b85c30cc66_base
+
+-- | Add an event to the event queue.
+--
+--     The event queue can actually be used as a two way communication channel. Not only can events be read from the queue, but the user can also push their own events onto it. @event@ is a pointer to the event structure you wish to push onto the queue. The event is copied into the queue, and the caller may dispose of the memory pointed to after @SDL_PushEvent()@ returns.
+--
+--     Note: Pushing device input events onto the queue doesn\'t modify the state of the device within SDL.
+--
+--     Note: Events pushed onto the queue with @SDL_PushEvent()@ get passed through the event filter but events added with @SDL_PeepEvents()@ do not.
+--
+--     For pushing application-specific events, please use @SDL_RegisterEvents()@ to get an event type that does not conflict with other code that also wants its own custom event types.
+--
+--     [Returns]: true on success, false if the event was filtered or on failure; call SDL_GetError() for more information. A common reason for error is the event queue being full.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PeepEvents', 'sDL_PollEvent', 'sDL_RegisterEvents'
+--
+--     [C declaration]: @SDL_PushEvent@, defined at @SDL3\/SDL_events.h 1392:34@
+sDL_PushEvent
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' to be added to the queue.
+  -> IO BG.CBool
+sDL_PushEvent = hs_bindgen_a3e2f1b85c30cc66
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_SetEventFilter@
+foreign import ccall unsafe "hs_bindgen_0f7b893d64f3610c"
+  hs_bindgen_0f7b893d64f3610c_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_SetEventFilter@
+hs_bindgen_0f7b893d64f3610c
+  :: SDL_EventFilter
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_0f7b893d64f3610c =
+  BG.fromFFIType hs_bindgen_0f7b893d64f3610c_base
+
+-- | Set up a filter to process all events before they are added to the internal event queue.
+--
+--     If you just want to see events without modifying them or preventing them from being queued, you should use @SDL_AddEventWatch()@ instead.
+--
+--     If the filter function returns true when called, then the event will be added to the internal queue. If it returns false, then the event will be dropped from the queue, but the internal state will still be updated. This allows selective filtering of dynamically arriving events.
+--
+--     __WARNING__: Be very careful of what you do in the event filter function, as it may run in a different thread! The exception is handling of SDL_EVENT_WINDOW_EXPOSED, which is guaranteed to be sent from the OS on the main thread and you are expected to redraw your window in response to this event.
+--
+--     On platforms that support it, if the quit event is generated by an interrupt signal (e.g. pressing Ctrl-C), it will be delivered to the application at the next event poll.
+--
+--     Note: Disabled events never make it to the event filter function; see @SDL_SetEventEnabled()@.
+--
+--     Note: Events pushed onto the queue with @SDL_PushEvent()@ get passed through the event filter, but events pushed onto the queue with @SDL_PeepEvents()@ do not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddEventWatch', 'sDL_SetEventEnabled', 'sDL_GetEventFilter', 'sDL_PeepEvents', 'sDL_PushEvent'
+--
+--     [C declaration]: @SDL_SetEventFilter@, defined at @SDL3\/SDL_events.h 1457:34@
+sDL_SetEventFilter
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: a function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO ()
+sDL_SetEventFilter = hs_bindgen_0f7b893d64f3610c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_GetEventFilter@
+foreign import ccall unsafe "hs_bindgen_610e4665d1826427"
+  hs_bindgen_610e4665d1826427_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_GetEventFilter@
+hs_bindgen_610e4665d1826427
+  :: BG.Ptr SDL_EventFilter
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -> IO BG.CBool
+hs_bindgen_610e4665d1826427 =
+  BG.fromFFIType hs_bindgen_610e4665d1826427_base
+
+-- | Query the current event filter.
+--
+--     This function can be used to \"chain\" filters, by saving the existing filter before replacing it with a function that will call that saved filter.
+--
+--     [Returns]: true on success or false if there is no event filter set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetEventFilter'
+--
+--     [C declaration]: @SDL_GetEventFilter@, defined at @SDL3\/SDL_events.h 1476:34@
+sDL_GetEventFilter
+  :: BG.Ptr SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the current callback function will be stored here.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@userdata@]: the pointer that is passed to the current event filter will be stored here.
+  -> IO BG.CBool
+sDL_GetEventFilter = hs_bindgen_610e4665d1826427
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_AddEventWatch@
+foreign import ccall unsafe "hs_bindgen_33f96eba42fcb36e"
+  hs_bindgen_33f96eba42fcb36e_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_AddEventWatch@
+hs_bindgen_33f96eba42fcb36e
+  :: SDL_EventFilter
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_33f96eba42fcb36e =
+  BG.fromFFIType hs_bindgen_33f96eba42fcb36e_base
+
+-- | Add a callback to be triggered when an event is added to the event queue.
+--
+--     @filter@ will be called when an event happens, and its return value is ignored.
+--
+--     __WARNING__: Be very careful of what you do in the event filter function, as it may run in a different thread!
+--
+--     If the quit event is generated by a signal (e.g. SIGINT), it will bypass the internal queue and be delivered to the watch callback immediately, and arrive at the next event poll.
+--
+--     Note: the callback is called for events posted by the user through @SDL_PushEvent()@, but not for disabled events, nor for events by a filter callback set with @SDL_SetEventFilter()@, nor for events posted by the user through @SDL_PeepEvents()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveEventWatch', 'sDL_SetEventFilter'
+--
+--     [C declaration]: @SDL_AddEventWatch@, defined at @SDL3\/SDL_events.h 1508:34@
+sDL_AddEventWatch
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: an 'SDL_EventFilter' function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO BG.CBool
+sDL_AddEventWatch = hs_bindgen_33f96eba42fcb36e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_RemoveEventWatch@
+foreign import ccall unsafe "hs_bindgen_7be0009aedee08c7"
+  hs_bindgen_7be0009aedee08c7_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_RemoveEventWatch@
+hs_bindgen_7be0009aedee08c7
+  :: SDL_EventFilter
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_7be0009aedee08c7 =
+  BG.fromFFIType hs_bindgen_7be0009aedee08c7_base
+
+-- | Remove an event watch callback added with @SDL_AddEventWatch()@.
+--
+--     This function takes the same input as @SDL_AddEventWatch()@ to identify and delete the corresponding callback.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddEventWatch'
+--
+--     [C declaration]: @SDL_RemoveEventWatch@, defined at @SDL3\/SDL_events.h 1525:34@
+sDL_RemoveEventWatch
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the function originally passed to @SDL_AddEventWatch()@.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer originally passed to @SDL_AddEventWatch()@.
+  -> IO ()
+sDL_RemoveEventWatch = hs_bindgen_7be0009aedee08c7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_FilterEvents@
+foreign import ccall unsafe "hs_bindgen_388ecd1fb86ecfc7"
+  hs_bindgen_388ecd1fb86ecfc7_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_FilterEvents@
+hs_bindgen_388ecd1fb86ecfc7
+  :: SDL_EventFilter
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_388ecd1fb86ecfc7 =
+  BG.fromFFIType hs_bindgen_388ecd1fb86ecfc7_base
+
+-- | Run a specific filter function on the current event queue, removing any events for which the filter returns false.
+--
+--     See @SDL_SetEventFilter()@ for more information. Unlike @SDL_SetEventFilter()@, this function does not change the filter permanently, it only uses the supplied filter until this function returns.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEventFilter', 'sDL_SetEventFilter'
+--
+--     [C declaration]: @SDL_FilterEvents@, defined at @SDL3\/SDL_events.h 1545:34@
+sDL_FilterEvents
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the 'SDL_EventFilter' function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO ()
+sDL_FilterEvents = hs_bindgen_388ecd1fb86ecfc7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_SetEventEnabled@
+foreign import ccall unsafe "hs_bindgen_1e0e42e966f91945"
+  hs_bindgen_1e0e42e966f91945_base
+    :: BG.Word32
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_SetEventEnabled@
+hs_bindgen_1e0e42e966f91945
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_1e0e42e966f91945 =
+  BG.fromFFIType hs_bindgen_1e0e42e966f91945_base
+
+-- | Set the state of processing events by type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EventEnabled'
+--
+--     [C declaration]: @SDL_SetEventEnabled@, defined at @SDL3\/SDL_events.h 1559:34@
+sDL_SetEventEnabled
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@type@]: the type of event; see 'SDL_EventType' for details.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: whether to process the event or not.
+  -> IO ()
+sDL_SetEventEnabled = hs_bindgen_1e0e42e966f91945
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_EventEnabled@
+foreign import ccall unsafe "hs_bindgen_448bb1465977146b"
+  hs_bindgen_448bb1465977146b_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_EventEnabled@
+hs_bindgen_448bb1465977146b
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_448bb1465977146b =
+  BG.fromFFIType hs_bindgen_448bb1465977146b_base
+
+-- | Query the state of processing events by type.
+--
+--     [Returns]: true if the event is being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetEventEnabled'
+--
+--     [C declaration]: @SDL_EventEnabled@, defined at @SDL3\/SDL_events.h 1573:34@
+sDL_EventEnabled
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@type@]: the type of event; see 'SDL_EventType' for details.
+  -> IO BG.CBool
+sDL_EventEnabled = hs_bindgen_448bb1465977146b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_RegisterEvents@
+foreign import ccall unsafe "hs_bindgen_f5d1c83cd76363fe"
+  hs_bindgen_f5d1c83cd76363fe_base
+    :: BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_RegisterEvents@
+hs_bindgen_f5d1c83cd76363fe
+  :: BG.CInt
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_f5d1c83cd76363fe =
+  BG.fromFFIType hs_bindgen_f5d1c83cd76363fe_base
+
+-- | Allocate a set of user-defined events, and return the beginning event number for that set of events.
+--
+--     [Returns]: the beginning event number, or 0 if numevents is invalid or if there are not enough user-defined events left.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PushEvent'
+--
+--     [C declaration]: @SDL_RegisterEvents@, defined at @SDL3\/SDL_events.h 1589:36@
+sDL_RegisterEvents
+  :: BG.CInt
+  -- ^
+  --
+  --           [@numevents@]: the number of events to be allocated.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_RegisterEvents = hs_bindgen_f5d1c83cd76363fe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_GetWindowFromEvent@
+foreign import ccall unsafe "hs_bindgen_ad9a414b46378fd2"
+  hs_bindgen_ad9a414b46378fd2_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_GetWindowFromEvent@
+hs_bindgen_ad9a414b46378fd2
+  :: PtrConst.PtrConst SDL_Event
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+hs_bindgen_ad9a414b46378fd2 =
+  BG.fromFFIType hs_bindgen_ad9a414b46378fd2_base
+
+-- | Get window associated with an event.
+--
+--     [Returns]: the associated window on success or NULL if there is none.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PollEvent', 'sDL_WaitEvent', 'sDL_WaitEventTimeout'
+--
+--     [C declaration]: @SDL_GetWindowFromEvent@, defined at @SDL3\/SDL_events.h 1605:42@
+sDL_GetWindowFromEvent
+  :: PtrConst.PtrConst SDL_Event
+  -- ^
+  --
+  --           [@event@]: an event containing a @windowID@.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+sDL_GetWindowFromEvent = hs_bindgen_ad9a414b46378fd2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_GetEventDescription@
+foreign import ccall unsafe "hs_bindgen_ff6611a2bb261892"
+  hs_bindgen_ff6611a2bb261892_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Events_Unsafe_SDL_GetEventDescription@
+hs_bindgen_ff6611a2bb261892
+  :: PtrConst.PtrConst SDL_Event
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_ff6611a2bb261892 =
+  BG.fromFFIType hs_bindgen_ff6611a2bb261892_base
+
+-- | Generate an English description of an event.
+--
+--     This will fill @buf@ with a null-terminated string that might look something like this:
+--
+--     @
+--     SDL_EVENT_MOUSE_MOTION (timestamp=1140256324 windowid=2 which=0 state=0 x=492.99 y=139.09 xrel=52 yrel=6)
+--     @
+--
+--     The exact format of the string is not guaranteed; it is intended for logging purposes, to be read by a human, and not parsed by a computer.
+--
+--     The returned value follows the same rules as SDL_snprintf(): @buf@ will always be NULL-terminated (unless @buflen@ is zero), and will be truncated if @buflen@ is too small. The return code is the number of bytes needed for the complete string, not counting the NULL-terminator, whether the string was truncated or not. Unlike SDL_snprintf(), though, this function never returns -1.
+--
+--     [Returns]: number of bytes needed for the full string, not counting the null-terminator byte.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetEventDescription@, defined at @SDL3\/SDL_events.h 1637:33@
+sDL_GetEventDescription
+  :: PtrConst.PtrConst SDL_Event
+  -- ^
+  --
+  --           [@event@]: an event to describe. May be NULL.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@buf@]: the buffer to fill with the description string. May be NULL.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@buflen@]: the maximum bytes that can be written to @buf@.
+  -> IO BG.CInt
+sDL_GetEventDescription = hs_bindgen_ff6611a2bb261892
diff --git a/src/SDL3/Sys/Bindgen/Filesystem.hs b/src/SDL3/Sys/Bindgen/Filesystem.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Filesystem.hs
@@ -0,0 +1,1042 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL offers an API for examining and manipulating the system\'s filesystem. This covers most things one would need to do with directories, except for actual file I\/O (which is covered by [CategoryIOStream](CategoryIOStream) and [CategoryAsyncIO](CategoryAsyncIO) instead).
+--
+--     There are functions to answer necessary path questions:
+--
+--     * Where is my app\'s data? @SDL_GetBasePath()@.
+--
+--     * Where can I safely write files? @SDL_GetPrefPath()@.
+--
+--     * Where are paths like Downloads, Desktop, Music? @SDL_GetUserFolder()@.
+--
+--     * What is this thing at this location? @SDL_GetPathInfo()@.
+--
+--     * What items live in this folder? @SDL_EnumerateDirectory()@.
+--
+--     * What items live in this folder by wildcard? @SDL_GlobDirectory()@.
+--
+--     * What is my current working directory? @SDL_GetCurrentDirectory()@.
+--
+--     SDL also offers functions to manipulate the directory tree: renaming, removing, copying files. Get the directory where the application was run from.
+--
+--     SDL caches the result of this call internally, but the first call to this function is not necessarily fast, so plan accordingly.
+--
+--     __macOS and iOS Specific Functionality__: If the application is in a \".app\" bundle, this function returns the Resource directory (e.g. MyApp.app\/Contents\/Resources\/). This behaviour can be overridden by adding a property to the Info.plist file. Adding a string key with the name SDL_FILESYSTEM_BASE_DIR_TYPE with a supported value will change the behaviour.
+--
+--     Supported values for the SDL_FILESYSTEM_BASE_DIR_TYPE property (Given an application in \/Applications\/SDLApp\/MyApp.app):
+--
+--     * @resource@: bundle resource directory (the default). For example: @\/Applications\/SDLApp\/MyApp.app\/Contents\/Resources@
+--
+--     * @bundle@: the Bundle directory. For example: @\/Applications\/SDLApp\/MyApp.app\/@
+--
+--     * @parent@: the containing directory of the bundle. For example: @\/Applications\/SDLApp\/@
+--
+--     __Android Specific Functionality__: This function returns \".\/\", which allows filesystem operations to use internal storage and the asset system.
+--
+--     __Nintendo 3DS Specific Functionality__: This function returns \"romfs\" directory of the application as it is uncommon to store resources outside the executable. As such it is not a writable directory.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: an absolute path in UTF-8 encoding to the application data directory. NULL will be returned on error or when the platform doesn\'t implement this functionality, call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPrefPath'
+module SDL3.Sys.Bindgen.Filesystem (
+  SDL3.Sys.Bindgen.Filesystem.SDL_Folder (..),
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_HOME,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_DESKTOP,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_DOCUMENTS,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_DOWNLOADS,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_MUSIC,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_PICTURES,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_PUBLICSHARE,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_SAVEDGAMES,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_SCREENSHOTS,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_TEMPLATES,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_VIDEOS,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_FOLDER_COUNT,
+  SDL3.Sys.Bindgen.Filesystem.SDL_PathType (..),
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_PATHTYPE_NONE,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_PATHTYPE_FILE,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_PATHTYPE_DIRECTORY,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_PATHTYPE_OTHER,
+  SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo (..),
+  SDL3.Sys.Bindgen.Filesystem.SDL_GlobFlags (..),
+  SDL3.Sys.Bindgen.Filesystem.sDL_GLOB_CASEINSENSITIVE,
+  SDL3.Sys.Bindgen.Filesystem.SDL_EnumerationResult (..),
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_ENUM_CONTINUE,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_ENUM_SUCCESS,
+  pattern SDL3.Sys.Bindgen.Filesystem.SDL_ENUM_FAILURE,
+  SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback_Aux (..),
+  SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback (..),
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | The type of the OS-provided default folder for a specific purpose.
+--
+--     Note that the Trash folder isn\'t included here, because trashing files usually involves extra OS-specific functionality to remember the file\'s original location.
+--
+--     The folders supported per platform are:
+--
+--     Windows
+--
+--     macOS\/iOS
+--
+--     tvOS
+--
+--     Unix (XDG)
+--
+--     Haiku
+--
+--     Emscripten
+--
+--     HOME
+--
+--     X
+--
+--     X
+--
+--     X
+--
+--     X
+--
+--     X
+--
+--     DESKTOP
+--
+--     X
+--
+--     X
+--
+--     X
+--
+--     X
+--
+--     DOCUMENTS
+--
+--     X
+--
+--     X
+--
+--     X
+--
+--     DOWNLOADS
+--
+--     Vista+
+--
+--     X
+--
+--     X
+--
+--     MUSIC
+--
+--     X
+--
+--     X
+--
+--     X
+--
+--     PICTURES
+--
+--     X
+--
+--     X
+--
+--     X
+--
+--     PUBLICSHARE
+--
+--     X
+--
+--     X
+--
+--     SAVEDGAMES
+--
+--     Vista+
+--
+--     SCREENSHOTS
+--
+--     Vista+
+--
+--     TEMPLATES
+--
+--     X
+--
+--     X
+--
+--     X
+--
+--     VIDEOS
+--
+--     X
+--
+--     X*
+--
+--     X
+--
+--     Note that on macOS\/iOS, the Videos folder is called \"Movies\".
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetUserFolder'
+--
+--     [C declaration]: @enum SDL_Folder@, defined at @SDL3\/SDL_filesystem.h 195:14@
+newtype SDL_Folder = SDL_Folder
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_Folder where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_Folder where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Folder
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_Folder where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Folder unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_Folder instance BG.Storable SDL_Folder
+
+deriving via BG.CUInt instance BG.Prim SDL_Folder
+
+instance CEnum.CEnum SDL_Folder where
+  type CEnumZ SDL_Folder = BG.CUInt
+
+  toCEnum = SDL_Folder
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_FOLDER_HOME")
+        , (1, BG.singleton "SDL_FOLDER_DESKTOP")
+        , (2, BG.singleton "SDL_FOLDER_DOCUMENTS")
+        , (3, BG.singleton "SDL_FOLDER_DOWNLOADS")
+        , (4, BG.singleton "SDL_FOLDER_MUSIC")
+        , (5, BG.singleton "SDL_FOLDER_PICTURES")
+        , (6, BG.singleton "SDL_FOLDER_PUBLICSHARE")
+        , (7, BG.singleton "SDL_FOLDER_SAVEDGAMES")
+        , (8, BG.singleton "SDL_FOLDER_SCREENSHOTS")
+        , (9, BG.singleton "SDL_FOLDER_TEMPLATES")
+        , (10, BG.singleton "SDL_FOLDER_VIDEOS")
+        , (11, BG.singleton "SDL_FOLDER_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_Folder"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_Folder"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_Folder where
+  minDeclaredValue = SDL_FOLDER_HOME
+
+  maxDeclaredValue = SDL_FOLDER_COUNT
+
+instance Show SDL_Folder where
+  showsPrec = CEnum.shows
+
+instance Read SDL_Folder where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_Folder ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Folder{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_Folder) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_Folder "unwrap" where
+  type CFieldType SDL_Folder "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The folder which contains all of the current user\'s data, preferences, and documents. It usually contains most of the other folders. If a requested folder does not exist, the home folder can be considered a safe fallback to store a user\'s documents.
+--
+--     [C declaration]: @SDL_FOLDER_HOME@, defined at @SDL3\/SDL_filesystem.h 197:5@
+pattern SDL_FOLDER_HOME :: SDL_Folder
+pattern SDL_FOLDER_HOME = SDL_Folder 0
+
+-- | The folder of files that are displayed on the desktop. Note that the existence of a desktop folder does not guarantee that the system does show icons on its desktop; certain GNU\/Linux distros with a graphical environment may not have desktop icons.
+--
+--     [C declaration]: @SDL_FOLDER_DESKTOP@, defined at @SDL3\/SDL_filesystem.h 198:5@
+pattern SDL_FOLDER_DESKTOP :: SDL_Folder
+pattern SDL_FOLDER_DESKTOP = SDL_Folder 1
+
+-- | User document files, possibly application-specific. This is a good place to save a user\'s projects.
+--
+--     [C declaration]: @SDL_FOLDER_DOCUMENTS@, defined at @SDL3\/SDL_filesystem.h 199:5@
+pattern SDL_FOLDER_DOCUMENTS :: SDL_Folder
+pattern SDL_FOLDER_DOCUMENTS = SDL_Folder 2
+
+-- | Standard folder for user files downloaded from the internet.
+--
+--     [C declaration]: @SDL_FOLDER_DOWNLOADS@, defined at @SDL3\/SDL_filesystem.h 200:5@
+pattern SDL_FOLDER_DOWNLOADS :: SDL_Folder
+pattern SDL_FOLDER_DOWNLOADS = SDL_Folder 3
+
+-- | Music files that can be played using a standard music player (mp3, ogg...).
+--
+--     [C declaration]: @SDL_FOLDER_MUSIC@, defined at @SDL3\/SDL_filesystem.h 201:5@
+pattern SDL_FOLDER_MUSIC :: SDL_Folder
+pattern SDL_FOLDER_MUSIC = SDL_Folder 4
+
+-- | Image files that can be displayed using a standard viewer (png, jpg...).
+--
+--     [C declaration]: @SDL_FOLDER_PICTURES@, defined at @SDL3\/SDL_filesystem.h 202:5@
+pattern SDL_FOLDER_PICTURES :: SDL_Folder
+pattern SDL_FOLDER_PICTURES = SDL_Folder 5
+
+-- | Files that are meant to be shared with other users on the same computer.
+--
+--     [C declaration]: @SDL_FOLDER_PUBLICSHARE@, defined at @SDL3\/SDL_filesystem.h 203:5@
+pattern SDL_FOLDER_PUBLICSHARE :: SDL_Folder
+pattern SDL_FOLDER_PUBLICSHARE = SDL_Folder 6
+
+-- | Save files for games.
+--
+--     [C declaration]: @SDL_FOLDER_SAVEDGAMES@, defined at @SDL3\/SDL_filesystem.h 204:5@
+pattern SDL_FOLDER_SAVEDGAMES :: SDL_Folder
+pattern SDL_FOLDER_SAVEDGAMES = SDL_Folder 7
+
+-- | Application screenshots.
+--
+--     [C declaration]: @SDL_FOLDER_SCREENSHOTS@, defined at @SDL3\/SDL_filesystem.h 205:5@
+pattern SDL_FOLDER_SCREENSHOTS :: SDL_Folder
+pattern SDL_FOLDER_SCREENSHOTS = SDL_Folder 8
+
+-- | Template files to be used when the user requests the desktop environment to create a new file in a certain folder, such as \"New Text File.txt\". Any file in the Templates folder can be used as a starting point for a new file.
+--
+--     [C declaration]: @SDL_FOLDER_TEMPLATES@, defined at @SDL3\/SDL_filesystem.h 206:5@
+pattern SDL_FOLDER_TEMPLATES :: SDL_Folder
+pattern SDL_FOLDER_TEMPLATES = SDL_Folder 9
+
+-- | Video files that can be played using a standard video player (mp4, webm...).
+--
+--     [C declaration]: @SDL_FOLDER_VIDEOS@, defined at @SDL3\/SDL_filesystem.h 207:5@
+pattern SDL_FOLDER_VIDEOS :: SDL_Folder
+pattern SDL_FOLDER_VIDEOS = SDL_Folder 10
+
+-- | Total number of types in this enum, not a folder type by itself.
+--
+--     [C declaration]: @SDL_FOLDER_COUNT@, defined at @SDL3\/SDL_filesystem.h 208:5@
+pattern SDL_FOLDER_COUNT :: SDL_Folder
+pattern SDL_FOLDER_COUNT = SDL_Folder 11
+
+-- | Types of filesystem entries.
+--
+--     Note that there may be other sorts of items on a filesystem: devices, named pipes, etc. They are currently reported as SDL_PATHTYPE_OTHER.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_PathInfo'
+--
+--     [C declaration]: @enum SDL_PathType@, defined at @SDL3\/SDL_filesystem.h 251:14@
+newtype SDL_PathType = SDL_PathType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_PathType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_PathType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PathType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_PathType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PathType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_PathType instance BG.Storable SDL_PathType
+
+deriving via BG.CUInt instance BG.Prim SDL_PathType
+
+instance CEnum.CEnum SDL_PathType where
+  type CEnumZ SDL_PathType = BG.CUInt
+
+  toCEnum = SDL_PathType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_PATHTYPE_NONE")
+        , (1, BG.singleton "SDL_PATHTYPE_FILE")
+        , (2, BG.singleton "SDL_PATHTYPE_DIRECTORY")
+        , (3, BG.singleton "SDL_PATHTYPE_OTHER")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_PathType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_PathType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_PathType where
+  minDeclaredValue = SDL_PATHTYPE_NONE
+
+  maxDeclaredValue = SDL_PATHTYPE_OTHER
+
+instance Show SDL_PathType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_PathType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_PathType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PathType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PathType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PathType "unwrap" where
+  type CFieldType SDL_PathType "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | path does not exist
+--
+--     [C declaration]: @SDL_PATHTYPE_NONE@, defined at @SDL3\/SDL_filesystem.h 253:5@
+pattern SDL_PATHTYPE_NONE :: SDL_PathType
+pattern SDL_PATHTYPE_NONE = SDL_PathType 0
+
+-- | a normal file
+--
+--     [C declaration]: @SDL_PATHTYPE_FILE@, defined at @SDL3\/SDL_filesystem.h 254:5@
+pattern SDL_PATHTYPE_FILE :: SDL_PathType
+pattern SDL_PATHTYPE_FILE = SDL_PathType 1
+
+-- | a directory
+--
+--     [C declaration]: @SDL_PATHTYPE_DIRECTORY@, defined at @SDL3\/SDL_filesystem.h 255:5@
+pattern SDL_PATHTYPE_DIRECTORY :: SDL_PathType
+pattern SDL_PATHTYPE_DIRECTORY = SDL_PathType 2
+
+-- | something completely different like a device node (not a symlink, those are always followed)
+--
+--     [C declaration]: @SDL_PATHTYPE_OTHER@, defined at @SDL3\/SDL_filesystem.h 256:5@
+pattern SDL_PATHTYPE_OTHER :: SDL_PathType
+pattern SDL_PATHTYPE_OTHER = SDL_PathType 3
+
+-- | Information about a path on the filesystem.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPathInfo', SDL_GetStoragePathInfo
+--
+--     [C declaration]: @struct SDL_PathInfo@, defined at @SDL3\/SDL_filesystem.h 267:16@
+data SDL_PathInfo = SDL_PathInfo
+  { type' :: SDL_PathType
+  -- ^ the path type
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_filesystem.h 269:18@
+  , size :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^ the file size in bytes
+  --
+  --          [C declaration]: @size@, defined at @SDL3\/SDL_filesystem.h 270:12@
+  , create_time :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^ the time when the path was created
+  --
+  --          [C declaration]: @create_time@, defined at @SDL3\/SDL_filesystem.h 271:14@
+  , modify_time :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^ the last time the path was modified
+  --
+  --          [C declaration]: @modify_time@, defined at @SDL3\/SDL_filesystem.h 272:14@
+  , access_time :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^ the last time the path was read
+  --
+  --          [C declaration]: @access_time@, defined at @SDL3\/SDL_filesystem.h 273:14@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_PathInfo where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_PathInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PathInfo
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"size") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"create_time") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"modify_time") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"access_time") ptr0
+
+instance Marshal.WriteRaw SDL_PathInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PathInfo type'2 size3 create_time4 modify_time5 access_time6 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"size") ptr0 size3
+              >> HasCField.writeRaw (BG.Proxy @"create_time") ptr0 create_time4
+              >> HasCField.writeRaw (BG.Proxy @"modify_time") ptr0 modify_time5
+              >> HasCField.writeRaw (BG.Proxy @"access_time") ptr0 access_time6
+
+deriving via Marshal.EquivStorable SDL_PathInfo instance BG.Storable SDL_PathInfo
+
+instance
+  (ty ~ SDL_PathType)
+  => BG.CompatHasField.HasField "type'" SDL_PathInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PathInfo
+            { type' = y1
+            , size = BG.getField @"size" x0
+            , create_time = BG.getField @"create_time" x0
+            , modify_time = BG.getField @"modify_time" x0
+            , access_time = BG.getField @"access_time" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_PathType)
+  => BG.HasField "type'" (BG.Ptr SDL_PathInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_PathInfo "type'" where
+  type CFieldType SDL_PathInfo "type'" = SDL_PathType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "size" SDL_PathInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PathInfo
+            { size = y1
+            , type' = BG.getField @"type'" x0
+            , create_time = BG.getField @"create_time" x0
+            , modify_time = BG.getField @"modify_time" x0
+            , access_time = BG.getField @"access_time" x0
+            }
+      , BG.getField @"size" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "size" (BG.Ptr SDL_PathInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"size")
+
+instance HasCField.HasCField SDL_PathInfo "size" where
+  type
+    CFieldType SDL_PathInfo "size" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.SDL_Time)
+  => BG.CompatHasField.HasField "create_time" SDL_PathInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PathInfo
+            { create_time = y1
+            , type' = BG.getField @"type'" x0
+            , size = BG.getField @"size" x0
+            , modify_time = BG.getField @"modify_time" x0
+            , access_time = BG.getField @"access_time" x0
+            }
+      , BG.getField @"create_time" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.SDL_Time)
+  => BG.HasField "create_time" (BG.Ptr SDL_PathInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"create_time")
+
+instance HasCField.HasCField SDL_PathInfo "create_time" where
+  type
+    CFieldType SDL_PathInfo "create_time" =
+      SDL3.Sys.Bindgen.Stdinc.SDL_Time
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.SDL_Time)
+  => BG.CompatHasField.HasField "modify_time" SDL_PathInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PathInfo
+            { modify_time = y1
+            , type' = BG.getField @"type'" x0
+            , size = BG.getField @"size" x0
+            , create_time = BG.getField @"create_time" x0
+            , access_time = BG.getField @"access_time" x0
+            }
+      , BG.getField @"modify_time" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.SDL_Time)
+  => BG.HasField "modify_time" (BG.Ptr SDL_PathInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"modify_time")
+
+instance HasCField.HasCField SDL_PathInfo "modify_time" where
+  type
+    CFieldType SDL_PathInfo "modify_time" =
+      SDL3.Sys.Bindgen.Stdinc.SDL_Time
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.SDL_Time)
+  => BG.CompatHasField.HasField "access_time" SDL_PathInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PathInfo
+            { access_time = y1
+            , type' = BG.getField @"type'" x0
+            , size = BG.getField @"size" x0
+            , create_time = BG.getField @"create_time" x0
+            , modify_time = BG.getField @"modify_time" x0
+            }
+      , BG.getField @"access_time" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.SDL_Time)
+  => BG.HasField "access_time" (BG.Ptr SDL_PathInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"access_time")
+
+instance HasCField.HasCField SDL_PathInfo "access_time" where
+  type
+    CFieldType SDL_PathInfo "access_time" =
+      SDL3.Sys.Bindgen.Stdinc.SDL_Time
+
+  offset# = \_ -> \_ -> 32
+
+-- | Flags for path matching.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GlobDirectory', SDL_GlobStorageDirectory
+--
+--     [C declaration]: @SDL_GlobFlags@, defined at @SDL3\/SDL_filesystem.h 284:16@
+newtype SDL_GlobFlags = SDL_GlobFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_GlobFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GlobFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GlobFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GlobFlags "unwrap" where
+  type
+    CFieldType SDL_GlobFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @macro SDL_GLOB_CASEINSENSITIVE@, defined at @SDL3\/SDL_filesystem.h 286:9@
+sDL_GLOB_CASEINSENSITIVE :: BG.CUInt
+sDL_GLOB_CASEINSENSITIVE =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (0 :: BG.CInt)
+
+-- | Possible results from an enumeration callback.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_EnumerateDirectoryCallback'
+--
+--     [C declaration]: @enum SDL_EnumerationResult@, defined at @SDL3\/SDL_filesystem.h 313:14@
+newtype SDL_EnumerationResult = SDL_EnumerationResult
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_EnumerationResult where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_EnumerationResult where
+  readRaw =
+    \ptr0 ->
+      pure SDL_EnumerationResult
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_EnumerationResult where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_EnumerationResult unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_EnumerationResult instance BG.Storable SDL_EnumerationResult
+
+deriving via BG.CUInt instance BG.Prim SDL_EnumerationResult
+
+instance CEnum.CEnum SDL_EnumerationResult where
+  type CEnumZ SDL_EnumerationResult = BG.CUInt
+
+  toCEnum = SDL_EnumerationResult
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_ENUM_CONTINUE")
+        , (1, BG.singleton "SDL_ENUM_SUCCESS")
+        , (2, BG.singleton "SDL_ENUM_FAILURE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_EnumerationResult"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_EnumerationResult"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_EnumerationResult where
+  minDeclaredValue = SDL_ENUM_CONTINUE
+
+  maxDeclaredValue = SDL_ENUM_FAILURE
+
+instance Show SDL_EnumerationResult where
+  showsPrec = CEnum.shows
+
+instance Read SDL_EnumerationResult where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_EnumerationResult ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EnumerationResult{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EnumerationResult) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EnumerationResult "unwrap" where
+  type
+    CFieldType SDL_EnumerationResult "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Value that requests that enumeration continue.
+--
+--     [C declaration]: @SDL_ENUM_CONTINUE@, defined at @SDL3\/SDL_filesystem.h 315:5@
+pattern SDL_ENUM_CONTINUE :: SDL_EnumerationResult
+pattern SDL_ENUM_CONTINUE = SDL_EnumerationResult 0
+
+-- | Value that requests that enumeration stop, successfully.
+--
+--     [C declaration]: @SDL_ENUM_SUCCESS@, defined at @SDL3\/SDL_filesystem.h 316:5@
+pattern SDL_ENUM_SUCCESS :: SDL_EnumerationResult
+pattern SDL_ENUM_SUCCESS = SDL_EnumerationResult 1
+
+-- | Value that requests that enumeration stop, as a failure.
+--
+--     [C declaration]: @SDL_ENUM_FAILURE@, defined at @SDL3\/SDL_filesystem.h 317:5@
+pattern SDL_ENUM_FAILURE :: SDL_EnumerationResult
+pattern SDL_ENUM_FAILURE = SDL_EnumerationResult 2
+
+-- | Auxiliary type used by 'SDL_EnumerateDirectoryCallback'
+--
+--     [C declaration]: @SDL_EnumerateDirectoryCallback@, defined at @SDL3\/SDL_filesystem.h 344:41@
+newtype SDL_EnumerateDirectoryCallback_Aux = SDL_EnumerateDirectoryCallback_Aux
+  { unwrap
+      :: BG.Ptr BG.Void
+      -> PtrConst.PtrConst BG.CChar
+      -> PtrConst.PtrConst BG.CChar
+      -> IO SDL_EnumerationResult
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_EnumerateDirectoryCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_a7027a1d7d8836f6_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32))
+
+-- __unique:__ @toSDL_EnumerateDirectoryCallback_Aux@
+hs_bindgen_a7027a1d7d8836f6
+  :: SDL_EnumerateDirectoryCallback_Aux
+  -> IO (BG.FunPtr SDL_EnumerateDirectoryCallback_Aux)
+hs_bindgen_a7027a1d7d8836f6 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_a7027a1d7d8836f6_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_EnumerateDirectoryCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_62890ffdaab536a5_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32)
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @fromSDL_EnumerateDirectoryCallback_Aux@
+hs_bindgen_62890ffdaab536a5
+  :: BG.FunPtr SDL_EnumerateDirectoryCallback_Aux
+  -> SDL_EnumerateDirectoryCallback_Aux
+hs_bindgen_62890ffdaab536a5 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_62890ffdaab536a5_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_EnumerateDirectoryCallback_Aux where
+  toFunPtr = hs_bindgen_a7027a1d7d8836f6
+
+instance BG.FromFunPtr SDL_EnumerateDirectoryCallback_Aux where
+  fromFunPtr = hs_bindgen_62890ffdaab536a5
+
+instance
+  ( ty
+      ~ ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.CChar
+          -> PtrConst.PtrConst BG.CChar
+          -> IO SDL_EnumerationResult
+        )
+  )
+  => BG.CompatHasField.HasField "unwrap" SDL_EnumerateDirectoryCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EnumerateDirectoryCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  ( ty
+      ~ ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.CChar
+          -> PtrConst.PtrConst BG.CChar
+          -> IO SDL_EnumerationResult
+        )
+  )
+  => BG.HasField "unwrap" (BG.Ptr SDL_EnumerateDirectoryCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EnumerateDirectoryCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_EnumerateDirectoryCallback_Aux "unwrap" =
+      BG.Ptr BG.Void
+      -> PtrConst.PtrConst BG.CChar
+      -> PtrConst.PtrConst BG.CChar
+      -> IO SDL_EnumerationResult
+
+  offset# = \_ -> \_ -> 0
+
+-- | Callback for directory enumeration.
+--
+--     Enumeration of directory entries will continue until either all entries have been provided to the callback, or the callback has requested a stop through its return value.
+--
+--     Returning SDL_ENUM_CONTINUE will let enumeration proceed, calling the callback with further entries. SDL_ENUM_SUCCESS and SDL_ENUM_FAILURE will terminate the enumeration early, and dictate the return value of the enumeration function itself.
+--
+--     @dirname@ is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [@userdata@]: an app-controlled pointer that is passed to the callback.
+--
+--     [@dirname@]: the directory that is being enumerated.
+--
+--     [@fname@]: the next entry in the enumeration.
+--
+--     [Returns]: how the enumeration should proceed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EnumerateDirectory'
+--
+--     [C declaration]: @SDL_EnumerateDirectoryCallback@, defined at @SDL3\/SDL_filesystem.h 344:41@
+newtype SDL_EnumerateDirectoryCallback = SDL_EnumerateDirectoryCallback
+  { unwrap :: BG.FunPtr SDL_EnumerateDirectoryCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_EnumerateDirectoryCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_EnumerateDirectoryCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 -> SDL_EnumerateDirectoryCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_EnumerateDirectoryCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EnumerateDirectoryCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EnumerateDirectoryCallback "unwrap" where
+  type
+    CFieldType SDL_EnumerateDirectoryCallback "unwrap" =
+      BG.FunPtr SDL_EnumerateDirectoryCallback_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Filesystem/FunPtr.hs b/src/SDL3/Sys/Bindgen/Filesystem/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Filesystem/FunPtr.hs
@@ -0,0 +1,536 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Filesystem.FunPtr (
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_GetBasePath,
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_GetPrefPath,
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_GetUserFolder,
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_CreateDirectory,
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_EnumerateDirectory,
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_RemovePath,
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_RenamePath,
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_CopyFile,
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_GetPathInfo,
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_GlobDirectory,
+  SDL3.Sys.Bindgen.Filesystem.FunPtr.sDL_GetCurrentDirectory,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Filesystem
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_filesystem.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetBasePath */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_2ed5dba72836bf2d (void)) (void)"
+         , "{"
+         , "  return &SDL_GetBasePath;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetPrefPath */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_693f7d2fd575601d (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetPrefPath;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetUserFolder */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_53fe991909d2361a (void)) ("
+         , "  SDL_Folder arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetUserFolder;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_CreateDirectory */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2a04cc89206a07e4 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateDirectory;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_EnumerateDirectory */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f96b84c7478907dc (void)) ("
+         , "  char const *arg1,"
+         , "  SDL_EnumerateDirectoryCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_EnumerateDirectory;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_RemovePath */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4ae39f185b082764 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RemovePath;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_RenamePath */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_adef5cb596ea35b1 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_RenamePath;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_CopyFile */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_0ba2df1188540129 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CopyFile;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetPathInfo */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e161df4dd9e79e80 (void)) ("
+         , "  char const *arg1,"
+         , "  SDL_PathInfo *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetPathInfo;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GlobDirectory */"
+         , "__attribute__ ((const))"
+         , "char **(*hs_bindgen_ddd930892e7124f6 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_GlobFlags arg3,"
+         , "  signed int *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GlobDirectory;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetCurrentDirectory */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_8a07612d881643ee (void)) (void)"
+         , "{"
+         , "  return &SDL_GetCurrentDirectory;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetBasePath@
+foreign import ccall unsafe "hs_bindgen_2ed5dba72836bf2d"
+  hs_bindgen_2ed5dba72836bf2d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetBasePath@
+hs_bindgen_2ed5dba72836bf2d :: IO (BG.FunPtr (IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_2ed5dba72836bf2d =
+  BG.fromFFIType hs_bindgen_2ed5dba72836bf2d_base
+
+{-# NOINLINE sDL_GetBasePath #-}
+
+-- | [C declaration]: @SDL_GetBasePath@, defined at @SDL3\/SDL_filesystem.h 101:42@
+sDL_GetBasePath :: BG.FunPtr (IO (PtrConst.PtrConst BG.CChar))
+sDL_GetBasePath =
+  BG.unsafePerformIO hs_bindgen_2ed5dba72836bf2d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetPrefPath@
+foreign import ccall unsafe "hs_bindgen_693f7d2fd575601d"
+  hs_bindgen_693f7d2fd575601d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetPrefPath@
+hs_bindgen_693f7d2fd575601d
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_693f7d2fd575601d =
+  BG.fromFFIType hs_bindgen_693f7d2fd575601d_base
+
+{-# NOINLINE sDL_GetPrefPath #-}
+
+-- | Get the user-and-app-specific path where files can be written.
+--
+--     Get the \"pref dir\". This is meant to be where users can write personal files (preferences and save games, etc) that are specific to your application. This directory is unique per user, per application.
+--
+--     This function will decide the appropriate location in the native filesystem, create the directory if necessary, and return a string of the absolute path to the directory in UTF-8 encoding.
+--
+--     On Windows, the string might look like:
+--
+--     @C:\\\\Users\\\\bob\\\\AppData\\\\Roaming\\\\My Company\\\\My Program Name\\\\@
+--
+--     On Linux, the string might look like:
+--
+--     @\/home\/bob\/.local\/share\/My Program Name\/@
+--
+--     On macOS, the string might look like:
+--
+--     @\/Users\/bob\/Library\/Application Support\/My Program Name\/@
+--
+--     You should assume the path returned by this function is the only safe place to write files (and that @SDL_GetBasePath()@, while it might be writable, or even the parent of the returned path, isn\'t where you should be writing things).
+--
+--     Both the org and app strings may become part of a directory name, so please follow these rules:
+--
+--     * Try to use the same org string (/including case-sensitivity/) for all your applications that use this function.
+--
+--     * Always use a unique app string for each one, and make sure it never changes for an app once you\'ve decided on it.
+--
+--     * Unicode characters are legal, as long as they are UTF-8 encoded, but...
+--
+--     * ...only use letters, numbers, and spaces. Avoid punctuation like \"Game Name 2: Bad Guy\'s Revenge!\" ... \"Game Name 2\" is sufficient.
+--
+--     Due to historical mistakes, @org@ is allowed to be NULL or \"\". In such cases, SDL will omit the org subdirectory, including on platforms where it shouldn\'t, and including on platforms where this would make your app fail certification for an app store. New apps should definitely specify a real string for @org@.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [@org@]: the name of your organization.
+--
+--     [@app@]: the name of your application.
+--
+--     [Returns]: a UTF-8 string of the user directory in platform-dependent notation. NULL if there\'s a problem (creating directory failed, etc.). This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetBasePath'
+--
+--     [C declaration]: @SDL_GetPrefPath@, defined at @SDL3\/SDL_filesystem.h 164:36@
+sDL_GetPrefPath
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr BG.CChar))
+sDL_GetPrefPath =
+  BG.unsafePerformIO hs_bindgen_693f7d2fd575601d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetUserFolder@
+foreign import ccall unsafe "hs_bindgen_53fe991909d2361a"
+  hs_bindgen_53fe991909d2361a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetUserFolder@
+hs_bindgen_53fe991909d2361a :: IO (BG.FunPtr (SDL_Folder -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_53fe991909d2361a =
+  BG.fromFFIType hs_bindgen_53fe991909d2361a_base
+
+{-# NOINLINE sDL_GetUserFolder #-}
+
+-- | Finds the most suitable user folder for a specific purpose.
+--
+--     Many OSes provide certain standard folders for certain purposes, such as storing pictures, music or videos for a certain user. This function gives the path for many of those special locations.
+--
+--     This function is specifically for /user/ folders, which are meant for the user to access and manage. For application-specific folders, meant to hold data for the application to manage, see @SDL_GetBasePath()@ and @SDL_GetPrefPath()@.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     If NULL is returned, the error may be obtained with SDL_GetError().
+--
+--     [@folder@]: the type of folder to find.
+--
+--     [Returns]: either a null-terminated C string containing the full path to the folder, or NULL if an error happened.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetUserFolder@, defined at @SDL3\/SDL_filesystem.h 236:42@
+sDL_GetUserFolder :: BG.FunPtr (SDL_Folder -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetUserFolder =
+  BG.unsafePerformIO hs_bindgen_53fe991909d2361a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_CreateDirectory@
+foreign import ccall unsafe "hs_bindgen_2a04cc89206a07e4"
+  hs_bindgen_2a04cc89206a07e4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_CreateDirectory@
+hs_bindgen_2a04cc89206a07e4 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_2a04cc89206a07e4 =
+  BG.fromFFIType hs_bindgen_2a04cc89206a07e4_base
+
+{-# NOINLINE sDL_CreateDirectory #-}
+
+-- | Create a directory, and any missing parent directories.
+--
+--     This reports success if @path@ already exists as a directory.
+--
+--     If parent directories are missing, it will also create them. Note that if this fails, it will not remove any parent directories it already made.
+--
+--     [@path@]: the path of the directory to create.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CreateDirectory@, defined at @SDL3\/SDL_filesystem.h 304:34@
+sDL_CreateDirectory :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_CreateDirectory =
+  BG.unsafePerformIO hs_bindgen_2a04cc89206a07e4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_EnumerateDirectory@
+foreign import ccall unsafe "hs_bindgen_f96b84c7478907dc"
+  hs_bindgen_f96b84c7478907dc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_EnumerateDirectory@
+hs_bindgen_f96b84c7478907dc
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst BG.CChar -> SDL_EnumerateDirectoryCallback -> BG.Ptr BG.Void -> IO BG.CBool)
+       )
+hs_bindgen_f96b84c7478907dc =
+  BG.fromFFIType hs_bindgen_f96b84c7478907dc_base
+
+{-# NOINLINE sDL_EnumerateDirectory #-}
+
+-- | Enumerate a directory through a callback function.
+--
+--     This function provides every directory entry through an app-provided callback, called once for each directory entry, until all results have been provided or the callback returns either SDL_ENUM_SUCCESS or SDL_ENUM_FAILURE.
+--
+--     This will return false if there was a system problem in general, or if a callback returns SDL_ENUM_FAILURE. A successful return means a callback returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries were enumerated.
+--
+--     [@path@]: the path of the directory to enumerate.
+--
+--     [@callback@]: a function that is called for each entry in the directory.
+--
+--     [@userdata@]: a pointer that is passed to @callback@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EnumerateDirectory@, defined at @SDL3\/SDL_filesystem.h 369:34@
+sDL_EnumerateDirectory
+  :: BG.FunPtr
+       (PtrConst.PtrConst BG.CChar -> SDL_EnumerateDirectoryCallback -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_EnumerateDirectory =
+  BG.unsafePerformIO hs_bindgen_f96b84c7478907dc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_RemovePath@
+foreign import ccall unsafe "hs_bindgen_4ae39f185b082764"
+  hs_bindgen_4ae39f185b082764_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_RemovePath@
+hs_bindgen_4ae39f185b082764 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_4ae39f185b082764 =
+  BG.fromFFIType hs_bindgen_4ae39f185b082764_base
+
+{-# NOINLINE sDL_RemovePath #-}
+
+-- | Remove a file or an empty directory.
+--
+--     Directories that are not empty will fail; this function will not recursely delete directory trees.
+--
+--     [@path@]: the path to remove from the filesystem.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RemovePath@, defined at @SDL3\/SDL_filesystem.h 385:34@
+sDL_RemovePath :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_RemovePath =
+  BG.unsafePerformIO hs_bindgen_4ae39f185b082764
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_RenamePath@
+foreign import ccall unsafe "hs_bindgen_adef5cb596ea35b1"
+  hs_bindgen_adef5cb596ea35b1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_RenamePath@
+hs_bindgen_adef5cb596ea35b1
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_adef5cb596ea35b1 =
+  BG.fromFFIType hs_bindgen_adef5cb596ea35b1_base
+
+{-# NOINLINE sDL_RenamePath #-}
+
+-- | Rename a file or directory.
+--
+--     If the file at @newpath@ already exists, it will be replaced.
+--
+--     Note that this will not copy files across filesystems\/drives\/volumes, as that is a much more complicated (and possibly time-consuming) operation.
+--
+--     Which is to say, if this function fails, @SDL_CopyFile()@ to a temporary file in the same directory as @newpath@, then @SDL_RenamePath()@ from the temporary file to @newpath@ and @SDL_RemovePath()@ on @oldpath@ might work for files. Renaming a non-empty directory across filesystems is dramatically more complex, however.
+--
+--     [@oldpath@]: the old path.
+--
+--     [@newpath@]: the new path.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RenamePath@, defined at @SDL3\/SDL_filesystem.h 410:34@
+sDL_RenamePath
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_RenamePath =
+  BG.unsafePerformIO hs_bindgen_adef5cb596ea35b1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_CopyFile@
+foreign import ccall unsafe "hs_bindgen_0ba2df1188540129"
+  hs_bindgen_0ba2df1188540129_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_CopyFile@
+hs_bindgen_0ba2df1188540129
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_0ba2df1188540129 =
+  BG.fromFFIType hs_bindgen_0ba2df1188540129_base
+
+{-# NOINLINE sDL_CopyFile #-}
+
+-- | Copy a file.
+--
+--     If the file at @newpath@ already exists, it will be overwritten with the contents of the file at @oldpath@.
+--
+--     This function will block until the copy is complete, which might be a significant time for large files on slow disks. On some platforms, the copy can be handed off to the OS itself, but on others SDL might just open both paths, and read from one and write to the other.
+--
+--     Note that this is not an atomic operation! If something tries to read from @newpath@ while the copy is in progress, it will see an incomplete copy of the data, and if the calling thread terminates (or the power goes out) during the copy, @newpath@ \'s previous contents will be gone, replaced with an incomplete copy of the data. To avoid this risk, it is recommended that the app copy to a temporary file in the same directory as @newpath@, and if the copy is successful, use @SDL_RenamePath()@ to replace @newpath@ with the temporary file. This will ensure that reads of @newpath@ will either see a complete copy of the data, or it will see the pre-copy state of @newpath@.
+--
+--     This function attempts to synchronize the newly-copied data to disk before returning, if the platform allows it, so that the renaming trick will not have a problem in a system crash or power failure, where the file could be renamed but the contents never made it from the system file cache to the physical disk.
+--
+--     If the copy fails for any reason, the state of @newpath@ is undefined. It might be half a copy, it might be the untouched data of what was already there, or it might be a zero-byte file, etc.
+--
+--     [@oldpath@]: the old path.
+--
+--     [@newpath@]: the new path.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but this operation is not atomic, so the app might need to protect access to specific paths from other threads if appropriate.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyFile@, defined at @SDL3\/SDL_filesystem.h 454:34@
+sDL_CopyFile :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_CopyFile =
+  BG.unsafePerformIO hs_bindgen_0ba2df1188540129
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetPathInfo@
+foreign import ccall unsafe "hs_bindgen_e161df4dd9e79e80"
+  hs_bindgen_e161df4dd9e79e80_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetPathInfo@
+hs_bindgen_e161df4dd9e79e80
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr SDL_PathInfo -> IO BG.CBool))
+hs_bindgen_e161df4dd9e79e80 =
+  BG.fromFFIType hs_bindgen_e161df4dd9e79e80_base
+
+{-# NOINLINE sDL_GetPathInfo #-}
+
+-- | Get information about a filesystem path.
+--
+--     Symlinks, on filesystems that support them, are always followed, so you will always get information on what the symlink eventually points to, and not the symlink itself.
+--
+--     [@path@]: the path to query.
+--
+--     [@info@]: a pointer filled in with information about the path, or NULL to check for the existence of a file.
+--
+--     [Returns]: true on success or false if the file doesn\'t exist, or another failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPathInfo@, defined at @SDL3\/SDL_filesystem.h 473:34@
+sDL_GetPathInfo :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr SDL_PathInfo -> IO BG.CBool)
+sDL_GetPathInfo =
+  BG.unsafePerformIO hs_bindgen_e161df4dd9e79e80
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GlobDirectory@
+foreign import ccall unsafe "hs_bindgen_ddd930892e7124f6"
+  hs_bindgen_ddd930892e7124f6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GlobDirectory@
+hs_bindgen_ddd930892e7124f6
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> SDL_GlobFlags
+             -> BG.Ptr BG.CInt
+             -> IO (BG.Ptr (BG.Ptr BG.CChar))
+           )
+       )
+hs_bindgen_ddd930892e7124f6 =
+  BG.fromFFIType hs_bindgen_ddd930892e7124f6_base
+
+{-# NOINLINE sDL_GlobDirectory #-}
+
+-- | Enumerate a directory tree, filtered by pattern, and return a list.
+--
+--     Files are filtered out if they don\'t match the string in @pattern@, which may contain wildcard characters @*@ (match everything) and @?@ (match one character). If pattern is NULL, no filtering is done and all results are returned. Subdirectories are permitted, and are specified with a path separator of @\/@. Wildcard characters @*@ and @?@ never match a path separator.
+--
+--     @flags@ may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching case-insensitive.
+--
+--     The returned array is always NULL-terminated, for your iterating convenience, but if @count@ is non-NULL, on return it will contain the number of items in the array, not counting the NULL terminator.
+--
+--     [@path@]: the path of the directory to enumerate.
+--
+--     [@pattern@]: the pattern that files in the directory must match. Can be NULL.
+--
+--     [@flags@]: @SDL_GLOB_*@ bitflags that affect this search.
+--
+--     [@count@]: on return, will be set to the number of items in the returned array. Can be NULL.
+--
+--     [Returns]: an array of strings on success or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GlobDirectory@, defined at @SDL3\/SDL_filesystem.h 506:37@
+sDL_GlobDirectory
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> SDL_GlobFlags
+         -> BG.Ptr BG.CInt
+         -> IO (BG.Ptr (BG.Ptr BG.CChar))
+       )
+sDL_GlobDirectory =
+  BG.unsafePerformIO hs_bindgen_ddd930892e7124f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetCurrentDirectory@
+foreign import ccall unsafe "hs_bindgen_8a07612d881643ee"
+  hs_bindgen_8a07612d881643ee_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_get_SDL_GetCurrentDirectory@
+hs_bindgen_8a07612d881643ee :: IO (BG.FunPtr (IO (BG.Ptr BG.CChar)))
+hs_bindgen_8a07612d881643ee =
+  BG.fromFFIType hs_bindgen_8a07612d881643ee_base
+
+{-# NOINLINE sDL_GetCurrentDirectory #-}
+
+-- | Get what the system believes is the \"current working directory.\"
+--
+--     For systems without a concept of a current working directory, this will still attempt to provide something reasonable.
+--
+--     SDL does not provide a means to /change/ the current working directory; for platforms without this concept, this would cause surprises with file access outside of SDL.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: a UTF-8 string of the current working directory in platform-dependent notation. NULL if there\'s a problem. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentDirectory@, defined at @SDL3\/SDL_filesystem.h 529:36@
+sDL_GetCurrentDirectory :: BG.FunPtr (IO (BG.Ptr BG.CChar))
+sDL_GetCurrentDirectory =
+  BG.unsafePerformIO hs_bindgen_8a07612d881643ee
diff --git a/src/SDL3/Sys/Bindgen/Filesystem/Safe.hs b/src/SDL3/Sys/Bindgen/Filesystem/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Filesystem/Safe.hs
@@ -0,0 +1,543 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Filesystem.Safe (
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_GetBasePath,
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_GetPrefPath,
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_GetUserFolder,
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_CreateDirectory,
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_EnumerateDirectory,
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_RemovePath,
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_RenamePath,
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_CopyFile,
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_GetPathInfo,
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_GlobDirectory,
+  SDL3.Sys.Bindgen.Filesystem.Safe.sDL_GetCurrentDirectory,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Filesystem
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_filesystem.h>"
+         , "char const *hs_bindgen_f92cc8ff07ef9740 (void)"
+         , "{"
+         , "  return (SDL_GetBasePath)();"
+         , "}"
+         , "char *hs_bindgen_619cc1fa3f4aefd0 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPrefPath)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_c6c5688c3bb20e35 ("
+         , "  SDL_Folder arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetUserFolder)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_9f1feb13cd45a33b ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateDirectory)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_e94d2a77c1f86c96 ("
+         , "  char const *arg1,"
+         , "  SDL_EnumerateDirectoryCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_EnumerateDirectory)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_84b6008494da965d ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RemovePath)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_41cbbf30c063ebd5 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RenamePath)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_4feaee53c2645e31 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CopyFile)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_caa951538e03e0b0 ("
+         , "  char const *arg1,"
+         , "  SDL_PathInfo *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPathInfo)(arg1, arg2);"
+         , "}"
+         , "char **hs_bindgen_fb5d363e95cc2777 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_GlobFlags arg3,"
+         , "  signed int *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GlobDirectory)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "char *hs_bindgen_1c738c64af33b51a (void)"
+         , "{"
+         , "  return (SDL_GetCurrentDirectory)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GetBasePath@
+foreign import ccall safe "hs_bindgen_f92cc8ff07ef9740"
+  hs_bindgen_f92cc8ff07ef9740_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GetBasePath@
+hs_bindgen_f92cc8ff07ef9740 :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_f92cc8ff07ef9740 =
+  BG.fromFFIType hs_bindgen_f92cc8ff07ef9740_base
+
+-- | [C declaration]: @SDL_GetBasePath@, defined at @SDL3\/SDL_filesystem.h 101:42@
+sDL_GetBasePath :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetBasePath = hs_bindgen_f92cc8ff07ef9740
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GetPrefPath@
+foreign import ccall safe "hs_bindgen_619cc1fa3f4aefd0"
+  hs_bindgen_619cc1fa3f4aefd0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GetPrefPath@
+hs_bindgen_619cc1fa3f4aefd0
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_619cc1fa3f4aefd0 =
+  BG.fromFFIType hs_bindgen_619cc1fa3f4aefd0_base
+
+-- | Get the user-and-app-specific path where files can be written.
+--
+--     Get the \"pref dir\". This is meant to be where users can write personal files (preferences and save games, etc) that are specific to your application. This directory is unique per user, per application.
+--
+--     This function will decide the appropriate location in the native filesystem, create the directory if necessary, and return a string of the absolute path to the directory in UTF-8 encoding.
+--
+--     On Windows, the string might look like:
+--
+--     @C:\\\\Users\\\\bob\\\\AppData\\\\Roaming\\\\My Company\\\\My Program Name\\\\@
+--
+--     On Linux, the string might look like:
+--
+--     @\/home\/bob\/.local\/share\/My Program Name\/@
+--
+--     On macOS, the string might look like:
+--
+--     @\/Users\/bob\/Library\/Application Support\/My Program Name\/@
+--
+--     You should assume the path returned by this function is the only safe place to write files (and that @SDL_GetBasePath()@, while it might be writable, or even the parent of the returned path, isn\'t where you should be writing things).
+--
+--     Both the org and app strings may become part of a directory name, so please follow these rules:
+--
+--     * Try to use the same org string (/including case-sensitivity/) for all your applications that use this function.
+--
+--     * Always use a unique app string for each one, and make sure it never changes for an app once you\'ve decided on it.
+--
+--     * Unicode characters are legal, as long as they are UTF-8 encoded, but...
+--
+--     * ...only use letters, numbers, and spaces. Avoid punctuation like \"Game Name 2: Bad Guy\'s Revenge!\" ... \"Game Name 2\" is sufficient.
+--
+--     Due to historical mistakes, @org@ is allowed to be NULL or \"\". In such cases, SDL will omit the org subdirectory, including on platforms where it shouldn\'t, and including on platforms where this would make your app fail certification for an app store. New apps should definitely specify a real string for @org@.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: a UTF-8 string of the user directory in platform-dependent notation. NULL if there\'s a problem (creating directory failed, etc.). This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetBasePath'
+--
+--     [C declaration]: @SDL_GetPrefPath@, defined at @SDL3\/SDL_filesystem.h 164:36@
+sDL_GetPrefPath
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@org@]: the name of your organization.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@app@]: the name of your application.
+  -> IO (BG.Ptr BG.CChar)
+sDL_GetPrefPath = hs_bindgen_619cc1fa3f4aefd0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GetUserFolder@
+foreign import ccall safe "hs_bindgen_c6c5688c3bb20e35"
+  hs_bindgen_c6c5688c3bb20e35_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GetUserFolder@
+hs_bindgen_c6c5688c3bb20e35
+  :: SDL_Folder
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_c6c5688c3bb20e35 =
+  BG.fromFFIType hs_bindgen_c6c5688c3bb20e35_base
+
+-- | Finds the most suitable user folder for a specific purpose.
+--
+--     Many OSes provide certain standard folders for certain purposes, such as storing pictures, music or videos for a certain user. This function gives the path for many of those special locations.
+--
+--     This function is specifically for /user/ folders, which are meant for the user to access and manage. For application-specific folders, meant to hold data for the application to manage, see @SDL_GetBasePath()@ and @SDL_GetPrefPath()@.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     If NULL is returned, the error may be obtained with SDL_GetError().
+--
+--     [Returns]: either a null-terminated C string containing the full path to the folder, or NULL if an error happened.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetUserFolder@, defined at @SDL3\/SDL_filesystem.h 236:42@
+sDL_GetUserFolder
+  :: SDL_Folder
+  -- ^
+  --
+  --           [@folder@]: the type of folder to find.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetUserFolder = hs_bindgen_c6c5688c3bb20e35
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_CreateDirectory@
+foreign import ccall safe "hs_bindgen_9f1feb13cd45a33b"
+  hs_bindgen_9f1feb13cd45a33b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_CreateDirectory@
+hs_bindgen_9f1feb13cd45a33b
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_9f1feb13cd45a33b =
+  BG.fromFFIType hs_bindgen_9f1feb13cd45a33b_base
+
+-- | Create a directory, and any missing parent directories.
+--
+--     This reports success if @path@ already exists as a directory.
+--
+--     If parent directories are missing, it will also create them. Note that if this fails, it will not remove any parent directories it already made.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CreateDirectory@, defined at @SDL3\/SDL_filesystem.h 304:34@
+sDL_CreateDirectory
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to create.
+  -> IO BG.CBool
+sDL_CreateDirectory = hs_bindgen_9f1feb13cd45a33b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_EnumerateDirectory@
+foreign import ccall safe "hs_bindgen_e94d2a77c1f86c96"
+  hs_bindgen_e94d2a77c1f86c96_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_EnumerateDirectory@
+hs_bindgen_e94d2a77c1f86c96
+  :: PtrConst.PtrConst BG.CChar
+  -> SDL_EnumerateDirectoryCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_e94d2a77c1f86c96 =
+  BG.fromFFIType hs_bindgen_e94d2a77c1f86c96_base
+
+-- | Enumerate a directory through a callback function.
+--
+--     This function provides every directory entry through an app-provided callback, called once for each directory entry, until all results have been provided or the callback returns either SDL_ENUM_SUCCESS or SDL_ENUM_FAILURE.
+--
+--     This will return false if there was a system problem in general, or if a callback returns SDL_ENUM_FAILURE. A successful return means a callback returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries were enumerated.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EnumerateDirectory@, defined at @SDL3\/SDL_filesystem.h 369:34@
+sDL_EnumerateDirectory
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> SDL_EnumerateDirectoryCallback
+  -- ^
+  --
+  --           [@callback@]: a function that is called for each entry in the directory.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO BG.CBool
+sDL_EnumerateDirectory = hs_bindgen_e94d2a77c1f86c96
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_RemovePath@
+foreign import ccall safe "hs_bindgen_84b6008494da965d"
+  hs_bindgen_84b6008494da965d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_RemovePath@
+hs_bindgen_84b6008494da965d
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_84b6008494da965d =
+  BG.fromFFIType hs_bindgen_84b6008494da965d_base
+
+-- | Remove a file or an empty directory.
+--
+--     Directories that are not empty will fail; this function will not recursely delete directory trees.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RemovePath@, defined at @SDL3\/SDL_filesystem.h 385:34@
+sDL_RemovePath
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to remove from the filesystem.
+  -> IO BG.CBool
+sDL_RemovePath = hs_bindgen_84b6008494da965d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_RenamePath@
+foreign import ccall safe "hs_bindgen_41cbbf30c063ebd5"
+  hs_bindgen_41cbbf30c063ebd5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_RenamePath@
+hs_bindgen_41cbbf30c063ebd5
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_41cbbf30c063ebd5 =
+  BG.fromFFIType hs_bindgen_41cbbf30c063ebd5_base
+
+-- | Rename a file or directory.
+--
+--     If the file at @newpath@ already exists, it will be replaced.
+--
+--     Note that this will not copy files across filesystems\/drives\/volumes, as that is a much more complicated (and possibly time-consuming) operation.
+--
+--     Which is to say, if this function fails, @SDL_CopyFile()@ to a temporary file in the same directory as @newpath@, then @SDL_RenamePath()@ from the temporary file to @newpath@ and @SDL_RemovePath()@ on @oldpath@ might work for files. Renaming a non-empty directory across filesystems is dramatically more complex, however.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RenamePath@, defined at @SDL3\/SDL_filesystem.h 410:34@
+sDL_RenamePath
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO BG.CBool
+sDL_RenamePath = hs_bindgen_41cbbf30c063ebd5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_CopyFile@
+foreign import ccall safe "hs_bindgen_4feaee53c2645e31"
+  hs_bindgen_4feaee53c2645e31_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_CopyFile@
+hs_bindgen_4feaee53c2645e31
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_4feaee53c2645e31 =
+  BG.fromFFIType hs_bindgen_4feaee53c2645e31_base
+
+-- | Copy a file.
+--
+--     If the file at @newpath@ already exists, it will be overwritten with the contents of the file at @oldpath@.
+--
+--     This function will block until the copy is complete, which might be a significant time for large files on slow disks. On some platforms, the copy can be handed off to the OS itself, but on others SDL might just open both paths, and read from one and write to the other.
+--
+--     Note that this is not an atomic operation! If something tries to read from @newpath@ while the copy is in progress, it will see an incomplete copy of the data, and if the calling thread terminates (or the power goes out) during the copy, @newpath@ \'s previous contents will be gone, replaced with an incomplete copy of the data. To avoid this risk, it is recommended that the app copy to a temporary file in the same directory as @newpath@, and if the copy is successful, use @SDL_RenamePath()@ to replace @newpath@ with the temporary file. This will ensure that reads of @newpath@ will either see a complete copy of the data, or it will see the pre-copy state of @newpath@.
+--
+--     This function attempts to synchronize the newly-copied data to disk before returning, if the platform allows it, so that the renaming trick will not have a problem in a system crash or power failure, where the file could be renamed but the contents never made it from the system file cache to the physical disk.
+--
+--     If the copy fails for any reason, the state of @newpath@ is undefined. It might be half a copy, it might be the untouched data of what was already there, or it might be a zero-byte file, etc.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but this operation is not atomic, so the app might need to protect access to specific paths from other threads if appropriate.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyFile@, defined at @SDL3\/SDL_filesystem.h 454:34@
+sDL_CopyFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO BG.CBool
+sDL_CopyFile = hs_bindgen_4feaee53c2645e31
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GetPathInfo@
+foreign import ccall safe "hs_bindgen_caa951538e03e0b0"
+  hs_bindgen_caa951538e03e0b0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GetPathInfo@
+hs_bindgen_caa951538e03e0b0
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL_PathInfo
+  -> IO BG.CBool
+hs_bindgen_caa951538e03e0b0 =
+  BG.fromFFIType hs_bindgen_caa951538e03e0b0_base
+
+-- | Get information about a filesystem path.
+--
+--     Symlinks, on filesystems that support them, are always followed, so you will always get information on what the symlink eventually points to, and not the symlink itself.
+--
+--     [Returns]: true on success or false if the file doesn\'t exist, or another failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPathInfo@, defined at @SDL3\/SDL_filesystem.h 473:34@
+sDL_GetPathInfo
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to query.
+  -> BG.Ptr SDL_PathInfo
+  -- ^
+  --
+  --           [@info@]: a pointer filled in with information about the path, or NULL to check for the existence of a file.
+  -> IO BG.CBool
+sDL_GetPathInfo = hs_bindgen_caa951538e03e0b0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GlobDirectory@
+foreign import ccall safe "hs_bindgen_fb5d363e95cc2777"
+  hs_bindgen_fb5d363e95cc2777_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GlobDirectory@
+hs_bindgen_fb5d363e95cc2777
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL_GlobFlags
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+hs_bindgen_fb5d363e95cc2777 =
+  BG.fromFFIType hs_bindgen_fb5d363e95cc2777_base
+
+-- | Enumerate a directory tree, filtered by pattern, and return a list.
+--
+--     Files are filtered out if they don\'t match the string in @pattern@, which may contain wildcard characters @*@ (match everything) and @?@ (match one character). If pattern is NULL, no filtering is done and all results are returned. Subdirectories are permitted, and are specified with a path separator of @\/@. Wildcard characters @*@ and @?@ never match a path separator.
+--
+--     @flags@ may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching case-insensitive.
+--
+--     The returned array is always NULL-terminated, for your iterating convenience, but if @count@ is non-NULL, on return it will contain the number of items in the array, not counting the NULL terminator.
+--
+--     [Returns]: an array of strings on success or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GlobDirectory@, defined at @SDL3\/SDL_filesystem.h 506:37@
+sDL_GlobDirectory
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pattern@]: the pattern that files in the directory must match. Can be NULL.
+  -> SDL_GlobFlags
+  -- ^
+  --
+  --           [@flags@]: @SDL_GLOB_*@ bitflags that affect this search.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: on return, will be set to the number of items in the returned array. Can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+sDL_GlobDirectory = hs_bindgen_fb5d363e95cc2777
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GetCurrentDirectory@
+foreign import ccall safe "hs_bindgen_1c738c64af33b51a"
+  hs_bindgen_1c738c64af33b51a_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Safe_SDL_GetCurrentDirectory@
+hs_bindgen_1c738c64af33b51a :: IO (BG.Ptr BG.CChar)
+hs_bindgen_1c738c64af33b51a =
+  BG.fromFFIType hs_bindgen_1c738c64af33b51a_base
+
+-- | Get what the system believes is the \"current working directory.\"
+--
+--     For systems without a concept of a current working directory, this will still attempt to provide something reasonable.
+--
+--     SDL does not provide a means to /change/ the current working directory; for platforms without this concept, this would cause surprises with file access outside of SDL.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: a UTF-8 string of the current working directory in platform-dependent notation. NULL if there\'s a problem. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentDirectory@, defined at @SDL3\/SDL_filesystem.h 529:36@
+sDL_GetCurrentDirectory :: IO (BG.Ptr BG.CChar)
+sDL_GetCurrentDirectory = hs_bindgen_1c738c64af33b51a
diff --git a/src/SDL3/Sys/Bindgen/Filesystem/Unsafe.hs b/src/SDL3/Sys/Bindgen/Filesystem/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Filesystem/Unsafe.hs
@@ -0,0 +1,543 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Filesystem.Unsafe (
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_GetBasePath,
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_GetPrefPath,
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_GetUserFolder,
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_CreateDirectory,
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_EnumerateDirectory,
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_RemovePath,
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_RenamePath,
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_CopyFile,
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_GetPathInfo,
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_GlobDirectory,
+  SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_GetCurrentDirectory,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Filesystem
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_filesystem.h>"
+         , "char const *hs_bindgen_f982860586cddc48 (void)"
+         , "{"
+         , "  return (SDL_GetBasePath)();"
+         , "}"
+         , "char *hs_bindgen_207e183641556ba0 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPrefPath)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_1e54016bd792c622 ("
+         , "  SDL_Folder arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetUserFolder)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_3d4b267fb1966244 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateDirectory)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_2cd5a0aba8d0a754 ("
+         , "  char const *arg1,"
+         , "  SDL_EnumerateDirectoryCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_EnumerateDirectory)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_768df4cf2a845ec6 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RemovePath)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8e887e0ab35ae63b ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RenamePath)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_936ea99b7b61f849 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CopyFile)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_6d818186cbd1c026 ("
+         , "  char const *arg1,"
+         , "  SDL_PathInfo *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPathInfo)(arg1, arg2);"
+         , "}"
+         , "char **hs_bindgen_9478904045755e53 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_GlobFlags arg3,"
+         , "  signed int *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GlobDirectory)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "char *hs_bindgen_74e4e1cd3e20672c (void)"
+         , "{"
+         , "  return (SDL_GetCurrentDirectory)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GetBasePath@
+foreign import ccall unsafe "hs_bindgen_f982860586cddc48"
+  hs_bindgen_f982860586cddc48_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GetBasePath@
+hs_bindgen_f982860586cddc48 :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_f982860586cddc48 =
+  BG.fromFFIType hs_bindgen_f982860586cddc48_base
+
+-- | [C declaration]: @SDL_GetBasePath@, defined at @SDL3\/SDL_filesystem.h 101:42@
+sDL_GetBasePath :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetBasePath = hs_bindgen_f982860586cddc48
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GetPrefPath@
+foreign import ccall unsafe "hs_bindgen_207e183641556ba0"
+  hs_bindgen_207e183641556ba0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GetPrefPath@
+hs_bindgen_207e183641556ba0
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_207e183641556ba0 =
+  BG.fromFFIType hs_bindgen_207e183641556ba0_base
+
+-- | Get the user-and-app-specific path where files can be written.
+--
+--     Get the \"pref dir\". This is meant to be where users can write personal files (preferences and save games, etc) that are specific to your application. This directory is unique per user, per application.
+--
+--     This function will decide the appropriate location in the native filesystem, create the directory if necessary, and return a string of the absolute path to the directory in UTF-8 encoding.
+--
+--     On Windows, the string might look like:
+--
+--     @C:\\\\Users\\\\bob\\\\AppData\\\\Roaming\\\\My Company\\\\My Program Name\\\\@
+--
+--     On Linux, the string might look like:
+--
+--     @\/home\/bob\/.local\/share\/My Program Name\/@
+--
+--     On macOS, the string might look like:
+--
+--     @\/Users\/bob\/Library\/Application Support\/My Program Name\/@
+--
+--     You should assume the path returned by this function is the only safe place to write files (and that @SDL_GetBasePath()@, while it might be writable, or even the parent of the returned path, isn\'t where you should be writing things).
+--
+--     Both the org and app strings may become part of a directory name, so please follow these rules:
+--
+--     * Try to use the same org string (/including case-sensitivity/) for all your applications that use this function.
+--
+--     * Always use a unique app string for each one, and make sure it never changes for an app once you\'ve decided on it.
+--
+--     * Unicode characters are legal, as long as they are UTF-8 encoded, but...
+--
+--     * ...only use letters, numbers, and spaces. Avoid punctuation like \"Game Name 2: Bad Guy\'s Revenge!\" ... \"Game Name 2\" is sufficient.
+--
+--     Due to historical mistakes, @org@ is allowed to be NULL or \"\". In such cases, SDL will omit the org subdirectory, including on platforms where it shouldn\'t, and including on platforms where this would make your app fail certification for an app store. New apps should definitely specify a real string for @org@.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: a UTF-8 string of the user directory in platform-dependent notation. NULL if there\'s a problem (creating directory failed, etc.). This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetBasePath'
+--
+--     [C declaration]: @SDL_GetPrefPath@, defined at @SDL3\/SDL_filesystem.h 164:36@
+sDL_GetPrefPath
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@org@]: the name of your organization.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@app@]: the name of your application.
+  -> IO (BG.Ptr BG.CChar)
+sDL_GetPrefPath = hs_bindgen_207e183641556ba0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GetUserFolder@
+foreign import ccall unsafe "hs_bindgen_1e54016bd792c622"
+  hs_bindgen_1e54016bd792c622_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GetUserFolder@
+hs_bindgen_1e54016bd792c622
+  :: SDL_Folder
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_1e54016bd792c622 =
+  BG.fromFFIType hs_bindgen_1e54016bd792c622_base
+
+-- | Finds the most suitable user folder for a specific purpose.
+--
+--     Many OSes provide certain standard folders for certain purposes, such as storing pictures, music or videos for a certain user. This function gives the path for many of those special locations.
+--
+--     This function is specifically for /user/ folders, which are meant for the user to access and manage. For application-specific folders, meant to hold data for the application to manage, see @SDL_GetBasePath()@ and @SDL_GetPrefPath()@.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     If NULL is returned, the error may be obtained with SDL_GetError().
+--
+--     [Returns]: either a null-terminated C string containing the full path to the folder, or NULL if an error happened.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetUserFolder@, defined at @SDL3\/SDL_filesystem.h 236:42@
+sDL_GetUserFolder
+  :: SDL_Folder
+  -- ^
+  --
+  --           [@folder@]: the type of folder to find.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetUserFolder = hs_bindgen_1e54016bd792c622
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_CreateDirectory@
+foreign import ccall unsafe "hs_bindgen_3d4b267fb1966244"
+  hs_bindgen_3d4b267fb1966244_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_CreateDirectory@
+hs_bindgen_3d4b267fb1966244
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_3d4b267fb1966244 =
+  BG.fromFFIType hs_bindgen_3d4b267fb1966244_base
+
+-- | Create a directory, and any missing parent directories.
+--
+--     This reports success if @path@ already exists as a directory.
+--
+--     If parent directories are missing, it will also create them. Note that if this fails, it will not remove any parent directories it already made.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CreateDirectory@, defined at @SDL3\/SDL_filesystem.h 304:34@
+sDL_CreateDirectory
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to create.
+  -> IO BG.CBool
+sDL_CreateDirectory = hs_bindgen_3d4b267fb1966244
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_EnumerateDirectory@
+foreign import ccall unsafe "hs_bindgen_2cd5a0aba8d0a754"
+  hs_bindgen_2cd5a0aba8d0a754_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_EnumerateDirectory@
+hs_bindgen_2cd5a0aba8d0a754
+  :: PtrConst.PtrConst BG.CChar
+  -> SDL_EnumerateDirectoryCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_2cd5a0aba8d0a754 =
+  BG.fromFFIType hs_bindgen_2cd5a0aba8d0a754_base
+
+-- | Enumerate a directory through a callback function.
+--
+--     This function provides every directory entry through an app-provided callback, called once for each directory entry, until all results have been provided or the callback returns either SDL_ENUM_SUCCESS or SDL_ENUM_FAILURE.
+--
+--     This will return false if there was a system problem in general, or if a callback returns SDL_ENUM_FAILURE. A successful return means a callback returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries were enumerated.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EnumerateDirectory@, defined at @SDL3\/SDL_filesystem.h 369:34@
+sDL_EnumerateDirectory
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> SDL_EnumerateDirectoryCallback
+  -- ^
+  --
+  --           [@callback@]: a function that is called for each entry in the directory.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO BG.CBool
+sDL_EnumerateDirectory = hs_bindgen_2cd5a0aba8d0a754
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_RemovePath@
+foreign import ccall unsafe "hs_bindgen_768df4cf2a845ec6"
+  hs_bindgen_768df4cf2a845ec6_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_RemovePath@
+hs_bindgen_768df4cf2a845ec6
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_768df4cf2a845ec6 =
+  BG.fromFFIType hs_bindgen_768df4cf2a845ec6_base
+
+-- | Remove a file or an empty directory.
+--
+--     Directories that are not empty will fail; this function will not recursely delete directory trees.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RemovePath@, defined at @SDL3\/SDL_filesystem.h 385:34@
+sDL_RemovePath
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to remove from the filesystem.
+  -> IO BG.CBool
+sDL_RemovePath = hs_bindgen_768df4cf2a845ec6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_RenamePath@
+foreign import ccall unsafe "hs_bindgen_8e887e0ab35ae63b"
+  hs_bindgen_8e887e0ab35ae63b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_RenamePath@
+hs_bindgen_8e887e0ab35ae63b
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_8e887e0ab35ae63b =
+  BG.fromFFIType hs_bindgen_8e887e0ab35ae63b_base
+
+-- | Rename a file or directory.
+--
+--     If the file at @newpath@ already exists, it will be replaced.
+--
+--     Note that this will not copy files across filesystems\/drives\/volumes, as that is a much more complicated (and possibly time-consuming) operation.
+--
+--     Which is to say, if this function fails, @SDL_CopyFile()@ to a temporary file in the same directory as @newpath@, then @SDL_RenamePath()@ from the temporary file to @newpath@ and @SDL_RemovePath()@ on @oldpath@ might work for files. Renaming a non-empty directory across filesystems is dramatically more complex, however.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RenamePath@, defined at @SDL3\/SDL_filesystem.h 410:34@
+sDL_RenamePath
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO BG.CBool
+sDL_RenamePath = hs_bindgen_8e887e0ab35ae63b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_CopyFile@
+foreign import ccall unsafe "hs_bindgen_936ea99b7b61f849"
+  hs_bindgen_936ea99b7b61f849_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_CopyFile@
+hs_bindgen_936ea99b7b61f849
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_936ea99b7b61f849 =
+  BG.fromFFIType hs_bindgen_936ea99b7b61f849_base
+
+-- | Copy a file.
+--
+--     If the file at @newpath@ already exists, it will be overwritten with the contents of the file at @oldpath@.
+--
+--     This function will block until the copy is complete, which might be a significant time for large files on slow disks. On some platforms, the copy can be handed off to the OS itself, but on others SDL might just open both paths, and read from one and write to the other.
+--
+--     Note that this is not an atomic operation! If something tries to read from @newpath@ while the copy is in progress, it will see an incomplete copy of the data, and if the calling thread terminates (or the power goes out) during the copy, @newpath@ \'s previous contents will be gone, replaced with an incomplete copy of the data. To avoid this risk, it is recommended that the app copy to a temporary file in the same directory as @newpath@, and if the copy is successful, use @SDL_RenamePath()@ to replace @newpath@ with the temporary file. This will ensure that reads of @newpath@ will either see a complete copy of the data, or it will see the pre-copy state of @newpath@.
+--
+--     This function attempts to synchronize the newly-copied data to disk before returning, if the platform allows it, so that the renaming trick will not have a problem in a system crash or power failure, where the file could be renamed but the contents never made it from the system file cache to the physical disk.
+--
+--     If the copy fails for any reason, the state of @newpath@ is undefined. It might be half a copy, it might be the untouched data of what was already there, or it might be a zero-byte file, etc.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but this operation is not atomic, so the app might need to protect access to specific paths from other threads if appropriate.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyFile@, defined at @SDL3\/SDL_filesystem.h 454:34@
+sDL_CopyFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO BG.CBool
+sDL_CopyFile = hs_bindgen_936ea99b7b61f849
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GetPathInfo@
+foreign import ccall unsafe "hs_bindgen_6d818186cbd1c026"
+  hs_bindgen_6d818186cbd1c026_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GetPathInfo@
+hs_bindgen_6d818186cbd1c026
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL_PathInfo
+  -> IO BG.CBool
+hs_bindgen_6d818186cbd1c026 =
+  BG.fromFFIType hs_bindgen_6d818186cbd1c026_base
+
+-- | Get information about a filesystem path.
+--
+--     Symlinks, on filesystems that support them, are always followed, so you will always get information on what the symlink eventually points to, and not the symlink itself.
+--
+--     [Returns]: true on success or false if the file doesn\'t exist, or another failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPathInfo@, defined at @SDL3\/SDL_filesystem.h 473:34@
+sDL_GetPathInfo
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to query.
+  -> BG.Ptr SDL_PathInfo
+  -- ^
+  --
+  --           [@info@]: a pointer filled in with information about the path, or NULL to check for the existence of a file.
+  -> IO BG.CBool
+sDL_GetPathInfo = hs_bindgen_6d818186cbd1c026
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GlobDirectory@
+foreign import ccall unsafe "hs_bindgen_9478904045755e53"
+  hs_bindgen_9478904045755e53_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GlobDirectory@
+hs_bindgen_9478904045755e53
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL_GlobFlags
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+hs_bindgen_9478904045755e53 =
+  BG.fromFFIType hs_bindgen_9478904045755e53_base
+
+-- | Enumerate a directory tree, filtered by pattern, and return a list.
+--
+--     Files are filtered out if they don\'t match the string in @pattern@, which may contain wildcard characters @*@ (match everything) and @?@ (match one character). If pattern is NULL, no filtering is done and all results are returned. Subdirectories are permitted, and are specified with a path separator of @\/@. Wildcard characters @*@ and @?@ never match a path separator.
+--
+--     @flags@ may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching case-insensitive.
+--
+--     The returned array is always NULL-terminated, for your iterating convenience, but if @count@ is non-NULL, on return it will contain the number of items in the array, not counting the NULL terminator.
+--
+--     [Returns]: an array of strings on success or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GlobDirectory@, defined at @SDL3\/SDL_filesystem.h 506:37@
+sDL_GlobDirectory
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pattern@]: the pattern that files in the directory must match. Can be NULL.
+  -> SDL_GlobFlags
+  -- ^
+  --
+  --           [@flags@]: @SDL_GLOB_*@ bitflags that affect this search.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: on return, will be set to the number of items in the returned array. Can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+sDL_GlobDirectory = hs_bindgen_9478904045755e53
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GetCurrentDirectory@
+foreign import ccall unsafe "hs_bindgen_74e4e1cd3e20672c"
+  hs_bindgen_74e4e1cd3e20672c_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Filesystem_Unsafe_SDL_GetCurrentDirectory@
+hs_bindgen_74e4e1cd3e20672c :: IO (BG.Ptr BG.CChar)
+hs_bindgen_74e4e1cd3e20672c =
+  BG.fromFFIType hs_bindgen_74e4e1cd3e20672c_base
+
+-- | Get what the system believes is the \"current working directory.\"
+--
+--     For systems without a concept of a current working directory, this will still attempt to provide something reasonable.
+--
+--     SDL does not provide a means to /change/ the current working directory; for platforms without this concept, this would cause surprises with file access outside of SDL.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: a UTF-8 string of the current working directory in platform-dependent notation. NULL if there\'s a problem. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentDirectory@, defined at @SDL3\/SDL_filesystem.h 529:36@
+sDL_GetCurrentDirectory :: IO (BG.Ptr BG.CChar)
+sDL_GetCurrentDirectory = hs_bindgen_74e4e1cd3e20672c
diff --git a/src/SDL3/Sys/Bindgen/Gamepad.hs b/src/SDL3/Sys/Bindgen/Gamepad.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Gamepad.hs
@@ -0,0 +1,1635 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL provides a low-level joystick API, which just treats joysticks as an arbitrary pile of buttons, axes, and hat switches. If you\'re planning to write your own control configuration screen, this can give you a lot of flexibility, but that\'s a lot of work, and most things that we consider \"joysticks\" now are actually console-style gamepads. So SDL provides the gamepad API on top of the lower-level joystick functionality.
+--
+--     The difference between a joystick and a gamepad is that a gamepad tells you /where/ a button or axis is on the device. You don\'t speak to gamepads in terms of arbitrary numbers like \"button 3\" or \"axis 2\" but in standard locations: the d-pad, the shoulder buttons, triggers, A\/B\/X\/Y (or X\/O\/Square\/Triangle, if you will).
+--
+--     One turns a joystick into a gamepad by providing a magic configuration string, which tells SDL the details of a specific device: when you see this specific hardware, if button 2 gets pressed, this is actually D-Pad Up, etc.
+--
+--     SDL has many popular controllers configured out of the box, and users can add their own controller details through an environment variable if it\'s otherwise unknown to SDL.
+--
+--     In order to use these functions, SDL_Init() must have been called with the SDL_INIT_GAMEPAD flag. This causes SDL to scan the system for gamepads, and load appropriate drivers.
+--
+--     If you\'re using SDL gamepad support in a Steam game, you must call SteamAPI_InitEx() before calling SDL_Init().
+--
+--     If you would like to receive gamepad updates while the application is in the background, you should set the following hint before calling SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
+--
+--     Gamepads support various optional features such as rumble, color LEDs, touchpad, gyro, etc. The support for these features varies depending on the controller and OS support available. You can check for LED and rumble capabilities at runtime by calling @SDL_GetGamepadProperties()@ and checking the various capability properties. You can check for touchpad by calling @SDL_GetNumGamepadTouchpads()@ and check for gyro and accelerometer by calling @SDL_GamepadHasSensor()@.
+--
+--     By default SDL will try to use the most capable driver available, but you can tune which OS drivers to use with the various joystick hints in SDL_hints.h.
+--
+--     Your application should always support gamepad hotplugging. On some platforms like Xbox, Steam Deck, etc., this is a requirement for certification. On other platforms, like macOS and Windows when using Windows.Gaming.Input, controllers may not be available at startup and will come in at some point after you\'ve started processing events. The structure used to identify an SDL gamepad
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Gamepad (
+  SDL3.Sys.Bindgen.Gamepad.SDL_Gamepad,
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadType (..),
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_STANDARD,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_XBOX360,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_XBOXONE,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_PS3,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_PS4,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_PS5,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_GAMECUBE,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_TYPE_COUNT,
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadButton (..),
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_INVALID,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_SOUTH,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_EAST,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_WEST,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_NORTH,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_BACK,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_GUIDE,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_START,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LEFT_STICK,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_RIGHT_STICK,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LEFT_SHOULDER,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_DPAD_UP,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_DPAD_DOWN,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_DPAD_LEFT,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_DPAD_RIGHT,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_MISC1,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LEFT_PADDLE1,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LEFT_PADDLE2,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_TOUCHPAD,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_MISC2,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_MISC3,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_MISC4,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_MISC5,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_MISC6,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_COUNT,
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadButtonLabel (..),
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LABEL_A,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LABEL_B,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LABEL_X,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LABEL_Y,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LABEL_CROSS,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LABEL_CIRCLE,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LABEL_SQUARE,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE,
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadAxis (..),
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_AXIS_INVALID,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_AXIS_LEFTX,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_AXIS_LEFTY,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_AXIS_RIGHTX,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_AXIS_RIGHTY,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_AXIS_LEFT_TRIGGER,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_AXIS_RIGHT_TRIGGER,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_AXIS_COUNT,
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadBindingType (..),
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BINDTYPE_NONE,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BINDTYPE_BUTTON,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BINDTYPE_AXIS,
+  pattern SDL3.Sys.Bindgen.Gamepad.SDL_GAMEPAD_BINDTYPE_HAT,
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadBinding_input_axis (..),
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadBinding_input_hat (..),
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadBinding_input (..),
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadBinding_output_axis (..),
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadBinding_output (..),
+  SDL3.Sys.Bindgen.Gamepad.SDL_GamepadBinding (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import HsBindgen.Runtime.Union qualified as Union
+
+-- | [C declaration]: @struct SDL_Gamepad@, defined at @SDL3\/SDL_gamepad.h 100:16@
+data SDL_Gamepad
+
+-- | Standard gamepad types.
+--
+--     This type does not necessarily map to first-party controllers from Microsoft\/Sony\/Nintendo; in many cases, third-party controllers can report as these, either because they were designed for a specific console, or they simply most closely match that console\'s controllers (does it have A\/B\/X\/Y buttons or X\/O\/Square\/Triangle? Does it have a touchpad? etc).
+--
+--     [C declaration]: @enum SDL_GamepadType@, defined at @SDL3\/SDL_gamepad.h 111:14@
+newtype SDL_GamepadType = SDL_GamepadType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GamepadType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GamepadType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GamepadType instance BG.Storable SDL_GamepadType
+
+deriving via BG.CUInt instance BG.Prim SDL_GamepadType
+
+instance CEnum.CEnum SDL_GamepadType where
+  type CEnumZ SDL_GamepadType = BG.CUInt
+
+  toCEnum = SDL_GamepadType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GAMEPAD_TYPE_UNKNOWN")
+        , (1, BG.singleton "SDL_GAMEPAD_TYPE_STANDARD")
+        , (2, BG.singleton "SDL_GAMEPAD_TYPE_XBOX360")
+        , (3, BG.singleton "SDL_GAMEPAD_TYPE_XBOXONE")
+        , (4, BG.singleton "SDL_GAMEPAD_TYPE_PS3")
+        , (5, BG.singleton "SDL_GAMEPAD_TYPE_PS4")
+        , (6, BG.singleton "SDL_GAMEPAD_TYPE_PS5")
+        , (7, BG.singleton "SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO")
+        , (8, BG.singleton "SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT")
+        , (9, BG.singleton "SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT")
+        , (10, BG.singleton "SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR")
+        , (11, BG.singleton "SDL_GAMEPAD_TYPE_GAMECUBE")
+        , (12, BG.singleton "SDL_GAMEPAD_TYPE_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GamepadType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GamepadType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GamepadType where
+  minDeclaredValue = SDL_GAMEPAD_TYPE_UNKNOWN
+
+  maxDeclaredValue = SDL_GAMEPAD_TYPE_COUNT
+
+instance Show SDL_GamepadType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GamepadType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GamepadType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GamepadType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GamepadType "unwrap" where
+  type CFieldType SDL_GamepadType "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_UNKNOWN@, defined at @SDL3\/SDL_gamepad.h 113:5@
+pattern SDL_GAMEPAD_TYPE_UNKNOWN :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_UNKNOWN = SDL_GamepadType 0
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_STANDARD@, defined at @SDL3\/SDL_gamepad.h 114:5@
+pattern SDL_GAMEPAD_TYPE_STANDARD :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_STANDARD = SDL_GamepadType 1
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_XBOX360@, defined at @SDL3\/SDL_gamepad.h 115:5@
+pattern SDL_GAMEPAD_TYPE_XBOX360 :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_XBOX360 = SDL_GamepadType 2
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_XBOXONE@, defined at @SDL3\/SDL_gamepad.h 116:5@
+pattern SDL_GAMEPAD_TYPE_XBOXONE :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_XBOXONE = SDL_GamepadType 3
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_PS3@, defined at @SDL3\/SDL_gamepad.h 117:5@
+pattern SDL_GAMEPAD_TYPE_PS3 :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_PS3 = SDL_GamepadType 4
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_PS4@, defined at @SDL3\/SDL_gamepad.h 118:5@
+pattern SDL_GAMEPAD_TYPE_PS4 :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_PS4 = SDL_GamepadType 5
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_PS5@, defined at @SDL3\/SDL_gamepad.h 119:5@
+pattern SDL_GAMEPAD_TYPE_PS5 :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_PS5 = SDL_GamepadType 6
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO@, defined at @SDL3\/SDL_gamepad.h 120:5@
+pattern SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_PRO = SDL_GamepadType 7
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT@, defined at @SDL3\/SDL_gamepad.h 121:5@
+pattern SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_LEFT = SDL_GamepadType 8
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT@, defined at @SDL3\/SDL_gamepad.h 122:5@
+pattern SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_RIGHT = SDL_GamepadType 9
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR@, defined at @SDL3\/SDL_gamepad.h 123:5@
+pattern SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_NINTENDO_SWITCH_JOYCON_PAIR = SDL_GamepadType 10
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_GAMECUBE@, defined at @SDL3\/SDL_gamepad.h 124:5@
+pattern SDL_GAMEPAD_TYPE_GAMECUBE :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_GAMECUBE = SDL_GamepadType 11
+
+-- | [C declaration]: @SDL_GAMEPAD_TYPE_COUNT@, defined at @SDL3\/SDL_gamepad.h 125:5@
+pattern SDL_GAMEPAD_TYPE_COUNT :: SDL_GamepadType
+pattern SDL_GAMEPAD_TYPE_COUNT = SDL_GamepadType 12
+
+-- | The list of buttons available on a gamepad
+--
+--     For controllers that use a diamond pattern for the face buttons, the south\/east\/west\/north buttons below correspond to the locations in the diamond pattern. For Xbox controllers, this would be A\/B\/X\/Y, for Nintendo Switch controllers, this would be B\/A\/Y\/X, for GameCube controllers this would be A\/X\/B\/Y, for PlayStation controllers this would be Cross\/Circle\/Square\/Triangle.
+--
+--     For controllers that don\'t use a diamond pattern for the face buttons, the south\/east\/west\/north buttons indicate the buttons labeled A, B, C, D, or 1, 2, 3, 4, or for controllers that aren\'t labeled, they are the primary, secondary, etc. buttons.
+--
+--     The activate action is often the south button and the cancel action is often the east button, but in some regions this is reversed, so your game should allow remapping actions based on user preferences.
+--
+--     You can query the labels for the face buttons using @SDL_GetGamepadButtonLabel()@
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_GamepadButton@, defined at @SDL3\/SDL_gamepad.h 152:14@
+newtype SDL_GamepadButton = SDL_GamepadButton
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GamepadButton where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadButton where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadButton
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GamepadButton where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadButton unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GamepadButton instance BG.Storable SDL_GamepadButton
+
+deriving via BG.CInt instance BG.Prim SDL_GamepadButton
+
+instance CEnum.CEnum SDL_GamepadButton where
+  type CEnumZ SDL_GamepadButton = BG.CInt
+
+  toCEnum = SDL_GamepadButton
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_GAMEPAD_BUTTON_INVALID")
+        , (0, BG.singleton "SDL_GAMEPAD_BUTTON_SOUTH")
+        , (1, BG.singleton "SDL_GAMEPAD_BUTTON_EAST")
+        , (2, BG.singleton "SDL_GAMEPAD_BUTTON_WEST")
+        , (3, BG.singleton "SDL_GAMEPAD_BUTTON_NORTH")
+        , (4, BG.singleton "SDL_GAMEPAD_BUTTON_BACK")
+        , (5, BG.singleton "SDL_GAMEPAD_BUTTON_GUIDE")
+        , (6, BG.singleton "SDL_GAMEPAD_BUTTON_START")
+        , (7, BG.singleton "SDL_GAMEPAD_BUTTON_LEFT_STICK")
+        , (8, BG.singleton "SDL_GAMEPAD_BUTTON_RIGHT_STICK")
+        , (9, BG.singleton "SDL_GAMEPAD_BUTTON_LEFT_SHOULDER")
+        , (10, BG.singleton "SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER")
+        , (11, BG.singleton "SDL_GAMEPAD_BUTTON_DPAD_UP")
+        , (12, BG.singleton "SDL_GAMEPAD_BUTTON_DPAD_DOWN")
+        , (13, BG.singleton "SDL_GAMEPAD_BUTTON_DPAD_LEFT")
+        , (14, BG.singleton "SDL_GAMEPAD_BUTTON_DPAD_RIGHT")
+        , (15, BG.singleton "SDL_GAMEPAD_BUTTON_MISC1")
+        , (16, BG.singleton "SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1")
+        , (17, BG.singleton "SDL_GAMEPAD_BUTTON_LEFT_PADDLE1")
+        , (18, BG.singleton "SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2")
+        , (19, BG.singleton "SDL_GAMEPAD_BUTTON_LEFT_PADDLE2")
+        , (20, BG.singleton "SDL_GAMEPAD_BUTTON_TOUCHPAD")
+        , (21, BG.singleton "SDL_GAMEPAD_BUTTON_MISC2")
+        , (22, BG.singleton "SDL_GAMEPAD_BUTTON_MISC3")
+        , (23, BG.singleton "SDL_GAMEPAD_BUTTON_MISC4")
+        , (24, BG.singleton "SDL_GAMEPAD_BUTTON_MISC5")
+        , (25, BG.singleton "SDL_GAMEPAD_BUTTON_MISC6")
+        , (26, BG.singleton "SDL_GAMEPAD_BUTTON_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GamepadButton"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GamepadButton"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GamepadButton where
+  minDeclaredValue = SDL_GAMEPAD_BUTTON_INVALID
+
+  maxDeclaredValue = SDL_GAMEPAD_BUTTON_COUNT
+
+instance Show SDL_GamepadButton where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GamepadButton where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GamepadButton ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadButton{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GamepadButton) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GamepadButton "unwrap" where
+  type CFieldType SDL_GamepadButton "unwrap" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_INVALID@, defined at @SDL3\/SDL_gamepad.h 154:5@
+pattern SDL_GAMEPAD_BUTTON_INVALID :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_INVALID = SDL_GamepadButton (-1)
+
+-- | Bottom face button (e.g. Xbox A button)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_SOUTH@, defined at @SDL3\/SDL_gamepad.h 155:5@
+pattern SDL_GAMEPAD_BUTTON_SOUTH :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_SOUTH = SDL_GamepadButton 0
+
+-- | Right face button (e.g. Xbox B button)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_EAST@, defined at @SDL3\/SDL_gamepad.h 156:5@
+pattern SDL_GAMEPAD_BUTTON_EAST :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_EAST = SDL_GamepadButton 1
+
+-- | Left face button (e.g. Xbox X button)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_WEST@, defined at @SDL3\/SDL_gamepad.h 157:5@
+pattern SDL_GAMEPAD_BUTTON_WEST :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_WEST = SDL_GamepadButton 2
+
+-- | Top face button (e.g. Xbox Y button)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_NORTH@, defined at @SDL3\/SDL_gamepad.h 158:5@
+pattern SDL_GAMEPAD_BUTTON_NORTH :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_NORTH = SDL_GamepadButton 3
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_BACK@, defined at @SDL3\/SDL_gamepad.h 159:5@
+pattern SDL_GAMEPAD_BUTTON_BACK :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_BACK = SDL_GamepadButton 4
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_GUIDE@, defined at @SDL3\/SDL_gamepad.h 160:5@
+pattern SDL_GAMEPAD_BUTTON_GUIDE :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_GUIDE = SDL_GamepadButton 5
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_START@, defined at @SDL3\/SDL_gamepad.h 161:5@
+pattern SDL_GAMEPAD_BUTTON_START :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_START = SDL_GamepadButton 6
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LEFT_STICK@, defined at @SDL3\/SDL_gamepad.h 162:5@
+pattern SDL_GAMEPAD_BUTTON_LEFT_STICK :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_LEFT_STICK = SDL_GamepadButton 7
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_RIGHT_STICK@, defined at @SDL3\/SDL_gamepad.h 163:5@
+pattern SDL_GAMEPAD_BUTTON_RIGHT_STICK :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_RIGHT_STICK = SDL_GamepadButton 8
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LEFT_SHOULDER@, defined at @SDL3\/SDL_gamepad.h 164:5@
+pattern SDL_GAMEPAD_BUTTON_LEFT_SHOULDER :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_LEFT_SHOULDER = SDL_GamepadButton 9
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER@, defined at @SDL3\/SDL_gamepad.h 165:5@
+pattern SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_RIGHT_SHOULDER = SDL_GamepadButton 10
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_DPAD_UP@, defined at @SDL3\/SDL_gamepad.h 166:5@
+pattern SDL_GAMEPAD_BUTTON_DPAD_UP :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_DPAD_UP = SDL_GamepadButton 11
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_DPAD_DOWN@, defined at @SDL3\/SDL_gamepad.h 167:5@
+pattern SDL_GAMEPAD_BUTTON_DPAD_DOWN :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_DPAD_DOWN = SDL_GamepadButton 12
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_DPAD_LEFT@, defined at @SDL3\/SDL_gamepad.h 168:5@
+pattern SDL_GAMEPAD_BUTTON_DPAD_LEFT :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_DPAD_LEFT = SDL_GamepadButton 13
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_DPAD_RIGHT@, defined at @SDL3\/SDL_gamepad.h 169:5@
+pattern SDL_GAMEPAD_BUTTON_DPAD_RIGHT :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_DPAD_RIGHT = SDL_GamepadButton 14
+
+-- | Additional button (e.g. Xbox Series X share button, PS5 microphone button, Nintendo Switch Pro capture button, Amazon Luna microphone button, Google Stadia capture button)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_MISC1@, defined at @SDL3\/SDL_gamepad.h 170:5@
+pattern SDL_GAMEPAD_BUTTON_MISC1 :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_MISC1 = SDL_GamepadButton 15
+
+-- | Upper or primary paddle, under your right hand (e.g. Xbox Elite paddle P1, DualSense Edge RB button, Right Joy-Con SR button)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1@, defined at @SDL3\/SDL_gamepad.h 171:5@
+pattern SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1 :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_RIGHT_PADDLE1 = SDL_GamepadButton 16
+
+-- | Upper or primary paddle, under your left hand (e.g. Xbox Elite paddle P3, DualSense Edge LB button, Left Joy-Con SL button)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_LEFT_PADDLE1@, defined at @SDL3\/SDL_gamepad.h 172:5@
+pattern SDL_GAMEPAD_BUTTON_LEFT_PADDLE1 :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_LEFT_PADDLE1 = SDL_GamepadButton 17
+
+-- | Lower or secondary paddle, under your right hand (e.g. Xbox Elite paddle P2, DualSense Edge right Fn button, Right Joy-Con SL button)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2@, defined at @SDL3\/SDL_gamepad.h 173:5@
+pattern SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2 :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_RIGHT_PADDLE2 = SDL_GamepadButton 18
+
+-- | Lower or secondary paddle, under your left hand (e.g. Xbox Elite paddle P4, DualSense Edge left Fn button, Left Joy-Con SR button)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_LEFT_PADDLE2@, defined at @SDL3\/SDL_gamepad.h 174:5@
+pattern SDL_GAMEPAD_BUTTON_LEFT_PADDLE2 :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_LEFT_PADDLE2 = SDL_GamepadButton 19
+
+-- | PS4\/PS5 touchpad button
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_TOUCHPAD@, defined at @SDL3\/SDL_gamepad.h 175:5@
+pattern SDL_GAMEPAD_BUTTON_TOUCHPAD :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_TOUCHPAD = SDL_GamepadButton 20
+
+-- | Additional button
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_MISC2@, defined at @SDL3\/SDL_gamepad.h 176:5@
+pattern SDL_GAMEPAD_BUTTON_MISC2 :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_MISC2 = SDL_GamepadButton 21
+
+-- | Additional button (e.g. Nintendo GameCube left trigger click)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_MISC3@, defined at @SDL3\/SDL_gamepad.h 177:5@
+pattern SDL_GAMEPAD_BUTTON_MISC3 :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_MISC3 = SDL_GamepadButton 22
+
+-- | Additional button (e.g. Nintendo GameCube right trigger click)
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_MISC4@, defined at @SDL3\/SDL_gamepad.h 178:5@
+pattern SDL_GAMEPAD_BUTTON_MISC4 :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_MISC4 = SDL_GamepadButton 23
+
+-- | Additional button
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_MISC5@, defined at @SDL3\/SDL_gamepad.h 179:5@
+pattern SDL_GAMEPAD_BUTTON_MISC5 :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_MISC5 = SDL_GamepadButton 24
+
+-- | Additional button
+--
+--     [C declaration]: @SDL_GAMEPAD_BUTTON_MISC6@, defined at @SDL3\/SDL_gamepad.h 180:5@
+pattern SDL_GAMEPAD_BUTTON_MISC6 :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_MISC6 = SDL_GamepadButton 25
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_COUNT@, defined at @SDL3\/SDL_gamepad.h 181:5@
+pattern SDL_GAMEPAD_BUTTON_COUNT :: SDL_GamepadButton
+pattern SDL_GAMEPAD_BUTTON_COUNT = SDL_GamepadButton 26
+
+-- | The set of gamepad button labels
+--
+--     This isn\'t a complete set, just the face buttons to make it easy to show button prompts.
+--
+--     For a complete set, you should look at the button and gamepad type and have a set of symbols that work well with your art style.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_GamepadButtonLabel@, defined at @SDL3\/SDL_gamepad.h 195:14@
+newtype SDL_GamepadButtonLabel = SDL_GamepadButtonLabel
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GamepadButtonLabel where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadButtonLabel where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadButtonLabel
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GamepadButtonLabel where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadButtonLabel unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadButtonLabel
+  instance
+    BG.Storable SDL_GamepadButtonLabel
+
+deriving via BG.CUInt instance BG.Prim SDL_GamepadButtonLabel
+
+instance CEnum.CEnum SDL_GamepadButtonLabel where
+  type CEnumZ SDL_GamepadButtonLabel = BG.CUInt
+
+  toCEnum = SDL_GamepadButtonLabel
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN")
+        , (1, BG.singleton "SDL_GAMEPAD_BUTTON_LABEL_A")
+        , (2, BG.singleton "SDL_GAMEPAD_BUTTON_LABEL_B")
+        , (3, BG.singleton "SDL_GAMEPAD_BUTTON_LABEL_X")
+        , (4, BG.singleton "SDL_GAMEPAD_BUTTON_LABEL_Y")
+        , (5, BG.singleton "SDL_GAMEPAD_BUTTON_LABEL_CROSS")
+        , (6, BG.singleton "SDL_GAMEPAD_BUTTON_LABEL_CIRCLE")
+        , (7, BG.singleton "SDL_GAMEPAD_BUTTON_LABEL_SQUARE")
+        , (8, BG.singleton "SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GamepadButtonLabel"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GamepadButtonLabel"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GamepadButtonLabel where
+  minDeclaredValue = SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN
+
+  maxDeclaredValue = SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE
+
+instance Show SDL_GamepadButtonLabel where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GamepadButtonLabel where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GamepadButtonLabel ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadButtonLabel{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GamepadButtonLabel) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GamepadButtonLabel "unwrap" where
+  type
+    CFieldType SDL_GamepadButtonLabel "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN@, defined at @SDL3\/SDL_gamepad.h 197:5@
+pattern SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN :: SDL_GamepadButtonLabel
+pattern SDL_GAMEPAD_BUTTON_LABEL_UNKNOWN = SDL_GamepadButtonLabel 0
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LABEL_A@, defined at @SDL3\/SDL_gamepad.h 198:5@
+pattern SDL_GAMEPAD_BUTTON_LABEL_A :: SDL_GamepadButtonLabel
+pattern SDL_GAMEPAD_BUTTON_LABEL_A = SDL_GamepadButtonLabel 1
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LABEL_B@, defined at @SDL3\/SDL_gamepad.h 199:5@
+pattern SDL_GAMEPAD_BUTTON_LABEL_B :: SDL_GamepadButtonLabel
+pattern SDL_GAMEPAD_BUTTON_LABEL_B = SDL_GamepadButtonLabel 2
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LABEL_X@, defined at @SDL3\/SDL_gamepad.h 200:5@
+pattern SDL_GAMEPAD_BUTTON_LABEL_X :: SDL_GamepadButtonLabel
+pattern SDL_GAMEPAD_BUTTON_LABEL_X = SDL_GamepadButtonLabel 3
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LABEL_Y@, defined at @SDL3\/SDL_gamepad.h 201:5@
+pattern SDL_GAMEPAD_BUTTON_LABEL_Y :: SDL_GamepadButtonLabel
+pattern SDL_GAMEPAD_BUTTON_LABEL_Y = SDL_GamepadButtonLabel 4
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LABEL_CROSS@, defined at @SDL3\/SDL_gamepad.h 202:5@
+pattern SDL_GAMEPAD_BUTTON_LABEL_CROSS :: SDL_GamepadButtonLabel
+pattern SDL_GAMEPAD_BUTTON_LABEL_CROSS = SDL_GamepadButtonLabel 5
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LABEL_CIRCLE@, defined at @SDL3\/SDL_gamepad.h 203:5@
+pattern SDL_GAMEPAD_BUTTON_LABEL_CIRCLE :: SDL_GamepadButtonLabel
+pattern SDL_GAMEPAD_BUTTON_LABEL_CIRCLE = SDL_GamepadButtonLabel 6
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LABEL_SQUARE@, defined at @SDL3\/SDL_gamepad.h 204:5@
+pattern SDL_GAMEPAD_BUTTON_LABEL_SQUARE :: SDL_GamepadButtonLabel
+pattern SDL_GAMEPAD_BUTTON_LABEL_SQUARE = SDL_GamepadButtonLabel 7
+
+-- | [C declaration]: @SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE@, defined at @SDL3\/SDL_gamepad.h 205:5@
+pattern SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE :: SDL_GamepadButtonLabel
+pattern SDL_GAMEPAD_BUTTON_LABEL_TRIANGLE = SDL_GamepadButtonLabel 8
+
+-- | The list of axes available on a gamepad
+--
+--     Thumbstick axis values range from SDL_JOYSTICK_AXIS_MIN to SDL_JOYSTICK_AXIS_MAX, and are centered within ~8000 of zero, though advanced UI will allow users to set or autodetect the dead zone, which varies between gamepads.
+--
+--     Trigger axis values range from 0 (released) to SDL_JOYSTICK_AXIS_MAX (fully pressed) when reported by @SDL_GetGamepadAxis()@. Note that this is not the same range that will be reported by the lower-level SDL_GetJoystickAxis().
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_GamepadAxis@, defined at @SDL3\/SDL_gamepad.h 222:14@
+newtype SDL_GamepadAxis = SDL_GamepadAxis
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GamepadAxis where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadAxis where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadAxis
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GamepadAxis where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadAxis unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GamepadAxis instance BG.Storable SDL_GamepadAxis
+
+deriving via BG.CInt instance BG.Prim SDL_GamepadAxis
+
+instance CEnum.CEnum SDL_GamepadAxis where
+  type CEnumZ SDL_GamepadAxis = BG.CInt
+
+  toCEnum = SDL_GamepadAxis
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_GAMEPAD_AXIS_INVALID")
+        , (0, BG.singleton "SDL_GAMEPAD_AXIS_LEFTX")
+        , (1, BG.singleton "SDL_GAMEPAD_AXIS_LEFTY")
+        , (2, BG.singleton "SDL_GAMEPAD_AXIS_RIGHTX")
+        , (3, BG.singleton "SDL_GAMEPAD_AXIS_RIGHTY")
+        , (4, BG.singleton "SDL_GAMEPAD_AXIS_LEFT_TRIGGER")
+        , (5, BG.singleton "SDL_GAMEPAD_AXIS_RIGHT_TRIGGER")
+        , (6, BG.singleton "SDL_GAMEPAD_AXIS_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GamepadAxis"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GamepadAxis"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GamepadAxis where
+  minDeclaredValue = SDL_GAMEPAD_AXIS_INVALID
+
+  maxDeclaredValue = SDL_GAMEPAD_AXIS_COUNT
+
+instance Show SDL_GamepadAxis where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GamepadAxis where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GamepadAxis ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadAxis{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GamepadAxis) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GamepadAxis "unwrap" where
+  type CFieldType SDL_GamepadAxis "unwrap" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GAMEPAD_AXIS_INVALID@, defined at @SDL3\/SDL_gamepad.h 224:5@
+pattern SDL_GAMEPAD_AXIS_INVALID :: SDL_GamepadAxis
+pattern SDL_GAMEPAD_AXIS_INVALID = SDL_GamepadAxis (-1)
+
+-- | [C declaration]: @SDL_GAMEPAD_AXIS_LEFTX@, defined at @SDL3\/SDL_gamepad.h 225:5@
+pattern SDL_GAMEPAD_AXIS_LEFTX :: SDL_GamepadAxis
+pattern SDL_GAMEPAD_AXIS_LEFTX = SDL_GamepadAxis 0
+
+-- | [C declaration]: @SDL_GAMEPAD_AXIS_LEFTY@, defined at @SDL3\/SDL_gamepad.h 226:5@
+pattern SDL_GAMEPAD_AXIS_LEFTY :: SDL_GamepadAxis
+pattern SDL_GAMEPAD_AXIS_LEFTY = SDL_GamepadAxis 1
+
+-- | [C declaration]: @SDL_GAMEPAD_AXIS_RIGHTX@, defined at @SDL3\/SDL_gamepad.h 227:5@
+pattern SDL_GAMEPAD_AXIS_RIGHTX :: SDL_GamepadAxis
+pattern SDL_GAMEPAD_AXIS_RIGHTX = SDL_GamepadAxis 2
+
+-- | [C declaration]: @SDL_GAMEPAD_AXIS_RIGHTY@, defined at @SDL3\/SDL_gamepad.h 228:5@
+pattern SDL_GAMEPAD_AXIS_RIGHTY :: SDL_GamepadAxis
+pattern SDL_GAMEPAD_AXIS_RIGHTY = SDL_GamepadAxis 3
+
+-- | [C declaration]: @SDL_GAMEPAD_AXIS_LEFT_TRIGGER@, defined at @SDL3\/SDL_gamepad.h 229:5@
+pattern SDL_GAMEPAD_AXIS_LEFT_TRIGGER :: SDL_GamepadAxis
+pattern SDL_GAMEPAD_AXIS_LEFT_TRIGGER = SDL_GamepadAxis 4
+
+-- | [C declaration]: @SDL_GAMEPAD_AXIS_RIGHT_TRIGGER@, defined at @SDL3\/SDL_gamepad.h 230:5@
+pattern SDL_GAMEPAD_AXIS_RIGHT_TRIGGER :: SDL_GamepadAxis
+pattern SDL_GAMEPAD_AXIS_RIGHT_TRIGGER = SDL_GamepadAxis 5
+
+-- | [C declaration]: @SDL_GAMEPAD_AXIS_COUNT@, defined at @SDL3\/SDL_gamepad.h 231:5@
+pattern SDL_GAMEPAD_AXIS_COUNT :: SDL_GamepadAxis
+pattern SDL_GAMEPAD_AXIS_COUNT = SDL_GamepadAxis 6
+
+-- | Types of gamepad control bindings.
+--
+--     A gamepad is a collection of bindings that map arbitrary joystick buttons, axes and hat switches to specific positions on a generic console-style gamepad. This enum is used as part of 'SDL_GamepadBinding' to specify those mappings.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_GamepadBindingType@, defined at @SDL3\/SDL_gamepad.h 244:14@
+newtype SDL_GamepadBindingType = SDL_GamepadBindingType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GamepadBindingType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadBindingType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadBindingType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GamepadBindingType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadBindingType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadBindingType
+  instance
+    BG.Storable SDL_GamepadBindingType
+
+deriving via BG.CUInt instance BG.Prim SDL_GamepadBindingType
+
+instance CEnum.CEnum SDL_GamepadBindingType where
+  type CEnumZ SDL_GamepadBindingType = BG.CUInt
+
+  toCEnum = SDL_GamepadBindingType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GAMEPAD_BINDTYPE_NONE")
+        , (1, BG.singleton "SDL_GAMEPAD_BINDTYPE_BUTTON")
+        , (2, BG.singleton "SDL_GAMEPAD_BINDTYPE_AXIS")
+        , (3, BG.singleton "SDL_GAMEPAD_BINDTYPE_HAT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GamepadBindingType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GamepadBindingType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GamepadBindingType where
+  minDeclaredValue = SDL_GAMEPAD_BINDTYPE_NONE
+
+  maxDeclaredValue = SDL_GAMEPAD_BINDTYPE_HAT
+
+instance Show SDL_GamepadBindingType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GamepadBindingType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GamepadBindingType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBindingType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GamepadBindingType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GamepadBindingType "unwrap" where
+  type
+    CFieldType SDL_GamepadBindingType "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GAMEPAD_BINDTYPE_NONE@, defined at @SDL3\/SDL_gamepad.h 246:5@
+pattern SDL_GAMEPAD_BINDTYPE_NONE :: SDL_GamepadBindingType
+pattern SDL_GAMEPAD_BINDTYPE_NONE = SDL_GamepadBindingType 0
+
+-- | [C declaration]: @SDL_GAMEPAD_BINDTYPE_BUTTON@, defined at @SDL3\/SDL_gamepad.h 247:5@
+pattern SDL_GAMEPAD_BINDTYPE_BUTTON :: SDL_GamepadBindingType
+pattern SDL_GAMEPAD_BINDTYPE_BUTTON = SDL_GamepadBindingType 1
+
+-- | [C declaration]: @SDL_GAMEPAD_BINDTYPE_AXIS@, defined at @SDL3\/SDL_gamepad.h 248:5@
+pattern SDL_GAMEPAD_BINDTYPE_AXIS :: SDL_GamepadBindingType
+pattern SDL_GAMEPAD_BINDTYPE_AXIS = SDL_GamepadBindingType 2
+
+-- | [C declaration]: @SDL_GAMEPAD_BINDTYPE_HAT@, defined at @SDL3\/SDL_gamepad.h 249:5@
+pattern SDL_GAMEPAD_BINDTYPE_HAT :: SDL_GamepadBindingType
+pattern SDL_GAMEPAD_BINDTYPE_HAT = SDL_GamepadBindingType 3
+
+-- | [C declaration]: @struct \@SDL_GamepadBinding_input_axis@, defined at @SDL3\/SDL_gamepad.h 274:9@
+data SDL_GamepadBinding_input_axis = SDL_GamepadBinding_input_axis
+  { axis :: BG.CInt
+  -- ^ [C declaration]: @axis@, defined at @SDL3\/SDL_gamepad.h 276:17@
+  , axis_min :: BG.CInt
+  -- ^ [C declaration]: @axis_min@, defined at @SDL3\/SDL_gamepad.h 277:17@
+  , axis_max :: BG.CInt
+  -- ^ [C declaration]: @axis_max@, defined at @SDL3\/SDL_gamepad.h 278:17@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GamepadBinding_input_axis where
+  staticSizeOf = \_ -> (12 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadBinding_input_axis where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadBinding_input_axis
+        <*> HasCField.readRaw (BG.Proxy @"axis") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"axis_min") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"axis_max") ptr0
+
+instance Marshal.WriteRaw SDL_GamepadBinding_input_axis where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadBinding_input_axis axis2 axis_min3 axis_max4 ->
+            HasCField.writeRaw (BG.Proxy @"axis") ptr0 axis2
+              >> HasCField.writeRaw (BG.Proxy @"axis_min") ptr0 axis_min3
+              >> HasCField.writeRaw (BG.Proxy @"axis_max") ptr0 axis_max4
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadBinding_input_axis
+  instance
+    BG.Storable SDL_GamepadBinding_input_axis
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "axis" SDL_GamepadBinding_input_axis ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding_input_axis
+            { axis = y1
+            , axis_min = BG.getField @"axis_min" x0
+            , axis_max = BG.getField @"axis_max" x0
+            }
+      , BG.getField @"axis" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "axis" (BG.Ptr SDL_GamepadBinding_input_axis) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis")
+
+instance HasCField.HasCField SDL_GamepadBinding_input_axis "axis" where
+  type
+    CFieldType SDL_GamepadBinding_input_axis "axis" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "axis_min" SDL_GamepadBinding_input_axis ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding_input_axis
+            { axis_min = y1
+            , axis = BG.getField @"axis" x0
+            , axis_max = BG.getField @"axis_max" x0
+            }
+      , BG.getField @"axis_min" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "axis_min" (BG.Ptr SDL_GamepadBinding_input_axis) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis_min")
+
+instance HasCField.HasCField SDL_GamepadBinding_input_axis "axis_min" where
+  type
+    CFieldType SDL_GamepadBinding_input_axis "axis_min" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "axis_max" SDL_GamepadBinding_input_axis ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding_input_axis
+            { axis_max = y1
+            , axis = BG.getField @"axis" x0
+            , axis_min = BG.getField @"axis_min" x0
+            }
+      , BG.getField @"axis_max" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "axis_max" (BG.Ptr SDL_GamepadBinding_input_axis) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis_max")
+
+instance HasCField.HasCField SDL_GamepadBinding_input_axis "axis_max" where
+  type
+    CFieldType SDL_GamepadBinding_input_axis "axis_max" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 8
+
+-- | [C declaration]: @struct \@SDL_GamepadBinding_input_hat@, defined at @SDL3\/SDL_gamepad.h 281:9@
+data SDL_GamepadBinding_input_hat = SDL_GamepadBinding_input_hat
+  { hat :: BG.CInt
+  -- ^ [C declaration]: @hat@, defined at @SDL3\/SDL_gamepad.h 283:17@
+  , hat_mask :: BG.CInt
+  -- ^ [C declaration]: @hat_mask@, defined at @SDL3\/SDL_gamepad.h 284:17@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GamepadBinding_input_hat where
+  staticSizeOf = \_ -> (8 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadBinding_input_hat where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadBinding_input_hat
+        <*> HasCField.readRaw (BG.Proxy @"hat") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"hat_mask") ptr0
+
+instance Marshal.WriteRaw SDL_GamepadBinding_input_hat where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadBinding_input_hat hat2 hat_mask3 ->
+            HasCField.writeRaw (BG.Proxy @"hat") ptr0 hat2
+              >> HasCField.writeRaw (BG.Proxy @"hat_mask") ptr0 hat_mask3
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadBinding_input_hat
+  instance
+    BG.Storable SDL_GamepadBinding_input_hat
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "hat" SDL_GamepadBinding_input_hat ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding_input_hat{hat = y1, hat_mask = BG.getField @"hat_mask" x0}
+      , BG.getField @"hat" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "hat" (BG.Ptr SDL_GamepadBinding_input_hat) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"hat")
+
+instance HasCField.HasCField SDL_GamepadBinding_input_hat "hat" where
+  type
+    CFieldType SDL_GamepadBinding_input_hat "hat" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "hat_mask" SDL_GamepadBinding_input_hat ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding_input_hat{hat_mask = y1, hat = BG.getField @"hat" x0}
+      , BG.getField @"hat_mask" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "hat_mask" (BG.Ptr SDL_GamepadBinding_input_hat) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"hat_mask")
+
+instance HasCField.HasCField SDL_GamepadBinding_input_hat "hat_mask" where
+  type
+    CFieldType SDL_GamepadBinding_input_hat "hat_mask" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 4
+
+-- | [C declaration]: @union \@SDL_GamepadBinding_input@, defined at @SDL3\/SDL_gamepad.h 270:5@
+newtype SDL_GamepadBinding_input = SDL_GamepadBinding_input
+  { unwrap :: BG.ByteArray
+  }
+  deriving stock (BG.Generic)
+
+deriving via BG.SizedByteArray 12 4 instance Marshal.StaticSize SDL_GamepadBinding_input
+
+deriving via BG.SizedByteArray 12 4 instance Marshal.ReadRaw SDL_GamepadBinding_input
+
+deriving via BG.SizedByteArray 12 4 instance Marshal.WriteRaw SDL_GamepadBinding_input
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadBinding_input
+  instance
+    BG.Storable SDL_GamepadBinding_input
+
+deriving via BG.SizedByteArray 12 4 instance Union.IsUnion SDL_GamepadBinding_input
+
+-- | [C declaration]: @button@, defined at @SDL3\/SDL_gamepad.h 272:13@
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "button" SDL_GamepadBinding_input ty
+  where
+  getField = BG.getUnionPayload
+
+-- | [C declaration]: @button@, defined at @SDL3\/SDL_gamepad.h 272:13@
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "button" SDL_GamepadBinding_input ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"button" x0)
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "button" (BG.Ptr SDL_GamepadBinding_input) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_GamepadBinding_input "button" where
+  type
+    CFieldType SDL_GamepadBinding_input "button" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @axis@, defined at @SDL3\/SDL_gamepad.h 279:11@
+instance
+  (ty ~ SDL_GamepadBinding_input_axis)
+  => BG.HasField "axis" SDL_GamepadBinding_input ty
+  where
+  getField = BG.getUnionPayload
+
+-- | [C declaration]: @axis@, defined at @SDL3\/SDL_gamepad.h 279:11@
+instance
+  (ty ~ SDL_GamepadBinding_input_axis)
+  => BG.CompatHasField.HasField "axis" SDL_GamepadBinding_input ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"axis" x0)
+
+instance
+  (ty ~ SDL_GamepadBinding_input_axis)
+  => BG.HasField "axis" (BG.Ptr SDL_GamepadBinding_input) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis")
+
+instance HasCField.HasCField SDL_GamepadBinding_input "axis" where
+  type
+    CFieldType SDL_GamepadBinding_input "axis" =
+      SDL_GamepadBinding_input_axis
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @hat@, defined at @SDL3\/SDL_gamepad.h 285:11@
+instance
+  (ty ~ SDL_GamepadBinding_input_hat)
+  => BG.HasField "hat" SDL_GamepadBinding_input ty
+  where
+  getField = BG.getUnionPayload
+
+-- | [C declaration]: @hat@, defined at @SDL3\/SDL_gamepad.h 285:11@
+instance
+  (ty ~ SDL_GamepadBinding_input_hat)
+  => BG.CompatHasField.HasField "hat" SDL_GamepadBinding_input ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"hat" x0)
+
+instance
+  (ty ~ SDL_GamepadBinding_input_hat)
+  => BG.HasField "hat" (BG.Ptr SDL_GamepadBinding_input) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"hat")
+
+instance HasCField.HasCField SDL_GamepadBinding_input "hat" where
+  type
+    CFieldType SDL_GamepadBinding_input "hat" =
+      SDL_GamepadBinding_input_hat
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @struct \@SDL_GamepadBinding_output_axis@, defined at @SDL3\/SDL_gamepad.h 294:9@
+data SDL_GamepadBinding_output_axis = SDL_GamepadBinding_output_axis
+  { axis :: SDL_GamepadAxis
+  -- ^ [C declaration]: @axis@, defined at @SDL3\/SDL_gamepad.h 296:29@
+  , axis_min :: BG.CInt
+  -- ^ [C declaration]: @axis_min@, defined at @SDL3\/SDL_gamepad.h 297:17@
+  , axis_max :: BG.CInt
+  -- ^ [C declaration]: @axis_max@, defined at @SDL3\/SDL_gamepad.h 298:17@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GamepadBinding_output_axis where
+  staticSizeOf = \_ -> (12 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadBinding_output_axis where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadBinding_output_axis
+        <*> HasCField.readRaw (BG.Proxy @"axis") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"axis_min") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"axis_max") ptr0
+
+instance Marshal.WriteRaw SDL_GamepadBinding_output_axis where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadBinding_output_axis axis2 axis_min3 axis_max4 ->
+            HasCField.writeRaw (BG.Proxy @"axis") ptr0 axis2
+              >> HasCField.writeRaw (BG.Proxy @"axis_min") ptr0 axis_min3
+              >> HasCField.writeRaw (BG.Proxy @"axis_max") ptr0 axis_max4
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadBinding_output_axis
+  instance
+    BG.Storable SDL_GamepadBinding_output_axis
+
+instance
+  (ty ~ SDL_GamepadAxis)
+  => BG.CompatHasField.HasField "axis" SDL_GamepadBinding_output_axis ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding_output_axis
+            { axis = y1
+            , axis_min = BG.getField @"axis_min" x0
+            , axis_max = BG.getField @"axis_max" x0
+            }
+      , BG.getField @"axis" x0
+      )
+
+instance
+  (ty ~ SDL_GamepadAxis)
+  => BG.HasField "axis" (BG.Ptr SDL_GamepadBinding_output_axis) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis")
+
+instance HasCField.HasCField SDL_GamepadBinding_output_axis "axis" where
+  type
+    CFieldType SDL_GamepadBinding_output_axis "axis" =
+      SDL_GamepadAxis
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "axis_min" SDL_GamepadBinding_output_axis ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding_output_axis
+            { axis_min = y1
+            , axis = BG.getField @"axis" x0
+            , axis_max = BG.getField @"axis_max" x0
+            }
+      , BG.getField @"axis_min" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "axis_min" (BG.Ptr SDL_GamepadBinding_output_axis) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis_min")
+
+instance HasCField.HasCField SDL_GamepadBinding_output_axis "axis_min" where
+  type
+    CFieldType SDL_GamepadBinding_output_axis "axis_min" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "axis_max" SDL_GamepadBinding_output_axis ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding_output_axis
+            { axis_max = y1
+            , axis = BG.getField @"axis" x0
+            , axis_min = BG.getField @"axis_min" x0
+            }
+      , BG.getField @"axis_max" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "axis_max" (BG.Ptr SDL_GamepadBinding_output_axis) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis_max")
+
+instance HasCField.HasCField SDL_GamepadBinding_output_axis "axis_max" where
+  type
+    CFieldType SDL_GamepadBinding_output_axis "axis_max" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 8
+
+-- | [C declaration]: @union \@SDL_GamepadBinding_output@, defined at @SDL3\/SDL_gamepad.h 290:5@
+newtype SDL_GamepadBinding_output = SDL_GamepadBinding_output
+  { unwrap :: BG.ByteArray
+  }
+  deriving stock (BG.Generic)
+
+deriving via BG.SizedByteArray 12 4 instance Marshal.StaticSize SDL_GamepadBinding_output
+
+deriving via BG.SizedByteArray 12 4 instance Marshal.ReadRaw SDL_GamepadBinding_output
+
+deriving via BG.SizedByteArray 12 4 instance Marshal.WriteRaw SDL_GamepadBinding_output
+
+deriving via
+  Marshal.EquivStorable SDL_GamepadBinding_output
+  instance
+    BG.Storable SDL_GamepadBinding_output
+
+deriving via BG.SizedByteArray 12 4 instance Union.IsUnion SDL_GamepadBinding_output
+
+-- | [C declaration]: @button@, defined at @SDL3\/SDL_gamepad.h 292:27@
+instance
+  (ty ~ SDL_GamepadButton)
+  => BG.HasField "button" SDL_GamepadBinding_output ty
+  where
+  getField = BG.getUnionPayload
+
+-- | [C declaration]: @button@, defined at @SDL3\/SDL_gamepad.h 292:27@
+instance
+  (ty ~ SDL_GamepadButton)
+  => BG.CompatHasField.HasField "button" SDL_GamepadBinding_output ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"button" x0)
+
+instance
+  (ty ~ SDL_GamepadButton)
+  => BG.HasField "button" (BG.Ptr SDL_GamepadBinding_output) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_GamepadBinding_output "button" where
+  type
+    CFieldType SDL_GamepadBinding_output "button" =
+      SDL_GamepadButton
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @axis@, defined at @SDL3\/SDL_gamepad.h 299:11@
+instance
+  (ty ~ SDL_GamepadBinding_output_axis)
+  => BG.HasField "axis" SDL_GamepadBinding_output ty
+  where
+  getField = BG.getUnionPayload
+
+-- | [C declaration]: @axis@, defined at @SDL3\/SDL_gamepad.h 299:11@
+instance
+  (ty ~ SDL_GamepadBinding_output_axis)
+  => BG.CompatHasField.HasField "axis" SDL_GamepadBinding_output ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"axis" x0)
+
+instance
+  (ty ~ SDL_GamepadBinding_output_axis)
+  => BG.HasField "axis" (BG.Ptr SDL_GamepadBinding_output) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis")
+
+instance HasCField.HasCField SDL_GamepadBinding_output "axis" where
+  type
+    CFieldType SDL_GamepadBinding_output "axis" =
+      SDL_GamepadBinding_output_axis
+
+  offset# = \_ -> \_ -> 0
+
+-- | A mapping between one joystick input to a gamepad control.
+--
+--     A gamepad has a collection of several bindings, to say, for example, when joystick button number 5 is pressed, that should be treated like the gamepad\'s \"start\" button.
+--
+--     SDL has these bindings built-in for many popular controllers, and can add more with a simple text string. Those strings are parsed into a collection of these structs to make it easier to operate on the data.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadBindings'
+--
+--     [C declaration]: @struct SDL_GamepadBinding@, defined at @SDL3\/SDL_gamepad.h 267:16@
+data SDL_GamepadBinding = SDL_GamepadBinding
+  { input_type :: SDL_GamepadBindingType
+  -- ^ [C declaration]: @input_type@, defined at @SDL3\/SDL_gamepad.h 269:28@
+  , input :: SDL_GamepadBinding_input
+  -- ^ [C declaration]: @input@, defined at @SDL3\/SDL_gamepad.h 287:7@
+  , output_type :: SDL_GamepadBindingType
+  -- ^ [C declaration]: @output_type@, defined at @SDL3\/SDL_gamepad.h 289:28@
+  , output :: SDL_GamepadBinding_output
+  -- ^ [C declaration]: @output@, defined at @SDL3\/SDL_gamepad.h 301:7@
+  }
+  deriving stock (BG.Generic)
+
+instance Marshal.StaticSize SDL_GamepadBinding where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GamepadBinding where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GamepadBinding
+        <*> HasCField.readRaw (BG.Proxy @"input_type") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"input") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"output_type") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"output") ptr0
+
+instance Marshal.WriteRaw SDL_GamepadBinding where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GamepadBinding input_type2 input3 output_type4 output5 ->
+            HasCField.writeRaw (BG.Proxy @"input_type") ptr0 input_type2
+              >> HasCField.writeRaw (BG.Proxy @"input") ptr0 input3
+              >> HasCField.writeRaw (BG.Proxy @"output_type") ptr0 output_type4
+              >> HasCField.writeRaw (BG.Proxy @"output") ptr0 output5
+
+deriving via Marshal.EquivStorable SDL_GamepadBinding instance BG.Storable SDL_GamepadBinding
+
+instance
+  (ty ~ SDL_GamepadBindingType)
+  => BG.CompatHasField.HasField "input_type" SDL_GamepadBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding
+            { input_type = y1
+            , input = BG.getField @"input" x0
+            , output_type = BG.getField @"output_type" x0
+            , output = BG.getField @"output" x0
+            }
+      , BG.getField @"input_type" x0
+      )
+
+instance
+  (ty ~ SDL_GamepadBindingType)
+  => BG.HasField "input_type" (BG.Ptr SDL_GamepadBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"input_type")
+
+instance HasCField.HasCField SDL_GamepadBinding "input_type" where
+  type
+    CFieldType SDL_GamepadBinding "input_type" =
+      SDL_GamepadBindingType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_GamepadBinding_input)
+  => BG.CompatHasField.HasField "input" SDL_GamepadBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding
+            { input = y1
+            , input_type = BG.getField @"input_type" x0
+            , output_type = BG.getField @"output_type" x0
+            , output = BG.getField @"output" x0
+            }
+      , BG.getField @"input" x0
+      )
+
+instance
+  (ty ~ SDL_GamepadBinding_input)
+  => BG.HasField "input" (BG.Ptr SDL_GamepadBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"input")
+
+instance HasCField.HasCField SDL_GamepadBinding "input" where
+  type
+    CFieldType SDL_GamepadBinding "input" =
+      SDL_GamepadBinding_input
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL_GamepadBindingType)
+  => BG.CompatHasField.HasField "output_type" SDL_GamepadBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding
+            { output_type = y1
+            , input_type = BG.getField @"input_type" x0
+            , input = BG.getField @"input" x0
+            , output = BG.getField @"output" x0
+            }
+      , BG.getField @"output_type" x0
+      )
+
+instance
+  (ty ~ SDL_GamepadBindingType)
+  => BG.HasField "output_type" (BG.Ptr SDL_GamepadBinding) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"output_type")
+
+instance HasCField.HasCField SDL_GamepadBinding "output_type" where
+  type
+    CFieldType SDL_GamepadBinding "output_type" =
+      SDL_GamepadBindingType
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL_GamepadBinding_output)
+  => BG.CompatHasField.HasField "output" SDL_GamepadBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GamepadBinding
+            { output = y1
+            , input_type = BG.getField @"input_type" x0
+            , input = BG.getField @"input" x0
+            , output_type = BG.getField @"output_type" x0
+            }
+      , BG.getField @"output" x0
+      )
+
+instance
+  (ty ~ SDL_GamepadBinding_output)
+  => BG.HasField "output" (BG.Ptr SDL_GamepadBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"output")
+
+instance HasCField.HasCField SDL_GamepadBinding "output" where
+  type
+    CFieldType SDL_GamepadBinding "output" =
+      SDL_GamepadBinding_output
+
+  offset# = \_ -> \_ -> 20
diff --git a/src/SDL3/Sys/Bindgen/Gamepad/FunPtr.hs b/src/SDL3/Sys/Bindgen/Gamepad/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Gamepad/FunPtr.hs
@@ -0,0 +1,3154 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Gamepad.FunPtr (
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_AddGamepadMapping,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_AddGamepadMappingsFromIO,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_AddGamepadMappingsFromFile,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_ReloadGamepadMappings,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadMappings,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadMappingForGUID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadMapping,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_SetGamepadMapping,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_HasGamepad,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepads,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_IsGamepad,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadNameForID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadPathForID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadPlayerIndexForID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadGUIDForID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadVendorForID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadProductForID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadProductVersionForID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadTypeForID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetRealGamepadTypeForID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadMappingForID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_OpenGamepad,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadFromID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadFromPlayerIndex,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadProperties,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadID,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadName,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadPath,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadType,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetRealGamepadType,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadPlayerIndex,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_SetGamepadPlayerIndex,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadVendor,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadProduct,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadProductVersion,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadFirmwareVersion,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadSerial,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadSteamHandle,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadConnectionState,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadPowerInfo,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GamepadConnected,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadJoystick,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_SetGamepadEventsEnabled,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GamepadEventsEnabled,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadBindings,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_UpdateGamepads,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadTypeFromString,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadStringForType,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadAxisFromString,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadStringForAxis,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GamepadHasAxis,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadAxis,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadButtonFromString,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadStringForButton,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GamepadHasButton,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadButton,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadButtonLabelForType,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadButtonLabel,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetNumGamepadTouchpads,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetNumGamepadTouchpadFingers,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadTouchpadFinger,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GamepadHasSensor,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_SetGamepadSensorEnabled,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GamepadSensorEnabled,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadSensorDataRate,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadSensorData,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_RumbleGamepad,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_RumbleGamepadTriggers,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_SetGamepadLED,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_SendGamepadEffect,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_CloseGamepad,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadAppleSFSymbolsNameForButton,
+  SDL3.Sys.Bindgen.Gamepad.FunPtr.sDL_GetGamepadAppleSFSymbolsNameForAxis,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Gamepad
+import SDL3.Sys.Bindgen.Guid qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Joystick qualified
+import SDL3.Sys.Bindgen.Power qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_gamepad.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_AddGamepadMapping */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_f56db84bc08d998c (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_AddGamepadMapping;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_AddGamepadMappingsFromIO */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_a541948e617e6e63 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_AddGamepadMappingsFromIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_AddGamepadMappingsFromFile */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_41978012228f1faa (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_AddGamepadMappingsFromFile;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_ReloadGamepadMappings */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4df07d31710d5cb5 (void)) (void)"
+         , "{"
+         , "  return &SDL_ReloadGamepadMappings;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMappings */"
+         , "__attribute__ ((const))"
+         , "char **(*hs_bindgen_eeb3cc137ed4da1e (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadMappings;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMappingForGUID */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_676f8bee7fec25e8 (void)) ("
+         , "  SDL_GUID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadMappingForGUID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMapping */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_330564406990299e (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadMapping;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadMapping */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f7235f6f99c772ca (void)) ("
+         , "  SDL_JoystickID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGamepadMapping;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_HasGamepad */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_171b935423ed7323 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasGamepad;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepads */"
+         , "__attribute__ ((const))"
+         , "SDL_JoystickID *(*hs_bindgen_095806a9813b5184 (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepads;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_IsGamepad */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d37b79b846feea5a (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_IsGamepad;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadNameForID */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_4149d7834c57d24c (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadNameForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPathForID */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_e6466e1cd168d223 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadPathForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPlayerIndexForID */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_2b10ba6f8bda9f40 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadPlayerIndexForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadGUIDForID */"
+         , "__attribute__ ((const))"
+         , "SDL_GUID (*hs_bindgen_a8f30b2ab2c4c03d (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadGUIDForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadVendorForID */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_1c8946f34d79c303 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadVendorForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProductForID */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_edfc500830dad203 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadProductForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProductVersionForID */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_ccbc199841dd7663 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadProductVersionForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadTypeForID */"
+         , "__attribute__ ((const))"
+         , "SDL_GamepadType (*hs_bindgen_a56519061f425d2d (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadTypeForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetRealGamepadTypeForID */"
+         , "__attribute__ ((const))"
+         , "SDL_GamepadType (*hs_bindgen_ea844fcc269b3863 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRealGamepadTypeForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMappingForID */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_3a88aaf2c38a542b (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadMappingForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_OpenGamepad */"
+         , "__attribute__ ((const))"
+         , "SDL_Gamepad *(*hs_bindgen_d2263d27295e9ca6 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenGamepad;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadFromID */"
+         , "__attribute__ ((const))"
+         , "SDL_Gamepad *(*hs_bindgen_a2eccf4e721a7b78 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadFromID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadFromPlayerIndex */"
+         , "__attribute__ ((const))"
+         , "SDL_Gamepad *(*hs_bindgen_d5762153bda1c5a2 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadFromPlayerIndex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_f6b1c3e515df26bf (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadID */"
+         , "__attribute__ ((const))"
+         , "SDL_JoystickID (*hs_bindgen_aeb6f834f1bb9bba (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_a6ba120e3c657e82 (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPath */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_25cf3224bc5505cc (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadPath;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadType */"
+         , "__attribute__ ((const))"
+         , "SDL_GamepadType (*hs_bindgen_131b0de798357722 (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadType;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetRealGamepadType */"
+         , "__attribute__ ((const))"
+         , "SDL_GamepadType (*hs_bindgen_299f836c8b95a4d8 (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRealGamepadType;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPlayerIndex */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_c48d71502b4eef8f (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadPlayerIndex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadPlayerIndex */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_90716136f5deb4d3 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGamepadPlayerIndex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadVendor */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_ffa764d02a95dc96 (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadVendor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProduct */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_22ebf47a7ce663ce (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadProduct;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProductVersion */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_cb998d733e296e5c (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadProductVersion;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadFirmwareVersion */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_dddc5b49b1eab050 (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadFirmwareVersion;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSerial */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_ee2ba2bdd8e4e8f4 (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadSerial;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSteamHandle */"
+         , "__attribute__ ((const))"
+         , "Uint64 (*hs_bindgen_3f35ecfbc73c387c (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadSteamHandle;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadConnectionState */"
+         , "__attribute__ ((const))"
+         , "SDL_JoystickConnectionState (*hs_bindgen_53909ff1f2a38eeb (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadConnectionState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPowerInfo */"
+         , "__attribute__ ((const))"
+         , "SDL_PowerState (*hs_bindgen_c9db854f84cfdf17 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadPowerInfo;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadConnected */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f53e7088d703eb0d (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GamepadConnected;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadJoystick */"
+         , "__attribute__ ((const))"
+         , "SDL_Joystick *(*hs_bindgen_437957a44b873407 (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadJoystick;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadEventsEnabled */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_bd360bbccf8e02d1 (void)) ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGamepadEventsEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadEventsEnabled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_495749302a88fada (void)) (void)"
+         , "{"
+         , "  return &SDL_GamepadEventsEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadBindings */"
+         , "__attribute__ ((const))"
+         , "SDL_GamepadBinding **(*hs_bindgen_3bbe8c4408199173 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadBindings;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_UpdateGamepads */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_3029fdebe260ad88 (void)) (void)"
+         , "{"
+         , "  return &SDL_UpdateGamepads;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadTypeFromString */"
+         , "__attribute__ ((const))"
+         , "SDL_GamepadType (*hs_bindgen_919d1827bf3ece38 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadTypeFromString;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadStringForType */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_e0a2bc0194ece97f (void)) ("
+         , "  SDL_GamepadType arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadStringForType;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAxisFromString */"
+         , "__attribute__ ((const))"
+         , "SDL_GamepadAxis (*hs_bindgen_3e2dae12c3051365 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadAxisFromString;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadStringForAxis */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_4979edfa77e4fc76 (void)) ("
+         , "  SDL_GamepadAxis arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadStringForAxis;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadHasAxis */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3ea6abfb2ca9a69e (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadAxis arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GamepadHasAxis;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAxis */"
+         , "__attribute__ ((const))"
+         , "Sint16 (*hs_bindgen_a8dfd9fddde7c51f (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadAxis arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadAxis;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButtonFromString */"
+         , "__attribute__ ((const))"
+         , "SDL_GamepadButton (*hs_bindgen_aacf61245766bd7f (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadButtonFromString;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadStringForButton */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_e28b377b66d430c7 (void)) ("
+         , "  SDL_GamepadButton arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadStringForButton;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadHasButton */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_915b6e8126454256 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GamepadHasButton;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButton */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f63603565928dd6d (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadButton;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButtonLabelForType */"
+         , "__attribute__ ((const))"
+         , "SDL_GamepadButtonLabel (*hs_bindgen_5d5da36c408f3ed5 (void)) ("
+         , "  SDL_GamepadType arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadButtonLabelForType;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButtonLabel */"
+         , "__attribute__ ((const))"
+         , "SDL_GamepadButtonLabel (*hs_bindgen_6c96bb1d7ac32853 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadButtonLabel;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetNumGamepadTouchpads */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_de275259788d26ed (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetNumGamepadTouchpads;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetNumGamepadTouchpadFingers */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_acaeb05c5893aeba (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetNumGamepadTouchpadFingers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadTouchpadFinger */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4408908532932c4e (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  _Bool *arg4,"
+         , "  float *arg5,"
+         , "  float *arg6,"
+         , "  float *arg7"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadTouchpadFinger;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadHasSensor */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_041741220ac7e52d (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GamepadHasSensor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadSensorEnabled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_04571bb432b35b67 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGamepadSensorEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadSensorEnabled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_98c53abf20c77167 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GamepadSensorEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSensorDataRate */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_b6592bd554a6f989 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadSensorDataRate;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSensorData */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9753ce47b936d3ec (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2,"
+         , "  float *arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadSensorData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_RumbleGamepad */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_66c29b053dd2103a (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_RumbleGamepad;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_RumbleGamepadTriggers */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d96d791857c3d06b (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_RumbleGamepadTriggers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadLED */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fb1de1463dc236a8 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGamepadLED;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SendGamepadEffect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_5961396a3fadcac6 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SendGamepadEffect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_CloseGamepad */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_599bdf2afa4631b2 (void)) ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CloseGamepad;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAppleSFSymbolsNameForButton */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_901b303b0d647ea4 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadAppleSFSymbolsNameForButton;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAppleSFSymbolsNameForAxis */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_0f564808a8b0fec7 (void)) ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadAxis arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGamepadAppleSFSymbolsNameForAxis;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_AddGamepadMapping@
+foreign import ccall unsafe "hs_bindgen_f56db84bc08d998c"
+  hs_bindgen_f56db84bc08d998c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_AddGamepadMapping@
+hs_bindgen_f56db84bc08d998c :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CInt))
+hs_bindgen_f56db84bc08d998c =
+  BG.fromFFIType hs_bindgen_f56db84bc08d998c_base
+
+{-# NOINLINE sDL_AddGamepadMapping #-}
+
+-- | Add support for gamepads that SDL is unaware of or change the binding of an existing gamepad.
+--
+--     The mapping string has the format \"GUID,name,mapping\", where GUID is the string value from SDL_GUIDToString(), name is the human readable string for the device and mappings are gamepad mappings to joystick ones. Under Windows there is a reserved GUID of \"xinput\" that covers all XInput devices. The mapping format for joystick is:
+--
+--     * @bX@: a joystick button, index X
+--
+--     * @hX.Y@: hat X with value Y
+--
+--     * @aX@: axis X of the joystick
+--
+--     Buttons can be used as a gamepad axes and vice versa.
+--
+--     If a device with this GUID is already plugged in, SDL will generate an SDL_EVENT_GAMEPAD_ADDED event.
+--
+--     This string shows an example of a valid mapping for a gamepad:
+--
+--     @
+--     \"341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\"
+--     @
+--
+--     [@mapping@]: the mapping string.
+--
+--     [Returns]: 1 if a new mapping is added, 0 if an existing mapping is updated, -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMappingsFromFile', 'sDL_AddGamepadMappingsFromIO', 'sDL_GetGamepadMapping', 'sDL_GetGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     [C declaration]: @SDL_AddGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 346:33@
+sDL_AddGamepadMapping :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CInt)
+sDL_AddGamepadMapping =
+  BG.unsafePerformIO hs_bindgen_f56db84bc08d998c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_AddGamepadMappingsFromIO@
+foreign import ccall unsafe "hs_bindgen_a541948e617e6e63"
+  hs_bindgen_a541948e617e6e63_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_AddGamepadMappingsFromIO@
+hs_bindgen_a541948e617e6e63
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO BG.CInt))
+hs_bindgen_a541948e617e6e63 =
+  BG.fromFFIType hs_bindgen_a541948e617e6e63_base
+
+{-# NOINLINE sDL_AddGamepadMappingsFromIO #-}
+
+-- | Load a set of gamepad mappings from an SDL_IOStream.
+--
+--     You can call this function several times, if needed, to load different database files.
+--
+--     If a new mapping is loaded for an already known gamepad GUID, the later version will overwrite the one currently loaded.
+--
+--     Any new mappings for already plugged in controllers will generate SDL_EVENT_GAMEPAD_ADDED events.
+--
+--     Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).
+--
+--     This function will load the text database entirely in memory before processing it, so take this into consideration if you are in a memory constrained environment.
+--
+--     [@src@]: the data stream for the mappings to be added.
+--
+--     [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+--
+--     [Returns]: the number of mappings added or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_AddGamepadMappingsFromFile', 'sDL_GetGamepadMapping', 'sDL_GetGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     [C declaration]: @SDL_AddGamepadMappingsFromIO@, defined at @SDL3\/SDL_gamepad.h 386:33@
+sDL_AddGamepadMappingsFromIO
+  :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO BG.CInt)
+sDL_AddGamepadMappingsFromIO =
+  BG.unsafePerformIO hs_bindgen_a541948e617e6e63
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_AddGamepadMappingsFromFile@
+foreign import ccall unsafe "hs_bindgen_41978012228f1faa"
+  hs_bindgen_41978012228f1faa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_AddGamepadMappingsFromFile@
+hs_bindgen_41978012228f1faa :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CInt))
+hs_bindgen_41978012228f1faa =
+  BG.fromFFIType hs_bindgen_41978012228f1faa_base
+
+{-# NOINLINE sDL_AddGamepadMappingsFromFile #-}
+
+-- | Load a set of gamepad mappings from a file.
+--
+--     You can call this function several times, if needed, to load different database files.
+--
+--     If a new mapping is loaded for an already known gamepad GUID, the later version will overwrite the one currently loaded.
+--
+--     Any new mappings for already plugged in controllers will generate SDL_EVENT_GAMEPAD_ADDED events.
+--
+--     Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).
+--
+--     [@file@]: the mappings file to load.
+--
+--     [Returns]: the number of mappings added or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_AddGamepadMappingsFromIO', 'sDL_GetGamepadMapping', 'sDL_GetGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     [C declaration]: @SDL_AddGamepadMappingsFromFile@, defined at @SDL3\/SDL_gamepad.h 420:33@
+sDL_AddGamepadMappingsFromFile :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CInt)
+sDL_AddGamepadMappingsFromFile =
+  BG.unsafePerformIO hs_bindgen_41978012228f1faa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_ReloadGamepadMappings@
+foreign import ccall unsafe "hs_bindgen_4df07d31710d5cb5"
+  hs_bindgen_4df07d31710d5cb5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_ReloadGamepadMappings@
+hs_bindgen_4df07d31710d5cb5 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_4df07d31710d5cb5 =
+  BG.fromFFIType hs_bindgen_4df07d31710d5cb5_base
+
+{-# NOINLINE sDL_ReloadGamepadMappings #-}
+
+-- | Reinitialize the SDL mapping database to its initial state.
+--
+--     This will generate gamepad events as needed if device mappings change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReloadGamepadMappings@, defined at @SDL3\/SDL_gamepad.h 434:34@
+sDL_ReloadGamepadMappings :: BG.FunPtr (IO BG.CBool)
+sDL_ReloadGamepadMappings =
+  BG.unsafePerformIO hs_bindgen_4df07d31710d5cb5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMappings@
+foreign import ccall unsafe "hs_bindgen_eeb3cc137ed4da1e"
+  hs_bindgen_eeb3cc137ed4da1e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMappings@
+hs_bindgen_eeb3cc137ed4da1e :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr BG.CChar))))
+hs_bindgen_eeb3cc137ed4da1e =
+  BG.fromFFIType hs_bindgen_eeb3cc137ed4da1e_base
+
+{-# NOINLINE sDL_GetGamepadMappings #-}
+
+-- | Get the current gamepad mappings.
+--
+--     [@count@]: a pointer filled in with the number of mappings returned, can be NULL.
+--
+--     [Returns]: an array of the mapping strings, NULL-terminated, or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadMappings@, defined at @SDL3\/SDL_gamepad.h 450:37@
+sDL_GetGamepadMappings :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr BG.CChar)))
+sDL_GetGamepadMappings =
+  BG.unsafePerformIO hs_bindgen_eeb3cc137ed4da1e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMappingForGUID@
+foreign import ccall unsafe "hs_bindgen_676f8bee7fec25e8"
+  hs_bindgen_676f8bee7fec25e8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMappingForGUID@
+hs_bindgen_676f8bee7fec25e8
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Guid.SDL_GUID -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_676f8bee7fec25e8 =
+  BG.fromFFIType hs_bindgen_676f8bee7fec25e8_base
+
+{-# NOINLINE sDL_GetGamepadMappingForGUID #-}
+
+-- | Get the gamepad mapping string for a given GUID.
+--
+--     [@guid@]: a structure containing the GUID for which a mapping is desired.
+--
+--     [Returns]: a mapping string or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetJoystickGUIDForID, SDL_GetJoystickGUID
+--
+--     [C declaration]: @SDL_GetGamepadMappingForGUID@, defined at @SDL3\/SDL_gamepad.h 467:36@
+sDL_GetGamepadMappingForGUID :: BG.FunPtr (SDL3.Sys.Bindgen.Guid.SDL_GUID -> IO (BG.Ptr BG.CChar))
+sDL_GetGamepadMappingForGUID =
+  BG.unsafePerformIO hs_bindgen_676f8bee7fec25e8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMapping@
+foreign import ccall unsafe "hs_bindgen_330564406990299e"
+  hs_bindgen_330564406990299e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMapping@
+hs_bindgen_330564406990299e :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_330564406990299e =
+  BG.fromFFIType hs_bindgen_330564406990299e_base
+
+{-# NOINLINE sDL_GetGamepadMapping #-}
+
+-- | Get the current mapping of a gamepad.
+--
+--     Details about mappings are discussed with @SDL_AddGamepadMapping()@.
+--
+--     [@gamepad@]: the gamepad you want to get the current mapping for.
+--
+--     [Returns]: a string that has the gamepad\'s mapping or NULL if no mapping is available; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_GetGamepadMappingForID', 'sDL_GetGamepadMappingForGUID', 'sDL_SetGamepadMapping'
+--
+--     [C declaration]: @SDL_GetGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 488:36@
+sDL_GetGamepadMapping :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO (BG.Ptr BG.CChar))
+sDL_GetGamepadMapping =
+  BG.unsafePerformIO hs_bindgen_330564406990299e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadMapping@
+foreign import ccall unsafe "hs_bindgen_f7235f6f99c772ca"
+  hs_bindgen_f7235f6f99c772ca_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadMapping@
+hs_bindgen_f7235f6f99c772ca
+  :: IO
+       (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_f7235f6f99c772ca =
+  BG.fromFFIType hs_bindgen_f7235f6f99c772ca_base
+
+{-# NOINLINE sDL_SetGamepadMapping #-}
+
+-- | Set the current mapping of a joystick or gamepad.
+--
+--     Details about mappings are discussed with @SDL_AddGamepadMapping()@.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [@mapping@]: the mapping to use for this device, or NULL to clear the mapping.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_GetGamepadMapping'
+--
+--     [C declaration]: @SDL_SetGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 508:34@
+sDL_SetGamepadMapping
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SetGamepadMapping =
+  BG.unsafePerformIO hs_bindgen_f7235f6f99c772ca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_HasGamepad@
+foreign import ccall unsafe "hs_bindgen_171b935423ed7323"
+  hs_bindgen_171b935423ed7323_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_HasGamepad@
+hs_bindgen_171b935423ed7323 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_171b935423ed7323 =
+  BG.fromFFIType hs_bindgen_171b935423ed7323_base
+
+{-# NOINLINE sDL_HasGamepad #-}
+
+-- | Return whether a gamepad is currently connected.
+--
+--     [Returns]: true if a gamepad is connected, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_HasGamepad@, defined at @SDL3\/SDL_gamepad.h 521:34@
+sDL_HasGamepad :: BG.FunPtr (IO BG.CBool)
+sDL_HasGamepad =
+  BG.unsafePerformIO hs_bindgen_171b935423ed7323
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepads@
+foreign import ccall unsafe "hs_bindgen_095806a9813b5184"
+  hs_bindgen_095806a9813b5184_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepads@
+hs_bindgen_095806a9813b5184
+  :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)))
+hs_bindgen_095806a9813b5184 =
+  BG.fromFFIType hs_bindgen_095806a9813b5184_base
+
+{-# NOINLINE sDL_GetGamepads #-}
+
+-- | Get a list of currently connected gamepads.
+--
+--     [@count@]: a pointer filled in with the number of gamepads returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of joystick instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasGamepad', 'sDL_OpenGamepad'
+--
+--     [C declaration]: @SDL_GetGamepads@, defined at @SDL3\/SDL_gamepad.h 539:46@
+sDL_GetGamepads
+  :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_JoystickID))
+sDL_GetGamepads =
+  BG.unsafePerformIO hs_bindgen_095806a9813b5184
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_IsGamepad@
+foreign import ccall unsafe "hs_bindgen_d37b79b846feea5a"
+  hs_bindgen_d37b79b846feea5a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_IsGamepad@
+hs_bindgen_d37b79b846feea5a
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO BG.CBool))
+hs_bindgen_d37b79b846feea5a =
+  BG.fromFFIType hs_bindgen_d37b79b846feea5a_base
+
+{-# NOINLINE sDL_IsGamepad #-}
+
+-- | Check if the given joystick is supported by the gamepad interface.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: true if the given joystick is supported by the gamepad interface, false if it isn\'t or it\'s an invalid index.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetJoysticks, 'sDL_OpenGamepad'
+--
+--     [C declaration]: @SDL_IsGamepad@, defined at @SDL3\/SDL_gamepad.h 555:34@
+sDL_IsGamepad :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO BG.CBool)
+sDL_IsGamepad =
+  BG.unsafePerformIO hs_bindgen_d37b79b846feea5a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadNameForID@
+foreign import ccall unsafe "hs_bindgen_4149d7834c57d24c"
+  hs_bindgen_4149d7834c57d24c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadNameForID@
+hs_bindgen_4149d7834c57d24c
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_4149d7834c57d24c =
+  BG.fromFFIType hs_bindgen_4149d7834c57d24c_base
+
+{-# NOINLINE sDL_GetGamepadNameForID #-}
+
+-- | Get the implementation dependent name of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the name of the selected gamepad. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadName', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadNameForID@, defined at @SDL3\/SDL_gamepad.h 573:42@
+sDL_GetGamepadNameForID
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGamepadNameForID =
+  BG.unsafePerformIO hs_bindgen_4149d7834c57d24c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPathForID@
+foreign import ccall unsafe "hs_bindgen_e6466e1cd168d223"
+  hs_bindgen_e6466e1cd168d223_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPathForID@
+hs_bindgen_e6466e1cd168d223
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_e6466e1cd168d223 =
+  BG.fromFFIType hs_bindgen_e6466e1cd168d223_base
+
+{-# NOINLINE sDL_GetGamepadPathForID #-}
+
+-- | Get the implementation dependent path of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the path of the selected gamepad. If no path can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPath', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadPathForID@, defined at @SDL3\/SDL_gamepad.h 591:42@
+sDL_GetGamepadPathForID
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGamepadPathForID =
+  BG.unsafePerformIO hs_bindgen_e6466e1cd168d223
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPlayerIndexForID@
+foreign import ccall unsafe "hs_bindgen_2b10ba6f8bda9f40"
+  hs_bindgen_2b10ba6f8bda9f40_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPlayerIndexForID@
+hs_bindgen_2b10ba6f8bda9f40
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO BG.CInt))
+hs_bindgen_2b10ba6f8bda9f40 =
+  BG.fromFFIType hs_bindgen_2b10ba6f8bda9f40_base
+
+{-# NOINLINE sDL_GetGamepadPlayerIndexForID #-}
+
+-- | Get the player index of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the player index of a gamepad, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPlayerIndex', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadPlayerIndexForID@, defined at @SDL3\/SDL_gamepad.h 608:33@
+sDL_GetGamepadPlayerIndexForID :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO BG.CInt)
+sDL_GetGamepadPlayerIndexForID =
+  BG.unsafePerformIO hs_bindgen_2b10ba6f8bda9f40
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadGUIDForID@
+foreign import ccall unsafe "hs_bindgen_a8f30b2ab2c4c03d"
+  hs_bindgen_a8f30b2ab2c4c03d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadGUIDForID@
+hs_bindgen_a8f30b2ab2c4c03d
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID))
+hs_bindgen_a8f30b2ab2c4c03d =
+  BG.fromFFIType hs_bindgen_a8f30b2ab2c4c03d_base
+
+{-# NOINLINE sDL_GetGamepadGUIDForID #-}
+
+-- | Get the implementation-dependent GUID of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the GUID of the selected gamepad. If called on an invalid index, this function returns a zero GUID.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GUIDToString, 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadGUIDForID@, defined at @SDL3\/SDL_gamepad.h 626:38@
+sDL_GetGamepadGUIDForID
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID)
+sDL_GetGamepadGUIDForID =
+  BG.unsafePerformIO hs_bindgen_a8f30b2ab2c4c03d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadVendorForID@
+foreign import ccall unsafe "hs_bindgen_1c8946f34d79c303"
+  hs_bindgen_1c8946f34d79c303_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadVendorForID@
+hs_bindgen_1c8946f34d79c303
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_1c8946f34d79c303 =
+  BG.fromFFIType hs_bindgen_1c8946f34d79c303_base
+
+{-# NOINLINE sDL_GetGamepadVendorForID #-}
+
+-- | Get the USB vendor ID of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the vendor ID isn\'t available this function returns 0.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the USB vendor ID of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadVendor', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadVendorForID@, defined at @SDL3\/SDL_gamepad.h 645:36@
+sDL_GetGamepadVendorForID
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetGamepadVendorForID =
+  BG.unsafePerformIO hs_bindgen_1c8946f34d79c303
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProductForID@
+foreign import ccall unsafe "hs_bindgen_edfc500830dad203"
+  hs_bindgen_edfc500830dad203_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProductForID@
+hs_bindgen_edfc500830dad203
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_edfc500830dad203 =
+  BG.fromFFIType hs_bindgen_edfc500830dad203_base
+
+{-# NOINLINE sDL_GetGamepadProductForID #-}
+
+-- | Get the USB product ID of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the product ID isn\'t available this function returns 0.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the USB product ID of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProduct', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadProductForID@, defined at @SDL3\/SDL_gamepad.h 664:36@
+sDL_GetGamepadProductForID
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetGamepadProductForID =
+  BG.unsafePerformIO hs_bindgen_edfc500830dad203
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProductVersionForID@
+foreign import ccall unsafe "hs_bindgen_ccbc199841dd7663"
+  hs_bindgen_ccbc199841dd7663_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProductVersionForID@
+hs_bindgen_ccbc199841dd7663
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_ccbc199841dd7663 =
+  BG.fromFFIType hs_bindgen_ccbc199841dd7663_base
+
+{-# NOINLINE sDL_GetGamepadProductVersionForID #-}
+
+-- | Get the product version of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the product version isn\'t available this function returns 0.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the product version of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProductVersion', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadProductVersionForID@, defined at @SDL3\/SDL_gamepad.h 683:36@
+sDL_GetGamepadProductVersionForID
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetGamepadProductVersionForID =
+  BG.unsafePerformIO hs_bindgen_ccbc199841dd7663
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadTypeForID@
+foreign import ccall unsafe "hs_bindgen_a56519061f425d2d"
+  hs_bindgen_a56519061f425d2d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadTypeForID@
+hs_bindgen_a56519061f425d2d
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL_GamepadType))
+hs_bindgen_a56519061f425d2d =
+  BG.fromFFIType hs_bindgen_a56519061f425d2d_base
+
+{-# NOINLINE sDL_GetGamepadTypeForID #-}
+
+-- | Get the type of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the gamepad type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadType', 'sDL_GetGamepads', 'sDL_GetRealGamepadTypeForID'
+--
+--     [C declaration]: @SDL_GetGamepadTypeForID@, defined at @SDL3\/SDL_gamepad.h 701:45@
+sDL_GetGamepadTypeForID
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL_GamepadType)
+sDL_GetGamepadTypeForID =
+  BG.unsafePerformIO hs_bindgen_a56519061f425d2d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetRealGamepadTypeForID@
+foreign import ccall unsafe "hs_bindgen_ea844fcc269b3863"
+  hs_bindgen_ea844fcc269b3863_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetRealGamepadTypeForID@
+hs_bindgen_ea844fcc269b3863
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL_GamepadType))
+hs_bindgen_ea844fcc269b3863 =
+  BG.fromFFIType hs_bindgen_ea844fcc269b3863_base
+
+{-# NOINLINE sDL_GetRealGamepadTypeForID #-}
+
+-- | Get the type of a gamepad, ignoring any mapping override.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the gamepad type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTypeForID', 'sDL_GetGamepads', 'sDL_GetRealGamepadType'
+--
+--     [C declaration]: @SDL_GetRealGamepadTypeForID@, defined at @SDL3\/SDL_gamepad.h 719:45@
+sDL_GetRealGamepadTypeForID
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO SDL_GamepadType)
+sDL_GetRealGamepadTypeForID =
+  BG.unsafePerformIO hs_bindgen_ea844fcc269b3863
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMappingForID@
+foreign import ccall unsafe "hs_bindgen_3a88aaf2c38a542b"
+  hs_bindgen_3a88aaf2c38a542b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadMappingForID@
+hs_bindgen_3a88aaf2c38a542b
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_3a88aaf2c38a542b =
+  BG.fromFFIType hs_bindgen_3a88aaf2c38a542b_base
+
+{-# NOINLINE sDL_GetGamepadMappingForID #-}
+
+-- | Get the mapping of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the mapping string. Returns NULL if no mapping is available. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepads', 'sDL_GetGamepadMapping'
+--
+--     [C declaration]: @SDL_GetGamepadMappingForID@, defined at @SDL3\/SDL_gamepad.h 737:36@
+sDL_GetGamepadMappingForID
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO (BG.Ptr BG.CChar))
+sDL_GetGamepadMappingForID =
+  BG.unsafePerformIO hs_bindgen_3a88aaf2c38a542b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_OpenGamepad@
+foreign import ccall unsafe "hs_bindgen_d2263d27295e9ca6"
+  hs_bindgen_d2263d27295e9ca6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_OpenGamepad@
+hs_bindgen_d2263d27295e9ca6
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO (BG.Ptr SDL_Gamepad)))
+hs_bindgen_d2263d27295e9ca6 =
+  BG.fromFFIType hs_bindgen_d2263d27295e9ca6_base
+
+{-# NOINLINE sDL_OpenGamepad #-}
+
+-- | Open a gamepad for use.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: a gamepad identifier or NULL if an error occurred; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseGamepad', 'sDL_IsGamepad'
+--
+--     [C declaration]: @SDL_OpenGamepad@, defined at @SDL3\/SDL_gamepad.h 753:43@
+sDL_OpenGamepad :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO (BG.Ptr SDL_Gamepad))
+sDL_OpenGamepad =
+  BG.unsafePerformIO hs_bindgen_d2263d27295e9ca6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadFromID@
+foreign import ccall unsafe "hs_bindgen_a2eccf4e721a7b78"
+  hs_bindgen_a2eccf4e721a7b78_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadFromID@
+hs_bindgen_a2eccf4e721a7b78
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO (BG.Ptr SDL_Gamepad)))
+hs_bindgen_a2eccf4e721a7b78 =
+  BG.fromFFIType hs_bindgen_a2eccf4e721a7b78_base
+
+{-# NOINLINE sDL_GetGamepadFromID #-}
+
+-- | Get the 'SDL_Gamepad' associated with a joystick instance ID, if it has been opened.
+--
+--     [@instance_id@]: the joystick instance ID of the gamepad.
+--
+--     [Returns]: an 'SDL_Gamepad' on success or NULL on failure or if it hasn\'t been opened yet; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadFromID@, defined at @SDL3\/SDL_gamepad.h 767:43@
+sDL_GetGamepadFromID
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Joystick.SDL_JoystickID -> IO (BG.Ptr SDL_Gamepad))
+sDL_GetGamepadFromID =
+  BG.unsafePerformIO hs_bindgen_a2eccf4e721a7b78
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadFromPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_d5762153bda1c5a2"
+  hs_bindgen_d5762153bda1c5a2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadFromPlayerIndex@
+hs_bindgen_d5762153bda1c5a2 :: IO (BG.FunPtr (BG.CInt -> IO (BG.Ptr SDL_Gamepad)))
+hs_bindgen_d5762153bda1c5a2 =
+  BG.fromFFIType hs_bindgen_d5762153bda1c5a2_base
+
+{-# NOINLINE sDL_GetGamepadFromPlayerIndex #-}
+
+-- | Get the 'SDL_Gamepad' associated with a player index.
+--
+--     [@player_index@]: the player index, which different from the instance ID.
+--
+--     [Returns]: the 'SDL_Gamepad' associated with a player index.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPlayerIndex', 'sDL_SetGamepadPlayerIndex'
+--
+--     [C declaration]: @SDL_GetGamepadFromPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 782:43@
+sDL_GetGamepadFromPlayerIndex :: BG.FunPtr (BG.CInt -> IO (BG.Ptr SDL_Gamepad))
+sDL_GetGamepadFromPlayerIndex =
+  BG.unsafePerformIO hs_bindgen_d5762153bda1c5a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProperties@
+foreign import ccall unsafe "hs_bindgen_f6b1c3e515df26bf"
+  hs_bindgen_f6b1c3e515df26bf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProperties@
+hs_bindgen_f6b1c3e515df26bf
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_f6b1c3e515df26bf =
+  BG.fromFFIType hs_bindgen_f6b1c3e515df26bf_base
+
+{-# NOINLINE sDL_GetGamepadProperties #-}
+
+-- | Get the properties associated with an opened gamepad.
+--
+--     These properties are shared with the underlying joystick object.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_MONO_LED_BOOLEAN'@: true if this gamepad has an LED that has adjustable brightness
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_RGB_LED_BOOLEAN'@: true if this gamepad has an LED that has adjustable color
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_PLAYER_LED_BOOLEAN'@: true if this gamepad has a player LED
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_RUMBLE_BOOLEAN'@: true if this gamepad has left\/right rumble
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_TRIGGER_RUMBLE_BOOLEAN'@: true if this gamepad has simple trigger rumble
+--
+--     [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadProperties@, defined at @SDL3\/SDL_gamepad.h 811:46@
+sDL_GetGamepadProperties
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetGamepadProperties =
+  BG.unsafePerformIO hs_bindgen_f6b1c3e515df26bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadID@
+foreign import ccall unsafe "hs_bindgen_aeb6f834f1bb9bba"
+  hs_bindgen_aeb6f834f1bb9bba_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadID@
+hs_bindgen_aeb6f834f1bb9bba
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickID))
+hs_bindgen_aeb6f834f1bb9bba =
+  BG.fromFFIType hs_bindgen_aeb6f834f1bb9bba_base
+
+{-# NOINLINE sDL_GetGamepadID #-}
+
+-- | Get the instance ID of an opened gamepad.
+--
+--     [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+--
+--     [Returns]: the instance ID of the specified gamepad on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadID@, defined at @SDL3\/SDL_gamepad.h 831:44@
+sDL_GetGamepadID :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+sDL_GetGamepadID =
+  BG.unsafePerformIO hs_bindgen_aeb6f834f1bb9bba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadName@
+foreign import ccall unsafe "hs_bindgen_a6ba120e3c657e82"
+  hs_bindgen_a6ba120e3c657e82_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadName@
+hs_bindgen_a6ba120e3c657e82
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_a6ba120e3c657e82 =
+  BG.fromFFIType hs_bindgen_a6ba120e3c657e82_base
+
+{-# NOINLINE sDL_GetGamepadName #-}
+
+-- | Get the implementation-dependent name for an opened gamepad.
+--
+--     [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+--
+--     [Returns]: the implementation dependent name for the gamepad, or NULL if there is no name or the identifier passed is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadNameForID'
+--
+--     [C declaration]: @SDL_GetGamepadName@, defined at @SDL3\/SDL_gamepad.h 847:42@
+sDL_GetGamepadName :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGamepadName =
+  BG.unsafePerformIO hs_bindgen_a6ba120e3c657e82
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPath@
+foreign import ccall unsafe "hs_bindgen_25cf3224bc5505cc"
+  hs_bindgen_25cf3224bc5505cc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPath@
+hs_bindgen_25cf3224bc5505cc
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_25cf3224bc5505cc =
+  BG.fromFFIType hs_bindgen_25cf3224bc5505cc_base
+
+{-# NOINLINE sDL_GetGamepadPath #-}
+
+-- | Get the implementation-dependent path for an opened gamepad.
+--
+--     [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+--
+--     [Returns]: the implementation dependent path for the gamepad, or NULL if there is no path or the identifier passed is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPathForID'
+--
+--     [C declaration]: @SDL_GetGamepadPath@, defined at @SDL3\/SDL_gamepad.h 863:42@
+sDL_GetGamepadPath :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGamepadPath =
+  BG.unsafePerformIO hs_bindgen_25cf3224bc5505cc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadType@
+foreign import ccall unsafe "hs_bindgen_131b0de798357722"
+  hs_bindgen_131b0de798357722_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadType@
+hs_bindgen_131b0de798357722 :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL_GamepadType))
+hs_bindgen_131b0de798357722 =
+  BG.fromFFIType hs_bindgen_131b0de798357722_base
+
+{-# NOINLINE sDL_GetGamepadType #-}
+
+-- | Get the type of an opened gamepad.
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [Returns]: the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTypeForID'
+--
+--     [C declaration]: @SDL_GetGamepadType@, defined at @SDL3\/SDL_gamepad.h 878:45@
+sDL_GetGamepadType :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL_GamepadType)
+sDL_GetGamepadType =
+  BG.unsafePerformIO hs_bindgen_131b0de798357722
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetRealGamepadType@
+foreign import ccall unsafe "hs_bindgen_299f836c8b95a4d8"
+  hs_bindgen_299f836c8b95a4d8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetRealGamepadType@
+hs_bindgen_299f836c8b95a4d8 :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL_GamepadType))
+hs_bindgen_299f836c8b95a4d8 =
+  BG.fromFFIType hs_bindgen_299f836c8b95a4d8_base
+
+{-# NOINLINE sDL_GetRealGamepadType #-}
+
+-- | Get the type of an opened gamepad, ignoring any mapping override.
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [Returns]: the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRealGamepadTypeForID'
+--
+--     [C declaration]: @SDL_GetRealGamepadType@, defined at @SDL3\/SDL_gamepad.h 893:45@
+sDL_GetRealGamepadType :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL_GamepadType)
+sDL_GetRealGamepadType =
+  BG.unsafePerformIO hs_bindgen_299f836c8b95a4d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_c48d71502b4eef8f"
+  hs_bindgen_c48d71502b4eef8f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPlayerIndex@
+hs_bindgen_c48d71502b4eef8f :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO BG.CInt))
+hs_bindgen_c48d71502b4eef8f =
+  BG.fromFFIType hs_bindgen_c48d71502b4eef8f_base
+
+{-# NOINLINE sDL_GetGamepadPlayerIndex #-}
+
+-- | Get the player index of an opened gamepad.
+--
+--     For XInput gamepads this returns the XInput user index.
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [Returns]: the player index for gamepad, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGamepadPlayerIndex'
+--
+--     [C declaration]: @SDL_GetGamepadPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 909:33@
+sDL_GetGamepadPlayerIndex :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO BG.CInt)
+sDL_GetGamepadPlayerIndex =
+  BG.unsafePerformIO hs_bindgen_c48d71502b4eef8f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_90716136f5deb4d3"
+  hs_bindgen_90716136f5deb4d3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadPlayerIndex@
+hs_bindgen_90716136f5deb4d3 :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> BG.CInt -> IO BG.CBool))
+hs_bindgen_90716136f5deb4d3 =
+  BG.fromFFIType hs_bindgen_90716136f5deb4d3_base
+
+{-# NOINLINE sDL_SetGamepadPlayerIndex #-}
+
+-- | Set the player index of an opened gamepad.
+--
+--     [@gamepad@]: the gamepad object to adjust.
+--
+--     [@player_index@]: player index to assign to this gamepad, or -1 to clear the player index and turn off player LEDs.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPlayerIndex'
+--
+--     [C declaration]: @SDL_SetGamepadPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 926:34@
+sDL_SetGamepadPlayerIndex :: BG.FunPtr (BG.Ptr SDL_Gamepad -> BG.CInt -> IO BG.CBool)
+sDL_SetGamepadPlayerIndex =
+  BG.unsafePerformIO hs_bindgen_90716136f5deb4d3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadVendor@
+foreign import ccall unsafe "hs_bindgen_ffa764d02a95dc96"
+  hs_bindgen_ffa764d02a95dc96_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadVendor@
+hs_bindgen_ffa764d02a95dc96
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_ffa764d02a95dc96 =
+  BG.fromFFIType hs_bindgen_ffa764d02a95dc96_base
+
+{-# NOINLINE sDL_GetGamepadVendor #-}
+
+-- | Get the USB vendor ID of an opened gamepad, if available.
+--
+--     If the vendor ID isn\'t available this function returns 0.
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [Returns]: the USB vendor ID, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadVendorForID'
+--
+--     [C declaration]: @SDL_GetGamepadVendor@, defined at @SDL3\/SDL_gamepad.h 942:36@
+sDL_GetGamepadVendor :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetGamepadVendor =
+  BG.unsafePerformIO hs_bindgen_ffa764d02a95dc96
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProduct@
+foreign import ccall unsafe "hs_bindgen_22ebf47a7ce663ce"
+  hs_bindgen_22ebf47a7ce663ce_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProduct@
+hs_bindgen_22ebf47a7ce663ce
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_22ebf47a7ce663ce =
+  BG.fromFFIType hs_bindgen_22ebf47a7ce663ce_base
+
+{-# NOINLINE sDL_GetGamepadProduct #-}
+
+-- | Get the USB product ID of an opened gamepad, if available.
+--
+--     If the product ID isn\'t available this function returns 0.
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [Returns]: the USB product ID, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProductForID'
+--
+--     [C declaration]: @SDL_GetGamepadProduct@, defined at @SDL3\/SDL_gamepad.h 958:36@
+sDL_GetGamepadProduct :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetGamepadProduct =
+  BG.unsafePerformIO hs_bindgen_22ebf47a7ce663ce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProductVersion@
+foreign import ccall unsafe "hs_bindgen_cb998d733e296e5c"
+  hs_bindgen_cb998d733e296e5c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadProductVersion@
+hs_bindgen_cb998d733e296e5c
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_cb998d733e296e5c =
+  BG.fromFFIType hs_bindgen_cb998d733e296e5c_base
+
+{-# NOINLINE sDL_GetGamepadProductVersion #-}
+
+-- | Get the product version of an opened gamepad, if available.
+--
+--     If the product version isn\'t available this function returns 0.
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [Returns]: the USB product version, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProductVersionForID'
+--
+--     [C declaration]: @SDL_GetGamepadProductVersion@, defined at @SDL3\/SDL_gamepad.h 974:36@
+sDL_GetGamepadProductVersion :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetGamepadProductVersion =
+  BG.unsafePerformIO hs_bindgen_cb998d733e296e5c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadFirmwareVersion@
+foreign import ccall unsafe "hs_bindgen_dddc5b49b1eab050"
+  hs_bindgen_dddc5b49b1eab050_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadFirmwareVersion@
+hs_bindgen_dddc5b49b1eab050
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_dddc5b49b1eab050 =
+  BG.fromFFIType hs_bindgen_dddc5b49b1eab050_base
+
+{-# NOINLINE sDL_GetGamepadFirmwareVersion #-}
+
+-- | Get the firmware version of an opened gamepad, if available.
+--
+--     If the firmware version isn\'t available this function returns 0.
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [Returns]: the gamepad firmware version, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadFirmwareVersion@, defined at @SDL3\/SDL_gamepad.h 988:36@
+sDL_GetGamepadFirmwareVersion :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetGamepadFirmwareVersion =
+  BG.unsafePerformIO hs_bindgen_dddc5b49b1eab050
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSerial@
+foreign import ccall unsafe "hs_bindgen_ee2ba2bdd8e4e8f4"
+  hs_bindgen_ee2ba2bdd8e4e8f4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSerial@
+hs_bindgen_ee2ba2bdd8e4e8f4
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_ee2ba2bdd8e4e8f4 =
+  BG.fromFFIType hs_bindgen_ee2ba2bdd8e4e8f4_base
+
+{-# NOINLINE sDL_GetGamepadSerial #-}
+
+-- | Get the serial number of an opened gamepad, if available.
+--
+--     Returns the serial number of the gamepad, or NULL if it is not available.
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [Returns]: the serial number, or NULL if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSerial@, defined at @SDL3\/SDL_gamepad.h 1002:42@
+sDL_GetGamepadSerial :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGamepadSerial =
+  BG.unsafePerformIO hs_bindgen_ee2ba2bdd8e4e8f4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSteamHandle@
+foreign import ccall unsafe "hs_bindgen_3f35ecfbc73c387c"
+  hs_bindgen_3f35ecfbc73c387c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSteamHandle@
+hs_bindgen_3f35ecfbc73c387c
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Stdinc.Uint64))
+hs_bindgen_3f35ecfbc73c387c =
+  BG.fromFFIType hs_bindgen_3f35ecfbc73c387c_base
+
+{-# NOINLINE sDL_GetGamepadSteamHandle #-}
+
+-- | Get the Steam Input handle of an opened gamepad, if available.
+--
+--     Returns an InputHandle_t for the gamepad that can be used with Steam Input API: [https:\/\/partner.steamgames.com\/doc\/api\/ISteamInput](https://partner.steamgames.com/doc/api/ISteamInput)
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [Returns]: the gamepad handle, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSteamHandle@, defined at @SDL3\/SDL_gamepad.h 1017:36@
+sDL_GetGamepadSteamHandle :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Stdinc.Uint64)
+sDL_GetGamepadSteamHandle =
+  BG.unsafePerformIO hs_bindgen_3f35ecfbc73c387c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadConnectionState@
+foreign import ccall unsafe "hs_bindgen_53909ff1f2a38eeb"
+  hs_bindgen_53909ff1f2a38eeb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadConnectionState@
+hs_bindgen_53909ff1f2a38eeb
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickConnectionState))
+hs_bindgen_53909ff1f2a38eeb =
+  BG.fromFFIType hs_bindgen_53909ff1f2a38eeb_base
+
+{-# NOINLINE sDL_GetGamepadConnectionState #-}
+
+-- | Get the connection state of a gamepad.
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [Returns]: the connection state on success or @SDL_JOYSTICK_CONNECTION_INVALID@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadConnectionState@, defined at @SDL3\/SDL_gamepad.h 1031:57@
+sDL_GetGamepadConnectionState
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickConnectionState)
+sDL_GetGamepadConnectionState =
+  BG.unsafePerformIO hs_bindgen_53909ff1f2a38eeb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPowerInfo@
+foreign import ccall unsafe "hs_bindgen_c9db854f84cfdf17"
+  hs_bindgen_c9db854f84cfdf17_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadPowerInfo@
+hs_bindgen_c9db854f84cfdf17
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> BG.Ptr BG.CInt -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState))
+hs_bindgen_c9db854f84cfdf17 =
+  BG.fromFFIType hs_bindgen_c9db854f84cfdf17_base
+
+{-# NOINLINE sDL_GetGamepadPowerInfo #-}
+
+-- | Get the battery state of a gamepad.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     [@gamepad@]: the gamepad object to query.
+--
+--     [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 we can\'t determine a value or there is no battery.
+--
+--     [Returns]: the current battery state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadPowerInfo@, defined at @SDL3\/SDL_gamepad.h 1053:44@
+sDL_GetGamepadPowerInfo
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> BG.Ptr BG.CInt -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState)
+sDL_GetGamepadPowerInfo =
+  BG.unsafePerformIO hs_bindgen_c9db854f84cfdf17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadConnected@
+foreign import ccall unsafe "hs_bindgen_f53e7088d703eb0d"
+  hs_bindgen_f53e7088d703eb0d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadConnected@
+hs_bindgen_f53e7088d703eb0d :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO BG.CBool))
+hs_bindgen_f53e7088d703eb0d =
+  BG.fromFFIType hs_bindgen_f53e7088d703eb0d_base
+
+{-# NOINLINE sDL_GamepadConnected #-}
+
+-- | Check if a gamepad has been opened and is currently connected.
+--
+--     [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+--
+--     [Returns]: true if the gamepad has been opened and is currently connected, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GamepadConnected@, defined at @SDL3\/SDL_gamepad.h 1067:34@
+sDL_GamepadConnected :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO BG.CBool)
+sDL_GamepadConnected =
+  BG.unsafePerformIO hs_bindgen_f53e7088d703eb0d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadJoystick@
+foreign import ccall unsafe "hs_bindgen_437957a44b873407"
+  hs_bindgen_437957a44b873407_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadJoystick@
+hs_bindgen_437957a44b873407
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick)))
+hs_bindgen_437957a44b873407 =
+  BG.fromFFIType hs_bindgen_437957a44b873407_base
+
+{-# NOINLINE sDL_GetGamepadJoystick #-}
+
+-- | Get the underlying joystick from a gamepad.
+--
+--     This function will give you a SDL_Joystick object, which allows you to use the SDL_Joystick functions with a 'SDL_Gamepad' object. This would be useful for getting a joystick\'s position at any given time, even if it hasn\'t moved (moving it would produce an event, which would have the axis\' value).
+--
+--     The pointer returned is owned by the 'SDL_Gamepad'. You should not call SDL_CloseJoystick() on it, for example, since doing so will likely cause SDL to crash.
+--
+--     [@gamepad@]: the gamepad object that you want to get a joystick from.
+--
+--     [Returns]: an SDL_Joystick object, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadJoystick@, defined at @SDL3\/SDL_gamepad.h 1089:44@
+sDL_GetGamepadJoystick
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick))
+sDL_GetGamepadJoystick =
+  BG.unsafePerformIO hs_bindgen_437957a44b873407
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadEventsEnabled@
+foreign import ccall unsafe "hs_bindgen_bd360bbccf8e02d1"
+  hs_bindgen_bd360bbccf8e02d1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadEventsEnabled@
+hs_bindgen_bd360bbccf8e02d1 :: IO (BG.FunPtr (BG.CBool -> IO ()))
+hs_bindgen_bd360bbccf8e02d1 =
+  BG.fromFFIType hs_bindgen_bd360bbccf8e02d1_base
+
+{-# NOINLINE sDL_SetGamepadEventsEnabled #-}
+
+-- | Set the state of gamepad event processing.
+--
+--     If gamepad events are disabled, you must call @SDL_UpdateGamepads()@ yourself and check the state of the gamepad when you want gamepad information.
+--
+--     [@enabled@]: whether to process gamepad events or not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadEventsEnabled', 'sDL_UpdateGamepads'
+--
+--     [C declaration]: @SDL_SetGamepadEventsEnabled@, defined at @SDL3\/SDL_gamepad.h 1106:34@
+sDL_SetGamepadEventsEnabled :: BG.FunPtr (BG.CBool -> IO ())
+sDL_SetGamepadEventsEnabled =
+  BG.unsafePerformIO hs_bindgen_bd360bbccf8e02d1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadEventsEnabled@
+foreign import ccall unsafe "hs_bindgen_495749302a88fada"
+  hs_bindgen_495749302a88fada_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadEventsEnabled@
+hs_bindgen_495749302a88fada :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_495749302a88fada =
+  BG.fromFFIType hs_bindgen_495749302a88fada_base
+
+{-# NOINLINE sDL_GamepadEventsEnabled #-}
+
+-- | Query the state of gamepad event processing.
+--
+--     If gamepad events are disabled, you must call @SDL_UpdateGamepads()@ yourself and check the state of the gamepad when you want gamepad information.
+--
+--     [Returns]: true if gamepad events are being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGamepadEventsEnabled'
+--
+--     [C declaration]: @SDL_GamepadEventsEnabled@, defined at @SDL3\/SDL_gamepad.h 1122:34@
+sDL_GamepadEventsEnabled :: BG.FunPtr (IO BG.CBool)
+sDL_GamepadEventsEnabled =
+  BG.unsafePerformIO hs_bindgen_495749302a88fada
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadBindings@
+foreign import ccall unsafe "hs_bindgen_3bbe8c4408199173"
+  hs_bindgen_3bbe8c4408199173_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadBindings@
+hs_bindgen_3bbe8c4408199173
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_GamepadBinding))))
+hs_bindgen_3bbe8c4408199173 =
+  BG.fromFFIType hs_bindgen_3bbe8c4408199173_base
+
+{-# NOINLINE sDL_GetGamepadBindings #-}
+
+-- | Get the SDL joystick layer bindings for a gamepad.
+--
+--     [@gamepad@]: a gamepad.
+--
+--     [@count@]: a pointer filled in with the number of bindings returned.
+--
+--     [Returns]: a NULL terminated array of pointers to bindings or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadBindings@, defined at @SDL3\/SDL_gamepad.h 1138:51@
+sDL_GetGamepadBindings
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_GamepadBinding)))
+sDL_GetGamepadBindings =
+  BG.unsafePerformIO hs_bindgen_3bbe8c4408199173
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_UpdateGamepads@
+foreign import ccall unsafe "hs_bindgen_3029fdebe260ad88"
+  hs_bindgen_3029fdebe260ad88_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_UpdateGamepads@
+hs_bindgen_3029fdebe260ad88 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_3029fdebe260ad88 =
+  BG.fromFFIType hs_bindgen_3029fdebe260ad88_base
+
+{-# NOINLINE sDL_UpdateGamepads #-}
+
+-- | Manually pump gamepad updates if not using the loop.
+--
+--     This function is called automatically by the event loop if events are enabled. Under such circumstances, it will not be necessary to call this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateGamepads@, defined at @SDL3\/SDL_gamepad.h 1151:34@
+sDL_UpdateGamepads :: BG.FunPtr (IO ())
+sDL_UpdateGamepads =
+  BG.unsafePerformIO hs_bindgen_3029fdebe260ad88
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadTypeFromString@
+foreign import ccall unsafe "hs_bindgen_919d1827bf3ece38"
+  hs_bindgen_919d1827bf3ece38_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadTypeFromString@
+hs_bindgen_919d1827bf3ece38 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL_GamepadType))
+hs_bindgen_919d1827bf3ece38 =
+  BG.fromFFIType hs_bindgen_919d1827bf3ece38_base
+
+{-# NOINLINE sDL_GetGamepadTypeFromString #-}
+
+-- | Convert a string into 'SDL_GamepadType' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     [@str@]: string representing a 'SDL_GamepadType' type.
+--
+--     [Returns]: the 'SDL_GamepadType' enum corresponding to the input string, or @SDL_GAMEPAD_TYPE_UNKNOWN@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadStringForType'
+--
+--     [C declaration]: @SDL_GetGamepadTypeFromString@, defined at @SDL3\/SDL_gamepad.h 1171:45@
+sDL_GetGamepadTypeFromString :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL_GamepadType)
+sDL_GetGamepadTypeFromString =
+  BG.unsafePerformIO hs_bindgen_919d1827bf3ece38
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadStringForType@
+foreign import ccall unsafe "hs_bindgen_e0a2bc0194ece97f"
+  hs_bindgen_e0a2bc0194ece97f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadStringForType@
+hs_bindgen_e0a2bc0194ece97f :: IO (BG.FunPtr (SDL_GamepadType -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_e0a2bc0194ece97f =
+  BG.fromFFIType hs_bindgen_e0a2bc0194ece97f_base
+
+{-# NOINLINE sDL_GetGamepadStringForType #-}
+
+-- | Convert from an 'SDL_GamepadType' enum to a string.
+--
+--     [@type@]: an enum value for a given 'SDL_GamepadType'.
+--
+--     [Returns]: a string for the given type, or NULL if an invalid type is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTypeFromString'
+--
+--     [C declaration]: @SDL_GetGamepadStringForType@, defined at @SDL3\/SDL_gamepad.h 1187:42@
+sDL_GetGamepadStringForType :: BG.FunPtr (SDL_GamepadType -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGamepadStringForType =
+  BG.unsafePerformIO hs_bindgen_e0a2bc0194ece97f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAxisFromString@
+foreign import ccall unsafe "hs_bindgen_3e2dae12c3051365"
+  hs_bindgen_3e2dae12c3051365_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAxisFromString@
+hs_bindgen_3e2dae12c3051365 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL_GamepadAxis))
+hs_bindgen_3e2dae12c3051365 =
+  BG.fromFFIType hs_bindgen_3e2dae12c3051365_base
+
+{-# NOINLINE sDL_GetGamepadAxisFromString #-}
+
+-- | Convert a string into 'SDL_GamepadAxis' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     Note specially that \"righttrigger\" and \"lefttrigger\" map to @SDL_GAMEPAD_AXIS_RIGHT_TRIGGER@ and @SDL_GAMEPAD_AXIS_LEFT_TRIGGER@, respectively.
+--
+--     [@str@]: string representing a 'SDL_Gamepad' axis.
+--
+--     [Returns]: the 'SDL_GamepadAxis' enum corresponding to the input string, or @SDL_GAMEPAD_AXIS_INVALID@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadStringForAxis'
+--
+--     [C declaration]: @SDL_GetGamepadAxisFromString@, defined at @SDL3\/SDL_gamepad.h 1211:45@
+sDL_GetGamepadAxisFromString :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL_GamepadAxis)
+sDL_GetGamepadAxisFromString =
+  BG.unsafePerformIO hs_bindgen_3e2dae12c3051365
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadStringForAxis@
+foreign import ccall unsafe "hs_bindgen_4979edfa77e4fc76"
+  hs_bindgen_4979edfa77e4fc76_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadStringForAxis@
+hs_bindgen_4979edfa77e4fc76 :: IO (BG.FunPtr (SDL_GamepadAxis -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_4979edfa77e4fc76 =
+  BG.fromFFIType hs_bindgen_4979edfa77e4fc76_base
+
+{-# NOINLINE sDL_GetGamepadStringForAxis #-}
+
+-- | Convert from an 'SDL_GamepadAxis' enum to a string.
+--
+--     [@axis@]: an enum value for a given 'SDL_GamepadAxis'.
+--
+--     [Returns]: a string for the given axis, or NULL if an invalid axis is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadAxisFromString'
+--
+--     [C declaration]: @SDL_GetGamepadStringForAxis@, defined at @SDL3\/SDL_gamepad.h 1227:42@
+sDL_GetGamepadStringForAxis :: BG.FunPtr (SDL_GamepadAxis -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGamepadStringForAxis =
+  BG.unsafePerformIO hs_bindgen_4979edfa77e4fc76
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadHasAxis@
+foreign import ccall unsafe "hs_bindgen_3ea6abfb2ca9a69e"
+  hs_bindgen_3ea6abfb2ca9a69e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadHasAxis@
+hs_bindgen_3ea6abfb2ca9a69e :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadAxis -> IO BG.CBool))
+hs_bindgen_3ea6abfb2ca9a69e =
+  BG.fromFFIType hs_bindgen_3ea6abfb2ca9a69e_base
+
+{-# NOINLINE sDL_GamepadHasAxis #-}
+
+-- | Query whether a gamepad has a given axis.
+--
+--     This merely reports whether the gamepad\'s mapping defined this axis, as that is all the information SDL has about the physical device.
+--
+--     [@gamepad@]: a gamepad.
+--
+--     [@axis@]: an axis enum value (an 'SDL_GamepadAxis' value).
+--
+--     [Returns]: true if the gamepad has this axis, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasButton', 'sDL_GetGamepadAxis'
+--
+--     [C declaration]: @SDL_GamepadHasAxis@, defined at @SDL3\/SDL_gamepad.h 1246:34@
+sDL_GamepadHasAxis :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadAxis -> IO BG.CBool)
+sDL_GamepadHasAxis =
+  BG.unsafePerformIO hs_bindgen_3ea6abfb2ca9a69e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAxis@
+foreign import ccall unsafe "hs_bindgen_a8dfd9fddde7c51f"
+  hs_bindgen_a8dfd9fddde7c51f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAxis@
+hs_bindgen_a8dfd9fddde7c51f
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadAxis -> IO SDL3.Sys.Bindgen.Stdinc.Sint16))
+hs_bindgen_a8dfd9fddde7c51f =
+  BG.fromFFIType hs_bindgen_a8dfd9fddde7c51f_base
+
+{-# NOINLINE sDL_GetGamepadAxis #-}
+
+-- | Get the current state of an axis control on a gamepad.
+--
+--     The axis indices start at index 0.
+--
+--     For thumbsticks, the state is a value ranging from -32768 (up\/left) to 32767 (down\/right).
+--
+--     Triggers range from 0 when released to 32767 when fully pressed, and never return a negative value. Note that this differs from the value reported by the lower-level SDL_GetJoystickAxis(), which normally uses the full range.
+--
+--     Note that for invalid gamepads or axes, this will return 0. Zero is also a valid value in normal operation; usually it means a centered axis.
+--
+--     [@gamepad@]: a gamepad.
+--
+--     [@axis@]: an axis index (one of the 'SDL_GamepadAxis' values).
+--
+--     [Returns]: axis state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasAxis', 'sDL_GetGamepadButton'
+--
+--     [C declaration]: @SDL_GetGamepadAxis@, defined at @SDL3\/SDL_gamepad.h 1274:36@
+sDL_GetGamepadAxis
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadAxis -> IO SDL3.Sys.Bindgen.Stdinc.Sint16)
+sDL_GetGamepadAxis =
+  BG.unsafePerformIO hs_bindgen_a8dfd9fddde7c51f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButtonFromString@
+foreign import ccall unsafe "hs_bindgen_aacf61245766bd7f"
+  hs_bindgen_aacf61245766bd7f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButtonFromString@
+hs_bindgen_aacf61245766bd7f :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL_GamepadButton))
+hs_bindgen_aacf61245766bd7f =
+  BG.fromFFIType hs_bindgen_aacf61245766bd7f_base
+
+{-# NOINLINE sDL_GetGamepadButtonFromString #-}
+
+-- | Convert a string into an 'SDL_GamepadButton' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     [@str@]: string representing a 'SDL_Gamepad' button.
+--
+--     [Returns]: the 'SDL_GamepadButton' enum corresponding to the input string, or @SDL_GAMEPAD_BUTTON_INVALID@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadStringForButton'
+--
+--     [C declaration]: @SDL_GetGamepadButtonFromString@, defined at @SDL3\/SDL_gamepad.h 1294:47@
+sDL_GetGamepadButtonFromString :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL_GamepadButton)
+sDL_GetGamepadButtonFromString =
+  BG.unsafePerformIO hs_bindgen_aacf61245766bd7f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadStringForButton@
+foreign import ccall unsafe "hs_bindgen_e28b377b66d430c7"
+  hs_bindgen_e28b377b66d430c7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadStringForButton@
+hs_bindgen_e28b377b66d430c7 :: IO (BG.FunPtr (SDL_GamepadButton -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_e28b377b66d430c7 =
+  BG.fromFFIType hs_bindgen_e28b377b66d430c7_base
+
+{-# NOINLINE sDL_GetGamepadStringForButton #-}
+
+-- | Convert from an 'SDL_GamepadButton' enum to a string.
+--
+--     [@button@]: an enum value for a given 'SDL_GamepadButton'.
+--
+--     [Returns]: a string for the given button, or NULL if an invalid button is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadButtonFromString'
+--
+--     [C declaration]: @SDL_GetGamepadStringForButton@, defined at @SDL3\/SDL_gamepad.h 1310:42@
+sDL_GetGamepadStringForButton :: BG.FunPtr (SDL_GamepadButton -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGamepadStringForButton =
+  BG.unsafePerformIO hs_bindgen_e28b377b66d430c7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadHasButton@
+foreign import ccall unsafe "hs_bindgen_915b6e8126454256"
+  hs_bindgen_915b6e8126454256_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadHasButton@
+hs_bindgen_915b6e8126454256
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadButton -> IO BG.CBool))
+hs_bindgen_915b6e8126454256 =
+  BG.fromFFIType hs_bindgen_915b6e8126454256_base
+
+{-# NOINLINE sDL_GamepadHasButton #-}
+
+-- | Query whether a gamepad has a given button.
+--
+--     This merely reports whether the gamepad\'s mapping defined this button, as that is all the information SDL has about the physical device.
+--
+--     [@gamepad@]: a gamepad.
+--
+--     [@button@]: a button enum value (an 'SDL_GamepadButton' value).
+--
+--     [Returns]: true if the gamepad has this button, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasAxis'
+--
+--     [C declaration]: @SDL_GamepadHasButton@, defined at @SDL3\/SDL_gamepad.h 1328:34@
+sDL_GamepadHasButton :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadButton -> IO BG.CBool)
+sDL_GamepadHasButton =
+  BG.unsafePerformIO hs_bindgen_915b6e8126454256
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButton@
+foreign import ccall unsafe "hs_bindgen_f63603565928dd6d"
+  hs_bindgen_f63603565928dd6d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButton@
+hs_bindgen_f63603565928dd6d
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadButton -> IO BG.CBool))
+hs_bindgen_f63603565928dd6d =
+  BG.fromFFIType hs_bindgen_f63603565928dd6d_base
+
+{-# NOINLINE sDL_GetGamepadButton #-}
+
+-- | Get the current state of a button on a gamepad.
+--
+--     [@gamepad@]: a gamepad.
+--
+--     [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+--
+--     [Returns]: true if the button is pressed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasButton', 'sDL_GetGamepadAxis'
+--
+--     [C declaration]: @SDL_GetGamepadButton@, defined at @SDL3\/SDL_gamepad.h 1344:34@
+sDL_GetGamepadButton :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadButton -> IO BG.CBool)
+sDL_GetGamepadButton =
+  BG.unsafePerformIO hs_bindgen_f63603565928dd6d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButtonLabelForType@
+foreign import ccall unsafe "hs_bindgen_5d5da36c408f3ed5"
+  hs_bindgen_5d5da36c408f3ed5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButtonLabelForType@
+hs_bindgen_5d5da36c408f3ed5
+  :: IO (BG.FunPtr (SDL_GamepadType -> SDL_GamepadButton -> IO SDL_GamepadButtonLabel))
+hs_bindgen_5d5da36c408f3ed5 =
+  BG.fromFFIType hs_bindgen_5d5da36c408f3ed5_base
+
+{-# NOINLINE sDL_GetGamepadButtonLabelForType #-}
+
+-- | Get the label of a button on a gamepad.
+--
+--     [@type@]: the type of gamepad to check.
+--
+--     [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+--
+--     [Returns]: the 'SDL_GamepadButtonLabel' enum corresponding to the button label.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadButtonLabel'
+--
+--     [C declaration]: @SDL_GetGamepadButtonLabelForType@, defined at @SDL3\/SDL_gamepad.h 1359:52@
+sDL_GetGamepadButtonLabelForType
+  :: BG.FunPtr (SDL_GamepadType -> SDL_GamepadButton -> IO SDL_GamepadButtonLabel)
+sDL_GetGamepadButtonLabelForType =
+  BG.unsafePerformIO hs_bindgen_5d5da36c408f3ed5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButtonLabel@
+foreign import ccall unsafe "hs_bindgen_6c96bb1d7ac32853"
+  hs_bindgen_6c96bb1d7ac32853_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadButtonLabel@
+hs_bindgen_6c96bb1d7ac32853
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadButton -> IO SDL_GamepadButtonLabel))
+hs_bindgen_6c96bb1d7ac32853 =
+  BG.fromFFIType hs_bindgen_6c96bb1d7ac32853_base
+
+{-# NOINLINE sDL_GetGamepadButtonLabel #-}
+
+-- | Get the label of a button on a gamepad.
+--
+--     [@gamepad@]: a gamepad.
+--
+--     [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+--
+--     [Returns]: the 'SDL_GamepadButtonLabel' enum corresponding to the button label.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadButtonLabelForType'
+--
+--     [C declaration]: @SDL_GetGamepadButtonLabel@, defined at @SDL3\/SDL_gamepad.h 1374:52@
+sDL_GetGamepadButtonLabel
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadButton -> IO SDL_GamepadButtonLabel)
+sDL_GetGamepadButtonLabel =
+  BG.unsafePerformIO hs_bindgen_6c96bb1d7ac32853
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetNumGamepadTouchpads@
+foreign import ccall unsafe "hs_bindgen_de275259788d26ed"
+  hs_bindgen_de275259788d26ed_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetNumGamepadTouchpads@
+hs_bindgen_de275259788d26ed :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO BG.CInt))
+hs_bindgen_de275259788d26ed =
+  BG.fromFFIType hs_bindgen_de275259788d26ed_base
+
+{-# NOINLINE sDL_GetNumGamepadTouchpads #-}
+
+-- | Get the number of touchpads on a gamepad.
+--
+--     [@gamepad@]: a gamepad.
+--
+--     [Returns]: number of touchpads.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumGamepadTouchpadFingers'
+--
+--     [C declaration]: @SDL_GetNumGamepadTouchpads@, defined at @SDL3\/SDL_gamepad.h 1388:33@
+sDL_GetNumGamepadTouchpads :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO BG.CInt)
+sDL_GetNumGamepadTouchpads =
+  BG.unsafePerformIO hs_bindgen_de275259788d26ed
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetNumGamepadTouchpadFingers@
+foreign import ccall unsafe "hs_bindgen_acaeb05c5893aeba"
+  hs_bindgen_acaeb05c5893aeba_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetNumGamepadTouchpadFingers@
+hs_bindgen_acaeb05c5893aeba :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> BG.CInt -> IO BG.CInt))
+hs_bindgen_acaeb05c5893aeba =
+  BG.fromFFIType hs_bindgen_acaeb05c5893aeba_base
+
+{-# NOINLINE sDL_GetNumGamepadTouchpadFingers #-}
+
+-- | Get the number of supported simultaneous fingers on a touchpad on a game gamepad.
+--
+--     [@gamepad@]: a gamepad.
+--
+--     [@touchpad@]: a touchpad.
+--
+--     [Returns]: number of supported simultaneous fingers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTouchpadFinger', 'sDL_GetNumGamepadTouchpads'
+--
+--     [C declaration]: @SDL_GetNumGamepadTouchpadFingers@, defined at @SDL3\/SDL_gamepad.h 1405:33@
+sDL_GetNumGamepadTouchpadFingers :: BG.FunPtr (BG.Ptr SDL_Gamepad -> BG.CInt -> IO BG.CInt)
+sDL_GetNumGamepadTouchpadFingers =
+  BG.unsafePerformIO hs_bindgen_acaeb05c5893aeba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadTouchpadFinger@
+foreign import ccall unsafe "hs_bindgen_4408908532932c4e"
+  hs_bindgen_4408908532932c4e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadTouchpadFinger@
+hs_bindgen_4408908532932c4e
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Gamepad
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.Ptr BG.CBool
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_4408908532932c4e =
+  BG.fromFFIType hs_bindgen_4408908532932c4e_base
+
+{-# NOINLINE sDL_GetGamepadTouchpadFinger #-}
+
+-- | Get the current state of a finger on a touchpad on a gamepad.
+--
+--     [@gamepad@]: a gamepad.
+--
+--     [@touchpad@]: a touchpad.
+--
+--     [@finger@]: a finger.
+--
+--     [@down@]: a pointer filled with true if the finger is down, false otherwise, may be NULL.
+--
+--     [@x@]: a pointer filled with the x position, normalized 0 to 1, with the origin in the upper left, may be NULL.
+--
+--     [@y@]: a pointer filled with the y position, normalized 0 to 1, with the origin in the upper left, may be NULL.
+--
+--     [@pressure@]: a pointer filled with pressure value, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumGamepadTouchpadFingers'
+--
+--     [C declaration]: @SDL_GetGamepadTouchpadFinger@, defined at @SDL3\/SDL_gamepad.h 1429:34@
+sDL_GetGamepadTouchpadFinger
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Gamepad
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.Ptr BG.CBool
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> IO BG.CBool
+       )
+sDL_GetGamepadTouchpadFinger =
+  BG.unsafePerformIO hs_bindgen_4408908532932c4e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadHasSensor@
+foreign import ccall unsafe "hs_bindgen_041741220ac7e52d"
+  hs_bindgen_041741220ac7e52d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadHasSensor@
+hs_bindgen_041741220ac7e52d
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType -> IO BG.CBool))
+hs_bindgen_041741220ac7e52d =
+  BG.fromFFIType hs_bindgen_041741220ac7e52d_base
+
+{-# NOINLINE sDL_GamepadHasSensor #-}
+
+-- | Return whether a gamepad has a particular sensor.
+--
+--     [@gamepad@]: the gamepad to query.
+--
+--     [@type@]: the type of sensor to query.
+--
+--     [Returns]: true if the sensor exists, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadSensorData', 'sDL_GetGamepadSensorDataRate', 'sDL_SetGamepadSensorEnabled'
+--
+--     [C declaration]: @SDL_GamepadHasSensor@, defined at @SDL3\/SDL_gamepad.h 1446:34@
+sDL_GamepadHasSensor
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType -> IO BG.CBool)
+sDL_GamepadHasSensor =
+  BG.unsafePerformIO hs_bindgen_041741220ac7e52d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadSensorEnabled@
+foreign import ccall unsafe "hs_bindgen_04571bb432b35b67"
+  hs_bindgen_04571bb432b35b67_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadSensorEnabled@
+hs_bindgen_04571bb432b35b67
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType -> BG.CBool -> IO BG.CBool))
+hs_bindgen_04571bb432b35b67 =
+  BG.fromFFIType hs_bindgen_04571bb432b35b67_base
+
+{-# NOINLINE sDL_SetGamepadSensorEnabled #-}
+
+-- | Set whether data reporting for a gamepad sensor is enabled.
+--
+--     [@gamepad@]: the gamepad to update.
+--
+--     [@type@]: the type of sensor to enable\/disable.
+--
+--     [@enabled@]: whether data reporting should be enabled.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasSensor', 'sDL_GamepadSensorEnabled'
+--
+--     [C declaration]: @SDL_SetGamepadSensorEnabled@, defined at @SDL3\/SDL_gamepad.h 1464:34@
+sDL_SetGamepadSensorEnabled
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType -> BG.CBool -> IO BG.CBool)
+sDL_SetGamepadSensorEnabled =
+  BG.unsafePerformIO hs_bindgen_04571bb432b35b67
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadSensorEnabled@
+foreign import ccall unsafe "hs_bindgen_98c53abf20c77167"
+  hs_bindgen_98c53abf20c77167_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GamepadSensorEnabled@
+hs_bindgen_98c53abf20c77167
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType -> IO BG.CBool))
+hs_bindgen_98c53abf20c77167 =
+  BG.fromFFIType hs_bindgen_98c53abf20c77167_base
+
+{-# NOINLINE sDL_GamepadSensorEnabled #-}
+
+-- | Query whether sensor data reporting is enabled for a gamepad.
+--
+--     [@gamepad@]: the gamepad to query.
+--
+--     [@type@]: the type of sensor to query.
+--
+--     [Returns]: true if the sensor is enabled, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGamepadSensorEnabled'
+--
+--     [C declaration]: @SDL_GamepadSensorEnabled@, defined at @SDL3\/SDL_gamepad.h 1479:34@
+sDL_GamepadSensorEnabled
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType -> IO BG.CBool)
+sDL_GamepadSensorEnabled =
+  BG.unsafePerformIO hs_bindgen_98c53abf20c77167
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSensorDataRate@
+foreign import ccall unsafe "hs_bindgen_b6592bd554a6f989"
+  hs_bindgen_b6592bd554a6f989_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSensorDataRate@
+hs_bindgen_b6592bd554a6f989
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType -> IO BG.CFloat))
+hs_bindgen_b6592bd554a6f989 =
+  BG.fromFFIType hs_bindgen_b6592bd554a6f989_base
+
+{-# NOINLINE sDL_GetGamepadSensorDataRate #-}
+
+-- | Get the data rate (number of events per second) of a gamepad sensor.
+--
+--     [@gamepad@]: the gamepad to query.
+--
+--     [@type@]: the type of sensor to query.
+--
+--     [Returns]: the data rate, or 0.0f if the data rate is not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSensorDataRate@, defined at @SDL3\/SDL_gamepad.h 1492:35@
+sDL_GetGamepadSensorDataRate
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType -> IO BG.CFloat)
+sDL_GetGamepadSensorDataRate =
+  BG.unsafePerformIO hs_bindgen_b6592bd554a6f989
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSensorData@
+foreign import ccall unsafe "hs_bindgen_9753ce47b936d3ec"
+  hs_bindgen_9753ce47b936d3ec_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadSensorData@
+hs_bindgen_9753ce47b936d3ec
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Gamepad
+             -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+             -> BG.Ptr BG.CFloat
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_9753ce47b936d3ec =
+  BG.fromFFIType hs_bindgen_9753ce47b936d3ec_base
+
+{-# NOINLINE sDL_GetGamepadSensorData #-}
+
+-- | Get the current state of a gamepad sensor.
+--
+--     The number of values and interpretation of the data is sensor dependent. See the remarks in SDL_SensorType for details for each type of sensor.
+--
+--     [@gamepad@]: the gamepad to query.
+--
+--     [@type@]: the type of sensor to query.
+--
+--     [@data@]: a pointer filled with the current sensor state.
+--
+--     [@num_values@]: the number of values to write to data.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSensorData@, defined at @SDL3\/SDL_gamepad.h 1511:34@
+sDL_GetGamepadSensorData
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Gamepad
+         -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+         -> BG.Ptr BG.CFloat
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_GetGamepadSensorData =
+  BG.unsafePerformIO hs_bindgen_9753ce47b936d3ec
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_RumbleGamepad@
+foreign import ccall unsafe "hs_bindgen_66c29b053dd2103a"
+  hs_bindgen_66c29b053dd2103a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_RumbleGamepad@
+hs_bindgen_66c29b053dd2103a
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Gamepad
+             -> SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_66c29b053dd2103a =
+  BG.fromFFIType hs_bindgen_66c29b053dd2103a_base
+
+{-# NOINLINE sDL_RumbleGamepad #-}
+
+-- | Start a rumble effect on a gamepad.
+--
+--     Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     This function requires you to process SDL events or call SDL_UpdateJoysticks() to update rumble state.
+--
+--     [@gamepad@]: the gamepad to vibrate.
+--
+--     [@low_frequency_rumble@]: the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF.
+--
+--     [@high_frequency_rumble@]: the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF.
+--
+--     [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RumbleGamepad@, defined at @SDL3\/SDL_gamepad.h 1535:34@
+sDL_RumbleGamepad
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Gamepad
+         -> SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_RumbleGamepad =
+  BG.unsafePerformIO hs_bindgen_66c29b053dd2103a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_RumbleGamepadTriggers@
+foreign import ccall unsafe "hs_bindgen_d96d791857c3d06b"
+  hs_bindgen_d96d791857c3d06b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_RumbleGamepadTriggers@
+hs_bindgen_d96d791857c3d06b
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Gamepad
+             -> SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_d96d791857c3d06b =
+  BG.fromFFIType hs_bindgen_d96d791857c3d06b_base
+
+{-# NOINLINE sDL_RumbleGamepadTriggers #-}
+
+-- | Start a rumble effect in the gamepad\'s triggers.
+--
+--     Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     Note that this is rumbling of the /triggers/ and not the gamepad as a whole. This is currently only supported on Xbox One gamepads. If you want the (more common) whole-gamepad rumble, use @SDL_RumbleGamepad()@ instead.
+--
+--     This function requires you to process SDL events or call SDL_UpdateJoysticks() to update rumble state.
+--
+--     [@gamepad@]: the gamepad to vibrate.
+--
+--     [@left_rumble@]: the intensity of the left trigger rumble motor, from 0 to 0xFFFF.
+--
+--     [@right_rumble@]: the intensity of the right trigger rumble motor, from 0 to 0xFFFF.
+--
+--     [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RumbleGamepad'
+--
+--     [C declaration]: @SDL_RumbleGamepadTriggers@, defined at @SDL3\/SDL_gamepad.h 1565:34@
+sDL_RumbleGamepadTriggers
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Gamepad
+         -> SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_RumbleGamepadTriggers =
+  BG.unsafePerformIO hs_bindgen_d96d791857c3d06b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadLED@
+foreign import ccall unsafe "hs_bindgen_fb1de1463dc236a8"
+  hs_bindgen_fb1de1463dc236a8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SetGamepadLED@
+hs_bindgen_fb1de1463dc236a8
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Gamepad
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_fb1de1463dc236a8 =
+  BG.fromFFIType hs_bindgen_fb1de1463dc236a8_base
+
+{-# NOINLINE sDL_SetGamepadLED #-}
+
+-- | Update a gamepad\'s LED color.
+--
+--     An example of a joystick LED is the light on the back of a PlayStation 4\'s DualShock 4 controller.
+--
+--     For gamepads with a single color LED, the maximum of the RGB values will be used as the LED brightness.
+--
+--     [@gamepad@]: the gamepad to update.
+--
+--     [@red@]: the intensity of the red LED.
+--
+--     [@green@]: the intensity of the green LED.
+--
+--     [@blue@]: the intensity of the blue LED.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGamepadLED@, defined at @SDL3\/SDL_gamepad.h 1587:34@
+sDL_SetGamepadLED
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Gamepad
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO BG.CBool
+       )
+sDL_SetGamepadLED =
+  BG.unsafePerformIO hs_bindgen_fb1de1463dc236a8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SendGamepadEffect@
+foreign import ccall unsafe "hs_bindgen_5961396a3fadcac6"
+  hs_bindgen_5961396a3fadcac6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_SendGamepadEffect@
+hs_bindgen_5961396a3fadcac6
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO BG.CBool))
+hs_bindgen_5961396a3fadcac6 =
+  BG.fromFFIType hs_bindgen_5961396a3fadcac6_base
+
+{-# NOINLINE sDL_SendGamepadEffect #-}
+
+-- | Send a gamepad specific effect packet.
+--
+--     [@gamepad@]: the gamepad to affect.
+--
+--     [@data@]: the data to send to the gamepad.
+--
+--     [@size@]: the size of the data to send to the gamepad.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SendGamepadEffect@, defined at @SDL3\/SDL_gamepad.h 1602:34@
+sDL_SendGamepadEffect
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO BG.CBool)
+sDL_SendGamepadEffect =
+  BG.unsafePerformIO hs_bindgen_5961396a3fadcac6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_CloseGamepad@
+foreign import ccall unsafe "hs_bindgen_599bdf2afa4631b2"
+  hs_bindgen_599bdf2afa4631b2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_CloseGamepad@
+hs_bindgen_599bdf2afa4631b2 :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> IO ()))
+hs_bindgen_599bdf2afa4631b2 =
+  BG.fromFFIType hs_bindgen_599bdf2afa4631b2_base
+
+{-# NOINLINE sDL_CloseGamepad #-}
+
+-- | Close a gamepad previously opened with @SDL_OpenGamepad()@.
+--
+--     [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenGamepad'
+--
+--     [C declaration]: @SDL_CloseGamepad@, defined at @SDL3\/SDL_gamepad.h 1616:34@
+sDL_CloseGamepad :: BG.FunPtr (BG.Ptr SDL_Gamepad -> IO ())
+sDL_CloseGamepad =
+  BG.unsafePerformIO hs_bindgen_599bdf2afa4631b2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAppleSFSymbolsNameForButton@
+foreign import ccall unsafe "hs_bindgen_901b303b0d647ea4"
+  hs_bindgen_901b303b0d647ea4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAppleSFSymbolsNameForButton@
+hs_bindgen_901b303b0d647ea4
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadButton -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_901b303b0d647ea4 =
+  BG.fromFFIType hs_bindgen_901b303b0d647ea4_base
+
+{-# NOINLINE sDL_GetGamepadAppleSFSymbolsNameForButton #-}
+
+-- | Return the sfSymbolsName for a given button on a gamepad on Apple platforms.
+--
+--     [@gamepad@]: the gamepad to query.
+--
+--     [@button@]: a button on the gamepad.
+--
+--     [Returns]: the sfSymbolsName or NULL if the name can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadAppleSFSymbolsNameForAxis'
+--
+--     [C declaration]: @SDL_GetGamepadAppleSFSymbolsNameForButton@, defined at @SDL3\/SDL_gamepad.h 1632:42@
+sDL_GetGamepadAppleSFSymbolsNameForButton
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadButton -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGamepadAppleSFSymbolsNameForButton =
+  BG.unsafePerformIO hs_bindgen_901b303b0d647ea4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAppleSFSymbolsNameForAxis@
+foreign import ccall unsafe "hs_bindgen_0f564808a8b0fec7"
+  hs_bindgen_0f564808a8b0fec7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_get_SDL_GetGamepadAppleSFSymbolsNameForAxis@
+hs_bindgen_0f564808a8b0fec7
+  :: IO (BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadAxis -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_0f564808a8b0fec7 =
+  BG.fromFFIType hs_bindgen_0f564808a8b0fec7_base
+
+{-# NOINLINE sDL_GetGamepadAppleSFSymbolsNameForAxis #-}
+
+-- | Return the sfSymbolsName for a given axis on a gamepad on Apple platforms.
+--
+--     [@gamepad@]: the gamepad to query.
+--
+--     [@axis@]: an axis on the gamepad.
+--
+--     [Returns]: the sfSymbolsName or NULL if the name can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadAppleSFSymbolsNameForButton'
+--
+--     [C declaration]: @SDL_GetGamepadAppleSFSymbolsNameForAxis@, defined at @SDL3\/SDL_gamepad.h 1647:42@
+sDL_GetGamepadAppleSFSymbolsNameForAxis
+  :: BG.FunPtr (BG.Ptr SDL_Gamepad -> SDL_GamepadAxis -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGamepadAppleSFSymbolsNameForAxis =
+  BG.unsafePerformIO hs_bindgen_0f564808a8b0fec7
diff --git a/src/SDL3/Sys/Bindgen/Gamepad/Safe.hs b/src/SDL3/Sys/Bindgen/Gamepad/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Gamepad/Safe.hs
@@ -0,0 +1,3251 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Gamepad.Safe (
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_AddGamepadMapping,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_AddGamepadMappingsFromIO,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_AddGamepadMappingsFromFile,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_ReloadGamepadMappings,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadMappings,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadMappingForGUID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadMapping,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_SetGamepadMapping,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_HasGamepad,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepads,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_IsGamepad,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadNameForID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadPathForID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadPlayerIndexForID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadGUIDForID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadVendorForID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadProductForID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadProductVersionForID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadTypeForID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetRealGamepadTypeForID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadMappingForID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_OpenGamepad,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadFromID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadFromPlayerIndex,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadProperties,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadID,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadName,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadPath,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadType,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetRealGamepadType,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadPlayerIndex,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_SetGamepadPlayerIndex,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadVendor,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadProduct,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadProductVersion,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadFirmwareVersion,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadSerial,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadSteamHandle,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadConnectionState,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadPowerInfo,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GamepadConnected,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadJoystick,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_SetGamepadEventsEnabled,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GamepadEventsEnabled,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadBindings,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_UpdateGamepads,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadTypeFromString,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadStringForType,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadAxisFromString,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadStringForAxis,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GamepadHasAxis,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadAxis,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadButtonFromString,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadStringForButton,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GamepadHasButton,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadButton,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadButtonLabelForType,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadButtonLabel,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetNumGamepadTouchpads,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetNumGamepadTouchpadFingers,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadTouchpadFinger,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GamepadHasSensor,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_SetGamepadSensorEnabled,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GamepadSensorEnabled,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadSensorDataRate,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadSensorData,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_RumbleGamepad,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_RumbleGamepadTriggers,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_SetGamepadLED,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_SendGamepadEffect,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_CloseGamepad,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadAppleSFSymbolsNameForButton,
+  SDL3.Sys.Bindgen.Gamepad.Safe.sDL_GetGamepadAppleSFSymbolsNameForAxis,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Gamepad
+import SDL3.Sys.Bindgen.Guid qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Joystick qualified
+import SDL3.Sys.Bindgen.Power qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_gamepad.h>"
+         , "signed int hs_bindgen_bfecaa94b4bb559c ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AddGamepadMapping)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_353a6b5bd096f6c7 ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AddGamepadMappingsFromIO)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_614bba8a883d270a ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AddGamepadMappingsFromFile)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_31760265cd8832be (void)"
+         , "{"
+         , "  return (SDL_ReloadGamepadMappings)();"
+         , "}"
+         , "char **hs_bindgen_81df6a54918d3add ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadMappings)(arg1);"
+         , "}"
+         , "char *hs_bindgen_896f29e315329343 ("
+         , "  SDL_GUID *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadMappingForGUID)(*arg1);"
+         , "}"
+         , "char *hs_bindgen_5d0f77ae41093626 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadMapping)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_cc4c1668ad855e48 ("
+         , "  SDL_JoystickID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGamepadMapping)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ead7e9bae6cc8b6c (void)"
+         , "{"
+         , "  return (SDL_HasGamepad)();"
+         , "}"
+         , "SDL_JoystickID *hs_bindgen_421fff3e92caf69d ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepads)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_9b50cb92bd86f924 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_IsGamepad)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_6a86daab9ce329fa ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadNameForID)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_e0c61c43c91c2ad5 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadPathForID)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_9e9627ec0fb95c91 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadPlayerIndexForID)(arg1);"
+         , "}"
+         , "void hs_bindgen_894e3d306a7238d1 ("
+         , "  SDL_JoystickID arg1,"
+         , "  SDL_GUID *arg2"
+         , ")"
+         , "{"
+         , "  *arg2 = (SDL_GetGamepadGUIDForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_e7c705655b3a7874 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadVendorForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_4e686291196aa2c3 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadProductForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_1ccf92ac47175916 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadProductVersionForID)(arg1);"
+         , "}"
+         , "SDL_GamepadType hs_bindgen_40fe0886e7b4ca2b ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadTypeForID)(arg1);"
+         , "}"
+         , "SDL_GamepadType hs_bindgen_ce2f9a72f07740df ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRealGamepadTypeForID)(arg1);"
+         , "}"
+         , "char *hs_bindgen_35f90517327ebff6 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadMappingForID)(arg1);"
+         , "}"
+         , "SDL_Gamepad *hs_bindgen_7a69f326fc28f33f ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenGamepad)(arg1);"
+         , "}"
+         , "SDL_Gamepad *hs_bindgen_4439659d3691bcae ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadFromID)(arg1);"
+         , "}"
+         , "SDL_Gamepad *hs_bindgen_9fa3f1ff076954bb ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadFromPlayerIndex)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_f9762d299959cd11 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadProperties)(arg1);"
+         , "}"
+         , "SDL_JoystickID hs_bindgen_88d41ce44a0eaed7 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadID)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_a897dca974b53f52 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadName)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_94e78977a2626634 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadPath)(arg1);"
+         , "}"
+         , "SDL_GamepadType hs_bindgen_9bee20d3afd78c1c ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadType)(arg1);"
+         , "}"
+         , "SDL_GamepadType hs_bindgen_991d5e997600b0ae ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRealGamepadType)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_9092bfb7b9ba5238 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadPlayerIndex)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_d6c6ba326b1b08b5 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGamepadPlayerIndex)(arg1, arg2);"
+         , "}"
+         , "Uint16 hs_bindgen_b499336f8c368df7 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadVendor)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_6795759ef7183633 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadProduct)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_aad1976ca8def689 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadProductVersion)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_9c5cbeb562bcb1a7 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadFirmwareVersion)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_d5f06aeaa91c80e0 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadSerial)(arg1);"
+         , "}"
+         , "Uint64 hs_bindgen_67b2a6827bcd3e6d ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadSteamHandle)(arg1);"
+         , "}"
+         , "SDL_JoystickConnectionState hs_bindgen_51ab18aa239a2b97 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadConnectionState)(arg1);"
+         , "}"
+         , "SDL_PowerState hs_bindgen_9ac35ffbdb9db2d8 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadPowerInfo)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ceb9282898627775 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GamepadConnected)(arg1);"
+         , "}"
+         , "SDL_Joystick *hs_bindgen_c1e15069e5f0b3b4 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadJoystick)(arg1);"
+         , "}"
+         , "void hs_bindgen_aa68cf392dbe1717 ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SetGamepadEventsEnabled)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_cd08b36ef0436bc1 (void)"
+         , "{"
+         , "  return (SDL_GamepadEventsEnabled)();"
+         , "}"
+         , "SDL_GamepadBinding **hs_bindgen_213ad716fb12ea93 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadBindings)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_0006fa783d3b66ec (void)"
+         , "{"
+         , "  (SDL_UpdateGamepads)();"
+         , "}"
+         , "SDL_GamepadType hs_bindgen_793ab6d7edd0a66d ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadTypeFromString)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_d426a8b3d196baf4 ("
+         , "  SDL_GamepadType arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadStringForType)(arg1);"
+         , "}"
+         , "SDL_GamepadAxis hs_bindgen_5a9d122ea5094f40 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadAxisFromString)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_9cbed523522c86f2 ("
+         , "  SDL_GamepadAxis arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadStringForAxis)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_6d87cb6c759a128e ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadAxis arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GamepadHasAxis)(arg1, arg2);"
+         , "}"
+         , "Sint16 hs_bindgen_d4e206062bf3a0b7 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadAxis arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadAxis)(arg1, arg2);"
+         , "}"
+         , "SDL_GamepadButton hs_bindgen_3d3d13260e5bf752 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadButtonFromString)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_7d3134eb357b2911 ("
+         , "  SDL_GamepadButton arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadStringForButton)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_835e151fd6fbdcd9 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GamepadHasButton)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_930a123ab5a67173 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadButton)(arg1, arg2);"
+         , "}"
+         , "SDL_GamepadButtonLabel hs_bindgen_3a07981024fde2b9 ("
+         , "  SDL_GamepadType arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadButtonLabelForType)(arg1, arg2);"
+         , "}"
+         , "SDL_GamepadButtonLabel hs_bindgen_80f031ee04caea84 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadButtonLabel)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_65d4ab0a10c0f69e ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumGamepadTouchpads)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_d33ef1d9882dcbad ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumGamepadTouchpadFingers)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_225a3688e71f439f ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  _Bool *arg4,"
+         , "  float *arg5,"
+         , "  float *arg6,"
+         , "  float *arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadTouchpadFinger)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_1b3239ce64af9f86 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GamepadHasSensor)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_3e3fc29af15c71c1 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGamepadSensorEnabled)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_826f084dc9c761ff ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GamepadSensorEnabled)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_69751d524bc7ba71 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadSensorDataRate)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_2c02178932dc8e57 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2,"
+         , "  float *arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadSensorData)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_36f6edc2de497d1f ("
+         , "  SDL_Gamepad *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RumbleGamepad)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_1ab471fbae93c977 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RumbleGamepadTriggers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_99951861ed614368 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGamepadLED)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_0a60e2e403cd6afc ("
+         , "  SDL_Gamepad *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SendGamepadEffect)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_7615a65af389a834 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseGamepad)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_99f1aa16515a60df ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadAppleSFSymbolsNameForButton)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_076ad522cfc3e68e ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadAxis arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadAppleSFSymbolsNameForAxis)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_AddGamepadMapping@
+foreign import ccall safe "hs_bindgen_bfecaa94b4bb559c"
+  hs_bindgen_bfecaa94b4bb559c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_AddGamepadMapping@
+hs_bindgen_bfecaa94b4bb559c
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_bfecaa94b4bb559c =
+  BG.fromFFIType hs_bindgen_bfecaa94b4bb559c_base
+
+-- | Add support for gamepads that SDL is unaware of or change the binding of an existing gamepad.
+--
+--     The mapping string has the format \"GUID,name,mapping\", where GUID is the string value from SDL_GUIDToString(), name is the human readable string for the device and mappings are gamepad mappings to joystick ones. Under Windows there is a reserved GUID of \"xinput\" that covers all XInput devices. The mapping format for joystick is:
+--
+--     * @bX@: a joystick button, index X
+--
+--     * @hX.Y@: hat X with value Y
+--
+--     * @aX@: axis X of the joystick
+--
+--     Buttons can be used as a gamepad axes and vice versa.
+--
+--     If a device with this GUID is already plugged in, SDL will generate an SDL_EVENT_GAMEPAD_ADDED event.
+--
+--     This string shows an example of a valid mapping for a gamepad:
+--
+--     @
+--     \"341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\"
+--     @
+--
+--     [Returns]: 1 if a new mapping is added, 0 if an existing mapping is updated, -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMappingsFromFile', 'sDL_AddGamepadMappingsFromIO', 'sDL_GetGamepadMapping', 'sDL_GetGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     [C declaration]: @SDL_AddGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 346:33@
+sDL_AddGamepadMapping
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mapping@]: the mapping string.
+  -> IO BG.CInt
+sDL_AddGamepadMapping = hs_bindgen_bfecaa94b4bb559c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_AddGamepadMappingsFromIO@
+foreign import ccall safe "hs_bindgen_353a6b5bd096f6c7"
+  hs_bindgen_353a6b5bd096f6c7_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_AddGamepadMappingsFromIO@
+hs_bindgen_353a6b5bd096f6c7
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO BG.CInt
+hs_bindgen_353a6b5bd096f6c7 =
+  BG.fromFFIType hs_bindgen_353a6b5bd096f6c7_base
+
+-- | Load a set of gamepad mappings from an SDL_IOStream.
+--
+--     You can call this function several times, if needed, to load different database files.
+--
+--     If a new mapping is loaded for an already known gamepad GUID, the later version will overwrite the one currently loaded.
+--
+--     Any new mappings for already plugged in controllers will generate SDL_EVENT_GAMEPAD_ADDED events.
+--
+--     Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).
+--
+--     This function will load the text database entirely in memory before processing it, so take this into consideration if you are in a memory constrained environment.
+--
+--     [Returns]: the number of mappings added or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_AddGamepadMappingsFromFile', 'sDL_GetGamepadMapping', 'sDL_GetGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     [C declaration]: @SDL_AddGamepadMappingsFromIO@, defined at @SDL3\/SDL_gamepad.h 386:33@
+sDL_AddGamepadMappingsFromIO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the mappings to be added.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+  -> IO BG.CInt
+sDL_AddGamepadMappingsFromIO =
+  hs_bindgen_353a6b5bd096f6c7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_AddGamepadMappingsFromFile@
+foreign import ccall safe "hs_bindgen_614bba8a883d270a"
+  hs_bindgen_614bba8a883d270a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_AddGamepadMappingsFromFile@
+hs_bindgen_614bba8a883d270a
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_614bba8a883d270a =
+  BG.fromFFIType hs_bindgen_614bba8a883d270a_base
+
+-- | Load a set of gamepad mappings from a file.
+--
+--     You can call this function several times, if needed, to load different database files.
+--
+--     If a new mapping is loaded for an already known gamepad GUID, the later version will overwrite the one currently loaded.
+--
+--     Any new mappings for already plugged in controllers will generate SDL_EVENT_GAMEPAD_ADDED events.
+--
+--     Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).
+--
+--     [Returns]: the number of mappings added or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_AddGamepadMappingsFromIO', 'sDL_GetGamepadMapping', 'sDL_GetGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     [C declaration]: @SDL_AddGamepadMappingsFromFile@, defined at @SDL3\/SDL_gamepad.h 420:33@
+sDL_AddGamepadMappingsFromFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the mappings file to load.
+  -> IO BG.CInt
+sDL_AddGamepadMappingsFromFile =
+  hs_bindgen_614bba8a883d270a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_ReloadGamepadMappings@
+foreign import ccall safe "hs_bindgen_31760265cd8832be"
+  hs_bindgen_31760265cd8832be_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_ReloadGamepadMappings@
+hs_bindgen_31760265cd8832be :: IO BG.CBool
+hs_bindgen_31760265cd8832be =
+  BG.fromFFIType hs_bindgen_31760265cd8832be_base
+
+-- | Reinitialize the SDL mapping database to its initial state.
+--
+--     This will generate gamepad events as needed if device mappings change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReloadGamepadMappings@, defined at @SDL3\/SDL_gamepad.h 434:34@
+sDL_ReloadGamepadMappings :: IO BG.CBool
+sDL_ReloadGamepadMappings =
+  hs_bindgen_31760265cd8832be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadMappings@
+foreign import ccall safe "hs_bindgen_81df6a54918d3add"
+  hs_bindgen_81df6a54918d3add_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadMappings@
+hs_bindgen_81df6a54918d3add
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+hs_bindgen_81df6a54918d3add =
+  BG.fromFFIType hs_bindgen_81df6a54918d3add_base
+
+-- | Get the current gamepad mappings.
+--
+--     [Returns]: an array of the mapping strings, NULL-terminated, or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadMappings@, defined at @SDL3\/SDL_gamepad.h 450:37@
+sDL_GetGamepadMappings
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of mappings returned, can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+sDL_GetGamepadMappings = hs_bindgen_81df6a54918d3add
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadMappingForGUID@
+foreign import ccall safe "hs_bindgen_896f29e315329343"
+  hs_bindgen_896f29e315329343_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadMappingForGUID@
+hs_bindgen_896f29e315329343
+  :: BG.Ptr SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_896f29e315329343 =
+  BG.fromFFIType hs_bindgen_896f29e315329343_base
+
+-- | Get the gamepad mapping string for a given GUID.
+--
+--     [Returns]: a mapping string or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetJoystickGUIDForID, SDL_GetJoystickGUID
+--
+--     [C declaration]: @SDL_GetGamepadMappingForGUID@, defined at @SDL3\/SDL_gamepad.h 467:36@
+sDL_GetGamepadMappingForGUID
+  :: SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: a structure containing the GUID for which a mapping is desired.
+  -> IO (BG.Ptr BG.CChar)
+sDL_GetGamepadMappingForGUID =
+  \guid0 ->
+    BG.with
+      guid0
+      ( \guid1 ->
+          hs_bindgen_896f29e315329343 guid1
+      )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadMapping@
+foreign import ccall safe "hs_bindgen_5d0f77ae41093626"
+  hs_bindgen_5d0f77ae41093626_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadMapping@
+hs_bindgen_5d0f77ae41093626
+  :: BG.Ptr SDL_Gamepad
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_5d0f77ae41093626 =
+  BG.fromFFIType hs_bindgen_5d0f77ae41093626_base
+
+-- | Get the current mapping of a gamepad.
+--
+--     Details about mappings are discussed with @SDL_AddGamepadMapping()@.
+--
+--     [Returns]: a string that has the gamepad\'s mapping or NULL if no mapping is available; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_GetGamepadMappingForID', 'sDL_GetGamepadMappingForGUID', 'sDL_SetGamepadMapping'
+--
+--     [C declaration]: @SDL_GetGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 488:36@
+sDL_GetGamepadMapping
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad you want to get the current mapping for.
+  -> IO (BG.Ptr BG.CChar)
+sDL_GetGamepadMapping = hs_bindgen_5d0f77ae41093626
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SetGamepadMapping@
+foreign import ccall safe "hs_bindgen_cc4c1668ad855e48"
+  hs_bindgen_cc4c1668ad855e48_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SetGamepadMapping@
+hs_bindgen_cc4c1668ad855e48
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_cc4c1668ad855e48 =
+  BG.fromFFIType hs_bindgen_cc4c1668ad855e48_base
+
+-- | Set the current mapping of a joystick or gamepad.
+--
+--     Details about mappings are discussed with @SDL_AddGamepadMapping()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_GetGamepadMapping'
+--
+--     [C declaration]: @SDL_SetGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 508:34@
+sDL_SetGamepadMapping
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mapping@]: the mapping to use for this device, or NULL to clear the mapping.
+  -> IO BG.CBool
+sDL_SetGamepadMapping = hs_bindgen_cc4c1668ad855e48
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_HasGamepad@
+foreign import ccall safe "hs_bindgen_ead7e9bae6cc8b6c"
+  hs_bindgen_ead7e9bae6cc8b6c_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_HasGamepad@
+hs_bindgen_ead7e9bae6cc8b6c :: IO BG.CBool
+hs_bindgen_ead7e9bae6cc8b6c =
+  BG.fromFFIType hs_bindgen_ead7e9bae6cc8b6c_base
+
+-- | Return whether a gamepad is currently connected.
+--
+--     [Returns]: true if a gamepad is connected, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_HasGamepad@, defined at @SDL3\/SDL_gamepad.h 521:34@
+sDL_HasGamepad :: IO BG.CBool
+sDL_HasGamepad = hs_bindgen_ead7e9bae6cc8b6c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepads@
+foreign import ccall safe "hs_bindgen_421fff3e92caf69d"
+  hs_bindgen_421fff3e92caf69d_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepads@
+hs_bindgen_421fff3e92caf69d
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+hs_bindgen_421fff3e92caf69d =
+  BG.fromFFIType hs_bindgen_421fff3e92caf69d_base
+
+-- | Get a list of currently connected gamepads.
+--
+--     [Returns]: a 0 terminated array of joystick instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasGamepad', 'sDL_OpenGamepad'
+--
+--     [C declaration]: @SDL_GetGamepads@, defined at @SDL3\/SDL_gamepad.h 539:46@
+sDL_GetGamepads
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of gamepads returned, may be NULL.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+sDL_GetGamepads = hs_bindgen_421fff3e92caf69d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_IsGamepad@
+foreign import ccall safe "hs_bindgen_9b50cb92bd86f924"
+  hs_bindgen_9b50cb92bd86f924_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_IsGamepad@
+hs_bindgen_9b50cb92bd86f924
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO BG.CBool
+hs_bindgen_9b50cb92bd86f924 =
+  BG.fromFFIType hs_bindgen_9b50cb92bd86f924_base
+
+-- | Check if the given joystick is supported by the gamepad interface.
+--
+--     [Returns]: true if the given joystick is supported by the gamepad interface, false if it isn\'t or it\'s an invalid index.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetJoysticks, 'sDL_OpenGamepad'
+--
+--     [C declaration]: @SDL_IsGamepad@, defined at @SDL3\/SDL_gamepad.h 555:34@
+sDL_IsGamepad
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.CBool
+sDL_IsGamepad = hs_bindgen_9b50cb92bd86f924
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadNameForID@
+foreign import ccall safe "hs_bindgen_6a86daab9ce329fa"
+  hs_bindgen_6a86daab9ce329fa_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadNameForID@
+hs_bindgen_6a86daab9ce329fa
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_6a86daab9ce329fa =
+  BG.fromFFIType hs_bindgen_6a86daab9ce329fa_base
+
+-- | Get the implementation dependent name of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the name of the selected gamepad. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadName', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadNameForID@, defined at @SDL3\/SDL_gamepad.h 573:42@
+sDL_GetGamepadNameForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadNameForID = hs_bindgen_6a86daab9ce329fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadPathForID@
+foreign import ccall safe "hs_bindgen_e0c61c43c91c2ad5"
+  hs_bindgen_e0c61c43c91c2ad5_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadPathForID@
+hs_bindgen_e0c61c43c91c2ad5
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_e0c61c43c91c2ad5 =
+  BG.fromFFIType hs_bindgen_e0c61c43c91c2ad5_base
+
+-- | Get the implementation dependent path of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the path of the selected gamepad. If no path can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPath', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadPathForID@, defined at @SDL3\/SDL_gamepad.h 591:42@
+sDL_GetGamepadPathForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadPathForID = hs_bindgen_e0c61c43c91c2ad5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadPlayerIndexForID@
+foreign import ccall safe "hs_bindgen_9e9627ec0fb95c91"
+  hs_bindgen_9e9627ec0fb95c91_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadPlayerIndexForID@
+hs_bindgen_9e9627ec0fb95c91
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO BG.CInt
+hs_bindgen_9e9627ec0fb95c91 =
+  BG.fromFFIType hs_bindgen_9e9627ec0fb95c91_base
+
+-- | Get the player index of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the player index of a gamepad, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPlayerIndex', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadPlayerIndexForID@, defined at @SDL3\/SDL_gamepad.h 608:33@
+sDL_GetGamepadPlayerIndexForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.CInt
+sDL_GetGamepadPlayerIndexForID =
+  hs_bindgen_9e9627ec0fb95c91
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadGUIDForID@
+foreign import ccall safe "hs_bindgen_894e3d306a7238d1"
+  hs_bindgen_894e3d306a7238d1_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadGUIDForID@
+hs_bindgen_894e3d306a7238d1
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> BG.Ptr SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -> IO ()
+hs_bindgen_894e3d306a7238d1 =
+  BG.fromFFIType hs_bindgen_894e3d306a7238d1_base
+
+-- | Get the implementation-dependent GUID of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the GUID of the selected gamepad. If called on an invalid index, this function returns a zero GUID.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GUIDToString, 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadGUIDForID@, defined at @SDL3\/SDL_gamepad.h 626:38@
+sDL_GetGamepadGUIDForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+sDL_GetGamepadGUIDForID =
+  \instance_id0 ->
+    BG.allocaAndPeek
+      ( \res1 ->
+          hs_bindgen_894e3d306a7238d1 instance_id0 res1
+      )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadVendorForID@
+foreign import ccall safe "hs_bindgen_e7c705655b3a7874"
+  hs_bindgen_e7c705655b3a7874_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadVendorForID@
+hs_bindgen_e7c705655b3a7874
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_e7c705655b3a7874 =
+  BG.fromFFIType hs_bindgen_e7c705655b3a7874_base
+
+-- | Get the USB vendor ID of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadVendor', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadVendorForID@, defined at @SDL3\/SDL_gamepad.h 645:36@
+sDL_GetGamepadVendorForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadVendorForID =
+  hs_bindgen_e7c705655b3a7874
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadProductForID@
+foreign import ccall safe "hs_bindgen_4e686291196aa2c3"
+  hs_bindgen_4e686291196aa2c3_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadProductForID@
+hs_bindgen_4e686291196aa2c3
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_4e686291196aa2c3 =
+  BG.fromFFIType hs_bindgen_4e686291196aa2c3_base
+
+-- | Get the USB product ID of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProduct', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadProductForID@, defined at @SDL3\/SDL_gamepad.h 664:36@
+sDL_GetGamepadProductForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadProductForID =
+  hs_bindgen_4e686291196aa2c3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadProductVersionForID@
+foreign import ccall safe "hs_bindgen_1ccf92ac47175916"
+  hs_bindgen_1ccf92ac47175916_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadProductVersionForID@
+hs_bindgen_1ccf92ac47175916
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_1ccf92ac47175916 =
+  BG.fromFFIType hs_bindgen_1ccf92ac47175916_base
+
+-- | Get the product version of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProductVersion', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadProductVersionForID@, defined at @SDL3\/SDL_gamepad.h 683:36@
+sDL_GetGamepadProductVersionForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadProductVersionForID =
+  hs_bindgen_1ccf92ac47175916
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadTypeForID@
+foreign import ccall safe "hs_bindgen_40fe0886e7b4ca2b"
+  hs_bindgen_40fe0886e7b4ca2b_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadTypeForID@
+hs_bindgen_40fe0886e7b4ca2b
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO SDL_GamepadType
+hs_bindgen_40fe0886e7b4ca2b =
+  BG.fromFFIType hs_bindgen_40fe0886e7b4ca2b_base
+
+-- | Get the type of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the gamepad type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadType', 'sDL_GetGamepads', 'sDL_GetRealGamepadTypeForID'
+--
+--     [C declaration]: @SDL_GetGamepadTypeForID@, defined at @SDL3\/SDL_gamepad.h 701:45@
+sDL_GetGamepadTypeForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_GamepadType
+sDL_GetGamepadTypeForID = hs_bindgen_40fe0886e7b4ca2b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetRealGamepadTypeForID@
+foreign import ccall safe "hs_bindgen_ce2f9a72f07740df"
+  hs_bindgen_ce2f9a72f07740df_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetRealGamepadTypeForID@
+hs_bindgen_ce2f9a72f07740df
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO SDL_GamepadType
+hs_bindgen_ce2f9a72f07740df =
+  BG.fromFFIType hs_bindgen_ce2f9a72f07740df_base
+
+-- | Get the type of a gamepad, ignoring any mapping override.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the gamepad type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTypeForID', 'sDL_GetGamepads', 'sDL_GetRealGamepadType'
+--
+--     [C declaration]: @SDL_GetRealGamepadTypeForID@, defined at @SDL3\/SDL_gamepad.h 719:45@
+sDL_GetRealGamepadTypeForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_GamepadType
+sDL_GetRealGamepadTypeForID =
+  hs_bindgen_ce2f9a72f07740df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadMappingForID@
+foreign import ccall safe "hs_bindgen_35f90517327ebff6"
+  hs_bindgen_35f90517327ebff6_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadMappingForID@
+hs_bindgen_35f90517327ebff6
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_35f90517327ebff6 =
+  BG.fromFFIType hs_bindgen_35f90517327ebff6_base
+
+-- | Get the mapping of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the mapping string. Returns NULL if no mapping is available. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepads', 'sDL_GetGamepadMapping'
+--
+--     [C declaration]: @SDL_GetGamepadMappingForID@, defined at @SDL3\/SDL_gamepad.h 737:36@
+sDL_GetGamepadMappingForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr BG.CChar)
+sDL_GetGamepadMappingForID =
+  hs_bindgen_35f90517327ebff6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_OpenGamepad@
+foreign import ccall safe "hs_bindgen_7a69f326fc28f33f"
+  hs_bindgen_7a69f326fc28f33f_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_OpenGamepad@
+hs_bindgen_7a69f326fc28f33f
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO (BG.Ptr SDL_Gamepad)
+hs_bindgen_7a69f326fc28f33f =
+  BG.fromFFIType hs_bindgen_7a69f326fc28f33f_base
+
+-- | Open a gamepad for use.
+--
+--     [Returns]: a gamepad identifier or NULL if an error occurred; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseGamepad', 'sDL_IsGamepad'
+--
+--     [C declaration]: @SDL_OpenGamepad@, defined at @SDL3\/SDL_gamepad.h 753:43@
+sDL_OpenGamepad
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr SDL_Gamepad)
+sDL_OpenGamepad = hs_bindgen_7a69f326fc28f33f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadFromID@
+foreign import ccall safe "hs_bindgen_4439659d3691bcae"
+  hs_bindgen_4439659d3691bcae_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadFromID@
+hs_bindgen_4439659d3691bcae
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO (BG.Ptr SDL_Gamepad)
+hs_bindgen_4439659d3691bcae =
+  BG.fromFFIType hs_bindgen_4439659d3691bcae_base
+
+-- | Get the 'SDL_Gamepad' associated with a joystick instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Gamepad' on success or NULL on failure or if it hasn\'t been opened yet; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadFromID@, defined at @SDL3\/SDL_gamepad.h 767:43@
+sDL_GetGamepadFromID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID of the gamepad.
+  -> IO (BG.Ptr SDL_Gamepad)
+sDL_GetGamepadFromID = hs_bindgen_4439659d3691bcae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadFromPlayerIndex@
+foreign import ccall safe "hs_bindgen_9fa3f1ff076954bb"
+  hs_bindgen_9fa3f1ff076954bb_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadFromPlayerIndex@
+hs_bindgen_9fa3f1ff076954bb
+  :: BG.CInt
+  -> IO (BG.Ptr SDL_Gamepad)
+hs_bindgen_9fa3f1ff076954bb =
+  BG.fromFFIType hs_bindgen_9fa3f1ff076954bb_base
+
+-- | Get the 'SDL_Gamepad' associated with a player index.
+--
+--     [Returns]: the 'SDL_Gamepad' associated with a player index.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPlayerIndex', 'sDL_SetGamepadPlayerIndex'
+--
+--     [C declaration]: @SDL_GetGamepadFromPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 782:43@
+sDL_GetGamepadFromPlayerIndex
+  :: BG.CInt
+  -- ^
+  --
+  --           [@player_index@]: the player index, which different from the instance ID.
+  -> IO (BG.Ptr SDL_Gamepad)
+sDL_GetGamepadFromPlayerIndex =
+  hs_bindgen_9fa3f1ff076954bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadProperties@
+foreign import ccall safe "hs_bindgen_f9762d299959cd11"
+  hs_bindgen_f9762d299959cd11_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadProperties@
+hs_bindgen_f9762d299959cd11
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_f9762d299959cd11 =
+  BG.fromFFIType hs_bindgen_f9762d299959cd11_base
+
+-- | Get the properties associated with an opened gamepad.
+--
+--     These properties are shared with the underlying joystick object.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_MONO_LED_BOOLEAN'@: true if this gamepad has an LED that has adjustable brightness
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_RGB_LED_BOOLEAN'@: true if this gamepad has an LED that has adjustable color
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_PLAYER_LED_BOOLEAN'@: true if this gamepad has a player LED
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_RUMBLE_BOOLEAN'@: true if this gamepad has left\/right rumble
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_TRIGGER_RUMBLE_BOOLEAN'@: true if this gamepad has simple trigger rumble
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadProperties@, defined at @SDL3\/SDL_gamepad.h 811:46@
+sDL_GetGamepadProperties
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetGamepadProperties =
+  hs_bindgen_f9762d299959cd11
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadID@
+foreign import ccall safe "hs_bindgen_88d41ce44a0eaed7"
+  hs_bindgen_88d41ce44a0eaed7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadID@
+hs_bindgen_88d41ce44a0eaed7
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+hs_bindgen_88d41ce44a0eaed7 =
+  BG.fromFFIType hs_bindgen_88d41ce44a0eaed7_base
+
+-- | Get the instance ID of an opened gamepad.
+--
+--     [Returns]: the instance ID of the specified gamepad on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadID@, defined at @SDL3\/SDL_gamepad.h 831:44@
+sDL_GetGamepadID
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+sDL_GetGamepadID = hs_bindgen_88d41ce44a0eaed7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadName@
+foreign import ccall safe "hs_bindgen_a897dca974b53f52"
+  hs_bindgen_a897dca974b53f52_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadName@
+hs_bindgen_a897dca974b53f52
+  :: BG.Ptr SDL_Gamepad
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_a897dca974b53f52 =
+  BG.fromFFIType hs_bindgen_a897dca974b53f52_base
+
+-- | Get the implementation-dependent name for an opened gamepad.
+--
+--     [Returns]: the implementation dependent name for the gamepad, or NULL if there is no name or the identifier passed is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadNameForID'
+--
+--     [C declaration]: @SDL_GetGamepadName@, defined at @SDL3\/SDL_gamepad.h 847:42@
+sDL_GetGamepadName
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadName = hs_bindgen_a897dca974b53f52
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadPath@
+foreign import ccall safe "hs_bindgen_94e78977a2626634"
+  hs_bindgen_94e78977a2626634_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadPath@
+hs_bindgen_94e78977a2626634
+  :: BG.Ptr SDL_Gamepad
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_94e78977a2626634 =
+  BG.fromFFIType hs_bindgen_94e78977a2626634_base
+
+-- | Get the implementation-dependent path for an opened gamepad.
+--
+--     [Returns]: the implementation dependent path for the gamepad, or NULL if there is no path or the identifier passed is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPathForID'
+--
+--     [C declaration]: @SDL_GetGamepadPath@, defined at @SDL3\/SDL_gamepad.h 863:42@
+sDL_GetGamepadPath
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadPath = hs_bindgen_94e78977a2626634
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadType@
+foreign import ccall safe "hs_bindgen_9bee20d3afd78c1c"
+  hs_bindgen_9bee20d3afd78c1c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadType@
+hs_bindgen_9bee20d3afd78c1c
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL_GamepadType
+hs_bindgen_9bee20d3afd78c1c =
+  BG.fromFFIType hs_bindgen_9bee20d3afd78c1c_base
+
+-- | Get the type of an opened gamepad.
+--
+--     [Returns]: the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTypeForID'
+--
+--     [C declaration]: @SDL_GetGamepadType@, defined at @SDL3\/SDL_gamepad.h 878:45@
+sDL_GetGamepadType
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL_GamepadType
+sDL_GetGamepadType = hs_bindgen_9bee20d3afd78c1c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetRealGamepadType@
+foreign import ccall safe "hs_bindgen_991d5e997600b0ae"
+  hs_bindgen_991d5e997600b0ae_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetRealGamepadType@
+hs_bindgen_991d5e997600b0ae
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL_GamepadType
+hs_bindgen_991d5e997600b0ae =
+  BG.fromFFIType hs_bindgen_991d5e997600b0ae_base
+
+-- | Get the type of an opened gamepad, ignoring any mapping override.
+--
+--     [Returns]: the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRealGamepadTypeForID'
+--
+--     [C declaration]: @SDL_GetRealGamepadType@, defined at @SDL3\/SDL_gamepad.h 893:45@
+sDL_GetRealGamepadType
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL_GamepadType
+sDL_GetRealGamepadType = hs_bindgen_991d5e997600b0ae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadPlayerIndex@
+foreign import ccall safe "hs_bindgen_9092bfb7b9ba5238"
+  hs_bindgen_9092bfb7b9ba5238_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadPlayerIndex@
+hs_bindgen_9092bfb7b9ba5238
+  :: BG.Ptr SDL_Gamepad
+  -> IO BG.CInt
+hs_bindgen_9092bfb7b9ba5238 =
+  BG.fromFFIType hs_bindgen_9092bfb7b9ba5238_base
+
+-- | Get the player index of an opened gamepad.
+--
+--     For XInput gamepads this returns the XInput user index.
+--
+--     [Returns]: the player index for gamepad, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGamepadPlayerIndex'
+--
+--     [C declaration]: @SDL_GetGamepadPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 909:33@
+sDL_GetGamepadPlayerIndex
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.CInt
+sDL_GetGamepadPlayerIndex =
+  hs_bindgen_9092bfb7b9ba5238
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SetGamepadPlayerIndex@
+foreign import ccall safe "hs_bindgen_d6c6ba326b1b08b5"
+  hs_bindgen_d6c6ba326b1b08b5_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SetGamepadPlayerIndex@
+hs_bindgen_d6c6ba326b1b08b5
+  :: BG.Ptr SDL_Gamepad
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_d6c6ba326b1b08b5 =
+  BG.fromFFIType hs_bindgen_d6c6ba326b1b08b5_base
+
+-- | Set the player index of an opened gamepad.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPlayerIndex'
+--
+--     [C declaration]: @SDL_SetGamepadPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 926:34@
+sDL_SetGamepadPlayerIndex
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to adjust.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@player_index@]: player index to assign to this gamepad, or -1 to clear the player index and turn off player LEDs.
+  -> IO BG.CBool
+sDL_SetGamepadPlayerIndex =
+  hs_bindgen_d6c6ba326b1b08b5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadVendor@
+foreign import ccall safe "hs_bindgen_b499336f8c368df7"
+  hs_bindgen_b499336f8c368df7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadVendor@
+hs_bindgen_b499336f8c368df7
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_b499336f8c368df7 =
+  BG.fromFFIType hs_bindgen_b499336f8c368df7_base
+
+-- | Get the USB vendor ID of an opened gamepad, if available.
+--
+--     If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadVendorForID'
+--
+--     [C declaration]: @SDL_GetGamepadVendor@, defined at @SDL3\/SDL_gamepad.h 942:36@
+sDL_GetGamepadVendor
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadVendor = hs_bindgen_b499336f8c368df7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadProduct@
+foreign import ccall safe "hs_bindgen_6795759ef7183633"
+  hs_bindgen_6795759ef7183633_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadProduct@
+hs_bindgen_6795759ef7183633
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_6795759ef7183633 =
+  BG.fromFFIType hs_bindgen_6795759ef7183633_base
+
+-- | Get the USB product ID of an opened gamepad, if available.
+--
+--     If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProductForID'
+--
+--     [C declaration]: @SDL_GetGamepadProduct@, defined at @SDL3\/SDL_gamepad.h 958:36@
+sDL_GetGamepadProduct
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadProduct = hs_bindgen_6795759ef7183633
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadProductVersion@
+foreign import ccall safe "hs_bindgen_aad1976ca8def689"
+  hs_bindgen_aad1976ca8def689_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadProductVersion@
+hs_bindgen_aad1976ca8def689
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_aad1976ca8def689 =
+  BG.fromFFIType hs_bindgen_aad1976ca8def689_base
+
+-- | Get the product version of an opened gamepad, if available.
+--
+--     If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product version, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProductVersionForID'
+--
+--     [C declaration]: @SDL_GetGamepadProductVersion@, defined at @SDL3\/SDL_gamepad.h 974:36@
+sDL_GetGamepadProductVersion
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadProductVersion =
+  hs_bindgen_aad1976ca8def689
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadFirmwareVersion@
+foreign import ccall safe "hs_bindgen_9c5cbeb562bcb1a7"
+  hs_bindgen_9c5cbeb562bcb1a7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadFirmwareVersion@
+hs_bindgen_9c5cbeb562bcb1a7
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_9c5cbeb562bcb1a7 =
+  BG.fromFFIType hs_bindgen_9c5cbeb562bcb1a7_base
+
+-- | Get the firmware version of an opened gamepad, if available.
+--
+--     If the firmware version isn\'t available this function returns 0.
+--
+--     [Returns]: the gamepad firmware version, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadFirmwareVersion@, defined at @SDL3\/SDL_gamepad.h 988:36@
+sDL_GetGamepadFirmwareVersion
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadFirmwareVersion =
+  hs_bindgen_9c5cbeb562bcb1a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadSerial@
+foreign import ccall safe "hs_bindgen_d5f06aeaa91c80e0"
+  hs_bindgen_d5f06aeaa91c80e0_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadSerial@
+hs_bindgen_d5f06aeaa91c80e0
+  :: BG.Ptr SDL_Gamepad
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_d5f06aeaa91c80e0 =
+  BG.fromFFIType hs_bindgen_d5f06aeaa91c80e0_base
+
+-- | Get the serial number of an opened gamepad, if available.
+--
+--     Returns the serial number of the gamepad, or NULL if it is not available.
+--
+--     [Returns]: the serial number, or NULL if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSerial@, defined at @SDL3\/SDL_gamepad.h 1002:42@
+sDL_GetGamepadSerial
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadSerial = hs_bindgen_d5f06aeaa91c80e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadSteamHandle@
+foreign import ccall safe "hs_bindgen_67b2a6827bcd3e6d"
+  hs_bindgen_67b2a6827bcd3e6d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadSteamHandle@
+hs_bindgen_67b2a6827bcd3e6d
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_67b2a6827bcd3e6d =
+  BG.fromFFIType hs_bindgen_67b2a6827bcd3e6d_base
+
+-- | Get the Steam Input handle of an opened gamepad, if available.
+--
+--     Returns an InputHandle_t for the gamepad that can be used with Steam Input API: [https:\/\/partner.steamgames.com\/doc\/api\/ISteamInput](https://partner.steamgames.com/doc/api/ISteamInput)
+--
+--     [Returns]: the gamepad handle, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSteamHandle@, defined at @SDL3\/SDL_gamepad.h 1017:36@
+sDL_GetGamepadSteamHandle
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetGamepadSteamHandle =
+  hs_bindgen_67b2a6827bcd3e6d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadConnectionState@
+foreign import ccall safe "hs_bindgen_51ab18aa239a2b97"
+  hs_bindgen_51ab18aa239a2b97_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadConnectionState@
+hs_bindgen_51ab18aa239a2b97
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickConnectionState
+hs_bindgen_51ab18aa239a2b97 =
+  BG.fromFFIType hs_bindgen_51ab18aa239a2b97_base
+
+-- | Get the connection state of a gamepad.
+--
+--     [Returns]: the connection state on success or @SDL_JOYSTICK_CONNECTION_INVALID@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadConnectionState@, defined at @SDL3\/SDL_gamepad.h 1031:57@
+sDL_GetGamepadConnectionState
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickConnectionState
+sDL_GetGamepadConnectionState =
+  hs_bindgen_51ab18aa239a2b97
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadPowerInfo@
+foreign import ccall safe "hs_bindgen_9ac35ffbdb9db2d8"
+  hs_bindgen_9ac35ffbdb9db2d8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadPowerInfo@
+hs_bindgen_9ac35ffbdb9db2d8
+  :: BG.Ptr SDL_Gamepad
+  -> BG.Ptr BG.CInt
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+hs_bindgen_9ac35ffbdb9db2d8 =
+  BG.fromFFIType hs_bindgen_9ac35ffbdb9db2d8_base
+
+-- | Get the battery state of a gamepad.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     [Returns]: the current battery state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadPowerInfo@, defined at @SDL3\/SDL_gamepad.h 1053:44@
+sDL_GetGamepadPowerInfo
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 we can\'t determine a value or there is no battery.
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+sDL_GetGamepadPowerInfo = hs_bindgen_9ac35ffbdb9db2d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadConnected@
+foreign import ccall safe "hs_bindgen_ceb9282898627775"
+  hs_bindgen_ceb9282898627775_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadConnected@
+hs_bindgen_ceb9282898627775
+  :: BG.Ptr SDL_Gamepad
+  -> IO BG.CBool
+hs_bindgen_ceb9282898627775 =
+  BG.fromFFIType hs_bindgen_ceb9282898627775_base
+
+-- | Check if a gamepad has been opened and is currently connected.
+--
+--     [Returns]: true if the gamepad has been opened and is currently connected, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GamepadConnected@, defined at @SDL3\/SDL_gamepad.h 1067:34@
+sDL_GamepadConnected
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO BG.CBool
+sDL_GamepadConnected = hs_bindgen_ceb9282898627775
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadJoystick@
+foreign import ccall safe "hs_bindgen_c1e15069e5f0b3b4"
+  hs_bindgen_c1e15069e5f0b3b4_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadJoystick@
+hs_bindgen_c1e15069e5f0b3b4
+  :: BG.Ptr SDL_Gamepad
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick)
+hs_bindgen_c1e15069e5f0b3b4 =
+  BG.fromFFIType hs_bindgen_c1e15069e5f0b3b4_base
+
+-- | Get the underlying joystick from a gamepad.
+--
+--     This function will give you a SDL_Joystick object, which allows you to use the SDL_Joystick functions with a 'SDL_Gamepad' object. This would be useful for getting a joystick\'s position at any given time, even if it hasn\'t moved (moving it would produce an event, which would have the axis\' value).
+--
+--     The pointer returned is owned by the 'SDL_Gamepad'. You should not call SDL_CloseJoystick() on it, for example, since doing so will likely cause SDL to crash.
+--
+--     [Returns]: an SDL_Joystick object, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadJoystick@, defined at @SDL3\/SDL_gamepad.h 1089:44@
+sDL_GetGamepadJoystick
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object that you want to get a joystick from.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick)
+sDL_GetGamepadJoystick = hs_bindgen_c1e15069e5f0b3b4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SetGamepadEventsEnabled@
+foreign import ccall safe "hs_bindgen_aa68cf392dbe1717"
+  hs_bindgen_aa68cf392dbe1717_base
+    :: BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SetGamepadEventsEnabled@
+hs_bindgen_aa68cf392dbe1717
+  :: BG.CBool
+  -> IO ()
+hs_bindgen_aa68cf392dbe1717 =
+  BG.fromFFIType hs_bindgen_aa68cf392dbe1717_base
+
+-- | Set the state of gamepad event processing.
+--
+--     If gamepad events are disabled, you must call @SDL_UpdateGamepads()@ yourself and check the state of the gamepad when you want gamepad information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadEventsEnabled', 'sDL_UpdateGamepads'
+--
+--     [C declaration]: @SDL_SetGamepadEventsEnabled@, defined at @SDL3\/SDL_gamepad.h 1106:34@
+sDL_SetGamepadEventsEnabled
+  :: BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: whether to process gamepad events or not.
+  -> IO ()
+sDL_SetGamepadEventsEnabled =
+  hs_bindgen_aa68cf392dbe1717
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadEventsEnabled@
+foreign import ccall safe "hs_bindgen_cd08b36ef0436bc1"
+  hs_bindgen_cd08b36ef0436bc1_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadEventsEnabled@
+hs_bindgen_cd08b36ef0436bc1 :: IO BG.CBool
+hs_bindgen_cd08b36ef0436bc1 =
+  BG.fromFFIType hs_bindgen_cd08b36ef0436bc1_base
+
+-- | Query the state of gamepad event processing.
+--
+--     If gamepad events are disabled, you must call @SDL_UpdateGamepads()@ yourself and check the state of the gamepad when you want gamepad information.
+--
+--     [Returns]: true if gamepad events are being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGamepadEventsEnabled'
+--
+--     [C declaration]: @SDL_GamepadEventsEnabled@, defined at @SDL3\/SDL_gamepad.h 1122:34@
+sDL_GamepadEventsEnabled :: IO BG.CBool
+sDL_GamepadEventsEnabled =
+  hs_bindgen_cd08b36ef0436bc1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadBindings@
+foreign import ccall safe "hs_bindgen_213ad716fb12ea93"
+  hs_bindgen_213ad716fb12ea93_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadBindings@
+hs_bindgen_213ad716fb12ea93
+  :: BG.Ptr SDL_Gamepad
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_GamepadBinding))
+hs_bindgen_213ad716fb12ea93 =
+  BG.fromFFIType hs_bindgen_213ad716fb12ea93_base
+
+-- | Get the SDL joystick layer bindings for a gamepad.
+--
+--     [Returns]: a NULL terminated array of pointers to bindings or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadBindings@, defined at @SDL3\/SDL_gamepad.h 1138:51@
+sDL_GetGamepadBindings
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of bindings returned.
+  -> IO (BG.Ptr (BG.Ptr SDL_GamepadBinding))
+sDL_GetGamepadBindings = hs_bindgen_213ad716fb12ea93
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_UpdateGamepads@
+foreign import ccall safe "hs_bindgen_0006fa783d3b66ec"
+  hs_bindgen_0006fa783d3b66ec_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_UpdateGamepads@
+hs_bindgen_0006fa783d3b66ec :: IO ()
+hs_bindgen_0006fa783d3b66ec =
+  BG.fromFFIType hs_bindgen_0006fa783d3b66ec_base
+
+-- | Manually pump gamepad updates if not using the loop.
+--
+--     This function is called automatically by the event loop if events are enabled. Under such circumstances, it will not be necessary to call this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateGamepads@, defined at @SDL3\/SDL_gamepad.h 1151:34@
+sDL_UpdateGamepads :: IO ()
+sDL_UpdateGamepads = hs_bindgen_0006fa783d3b66ec
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadTypeFromString@
+foreign import ccall safe "hs_bindgen_793ab6d7edd0a66d"
+  hs_bindgen_793ab6d7edd0a66d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadTypeFromString@
+hs_bindgen_793ab6d7edd0a66d
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL_GamepadType
+hs_bindgen_793ab6d7edd0a66d =
+  BG.fromFFIType hs_bindgen_793ab6d7edd0a66d_base
+
+-- | Convert a string into 'SDL_GamepadType' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     [Returns]: the 'SDL_GamepadType' enum corresponding to the input string, or @SDL_GAMEPAD_TYPE_UNKNOWN@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadStringForType'
+--
+--     [C declaration]: @SDL_GetGamepadTypeFromString@, defined at @SDL3\/SDL_gamepad.h 1171:45@
+sDL_GetGamepadTypeFromString
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_GamepadType' type.
+  -> IO SDL_GamepadType
+sDL_GetGamepadTypeFromString =
+  hs_bindgen_793ab6d7edd0a66d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadStringForType@
+foreign import ccall safe "hs_bindgen_d426a8b3d196baf4"
+  hs_bindgen_d426a8b3d196baf4_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadStringForType@
+hs_bindgen_d426a8b3d196baf4
+  :: SDL_GamepadType
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_d426a8b3d196baf4 =
+  BG.fromFFIType hs_bindgen_d426a8b3d196baf4_base
+
+-- | Convert from an 'SDL_GamepadType' enum to a string.
+--
+--     [Returns]: a string for the given type, or NULL if an invalid type is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTypeFromString'
+--
+--     [C declaration]: @SDL_GetGamepadStringForType@, defined at @SDL3\/SDL_gamepad.h 1187:42@
+sDL_GetGamepadStringForType
+  :: SDL_GamepadType
+  -- ^
+  --
+  --           [@type@]: an enum value for a given 'SDL_GamepadType'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadStringForType =
+  hs_bindgen_d426a8b3d196baf4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadAxisFromString@
+foreign import ccall safe "hs_bindgen_5a9d122ea5094f40"
+  hs_bindgen_5a9d122ea5094f40_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadAxisFromString@
+hs_bindgen_5a9d122ea5094f40
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL_GamepadAxis
+hs_bindgen_5a9d122ea5094f40 =
+  BG.fromFFIType hs_bindgen_5a9d122ea5094f40_base
+
+-- | Convert a string into 'SDL_GamepadAxis' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     Note specially that \"righttrigger\" and \"lefttrigger\" map to @SDL_GAMEPAD_AXIS_RIGHT_TRIGGER@ and @SDL_GAMEPAD_AXIS_LEFT_TRIGGER@, respectively.
+--
+--     [Returns]: the 'SDL_GamepadAxis' enum corresponding to the input string, or @SDL_GAMEPAD_AXIS_INVALID@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadStringForAxis'
+--
+--     [C declaration]: @SDL_GetGamepadAxisFromString@, defined at @SDL3\/SDL_gamepad.h 1211:45@
+sDL_GetGamepadAxisFromString
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_Gamepad' axis.
+  -> IO SDL_GamepadAxis
+sDL_GetGamepadAxisFromString =
+  hs_bindgen_5a9d122ea5094f40
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadStringForAxis@
+foreign import ccall safe "hs_bindgen_9cbed523522c86f2"
+  hs_bindgen_9cbed523522c86f2_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadStringForAxis@
+hs_bindgen_9cbed523522c86f2
+  :: SDL_GamepadAxis
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_9cbed523522c86f2 =
+  BG.fromFFIType hs_bindgen_9cbed523522c86f2_base
+
+-- | Convert from an 'SDL_GamepadAxis' enum to a string.
+--
+--     [Returns]: a string for the given axis, or NULL if an invalid axis is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadAxisFromString'
+--
+--     [C declaration]: @SDL_GetGamepadStringForAxis@, defined at @SDL3\/SDL_gamepad.h 1227:42@
+sDL_GetGamepadStringForAxis
+  :: SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an enum value for a given 'SDL_GamepadAxis'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadStringForAxis =
+  hs_bindgen_9cbed523522c86f2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadHasAxis@
+foreign import ccall safe "hs_bindgen_6d87cb6c759a128e"
+  hs_bindgen_6d87cb6c759a128e_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadHasAxis@
+hs_bindgen_6d87cb6c759a128e
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadAxis
+  -> IO BG.CBool
+hs_bindgen_6d87cb6c759a128e =
+  BG.fromFFIType hs_bindgen_6d87cb6c759a128e_base
+
+-- | Query whether a gamepad has a given axis.
+--
+--     This merely reports whether the gamepad\'s mapping defined this axis, as that is all the information SDL has about the physical device.
+--
+--     [Returns]: true if the gamepad has this axis, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasButton', 'sDL_GetGamepadAxis'
+--
+--     [C declaration]: @SDL_GamepadHasAxis@, defined at @SDL3\/SDL_gamepad.h 1246:34@
+sDL_GamepadHasAxis
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis enum value (an 'SDL_GamepadAxis' value).
+  -> IO BG.CBool
+sDL_GamepadHasAxis = hs_bindgen_6d87cb6c759a128e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadAxis@
+foreign import ccall safe "hs_bindgen_d4e206062bf3a0b7"
+  hs_bindgen_d4e206062bf3a0b7_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadAxis@
+hs_bindgen_d4e206062bf3a0b7
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadAxis
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint16
+hs_bindgen_d4e206062bf3a0b7 =
+  BG.fromFFIType hs_bindgen_d4e206062bf3a0b7_base
+
+-- | Get the current state of an axis control on a gamepad.
+--
+--     The axis indices start at index 0.
+--
+--     For thumbsticks, the state is a value ranging from -32768 (up\/left) to 32767 (down\/right).
+--
+--     Triggers range from 0 when released to 32767 when fully pressed, and never return a negative value. Note that this differs from the value reported by the lower-level SDL_GetJoystickAxis(), which normally uses the full range.
+--
+--     Note that for invalid gamepads or axes, this will return 0. Zero is also a valid value in normal operation; usually it means a centered axis.
+--
+--     [Returns]: axis state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasAxis', 'sDL_GetGamepadButton'
+--
+--     [C declaration]: @SDL_GetGamepadAxis@, defined at @SDL3\/SDL_gamepad.h 1274:36@
+sDL_GetGamepadAxis
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis index (one of the 'SDL_GamepadAxis' values).
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint16
+sDL_GetGamepadAxis = hs_bindgen_d4e206062bf3a0b7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadButtonFromString@
+foreign import ccall safe "hs_bindgen_3d3d13260e5bf752"
+  hs_bindgen_3d3d13260e5bf752_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadButtonFromString@
+hs_bindgen_3d3d13260e5bf752
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL_GamepadButton
+hs_bindgen_3d3d13260e5bf752 =
+  BG.fromFFIType hs_bindgen_3d3d13260e5bf752_base
+
+-- | Convert a string into an 'SDL_GamepadButton' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     [Returns]: the 'SDL_GamepadButton' enum corresponding to the input string, or @SDL_GAMEPAD_BUTTON_INVALID@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadStringForButton'
+--
+--     [C declaration]: @SDL_GetGamepadButtonFromString@, defined at @SDL3\/SDL_gamepad.h 1294:47@
+sDL_GetGamepadButtonFromString
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_Gamepad' button.
+  -> IO SDL_GamepadButton
+sDL_GetGamepadButtonFromString =
+  hs_bindgen_3d3d13260e5bf752
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadStringForButton@
+foreign import ccall safe "hs_bindgen_7d3134eb357b2911"
+  hs_bindgen_7d3134eb357b2911_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadStringForButton@
+hs_bindgen_7d3134eb357b2911
+  :: SDL_GamepadButton
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_7d3134eb357b2911 =
+  BG.fromFFIType hs_bindgen_7d3134eb357b2911_base
+
+-- | Convert from an 'SDL_GamepadButton' enum to a string.
+--
+--     [Returns]: a string for the given button, or NULL if an invalid button is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadButtonFromString'
+--
+--     [C declaration]: @SDL_GetGamepadStringForButton@, defined at @SDL3\/SDL_gamepad.h 1310:42@
+sDL_GetGamepadStringForButton
+  :: SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: an enum value for a given 'SDL_GamepadButton'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadStringForButton =
+  hs_bindgen_7d3134eb357b2911
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadHasButton@
+foreign import ccall safe "hs_bindgen_835e151fd6fbdcd9"
+  hs_bindgen_835e151fd6fbdcd9_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadHasButton@
+hs_bindgen_835e151fd6fbdcd9
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadButton
+  -> IO BG.CBool
+hs_bindgen_835e151fd6fbdcd9 =
+  BG.fromFFIType hs_bindgen_835e151fd6fbdcd9_base
+
+-- | Query whether a gamepad has a given button.
+--
+--     This merely reports whether the gamepad\'s mapping defined this button, as that is all the information SDL has about the physical device.
+--
+--     [Returns]: true if the gamepad has this button, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasAxis'
+--
+--     [C declaration]: @SDL_GamepadHasButton@, defined at @SDL3\/SDL_gamepad.h 1328:34@
+sDL_GamepadHasButton
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button enum value (an 'SDL_GamepadButton' value).
+  -> IO BG.CBool
+sDL_GamepadHasButton = hs_bindgen_835e151fd6fbdcd9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadButton@
+foreign import ccall safe "hs_bindgen_930a123ab5a67173"
+  hs_bindgen_930a123ab5a67173_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadButton@
+hs_bindgen_930a123ab5a67173
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadButton
+  -> IO BG.CBool
+hs_bindgen_930a123ab5a67173 =
+  BG.fromFFIType hs_bindgen_930a123ab5a67173_base
+
+-- | Get the current state of a button on a gamepad.
+--
+--     [Returns]: true if the button is pressed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasButton', 'sDL_GetGamepadAxis'
+--
+--     [C declaration]: @SDL_GetGamepadButton@, defined at @SDL3\/SDL_gamepad.h 1344:34@
+sDL_GetGamepadButton
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO BG.CBool
+sDL_GetGamepadButton = hs_bindgen_930a123ab5a67173
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadButtonLabelForType@
+foreign import ccall safe "hs_bindgen_3a07981024fde2b9"
+  hs_bindgen_3a07981024fde2b9_base
+    :: BG.Word32
+    -> BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadButtonLabelForType@
+hs_bindgen_3a07981024fde2b9
+  :: SDL_GamepadType
+  -> SDL_GamepadButton
+  -> IO SDL_GamepadButtonLabel
+hs_bindgen_3a07981024fde2b9 =
+  BG.fromFFIType hs_bindgen_3a07981024fde2b9_base
+
+-- | Get the label of a button on a gamepad.
+--
+--     [Returns]: the 'SDL_GamepadButtonLabel' enum corresponding to the button label.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadButtonLabel'
+--
+--     [C declaration]: @SDL_GetGamepadButtonLabelForType@, defined at @SDL3\/SDL_gamepad.h 1359:52@
+sDL_GetGamepadButtonLabelForType
+  :: SDL_GamepadType
+  -- ^
+  --
+  --           [@type@]: the type of gamepad to check.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO SDL_GamepadButtonLabel
+sDL_GetGamepadButtonLabelForType =
+  hs_bindgen_3a07981024fde2b9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadButtonLabel@
+foreign import ccall safe "hs_bindgen_80f031ee04caea84"
+  hs_bindgen_80f031ee04caea84_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadButtonLabel@
+hs_bindgen_80f031ee04caea84
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadButton
+  -> IO SDL_GamepadButtonLabel
+hs_bindgen_80f031ee04caea84 =
+  BG.fromFFIType hs_bindgen_80f031ee04caea84_base
+
+-- | Get the label of a button on a gamepad.
+--
+--     [Returns]: the 'SDL_GamepadButtonLabel' enum corresponding to the button label.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadButtonLabelForType'
+--
+--     [C declaration]: @SDL_GetGamepadButtonLabel@, defined at @SDL3\/SDL_gamepad.h 1374:52@
+sDL_GetGamepadButtonLabel
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO SDL_GamepadButtonLabel
+sDL_GetGamepadButtonLabel =
+  hs_bindgen_80f031ee04caea84
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetNumGamepadTouchpads@
+foreign import ccall safe "hs_bindgen_65d4ab0a10c0f69e"
+  hs_bindgen_65d4ab0a10c0f69e_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetNumGamepadTouchpads@
+hs_bindgen_65d4ab0a10c0f69e
+  :: BG.Ptr SDL_Gamepad
+  -> IO BG.CInt
+hs_bindgen_65d4ab0a10c0f69e =
+  BG.fromFFIType hs_bindgen_65d4ab0a10c0f69e_base
+
+-- | Get the number of touchpads on a gamepad.
+--
+--     [Returns]: number of touchpads.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumGamepadTouchpadFingers'
+--
+--     [C declaration]: @SDL_GetNumGamepadTouchpads@, defined at @SDL3\/SDL_gamepad.h 1388:33@
+sDL_GetNumGamepadTouchpads
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> IO BG.CInt
+sDL_GetNumGamepadTouchpads =
+  hs_bindgen_65d4ab0a10c0f69e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetNumGamepadTouchpadFingers@
+foreign import ccall safe "hs_bindgen_d33ef1d9882dcbad"
+  hs_bindgen_d33ef1d9882dcbad_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetNumGamepadTouchpadFingers@
+hs_bindgen_d33ef1d9882dcbad
+  :: BG.Ptr SDL_Gamepad
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_d33ef1d9882dcbad =
+  BG.fromFFIType hs_bindgen_d33ef1d9882dcbad_base
+
+-- | Get the number of supported simultaneous fingers on a touchpad on a game gamepad.
+--
+--     [Returns]: number of supported simultaneous fingers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTouchpadFinger', 'sDL_GetNumGamepadTouchpads'
+--
+--     [C declaration]: @SDL_GetNumGamepadTouchpadFingers@, defined at @SDL3\/SDL_gamepad.h 1405:33@
+sDL_GetNumGamepadTouchpadFingers
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@touchpad@]: a touchpad.
+  -> IO BG.CInt
+sDL_GetNumGamepadTouchpadFingers =
+  hs_bindgen_d33ef1d9882dcbad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadTouchpadFinger@
+foreign import ccall safe "hs_bindgen_225a3688e71f439f"
+  hs_bindgen_225a3688e71f439f_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadTouchpadFinger@
+hs_bindgen_225a3688e71f439f
+  :: BG.Ptr SDL_Gamepad
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.Ptr BG.CBool
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_225a3688e71f439f =
+  BG.fromFFIType hs_bindgen_225a3688e71f439f_base
+
+-- | Get the current state of a finger on a touchpad on a gamepad.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumGamepadTouchpadFingers'
+--
+--     [C declaration]: @SDL_GetGamepadTouchpadFinger@, defined at @SDL3\/SDL_gamepad.h 1429:34@
+sDL_GetGamepadTouchpadFinger
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@touchpad@]: a touchpad.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@finger@]: a finger.
+  -> BG.Ptr BG.CBool
+  -- ^
+  --
+  --           [@down@]: a pointer filled with true if the finger is down, false otherwise, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer filled with the x position, normalized 0 to 1, with the origin in the upper left, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer filled with the y position, normalized 0 to 1, with the origin in the upper left, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@pressure@]: a pointer filled with pressure value, may be NULL.
+  -> IO BG.CBool
+sDL_GetGamepadTouchpadFinger =
+  hs_bindgen_225a3688e71f439f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadHasSensor@
+foreign import ccall safe "hs_bindgen_1b3239ce64af9f86"
+  hs_bindgen_1b3239ce64af9f86_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadHasSensor@
+hs_bindgen_1b3239ce64af9f86
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> IO BG.CBool
+hs_bindgen_1b3239ce64af9f86 =
+  BG.fromFFIType hs_bindgen_1b3239ce64af9f86_base
+
+-- | Return whether a gamepad has a particular sensor.
+--
+--     [Returns]: true if the sensor exists, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadSensorData', 'sDL_GetGamepadSensorDataRate', 'sDL_SetGamepadSensorEnabled'
+--
+--     [C declaration]: @SDL_GamepadHasSensor@, defined at @SDL3\/SDL_gamepad.h 1446:34@
+sDL_GamepadHasSensor
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO BG.CBool
+sDL_GamepadHasSensor = hs_bindgen_1b3239ce64af9f86
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SetGamepadSensorEnabled@
+foreign import ccall safe "hs_bindgen_3e3fc29af15c71c1"
+  hs_bindgen_3e3fc29af15c71c1_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SetGamepadSensorEnabled@
+hs_bindgen_3e3fc29af15c71c1
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_3e3fc29af15c71c1 =
+  BG.fromFFIType hs_bindgen_3e3fc29af15c71c1_base
+
+-- | Set whether data reporting for a gamepad sensor is enabled.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasSensor', 'sDL_GamepadSensorEnabled'
+--
+--     [C declaration]: @SDL_SetGamepadSensorEnabled@, defined at @SDL3\/SDL_gamepad.h 1464:34@
+sDL_SetGamepadSensorEnabled
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to update.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to enable\/disable.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: whether data reporting should be enabled.
+  -> IO BG.CBool
+sDL_SetGamepadSensorEnabled =
+  hs_bindgen_3e3fc29af15c71c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadSensorEnabled@
+foreign import ccall safe "hs_bindgen_826f084dc9c761ff"
+  hs_bindgen_826f084dc9c761ff_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GamepadSensorEnabled@
+hs_bindgen_826f084dc9c761ff
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> IO BG.CBool
+hs_bindgen_826f084dc9c761ff =
+  BG.fromFFIType hs_bindgen_826f084dc9c761ff_base
+
+-- | Query whether sensor data reporting is enabled for a gamepad.
+--
+--     [Returns]: true if the sensor is enabled, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGamepadSensorEnabled'
+--
+--     [C declaration]: @SDL_GamepadSensorEnabled@, defined at @SDL3\/SDL_gamepad.h 1479:34@
+sDL_GamepadSensorEnabled
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO BG.CBool
+sDL_GamepadSensorEnabled =
+  hs_bindgen_826f084dc9c761ff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadSensorDataRate@
+foreign import ccall safe "hs_bindgen_69751d524bc7ba71"
+  hs_bindgen_69751d524bc7ba71_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadSensorDataRate@
+hs_bindgen_69751d524bc7ba71
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> IO BG.CFloat
+hs_bindgen_69751d524bc7ba71 =
+  BG.fromFFIType hs_bindgen_69751d524bc7ba71_base
+
+-- | Get the data rate (number of events per second) of a gamepad sensor.
+--
+--     [Returns]: the data rate, or 0.0f if the data rate is not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSensorDataRate@, defined at @SDL3\/SDL_gamepad.h 1492:35@
+sDL_GetGamepadSensorDataRate
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO BG.CFloat
+sDL_GetGamepadSensorDataRate =
+  hs_bindgen_69751d524bc7ba71
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadSensorData@
+foreign import ccall safe "hs_bindgen_2c02178932dc8e57"
+  hs_bindgen_2c02178932dc8e57_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadSensorData@
+hs_bindgen_2c02178932dc8e57
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> BG.Ptr BG.CFloat
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_2c02178932dc8e57 =
+  BG.fromFFIType hs_bindgen_2c02178932dc8e57_base
+
+-- | Get the current state of a gamepad sensor.
+--
+--     The number of values and interpretation of the data is sensor dependent. See the remarks in SDL_SensorType for details for each type of sensor.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSensorData@, defined at @SDL3\/SDL_gamepad.h 1511:34@
+sDL_GetGamepadSensorData
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@data@]: a pointer filled with the current sensor state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_values@]: the number of values to write to data.
+  -> IO BG.CBool
+sDL_GetGamepadSensorData =
+  hs_bindgen_2c02178932dc8e57
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_RumbleGamepad@
+foreign import ccall safe "hs_bindgen_36f6edc2de497d1f"
+  hs_bindgen_36f6edc2de497d1f_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> BG.Word16
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_RumbleGamepad@
+hs_bindgen_36f6edc2de497d1f
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_36f6edc2de497d1f =
+  BG.fromFFIType hs_bindgen_36f6edc2de497d1f_base
+
+-- | Start a rumble effect on a gamepad.
+--
+--     Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     This function requires you to process SDL events or call SDL_UpdateJoysticks() to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RumbleGamepad@, defined at @SDL3\/SDL_gamepad.h 1535:34@
+sDL_RumbleGamepad
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to vibrate.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@low_frequency_rumble@]: the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@high_frequency_rumble@]: the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO BG.CBool
+sDL_RumbleGamepad = hs_bindgen_36f6edc2de497d1f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_RumbleGamepadTriggers@
+foreign import ccall safe "hs_bindgen_1ab471fbae93c977"
+  hs_bindgen_1ab471fbae93c977_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> BG.Word16
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_RumbleGamepadTriggers@
+hs_bindgen_1ab471fbae93c977
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_1ab471fbae93c977 =
+  BG.fromFFIType hs_bindgen_1ab471fbae93c977_base
+
+-- | Start a rumble effect in the gamepad\'s triggers.
+--
+--     Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     Note that this is rumbling of the /triggers/ and not the gamepad as a whole. This is currently only supported on Xbox One gamepads. If you want the (more common) whole-gamepad rumble, use @SDL_RumbleGamepad()@ instead.
+--
+--     This function requires you to process SDL events or call SDL_UpdateJoysticks() to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RumbleGamepad'
+--
+--     [C declaration]: @SDL_RumbleGamepadTriggers@, defined at @SDL3\/SDL_gamepad.h 1565:34@
+sDL_RumbleGamepadTriggers
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to vibrate.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@left_rumble@]: the intensity of the left trigger rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@right_rumble@]: the intensity of the right trigger rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO BG.CBool
+sDL_RumbleGamepadTriggers =
+  hs_bindgen_1ab471fbae93c977
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SetGamepadLED@
+foreign import ccall safe "hs_bindgen_99951861ed614368"
+  hs_bindgen_99951861ed614368_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SetGamepadLED@
+hs_bindgen_99951861ed614368
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_99951861ed614368 =
+  BG.fromFFIType hs_bindgen_99951861ed614368_base
+
+-- | Update a gamepad\'s LED color.
+--
+--     An example of a joystick LED is the light on the back of a PlayStation 4\'s DualShock 4 controller.
+--
+--     For gamepads with a single color LED, the maximum of the RGB values will be used as the LED brightness.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGamepadLED@, defined at @SDL3\/SDL_gamepad.h 1587:34@
+sDL_SetGamepadLED
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@red@]: the intensity of the red LED.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@green@]: the intensity of the green LED.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@blue@]: the intensity of the blue LED.
+  -> IO BG.CBool
+sDL_SetGamepadLED = hs_bindgen_99951861ed614368
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SendGamepadEffect@
+foreign import ccall safe "hs_bindgen_0a60e2e403cd6afc"
+  hs_bindgen_0a60e2e403cd6afc_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_SendGamepadEffect@
+hs_bindgen_0a60e2e403cd6afc
+  :: BG.Ptr SDL_Gamepad
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_0a60e2e403cd6afc =
+  BG.fromFFIType hs_bindgen_0a60e2e403cd6afc_base
+
+-- | Send a gamepad specific effect packet.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SendGamepadEffect@, defined at @SDL3\/SDL_gamepad.h 1602:34@
+sDL_SendGamepadEffect
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to affect.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to send to the gamepad.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@size@]: the size of the data to send to the gamepad.
+  -> IO BG.CBool
+sDL_SendGamepadEffect = hs_bindgen_0a60e2e403cd6afc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_CloseGamepad@
+foreign import ccall safe "hs_bindgen_7615a65af389a834"
+  hs_bindgen_7615a65af389a834_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_CloseGamepad@
+hs_bindgen_7615a65af389a834
+  :: BG.Ptr SDL_Gamepad
+  -> IO ()
+hs_bindgen_7615a65af389a834 =
+  BG.fromFFIType hs_bindgen_7615a65af389a834_base
+
+-- | Close a gamepad previously opened with @SDL_OpenGamepad()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenGamepad'
+--
+--     [C declaration]: @SDL_CloseGamepad@, defined at @SDL3\/SDL_gamepad.h 1616:34@
+sDL_CloseGamepad
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO ()
+sDL_CloseGamepad = hs_bindgen_7615a65af389a834
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadAppleSFSymbolsNameForButton@
+foreign import ccall safe "hs_bindgen_99f1aa16515a60df"
+  hs_bindgen_99f1aa16515a60df_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadAppleSFSymbolsNameForButton@
+hs_bindgen_99f1aa16515a60df
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadButton
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_99f1aa16515a60df =
+  BG.fromFFIType hs_bindgen_99f1aa16515a60df_base
+
+-- | Return the sfSymbolsName for a given button on a gamepad on Apple platforms.
+--
+--     [Returns]: the sfSymbolsName or NULL if the name can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadAppleSFSymbolsNameForAxis'
+--
+--     [C declaration]: @SDL_GetGamepadAppleSFSymbolsNameForButton@, defined at @SDL3\/SDL_gamepad.h 1632:42@
+sDL_GetGamepadAppleSFSymbolsNameForButton
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button on the gamepad.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadAppleSFSymbolsNameForButton =
+  hs_bindgen_99f1aa16515a60df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadAppleSFSymbolsNameForAxis@
+foreign import ccall safe "hs_bindgen_076ad522cfc3e68e"
+  hs_bindgen_076ad522cfc3e68e_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Safe_SDL_GetGamepadAppleSFSymbolsNameForAxis@
+hs_bindgen_076ad522cfc3e68e
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadAxis
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_076ad522cfc3e68e =
+  BG.fromFFIType hs_bindgen_076ad522cfc3e68e_base
+
+-- | Return the sfSymbolsName for a given axis on a gamepad on Apple platforms.
+--
+--     [Returns]: the sfSymbolsName or NULL if the name can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadAppleSFSymbolsNameForButton'
+--
+--     [C declaration]: @SDL_GetGamepadAppleSFSymbolsNameForAxis@, defined at @SDL3\/SDL_gamepad.h 1647:42@
+sDL_GetGamepadAppleSFSymbolsNameForAxis
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis on the gamepad.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadAppleSFSymbolsNameForAxis =
+  hs_bindgen_076ad522cfc3e68e
diff --git a/src/SDL3/Sys/Bindgen/Gamepad/Unsafe.hs b/src/SDL3/Sys/Bindgen/Gamepad/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Gamepad/Unsafe.hs
@@ -0,0 +1,3251 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Gamepad.Unsafe (
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_AddGamepadMapping,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_AddGamepadMappingsFromIO,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_AddGamepadMappingsFromFile,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_ReloadGamepadMappings,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadMappings,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadMappingForGUID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadMapping,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_SetGamepadMapping,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_HasGamepad,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepads,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_IsGamepad,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadNameForID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadPathForID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadPlayerIndexForID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadGUIDForID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadVendorForID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadProductForID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadProductVersionForID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadTypeForID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetRealGamepadTypeForID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadMappingForID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_OpenGamepad,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadFromID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadFromPlayerIndex,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadProperties,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadID,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadName,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadPath,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadType,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetRealGamepadType,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadPlayerIndex,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_SetGamepadPlayerIndex,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadVendor,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadProduct,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadProductVersion,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadFirmwareVersion,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadSerial,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadSteamHandle,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadConnectionState,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadPowerInfo,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GamepadConnected,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadJoystick,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_SetGamepadEventsEnabled,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GamepadEventsEnabled,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadBindings,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_UpdateGamepads,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadTypeFromString,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadStringForType,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadAxisFromString,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadStringForAxis,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GamepadHasAxis,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadAxis,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadButtonFromString,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadStringForButton,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GamepadHasButton,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadButton,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadButtonLabelForType,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadButtonLabel,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetNumGamepadTouchpads,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetNumGamepadTouchpadFingers,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadTouchpadFinger,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GamepadHasSensor,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_SetGamepadSensorEnabled,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GamepadSensorEnabled,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadSensorDataRate,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadSensorData,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_RumbleGamepad,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_RumbleGamepadTriggers,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_SetGamepadLED,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_SendGamepadEffect,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_CloseGamepad,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadAppleSFSymbolsNameForButton,
+  SDL3.Sys.Bindgen.Gamepad.Unsafe.sDL_GetGamepadAppleSFSymbolsNameForAxis,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Gamepad
+import SDL3.Sys.Bindgen.Guid qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Joystick qualified
+import SDL3.Sys.Bindgen.Power qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_gamepad.h>"
+         , "signed int hs_bindgen_36135983181db04c ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AddGamepadMapping)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_7bcfa7483bb6c304 ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AddGamepadMappingsFromIO)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_183e11c34dd8b81f ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AddGamepadMappingsFromFile)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_779c89fdca5b9a0e (void)"
+         , "{"
+         , "  return (SDL_ReloadGamepadMappings)();"
+         , "}"
+         , "char **hs_bindgen_d561ea70cab1346c ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadMappings)(arg1);"
+         , "}"
+         , "char *hs_bindgen_a9d84a5aab18bd61 ("
+         , "  SDL_GUID *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadMappingForGUID)(*arg1);"
+         , "}"
+         , "char *hs_bindgen_094250e7cd4814e2 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadMapping)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_cf9c12a3e0081cba ("
+         , "  SDL_JoystickID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGamepadMapping)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5b29afb080773dd8 (void)"
+         , "{"
+         , "  return (SDL_HasGamepad)();"
+         , "}"
+         , "SDL_JoystickID *hs_bindgen_e99c053042181461 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepads)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_48b133a0a1a04fee ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_IsGamepad)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_51b0ed9ede139ced ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadNameForID)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_c1fe082501f756ae ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadPathForID)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_9dac07bb4aa4a0e0 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadPlayerIndexForID)(arg1);"
+         , "}"
+         , "void hs_bindgen_2280985bb32deb1f ("
+         , "  SDL_JoystickID arg1,"
+         , "  SDL_GUID *arg2"
+         , ")"
+         , "{"
+         , "  *arg2 = (SDL_GetGamepadGUIDForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_1702db5431a9f4d5 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadVendorForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_c6d0670cd6f1d312 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadProductForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_c5762d27fdb0fe20 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadProductVersionForID)(arg1);"
+         , "}"
+         , "SDL_GamepadType hs_bindgen_ab8ba638efb36686 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadTypeForID)(arg1);"
+         , "}"
+         , "SDL_GamepadType hs_bindgen_dbd35ae44acef0c3 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRealGamepadTypeForID)(arg1);"
+         , "}"
+         , "char *hs_bindgen_70db76a3c7fda9bd ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadMappingForID)(arg1);"
+         , "}"
+         , "SDL_Gamepad *hs_bindgen_cbd487a8a2440863 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenGamepad)(arg1);"
+         , "}"
+         , "SDL_Gamepad *hs_bindgen_a76618005d317dbe ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadFromID)(arg1);"
+         , "}"
+         , "SDL_Gamepad *hs_bindgen_23e0c7566ddc098f ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadFromPlayerIndex)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_e986873f08423af3 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadProperties)(arg1);"
+         , "}"
+         , "SDL_JoystickID hs_bindgen_e2d0c689bb9fdafb ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadID)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_9d53319611fb7b21 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadName)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_d7698305b32d2548 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadPath)(arg1);"
+         , "}"
+         , "SDL_GamepadType hs_bindgen_e2d440eeb9de4199 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadType)(arg1);"
+         , "}"
+         , "SDL_GamepadType hs_bindgen_ee5c3fd3f0de744f ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRealGamepadType)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_8457d3ba6fab74fd ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadPlayerIndex)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_c7a0bcec2cc038f5 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGamepadPlayerIndex)(arg1, arg2);"
+         , "}"
+         , "Uint16 hs_bindgen_2552182f80b54cf6 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadVendor)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_5aa969efd1bc8f50 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadProduct)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_becbadc225729788 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadProductVersion)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_d97e9cb9945dd63f ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadFirmwareVersion)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_c119e40b53da3b69 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadSerial)(arg1);"
+         , "}"
+         , "Uint64 hs_bindgen_d965293df8f905d5 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadSteamHandle)(arg1);"
+         , "}"
+         , "SDL_JoystickConnectionState hs_bindgen_4d7b7d6dc4affab6 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadConnectionState)(arg1);"
+         , "}"
+         , "SDL_PowerState hs_bindgen_440cd7470f43f8b7 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadPowerInfo)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_73bf6a166bb6fc05 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GamepadConnected)(arg1);"
+         , "}"
+         , "SDL_Joystick *hs_bindgen_cfa9e14aa308a355 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadJoystick)(arg1);"
+         , "}"
+         , "void hs_bindgen_bfc8618e24183771 ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SetGamepadEventsEnabled)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_5871c031639ba44f (void)"
+         , "{"
+         , "  return (SDL_GamepadEventsEnabled)();"
+         , "}"
+         , "SDL_GamepadBinding **hs_bindgen_5bc2e24705268e1e ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadBindings)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_0cb5e97304f01ed4 (void)"
+         , "{"
+         , "  (SDL_UpdateGamepads)();"
+         , "}"
+         , "SDL_GamepadType hs_bindgen_ff738f26b34db99d ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadTypeFromString)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_aeff65b0b5fbbe2f ("
+         , "  SDL_GamepadType arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadStringForType)(arg1);"
+         , "}"
+         , "SDL_GamepadAxis hs_bindgen_9c4d3cd24f36df1d ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadAxisFromString)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_23a85badb8b28574 ("
+         , "  SDL_GamepadAxis arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadStringForAxis)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_25802ce0c34b6a29 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadAxis arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GamepadHasAxis)(arg1, arg2);"
+         , "}"
+         , "Sint16 hs_bindgen_68503ad7a0b89c08 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadAxis arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadAxis)(arg1, arg2);"
+         , "}"
+         , "SDL_GamepadButton hs_bindgen_cecec50fb2b3f9c0 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadButtonFromString)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_65d07695662b7e7c ("
+         , "  SDL_GamepadButton arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadStringForButton)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_05064f987387bd45 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GamepadHasButton)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a672f55d7740b70a ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadButton)(arg1, arg2);"
+         , "}"
+         , "SDL_GamepadButtonLabel hs_bindgen_6a6a621cfd450022 ("
+         , "  SDL_GamepadType arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadButtonLabelForType)(arg1, arg2);"
+         , "}"
+         , "SDL_GamepadButtonLabel hs_bindgen_ea461caaa5e77e3a ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadButtonLabel)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_2d66738e85627648 ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumGamepadTouchpads)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_741e82f074f3aae4 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumGamepadTouchpadFingers)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_1b8db5e7a78bcf2a ("
+         , "  SDL_Gamepad *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  _Bool *arg4,"
+         , "  float *arg5,"
+         , "  float *arg6,"
+         , "  float *arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadTouchpadFinger)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_d58388fe9017bfd7 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GamepadHasSensor)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5229480da62895d3 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGamepadSensorEnabled)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_cf910522abc1f0a2 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GamepadSensorEnabled)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_523e72497fe70de7 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadSensorDataRate)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_772b88104300cbe9 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_SensorType arg2,"
+         , "  float *arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadSensorData)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_8a8a058abd787e14 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RumbleGamepad)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_70ab0a767dbce57a ("
+         , "  SDL_Gamepad *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RumbleGamepadTriggers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_2ae54d3de778ff13 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGamepadLED)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_d29e9a9cdc821a93 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SendGamepadEffect)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_49ebda4983cdcbad ("
+         , "  SDL_Gamepad *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseGamepad)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_3b3870e2dc35c94a ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadButton arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadAppleSFSymbolsNameForButton)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_d904c8d057a68120 ("
+         , "  SDL_Gamepad *arg1,"
+         , "  SDL_GamepadAxis arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGamepadAppleSFSymbolsNameForAxis)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_AddGamepadMapping@
+foreign import ccall unsafe "hs_bindgen_36135983181db04c"
+  hs_bindgen_36135983181db04c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_AddGamepadMapping@
+hs_bindgen_36135983181db04c
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_36135983181db04c =
+  BG.fromFFIType hs_bindgen_36135983181db04c_base
+
+-- | Add support for gamepads that SDL is unaware of or change the binding of an existing gamepad.
+--
+--     The mapping string has the format \"GUID,name,mapping\", where GUID is the string value from SDL_GUIDToString(), name is the human readable string for the device and mappings are gamepad mappings to joystick ones. Under Windows there is a reserved GUID of \"xinput\" that covers all XInput devices. The mapping format for joystick is:
+--
+--     * @bX@: a joystick button, index X
+--
+--     * @hX.Y@: hat X with value Y
+--
+--     * @aX@: axis X of the joystick
+--
+--     Buttons can be used as a gamepad axes and vice versa.
+--
+--     If a device with this GUID is already plugged in, SDL will generate an SDL_EVENT_GAMEPAD_ADDED event.
+--
+--     This string shows an example of a valid mapping for a gamepad:
+--
+--     @
+--     \"341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\"
+--     @
+--
+--     [Returns]: 1 if a new mapping is added, 0 if an existing mapping is updated, -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMappingsFromFile', 'sDL_AddGamepadMappingsFromIO', 'sDL_GetGamepadMapping', 'sDL_GetGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     [C declaration]: @SDL_AddGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 346:33@
+sDL_AddGamepadMapping
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mapping@]: the mapping string.
+  -> IO BG.CInt
+sDL_AddGamepadMapping = hs_bindgen_36135983181db04c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_AddGamepadMappingsFromIO@
+foreign import ccall unsafe "hs_bindgen_7bcfa7483bb6c304"
+  hs_bindgen_7bcfa7483bb6c304_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_AddGamepadMappingsFromIO@
+hs_bindgen_7bcfa7483bb6c304
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO BG.CInt
+hs_bindgen_7bcfa7483bb6c304 =
+  BG.fromFFIType hs_bindgen_7bcfa7483bb6c304_base
+
+-- | Load a set of gamepad mappings from an SDL_IOStream.
+--
+--     You can call this function several times, if needed, to load different database files.
+--
+--     If a new mapping is loaded for an already known gamepad GUID, the later version will overwrite the one currently loaded.
+--
+--     Any new mappings for already plugged in controllers will generate SDL_EVENT_GAMEPAD_ADDED events.
+--
+--     Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).
+--
+--     This function will load the text database entirely in memory before processing it, so take this into consideration if you are in a memory constrained environment.
+--
+--     [Returns]: the number of mappings added or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_AddGamepadMappingsFromFile', 'sDL_GetGamepadMapping', 'sDL_GetGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     [C declaration]: @SDL_AddGamepadMappingsFromIO@, defined at @SDL3\/SDL_gamepad.h 386:33@
+sDL_AddGamepadMappingsFromIO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the mappings to be added.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+  -> IO BG.CInt
+sDL_AddGamepadMappingsFromIO =
+  hs_bindgen_7bcfa7483bb6c304
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_AddGamepadMappingsFromFile@
+foreign import ccall unsafe "hs_bindgen_183e11c34dd8b81f"
+  hs_bindgen_183e11c34dd8b81f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_AddGamepadMappingsFromFile@
+hs_bindgen_183e11c34dd8b81f
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_183e11c34dd8b81f =
+  BG.fromFFIType hs_bindgen_183e11c34dd8b81f_base
+
+-- | Load a set of gamepad mappings from a file.
+--
+--     You can call this function several times, if needed, to load different database files.
+--
+--     If a new mapping is loaded for an already known gamepad GUID, the later version will overwrite the one currently loaded.
+--
+--     Any new mappings for already plugged in controllers will generate SDL_EVENT_GAMEPAD_ADDED events.
+--
+--     Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).
+--
+--     [Returns]: the number of mappings added or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_AddGamepadMappingsFromIO', 'sDL_GetGamepadMapping', 'sDL_GetGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     [C declaration]: @SDL_AddGamepadMappingsFromFile@, defined at @SDL3\/SDL_gamepad.h 420:33@
+sDL_AddGamepadMappingsFromFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the mappings file to load.
+  -> IO BG.CInt
+sDL_AddGamepadMappingsFromFile =
+  hs_bindgen_183e11c34dd8b81f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_ReloadGamepadMappings@
+foreign import ccall unsafe "hs_bindgen_779c89fdca5b9a0e"
+  hs_bindgen_779c89fdca5b9a0e_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_ReloadGamepadMappings@
+hs_bindgen_779c89fdca5b9a0e :: IO BG.CBool
+hs_bindgen_779c89fdca5b9a0e =
+  BG.fromFFIType hs_bindgen_779c89fdca5b9a0e_base
+
+-- | Reinitialize the SDL mapping database to its initial state.
+--
+--     This will generate gamepad events as needed if device mappings change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReloadGamepadMappings@, defined at @SDL3\/SDL_gamepad.h 434:34@
+sDL_ReloadGamepadMappings :: IO BG.CBool
+sDL_ReloadGamepadMappings =
+  hs_bindgen_779c89fdca5b9a0e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadMappings@
+foreign import ccall unsafe "hs_bindgen_d561ea70cab1346c"
+  hs_bindgen_d561ea70cab1346c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadMappings@
+hs_bindgen_d561ea70cab1346c
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+hs_bindgen_d561ea70cab1346c =
+  BG.fromFFIType hs_bindgen_d561ea70cab1346c_base
+
+-- | Get the current gamepad mappings.
+--
+--     [Returns]: an array of the mapping strings, NULL-terminated, or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadMappings@, defined at @SDL3\/SDL_gamepad.h 450:37@
+sDL_GetGamepadMappings
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of mappings returned, can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+sDL_GetGamepadMappings = hs_bindgen_d561ea70cab1346c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadMappingForGUID@
+foreign import ccall unsafe "hs_bindgen_a9d84a5aab18bd61"
+  hs_bindgen_a9d84a5aab18bd61_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadMappingForGUID@
+hs_bindgen_a9d84a5aab18bd61
+  :: BG.Ptr SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_a9d84a5aab18bd61 =
+  BG.fromFFIType hs_bindgen_a9d84a5aab18bd61_base
+
+-- | Get the gamepad mapping string for a given GUID.
+--
+--     [Returns]: a mapping string or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetJoystickGUIDForID, SDL_GetJoystickGUID
+--
+--     [C declaration]: @SDL_GetGamepadMappingForGUID@, defined at @SDL3\/SDL_gamepad.h 467:36@
+sDL_GetGamepadMappingForGUID
+  :: SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: a structure containing the GUID for which a mapping is desired.
+  -> IO (BG.Ptr BG.CChar)
+sDL_GetGamepadMappingForGUID =
+  \guid0 ->
+    BG.with
+      guid0
+      ( \guid1 ->
+          hs_bindgen_a9d84a5aab18bd61 guid1
+      )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadMapping@
+foreign import ccall unsafe "hs_bindgen_094250e7cd4814e2"
+  hs_bindgen_094250e7cd4814e2_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadMapping@
+hs_bindgen_094250e7cd4814e2
+  :: BG.Ptr SDL_Gamepad
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_094250e7cd4814e2 =
+  BG.fromFFIType hs_bindgen_094250e7cd4814e2_base
+
+-- | Get the current mapping of a gamepad.
+--
+--     Details about mappings are discussed with @SDL_AddGamepadMapping()@.
+--
+--     [Returns]: a string that has the gamepad\'s mapping or NULL if no mapping is available; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_GetGamepadMappingForID', 'sDL_GetGamepadMappingForGUID', 'sDL_SetGamepadMapping'
+--
+--     [C declaration]: @SDL_GetGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 488:36@
+sDL_GetGamepadMapping
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad you want to get the current mapping for.
+  -> IO (BG.Ptr BG.CChar)
+sDL_GetGamepadMapping = hs_bindgen_094250e7cd4814e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SetGamepadMapping@
+foreign import ccall unsafe "hs_bindgen_cf9c12a3e0081cba"
+  hs_bindgen_cf9c12a3e0081cba_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SetGamepadMapping@
+hs_bindgen_cf9c12a3e0081cba
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_cf9c12a3e0081cba =
+  BG.fromFFIType hs_bindgen_cf9c12a3e0081cba_base
+
+-- | Set the current mapping of a joystick or gamepad.
+--
+--     Details about mappings are discussed with @SDL_AddGamepadMapping()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddGamepadMapping', 'sDL_GetGamepadMapping'
+--
+--     [C declaration]: @SDL_SetGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 508:34@
+sDL_SetGamepadMapping
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mapping@]: the mapping to use for this device, or NULL to clear the mapping.
+  -> IO BG.CBool
+sDL_SetGamepadMapping = hs_bindgen_cf9c12a3e0081cba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_HasGamepad@
+foreign import ccall unsafe "hs_bindgen_5b29afb080773dd8"
+  hs_bindgen_5b29afb080773dd8_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_HasGamepad@
+hs_bindgen_5b29afb080773dd8 :: IO BG.CBool
+hs_bindgen_5b29afb080773dd8 =
+  BG.fromFFIType hs_bindgen_5b29afb080773dd8_base
+
+-- | Return whether a gamepad is currently connected.
+--
+--     [Returns]: true if a gamepad is connected, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_HasGamepad@, defined at @SDL3\/SDL_gamepad.h 521:34@
+sDL_HasGamepad :: IO BG.CBool
+sDL_HasGamepad = hs_bindgen_5b29afb080773dd8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepads@
+foreign import ccall unsafe "hs_bindgen_e99c053042181461"
+  hs_bindgen_e99c053042181461_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepads@
+hs_bindgen_e99c053042181461
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+hs_bindgen_e99c053042181461 =
+  BG.fromFFIType hs_bindgen_e99c053042181461_base
+
+-- | Get a list of currently connected gamepads.
+--
+--     [Returns]: a 0 terminated array of joystick instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasGamepad', 'sDL_OpenGamepad'
+--
+--     [C declaration]: @SDL_GetGamepads@, defined at @SDL3\/SDL_gamepad.h 539:46@
+sDL_GetGamepads
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of gamepads returned, may be NULL.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+sDL_GetGamepads = hs_bindgen_e99c053042181461
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_IsGamepad@
+foreign import ccall unsafe "hs_bindgen_48b133a0a1a04fee"
+  hs_bindgen_48b133a0a1a04fee_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_IsGamepad@
+hs_bindgen_48b133a0a1a04fee
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO BG.CBool
+hs_bindgen_48b133a0a1a04fee =
+  BG.fromFFIType hs_bindgen_48b133a0a1a04fee_base
+
+-- | Check if the given joystick is supported by the gamepad interface.
+--
+--     [Returns]: true if the given joystick is supported by the gamepad interface, false if it isn\'t or it\'s an invalid index.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetJoysticks, 'sDL_OpenGamepad'
+--
+--     [C declaration]: @SDL_IsGamepad@, defined at @SDL3\/SDL_gamepad.h 555:34@
+sDL_IsGamepad
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.CBool
+sDL_IsGamepad = hs_bindgen_48b133a0a1a04fee
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadNameForID@
+foreign import ccall unsafe "hs_bindgen_51b0ed9ede139ced"
+  hs_bindgen_51b0ed9ede139ced_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadNameForID@
+hs_bindgen_51b0ed9ede139ced
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_51b0ed9ede139ced =
+  BG.fromFFIType hs_bindgen_51b0ed9ede139ced_base
+
+-- | Get the implementation dependent name of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the name of the selected gamepad. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadName', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadNameForID@, defined at @SDL3\/SDL_gamepad.h 573:42@
+sDL_GetGamepadNameForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadNameForID = hs_bindgen_51b0ed9ede139ced
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadPathForID@
+foreign import ccall unsafe "hs_bindgen_c1fe082501f756ae"
+  hs_bindgen_c1fe082501f756ae_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadPathForID@
+hs_bindgen_c1fe082501f756ae
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_c1fe082501f756ae =
+  BG.fromFFIType hs_bindgen_c1fe082501f756ae_base
+
+-- | Get the implementation dependent path of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the path of the selected gamepad. If no path can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPath', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadPathForID@, defined at @SDL3\/SDL_gamepad.h 591:42@
+sDL_GetGamepadPathForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadPathForID = hs_bindgen_c1fe082501f756ae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadPlayerIndexForID@
+foreign import ccall unsafe "hs_bindgen_9dac07bb4aa4a0e0"
+  hs_bindgen_9dac07bb4aa4a0e0_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadPlayerIndexForID@
+hs_bindgen_9dac07bb4aa4a0e0
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO BG.CInt
+hs_bindgen_9dac07bb4aa4a0e0 =
+  BG.fromFFIType hs_bindgen_9dac07bb4aa4a0e0_base
+
+-- | Get the player index of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the player index of a gamepad, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPlayerIndex', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadPlayerIndexForID@, defined at @SDL3\/SDL_gamepad.h 608:33@
+sDL_GetGamepadPlayerIndexForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.CInt
+sDL_GetGamepadPlayerIndexForID =
+  hs_bindgen_9dac07bb4aa4a0e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadGUIDForID@
+foreign import ccall unsafe "hs_bindgen_2280985bb32deb1f"
+  hs_bindgen_2280985bb32deb1f_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadGUIDForID@
+hs_bindgen_2280985bb32deb1f
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> BG.Ptr SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -> IO ()
+hs_bindgen_2280985bb32deb1f =
+  BG.fromFFIType hs_bindgen_2280985bb32deb1f_base
+
+-- | Get the implementation-dependent GUID of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the GUID of the selected gamepad. If called on an invalid index, this function returns a zero GUID.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GUIDToString, 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadGUIDForID@, defined at @SDL3\/SDL_gamepad.h 626:38@
+sDL_GetGamepadGUIDForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+sDL_GetGamepadGUIDForID =
+  \instance_id0 ->
+    BG.allocaAndPeek
+      ( \res1 ->
+          hs_bindgen_2280985bb32deb1f instance_id0 res1
+      )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadVendorForID@
+foreign import ccall unsafe "hs_bindgen_1702db5431a9f4d5"
+  hs_bindgen_1702db5431a9f4d5_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadVendorForID@
+hs_bindgen_1702db5431a9f4d5
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_1702db5431a9f4d5 =
+  BG.fromFFIType hs_bindgen_1702db5431a9f4d5_base
+
+-- | Get the USB vendor ID of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadVendor', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadVendorForID@, defined at @SDL3\/SDL_gamepad.h 645:36@
+sDL_GetGamepadVendorForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadVendorForID =
+  hs_bindgen_1702db5431a9f4d5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadProductForID@
+foreign import ccall unsafe "hs_bindgen_c6d0670cd6f1d312"
+  hs_bindgen_c6d0670cd6f1d312_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadProductForID@
+hs_bindgen_c6d0670cd6f1d312
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_c6d0670cd6f1d312 =
+  BG.fromFFIType hs_bindgen_c6d0670cd6f1d312_base
+
+-- | Get the USB product ID of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProduct', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadProductForID@, defined at @SDL3\/SDL_gamepad.h 664:36@
+sDL_GetGamepadProductForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadProductForID =
+  hs_bindgen_c6d0670cd6f1d312
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadProductVersionForID@
+foreign import ccall unsafe "hs_bindgen_c5762d27fdb0fe20"
+  hs_bindgen_c5762d27fdb0fe20_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadProductVersionForID@
+hs_bindgen_c5762d27fdb0fe20
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_c5762d27fdb0fe20 =
+  BG.fromFFIType hs_bindgen_c5762d27fdb0fe20_base
+
+-- | Get the product version of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProductVersion', 'sDL_GetGamepads'
+--
+--     [C declaration]: @SDL_GetGamepadProductVersionForID@, defined at @SDL3\/SDL_gamepad.h 683:36@
+sDL_GetGamepadProductVersionForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadProductVersionForID =
+  hs_bindgen_c5762d27fdb0fe20
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadTypeForID@
+foreign import ccall unsafe "hs_bindgen_ab8ba638efb36686"
+  hs_bindgen_ab8ba638efb36686_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadTypeForID@
+hs_bindgen_ab8ba638efb36686
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO SDL_GamepadType
+hs_bindgen_ab8ba638efb36686 =
+  BG.fromFFIType hs_bindgen_ab8ba638efb36686_base
+
+-- | Get the type of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the gamepad type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadType', 'sDL_GetGamepads', 'sDL_GetRealGamepadTypeForID'
+--
+--     [C declaration]: @SDL_GetGamepadTypeForID@, defined at @SDL3\/SDL_gamepad.h 701:45@
+sDL_GetGamepadTypeForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_GamepadType
+sDL_GetGamepadTypeForID = hs_bindgen_ab8ba638efb36686
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetRealGamepadTypeForID@
+foreign import ccall unsafe "hs_bindgen_dbd35ae44acef0c3"
+  hs_bindgen_dbd35ae44acef0c3_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetRealGamepadTypeForID@
+hs_bindgen_dbd35ae44acef0c3
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO SDL_GamepadType
+hs_bindgen_dbd35ae44acef0c3 =
+  BG.fromFFIType hs_bindgen_dbd35ae44acef0c3_base
+
+-- | Get the type of a gamepad, ignoring any mapping override.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the gamepad type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTypeForID', 'sDL_GetGamepads', 'sDL_GetRealGamepadType'
+--
+--     [C declaration]: @SDL_GetRealGamepadTypeForID@, defined at @SDL3\/SDL_gamepad.h 719:45@
+sDL_GetRealGamepadTypeForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_GamepadType
+sDL_GetRealGamepadTypeForID =
+  hs_bindgen_dbd35ae44acef0c3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadMappingForID@
+foreign import ccall unsafe "hs_bindgen_70db76a3c7fda9bd"
+  hs_bindgen_70db76a3c7fda9bd_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadMappingForID@
+hs_bindgen_70db76a3c7fda9bd
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_70db76a3c7fda9bd =
+  BG.fromFFIType hs_bindgen_70db76a3c7fda9bd_base
+
+-- | Get the mapping of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the mapping string. Returns NULL if no mapping is available. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepads', 'sDL_GetGamepadMapping'
+--
+--     [C declaration]: @SDL_GetGamepadMappingForID@, defined at @SDL3\/SDL_gamepad.h 737:36@
+sDL_GetGamepadMappingForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr BG.CChar)
+sDL_GetGamepadMappingForID =
+  hs_bindgen_70db76a3c7fda9bd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_OpenGamepad@
+foreign import ccall unsafe "hs_bindgen_cbd487a8a2440863"
+  hs_bindgen_cbd487a8a2440863_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_OpenGamepad@
+hs_bindgen_cbd487a8a2440863
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO (BG.Ptr SDL_Gamepad)
+hs_bindgen_cbd487a8a2440863 =
+  BG.fromFFIType hs_bindgen_cbd487a8a2440863_base
+
+-- | Open a gamepad for use.
+--
+--     [Returns]: a gamepad identifier or NULL if an error occurred; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseGamepad', 'sDL_IsGamepad'
+--
+--     [C declaration]: @SDL_OpenGamepad@, defined at @SDL3\/SDL_gamepad.h 753:43@
+sDL_OpenGamepad
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr SDL_Gamepad)
+sDL_OpenGamepad = hs_bindgen_cbd487a8a2440863
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadFromID@
+foreign import ccall unsafe "hs_bindgen_a76618005d317dbe"
+  hs_bindgen_a76618005d317dbe_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadFromID@
+hs_bindgen_a76618005d317dbe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -> IO (BG.Ptr SDL_Gamepad)
+hs_bindgen_a76618005d317dbe =
+  BG.fromFFIType hs_bindgen_a76618005d317dbe_base
+
+-- | Get the 'SDL_Gamepad' associated with a joystick instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Gamepad' on success or NULL on failure or if it hasn\'t been opened yet; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadFromID@, defined at @SDL3\/SDL_gamepad.h 767:43@
+sDL_GetGamepadFromID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID of the gamepad.
+  -> IO (BG.Ptr SDL_Gamepad)
+sDL_GetGamepadFromID = hs_bindgen_a76618005d317dbe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadFromPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_23e0c7566ddc098f"
+  hs_bindgen_23e0c7566ddc098f_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadFromPlayerIndex@
+hs_bindgen_23e0c7566ddc098f
+  :: BG.CInt
+  -> IO (BG.Ptr SDL_Gamepad)
+hs_bindgen_23e0c7566ddc098f =
+  BG.fromFFIType hs_bindgen_23e0c7566ddc098f_base
+
+-- | Get the 'SDL_Gamepad' associated with a player index.
+--
+--     [Returns]: the 'SDL_Gamepad' associated with a player index.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPlayerIndex', 'sDL_SetGamepadPlayerIndex'
+--
+--     [C declaration]: @SDL_GetGamepadFromPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 782:43@
+sDL_GetGamepadFromPlayerIndex
+  :: BG.CInt
+  -- ^
+  --
+  --           [@player_index@]: the player index, which different from the instance ID.
+  -> IO (BG.Ptr SDL_Gamepad)
+sDL_GetGamepadFromPlayerIndex =
+  hs_bindgen_23e0c7566ddc098f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadProperties@
+foreign import ccall unsafe "hs_bindgen_e986873f08423af3"
+  hs_bindgen_e986873f08423af3_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadProperties@
+hs_bindgen_e986873f08423af3
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_e986873f08423af3 =
+  BG.fromFFIType hs_bindgen_e986873f08423af3_base
+
+-- | Get the properties associated with an opened gamepad.
+--
+--     These properties are shared with the underlying joystick object.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_MONO_LED_BOOLEAN'@: true if this gamepad has an LED that has adjustable brightness
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_RGB_LED_BOOLEAN'@: true if this gamepad has an LED that has adjustable color
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_PLAYER_LED_BOOLEAN'@: true if this gamepad has a player LED
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_RUMBLE_BOOLEAN'@: true if this gamepad has left\/right rumble
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_TRIGGER_RUMBLE_BOOLEAN'@: true if this gamepad has simple trigger rumble
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadProperties@, defined at @SDL3\/SDL_gamepad.h 811:46@
+sDL_GetGamepadProperties
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetGamepadProperties =
+  hs_bindgen_e986873f08423af3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadID@
+foreign import ccall unsafe "hs_bindgen_e2d0c689bb9fdafb"
+  hs_bindgen_e2d0c689bb9fdafb_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadID@
+hs_bindgen_e2d0c689bb9fdafb
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+hs_bindgen_e2d0c689bb9fdafb =
+  BG.fromFFIType hs_bindgen_e2d0c689bb9fdafb_base
+
+-- | Get the instance ID of an opened gamepad.
+--
+--     [Returns]: the instance ID of the specified gamepad on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadID@, defined at @SDL3\/SDL_gamepad.h 831:44@
+sDL_GetGamepadID
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+sDL_GetGamepadID = hs_bindgen_e2d0c689bb9fdafb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadName@
+foreign import ccall unsafe "hs_bindgen_9d53319611fb7b21"
+  hs_bindgen_9d53319611fb7b21_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadName@
+hs_bindgen_9d53319611fb7b21
+  :: BG.Ptr SDL_Gamepad
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_9d53319611fb7b21 =
+  BG.fromFFIType hs_bindgen_9d53319611fb7b21_base
+
+-- | Get the implementation-dependent name for an opened gamepad.
+--
+--     [Returns]: the implementation dependent name for the gamepad, or NULL if there is no name or the identifier passed is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadNameForID'
+--
+--     [C declaration]: @SDL_GetGamepadName@, defined at @SDL3\/SDL_gamepad.h 847:42@
+sDL_GetGamepadName
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadName = hs_bindgen_9d53319611fb7b21
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadPath@
+foreign import ccall unsafe "hs_bindgen_d7698305b32d2548"
+  hs_bindgen_d7698305b32d2548_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadPath@
+hs_bindgen_d7698305b32d2548
+  :: BG.Ptr SDL_Gamepad
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_d7698305b32d2548 =
+  BG.fromFFIType hs_bindgen_d7698305b32d2548_base
+
+-- | Get the implementation-dependent path for an opened gamepad.
+--
+--     [Returns]: the implementation dependent path for the gamepad, or NULL if there is no path or the identifier passed is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPathForID'
+--
+--     [C declaration]: @SDL_GetGamepadPath@, defined at @SDL3\/SDL_gamepad.h 863:42@
+sDL_GetGamepadPath
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadPath = hs_bindgen_d7698305b32d2548
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadType@
+foreign import ccall unsafe "hs_bindgen_e2d440eeb9de4199"
+  hs_bindgen_e2d440eeb9de4199_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadType@
+hs_bindgen_e2d440eeb9de4199
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL_GamepadType
+hs_bindgen_e2d440eeb9de4199 =
+  BG.fromFFIType hs_bindgen_e2d440eeb9de4199_base
+
+-- | Get the type of an opened gamepad.
+--
+--     [Returns]: the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTypeForID'
+--
+--     [C declaration]: @SDL_GetGamepadType@, defined at @SDL3\/SDL_gamepad.h 878:45@
+sDL_GetGamepadType
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL_GamepadType
+sDL_GetGamepadType = hs_bindgen_e2d440eeb9de4199
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetRealGamepadType@
+foreign import ccall unsafe "hs_bindgen_ee5c3fd3f0de744f"
+  hs_bindgen_ee5c3fd3f0de744f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetRealGamepadType@
+hs_bindgen_ee5c3fd3f0de744f
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL_GamepadType
+hs_bindgen_ee5c3fd3f0de744f =
+  BG.fromFFIType hs_bindgen_ee5c3fd3f0de744f_base
+
+-- | Get the type of an opened gamepad, ignoring any mapping override.
+--
+--     [Returns]: the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRealGamepadTypeForID'
+--
+--     [C declaration]: @SDL_GetRealGamepadType@, defined at @SDL3\/SDL_gamepad.h 893:45@
+sDL_GetRealGamepadType
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL_GamepadType
+sDL_GetRealGamepadType = hs_bindgen_ee5c3fd3f0de744f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_8457d3ba6fab74fd"
+  hs_bindgen_8457d3ba6fab74fd_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadPlayerIndex@
+hs_bindgen_8457d3ba6fab74fd
+  :: BG.Ptr SDL_Gamepad
+  -> IO BG.CInt
+hs_bindgen_8457d3ba6fab74fd =
+  BG.fromFFIType hs_bindgen_8457d3ba6fab74fd_base
+
+-- | Get the player index of an opened gamepad.
+--
+--     For XInput gamepads this returns the XInput user index.
+--
+--     [Returns]: the player index for gamepad, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGamepadPlayerIndex'
+--
+--     [C declaration]: @SDL_GetGamepadPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 909:33@
+sDL_GetGamepadPlayerIndex
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.CInt
+sDL_GetGamepadPlayerIndex =
+  hs_bindgen_8457d3ba6fab74fd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SetGamepadPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_c7a0bcec2cc038f5"
+  hs_bindgen_c7a0bcec2cc038f5_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SetGamepadPlayerIndex@
+hs_bindgen_c7a0bcec2cc038f5
+  :: BG.Ptr SDL_Gamepad
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_c7a0bcec2cc038f5 =
+  BG.fromFFIType hs_bindgen_c7a0bcec2cc038f5_base
+
+-- | Set the player index of an opened gamepad.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadPlayerIndex'
+--
+--     [C declaration]: @SDL_SetGamepadPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 926:34@
+sDL_SetGamepadPlayerIndex
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to adjust.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@player_index@]: player index to assign to this gamepad, or -1 to clear the player index and turn off player LEDs.
+  -> IO BG.CBool
+sDL_SetGamepadPlayerIndex =
+  hs_bindgen_c7a0bcec2cc038f5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadVendor@
+foreign import ccall unsafe "hs_bindgen_2552182f80b54cf6"
+  hs_bindgen_2552182f80b54cf6_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadVendor@
+hs_bindgen_2552182f80b54cf6
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_2552182f80b54cf6 =
+  BG.fromFFIType hs_bindgen_2552182f80b54cf6_base
+
+-- | Get the USB vendor ID of an opened gamepad, if available.
+--
+--     If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadVendorForID'
+--
+--     [C declaration]: @SDL_GetGamepadVendor@, defined at @SDL3\/SDL_gamepad.h 942:36@
+sDL_GetGamepadVendor
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadVendor = hs_bindgen_2552182f80b54cf6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadProduct@
+foreign import ccall unsafe "hs_bindgen_5aa969efd1bc8f50"
+  hs_bindgen_5aa969efd1bc8f50_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadProduct@
+hs_bindgen_5aa969efd1bc8f50
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_5aa969efd1bc8f50 =
+  BG.fromFFIType hs_bindgen_5aa969efd1bc8f50_base
+
+-- | Get the USB product ID of an opened gamepad, if available.
+--
+--     If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProductForID'
+--
+--     [C declaration]: @SDL_GetGamepadProduct@, defined at @SDL3\/SDL_gamepad.h 958:36@
+sDL_GetGamepadProduct
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadProduct = hs_bindgen_5aa969efd1bc8f50
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadProductVersion@
+foreign import ccall unsafe "hs_bindgen_becbadc225729788"
+  hs_bindgen_becbadc225729788_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadProductVersion@
+hs_bindgen_becbadc225729788
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_becbadc225729788 =
+  BG.fromFFIType hs_bindgen_becbadc225729788_base
+
+-- | Get the product version of an opened gamepad, if available.
+--
+--     If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product version, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadProductVersionForID'
+--
+--     [C declaration]: @SDL_GetGamepadProductVersion@, defined at @SDL3\/SDL_gamepad.h 974:36@
+sDL_GetGamepadProductVersion
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadProductVersion =
+  hs_bindgen_becbadc225729788
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadFirmwareVersion@
+foreign import ccall unsafe "hs_bindgen_d97e9cb9945dd63f"
+  hs_bindgen_d97e9cb9945dd63f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadFirmwareVersion@
+hs_bindgen_d97e9cb9945dd63f
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_d97e9cb9945dd63f =
+  BG.fromFFIType hs_bindgen_d97e9cb9945dd63f_base
+
+-- | Get the firmware version of an opened gamepad, if available.
+--
+--     If the firmware version isn\'t available this function returns 0.
+--
+--     [Returns]: the gamepad firmware version, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadFirmwareVersion@, defined at @SDL3\/SDL_gamepad.h 988:36@
+sDL_GetGamepadFirmwareVersion
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetGamepadFirmwareVersion =
+  hs_bindgen_d97e9cb9945dd63f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadSerial@
+foreign import ccall unsafe "hs_bindgen_c119e40b53da3b69"
+  hs_bindgen_c119e40b53da3b69_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadSerial@
+hs_bindgen_c119e40b53da3b69
+  :: BG.Ptr SDL_Gamepad
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_c119e40b53da3b69 =
+  BG.fromFFIType hs_bindgen_c119e40b53da3b69_base
+
+-- | Get the serial number of an opened gamepad, if available.
+--
+--     Returns the serial number of the gamepad, or NULL if it is not available.
+--
+--     [Returns]: the serial number, or NULL if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSerial@, defined at @SDL3\/SDL_gamepad.h 1002:42@
+sDL_GetGamepadSerial
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadSerial = hs_bindgen_c119e40b53da3b69
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadSteamHandle@
+foreign import ccall unsafe "hs_bindgen_d965293df8f905d5"
+  hs_bindgen_d965293df8f905d5_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadSteamHandle@
+hs_bindgen_d965293df8f905d5
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_d965293df8f905d5 =
+  BG.fromFFIType hs_bindgen_d965293df8f905d5_base
+
+-- | Get the Steam Input handle of an opened gamepad, if available.
+--
+--     Returns an InputHandle_t for the gamepad that can be used with Steam Input API: [https:\/\/partner.steamgames.com\/doc\/api\/ISteamInput](https://partner.steamgames.com/doc/api/ISteamInput)
+--
+--     [Returns]: the gamepad handle, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSteamHandle@, defined at @SDL3\/SDL_gamepad.h 1017:36@
+sDL_GetGamepadSteamHandle
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetGamepadSteamHandle =
+  hs_bindgen_d965293df8f905d5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadConnectionState@
+foreign import ccall unsafe "hs_bindgen_4d7b7d6dc4affab6"
+  hs_bindgen_4d7b7d6dc4affab6_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadConnectionState@
+hs_bindgen_4d7b7d6dc4affab6
+  :: BG.Ptr SDL_Gamepad
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickConnectionState
+hs_bindgen_4d7b7d6dc4affab6 =
+  BG.fromFFIType hs_bindgen_4d7b7d6dc4affab6_base
+
+-- | Get the connection state of a gamepad.
+--
+--     [Returns]: the connection state on success or @SDL_JOYSTICK_CONNECTION_INVALID@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadConnectionState@, defined at @SDL3\/SDL_gamepad.h 1031:57@
+sDL_GetGamepadConnectionState
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickConnectionState
+sDL_GetGamepadConnectionState =
+  hs_bindgen_4d7b7d6dc4affab6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadPowerInfo@
+foreign import ccall unsafe "hs_bindgen_440cd7470f43f8b7"
+  hs_bindgen_440cd7470f43f8b7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadPowerInfo@
+hs_bindgen_440cd7470f43f8b7
+  :: BG.Ptr SDL_Gamepad
+  -> BG.Ptr BG.CInt
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+hs_bindgen_440cd7470f43f8b7 =
+  BG.fromFFIType hs_bindgen_440cd7470f43f8b7_base
+
+-- | Get the battery state of a gamepad.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     [Returns]: the current battery state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadPowerInfo@, defined at @SDL3\/SDL_gamepad.h 1053:44@
+sDL_GetGamepadPowerInfo
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 we can\'t determine a value or there is no battery.
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+sDL_GetGamepadPowerInfo = hs_bindgen_440cd7470f43f8b7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadConnected@
+foreign import ccall unsafe "hs_bindgen_73bf6a166bb6fc05"
+  hs_bindgen_73bf6a166bb6fc05_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadConnected@
+hs_bindgen_73bf6a166bb6fc05
+  :: BG.Ptr SDL_Gamepad
+  -> IO BG.CBool
+hs_bindgen_73bf6a166bb6fc05 =
+  BG.fromFFIType hs_bindgen_73bf6a166bb6fc05_base
+
+-- | Check if a gamepad has been opened and is currently connected.
+--
+--     [Returns]: true if the gamepad has been opened and is currently connected, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GamepadConnected@, defined at @SDL3\/SDL_gamepad.h 1067:34@
+sDL_GamepadConnected
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO BG.CBool
+sDL_GamepadConnected = hs_bindgen_73bf6a166bb6fc05
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadJoystick@
+foreign import ccall unsafe "hs_bindgen_cfa9e14aa308a355"
+  hs_bindgen_cfa9e14aa308a355_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadJoystick@
+hs_bindgen_cfa9e14aa308a355
+  :: BG.Ptr SDL_Gamepad
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick)
+hs_bindgen_cfa9e14aa308a355 =
+  BG.fromFFIType hs_bindgen_cfa9e14aa308a355_base
+
+-- | Get the underlying joystick from a gamepad.
+--
+--     This function will give you a SDL_Joystick object, which allows you to use the SDL_Joystick functions with a 'SDL_Gamepad' object. This would be useful for getting a joystick\'s position at any given time, even if it hasn\'t moved (moving it would produce an event, which would have the axis\' value).
+--
+--     The pointer returned is owned by the 'SDL_Gamepad'. You should not call SDL_CloseJoystick() on it, for example, since doing so will likely cause SDL to crash.
+--
+--     [Returns]: an SDL_Joystick object, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadJoystick@, defined at @SDL3\/SDL_gamepad.h 1089:44@
+sDL_GetGamepadJoystick
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object that you want to get a joystick from.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick)
+sDL_GetGamepadJoystick = hs_bindgen_cfa9e14aa308a355
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SetGamepadEventsEnabled@
+foreign import ccall unsafe "hs_bindgen_bfc8618e24183771"
+  hs_bindgen_bfc8618e24183771_base
+    :: BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SetGamepadEventsEnabled@
+hs_bindgen_bfc8618e24183771
+  :: BG.CBool
+  -> IO ()
+hs_bindgen_bfc8618e24183771 =
+  BG.fromFFIType hs_bindgen_bfc8618e24183771_base
+
+-- | Set the state of gamepad event processing.
+--
+--     If gamepad events are disabled, you must call @SDL_UpdateGamepads()@ yourself and check the state of the gamepad when you want gamepad information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadEventsEnabled', 'sDL_UpdateGamepads'
+--
+--     [C declaration]: @SDL_SetGamepadEventsEnabled@, defined at @SDL3\/SDL_gamepad.h 1106:34@
+sDL_SetGamepadEventsEnabled
+  :: BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: whether to process gamepad events or not.
+  -> IO ()
+sDL_SetGamepadEventsEnabled =
+  hs_bindgen_bfc8618e24183771
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadEventsEnabled@
+foreign import ccall unsafe "hs_bindgen_5871c031639ba44f"
+  hs_bindgen_5871c031639ba44f_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadEventsEnabled@
+hs_bindgen_5871c031639ba44f :: IO BG.CBool
+hs_bindgen_5871c031639ba44f =
+  BG.fromFFIType hs_bindgen_5871c031639ba44f_base
+
+-- | Query the state of gamepad event processing.
+--
+--     If gamepad events are disabled, you must call @SDL_UpdateGamepads()@ yourself and check the state of the gamepad when you want gamepad information.
+--
+--     [Returns]: true if gamepad events are being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGamepadEventsEnabled'
+--
+--     [C declaration]: @SDL_GamepadEventsEnabled@, defined at @SDL3\/SDL_gamepad.h 1122:34@
+sDL_GamepadEventsEnabled :: IO BG.CBool
+sDL_GamepadEventsEnabled =
+  hs_bindgen_5871c031639ba44f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadBindings@
+foreign import ccall unsafe "hs_bindgen_5bc2e24705268e1e"
+  hs_bindgen_5bc2e24705268e1e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadBindings@
+hs_bindgen_5bc2e24705268e1e
+  :: BG.Ptr SDL_Gamepad
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_GamepadBinding))
+hs_bindgen_5bc2e24705268e1e =
+  BG.fromFFIType hs_bindgen_5bc2e24705268e1e_base
+
+-- | Get the SDL joystick layer bindings for a gamepad.
+--
+--     [Returns]: a NULL terminated array of pointers to bindings or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadBindings@, defined at @SDL3\/SDL_gamepad.h 1138:51@
+sDL_GetGamepadBindings
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of bindings returned.
+  -> IO (BG.Ptr (BG.Ptr SDL_GamepadBinding))
+sDL_GetGamepadBindings = hs_bindgen_5bc2e24705268e1e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_UpdateGamepads@
+foreign import ccall unsafe "hs_bindgen_0cb5e97304f01ed4"
+  hs_bindgen_0cb5e97304f01ed4_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_UpdateGamepads@
+hs_bindgen_0cb5e97304f01ed4 :: IO ()
+hs_bindgen_0cb5e97304f01ed4 =
+  BG.fromFFIType hs_bindgen_0cb5e97304f01ed4_base
+
+-- | Manually pump gamepad updates if not using the loop.
+--
+--     This function is called automatically by the event loop if events are enabled. Under such circumstances, it will not be necessary to call this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateGamepads@, defined at @SDL3\/SDL_gamepad.h 1151:34@
+sDL_UpdateGamepads :: IO ()
+sDL_UpdateGamepads = hs_bindgen_0cb5e97304f01ed4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadTypeFromString@
+foreign import ccall unsafe "hs_bindgen_ff738f26b34db99d"
+  hs_bindgen_ff738f26b34db99d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadTypeFromString@
+hs_bindgen_ff738f26b34db99d
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL_GamepadType
+hs_bindgen_ff738f26b34db99d =
+  BG.fromFFIType hs_bindgen_ff738f26b34db99d_base
+
+-- | Convert a string into 'SDL_GamepadType' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     [Returns]: the 'SDL_GamepadType' enum corresponding to the input string, or @SDL_GAMEPAD_TYPE_UNKNOWN@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadStringForType'
+--
+--     [C declaration]: @SDL_GetGamepadTypeFromString@, defined at @SDL3\/SDL_gamepad.h 1171:45@
+sDL_GetGamepadTypeFromString
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_GamepadType' type.
+  -> IO SDL_GamepadType
+sDL_GetGamepadTypeFromString =
+  hs_bindgen_ff738f26b34db99d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadStringForType@
+foreign import ccall unsafe "hs_bindgen_aeff65b0b5fbbe2f"
+  hs_bindgen_aeff65b0b5fbbe2f_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadStringForType@
+hs_bindgen_aeff65b0b5fbbe2f
+  :: SDL_GamepadType
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_aeff65b0b5fbbe2f =
+  BG.fromFFIType hs_bindgen_aeff65b0b5fbbe2f_base
+
+-- | Convert from an 'SDL_GamepadType' enum to a string.
+--
+--     [Returns]: a string for the given type, or NULL if an invalid type is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTypeFromString'
+--
+--     [C declaration]: @SDL_GetGamepadStringForType@, defined at @SDL3\/SDL_gamepad.h 1187:42@
+sDL_GetGamepadStringForType
+  :: SDL_GamepadType
+  -- ^
+  --
+  --           [@type@]: an enum value for a given 'SDL_GamepadType'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadStringForType =
+  hs_bindgen_aeff65b0b5fbbe2f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadAxisFromString@
+foreign import ccall unsafe "hs_bindgen_9c4d3cd24f36df1d"
+  hs_bindgen_9c4d3cd24f36df1d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadAxisFromString@
+hs_bindgen_9c4d3cd24f36df1d
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL_GamepadAxis
+hs_bindgen_9c4d3cd24f36df1d =
+  BG.fromFFIType hs_bindgen_9c4d3cd24f36df1d_base
+
+-- | Convert a string into 'SDL_GamepadAxis' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     Note specially that \"righttrigger\" and \"lefttrigger\" map to @SDL_GAMEPAD_AXIS_RIGHT_TRIGGER@ and @SDL_GAMEPAD_AXIS_LEFT_TRIGGER@, respectively.
+--
+--     [Returns]: the 'SDL_GamepadAxis' enum corresponding to the input string, or @SDL_GAMEPAD_AXIS_INVALID@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadStringForAxis'
+--
+--     [C declaration]: @SDL_GetGamepadAxisFromString@, defined at @SDL3\/SDL_gamepad.h 1211:45@
+sDL_GetGamepadAxisFromString
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_Gamepad' axis.
+  -> IO SDL_GamepadAxis
+sDL_GetGamepadAxisFromString =
+  hs_bindgen_9c4d3cd24f36df1d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadStringForAxis@
+foreign import ccall unsafe "hs_bindgen_23a85badb8b28574"
+  hs_bindgen_23a85badb8b28574_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadStringForAxis@
+hs_bindgen_23a85badb8b28574
+  :: SDL_GamepadAxis
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_23a85badb8b28574 =
+  BG.fromFFIType hs_bindgen_23a85badb8b28574_base
+
+-- | Convert from an 'SDL_GamepadAxis' enum to a string.
+--
+--     [Returns]: a string for the given axis, or NULL if an invalid axis is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadAxisFromString'
+--
+--     [C declaration]: @SDL_GetGamepadStringForAxis@, defined at @SDL3\/SDL_gamepad.h 1227:42@
+sDL_GetGamepadStringForAxis
+  :: SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an enum value for a given 'SDL_GamepadAxis'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadStringForAxis =
+  hs_bindgen_23a85badb8b28574
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadHasAxis@
+foreign import ccall unsafe "hs_bindgen_25802ce0c34b6a29"
+  hs_bindgen_25802ce0c34b6a29_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadHasAxis@
+hs_bindgen_25802ce0c34b6a29
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadAxis
+  -> IO BG.CBool
+hs_bindgen_25802ce0c34b6a29 =
+  BG.fromFFIType hs_bindgen_25802ce0c34b6a29_base
+
+-- | Query whether a gamepad has a given axis.
+--
+--     This merely reports whether the gamepad\'s mapping defined this axis, as that is all the information SDL has about the physical device.
+--
+--     [Returns]: true if the gamepad has this axis, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasButton', 'sDL_GetGamepadAxis'
+--
+--     [C declaration]: @SDL_GamepadHasAxis@, defined at @SDL3\/SDL_gamepad.h 1246:34@
+sDL_GamepadHasAxis
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis enum value (an 'SDL_GamepadAxis' value).
+  -> IO BG.CBool
+sDL_GamepadHasAxis = hs_bindgen_25802ce0c34b6a29
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadAxis@
+foreign import ccall unsafe "hs_bindgen_68503ad7a0b89c08"
+  hs_bindgen_68503ad7a0b89c08_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadAxis@
+hs_bindgen_68503ad7a0b89c08
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadAxis
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint16
+hs_bindgen_68503ad7a0b89c08 =
+  BG.fromFFIType hs_bindgen_68503ad7a0b89c08_base
+
+-- | Get the current state of an axis control on a gamepad.
+--
+--     The axis indices start at index 0.
+--
+--     For thumbsticks, the state is a value ranging from -32768 (up\/left) to 32767 (down\/right).
+--
+--     Triggers range from 0 when released to 32767 when fully pressed, and never return a negative value. Note that this differs from the value reported by the lower-level SDL_GetJoystickAxis(), which normally uses the full range.
+--
+--     Note that for invalid gamepads or axes, this will return 0. Zero is also a valid value in normal operation; usually it means a centered axis.
+--
+--     [Returns]: axis state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasAxis', 'sDL_GetGamepadButton'
+--
+--     [C declaration]: @SDL_GetGamepadAxis@, defined at @SDL3\/SDL_gamepad.h 1274:36@
+sDL_GetGamepadAxis
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis index (one of the 'SDL_GamepadAxis' values).
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint16
+sDL_GetGamepadAxis = hs_bindgen_68503ad7a0b89c08
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadButtonFromString@
+foreign import ccall unsafe "hs_bindgen_cecec50fb2b3f9c0"
+  hs_bindgen_cecec50fb2b3f9c0_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadButtonFromString@
+hs_bindgen_cecec50fb2b3f9c0
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL_GamepadButton
+hs_bindgen_cecec50fb2b3f9c0 =
+  BG.fromFFIType hs_bindgen_cecec50fb2b3f9c0_base
+
+-- | Convert a string into an 'SDL_GamepadButton' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     [Returns]: the 'SDL_GamepadButton' enum corresponding to the input string, or @SDL_GAMEPAD_BUTTON_INVALID@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadStringForButton'
+--
+--     [C declaration]: @SDL_GetGamepadButtonFromString@, defined at @SDL3\/SDL_gamepad.h 1294:47@
+sDL_GetGamepadButtonFromString
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_Gamepad' button.
+  -> IO SDL_GamepadButton
+sDL_GetGamepadButtonFromString =
+  hs_bindgen_cecec50fb2b3f9c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadStringForButton@
+foreign import ccall unsafe "hs_bindgen_65d07695662b7e7c"
+  hs_bindgen_65d07695662b7e7c_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadStringForButton@
+hs_bindgen_65d07695662b7e7c
+  :: SDL_GamepadButton
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_65d07695662b7e7c =
+  BG.fromFFIType hs_bindgen_65d07695662b7e7c_base
+
+-- | Convert from an 'SDL_GamepadButton' enum to a string.
+--
+--     [Returns]: a string for the given button, or NULL if an invalid button is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadButtonFromString'
+--
+--     [C declaration]: @SDL_GetGamepadStringForButton@, defined at @SDL3\/SDL_gamepad.h 1310:42@
+sDL_GetGamepadStringForButton
+  :: SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: an enum value for a given 'SDL_GamepadButton'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadStringForButton =
+  hs_bindgen_65d07695662b7e7c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadHasButton@
+foreign import ccall unsafe "hs_bindgen_05064f987387bd45"
+  hs_bindgen_05064f987387bd45_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadHasButton@
+hs_bindgen_05064f987387bd45
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadButton
+  -> IO BG.CBool
+hs_bindgen_05064f987387bd45 =
+  BG.fromFFIType hs_bindgen_05064f987387bd45_base
+
+-- | Query whether a gamepad has a given button.
+--
+--     This merely reports whether the gamepad\'s mapping defined this button, as that is all the information SDL has about the physical device.
+--
+--     [Returns]: true if the gamepad has this button, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasAxis'
+--
+--     [C declaration]: @SDL_GamepadHasButton@, defined at @SDL3\/SDL_gamepad.h 1328:34@
+sDL_GamepadHasButton
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button enum value (an 'SDL_GamepadButton' value).
+  -> IO BG.CBool
+sDL_GamepadHasButton = hs_bindgen_05064f987387bd45
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadButton@
+foreign import ccall unsafe "hs_bindgen_a672f55d7740b70a"
+  hs_bindgen_a672f55d7740b70a_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadButton@
+hs_bindgen_a672f55d7740b70a
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadButton
+  -> IO BG.CBool
+hs_bindgen_a672f55d7740b70a =
+  BG.fromFFIType hs_bindgen_a672f55d7740b70a_base
+
+-- | Get the current state of a button on a gamepad.
+--
+--     [Returns]: true if the button is pressed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasButton', 'sDL_GetGamepadAxis'
+--
+--     [C declaration]: @SDL_GetGamepadButton@, defined at @SDL3\/SDL_gamepad.h 1344:34@
+sDL_GetGamepadButton
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO BG.CBool
+sDL_GetGamepadButton = hs_bindgen_a672f55d7740b70a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadButtonLabelForType@
+foreign import ccall unsafe "hs_bindgen_6a6a621cfd450022"
+  hs_bindgen_6a6a621cfd450022_base
+    :: BG.Word32
+    -> BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadButtonLabelForType@
+hs_bindgen_6a6a621cfd450022
+  :: SDL_GamepadType
+  -> SDL_GamepadButton
+  -> IO SDL_GamepadButtonLabel
+hs_bindgen_6a6a621cfd450022 =
+  BG.fromFFIType hs_bindgen_6a6a621cfd450022_base
+
+-- | Get the label of a button on a gamepad.
+--
+--     [Returns]: the 'SDL_GamepadButtonLabel' enum corresponding to the button label.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadButtonLabel'
+--
+--     [C declaration]: @SDL_GetGamepadButtonLabelForType@, defined at @SDL3\/SDL_gamepad.h 1359:52@
+sDL_GetGamepadButtonLabelForType
+  :: SDL_GamepadType
+  -- ^
+  --
+  --           [@type@]: the type of gamepad to check.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO SDL_GamepadButtonLabel
+sDL_GetGamepadButtonLabelForType =
+  hs_bindgen_6a6a621cfd450022
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadButtonLabel@
+foreign import ccall unsafe "hs_bindgen_ea461caaa5e77e3a"
+  hs_bindgen_ea461caaa5e77e3a_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadButtonLabel@
+hs_bindgen_ea461caaa5e77e3a
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadButton
+  -> IO SDL_GamepadButtonLabel
+hs_bindgen_ea461caaa5e77e3a =
+  BG.fromFFIType hs_bindgen_ea461caaa5e77e3a_base
+
+-- | Get the label of a button on a gamepad.
+--
+--     [Returns]: the 'SDL_GamepadButtonLabel' enum corresponding to the button label.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadButtonLabelForType'
+--
+--     [C declaration]: @SDL_GetGamepadButtonLabel@, defined at @SDL3\/SDL_gamepad.h 1374:52@
+sDL_GetGamepadButtonLabel
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO SDL_GamepadButtonLabel
+sDL_GetGamepadButtonLabel =
+  hs_bindgen_ea461caaa5e77e3a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetNumGamepadTouchpads@
+foreign import ccall unsafe "hs_bindgen_2d66738e85627648"
+  hs_bindgen_2d66738e85627648_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetNumGamepadTouchpads@
+hs_bindgen_2d66738e85627648
+  :: BG.Ptr SDL_Gamepad
+  -> IO BG.CInt
+hs_bindgen_2d66738e85627648 =
+  BG.fromFFIType hs_bindgen_2d66738e85627648_base
+
+-- | Get the number of touchpads on a gamepad.
+--
+--     [Returns]: number of touchpads.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumGamepadTouchpadFingers'
+--
+--     [C declaration]: @SDL_GetNumGamepadTouchpads@, defined at @SDL3\/SDL_gamepad.h 1388:33@
+sDL_GetNumGamepadTouchpads
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> IO BG.CInt
+sDL_GetNumGamepadTouchpads =
+  hs_bindgen_2d66738e85627648
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetNumGamepadTouchpadFingers@
+foreign import ccall unsafe "hs_bindgen_741e82f074f3aae4"
+  hs_bindgen_741e82f074f3aae4_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetNumGamepadTouchpadFingers@
+hs_bindgen_741e82f074f3aae4
+  :: BG.Ptr SDL_Gamepad
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_741e82f074f3aae4 =
+  BG.fromFFIType hs_bindgen_741e82f074f3aae4_base
+
+-- | Get the number of supported simultaneous fingers on a touchpad on a game gamepad.
+--
+--     [Returns]: number of supported simultaneous fingers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadTouchpadFinger', 'sDL_GetNumGamepadTouchpads'
+--
+--     [C declaration]: @SDL_GetNumGamepadTouchpadFingers@, defined at @SDL3\/SDL_gamepad.h 1405:33@
+sDL_GetNumGamepadTouchpadFingers
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@touchpad@]: a touchpad.
+  -> IO BG.CInt
+sDL_GetNumGamepadTouchpadFingers =
+  hs_bindgen_741e82f074f3aae4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadTouchpadFinger@
+foreign import ccall unsafe "hs_bindgen_1b8db5e7a78bcf2a"
+  hs_bindgen_1b8db5e7a78bcf2a_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadTouchpadFinger@
+hs_bindgen_1b8db5e7a78bcf2a
+  :: BG.Ptr SDL_Gamepad
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.Ptr BG.CBool
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_1b8db5e7a78bcf2a =
+  BG.fromFFIType hs_bindgen_1b8db5e7a78bcf2a_base
+
+-- | Get the current state of a finger on a touchpad on a gamepad.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumGamepadTouchpadFingers'
+--
+--     [C declaration]: @SDL_GetGamepadTouchpadFinger@, defined at @SDL3\/SDL_gamepad.h 1429:34@
+sDL_GetGamepadTouchpadFinger
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@touchpad@]: a touchpad.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@finger@]: a finger.
+  -> BG.Ptr BG.CBool
+  -- ^
+  --
+  --           [@down@]: a pointer filled with true if the finger is down, false otherwise, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer filled with the x position, normalized 0 to 1, with the origin in the upper left, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer filled with the y position, normalized 0 to 1, with the origin in the upper left, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@pressure@]: a pointer filled with pressure value, may be NULL.
+  -> IO BG.CBool
+sDL_GetGamepadTouchpadFinger =
+  hs_bindgen_1b8db5e7a78bcf2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadHasSensor@
+foreign import ccall unsafe "hs_bindgen_d58388fe9017bfd7"
+  hs_bindgen_d58388fe9017bfd7_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadHasSensor@
+hs_bindgen_d58388fe9017bfd7
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> IO BG.CBool
+hs_bindgen_d58388fe9017bfd7 =
+  BG.fromFFIType hs_bindgen_d58388fe9017bfd7_base
+
+-- | Return whether a gamepad has a particular sensor.
+--
+--     [Returns]: true if the sensor exists, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadSensorData', 'sDL_GetGamepadSensorDataRate', 'sDL_SetGamepadSensorEnabled'
+--
+--     [C declaration]: @SDL_GamepadHasSensor@, defined at @SDL3\/SDL_gamepad.h 1446:34@
+sDL_GamepadHasSensor
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO BG.CBool
+sDL_GamepadHasSensor = hs_bindgen_d58388fe9017bfd7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SetGamepadSensorEnabled@
+foreign import ccall unsafe "hs_bindgen_5229480da62895d3"
+  hs_bindgen_5229480da62895d3_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SetGamepadSensorEnabled@
+hs_bindgen_5229480da62895d3
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_5229480da62895d3 =
+  BG.fromFFIType hs_bindgen_5229480da62895d3_base
+
+-- | Set whether data reporting for a gamepad sensor is enabled.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GamepadHasSensor', 'sDL_GamepadSensorEnabled'
+--
+--     [C declaration]: @SDL_SetGamepadSensorEnabled@, defined at @SDL3\/SDL_gamepad.h 1464:34@
+sDL_SetGamepadSensorEnabled
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to update.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to enable\/disable.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: whether data reporting should be enabled.
+  -> IO BG.CBool
+sDL_SetGamepadSensorEnabled =
+  hs_bindgen_5229480da62895d3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadSensorEnabled@
+foreign import ccall unsafe "hs_bindgen_cf910522abc1f0a2"
+  hs_bindgen_cf910522abc1f0a2_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GamepadSensorEnabled@
+hs_bindgen_cf910522abc1f0a2
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> IO BG.CBool
+hs_bindgen_cf910522abc1f0a2 =
+  BG.fromFFIType hs_bindgen_cf910522abc1f0a2_base
+
+-- | Query whether sensor data reporting is enabled for a gamepad.
+--
+--     [Returns]: true if the sensor is enabled, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGamepadSensorEnabled'
+--
+--     [C declaration]: @SDL_GamepadSensorEnabled@, defined at @SDL3\/SDL_gamepad.h 1479:34@
+sDL_GamepadSensorEnabled
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO BG.CBool
+sDL_GamepadSensorEnabled =
+  hs_bindgen_cf910522abc1f0a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadSensorDataRate@
+foreign import ccall unsafe "hs_bindgen_523e72497fe70de7"
+  hs_bindgen_523e72497fe70de7_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadSensorDataRate@
+hs_bindgen_523e72497fe70de7
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> IO BG.CFloat
+hs_bindgen_523e72497fe70de7 =
+  BG.fromFFIType hs_bindgen_523e72497fe70de7_base
+
+-- | Get the data rate (number of events per second) of a gamepad sensor.
+--
+--     [Returns]: the data rate, or 0.0f if the data rate is not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSensorDataRate@, defined at @SDL3\/SDL_gamepad.h 1492:35@
+sDL_GetGamepadSensorDataRate
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO BG.CFloat
+sDL_GetGamepadSensorDataRate =
+  hs_bindgen_523e72497fe70de7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadSensorData@
+foreign import ccall unsafe "hs_bindgen_772b88104300cbe9"
+  hs_bindgen_772b88104300cbe9_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadSensorData@
+hs_bindgen_772b88104300cbe9
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> BG.Ptr BG.CFloat
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_772b88104300cbe9 =
+  BG.fromFFIType hs_bindgen_772b88104300cbe9_base
+
+-- | Get the current state of a gamepad sensor.
+--
+--     The number of values and interpretation of the data is sensor dependent. See the remarks in SDL_SensorType for details for each type of sensor.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGamepadSensorData@, defined at @SDL3\/SDL_gamepad.h 1511:34@
+sDL_GetGamepadSensorData
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@data@]: a pointer filled with the current sensor state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_values@]: the number of values to write to data.
+  -> IO BG.CBool
+sDL_GetGamepadSensorData =
+  hs_bindgen_772b88104300cbe9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_RumbleGamepad@
+foreign import ccall unsafe "hs_bindgen_8a8a058abd787e14"
+  hs_bindgen_8a8a058abd787e14_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> BG.Word16
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_RumbleGamepad@
+hs_bindgen_8a8a058abd787e14
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_8a8a058abd787e14 =
+  BG.fromFFIType hs_bindgen_8a8a058abd787e14_base
+
+-- | Start a rumble effect on a gamepad.
+--
+--     Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     This function requires you to process SDL events or call SDL_UpdateJoysticks() to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RumbleGamepad@, defined at @SDL3\/SDL_gamepad.h 1535:34@
+sDL_RumbleGamepad
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to vibrate.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@low_frequency_rumble@]: the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@high_frequency_rumble@]: the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO BG.CBool
+sDL_RumbleGamepad = hs_bindgen_8a8a058abd787e14
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_RumbleGamepadTriggers@
+foreign import ccall unsafe "hs_bindgen_70ab0a767dbce57a"
+  hs_bindgen_70ab0a767dbce57a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> BG.Word16
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_RumbleGamepadTriggers@
+hs_bindgen_70ab0a767dbce57a
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_70ab0a767dbce57a =
+  BG.fromFFIType hs_bindgen_70ab0a767dbce57a_base
+
+-- | Start a rumble effect in the gamepad\'s triggers.
+--
+--     Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     Note that this is rumbling of the /triggers/ and not the gamepad as a whole. This is currently only supported on Xbox One gamepads. If you want the (more common) whole-gamepad rumble, use @SDL_RumbleGamepad()@ instead.
+--
+--     This function requires you to process SDL events or call SDL_UpdateJoysticks() to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RumbleGamepad'
+--
+--     [C declaration]: @SDL_RumbleGamepadTriggers@, defined at @SDL3\/SDL_gamepad.h 1565:34@
+sDL_RumbleGamepadTriggers
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to vibrate.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@left_rumble@]: the intensity of the left trigger rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@right_rumble@]: the intensity of the right trigger rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO BG.CBool
+sDL_RumbleGamepadTriggers =
+  hs_bindgen_70ab0a767dbce57a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SetGamepadLED@
+foreign import ccall unsafe "hs_bindgen_2ae54d3de778ff13"
+  hs_bindgen_2ae54d3de778ff13_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SetGamepadLED@
+hs_bindgen_2ae54d3de778ff13
+  :: BG.Ptr SDL_Gamepad
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_2ae54d3de778ff13 =
+  BG.fromFFIType hs_bindgen_2ae54d3de778ff13_base
+
+-- | Update a gamepad\'s LED color.
+--
+--     An example of a joystick LED is the light on the back of a PlayStation 4\'s DualShock 4 controller.
+--
+--     For gamepads with a single color LED, the maximum of the RGB values will be used as the LED brightness.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGamepadLED@, defined at @SDL3\/SDL_gamepad.h 1587:34@
+sDL_SetGamepadLED
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@red@]: the intensity of the red LED.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@green@]: the intensity of the green LED.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@blue@]: the intensity of the blue LED.
+  -> IO BG.CBool
+sDL_SetGamepadLED = hs_bindgen_2ae54d3de778ff13
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SendGamepadEffect@
+foreign import ccall unsafe "hs_bindgen_d29e9a9cdc821a93"
+  hs_bindgen_d29e9a9cdc821a93_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_SendGamepadEffect@
+hs_bindgen_d29e9a9cdc821a93
+  :: BG.Ptr SDL_Gamepad
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_d29e9a9cdc821a93 =
+  BG.fromFFIType hs_bindgen_d29e9a9cdc821a93_base
+
+-- | Send a gamepad specific effect packet.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SendGamepadEffect@, defined at @SDL3\/SDL_gamepad.h 1602:34@
+sDL_SendGamepadEffect
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to affect.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to send to the gamepad.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@size@]: the size of the data to send to the gamepad.
+  -> IO BG.CBool
+sDL_SendGamepadEffect = hs_bindgen_d29e9a9cdc821a93
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_CloseGamepad@
+foreign import ccall unsafe "hs_bindgen_49ebda4983cdcbad"
+  hs_bindgen_49ebda4983cdcbad_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_CloseGamepad@
+hs_bindgen_49ebda4983cdcbad
+  :: BG.Ptr SDL_Gamepad
+  -> IO ()
+hs_bindgen_49ebda4983cdcbad =
+  BG.fromFFIType hs_bindgen_49ebda4983cdcbad_base
+
+-- | Close a gamepad previously opened with @SDL_OpenGamepad()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenGamepad'
+--
+--     [C declaration]: @SDL_CloseGamepad@, defined at @SDL3\/SDL_gamepad.h 1616:34@
+sDL_CloseGamepad
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @SDL_OpenGamepad()@.
+  -> IO ()
+sDL_CloseGamepad = hs_bindgen_49ebda4983cdcbad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadAppleSFSymbolsNameForButton@
+foreign import ccall unsafe "hs_bindgen_3b3870e2dc35c94a"
+  hs_bindgen_3b3870e2dc35c94a_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadAppleSFSymbolsNameForButton@
+hs_bindgen_3b3870e2dc35c94a
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadButton
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_3b3870e2dc35c94a =
+  BG.fromFFIType hs_bindgen_3b3870e2dc35c94a_base
+
+-- | Return the sfSymbolsName for a given button on a gamepad on Apple platforms.
+--
+--     [Returns]: the sfSymbolsName or NULL if the name can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadAppleSFSymbolsNameForAxis'
+--
+--     [C declaration]: @SDL_GetGamepadAppleSFSymbolsNameForButton@, defined at @SDL3\/SDL_gamepad.h 1632:42@
+sDL_GetGamepadAppleSFSymbolsNameForButton
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button on the gamepad.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadAppleSFSymbolsNameForButton =
+  hs_bindgen_3b3870e2dc35c94a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadAppleSFSymbolsNameForAxis@
+foreign import ccall unsafe "hs_bindgen_d904c8d057a68120"
+  hs_bindgen_d904c8d057a68120_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gamepad_Unsafe_SDL_GetGamepadAppleSFSymbolsNameForAxis@
+hs_bindgen_d904c8d057a68120
+  :: BG.Ptr SDL_Gamepad
+  -> SDL_GamepadAxis
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_d904c8d057a68120 =
+  BG.fromFFIType hs_bindgen_d904c8d057a68120_base
+
+-- | Return the sfSymbolsName for a given axis on a gamepad on Apple platforms.
+--
+--     [Returns]: the sfSymbolsName or NULL if the name can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGamepadAppleSFSymbolsNameForButton'
+--
+--     [C declaration]: @SDL_GetGamepadAppleSFSymbolsNameForAxis@, defined at @SDL3\/SDL_gamepad.h 1647:42@
+sDL_GetGamepadAppleSFSymbolsNameForAxis
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis on the gamepad.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGamepadAppleSFSymbolsNameForAxis =
+  hs_bindgen_d904c8d057a68120
diff --git a/src/SDL3/Sys/Bindgen/Gpu.hs b/src/SDL3/Sys/Bindgen/Gpu.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Gpu.hs
@@ -0,0 +1,17239 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | The GPU API offers a cross-platform way for apps to talk to modern graphics hardware. It offers both 3D graphics and compute support, in the style of Metal, Vulkan, and Direct3D 12.
+--
+--     A basic workflow might be something like this:
+--
+--     The app creates a GPU device with @SDL_CreateGPUDevice()@, and assigns it to a window with @SDL_ClaimWindowForGPUDevice()@ although strictly speaking you can render offscreen entirely, perhaps for image processing, and not use a window at all.
+--
+--     Next, the app prepares static data (things that are created once and used over and over). For example:
+--
+--     * Shaders (programs that run on the GPU): use @SDL_CreateGPUShader()@.
+--
+--     * Vertex buffers (arrays of geometry data) and other rendering data: use @SDL_CreateGPUBuffer()@ and @SDL_UploadToGPUBuffer()@.
+--
+--     * Textures (images): use @SDL_CreateGPUTexture()@ and @SDL_UploadToGPUTexture()@.
+--
+--     * Samplers (how textures should be read from): use @SDL_CreateGPUSampler()@.
+--
+--     * Render pipelines (precalculated rendering state): use @SDL_CreateGPUGraphicsPipeline()@
+--
+--     To render, the app creates one or more command buffers, with @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.
+--
+--     Rendering can happen to a texture (what other APIs call a \"render target\") or it can happen to the swapchain texture (which is just a special texture that represents a window\'s contents). The app can use @SDL_WaitAndAcquireGPUSwapchainTexture()@ to render to the window.
+--
+--     Rendering actually happens in a Render Pass, which is encoded into a 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.
+--
+--     The app calls @SDL_BeginGPURenderPass()@. Then it sets states it needs for each draw:
+--
+--     * @SDL_BindGPUGraphicsPipeline()@
+--
+--     * @SDL_SetGPUViewport()@
+--
+--     * @SDL_BindGPUVertexBuffers()@
+--
+--     * @SDL_BindGPUVertexSamplers()@
+--
+--     * etc
+--
+--     Then, make the actual draw commands with these states:
+--
+--     * @SDL_DrawGPUPrimitives()@
+--
+--     * @SDL_DrawGPUPrimitivesIndirect()@
+--
+--     * @SDL_DrawGPUIndexedPrimitivesIndirect()@
+--
+--     * etc
+--
+--     After all the drawing commands for a pass are complete, the app should call @SDL_EndGPURenderPass()@. Once a render pass ends all render-related state is reset.
+--
+--     The app can begin new Render Passes and make new draws in the same command buffer until the entire scene is rendered.
+--
+--     Once all of the render commands for the scene are complete, the app calls @SDL_SubmitGPUCommandBuffer()@ to send it to the GPU for processing.
+--
+--     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 some latency. When the app uses @SDL_DownloadFromGPUTexture()@ or @SDL_DownloadFromGPUBuffer()@, submitting the command buffer with @SDL_SubmitGPUCommandBufferAndAcquireFence()@ will return a fence handle that the app can poll or wait on in a thread. Once the fence indicates that the command buffer is done processing, it is safe to read the downloaded data. Make sure to call @SDL_ReleaseGPUFence()@ when done with the fence.
+--
+--     The API also has \"compute\" support. The app calls @SDL_BeginGPUComputePass()@ 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:
+--
+--     * @SDL_BindGPUComputePipeline()@
+--
+--     * @SDL_BindGPUComputeStorageBuffers()@
+--
+--     * @SDL_BindGPUComputeStorageTextures()@
+--
+--     Then, dispatch compute work:
+--
+--     * @SDL_DispatchGPUCompute()@
+--
+--     For advanced users, this opens up powerful GPU-driven workflows.
+--
+--     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. 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 [blog post](https://moonside.games/posts/layers-all-the-way-down/) explaining this situation.
+--
+--     It is optimal for apps to pre-compile the shader formats they might use, but for ease of use SDL provides a separate project, [SDL_shadercross](https://github.com/libsdl-org/SDL_shadercross), for performing runtime shader cross-compilation. It also has a CLI interface for offline precompilation as well.
+--
+--     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 2D graphics, the [Render API](https://wiki.libsdl.org/SDL3/CategoryRender) is much easier to use but still hardware-accelerated. That said, even for 2D 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.
+--
+--     Examples demonstrating proper usage of this API can be found [here](https://github.com/TheSpydog/SDL_gpu_examples)
+--
+--     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!
+--
+--     FAQ
+--
+--     __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.
+--
+--     __Question: Why is my shader not working?__
+--
+--     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 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.
+--
+--     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.
+--
+--     __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 make sure you are following them. Additionally, tools like [RenderDoc](https://renderdoc.org/) can be very helpful for diagnosing incorrect behavior and performance issues.
+--
+--     System Requirements
+--
+--     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:
+--
+--     * @VK_KHR_swapchain@
+--
+--     * @VK_KHR_maintenance1@
+--
+--     * @independentBlend@
+--
+--     * @imageCubeArray@
+--
+--     * @depthClamp@
+--
+--     * @shaderClipDistance@
+--
+--     * @drawIndirectFirstInstance@
+--
+--     * @sampleRateShading@
+--
+--     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()@:
+--
+--     * 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
+--
+--     D3D12
+--
+--     SDL driver name: \"direct3d12\"
+--
+--     Supported on Windows 10 or newer, Xbox One (GDK), and Xbox Series X|S (GDK). Requires a GPU that supports DirectX 12 Feature Level 11_0 and Resource Binding Tier 2 or above.
+--
+--     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()@:
+--
+--     * SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN
+--
+--     Metal
+--
+--     SDL driver name: \"metal\"
+--
+--     Supported on macOS 10.14+ and iOS\/tvOS 13.0+. Hardware requirements vary by operating system:
+--
+--     * 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
+--
+--     Coordinate System
+--
+--     The GPU API uses a left-handed coordinate system, following the convention of D3D12 and Metal. Specifically:
+--
+--     * __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.
+--
+--     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.
+--
+--     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.
+--
+--     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.
+--
+--     It is valid to push uniform data during a render or compute pass.
+--
+--     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.
+--
+--     A Note On Cycling
+--
+--     When using a command buffer, operations do not occur immediately - they occur some time after the command buffer is submitted.
+--
+--     When a resource is used in a pending or active command buffer, it is considered to be \"bound\". When a resource is no longer used in any pending or active command buffers, it is considered to be \"unbound\".
+--
+--     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.
+--
+--     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 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.
+--
+--     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 param to true, you don\'t have to worry about overwriting any data that is not yet uploaded.
+--
+--     Another example: If you are using a texture in a render pass every frame, 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.
+--
+--     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.
+--
+--     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.
+--
+--     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.
+--
+--     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. An opaque handle representing the SDL_GPU context.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Gpu (
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTexture,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUSampler,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUShader,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUComputePipeline,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUGraphicsPipeline,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUCommandBuffer,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPURenderPass,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUComputePass,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUCopyPass,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUFence,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUPrimitiveType (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_PRIMITIVETYPE_TRIANGLELIST,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_PRIMITIVETYPE_LINELIST,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_PRIMITIVETYPE_LINESTRIP,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_PRIMITIVETYPE_POINTLIST,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPULoadOp (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_LOADOP_LOAD,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_LOADOP_CLEAR,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_LOADOP_DONT_CARE,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUStoreOp (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STOREOP_STORE,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STOREOP_DONT_CARE,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STOREOP_RESOLVE,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STOREOP_RESOLVE_AND_STORE,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUIndexElementSize (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_INDEXELEMENTSIZE_16BIT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_INDEXELEMENTSIZE_32BIT,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureFormat (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_INVALID,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_A8_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8G8_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16G16_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8_SNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8G8_SNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16_SNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16G16_SNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R32_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8G8_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16G16_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R32_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R32G32_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8_INT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8G8_INT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16_INT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16G16_INT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R32_INT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R32G32_INT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_D16_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_D24_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_D32_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureUsageFlags (..),
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_TEXTUREUSAGE_SAMPLER,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_TEXTUREUSAGE_COLOR_TARGET,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureType (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTURETYPE_2D,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTURETYPE_2D_ARRAY,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTURETYPE_3D,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTURETYPE_CUBE,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TEXTURETYPE_CUBE_ARRAY,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUSampleCount (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SAMPLECOUNT_1,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SAMPLECOUNT_2,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SAMPLECOUNT_4,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SAMPLECOUNT_8,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUCubeMapFace (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_CUBEMAPFACE_POSITIVEX,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_CUBEMAPFACE_NEGATIVEX,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_CUBEMAPFACE_POSITIVEY,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_CUBEMAPFACE_NEGATIVEY,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_CUBEMAPFACE_POSITIVEZ,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_CUBEMAPFACE_NEGATIVEZ,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUBufferUsageFlags (..),
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_BUFFERUSAGE_VERTEX,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_BUFFERUSAGE_INDEX,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_BUFFERUSAGE_INDIRECT,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTransferBufferUsage (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUShaderStage (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SHADERSTAGE_VERTEX,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SHADERSTAGE_FRAGMENT,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUShaderFormat (..),
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_SHADERFORMAT_INVALID,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_SHADERFORMAT_PRIVATE,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_SHADERFORMAT_SPIRV,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_SHADERFORMAT_DXBC,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_SHADERFORMAT_DXIL,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_SHADERFORMAT_MSL,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_SHADERFORMAT_METALLIB,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUVertexElementFormat (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_INVALID,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_INT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_INT2,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_INT3,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_INT4,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_UINT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_UINT2,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_UINT3,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_UINT4,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_FLOAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_BYTE2,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_BYTE4,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_BYTE2_NORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_BYTE4_NORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2_NORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_SHORT2,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_SHORT4,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_USHORT2,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_USHORT4,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_SHORT2_NORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_SHORT4_NORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_USHORT2_NORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_USHORT4_NORM,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_HALF2,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXELEMENTFORMAT_HALF4,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUVertexInputRate (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXINPUTRATE_VERTEX,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_VERTEXINPUTRATE_INSTANCE,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUFillMode (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_FILLMODE_FILL,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_FILLMODE_LINE,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUCullMode (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_CULLMODE_NONE,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_CULLMODE_FRONT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_CULLMODE_BACK,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUFrontFace (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_FRONTFACE_CLOCKWISE,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUCompareOp (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_COMPAREOP_INVALID,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_COMPAREOP_NEVER,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_COMPAREOP_LESS,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_COMPAREOP_EQUAL,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_COMPAREOP_LESS_OR_EQUAL,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_COMPAREOP_GREATER,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_COMPAREOP_NOT_EQUAL,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_COMPAREOP_GREATER_OR_EQUAL,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_COMPAREOP_ALWAYS,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUStencilOp (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STENCILOP_INVALID,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STENCILOP_KEEP,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STENCILOP_ZERO,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STENCILOP_REPLACE,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STENCILOP_INVERT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STENCILOP_INCREMENT_AND_WRAP,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_STENCILOP_DECREMENT_AND_WRAP,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUBlendOp (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDOP_INVALID,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDOP_ADD,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDOP_SUBTRACT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDOP_REVERSE_SUBTRACT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDOP_MIN,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDOP_MAX,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUBlendFactor (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_INVALID,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_ZERO,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_ONE,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_SRC_COLOR,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_DST_COLOR,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_SRC_ALPHA,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_DST_ALPHA,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_CONSTANT_COLOR,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUColorComponentFlags (..),
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_COLORCOMPONENT_R,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_COLORCOMPONENT_G,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_COLORCOMPONENT_B,
+  SDL3.Sys.Bindgen.Gpu.sDL_GPU_COLORCOMPONENT_A,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUFilter (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_FILTER_NEAREST,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_FILTER_LINEAR,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUSamplerMipmapMode (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SAMPLERMIPMAPMODE_NEAREST,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SAMPLERMIPMAPMODE_LINEAR,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUSamplerAddressMode (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SAMPLERADDRESSMODE_REPEAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUPresentMode (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_PRESENTMODE_VSYNC,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_PRESENTMODE_IMMEDIATE,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_PRESENTMODE_MAILBOX,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUSwapchainComposition (..),
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SWAPCHAINCOMPOSITION_SDR,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR,
+  pattern SDL3.Sys.Bindgen.Gpu.SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUViewport (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureTransferInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTransferBufferLocation (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureLocation (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureRegion (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUBlitRegion (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUBufferLocation (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUBufferRegion (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUIndirectDrawCommand (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUIndexedIndirectDrawCommand (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUIndirectDispatchCommand (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUSamplerCreateInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUVertexBufferDescription (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUVertexAttribute (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUVertexInputState (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUStencilOpState (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUColorTargetBlendState (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUShaderCreateInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureCreateInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUBufferCreateInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTransferBufferCreateInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPURasterizerState (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUMultisampleState (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUDepthStencilState (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUColorTargetDescription (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUGraphicsPipelineTargetInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUGraphicsPipelineCreateInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUComputePipelineCreateInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUColorTargetInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUDepthStencilTargetInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUBlitInfo (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUBufferBinding (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureSamplerBinding (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUStorageBufferReadWriteBinding (..),
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUStorageTextureReadWriteBinding (..),
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_NAME_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN,
+  SDL3.Sys.Bindgen.Gpu.SDL_GPUVulkanOptions (..),
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_NAME_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_SHADER_CREATE_NAME_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_BUFFER_CREATE_NAME_STRING,
+  SDL3.Sys.Bindgen.Gpu.sDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING,
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+
+-- | [C declaration]: @struct SDL_GPUDevice@, defined at @SDL3\/SDL_gpu.h 411:16@
+data SDL_GPUDevice
+
+-- | An opaque handle representing a buffer.
+--
+--     Used for vertices, indices, indirect draw commands, and general compute data.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUBuffer', 'sDL_UploadToGPUBuffer', 'sDL_DownloadFromGPUBuffer', 'sDL_CopyGPUBufferToBuffer', 'sDL_BindGPUVertexBuffers', 'sDL_BindGPUIndexBuffer', 'sDL_BindGPUVertexStorageBuffers', 'sDL_BindGPUFragmentStorageBuffers', 'sDL_DrawGPUPrimitivesIndirect', 'sDL_DrawGPUIndexedPrimitivesIndirect', 'sDL_BindGPUComputeStorageBuffers', 'sDL_DispatchGPUComputeIndirect', 'sDL_ReleaseGPUBuffer'
+--
+--     [C declaration]: @struct SDL_GPUBuffer@, defined at @SDL3\/SDL_gpu.h 435:16@
+data SDL_GPUBuffer
+
+-- | An opaque handle representing a transfer buffer.
+--
+--     Used for transferring data to and from the device.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTransferBuffer', 'sDL_MapGPUTransferBuffer', 'sDL_UnmapGPUTransferBuffer', 'sDL_UploadToGPUBuffer', 'sDL_UploadToGPUTexture', 'sDL_DownloadFromGPUBuffer', 'sDL_DownloadFromGPUTexture', 'sDL_ReleaseGPUTransferBuffer'
+--
+--     [C declaration]: @struct SDL_GPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 453:16@
+data SDL_GPUTransferBuffer
+
+-- | An opaque handle representing a texture.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTexture', 'sDL_UploadToGPUTexture', 'sDL_DownloadFromGPUTexture', 'sDL_CopyGPUTextureToTexture', 'sDL_BindGPUVertexSamplers', 'sDL_BindGPUVertexStorageTextures', 'sDL_BindGPUFragmentSamplers', 'sDL_BindGPUFragmentStorageTextures', 'sDL_BindGPUComputeStorageTextures', 'sDL_GenerateMipmapsForGPUTexture', 'sDL_BlitGPUTexture', 'sDL_ReleaseGPUTexture'
+--
+--     [C declaration]: @struct SDL_GPUTexture@, defined at @SDL3\/SDL_gpu.h 473:16@
+data SDL_GPUTexture
+
+-- | An opaque handle representing a sampler.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUSampler', 'sDL_BindGPUVertexSamplers', 'sDL_BindGPUFragmentSamplers', 'sDL_ReleaseGPUSampler'
+--
+--     [C declaration]: @struct SDL_GPUSampler@, defined at @SDL3\/SDL_gpu.h 485:16@
+data SDL_GPUSampler
+
+-- | An opaque handle representing a compiled shader object.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader', 'sDL_CreateGPUGraphicsPipeline', 'sDL_ReleaseGPUShader'
+--
+--     [C declaration]: @struct SDL_GPUShader@, defined at @SDL3\/SDL_gpu.h 496:16@
+data SDL_GPUShader
+
+-- | An opaque handle representing a compute pipeline.
+--
+--     Used during compute passes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline', 'sDL_BindGPUComputePipeline', 'sDL_ReleaseGPUComputePipeline'
+--
+--     [C declaration]: @struct SDL_GPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 509:16@
+data SDL_GPUComputePipeline
+
+-- | An opaque handle representing a graphics pipeline.
+--
+--     Used during render passes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline', 'sDL_BindGPUGraphicsPipeline', 'sDL_ReleaseGPUGraphicsPipeline'
+--
+--     [C declaration]: @struct SDL_GPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 522:16@
+data SDL_GPUGraphicsPipeline
+
+-- | An opaque handle representing a command buffer.
+--
+--     Most state is managed via command buffers. When setting state using a command buffer, that state is local to the command buffer.
+--
+--     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.
+--
+--     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.
+--
+--     In multi-threading scenarios, you should only access a command buffer on the thread you acquired it from.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireGPUCommandBuffer', 'sDL_SubmitGPUCommandBuffer', 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @struct SDL_GPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 547:16@
+data SDL_GPUCommandBuffer
+
+-- | An opaque handle representing a render pass.
+--
+--     This handle is transient and should not be held or referenced after SDL_EndGPURenderPass is called.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BeginGPURenderPass', 'sDL_EndGPURenderPass'
+--
+--     [C declaration]: @struct SDL_GPURenderPass@, defined at @SDL3\/SDL_gpu.h 560:16@
+data SDL_GPURenderPass
+
+-- | An opaque handle representing a compute pass.
+--
+--     This handle is transient and should not be held or referenced after SDL_EndGPUComputePass is called.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BeginGPUComputePass', 'sDL_EndGPUComputePass'
+--
+--     [C declaration]: @struct SDL_GPUComputePass@, defined at @SDL3\/SDL_gpu.h 573:16@
+data SDL_GPUComputePass
+
+-- | An opaque handle representing a copy pass.
+--
+--     This handle is transient and should not be held or referenced after SDL_EndGPUCopyPass is called.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BeginGPUCopyPass', 'sDL_EndGPUCopyPass'
+--
+--     [C declaration]: @struct SDL_GPUCopyPass@, defined at @SDL3\/SDL_gpu.h 586:16@
+data SDL_GPUCopyPass
+
+-- | An opaque handle representing a fence.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBufferAndAcquireFence', 'sDL_QueryGPUFence', 'sDL_WaitForGPUFences', 'sDL_ReleaseGPUFence'
+--
+--     [C declaration]: @struct SDL_GPUFence@, defined at @SDL3\/SDL_gpu.h 598:16@
+data SDL_GPUFence
+
+-- | Specifies the primitive topology of a graphics pipeline.
+--
+--     If you are using POINTLIST you must include a point size output in the 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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUPrimitiveType@, defined at @SDL3\/SDL_gpu.h 621:14@
+newtype SDL_GPUPrimitiveType = SDL_GPUPrimitiveType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUPrimitiveType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUPrimitiveType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUPrimitiveType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUPrimitiveType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUPrimitiveType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUPrimitiveType instance BG.Storable SDL_GPUPrimitiveType
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUPrimitiveType
+
+instance CEnum.CEnum SDL_GPUPrimitiveType where
+  type CEnumZ SDL_GPUPrimitiveType = BG.CUInt
+
+  toCEnum = SDL_GPUPrimitiveType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_PRIMITIVETYPE_TRIANGLELIST")
+        , (1, BG.singleton "SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP")
+        , (2, BG.singleton "SDL_GPU_PRIMITIVETYPE_LINELIST")
+        , (3, BG.singleton "SDL_GPU_PRIMITIVETYPE_LINESTRIP")
+        , (4, BG.singleton "SDL_GPU_PRIMITIVETYPE_POINTLIST")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUPrimitiveType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUPrimitiveType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUPrimitiveType where
+  minDeclaredValue = SDL_GPU_PRIMITIVETYPE_TRIANGLELIST
+
+  maxDeclaredValue = SDL_GPU_PRIMITIVETYPE_POINTLIST
+
+instance Show SDL_GPUPrimitiveType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUPrimitiveType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUPrimitiveType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUPrimitiveType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUPrimitiveType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUPrimitiveType "unwrap" where
+  type
+    CFieldType SDL_GPUPrimitiveType "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | A series of separate triangles.
+--
+--     [C declaration]: @SDL_GPU_PRIMITIVETYPE_TRIANGLELIST@, defined at @SDL3\/SDL_gpu.h 623:5@
+pattern SDL_GPU_PRIMITIVETYPE_TRIANGLELIST :: SDL_GPUPrimitiveType
+pattern SDL_GPU_PRIMITIVETYPE_TRIANGLELIST = SDL_GPUPrimitiveType 0
+
+-- | A series of connected triangles.
+--
+--     [C declaration]: @SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP@, defined at @SDL3\/SDL_gpu.h 624:5@
+pattern SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP :: SDL_GPUPrimitiveType
+pattern SDL_GPU_PRIMITIVETYPE_TRIANGLESTRIP = SDL_GPUPrimitiveType 1
+
+-- | A series of separate lines.
+--
+--     [C declaration]: @SDL_GPU_PRIMITIVETYPE_LINELIST@, defined at @SDL3\/SDL_gpu.h 625:5@
+pattern SDL_GPU_PRIMITIVETYPE_LINELIST :: SDL_GPUPrimitiveType
+pattern SDL_GPU_PRIMITIVETYPE_LINELIST = SDL_GPUPrimitiveType 2
+
+-- | A series of connected lines.
+--
+--     [C declaration]: @SDL_GPU_PRIMITIVETYPE_LINESTRIP@, defined at @SDL3\/SDL_gpu.h 626:5@
+pattern SDL_GPU_PRIMITIVETYPE_LINESTRIP :: SDL_GPUPrimitiveType
+pattern SDL_GPU_PRIMITIVETYPE_LINESTRIP = SDL_GPUPrimitiveType 3
+
+-- | A series of separate points.
+--
+--     [C declaration]: @SDL_GPU_PRIMITIVETYPE_POINTLIST@, defined at @SDL3\/SDL_gpu.h 627:5@
+pattern SDL_GPU_PRIMITIVETYPE_POINTLIST :: SDL_GPUPrimitiveType
+pattern SDL_GPU_PRIMITIVETYPE_POINTLIST = SDL_GPUPrimitiveType 4
+
+-- | Specifies how the contents of a texture attached to a render pass are treated at the beginning of the render pass.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BeginGPURenderPass'
+--
+--     [C declaration]: @enum SDL_GPULoadOp@, defined at @SDL3\/SDL_gpu.h 638:14@
+newtype SDL_GPULoadOp = SDL_GPULoadOp
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPULoadOp where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPULoadOp where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPULoadOp
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPULoadOp where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPULoadOp unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPULoadOp instance BG.Storable SDL_GPULoadOp
+
+deriving via BG.CUInt instance BG.Prim SDL_GPULoadOp
+
+instance CEnum.CEnum SDL_GPULoadOp where
+  type CEnumZ SDL_GPULoadOp = BG.CUInt
+
+  toCEnum = SDL_GPULoadOp
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_LOADOP_LOAD")
+        , (1, BG.singleton "SDL_GPU_LOADOP_CLEAR")
+        , (2, BG.singleton "SDL_GPU_LOADOP_DONT_CARE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPULoadOp"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPULoadOp"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPULoadOp where
+  minDeclaredValue = SDL_GPU_LOADOP_LOAD
+
+  maxDeclaredValue = SDL_GPU_LOADOP_DONT_CARE
+
+instance Show SDL_GPULoadOp where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPULoadOp where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPULoadOp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPULoadOp{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPULoadOp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPULoadOp "unwrap" where
+  type CFieldType SDL_GPULoadOp "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The previous contents of the texture will be preserved.
+--
+--     [C declaration]: @SDL_GPU_LOADOP_LOAD@, defined at @SDL3\/SDL_gpu.h 640:5@
+pattern SDL_GPU_LOADOP_LOAD :: SDL_GPULoadOp
+pattern SDL_GPU_LOADOP_LOAD = SDL_GPULoadOp 0
+
+-- | The contents of the texture will be cleared to a color.
+--
+--     [C declaration]: @SDL_GPU_LOADOP_CLEAR@, defined at @SDL3\/SDL_gpu.h 641:5@
+pattern SDL_GPU_LOADOP_CLEAR :: SDL_GPULoadOp
+pattern SDL_GPU_LOADOP_CLEAR = SDL_GPULoadOp 1
+
+-- | The previous contents of the texture need not be preserved. The contents will be undefined.
+--
+--     [C declaration]: @SDL_GPU_LOADOP_DONT_CARE@, defined at @SDL3\/SDL_gpu.h 642:5@
+pattern SDL_GPU_LOADOP_DONT_CARE :: SDL_GPULoadOp
+pattern SDL_GPU_LOADOP_DONT_CARE = SDL_GPULoadOp 2
+
+-- | Specifies how the contents of a texture attached to a render pass are treated at the end of the render pass.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BeginGPURenderPass'
+--
+--     [C declaration]: @enum SDL_GPUStoreOp@, defined at @SDL3\/SDL_gpu.h 653:14@
+newtype SDL_GPUStoreOp = SDL_GPUStoreOp
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUStoreOp where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUStoreOp where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUStoreOp
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUStoreOp where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUStoreOp unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUStoreOp instance BG.Storable SDL_GPUStoreOp
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUStoreOp
+
+instance CEnum.CEnum SDL_GPUStoreOp where
+  type CEnumZ SDL_GPUStoreOp = BG.CUInt
+
+  toCEnum = SDL_GPUStoreOp
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_STOREOP_STORE")
+        , (1, BG.singleton "SDL_GPU_STOREOP_DONT_CARE")
+        , (2, BG.singleton "SDL_GPU_STOREOP_RESOLVE")
+        , (3, BG.singleton "SDL_GPU_STOREOP_RESOLVE_AND_STORE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUStoreOp"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUStoreOp"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUStoreOp where
+  minDeclaredValue = SDL_GPU_STOREOP_STORE
+
+  maxDeclaredValue = SDL_GPU_STOREOP_RESOLVE_AND_STORE
+
+instance Show SDL_GPUStoreOp where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUStoreOp where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUStoreOp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStoreOp{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUStoreOp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUStoreOp "unwrap" where
+  type CFieldType SDL_GPUStoreOp "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The contents generated during the render pass will be written to memory.
+--
+--     [C declaration]: @SDL_GPU_STOREOP_STORE@, defined at @SDL3\/SDL_gpu.h 655:5@
+pattern SDL_GPU_STOREOP_STORE :: SDL_GPUStoreOp
+pattern SDL_GPU_STOREOP_STORE = SDL_GPUStoreOp 0
+
+-- | The contents generated during the render pass are not needed and may be discarded. The contents will be undefined.
+--
+--     [C declaration]: @SDL_GPU_STOREOP_DONT_CARE@, defined at @SDL3\/SDL_gpu.h 656:5@
+pattern SDL_GPU_STOREOP_DONT_CARE :: SDL_GPUStoreOp
+pattern SDL_GPU_STOREOP_DONT_CARE = SDL_GPUStoreOp 1
+
+-- | 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.
+--
+--     [C declaration]: @SDL_GPU_STOREOP_RESOLVE@, defined at @SDL3\/SDL_gpu.h 657:5@
+pattern SDL_GPU_STOREOP_RESOLVE :: SDL_GPUStoreOp
+pattern SDL_GPU_STOREOP_RESOLVE = SDL_GPUStoreOp 2
+
+-- | 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.
+--
+--     [C declaration]: @SDL_GPU_STOREOP_RESOLVE_AND_STORE@, defined at @SDL3\/SDL_gpu.h 658:5@
+pattern SDL_GPU_STOREOP_RESOLVE_AND_STORE :: SDL_GPUStoreOp
+pattern SDL_GPU_STOREOP_RESOLVE_AND_STORE = SDL_GPUStoreOp 3
+
+-- | Specifies the size of elements in an index buffer.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUIndexElementSize@, defined at @SDL3\/SDL_gpu.h 668:14@
+newtype SDL_GPUIndexElementSize = SDL_GPUIndexElementSize
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUIndexElementSize where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUIndexElementSize where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUIndexElementSize
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUIndexElementSize where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUIndexElementSize unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_GPUIndexElementSize
+  instance
+    BG.Storable SDL_GPUIndexElementSize
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUIndexElementSize
+
+instance CEnum.CEnum SDL_GPUIndexElementSize where
+  type CEnumZ SDL_GPUIndexElementSize = BG.CUInt
+
+  toCEnum = SDL_GPUIndexElementSize
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_INDEXELEMENTSIZE_16BIT")
+        , (1, BG.singleton "SDL_GPU_INDEXELEMENTSIZE_32BIT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUIndexElementSize"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUIndexElementSize"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUIndexElementSize where
+  minDeclaredValue = SDL_GPU_INDEXELEMENTSIZE_16BIT
+
+  maxDeclaredValue = SDL_GPU_INDEXELEMENTSIZE_32BIT
+
+instance Show SDL_GPUIndexElementSize where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUIndexElementSize where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUIndexElementSize ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndexElementSize{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUIndexElementSize) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUIndexElementSize "unwrap" where
+  type
+    CFieldType SDL_GPUIndexElementSize "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The index elements are 16-bit.
+--
+--     [C declaration]: @SDL_GPU_INDEXELEMENTSIZE_16BIT@, defined at @SDL3\/SDL_gpu.h 670:5@
+pattern SDL_GPU_INDEXELEMENTSIZE_16BIT :: SDL_GPUIndexElementSize
+pattern SDL_GPU_INDEXELEMENTSIZE_16BIT = SDL_GPUIndexElementSize 0
+
+-- | The index elements are 32-bit.
+--
+--     [C declaration]: @SDL_GPU_INDEXELEMENTSIZE_32BIT@, defined at @SDL3\/SDL_gpu.h 671:5@
+pattern SDL_GPU_INDEXELEMENTSIZE_32BIT :: SDL_GPUIndexElementSize
+pattern SDL_GPU_INDEXELEMENTSIZE_32BIT = SDL_GPUIndexElementSize 1
+
+-- | Specifies the pixel format of a texture.
+--
+--     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.
+--
+--     FIXME: Check universal support for 32-bit component formats FIXME: Check universal support for SIMULTANEOUS_READ_WRITE
+--
+--     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
+--
+--     For DEPTH_STENCIL_TARGET usage, the following formats are universally supported:
+--
+--     * D16_UNORM
+--
+--     * Either (but not necessarily both!) D24_UNORM or D32_FLOAT
+--
+--     * Either (but not necessarily both!) D24_UNORM_S8_UINT or D32_FLOAT_S8_UINT
+--
+--     Unless D16_UNORM is sufficient for your purposes, always check which of D24\/D32 is supported before creating a depth-stencil texture!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTexture', 'sDL_GPUTextureSupportsFormat'
+--
+--     [C declaration]: @enum SDL_GPUTextureFormat@, defined at @SDL3\/SDL_gpu.h 759:14@
+newtype SDL_GPUTextureFormat = SDL_GPUTextureFormat
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUTextureFormat where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUTextureFormat where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUTextureFormat
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUTextureFormat where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUTextureFormat unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUTextureFormat instance BG.Storable SDL_GPUTextureFormat
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUTextureFormat
+
+instance CEnum.CEnum SDL_GPUTextureFormat where
+  type CEnumZ SDL_GPUTextureFormat = BG.CUInt
+
+  toCEnum = SDL_GPUTextureFormat
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_TEXTUREFORMAT_INVALID")
+        , (1, BG.singleton "SDL_GPU_TEXTUREFORMAT_A8_UNORM")
+        , (2, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8_UNORM")
+        , (3, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8G8_UNORM")
+        , (4, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM")
+        , (5, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16_UNORM")
+        , (6, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16G16_UNORM")
+        , (7, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM")
+        , (8, BG.singleton "SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM")
+        , (9, BG.singleton "SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM")
+        , (10, BG.singleton "SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM")
+        , (11, BG.singleton "SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM")
+        , (12, BG.singleton "SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM")
+        , (13, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM")
+        , (14, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM")
+        , (15, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM")
+        , (16, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM")
+        , (17, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM")
+        , (18, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM")
+        , (19, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT")
+        , (20, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT")
+        , (21, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8_SNORM")
+        , (22, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8G8_SNORM")
+        , (23, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM")
+        , (24, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16_SNORM")
+        , (25, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16G16_SNORM")
+        , (26, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM")
+        , (27, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16_FLOAT")
+        , (28, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT")
+        , (29, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT")
+        , (30, BG.singleton "SDL_GPU_TEXTUREFORMAT_R32_FLOAT")
+        , (31, BG.singleton "SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT")
+        , (32, BG.singleton "SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT")
+        , (33, BG.singleton "SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT")
+        , (34, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8_UINT")
+        , (35, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8G8_UINT")
+        , (36, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT")
+        , (37, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16_UINT")
+        , (38, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16G16_UINT")
+        , (39, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT")
+        , (40, BG.singleton "SDL_GPU_TEXTUREFORMAT_R32_UINT")
+        , (41, BG.singleton "SDL_GPU_TEXTUREFORMAT_R32G32_UINT")
+        , (42, BG.singleton "SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT")
+        , (43, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8_INT")
+        , (44, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8G8_INT")
+        , (45, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT")
+        , (46, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16_INT")
+        , (47, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16G16_INT")
+        , (48, BG.singleton "SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT")
+        , (49, BG.singleton "SDL_GPU_TEXTUREFORMAT_R32_INT")
+        , (50, BG.singleton "SDL_GPU_TEXTUREFORMAT_R32G32_INT")
+        , (51, BG.singleton "SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT")
+        , (52, BG.singleton "SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB")
+        , (53, BG.singleton "SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB")
+        , (54, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB")
+        , (55, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB")
+        , (56, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB")
+        , (57, BG.singleton "SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB")
+        , (58, BG.singleton "SDL_GPU_TEXTUREFORMAT_D16_UNORM")
+        , (59, BG.singleton "SDL_GPU_TEXTUREFORMAT_D24_UNORM")
+        , (60, BG.singleton "SDL_GPU_TEXTUREFORMAT_D32_FLOAT")
+        , (61, BG.singleton "SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT")
+        , (62, BG.singleton "SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT")
+        , (63, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM")
+        , (64, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM")
+        , (65, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM")
+        , (66, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM")
+        , (67, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM")
+        , (68, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM")
+        , (69, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM")
+        , (70, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM")
+        , (71, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM")
+        , (72, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM")
+        , (73, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM")
+        , (74, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM")
+        , (75, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM")
+        , (76, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM")
+        , (77, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB")
+        , (78, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB")
+        , (79, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB")
+        , (80, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB")
+        , (81, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB")
+        , (82, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB")
+        , (83, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB")
+        , (84, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB")
+        , (85, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB")
+        , (86, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB")
+        , (87, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB")
+        , (88, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB")
+        , (89, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB")
+        , (90, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB")
+        , (91, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT")
+        , (92, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT")
+        , (93, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT")
+        , (94, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT")
+        , (95, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT")
+        , (96, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT")
+        , (97, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT")
+        , (98, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT")
+        , (99, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT")
+        , (100, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT")
+        , (101, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT")
+        , (102, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT")
+        , (103, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT")
+        , (104, BG.singleton "SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUTextureFormat"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUTextureFormat"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUTextureFormat where
+  minDeclaredValue = SDL_GPU_TEXTUREFORMAT_INVALID
+
+  maxDeclaredValue =
+    SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT
+
+instance Show SDL_GPUTextureFormat where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUTextureFormat where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUTextureFormat ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureFormat{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUTextureFormat) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUTextureFormat "unwrap" where
+  type
+    CFieldType SDL_GPUTextureFormat "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_INVALID@, defined at @SDL3\/SDL_gpu.h 761:5@
+pattern SDL_GPU_TEXTUREFORMAT_INVALID :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_INVALID = SDL_GPUTextureFormat 0
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_A8_UNORM@, defined at @SDL3\/SDL_gpu.h 764:5@
+pattern SDL_GPU_TEXTUREFORMAT_A8_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_A8_UNORM = SDL_GPUTextureFormat 1
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8_UNORM@, defined at @SDL3\/SDL_gpu.h 765:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8_UNORM = SDL_GPUTextureFormat 2
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8G8_UNORM@, defined at @SDL3\/SDL_gpu.h 766:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8G8_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8G8_UNORM = SDL_GPUTextureFormat 3
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM@, defined at @SDL3\/SDL_gpu.h 767:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM = SDL_GPUTextureFormat 4
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16_UNORM@, defined at @SDL3\/SDL_gpu.h 768:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16_UNORM = SDL_GPUTextureFormat 5
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16G16_UNORM@, defined at @SDL3\/SDL_gpu.h 769:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16G16_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16G16_UNORM = SDL_GPUTextureFormat 6
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM@, defined at @SDL3\/SDL_gpu.h 770:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UNORM = SDL_GPUTextureFormat 7
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM@, defined at @SDL3\/SDL_gpu.h 771:5@
+pattern SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R10G10B10A2_UNORM = SDL_GPUTextureFormat 8
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM@, defined at @SDL3\/SDL_gpu.h 772:5@
+pattern SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_B5G6R5_UNORM = SDL_GPUTextureFormat 9
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM@, defined at @SDL3\/SDL_gpu.h 773:5@
+pattern SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_B5G5R5A1_UNORM = SDL_GPUTextureFormat 10
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM@, defined at @SDL3\/SDL_gpu.h 774:5@
+pattern SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_B4G4R4A4_UNORM = SDL_GPUTextureFormat 11
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM@, defined at @SDL3\/SDL_gpu.h 775:5@
+pattern SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM = SDL_GPUTextureFormat 12
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM@, defined at @SDL3\/SDL_gpu.h 777:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM = SDL_GPUTextureFormat 13
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM@, defined at @SDL3\/SDL_gpu.h 778:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM = SDL_GPUTextureFormat 14
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM@, defined at @SDL3\/SDL_gpu.h 779:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM = SDL_GPUTextureFormat 15
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM@, defined at @SDL3\/SDL_gpu.h 780:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC4_R_UNORM = SDL_GPUTextureFormat 16
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM@, defined at @SDL3\/SDL_gpu.h 781:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC5_RG_UNORM = SDL_GPUTextureFormat 17
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM@, defined at @SDL3\/SDL_gpu.h 782:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM = SDL_GPUTextureFormat 18
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT@, defined at @SDL3\/SDL_gpu.h 784:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC6H_RGB_FLOAT = SDL_GPUTextureFormat 19
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT@, defined at @SDL3\/SDL_gpu.h 786:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC6H_RGB_UFLOAT = SDL_GPUTextureFormat 20
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8_SNORM@, defined at @SDL3\/SDL_gpu.h 788:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8_SNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8_SNORM = SDL_GPUTextureFormat 21
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8G8_SNORM@, defined at @SDL3\/SDL_gpu.h 789:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8G8_SNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8G8_SNORM = SDL_GPUTextureFormat 22
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM@, defined at @SDL3\/SDL_gpu.h 790:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8G8B8A8_SNORM = SDL_GPUTextureFormat 23
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16_SNORM@, defined at @SDL3\/SDL_gpu.h 791:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16_SNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16_SNORM = SDL_GPUTextureFormat 24
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16G16_SNORM@, defined at @SDL3\/SDL_gpu.h 792:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16G16_SNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16G16_SNORM = SDL_GPUTextureFormat 25
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM@, defined at @SDL3\/SDL_gpu.h 793:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16G16B16A16_SNORM = SDL_GPUTextureFormat 26
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16_FLOAT@, defined at @SDL3\/SDL_gpu.h 795:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16_FLOAT = SDL_GPUTextureFormat 27
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT@, defined at @SDL3\/SDL_gpu.h 796:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16G16_FLOAT = SDL_GPUTextureFormat 28
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT@, defined at @SDL3\/SDL_gpu.h 797:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16G16B16A16_FLOAT = SDL_GPUTextureFormat 29
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R32_FLOAT@, defined at @SDL3\/SDL_gpu.h 798:5@
+pattern SDL_GPU_TEXTUREFORMAT_R32_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R32_FLOAT = SDL_GPUTextureFormat 30
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT@, defined at @SDL3\/SDL_gpu.h 799:5@
+pattern SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R32G32_FLOAT = SDL_GPUTextureFormat 31
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT@, defined at @SDL3\/SDL_gpu.h 800:5@
+pattern SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R32G32B32A32_FLOAT = SDL_GPUTextureFormat 32
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT@, defined at @SDL3\/SDL_gpu.h 802:5@
+pattern SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R11G11B10_UFLOAT = SDL_GPUTextureFormat 33
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8_UINT@, defined at @SDL3\/SDL_gpu.h 804:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8_UINT = SDL_GPUTextureFormat 34
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8G8_UINT@, defined at @SDL3\/SDL_gpu.h 805:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8G8_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8G8_UINT = SDL_GPUTextureFormat 35
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT@, defined at @SDL3\/SDL_gpu.h 806:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UINT = SDL_GPUTextureFormat 36
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16_UINT@, defined at @SDL3\/SDL_gpu.h 807:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16_UINT = SDL_GPUTextureFormat 37
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16G16_UINT@, defined at @SDL3\/SDL_gpu.h 808:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16G16_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16G16_UINT = SDL_GPUTextureFormat 38
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT@, defined at @SDL3\/SDL_gpu.h 809:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16G16B16A16_UINT = SDL_GPUTextureFormat 39
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R32_UINT@, defined at @SDL3\/SDL_gpu.h 810:5@
+pattern SDL_GPU_TEXTUREFORMAT_R32_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R32_UINT = SDL_GPUTextureFormat 40
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R32G32_UINT@, defined at @SDL3\/SDL_gpu.h 811:5@
+pattern SDL_GPU_TEXTUREFORMAT_R32G32_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R32G32_UINT = SDL_GPUTextureFormat 41
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT@, defined at @SDL3\/SDL_gpu.h 812:5@
+pattern SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R32G32B32A32_UINT = SDL_GPUTextureFormat 42
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8_INT@, defined at @SDL3\/SDL_gpu.h 814:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8_INT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8_INT = SDL_GPUTextureFormat 43
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8G8_INT@, defined at @SDL3\/SDL_gpu.h 815:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8G8_INT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8G8_INT = SDL_GPUTextureFormat 44
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT@, defined at @SDL3\/SDL_gpu.h 816:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8G8B8A8_INT = SDL_GPUTextureFormat 45
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16_INT@, defined at @SDL3\/SDL_gpu.h 817:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16_INT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16_INT = SDL_GPUTextureFormat 46
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16G16_INT@, defined at @SDL3\/SDL_gpu.h 818:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16G16_INT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16G16_INT = SDL_GPUTextureFormat 47
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT@, defined at @SDL3\/SDL_gpu.h 819:5@
+pattern SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R16G16B16A16_INT = SDL_GPUTextureFormat 48
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R32_INT@, defined at @SDL3\/SDL_gpu.h 820:5@
+pattern SDL_GPU_TEXTUREFORMAT_R32_INT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R32_INT = SDL_GPUTextureFormat 49
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R32G32_INT@, defined at @SDL3\/SDL_gpu.h 821:5@
+pattern SDL_GPU_TEXTUREFORMAT_R32G32_INT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R32G32_INT = SDL_GPUTextureFormat 50
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT@, defined at @SDL3\/SDL_gpu.h 822:5@
+pattern SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R32G32B32A32_INT = SDL_GPUTextureFormat 51
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 824:5@
+pattern SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_R8G8B8A8_UNORM_SRGB = SDL_GPUTextureFormat 52
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 825:5@
+pattern SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_B8G8R8A8_UNORM_SRGB = SDL_GPUTextureFormat 53
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 827:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC1_RGBA_UNORM_SRGB = SDL_GPUTextureFormat 54
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 828:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC2_RGBA_UNORM_SRGB = SDL_GPUTextureFormat 55
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 829:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC3_RGBA_UNORM_SRGB = SDL_GPUTextureFormat 56
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 830:5@
+pattern SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_BC7_RGBA_UNORM_SRGB = SDL_GPUTextureFormat 57
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_D16_UNORM@, defined at @SDL3\/SDL_gpu.h 832:5@
+pattern SDL_GPU_TEXTUREFORMAT_D16_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_D16_UNORM = SDL_GPUTextureFormat 58
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_D24_UNORM@, defined at @SDL3\/SDL_gpu.h 833:5@
+pattern SDL_GPU_TEXTUREFORMAT_D24_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_D24_UNORM = SDL_GPUTextureFormat 59
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_D32_FLOAT@, defined at @SDL3\/SDL_gpu.h 834:5@
+pattern SDL_GPU_TEXTUREFORMAT_D32_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_D32_FLOAT = SDL_GPUTextureFormat 60
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT@, defined at @SDL3\/SDL_gpu.h 835:5@
+pattern SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_D24_UNORM_S8_UINT = SDL_GPUTextureFormat 61
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT@, defined at @SDL3\/SDL_gpu.h 836:5@
+pattern SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_D32_FLOAT_S8_UINT = SDL_GPUTextureFormat 62
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM@, defined at @SDL3\/SDL_gpu.h 838:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM = SDL_GPUTextureFormat 63
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM@, defined at @SDL3\/SDL_gpu.h 839:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM = SDL_GPUTextureFormat 64
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM@, defined at @SDL3\/SDL_gpu.h 840:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM = SDL_GPUTextureFormat 65
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM@, defined at @SDL3\/SDL_gpu.h 841:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM = SDL_GPUTextureFormat 66
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM@, defined at @SDL3\/SDL_gpu.h 842:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM = SDL_GPUTextureFormat 67
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM@, defined at @SDL3\/SDL_gpu.h 843:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM = SDL_GPUTextureFormat 68
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM@, defined at @SDL3\/SDL_gpu.h 844:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM = SDL_GPUTextureFormat 69
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM@, defined at @SDL3\/SDL_gpu.h 845:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM = SDL_GPUTextureFormat 70
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM@, defined at @SDL3\/SDL_gpu.h 846:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM = SDL_GPUTextureFormat 71
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM@, defined at @SDL3\/SDL_gpu.h 847:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM = SDL_GPUTextureFormat 72
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM@, defined at @SDL3\/SDL_gpu.h 848:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM = SDL_GPUTextureFormat 73
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM@, defined at @SDL3\/SDL_gpu.h 849:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM = SDL_GPUTextureFormat 74
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM@, defined at @SDL3\/SDL_gpu.h 850:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM = SDL_GPUTextureFormat 75
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM@, defined at @SDL3\/SDL_gpu.h 851:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM = SDL_GPUTextureFormat 76
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 853:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_4x4_UNORM_SRGB = SDL_GPUTextureFormat 77
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 854:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x4_UNORM_SRGB = SDL_GPUTextureFormat 78
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 855:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x5_UNORM_SRGB = SDL_GPUTextureFormat 79
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 856:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x5_UNORM_SRGB = SDL_GPUTextureFormat 80
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 857:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x6_UNORM_SRGB = SDL_GPUTextureFormat 81
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 858:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x5_UNORM_SRGB = SDL_GPUTextureFormat 82
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 859:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x6_UNORM_SRGB = SDL_GPUTextureFormat 83
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 860:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x8_UNORM_SRGB = SDL_GPUTextureFormat 84
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 861:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x5_UNORM_SRGB = SDL_GPUTextureFormat 85
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 862:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x6_UNORM_SRGB = SDL_GPUTextureFormat 86
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 863:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x8_UNORM_SRGB = SDL_GPUTextureFormat 87
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 864:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x10_UNORM_SRGB = SDL_GPUTextureFormat 88
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 865:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x10_UNORM_SRGB = SDL_GPUTextureFormat 89
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB@, defined at @SDL3\/SDL_gpu.h 866:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x12_UNORM_SRGB = SDL_GPUTextureFormat 90
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT@, defined at @SDL3\/SDL_gpu.h 868:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_4x4_FLOAT = SDL_GPUTextureFormat 91
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT@, defined at @SDL3\/SDL_gpu.h 869:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x4_FLOAT = SDL_GPUTextureFormat 92
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT@, defined at @SDL3\/SDL_gpu.h 870:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_5x5_FLOAT = SDL_GPUTextureFormat 93
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT@, defined at @SDL3\/SDL_gpu.h 871:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x5_FLOAT = SDL_GPUTextureFormat 94
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT@, defined at @SDL3\/SDL_gpu.h 872:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_6x6_FLOAT = SDL_GPUTextureFormat 95
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT@, defined at @SDL3\/SDL_gpu.h 873:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x5_FLOAT = SDL_GPUTextureFormat 96
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT@, defined at @SDL3\/SDL_gpu.h 874:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x6_FLOAT = SDL_GPUTextureFormat 97
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT@, defined at @SDL3\/SDL_gpu.h 875:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_8x8_FLOAT = SDL_GPUTextureFormat 98
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT@, defined at @SDL3\/SDL_gpu.h 876:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x5_FLOAT = SDL_GPUTextureFormat 99
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT@, defined at @SDL3\/SDL_gpu.h 877:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x6_FLOAT = SDL_GPUTextureFormat 100
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT@, defined at @SDL3\/SDL_gpu.h 878:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x8_FLOAT = SDL_GPUTextureFormat 101
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT@, defined at @SDL3\/SDL_gpu.h 879:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_10x10_FLOAT = SDL_GPUTextureFormat 102
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT@, defined at @SDL3\/SDL_gpu.h 880:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x10_FLOAT = SDL_GPUTextureFormat 103
+
+-- | [C declaration]: @SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT@, defined at @SDL3\/SDL_gpu.h 881:5@
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT :: SDL_GPUTextureFormat
+pattern SDL_GPU_TEXTUREFORMAT_ASTC_12x12_FLOAT = SDL_GPUTextureFormat 104
+
+-- | Specifies how a texture is intended to be used by the client.
+--
+--     A texture must have at least one usage flag. Note that some usage flag combinations are invalid.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTexture'
+--
+--     [C declaration]: @SDL_GPUTextureUsageFlags@, defined at @SDL3\/SDL_gpu.h 904:16@
+newtype SDL_GPUTextureUsageFlags = SDL_GPUTextureUsageFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUTextureUsageFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureUsageFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUTextureUsageFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUTextureUsageFlags "unwrap" where
+  type
+    CFieldType SDL_GPUTextureUsageFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Texture supports sampling.
+--
+--     [C declaration]: @macro SDL_GPU_TEXTUREUSAGE_SAMPLER@, defined at @SDL3\/SDL_gpu.h 906:9@
+sDL_GPU_TEXTUREUSAGE_SAMPLER :: BG.CUInt
+sDL_GPU_TEXTUREUSAGE_SAMPLER =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (0 :: BG.CInt)
+
+-- | Texture is a color render target.
+--
+--     [C declaration]: @macro SDL_GPU_TEXTUREUSAGE_COLOR_TARGET@, defined at @SDL3\/SDL_gpu.h 907:9@
+sDL_GPU_TEXTUREUSAGE_COLOR_TARGET :: BG.CUInt
+sDL_GPU_TEXTUREUSAGE_COLOR_TARGET =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (1 :: BG.CInt)
+
+-- | Texture is a depth stencil target.
+--
+--     [C declaration]: @macro SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET@, defined at @SDL3\/SDL_gpu.h 908:9@
+sDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET :: BG.CUInt
+sDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (2 :: BG.CInt)
+
+-- | Texture supports storage reads in graphics stages.
+--
+--     [C declaration]: @macro SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ@, defined at @SDL3\/SDL_gpu.h 909:9@
+sDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ :: BG.CUInt
+sDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (3 :: BG.CInt)
+
+-- | Texture supports storage reads in the compute stage.
+--
+--     [C declaration]: @macro SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ@, defined at @SDL3\/SDL_gpu.h 910:9@
+sDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ :: BG.CUInt
+sDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (4 :: BG.CInt)
+
+-- | Texture supports storage writes in the compute stage.
+--
+--     [C declaration]: @macro SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE@, defined at @SDL3\/SDL_gpu.h 911:9@
+sDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE :: BG.CUInt
+sDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (5 :: BG.CInt)
+
+-- | Texture supports reads and writes in the same compute shader. This is NOT equivalent to READ | WRITE.
+--
+--     [C declaration]: @macro SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE@, defined at @SDL3\/SDL_gpu.h 912:9@
+sDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE :: BG.CUInt
+sDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (6 :: BG.CInt)
+
+-- | Specifies the type of a texture.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTexture'
+--
+--     [C declaration]: @enum SDL_GPUTextureType@, defined at @SDL3\/SDL_gpu.h 921:14@
+newtype SDL_GPUTextureType = SDL_GPUTextureType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUTextureType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUTextureType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUTextureType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUTextureType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUTextureType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUTextureType instance BG.Storable SDL_GPUTextureType
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUTextureType
+
+instance CEnum.CEnum SDL_GPUTextureType where
+  type CEnumZ SDL_GPUTextureType = BG.CUInt
+
+  toCEnum = SDL_GPUTextureType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_TEXTURETYPE_2D")
+        , (1, BG.singleton "SDL_GPU_TEXTURETYPE_2D_ARRAY")
+        , (2, BG.singleton "SDL_GPU_TEXTURETYPE_3D")
+        , (3, BG.singleton "SDL_GPU_TEXTURETYPE_CUBE")
+        , (4, BG.singleton "SDL_GPU_TEXTURETYPE_CUBE_ARRAY")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUTextureType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUTextureType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUTextureType where
+  minDeclaredValue = SDL_GPU_TEXTURETYPE_2D
+
+  maxDeclaredValue = SDL_GPU_TEXTURETYPE_CUBE_ARRAY
+
+instance Show SDL_GPUTextureType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUTextureType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUTextureType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUTextureType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUTextureType "unwrap" where
+  type
+    CFieldType SDL_GPUTextureType "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The texture is a 2-dimensional image.
+--
+--     [C declaration]: @SDL_GPU_TEXTURETYPE_2D@, defined at @SDL3\/SDL_gpu.h 923:5@
+pattern SDL_GPU_TEXTURETYPE_2D :: SDL_GPUTextureType
+pattern SDL_GPU_TEXTURETYPE_2D = SDL_GPUTextureType 0
+
+-- | The texture is a 2-dimensional array image.
+--
+--     [C declaration]: @SDL_GPU_TEXTURETYPE_2D_ARRAY@, defined at @SDL3\/SDL_gpu.h 924:5@
+pattern SDL_GPU_TEXTURETYPE_2D_ARRAY :: SDL_GPUTextureType
+pattern SDL_GPU_TEXTURETYPE_2D_ARRAY = SDL_GPUTextureType 1
+
+-- | The texture is a 3-dimensional image.
+--
+--     [C declaration]: @SDL_GPU_TEXTURETYPE_3D@, defined at @SDL3\/SDL_gpu.h 925:5@
+pattern SDL_GPU_TEXTURETYPE_3D :: SDL_GPUTextureType
+pattern SDL_GPU_TEXTURETYPE_3D = SDL_GPUTextureType 2
+
+-- | The texture is a cube image.
+--
+--     [C declaration]: @SDL_GPU_TEXTURETYPE_CUBE@, defined at @SDL3\/SDL_gpu.h 926:5@
+pattern SDL_GPU_TEXTURETYPE_CUBE :: SDL_GPUTextureType
+pattern SDL_GPU_TEXTURETYPE_CUBE = SDL_GPUTextureType 3
+
+-- | The texture is a cube array image.
+--
+--     [C declaration]: @SDL_GPU_TEXTURETYPE_CUBE_ARRAY@, defined at @SDL3\/SDL_gpu.h 927:5@
+pattern SDL_GPU_TEXTURETYPE_CUBE_ARRAY :: SDL_GPUTextureType
+pattern SDL_GPU_TEXTURETYPE_CUBE_ARRAY = SDL_GPUTextureType 4
+
+-- | Specifies the sample count of a texture.
+--
+--     Used in multisampling. Note that this value only applies when the texture is used as a render target.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTexture', 'sDL_GPUTextureSupportsSampleCount'
+--
+--     [C declaration]: @enum SDL_GPUSampleCount@, defined at @SDL3\/SDL_gpu.h 941:14@
+newtype SDL_GPUSampleCount = SDL_GPUSampleCount
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUSampleCount where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUSampleCount where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUSampleCount
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUSampleCount where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUSampleCount unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUSampleCount instance BG.Storable SDL_GPUSampleCount
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUSampleCount
+
+instance CEnum.CEnum SDL_GPUSampleCount where
+  type CEnumZ SDL_GPUSampleCount = BG.CUInt
+
+  toCEnum = SDL_GPUSampleCount
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_SAMPLECOUNT_1")
+        , (1, BG.singleton "SDL_GPU_SAMPLECOUNT_2")
+        , (2, BG.singleton "SDL_GPU_SAMPLECOUNT_4")
+        , (3, BG.singleton "SDL_GPU_SAMPLECOUNT_8")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUSampleCount"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUSampleCount"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUSampleCount where
+  minDeclaredValue = SDL_GPU_SAMPLECOUNT_1
+
+  maxDeclaredValue = SDL_GPU_SAMPLECOUNT_8
+
+instance Show SDL_GPUSampleCount where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUSampleCount where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUSampleCount ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSampleCount{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUSampleCount) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUSampleCount "unwrap" where
+  type
+    CFieldType SDL_GPUSampleCount "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | No multisampling.
+--
+--     [C declaration]: @SDL_GPU_SAMPLECOUNT_1@, defined at @SDL3\/SDL_gpu.h 943:5@
+pattern SDL_GPU_SAMPLECOUNT_1 :: SDL_GPUSampleCount
+pattern SDL_GPU_SAMPLECOUNT_1 = SDL_GPUSampleCount 0
+
+-- | MSAA 2x
+--
+--     [C declaration]: @SDL_GPU_SAMPLECOUNT_2@, defined at @SDL3\/SDL_gpu.h 944:5@
+pattern SDL_GPU_SAMPLECOUNT_2 :: SDL_GPUSampleCount
+pattern SDL_GPU_SAMPLECOUNT_2 = SDL_GPUSampleCount 1
+
+-- | MSAA 4x
+--
+--     [C declaration]: @SDL_GPU_SAMPLECOUNT_4@, defined at @SDL3\/SDL_gpu.h 945:5@
+pattern SDL_GPU_SAMPLECOUNT_4 :: SDL_GPUSampleCount
+pattern SDL_GPU_SAMPLECOUNT_4 = SDL_GPUSampleCount 2
+
+-- | MSAA 8x
+--
+--     [C declaration]: @SDL_GPU_SAMPLECOUNT_8@, defined at @SDL3\/SDL_gpu.h 946:5@
+pattern SDL_GPU_SAMPLECOUNT_8 :: SDL_GPUSampleCount
+pattern SDL_GPU_SAMPLECOUNT_8 = SDL_GPUSampleCount 3
+
+-- | Specifies the face of a cube map.
+--
+--     Can be passed in as the layer field in texture-related structs.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_GPUCubeMapFace@, defined at @SDL3\/SDL_gpu.h 957:14@
+newtype SDL_GPUCubeMapFace = SDL_GPUCubeMapFace
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUCubeMapFace where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUCubeMapFace where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUCubeMapFace
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUCubeMapFace where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUCubeMapFace unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUCubeMapFace instance BG.Storable SDL_GPUCubeMapFace
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUCubeMapFace
+
+instance CEnum.CEnum SDL_GPUCubeMapFace where
+  type CEnumZ SDL_GPUCubeMapFace = BG.CUInt
+
+  toCEnum = SDL_GPUCubeMapFace
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_CUBEMAPFACE_POSITIVEX")
+        , (1, BG.singleton "SDL_GPU_CUBEMAPFACE_NEGATIVEX")
+        , (2, BG.singleton "SDL_GPU_CUBEMAPFACE_POSITIVEY")
+        , (3, BG.singleton "SDL_GPU_CUBEMAPFACE_NEGATIVEY")
+        , (4, BG.singleton "SDL_GPU_CUBEMAPFACE_POSITIVEZ")
+        , (5, BG.singleton "SDL_GPU_CUBEMAPFACE_NEGATIVEZ")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUCubeMapFace"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUCubeMapFace"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUCubeMapFace where
+  minDeclaredValue = SDL_GPU_CUBEMAPFACE_POSITIVEX
+
+  maxDeclaredValue = SDL_GPU_CUBEMAPFACE_NEGATIVEZ
+
+instance Show SDL_GPUCubeMapFace where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUCubeMapFace where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUCubeMapFace ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUCubeMapFace{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUCubeMapFace) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUCubeMapFace "unwrap" where
+  type
+    CFieldType SDL_GPUCubeMapFace "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_CUBEMAPFACE_POSITIVEX@, defined at @SDL3\/SDL_gpu.h 959:5@
+pattern SDL_GPU_CUBEMAPFACE_POSITIVEX :: SDL_GPUCubeMapFace
+pattern SDL_GPU_CUBEMAPFACE_POSITIVEX = SDL_GPUCubeMapFace 0
+
+-- | [C declaration]: @SDL_GPU_CUBEMAPFACE_NEGATIVEX@, defined at @SDL3\/SDL_gpu.h 960:5@
+pattern SDL_GPU_CUBEMAPFACE_NEGATIVEX :: SDL_GPUCubeMapFace
+pattern SDL_GPU_CUBEMAPFACE_NEGATIVEX = SDL_GPUCubeMapFace 1
+
+-- | [C declaration]: @SDL_GPU_CUBEMAPFACE_POSITIVEY@, defined at @SDL3\/SDL_gpu.h 961:5@
+pattern SDL_GPU_CUBEMAPFACE_POSITIVEY :: SDL_GPUCubeMapFace
+pattern SDL_GPU_CUBEMAPFACE_POSITIVEY = SDL_GPUCubeMapFace 2
+
+-- | [C declaration]: @SDL_GPU_CUBEMAPFACE_NEGATIVEY@, defined at @SDL3\/SDL_gpu.h 962:5@
+pattern SDL_GPU_CUBEMAPFACE_NEGATIVEY :: SDL_GPUCubeMapFace
+pattern SDL_GPU_CUBEMAPFACE_NEGATIVEY = SDL_GPUCubeMapFace 3
+
+-- | [C declaration]: @SDL_GPU_CUBEMAPFACE_POSITIVEZ@, defined at @SDL3\/SDL_gpu.h 963:5@
+pattern SDL_GPU_CUBEMAPFACE_POSITIVEZ :: SDL_GPUCubeMapFace
+pattern SDL_GPU_CUBEMAPFACE_POSITIVEZ = SDL_GPUCubeMapFace 4
+
+-- | [C declaration]: @SDL_GPU_CUBEMAPFACE_NEGATIVEZ@, defined at @SDL3\/SDL_gpu.h 964:5@
+pattern SDL_GPU_CUBEMAPFACE_NEGATIVEZ :: SDL_GPUCubeMapFace
+pattern SDL_GPU_CUBEMAPFACE_NEGATIVEZ = SDL_GPUCubeMapFace 5
+
+-- | Specifies how a buffer is intended to be used by the client.
+--
+--     A buffer must have at least one usage flag. Note that some usage flag combinations are invalid.
+--
+--     Unlike textures, READ | WRITE can be used for simultaneous read-write usage. The same data synchronization concerns as textures apply.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUBuffer'
+--
+--     [C declaration]: @SDL_GPUBufferUsageFlags@, defined at @SDL3\/SDL_gpu.h 984:16@
+newtype SDL_GPUBufferUsageFlags = SDL_GPUBufferUsageFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUBufferUsageFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferUsageFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUBufferUsageFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUBufferUsageFlags "unwrap" where
+  type
+    CFieldType SDL_GPUBufferUsageFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Buffer is a vertex buffer.
+--
+--     [C declaration]: @macro SDL_GPU_BUFFERUSAGE_VERTEX@, defined at @SDL3\/SDL_gpu.h 986:9@
+sDL_GPU_BUFFERUSAGE_VERTEX :: BG.CUInt
+sDL_GPU_BUFFERUSAGE_VERTEX =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (0 :: BG.CInt)
+
+-- | Buffer is an index buffer.
+--
+--     [C declaration]: @macro SDL_GPU_BUFFERUSAGE_INDEX@, defined at @SDL3\/SDL_gpu.h 987:9@
+sDL_GPU_BUFFERUSAGE_INDEX :: BG.CUInt
+sDL_GPU_BUFFERUSAGE_INDEX =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (1 :: BG.CInt)
+
+-- | Buffer is an indirect buffer.
+--
+--     [C declaration]: @macro SDL_GPU_BUFFERUSAGE_INDIRECT@, defined at @SDL3\/SDL_gpu.h 988:9@
+sDL_GPU_BUFFERUSAGE_INDIRECT :: BG.CUInt
+sDL_GPU_BUFFERUSAGE_INDIRECT =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (2 :: BG.CInt)
+
+-- | Buffer supports storage reads in graphics stages.
+--
+--     [C declaration]: @macro SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ@, defined at @SDL3\/SDL_gpu.h 989:9@
+sDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ :: BG.CUInt
+sDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (3 :: BG.CInt)
+
+-- | Buffer supports storage reads in the compute stage.
+--
+--     [C declaration]: @macro SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ@, defined at @SDL3\/SDL_gpu.h 990:9@
+sDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ :: BG.CUInt
+sDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (4 :: BG.CInt)
+
+-- | Buffer supports storage writes in the compute stage.
+--
+--     [C declaration]: @macro SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE@, defined at @SDL3\/SDL_gpu.h 991:9@
+sDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE :: BG.CUInt
+sDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (5 :: BG.CInt)
+
+-- | Specifies how a transfer buffer is intended to be used by the client.
+--
+--     Note that mapping and copying FROM an upload transfer buffer or TO a download transfer buffer is undefined behavior.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTransferBuffer'
+--
+--     [C declaration]: @enum SDL_GPUTransferBufferUsage@, defined at @SDL3\/SDL_gpu.h 1003:14@
+newtype SDL_GPUTransferBufferUsage = SDL_GPUTransferBufferUsage
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUTransferBufferUsage where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUTransferBufferUsage where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUTransferBufferUsage
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUTransferBufferUsage where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUTransferBufferUsage unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_GPUTransferBufferUsage
+  instance
+    BG.Storable SDL_GPUTransferBufferUsage
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUTransferBufferUsage
+
+instance CEnum.CEnum SDL_GPUTransferBufferUsage where
+  type CEnumZ SDL_GPUTransferBufferUsage = BG.CUInt
+
+  toCEnum = SDL_GPUTransferBufferUsage
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD")
+        , (1, BG.singleton "SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUTransferBufferUsage"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUTransferBufferUsage"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUTransferBufferUsage where
+  minDeclaredValue = SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD
+
+  maxDeclaredValue =
+    SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD
+
+instance Show SDL_GPUTransferBufferUsage where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUTransferBufferUsage where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUTransferBufferUsage ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTransferBufferUsage{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUTransferBufferUsage) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUTransferBufferUsage "unwrap" where
+  type
+    CFieldType SDL_GPUTransferBufferUsage "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD@, defined at @SDL3\/SDL_gpu.h 1005:5@
+pattern SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD :: SDL_GPUTransferBufferUsage
+pattern SDL_GPU_TRANSFERBUFFERUSAGE_UPLOAD = SDL_GPUTransferBufferUsage 0
+
+-- | [C declaration]: @SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD@, defined at @SDL3\/SDL_gpu.h 1006:5@
+pattern SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD :: SDL_GPUTransferBufferUsage
+pattern SDL_GPU_TRANSFERBUFFERUSAGE_DOWNLOAD = SDL_GPUTransferBufferUsage 1
+
+-- | Specifies which stage a shader program corresponds to.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @enum SDL_GPUShaderStage@, defined at @SDL3\/SDL_gpu.h 1016:14@
+newtype SDL_GPUShaderStage = SDL_GPUShaderStage
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUShaderStage where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUShaderStage where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUShaderStage
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUShaderStage where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUShaderStage unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUShaderStage instance BG.Storable SDL_GPUShaderStage
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUShaderStage
+
+instance CEnum.CEnum SDL_GPUShaderStage where
+  type CEnumZ SDL_GPUShaderStage = BG.CUInt
+
+  toCEnum = SDL_GPUShaderStage
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_SHADERSTAGE_VERTEX")
+        , (1, BG.singleton "SDL_GPU_SHADERSTAGE_FRAGMENT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUShaderStage"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUShaderStage"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUShaderStage where
+  minDeclaredValue = SDL_GPU_SHADERSTAGE_VERTEX
+
+  maxDeclaredValue = SDL_GPU_SHADERSTAGE_FRAGMENT
+
+instance Show SDL_GPUShaderStage where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUShaderStage where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUShaderStage ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderStage{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUShaderStage) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUShaderStage "unwrap" where
+  type
+    CFieldType SDL_GPUShaderStage "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_SHADERSTAGE_VERTEX@, defined at @SDL3\/SDL_gpu.h 1018:5@
+pattern SDL_GPU_SHADERSTAGE_VERTEX :: SDL_GPUShaderStage
+pattern SDL_GPU_SHADERSTAGE_VERTEX = SDL_GPUShaderStage 0
+
+-- | [C declaration]: @SDL_GPU_SHADERSTAGE_FRAGMENT@, defined at @SDL3\/SDL_gpu.h 1019:5@
+pattern SDL_GPU_SHADERSTAGE_FRAGMENT :: SDL_GPUShaderStage
+pattern SDL_GPU_SHADERSTAGE_FRAGMENT = SDL_GPUShaderStage 1
+
+-- | Specifies the format of shader code.
+--
+--     Each format corresponds to a specific backend that accepts it.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_GPUShaderFormat@, defined at @SDL3\/SDL_gpu.h 1031:16@
+newtype SDL_GPUShaderFormat = SDL_GPUShaderFormat
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUShaderFormat ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderFormat{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUShaderFormat) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUShaderFormat "unwrap" where
+  type
+    CFieldType SDL_GPUShaderFormat "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @macro SDL_GPU_SHADERFORMAT_INVALID@, defined at @SDL3\/SDL_gpu.h 1033:9@
+sDL_GPU_SHADERFORMAT_INVALID :: BG.CInt
+sDL_GPU_SHADERFORMAT_INVALID = (0 :: BG.CInt)
+
+-- | Shaders for NDA\'d platforms.
+--
+--     [C declaration]: @macro SDL_GPU_SHADERFORMAT_PRIVATE@, defined at @SDL3\/SDL_gpu.h 1034:9@
+sDL_GPU_SHADERFORMAT_PRIVATE :: BG.CUInt
+sDL_GPU_SHADERFORMAT_PRIVATE =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (0 :: BG.CInt)
+
+-- | SPIR-V shaders for Vulkan.
+--
+--     [C declaration]: @macro SDL_GPU_SHADERFORMAT_SPIRV@, defined at @SDL3\/SDL_gpu.h 1035:9@
+sDL_GPU_SHADERFORMAT_SPIRV :: BG.CUInt
+sDL_GPU_SHADERFORMAT_SPIRV =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (1 :: BG.CInt)
+
+-- | DXBC SM5_1 shaders for D3D12.
+--
+--     [C declaration]: @macro SDL_GPU_SHADERFORMAT_DXBC@, defined at @SDL3\/SDL_gpu.h 1036:9@
+sDL_GPU_SHADERFORMAT_DXBC :: BG.CUInt
+sDL_GPU_SHADERFORMAT_DXBC =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (2 :: BG.CInt)
+
+-- | DXIL SM6_0 shaders for D3D12.
+--
+--     [C declaration]: @macro SDL_GPU_SHADERFORMAT_DXIL@, defined at @SDL3\/SDL_gpu.h 1037:9@
+sDL_GPU_SHADERFORMAT_DXIL :: BG.CUInt
+sDL_GPU_SHADERFORMAT_DXIL =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (3 :: BG.CInt)
+
+-- | MSL shaders for Metal.
+--
+--     [C declaration]: @macro SDL_GPU_SHADERFORMAT_MSL@, defined at @SDL3\/SDL_gpu.h 1038:9@
+sDL_GPU_SHADERFORMAT_MSL :: BG.CUInt
+sDL_GPU_SHADERFORMAT_MSL =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (4 :: BG.CInt)
+
+-- | Precompiled metallib shaders for Metal.
+--
+--     [C declaration]: @macro SDL_GPU_SHADERFORMAT_METALLIB@, defined at @SDL3\/SDL_gpu.h 1039:9@
+sDL_GPU_SHADERFORMAT_METALLIB :: BG.CUInt
+sDL_GPU_SHADERFORMAT_METALLIB =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (5 :: BG.CInt)
+
+-- | Specifies the format of a vertex attribute.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUVertexElementFormat@, defined at @SDL3\/SDL_gpu.h 1048:14@
+newtype SDL_GPUVertexElementFormat = SDL_GPUVertexElementFormat
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUVertexElementFormat where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUVertexElementFormat where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUVertexElementFormat
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUVertexElementFormat where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUVertexElementFormat unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_GPUVertexElementFormat
+  instance
+    BG.Storable SDL_GPUVertexElementFormat
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUVertexElementFormat
+
+instance CEnum.CEnum SDL_GPUVertexElementFormat where
+  type CEnumZ SDL_GPUVertexElementFormat = BG.CUInt
+
+  toCEnum = SDL_GPUVertexElementFormat
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_INVALID")
+        , (1, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_INT")
+        , (2, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_INT2")
+        , (3, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_INT3")
+        , (4, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_INT4")
+        , (5, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_UINT")
+        , (6, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_UINT2")
+        , (7, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_UINT3")
+        , (8, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_UINT4")
+        , (9, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_FLOAT")
+        , (10, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2")
+        , (11, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3")
+        , (12, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4")
+        , (13, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_BYTE2")
+        , (14, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_BYTE4")
+        , (15, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2")
+        , (16, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4")
+        , (17, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_BYTE2_NORM")
+        , (18, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_BYTE4_NORM")
+        , (19, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2_NORM")
+        , (20, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM")
+        , (21, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_SHORT2")
+        , (22, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_SHORT4")
+        , (23, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_USHORT2")
+        , (24, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_USHORT4")
+        , (25, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_SHORT2_NORM")
+        , (26, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_SHORT4_NORM")
+        , (27, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_USHORT2_NORM")
+        , (28, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_USHORT4_NORM")
+        , (29, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_HALF2")
+        , (30, BG.singleton "SDL_GPU_VERTEXELEMENTFORMAT_HALF4")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUVertexElementFormat"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUVertexElementFormat"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUVertexElementFormat where
+  minDeclaredValue =
+    SDL_GPU_VERTEXELEMENTFORMAT_INVALID
+
+  maxDeclaredValue = SDL_GPU_VERTEXELEMENTFORMAT_HALF4
+
+instance Show SDL_GPUVertexElementFormat where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUVertexElementFormat where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUVertexElementFormat ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexElementFormat{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUVertexElementFormat) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUVertexElementFormat "unwrap" where
+  type
+    CFieldType SDL_GPUVertexElementFormat "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_INVALID@, defined at @SDL3\/SDL_gpu.h 1050:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_INVALID :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_INVALID = SDL_GPUVertexElementFormat 0
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_INT@, defined at @SDL3\/SDL_gpu.h 1053:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_INT :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_INT = SDL_GPUVertexElementFormat 1
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_INT2@, defined at @SDL3\/SDL_gpu.h 1054:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_INT2 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_INT2 = SDL_GPUVertexElementFormat 2
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_INT3@, defined at @SDL3\/SDL_gpu.h 1055:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_INT3 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_INT3 = SDL_GPUVertexElementFormat 3
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_INT4@, defined at @SDL3\/SDL_gpu.h 1056:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_INT4 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_INT4 = SDL_GPUVertexElementFormat 4
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_UINT@, defined at @SDL3\/SDL_gpu.h 1059:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UINT :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UINT = SDL_GPUVertexElementFormat 5
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_UINT2@, defined at @SDL3\/SDL_gpu.h 1060:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UINT2 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UINT2 = SDL_GPUVertexElementFormat 6
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_UINT3@, defined at @SDL3\/SDL_gpu.h 1061:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UINT3 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UINT3 = SDL_GPUVertexElementFormat 7
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_UINT4@, defined at @SDL3\/SDL_gpu.h 1062:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UINT4 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UINT4 = SDL_GPUVertexElementFormat 8
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_FLOAT@, defined at @SDL3\/SDL_gpu.h 1065:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_FLOAT :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_FLOAT = SDL_GPUVertexElementFormat 9
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2@, defined at @SDL3\/SDL_gpu.h 1066:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_FLOAT2 = SDL_GPUVertexElementFormat 10
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3@, defined at @SDL3\/SDL_gpu.h 1067:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_FLOAT3 = SDL_GPUVertexElementFormat 11
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4@, defined at @SDL3\/SDL_gpu.h 1068:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_FLOAT4 = SDL_GPUVertexElementFormat 12
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_BYTE2@, defined at @SDL3\/SDL_gpu.h 1071:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_BYTE2 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_BYTE2 = SDL_GPUVertexElementFormat 13
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_BYTE4@, defined at @SDL3\/SDL_gpu.h 1072:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_BYTE4 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_BYTE4 = SDL_GPUVertexElementFormat 14
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2@, defined at @SDL3\/SDL_gpu.h 1075:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2 = SDL_GPUVertexElementFormat 15
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4@, defined at @SDL3\/SDL_gpu.h 1076:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4 = SDL_GPUVertexElementFormat 16
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_BYTE2_NORM@, defined at @SDL3\/SDL_gpu.h 1079:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_BYTE2_NORM :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_BYTE2_NORM = SDL_GPUVertexElementFormat 17
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_BYTE4_NORM@, defined at @SDL3\/SDL_gpu.h 1080:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_BYTE4_NORM :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_BYTE4_NORM = SDL_GPUVertexElementFormat 18
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2_NORM@, defined at @SDL3\/SDL_gpu.h 1083:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2_NORM :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UBYTE2_NORM = SDL_GPUVertexElementFormat 19
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM@, defined at @SDL3\/SDL_gpu.h 1084:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_UBYTE4_NORM = SDL_GPUVertexElementFormat 20
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_SHORT2@, defined at @SDL3\/SDL_gpu.h 1087:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_SHORT2 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_SHORT2 = SDL_GPUVertexElementFormat 21
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_SHORT4@, defined at @SDL3\/SDL_gpu.h 1088:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_SHORT4 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_SHORT4 = SDL_GPUVertexElementFormat 22
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_USHORT2@, defined at @SDL3\/SDL_gpu.h 1091:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_USHORT2 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_USHORT2 = SDL_GPUVertexElementFormat 23
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_USHORT4@, defined at @SDL3\/SDL_gpu.h 1092:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_USHORT4 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_USHORT4 = SDL_GPUVertexElementFormat 24
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_SHORT2_NORM@, defined at @SDL3\/SDL_gpu.h 1095:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_SHORT2_NORM :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_SHORT2_NORM = SDL_GPUVertexElementFormat 25
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_SHORT4_NORM@, defined at @SDL3\/SDL_gpu.h 1096:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_SHORT4_NORM :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_SHORT4_NORM = SDL_GPUVertexElementFormat 26
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_USHORT2_NORM@, defined at @SDL3\/SDL_gpu.h 1099:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_USHORT2_NORM :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_USHORT2_NORM = SDL_GPUVertexElementFormat 27
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_USHORT4_NORM@, defined at @SDL3\/SDL_gpu.h 1100:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_USHORT4_NORM :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_USHORT4_NORM = SDL_GPUVertexElementFormat 28
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_HALF2@, defined at @SDL3\/SDL_gpu.h 1103:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_HALF2 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_HALF2 = SDL_GPUVertexElementFormat 29
+
+-- | [C declaration]: @SDL_GPU_VERTEXELEMENTFORMAT_HALF4@, defined at @SDL3\/SDL_gpu.h 1104:5@
+pattern SDL_GPU_VERTEXELEMENTFORMAT_HALF4 :: SDL_GPUVertexElementFormat
+pattern SDL_GPU_VERTEXELEMENTFORMAT_HALF4 = SDL_GPUVertexElementFormat 30
+
+-- | Specifies the rate at which vertex attributes are pulled from buffers.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUVertexInputRate@, defined at @SDL3\/SDL_gpu.h 1114:14@
+newtype SDL_GPUVertexInputRate = SDL_GPUVertexInputRate
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUVertexInputRate where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUVertexInputRate where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUVertexInputRate
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUVertexInputRate where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUVertexInputRate unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_GPUVertexInputRate
+  instance
+    BG.Storable SDL_GPUVertexInputRate
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUVertexInputRate
+
+instance CEnum.CEnum SDL_GPUVertexInputRate where
+  type CEnumZ SDL_GPUVertexInputRate = BG.CUInt
+
+  toCEnum = SDL_GPUVertexInputRate
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_VERTEXINPUTRATE_VERTEX")
+        , (1, BG.singleton "SDL_GPU_VERTEXINPUTRATE_INSTANCE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUVertexInputRate"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUVertexInputRate"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUVertexInputRate where
+  minDeclaredValue = SDL_GPU_VERTEXINPUTRATE_VERTEX
+
+  maxDeclaredValue = SDL_GPU_VERTEXINPUTRATE_INSTANCE
+
+instance Show SDL_GPUVertexInputRate where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUVertexInputRate where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUVertexInputRate ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexInputRate{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUVertexInputRate) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUVertexInputRate "unwrap" where
+  type
+    CFieldType SDL_GPUVertexInputRate "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Attribute addressing is a function of the vertex index.
+--
+--     [C declaration]: @SDL_GPU_VERTEXINPUTRATE_VERTEX@, defined at @SDL3\/SDL_gpu.h 1116:5@
+pattern SDL_GPU_VERTEXINPUTRATE_VERTEX :: SDL_GPUVertexInputRate
+pattern SDL_GPU_VERTEXINPUTRATE_VERTEX = SDL_GPUVertexInputRate 0
+
+-- | Attribute addressing is a function of the instance index.
+--
+--     [C declaration]: @SDL_GPU_VERTEXINPUTRATE_INSTANCE@, defined at @SDL3\/SDL_gpu.h 1117:5@
+pattern SDL_GPU_VERTEXINPUTRATE_INSTANCE :: SDL_GPUVertexInputRate
+pattern SDL_GPU_VERTEXINPUTRATE_INSTANCE = SDL_GPUVertexInputRate 1
+
+-- | Specifies the fill mode of the graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUFillMode@, defined at @SDL3\/SDL_gpu.h 1127:14@
+newtype SDL_GPUFillMode = SDL_GPUFillMode
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUFillMode where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUFillMode where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUFillMode
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUFillMode where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUFillMode unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUFillMode instance BG.Storable SDL_GPUFillMode
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUFillMode
+
+instance CEnum.CEnum SDL_GPUFillMode where
+  type CEnumZ SDL_GPUFillMode = BG.CUInt
+
+  toCEnum = SDL_GPUFillMode
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_FILLMODE_FILL")
+        , (1, BG.singleton "SDL_GPU_FILLMODE_LINE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUFillMode"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUFillMode"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUFillMode where
+  minDeclaredValue = SDL_GPU_FILLMODE_FILL
+
+  maxDeclaredValue = SDL_GPU_FILLMODE_LINE
+
+instance Show SDL_GPUFillMode where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUFillMode where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUFillMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUFillMode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUFillMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUFillMode "unwrap" where
+  type CFieldType SDL_GPUFillMode "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Polygons will be rendered via rasterization.
+--
+--     [C declaration]: @SDL_GPU_FILLMODE_FILL@, defined at @SDL3\/SDL_gpu.h 1129:5@
+pattern SDL_GPU_FILLMODE_FILL :: SDL_GPUFillMode
+pattern SDL_GPU_FILLMODE_FILL = SDL_GPUFillMode 0
+
+-- | Polygon edges will be drawn as line segments.
+--
+--     [C declaration]: @SDL_GPU_FILLMODE_LINE@, defined at @SDL3\/SDL_gpu.h 1130:5@
+pattern SDL_GPU_FILLMODE_LINE :: SDL_GPUFillMode
+pattern SDL_GPU_FILLMODE_LINE = SDL_GPUFillMode 1
+
+-- | Specifies the facing direction in which triangle faces will be culled.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUCullMode@, defined at @SDL3\/SDL_gpu.h 1140:14@
+newtype SDL_GPUCullMode = SDL_GPUCullMode
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUCullMode where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUCullMode where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUCullMode
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUCullMode where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUCullMode unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUCullMode instance BG.Storable SDL_GPUCullMode
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUCullMode
+
+instance CEnum.CEnum SDL_GPUCullMode where
+  type CEnumZ SDL_GPUCullMode = BG.CUInt
+
+  toCEnum = SDL_GPUCullMode
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_CULLMODE_NONE")
+        , (1, BG.singleton "SDL_GPU_CULLMODE_FRONT")
+        , (2, BG.singleton "SDL_GPU_CULLMODE_BACK")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUCullMode"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUCullMode"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUCullMode where
+  minDeclaredValue = SDL_GPU_CULLMODE_NONE
+
+  maxDeclaredValue = SDL_GPU_CULLMODE_BACK
+
+instance Show SDL_GPUCullMode where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUCullMode where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUCullMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUCullMode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUCullMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUCullMode "unwrap" where
+  type CFieldType SDL_GPUCullMode "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | No triangles are culled.
+--
+--     [C declaration]: @SDL_GPU_CULLMODE_NONE@, defined at @SDL3\/SDL_gpu.h 1142:5@
+pattern SDL_GPU_CULLMODE_NONE :: SDL_GPUCullMode
+pattern SDL_GPU_CULLMODE_NONE = SDL_GPUCullMode 0
+
+-- | Front-facing triangles are culled.
+--
+--     [C declaration]: @SDL_GPU_CULLMODE_FRONT@, defined at @SDL3\/SDL_gpu.h 1143:5@
+pattern SDL_GPU_CULLMODE_FRONT :: SDL_GPUCullMode
+pattern SDL_GPU_CULLMODE_FRONT = SDL_GPUCullMode 1
+
+-- | Back-facing triangles are culled.
+--
+--     [C declaration]: @SDL_GPU_CULLMODE_BACK@, defined at @SDL3\/SDL_gpu.h 1144:5@
+pattern SDL_GPU_CULLMODE_BACK :: SDL_GPUCullMode
+pattern SDL_GPU_CULLMODE_BACK = SDL_GPUCullMode 2
+
+-- | Specifies the vertex winding that will cause a triangle to be determined to be front-facing.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUFrontFace@, defined at @SDL3\/SDL_gpu.h 1155:14@
+newtype SDL_GPUFrontFace = SDL_GPUFrontFace
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUFrontFace where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUFrontFace where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUFrontFace
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUFrontFace where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUFrontFace unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUFrontFace instance BG.Storable SDL_GPUFrontFace
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUFrontFace
+
+instance CEnum.CEnum SDL_GPUFrontFace where
+  type CEnumZ SDL_GPUFrontFace = BG.CUInt
+
+  toCEnum = SDL_GPUFrontFace
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE")
+        , (1, BG.singleton "SDL_GPU_FRONTFACE_CLOCKWISE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUFrontFace"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUFrontFace"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUFrontFace where
+  minDeclaredValue =
+    SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE
+
+  maxDeclaredValue = SDL_GPU_FRONTFACE_CLOCKWISE
+
+instance Show SDL_GPUFrontFace where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUFrontFace where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUFrontFace ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUFrontFace{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUFrontFace) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUFrontFace "unwrap" where
+  type CFieldType SDL_GPUFrontFace "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | A triangle with counter-clockwise vertex winding will be considered front-facing.
+--
+--     [C declaration]: @SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE@, defined at @SDL3\/SDL_gpu.h 1157:5@
+pattern SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE :: SDL_GPUFrontFace
+pattern SDL_GPU_FRONTFACE_COUNTER_CLOCKWISE = SDL_GPUFrontFace 0
+
+-- | A triangle with clockwise vertex winding will be considered front-facing.
+--
+--     [C declaration]: @SDL_GPU_FRONTFACE_CLOCKWISE@, defined at @SDL3\/SDL_gpu.h 1158:5@
+pattern SDL_GPU_FRONTFACE_CLOCKWISE :: SDL_GPUFrontFace
+pattern SDL_GPU_FRONTFACE_CLOCKWISE = SDL_GPUFrontFace 1
+
+-- | Specifies a comparison operator for depth, stencil and sampler operations.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUCompareOp@, defined at @SDL3\/SDL_gpu.h 1168:14@
+newtype SDL_GPUCompareOp = SDL_GPUCompareOp
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUCompareOp where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUCompareOp where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUCompareOp
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUCompareOp where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUCompareOp unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUCompareOp instance BG.Storable SDL_GPUCompareOp
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUCompareOp
+
+instance CEnum.CEnum SDL_GPUCompareOp where
+  type CEnumZ SDL_GPUCompareOp = BG.CUInt
+
+  toCEnum = SDL_GPUCompareOp
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_COMPAREOP_INVALID")
+        , (1, BG.singleton "SDL_GPU_COMPAREOP_NEVER")
+        , (2, BG.singleton "SDL_GPU_COMPAREOP_LESS")
+        , (3, BG.singleton "SDL_GPU_COMPAREOP_EQUAL")
+        , (4, BG.singleton "SDL_GPU_COMPAREOP_LESS_OR_EQUAL")
+        , (5, BG.singleton "SDL_GPU_COMPAREOP_GREATER")
+        , (6, BG.singleton "SDL_GPU_COMPAREOP_NOT_EQUAL")
+        , (7, BG.singleton "SDL_GPU_COMPAREOP_GREATER_OR_EQUAL")
+        , (8, BG.singleton "SDL_GPU_COMPAREOP_ALWAYS")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUCompareOp"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUCompareOp"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUCompareOp where
+  minDeclaredValue = SDL_GPU_COMPAREOP_INVALID
+
+  maxDeclaredValue = SDL_GPU_COMPAREOP_ALWAYS
+
+instance Show SDL_GPUCompareOp where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUCompareOp where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUCompareOp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUCompareOp{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUCompareOp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUCompareOp "unwrap" where
+  type CFieldType SDL_GPUCompareOp "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_COMPAREOP_INVALID@, defined at @SDL3\/SDL_gpu.h 1170:5@
+pattern SDL_GPU_COMPAREOP_INVALID :: SDL_GPUCompareOp
+pattern SDL_GPU_COMPAREOP_INVALID = SDL_GPUCompareOp 0
+
+-- | The comparison always evaluates false.
+--
+--     [C declaration]: @SDL_GPU_COMPAREOP_NEVER@, defined at @SDL3\/SDL_gpu.h 1171:5@
+pattern SDL_GPU_COMPAREOP_NEVER :: SDL_GPUCompareOp
+pattern SDL_GPU_COMPAREOP_NEVER = SDL_GPUCompareOp 1
+
+-- | The comparison evaluates reference \< test.
+--
+--     [C declaration]: @SDL_GPU_COMPAREOP_LESS@, defined at @SDL3\/SDL_gpu.h 1172:5@
+pattern SDL_GPU_COMPAREOP_LESS :: SDL_GPUCompareOp
+pattern SDL_GPU_COMPAREOP_LESS = SDL_GPUCompareOp 2
+
+-- | The comparison evaluates reference == test.
+--
+--     [C declaration]: @SDL_GPU_COMPAREOP_EQUAL@, defined at @SDL3\/SDL_gpu.h 1173:5@
+pattern SDL_GPU_COMPAREOP_EQUAL :: SDL_GPUCompareOp
+pattern SDL_GPU_COMPAREOP_EQUAL = SDL_GPUCompareOp 3
+
+-- | The comparison evaluates reference \<= test.
+--
+--     [C declaration]: @SDL_GPU_COMPAREOP_LESS_OR_EQUAL@, defined at @SDL3\/SDL_gpu.h 1174:5@
+pattern SDL_GPU_COMPAREOP_LESS_OR_EQUAL :: SDL_GPUCompareOp
+pattern SDL_GPU_COMPAREOP_LESS_OR_EQUAL = SDL_GPUCompareOp 4
+
+-- | The comparison evaluates reference > test.
+--
+--     [C declaration]: @SDL_GPU_COMPAREOP_GREATER@, defined at @SDL3\/SDL_gpu.h 1175:5@
+pattern SDL_GPU_COMPAREOP_GREATER :: SDL_GPUCompareOp
+pattern SDL_GPU_COMPAREOP_GREATER = SDL_GPUCompareOp 5
+
+-- | The comparison evaluates reference != test.
+--
+--     [C declaration]: @SDL_GPU_COMPAREOP_NOT_EQUAL@, defined at @SDL3\/SDL_gpu.h 1176:5@
+pattern SDL_GPU_COMPAREOP_NOT_EQUAL :: SDL_GPUCompareOp
+pattern SDL_GPU_COMPAREOP_NOT_EQUAL = SDL_GPUCompareOp 6
+
+-- | The comparison evaluates reference >= test.
+--
+--     [C declaration]: @SDL_GPU_COMPAREOP_GREATER_OR_EQUAL@, defined at @SDL3\/SDL_gpu.h 1177:5@
+pattern SDL_GPU_COMPAREOP_GREATER_OR_EQUAL :: SDL_GPUCompareOp
+pattern SDL_GPU_COMPAREOP_GREATER_OR_EQUAL = SDL_GPUCompareOp 7
+
+-- | The comparison always evaluates true.
+--
+--     [C declaration]: @SDL_GPU_COMPAREOP_ALWAYS@, defined at @SDL3\/SDL_gpu.h 1178:5@
+pattern SDL_GPU_COMPAREOP_ALWAYS :: SDL_GPUCompareOp
+pattern SDL_GPU_COMPAREOP_ALWAYS = SDL_GPUCompareOp 8
+
+-- | Specifies what happens to a stored stencil value if stencil tests fail or pass.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUStencilOp@, defined at @SDL3\/SDL_gpu.h 1189:14@
+newtype SDL_GPUStencilOp = SDL_GPUStencilOp
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUStencilOp where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUStencilOp where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUStencilOp
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUStencilOp where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUStencilOp unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUStencilOp instance BG.Storable SDL_GPUStencilOp
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUStencilOp
+
+instance CEnum.CEnum SDL_GPUStencilOp where
+  type CEnumZ SDL_GPUStencilOp = BG.CUInt
+
+  toCEnum = SDL_GPUStencilOp
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_STENCILOP_INVALID")
+        , (1, BG.singleton "SDL_GPU_STENCILOP_KEEP")
+        , (2, BG.singleton "SDL_GPU_STENCILOP_ZERO")
+        , (3, BG.singleton "SDL_GPU_STENCILOP_REPLACE")
+        , (4, BG.singleton "SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP")
+        , (5, BG.singleton "SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP")
+        , (6, BG.singleton "SDL_GPU_STENCILOP_INVERT")
+        , (7, BG.singleton "SDL_GPU_STENCILOP_INCREMENT_AND_WRAP")
+        , (8, BG.singleton "SDL_GPU_STENCILOP_DECREMENT_AND_WRAP")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUStencilOp"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUStencilOp"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUStencilOp where
+  minDeclaredValue = SDL_GPU_STENCILOP_INVALID
+
+  maxDeclaredValue =
+    SDL_GPU_STENCILOP_DECREMENT_AND_WRAP
+
+instance Show SDL_GPUStencilOp where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUStencilOp where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUStencilOp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStencilOp{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUStencilOp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUStencilOp "unwrap" where
+  type CFieldType SDL_GPUStencilOp "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_STENCILOP_INVALID@, defined at @SDL3\/SDL_gpu.h 1191:5@
+pattern SDL_GPU_STENCILOP_INVALID :: SDL_GPUStencilOp
+pattern SDL_GPU_STENCILOP_INVALID = SDL_GPUStencilOp 0
+
+-- | Keeps the current value.
+--
+--     [C declaration]: @SDL_GPU_STENCILOP_KEEP@, defined at @SDL3\/SDL_gpu.h 1192:5@
+pattern SDL_GPU_STENCILOP_KEEP :: SDL_GPUStencilOp
+pattern SDL_GPU_STENCILOP_KEEP = SDL_GPUStencilOp 1
+
+-- | Sets the value to 0.
+--
+--     [C declaration]: @SDL_GPU_STENCILOP_ZERO@, defined at @SDL3\/SDL_gpu.h 1193:5@
+pattern SDL_GPU_STENCILOP_ZERO :: SDL_GPUStencilOp
+pattern SDL_GPU_STENCILOP_ZERO = SDL_GPUStencilOp 2
+
+-- | Sets the value to reference.
+--
+--     [C declaration]: @SDL_GPU_STENCILOP_REPLACE@, defined at @SDL3\/SDL_gpu.h 1194:5@
+pattern SDL_GPU_STENCILOP_REPLACE :: SDL_GPUStencilOp
+pattern SDL_GPU_STENCILOP_REPLACE = SDL_GPUStencilOp 3
+
+-- | Increments the current value and clamps to the maximum value.
+--
+--     [C declaration]: @SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP@, defined at @SDL3\/SDL_gpu.h 1195:5@
+pattern SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP :: SDL_GPUStencilOp
+pattern SDL_GPU_STENCILOP_INCREMENT_AND_CLAMP = SDL_GPUStencilOp 4
+
+-- | Decrements the current value and clamps to 0.
+--
+--     [C declaration]: @SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP@, defined at @SDL3\/SDL_gpu.h 1196:5@
+pattern SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP :: SDL_GPUStencilOp
+pattern SDL_GPU_STENCILOP_DECREMENT_AND_CLAMP = SDL_GPUStencilOp 5
+
+-- | Bitwise-inverts the current value.
+--
+--     [C declaration]: @SDL_GPU_STENCILOP_INVERT@, defined at @SDL3\/SDL_gpu.h 1197:5@
+pattern SDL_GPU_STENCILOP_INVERT :: SDL_GPUStencilOp
+pattern SDL_GPU_STENCILOP_INVERT = SDL_GPUStencilOp 6
+
+-- | Increments the current value and wraps back to 0.
+--
+--     [C declaration]: @SDL_GPU_STENCILOP_INCREMENT_AND_WRAP@, defined at @SDL3\/SDL_gpu.h 1198:5@
+pattern SDL_GPU_STENCILOP_INCREMENT_AND_WRAP :: SDL_GPUStencilOp
+pattern SDL_GPU_STENCILOP_INCREMENT_AND_WRAP = SDL_GPUStencilOp 7
+
+-- | Decrements the current value and wraps to the maximum value.
+--
+--     [C declaration]: @SDL_GPU_STENCILOP_DECREMENT_AND_WRAP@, defined at @SDL3\/SDL_gpu.h 1199:5@
+pattern SDL_GPU_STENCILOP_DECREMENT_AND_WRAP :: SDL_GPUStencilOp
+pattern SDL_GPU_STENCILOP_DECREMENT_AND_WRAP = SDL_GPUStencilOp 8
+
+-- | Specifies the operator to be used when pixels in a render target are blended with existing pixels in the texture.
+--
+--     The source color is the value written by the fragment shader. The destination color is the value currently existing in the texture.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUBlendOp@, defined at @SDL3\/SDL_gpu.h 1213:14@
+newtype SDL_GPUBlendOp = SDL_GPUBlendOp
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUBlendOp where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUBlendOp where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUBlendOp
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUBlendOp where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUBlendOp unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUBlendOp instance BG.Storable SDL_GPUBlendOp
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUBlendOp
+
+instance CEnum.CEnum SDL_GPUBlendOp where
+  type CEnumZ SDL_GPUBlendOp = BG.CUInt
+
+  toCEnum = SDL_GPUBlendOp
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_BLENDOP_INVALID")
+        , (1, BG.singleton "SDL_GPU_BLENDOP_ADD")
+        , (2, BG.singleton "SDL_GPU_BLENDOP_SUBTRACT")
+        , (3, BG.singleton "SDL_GPU_BLENDOP_REVERSE_SUBTRACT")
+        , (4, BG.singleton "SDL_GPU_BLENDOP_MIN")
+        , (5, BG.singleton "SDL_GPU_BLENDOP_MAX")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUBlendOp"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUBlendOp"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUBlendOp where
+  minDeclaredValue = SDL_GPU_BLENDOP_INVALID
+
+  maxDeclaredValue = SDL_GPU_BLENDOP_MAX
+
+instance Show SDL_GPUBlendOp where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUBlendOp where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUBlendOp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlendOp{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUBlendOp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUBlendOp "unwrap" where
+  type CFieldType SDL_GPUBlendOp "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_BLENDOP_INVALID@, defined at @SDL3\/SDL_gpu.h 1215:5@
+pattern SDL_GPU_BLENDOP_INVALID :: SDL_GPUBlendOp
+pattern SDL_GPU_BLENDOP_INVALID = SDL_GPUBlendOp 0
+
+-- | (source * source_factor) + (destination * destination_factor)
+--
+--     [C declaration]: @SDL_GPU_BLENDOP_ADD@, defined at @SDL3\/SDL_gpu.h 1216:5@
+pattern SDL_GPU_BLENDOP_ADD :: SDL_GPUBlendOp
+pattern SDL_GPU_BLENDOP_ADD = SDL_GPUBlendOp 1
+
+-- | (source * source_factor) - (destination * destination_factor)
+--
+--     [C declaration]: @SDL_GPU_BLENDOP_SUBTRACT@, defined at @SDL3\/SDL_gpu.h 1217:5@
+pattern SDL_GPU_BLENDOP_SUBTRACT :: SDL_GPUBlendOp
+pattern SDL_GPU_BLENDOP_SUBTRACT = SDL_GPUBlendOp 2
+
+-- | (destination * destination_factor) - (source * source_factor)
+--
+--     [C declaration]: @SDL_GPU_BLENDOP_REVERSE_SUBTRACT@, defined at @SDL3\/SDL_gpu.h 1218:5@
+pattern SDL_GPU_BLENDOP_REVERSE_SUBTRACT :: SDL_GPUBlendOp
+pattern SDL_GPU_BLENDOP_REVERSE_SUBTRACT = SDL_GPUBlendOp 3
+
+-- | min(source, destination)
+--
+--     [C declaration]: @SDL_GPU_BLENDOP_MIN@, defined at @SDL3\/SDL_gpu.h 1219:5@
+pattern SDL_GPU_BLENDOP_MIN :: SDL_GPUBlendOp
+pattern SDL_GPU_BLENDOP_MIN = SDL_GPUBlendOp 4
+
+-- | max(source, destination)
+--
+--     [C declaration]: @SDL_GPU_BLENDOP_MAX@, defined at @SDL3\/SDL_gpu.h 1220:5@
+pattern SDL_GPU_BLENDOP_MAX :: SDL_GPUBlendOp
+pattern SDL_GPU_BLENDOP_MAX = SDL_GPUBlendOp 5
+
+-- | Specifies a blending factor to be used when pixels in a render target are blended with existing pixels in the texture.
+--
+--     The source color is the value written by the fragment shader. The destination color is the value currently existing in the texture.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @enum SDL_GPUBlendFactor@, defined at @SDL3\/SDL_gpu.h 1234:14@
+newtype SDL_GPUBlendFactor = SDL_GPUBlendFactor
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUBlendFactor where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUBlendFactor where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUBlendFactor
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUBlendFactor where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUBlendFactor unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUBlendFactor instance BG.Storable SDL_GPUBlendFactor
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUBlendFactor
+
+instance CEnum.CEnum SDL_GPUBlendFactor where
+  type CEnumZ SDL_GPUBlendFactor = BG.CUInt
+
+  toCEnum = SDL_GPUBlendFactor
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_BLENDFACTOR_INVALID")
+        , (1, BG.singleton "SDL_GPU_BLENDFACTOR_ZERO")
+        , (2, BG.singleton "SDL_GPU_BLENDFACTOR_ONE")
+        , (3, BG.singleton "SDL_GPU_BLENDFACTOR_SRC_COLOR")
+        , (4, BG.singleton "SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR")
+        , (5, BG.singleton "SDL_GPU_BLENDFACTOR_DST_COLOR")
+        , (6, BG.singleton "SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR")
+        , (7, BG.singleton "SDL_GPU_BLENDFACTOR_SRC_ALPHA")
+        , (8, BG.singleton "SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA")
+        , (9, BG.singleton "SDL_GPU_BLENDFACTOR_DST_ALPHA")
+        , (10, BG.singleton "SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA")
+        , (11, BG.singleton "SDL_GPU_BLENDFACTOR_CONSTANT_COLOR")
+        , (12, BG.singleton "SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR")
+        , (13, BG.singleton "SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUBlendFactor"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUBlendFactor"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUBlendFactor where
+  minDeclaredValue = SDL_GPU_BLENDFACTOR_INVALID
+
+  maxDeclaredValue =
+    SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE
+
+instance Show SDL_GPUBlendFactor where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUBlendFactor where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUBlendFactor ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlendFactor{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUBlendFactor) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUBlendFactor "unwrap" where
+  type
+    CFieldType SDL_GPUBlendFactor "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_BLENDFACTOR_INVALID@, defined at @SDL3\/SDL_gpu.h 1236:5@
+pattern SDL_GPU_BLENDFACTOR_INVALID :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_INVALID = SDL_GPUBlendFactor 0
+
+-- | 0
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_ZERO@, defined at @SDL3\/SDL_gpu.h 1237:5@
+pattern SDL_GPU_BLENDFACTOR_ZERO :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_ZERO = SDL_GPUBlendFactor 1
+
+-- | 1
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_ONE@, defined at @SDL3\/SDL_gpu.h 1238:5@
+pattern SDL_GPU_BLENDFACTOR_ONE :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_ONE = SDL_GPUBlendFactor 2
+
+-- | source color
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_SRC_COLOR@, defined at @SDL3\/SDL_gpu.h 1239:5@
+pattern SDL_GPU_BLENDFACTOR_SRC_COLOR :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_SRC_COLOR = SDL_GPUBlendFactor 3
+
+-- | 1 - source color
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR@, defined at @SDL3\/SDL_gpu.h 1240:5@
+pattern SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_COLOR = SDL_GPUBlendFactor 4
+
+-- | destination color
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_DST_COLOR@, defined at @SDL3\/SDL_gpu.h 1241:5@
+pattern SDL_GPU_BLENDFACTOR_DST_COLOR :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_DST_COLOR = SDL_GPUBlendFactor 5
+
+-- | 1 - destination color
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR@, defined at @SDL3\/SDL_gpu.h 1242:5@
+pattern SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_COLOR = SDL_GPUBlendFactor 6
+
+-- | source alpha
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_SRC_ALPHA@, defined at @SDL3\/SDL_gpu.h 1243:5@
+pattern SDL_GPU_BLENDFACTOR_SRC_ALPHA :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_SRC_ALPHA = SDL_GPUBlendFactor 7
+
+-- | 1 - source alpha
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA@, defined at @SDL3\/SDL_gpu.h 1244:5@
+pattern SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_ONE_MINUS_SRC_ALPHA = SDL_GPUBlendFactor 8
+
+-- | destination alpha
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_DST_ALPHA@, defined at @SDL3\/SDL_gpu.h 1245:5@
+pattern SDL_GPU_BLENDFACTOR_DST_ALPHA :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_DST_ALPHA = SDL_GPUBlendFactor 9
+
+-- | 1 - destination alpha
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA@, defined at @SDL3\/SDL_gpu.h 1246:5@
+pattern SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_ONE_MINUS_DST_ALPHA = SDL_GPUBlendFactor 10
+
+-- | blend constant
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_CONSTANT_COLOR@, defined at @SDL3\/SDL_gpu.h 1247:5@
+pattern SDL_GPU_BLENDFACTOR_CONSTANT_COLOR :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_CONSTANT_COLOR = SDL_GPUBlendFactor 11
+
+-- | 1 - blend constant
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR@, defined at @SDL3\/SDL_gpu.h 1248:5@
+pattern SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR = SDL_GPUBlendFactor 12
+
+-- | min(source alpha, 1 - destination alpha)
+--
+--     [C declaration]: @SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE@, defined at @SDL3\/SDL_gpu.h 1249:5@
+pattern SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE :: SDL_GPUBlendFactor
+pattern SDL_GPU_BLENDFACTOR_SRC_ALPHA_SATURATE = SDL_GPUBlendFactor 13
+
+-- | Specifies which color components are written in a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline'
+--
+--     [C declaration]: @SDL_GPUColorComponentFlags@, defined at @SDL3\/SDL_gpu.h 1259:15@
+newtype SDL_GPUColorComponentFlags = SDL_GPUColorComponentFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUColorComponentFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorComponentFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUColorComponentFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUColorComponentFlags "unwrap" where
+  type
+    CFieldType SDL_GPUColorComponentFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 0
+
+-- | the red component
+--
+--     [C declaration]: @macro SDL_GPU_COLORCOMPONENT_R@, defined at @SDL3\/SDL_gpu.h 1261:9@
+sDL_GPU_COLORCOMPONENT_R :: BG.CUInt
+sDL_GPU_COLORCOMPONENT_R =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (0 :: BG.CInt)
+
+-- | the green component
+--
+--     [C declaration]: @macro SDL_GPU_COLORCOMPONENT_G@, defined at @SDL3\/SDL_gpu.h 1262:9@
+sDL_GPU_COLORCOMPONENT_G :: BG.CUInt
+sDL_GPU_COLORCOMPONENT_G =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (1 :: BG.CInt)
+
+-- | the blue component
+--
+--     [C declaration]: @macro SDL_GPU_COLORCOMPONENT_B@, defined at @SDL3\/SDL_gpu.h 1263:9@
+sDL_GPU_COLORCOMPONENT_B :: BG.CUInt
+sDL_GPU_COLORCOMPONENT_B =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (2 :: BG.CInt)
+
+-- | the alpha component
+--
+--     [C declaration]: @macro SDL_GPU_COLORCOMPONENT_A@, defined at @SDL3\/SDL_gpu.h 1264:9@
+sDL_GPU_COLORCOMPONENT_A :: BG.CUInt
+sDL_GPU_COLORCOMPONENT_A =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (3 :: BG.CInt)
+
+-- | Specifies a filter operation used by a sampler.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUSampler'
+--
+--     [C declaration]: @enum SDL_GPUFilter@, defined at @SDL3\/SDL_gpu.h 1273:14@
+newtype SDL_GPUFilter = SDL_GPUFilter
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUFilter where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUFilter where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUFilter
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUFilter where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUFilter unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUFilter instance BG.Storable SDL_GPUFilter
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUFilter
+
+instance CEnum.CEnum SDL_GPUFilter where
+  type CEnumZ SDL_GPUFilter = BG.CUInt
+
+  toCEnum = SDL_GPUFilter
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_FILTER_NEAREST")
+        , (1, BG.singleton "SDL_GPU_FILTER_LINEAR")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUFilter"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUFilter"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUFilter where
+  minDeclaredValue = SDL_GPU_FILTER_NEAREST
+
+  maxDeclaredValue = SDL_GPU_FILTER_LINEAR
+
+instance Show SDL_GPUFilter where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUFilter where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUFilter ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUFilter{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUFilter) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUFilter "unwrap" where
+  type CFieldType SDL_GPUFilter "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Point filtering.
+--
+--     [C declaration]: @SDL_GPU_FILTER_NEAREST@, defined at @SDL3\/SDL_gpu.h 1275:5@
+pattern SDL_GPU_FILTER_NEAREST :: SDL_GPUFilter
+pattern SDL_GPU_FILTER_NEAREST = SDL_GPUFilter 0
+
+-- | Linear filtering.
+--
+--     [C declaration]: @SDL_GPU_FILTER_LINEAR@, defined at @SDL3\/SDL_gpu.h 1276:5@
+pattern SDL_GPU_FILTER_LINEAR :: SDL_GPUFilter
+pattern SDL_GPU_FILTER_LINEAR = SDL_GPUFilter 1
+
+-- | Specifies a mipmap mode used by a sampler.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUSampler'
+--
+--     [C declaration]: @enum SDL_GPUSamplerMipmapMode@, defined at @SDL3\/SDL_gpu.h 1286:14@
+newtype SDL_GPUSamplerMipmapMode = SDL_GPUSamplerMipmapMode
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUSamplerMipmapMode where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUSamplerMipmapMode where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUSamplerMipmapMode
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUSamplerMipmapMode where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUSamplerMipmapMode unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_GPUSamplerMipmapMode
+  instance
+    BG.Storable SDL_GPUSamplerMipmapMode
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUSamplerMipmapMode
+
+instance CEnum.CEnum SDL_GPUSamplerMipmapMode where
+  type CEnumZ SDL_GPUSamplerMipmapMode = BG.CUInt
+
+  toCEnum = SDL_GPUSamplerMipmapMode
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_SAMPLERMIPMAPMODE_NEAREST")
+        , (1, BG.singleton "SDL_GPU_SAMPLERMIPMAPMODE_LINEAR")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUSamplerMipmapMode"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUSamplerMipmapMode"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUSamplerMipmapMode where
+  minDeclaredValue = SDL_GPU_SAMPLERMIPMAPMODE_NEAREST
+
+  maxDeclaredValue = SDL_GPU_SAMPLERMIPMAPMODE_LINEAR
+
+instance Show SDL_GPUSamplerMipmapMode where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUSamplerMipmapMode where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUSamplerMipmapMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerMipmapMode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUSamplerMipmapMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUSamplerMipmapMode "unwrap" where
+  type
+    CFieldType SDL_GPUSamplerMipmapMode "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Point filtering.
+--
+--     [C declaration]: @SDL_GPU_SAMPLERMIPMAPMODE_NEAREST@, defined at @SDL3\/SDL_gpu.h 1288:5@
+pattern SDL_GPU_SAMPLERMIPMAPMODE_NEAREST :: SDL_GPUSamplerMipmapMode
+pattern SDL_GPU_SAMPLERMIPMAPMODE_NEAREST = SDL_GPUSamplerMipmapMode 0
+
+-- | Linear filtering.
+--
+--     [C declaration]: @SDL_GPU_SAMPLERMIPMAPMODE_LINEAR@, defined at @SDL3\/SDL_gpu.h 1289:5@
+pattern SDL_GPU_SAMPLERMIPMAPMODE_LINEAR :: SDL_GPUSamplerMipmapMode
+pattern SDL_GPU_SAMPLERMIPMAPMODE_LINEAR = SDL_GPUSamplerMipmapMode 1
+
+-- | Specifies behavior of texture sampling when the coordinates exceed the 0-1 range.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUSampler'
+--
+--     [C declaration]: @enum SDL_GPUSamplerAddressMode@, defined at @SDL3\/SDL_gpu.h 1300:14@
+newtype SDL_GPUSamplerAddressMode = SDL_GPUSamplerAddressMode
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUSamplerAddressMode where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUSamplerAddressMode where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUSamplerAddressMode
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUSamplerAddressMode where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUSamplerAddressMode unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_GPUSamplerAddressMode
+  instance
+    BG.Storable SDL_GPUSamplerAddressMode
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUSamplerAddressMode
+
+instance CEnum.CEnum SDL_GPUSamplerAddressMode where
+  type CEnumZ SDL_GPUSamplerAddressMode = BG.CUInt
+
+  toCEnum = SDL_GPUSamplerAddressMode
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_SAMPLERADDRESSMODE_REPEAT")
+        , (1, BG.singleton "SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT")
+        , (2, BG.singleton "SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUSamplerAddressMode"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUSamplerAddressMode"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUSamplerAddressMode where
+  minDeclaredValue = SDL_GPU_SAMPLERADDRESSMODE_REPEAT
+
+  maxDeclaredValue =
+    SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE
+
+instance Show SDL_GPUSamplerAddressMode where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUSamplerAddressMode where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUSamplerAddressMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerAddressMode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUSamplerAddressMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUSamplerAddressMode "unwrap" where
+  type
+    CFieldType SDL_GPUSamplerAddressMode "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Specifies that the coordinates will wrap around.
+--
+--     [C declaration]: @SDL_GPU_SAMPLERADDRESSMODE_REPEAT@, defined at @SDL3\/SDL_gpu.h 1302:5@
+pattern SDL_GPU_SAMPLERADDRESSMODE_REPEAT :: SDL_GPUSamplerAddressMode
+pattern SDL_GPU_SAMPLERADDRESSMODE_REPEAT = SDL_GPUSamplerAddressMode 0
+
+-- | Specifies that the coordinates will wrap around mirrored.
+--
+--     [C declaration]: @SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT@, defined at @SDL3\/SDL_gpu.h 1303:5@
+pattern SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT :: SDL_GPUSamplerAddressMode
+pattern SDL_GPU_SAMPLERADDRESSMODE_MIRRORED_REPEAT = SDL_GPUSamplerAddressMode 1
+
+-- | Specifies that the coordinates will clamp to the 0-1 range.
+--
+--     [C declaration]: @SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE@, defined at @SDL3\/SDL_gpu.h 1304:5@
+pattern SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE :: SDL_GPUSamplerAddressMode
+pattern SDL_GPU_SAMPLERADDRESSMODE_CLAMP_TO_EDGE = SDL_GPUSamplerAddressMode 2
+
+-- | Specifies the timing that will be used to present swapchain textures to the OS.
+--
+--     VSYNC mode will always be supported. IMMEDIATE and MAILBOX modes may not be supported on certain systems.
+--
+--     It is recommended to query SDL_WindowSupportsGPUPresentMode after claiming the window if you wish to change the present mode to IMMEDIATE or MAILBOX.
+--
+--     * VSYNC: Waits for vblank before presenting. No tearing is possible. If there is a pending image to present, the new image is enqueued for presentation. Disallows tearing at the cost of visual latency.
+--
+--     * IMMEDIATE: Immediately presents. Lowest latency option, but tearing may occur.
+--
+--     * 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 new image. Similar to VSYNC, but with reduced visual latency.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGPUSwapchainParameters', 'sDL_WindowSupportsGPUPresentMode', 'sDL_WaitAndAcquireGPUSwapchainTexture'
+--
+--     [C declaration]: @enum SDL_GPUPresentMode@, defined at @SDL3\/SDL_gpu.h 1332:14@
+newtype SDL_GPUPresentMode = SDL_GPUPresentMode
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUPresentMode where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUPresentMode where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUPresentMode
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUPresentMode where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUPresentMode unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GPUPresentMode instance BG.Storable SDL_GPUPresentMode
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUPresentMode
+
+instance CEnum.CEnum SDL_GPUPresentMode where
+  type CEnumZ SDL_GPUPresentMode = BG.CUInt
+
+  toCEnum = SDL_GPUPresentMode
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_PRESENTMODE_VSYNC")
+        , (1, BG.singleton "SDL_GPU_PRESENTMODE_IMMEDIATE")
+        , (2, BG.singleton "SDL_GPU_PRESENTMODE_MAILBOX")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUPresentMode"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUPresentMode"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUPresentMode where
+  minDeclaredValue = SDL_GPU_PRESENTMODE_VSYNC
+
+  maxDeclaredValue = SDL_GPU_PRESENTMODE_MAILBOX
+
+instance Show SDL_GPUPresentMode where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUPresentMode where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUPresentMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUPresentMode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUPresentMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUPresentMode "unwrap" where
+  type
+    CFieldType SDL_GPUPresentMode "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_PRESENTMODE_VSYNC@, defined at @SDL3\/SDL_gpu.h 1334:5@
+pattern SDL_GPU_PRESENTMODE_VSYNC :: SDL_GPUPresentMode
+pattern SDL_GPU_PRESENTMODE_VSYNC = SDL_GPUPresentMode 0
+
+-- | [C declaration]: @SDL_GPU_PRESENTMODE_IMMEDIATE@, defined at @SDL3\/SDL_gpu.h 1335:5@
+pattern SDL_GPU_PRESENTMODE_IMMEDIATE :: SDL_GPUPresentMode
+pattern SDL_GPU_PRESENTMODE_IMMEDIATE = SDL_GPUPresentMode 1
+
+-- | [C declaration]: @SDL_GPU_PRESENTMODE_MAILBOX@, defined at @SDL3\/SDL_gpu.h 1336:5@
+pattern SDL_GPU_PRESENTMODE_MAILBOX :: SDL_GPUPresentMode
+pattern SDL_GPU_PRESENTMODE_MAILBOX = SDL_GPUPresentMode 2
+
+-- | Specifies the texture format and colorspace of the swapchain textures.
+--
+--     SDR will always be supported. Other compositions may not be supported on certain systems.
+--
+--     It is recommended to query SDL_WindowSupportsGPUSwapchainComposition after claiming the window if you wish to change the swapchain composition from SDR.
+--
+--     * SDR: B8G8R8A8 or R8G8B8A8 swapchain. Pixel values are in sRGB encoding.
+--
+--     * SDR_LINEAR: B8G8R8A8_SRGB or R8G8B8A8_SRGB swapchain. Pixel values are stored in memory in sRGB encoding but accessed in shaders in \"linear sRGB\" encoding which is sRGB but with a linear transfer function.
+--
+--     * HDR_EXTENDED_LINEAR: R16G16B16A16_FLOAT swapchain. Pixel values are in extended linear sRGB encoding and permits values outside of the [0, 1] range.
+--
+--     * HDR10_ST2084: A2R10G10B10 or A2B10G10R10 swapchain. Pixel values are in BT.2020 ST2084 (PQ) encoding.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGPUSwapchainParameters', 'sDL_WindowSupportsGPUSwapchainComposition', 'sDL_WaitAndAcquireGPUSwapchainTexture'
+--
+--     [C declaration]: @enum SDL_GPUSwapchainComposition@, defined at @SDL3\/SDL_gpu.h 1365:14@
+newtype SDL_GPUSwapchainComposition = SDL_GPUSwapchainComposition
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GPUSwapchainComposition where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUSwapchainComposition where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUSwapchainComposition
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GPUSwapchainComposition where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUSwapchainComposition unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_GPUSwapchainComposition
+  instance
+    BG.Storable SDL_GPUSwapchainComposition
+
+deriving via BG.CUInt instance BG.Prim SDL_GPUSwapchainComposition
+
+instance CEnum.CEnum SDL_GPUSwapchainComposition where
+  type CEnumZ SDL_GPUSwapchainComposition = BG.CUInt
+
+  toCEnum = SDL_GPUSwapchainComposition
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GPU_SWAPCHAINCOMPOSITION_SDR")
+        , (1, BG.singleton "SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR")
+        , (2, BG.singleton "SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR")
+        , (3, BG.singleton "SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GPUSwapchainComposition"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GPUSwapchainComposition"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GPUSwapchainComposition where
+  minDeclaredValue = SDL_GPU_SWAPCHAINCOMPOSITION_SDR
+
+  maxDeclaredValue =
+    SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084
+
+instance Show SDL_GPUSwapchainComposition where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GPUSwapchainComposition where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GPUSwapchainComposition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSwapchainComposition{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GPUSwapchainComposition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GPUSwapchainComposition "unwrap" where
+  type
+    CFieldType SDL_GPUSwapchainComposition "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_GPU_SWAPCHAINCOMPOSITION_SDR@, defined at @SDL3\/SDL_gpu.h 1367:5@
+pattern SDL_GPU_SWAPCHAINCOMPOSITION_SDR :: SDL_GPUSwapchainComposition
+pattern SDL_GPU_SWAPCHAINCOMPOSITION_SDR = SDL_GPUSwapchainComposition 0
+
+-- | [C declaration]: @SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR@, defined at @SDL3\/SDL_gpu.h 1368:5@
+pattern SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR :: SDL_GPUSwapchainComposition
+pattern SDL_GPU_SWAPCHAINCOMPOSITION_SDR_LINEAR = SDL_GPUSwapchainComposition 1
+
+-- | [C declaration]: @SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR@, defined at @SDL3\/SDL_gpu.h 1369:5@
+pattern SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR :: SDL_GPUSwapchainComposition
+pattern SDL_GPU_SWAPCHAINCOMPOSITION_HDR_EXTENDED_LINEAR = SDL_GPUSwapchainComposition 2
+
+-- | [C declaration]: @SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084@, defined at @SDL3\/SDL_gpu.h 1370:5@
+pattern SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084 :: SDL_GPUSwapchainComposition
+pattern SDL_GPU_SWAPCHAINCOMPOSITION_HDR10_ST2084 = SDL_GPUSwapchainComposition 3
+
+-- | A structure specifying a viewport.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetGPUViewport'
+--
+--     [C declaration]: @struct SDL_GPUViewport@, defined at @SDL3\/SDL_gpu.h 1382:16@
+data SDL_GPUViewport = SDL_GPUViewport
+  { x :: BG.CFloat
+  -- ^ The left offset of the viewport.
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_gpu.h 1384:11@
+  , y :: BG.CFloat
+  -- ^ The top offset of the viewport.
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_gpu.h 1385:11@
+  , w :: BG.CFloat
+  -- ^ The width of the viewport.
+  --
+  --          [C declaration]: @w@, defined at @SDL3\/SDL_gpu.h 1386:11@
+  , h :: BG.CFloat
+  -- ^ The height of the viewport.
+  --
+  --          [C declaration]: @h@, defined at @SDL3\/SDL_gpu.h 1387:11@
+  , min_depth :: BG.CFloat
+  -- ^ The minimum depth of the viewport.
+  --
+  --          [C declaration]: @min_depth@, defined at @SDL3\/SDL_gpu.h 1388:11@
+  , max_depth :: BG.CFloat
+  -- ^ The maximum depth of the viewport.
+  --
+  --          [C declaration]: @max_depth@, defined at @SDL3\/SDL_gpu.h 1389:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUViewport where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUViewport where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUViewport
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"w") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"h") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"min_depth") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"max_depth") ptr0
+
+instance Marshal.WriteRaw SDL_GPUViewport where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUViewport x2 y3 w4 h5 min_depth6 max_depth7 ->
+            HasCField.writeRaw (BG.Proxy @"x") ptr0 x2
+              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y3
+              >> HasCField.writeRaw (BG.Proxy @"w") ptr0 w4
+              >> HasCField.writeRaw (BG.Proxy @"h") ptr0 h5
+              >> HasCField.writeRaw (BG.Proxy @"min_depth") ptr0 min_depth6
+              >> HasCField.writeRaw (BG.Proxy @"max_depth") ptr0 max_depth7
+
+deriving via Marshal.EquivStorable SDL_GPUViewport instance BG.Storable SDL_GPUViewport
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "x" SDL_GPUViewport ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUViewport
+            { x = y1
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , min_depth = BG.getField @"min_depth" x0
+            , max_depth = BG.getField @"max_depth" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_GPUViewport) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_GPUViewport "x" where
+  type CFieldType SDL_GPUViewport "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "y" SDL_GPUViewport ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUViewport
+            { y = y1
+            , x = BG.getField @"x" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , min_depth = BG.getField @"min_depth" x0
+            , max_depth = BG.getField @"max_depth" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_GPUViewport) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_GPUViewport "y" where
+  type CFieldType SDL_GPUViewport "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "w" SDL_GPUViewport ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUViewport
+            { w = y1
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , h = BG.getField @"h" x0
+            , min_depth = BG.getField @"min_depth" x0
+            , max_depth = BG.getField @"max_depth" x0
+            }
+      , BG.getField @"w" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "w" (BG.Ptr SDL_GPUViewport) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"w")
+
+instance HasCField.HasCField SDL_GPUViewport "w" where
+  type CFieldType SDL_GPUViewport "w" = BG.CFloat
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "h" SDL_GPUViewport ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUViewport
+            { h = y1
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , min_depth = BG.getField @"min_depth" x0
+            , max_depth = BG.getField @"max_depth" x0
+            }
+      , BG.getField @"h" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "h" (BG.Ptr SDL_GPUViewport) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"h")
+
+instance HasCField.HasCField SDL_GPUViewport "h" where
+  type CFieldType SDL_GPUViewport "h" = BG.CFloat
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "min_depth" SDL_GPUViewport ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUViewport
+            { min_depth = y1
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , max_depth = BG.getField @"max_depth" x0
+            }
+      , BG.getField @"min_depth" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "min_depth" (BG.Ptr SDL_GPUViewport) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"min_depth")
+
+instance HasCField.HasCField SDL_GPUViewport "min_depth" where
+  type
+    CFieldType SDL_GPUViewport "min_depth" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "max_depth" SDL_GPUViewport ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUViewport
+            { max_depth = y1
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , min_depth = BG.getField @"min_depth" x0
+            }
+      , BG.getField @"max_depth" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "max_depth" (BG.Ptr SDL_GPUViewport) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"max_depth")
+
+instance HasCField.HasCField SDL_GPUViewport "max_depth" where
+  type
+    CFieldType SDL_GPUViewport "max_depth" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 20
+
+-- | A structure specifying parameters related to transferring data to or from a texture.
+--
+--     If either of @pixels_per_row@ or @rows_per_layer@ is zero, then width and height of passed 'SDL_GPUTextureRegion' to SDL_UploadToGPUTexture or SDL_DownloadFromGPUTexture are used as default values respectively and data is considered to be tightly packed.
+--
+--     __WARNING__: On some older\/integrated hardware, 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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUTexture', 'sDL_DownloadFromGPUTexture'
+--
+--     [C declaration]: @struct SDL_GPUTextureTransferInfo@, defined at @SDL3\/SDL_gpu.h 1413:16@
+data SDL_GPUTextureTransferInfo = SDL_GPUTextureTransferInfo
+  { transfer_buffer :: BG.Ptr SDL_GPUTransferBuffer
+  -- ^ The transfer buffer used in the transfer operation.
+  --
+  --          [C declaration]: @transfer_buffer@, defined at @SDL3\/SDL_gpu.h 1415:28@
+  , offset :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The starting byte of the image data in the transfer buffer.
+  --
+  --          [C declaration]: @offset@, defined at @SDL3\/SDL_gpu.h 1416:12@
+  , pixels_per_row :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of pixels from one row to the next.
+  --
+  --          [C declaration]: @pixels_per_row@, defined at @SDL3\/SDL_gpu.h 1417:12@
+  , rows_per_layer :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of rows from one layer\/depth-slice to the next.
+  --
+  --          [C declaration]: @rows_per_layer@, defined at @SDL3\/SDL_gpu.h 1418:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUTextureTransferInfo where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUTextureTransferInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUTextureTransferInfo
+        <*> HasCField.readRaw (BG.Proxy @"transfer_buffer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"offset") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pixels_per_row") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"rows_per_layer") ptr0
+
+instance Marshal.WriteRaw SDL_GPUTextureTransferInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUTextureTransferInfo
+            transfer_buffer2
+            offset3
+            pixels_per_row4
+            rows_per_layer5 ->
+              HasCField.writeRaw (BG.Proxy @"transfer_buffer") ptr0 transfer_buffer2
+                >> HasCField.writeRaw (BG.Proxy @"offset") ptr0 offset3
+                >> HasCField.writeRaw (BG.Proxy @"pixels_per_row") ptr0 pixels_per_row4
+                >> HasCField.writeRaw (BG.Proxy @"rows_per_layer") ptr0 rows_per_layer5
+
+deriving via
+  Marshal.EquivStorable SDL_GPUTextureTransferInfo
+  instance
+    BG.Storable SDL_GPUTextureTransferInfo
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTransferBuffer)
+  => BG.CompatHasField.HasField "transfer_buffer" SDL_GPUTextureTransferInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureTransferInfo
+            { transfer_buffer = y1
+            , offset = BG.getField @"offset" x0
+            , pixels_per_row = BG.getField @"pixels_per_row" x0
+            , rows_per_layer = BG.getField @"rows_per_layer" x0
+            }
+      , BG.getField @"transfer_buffer" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTransferBuffer)
+  => BG.HasField "transfer_buffer" (BG.Ptr SDL_GPUTextureTransferInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"transfer_buffer")
+
+instance HasCField.HasCField SDL_GPUTextureTransferInfo "transfer_buffer" where
+  type
+    CFieldType SDL_GPUTextureTransferInfo "transfer_buffer" =
+      BG.Ptr SDL_GPUTransferBuffer
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "offset" SDL_GPUTextureTransferInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureTransferInfo
+            { offset = y1
+            , transfer_buffer = BG.getField @"transfer_buffer" x0
+            , pixels_per_row = BG.getField @"pixels_per_row" x0
+            , rows_per_layer = BG.getField @"rows_per_layer" x0
+            }
+      , BG.getField @"offset" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "offset" (BG.Ptr SDL_GPUTextureTransferInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"offset")
+
+instance HasCField.HasCField SDL_GPUTextureTransferInfo "offset" where
+  type
+    CFieldType SDL_GPUTextureTransferInfo "offset" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "pixels_per_row" SDL_GPUTextureTransferInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureTransferInfo
+            { pixels_per_row = y1
+            , transfer_buffer = BG.getField @"transfer_buffer" x0
+            , offset = BG.getField @"offset" x0
+            , rows_per_layer = BG.getField @"rows_per_layer" x0
+            }
+      , BG.getField @"pixels_per_row" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "pixels_per_row" (BG.Ptr SDL_GPUTextureTransferInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"pixels_per_row")
+
+instance HasCField.HasCField SDL_GPUTextureTransferInfo "pixels_per_row" where
+  type
+    CFieldType SDL_GPUTextureTransferInfo "pixels_per_row" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "rows_per_layer" SDL_GPUTextureTransferInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureTransferInfo
+            { rows_per_layer = y1
+            , transfer_buffer = BG.getField @"transfer_buffer" x0
+            , offset = BG.getField @"offset" x0
+            , pixels_per_row = BG.getField @"pixels_per_row" x0
+            }
+      , BG.getField @"rows_per_layer" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "rows_per_layer" (BG.Ptr SDL_GPUTextureTransferInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"rows_per_layer")
+
+instance HasCField.HasCField SDL_GPUTextureTransferInfo "rows_per_layer" where
+  type
+    CFieldType SDL_GPUTextureTransferInfo "rows_per_layer" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 16
+
+-- | A structure specifying a location in a transfer buffer.
+--
+--     Used when transferring buffer data to or from a transfer buffer.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUBuffer', 'sDL_DownloadFromGPUBuffer'
+--
+--     [C declaration]: @struct SDL_GPUTransferBufferLocation@, defined at @SDL3\/SDL_gpu.h 1431:16@
+data SDL_GPUTransferBufferLocation = SDL_GPUTransferBufferLocation
+  { transfer_buffer :: BG.Ptr SDL_GPUTransferBuffer
+  -- ^ The transfer buffer used in the transfer operation.
+  --
+  --          [C declaration]: @transfer_buffer@, defined at @SDL3\/SDL_gpu.h 1433:28@
+  , offset :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The starting byte of the buffer data in the transfer buffer.
+  --
+  --          [C declaration]: @offset@, defined at @SDL3\/SDL_gpu.h 1434:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUTransferBufferLocation where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUTransferBufferLocation where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUTransferBufferLocation
+        <*> HasCField.readRaw (BG.Proxy @"transfer_buffer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"offset") ptr0
+
+instance Marshal.WriteRaw SDL_GPUTransferBufferLocation where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUTransferBufferLocation transfer_buffer2 offset3 ->
+            HasCField.writeRaw (BG.Proxy @"transfer_buffer") ptr0 transfer_buffer2
+              >> HasCField.writeRaw (BG.Proxy @"offset") ptr0 offset3
+
+deriving via
+  Marshal.EquivStorable SDL_GPUTransferBufferLocation
+  instance
+    BG.Storable SDL_GPUTransferBufferLocation
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTransferBuffer)
+  => BG.CompatHasField.HasField "transfer_buffer" SDL_GPUTransferBufferLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTransferBufferLocation{transfer_buffer = y1, offset = BG.getField @"offset" x0}
+      , BG.getField @"transfer_buffer" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTransferBuffer)
+  => BG.HasField "transfer_buffer" (BG.Ptr SDL_GPUTransferBufferLocation) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"transfer_buffer")
+
+instance HasCField.HasCField SDL_GPUTransferBufferLocation "transfer_buffer" where
+  type
+    CFieldType SDL_GPUTransferBufferLocation "transfer_buffer" =
+      BG.Ptr SDL_GPUTransferBuffer
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "offset" SDL_GPUTransferBufferLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTransferBufferLocation{offset = y1, transfer_buffer = BG.getField @"transfer_buffer" x0}
+      , BG.getField @"offset" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "offset" (BG.Ptr SDL_GPUTransferBufferLocation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"offset")
+
+instance HasCField.HasCField SDL_GPUTransferBufferLocation "offset" where
+  type
+    CFieldType SDL_GPUTransferBufferLocation "offset" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+-- | A structure specifying a location in a texture.
+--
+--     Used when copying data from one texture to another.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CopyGPUTextureToTexture'
+--
+--     [C declaration]: @struct SDL_GPUTextureLocation@, defined at @SDL3\/SDL_gpu.h 1446:16@
+data SDL_GPUTextureLocation = SDL_GPUTextureLocation
+  { texture :: BG.Ptr SDL_GPUTexture
+  -- ^ The texture used in the copy operation.
+  --
+  --          [C declaration]: @texture@, defined at @SDL3\/SDL_gpu.h 1448:21@
+  , mip_level :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The mip level index of the location.
+  --
+  --          [C declaration]: @mip_level@, defined at @SDL3\/SDL_gpu.h 1449:12@
+  , layer :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The layer index of the location.
+  --
+  --          [C declaration]: @layer@, defined at @SDL3\/SDL_gpu.h 1450:12@
+  , x :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The left offset of the location.
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_gpu.h 1451:12@
+  , y :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The top offset of the location.
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_gpu.h 1452:12@
+  , z :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The front offset of the location.
+  --
+  --          [C declaration]: @z@, defined at @SDL3\/SDL_gpu.h 1453:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUTextureLocation where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUTextureLocation where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUTextureLocation
+        <*> HasCField.readRaw (BG.Proxy @"texture") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mip_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"layer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"z") ptr0
+
+instance Marshal.WriteRaw SDL_GPUTextureLocation where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUTextureLocation texture2 mip_level3 layer4 x5 y6 z7 ->
+            HasCField.writeRaw (BG.Proxy @"texture") ptr0 texture2
+              >> HasCField.writeRaw (BG.Proxy @"mip_level") ptr0 mip_level3
+              >> HasCField.writeRaw (BG.Proxy @"layer") ptr0 layer4
+              >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x5
+              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y6
+              >> HasCField.writeRaw (BG.Proxy @"z") ptr0 z7
+
+deriving via
+  Marshal.EquivStorable SDL_GPUTextureLocation
+  instance
+    BG.Storable SDL_GPUTextureLocation
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.CompatHasField.HasField "texture" SDL_GPUTextureLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureLocation
+            { texture = y1
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            }
+      , BG.getField @"texture" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.HasField "texture" (BG.Ptr SDL_GPUTextureLocation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"texture")
+
+instance HasCField.HasCField SDL_GPUTextureLocation "texture" where
+  type
+    CFieldType SDL_GPUTextureLocation "texture" =
+      BG.Ptr SDL_GPUTexture
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "mip_level" SDL_GPUTextureLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureLocation
+            { mip_level = y1
+            , texture = BG.getField @"texture" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            }
+      , BG.getField @"mip_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "mip_level" (BG.Ptr SDL_GPUTextureLocation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mip_level")
+
+instance HasCField.HasCField SDL_GPUTextureLocation "mip_level" where
+  type
+    CFieldType SDL_GPUTextureLocation "mip_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "layer" SDL_GPUTextureLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureLocation
+            { layer = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            }
+      , BG.getField @"layer" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "layer" (BG.Ptr SDL_GPUTextureLocation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"layer")
+
+instance HasCField.HasCField SDL_GPUTextureLocation "layer" where
+  type
+    CFieldType SDL_GPUTextureLocation "layer" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "x" SDL_GPUTextureLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureLocation
+            { x = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "x" (BG.Ptr SDL_GPUTextureLocation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_GPUTextureLocation "x" where
+  type
+    CFieldType SDL_GPUTextureLocation "x" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "y" SDL_GPUTextureLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureLocation
+            { y = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , z = BG.getField @"z" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "y" (BG.Ptr SDL_GPUTextureLocation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_GPUTextureLocation "y" where
+  type
+    CFieldType SDL_GPUTextureLocation "y" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "z" SDL_GPUTextureLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureLocation
+            { z = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"z" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "z" (BG.Ptr SDL_GPUTextureLocation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"z")
+
+instance HasCField.HasCField SDL_GPUTextureLocation "z" where
+  type
+    CFieldType SDL_GPUTextureLocation "z" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 24
+
+-- | A structure specifying a region of a texture.
+--
+--     Used when transferring data to or from a texture.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUTexture', 'sDL_DownloadFromGPUTexture', 'sDL_CreateGPUTexture'
+--
+--     [C declaration]: @struct SDL_GPUTextureRegion@, defined at @SDL3\/SDL_gpu.h 1467:16@
+data SDL_GPUTextureRegion = SDL_GPUTextureRegion
+  { texture :: BG.Ptr SDL_GPUTexture
+  -- ^ The texture used in the copy operation.
+  --
+  --          [C declaration]: @texture@, defined at @SDL3\/SDL_gpu.h 1469:21@
+  , mip_level :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The mip level index to transfer.
+  --
+  --          [C declaration]: @mip_level@, defined at @SDL3\/SDL_gpu.h 1470:12@
+  , layer :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The layer index to transfer.
+  --
+  --          [C declaration]: @layer@, defined at @SDL3\/SDL_gpu.h 1471:12@
+  , x :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The left offset of the region.
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_gpu.h 1472:12@
+  , y :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The top offset of the region.
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_gpu.h 1473:12@
+  , z :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The front offset of the region.
+  --
+  --          [C declaration]: @z@, defined at @SDL3\/SDL_gpu.h 1474:12@
+  , w :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The width of the region.
+  --
+  --          [C declaration]: @w@, defined at @SDL3\/SDL_gpu.h 1475:12@
+  , h :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The height of the region.
+  --
+  --          [C declaration]: @h@, defined at @SDL3\/SDL_gpu.h 1476:12@
+  , d :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The depth of the region.
+  --
+  --          [C declaration]: @d@, defined at @SDL3\/SDL_gpu.h 1477:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUTextureRegion where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUTextureRegion where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUTextureRegion
+        <*> HasCField.readRaw (BG.Proxy @"texture") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mip_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"layer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"z") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"w") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"h") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"d") ptr0
+
+instance Marshal.WriteRaw SDL_GPUTextureRegion where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUTextureRegion texture2 mip_level3 layer4 x5 y6 z7 w8 h9 d10 ->
+            HasCField.writeRaw (BG.Proxy @"texture") ptr0 texture2
+              >> HasCField.writeRaw (BG.Proxy @"mip_level") ptr0 mip_level3
+              >> HasCField.writeRaw (BG.Proxy @"layer") ptr0 layer4
+              >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x5
+              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y6
+              >> HasCField.writeRaw (BG.Proxy @"z") ptr0 z7
+              >> HasCField.writeRaw (BG.Proxy @"w") ptr0 w8
+              >> HasCField.writeRaw (BG.Proxy @"h") ptr0 h9
+              >> HasCField.writeRaw (BG.Proxy @"d") ptr0 d10
+
+deriving via Marshal.EquivStorable SDL_GPUTextureRegion instance BG.Storable SDL_GPUTextureRegion
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.CompatHasField.HasField "texture" SDL_GPUTextureRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureRegion
+            { texture = y1
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , d = BG.getField @"d" x0
+            }
+      , BG.getField @"texture" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.HasField "texture" (BG.Ptr SDL_GPUTextureRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"texture")
+
+instance HasCField.HasCField SDL_GPUTextureRegion "texture" where
+  type
+    CFieldType SDL_GPUTextureRegion "texture" =
+      BG.Ptr SDL_GPUTexture
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "mip_level" SDL_GPUTextureRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureRegion
+            { mip_level = y1
+            , texture = BG.getField @"texture" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , d = BG.getField @"d" x0
+            }
+      , BG.getField @"mip_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "mip_level" (BG.Ptr SDL_GPUTextureRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mip_level")
+
+instance HasCField.HasCField SDL_GPUTextureRegion "mip_level" where
+  type
+    CFieldType SDL_GPUTextureRegion "mip_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "layer" SDL_GPUTextureRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureRegion
+            { layer = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , d = BG.getField @"d" x0
+            }
+      , BG.getField @"layer" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "layer" (BG.Ptr SDL_GPUTextureRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"layer")
+
+instance HasCField.HasCField SDL_GPUTextureRegion "layer" where
+  type
+    CFieldType SDL_GPUTextureRegion "layer" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "x" SDL_GPUTextureRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureRegion
+            { x = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , d = BG.getField @"d" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "x" (BG.Ptr SDL_GPUTextureRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_GPUTextureRegion "x" where
+  type
+    CFieldType SDL_GPUTextureRegion "x" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "y" SDL_GPUTextureRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureRegion
+            { y = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , z = BG.getField @"z" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , d = BG.getField @"d" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "y" (BG.Ptr SDL_GPUTextureRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_GPUTextureRegion "y" where
+  type
+    CFieldType SDL_GPUTextureRegion "y" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "z" SDL_GPUTextureRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureRegion
+            { z = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , d = BG.getField @"d" x0
+            }
+      , BG.getField @"z" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "z" (BG.Ptr SDL_GPUTextureRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"z")
+
+instance HasCField.HasCField SDL_GPUTextureRegion "z" where
+  type
+    CFieldType SDL_GPUTextureRegion "z" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "w" SDL_GPUTextureRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureRegion
+            { w = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            , h = BG.getField @"h" x0
+            , d = BG.getField @"d" x0
+            }
+      , BG.getField @"w" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "w" (BG.Ptr SDL_GPUTextureRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"w")
+
+instance HasCField.HasCField SDL_GPUTextureRegion "w" where
+  type
+    CFieldType SDL_GPUTextureRegion "w" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "h" SDL_GPUTextureRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureRegion
+            { h = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            , w = BG.getField @"w" x0
+            , d = BG.getField @"d" x0
+            }
+      , BG.getField @"h" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "h" (BG.Ptr SDL_GPUTextureRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"h")
+
+instance HasCField.HasCField SDL_GPUTextureRegion "h" where
+  type
+    CFieldType SDL_GPUTextureRegion "h" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "d" SDL_GPUTextureRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureRegion
+            { d = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , z = BG.getField @"z" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"d" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "d" (BG.Ptr SDL_GPUTextureRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"d")
+
+instance HasCField.HasCField SDL_GPUTextureRegion "d" where
+  type
+    CFieldType SDL_GPUTextureRegion "d" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 36
+
+-- | A structure specifying a region of a texture used in the blit operation.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitGPUTexture'
+--
+--     [C declaration]: @struct SDL_GPUBlitRegion@, defined at @SDL3\/SDL_gpu.h 1487:16@
+data SDL_GPUBlitRegion = SDL_GPUBlitRegion
+  { texture :: BG.Ptr SDL_GPUTexture
+  -- ^ The texture.
+  --
+  --          [C declaration]: @texture@, defined at @SDL3\/SDL_gpu.h 1489:21@
+  , mip_level :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The mip level index of the region.
+  --
+  --          [C declaration]: @mip_level@, defined at @SDL3\/SDL_gpu.h 1490:12@
+  , layer_or_depth_plane :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ 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.
+  --
+  --          [C declaration]: @layer_or_depth_plane@, defined at @SDL3\/SDL_gpu.h 1491:12@
+  , x :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The left offset of the region.
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_gpu.h 1492:12@
+  , y :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The top offset of the region.
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_gpu.h 1493:12@
+  , w :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The width of the region.
+  --
+  --          [C declaration]: @w@, defined at @SDL3\/SDL_gpu.h 1494:12@
+  , h :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The height of the region.
+  --
+  --          [C declaration]: @h@, defined at @SDL3\/SDL_gpu.h 1495:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUBlitRegion where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUBlitRegion where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUBlitRegion
+        <*> HasCField.readRaw (BG.Proxy @"texture") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mip_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"layer_or_depth_plane") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"w") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"h") ptr0
+
+instance Marshal.WriteRaw SDL_GPUBlitRegion where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUBlitRegion texture2 mip_level3 layer_or_depth_plane4 x5 y6 w7 h8 ->
+            HasCField.writeRaw (BG.Proxy @"texture") ptr0 texture2
+              >> HasCField.writeRaw (BG.Proxy @"mip_level") ptr0 mip_level3
+              >> HasCField.writeRaw (BG.Proxy @"layer_or_depth_plane") ptr0 layer_or_depth_plane4
+              >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x5
+              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y6
+              >> HasCField.writeRaw (BG.Proxy @"w") ptr0 w7
+              >> HasCField.writeRaw (BG.Proxy @"h") ptr0 h8
+
+deriving via Marshal.EquivStorable SDL_GPUBlitRegion instance BG.Storable SDL_GPUBlitRegion
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.CompatHasField.HasField "texture" SDL_GPUBlitRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitRegion
+            { texture = y1
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"texture" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.HasField "texture" (BG.Ptr SDL_GPUBlitRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"texture")
+
+instance HasCField.HasCField SDL_GPUBlitRegion "texture" where
+  type
+    CFieldType SDL_GPUBlitRegion "texture" =
+      BG.Ptr SDL_GPUTexture
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "mip_level" SDL_GPUBlitRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitRegion
+            { mip_level = y1
+            , texture = BG.getField @"texture" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"mip_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "mip_level" (BG.Ptr SDL_GPUBlitRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mip_level")
+
+instance HasCField.HasCField SDL_GPUBlitRegion "mip_level" where
+  type
+    CFieldType SDL_GPUBlitRegion "mip_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "layer_or_depth_plane" SDL_GPUBlitRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitRegion
+            { layer_or_depth_plane = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"layer_or_depth_plane" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "layer_or_depth_plane" (BG.Ptr SDL_GPUBlitRegion) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"layer_or_depth_plane")
+
+instance HasCField.HasCField SDL_GPUBlitRegion "layer_or_depth_plane" where
+  type
+    CFieldType SDL_GPUBlitRegion "layer_or_depth_plane" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "x" SDL_GPUBlitRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitRegion
+            { x = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "x" (BG.Ptr SDL_GPUBlitRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_GPUBlitRegion "x" where
+  type
+    CFieldType SDL_GPUBlitRegion "x" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "y" SDL_GPUBlitRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitRegion
+            { y = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , x = BG.getField @"x" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "y" (BG.Ptr SDL_GPUBlitRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_GPUBlitRegion "y" where
+  type
+    CFieldType SDL_GPUBlitRegion "y" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "w" SDL_GPUBlitRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitRegion
+            { w = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"w" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "w" (BG.Ptr SDL_GPUBlitRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"w")
+
+instance HasCField.HasCField SDL_GPUBlitRegion "w" where
+  type
+    CFieldType SDL_GPUBlitRegion "w" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "h" SDL_GPUBlitRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitRegion
+            { h = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            }
+      , BG.getField @"h" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "h" (BG.Ptr SDL_GPUBlitRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"h")
+
+instance HasCField.HasCField SDL_GPUBlitRegion "h" where
+  type
+    CFieldType SDL_GPUBlitRegion "h" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 28
+
+-- | A structure specifying a location in a buffer.
+--
+--     Used when copying data between buffers.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CopyGPUBufferToBuffer'
+--
+--     [C declaration]: @struct SDL_GPUBufferLocation@, defined at @SDL3\/SDL_gpu.h 1507:16@
+data SDL_GPUBufferLocation = SDL_GPUBufferLocation
+  { buffer :: BG.Ptr SDL_GPUBuffer
+  -- ^ The buffer.
+  --
+  --          [C declaration]: @buffer@, defined at @SDL3\/SDL_gpu.h 1509:20@
+  , offset :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The starting byte within the buffer.
+  --
+  --          [C declaration]: @offset@, defined at @SDL3\/SDL_gpu.h 1510:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUBufferLocation where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUBufferLocation where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUBufferLocation
+        <*> HasCField.readRaw (BG.Proxy @"buffer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"offset") ptr0
+
+instance Marshal.WriteRaw SDL_GPUBufferLocation where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUBufferLocation buffer2 offset3 ->
+            HasCField.writeRaw (BG.Proxy @"buffer") ptr0 buffer2
+              >> HasCField.writeRaw (BG.Proxy @"offset") ptr0 offset3
+
+deriving via Marshal.EquivStorable SDL_GPUBufferLocation instance BG.Storable SDL_GPUBufferLocation
+
+instance
+  (ty ~ BG.Ptr SDL_GPUBuffer)
+  => BG.CompatHasField.HasField "buffer" SDL_GPUBufferLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferLocation{buffer = y1, offset = BG.getField @"offset" x0}
+      , BG.getField @"buffer" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUBuffer)
+  => BG.HasField "buffer" (BG.Ptr SDL_GPUBufferLocation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"buffer")
+
+instance HasCField.HasCField SDL_GPUBufferLocation "buffer" where
+  type
+    CFieldType SDL_GPUBufferLocation "buffer" =
+      BG.Ptr SDL_GPUBuffer
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "offset" SDL_GPUBufferLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferLocation{offset = y1, buffer = BG.getField @"buffer" x0}
+      , BG.getField @"offset" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "offset" (BG.Ptr SDL_GPUBufferLocation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"offset")
+
+instance HasCField.HasCField SDL_GPUBufferLocation "offset" where
+  type
+    CFieldType SDL_GPUBufferLocation "offset" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+-- | A structure specifying a region of a buffer.
+--
+--     Used when transferring data to or from buffers.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUBuffer', 'sDL_DownloadFromGPUBuffer'
+--
+--     [C declaration]: @struct SDL_GPUBufferRegion@, defined at @SDL3\/SDL_gpu.h 1523:16@
+data SDL_GPUBufferRegion = SDL_GPUBufferRegion
+  { buffer :: BG.Ptr SDL_GPUBuffer
+  -- ^ The buffer.
+  --
+  --          [C declaration]: @buffer@, defined at @SDL3\/SDL_gpu.h 1525:20@
+  , offset :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The starting byte within the buffer.
+  --
+  --          [C declaration]: @offset@, defined at @SDL3\/SDL_gpu.h 1526:12@
+  , size :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The size in bytes of the region.
+  --
+  --          [C declaration]: @size@, defined at @SDL3\/SDL_gpu.h 1527:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUBufferRegion where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUBufferRegion where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUBufferRegion
+        <*> HasCField.readRaw (BG.Proxy @"buffer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"offset") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"size") ptr0
+
+instance Marshal.WriteRaw SDL_GPUBufferRegion where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUBufferRegion buffer2 offset3 size4 ->
+            HasCField.writeRaw (BG.Proxy @"buffer") ptr0 buffer2
+              >> HasCField.writeRaw (BG.Proxy @"offset") ptr0 offset3
+              >> HasCField.writeRaw (BG.Proxy @"size") ptr0 size4
+
+deriving via Marshal.EquivStorable SDL_GPUBufferRegion instance BG.Storable SDL_GPUBufferRegion
+
+instance
+  (ty ~ BG.Ptr SDL_GPUBuffer)
+  => BG.CompatHasField.HasField "buffer" SDL_GPUBufferRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferRegion{buffer = y1, offset = BG.getField @"offset" x0, size = BG.getField @"size" x0}
+      , BG.getField @"buffer" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUBuffer)
+  => BG.HasField "buffer" (BG.Ptr SDL_GPUBufferRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"buffer")
+
+instance HasCField.HasCField SDL_GPUBufferRegion "buffer" where
+  type
+    CFieldType SDL_GPUBufferRegion "buffer" =
+      BG.Ptr SDL_GPUBuffer
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "offset" SDL_GPUBufferRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferRegion{offset = y1, buffer = BG.getField @"buffer" x0, size = BG.getField @"size" x0}
+      , BG.getField @"offset" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "offset" (BG.Ptr SDL_GPUBufferRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"offset")
+
+instance HasCField.HasCField SDL_GPUBufferRegion "offset" where
+  type
+    CFieldType SDL_GPUBufferRegion "offset" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "size" SDL_GPUBufferRegion ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferRegion
+            { size = y1
+            , buffer = BG.getField @"buffer" x0
+            , offset = BG.getField @"offset" x0
+            }
+      , BG.getField @"size" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "size" (BG.Ptr SDL_GPUBufferRegion) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"size")
+
+instance HasCField.HasCField SDL_GPUBufferRegion "size" where
+  type
+    CFieldType SDL_GPUBufferRegion "size" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+-- | A structure specifying the parameters of an indirect draw command.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DrawGPUPrimitivesIndirect'
+--
+--     [C declaration]: @struct SDL_GPUIndirectDrawCommand@, defined at @SDL3\/SDL_gpu.h 1544:16@
+data SDL_GPUIndirectDrawCommand = SDL_GPUIndirectDrawCommand
+  { num_vertices :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of vertices to draw.
+  --
+  --          [C declaration]: @num_vertices@, defined at @SDL3\/SDL_gpu.h 1546:12@
+  , num_instances :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of instances to draw.
+  --
+  --          [C declaration]: @num_instances@, defined at @SDL3\/SDL_gpu.h 1547:12@
+  , first_vertex :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The index of the first vertex to draw.
+  --
+  --          [C declaration]: @first_vertex@, defined at @SDL3\/SDL_gpu.h 1548:12@
+  , first_instance :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The ID of the first instance to draw.
+  --
+  --          [C declaration]: @first_instance@, defined at @SDL3\/SDL_gpu.h 1549:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUIndirectDrawCommand where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUIndirectDrawCommand where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUIndirectDrawCommand
+        <*> HasCField.readRaw (BG.Proxy @"num_vertices") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_instances") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"first_vertex") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"first_instance") ptr0
+
+instance Marshal.WriteRaw SDL_GPUIndirectDrawCommand where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUIndirectDrawCommand
+            num_vertices2
+            num_instances3
+            first_vertex4
+            first_instance5 ->
+              HasCField.writeRaw (BG.Proxy @"num_vertices") ptr0 num_vertices2
+                >> HasCField.writeRaw (BG.Proxy @"num_instances") ptr0 num_instances3
+                >> HasCField.writeRaw (BG.Proxy @"first_vertex") ptr0 first_vertex4
+                >> HasCField.writeRaw (BG.Proxy @"first_instance") ptr0 first_instance5
+
+deriving via
+  Marshal.EquivStorable SDL_GPUIndirectDrawCommand
+  instance
+    BG.Storable SDL_GPUIndirectDrawCommand
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_vertices" SDL_GPUIndirectDrawCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndirectDrawCommand
+            { num_vertices = y1
+            , num_instances = BG.getField @"num_instances" x0
+            , first_vertex = BG.getField @"first_vertex" x0
+            , first_instance = BG.getField @"first_instance" x0
+            }
+      , BG.getField @"num_vertices" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_vertices" (BG.Ptr SDL_GPUIndirectDrawCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_vertices")
+
+instance HasCField.HasCField SDL_GPUIndirectDrawCommand "num_vertices" where
+  type
+    CFieldType SDL_GPUIndirectDrawCommand "num_vertices" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_instances" SDL_GPUIndirectDrawCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndirectDrawCommand
+            { num_instances = y1
+            , num_vertices = BG.getField @"num_vertices" x0
+            , first_vertex = BG.getField @"first_vertex" x0
+            , first_instance = BG.getField @"first_instance" x0
+            }
+      , BG.getField @"num_instances" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_instances" (BG.Ptr SDL_GPUIndirectDrawCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_instances")
+
+instance HasCField.HasCField SDL_GPUIndirectDrawCommand "num_instances" where
+  type
+    CFieldType SDL_GPUIndirectDrawCommand "num_instances" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "first_vertex" SDL_GPUIndirectDrawCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndirectDrawCommand
+            { first_vertex = y1
+            , num_vertices = BG.getField @"num_vertices" x0
+            , num_instances = BG.getField @"num_instances" x0
+            , first_instance = BG.getField @"first_instance" x0
+            }
+      , BG.getField @"first_vertex" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "first_vertex" (BG.Ptr SDL_GPUIndirectDrawCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"first_vertex")
+
+instance HasCField.HasCField SDL_GPUIndirectDrawCommand "first_vertex" where
+  type
+    CFieldType SDL_GPUIndirectDrawCommand "first_vertex" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "first_instance" SDL_GPUIndirectDrawCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndirectDrawCommand
+            { first_instance = y1
+            , num_vertices = BG.getField @"num_vertices" x0
+            , num_instances = BG.getField @"num_instances" x0
+            , first_vertex = BG.getField @"first_vertex" x0
+            }
+      , BG.getField @"first_instance" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "first_instance" (BG.Ptr SDL_GPUIndirectDrawCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"first_instance")
+
+instance HasCField.HasCField SDL_GPUIndirectDrawCommand "first_instance" where
+  type
+    CFieldType SDL_GPUIndirectDrawCommand "first_instance" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+-- | A structure specifying the parameters of an indexed indirect draw command.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DrawGPUIndexedPrimitivesIndirect'
+--
+--     [C declaration]: @struct SDL_GPUIndexedIndirectDrawCommand@, defined at @SDL3\/SDL_gpu.h 1566:16@
+data SDL_GPUIndexedIndirectDrawCommand = SDL_GPUIndexedIndirectDrawCommand
+  { num_indices :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of indices to draw per instance.
+  --
+  --          [C declaration]: @num_indices@, defined at @SDL3\/SDL_gpu.h 1568:12@
+  , num_instances :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of instances to draw.
+  --
+  --          [C declaration]: @num_instances@, defined at @SDL3\/SDL_gpu.h 1569:12@
+  , first_index :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The base index within the index buffer.
+  --
+  --          [C declaration]: @first_index@, defined at @SDL3\/SDL_gpu.h 1570:12@
+  , vertex_offset :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The value added to the vertex index before indexing into the vertex buffer.
+  --
+  --          [C declaration]: @vertex_offset@, defined at @SDL3\/SDL_gpu.h 1571:12@
+  , first_instance :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The ID of the first instance to draw.
+  --
+  --          [C declaration]: @first_instance@, defined at @SDL3\/SDL_gpu.h 1572:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUIndexedIndirectDrawCommand where
+  staticSizeOf = \_ -> (20 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUIndexedIndirectDrawCommand where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUIndexedIndirectDrawCommand
+        <*> HasCField.readRaw (BG.Proxy @"num_indices") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_instances") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"first_index") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"vertex_offset") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"first_instance") ptr0
+
+instance Marshal.WriteRaw SDL_GPUIndexedIndirectDrawCommand where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUIndexedIndirectDrawCommand
+            num_indices2
+            num_instances3
+            first_index4
+            vertex_offset5
+            first_instance6 ->
+              HasCField.writeRaw (BG.Proxy @"num_indices") ptr0 num_indices2
+                >> HasCField.writeRaw (BG.Proxy @"num_instances") ptr0 num_instances3
+                >> HasCField.writeRaw (BG.Proxy @"first_index") ptr0 first_index4
+                >> HasCField.writeRaw (BG.Proxy @"vertex_offset") ptr0 vertex_offset5
+                >> HasCField.writeRaw (BG.Proxy @"first_instance") ptr0 first_instance6
+
+deriving via
+  Marshal.EquivStorable SDL_GPUIndexedIndirectDrawCommand
+  instance
+    BG.Storable SDL_GPUIndexedIndirectDrawCommand
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_indices" SDL_GPUIndexedIndirectDrawCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndexedIndirectDrawCommand
+            { num_indices = y1
+            , num_instances = BG.getField @"num_instances" x0
+            , first_index = BG.getField @"first_index" x0
+            , vertex_offset = BG.getField @"vertex_offset" x0
+            , first_instance = BG.getField @"first_instance" x0
+            }
+      , BG.getField @"num_indices" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_indices" (BG.Ptr SDL_GPUIndexedIndirectDrawCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_indices")
+
+instance HasCField.HasCField SDL_GPUIndexedIndirectDrawCommand "num_indices" where
+  type
+    CFieldType SDL_GPUIndexedIndirectDrawCommand "num_indices" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_instances" SDL_GPUIndexedIndirectDrawCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndexedIndirectDrawCommand
+            { num_instances = y1
+            , num_indices = BG.getField @"num_indices" x0
+            , first_index = BG.getField @"first_index" x0
+            , vertex_offset = BG.getField @"vertex_offset" x0
+            , first_instance = BG.getField @"first_instance" x0
+            }
+      , BG.getField @"num_instances" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_instances" (BG.Ptr SDL_GPUIndexedIndirectDrawCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_instances")
+
+instance HasCField.HasCField SDL_GPUIndexedIndirectDrawCommand "num_instances" where
+  type
+    CFieldType SDL_GPUIndexedIndirectDrawCommand "num_instances" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "first_index" SDL_GPUIndexedIndirectDrawCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndexedIndirectDrawCommand
+            { first_index = y1
+            , num_indices = BG.getField @"num_indices" x0
+            , num_instances = BG.getField @"num_instances" x0
+            , vertex_offset = BG.getField @"vertex_offset" x0
+            , first_instance = BG.getField @"first_instance" x0
+            }
+      , BG.getField @"first_index" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "first_index" (BG.Ptr SDL_GPUIndexedIndirectDrawCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"first_index")
+
+instance HasCField.HasCField SDL_GPUIndexedIndirectDrawCommand "first_index" where
+  type
+    CFieldType SDL_GPUIndexedIndirectDrawCommand "first_index" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "vertex_offset" SDL_GPUIndexedIndirectDrawCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndexedIndirectDrawCommand
+            { vertex_offset = y1
+            , num_indices = BG.getField @"num_indices" x0
+            , num_instances = BG.getField @"num_instances" x0
+            , first_index = BG.getField @"first_index" x0
+            , first_instance = BG.getField @"first_instance" x0
+            }
+      , BG.getField @"vertex_offset" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "vertex_offset" (BG.Ptr SDL_GPUIndexedIndirectDrawCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"vertex_offset")
+
+instance HasCField.HasCField SDL_GPUIndexedIndirectDrawCommand "vertex_offset" where
+  type
+    CFieldType SDL_GPUIndexedIndirectDrawCommand "vertex_offset" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "first_instance" SDL_GPUIndexedIndirectDrawCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndexedIndirectDrawCommand
+            { first_instance = y1
+            , num_indices = BG.getField @"num_indices" x0
+            , num_instances = BG.getField @"num_instances" x0
+            , first_index = BG.getField @"first_index" x0
+            , vertex_offset = BG.getField @"vertex_offset" x0
+            }
+      , BG.getField @"first_instance" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "first_instance" (BG.Ptr SDL_GPUIndexedIndirectDrawCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"first_instance")
+
+instance HasCField.HasCField SDL_GPUIndexedIndirectDrawCommand "first_instance" where
+  type
+    CFieldType SDL_GPUIndexedIndirectDrawCommand "first_instance" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 16
+
+-- | A structure specifying the parameters of an indexed dispatch command.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DispatchGPUComputeIndirect'
+--
+--     [C declaration]: @struct SDL_GPUIndirectDispatchCommand@, defined at @SDL3\/SDL_gpu.h 1582:16@
+data SDL_GPUIndirectDispatchCommand = SDL_GPUIndirectDispatchCommand
+  { groupcount_x :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of local workgroups to dispatch in the X dimension.
+  --
+  --          [C declaration]: @groupcount_x@, defined at @SDL3\/SDL_gpu.h 1584:12@
+  , groupcount_y :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of local workgroups to dispatch in the Y dimension.
+  --
+  --          [C declaration]: @groupcount_y@, defined at @SDL3\/SDL_gpu.h 1585:12@
+  , groupcount_z :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of local workgroups to dispatch in the Z dimension.
+  --
+  --          [C declaration]: @groupcount_z@, defined at @SDL3\/SDL_gpu.h 1586:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUIndirectDispatchCommand where
+  staticSizeOf = \_ -> (12 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUIndirectDispatchCommand where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUIndirectDispatchCommand
+        <*> HasCField.readRaw (BG.Proxy @"groupcount_x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"groupcount_y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"groupcount_z") ptr0
+
+instance Marshal.WriteRaw SDL_GPUIndirectDispatchCommand where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUIndirectDispatchCommand groupcount_x2 groupcount_y3 groupcount_z4 ->
+            HasCField.writeRaw (BG.Proxy @"groupcount_x") ptr0 groupcount_x2
+              >> HasCField.writeRaw (BG.Proxy @"groupcount_y") ptr0 groupcount_y3
+              >> HasCField.writeRaw (BG.Proxy @"groupcount_z") ptr0 groupcount_z4
+
+deriving via
+  Marshal.EquivStorable SDL_GPUIndirectDispatchCommand
+  instance
+    BG.Storable SDL_GPUIndirectDispatchCommand
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "groupcount_x" SDL_GPUIndirectDispatchCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndirectDispatchCommand
+            { groupcount_x = y1
+            , groupcount_y = BG.getField @"groupcount_y" x0
+            , groupcount_z = BG.getField @"groupcount_z" x0
+            }
+      , BG.getField @"groupcount_x" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "groupcount_x" (BG.Ptr SDL_GPUIndirectDispatchCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"groupcount_x")
+
+instance HasCField.HasCField SDL_GPUIndirectDispatchCommand "groupcount_x" where
+  type
+    CFieldType SDL_GPUIndirectDispatchCommand "groupcount_x" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "groupcount_y" SDL_GPUIndirectDispatchCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndirectDispatchCommand
+            { groupcount_y = y1
+            , groupcount_x = BG.getField @"groupcount_x" x0
+            , groupcount_z = BG.getField @"groupcount_z" x0
+            }
+      , BG.getField @"groupcount_y" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "groupcount_y" (BG.Ptr SDL_GPUIndirectDispatchCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"groupcount_y")
+
+instance HasCField.HasCField SDL_GPUIndirectDispatchCommand "groupcount_y" where
+  type
+    CFieldType SDL_GPUIndirectDispatchCommand "groupcount_y" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "groupcount_z" SDL_GPUIndirectDispatchCommand ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUIndirectDispatchCommand
+            { groupcount_z = y1
+            , groupcount_x = BG.getField @"groupcount_x" x0
+            , groupcount_y = BG.getField @"groupcount_y" x0
+            }
+      , BG.getField @"groupcount_z" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "groupcount_z" (BG.Ptr SDL_GPUIndirectDispatchCommand) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"groupcount_z")
+
+instance HasCField.HasCField SDL_GPUIndirectDispatchCommand "groupcount_z" where
+  type
+    CFieldType SDL_GPUIndirectDispatchCommand "groupcount_z" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+-- | A structure specifying the parameters of a sampler.
+--
+--     Note that mip_lod_bias is a no-op for the Metal driver. For Metal, LOD bias must be applied via shader instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUSampler', 'SDL_GPUFilter', 'SDL_GPUSamplerMipmapMode', 'SDL_GPUSamplerAddressMode', 'SDL_GPUCompareOp'
+--
+--     [C declaration]: @struct SDL_GPUSamplerCreateInfo@, defined at @SDL3\/SDL_gpu.h 1605:16@
+data SDL_GPUSamplerCreateInfo = SDL_GPUSamplerCreateInfo
+  { min_filter :: SDL_GPUFilter
+  -- ^ The minification filter to apply to lookups.
+  --
+  --          [C declaration]: @min_filter@, defined at @SDL3\/SDL_gpu.h 1607:19@
+  , mag_filter :: SDL_GPUFilter
+  -- ^ The magnification filter to apply to lookups.
+  --
+  --          [C declaration]: @mag_filter@, defined at @SDL3\/SDL_gpu.h 1608:19@
+  , mipmap_mode :: SDL_GPUSamplerMipmapMode
+  -- ^ The mipmap filter to apply to lookups.
+  --
+  --          [C declaration]: @mipmap_mode@, defined at @SDL3\/SDL_gpu.h 1609:30@
+  , address_mode_u :: SDL_GPUSamplerAddressMode
+  -- ^ The addressing mode for U coordinates outside [0, 1).
+  --
+  --          [C declaration]: @address_mode_u@, defined at @SDL3\/SDL_gpu.h 1610:31@
+  , address_mode_v :: SDL_GPUSamplerAddressMode
+  -- ^ The addressing mode for V coordinates outside [0, 1).
+  --
+  --          [C declaration]: @address_mode_v@, defined at @SDL3\/SDL_gpu.h 1611:31@
+  , address_mode_w :: SDL_GPUSamplerAddressMode
+  -- ^ The addressing mode for W coordinates outside [0, 1).
+  --
+  --          [C declaration]: @address_mode_w@, defined at @SDL3\/SDL_gpu.h 1612:31@
+  , mip_lod_bias :: BG.CFloat
+  -- ^ The bias to be added to mipmap LOD calculation.
+  --
+  --          [C declaration]: @mip_lod_bias@, defined at @SDL3\/SDL_gpu.h 1613:11@
+  , max_anisotropy :: BG.CFloat
+  -- ^ The anisotropy value clamp used by the sampler. If enable_anisotropy is false, this is ignored.
+  --
+  --          [C declaration]: @max_anisotropy@, defined at @SDL3\/SDL_gpu.h 1614:11@
+  , compare_op :: SDL_GPUCompareOp
+  -- ^ The comparison operator to apply to fetched data before filtering.
+  --
+  --          [C declaration]: @compare_op@, defined at @SDL3\/SDL_gpu.h 1615:22@
+  , min_lod :: BG.CFloat
+  -- ^ Clamps the minimum of the computed LOD value.
+  --
+  --          [C declaration]: @min_lod@, defined at @SDL3\/SDL_gpu.h 1616:11@
+  , max_lod :: BG.CFloat
+  -- ^ Clamps the maximum of the computed LOD value.
+  --
+  --          [C declaration]: @max_lod@, defined at @SDL3\/SDL_gpu.h 1617:11@
+  , enable_anisotropy :: BG.CBool
+  -- ^ true to enable anisotropic filtering.
+  --
+  --          [C declaration]: @enable_anisotropy@, defined at @SDL3\/SDL_gpu.h 1618:10@
+  , enable_compare :: BG.CBool
+  -- ^ true to enable comparison against a reference value during lookups.
+  --
+  --          [C declaration]: @enable_compare@, defined at @SDL3\/SDL_gpu.h 1619:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_gpu.h 1620:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_gpu.h 1621:11@
+  , props :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^ A properties ID for extensions. Should be 0 if no extensions are needed.
+  --
+  --          [C declaration]: @props@, defined at @SDL3\/SDL_gpu.h 1623:22@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUSamplerCreateInfo where
+  staticSizeOf = \_ -> (52 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUSamplerCreateInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUSamplerCreateInfo
+        <*> HasCField.readRaw (BG.Proxy @"min_filter") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mag_filter") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mipmap_mode") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"address_mode_u") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"address_mode_v") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"address_mode_w") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mip_lod_bias") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"max_anisotropy") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"compare_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"min_lod") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"max_lod") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_anisotropy") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_compare") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"props") ptr0
+
+instance Marshal.WriteRaw SDL_GPUSamplerCreateInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUSamplerCreateInfo
+            min_filter2
+            mag_filter3
+            mipmap_mode4
+            address_mode_u5
+            address_mode_v6
+            address_mode_w7
+            mip_lod_bias8
+            max_anisotropy9
+            compare_op10
+            min_lod11
+            max_lod12
+            enable_anisotropy13
+            enable_compare14
+            padding115
+            padding216
+            props17 ->
+              HasCField.writeRaw (BG.Proxy @"min_filter") ptr0 min_filter2
+                >> HasCField.writeRaw (BG.Proxy @"mag_filter") ptr0 mag_filter3
+                >> HasCField.writeRaw (BG.Proxy @"mipmap_mode") ptr0 mipmap_mode4
+                >> HasCField.writeRaw (BG.Proxy @"address_mode_u") ptr0 address_mode_u5
+                >> HasCField.writeRaw (BG.Proxy @"address_mode_v") ptr0 address_mode_v6
+                >> HasCField.writeRaw (BG.Proxy @"address_mode_w") ptr0 address_mode_w7
+                >> HasCField.writeRaw (BG.Proxy @"mip_lod_bias") ptr0 mip_lod_bias8
+                >> HasCField.writeRaw (BG.Proxy @"max_anisotropy") ptr0 max_anisotropy9
+                >> HasCField.writeRaw (BG.Proxy @"compare_op") ptr0 compare_op10
+                >> HasCField.writeRaw (BG.Proxy @"min_lod") ptr0 min_lod11
+                >> HasCField.writeRaw (BG.Proxy @"max_lod") ptr0 max_lod12
+                >> HasCField.writeRaw (BG.Proxy @"enable_anisotropy") ptr0 enable_anisotropy13
+                >> HasCField.writeRaw (BG.Proxy @"enable_compare") ptr0 enable_compare14
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding115
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding216
+                >> HasCField.writeRaw (BG.Proxy @"props") ptr0 props17
+
+deriving via
+  Marshal.EquivStorable SDL_GPUSamplerCreateInfo
+  instance
+    BG.Storable SDL_GPUSamplerCreateInfo
+
+instance
+  (ty ~ SDL_GPUFilter)
+  => BG.CompatHasField.HasField "min_filter" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { min_filter = y1
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"min_filter" x0
+      )
+
+instance
+  (ty ~ SDL_GPUFilter)
+  => BG.HasField "min_filter" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"min_filter")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "min_filter" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "min_filter" =
+      SDL_GPUFilter
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_GPUFilter)
+  => BG.CompatHasField.HasField "mag_filter" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { mag_filter = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"mag_filter" x0
+      )
+
+instance
+  (ty ~ SDL_GPUFilter)
+  => BG.HasField "mag_filter" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mag_filter")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "mag_filter" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "mag_filter" =
+      SDL_GPUFilter
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL_GPUSamplerMipmapMode)
+  => BG.CompatHasField.HasField "mipmap_mode" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { mipmap_mode = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"mipmap_mode" x0
+      )
+
+instance
+  (ty ~ SDL_GPUSamplerMipmapMode)
+  => BG.HasField "mipmap_mode" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"mipmap_mode")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "mipmap_mode" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "mipmap_mode" =
+      SDL_GPUSamplerMipmapMode
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL_GPUSamplerAddressMode)
+  => BG.CompatHasField.HasField "address_mode_u" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { address_mode_u = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"address_mode_u" x0
+      )
+
+instance
+  (ty ~ SDL_GPUSamplerAddressMode)
+  => BG.HasField "address_mode_u" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"address_mode_u")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "address_mode_u" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "address_mode_u" =
+      SDL_GPUSamplerAddressMode
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL_GPUSamplerAddressMode)
+  => BG.CompatHasField.HasField "address_mode_v" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { address_mode_v = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"address_mode_v" x0
+      )
+
+instance
+  (ty ~ SDL_GPUSamplerAddressMode)
+  => BG.HasField "address_mode_v" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"address_mode_v")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "address_mode_v" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "address_mode_v" =
+      SDL_GPUSamplerAddressMode
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL_GPUSamplerAddressMode)
+  => BG.CompatHasField.HasField "address_mode_w" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { address_mode_w = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"address_mode_w" x0
+      )
+
+instance
+  (ty ~ SDL_GPUSamplerAddressMode)
+  => BG.HasField "address_mode_w" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"address_mode_w")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "address_mode_w" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "address_mode_w" =
+      SDL_GPUSamplerAddressMode
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "mip_lod_bias" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { mip_lod_bias = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"mip_lod_bias" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "mip_lod_bias" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"mip_lod_bias")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "mip_lod_bias" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "mip_lod_bias" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "max_anisotropy" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { max_anisotropy = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"max_anisotropy" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "max_anisotropy" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"max_anisotropy")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "max_anisotropy" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "max_anisotropy" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL_GPUCompareOp)
+  => BG.CompatHasField.HasField "compare_op" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { compare_op = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"compare_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUCompareOp)
+  => BG.HasField "compare_op" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"compare_op")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "compare_op" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "compare_op" =
+      SDL_GPUCompareOp
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "min_lod" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { min_lod = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"min_lod" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "min_lod" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"min_lod")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "min_lod" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "min_lod" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "max_lod" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { max_lod = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"max_lod" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "max_lod" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"max_lod")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "max_lod" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "max_lod" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_anisotropy" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { enable_anisotropy = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"enable_anisotropy" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_anisotropy" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_anisotropy")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "enable_anisotropy" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "enable_anisotropy" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 44
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_compare" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { enable_compare = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"enable_compare" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_compare" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_compare")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "enable_compare" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "enable_compare" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 45
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { padding1 = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding2 = BG.getField @"padding2" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "padding1" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 46
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { padding2 = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "padding2" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 47
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.CompatHasField.HasField "props" SDL_GPUSamplerCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUSamplerCreateInfo
+            { props = y1
+            , min_filter = BG.getField @"min_filter" x0
+            , mag_filter = BG.getField @"mag_filter" x0
+            , mipmap_mode = BG.getField @"mipmap_mode" x0
+            , address_mode_u = BG.getField @"address_mode_u" x0
+            , address_mode_v = BG.getField @"address_mode_v" x0
+            , address_mode_w = BG.getField @"address_mode_w" x0
+            , mip_lod_bias = BG.getField @"mip_lod_bias" x0
+            , max_anisotropy = BG.getField @"max_anisotropy" x0
+            , compare_op = BG.getField @"compare_op" x0
+            , min_lod = BG.getField @"min_lod" x0
+            , max_lod = BG.getField @"max_lod" x0
+            , enable_anisotropy = BG.getField @"enable_anisotropy" x0
+            , enable_compare = BG.getField @"enable_compare" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"props" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.HasField "props" (BG.Ptr SDL_GPUSamplerCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"props")
+
+instance HasCField.HasCField SDL_GPUSamplerCreateInfo "props" where
+  type
+    CFieldType SDL_GPUSamplerCreateInfo "props" =
+      SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+
+  offset# = \_ -> \_ -> 48
+
+-- | A structure specifying the parameters of vertex buffers used in a graphics pipeline.
+--
+--     When you call SDL_BindGPUVertexBuffers, you specify the binding slots of the vertex buffers. For example if you called SDL_BindGPUVertexBuffers with 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.
+--
+--     Vertex attributes are linked to buffers via the buffer_slot field of '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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GPUVertexAttribute', 'SDL_GPUVertexInputRate'
+--
+--     [C declaration]: @struct SDL_GPUVertexBufferDescription@, defined at @SDL3\/SDL_gpu.h 1644:16@
+data SDL_GPUVertexBufferDescription = SDL_GPUVertexBufferDescription
+  { slot :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The binding slot of the vertex buffer.
+  --
+  --          [C declaration]: @slot@, defined at @SDL3\/SDL_gpu.h 1646:12@
+  , pitch :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The size of a single element + the offset between elements.
+  --
+  --          [C declaration]: @pitch@, defined at @SDL3\/SDL_gpu.h 1647:12@
+  , input_rate :: SDL_GPUVertexInputRate
+  -- ^ Whether attribute addressing is a function of the vertex index or instance index.
+  --
+  --          [C declaration]: @input_rate@, defined at @SDL3\/SDL_gpu.h 1648:28@
+  , instance_step_rate :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Reserved for future use. Must be set to 0.
+  --
+  --          [C declaration]: @instance_step_rate@, defined at @SDL3\/SDL_gpu.h 1649:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUVertexBufferDescription where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUVertexBufferDescription where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUVertexBufferDescription
+        <*> HasCField.readRaw (BG.Proxy @"slot") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pitch") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"input_rate") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"instance_step_rate") ptr0
+
+instance Marshal.WriteRaw SDL_GPUVertexBufferDescription where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUVertexBufferDescription slot2 pitch3 input_rate4 instance_step_rate5 ->
+            HasCField.writeRaw (BG.Proxy @"slot") ptr0 slot2
+              >> HasCField.writeRaw (BG.Proxy @"pitch") ptr0 pitch3
+              >> HasCField.writeRaw (BG.Proxy @"input_rate") ptr0 input_rate4
+              >> HasCField.writeRaw (BG.Proxy @"instance_step_rate") ptr0 instance_step_rate5
+
+deriving via
+  Marshal.EquivStorable SDL_GPUVertexBufferDescription
+  instance
+    BG.Storable SDL_GPUVertexBufferDescription
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "slot" SDL_GPUVertexBufferDescription ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexBufferDescription
+            { slot = y1
+            , pitch = BG.getField @"pitch" x0
+            , input_rate = BG.getField @"input_rate" x0
+            , instance_step_rate = BG.getField @"instance_step_rate" x0
+            }
+      , BG.getField @"slot" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "slot" (BG.Ptr SDL_GPUVertexBufferDescription) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"slot")
+
+instance HasCField.HasCField SDL_GPUVertexBufferDescription "slot" where
+  type
+    CFieldType SDL_GPUVertexBufferDescription "slot" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "pitch" SDL_GPUVertexBufferDescription ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexBufferDescription
+            { pitch = y1
+            , slot = BG.getField @"slot" x0
+            , input_rate = BG.getField @"input_rate" x0
+            , instance_step_rate = BG.getField @"instance_step_rate" x0
+            }
+      , BG.getField @"pitch" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "pitch" (BG.Ptr SDL_GPUVertexBufferDescription) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pitch")
+
+instance HasCField.HasCField SDL_GPUVertexBufferDescription "pitch" where
+  type
+    CFieldType SDL_GPUVertexBufferDescription "pitch" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL_GPUVertexInputRate)
+  => BG.CompatHasField.HasField "input_rate" SDL_GPUVertexBufferDescription ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexBufferDescription
+            { input_rate = y1
+            , slot = BG.getField @"slot" x0
+            , pitch = BG.getField @"pitch" x0
+            , instance_step_rate = BG.getField @"instance_step_rate" x0
+            }
+      , BG.getField @"input_rate" x0
+      )
+
+instance
+  (ty ~ SDL_GPUVertexInputRate)
+  => BG.HasField "input_rate" (BG.Ptr SDL_GPUVertexBufferDescription) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"input_rate")
+
+instance HasCField.HasCField SDL_GPUVertexBufferDescription "input_rate" where
+  type
+    CFieldType SDL_GPUVertexBufferDescription "input_rate" =
+      SDL_GPUVertexInputRate
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "instance_step_rate" SDL_GPUVertexBufferDescription ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexBufferDescription
+            { instance_step_rate = y1
+            , slot = BG.getField @"slot" x0
+            , pitch = BG.getField @"pitch" x0
+            , input_rate = BG.getField @"input_rate" x0
+            }
+      , BG.getField @"instance_step_rate" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "instance_step_rate" (BG.Ptr SDL_GPUVertexBufferDescription) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"instance_step_rate")
+
+instance HasCField.HasCField SDL_GPUVertexBufferDescription "instance_step_rate" where
+  type
+    CFieldType SDL_GPUVertexBufferDescription "instance_step_rate" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+-- | A structure specifying a vertex attribute.
+--
+--     All vertex attribute locations provided to an 'SDL_GPUVertexInputState' must be unique.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GPUVertexBufferDescription', 'SDL_GPUVertexInputState', 'SDL_GPUVertexElementFormat'
+--
+--     [C declaration]: @struct SDL_GPUVertexAttribute@, defined at @SDL3\/SDL_gpu.h 1664:16@
+data SDL_GPUVertexAttribute = SDL_GPUVertexAttribute
+  { location :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The shader input location index.
+  --
+  --          [C declaration]: @location@, defined at @SDL3\/SDL_gpu.h 1666:12@
+  , buffer_slot :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The binding slot of the associated vertex buffer.
+  --
+  --          [C declaration]: @buffer_slot@, defined at @SDL3\/SDL_gpu.h 1667:12@
+  , format :: SDL_GPUVertexElementFormat
+  -- ^ The size and type of the attribute data.
+  --
+  --          [C declaration]: @format@, defined at @SDL3\/SDL_gpu.h 1668:32@
+  , offset :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The byte offset of this attribute relative to the start of the vertex element.
+  --
+  --          [C declaration]: @offset@, defined at @SDL3\/SDL_gpu.h 1669:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUVertexAttribute where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUVertexAttribute where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUVertexAttribute
+        <*> HasCField.readRaw (BG.Proxy @"location") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"buffer_slot") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"offset") ptr0
+
+instance Marshal.WriteRaw SDL_GPUVertexAttribute where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUVertexAttribute location2 buffer_slot3 format4 offset5 ->
+            HasCField.writeRaw (BG.Proxy @"location") ptr0 location2
+              >> HasCField.writeRaw (BG.Proxy @"buffer_slot") ptr0 buffer_slot3
+              >> HasCField.writeRaw (BG.Proxy @"format") ptr0 format4
+              >> HasCField.writeRaw (BG.Proxy @"offset") ptr0 offset5
+
+deriving via
+  Marshal.EquivStorable SDL_GPUVertexAttribute
+  instance
+    BG.Storable SDL_GPUVertexAttribute
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "location" SDL_GPUVertexAttribute ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexAttribute
+            { location = y1
+            , buffer_slot = BG.getField @"buffer_slot" x0
+            , format = BG.getField @"format" x0
+            , offset = BG.getField @"offset" x0
+            }
+      , BG.getField @"location" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "location" (BG.Ptr SDL_GPUVertexAttribute) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"location")
+
+instance HasCField.HasCField SDL_GPUVertexAttribute "location" where
+  type
+    CFieldType SDL_GPUVertexAttribute "location" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "buffer_slot" SDL_GPUVertexAttribute ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexAttribute
+            { buffer_slot = y1
+            , location = BG.getField @"location" x0
+            , format = BG.getField @"format" x0
+            , offset = BG.getField @"offset" x0
+            }
+      , BG.getField @"buffer_slot" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "buffer_slot" (BG.Ptr SDL_GPUVertexAttribute) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"buffer_slot")
+
+instance HasCField.HasCField SDL_GPUVertexAttribute "buffer_slot" where
+  type
+    CFieldType SDL_GPUVertexAttribute "buffer_slot" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL_GPUVertexElementFormat)
+  => BG.CompatHasField.HasField "format" SDL_GPUVertexAttribute ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexAttribute
+            { format = y1
+            , location = BG.getField @"location" x0
+            , buffer_slot = BG.getField @"buffer_slot" x0
+            , offset = BG.getField @"offset" x0
+            }
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL_GPUVertexElementFormat)
+  => BG.HasField "format" (BG.Ptr SDL_GPUVertexAttribute) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_GPUVertexAttribute "format" where
+  type
+    CFieldType SDL_GPUVertexAttribute "format" =
+      SDL_GPUVertexElementFormat
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "offset" SDL_GPUVertexAttribute ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexAttribute
+            { offset = y1
+            , location = BG.getField @"location" x0
+            , buffer_slot = BG.getField @"buffer_slot" x0
+            , format = BG.getField @"format" x0
+            }
+      , BG.getField @"offset" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "offset" (BG.Ptr SDL_GPUVertexAttribute) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"offset")
+
+instance HasCField.HasCField SDL_GPUVertexAttribute "offset" where
+  type
+    CFieldType SDL_GPUVertexAttribute "offset" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+-- | A structure specifying the parameters of a graphics pipeline vertex input state.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GPUGraphicsPipelineCreateInfo', 'SDL_GPUVertexBufferDescription', 'SDL_GPUVertexAttribute'
+--
+--     [C declaration]: @struct SDL_GPUVertexInputState@, defined at @SDL3\/SDL_gpu.h 1682:16@
+data SDL_GPUVertexInputState = SDL_GPUVertexInputState
+  { vertex_buffer_descriptions :: PtrConst.PtrConst SDL_GPUVertexBufferDescription
+  -- ^ A pointer to an array of vertex buffer descriptions.
+  --
+  --          [C declaration]: @vertex_buffer_descriptions@, defined at @SDL3\/SDL_gpu.h 1684:43@
+  , num_vertex_buffers :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of vertex buffer descriptions in the above array.
+  --
+  --          [C declaration]: @num_vertex_buffers@, defined at @SDL3\/SDL_gpu.h 1685:12@
+  , vertex_attributes :: PtrConst.PtrConst SDL_GPUVertexAttribute
+  -- ^ A pointer to an array of vertex attribute descriptions.
+  --
+  --          [C declaration]: @vertex_attributes@, defined at @SDL3\/SDL_gpu.h 1686:35@
+  , num_vertex_attributes :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of vertex attribute descriptions in the above array.
+  --
+  --          [C declaration]: @num_vertex_attributes@, defined at @SDL3\/SDL_gpu.h 1687:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUVertexInputState where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUVertexInputState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUVertexInputState
+        <*> HasCField.readRaw (BG.Proxy @"vertex_buffer_descriptions") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_vertex_buffers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"vertex_attributes") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_vertex_attributes") ptr0
+
+instance Marshal.WriteRaw SDL_GPUVertexInputState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUVertexInputState
+            vertex_buffer_descriptions2
+            num_vertex_buffers3
+            vertex_attributes4
+            num_vertex_attributes5 ->
+              HasCField.writeRaw (BG.Proxy @"vertex_buffer_descriptions") ptr0 vertex_buffer_descriptions2
+                >> HasCField.writeRaw (BG.Proxy @"num_vertex_buffers") ptr0 num_vertex_buffers3
+                >> HasCField.writeRaw (BG.Proxy @"vertex_attributes") ptr0 vertex_attributes4
+                >> HasCField.writeRaw (BG.Proxy @"num_vertex_attributes") ptr0 num_vertex_attributes5
+
+deriving via
+  Marshal.EquivStorable SDL_GPUVertexInputState
+  instance
+    BG.Storable SDL_GPUVertexInputState
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_GPUVertexBufferDescription)
+  => BG.CompatHasField.HasField "vertex_buffer_descriptions" SDL_GPUVertexInputState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexInputState
+            { vertex_buffer_descriptions = y1
+            , num_vertex_buffers = BG.getField @"num_vertex_buffers" x0
+            , vertex_attributes = BG.getField @"vertex_attributes" x0
+            , num_vertex_attributes = BG.getField @"num_vertex_attributes" x0
+            }
+      , BG.getField @"vertex_buffer_descriptions" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_GPUVertexBufferDescription)
+  => BG.HasField "vertex_buffer_descriptions" (BG.Ptr SDL_GPUVertexInputState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"vertex_buffer_descriptions")
+
+instance HasCField.HasCField SDL_GPUVertexInputState "vertex_buffer_descriptions" where
+  type
+    CFieldType SDL_GPUVertexInputState "vertex_buffer_descriptions" =
+      PtrConst.PtrConst SDL_GPUVertexBufferDescription
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_vertex_buffers" SDL_GPUVertexInputState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexInputState
+            { num_vertex_buffers = y1
+            , vertex_buffer_descriptions = BG.getField @"vertex_buffer_descriptions" x0
+            , vertex_attributes = BG.getField @"vertex_attributes" x0
+            , num_vertex_attributes = BG.getField @"num_vertex_attributes" x0
+            }
+      , BG.getField @"num_vertex_buffers" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_vertex_buffers" (BG.Ptr SDL_GPUVertexInputState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_vertex_buffers")
+
+instance HasCField.HasCField SDL_GPUVertexInputState "num_vertex_buffers" where
+  type
+    CFieldType SDL_GPUVertexInputState "num_vertex_buffers" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_GPUVertexAttribute)
+  => BG.CompatHasField.HasField "vertex_attributes" SDL_GPUVertexInputState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexInputState
+            { vertex_attributes = y1
+            , vertex_buffer_descriptions = BG.getField @"vertex_buffer_descriptions" x0
+            , num_vertex_buffers = BG.getField @"num_vertex_buffers" x0
+            , num_vertex_attributes = BG.getField @"num_vertex_attributes" x0
+            }
+      , BG.getField @"vertex_attributes" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_GPUVertexAttribute)
+  => BG.HasField "vertex_attributes" (BG.Ptr SDL_GPUVertexInputState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"vertex_attributes")
+
+instance HasCField.HasCField SDL_GPUVertexInputState "vertex_attributes" where
+  type
+    CFieldType SDL_GPUVertexInputState "vertex_attributes" =
+      PtrConst.PtrConst SDL_GPUVertexAttribute
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_vertex_attributes" SDL_GPUVertexInputState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVertexInputState
+            { num_vertex_attributes = y1
+            , vertex_buffer_descriptions = BG.getField @"vertex_buffer_descriptions" x0
+            , num_vertex_buffers = BG.getField @"num_vertex_buffers" x0
+            , vertex_attributes = BG.getField @"vertex_attributes" x0
+            }
+      , BG.getField @"num_vertex_attributes" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_vertex_attributes" (BG.Ptr SDL_GPUVertexInputState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_vertex_attributes")
+
+instance HasCField.HasCField SDL_GPUVertexInputState "num_vertex_attributes" where
+  type
+    CFieldType SDL_GPUVertexInputState "num_vertex_attributes" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 24
+
+-- | A structure specifying the stencil operation state of a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GPUDepthStencilState'
+--
+--     [C declaration]: @struct SDL_GPUStencilOpState@, defined at @SDL3\/SDL_gpu.h 1697:16@
+data SDL_GPUStencilOpState = SDL_GPUStencilOpState
+  { fail_op :: SDL_GPUStencilOp
+  -- ^ The action performed on samples that fail the stencil test.
+  --
+  --          [C declaration]: @fail_op@, defined at @SDL3\/SDL_gpu.h 1699:22@
+  , pass_op :: SDL_GPUStencilOp
+  -- ^ The action performed on samples that pass the depth and stencil tests.
+  --
+  --          [C declaration]: @pass_op@, defined at @SDL3\/SDL_gpu.h 1700:22@
+  , depth_fail_op :: SDL_GPUStencilOp
+  -- ^ The action performed on samples that pass the stencil test and fail the depth test.
+  --
+  --          [C declaration]: @depth_fail_op@, defined at @SDL3\/SDL_gpu.h 1701:22@
+  , compare_op :: SDL_GPUCompareOp
+  -- ^ The comparison operator used in the stencil test.
+  --
+  --          [C declaration]: @compare_op@, defined at @SDL3\/SDL_gpu.h 1702:22@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUStencilOpState where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUStencilOpState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUStencilOpState
+        <*> HasCField.readRaw (BG.Proxy @"fail_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pass_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"depth_fail_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"compare_op") ptr0
+
+instance Marshal.WriteRaw SDL_GPUStencilOpState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUStencilOpState fail_op2 pass_op3 depth_fail_op4 compare_op5 ->
+            HasCField.writeRaw (BG.Proxy @"fail_op") ptr0 fail_op2
+              >> HasCField.writeRaw (BG.Proxy @"pass_op") ptr0 pass_op3
+              >> HasCField.writeRaw (BG.Proxy @"depth_fail_op") ptr0 depth_fail_op4
+              >> HasCField.writeRaw (BG.Proxy @"compare_op") ptr0 compare_op5
+
+deriving via Marshal.EquivStorable SDL_GPUStencilOpState instance BG.Storable SDL_GPUStencilOpState
+
+instance
+  (ty ~ SDL_GPUStencilOp)
+  => BG.CompatHasField.HasField "fail_op" SDL_GPUStencilOpState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStencilOpState
+            { fail_op = y1
+            , pass_op = BG.getField @"pass_op" x0
+            , depth_fail_op = BG.getField @"depth_fail_op" x0
+            , compare_op = BG.getField @"compare_op" x0
+            }
+      , BG.getField @"fail_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUStencilOp)
+  => BG.HasField "fail_op" (BG.Ptr SDL_GPUStencilOpState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"fail_op")
+
+instance HasCField.HasCField SDL_GPUStencilOpState "fail_op" where
+  type
+    CFieldType SDL_GPUStencilOpState "fail_op" =
+      SDL_GPUStencilOp
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_GPUStencilOp)
+  => BG.CompatHasField.HasField "pass_op" SDL_GPUStencilOpState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStencilOpState
+            { pass_op = y1
+            , fail_op = BG.getField @"fail_op" x0
+            , depth_fail_op = BG.getField @"depth_fail_op" x0
+            , compare_op = BG.getField @"compare_op" x0
+            }
+      , BG.getField @"pass_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUStencilOp)
+  => BG.HasField "pass_op" (BG.Ptr SDL_GPUStencilOpState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pass_op")
+
+instance HasCField.HasCField SDL_GPUStencilOpState "pass_op" where
+  type
+    CFieldType SDL_GPUStencilOpState "pass_op" =
+      SDL_GPUStencilOp
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL_GPUStencilOp)
+  => BG.CompatHasField.HasField "depth_fail_op" SDL_GPUStencilOpState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStencilOpState
+            { depth_fail_op = y1
+            , fail_op = BG.getField @"fail_op" x0
+            , pass_op = BG.getField @"pass_op" x0
+            , compare_op = BG.getField @"compare_op" x0
+            }
+      , BG.getField @"depth_fail_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUStencilOp)
+  => BG.HasField "depth_fail_op" (BG.Ptr SDL_GPUStencilOpState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"depth_fail_op")
+
+instance HasCField.HasCField SDL_GPUStencilOpState "depth_fail_op" where
+  type
+    CFieldType SDL_GPUStencilOpState "depth_fail_op" =
+      SDL_GPUStencilOp
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL_GPUCompareOp)
+  => BG.CompatHasField.HasField "compare_op" SDL_GPUStencilOpState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStencilOpState
+            { compare_op = y1
+            , fail_op = BG.getField @"fail_op" x0
+            , pass_op = BG.getField @"pass_op" x0
+            , depth_fail_op = BG.getField @"depth_fail_op" x0
+            }
+      , BG.getField @"compare_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUCompareOp)
+  => BG.HasField "compare_op" (BG.Ptr SDL_GPUStencilOpState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"compare_op")
+
+instance HasCField.HasCField SDL_GPUStencilOpState "compare_op" where
+  type
+    CFieldType SDL_GPUStencilOpState "compare_op" =
+      SDL_GPUCompareOp
+
+  offset# = \_ -> \_ -> 12
+
+-- | A structure specifying the blend state of a color target.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GPUColorTargetDescription', 'SDL_GPUBlendFactor', 'SDL_GPUBlendOp', 'SDL_GPUColorComponentFlags'
+--
+--     [C declaration]: @struct SDL_GPUColorTargetBlendState@, defined at @SDL3\/SDL_gpu.h 1715:16@
+data SDL_GPUColorTargetBlendState = SDL_GPUColorTargetBlendState
+  { src_color_blendfactor :: SDL_GPUBlendFactor
+  -- ^ The value to be multiplied by the source RGB value.
+  --
+  --          [C declaration]: @src_color_blendfactor@, defined at @SDL3\/SDL_gpu.h 1717:24@
+  , dst_color_blendfactor :: SDL_GPUBlendFactor
+  -- ^ The value to be multiplied by the destination RGB value.
+  --
+  --          [C declaration]: @dst_color_blendfactor@, defined at @SDL3\/SDL_gpu.h 1718:24@
+  , color_blend_op :: SDL_GPUBlendOp
+  -- ^ The blend operation for the RGB components.
+  --
+  --          [C declaration]: @color_blend_op@, defined at @SDL3\/SDL_gpu.h 1719:20@
+  , src_alpha_blendfactor :: SDL_GPUBlendFactor
+  -- ^ The value to be multiplied by the source alpha.
+  --
+  --          [C declaration]: @src_alpha_blendfactor@, defined at @SDL3\/SDL_gpu.h 1720:24@
+  , dst_alpha_blendfactor :: SDL_GPUBlendFactor
+  -- ^ The value to be multiplied by the destination alpha.
+  --
+  --          [C declaration]: @dst_alpha_blendfactor@, defined at @SDL3\/SDL_gpu.h 1721:24@
+  , alpha_blend_op :: SDL_GPUBlendOp
+  -- ^ The blend operation for the alpha component.
+  --
+  --          [C declaration]: @alpha_blend_op@, defined at @SDL3\/SDL_gpu.h 1722:20@
+  , color_write_mask :: SDL_GPUColorComponentFlags
+  -- ^ A bitmask specifying which of the RGBA components are enabled for writing. Writes to all channels if enable_color_write_mask is false.
+  --
+  --          [C declaration]: @color_write_mask@, defined at @SDL3\/SDL_gpu.h 1723:32@
+  , enable_blend :: BG.CBool
+  -- ^ Whether blending is enabled for the color target.
+  --
+  --          [C declaration]: @enable_blend@, defined at @SDL3\/SDL_gpu.h 1724:10@
+  , enable_color_write_mask :: BG.CBool
+  -- ^ Whether the color write mask is enabled.
+  --
+  --          [C declaration]: @enable_color_write_mask@, defined at @SDL3\/SDL_gpu.h 1725:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_gpu.h 1726:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_gpu.h 1727:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUColorTargetBlendState where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUColorTargetBlendState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUColorTargetBlendState
+        <*> HasCField.readRaw (BG.Proxy @"src_color_blendfactor") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"dst_color_blendfactor") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"color_blend_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"src_alpha_blendfactor") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"dst_alpha_blendfactor") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"alpha_blend_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"color_write_mask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_blend") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_color_write_mask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+
+instance Marshal.WriteRaw SDL_GPUColorTargetBlendState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUColorTargetBlendState
+            src_color_blendfactor2
+            dst_color_blendfactor3
+            color_blend_op4
+            src_alpha_blendfactor5
+            dst_alpha_blendfactor6
+            alpha_blend_op7
+            color_write_mask8
+            enable_blend9
+            enable_color_write_mask10
+            padding111
+            padding212 ->
+              HasCField.writeRaw (BG.Proxy @"src_color_blendfactor") ptr0 src_color_blendfactor2
+                >> HasCField.writeRaw (BG.Proxy @"dst_color_blendfactor") ptr0 dst_color_blendfactor3
+                >> HasCField.writeRaw (BG.Proxy @"color_blend_op") ptr0 color_blend_op4
+                >> HasCField.writeRaw (BG.Proxy @"src_alpha_blendfactor") ptr0 src_alpha_blendfactor5
+                >> HasCField.writeRaw (BG.Proxy @"dst_alpha_blendfactor") ptr0 dst_alpha_blendfactor6
+                >> HasCField.writeRaw (BG.Proxy @"alpha_blend_op") ptr0 alpha_blend_op7
+                >> HasCField.writeRaw (BG.Proxy @"color_write_mask") ptr0 color_write_mask8
+                >> HasCField.writeRaw (BG.Proxy @"enable_blend") ptr0 enable_blend9
+                >> HasCField.writeRaw (BG.Proxy @"enable_color_write_mask") ptr0 enable_color_write_mask10
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding111
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding212
+
+deriving via
+  Marshal.EquivStorable SDL_GPUColorTargetBlendState
+  instance
+    BG.Storable SDL_GPUColorTargetBlendState
+
+instance
+  (ty ~ SDL_GPUBlendFactor)
+  => BG.CompatHasField.HasField "src_color_blendfactor" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { src_color_blendfactor = y1
+            , dst_color_blendfactor = BG.getField @"dst_color_blendfactor" x0
+            , color_blend_op = BG.getField @"color_blend_op" x0
+            , src_alpha_blendfactor = BG.getField @"src_alpha_blendfactor" x0
+            , dst_alpha_blendfactor = BG.getField @"dst_alpha_blendfactor" x0
+            , alpha_blend_op = BG.getField @"alpha_blend_op" x0
+            , color_write_mask = BG.getField @"color_write_mask" x0
+            , enable_blend = BG.getField @"enable_blend" x0
+            , enable_color_write_mask = BG.getField @"enable_color_write_mask" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"src_color_blendfactor" x0
+      )
+
+instance
+  (ty ~ SDL_GPUBlendFactor)
+  => BG.HasField "src_color_blendfactor" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"src_color_blendfactor")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "src_color_blendfactor" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "src_color_blendfactor" =
+      SDL_GPUBlendFactor
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_GPUBlendFactor)
+  => BG.CompatHasField.HasField "dst_color_blendfactor" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { dst_color_blendfactor = y1
+            , src_color_blendfactor = BG.getField @"src_color_blendfactor" x0
+            , color_blend_op = BG.getField @"color_blend_op" x0
+            , src_alpha_blendfactor = BG.getField @"src_alpha_blendfactor" x0
+            , dst_alpha_blendfactor = BG.getField @"dst_alpha_blendfactor" x0
+            , alpha_blend_op = BG.getField @"alpha_blend_op" x0
+            , color_write_mask = BG.getField @"color_write_mask" x0
+            , enable_blend = BG.getField @"enable_blend" x0
+            , enable_color_write_mask = BG.getField @"enable_color_write_mask" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"dst_color_blendfactor" x0
+      )
+
+instance
+  (ty ~ SDL_GPUBlendFactor)
+  => BG.HasField "dst_color_blendfactor" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"dst_color_blendfactor")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "dst_color_blendfactor" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "dst_color_blendfactor" =
+      SDL_GPUBlendFactor
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL_GPUBlendOp)
+  => BG.CompatHasField.HasField "color_blend_op" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { color_blend_op = y1
+            , src_color_blendfactor = BG.getField @"src_color_blendfactor" x0
+            , dst_color_blendfactor = BG.getField @"dst_color_blendfactor" x0
+            , src_alpha_blendfactor = BG.getField @"src_alpha_blendfactor" x0
+            , dst_alpha_blendfactor = BG.getField @"dst_alpha_blendfactor" x0
+            , alpha_blend_op = BG.getField @"alpha_blend_op" x0
+            , color_write_mask = BG.getField @"color_write_mask" x0
+            , enable_blend = BG.getField @"enable_blend" x0
+            , enable_color_write_mask = BG.getField @"enable_color_write_mask" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"color_blend_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUBlendOp)
+  => BG.HasField "color_blend_op" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"color_blend_op")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "color_blend_op" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "color_blend_op" =
+      SDL_GPUBlendOp
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL_GPUBlendFactor)
+  => BG.CompatHasField.HasField "src_alpha_blendfactor" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { src_alpha_blendfactor = y1
+            , src_color_blendfactor = BG.getField @"src_color_blendfactor" x0
+            , dst_color_blendfactor = BG.getField @"dst_color_blendfactor" x0
+            , color_blend_op = BG.getField @"color_blend_op" x0
+            , dst_alpha_blendfactor = BG.getField @"dst_alpha_blendfactor" x0
+            , alpha_blend_op = BG.getField @"alpha_blend_op" x0
+            , color_write_mask = BG.getField @"color_write_mask" x0
+            , enable_blend = BG.getField @"enable_blend" x0
+            , enable_color_write_mask = BG.getField @"enable_color_write_mask" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"src_alpha_blendfactor" x0
+      )
+
+instance
+  (ty ~ SDL_GPUBlendFactor)
+  => BG.HasField "src_alpha_blendfactor" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"src_alpha_blendfactor")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "src_alpha_blendfactor" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "src_alpha_blendfactor" =
+      SDL_GPUBlendFactor
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL_GPUBlendFactor)
+  => BG.CompatHasField.HasField "dst_alpha_blendfactor" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { dst_alpha_blendfactor = y1
+            , src_color_blendfactor = BG.getField @"src_color_blendfactor" x0
+            , dst_color_blendfactor = BG.getField @"dst_color_blendfactor" x0
+            , color_blend_op = BG.getField @"color_blend_op" x0
+            , src_alpha_blendfactor = BG.getField @"src_alpha_blendfactor" x0
+            , alpha_blend_op = BG.getField @"alpha_blend_op" x0
+            , color_write_mask = BG.getField @"color_write_mask" x0
+            , enable_blend = BG.getField @"enable_blend" x0
+            , enable_color_write_mask = BG.getField @"enable_color_write_mask" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"dst_alpha_blendfactor" x0
+      )
+
+instance
+  (ty ~ SDL_GPUBlendFactor)
+  => BG.HasField "dst_alpha_blendfactor" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"dst_alpha_blendfactor")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "dst_alpha_blendfactor" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "dst_alpha_blendfactor" =
+      SDL_GPUBlendFactor
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL_GPUBlendOp)
+  => BG.CompatHasField.HasField "alpha_blend_op" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { alpha_blend_op = y1
+            , src_color_blendfactor = BG.getField @"src_color_blendfactor" x0
+            , dst_color_blendfactor = BG.getField @"dst_color_blendfactor" x0
+            , color_blend_op = BG.getField @"color_blend_op" x0
+            , src_alpha_blendfactor = BG.getField @"src_alpha_blendfactor" x0
+            , dst_alpha_blendfactor = BG.getField @"dst_alpha_blendfactor" x0
+            , color_write_mask = BG.getField @"color_write_mask" x0
+            , enable_blend = BG.getField @"enable_blend" x0
+            , enable_color_write_mask = BG.getField @"enable_color_write_mask" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"alpha_blend_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUBlendOp)
+  => BG.HasField "alpha_blend_op" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"alpha_blend_op")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "alpha_blend_op" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "alpha_blend_op" =
+      SDL_GPUBlendOp
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL_GPUColorComponentFlags)
+  => BG.CompatHasField.HasField "color_write_mask" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { color_write_mask = y1
+            , src_color_blendfactor = BG.getField @"src_color_blendfactor" x0
+            , dst_color_blendfactor = BG.getField @"dst_color_blendfactor" x0
+            , color_blend_op = BG.getField @"color_blend_op" x0
+            , src_alpha_blendfactor = BG.getField @"src_alpha_blendfactor" x0
+            , dst_alpha_blendfactor = BG.getField @"dst_alpha_blendfactor" x0
+            , alpha_blend_op = BG.getField @"alpha_blend_op" x0
+            , enable_blend = BG.getField @"enable_blend" x0
+            , enable_color_write_mask = BG.getField @"enable_color_write_mask" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"color_write_mask" x0
+      )
+
+instance
+  (ty ~ SDL_GPUColorComponentFlags)
+  => BG.HasField "color_write_mask" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"color_write_mask")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "color_write_mask" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "color_write_mask" =
+      SDL_GPUColorComponentFlags
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_blend" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { enable_blend = y1
+            , src_color_blendfactor = BG.getField @"src_color_blendfactor" x0
+            , dst_color_blendfactor = BG.getField @"dst_color_blendfactor" x0
+            , color_blend_op = BG.getField @"color_blend_op" x0
+            , src_alpha_blendfactor = BG.getField @"src_alpha_blendfactor" x0
+            , dst_alpha_blendfactor = BG.getField @"dst_alpha_blendfactor" x0
+            , alpha_blend_op = BG.getField @"alpha_blend_op" x0
+            , color_write_mask = BG.getField @"color_write_mask" x0
+            , enable_color_write_mask = BG.getField @"enable_color_write_mask" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"enable_blend" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_blend" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_blend")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "enable_blend" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "enable_blend" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 25
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_color_write_mask" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { enable_color_write_mask = y1
+            , src_color_blendfactor = BG.getField @"src_color_blendfactor" x0
+            , dst_color_blendfactor = BG.getField @"dst_color_blendfactor" x0
+            , color_blend_op = BG.getField @"color_blend_op" x0
+            , src_alpha_blendfactor = BG.getField @"src_alpha_blendfactor" x0
+            , dst_alpha_blendfactor = BG.getField @"dst_alpha_blendfactor" x0
+            , alpha_blend_op = BG.getField @"alpha_blend_op" x0
+            , color_write_mask = BG.getField @"color_write_mask" x0
+            , enable_blend = BG.getField @"enable_blend" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"enable_color_write_mask" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_color_write_mask" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_color_write_mask")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "enable_color_write_mask" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "enable_color_write_mask" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 26
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { padding1 = y1
+            , src_color_blendfactor = BG.getField @"src_color_blendfactor" x0
+            , dst_color_blendfactor = BG.getField @"dst_color_blendfactor" x0
+            , color_blend_op = BG.getField @"color_blend_op" x0
+            , src_alpha_blendfactor = BG.getField @"src_alpha_blendfactor" x0
+            , dst_alpha_blendfactor = BG.getField @"dst_alpha_blendfactor" x0
+            , alpha_blend_op = BG.getField @"alpha_blend_op" x0
+            , color_write_mask = BG.getField @"color_write_mask" x0
+            , enable_blend = BG.getField @"enable_blend" x0
+            , enable_color_write_mask = BG.getField @"enable_color_write_mask" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "padding1" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 27
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GPUColorTargetBlendState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetBlendState
+            { padding2 = y1
+            , src_color_blendfactor = BG.getField @"src_color_blendfactor" x0
+            , dst_color_blendfactor = BG.getField @"dst_color_blendfactor" x0
+            , color_blend_op = BG.getField @"color_blend_op" x0
+            , src_alpha_blendfactor = BG.getField @"src_alpha_blendfactor" x0
+            , dst_alpha_blendfactor = BG.getField @"dst_alpha_blendfactor" x0
+            , alpha_blend_op = BG.getField @"alpha_blend_op" x0
+            , color_write_mask = BG.getField @"color_write_mask" x0
+            , enable_blend = BG.getField @"enable_blend" x0
+            , enable_color_write_mask = BG.getField @"enable_color_write_mask" x0
+            , padding1 = BG.getField @"padding1" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GPUColorTargetBlendState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GPUColorTargetBlendState "padding2" where
+  type
+    CFieldType SDL_GPUColorTargetBlendState "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 28
+
+-- | A structure specifying code and metadata for creating a shader object.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader', 'SDL_GPUShaderFormat', 'SDL_GPUShaderStage'
+--
+--     [C declaration]: @struct SDL_GPUShaderCreateInfo@, defined at @SDL3\/SDL_gpu.h 1740:16@
+data SDL_GPUShaderCreateInfo = SDL_GPUShaderCreateInfo
+  { code_size :: HsBindgen.Runtime.LibC.CSize
+  -- ^ The size in bytes of the code pointed to.
+  --
+  --          [C declaration]: @code_size@, defined at @SDL3\/SDL_gpu.h 1742:12@
+  , code :: PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ A pointer to shader code.
+  --
+  --          [C declaration]: @code@, defined at @SDL3\/SDL_gpu.h 1743:18@
+  , entrypoint :: PtrConst.PtrConst BG.CChar
+  -- ^ A pointer to a null-terminated UTF-8 string specifying the entry point function name for the shader.
+  --
+  --          [C declaration]: @entrypoint@, defined at @SDL3\/SDL_gpu.h 1744:17@
+  , format :: SDL_GPUShaderFormat
+  -- ^ The format of the shader code.
+  --
+  --          [C declaration]: @format@, defined at @SDL3\/SDL_gpu.h 1745:25@
+  , stage :: SDL_GPUShaderStage
+  -- ^ The stage the shader program corresponds to.
+  --
+  --          [C declaration]: @stage@, defined at @SDL3\/SDL_gpu.h 1746:24@
+  , num_samplers :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of samplers defined in the shader.
+  --
+  --          [C declaration]: @num_samplers@, defined at @SDL3\/SDL_gpu.h 1747:12@
+  , num_storage_textures :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of storage textures defined in the shader.
+  --
+  --          [C declaration]: @num_storage_textures@, defined at @SDL3\/SDL_gpu.h 1748:12@
+  , num_storage_buffers :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of storage buffers defined in the shader.
+  --
+  --          [C declaration]: @num_storage_buffers@, defined at @SDL3\/SDL_gpu.h 1749:12@
+  , num_uniform_buffers :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of uniform buffers defined in the shader.
+  --
+  --          [C declaration]: @num_uniform_buffers@, defined at @SDL3\/SDL_gpu.h 1750:12@
+  , props :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^ A properties ID for extensions. Should be 0 if no extensions are needed.
+  --
+  --          [C declaration]: @props@, defined at @SDL3\/SDL_gpu.h 1752:22@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUShaderCreateInfo where
+  staticSizeOf = \_ -> (56 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUShaderCreateInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUShaderCreateInfo
+        <*> HasCField.readRaw (BG.Proxy @"code_size") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"code") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"entrypoint") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"stage") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_samplers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_storage_textures") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_storage_buffers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_uniform_buffers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"props") ptr0
+
+instance Marshal.WriteRaw SDL_GPUShaderCreateInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUShaderCreateInfo
+            code_size2
+            code3
+            entrypoint4
+            format5
+            stage6
+            num_samplers7
+            num_storage_textures8
+            num_storage_buffers9
+            num_uniform_buffers10
+            props11 ->
+              HasCField.writeRaw (BG.Proxy @"code_size") ptr0 code_size2
+                >> HasCField.writeRaw (BG.Proxy @"code") ptr0 code3
+                >> HasCField.writeRaw (BG.Proxy @"entrypoint") ptr0 entrypoint4
+                >> HasCField.writeRaw (BG.Proxy @"format") ptr0 format5
+                >> HasCField.writeRaw (BG.Proxy @"stage") ptr0 stage6
+                >> HasCField.writeRaw (BG.Proxy @"num_samplers") ptr0 num_samplers7
+                >> HasCField.writeRaw (BG.Proxy @"num_storage_textures") ptr0 num_storage_textures8
+                >> HasCField.writeRaw (BG.Proxy @"num_storage_buffers") ptr0 num_storage_buffers9
+                >> HasCField.writeRaw (BG.Proxy @"num_uniform_buffers") ptr0 num_uniform_buffers10
+                >> HasCField.writeRaw (BG.Proxy @"props") ptr0 props11
+
+deriving via
+  Marshal.EquivStorable SDL_GPUShaderCreateInfo
+  instance
+    BG.Storable SDL_GPUShaderCreateInfo
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.CSize)
+  => BG.CompatHasField.HasField "code_size" SDL_GPUShaderCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderCreateInfo
+            { code_size = y1
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , stage = BG.getField @"stage" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"code_size" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.CSize)
+  => BG.HasField "code_size" (BG.Ptr SDL_GPUShaderCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"code_size")
+
+instance HasCField.HasCField SDL_GPUShaderCreateInfo "code_size" where
+  type
+    CFieldType SDL_GPUShaderCreateInfo "code_size" =
+      HsBindgen.Runtime.LibC.CSize
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "code" SDL_GPUShaderCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderCreateInfo
+            { code = y1
+            , code_size = BG.getField @"code_size" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , stage = BG.getField @"stage" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"code" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "code" (BG.Ptr SDL_GPUShaderCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"code")
+
+instance HasCField.HasCField SDL_GPUShaderCreateInfo "code" where
+  type
+    CFieldType SDL_GPUShaderCreateInfo "code" =
+      PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "entrypoint" SDL_GPUShaderCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderCreateInfo
+            { entrypoint = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , format = BG.getField @"format" x0
+            , stage = BG.getField @"stage" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"entrypoint" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "entrypoint" (BG.Ptr SDL_GPUShaderCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"entrypoint")
+
+instance HasCField.HasCField SDL_GPUShaderCreateInfo "entrypoint" where
+  type
+    CFieldType SDL_GPUShaderCreateInfo "entrypoint" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL_GPUShaderFormat)
+  => BG.CompatHasField.HasField "format" SDL_GPUShaderCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderCreateInfo
+            { format = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , stage = BG.getField @"stage" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL_GPUShaderFormat)
+  => BG.HasField "format" (BG.Ptr SDL_GPUShaderCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_GPUShaderCreateInfo "format" where
+  type
+    CFieldType SDL_GPUShaderCreateInfo "format" =
+      SDL_GPUShaderFormat
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL_GPUShaderStage)
+  => BG.CompatHasField.HasField "stage" SDL_GPUShaderCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderCreateInfo
+            { stage = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"stage" x0
+      )
+
+instance
+  (ty ~ SDL_GPUShaderStage)
+  => BG.HasField "stage" (BG.Ptr SDL_GPUShaderCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"stage")
+
+instance HasCField.HasCField SDL_GPUShaderCreateInfo "stage" where
+  type
+    CFieldType SDL_GPUShaderCreateInfo "stage" =
+      SDL_GPUShaderStage
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_samplers" SDL_GPUShaderCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderCreateInfo
+            { num_samplers = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , stage = BG.getField @"stage" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_samplers" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_samplers" (BG.Ptr SDL_GPUShaderCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_samplers")
+
+instance HasCField.HasCField SDL_GPUShaderCreateInfo "num_samplers" where
+  type
+    CFieldType SDL_GPUShaderCreateInfo "num_samplers" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_storage_textures" SDL_GPUShaderCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderCreateInfo
+            { num_storage_textures = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , stage = BG.getField @"stage" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_storage_textures" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_storage_textures" (BG.Ptr SDL_GPUShaderCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_storage_textures")
+
+instance HasCField.HasCField SDL_GPUShaderCreateInfo "num_storage_textures" where
+  type
+    CFieldType SDL_GPUShaderCreateInfo "num_storage_textures" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_storage_buffers" SDL_GPUShaderCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderCreateInfo
+            { num_storage_buffers = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , stage = BG.getField @"stage" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_storage_buffers" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_storage_buffers" (BG.Ptr SDL_GPUShaderCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_storage_buffers")
+
+instance HasCField.HasCField SDL_GPUShaderCreateInfo "num_storage_buffers" where
+  type
+    CFieldType SDL_GPUShaderCreateInfo "num_storage_buffers" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_uniform_buffers" SDL_GPUShaderCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderCreateInfo
+            { num_uniform_buffers = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , stage = BG.getField @"stage" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_uniform_buffers" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_uniform_buffers" (BG.Ptr SDL_GPUShaderCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_uniform_buffers")
+
+instance HasCField.HasCField SDL_GPUShaderCreateInfo "num_uniform_buffers" where
+  type
+    CFieldType SDL_GPUShaderCreateInfo "num_uniform_buffers" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 44
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.CompatHasField.HasField "props" SDL_GPUShaderCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUShaderCreateInfo
+            { props = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , stage = BG.getField @"stage" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            }
+      , BG.getField @"props" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.HasField "props" (BG.Ptr SDL_GPUShaderCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"props")
+
+instance HasCField.HasCField SDL_GPUShaderCreateInfo "props" where
+  type
+    CFieldType SDL_GPUShaderCreateInfo "props" =
+      SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+
+  offset# = \_ -> \_ -> 48
+
+-- | A structure specifying the parameters of a texture.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTexture', 'SDL_GPUTextureType', 'SDL_GPUTextureFormat', 'SDL_GPUTextureUsageFlags', 'SDL_GPUSampleCount'
+--
+--     [C declaration]: @struct SDL_GPUTextureCreateInfo@, defined at @SDL3\/SDL_gpu.h 1770:16@
+data SDL_GPUTextureCreateInfo = SDL_GPUTextureCreateInfo
+  { type' :: SDL_GPUTextureType
+  -- ^ The base dimensionality of the texture.
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_gpu.h 1772:24@
+  , format :: SDL_GPUTextureFormat
+  -- ^ The pixel format of the texture.
+  --
+  --          [C declaration]: @format@, defined at @SDL3\/SDL_gpu.h 1773:26@
+  , usage :: SDL_GPUTextureUsageFlags
+  -- ^ How the texture is intended to be used by the client.
+  --
+  --          [C declaration]: @usage@, defined at @SDL3\/SDL_gpu.h 1774:30@
+  , width :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The width of the texture.
+  --
+  --          [C declaration]: @width@, defined at @SDL3\/SDL_gpu.h 1775:12@
+  , height :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The height of the texture.
+  --
+  --          [C declaration]: @height@, defined at @SDL3\/SDL_gpu.h 1776:12@
+  , layer_count_or_depth :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ 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.
+  --
+  --          [C declaration]: @layer_count_or_depth@, defined at @SDL3\/SDL_gpu.h 1777:12@
+  , num_levels :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of mip levels in the texture.
+  --
+  --          [C declaration]: @num_levels@, defined at @SDL3\/SDL_gpu.h 1778:12@
+  , sample_count :: SDL_GPUSampleCount
+  -- ^ The number of samples per texel. Only applies if the texture is used as a render target.
+  --
+  --          [C declaration]: @sample_count@, defined at @SDL3\/SDL_gpu.h 1779:24@
+  , props :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^ A properties ID for extensions. Should be 0 if no extensions are needed.
+  --
+  --          [C declaration]: @props@, defined at @SDL3\/SDL_gpu.h 1781:22@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUTextureCreateInfo where
+  staticSizeOf = \_ -> (36 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUTextureCreateInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUTextureCreateInfo
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"usage") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"width") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"height") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"layer_count_or_depth") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_levels") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"sample_count") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"props") ptr0
+
+instance Marshal.WriteRaw SDL_GPUTextureCreateInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUTextureCreateInfo
+            type'2
+            format3
+            usage4
+            width5
+            height6
+            layer_count_or_depth7
+            num_levels8
+            sample_count9
+            props10 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"format") ptr0 format3
+                >> HasCField.writeRaw (BG.Proxy @"usage") ptr0 usage4
+                >> HasCField.writeRaw (BG.Proxy @"width") ptr0 width5
+                >> HasCField.writeRaw (BG.Proxy @"height") ptr0 height6
+                >> HasCField.writeRaw (BG.Proxy @"layer_count_or_depth") ptr0 layer_count_or_depth7
+                >> HasCField.writeRaw (BG.Proxy @"num_levels") ptr0 num_levels8
+                >> HasCField.writeRaw (BG.Proxy @"sample_count") ptr0 sample_count9
+                >> HasCField.writeRaw (BG.Proxy @"props") ptr0 props10
+
+deriving via
+  Marshal.EquivStorable SDL_GPUTextureCreateInfo
+  instance
+    BG.Storable SDL_GPUTextureCreateInfo
+
+instance
+  (ty ~ SDL_GPUTextureType)
+  => BG.CompatHasField.HasField "type'" SDL_GPUTextureCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureCreateInfo
+            { type' = y1
+            , format = BG.getField @"format" x0
+            , usage = BG.getField @"usage" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , layer_count_or_depth = BG.getField @"layer_count_or_depth" x0
+            , num_levels = BG.getField @"num_levels" x0
+            , sample_count = BG.getField @"sample_count" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_GPUTextureType)
+  => BG.HasField "type'" (BG.Ptr SDL_GPUTextureCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_GPUTextureCreateInfo "type'" where
+  type
+    CFieldType SDL_GPUTextureCreateInfo "type'" =
+      SDL_GPUTextureType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_GPUTextureFormat)
+  => BG.CompatHasField.HasField "format" SDL_GPUTextureCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureCreateInfo
+            { format = y1
+            , type' = BG.getField @"type'" x0
+            , usage = BG.getField @"usage" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , layer_count_or_depth = BG.getField @"layer_count_or_depth" x0
+            , num_levels = BG.getField @"num_levels" x0
+            , sample_count = BG.getField @"sample_count" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL_GPUTextureFormat)
+  => BG.HasField "format" (BG.Ptr SDL_GPUTextureCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_GPUTextureCreateInfo "format" where
+  type
+    CFieldType SDL_GPUTextureCreateInfo "format" =
+      SDL_GPUTextureFormat
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL_GPUTextureUsageFlags)
+  => BG.CompatHasField.HasField "usage" SDL_GPUTextureCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureCreateInfo
+            { usage = y1
+            , type' = BG.getField @"type'" x0
+            , format = BG.getField @"format" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , layer_count_or_depth = BG.getField @"layer_count_or_depth" x0
+            , num_levels = BG.getField @"num_levels" x0
+            , sample_count = BG.getField @"sample_count" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"usage" x0
+      )
+
+instance
+  (ty ~ SDL_GPUTextureUsageFlags)
+  => BG.HasField "usage" (BG.Ptr SDL_GPUTextureCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"usage")
+
+instance HasCField.HasCField SDL_GPUTextureCreateInfo "usage" where
+  type
+    CFieldType SDL_GPUTextureCreateInfo "usage" =
+      SDL_GPUTextureUsageFlags
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "width" SDL_GPUTextureCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureCreateInfo
+            { width = y1
+            , type' = BG.getField @"type'" x0
+            , format = BG.getField @"format" x0
+            , usage = BG.getField @"usage" x0
+            , height = BG.getField @"height" x0
+            , layer_count_or_depth = BG.getField @"layer_count_or_depth" x0
+            , num_levels = BG.getField @"num_levels" x0
+            , sample_count = BG.getField @"sample_count" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"width" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "width" (BG.Ptr SDL_GPUTextureCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"width")
+
+instance HasCField.HasCField SDL_GPUTextureCreateInfo "width" where
+  type
+    CFieldType SDL_GPUTextureCreateInfo "width" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "height" SDL_GPUTextureCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureCreateInfo
+            { height = y1
+            , type' = BG.getField @"type'" x0
+            , format = BG.getField @"format" x0
+            , usage = BG.getField @"usage" x0
+            , width = BG.getField @"width" x0
+            , layer_count_or_depth = BG.getField @"layer_count_or_depth" x0
+            , num_levels = BG.getField @"num_levels" x0
+            , sample_count = BG.getField @"sample_count" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"height" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "height" (BG.Ptr SDL_GPUTextureCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"height")
+
+instance HasCField.HasCField SDL_GPUTextureCreateInfo "height" where
+  type
+    CFieldType SDL_GPUTextureCreateInfo "height" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "layer_count_or_depth" SDL_GPUTextureCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureCreateInfo
+            { layer_count_or_depth = y1
+            , type' = BG.getField @"type'" x0
+            , format = BG.getField @"format" x0
+            , usage = BG.getField @"usage" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , num_levels = BG.getField @"num_levels" x0
+            , sample_count = BG.getField @"sample_count" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"layer_count_or_depth" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "layer_count_or_depth" (BG.Ptr SDL_GPUTextureCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"layer_count_or_depth")
+
+instance HasCField.HasCField SDL_GPUTextureCreateInfo "layer_count_or_depth" where
+  type
+    CFieldType SDL_GPUTextureCreateInfo "layer_count_or_depth" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_levels" SDL_GPUTextureCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureCreateInfo
+            { num_levels = y1
+            , type' = BG.getField @"type'" x0
+            , format = BG.getField @"format" x0
+            , usage = BG.getField @"usage" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , layer_count_or_depth = BG.getField @"layer_count_or_depth" x0
+            , sample_count = BG.getField @"sample_count" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_levels" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_levels" (BG.Ptr SDL_GPUTextureCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"num_levels")
+
+instance HasCField.HasCField SDL_GPUTextureCreateInfo "num_levels" where
+  type
+    CFieldType SDL_GPUTextureCreateInfo "num_levels" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL_GPUSampleCount)
+  => BG.CompatHasField.HasField "sample_count" SDL_GPUTextureCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureCreateInfo
+            { sample_count = y1
+            , type' = BG.getField @"type'" x0
+            , format = BG.getField @"format" x0
+            , usage = BG.getField @"usage" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , layer_count_or_depth = BG.getField @"layer_count_or_depth" x0
+            , num_levels = BG.getField @"num_levels" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"sample_count" x0
+      )
+
+instance
+  (ty ~ SDL_GPUSampleCount)
+  => BG.HasField "sample_count" (BG.Ptr SDL_GPUTextureCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"sample_count")
+
+instance HasCField.HasCField SDL_GPUTextureCreateInfo "sample_count" where
+  type
+    CFieldType SDL_GPUTextureCreateInfo "sample_count" =
+      SDL_GPUSampleCount
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.CompatHasField.HasField "props" SDL_GPUTextureCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureCreateInfo
+            { props = y1
+            , type' = BG.getField @"type'" x0
+            , format = BG.getField @"format" x0
+            , usage = BG.getField @"usage" x0
+            , width = BG.getField @"width" x0
+            , height = BG.getField @"height" x0
+            , layer_count_or_depth = BG.getField @"layer_count_or_depth" x0
+            , num_levels = BG.getField @"num_levels" x0
+            , sample_count = BG.getField @"sample_count" x0
+            }
+      , BG.getField @"props" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.HasField "props" (BG.Ptr SDL_GPUTextureCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"props")
+
+instance HasCField.HasCField SDL_GPUTextureCreateInfo "props" where
+  type
+    CFieldType SDL_GPUTextureCreateInfo "props" =
+      SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+
+  offset# = \_ -> \_ -> 32
+
+-- | A structure specifying the parameters of a buffer.
+--
+--     Usage flags can be bitwise OR\'d together for combinations of usages. Note that certain combinations are invalid, for example VERTEX and INDEX.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUBuffer', 'SDL_GPUBufferUsageFlags'
+--
+--     [C declaration]: @struct SDL_GPUBufferCreateInfo@, defined at @SDL3\/SDL_gpu.h 1795:16@
+data SDL_GPUBufferCreateInfo = SDL_GPUBufferCreateInfo
+  { usage :: SDL_GPUBufferUsageFlags
+  -- ^ How the buffer is intended to be used by the client.
+  --
+  --          [C declaration]: @usage@, defined at @SDL3\/SDL_gpu.h 1797:29@
+  , size :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The size in bytes of the buffer.
+  --
+  --          [C declaration]: @size@, defined at @SDL3\/SDL_gpu.h 1798:12@
+  , props :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^ A properties ID for extensions. Should be 0 if no extensions are needed.
+  --
+  --          [C declaration]: @props@, defined at @SDL3\/SDL_gpu.h 1800:22@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUBufferCreateInfo where
+  staticSizeOf = \_ -> (12 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUBufferCreateInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUBufferCreateInfo
+        <*> HasCField.readRaw (BG.Proxy @"usage") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"size") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"props") ptr0
+
+instance Marshal.WriteRaw SDL_GPUBufferCreateInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUBufferCreateInfo usage2 size3 props4 ->
+            HasCField.writeRaw (BG.Proxy @"usage") ptr0 usage2
+              >> HasCField.writeRaw (BG.Proxy @"size") ptr0 size3
+              >> HasCField.writeRaw (BG.Proxy @"props") ptr0 props4
+
+deriving via
+  Marshal.EquivStorable SDL_GPUBufferCreateInfo
+  instance
+    BG.Storable SDL_GPUBufferCreateInfo
+
+instance
+  (ty ~ SDL_GPUBufferUsageFlags)
+  => BG.CompatHasField.HasField "usage" SDL_GPUBufferCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferCreateInfo{usage = y1, size = BG.getField @"size" x0, props = BG.getField @"props" x0}
+      , BG.getField @"usage" x0
+      )
+
+instance
+  (ty ~ SDL_GPUBufferUsageFlags)
+  => BG.HasField "usage" (BG.Ptr SDL_GPUBufferCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"usage")
+
+instance HasCField.HasCField SDL_GPUBufferCreateInfo "usage" where
+  type
+    CFieldType SDL_GPUBufferCreateInfo "usage" =
+      SDL_GPUBufferUsageFlags
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "size" SDL_GPUBufferCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferCreateInfo
+            { size = y1
+            , usage = BG.getField @"usage" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"size" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "size" (BG.Ptr SDL_GPUBufferCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"size")
+
+instance HasCField.HasCField SDL_GPUBufferCreateInfo "size" where
+  type
+    CFieldType SDL_GPUBufferCreateInfo "size" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.CompatHasField.HasField "props" SDL_GPUBufferCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferCreateInfo{props = y1, usage = BG.getField @"usage" x0, size = BG.getField @"size" x0}
+      , BG.getField @"props" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.HasField "props" (BG.Ptr SDL_GPUBufferCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"props")
+
+instance HasCField.HasCField SDL_GPUBufferCreateInfo "props" where
+  type
+    CFieldType SDL_GPUBufferCreateInfo "props" =
+      SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+
+  offset# = \_ -> \_ -> 8
+
+-- | A structure specifying the parameters of a transfer buffer.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTransferBuffer'
+--
+--     [C declaration]: @struct SDL_GPUTransferBufferCreateInfo@, defined at @SDL3\/SDL_gpu.h 1810:16@
+data SDL_GPUTransferBufferCreateInfo = SDL_GPUTransferBufferCreateInfo
+  { usage :: SDL_GPUTransferBufferUsage
+  -- ^ How the transfer buffer is intended to be used by the client.
+  --
+  --          [C declaration]: @usage@, defined at @SDL3\/SDL_gpu.h 1812:32@
+  , size :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The size in bytes of the transfer buffer.
+  --
+  --          [C declaration]: @size@, defined at @SDL3\/SDL_gpu.h 1813:12@
+  , props :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^ A properties ID for extensions. Should be 0 if no extensions are needed.
+  --
+  --          [C declaration]: @props@, defined at @SDL3\/SDL_gpu.h 1815:22@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUTransferBufferCreateInfo where
+  staticSizeOf = \_ -> (12 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUTransferBufferCreateInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUTransferBufferCreateInfo
+        <*> HasCField.readRaw (BG.Proxy @"usage") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"size") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"props") ptr0
+
+instance Marshal.WriteRaw SDL_GPUTransferBufferCreateInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUTransferBufferCreateInfo usage2 size3 props4 ->
+            HasCField.writeRaw (BG.Proxy @"usage") ptr0 usage2
+              >> HasCField.writeRaw (BG.Proxy @"size") ptr0 size3
+              >> HasCField.writeRaw (BG.Proxy @"props") ptr0 props4
+
+deriving via
+  Marshal.EquivStorable SDL_GPUTransferBufferCreateInfo
+  instance
+    BG.Storable SDL_GPUTransferBufferCreateInfo
+
+instance
+  (ty ~ SDL_GPUTransferBufferUsage)
+  => BG.CompatHasField.HasField "usage" SDL_GPUTransferBufferCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTransferBufferCreateInfo
+            { usage = y1
+            , size = BG.getField @"size" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"usage" x0
+      )
+
+instance
+  (ty ~ SDL_GPUTransferBufferUsage)
+  => BG.HasField "usage" (BG.Ptr SDL_GPUTransferBufferCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"usage")
+
+instance HasCField.HasCField SDL_GPUTransferBufferCreateInfo "usage" where
+  type
+    CFieldType SDL_GPUTransferBufferCreateInfo "usage" =
+      SDL_GPUTransferBufferUsage
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "size" SDL_GPUTransferBufferCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTransferBufferCreateInfo
+            { size = y1
+            , usage = BG.getField @"usage" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"size" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "size" (BG.Ptr SDL_GPUTransferBufferCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"size")
+
+instance HasCField.HasCField SDL_GPUTransferBufferCreateInfo "size" where
+  type
+    CFieldType SDL_GPUTransferBufferCreateInfo "size" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.CompatHasField.HasField "props" SDL_GPUTransferBufferCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTransferBufferCreateInfo
+            { props = y1
+            , usage = BG.getField @"usage" x0
+            , size = BG.getField @"size" x0
+            }
+      , BG.getField @"props" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.HasField "props" (BG.Ptr SDL_GPUTransferBufferCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"props")
+
+instance HasCField.HasCField SDL_GPUTransferBufferCreateInfo "props" where
+  type
+    CFieldType SDL_GPUTransferBufferCreateInfo "props" =
+      SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+
+  offset# = \_ -> \_ -> 8
+
+-- | A structure specifying the parameters of the graphics pipeline rasterizer state.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GPUGraphicsPipelineCreateInfo'
+--
+--     [C declaration]: @struct SDL_GPURasterizerState@, defined at @SDL3\/SDL_gpu.h 1836:16@
+data SDL_GPURasterizerState = SDL_GPURasterizerState
+  { fill_mode :: SDL_GPUFillMode
+  -- ^ Whether polygons will be filled in or drawn as lines.
+  --
+  --          [C declaration]: @fill_mode@, defined at @SDL3\/SDL_gpu.h 1838:21@
+  , cull_mode :: SDL_GPUCullMode
+  -- ^ The facing direction in which triangles will be culled.
+  --
+  --          [C declaration]: @cull_mode@, defined at @SDL3\/SDL_gpu.h 1839:21@
+  , front_face :: SDL_GPUFrontFace
+  -- ^ The vertex winding that will cause a triangle to be determined as front-facing.
+  --
+  --          [C declaration]: @front_face@, defined at @SDL3\/SDL_gpu.h 1840:22@
+  , depth_bias_constant_factor :: BG.CFloat
+  -- ^ A scalar factor controlling the depth value added to each fragment.
+  --
+  --          [C declaration]: @depth_bias_constant_factor@, defined at @SDL3\/SDL_gpu.h 1841:11@
+  , depth_bias_clamp :: BG.CFloat
+  -- ^ The maximum depth bias of a fragment.
+  --
+  --          [C declaration]: @depth_bias_clamp@, defined at @SDL3\/SDL_gpu.h 1842:11@
+  , depth_bias_slope_factor :: BG.CFloat
+  -- ^ A scalar factor applied to a fragment\'s slope in depth calculations.
+  --
+  --          [C declaration]: @depth_bias_slope_factor@, defined at @SDL3\/SDL_gpu.h 1843:11@
+  , enable_depth_bias :: BG.CBool
+  -- ^ true to bias fragment depth values.
+  --
+  --          [C declaration]: @enable_depth_bias@, defined at @SDL3\/SDL_gpu.h 1844:10@
+  , enable_depth_clip :: BG.CBool
+  -- ^ true to enable depth clip, false to enable depth clamp.
+  --
+  --          [C declaration]: @enable_depth_clip@, defined at @SDL3\/SDL_gpu.h 1845:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_gpu.h 1846:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_gpu.h 1847:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPURasterizerState where
+  staticSizeOf = \_ -> (28 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPURasterizerState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPURasterizerState
+        <*> HasCField.readRaw (BG.Proxy @"fill_mode") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"cull_mode") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"front_face") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"depth_bias_constant_factor") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"depth_bias_clamp") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"depth_bias_slope_factor") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_depth_bias") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_depth_clip") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+
+instance Marshal.WriteRaw SDL_GPURasterizerState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPURasterizerState
+            fill_mode2
+            cull_mode3
+            front_face4
+            depth_bias_constant_factor5
+            depth_bias_clamp6
+            depth_bias_slope_factor7
+            enable_depth_bias8
+            enable_depth_clip9
+            padding110
+            padding211 ->
+              HasCField.writeRaw (BG.Proxy @"fill_mode") ptr0 fill_mode2
+                >> HasCField.writeRaw (BG.Proxy @"cull_mode") ptr0 cull_mode3
+                >> HasCField.writeRaw (BG.Proxy @"front_face") ptr0 front_face4
+                >> HasCField.writeRaw (BG.Proxy @"depth_bias_constant_factor") ptr0 depth_bias_constant_factor5
+                >> HasCField.writeRaw (BG.Proxy @"depth_bias_clamp") ptr0 depth_bias_clamp6
+                >> HasCField.writeRaw (BG.Proxy @"depth_bias_slope_factor") ptr0 depth_bias_slope_factor7
+                >> HasCField.writeRaw (BG.Proxy @"enable_depth_bias") ptr0 enable_depth_bias8
+                >> HasCField.writeRaw (BG.Proxy @"enable_depth_clip") ptr0 enable_depth_clip9
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding110
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding211
+
+deriving via
+  Marshal.EquivStorable SDL_GPURasterizerState
+  instance
+    BG.Storable SDL_GPURasterizerState
+
+instance
+  (ty ~ SDL_GPUFillMode)
+  => BG.CompatHasField.HasField "fill_mode" SDL_GPURasterizerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURasterizerState
+            { fill_mode = y1
+            , cull_mode = BG.getField @"cull_mode" x0
+            , front_face = BG.getField @"front_face" x0
+            , depth_bias_constant_factor = BG.getField @"depth_bias_constant_factor" x0
+            , depth_bias_clamp = BG.getField @"depth_bias_clamp" x0
+            , depth_bias_slope_factor = BG.getField @"depth_bias_slope_factor" x0
+            , enable_depth_bias = BG.getField @"enable_depth_bias" x0
+            , enable_depth_clip = BG.getField @"enable_depth_clip" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"fill_mode" x0
+      )
+
+instance
+  (ty ~ SDL_GPUFillMode)
+  => BG.HasField "fill_mode" (BG.Ptr SDL_GPURasterizerState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"fill_mode")
+
+instance HasCField.HasCField SDL_GPURasterizerState "fill_mode" where
+  type
+    CFieldType SDL_GPURasterizerState "fill_mode" =
+      SDL_GPUFillMode
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_GPUCullMode)
+  => BG.CompatHasField.HasField "cull_mode" SDL_GPURasterizerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURasterizerState
+            { cull_mode = y1
+            , fill_mode = BG.getField @"fill_mode" x0
+            , front_face = BG.getField @"front_face" x0
+            , depth_bias_constant_factor = BG.getField @"depth_bias_constant_factor" x0
+            , depth_bias_clamp = BG.getField @"depth_bias_clamp" x0
+            , depth_bias_slope_factor = BG.getField @"depth_bias_slope_factor" x0
+            , enable_depth_bias = BG.getField @"enable_depth_bias" x0
+            , enable_depth_clip = BG.getField @"enable_depth_clip" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"cull_mode" x0
+      )
+
+instance
+  (ty ~ SDL_GPUCullMode)
+  => BG.HasField "cull_mode" (BG.Ptr SDL_GPURasterizerState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"cull_mode")
+
+instance HasCField.HasCField SDL_GPURasterizerState "cull_mode" where
+  type
+    CFieldType SDL_GPURasterizerState "cull_mode" =
+      SDL_GPUCullMode
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL_GPUFrontFace)
+  => BG.CompatHasField.HasField "front_face" SDL_GPURasterizerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURasterizerState
+            { front_face = y1
+            , fill_mode = BG.getField @"fill_mode" x0
+            , cull_mode = BG.getField @"cull_mode" x0
+            , depth_bias_constant_factor = BG.getField @"depth_bias_constant_factor" x0
+            , depth_bias_clamp = BG.getField @"depth_bias_clamp" x0
+            , depth_bias_slope_factor = BG.getField @"depth_bias_slope_factor" x0
+            , enable_depth_bias = BG.getField @"enable_depth_bias" x0
+            , enable_depth_clip = BG.getField @"enable_depth_clip" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"front_face" x0
+      )
+
+instance
+  (ty ~ SDL_GPUFrontFace)
+  => BG.HasField "front_face" (BG.Ptr SDL_GPURasterizerState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"front_face")
+
+instance HasCField.HasCField SDL_GPURasterizerState "front_face" where
+  type
+    CFieldType SDL_GPURasterizerState "front_face" =
+      SDL_GPUFrontFace
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "depth_bias_constant_factor" SDL_GPURasterizerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURasterizerState
+            { depth_bias_constant_factor = y1
+            , fill_mode = BG.getField @"fill_mode" x0
+            , cull_mode = BG.getField @"cull_mode" x0
+            , front_face = BG.getField @"front_face" x0
+            , depth_bias_clamp = BG.getField @"depth_bias_clamp" x0
+            , depth_bias_slope_factor = BG.getField @"depth_bias_slope_factor" x0
+            , enable_depth_bias = BG.getField @"enable_depth_bias" x0
+            , enable_depth_clip = BG.getField @"enable_depth_clip" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"depth_bias_constant_factor" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "depth_bias_constant_factor" (BG.Ptr SDL_GPURasterizerState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"depth_bias_constant_factor")
+
+instance HasCField.HasCField SDL_GPURasterizerState "depth_bias_constant_factor" where
+  type
+    CFieldType SDL_GPURasterizerState "depth_bias_constant_factor" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "depth_bias_clamp" SDL_GPURasterizerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURasterizerState
+            { depth_bias_clamp = y1
+            , fill_mode = BG.getField @"fill_mode" x0
+            , cull_mode = BG.getField @"cull_mode" x0
+            , front_face = BG.getField @"front_face" x0
+            , depth_bias_constant_factor = BG.getField @"depth_bias_constant_factor" x0
+            , depth_bias_slope_factor = BG.getField @"depth_bias_slope_factor" x0
+            , enable_depth_bias = BG.getField @"enable_depth_bias" x0
+            , enable_depth_clip = BG.getField @"enable_depth_clip" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"depth_bias_clamp" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "depth_bias_clamp" (BG.Ptr SDL_GPURasterizerState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"depth_bias_clamp")
+
+instance HasCField.HasCField SDL_GPURasterizerState "depth_bias_clamp" where
+  type
+    CFieldType SDL_GPURasterizerState "depth_bias_clamp" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "depth_bias_slope_factor" SDL_GPURasterizerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURasterizerState
+            { depth_bias_slope_factor = y1
+            , fill_mode = BG.getField @"fill_mode" x0
+            , cull_mode = BG.getField @"cull_mode" x0
+            , front_face = BG.getField @"front_face" x0
+            , depth_bias_constant_factor = BG.getField @"depth_bias_constant_factor" x0
+            , depth_bias_clamp = BG.getField @"depth_bias_clamp" x0
+            , enable_depth_bias = BG.getField @"enable_depth_bias" x0
+            , enable_depth_clip = BG.getField @"enable_depth_clip" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"depth_bias_slope_factor" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "depth_bias_slope_factor" (BG.Ptr SDL_GPURasterizerState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"depth_bias_slope_factor")
+
+instance HasCField.HasCField SDL_GPURasterizerState "depth_bias_slope_factor" where
+  type
+    CFieldType SDL_GPURasterizerState "depth_bias_slope_factor" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_depth_bias" SDL_GPURasterizerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURasterizerState
+            { enable_depth_bias = y1
+            , fill_mode = BG.getField @"fill_mode" x0
+            , cull_mode = BG.getField @"cull_mode" x0
+            , front_face = BG.getField @"front_face" x0
+            , depth_bias_constant_factor = BG.getField @"depth_bias_constant_factor" x0
+            , depth_bias_clamp = BG.getField @"depth_bias_clamp" x0
+            , depth_bias_slope_factor = BG.getField @"depth_bias_slope_factor" x0
+            , enable_depth_clip = BG.getField @"enable_depth_clip" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"enable_depth_bias" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_depth_bias" (BG.Ptr SDL_GPURasterizerState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_depth_bias")
+
+instance HasCField.HasCField SDL_GPURasterizerState "enable_depth_bias" where
+  type
+    CFieldType SDL_GPURasterizerState "enable_depth_bias" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_depth_clip" SDL_GPURasterizerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURasterizerState
+            { enable_depth_clip = y1
+            , fill_mode = BG.getField @"fill_mode" x0
+            , cull_mode = BG.getField @"cull_mode" x0
+            , front_face = BG.getField @"front_face" x0
+            , depth_bias_constant_factor = BG.getField @"depth_bias_constant_factor" x0
+            , depth_bias_clamp = BG.getField @"depth_bias_clamp" x0
+            , depth_bias_slope_factor = BG.getField @"depth_bias_slope_factor" x0
+            , enable_depth_bias = BG.getField @"enable_depth_bias" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"enable_depth_clip" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_depth_clip" (BG.Ptr SDL_GPURasterizerState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_depth_clip")
+
+instance HasCField.HasCField SDL_GPURasterizerState "enable_depth_clip" where
+  type
+    CFieldType SDL_GPURasterizerState "enable_depth_clip" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 25
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GPURasterizerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURasterizerState
+            { padding1 = y1
+            , fill_mode = BG.getField @"fill_mode" x0
+            , cull_mode = BG.getField @"cull_mode" x0
+            , front_face = BG.getField @"front_face" x0
+            , depth_bias_constant_factor = BG.getField @"depth_bias_constant_factor" x0
+            , depth_bias_clamp = BG.getField @"depth_bias_clamp" x0
+            , depth_bias_slope_factor = BG.getField @"depth_bias_slope_factor" x0
+            , enable_depth_bias = BG.getField @"enable_depth_bias" x0
+            , enable_depth_clip = BG.getField @"enable_depth_clip" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GPURasterizerState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GPURasterizerState "padding1" where
+  type
+    CFieldType SDL_GPURasterizerState "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 26
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GPURasterizerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURasterizerState
+            { padding2 = y1
+            , fill_mode = BG.getField @"fill_mode" x0
+            , cull_mode = BG.getField @"cull_mode" x0
+            , front_face = BG.getField @"front_face" x0
+            , depth_bias_constant_factor = BG.getField @"depth_bias_constant_factor" x0
+            , depth_bias_clamp = BG.getField @"depth_bias_clamp" x0
+            , depth_bias_slope_factor = BG.getField @"depth_bias_slope_factor" x0
+            , enable_depth_bias = BG.getField @"enable_depth_bias" x0
+            , enable_depth_clip = BG.getField @"enable_depth_clip" x0
+            , padding1 = BG.getField @"padding1" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GPURasterizerState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GPURasterizerState "padding2" where
+  type
+    CFieldType SDL_GPURasterizerState "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 27
+
+-- | A structure specifying the parameters of the graphics pipeline multisample state.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GPUGraphicsPipelineCreateInfo'
+--
+--     [C declaration]: @struct SDL_GPUMultisampleState@, defined at @SDL3\/SDL_gpu.h 1858:16@
+data SDL_GPUMultisampleState = SDL_GPUMultisampleState
+  { sample_count :: SDL_GPUSampleCount
+  -- ^ The number of samples to be used in rasterization.
+  --
+  --          [C declaration]: @sample_count@, defined at @SDL3\/SDL_gpu.h 1860:24@
+  , sample_mask :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Reserved for future use. Must be set to 0.
+  --
+  --          [C declaration]: @sample_mask@, defined at @SDL3\/SDL_gpu.h 1861:12@
+  , enable_mask :: BG.CBool
+  -- ^ Reserved for future use. Must be set to false.
+  --
+  --          [C declaration]: @enable_mask@, defined at @SDL3\/SDL_gpu.h 1862:10@
+  , enable_alpha_to_coverage :: BG.CBool
+  -- ^ true enables the alpha-to-coverage feature.
+  --
+  --          [C declaration]: @enable_alpha_to_coverage@, defined at @SDL3\/SDL_gpu.h 1863:10@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_gpu.h 1864:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_gpu.h 1865:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUMultisampleState where
+  staticSizeOf = \_ -> (12 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUMultisampleState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUMultisampleState
+        <*> HasCField.readRaw (BG.Proxy @"sample_count") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"sample_mask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_mask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_alpha_to_coverage") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+
+instance Marshal.WriteRaw SDL_GPUMultisampleState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUMultisampleState
+            sample_count2
+            sample_mask3
+            enable_mask4
+            enable_alpha_to_coverage5
+            padding26
+            padding37 ->
+              HasCField.writeRaw (BG.Proxy @"sample_count") ptr0 sample_count2
+                >> HasCField.writeRaw (BG.Proxy @"sample_mask") ptr0 sample_mask3
+                >> HasCField.writeRaw (BG.Proxy @"enable_mask") ptr0 enable_mask4
+                >> HasCField.writeRaw (BG.Proxy @"enable_alpha_to_coverage") ptr0 enable_alpha_to_coverage5
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding26
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding37
+
+deriving via
+  Marshal.EquivStorable SDL_GPUMultisampleState
+  instance
+    BG.Storable SDL_GPUMultisampleState
+
+instance
+  (ty ~ SDL_GPUSampleCount)
+  => BG.CompatHasField.HasField "sample_count" SDL_GPUMultisampleState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUMultisampleState
+            { sample_count = y1
+            , sample_mask = BG.getField @"sample_mask" x0
+            , enable_mask = BG.getField @"enable_mask" x0
+            , enable_alpha_to_coverage = BG.getField @"enable_alpha_to_coverage" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"sample_count" x0
+      )
+
+instance
+  (ty ~ SDL_GPUSampleCount)
+  => BG.HasField "sample_count" (BG.Ptr SDL_GPUMultisampleState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"sample_count")
+
+instance HasCField.HasCField SDL_GPUMultisampleState "sample_count" where
+  type
+    CFieldType SDL_GPUMultisampleState "sample_count" =
+      SDL_GPUSampleCount
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "sample_mask" SDL_GPUMultisampleState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUMultisampleState
+            { sample_mask = y1
+            , sample_count = BG.getField @"sample_count" x0
+            , enable_mask = BG.getField @"enable_mask" x0
+            , enable_alpha_to_coverage = BG.getField @"enable_alpha_to_coverage" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"sample_mask" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "sample_mask" (BG.Ptr SDL_GPUMultisampleState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"sample_mask")
+
+instance HasCField.HasCField SDL_GPUMultisampleState "sample_mask" where
+  type
+    CFieldType SDL_GPUMultisampleState "sample_mask" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_mask" SDL_GPUMultisampleState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUMultisampleState
+            { enable_mask = y1
+            , sample_count = BG.getField @"sample_count" x0
+            , sample_mask = BG.getField @"sample_mask" x0
+            , enable_alpha_to_coverage = BG.getField @"enable_alpha_to_coverage" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"enable_mask" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_mask" (BG.Ptr SDL_GPUMultisampleState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_mask")
+
+instance HasCField.HasCField SDL_GPUMultisampleState "enable_mask" where
+  type
+    CFieldType SDL_GPUMultisampleState "enable_mask" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_alpha_to_coverage" SDL_GPUMultisampleState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUMultisampleState
+            { enable_alpha_to_coverage = y1
+            , sample_count = BG.getField @"sample_count" x0
+            , sample_mask = BG.getField @"sample_mask" x0
+            , enable_mask = BG.getField @"enable_mask" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"enable_alpha_to_coverage" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_alpha_to_coverage" (BG.Ptr SDL_GPUMultisampleState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_alpha_to_coverage")
+
+instance HasCField.HasCField SDL_GPUMultisampleState "enable_alpha_to_coverage" where
+  type
+    CFieldType SDL_GPUMultisampleState "enable_alpha_to_coverage" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 9
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GPUMultisampleState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUMultisampleState
+            { padding2 = y1
+            , sample_count = BG.getField @"sample_count" x0
+            , sample_mask = BG.getField @"sample_mask" x0
+            , enable_mask = BG.getField @"enable_mask" x0
+            , enable_alpha_to_coverage = BG.getField @"enable_alpha_to_coverage" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GPUMultisampleState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GPUMultisampleState "padding2" where
+  type
+    CFieldType SDL_GPUMultisampleState "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 10
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_GPUMultisampleState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUMultisampleState
+            { padding3 = y1
+            , sample_count = BG.getField @"sample_count" x0
+            , sample_mask = BG.getField @"sample_mask" x0
+            , enable_mask = BG.getField @"enable_mask" x0
+            , enable_alpha_to_coverage = BG.getField @"enable_alpha_to_coverage" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_GPUMultisampleState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_GPUMultisampleState "padding3" where
+  type
+    CFieldType SDL_GPUMultisampleState "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 11
+
+-- | A structure specifying the parameters of the graphics pipeline depth stencil state.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GPUGraphicsPipelineCreateInfo'
+--
+--     [C declaration]: @struct SDL_GPUDepthStencilState@, defined at @SDL3\/SDL_gpu.h 1876:16@
+data SDL_GPUDepthStencilState = SDL_GPUDepthStencilState
+  { compare_op :: SDL_GPUCompareOp
+  -- ^ The comparison operator used for depth testing.
+  --
+  --          [C declaration]: @compare_op@, defined at @SDL3\/SDL_gpu.h 1878:22@
+  , back_stencil_state :: SDL_GPUStencilOpState
+  -- ^ The stencil op state for back-facing triangles.
+  --
+  --          [C declaration]: @back_stencil_state@, defined at @SDL3\/SDL_gpu.h 1879:27@
+  , front_stencil_state :: SDL_GPUStencilOpState
+  -- ^ The stencil op state for front-facing triangles.
+  --
+  --          [C declaration]: @front_stencil_state@, defined at @SDL3\/SDL_gpu.h 1880:27@
+  , compare_mask :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ Selects the bits of the stencil values participating in the stencil test.
+  --
+  --          [C declaration]: @compare_mask@, defined at @SDL3\/SDL_gpu.h 1881:11@
+  , write_mask :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ Selects the bits of the stencil values updated by the stencil test.
+  --
+  --          [C declaration]: @write_mask@, defined at @SDL3\/SDL_gpu.h 1882:11@
+  , enable_depth_test :: BG.CBool
+  -- ^ true enables the depth test.
+  --
+  --          [C declaration]: @enable_depth_test@, defined at @SDL3\/SDL_gpu.h 1883:10@
+  , enable_depth_write :: BG.CBool
+  -- ^ true enables depth writes. Depth writes are always disabled when enable_depth_test is false.
+  --
+  --          [C declaration]: @enable_depth_write@, defined at @SDL3\/SDL_gpu.h 1884:10@
+  , enable_stencil_test :: BG.CBool
+  -- ^ true enables the stencil test.
+  --
+  --          [C declaration]: @enable_stencil_test@, defined at @SDL3\/SDL_gpu.h 1885:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_gpu.h 1886:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_gpu.h 1887:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_gpu.h 1888:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUDepthStencilState where
+  staticSizeOf = \_ -> (44 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUDepthStencilState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUDepthStencilState
+        <*> HasCField.readRaw (BG.Proxy @"compare_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"back_stencil_state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"front_stencil_state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"compare_mask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"write_mask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_depth_test") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_depth_write") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enable_stencil_test") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+
+instance Marshal.WriteRaw SDL_GPUDepthStencilState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUDepthStencilState
+            compare_op2
+            back_stencil_state3
+            front_stencil_state4
+            compare_mask5
+            write_mask6
+            enable_depth_test7
+            enable_depth_write8
+            enable_stencil_test9
+            padding110
+            padding211
+            padding312 ->
+              HasCField.writeRaw (BG.Proxy @"compare_op") ptr0 compare_op2
+                >> HasCField.writeRaw (BG.Proxy @"back_stencil_state") ptr0 back_stencil_state3
+                >> HasCField.writeRaw (BG.Proxy @"front_stencil_state") ptr0 front_stencil_state4
+                >> HasCField.writeRaw (BG.Proxy @"compare_mask") ptr0 compare_mask5
+                >> HasCField.writeRaw (BG.Proxy @"write_mask") ptr0 write_mask6
+                >> HasCField.writeRaw (BG.Proxy @"enable_depth_test") ptr0 enable_depth_test7
+                >> HasCField.writeRaw (BG.Proxy @"enable_depth_write") ptr0 enable_depth_write8
+                >> HasCField.writeRaw (BG.Proxy @"enable_stencil_test") ptr0 enable_stencil_test9
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding110
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding211
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding312
+
+deriving via
+  Marshal.EquivStorable SDL_GPUDepthStencilState
+  instance
+    BG.Storable SDL_GPUDepthStencilState
+
+instance
+  (ty ~ SDL_GPUCompareOp)
+  => BG.CompatHasField.HasField "compare_op" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { compare_op = y1
+            , back_stencil_state = BG.getField @"back_stencil_state" x0
+            , front_stencil_state = BG.getField @"front_stencil_state" x0
+            , compare_mask = BG.getField @"compare_mask" x0
+            , write_mask = BG.getField @"write_mask" x0
+            , enable_depth_test = BG.getField @"enable_depth_test" x0
+            , enable_depth_write = BG.getField @"enable_depth_write" x0
+            , enable_stencil_test = BG.getField @"enable_stencil_test" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"compare_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUCompareOp)
+  => BG.HasField "compare_op" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"compare_op")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "compare_op" where
+  type
+    CFieldType SDL_GPUDepthStencilState "compare_op" =
+      SDL_GPUCompareOp
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_GPUStencilOpState)
+  => BG.CompatHasField.HasField "back_stencil_state" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { back_stencil_state = y1
+            , compare_op = BG.getField @"compare_op" x0
+            , front_stencil_state = BG.getField @"front_stencil_state" x0
+            , compare_mask = BG.getField @"compare_mask" x0
+            , write_mask = BG.getField @"write_mask" x0
+            , enable_depth_test = BG.getField @"enable_depth_test" x0
+            , enable_depth_write = BG.getField @"enable_depth_write" x0
+            , enable_stencil_test = BG.getField @"enable_stencil_test" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"back_stencil_state" x0
+      )
+
+instance
+  (ty ~ SDL_GPUStencilOpState)
+  => BG.HasField "back_stencil_state" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"back_stencil_state")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "back_stencil_state" where
+  type
+    CFieldType SDL_GPUDepthStencilState "back_stencil_state" =
+      SDL_GPUStencilOpState
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL_GPUStencilOpState)
+  => BG.CompatHasField.HasField "front_stencil_state" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { front_stencil_state = y1
+            , compare_op = BG.getField @"compare_op" x0
+            , back_stencil_state = BG.getField @"back_stencil_state" x0
+            , compare_mask = BG.getField @"compare_mask" x0
+            , write_mask = BG.getField @"write_mask" x0
+            , enable_depth_test = BG.getField @"enable_depth_test" x0
+            , enable_depth_write = BG.getField @"enable_depth_write" x0
+            , enable_stencil_test = BG.getField @"enable_stencil_test" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"front_stencil_state" x0
+      )
+
+instance
+  (ty ~ SDL_GPUStencilOpState)
+  => BG.HasField "front_stencil_state" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"front_stencil_state")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "front_stencil_state" where
+  type
+    CFieldType SDL_GPUDepthStencilState "front_stencil_state" =
+      SDL_GPUStencilOpState
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "compare_mask" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { compare_mask = y1
+            , compare_op = BG.getField @"compare_op" x0
+            , back_stencil_state = BG.getField @"back_stencil_state" x0
+            , front_stencil_state = BG.getField @"front_stencil_state" x0
+            , write_mask = BG.getField @"write_mask" x0
+            , enable_depth_test = BG.getField @"enable_depth_test" x0
+            , enable_depth_write = BG.getField @"enable_depth_write" x0
+            , enable_stencil_test = BG.getField @"enable_stencil_test" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"compare_mask" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "compare_mask" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"compare_mask")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "compare_mask" where
+  type
+    CFieldType SDL_GPUDepthStencilState "compare_mask" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "write_mask" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { write_mask = y1
+            , compare_op = BG.getField @"compare_op" x0
+            , back_stencil_state = BG.getField @"back_stencil_state" x0
+            , front_stencil_state = BG.getField @"front_stencil_state" x0
+            , compare_mask = BG.getField @"compare_mask" x0
+            , enable_depth_test = BG.getField @"enable_depth_test" x0
+            , enable_depth_write = BG.getField @"enable_depth_write" x0
+            , enable_stencil_test = BG.getField @"enable_stencil_test" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"write_mask" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "write_mask" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"write_mask")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "write_mask" where
+  type
+    CFieldType SDL_GPUDepthStencilState "write_mask" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 37
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_depth_test" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { enable_depth_test = y1
+            , compare_op = BG.getField @"compare_op" x0
+            , back_stencil_state = BG.getField @"back_stencil_state" x0
+            , front_stencil_state = BG.getField @"front_stencil_state" x0
+            , compare_mask = BG.getField @"compare_mask" x0
+            , write_mask = BG.getField @"write_mask" x0
+            , enable_depth_write = BG.getField @"enable_depth_write" x0
+            , enable_stencil_test = BG.getField @"enable_stencil_test" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"enable_depth_test" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_depth_test" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_depth_test")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "enable_depth_test" where
+  type
+    CFieldType SDL_GPUDepthStencilState "enable_depth_test" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 38
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_depth_write" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { enable_depth_write = y1
+            , compare_op = BG.getField @"compare_op" x0
+            , back_stencil_state = BG.getField @"back_stencil_state" x0
+            , front_stencil_state = BG.getField @"front_stencil_state" x0
+            , compare_mask = BG.getField @"compare_mask" x0
+            , write_mask = BG.getField @"write_mask" x0
+            , enable_depth_test = BG.getField @"enable_depth_test" x0
+            , enable_stencil_test = BG.getField @"enable_stencil_test" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"enable_depth_write" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_depth_write" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_depth_write")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "enable_depth_write" where
+  type
+    CFieldType SDL_GPUDepthStencilState "enable_depth_write" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 39
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "enable_stencil_test" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { enable_stencil_test = y1
+            , compare_op = BG.getField @"compare_op" x0
+            , back_stencil_state = BG.getField @"back_stencil_state" x0
+            , front_stencil_state = BG.getField @"front_stencil_state" x0
+            , compare_mask = BG.getField @"compare_mask" x0
+            , write_mask = BG.getField @"write_mask" x0
+            , enable_depth_test = BG.getField @"enable_depth_test" x0
+            , enable_depth_write = BG.getField @"enable_depth_write" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"enable_stencil_test" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "enable_stencil_test" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"enable_stencil_test")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "enable_stencil_test" where
+  type
+    CFieldType SDL_GPUDepthStencilState "enable_stencil_test" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { padding1 = y1
+            , compare_op = BG.getField @"compare_op" x0
+            , back_stencil_state = BG.getField @"back_stencil_state" x0
+            , front_stencil_state = BG.getField @"front_stencil_state" x0
+            , compare_mask = BG.getField @"compare_mask" x0
+            , write_mask = BG.getField @"write_mask" x0
+            , enable_depth_test = BG.getField @"enable_depth_test" x0
+            , enable_depth_write = BG.getField @"enable_depth_write" x0
+            , enable_stencil_test = BG.getField @"enable_stencil_test" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "padding1" where
+  type
+    CFieldType SDL_GPUDepthStencilState "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 41
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { padding2 = y1
+            , compare_op = BG.getField @"compare_op" x0
+            , back_stencil_state = BG.getField @"back_stencil_state" x0
+            , front_stencil_state = BG.getField @"front_stencil_state" x0
+            , compare_mask = BG.getField @"compare_mask" x0
+            , write_mask = BG.getField @"write_mask" x0
+            , enable_depth_test = BG.getField @"enable_depth_test" x0
+            , enable_depth_write = BG.getField @"enable_depth_write" x0
+            , enable_stencil_test = BG.getField @"enable_stencil_test" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "padding2" where
+  type
+    CFieldType SDL_GPUDepthStencilState "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 42
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_GPUDepthStencilState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilState
+            { padding3 = y1
+            , compare_op = BG.getField @"compare_op" x0
+            , back_stencil_state = BG.getField @"back_stencil_state" x0
+            , front_stencil_state = BG.getField @"front_stencil_state" x0
+            , compare_mask = BG.getField @"compare_mask" x0
+            , write_mask = BG.getField @"write_mask" x0
+            , enable_depth_test = BG.getField @"enable_depth_test" x0
+            , enable_depth_write = BG.getField @"enable_depth_write" x0
+            , enable_stencil_test = BG.getField @"enable_stencil_test" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_GPUDepthStencilState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_GPUDepthStencilState "padding3" where
+  type
+    CFieldType SDL_GPUDepthStencilState "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 43
+
+-- | A structure specifying the parameters of color targets used in a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GPUGraphicsPipelineTargetInfo'
+--
+--     [C declaration]: @struct SDL_GPUColorTargetDescription@, defined at @SDL3\/SDL_gpu.h 1899:16@
+data SDL_GPUColorTargetDescription = SDL_GPUColorTargetDescription
+  { format :: SDL_GPUTextureFormat
+  -- ^ The pixel format of the texture to be used as a color target.
+  --
+  --          [C declaration]: @format@, defined at @SDL3\/SDL_gpu.h 1901:26@
+  , blend_state :: SDL_GPUColorTargetBlendState
+  -- ^ The blend state to be used for the color target.
+  --
+  --          [C declaration]: @blend_state@, defined at @SDL3\/SDL_gpu.h 1902:34@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUColorTargetDescription where
+  staticSizeOf = \_ -> (36 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUColorTargetDescription where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUColorTargetDescription
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"blend_state") ptr0
+
+instance Marshal.WriteRaw SDL_GPUColorTargetDescription where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUColorTargetDescription format2 blend_state3 ->
+            HasCField.writeRaw (BG.Proxy @"format") ptr0 format2
+              >> HasCField.writeRaw (BG.Proxy @"blend_state") ptr0 blend_state3
+
+deriving via
+  Marshal.EquivStorable SDL_GPUColorTargetDescription
+  instance
+    BG.Storable SDL_GPUColorTargetDescription
+
+instance
+  (ty ~ SDL_GPUTextureFormat)
+  => BG.CompatHasField.HasField "format" SDL_GPUColorTargetDescription ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetDescription{format = y1, blend_state = BG.getField @"blend_state" x0}
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL_GPUTextureFormat)
+  => BG.HasField "format" (BG.Ptr SDL_GPUColorTargetDescription) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_GPUColorTargetDescription "format" where
+  type
+    CFieldType SDL_GPUColorTargetDescription "format" =
+      SDL_GPUTextureFormat
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_GPUColorTargetBlendState)
+  => BG.CompatHasField.HasField "blend_state" SDL_GPUColorTargetDescription ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetDescription{blend_state = y1, format = BG.getField @"format" x0}
+      , BG.getField @"blend_state" x0
+      )
+
+instance
+  (ty ~ SDL_GPUColorTargetBlendState)
+  => BG.HasField "blend_state" (BG.Ptr SDL_GPUColorTargetDescription) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"blend_state")
+
+instance HasCField.HasCField SDL_GPUColorTargetDescription "blend_state" where
+  type
+    CFieldType SDL_GPUColorTargetDescription "blend_state" =
+      SDL_GPUColorTargetBlendState
+
+  offset# = \_ -> \_ -> 4
+
+-- | A structure specifying the descriptions of render targets used in a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_GPUGraphicsPipelineCreateInfo', 'SDL_GPUColorTargetDescription', 'SDL_GPUTextureFormat'
+--
+--     [C declaration]: @struct SDL_GPUGraphicsPipelineTargetInfo@, defined at @SDL3\/SDL_gpu.h 1915:16@
+data SDL_GPUGraphicsPipelineTargetInfo = SDL_GPUGraphicsPipelineTargetInfo
+  { color_target_descriptions :: PtrConst.PtrConst SDL_GPUColorTargetDescription
+  -- ^ A pointer to an array of color target descriptions.
+  --
+  --          [C declaration]: @color_target_descriptions@, defined at @SDL3\/SDL_gpu.h 1917:42@
+  , num_color_targets :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of color target descriptions in the above array.
+  --
+  --          [C declaration]: @num_color_targets@, defined at @SDL3\/SDL_gpu.h 1918:12@
+  , depth_stencil_format :: SDL_GPUTextureFormat
+  -- ^ The pixel format of the depth-stencil target. Ignored if has_depth_stencil_target is false.
+  --
+  --          [C declaration]: @depth_stencil_format@, defined at @SDL3\/SDL_gpu.h 1919:26@
+  , has_depth_stencil_target :: BG.CBool
+  -- ^ true specifies that the pipeline uses a depth-stencil target.
+  --
+  --          [C declaration]: @has_depth_stencil_target@, defined at @SDL3\/SDL_gpu.h 1920:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_gpu.h 1921:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_gpu.h 1922:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_gpu.h 1923:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUGraphicsPipelineTargetInfo where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUGraphicsPipelineTargetInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUGraphicsPipelineTargetInfo
+        <*> HasCField.readRaw (BG.Proxy @"color_target_descriptions") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_color_targets") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"depth_stencil_format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"has_depth_stencil_target") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+
+instance Marshal.WriteRaw SDL_GPUGraphicsPipelineTargetInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUGraphicsPipelineTargetInfo
+            color_target_descriptions2
+            num_color_targets3
+            depth_stencil_format4
+            has_depth_stencil_target5
+            padding16
+            padding27
+            padding38 ->
+              HasCField.writeRaw (BG.Proxy @"color_target_descriptions") ptr0 color_target_descriptions2
+                >> HasCField.writeRaw (BG.Proxy @"num_color_targets") ptr0 num_color_targets3
+                >> HasCField.writeRaw (BG.Proxy @"depth_stencil_format") ptr0 depth_stencil_format4
+                >> HasCField.writeRaw (BG.Proxy @"has_depth_stencil_target") ptr0 has_depth_stencil_target5
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding16
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding27
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding38
+
+deriving via
+  Marshal.EquivStorable SDL_GPUGraphicsPipelineTargetInfo
+  instance
+    BG.Storable SDL_GPUGraphicsPipelineTargetInfo
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_GPUColorTargetDescription)
+  => BG.CompatHasField.HasField "color_target_descriptions" SDL_GPUGraphicsPipelineTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineTargetInfo
+            { color_target_descriptions = y1
+            , num_color_targets = BG.getField @"num_color_targets" x0
+            , depth_stencil_format = BG.getField @"depth_stencil_format" x0
+            , has_depth_stencil_target = BG.getField @"has_depth_stencil_target" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"color_target_descriptions" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_GPUColorTargetDescription)
+  => BG.HasField "color_target_descriptions" (BG.Ptr SDL_GPUGraphicsPipelineTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"color_target_descriptions")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineTargetInfo "color_target_descriptions" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineTargetInfo "color_target_descriptions" =
+      PtrConst.PtrConst SDL_GPUColorTargetDescription
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_color_targets" SDL_GPUGraphicsPipelineTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineTargetInfo
+            { num_color_targets = y1
+            , color_target_descriptions = BG.getField @"color_target_descriptions" x0
+            , depth_stencil_format = BG.getField @"depth_stencil_format" x0
+            , has_depth_stencil_target = BG.getField @"has_depth_stencil_target" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"num_color_targets" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_color_targets" (BG.Ptr SDL_GPUGraphicsPipelineTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_color_targets")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineTargetInfo "num_color_targets" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineTargetInfo "num_color_targets" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL_GPUTextureFormat)
+  => BG.CompatHasField.HasField "depth_stencil_format" SDL_GPUGraphicsPipelineTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineTargetInfo
+            { depth_stencil_format = y1
+            , color_target_descriptions = BG.getField @"color_target_descriptions" x0
+            , num_color_targets = BG.getField @"num_color_targets" x0
+            , has_depth_stencil_target = BG.getField @"has_depth_stencil_target" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"depth_stencil_format" x0
+      )
+
+instance
+  (ty ~ SDL_GPUTextureFormat)
+  => BG.HasField "depth_stencil_format" (BG.Ptr SDL_GPUGraphicsPipelineTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"depth_stencil_format")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineTargetInfo "depth_stencil_format" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineTargetInfo "depth_stencil_format" =
+      SDL_GPUTextureFormat
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "has_depth_stencil_target" SDL_GPUGraphicsPipelineTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineTargetInfo
+            { has_depth_stencil_target = y1
+            , color_target_descriptions = BG.getField @"color_target_descriptions" x0
+            , num_color_targets = BG.getField @"num_color_targets" x0
+            , depth_stencil_format = BG.getField @"depth_stencil_format" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"has_depth_stencil_target" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "has_depth_stencil_target" (BG.Ptr SDL_GPUGraphicsPipelineTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"has_depth_stencil_target")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineTargetInfo "has_depth_stencil_target" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineTargetInfo "has_depth_stencil_target" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GPUGraphicsPipelineTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineTargetInfo
+            { padding1 = y1
+            , color_target_descriptions = BG.getField @"color_target_descriptions" x0
+            , num_color_targets = BG.getField @"num_color_targets" x0
+            , depth_stencil_format = BG.getField @"depth_stencil_format" x0
+            , has_depth_stencil_target = BG.getField @"has_depth_stencil_target" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GPUGraphicsPipelineTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineTargetInfo "padding1" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineTargetInfo "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 17
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GPUGraphicsPipelineTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineTargetInfo
+            { padding2 = y1
+            , color_target_descriptions = BG.getField @"color_target_descriptions" x0
+            , num_color_targets = BG.getField @"num_color_targets" x0
+            , depth_stencil_format = BG.getField @"depth_stencil_format" x0
+            , has_depth_stencil_target = BG.getField @"has_depth_stencil_target" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GPUGraphicsPipelineTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineTargetInfo "padding2" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineTargetInfo "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 18
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_GPUGraphicsPipelineTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineTargetInfo
+            { padding3 = y1
+            , color_target_descriptions = BG.getField @"color_target_descriptions" x0
+            , num_color_targets = BG.getField @"num_color_targets" x0
+            , depth_stencil_format = BG.getField @"depth_stencil_format" x0
+            , has_depth_stencil_target = BG.getField @"has_depth_stencil_target" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_GPUGraphicsPipelineTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineTargetInfo "padding3" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineTargetInfo "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 19
+
+-- | A structure specifying the parameters of a graphics pipeline state.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline', 'SDL_GPUShader', 'SDL_GPUVertexInputState', 'SDL_GPUPrimitiveType', 'SDL_GPURasterizerState', 'SDL_GPUMultisampleState', 'SDL_GPUDepthStencilState', 'SDL_GPUGraphicsPipelineTargetInfo'
+--
+--     [C declaration]: @struct SDL_GPUGraphicsPipelineCreateInfo@, defined at @SDL3\/SDL_gpu.h 1940:16@
+data SDL_GPUGraphicsPipelineCreateInfo = SDL_GPUGraphicsPipelineCreateInfo
+  { vertex_shader :: BG.Ptr SDL_GPUShader
+  -- ^ The vertex shader used by the graphics pipeline.
+  --
+  --          [C declaration]: @vertex_shader@, defined at @SDL3\/SDL_gpu.h 1942:20@
+  , fragment_shader :: BG.Ptr SDL_GPUShader
+  -- ^ The fragment shader used by the graphics pipeline.
+  --
+  --          [C declaration]: @fragment_shader@, defined at @SDL3\/SDL_gpu.h 1943:20@
+  , vertex_input_state :: SDL_GPUVertexInputState
+  -- ^ The vertex layout of the graphics pipeline.
+  --
+  --          [C declaration]: @vertex_input_state@, defined at @SDL3\/SDL_gpu.h 1944:29@
+  , primitive_type :: SDL_GPUPrimitiveType
+  -- ^ The primitive topology of the graphics pipeline.
+  --
+  --          [C declaration]: @primitive_type@, defined at @SDL3\/SDL_gpu.h 1945:26@
+  , rasterizer_state :: SDL_GPURasterizerState
+  -- ^ The rasterizer state of the graphics pipeline.
+  --
+  --          [C declaration]: @rasterizer_state@, defined at @SDL3\/SDL_gpu.h 1946:28@
+  , multisample_state :: SDL_GPUMultisampleState
+  -- ^ The multisample state of the graphics pipeline.
+  --
+  --          [C declaration]: @multisample_state@, defined at @SDL3\/SDL_gpu.h 1947:29@
+  , depth_stencil_state :: SDL_GPUDepthStencilState
+  -- ^ The depth-stencil state of the graphics pipeline.
+  --
+  --          [C declaration]: @depth_stencil_state@, defined at @SDL3\/SDL_gpu.h 1948:30@
+  , target_info :: SDL_GPUGraphicsPipelineTargetInfo
+  -- ^ Formats and blend modes for the render targets of the graphics pipeline.
+  --
+  --          [C declaration]: @target_info@, defined at @SDL3\/SDL_gpu.h 1949:39@
+  , props :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^ A properties ID for extensions. Should be 0 if no extensions are needed.
+  --
+  --          [C declaration]: @props@, defined at @SDL3\/SDL_gpu.h 1951:22@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUGraphicsPipelineCreateInfo where
+  staticSizeOf = \_ -> (168 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUGraphicsPipelineCreateInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUGraphicsPipelineCreateInfo
+        <*> HasCField.readRaw (BG.Proxy @"vertex_shader") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"fragment_shader") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"vertex_input_state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"primitive_type") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"rasterizer_state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"multisample_state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"depth_stencil_state") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"target_info") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"props") ptr0
+
+instance Marshal.WriteRaw SDL_GPUGraphicsPipelineCreateInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUGraphicsPipelineCreateInfo
+            vertex_shader2
+            fragment_shader3
+            vertex_input_state4
+            primitive_type5
+            rasterizer_state6
+            multisample_state7
+            depth_stencil_state8
+            target_info9
+            props10 ->
+              HasCField.writeRaw (BG.Proxy @"vertex_shader") ptr0 vertex_shader2
+                >> HasCField.writeRaw (BG.Proxy @"fragment_shader") ptr0 fragment_shader3
+                >> HasCField.writeRaw (BG.Proxy @"vertex_input_state") ptr0 vertex_input_state4
+                >> HasCField.writeRaw (BG.Proxy @"primitive_type") ptr0 primitive_type5
+                >> HasCField.writeRaw (BG.Proxy @"rasterizer_state") ptr0 rasterizer_state6
+                >> HasCField.writeRaw (BG.Proxy @"multisample_state") ptr0 multisample_state7
+                >> HasCField.writeRaw (BG.Proxy @"depth_stencil_state") ptr0 depth_stencil_state8
+                >> HasCField.writeRaw (BG.Proxy @"target_info") ptr0 target_info9
+                >> HasCField.writeRaw (BG.Proxy @"props") ptr0 props10
+
+deriving via
+  Marshal.EquivStorable SDL_GPUGraphicsPipelineCreateInfo
+  instance
+    BG.Storable SDL_GPUGraphicsPipelineCreateInfo
+
+instance
+  (ty ~ BG.Ptr SDL_GPUShader)
+  => BG.CompatHasField.HasField "vertex_shader" SDL_GPUGraphicsPipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineCreateInfo
+            { vertex_shader = y1
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , vertex_input_state = BG.getField @"vertex_input_state" x0
+            , primitive_type = BG.getField @"primitive_type" x0
+            , rasterizer_state = BG.getField @"rasterizer_state" x0
+            , multisample_state = BG.getField @"multisample_state" x0
+            , depth_stencil_state = BG.getField @"depth_stencil_state" x0
+            , target_info = BG.getField @"target_info" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"vertex_shader" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUShader)
+  => BG.HasField "vertex_shader" (BG.Ptr SDL_GPUGraphicsPipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"vertex_shader")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineCreateInfo "vertex_shader" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineCreateInfo "vertex_shader" =
+      BG.Ptr SDL_GPUShader
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.Ptr SDL_GPUShader)
+  => BG.CompatHasField.HasField "fragment_shader" SDL_GPUGraphicsPipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineCreateInfo
+            { fragment_shader = y1
+            , vertex_shader = BG.getField @"vertex_shader" x0
+            , vertex_input_state = BG.getField @"vertex_input_state" x0
+            , primitive_type = BG.getField @"primitive_type" x0
+            , rasterizer_state = BG.getField @"rasterizer_state" x0
+            , multisample_state = BG.getField @"multisample_state" x0
+            , depth_stencil_state = BG.getField @"depth_stencil_state" x0
+            , target_info = BG.getField @"target_info" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"fragment_shader" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUShader)
+  => BG.HasField "fragment_shader" (BG.Ptr SDL_GPUGraphicsPipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"fragment_shader")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineCreateInfo "fragment_shader" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineCreateInfo "fragment_shader" =
+      BG.Ptr SDL_GPUShader
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL_GPUVertexInputState)
+  => BG.CompatHasField.HasField "vertex_input_state" SDL_GPUGraphicsPipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineCreateInfo
+            { vertex_input_state = y1
+            , vertex_shader = BG.getField @"vertex_shader" x0
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , primitive_type = BG.getField @"primitive_type" x0
+            , rasterizer_state = BG.getField @"rasterizer_state" x0
+            , multisample_state = BG.getField @"multisample_state" x0
+            , depth_stencil_state = BG.getField @"depth_stencil_state" x0
+            , target_info = BG.getField @"target_info" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"vertex_input_state" x0
+      )
+
+instance
+  (ty ~ SDL_GPUVertexInputState)
+  => BG.HasField "vertex_input_state" (BG.Ptr SDL_GPUGraphicsPipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"vertex_input_state")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineCreateInfo "vertex_input_state" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineCreateInfo "vertex_input_state" =
+      SDL_GPUVertexInputState
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL_GPUPrimitiveType)
+  => BG.CompatHasField.HasField "primitive_type" SDL_GPUGraphicsPipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineCreateInfo
+            { primitive_type = y1
+            , vertex_shader = BG.getField @"vertex_shader" x0
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , vertex_input_state = BG.getField @"vertex_input_state" x0
+            , rasterizer_state = BG.getField @"rasterizer_state" x0
+            , multisample_state = BG.getField @"multisample_state" x0
+            , depth_stencil_state = BG.getField @"depth_stencil_state" x0
+            , target_info = BG.getField @"target_info" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"primitive_type" x0
+      )
+
+instance
+  (ty ~ SDL_GPUPrimitiveType)
+  => BG.HasField "primitive_type" (BG.Ptr SDL_GPUGraphicsPipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"primitive_type")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineCreateInfo "primitive_type" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineCreateInfo "primitive_type" =
+      SDL_GPUPrimitiveType
+
+  offset# = \_ -> \_ -> 48
+
+instance
+  (ty ~ SDL_GPURasterizerState)
+  => BG.CompatHasField.HasField "rasterizer_state" SDL_GPUGraphicsPipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineCreateInfo
+            { rasterizer_state = y1
+            , vertex_shader = BG.getField @"vertex_shader" x0
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , vertex_input_state = BG.getField @"vertex_input_state" x0
+            , primitive_type = BG.getField @"primitive_type" x0
+            , multisample_state = BG.getField @"multisample_state" x0
+            , depth_stencil_state = BG.getField @"depth_stencil_state" x0
+            , target_info = BG.getField @"target_info" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"rasterizer_state" x0
+      )
+
+instance
+  (ty ~ SDL_GPURasterizerState)
+  => BG.HasField "rasterizer_state" (BG.Ptr SDL_GPUGraphicsPipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"rasterizer_state")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineCreateInfo "rasterizer_state" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineCreateInfo "rasterizer_state" =
+      SDL_GPURasterizerState
+
+  offset# = \_ -> \_ -> 52
+
+instance
+  (ty ~ SDL_GPUMultisampleState)
+  => BG.CompatHasField.HasField "multisample_state" SDL_GPUGraphicsPipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineCreateInfo
+            { multisample_state = y1
+            , vertex_shader = BG.getField @"vertex_shader" x0
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , vertex_input_state = BG.getField @"vertex_input_state" x0
+            , primitive_type = BG.getField @"primitive_type" x0
+            , rasterizer_state = BG.getField @"rasterizer_state" x0
+            , depth_stencil_state = BG.getField @"depth_stencil_state" x0
+            , target_info = BG.getField @"target_info" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"multisample_state" x0
+      )
+
+instance
+  (ty ~ SDL_GPUMultisampleState)
+  => BG.HasField "multisample_state" (BG.Ptr SDL_GPUGraphicsPipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"multisample_state")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineCreateInfo "multisample_state" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineCreateInfo "multisample_state" =
+      SDL_GPUMultisampleState
+
+  offset# = \_ -> \_ -> 80
+
+instance
+  (ty ~ SDL_GPUDepthStencilState)
+  => BG.CompatHasField.HasField "depth_stencil_state" SDL_GPUGraphicsPipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineCreateInfo
+            { depth_stencil_state = y1
+            , vertex_shader = BG.getField @"vertex_shader" x0
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , vertex_input_state = BG.getField @"vertex_input_state" x0
+            , primitive_type = BG.getField @"primitive_type" x0
+            , rasterizer_state = BG.getField @"rasterizer_state" x0
+            , multisample_state = BG.getField @"multisample_state" x0
+            , target_info = BG.getField @"target_info" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"depth_stencil_state" x0
+      )
+
+instance
+  (ty ~ SDL_GPUDepthStencilState)
+  => BG.HasField "depth_stencil_state" (BG.Ptr SDL_GPUGraphicsPipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"depth_stencil_state")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineCreateInfo "depth_stencil_state" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineCreateInfo "depth_stencil_state" =
+      SDL_GPUDepthStencilState
+
+  offset# = \_ -> \_ -> 92
+
+instance
+  (ty ~ SDL_GPUGraphicsPipelineTargetInfo)
+  => BG.CompatHasField.HasField "target_info" SDL_GPUGraphicsPipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineCreateInfo
+            { target_info = y1
+            , vertex_shader = BG.getField @"vertex_shader" x0
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , vertex_input_state = BG.getField @"vertex_input_state" x0
+            , primitive_type = BG.getField @"primitive_type" x0
+            , rasterizer_state = BG.getField @"rasterizer_state" x0
+            , multisample_state = BG.getField @"multisample_state" x0
+            , depth_stencil_state = BG.getField @"depth_stencil_state" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"target_info" x0
+      )
+
+instance
+  (ty ~ SDL_GPUGraphicsPipelineTargetInfo)
+  => BG.HasField "target_info" (BG.Ptr SDL_GPUGraphicsPipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"target_info")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineCreateInfo "target_info" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineCreateInfo "target_info" =
+      SDL_GPUGraphicsPipelineTargetInfo
+
+  offset# = \_ -> \_ -> 136
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.CompatHasField.HasField "props" SDL_GPUGraphicsPipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUGraphicsPipelineCreateInfo
+            { props = y1
+            , vertex_shader = BG.getField @"vertex_shader" x0
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , vertex_input_state = BG.getField @"vertex_input_state" x0
+            , primitive_type = BG.getField @"primitive_type" x0
+            , rasterizer_state = BG.getField @"rasterizer_state" x0
+            , multisample_state = BG.getField @"multisample_state" x0
+            , depth_stencil_state = BG.getField @"depth_stencil_state" x0
+            , target_info = BG.getField @"target_info" x0
+            }
+      , BG.getField @"props" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.HasField "props" (BG.Ptr SDL_GPUGraphicsPipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"props")
+
+instance HasCField.HasCField SDL_GPUGraphicsPipelineCreateInfo "props" where
+  type
+    CFieldType SDL_GPUGraphicsPipelineCreateInfo "props" =
+      SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+
+  offset# = \_ -> \_ -> 160
+
+-- | A structure specifying the parameters of a compute pipeline state.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline', 'SDL_GPUShaderFormat'
+--
+--     [C declaration]: @struct SDL_GPUComputePipelineCreateInfo@, defined at @SDL3\/SDL_gpu.h 1962:16@
+data SDL_GPUComputePipelineCreateInfo = SDL_GPUComputePipelineCreateInfo
+  { code_size :: HsBindgen.Runtime.LibC.CSize
+  -- ^ The size in bytes of the compute shader code pointed to.
+  --
+  --          [C declaration]: @code_size@, defined at @SDL3\/SDL_gpu.h 1964:12@
+  , code :: PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ A pointer to compute shader code.
+  --
+  --          [C declaration]: @code@, defined at @SDL3\/SDL_gpu.h 1965:18@
+  , entrypoint :: PtrConst.PtrConst BG.CChar
+  -- ^ A pointer to a null-terminated UTF-8 string specifying the entry point function name for the shader.
+  --
+  --          [C declaration]: @entrypoint@, defined at @SDL3\/SDL_gpu.h 1966:17@
+  , format :: SDL_GPUShaderFormat
+  -- ^ The format of the compute shader code.
+  --
+  --          [C declaration]: @format@, defined at @SDL3\/SDL_gpu.h 1967:25@
+  , num_samplers :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of samplers defined in the shader.
+  --
+  --          [C declaration]: @num_samplers@, defined at @SDL3\/SDL_gpu.h 1968:12@
+  , num_readonly_storage_textures :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of readonly storage textures defined in the shader.
+  --
+  --          [C declaration]: @num_readonly_storage_textures@, defined at @SDL3\/SDL_gpu.h 1969:12@
+  , num_readonly_storage_buffers :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of readonly storage buffers defined in the shader.
+  --
+  --          [C declaration]: @num_readonly_storage_buffers@, defined at @SDL3\/SDL_gpu.h 1970:12@
+  , num_readwrite_storage_textures :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of read-write storage textures defined in the shader.
+  --
+  --          [C declaration]: @num_readwrite_storage_textures@, defined at @SDL3\/SDL_gpu.h 1971:12@
+  , num_readwrite_storage_buffers :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of read-write storage buffers defined in the shader.
+  --
+  --          [C declaration]: @num_readwrite_storage_buffers@, defined at @SDL3\/SDL_gpu.h 1972:12@
+  , num_uniform_buffers :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of uniform buffers defined in the shader.
+  --
+  --          [C declaration]: @num_uniform_buffers@, defined at @SDL3\/SDL_gpu.h 1973:12@
+  , threadcount_x :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of threads in the X dimension. This should match the value in the shader.
+  --
+  --          [C declaration]: @threadcount_x@, defined at @SDL3\/SDL_gpu.h 1974:12@
+  , threadcount_y :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of threads in the Y dimension. This should match the value in the shader.
+  --
+  --          [C declaration]: @threadcount_y@, defined at @SDL3\/SDL_gpu.h 1975:12@
+  , threadcount_z :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The number of threads in the Z dimension. This should match the value in the shader.
+  --
+  --          [C declaration]: @threadcount_z@, defined at @SDL3\/SDL_gpu.h 1976:12@
+  , props :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^ A properties ID for extensions. Should be 0 if no extensions are needed.
+  --
+  --          [C declaration]: @props@, defined at @SDL3\/SDL_gpu.h 1978:22@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUComputePipelineCreateInfo where
+  staticSizeOf = \_ -> (72 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUComputePipelineCreateInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUComputePipelineCreateInfo
+        <*> HasCField.readRaw (BG.Proxy @"code_size") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"code") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"entrypoint") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_samplers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_readonly_storage_textures") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_readonly_storage_buffers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_readwrite_storage_textures") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_readwrite_storage_buffers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_uniform_buffers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"threadcount_x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"threadcount_y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"threadcount_z") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"props") ptr0
+
+instance Marshal.WriteRaw SDL_GPUComputePipelineCreateInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUComputePipelineCreateInfo
+            code_size2
+            code3
+            entrypoint4
+            format5
+            num_samplers6
+            num_readonly_storage_textures7
+            num_readonly_storage_buffers8
+            num_readwrite_storage_textures9
+            num_readwrite_storage_buffers10
+            num_uniform_buffers11
+            threadcount_x12
+            threadcount_y13
+            threadcount_z14
+            props15 ->
+              HasCField.writeRaw (BG.Proxy @"code_size") ptr0 code_size2
+                >> HasCField.writeRaw (BG.Proxy @"code") ptr0 code3
+                >> HasCField.writeRaw (BG.Proxy @"entrypoint") ptr0 entrypoint4
+                >> HasCField.writeRaw (BG.Proxy @"format") ptr0 format5
+                >> HasCField.writeRaw (BG.Proxy @"num_samplers") ptr0 num_samplers6
+                >> HasCField.writeRaw (BG.Proxy @"num_readonly_storage_textures") ptr0 num_readonly_storage_textures7
+                >> HasCField.writeRaw (BG.Proxy @"num_readonly_storage_buffers") ptr0 num_readonly_storage_buffers8
+                >> HasCField.writeRaw (BG.Proxy @"num_readwrite_storage_textures") ptr0 num_readwrite_storage_textures9
+                >> HasCField.writeRaw (BG.Proxy @"num_readwrite_storage_buffers") ptr0 num_readwrite_storage_buffers10
+                >> HasCField.writeRaw (BG.Proxy @"num_uniform_buffers") ptr0 num_uniform_buffers11
+                >> HasCField.writeRaw (BG.Proxy @"threadcount_x") ptr0 threadcount_x12
+                >> HasCField.writeRaw (BG.Proxy @"threadcount_y") ptr0 threadcount_y13
+                >> HasCField.writeRaw (BG.Proxy @"threadcount_z") ptr0 threadcount_z14
+                >> HasCField.writeRaw (BG.Proxy @"props") ptr0 props15
+
+deriving via
+  Marshal.EquivStorable SDL_GPUComputePipelineCreateInfo
+  instance
+    BG.Storable SDL_GPUComputePipelineCreateInfo
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.CSize)
+  => BG.CompatHasField.HasField "code_size" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { code_size = y1
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"code_size" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.CSize)
+  => BG.HasField "code_size" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"code_size")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "code_size" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "code_size" =
+      HsBindgen.Runtime.LibC.CSize
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "code" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { code = y1
+            , code_size = BG.getField @"code_size" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"code" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "code" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"code")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "code" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "code" =
+      PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "entrypoint" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { entrypoint = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"entrypoint" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "entrypoint" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"entrypoint")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "entrypoint" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "entrypoint" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL_GPUShaderFormat)
+  => BG.CompatHasField.HasField "format" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { format = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL_GPUShaderFormat)
+  => BG.HasField "format" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "format" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "format" =
+      SDL_GPUShaderFormat
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_samplers" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { num_samplers = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_samplers" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_samplers" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_samplers")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "num_samplers" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "num_samplers" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_readonly_storage_textures" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { num_readonly_storage_textures = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_readonly_storage_textures" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_readonly_storage_textures" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_readonly_storage_textures")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "num_readonly_storage_textures" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "num_readonly_storage_textures" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_readonly_storage_buffers" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { num_readonly_storage_buffers = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_readonly_storage_buffers" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_readonly_storage_buffers" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_readonly_storage_buffers")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "num_readonly_storage_buffers" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "num_readonly_storage_buffers" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_readwrite_storage_textures" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { num_readwrite_storage_textures = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_readwrite_storage_textures" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_readwrite_storage_textures" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_readwrite_storage_textures")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "num_readwrite_storage_textures" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "num_readwrite_storage_textures" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_readwrite_storage_buffers" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { num_readwrite_storage_buffers = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_readwrite_storage_buffers" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_readwrite_storage_buffers" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_readwrite_storage_buffers")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "num_readwrite_storage_buffers" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "num_readwrite_storage_buffers" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 44
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "num_uniform_buffers" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { num_uniform_buffers = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_uniform_buffers" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "num_uniform_buffers" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_uniform_buffers")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "num_uniform_buffers" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "num_uniform_buffers" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 48
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "threadcount_x" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { threadcount_x = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"threadcount_x" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "threadcount_x" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"threadcount_x")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "threadcount_x" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "threadcount_x" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 52
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "threadcount_y" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { threadcount_y = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"threadcount_y" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "threadcount_y" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"threadcount_y")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "threadcount_y" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "threadcount_y" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 56
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "threadcount_z" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { threadcount_z = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"threadcount_z" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "threadcount_z" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"threadcount_z")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "threadcount_z" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "threadcount_z" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 60
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.CompatHasField.HasField "props" SDL_GPUComputePipelineCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUComputePipelineCreateInfo
+            { props = y1
+            , code_size = BG.getField @"code_size" x0
+            , code = BG.getField @"code" x0
+            , entrypoint = BG.getField @"entrypoint" x0
+            , format = BG.getField @"format" x0
+            , num_samplers = BG.getField @"num_samplers" x0
+            , num_readonly_storage_textures = BG.getField @"num_readonly_storage_textures" x0
+            , num_readonly_storage_buffers = BG.getField @"num_readonly_storage_buffers" x0
+            , num_readwrite_storage_textures = BG.getField @"num_readwrite_storage_textures" x0
+            , num_readwrite_storage_buffers = BG.getField @"num_readwrite_storage_buffers" x0
+            , num_uniform_buffers = BG.getField @"num_uniform_buffers" x0
+            , threadcount_x = BG.getField @"threadcount_x" x0
+            , threadcount_y = BG.getField @"threadcount_y" x0
+            , threadcount_z = BG.getField @"threadcount_z" x0
+            }
+      , BG.getField @"props" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.HasField "props" (BG.Ptr SDL_GPUComputePipelineCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"props")
+
+instance HasCField.HasCField SDL_GPUComputePipelineCreateInfo "props" where
+  type
+    CFieldType SDL_GPUComputePipelineCreateInfo "props" =
+      SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+
+  offset# = \_ -> \_ -> 64
+
+-- | A structure specifying the parameters of a color target used by a render pass.
+--
+--     The load_op field determines what is done with the texture at the beginning of the render pass.
+--
+--     * LOAD: Loads the data currently in the texture. Not recommended for multisample textures as it requires significant memory bandwidth.
+--
+--     * CLEAR: Clears the texture to a single color.
+--
+--     * 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.
+--
+--     The store_op field determines what is done with the color results of the render pass.
+--
+--     * STORE: Stores the results of the render pass in the texture. Not recommended for multisample textures as it requires significant memory bandwidth.
+--
+--     * DONT_CARE: The driver will do whatever it wants with the texture memory. This is often a good option for depth\/stencil textures.
+--
+--     * 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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BeginGPURenderPass', SDL_FColor
+--
+--     [C declaration]: @struct SDL_GPUColorTargetInfo@, defined at @SDL3\/SDL_gpu.h 2017:16@
+data SDL_GPUColorTargetInfo = SDL_GPUColorTargetInfo
+  { texture :: BG.Ptr SDL_GPUTexture
+  -- ^ The texture that will be used as a color target by a render pass.
+  --
+  --          [C declaration]: @texture@, defined at @SDL3\/SDL_gpu.h 2019:21@
+  , mip_level :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The mip level to use as a color target.
+  --
+  --          [C declaration]: @mip_level@, defined at @SDL3\/SDL_gpu.h 2020:12@
+  , layer_or_depth_plane :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ 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.
+  --
+  --          [C declaration]: @layer_or_depth_plane@, defined at @SDL3\/SDL_gpu.h 2021:12@
+  , clear_color :: SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^ The color to clear the color target to at the start of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used.
+  --
+  --          [C declaration]: @clear_color@, defined at @SDL3\/SDL_gpu.h 2022:16@
+  , load_op :: SDL_GPULoadOp
+  -- ^ What is done with the contents of the color target at the beginning of the render pass.
+  --
+  --          [C declaration]: @load_op@, defined at @SDL3\/SDL_gpu.h 2023:19@
+  , store_op :: SDL_GPUStoreOp
+  -- ^ What is done with the results of the render pass.
+  --
+  --          [C declaration]: @store_op@, defined at @SDL3\/SDL_gpu.h 2024:20@
+  , resolve_texture :: BG.Ptr SDL_GPUTexture
+  -- ^ The texture that will receive the results of a multisample resolve operation. Ignored if a RESOLVE* store_op is not used.
+  --
+  --          [C declaration]: @resolve_texture@, defined at @SDL3\/SDL_gpu.h 2025:21@
+  , resolve_mip_level :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The mip level of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used.
+  --
+  --          [C declaration]: @resolve_mip_level@, defined at @SDL3\/SDL_gpu.h 2026:12@
+  , resolve_layer :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The layer index of the resolve texture to use for the resolve operation. Ignored if a RESOLVE* store_op is not used.
+  --
+  --          [C declaration]: @resolve_layer@, defined at @SDL3\/SDL_gpu.h 2027:12@
+  , cycle :: BG.CBool
+  -- ^ true cycles the texture if the texture is bound and load_op is not LOAD
+  --
+  --          [C declaration]: @cycle@, defined at @SDL3\/SDL_gpu.h 2028:10@
+  , cycle_resolve_texture :: BG.CBool
+  -- ^ true cycles the resolve texture if the resolve texture is bound. Ignored if a RESOLVE* store_op is not used.
+  --
+  --          [C declaration]: @cycle_resolve_texture@, defined at @SDL3\/SDL_gpu.h 2029:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_gpu.h 2030:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_gpu.h 2031:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUColorTargetInfo where
+  staticSizeOf = \_ -> (64 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUColorTargetInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUColorTargetInfo
+        <*> HasCField.readRaw (BG.Proxy @"texture") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mip_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"layer_or_depth_plane") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"clear_color") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"load_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"store_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"resolve_texture") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"resolve_mip_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"resolve_layer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"cycle") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"cycle_resolve_texture") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+
+instance Marshal.WriteRaw SDL_GPUColorTargetInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUColorTargetInfo
+            texture2
+            mip_level3
+            layer_or_depth_plane4
+            clear_color5
+            load_op6
+            store_op7
+            resolve_texture8
+            resolve_mip_level9
+            resolve_layer10
+            cycle11
+            cycle_resolve_texture12
+            padding113
+            padding214 ->
+              HasCField.writeRaw (BG.Proxy @"texture") ptr0 texture2
+                >> HasCField.writeRaw (BG.Proxy @"mip_level") ptr0 mip_level3
+                >> HasCField.writeRaw (BG.Proxy @"layer_or_depth_plane") ptr0 layer_or_depth_plane4
+                >> HasCField.writeRaw (BG.Proxy @"clear_color") ptr0 clear_color5
+                >> HasCField.writeRaw (BG.Proxy @"load_op") ptr0 load_op6
+                >> HasCField.writeRaw (BG.Proxy @"store_op") ptr0 store_op7
+                >> HasCField.writeRaw (BG.Proxy @"resolve_texture") ptr0 resolve_texture8
+                >> HasCField.writeRaw (BG.Proxy @"resolve_mip_level") ptr0 resolve_mip_level9
+                >> HasCField.writeRaw (BG.Proxy @"resolve_layer") ptr0 resolve_layer10
+                >> HasCField.writeRaw (BG.Proxy @"cycle") ptr0 cycle11
+                >> HasCField.writeRaw (BG.Proxy @"cycle_resolve_texture") ptr0 cycle_resolve_texture12
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding113
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding214
+
+deriving via
+  Marshal.EquivStorable SDL_GPUColorTargetInfo
+  instance
+    BG.Storable SDL_GPUColorTargetInfo
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.CompatHasField.HasField "texture" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { texture = y1
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"texture" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.HasField "texture" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"texture")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "texture" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "texture" =
+      BG.Ptr SDL_GPUTexture
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "mip_level" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { mip_level = y1
+            , texture = BG.getField @"texture" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"mip_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "mip_level" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mip_level")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "mip_level" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "mip_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "layer_or_depth_plane" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { layer_or_depth_plane = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"layer_or_depth_plane" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "layer_or_depth_plane" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"layer_or_depth_plane")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "layer_or_depth_plane" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "layer_or_depth_plane" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_FColor)
+  => BG.CompatHasField.HasField "clear_color" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { clear_color = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"clear_color" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_FColor)
+  => BG.HasField "clear_color" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"clear_color")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "clear_color" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "clear_color" =
+      SDL3.Sys.Bindgen.Pixels.SDL_FColor
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL_GPULoadOp)
+  => BG.CompatHasField.HasField "load_op" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { load_op = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"load_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPULoadOp)
+  => BG.HasField "load_op" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"load_op")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "load_op" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "load_op" =
+      SDL_GPULoadOp
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL_GPUStoreOp)
+  => BG.CompatHasField.HasField "store_op" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { store_op = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"store_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUStoreOp)
+  => BG.HasField "store_op" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"store_op")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "store_op" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "store_op" =
+      SDL_GPUStoreOp
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.CompatHasField.HasField "resolve_texture" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { resolve_texture = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"resolve_texture" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.HasField "resolve_texture" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"resolve_texture")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "resolve_texture" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "resolve_texture" =
+      BG.Ptr SDL_GPUTexture
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "resolve_mip_level" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { resolve_mip_level = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"resolve_mip_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "resolve_mip_level" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"resolve_mip_level")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "resolve_mip_level" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "resolve_mip_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 48
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "resolve_layer" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { resolve_layer = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"resolve_layer" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "resolve_layer" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"resolve_layer")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "resolve_layer" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "resolve_layer" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 52
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "cycle" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { cycle = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"cycle" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "cycle" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"cycle")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "cycle" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "cycle" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 56
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "cycle_resolve_texture" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { cycle_resolve_texture = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"cycle_resolve_texture" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "cycle_resolve_texture" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"cycle_resolve_texture")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "cycle_resolve_texture" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "cycle_resolve_texture" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 57
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { padding1 = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "padding1" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 58
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GPUColorTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUColorTargetInfo
+            { padding2 = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer_or_depth_plane = BG.getField @"layer_or_depth_plane" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , resolve_texture = BG.getField @"resolve_texture" x0
+            , resolve_mip_level = BG.getField @"resolve_mip_level" x0
+            , resolve_layer = BG.getField @"resolve_layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , cycle_resolve_texture = BG.getField @"cycle_resolve_texture" x0
+            , padding1 = BG.getField @"padding1" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GPUColorTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GPUColorTargetInfo "padding2" where
+  type
+    CFieldType SDL_GPUColorTargetInfo "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 59
+
+-- | A structure specifying the parameters of a depth-stencil target used by a render pass.
+--
+--     The load_op field determines what is done with the depth contents of the texture at the beginning of the render pass.
+--
+--     * LOAD: Loads the depth values currently in the texture.
+--
+--     * CLEAR: Clears the texture to a single depth.
+--
+--     * 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.
+--
+--     The store_op field determines what is done with the depth results of the render pass.
+--
+--     * STORE: Stores the depth results in the texture.
+--
+--     * 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.
+--
+--     The stencil_load_op field determines what is done with the stencil contents of the texture at the beginning of the render pass.
+--
+--     * LOAD: Loads the stencil values currently in the texture.
+--
+--     * CLEAR: Clears the stencil values to a single value.
+--
+--     * 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.
+--
+--     The stencil_store_op field determines what is done with the stencil results of the render pass.
+--
+--     * STORE: Stores the stencil results in the texture.
+--
+--     * 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.
+--
+--     Note that depth\/stencil targets do not support multisample resolves.
+--
+--     Due to ABI limitations, depth textures with more than 255 layers are not supported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BeginGPURenderPass'
+--
+--     [C declaration]: @struct SDL_GPUDepthStencilTargetInfo@, defined at @SDL3\/SDL_gpu.h 2081:16@
+data SDL_GPUDepthStencilTargetInfo = SDL_GPUDepthStencilTargetInfo
+  { texture :: BG.Ptr SDL_GPUTexture
+  -- ^ The texture that will be used as the depth stencil target by the render pass.
+  --
+  --          [C declaration]: @texture@, defined at @SDL3\/SDL_gpu.h 2083:21@
+  , clear_depth :: BG.CFloat
+  -- ^ The value to clear the depth component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used.
+  --
+  --          [C declaration]: @clear_depth@, defined at @SDL3\/SDL_gpu.h 2084:11@
+  , load_op :: SDL_GPULoadOp
+  -- ^ What is done with the depth contents at the beginning of the render pass.
+  --
+  --          [C declaration]: @load_op@, defined at @SDL3\/SDL_gpu.h 2085:19@
+  , store_op :: SDL_GPUStoreOp
+  -- ^ What is done with the depth results of the render pass.
+  --
+  --          [C declaration]: @store_op@, defined at @SDL3\/SDL_gpu.h 2086:20@
+  , stencil_load_op :: SDL_GPULoadOp
+  -- ^ What is done with the stencil contents at the beginning of the render pass.
+  --
+  --          [C declaration]: @stencil_load_op@, defined at @SDL3\/SDL_gpu.h 2087:19@
+  , stencil_store_op :: SDL_GPUStoreOp
+  -- ^ What is done with the stencil results of the render pass.
+  --
+  --          [C declaration]: @stencil_store_op@, defined at @SDL3\/SDL_gpu.h 2088:20@
+  , cycle :: BG.CBool
+  -- ^ true cycles the texture if the texture is bound and any load ops are not LOAD
+  --
+  --          [C declaration]: @cycle@, defined at @SDL3\/SDL_gpu.h 2089:10@
+  , clear_stencil :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The value to clear the stencil component to at the beginning of the render pass. Ignored if SDL_GPU_LOADOP_CLEAR is not used.
+  --
+  --          [C declaration]: @clear_stencil@, defined at @SDL3\/SDL_gpu.h 2090:11@
+  , mip_level :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The mip level to use as the depth stencil target.
+  --
+  --          [C declaration]: @mip_level@, defined at @SDL3\/SDL_gpu.h 2091:11@
+  , layer :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ The layer index to use as the depth stencil target.
+  --
+  --          [C declaration]: @layer@, defined at @SDL3\/SDL_gpu.h 2092:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUDepthStencilTargetInfo where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUDepthStencilTargetInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUDepthStencilTargetInfo
+        <*> HasCField.readRaw (BG.Proxy @"texture") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"clear_depth") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"load_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"store_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"stencil_load_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"stencil_store_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"cycle") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"clear_stencil") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mip_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"layer") ptr0
+
+instance Marshal.WriteRaw SDL_GPUDepthStencilTargetInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUDepthStencilTargetInfo
+            texture2
+            clear_depth3
+            load_op4
+            store_op5
+            stencil_load_op6
+            stencil_store_op7
+            cycle8
+            clear_stencil9
+            mip_level10
+            layer11 ->
+              HasCField.writeRaw (BG.Proxy @"texture") ptr0 texture2
+                >> HasCField.writeRaw (BG.Proxy @"clear_depth") ptr0 clear_depth3
+                >> HasCField.writeRaw (BG.Proxy @"load_op") ptr0 load_op4
+                >> HasCField.writeRaw (BG.Proxy @"store_op") ptr0 store_op5
+                >> HasCField.writeRaw (BG.Proxy @"stencil_load_op") ptr0 stencil_load_op6
+                >> HasCField.writeRaw (BG.Proxy @"stencil_store_op") ptr0 stencil_store_op7
+                >> HasCField.writeRaw (BG.Proxy @"cycle") ptr0 cycle8
+                >> HasCField.writeRaw (BG.Proxy @"clear_stencil") ptr0 clear_stencil9
+                >> HasCField.writeRaw (BG.Proxy @"mip_level") ptr0 mip_level10
+                >> HasCField.writeRaw (BG.Proxy @"layer") ptr0 layer11
+
+deriving via
+  Marshal.EquivStorable SDL_GPUDepthStencilTargetInfo
+  instance
+    BG.Storable SDL_GPUDepthStencilTargetInfo
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.CompatHasField.HasField "texture" SDL_GPUDepthStencilTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilTargetInfo
+            { texture = y1
+            , clear_depth = BG.getField @"clear_depth" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , stencil_load_op = BG.getField @"stencil_load_op" x0
+            , stencil_store_op = BG.getField @"stencil_store_op" x0
+            , cycle = BG.getField @"cycle" x0
+            , clear_stencil = BG.getField @"clear_stencil" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            }
+      , BG.getField @"texture" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.HasField "texture" (BG.Ptr SDL_GPUDepthStencilTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"texture")
+
+instance HasCField.HasCField SDL_GPUDepthStencilTargetInfo "texture" where
+  type
+    CFieldType SDL_GPUDepthStencilTargetInfo "texture" =
+      BG.Ptr SDL_GPUTexture
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "clear_depth" SDL_GPUDepthStencilTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilTargetInfo
+            { clear_depth = y1
+            , texture = BG.getField @"texture" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , stencil_load_op = BG.getField @"stencil_load_op" x0
+            , stencil_store_op = BG.getField @"stencil_store_op" x0
+            , cycle = BG.getField @"cycle" x0
+            , clear_stencil = BG.getField @"clear_stencil" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            }
+      , BG.getField @"clear_depth" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "clear_depth" (BG.Ptr SDL_GPUDepthStencilTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"clear_depth")
+
+instance HasCField.HasCField SDL_GPUDepthStencilTargetInfo "clear_depth" where
+  type
+    CFieldType SDL_GPUDepthStencilTargetInfo "clear_depth" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL_GPULoadOp)
+  => BG.CompatHasField.HasField "load_op" SDL_GPUDepthStencilTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilTargetInfo
+            { load_op = y1
+            , texture = BG.getField @"texture" x0
+            , clear_depth = BG.getField @"clear_depth" x0
+            , store_op = BG.getField @"store_op" x0
+            , stencil_load_op = BG.getField @"stencil_load_op" x0
+            , stencil_store_op = BG.getField @"stencil_store_op" x0
+            , cycle = BG.getField @"cycle" x0
+            , clear_stencil = BG.getField @"clear_stencil" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            }
+      , BG.getField @"load_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPULoadOp)
+  => BG.HasField "load_op" (BG.Ptr SDL_GPUDepthStencilTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"load_op")
+
+instance HasCField.HasCField SDL_GPUDepthStencilTargetInfo "load_op" where
+  type
+    CFieldType SDL_GPUDepthStencilTargetInfo "load_op" =
+      SDL_GPULoadOp
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL_GPUStoreOp)
+  => BG.CompatHasField.HasField "store_op" SDL_GPUDepthStencilTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilTargetInfo
+            { store_op = y1
+            , texture = BG.getField @"texture" x0
+            , clear_depth = BG.getField @"clear_depth" x0
+            , load_op = BG.getField @"load_op" x0
+            , stencil_load_op = BG.getField @"stencil_load_op" x0
+            , stencil_store_op = BG.getField @"stencil_store_op" x0
+            , cycle = BG.getField @"cycle" x0
+            , clear_stencil = BG.getField @"clear_stencil" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            }
+      , BG.getField @"store_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUStoreOp)
+  => BG.HasField "store_op" (BG.Ptr SDL_GPUDepthStencilTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"store_op")
+
+instance HasCField.HasCField SDL_GPUDepthStencilTargetInfo "store_op" where
+  type
+    CFieldType SDL_GPUDepthStencilTargetInfo "store_op" =
+      SDL_GPUStoreOp
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL_GPULoadOp)
+  => BG.CompatHasField.HasField "stencil_load_op" SDL_GPUDepthStencilTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilTargetInfo
+            { stencil_load_op = y1
+            , texture = BG.getField @"texture" x0
+            , clear_depth = BG.getField @"clear_depth" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , stencil_store_op = BG.getField @"stencil_store_op" x0
+            , cycle = BG.getField @"cycle" x0
+            , clear_stencil = BG.getField @"clear_stencil" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            }
+      , BG.getField @"stencil_load_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPULoadOp)
+  => BG.HasField "stencil_load_op" (BG.Ptr SDL_GPUDepthStencilTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"stencil_load_op")
+
+instance HasCField.HasCField SDL_GPUDepthStencilTargetInfo "stencil_load_op" where
+  type
+    CFieldType SDL_GPUDepthStencilTargetInfo "stencil_load_op" =
+      SDL_GPULoadOp
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL_GPUStoreOp)
+  => BG.CompatHasField.HasField "stencil_store_op" SDL_GPUDepthStencilTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilTargetInfo
+            { stencil_store_op = y1
+            , texture = BG.getField @"texture" x0
+            , clear_depth = BG.getField @"clear_depth" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , stencil_load_op = BG.getField @"stencil_load_op" x0
+            , cycle = BG.getField @"cycle" x0
+            , clear_stencil = BG.getField @"clear_stencil" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            }
+      , BG.getField @"stencil_store_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPUStoreOp)
+  => BG.HasField "stencil_store_op" (BG.Ptr SDL_GPUDepthStencilTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"stencil_store_op")
+
+instance HasCField.HasCField SDL_GPUDepthStencilTargetInfo "stencil_store_op" where
+  type
+    CFieldType SDL_GPUDepthStencilTargetInfo "stencil_store_op" =
+      SDL_GPUStoreOp
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "cycle" SDL_GPUDepthStencilTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilTargetInfo
+            { cycle = y1
+            , texture = BG.getField @"texture" x0
+            , clear_depth = BG.getField @"clear_depth" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , stencil_load_op = BG.getField @"stencil_load_op" x0
+            , stencil_store_op = BG.getField @"stencil_store_op" x0
+            , clear_stencil = BG.getField @"clear_stencil" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            }
+      , BG.getField @"cycle" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "cycle" (BG.Ptr SDL_GPUDepthStencilTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"cycle")
+
+instance HasCField.HasCField SDL_GPUDepthStencilTargetInfo "cycle" where
+  type
+    CFieldType SDL_GPUDepthStencilTargetInfo "cycle" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "clear_stencil" SDL_GPUDepthStencilTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilTargetInfo
+            { clear_stencil = y1
+            , texture = BG.getField @"texture" x0
+            , clear_depth = BG.getField @"clear_depth" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , stencil_load_op = BG.getField @"stencil_load_op" x0
+            , stencil_store_op = BG.getField @"stencil_store_op" x0
+            , cycle = BG.getField @"cycle" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            }
+      , BG.getField @"clear_stencil" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "clear_stencil" (BG.Ptr SDL_GPUDepthStencilTargetInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"clear_stencil")
+
+instance HasCField.HasCField SDL_GPUDepthStencilTargetInfo "clear_stencil" where
+  type
+    CFieldType SDL_GPUDepthStencilTargetInfo "clear_stencil" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 29
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "mip_level" SDL_GPUDepthStencilTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilTargetInfo
+            { mip_level = y1
+            , texture = BG.getField @"texture" x0
+            , clear_depth = BG.getField @"clear_depth" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , stencil_load_op = BG.getField @"stencil_load_op" x0
+            , stencil_store_op = BG.getField @"stencil_store_op" x0
+            , cycle = BG.getField @"cycle" x0
+            , clear_stencil = BG.getField @"clear_stencil" x0
+            , layer = BG.getField @"layer" x0
+            }
+      , BG.getField @"mip_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "mip_level" (BG.Ptr SDL_GPUDepthStencilTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mip_level")
+
+instance HasCField.HasCField SDL_GPUDepthStencilTargetInfo "mip_level" where
+  type
+    CFieldType SDL_GPUDepthStencilTargetInfo "mip_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 30
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "layer" SDL_GPUDepthStencilTargetInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUDepthStencilTargetInfo
+            { layer = y1
+            , texture = BG.getField @"texture" x0
+            , clear_depth = BG.getField @"clear_depth" x0
+            , load_op = BG.getField @"load_op" x0
+            , store_op = BG.getField @"store_op" x0
+            , stencil_load_op = BG.getField @"stencil_load_op" x0
+            , stencil_store_op = BG.getField @"stencil_store_op" x0
+            , cycle = BG.getField @"cycle" x0
+            , clear_stencil = BG.getField @"clear_stencil" x0
+            , mip_level = BG.getField @"mip_level" x0
+            }
+      , BG.getField @"layer" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "layer" (BG.Ptr SDL_GPUDepthStencilTargetInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"layer")
+
+instance HasCField.HasCField SDL_GPUDepthStencilTargetInfo "layer" where
+  type
+    CFieldType SDL_GPUDepthStencilTargetInfo "layer" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 31
+
+-- | A structure containing parameters for a blit command.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitGPUTexture'
+--
+--     [C declaration]: @struct SDL_GPUBlitInfo@, defined at @SDL3\/SDL_gpu.h 2102:16@
+data SDL_GPUBlitInfo = SDL_GPUBlitInfo
+  { source :: SDL_GPUBlitRegion
+  -- ^ The source region for the blit.
+  --
+  --          [C declaration]: @source@, defined at @SDL3\/SDL_gpu.h 2103:23@
+  , destination :: SDL_GPUBlitRegion
+  -- ^ The destination region for the blit.
+  --
+  --          [C declaration]: @destination@, defined at @SDL3\/SDL_gpu.h 2104:23@
+  , load_op :: SDL_GPULoadOp
+  -- ^ What is done with the contents of the destination before the blit.
+  --
+  --          [C declaration]: @load_op@, defined at @SDL3\/SDL_gpu.h 2105:19@
+  , clear_color :: SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^ The color to clear the destination region to before the blit. Ignored if load_op is not SDL_GPU_LOADOP_CLEAR.
+  --
+  --          [C declaration]: @clear_color@, defined at @SDL3\/SDL_gpu.h 2106:16@
+  , flip_mode :: SDL3.Sys.Bindgen.Surface.SDL_FlipMode
+  -- ^ The flip mode for the source region.
+  --
+  --          [C declaration]: @flip_mode@, defined at @SDL3\/SDL_gpu.h 2107:18@
+  , filter :: SDL_GPUFilter
+  -- ^ The filter mode used when blitting.
+  --
+  --          [C declaration]: @filter@, defined at @SDL3\/SDL_gpu.h 2108:19@
+  , cycle :: BG.CBool
+  -- ^ true cycles the destination texture if it is already bound.
+  --
+  --          [C declaration]: @cycle@, defined at @SDL3\/SDL_gpu.h 2109:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_gpu.h 2110:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_gpu.h 2111:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_gpu.h 2112:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUBlitInfo where
+  staticSizeOf = \_ -> (96 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUBlitInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUBlitInfo
+        <*> HasCField.readRaw (BG.Proxy @"source") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"destination") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"load_op") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"clear_color") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"flip_mode") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"filter") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"cycle") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+
+instance Marshal.WriteRaw SDL_GPUBlitInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUBlitInfo
+            source2
+            destination3
+            load_op4
+            clear_color5
+            flip_mode6
+            filter7
+            cycle8
+            padding19
+            padding210
+            padding311 ->
+              HasCField.writeRaw (BG.Proxy @"source") ptr0 source2
+                >> HasCField.writeRaw (BG.Proxy @"destination") ptr0 destination3
+                >> HasCField.writeRaw (BG.Proxy @"load_op") ptr0 load_op4
+                >> HasCField.writeRaw (BG.Proxy @"clear_color") ptr0 clear_color5
+                >> HasCField.writeRaw (BG.Proxy @"flip_mode") ptr0 flip_mode6
+                >> HasCField.writeRaw (BG.Proxy @"filter") ptr0 filter7
+                >> HasCField.writeRaw (BG.Proxy @"cycle") ptr0 cycle8
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding19
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding210
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding311
+
+deriving via Marshal.EquivStorable SDL_GPUBlitInfo instance BG.Storable SDL_GPUBlitInfo
+
+instance
+  (ty ~ SDL_GPUBlitRegion)
+  => BG.CompatHasField.HasField "source" SDL_GPUBlitInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitInfo
+            { source = y1
+            , destination = BG.getField @"destination" x0
+            , load_op = BG.getField @"load_op" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , flip_mode = BG.getField @"flip_mode" x0
+            , filter = BG.getField @"filter" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"source" x0
+      )
+
+instance
+  (ty ~ SDL_GPUBlitRegion)
+  => BG.HasField "source" (BG.Ptr SDL_GPUBlitInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"source")
+
+instance HasCField.HasCField SDL_GPUBlitInfo "source" where
+  type
+    CFieldType SDL_GPUBlitInfo "source" =
+      SDL_GPUBlitRegion
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_GPUBlitRegion)
+  => BG.CompatHasField.HasField "destination" SDL_GPUBlitInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitInfo
+            { destination = y1
+            , source = BG.getField @"source" x0
+            , load_op = BG.getField @"load_op" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , flip_mode = BG.getField @"flip_mode" x0
+            , filter = BG.getField @"filter" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"destination" x0
+      )
+
+instance
+  (ty ~ SDL_GPUBlitRegion)
+  => BG.HasField "destination" (BG.Ptr SDL_GPUBlitInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"destination")
+
+instance HasCField.HasCField SDL_GPUBlitInfo "destination" where
+  type
+    CFieldType SDL_GPUBlitInfo "destination" =
+      SDL_GPUBlitRegion
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL_GPULoadOp)
+  => BG.CompatHasField.HasField "load_op" SDL_GPUBlitInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitInfo
+            { load_op = y1
+            , source = BG.getField @"source" x0
+            , destination = BG.getField @"destination" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , flip_mode = BG.getField @"flip_mode" x0
+            , filter = BG.getField @"filter" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"load_op" x0
+      )
+
+instance
+  (ty ~ SDL_GPULoadOp)
+  => BG.HasField "load_op" (BG.Ptr SDL_GPUBlitInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"load_op")
+
+instance HasCField.HasCField SDL_GPUBlitInfo "load_op" where
+  type
+    CFieldType SDL_GPUBlitInfo "load_op" =
+      SDL_GPULoadOp
+
+  offset# = \_ -> \_ -> 64
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_FColor)
+  => BG.CompatHasField.HasField "clear_color" SDL_GPUBlitInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitInfo
+            { clear_color = y1
+            , source = BG.getField @"source" x0
+            , destination = BG.getField @"destination" x0
+            , load_op = BG.getField @"load_op" x0
+            , flip_mode = BG.getField @"flip_mode" x0
+            , filter = BG.getField @"filter" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"clear_color" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_FColor)
+  => BG.HasField "clear_color" (BG.Ptr SDL_GPUBlitInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"clear_color")
+
+instance HasCField.HasCField SDL_GPUBlitInfo "clear_color" where
+  type
+    CFieldType SDL_GPUBlitInfo "clear_color" =
+      SDL3.Sys.Bindgen.Pixels.SDL_FColor
+
+  offset# = \_ -> \_ -> 68
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Surface.SDL_FlipMode)
+  => BG.CompatHasField.HasField "flip_mode" SDL_GPUBlitInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitInfo
+            { flip_mode = y1
+            , source = BG.getField @"source" x0
+            , destination = BG.getField @"destination" x0
+            , load_op = BG.getField @"load_op" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , filter = BG.getField @"filter" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"flip_mode" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Surface.SDL_FlipMode)
+  => BG.HasField "flip_mode" (BG.Ptr SDL_GPUBlitInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"flip_mode")
+
+instance HasCField.HasCField SDL_GPUBlitInfo "flip_mode" where
+  type
+    CFieldType SDL_GPUBlitInfo "flip_mode" =
+      SDL3.Sys.Bindgen.Surface.SDL_FlipMode
+
+  offset# = \_ -> \_ -> 84
+
+instance
+  (ty ~ SDL_GPUFilter)
+  => BG.CompatHasField.HasField "filter" SDL_GPUBlitInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitInfo
+            { filter = y1
+            , source = BG.getField @"source" x0
+            , destination = BG.getField @"destination" x0
+            , load_op = BG.getField @"load_op" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , flip_mode = BG.getField @"flip_mode" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"filter" x0
+      )
+
+instance
+  (ty ~ SDL_GPUFilter)
+  => BG.HasField "filter" (BG.Ptr SDL_GPUBlitInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"filter")
+
+instance HasCField.HasCField SDL_GPUBlitInfo "filter" where
+  type
+    CFieldType SDL_GPUBlitInfo "filter" =
+      SDL_GPUFilter
+
+  offset# = \_ -> \_ -> 88
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "cycle" SDL_GPUBlitInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitInfo
+            { cycle = y1
+            , source = BG.getField @"source" x0
+            , destination = BG.getField @"destination" x0
+            , load_op = BG.getField @"load_op" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , flip_mode = BG.getField @"flip_mode" x0
+            , filter = BG.getField @"filter" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"cycle" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "cycle" (BG.Ptr SDL_GPUBlitInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"cycle")
+
+instance HasCField.HasCField SDL_GPUBlitInfo "cycle" where
+  type CFieldType SDL_GPUBlitInfo "cycle" = BG.CBool
+
+  offset# = \_ -> \_ -> 92
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GPUBlitInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitInfo
+            { padding1 = y1
+            , source = BG.getField @"source" x0
+            , destination = BG.getField @"destination" x0
+            , load_op = BG.getField @"load_op" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , flip_mode = BG.getField @"flip_mode" x0
+            , filter = BG.getField @"filter" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GPUBlitInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GPUBlitInfo "padding1" where
+  type
+    CFieldType SDL_GPUBlitInfo "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 93
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GPUBlitInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitInfo
+            { padding2 = y1
+            , source = BG.getField @"source" x0
+            , destination = BG.getField @"destination" x0
+            , load_op = BG.getField @"load_op" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , flip_mode = BG.getField @"flip_mode" x0
+            , filter = BG.getField @"filter" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GPUBlitInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GPUBlitInfo "padding2" where
+  type
+    CFieldType SDL_GPUBlitInfo "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 94
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_GPUBlitInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBlitInfo
+            { padding3 = y1
+            , source = BG.getField @"source" x0
+            , destination = BG.getField @"destination" x0
+            , load_op = BG.getField @"load_op" x0
+            , clear_color = BG.getField @"clear_color" x0
+            , flip_mode = BG.getField @"flip_mode" x0
+            , filter = BG.getField @"filter" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_GPUBlitInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_GPUBlitInfo "padding3" where
+  type
+    CFieldType SDL_GPUBlitInfo "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 95
+
+-- | A structure specifying parameters in a buffer binding call.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindGPUVertexBuffers', 'sDL_BindGPUIndexBuffer'
+--
+--     [C declaration]: @struct SDL_GPUBufferBinding@, defined at @SDL3\/SDL_gpu.h 2125:16@
+data SDL_GPUBufferBinding = SDL_GPUBufferBinding
+  { buffer :: BG.Ptr SDL_GPUBuffer
+  -- ^ The buffer to bind. Must have been created with SDL_GPU_BUFFERUSAGE_VERTEX for SDL_BindGPUVertexBuffers, or SDL_GPU_BUFFERUSAGE_INDEX for SDL_BindGPUIndexBuffer.
+  --
+  --          [C declaration]: @buffer@, defined at @SDL3\/SDL_gpu.h 2127:20@
+  , offset :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The starting byte of the data to bind in the buffer.
+  --
+  --          [C declaration]: @offset@, defined at @SDL3\/SDL_gpu.h 2128:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUBufferBinding where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUBufferBinding where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUBufferBinding
+        <*> HasCField.readRaw (BG.Proxy @"buffer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"offset") ptr0
+
+instance Marshal.WriteRaw SDL_GPUBufferBinding where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUBufferBinding buffer2 offset3 ->
+            HasCField.writeRaw (BG.Proxy @"buffer") ptr0 buffer2
+              >> HasCField.writeRaw (BG.Proxy @"offset") ptr0 offset3
+
+deriving via Marshal.EquivStorable SDL_GPUBufferBinding instance BG.Storable SDL_GPUBufferBinding
+
+instance
+  (ty ~ BG.Ptr SDL_GPUBuffer)
+  => BG.CompatHasField.HasField "buffer" SDL_GPUBufferBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferBinding{buffer = y1, offset = BG.getField @"offset" x0}
+      , BG.getField @"buffer" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUBuffer)
+  => BG.HasField "buffer" (BG.Ptr SDL_GPUBufferBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"buffer")
+
+instance HasCField.HasCField SDL_GPUBufferBinding "buffer" where
+  type
+    CFieldType SDL_GPUBufferBinding "buffer" =
+      BG.Ptr SDL_GPUBuffer
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "offset" SDL_GPUBufferBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUBufferBinding{offset = y1, buffer = BG.getField @"buffer" x0}
+      , BG.getField @"offset" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "offset" (BG.Ptr SDL_GPUBufferBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"offset")
+
+instance HasCField.HasCField SDL_GPUBufferBinding "offset" where
+  type
+    CFieldType SDL_GPUBufferBinding "offset" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+-- | A structure specifying parameters in a sampler binding call.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindGPUVertexSamplers', 'sDL_BindGPUFragmentSamplers', 'SDL_GPUTexture', 'SDL_GPUSampler'
+--
+--     [C declaration]: @struct SDL_GPUTextureSamplerBinding@, defined at @SDL3\/SDL_gpu.h 2141:16@
+data SDL_GPUTextureSamplerBinding = SDL_GPUTextureSamplerBinding
+  { texture :: BG.Ptr SDL_GPUTexture
+  -- ^ The texture to bind. Must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+  --
+  --          [C declaration]: @texture@, defined at @SDL3\/SDL_gpu.h 2143:21@
+  , sampler :: BG.Ptr SDL_GPUSampler
+  -- ^ The sampler to bind.
+  --
+  --          [C declaration]: @sampler@, defined at @SDL3\/SDL_gpu.h 2144:21@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUTextureSamplerBinding where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUTextureSamplerBinding where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUTextureSamplerBinding
+        <*> HasCField.readRaw (BG.Proxy @"texture") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"sampler") ptr0
+
+instance Marshal.WriteRaw SDL_GPUTextureSamplerBinding where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUTextureSamplerBinding texture2 sampler3 ->
+            HasCField.writeRaw (BG.Proxy @"texture") ptr0 texture2
+              >> HasCField.writeRaw (BG.Proxy @"sampler") ptr0 sampler3
+
+deriving via
+  Marshal.EquivStorable SDL_GPUTextureSamplerBinding
+  instance
+    BG.Storable SDL_GPUTextureSamplerBinding
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.CompatHasField.HasField "texture" SDL_GPUTextureSamplerBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureSamplerBinding{texture = y1, sampler = BG.getField @"sampler" x0}
+      , BG.getField @"texture" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.HasField "texture" (BG.Ptr SDL_GPUTextureSamplerBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"texture")
+
+instance HasCField.HasCField SDL_GPUTextureSamplerBinding "texture" where
+  type
+    CFieldType SDL_GPUTextureSamplerBinding "texture" =
+      BG.Ptr SDL_GPUTexture
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.Ptr SDL_GPUSampler)
+  => BG.CompatHasField.HasField "sampler" SDL_GPUTextureSamplerBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUTextureSamplerBinding{sampler = y1, texture = BG.getField @"texture" x0}
+      , BG.getField @"sampler" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUSampler)
+  => BG.HasField "sampler" (BG.Ptr SDL_GPUTextureSamplerBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"sampler")
+
+instance HasCField.HasCField SDL_GPUTextureSamplerBinding "sampler" where
+  type
+    CFieldType SDL_GPUTextureSamplerBinding "sampler" =
+      BG.Ptr SDL_GPUSampler
+
+  offset# = \_ -> \_ -> 8
+
+-- | A structure specifying parameters related to binding buffers in a compute pass.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BeginGPUComputePass'
+--
+--     [C declaration]: @struct SDL_GPUStorageBufferReadWriteBinding@, defined at @SDL3\/SDL_gpu.h 2155:16@
+data SDL_GPUStorageBufferReadWriteBinding = SDL_GPUStorageBufferReadWriteBinding
+  { buffer :: BG.Ptr SDL_GPUBuffer
+  -- ^ The buffer to bind. Must have been created with SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE.
+  --
+  --          [C declaration]: @buffer@, defined at @SDL3\/SDL_gpu.h 2157:20@
+  , cycle :: BG.CBool
+  -- ^ true cycles the buffer if it is already bound.
+  --
+  --          [C declaration]: @cycle@, defined at @SDL3\/SDL_gpu.h 2158:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_gpu.h 2159:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_gpu.h 2160:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_gpu.h 2161:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUStorageBufferReadWriteBinding where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUStorageBufferReadWriteBinding where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUStorageBufferReadWriteBinding
+        <*> HasCField.readRaw (BG.Proxy @"buffer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"cycle") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+
+instance Marshal.WriteRaw SDL_GPUStorageBufferReadWriteBinding where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUStorageBufferReadWriteBinding
+            buffer2
+            cycle3
+            padding14
+            padding25
+            padding36 ->
+              HasCField.writeRaw (BG.Proxy @"buffer") ptr0 buffer2
+                >> HasCField.writeRaw (BG.Proxy @"cycle") ptr0 cycle3
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding14
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding25
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding36
+
+deriving via
+  Marshal.EquivStorable SDL_GPUStorageBufferReadWriteBinding
+  instance
+    BG.Storable SDL_GPUStorageBufferReadWriteBinding
+
+instance
+  (ty ~ BG.Ptr SDL_GPUBuffer)
+  => BG.CompatHasField.HasField "buffer" SDL_GPUStorageBufferReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageBufferReadWriteBinding
+            { buffer = y1
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"buffer" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUBuffer)
+  => BG.HasField "buffer" (BG.Ptr SDL_GPUStorageBufferReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"buffer")
+
+instance HasCField.HasCField SDL_GPUStorageBufferReadWriteBinding "buffer" where
+  type
+    CFieldType SDL_GPUStorageBufferReadWriteBinding "buffer" =
+      BG.Ptr SDL_GPUBuffer
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "cycle" SDL_GPUStorageBufferReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageBufferReadWriteBinding
+            { cycle = y1
+            , buffer = BG.getField @"buffer" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"cycle" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "cycle" (BG.Ptr SDL_GPUStorageBufferReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"cycle")
+
+instance HasCField.HasCField SDL_GPUStorageBufferReadWriteBinding "cycle" where
+  type
+    CFieldType SDL_GPUStorageBufferReadWriteBinding "cycle" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GPUStorageBufferReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageBufferReadWriteBinding
+            { padding1 = y1
+            , buffer = BG.getField @"buffer" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GPUStorageBufferReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GPUStorageBufferReadWriteBinding "padding1" where
+  type
+    CFieldType SDL_GPUStorageBufferReadWriteBinding "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 9
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GPUStorageBufferReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageBufferReadWriteBinding
+            { padding2 = y1
+            , buffer = BG.getField @"buffer" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GPUStorageBufferReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GPUStorageBufferReadWriteBinding "padding2" where
+  type
+    CFieldType SDL_GPUStorageBufferReadWriteBinding "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 10
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_GPUStorageBufferReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageBufferReadWriteBinding
+            { padding3 = y1
+            , buffer = BG.getField @"buffer" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_GPUStorageBufferReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_GPUStorageBufferReadWriteBinding "padding3" where
+  type
+    CFieldType SDL_GPUStorageBufferReadWriteBinding "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 11
+
+-- | A structure specifying parameters related to binding textures in a compute pass.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BeginGPUComputePass'
+--
+--     [C declaration]: @struct SDL_GPUStorageTextureReadWriteBinding@, defined at @SDL3\/SDL_gpu.h 2172:16@
+data SDL_GPUStorageTextureReadWriteBinding = SDL_GPUStorageTextureReadWriteBinding
+  { texture :: BG.Ptr SDL_GPUTexture
+  -- ^ The texture to bind. Must have been created with SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE or SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE.
+  --
+  --          [C declaration]: @texture@, defined at @SDL3\/SDL_gpu.h 2174:21@
+  , mip_level :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The mip level index to bind.
+  --
+  --          [C declaration]: @mip_level@, defined at @SDL3\/SDL_gpu.h 2175:12@
+  , layer :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The layer index to bind.
+  --
+  --          [C declaration]: @layer@, defined at @SDL3\/SDL_gpu.h 2176:12@
+  , cycle :: BG.CBool
+  -- ^ true cycles the texture if it is already bound.
+  --
+  --          [C declaration]: @cycle@, defined at @SDL3\/SDL_gpu.h 2177:10@
+  , padding1 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding1@, defined at @SDL3\/SDL_gpu.h 2178:11@
+  , padding2 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding2@, defined at @SDL3\/SDL_gpu.h 2179:11@
+  , padding3 :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding3@, defined at @SDL3\/SDL_gpu.h 2180:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUStorageTextureReadWriteBinding where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUStorageTextureReadWriteBinding where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUStorageTextureReadWriteBinding
+        <*> HasCField.readRaw (BG.Proxy @"texture") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mip_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"layer") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"cycle") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding1") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding3") ptr0
+
+instance Marshal.WriteRaw SDL_GPUStorageTextureReadWriteBinding where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUStorageTextureReadWriteBinding
+            texture2
+            mip_level3
+            layer4
+            cycle5
+            padding16
+            padding27
+            padding38 ->
+              HasCField.writeRaw (BG.Proxy @"texture") ptr0 texture2
+                >> HasCField.writeRaw (BG.Proxy @"mip_level") ptr0 mip_level3
+                >> HasCField.writeRaw (BG.Proxy @"layer") ptr0 layer4
+                >> HasCField.writeRaw (BG.Proxy @"cycle") ptr0 cycle5
+                >> HasCField.writeRaw (BG.Proxy @"padding1") ptr0 padding16
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding27
+                >> HasCField.writeRaw (BG.Proxy @"padding3") ptr0 padding38
+
+deriving via
+  Marshal.EquivStorable SDL_GPUStorageTextureReadWriteBinding
+  instance
+    BG.Storable SDL_GPUStorageTextureReadWriteBinding
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.CompatHasField.HasField "texture" SDL_GPUStorageTextureReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageTextureReadWriteBinding
+            { texture = y1
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"texture" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GPUTexture)
+  => BG.HasField "texture" (BG.Ptr SDL_GPUStorageTextureReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"texture")
+
+instance HasCField.HasCField SDL_GPUStorageTextureReadWriteBinding "texture" where
+  type
+    CFieldType SDL_GPUStorageTextureReadWriteBinding "texture" =
+      BG.Ptr SDL_GPUTexture
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "mip_level" SDL_GPUStorageTextureReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageTextureReadWriteBinding
+            { mip_level = y1
+            , texture = BG.getField @"texture" x0
+            , layer = BG.getField @"layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"mip_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "mip_level" (BG.Ptr SDL_GPUStorageTextureReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mip_level")
+
+instance HasCField.HasCField SDL_GPUStorageTextureReadWriteBinding "mip_level" where
+  type
+    CFieldType SDL_GPUStorageTextureReadWriteBinding "mip_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "layer" SDL_GPUStorageTextureReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageTextureReadWriteBinding
+            { layer = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"layer" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "layer" (BG.Ptr SDL_GPUStorageTextureReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"layer")
+
+instance HasCField.HasCField SDL_GPUStorageTextureReadWriteBinding "layer" where
+  type
+    CFieldType SDL_GPUStorageTextureReadWriteBinding "layer" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ BG.CBool)
+  => BG.CompatHasField.HasField "cycle" SDL_GPUStorageTextureReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageTextureReadWriteBinding
+            { cycle = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"cycle" x0
+      )
+
+instance
+  (ty ~ BG.CBool)
+  => BG.HasField "cycle" (BG.Ptr SDL_GPUStorageTextureReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"cycle")
+
+instance HasCField.HasCField SDL_GPUStorageTextureReadWriteBinding "cycle" where
+  type
+    CFieldType SDL_GPUStorageTextureReadWriteBinding "cycle" =
+      BG.CBool
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding1" SDL_GPUStorageTextureReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageTextureReadWriteBinding
+            { padding1 = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding2 = BG.getField @"padding2" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding1" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding1" (BG.Ptr SDL_GPUStorageTextureReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding1")
+
+instance HasCField.HasCField SDL_GPUStorageTextureReadWriteBinding "padding1" where
+  type
+    CFieldType SDL_GPUStorageTextureReadWriteBinding "padding1" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 17
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding2" SDL_GPUStorageTextureReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageTextureReadWriteBinding
+            { padding2 = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding3 = BG.getField @"padding3" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding2" (BG.Ptr SDL_GPUStorageTextureReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_GPUStorageTextureReadWriteBinding "padding2" where
+  type
+    CFieldType SDL_GPUStorageTextureReadWriteBinding "padding2" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 18
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding3" SDL_GPUStorageTextureReadWriteBinding ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUStorageTextureReadWriteBinding
+            { padding3 = y1
+            , texture = BG.getField @"texture" x0
+            , mip_level = BG.getField @"mip_level" x0
+            , layer = BG.getField @"layer" x0
+            , cycle = BG.getField @"cycle" x0
+            , padding1 = BG.getField @"padding1" x0
+            , padding2 = BG.getField @"padding2" x0
+            }
+      , BG.getField @"padding3" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding3" (BG.Ptr SDL_GPUStorageTextureReadWriteBinding) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding3")
+
+instance HasCField.HasCField SDL_GPUStorageTextureReadWriteBinding "padding3" where
+  type
+    CFieldType SDL_GPUStorageTextureReadWriteBinding "padding3" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 19
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN@, literal @\"SDL.gpu.device.create.debugmode\"@, defined at @SDL3\/SDL_gpu.h 2363:9@
+sDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_DEBUGMODE_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x62
+    , 0x75
+    , 0x67
+    , 0x6D
+    , 0x6F
+    , 0x64
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN@, literal @\"SDL.gpu.device.create.preferlowpower\"@, defined at @SDL3\/SDL_gpu.h 2364:9@
+sDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_PREFERLOWPOWER_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x65
+    , 0x66
+    , 0x65
+    , 0x72
+    , 0x6C
+    , 0x6F
+    , 0x77
+    , 0x70
+    , 0x6F
+    , 0x77
+    , 0x65
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN@, literal @\"SDL.gpu.device.create.verbose\"@, defined at @SDL3\/SDL_gpu.h 2365:9@
+sDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x65
+    , 0x72
+    , 0x62
+    , 0x6F
+    , 0x73
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_NAME_STRING@, literal @\"SDL.gpu.device.create.name\"@, defined at @SDL3\/SDL_gpu.h 2366:9@
+sDL_PROP_GPU_DEVICE_CREATE_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN@, literal @\"SDL.gpu.device.create.feature.clip_distance\"@, defined at @SDL3\/SDL_gpu.h 2367:9@
+sDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x66
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x6C
+    , 0x69
+    , 0x70
+    , 0x5F
+    , 0x64
+    , 0x69
+    , 0x73
+    , 0x74
+    , 0x61
+    , 0x6E
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN@, literal @\"SDL.gpu.device.create.feature.depth_clamping\"@, defined at @SDL3\/SDL_gpu.h 2368:9@
+sDL_PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_FEATURE_DEPTH_CLAMPING_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x66
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x70
+    , 0x74
+    , 0x68
+    , 0x5F
+    , 0x63
+    , 0x6C
+    , 0x61
+    , 0x6D
+    , 0x70
+    , 0x69
+    , 0x6E
+    , 0x67
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN@, literal @\"SDL.gpu.device.create.feature.indirect_draw_first_instance\"@, defined at @SDL3\/SDL_gpu.h 2369:9@
+sDL_PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_FEATURE_INDIRECT_DRAW_FIRST_INSTANCE_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x66
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x69
+    , 0x72
+    , 0x65
+    , 0x63
+    , 0x74
+    , 0x5F
+    , 0x64
+    , 0x72
+    , 0x61
+    , 0x77
+    , 0x5F
+    , 0x66
+    , 0x69
+    , 0x72
+    , 0x73
+    , 0x74
+    , 0x5F
+    , 0x69
+    , 0x6E
+    , 0x73
+    , 0x74
+    , 0x61
+    , 0x6E
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN@, literal @\"SDL.gpu.device.create.feature.anisotropy\"@, defined at @SDL3\/SDL_gpu.h 2370:9@
+sDL_PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_FEATURE_ANISOTROPY_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x66
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x61
+    , 0x6E
+    , 0x69
+    , 0x73
+    , 0x6F
+    , 0x74
+    , 0x72
+    , 0x6F
+    , 0x70
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN@, literal @\"SDL.gpu.device.create.shaders.private\"@, defined at @SDL3\/SDL_gpu.h 2371:9@
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x68
+    , 0x61
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x69
+    , 0x76
+    , 0x61
+    , 0x74
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN@, literal @\"SDL.gpu.device.create.shaders.spirv\"@, defined at @SDL3\/SDL_gpu.h 2372:9@
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x68
+    , 0x61
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x2E
+    , 0x73
+    , 0x70
+    , 0x69
+    , 0x72
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN@, literal @\"SDL.gpu.device.create.shaders.dxbc\"@, defined at @SDL3\/SDL_gpu.h 2373:9@
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x68
+    , 0x61
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x2E
+    , 0x64
+    , 0x78
+    , 0x62
+    , 0x63
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN@, literal @\"SDL.gpu.device.create.shaders.dxil\"@, defined at @SDL3\/SDL_gpu.h 2374:9@
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x68
+    , 0x61
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x2E
+    , 0x64
+    , 0x78
+    , 0x69
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN@, literal @\"SDL.gpu.device.create.shaders.msl\"@, defined at @SDL3\/SDL_gpu.h 2375:9@
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x68
+    , 0x61
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x2E
+    , 0x6D
+    , 0x73
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN@, literal @\"SDL.gpu.device.create.shaders.metallib\"@, defined at @SDL3\/SDL_gpu.h 2376:9@
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x68
+    , 0x61
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x6C
+    , 0x6C
+    , 0x69
+    , 0x62
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN@, literal @\"SDL.gpu.device.create.d3d12.allowtier1resourcebinding\"@, defined at @SDL3\/SDL_gpu.h 2377:9@
+sDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x61
+    , 0x6C
+    , 0x6C
+    , 0x6F
+    , 0x77
+    , 0x74
+    , 0x69
+    , 0x65
+    , 0x72
+    , 0x31
+    , 0x72
+    , 0x65
+    , 0x73
+    , 0x6F
+    , 0x75
+    , 0x72
+    , 0x63
+    , 0x65
+    , 0x62
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x69
+    , 0x6E
+    , 0x67
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING@, literal @\"SDL.gpu.device.create.d3d12.semantic\"@, defined at @SDL3\/SDL_gpu.h 2378:9@
+sDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x73
+    , 0x65
+    , 0x6D
+    , 0x61
+    , 0x6E
+    , 0x74
+    , 0x69
+    , 0x63
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER@, literal @\"SDL.gpu.device.create.d3d12.agility_sdk_version\"@, defined at @SDL3\/SDL_gpu.h 2379:9@
+sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x61
+    , 0x67
+    , 0x69
+    , 0x6C
+    , 0x69
+    , 0x74
+    , 0x79
+    , 0x5F
+    , 0x73
+    , 0x64
+    , 0x6B
+    , 0x5F
+    , 0x76
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING@, literal @\"SDL.gpu.device.create.d3d12.agility_sdk_path\"@, defined at @SDL3\/SDL_gpu.h 2380:9@
+sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x61
+    , 0x67
+    , 0x69
+    , 0x6C
+    , 0x69
+    , 0x74
+    , 0x79
+    , 0x5F
+    , 0x73
+    , 0x64
+    , 0x6B
+    , 0x5F
+    , 0x70
+    , 0x61
+    , 0x74
+    , 0x68
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN@, literal @\"SDL.gpu.device.create.vulkan.requirehardwareacceleration\"@, defined at @SDL3\/SDL_gpu.h 2381:9@
+sDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_VULKAN_REQUIRE_HARDWARE_ACCELERATION_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x71
+    , 0x75
+    , 0x69
+    , 0x72
+    , 0x65
+    , 0x68
+    , 0x61
+    , 0x72
+    , 0x64
+    , 0x77
+    , 0x61
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x63
+    , 0x63
+    , 0x65
+    , 0x6C
+    , 0x65
+    , 0x72
+    , 0x61
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER@, literal @\"SDL.gpu.device.create.vulkan.options\"@, defined at @SDL3\/SDL_gpu.h 2382:9@
+sDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    , 0x73
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN@, literal @\"SDL.gpu.device.create.metal.allowmacfamily1\"@, defined at @SDL3\/SDL_gpu.h 2383:9@
+sDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN :: BG.ByteString
+sDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x6C
+    , 0x2E
+    , 0x61
+    , 0x6C
+    , 0x6C
+    , 0x6F
+    , 0x77
+    , 0x6D
+    , 0x61
+    , 0x63
+    , 0x66
+    , 0x61
+    , 0x6D
+    , 0x69
+    , 0x6C
+    , 0x79
+    , 0x31
+    ]
+
+-- | A structure specifying additional options when using Vulkan.
+--
+--     When no such structure is provided, SDL will use Vulkan API version 1.0 and 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 feature_list is ignored. Only the vulkan_10_physical_device_features and 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, as well as vulkan_10_physical_device_features, are always processed.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @struct SDL_GPUVulkanOptions@, defined at @SDL3\/SDL_gpu.h 2402:16@
+data SDL_GPUVulkanOptions = SDL_GPUVulkanOptions
+  { vulkan_api_version :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The Vulkan API version to request for the instance. Use Vulkan\'s VK_MAKE_VERSION or VK_MAKE_API_VERSION.
+  --
+  --          [C declaration]: @vulkan_api_version@, defined at @SDL3\/SDL_gpu.h 2404:12@
+  , feature_list :: BG.Ptr BG.Void
+  -- ^ Pointer to the first element of a chain of Vulkan feature structs. (Requires API version 1.1 or higher.)
+  --
+  --          [C declaration]: @feature_list@, defined at @SDL3\/SDL_gpu.h 2405:11@
+  , vulkan_10_physical_device_features :: BG.Ptr BG.Void
+  -- ^ Pointer to a VkPhysicalDeviceFeatures struct to enable additional Vulkan 1.0 features.
+  --
+  --          [C declaration]: @vulkan_10_physical_device_features@, defined at @SDL3\/SDL_gpu.h 2406:8@
+  , device_extension_count :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Number of additional device extensions to require.
+  --
+  --          [C declaration]: @device_extension_count@, defined at @SDL3\/SDL_gpu.h 2407:9@
+  , device_extension_names :: BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^ Pointer to a list of additional device extensions to require.
+  --
+  --          [C declaration]: @device_extension_names@, defined at @SDL3\/SDL_gpu.h 2408:15@
+  , instance_extension_count :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Number of additional instance extensions to require.
+  --
+  --          [C declaration]: @instance_extension_count@, defined at @SDL3\/SDL_gpu.h 2409:9@
+  , instance_extension_names :: BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^ Pointer to a list of additional instance extensions to require.
+  --
+  --          [C declaration]: @instance_extension_names@, defined at @SDL3\/SDL_gpu.h 2410:15@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPUVulkanOptions where
+  staticSizeOf = \_ -> (56 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPUVulkanOptions where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPUVulkanOptions
+        <*> HasCField.readRaw (BG.Proxy @"vulkan_api_version") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"feature_list") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"vulkan_10_physical_device_features") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"device_extension_count") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"device_extension_names") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"instance_extension_count") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"instance_extension_names") ptr0
+
+instance Marshal.WriteRaw SDL_GPUVulkanOptions where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPUVulkanOptions
+            vulkan_api_version2
+            feature_list3
+            vulkan_10_physical_device_features4
+            device_extension_count5
+            device_extension_names6
+            instance_extension_count7
+            instance_extension_names8 ->
+              HasCField.writeRaw (BG.Proxy @"vulkan_api_version") ptr0 vulkan_api_version2
+                >> HasCField.writeRaw (BG.Proxy @"feature_list") ptr0 feature_list3
+                >> HasCField.writeRaw
+                  (BG.Proxy @"vulkan_10_physical_device_features")
+                  ptr0
+                  vulkan_10_physical_device_features4
+                >> HasCField.writeRaw (BG.Proxy @"device_extension_count") ptr0 device_extension_count5
+                >> HasCField.writeRaw (BG.Proxy @"device_extension_names") ptr0 device_extension_names6
+                >> HasCField.writeRaw (BG.Proxy @"instance_extension_count") ptr0 instance_extension_count7
+                >> HasCField.writeRaw (BG.Proxy @"instance_extension_names") ptr0 instance_extension_names8
+
+deriving via Marshal.EquivStorable SDL_GPUVulkanOptions instance BG.Storable SDL_GPUVulkanOptions
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "vulkan_api_version" SDL_GPUVulkanOptions ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVulkanOptions
+            { vulkan_api_version = y1
+            , feature_list = BG.getField @"feature_list" x0
+            , vulkan_10_physical_device_features = BG.getField @"vulkan_10_physical_device_features" x0
+            , device_extension_count = BG.getField @"device_extension_count" x0
+            , device_extension_names = BG.getField @"device_extension_names" x0
+            , instance_extension_count = BG.getField @"instance_extension_count" x0
+            , instance_extension_names = BG.getField @"instance_extension_names" x0
+            }
+      , BG.getField @"vulkan_api_version" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "vulkan_api_version" (BG.Ptr SDL_GPUVulkanOptions) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"vulkan_api_version")
+
+instance HasCField.HasCField SDL_GPUVulkanOptions "vulkan_api_version" where
+  type
+    CFieldType SDL_GPUVulkanOptions "vulkan_api_version" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "feature_list" SDL_GPUVulkanOptions ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVulkanOptions
+            { feature_list = y1
+            , vulkan_api_version = BG.getField @"vulkan_api_version" x0
+            , vulkan_10_physical_device_features = BG.getField @"vulkan_10_physical_device_features" x0
+            , device_extension_count = BG.getField @"device_extension_count" x0
+            , device_extension_names = BG.getField @"device_extension_names" x0
+            , instance_extension_count = BG.getField @"instance_extension_count" x0
+            , instance_extension_names = BG.getField @"instance_extension_names" x0
+            }
+      , BG.getField @"feature_list" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "feature_list" (BG.Ptr SDL_GPUVulkanOptions) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"feature_list")
+
+instance HasCField.HasCField SDL_GPUVulkanOptions "feature_list" where
+  type
+    CFieldType SDL_GPUVulkanOptions "feature_list" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "vulkan_10_physical_device_features" SDL_GPUVulkanOptions ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVulkanOptions
+            { vulkan_10_physical_device_features = y1
+            , vulkan_api_version = BG.getField @"vulkan_api_version" x0
+            , feature_list = BG.getField @"feature_list" x0
+            , device_extension_count = BG.getField @"device_extension_count" x0
+            , device_extension_names = BG.getField @"device_extension_names" x0
+            , instance_extension_count = BG.getField @"instance_extension_count" x0
+            , instance_extension_names = BG.getField @"instance_extension_names" x0
+            }
+      , BG.getField @"vulkan_10_physical_device_features" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "vulkan_10_physical_device_features" (BG.Ptr SDL_GPUVulkanOptions) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"vulkan_10_physical_device_features")
+
+instance HasCField.HasCField SDL_GPUVulkanOptions "vulkan_10_physical_device_features" where
+  type
+    CFieldType SDL_GPUVulkanOptions "vulkan_10_physical_device_features" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "device_extension_count" SDL_GPUVulkanOptions ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVulkanOptions
+            { device_extension_count = y1
+            , vulkan_api_version = BG.getField @"vulkan_api_version" x0
+            , feature_list = BG.getField @"feature_list" x0
+            , vulkan_10_physical_device_features = BG.getField @"vulkan_10_physical_device_features" x0
+            , device_extension_names = BG.getField @"device_extension_names" x0
+            , instance_extension_count = BG.getField @"instance_extension_count" x0
+            , instance_extension_names = BG.getField @"instance_extension_names" x0
+            }
+      , BG.getField @"device_extension_count" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "device_extension_count" (BG.Ptr SDL_GPUVulkanOptions) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"device_extension_count")
+
+instance HasCField.HasCField SDL_GPUVulkanOptions "device_extension_count" where
+  type
+    CFieldType SDL_GPUVulkanOptions "device_extension_count" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.Ptr (PtrConst.PtrConst BG.CChar))
+  => BG.CompatHasField.HasField "device_extension_names" SDL_GPUVulkanOptions ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVulkanOptions
+            { device_extension_names = y1
+            , vulkan_api_version = BG.getField @"vulkan_api_version" x0
+            , feature_list = BG.getField @"feature_list" x0
+            , vulkan_10_physical_device_features = BG.getField @"vulkan_10_physical_device_features" x0
+            , device_extension_count = BG.getField @"device_extension_count" x0
+            , instance_extension_count = BG.getField @"instance_extension_count" x0
+            , instance_extension_names = BG.getField @"instance_extension_names" x0
+            }
+      , BG.getField @"device_extension_names" x0
+      )
+
+instance
+  (ty ~ BG.Ptr (PtrConst.PtrConst BG.CChar))
+  => BG.HasField "device_extension_names" (BG.Ptr SDL_GPUVulkanOptions) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"device_extension_names")
+
+instance HasCField.HasCField SDL_GPUVulkanOptions "device_extension_names" where
+  type
+    CFieldType SDL_GPUVulkanOptions "device_extension_names" =
+      BG.Ptr (PtrConst.PtrConst BG.CChar)
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "instance_extension_count" SDL_GPUVulkanOptions ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVulkanOptions
+            { instance_extension_count = y1
+            , vulkan_api_version = BG.getField @"vulkan_api_version" x0
+            , feature_list = BG.getField @"feature_list" x0
+            , vulkan_10_physical_device_features = BG.getField @"vulkan_10_physical_device_features" x0
+            , device_extension_count = BG.getField @"device_extension_count" x0
+            , device_extension_names = BG.getField @"device_extension_names" x0
+            , instance_extension_names = BG.getField @"instance_extension_names" x0
+            }
+      , BG.getField @"instance_extension_count" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "instance_extension_count" (BG.Ptr SDL_GPUVulkanOptions) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"instance_extension_count")
+
+instance HasCField.HasCField SDL_GPUVulkanOptions "instance_extension_count" where
+  type
+    CFieldType SDL_GPUVulkanOptions "instance_extension_count" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ BG.Ptr (PtrConst.PtrConst BG.CChar))
+  => BG.CompatHasField.HasField "instance_extension_names" SDL_GPUVulkanOptions ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPUVulkanOptions
+            { instance_extension_names = y1
+            , vulkan_api_version = BG.getField @"vulkan_api_version" x0
+            , feature_list = BG.getField @"feature_list" x0
+            , vulkan_10_physical_device_features = BG.getField @"vulkan_10_physical_device_features" x0
+            , device_extension_count = BG.getField @"device_extension_count" x0
+            , device_extension_names = BG.getField @"device_extension_names" x0
+            , instance_extension_count = BG.getField @"instance_extension_count" x0
+            }
+      , BG.getField @"instance_extension_names" x0
+      )
+
+instance
+  (ty ~ BG.Ptr (PtrConst.PtrConst BG.CChar))
+  => BG.HasField "instance_extension_names" (BG.Ptr SDL_GPUVulkanOptions) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"instance_extension_names")
+
+instance HasCField.HasCField SDL_GPUVulkanOptions "instance_extension_names" where
+  type
+    CFieldType SDL_GPUVulkanOptions "instance_extension_names" =
+      BG.Ptr (PtrConst.PtrConst BG.CChar)
+
+  offset# = \_ -> \_ -> 48
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_NAME_STRING@, literal @\"SDL.gpu.device.name\"@, defined at @SDL3\/SDL_gpu.h 2579:9@
+sDL_PROP_GPU_DEVICE_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_DEVICE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING@, literal @\"SDL.gpu.device.driver_name\"@, defined at @SDL3\/SDL_gpu.h 2580:9@
+sDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_DEVICE_DRIVER_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x72
+    , 0x69
+    , 0x76
+    , 0x65
+    , 0x72
+    , 0x5F
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING@, literal @\"SDL.gpu.device.driver_version\"@, defined at @SDL3\/SDL_gpu.h 2581:9@
+sDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING :: BG.ByteString
+sDL_PROP_GPU_DEVICE_DRIVER_VERSION_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x72
+    , 0x69
+    , 0x76
+    , 0x65
+    , 0x72
+    , 0x5F
+    , 0x76
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING@, literal @\"SDL.gpu.device.driver_info\"@, defined at @SDL3\/SDL_gpu.h 2582:9@
+sDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING :: BG.ByteString
+sDL_PROP_GPU_DEVICE_DRIVER_INFO_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x72
+    , 0x69
+    , 0x76
+    , 0x65
+    , 0x72
+    , 0x5F
+    , 0x69
+    , 0x6E
+    , 0x66
+    , 0x6F
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING@, literal @\"SDL.gpu.computepipeline.create.name\"@, defined at @SDL3\/SDL_gpu.h 2636:9@
+sDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x63
+    , 0x6F
+    , 0x6D
+    , 0x70
+    , 0x75
+    , 0x74
+    , 0x65
+    , 0x70
+    , 0x69
+    , 0x70
+    , 0x65
+    , 0x6C
+    , 0x69
+    , 0x6E
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING@, literal @\"SDL.gpu.graphicspipeline.create.name\"@, defined at @SDL3\/SDL_gpu.h 2663:9@
+sDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x67
+    , 0x72
+    , 0x61
+    , 0x70
+    , 0x68
+    , 0x69
+    , 0x63
+    , 0x73
+    , 0x70
+    , 0x69
+    , 0x70
+    , 0x65
+    , 0x6C
+    , 0x69
+    , 0x6E
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING@, literal @\"SDL.gpu.sampler.create.name\"@, defined at @SDL3\/SDL_gpu.h 2690:9@
+sDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x73
+    , 0x61
+    , 0x6D
+    , 0x70
+    , 0x6C
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_SHADER_CREATE_NAME_STRING@, literal @\"SDL.gpu.shader.create.name\"@, defined at @SDL3\/SDL_gpu.h 2769:9@
+sDL_PROP_GPU_SHADER_CREATE_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_SHADER_CREATE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x73
+    , 0x68
+    , 0x61
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT@, literal @\"SDL.gpu.texture.create.d3d12.clear.r\"@, defined at @SDL3\/SDL_gpu.h 2833:9@
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT :: BG.ByteString
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x63
+    , 0x6C
+    , 0x65
+    , 0x61
+    , 0x72
+    , 0x2E
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT@, literal @\"SDL.gpu.texture.create.d3d12.clear.g\"@, defined at @SDL3\/SDL_gpu.h 2834:9@
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT :: BG.ByteString
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x63
+    , 0x6C
+    , 0x65
+    , 0x61
+    , 0x72
+    , 0x2E
+    , 0x67
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT@, literal @\"SDL.gpu.texture.create.d3d12.clear.b\"@, defined at @SDL3\/SDL_gpu.h 2835:9@
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT :: BG.ByteString
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x63
+    , 0x6C
+    , 0x65
+    , 0x61
+    , 0x72
+    , 0x2E
+    , 0x62
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT@, literal @\"SDL.gpu.texture.create.d3d12.clear.a\"@, defined at @SDL3\/SDL_gpu.h 2836:9@
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT :: BG.ByteString
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x63
+    , 0x6C
+    , 0x65
+    , 0x61
+    , 0x72
+    , 0x2E
+    , 0x61
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT@, literal @\"SDL.gpu.texture.create.d3d12.clear.depth\"@, defined at @SDL3\/SDL_gpu.h 2837:9@
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT :: BG.ByteString
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x63
+    , 0x6C
+    , 0x65
+    , 0x61
+    , 0x72
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x70
+    , 0x74
+    , 0x68
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER@, literal @\"SDL.gpu.texture.create.d3d12.clear.stencil\"@, defined at @SDL3\/SDL_gpu.h 2838:9@
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER :: BG.ByteString
+sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x63
+    , 0x6C
+    , 0x65
+    , 0x61
+    , 0x72
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x65
+    , 0x6E
+    , 0x63
+    , 0x69
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING@, literal @\"SDL.gpu.texture.create.name\"@, defined at @SDL3\/SDL_gpu.h 2839:9@
+sDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING@, literal @\"SDL.gpu.buffer.create.name\"@, defined at @SDL3\/SDL_gpu.h 2889:9@
+sDL_PROP_GPU_BUFFER_CREATE_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_BUFFER_CREATE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x62
+    , 0x75
+    , 0x66
+    , 0x66
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING@, literal @\"SDL.gpu.transferbuffer.create.name\"@, defined at @SDL3\/SDL_gpu.h 2922:9@
+sDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING :: BG.ByteString
+sDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x72
+    , 0x61
+    , 0x6E
+    , 0x73
+    , 0x66
+    , 0x65
+    , 0x72
+    , 0x62
+    , 0x75
+    , 0x66
+    , 0x66
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
diff --git a/src/SDL3/Sys/Bindgen/Gpu/FunPtr.hs b/src/SDL3/Sys/Bindgen/Gpu/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Gpu/FunPtr.hs
@@ -0,0 +1,4938 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Gpu.FunPtr (
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GPUSupportsShaderFormats,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GPUSupportsProperties,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CreateGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CreateGPUDeviceWithProperties,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_DestroyGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GetNumGPUDrivers,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GetGPUDriver,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GetGPUDeviceDriver,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GetGPUShaderFormats,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GetGPUDeviceProperties,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CreateGPUComputePipeline,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CreateGPUGraphicsPipeline,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CreateGPUSampler,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CreateGPUShader,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CreateGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CreateGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CreateGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_SetGPUBufferName,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_SetGPUTextureName,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_InsertGPUDebugLabel,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_PushGPUDebugGroup,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_PopGPUDebugGroup,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_ReleaseGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_ReleaseGPUSampler,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_ReleaseGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_ReleaseGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_ReleaseGPUComputePipeline,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_ReleaseGPUShader,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_ReleaseGPUGraphicsPipeline,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_AcquireGPUCommandBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_PushGPUVertexUniformData,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_PushGPUFragmentUniformData,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_PushGPUComputeUniformData,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BeginGPURenderPass,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUGraphicsPipeline,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_SetGPUViewport,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_SetGPUScissor,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_SetGPUBlendConstants,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_SetGPUStencilReference,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUVertexBuffers,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUIndexBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUVertexSamplers,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUVertexStorageTextures,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUVertexStorageBuffers,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUFragmentSamplers,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUFragmentStorageTextures,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUFragmentStorageBuffers,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_DrawGPUIndexedPrimitives,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_DrawGPUPrimitives,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_DrawGPUPrimitivesIndirect,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_DrawGPUIndexedPrimitivesIndirect,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_EndGPURenderPass,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BeginGPUComputePass,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUComputePipeline,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUComputeSamplers,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUComputeStorageTextures,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BindGPUComputeStorageBuffers,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_DispatchGPUCompute,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_DispatchGPUComputeIndirect,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_EndGPUComputePass,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_MapGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_UnmapGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BeginGPUCopyPass,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_UploadToGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_UploadToGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CopyGPUTextureToTexture,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CopyGPUBufferToBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_DownloadFromGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_DownloadFromGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_EndGPUCopyPass,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GenerateMipmapsForGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_BlitGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_WindowSupportsGPUSwapchainComposition,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_WindowSupportsGPUPresentMode,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_ClaimWindowForGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_ReleaseWindowFromGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_SetGPUSwapchainParameters,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_SetGPUAllowedFramesInFlight,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GetGPUSwapchainTextureFormat,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_AcquireGPUSwapchainTexture,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_WaitForGPUSwapchain,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_WaitAndAcquireGPUSwapchainTexture,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_SubmitGPUCommandBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_SubmitGPUCommandBufferAndAcquireFence,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CancelGPUCommandBuffer,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_WaitForGPUIdle,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_WaitForGPUFences,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_QueryGPUFence,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_ReleaseGPUFence,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GPUTextureFormatTexelBlockSize,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GPUTextureSupportsFormat,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GPUTextureSupportsSampleCount,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_CalculateGPUTextureFormatSize,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GetPixelFormatFromGPUTextureFormat,
+  SDL3.Sys.Bindgen.Gpu.FunPtr.sDL_GetGPUTextureFormatFromPixelFormat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Gpu
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_gpu.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUSupportsShaderFormats */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_730746f3f6b80bd4 (void)) ("
+         , "  SDL_GPUShaderFormat arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GPUSupportsShaderFormats;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUSupportsProperties */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_df6bcb319e7313a0 (void)) ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GPUSupportsProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUDevice */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUDevice *(*hs_bindgen_5a2c70cfbb51d0a5 (void)) ("
+         , "  SDL_GPUShaderFormat arg1,"
+         , "  _Bool arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateGPUDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUDeviceWithProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUDevice *(*hs_bindgen_e9b4dabe0fdafe0a (void)) ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateGPUDeviceWithProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DestroyGPUDevice */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_3d36d3936e535445 (void)) ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyGPUDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetNumGPUDrivers */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_724c599cc9199701 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetNumGPUDrivers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUDriver */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_878ed2fb40f693fc (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGPUDriver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUDeviceDriver */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_61e30ecd9dcd6a0d (void)) ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGPUDeviceDriver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUShaderFormats */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUShaderFormat (*hs_bindgen_1588f64687b7a181 (void)) ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGPUShaderFormats;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUDeviceProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_d9a18bd5c77f3076 (void)) ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetGPUDeviceProperties;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetGPUDeviceProperties requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUComputePipeline */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUComputePipeline *(*hs_bindgen_b4882831b991328b (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUComputePipelineCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateGPUComputePipeline;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUGraphicsPipeline */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUGraphicsPipeline *(*hs_bindgen_6b24737f0e188591 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUGraphicsPipelineCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateGPUGraphicsPipeline;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUSampler */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUSampler *(*hs_bindgen_d26b045cc9bb0074 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUSamplerCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateGPUSampler;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUShader */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUShader *(*hs_bindgen_268ad47187462489 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUShaderCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateGPUShader;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUTexture */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUTexture *(*hs_bindgen_8868d47614851449 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTextureCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateGPUTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUBuffer */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUBuffer *(*hs_bindgen_0e8ef224f7419576 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUBufferCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateGPUBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUTransferBuffer */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUTransferBuffer *(*hs_bindgen_d99ca9bfb892bc36 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBufferCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateGPUTransferBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUBufferName */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_ddb180594f35b8be (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGPUBufferName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUTextureName */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_8e9612fc267feeaa (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTexture *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGPUTextureName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_InsertGPUDebugLabel */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_53b6f5854610b06f (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_InsertGPUDebugLabel;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUDebugGroup */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_1ff675bf6c0d06d5 (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_PushGPUDebugGroup;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PopGPUDebugGroup */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_a00c28c817c76943 (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_PopGPUDebugGroup;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUTexture */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_542853e6548e89bb (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTexture *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReleaseGPUTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUSampler */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_56055ccd136d71a1 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUSampler *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReleaseGPUSampler;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUBuffer */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_f8bfa8ea14116360 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUBuffer *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReleaseGPUBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUTransferBuffer */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_14c942c8fbf2f3dc (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBuffer *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReleaseGPUTransferBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUComputePipeline */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_5f269731a3ef8faa (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUComputePipeline *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReleaseGPUComputePipeline;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUShader */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_f3e9c0034d2a2db0 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUShader *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReleaseGPUShader;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUGraphicsPipeline */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_29c94f86e013a8af (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUGraphicsPipeline *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReleaseGPUGraphicsPipeline;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_AcquireGPUCommandBuffer */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUCommandBuffer *(*hs_bindgen_d8255a52c3043feb (void)) ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_AcquireGPUCommandBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUVertexUniformData */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_fd67ffdf6fb8985a (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_PushGPUVertexUniformData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUFragmentUniformData */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_fee6bedc8b88a7fb (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_PushGPUFragmentUniformData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUComputeUniformData */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_f0981542878473d3 (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_PushGPUComputeUniformData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BeginGPURenderPass */"
+         , "__attribute__ ((const))"
+         , "SDL_GPURenderPass *(*hs_bindgen_154c2af06893d306 (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUColorTargetInfo const *arg2,"
+         , "  Uint32 arg3,"
+         , "  SDL_GPUDepthStencilTargetInfo const *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BeginGPURenderPass;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUGraphicsPipeline */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_f8d4e69cba96f49a (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUGraphicsPipeline *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUGraphicsPipeline;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUViewport */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_ef13d72a5a37e0cd (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUViewport const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGPUViewport;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUScissor */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_15e571926b2f0a64 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGPUScissor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUBlendConstants */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_82c20e8c6db3156f (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_FColor arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGPUBlendConstants;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUStencilReference */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_80029d033dcd3cde (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGPUStencilReference;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexBuffers */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_688e80f65b7efc4b (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBufferBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUVertexBuffers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUIndexBuffer */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_bea706d6a8ba9b69 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUBufferBinding const *arg2,"
+         , "  SDL_GPUIndexElementSize arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUIndexBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexSamplers */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_aaec001b714f4f20 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTextureSamplerBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUVertexSamplers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexStorageTextures */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_f3926e087d94d216 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTexture *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUVertexStorageTextures;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexStorageBuffers */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_0441f25c46dc0237 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBuffer *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUVertexStorageBuffers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUFragmentSamplers */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_31e74f680706f272 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTextureSamplerBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUFragmentSamplers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUFragmentStorageTextures */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_891de4ebe4443cb5 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTexture *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUFragmentStorageTextures;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUFragmentStorageBuffers */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_f0f46723815c3df1 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBuffer *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUFragmentStorageBuffers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUIndexedPrimitives */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_534a1c06f3f9ed05 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4,"
+         , "  Sint32 arg5,"
+         , "  Uint32 arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_DrawGPUIndexedPrimitives;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUPrimitives */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_b37844ed8f8b5582 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_DrawGPUPrimitives;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUPrimitivesIndirect */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_420bc7bd5da8d431 (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_DrawGPUPrimitivesIndirect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUIndexedPrimitivesIndirect */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_8f8e2fe5f315620c (void)) ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_DrawGPUIndexedPrimitivesIndirect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_EndGPURenderPass */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_d2969701500cfc55 (void)) ("
+         , "  SDL_GPURenderPass *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_EndGPURenderPass;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BeginGPUComputePass */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUComputePass *(*hs_bindgen_774d008d25b51181 (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUStorageTextureReadWriteBinding const *arg2,"
+         , "  Uint32 arg3,"
+         , "  SDL_GPUStorageBufferReadWriteBinding const *arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_BeginGPUComputePass;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputePipeline */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_4ad31c9180a8f4c7 (void)) ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  SDL_GPUComputePipeline *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUComputePipeline;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputeSamplers */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_29656bc1e0885584 (void)) ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTextureSamplerBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUComputeSamplers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputeStorageTextures */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_01575e615d9f9179 (void)) ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTexture *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUComputeStorageTextures;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputeStorageBuffers */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_589adbdedcb7e5de (void)) ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBuffer *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BindGPUComputeStorageBuffers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DispatchGPUCompute */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_050145c7c0eda2a0 (void)) ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_DispatchGPUCompute;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DispatchGPUComputeIndirect */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_6eed39e21086610c (void)) ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_DispatchGPUComputeIndirect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_EndGPUComputePass */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_3d69c010dbe2273d (void)) ("
+         , "  SDL_GPUComputePass *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_EndGPUComputePass;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_MapGPUTransferBuffer */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_683b5935cd3f5940 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBuffer *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_MapGPUTransferBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_UnmapGPUTransferBuffer */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_e33fd3a1127b2473 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBuffer *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_UnmapGPUTransferBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BeginGPUCopyPass */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUCopyPass *(*hs_bindgen_26ebd2bad4c071ad (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_BeginGPUCopyPass;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_UploadToGPUTexture */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_ab0f032d9686e81d (void)) ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTextureTransferInfo const *arg2,"
+         , "  SDL_GPUTextureRegion const *arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_UploadToGPUTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_UploadToGPUBuffer */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_d5ff839503d8766f (void)) ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTransferBufferLocation const *arg2,"
+         , "  SDL_GPUBufferRegion const *arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_UploadToGPUBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CopyGPUTextureToTexture */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_1cd400910067ddd5 (void)) ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTextureLocation const *arg2,"
+         , "  SDL_GPUTextureLocation const *arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5,"
+         , "  Uint32 arg6,"
+         , "  _Bool arg7"
+         , ")"
+         , "{"
+         , "  return &SDL_CopyGPUTextureToTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CopyGPUBufferToBuffer */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_f1c8dff3576eacd7 (void)) ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUBufferLocation const *arg2,"
+         , "  SDL_GPUBufferLocation const *arg3,"
+         , "  Uint32 arg4,"
+         , "  _Bool arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_CopyGPUBufferToBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DownloadFromGPUTexture */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_de2075aa3b528189 (void)) ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTextureRegion const *arg2,"
+         , "  SDL_GPUTextureTransferInfo const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_DownloadFromGPUTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DownloadFromGPUBuffer */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_ba4b40201f2134bd (void)) ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUBufferRegion const *arg2,"
+         , "  SDL_GPUTransferBufferLocation const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_DownloadFromGPUBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_EndGPUCopyPass */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_b4b5fc61adee338e (void)) ("
+         , "  SDL_GPUCopyPass *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_EndGPUCopyPass;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GenerateMipmapsForGPUTexture */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_9678149e861907fc (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUTexture *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GenerateMipmapsForGPUTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BlitGPUTexture */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_7f45139e78bf4f56 (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUBlitInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_BlitGPUTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WindowSupportsGPUSwapchainComposition */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c59f48ad030d3274 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUSwapchainComposition arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_WindowSupportsGPUSwapchainComposition;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WindowSupportsGPUPresentMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_bf576ab13c340f27 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUPresentMode arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_WindowSupportsGPUPresentMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ClaimWindowForGPUDevice */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4ecaa5beccefec7a (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ClaimWindowForGPUDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseWindowFromGPUDevice */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_196ff3ee33dc8751 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReleaseWindowFromGPUDevice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUSwapchainParameters */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_31ee67753f7ce365 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUSwapchainComposition arg3,"
+         , "  SDL_GPUPresentMode arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGPUSwapchainParameters;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUAllowedFramesInFlight */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_cf8859de2d063dde (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetGPUAllowedFramesInFlight;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUSwapchainTextureFormat */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUTextureFormat (*hs_bindgen_2edc1414ddc93ec8 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGPUSwapchainTextureFormat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_AcquireGPUSwapchainTexture */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3683da9bdd7123ad (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUTexture **arg3,"
+         , "  Uint32 *arg4,"
+         , "  Uint32 *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_AcquireGPUSwapchainTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitForGPUSwapchain */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ea0675458d59e8d7 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitForGPUSwapchain;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitAndAcquireGPUSwapchainTexture */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_bd7e7771ebd38df5 (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUTexture **arg3,"
+         , "  Uint32 *arg4,"
+         , "  Uint32 *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitAndAcquireGPUSwapchainTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SubmitGPUCommandBuffer */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8d4a9ce464622085 (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SubmitGPUCommandBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SubmitGPUCommandBufferAndAcquireFence */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUFence *(*hs_bindgen_093495cd0f5ce3be (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SubmitGPUCommandBufferAndAcquireFence;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CancelGPUCommandBuffer */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_83b736c86816e554 (void)) ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CancelGPUCommandBuffer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitForGPUIdle */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_34c07d40aff698e2 (void)) ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitForGPUIdle;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitForGPUFences */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4cb9d239bc32f759 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  _Bool arg2,"
+         , "  SDL_GPUFence *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitForGPUFences;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_QueryGPUFence */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_67c5db65f97a1de0 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUFence *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_QueryGPUFence;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUFence */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_8f9e7c0ed3e519a2 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUFence *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReleaseGPUFence;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUTextureFormatTexelBlockSize */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_7020eb5f7daa1796 (void)) ("
+         , "  SDL_GPUTextureFormat arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GPUTextureFormatTexelBlockSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUTextureSupportsFormat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3c6e764809d2a384 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTextureFormat arg2,"
+         , "  SDL_GPUTextureType arg3,"
+         , "  SDL_GPUTextureUsageFlags arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GPUTextureSupportsFormat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUTextureSupportsSampleCount */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6b69a9c844393ce7 (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTextureFormat arg2,"
+         , "  SDL_GPUSampleCount arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GPUTextureSupportsSampleCount;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CalculateGPUTextureFormatSize */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_fab34fd075b25f9a (void)) ("
+         , "  SDL_GPUTextureFormat arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_CalculateGPUTextureFormatSize;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetPixelFormatFromGPUTextureFormat */"
+         , "__attribute__ ((const))"
+         , "SDL_PixelFormat (*hs_bindgen_8fe9348f3a2816f5 (void)) ("
+         , "  SDL_GPUTextureFormat arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetPixelFormatFromGPUTextureFormat;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetPixelFormatFromGPUTextureFormat requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUTextureFormatFromPixelFormat */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUTextureFormat (*hs_bindgen_372069e59fc19080 (void)) ("
+         , "  SDL_PixelFormat arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetGPUTextureFormatFromPixelFormat;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetGPUTextureFormatFromPixelFormat requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUSupportsShaderFormats@
+foreign import ccall unsafe "hs_bindgen_730746f3f6b80bd4"
+  hs_bindgen_730746f3f6b80bd4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUSupportsShaderFormats@
+hs_bindgen_730746f3f6b80bd4
+  :: IO (BG.FunPtr (SDL_GPUShaderFormat -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_730746f3f6b80bd4 =
+  BG.fromFFIType hs_bindgen_730746f3f6b80bd4_base
+
+{-# NOINLINE sDL_GPUSupportsShaderFormats #-}
+
+-- | Checks for GPU runtime support.
+--
+--     [@format_flags@]: a bitflag indicating which shader formats the app is able to provide.
+--
+--     [@name@]: the preferred GPU driver, or NULL to let SDL pick the optimal driver.
+--
+--     [Returns]: true if supported, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDevice'
+--
+--     [C declaration]: @SDL_GPUSupportsShaderFormats@, defined at @SDL3\/SDL_gpu.h 2200:34@
+sDL_GPUSupportsShaderFormats
+  :: BG.FunPtr (SDL_GPUShaderFormat -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_GPUSupportsShaderFormats =
+  BG.unsafePerformIO hs_bindgen_730746f3f6b80bd4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUSupportsProperties@
+foreign import ccall unsafe "hs_bindgen_df6bcb319e7313a0"
+  hs_bindgen_df6bcb319e7313a0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUSupportsProperties@
+hs_bindgen_df6bcb319e7313a0
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO BG.CBool))
+hs_bindgen_df6bcb319e7313a0 =
+  BG.fromFFIType hs_bindgen_df6bcb319e7313a0_base
+
+{-# NOINLINE sDL_GPUSupportsProperties #-}
+
+-- | Checks for GPU runtime support.
+--
+--     [@props@]: the properties to use.
+--
+--     [Returns]: true if supported, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDeviceWithProperties'
+--
+--     [C declaration]: @SDL_GPUSupportsProperties@, defined at @SDL3\/SDL_gpu.h 2214:34@
+sDL_GPUSupportsProperties :: BG.FunPtr (SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO BG.CBool)
+sDL_GPUSupportsProperties =
+  BG.unsafePerformIO hs_bindgen_df6bcb319e7313a0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUDevice@
+foreign import ccall unsafe "hs_bindgen_5a2c70cfbb51d0a5"
+  hs_bindgen_5a2c70cfbb51d0a5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUDevice@
+hs_bindgen_5a2c70cfbb51d0a5
+  :: IO
+       ( BG.FunPtr
+           (SDL_GPUShaderFormat -> BG.CBool -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_GPUDevice))
+       )
+hs_bindgen_5a2c70cfbb51d0a5 =
+  BG.fromFFIType hs_bindgen_5a2c70cfbb51d0a5_base
+
+{-# NOINLINE sDL_CreateGPUDevice #-}
+
+-- | Creates a GPU context.
+--
+--     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
+--
+--     [@format_flags@]: a bitflag indicating which shader formats the app is able to provide.
+--
+--     [@debug_mode@]: enable debug mode properties and validations.
+--
+--     [@name@]: the preferred GPU driver, or NULL to let SDL pick the optimal driver.
+--
+--     [Returns]: a GPU context on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDeviceWithProperties', 'sDL_GetGPUShaderFormats', 'sDL_GetGPUDeviceDriver', 'sDL_DestroyGPUDevice', 'sDL_GPUSupportsShaderFormats'
+--
+--     [C declaration]: @SDL_CreateGPUDevice@, defined at @SDL3\/SDL_gpu.h 2243:45@
+sDL_CreateGPUDevice
+  :: BG.FunPtr
+       (SDL_GPUShaderFormat -> BG.CBool -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_GPUDevice))
+sDL_CreateGPUDevice =
+  BG.unsafePerformIO hs_bindgen_5a2c70cfbb51d0a5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUDeviceWithProperties@
+foreign import ccall unsafe "hs_bindgen_e9b4dabe0fdafe0a"
+  hs_bindgen_e9b4dabe0fdafe0a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUDeviceWithProperties@
+hs_bindgen_e9b4dabe0fdafe0a
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO (BG.Ptr SDL_GPUDevice)))
+hs_bindgen_e9b4dabe0fdafe0a =
+  BG.fromFFIType hs_bindgen_e9b4dabe0fdafe0a_base
+
+{-# NOINLINE sDL_CreateGPUDeviceWithProperties #-}
+
+-- | Creates a GPU context.
+--
+--     These are the supported properties:
+--
+--     * @'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.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN'@: enable to automatically log useful debug information on device creation, defaults to true.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_NAME_STRING'@: the name of the GPU driver to use, if a specific one is desired.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN'@: Enable Vulkan device feature shaderClipDistance. If disabled, clip distances are not supported in shader code: gl_ClipDistance[] built-ins of GLSL, SV_ClipDistance0\/1 semantics of HLSL and [[clip_distance]] attribute of 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.
+--
+--     These are the current shader format properties:
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN'@: The app is able to provide shaders for an NDA platform.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN'@: The app is able to provide SPIR-V shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN'@: The app is able to provide DXBC shaders if applicable
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN'@: The app is able to provide DXIL shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN'@: The app is able to provide MSL shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN'@: The app is able to provide Metal shader libraries if applicable.
+--
+--     With the D3D12 backend:
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING'@: the prefix to use for all vertex semantics, default is \"TEXCOORD\".
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN'@: By default, Resourcing Binding Tier 2 is required for D3D12 support. However, an application can set this property to true to enable Tier 1 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 capacity. Defaults to false.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER'@: Certain feature checks are only possible on Windows 11 by default. By setting this alongside @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING'@ and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those feature checks possible on older platforms. The version you provide must match the one given in the DLL.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING'@: Certain feature checks are only possible on Windows 11 by default. By setting this alongside @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER'@ and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those feature checks possible on older platforms. The path you provide must be relative to the executable path of your app. Be sure not to put the DLL in the same directory as the exe; Microsoft strongly advises against this!
+--
+--     With the Vulkan backend:
+--
+--     * @'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.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER'@: a pointer to an '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 minimal set SDL requires.
+--
+--     With the Metal backend: - @'sDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN'@: By default, macOS support requires what Apple calls \"MTLGPUFamilyMac2\" hardware or newer. However, an application can set this property to true to enable support for \"MTLGPUFamilyMac1\" hardware, if (and only if) the application does not write to sRGB textures. (For history\'s sake: MacFamily1 also does not support indirect command buffers, MSAA depth resolve, and stencil resolve\/feedback, but these are not exposed features in SDL_GPU.)
+--
+--     [@props@]: the properties to use.
+--
+--     [Returns]: a GPU context on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGPUShaderFormats', 'sDL_GetGPUDeviceDriver', 'sDL_DestroyGPUDevice', 'sDL_GPUSupportsProperties'
+--
+--     [C declaration]: @SDL_CreateGPUDeviceWithProperties@, defined at @SDL3\/SDL_gpu.h 2360:45@
+sDL_CreateGPUDeviceWithProperties
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO (BG.Ptr SDL_GPUDevice))
+sDL_CreateGPUDeviceWithProperties =
+  BG.unsafePerformIO hs_bindgen_e9b4dabe0fdafe0a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DestroyGPUDevice@
+foreign import ccall unsafe "hs_bindgen_3d36d3936e535445"
+  hs_bindgen_3d36d3936e535445_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DestroyGPUDevice@
+hs_bindgen_3d36d3936e535445 :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO ()))
+hs_bindgen_3d36d3936e535445 =
+  BG.fromFFIType hs_bindgen_3d36d3936e535445_base
+
+{-# NOINLINE sDL_DestroyGPUDevice #-}
+
+-- | Destroys a GPU context previously returned by SDL_CreateGPUDevice.
+--
+--     [@device@]: a GPU Context to destroy.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDevice'
+--
+--     [C declaration]: @SDL_DestroyGPUDevice@, defined at @SDL3\/SDL_gpu.h 2422:34@
+sDL_DestroyGPUDevice :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO ())
+sDL_DestroyGPUDevice =
+  BG.unsafePerformIO hs_bindgen_3d36d3936e535445
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetNumGPUDrivers@
+foreign import ccall unsafe "hs_bindgen_724c599cc9199701"
+  hs_bindgen_724c599cc9199701_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetNumGPUDrivers@
+hs_bindgen_724c599cc9199701 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_724c599cc9199701 =
+  BG.fromFFIType hs_bindgen_724c599cc9199701_base
+
+{-# NOINLINE sDL_GetNumGPUDrivers #-}
+
+-- | Get the number of GPU drivers compiled into SDL.
+--
+--     [Returns]: the number of built in GPU drivers.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGPUDriver'
+--
+--     [C declaration]: @SDL_GetNumGPUDrivers@, defined at @SDL3\/SDL_gpu.h 2433:33@
+sDL_GetNumGPUDrivers :: BG.FunPtr (IO BG.CInt)
+sDL_GetNumGPUDrivers =
+  BG.unsafePerformIO hs_bindgen_724c599cc9199701
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUDriver@
+foreign import ccall unsafe "hs_bindgen_878ed2fb40f693fc"
+  hs_bindgen_878ed2fb40f693fc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUDriver@
+hs_bindgen_878ed2fb40f693fc :: IO (BG.FunPtr (BG.CInt -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_878ed2fb40f693fc =
+  BG.fromFFIType hs_bindgen_878ed2fb40f693fc_base
+
+{-# NOINLINE sDL_GetGPUDriver #-}
+
+-- | 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.
+--
+--     [@index@]: the index of a GPU driver.
+--
+--     [Returns]: the name of the GPU driver with the given __index__.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumGPUDrivers'
+--
+--     [C declaration]: @SDL_GetGPUDriver@, defined at @SDL3\/SDL_gpu.h 2452:42@
+sDL_GetGPUDriver :: BG.FunPtr (BG.CInt -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGPUDriver =
+  BG.unsafePerformIO hs_bindgen_878ed2fb40f693fc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUDeviceDriver@
+foreign import ccall unsafe "hs_bindgen_61e30ecd9dcd6a0d"
+  hs_bindgen_61e30ecd9dcd6a0d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUDeviceDriver@
+hs_bindgen_61e30ecd9dcd6a0d
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_61e30ecd9dcd6a0d =
+  BG.fromFFIType hs_bindgen_61e30ecd9dcd6a0d_base
+
+{-# NOINLINE sDL_GetGPUDeviceDriver #-}
+
+-- | Returns the name of the backend used to create this GPU context.
+--
+--     [@device@]: a GPU context to query.
+--
+--     [Returns]: the name of the device\'s driver, or NULL on error.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGPUDeviceDriver@, defined at @SDL3\/SDL_gpu.h 2462:42@
+sDL_GetGPUDeviceDriver :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetGPUDeviceDriver =
+  BG.unsafePerformIO hs_bindgen_61e30ecd9dcd6a0d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUShaderFormats@
+foreign import ccall unsafe "hs_bindgen_1588f64687b7a181"
+  hs_bindgen_1588f64687b7a181_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUShaderFormats@
+hs_bindgen_1588f64687b7a181 :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO SDL_GPUShaderFormat))
+hs_bindgen_1588f64687b7a181 =
+  BG.fromFFIType hs_bindgen_1588f64687b7a181_base
+
+{-# NOINLINE sDL_GetGPUShaderFormats #-}
+
+-- | Returns the supported shader formats for this GPU context.
+--
+--     [@device@]: a GPU context to query.
+--
+--     [Returns]: a bitflag indicating which shader formats the driver is able to consume.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGPUShaderFormats@, defined at @SDL3\/SDL_gpu.h 2473:49@
+sDL_GetGPUShaderFormats :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO SDL_GPUShaderFormat)
+sDL_GetGPUShaderFormats =
+  BG.unsafePerformIO hs_bindgen_1588f64687b7a181
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUDeviceProperties@
+foreign import ccall unsafe "hs_bindgen_d9a18bd5c77f3076"
+  hs_bindgen_d9a18bd5c77f3076_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUDeviceProperties@
+hs_bindgen_d9a18bd5c77f3076
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_d9a18bd5c77f3076 =
+  BG.fromFFIType hs_bindgen_d9a18bd5c77f3076_base
+
+{-# NOINLINE sDL_GetGPUDeviceProperties #-}
+
+-- | Get the properties associated with a GPU device.
+--
+--     All properties are optional and may differ between GPU backends and SDL versions.
+--
+--     The following properties are provided by SDL:
+--
+--     @'sDL_PROP_GPU_DEVICE_NAME_STRING'@: Contains the name of the underlying device as reported by the system driver. This string has no standardized 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.
+--
+--     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 15D8: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 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.
+--
+--     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-00eac0.824c4f31403fb1fbf8ee1042422c2129
+--
+--     This string has also been observed to be a multiline string (which has a trailing newline):
+--
+--     @
+--     Driver Build: 85da404, I46ff5fc46f, 1606794520
+--     Date: 11\/30\/20
+--     Compiler Version: EV031.31.04.01
+--     Driver Branch: promo490_3_Google
+--     @
+--
+--     [@device@]: a GPU context to query.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetGPUDeviceProperties@, defined at @SDL3\/SDL_gpu.h 2577:46@
+sDL_GetGPUDeviceProperties
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetGPUDeviceProperties =
+  BG.unsafePerformIO hs_bindgen_d9a18bd5c77f3076
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUComputePipeline@
+foreign import ccall unsafe "hs_bindgen_b4882831b991328b"
+  hs_bindgen_b4882831b991328b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUComputePipeline@
+hs_bindgen_b4882831b991328b
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUDevice
+             -> PtrConst.PtrConst SDL_GPUComputePipelineCreateInfo
+             -> IO (BG.Ptr SDL_GPUComputePipeline)
+           )
+       )
+hs_bindgen_b4882831b991328b =
+  BG.fromFFIType hs_bindgen_b4882831b991328b_base
+
+{-# NOINLINE sDL_CreateGPUComputePipeline #-}
+
+-- | Creates a pipeline object to be used in a compute workflow.
+--
+--     Shader resource bindings must be authored to follow a particular order depending on the shader format.
+--
+--     For SPIR-V shaders, use the following resource sets:
+--
+--     * 0: Sampled textures, followed by read-only storage textures, followed by read-only storage buffers
+--
+--     * 1: Read-write storage textures, followed by read-write storage buffers
+--
+--     * 2: Uniform buffers
+--
+--     For DXBC and DXIL shaders, use the following register order:
+--
+--     * (t[n], space0): Sampled textures, followed by read-only storage textures, followed by read-only storage buffers
+--
+--     * (u[n], space1): Read-write storage textures, followed by read-write storage buffers
+--
+--     * (b[n], space2): Uniform buffers
+--
+--     For MSL\/metallib, use the following order:
+--
+--     * [[buffer]]: Uniform buffers, followed by read-only storage buffers, followed by read-write storage buffers
+--
+--     * [[texture]]: Sampled textures, followed by read-only storage textures, followed by read-write storage textures
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [@device@]: a GPU Context.
+--
+--     [@createinfo@]: a struct describing the state of the compute pipeline to create.
+--
+--     [Returns]: a compute pipeline object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindGPUComputePipeline', 'sDL_ReleaseGPUComputePipeline'
+--
+--     [C declaration]: @SDL_CreateGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 2632:54@
+sDL_CreateGPUComputePipeline
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUDevice
+         -> PtrConst.PtrConst SDL_GPUComputePipelineCreateInfo
+         -> IO (BG.Ptr SDL_GPUComputePipeline)
+       )
+sDL_CreateGPUComputePipeline =
+  BG.unsafePerformIO hs_bindgen_b4882831b991328b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUGraphicsPipeline@
+foreign import ccall unsafe "hs_bindgen_6b24737f0e188591"
+  hs_bindgen_6b24737f0e188591_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUGraphicsPipeline@
+hs_bindgen_6b24737f0e188591
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUDevice
+             -> PtrConst.PtrConst SDL_GPUGraphicsPipelineCreateInfo
+             -> IO (BG.Ptr SDL_GPUGraphicsPipeline)
+           )
+       )
+hs_bindgen_6b24737f0e188591 =
+  BG.fromFFIType hs_bindgen_6b24737f0e188591_base
+
+{-# NOINLINE sDL_CreateGPUGraphicsPipeline #-}
+
+-- | Creates a pipeline object to be used in a graphics workflow.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [@device@]: a GPU Context.
+--
+--     [@createinfo@]: a struct describing the state of the graphics pipeline to create.
+--
+--     [Returns]: a graphics pipeline object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader', 'sDL_BindGPUGraphicsPipeline', 'sDL_ReleaseGPUGraphicsPipeline'
+--
+--     [C declaration]: @SDL_CreateGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 2659:55@
+sDL_CreateGPUGraphicsPipeline
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUDevice
+         -> PtrConst.PtrConst SDL_GPUGraphicsPipelineCreateInfo
+         -> IO (BG.Ptr SDL_GPUGraphicsPipeline)
+       )
+sDL_CreateGPUGraphicsPipeline =
+  BG.unsafePerformIO hs_bindgen_6b24737f0e188591
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUSampler@
+foreign import ccall unsafe "hs_bindgen_d26b045cc9bb0074"
+  hs_bindgen_d26b045cc9bb0074_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUSampler@
+hs_bindgen_d26b045cc9bb0074
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_GPUDevice -> PtrConst.PtrConst SDL_GPUSamplerCreateInfo -> IO (BG.Ptr SDL_GPUSampler))
+       )
+hs_bindgen_d26b045cc9bb0074 =
+  BG.fromFFIType hs_bindgen_d26b045cc9bb0074_base
+
+{-# NOINLINE sDL_CreateGPUSampler #-}
+
+-- | Creates a sampler object to be used when binding textures in a graphics workflow.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [@device@]: a GPU Context.
+--
+--     [@createinfo@]: a struct describing the state of the sampler to create.
+--
+--     [Returns]: a sampler object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindGPUVertexSamplers', 'sDL_BindGPUFragmentSamplers', 'sDL_ReleaseGPUSampler'
+--
+--     [C declaration]: @SDL_CreateGPUSampler@, defined at @SDL3\/SDL_gpu.h 2686:46@
+sDL_CreateGPUSampler
+  :: BG.FunPtr
+       (BG.Ptr SDL_GPUDevice -> PtrConst.PtrConst SDL_GPUSamplerCreateInfo -> IO (BG.Ptr SDL_GPUSampler))
+sDL_CreateGPUSampler =
+  BG.unsafePerformIO hs_bindgen_d26b045cc9bb0074
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUShader@
+foreign import ccall unsafe "hs_bindgen_268ad47187462489"
+  hs_bindgen_268ad47187462489_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUShader@
+hs_bindgen_268ad47187462489
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_GPUDevice -> PtrConst.PtrConst SDL_GPUShaderCreateInfo -> IO (BG.Ptr SDL_GPUShader))
+       )
+hs_bindgen_268ad47187462489 =
+  BG.fromFFIType hs_bindgen_268ad47187462489_base
+
+{-# NOINLINE sDL_CreateGPUShader #-}
+
+-- | Creates a shader to be used when creating a graphics pipeline.
+--
+--     Shader resource bindings must be authored to follow a particular order depending on the shader format.
+--
+--     For SPIR-V shaders, use the following resource sets:
+--
+--     For vertex shaders:
+--
+--     * 0: Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * 1: Uniform buffers
+--
+--     For fragment shaders:
+--
+--     * 2: Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * 3: Uniform buffers
+--
+--     For DXBC and DXIL shaders, use the following register order:
+--
+--     For vertex shaders:
+--
+--     * (t[n], space0): Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * (s[n], space0): Samplers with indices corresponding to the sampled textures
+--
+--     * (b[n], space1): Uniform buffers
+--
+--     For pixel shaders:
+--
+--     * (t[n], space2): Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * (s[n], space2): Samplers with indices corresponding to the sampled textures
+--
+--     * (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
+--
+--     * [[buffer]]: Uniform buffers, followed by storage buffers. Vertex buffer 0 is bound at [[buffer(14)]], vertex buffer 1 at [[buffer(15)]], and so on. Rather than manually authoring vertex buffer indices, use the [[stage_in]] attribute which will automatically use the vertex input information from the 'SDL_GPUGraphicsPipeline'.
+--
+--     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 SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING with @SDL_CreateGPUDeviceWithProperties()@.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_SHADER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [@device@]: a GPU Context.
+--
+--     [@createinfo@]: a struct describing the state of the shader to create.
+--
+--     [Returns]: a shader object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline', 'sDL_ReleaseGPUShader'
+--
+--     [C declaration]: @SDL_CreateGPUShader@, defined at @SDL3\/SDL_gpu.h 2765:45@
+sDL_CreateGPUShader
+  :: BG.FunPtr
+       (BG.Ptr SDL_GPUDevice -> PtrConst.PtrConst SDL_GPUShaderCreateInfo -> IO (BG.Ptr SDL_GPUShader))
+sDL_CreateGPUShader =
+  BG.unsafePerformIO hs_bindgen_268ad47187462489
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUTexture@
+foreign import ccall unsafe "hs_bindgen_8868d47614851449"
+  hs_bindgen_8868d47614851449_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUTexture@
+hs_bindgen_8868d47614851449
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_GPUDevice -> PtrConst.PtrConst SDL_GPUTextureCreateInfo -> IO (BG.Ptr SDL_GPUTexture))
+       )
+hs_bindgen_8868d47614851449 =
+  BG.fromFFIType hs_bindgen_8868d47614851449_base
+
+{-# NOINLINE sDL_CreateGPUTexture #-}
+
+-- | Creates a texture object to be used in graphics or compute workflows.
+--
+--     The contents of this texture are undefined until data is written to the texture, either via SDL_UploadToGPUTexture or by performing a render or compute pass with this texture as a target.
+--
+--     Note that certain combinations of usage flags are invalid. For example, a texture cannot have both the SAMPLER and GRAPHICS_STORAGE_READ flags.
+--
+--     If you request a sample count higher than the hardware supports, the implementation will automatically fall back to the highest available sample count.
+--
+--     There are optional properties that can be provided through 'SDL_GPUTextureCreateInfo' \'s @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this red intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this green intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this blue intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this alpha intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear the texture to a depth of this value. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear the texture to a stencil of this Uint8 value. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [@device@]: a GPU Context.
+--
+--     [@createinfo@]: a struct describing the state of the texture to create.
+--
+--     [Returns]: a texture object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUTexture', 'sDL_DownloadFromGPUTexture', 'sDL_BeginGPURenderPass', 'sDL_BeginGPUComputePass', 'sDL_BindGPUVertexSamplers', 'sDL_BindGPUVertexStorageTextures', 'sDL_BindGPUFragmentSamplers', 'sDL_BindGPUFragmentStorageTextures', 'sDL_BindGPUComputeStorageTextures', 'sDL_BlitGPUTexture', 'sDL_ReleaseGPUTexture', 'sDL_GPUTextureSupportsFormat'
+--
+--     [C declaration]: @SDL_CreateGPUTexture@, defined at @SDL3\/SDL_gpu.h 2829:46@
+sDL_CreateGPUTexture
+  :: BG.FunPtr
+       (BG.Ptr SDL_GPUDevice -> PtrConst.PtrConst SDL_GPUTextureCreateInfo -> IO (BG.Ptr SDL_GPUTexture))
+sDL_CreateGPUTexture =
+  BG.unsafePerformIO hs_bindgen_8868d47614851449
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUBuffer@
+foreign import ccall unsafe "hs_bindgen_0e8ef224f7419576"
+  hs_bindgen_0e8ef224f7419576_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUBuffer@
+hs_bindgen_0e8ef224f7419576
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_GPUDevice -> PtrConst.PtrConst SDL_GPUBufferCreateInfo -> IO (BG.Ptr SDL_GPUBuffer))
+       )
+hs_bindgen_0e8ef224f7419576 =
+  BG.fromFFIType hs_bindgen_0e8ef224f7419576_base
+
+{-# NOINLINE sDL_CreateGPUBuffer #-}
+
+-- | Creates a buffer object to be used in graphics or compute workflows.
+--
+--     The contents of this buffer are undefined until data is written to the buffer.
+--
+--     Note that certain combinations of usage flags are invalid. For example, a buffer cannot have both the VERTEX and INDEX flags.
+--
+--     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.
+--
+--     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/) There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_BUFFER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [@device@]: a GPU Context.
+--
+--     [@createinfo@]: a struct describing the state of the buffer to create.
+--
+--     [Returns]: a buffer object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUBuffer', 'sDL_DownloadFromGPUBuffer', 'sDL_CopyGPUBufferToBuffer', 'sDL_BindGPUVertexBuffers', 'sDL_BindGPUIndexBuffer', 'sDL_BindGPUVertexStorageBuffers', 'sDL_BindGPUFragmentStorageBuffers', 'sDL_DrawGPUPrimitivesIndirect', 'sDL_DrawGPUIndexedPrimitivesIndirect', 'sDL_BindGPUComputeStorageBuffers', 'sDL_DispatchGPUComputeIndirect', 'sDL_ReleaseGPUBuffer'
+--
+--     [C declaration]: @SDL_CreateGPUBuffer@, defined at @SDL3\/SDL_gpu.h 2885:45@
+sDL_CreateGPUBuffer
+  :: BG.FunPtr
+       (BG.Ptr SDL_GPUDevice -> PtrConst.PtrConst SDL_GPUBufferCreateInfo -> IO (BG.Ptr SDL_GPUBuffer))
+sDL_CreateGPUBuffer =
+  BG.unsafePerformIO hs_bindgen_0e8ef224f7419576
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUTransferBuffer@
+foreign import ccall unsafe "hs_bindgen_d99ca9bfb892bc36"
+  hs_bindgen_d99ca9bfb892bc36_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CreateGPUTransferBuffer@
+hs_bindgen_d99ca9bfb892bc36
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUDevice
+             -> PtrConst.PtrConst SDL_GPUTransferBufferCreateInfo
+             -> IO (BG.Ptr SDL_GPUTransferBuffer)
+           )
+       )
+hs_bindgen_d99ca9bfb892bc36 =
+  BG.fromFFIType hs_bindgen_d99ca9bfb892bc36_base
+
+{-# NOINLINE sDL_CreateGPUTransferBuffer #-}
+
+-- | Creates a transfer buffer to be used when uploading to or downloading from graphics resources.
+--
+--     Download buffers can be particularly expensive to create, so it is good practice to reuse them if data will be downloaded regularly.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [@device@]: a GPU Context.
+--
+--     [@createinfo@]: a struct describing the state of the transfer buffer to create.
+--
+--     [Returns]: a transfer buffer on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUBuffer', 'sDL_DownloadFromGPUBuffer', 'sDL_UploadToGPUTexture', 'sDL_DownloadFromGPUTexture', 'sDL_ReleaseGPUTransferBuffer'
+--
+--     [C declaration]: @SDL_CreateGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 2918:53@
+sDL_CreateGPUTransferBuffer
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUDevice
+         -> PtrConst.PtrConst SDL_GPUTransferBufferCreateInfo
+         -> IO (BG.Ptr SDL_GPUTransferBuffer)
+       )
+sDL_CreateGPUTransferBuffer =
+  BG.unsafePerformIO hs_bindgen_d99ca9bfb892bc36
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUBufferName@
+foreign import ccall unsafe "hs_bindgen_ddb180594f35b8be"
+  hs_bindgen_ddb180594f35b8be_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUBufferName@
+hs_bindgen_ddb180594f35b8be
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUBuffer -> PtrConst.PtrConst BG.CChar -> IO ()))
+hs_bindgen_ddb180594f35b8be =
+  BG.fromFFIType hs_bindgen_ddb180594f35b8be_base
+
+{-# NOINLINE sDL_SetGPUBufferName #-}
+
+-- | Sets an arbitrary string constant to label a buffer.
+--
+--     You should use SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING with SDL_CreateGPUBuffer instead of this function to avoid thread safety issues.
+--
+--     [@device@]: a GPU Context.
+--
+--     [@buffer@]: a buffer to attach the name to.
+--
+--     [@text@]: a UTF-8 string constant to mark as the name of the buffer.
+--
+--     [Thread safety]: This function is not thread safe, you must make sure the buffer is not simultaneously used by any other thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUBuffer'
+--
+--     [C declaration]: @SDL_SetGPUBufferName@, defined at @SDL3\/SDL_gpu.h 2943:34@
+sDL_SetGPUBufferName
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUBuffer -> PtrConst.PtrConst BG.CChar -> IO ())
+sDL_SetGPUBufferName =
+  BG.unsafePerformIO hs_bindgen_ddb180594f35b8be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUTextureName@
+foreign import ccall unsafe "hs_bindgen_8e9612fc267feeaa"
+  hs_bindgen_8e9612fc267feeaa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUTextureName@
+hs_bindgen_8e9612fc267feeaa
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUTexture -> PtrConst.PtrConst BG.CChar -> IO ()))
+hs_bindgen_8e9612fc267feeaa =
+  BG.fromFFIType hs_bindgen_8e9612fc267feeaa_base
+
+{-# NOINLINE sDL_SetGPUTextureName #-}
+
+-- | Sets an arbitrary string constant to label a texture.
+--
+--     You should use SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING with SDL_CreateGPUTexture instead of this function to avoid thread safety issues.
+--
+--     [@device@]: a GPU Context.
+--
+--     [@texture@]: a texture to attach the name to.
+--
+--     [@text@]: a UTF-8 string constant to mark as the name of the texture.
+--
+--     [Thread safety]: This function is not thread safe, you must make sure the texture is not simultaneously used by any other thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTexture'
+--
+--     [C declaration]: @SDL_SetGPUTextureName@, defined at @SDL3\/SDL_gpu.h 2966:34@
+sDL_SetGPUTextureName
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUTexture -> PtrConst.PtrConst BG.CChar -> IO ())
+sDL_SetGPUTextureName =
+  BG.unsafePerformIO hs_bindgen_8e9612fc267feeaa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_InsertGPUDebugLabel@
+foreign import ccall unsafe "hs_bindgen_53b6f5854610b06f"
+  hs_bindgen_53b6f5854610b06f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_InsertGPUDebugLabel@
+hs_bindgen_53b6f5854610b06f
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> PtrConst.PtrConst BG.CChar -> IO ()))
+hs_bindgen_53b6f5854610b06f =
+  BG.fromFFIType hs_bindgen_53b6f5854610b06f_base
+
+{-# NOINLINE sDL_InsertGPUDebugLabel #-}
+
+-- | Inserts an arbitrary string label into the command buffer callstream.
+--
+--     Useful for debugging.
+--
+--     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/) for instructions on how to obtain it.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [@text@]: a UTF-8 string constant to insert as the label.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_InsertGPUDebugLabel@, defined at @SDL3\/SDL_gpu.h 2987:34@
+sDL_InsertGPUDebugLabel
+  :: BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> PtrConst.PtrConst BG.CChar -> IO ())
+sDL_InsertGPUDebugLabel =
+  BG.unsafePerformIO hs_bindgen_53b6f5854610b06f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUDebugGroup@
+foreign import ccall unsafe "hs_bindgen_1ff675bf6c0d06d5"
+  hs_bindgen_1ff675bf6c0d06d5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUDebugGroup@
+hs_bindgen_1ff675bf6c0d06d5
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> PtrConst.PtrConst BG.CChar -> IO ()))
+hs_bindgen_1ff675bf6c0d06d5 =
+  BG.fromFFIType hs_bindgen_1ff675bf6c0d06d5_base
+
+{-# NOINLINE sDL_PushGPUDebugGroup #-}
+
+-- | Begins a debug group with an arbitrary name.
+--
+--     Used for denoting groups of calls when viewing the command buffer callstream in a graphics debugging tool.
+--
+--     Each call to SDL_PushGPUDebugGroup must have a corresponding call to SDL_PopGPUDebugGroup.
+--
+--     On Direct3D 12, using SDL_PushGPUDebugGroup requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable. See [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) for instructions on how to obtain it.
+--
+--     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.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [@name@]: a UTF-8 string constant that names the group.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PopGPUDebugGroup'
+--
+--     [C declaration]: @SDL_PushGPUDebugGroup@, defined at @SDL3\/SDL_gpu.h 3017:34@
+sDL_PushGPUDebugGroup
+  :: BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> PtrConst.PtrConst BG.CChar -> IO ())
+sDL_PushGPUDebugGroup =
+  BG.unsafePerformIO hs_bindgen_1ff675bf6c0d06d5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PopGPUDebugGroup@
+foreign import ccall unsafe "hs_bindgen_a00c28c817c76943"
+  hs_bindgen_a00c28c817c76943_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PopGPUDebugGroup@
+hs_bindgen_a00c28c817c76943 :: IO (BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> IO ()))
+hs_bindgen_a00c28c817c76943 =
+  BG.fromFFIType hs_bindgen_a00c28c817c76943_base
+
+{-# NOINLINE sDL_PopGPUDebugGroup #-}
+
+-- | Ends the most-recently pushed debug group.
+--
+--     On Direct3D 12, using SDL_PopGPUDebugGroup requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable. See [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) for instructions on how to obtain it.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PushGPUDebugGroup'
+--
+--     [C declaration]: @SDL_PopGPUDebugGroup@, defined at @SDL3\/SDL_gpu.h 3035:34@
+sDL_PopGPUDebugGroup :: BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> IO ())
+sDL_PopGPUDebugGroup =
+  BG.unsafePerformIO hs_bindgen_a00c28c817c76943
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUTexture@
+foreign import ccall unsafe "hs_bindgen_542853e6548e89bb"
+  hs_bindgen_542853e6548e89bb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUTexture@
+hs_bindgen_542853e6548e89bb
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUTexture -> IO ()))
+hs_bindgen_542853e6548e89bb =
+  BG.fromFFIType hs_bindgen_542853e6548e89bb_base
+
+{-# NOINLINE sDL_ReleaseGPUTexture #-}
+
+-- | Frees the given texture as soon as it is safe to do so.
+--
+--     You must not reference the texture after calling this function.
+--
+--     [@device@]: a GPU context.
+--
+--     [@texture@]: a texture to be destroyed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUTexture@, defined at @SDL3\/SDL_gpu.h 3050:34@
+sDL_ReleaseGPUTexture :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUTexture -> IO ())
+sDL_ReleaseGPUTexture =
+  BG.unsafePerformIO hs_bindgen_542853e6548e89bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUSampler@
+foreign import ccall unsafe "hs_bindgen_56055ccd136d71a1"
+  hs_bindgen_56055ccd136d71a1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUSampler@
+hs_bindgen_56055ccd136d71a1
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUSampler -> IO ()))
+hs_bindgen_56055ccd136d71a1 =
+  BG.fromFFIType hs_bindgen_56055ccd136d71a1_base
+
+{-# NOINLINE sDL_ReleaseGPUSampler #-}
+
+-- | Frees the given sampler as soon as it is safe to do so.
+--
+--     You must not reference the sampler after calling this function.
+--
+--     [@device@]: a GPU context.
+--
+--     [@sampler@]: a sampler to be destroyed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUSampler@, defined at @SDL3\/SDL_gpu.h 3064:34@
+sDL_ReleaseGPUSampler :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUSampler -> IO ())
+sDL_ReleaseGPUSampler =
+  BG.unsafePerformIO hs_bindgen_56055ccd136d71a1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUBuffer@
+foreign import ccall unsafe "hs_bindgen_f8bfa8ea14116360"
+  hs_bindgen_f8bfa8ea14116360_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUBuffer@
+hs_bindgen_f8bfa8ea14116360
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUBuffer -> IO ()))
+hs_bindgen_f8bfa8ea14116360 =
+  BG.fromFFIType hs_bindgen_f8bfa8ea14116360_base
+
+{-# NOINLINE sDL_ReleaseGPUBuffer #-}
+
+-- | Frees the given buffer as soon as it is safe to do so.
+--
+--     You must not reference the buffer after calling this function.
+--
+--     [@device@]: a GPU context.
+--
+--     [@buffer@]: a buffer to be destroyed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUBuffer@, defined at @SDL3\/SDL_gpu.h 3078:34@
+sDL_ReleaseGPUBuffer :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUBuffer -> IO ())
+sDL_ReleaseGPUBuffer =
+  BG.unsafePerformIO hs_bindgen_f8bfa8ea14116360
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUTransferBuffer@
+foreign import ccall unsafe "hs_bindgen_14c942c8fbf2f3dc"
+  hs_bindgen_14c942c8fbf2f3dc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUTransferBuffer@
+hs_bindgen_14c942c8fbf2f3dc
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUTransferBuffer -> IO ()))
+hs_bindgen_14c942c8fbf2f3dc =
+  BG.fromFFIType hs_bindgen_14c942c8fbf2f3dc_base
+
+{-# NOINLINE sDL_ReleaseGPUTransferBuffer #-}
+
+-- | Frees the given transfer buffer as soon as it is safe to do so.
+--
+--     You must not reference the transfer buffer after calling this function.
+--
+--     [@device@]: a GPU context.
+--
+--     [@transfer_buffer@]: a transfer buffer to be destroyed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3092:34@
+sDL_ReleaseGPUTransferBuffer
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUTransferBuffer -> IO ())
+sDL_ReleaseGPUTransferBuffer =
+  BG.unsafePerformIO hs_bindgen_14c942c8fbf2f3dc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUComputePipeline@
+foreign import ccall unsafe "hs_bindgen_5f269731a3ef8faa"
+  hs_bindgen_5f269731a3ef8faa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUComputePipeline@
+hs_bindgen_5f269731a3ef8faa
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUComputePipeline -> IO ()))
+hs_bindgen_5f269731a3ef8faa =
+  BG.fromFFIType hs_bindgen_5f269731a3ef8faa_base
+
+{-# NOINLINE sDL_ReleaseGPUComputePipeline #-}
+
+-- | Frees the given compute pipeline as soon as it is safe to do so.
+--
+--     You must not reference the compute pipeline after calling this function.
+--
+--     [@device@]: a GPU context.
+--
+--     [@compute_pipeline@]: a compute pipeline to be destroyed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 3106:34@
+sDL_ReleaseGPUComputePipeline
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUComputePipeline -> IO ())
+sDL_ReleaseGPUComputePipeline =
+  BG.unsafePerformIO hs_bindgen_5f269731a3ef8faa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUShader@
+foreign import ccall unsafe "hs_bindgen_f3e9c0034d2a2db0"
+  hs_bindgen_f3e9c0034d2a2db0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUShader@
+hs_bindgen_f3e9c0034d2a2db0
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUShader -> IO ()))
+hs_bindgen_f3e9c0034d2a2db0 =
+  BG.fromFFIType hs_bindgen_f3e9c0034d2a2db0_base
+
+{-# NOINLINE sDL_ReleaseGPUShader #-}
+
+-- | Frees the given shader as soon as it is safe to do so.
+--
+--     You must not reference the shader after calling this function.
+--
+--     [@device@]: a GPU context.
+--
+--     [@shader@]: a shader to be destroyed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUShader@, defined at @SDL3\/SDL_gpu.h 3120:34@
+sDL_ReleaseGPUShader :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUShader -> IO ())
+sDL_ReleaseGPUShader =
+  BG.unsafePerformIO hs_bindgen_f3e9c0034d2a2db0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUGraphicsPipeline@
+foreign import ccall unsafe "hs_bindgen_29c94f86e013a8af"
+  hs_bindgen_29c94f86e013a8af_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUGraphicsPipeline@
+hs_bindgen_29c94f86e013a8af
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUGraphicsPipeline -> IO ()))
+hs_bindgen_29c94f86e013a8af =
+  BG.fromFFIType hs_bindgen_29c94f86e013a8af_base
+
+{-# NOINLINE sDL_ReleaseGPUGraphicsPipeline #-}
+
+-- | Frees the given graphics pipeline as soon as it is safe to do so.
+--
+--     You must not reference the graphics pipeline after calling this function.
+--
+--     [@device@]: a GPU context.
+--
+--     [@graphics_pipeline@]: a graphics pipeline to be destroyed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 3134:34@
+sDL_ReleaseGPUGraphicsPipeline
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUGraphicsPipeline -> IO ())
+sDL_ReleaseGPUGraphicsPipeline =
+  BG.unsafePerformIO hs_bindgen_29c94f86e013a8af
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_AcquireGPUCommandBuffer@
+foreign import ccall unsafe "hs_bindgen_d8255a52c3043feb"
+  hs_bindgen_d8255a52c3043feb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_AcquireGPUCommandBuffer@
+hs_bindgen_d8255a52c3043feb
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO (BG.Ptr SDL_GPUCommandBuffer)))
+hs_bindgen_d8255a52c3043feb =
+  BG.fromFFIType hs_bindgen_d8255a52c3043feb_base
+
+{-# NOINLINE sDL_AcquireGPUCommandBuffer #-}
+
+-- | Acquire a command buffer.
+--
+--     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.
+--
+--     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.
+--
+--     [@device@]: a GPU context.
+--
+--     [Returns]: a command buffer, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBuffer', 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_AcquireGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 3162:52@
+sDL_AcquireGPUCommandBuffer :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO (BG.Ptr SDL_GPUCommandBuffer))
+sDL_AcquireGPUCommandBuffer =
+  BG.unsafePerformIO hs_bindgen_d8255a52c3043feb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUVertexUniformData@
+foreign import ccall unsafe "hs_bindgen_fd67ffdf6fb8985a"
+  hs_bindgen_fd67ffdf6fb8985a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUVertexUniformData@
+hs_bindgen_fd67ffdf6fb8985a
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCommandBuffer
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_fd67ffdf6fb8985a =
+  BG.fromFFIType hs_bindgen_fd67ffdf6fb8985a_base
+
+{-# NOINLINE sDL_PushGPUVertexUniformData #-}
+
+-- | Pushes data to a vertex uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     For detailed information about accessing uniform data from a shader, please refer to SDL_CreateGPUShader.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [@slot_index@]: the vertex uniform slot to push data to.
+--
+--     [@data@]: client data to write.
+--
+--     [@length@]: the length of the data to write.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PushGPUVertexUniformData@, defined at @SDL3\/SDL_gpu.h 3186:34@
+sDL_PushGPUVertexUniformData
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCommandBuffer
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst BG.Void
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_PushGPUVertexUniformData =
+  BG.unsafePerformIO hs_bindgen_fd67ffdf6fb8985a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUFragmentUniformData@
+foreign import ccall unsafe "hs_bindgen_fee6bedc8b88a7fb"
+  hs_bindgen_fee6bedc8b88a7fb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUFragmentUniformData@
+hs_bindgen_fee6bedc8b88a7fb
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCommandBuffer
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_fee6bedc8b88a7fb =
+  BG.fromFFIType hs_bindgen_fee6bedc8b88a7fb_base
+
+{-# NOINLINE sDL_PushGPUFragmentUniformData #-}
+
+-- | Pushes data to a fragment uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [@slot_index@]: the fragment uniform slot to push data to.
+--
+--     [@data@]: client data to write.
+--
+--     [@length@]: the length of the data to write.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PushGPUFragmentUniformData@, defined at @SDL3\/SDL_gpu.h 3208:34@
+sDL_PushGPUFragmentUniformData
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCommandBuffer
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst BG.Void
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_PushGPUFragmentUniformData =
+  BG.unsafePerformIO hs_bindgen_fee6bedc8b88a7fb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUComputeUniformData@
+foreign import ccall unsafe "hs_bindgen_f0981542878473d3"
+  hs_bindgen_f0981542878473d3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_PushGPUComputeUniformData@
+hs_bindgen_f0981542878473d3
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCommandBuffer
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_f0981542878473d3 =
+  BG.fromFFIType hs_bindgen_f0981542878473d3_base
+
+{-# NOINLINE sDL_PushGPUComputeUniformData #-}
+
+-- | Pushes data to a uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [@slot_index@]: the uniform slot to push data to.
+--
+--     [@data@]: client data to write.
+--
+--     [@length@]: the length of the data to write.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PushGPUComputeUniformData@, defined at @SDL3\/SDL_gpu.h 3230:34@
+sDL_PushGPUComputeUniformData
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCommandBuffer
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst BG.Void
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_PushGPUComputeUniformData =
+  BG.unsafePerformIO hs_bindgen_f0981542878473d3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BeginGPURenderPass@
+foreign import ccall unsafe "hs_bindgen_154c2af06893d306"
+  hs_bindgen_154c2af06893d306_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BeginGPURenderPass@
+hs_bindgen_154c2af06893d306
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCommandBuffer
+             -> PtrConst.PtrConst SDL_GPUColorTargetInfo
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst SDL_GPUDepthStencilTargetInfo
+             -> IO (BG.Ptr SDL_GPURenderPass)
+           )
+       )
+hs_bindgen_154c2af06893d306 =
+  BG.fromFFIType hs_bindgen_154c2af06893d306_base
+
+{-# NOINLINE sDL_BeginGPURenderPass #-}
+
+-- | Begins a render pass on a command buffer.
+--
+--     A render pass consists of a set of texture subresources (or depth slices in the 3D 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.
+--
+--     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.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [@color_target_infos@]: an array of texture subresources with corresponding clear values and load\/store ops.
+--
+--     [@num_color_targets@]: the number of color targets in the color_target_infos array.
+--
+--     [@depth_stencil_target_info@]: a texture subresource with corresponding clear value and load\/store ops, may be NULL.
+--
+--     [Returns]: a render pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EndGPURenderPass'
+--
+--     [C declaration]: @SDL_BeginGPURenderPass@, defined at @SDL3\/SDL_gpu.h 3271:49@
+sDL_BeginGPURenderPass
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCommandBuffer
+         -> PtrConst.PtrConst SDL_GPUColorTargetInfo
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst SDL_GPUDepthStencilTargetInfo
+         -> IO (BG.Ptr SDL_GPURenderPass)
+       )
+sDL_BeginGPURenderPass =
+  BG.unsafePerformIO hs_bindgen_154c2af06893d306
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUGraphicsPipeline@
+foreign import ccall unsafe "hs_bindgen_f8d4e69cba96f49a"
+  hs_bindgen_f8d4e69cba96f49a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUGraphicsPipeline@
+hs_bindgen_f8d4e69cba96f49a
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPURenderPass -> BG.Ptr SDL_GPUGraphicsPipeline -> IO ()))
+hs_bindgen_f8d4e69cba96f49a =
+  BG.fromFFIType hs_bindgen_f8d4e69cba96f49a_base
+
+{-# NOINLINE sDL_BindGPUGraphicsPipeline #-}
+
+-- | Binds a graphics pipeline on a render pass to be used in rendering.
+--
+--     A graphics pipeline must be bound before making any draw calls.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@graphics_pipeline@]: the graphics pipeline to bind.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 3287:34@
+sDL_BindGPUGraphicsPipeline
+  :: BG.FunPtr (BG.Ptr SDL_GPURenderPass -> BG.Ptr SDL_GPUGraphicsPipeline -> IO ())
+sDL_BindGPUGraphicsPipeline =
+  BG.unsafePerformIO hs_bindgen_f8d4e69cba96f49a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUViewport@
+foreign import ccall unsafe "hs_bindgen_ef13d72a5a37e0cd"
+  hs_bindgen_ef13d72a5a37e0cd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUViewport@
+hs_bindgen_ef13d72a5a37e0cd
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPURenderPass -> PtrConst.PtrConst SDL_GPUViewport -> IO ()))
+hs_bindgen_ef13d72a5a37e0cd =
+  BG.fromFFIType hs_bindgen_ef13d72a5a37e0cd_base
+
+{-# NOINLINE sDL_SetGPUViewport #-}
+
+-- | Sets the current viewport state on a command buffer.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@viewport@]: the viewport to set.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUViewport@, defined at @SDL3\/SDL_gpu.h 3299:34@
+sDL_SetGPUViewport
+  :: BG.FunPtr (BG.Ptr SDL_GPURenderPass -> PtrConst.PtrConst SDL_GPUViewport -> IO ())
+sDL_SetGPUViewport =
+  BG.unsafePerformIO hs_bindgen_ef13d72a5a37e0cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUScissor@
+foreign import ccall unsafe "hs_bindgen_15e571926b2f0a64"
+  hs_bindgen_15e571926b2f0a64_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUScissor@
+hs_bindgen_15e571926b2f0a64
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_GPURenderPass -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO ()))
+hs_bindgen_15e571926b2f0a64 =
+  BG.fromFFIType hs_bindgen_15e571926b2f0a64_base
+
+{-# NOINLINE sDL_SetGPUScissor #-}
+
+-- | Sets the current scissor state on a command buffer.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@scissor@]: the scissor area to set.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUScissor@, defined at @SDL3\/SDL_gpu.h 3311:34@
+sDL_SetGPUScissor
+  :: BG.FunPtr (BG.Ptr SDL_GPURenderPass -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO ())
+sDL_SetGPUScissor =
+  BG.unsafePerformIO hs_bindgen_15e571926b2f0a64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUBlendConstants@
+foreign import ccall unsafe "hs_bindgen_82c20e8c6db3156f"
+  hs_bindgen_82c20e8c6db3156f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUBlendConstants@
+hs_bindgen_82c20e8c6db3156f
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPURenderPass -> SDL3.Sys.Bindgen.Pixels.SDL_FColor -> IO ()))
+hs_bindgen_82c20e8c6db3156f =
+  BG.fromFFIType hs_bindgen_82c20e8c6db3156f_base
+
+{-# NOINLINE sDL_SetGPUBlendConstants #-}
+
+-- | Sets the current blend constants on a command buffer.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@blend_constants@]: the blend constant color.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_GPU_BLENDFACTOR_CONSTANT_COLOR@, @SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR@
+--
+--     [C declaration]: @SDL_SetGPUBlendConstants@, defined at @SDL3\/SDL_gpu.h 3326:34@
+sDL_SetGPUBlendConstants
+  :: BG.FunPtr (BG.Ptr SDL_GPURenderPass -> SDL3.Sys.Bindgen.Pixels.SDL_FColor -> IO ())
+sDL_SetGPUBlendConstants =
+  BG.unsafePerformIO hs_bindgen_82c20e8c6db3156f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUStencilReference@
+foreign import ccall unsafe "hs_bindgen_80029d033dcd3cde"
+  hs_bindgen_80029d033dcd3cde_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUStencilReference@
+hs_bindgen_80029d033dcd3cde
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPURenderPass -> SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO ()))
+hs_bindgen_80029d033dcd3cde =
+  BG.fromFFIType hs_bindgen_80029d033dcd3cde_base
+
+{-# NOINLINE sDL_SetGPUStencilReference #-}
+
+-- | Sets the current stencil reference value on a command buffer.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@reference@]: the stencil reference value to set.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUStencilReference@, defined at @SDL3\/SDL_gpu.h 3338:34@
+sDL_SetGPUStencilReference
+  :: BG.FunPtr (BG.Ptr SDL_GPURenderPass -> SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO ())
+sDL_SetGPUStencilReference =
+  BG.unsafePerformIO hs_bindgen_80029d033dcd3cde
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexBuffers@
+foreign import ccall unsafe "hs_bindgen_688e80f65b7efc4b"
+  hs_bindgen_688e80f65b7efc4b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexBuffers@
+hs_bindgen_688e80f65b7efc4b
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst SDL_GPUBufferBinding
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_688e80f65b7efc4b =
+  BG.fromFFIType hs_bindgen_688e80f65b7efc4b_base
+
+{-# NOINLINE sDL_BindGPUVertexBuffers #-}
+
+-- | Binds vertex buffers on a command buffer for use with subsequent draw calls.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@first_slot@]: the vertex buffer slot to begin binding from.
+--
+--     [@bindings@]: an array of 'SDL_GPUBufferBinding' structs containing vertex buffers and offset values.
+--
+--     [@num_bindings@]: the number of bindings in the bindings array.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUVertexBuffers@, defined at @SDL3\/SDL_gpu.h 3354:34@
+sDL_BindGPUVertexBuffers
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst SDL_GPUBufferBinding
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_BindGPUVertexBuffers =
+  BG.unsafePerformIO hs_bindgen_688e80f65b7efc4b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUIndexBuffer@
+foreign import ccall unsafe "hs_bindgen_bea706d6a8ba9b69"
+  hs_bindgen_bea706d6a8ba9b69_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUIndexBuffer@
+hs_bindgen_bea706d6a8ba9b69
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> PtrConst.PtrConst SDL_GPUBufferBinding
+             -> SDL_GPUIndexElementSize
+             -> IO ()
+           )
+       )
+hs_bindgen_bea706d6a8ba9b69 =
+  BG.fromFFIType hs_bindgen_bea706d6a8ba9b69_base
+
+{-# NOINLINE sDL_BindGPUIndexBuffer #-}
+
+-- | Binds an index buffer on a command buffer for use with subsequent draw calls.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@binding@]: a pointer to a struct containing an index buffer and offset.
+--
+--     [@index_element_size@]: whether the index values in the buffer are 16- or 32-bit.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUIndexBuffer@, defined at @SDL3\/SDL_gpu.h 3371:34@
+sDL_BindGPUIndexBuffer
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> PtrConst.PtrConst SDL_GPUBufferBinding
+         -> SDL_GPUIndexElementSize
+         -> IO ()
+       )
+sDL_BindGPUIndexBuffer =
+  BG.unsafePerformIO hs_bindgen_bea706d6a8ba9b69
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexSamplers@
+foreign import ccall unsafe "hs_bindgen_aaec001b714f4f20"
+  hs_bindgen_aaec001b714f4f20_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexSamplers@
+hs_bindgen_aaec001b714f4f20
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_aaec001b714f4f20 =
+  BG.fromFFIType hs_bindgen_aaec001b714f4f20_base
+
+{-# NOINLINE sDL_BindGPUVertexSamplers #-}
+
+-- | Binds texture-sampler pairs for use on the vertex shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@first_slot@]: the vertex sampler slot to begin binding from.
+--
+--     [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+--
+--     [@num_bindings@]: the number of texture-sampler pairs to bind from the array.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUVertexSamplers@, defined at @SDL3\/SDL_gpu.h 3395:34@
+sDL_BindGPUVertexSamplers
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_BindGPUVertexSamplers =
+  BG.unsafePerformIO hs_bindgen_aaec001b714f4f20
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexStorageTextures@
+foreign import ccall unsafe "hs_bindgen_f3926e087d94d216"
+  hs_bindgen_f3926e087d94d216_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexStorageTextures@
+hs_bindgen_f3926e087d94d216
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_f3926e087d94d216 =
+  BG.fromFFIType hs_bindgen_f3926e087d94d216_base
+
+{-# NOINLINE sDL_BindGPUVertexStorageTextures #-}
+
+-- | Binds storage textures for use on the vertex shader.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@first_slot@]: the vertex storage texture slot to begin binding from.
+--
+--     [@storage_textures@]: an array of storage textures.
+--
+--     [@num_bindings@]: the number of storage texture to bind from the array.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUVertexStorageTextures@, defined at @SDL3\/SDL_gpu.h 3419:34@
+sDL_BindGPUVertexStorageTextures
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_BindGPUVertexStorageTextures =
+  BG.unsafePerformIO hs_bindgen_f3926e087d94d216
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexStorageBuffers@
+foreign import ccall unsafe "hs_bindgen_0441f25c46dc0237"
+  hs_bindgen_0441f25c46dc0237_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUVertexStorageBuffers@
+hs_bindgen_0441f25c46dc0237
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_0441f25c46dc0237 =
+  BG.fromFFIType hs_bindgen_0441f25c46dc0237_base
+
+{-# NOINLINE sDL_BindGPUVertexStorageBuffers #-}
+
+-- | Binds storage buffers for use on the vertex shader.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@first_slot@]: the vertex storage buffer slot to begin binding from.
+--
+--     [@storage_buffers@]: an array of buffers.
+--
+--     [@num_bindings@]: the number of buffers to bind from the array.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUVertexStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3443:34@
+sDL_BindGPUVertexStorageBuffers
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_BindGPUVertexStorageBuffers =
+  BG.unsafePerformIO hs_bindgen_0441f25c46dc0237
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUFragmentSamplers@
+foreign import ccall unsafe "hs_bindgen_31e74f680706f272"
+  hs_bindgen_31e74f680706f272_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUFragmentSamplers@
+hs_bindgen_31e74f680706f272
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_31e74f680706f272 =
+  BG.fromFFIType hs_bindgen_31e74f680706f272_base
+
+{-# NOINLINE sDL_BindGPUFragmentSamplers #-}
+
+-- | Binds texture-sampler pairs for use on the fragment shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@first_slot@]: the fragment sampler slot to begin binding from.
+--
+--     [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+--
+--     [@num_bindings@]: the number of texture-sampler pairs to bind from the array.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUFragmentSamplers@, defined at @SDL3\/SDL_gpu.h 3468:34@
+sDL_BindGPUFragmentSamplers
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_BindGPUFragmentSamplers =
+  BG.unsafePerformIO hs_bindgen_31e74f680706f272
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUFragmentStorageTextures@
+foreign import ccall unsafe "hs_bindgen_891de4ebe4443cb5"
+  hs_bindgen_891de4ebe4443cb5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUFragmentStorageTextures@
+hs_bindgen_891de4ebe4443cb5
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_891de4ebe4443cb5 =
+  BG.fromFFIType hs_bindgen_891de4ebe4443cb5_base
+
+{-# NOINLINE sDL_BindGPUFragmentStorageTextures #-}
+
+-- | Binds storage textures for use on the fragment shader.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@first_slot@]: the fragment storage texture slot to begin binding from.
+--
+--     [@storage_textures@]: an array of storage textures.
+--
+--     [@num_bindings@]: the number of storage textures to bind from the array.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUFragmentStorageTextures@, defined at @SDL3\/SDL_gpu.h 3492:34@
+sDL_BindGPUFragmentStorageTextures
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_BindGPUFragmentStorageTextures =
+  BG.unsafePerformIO hs_bindgen_891de4ebe4443cb5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUFragmentStorageBuffers@
+foreign import ccall unsafe "hs_bindgen_f0f46723815c3df1"
+  hs_bindgen_f0f46723815c3df1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUFragmentStorageBuffers@
+hs_bindgen_f0f46723815c3df1
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_f0f46723815c3df1 =
+  BG.fromFFIType hs_bindgen_f0f46723815c3df1_base
+
+{-# NOINLINE sDL_BindGPUFragmentStorageBuffers #-}
+
+-- | Binds storage buffers for use on the fragment shader.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@first_slot@]: the fragment storage buffer slot to begin binding from.
+--
+--     [@storage_buffers@]: an array of storage buffers.
+--
+--     [@num_bindings@]: the number of storage buffers to bind from the array.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUFragmentStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3516:34@
+sDL_BindGPUFragmentStorageBuffers
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_BindGPUFragmentStorageBuffers =
+  BG.unsafePerformIO hs_bindgen_f0f46723815c3df1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUIndexedPrimitives@
+foreign import ccall unsafe "hs_bindgen_534a1c06f3f9ed05"
+  hs_bindgen_534a1c06f3f9ed05_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUIndexedPrimitives@
+hs_bindgen_534a1c06f3f9ed05
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Sint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_534a1c06f3f9ed05 =
+  BG.fromFFIType hs_bindgen_534a1c06f3f9ed05_base
+
+{-# NOINLINE sDL_DrawGPUIndexedPrimitives #-}
+
+-- | Draws data using bound graphics state with an index buffer and instancing enabled.
+--
+--     You must not call this function before binding a graphics pipeline.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@num_indices@]: the number of indices to draw per instance.
+--
+--     [@num_instances@]: the number of instances to draw.
+--
+--     [@first_index@]: the starting index within the index buffer.
+--
+--     [@vertex_offset@]: value added to vertex index before indexing into the vertex buffer.
+--
+--     [@first_instance@]: the ID of the first instance to draw.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUIndexedPrimitives@, defined at @SDL3\/SDL_gpu.h 3547:34@
+sDL_DrawGPUIndexedPrimitives
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Sint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_DrawGPUIndexedPrimitives =
+  BG.unsafePerformIO hs_bindgen_534a1c06f3f9ed05
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUPrimitives@
+foreign import ccall unsafe "hs_bindgen_b37844ed8f8b5582"
+  hs_bindgen_b37844ed8f8b5582_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUPrimitives@
+hs_bindgen_b37844ed8f8b5582
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_b37844ed8f8b5582 =
+  BG.fromFFIType hs_bindgen_b37844ed8f8b5582_base
+
+{-# NOINLINE sDL_DrawGPUPrimitives #-}
+
+-- | Draws data using bound graphics state.
+--
+--     You must not call this function before binding a graphics pipeline.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@num_vertices@]: the number of vertices to draw.
+--
+--     [@num_instances@]: the number of instances that will be drawn.
+--
+--     [@first_vertex@]: the index of the first vertex to draw.
+--
+--     [@first_instance@]: the ID of the first instance to draw.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUPrimitives@, defined at @SDL3\/SDL_gpu.h 3575:34@
+sDL_DrawGPUPrimitives
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_DrawGPUPrimitives =
+  BG.unsafePerformIO hs_bindgen_b37844ed8f8b5582
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUPrimitivesIndirect@
+foreign import ccall unsafe "hs_bindgen_420bc7bd5da8d431"
+  hs_bindgen_420bc7bd5da8d431_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUPrimitivesIndirect@
+hs_bindgen_420bc7bd5da8d431
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> BG.Ptr SDL_GPUBuffer
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_420bc7bd5da8d431 =
+  BG.fromFFIType hs_bindgen_420bc7bd5da8d431_base
+
+{-# NOINLINE sDL_DrawGPUPrimitivesIndirect #-}
+
+-- | Draws data using bound graphics state and with draw parameters set from a buffer.
+--
+--     The buffer must consist of tightly-packed draw parameter sets that each match the layout of 'SDL_GPUIndirectDrawCommand'. You must not call this function before binding a graphics pipeline.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@buffer@]: a buffer containing draw parameters.
+--
+--     [@offset@]: the offset to start reading from the draw buffer.
+--
+--     [@draw_count@]: the number of draw parameter sets that should be read from the draw buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUPrimitivesIndirect@, defined at @SDL3\/SDL_gpu.h 3598:34@
+sDL_DrawGPUPrimitivesIndirect
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> BG.Ptr SDL_GPUBuffer
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_DrawGPUPrimitivesIndirect =
+  BG.unsafePerformIO hs_bindgen_420bc7bd5da8d431
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUIndexedPrimitivesIndirect@
+foreign import ccall unsafe "hs_bindgen_8f8e2fe5f315620c"
+  hs_bindgen_8f8e2fe5f315620c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DrawGPUIndexedPrimitivesIndirect@
+hs_bindgen_8f8e2fe5f315620c
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderPass
+             -> BG.Ptr SDL_GPUBuffer
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_8f8e2fe5f315620c =
+  BG.fromFFIType hs_bindgen_8f8e2fe5f315620c_base
+
+{-# NOINLINE sDL_DrawGPUIndexedPrimitivesIndirect #-}
+
+-- | Draws data using bound graphics state with an index buffer enabled and with draw parameters set from a buffer.
+--
+--     The buffer must consist of tightly-packed draw parameter sets that each match the layout of 'SDL_GPUIndexedIndirectDrawCommand'. You must not call this function before binding a graphics pipeline.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     [@buffer@]: a buffer containing draw parameters.
+--
+--     [@offset@]: the offset to start reading from the draw buffer.
+--
+--     [@draw_count@]: the number of draw parameter sets that should be read from the draw buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUIndexedPrimitivesIndirect@, defined at @SDL3\/SDL_gpu.h 3620:34@
+sDL_DrawGPUIndexedPrimitivesIndirect
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderPass
+         -> BG.Ptr SDL_GPUBuffer
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_DrawGPUIndexedPrimitivesIndirect =
+  BG.unsafePerformIO hs_bindgen_8f8e2fe5f315620c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_EndGPURenderPass@
+foreign import ccall unsafe "hs_bindgen_d2969701500cfc55"
+  hs_bindgen_d2969701500cfc55_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_EndGPURenderPass@
+hs_bindgen_d2969701500cfc55 :: IO (BG.FunPtr (BG.Ptr SDL_GPURenderPass -> IO ()))
+hs_bindgen_d2969701500cfc55 =
+  BG.fromFFIType hs_bindgen_d2969701500cfc55_base
+
+{-# NOINLINE sDL_EndGPURenderPass #-}
+
+-- | Ends the given render pass.
+--
+--     All bound graphics state on the render pass command buffer is unset. The render pass handle is now invalid.
+--
+--     [@render_pass@]: a render pass handle.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EndGPURenderPass@, defined at @SDL3\/SDL_gpu.h 3636:34@
+sDL_EndGPURenderPass :: BG.FunPtr (BG.Ptr SDL_GPURenderPass -> IO ())
+sDL_EndGPURenderPass =
+  BG.unsafePerformIO hs_bindgen_d2969701500cfc55
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BeginGPUComputePass@
+foreign import ccall unsafe "hs_bindgen_774d008d25b51181"
+  hs_bindgen_774d008d25b51181_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BeginGPUComputePass@
+hs_bindgen_774d008d25b51181
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCommandBuffer
+             -> PtrConst.PtrConst SDL_GPUStorageTextureReadWriteBinding
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst SDL_GPUStorageBufferReadWriteBinding
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO (BG.Ptr SDL_GPUComputePass)
+           )
+       )
+hs_bindgen_774d008d25b51181 =
+  BG.fromFFIType hs_bindgen_774d008d25b51181_base
+
+{-# NOINLINE sDL_BeginGPUComputePass #-}
+
+-- | Begins a compute pass on a command buffer.
+--
+--     A compute pass is defined by a set of texture subresources and buffers that may be written to by compute pipelines. These textures and buffers must 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!
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [@storage_texture_bindings@]: an array of writeable storage texture binding structs.
+--
+--     [@num_storage_texture_bindings@]: the number of storage textures to bind from the array.
+--
+--     [@storage_buffer_bindings@]: an array of writeable storage buffer binding structs.
+--
+--     [@num_storage_buffer_bindings@]: the number of storage buffers to bind from the array.
+--
+--     [Returns]: a compute pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EndGPUComputePass'
+--
+--     [C declaration]: @SDL_BeginGPUComputePass@, defined at @SDL3\/SDL_gpu.h 3678:50@
+sDL_BeginGPUComputePass
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCommandBuffer
+         -> PtrConst.PtrConst SDL_GPUStorageTextureReadWriteBinding
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst SDL_GPUStorageBufferReadWriteBinding
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO (BG.Ptr SDL_GPUComputePass)
+       )
+sDL_BeginGPUComputePass =
+  BG.unsafePerformIO hs_bindgen_774d008d25b51181
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputePipeline@
+foreign import ccall unsafe "hs_bindgen_4ad31c9180a8f4c7"
+  hs_bindgen_4ad31c9180a8f4c7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputePipeline@
+hs_bindgen_4ad31c9180a8f4c7
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUComputePass -> BG.Ptr SDL_GPUComputePipeline -> IO ()))
+hs_bindgen_4ad31c9180a8f4c7 =
+  BG.fromFFIType hs_bindgen_4ad31c9180a8f4c7_base
+
+{-# NOINLINE sDL_BindGPUComputePipeline #-}
+
+-- | Binds a compute pipeline on a command buffer for use in compute dispatch.
+--
+--     [@compute_pass@]: a compute pass handle.
+--
+--     [@compute_pipeline@]: a compute pipeline to bind.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 3693:34@
+sDL_BindGPUComputePipeline
+  :: BG.FunPtr (BG.Ptr SDL_GPUComputePass -> BG.Ptr SDL_GPUComputePipeline -> IO ())
+sDL_BindGPUComputePipeline =
+  BG.unsafePerformIO hs_bindgen_4ad31c9180a8f4c7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputeSamplers@
+foreign import ccall unsafe "hs_bindgen_29656bc1e0885584"
+  hs_bindgen_29656bc1e0885584_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputeSamplers@
+hs_bindgen_29656bc1e0885584
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUComputePass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_29656bc1e0885584 =
+  BG.fromFFIType hs_bindgen_29656bc1e0885584_base
+
+{-# NOINLINE sDL_BindGPUComputeSamplers #-}
+
+-- | Binds texture-sampler pairs for use on the compute shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUComputePipeline()@.
+--
+--     [@compute_pass@]: a compute pass handle.
+--
+--     [@first_slot@]: the compute sampler slot to begin binding from.
+--
+--     [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+--
+--     [@num_bindings@]: the number of texture-sampler bindings to bind from the array.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline'
+--
+--     [C declaration]: @SDL_BindGPUComputeSamplers@, defined at @SDL3\/SDL_gpu.h 3716:34@
+sDL_BindGPUComputeSamplers
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUComputePass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_BindGPUComputeSamplers =
+  BG.unsafePerformIO hs_bindgen_29656bc1e0885584
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputeStorageTextures@
+foreign import ccall unsafe "hs_bindgen_01575e615d9f9179"
+  hs_bindgen_01575e615d9f9179_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputeStorageTextures@
+hs_bindgen_01575e615d9f9179
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUComputePass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_01575e615d9f9179 =
+  BG.fromFFIType hs_bindgen_01575e615d9f9179_base
+
+{-# NOINLINE sDL_BindGPUComputeStorageTextures #-}
+
+-- | Binds storage textures as readonly for use on the compute pipeline.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUComputePipeline()@.
+--
+--     [@compute_pass@]: a compute pass handle.
+--
+--     [@first_slot@]: the compute storage texture slot to begin binding from.
+--
+--     [@storage_textures@]: an array of storage textures.
+--
+--     [@num_bindings@]: the number of storage textures to bind from the array.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline'
+--
+--     [C declaration]: @SDL_BindGPUComputeStorageTextures@, defined at @SDL3\/SDL_gpu.h 3740:34@
+sDL_BindGPUComputeStorageTextures
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUComputePass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_BindGPUComputeStorageTextures =
+  BG.unsafePerformIO hs_bindgen_01575e615d9f9179
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputeStorageBuffers@
+foreign import ccall unsafe "hs_bindgen_589adbdedcb7e5de"
+  hs_bindgen_589adbdedcb7e5de_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BindGPUComputeStorageBuffers@
+hs_bindgen_589adbdedcb7e5de
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUComputePass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_589adbdedcb7e5de =
+  BG.fromFFIType hs_bindgen_589adbdedcb7e5de_base
+
+{-# NOINLINE sDL_BindGPUComputeStorageBuffers #-}
+
+-- | Binds storage buffers as readonly for use on the compute pipeline.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUComputePipeline()@.
+--
+--     [@compute_pass@]: a compute pass handle.
+--
+--     [@first_slot@]: the compute storage buffer slot to begin binding from.
+--
+--     [@storage_buffers@]: an array of storage buffer binding structs.
+--
+--     [@num_bindings@]: the number of storage buffers to bind from the array.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline'
+--
+--     [C declaration]: @SDL_BindGPUComputeStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3764:34@
+sDL_BindGPUComputeStorageBuffers
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUComputePass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_BindGPUComputeStorageBuffers =
+  BG.unsafePerformIO hs_bindgen_589adbdedcb7e5de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DispatchGPUCompute@
+foreign import ccall unsafe "hs_bindgen_050145c7c0eda2a0"
+  hs_bindgen_050145c7c0eda2a0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DispatchGPUCompute@
+hs_bindgen_050145c7c0eda2a0
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUComputePass
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_050145c7c0eda2a0 =
+  BG.fromFFIType hs_bindgen_050145c7c0eda2a0_base
+
+{-# NOINLINE sDL_DispatchGPUCompute #-}
+
+-- | Dispatches compute work.
+--
+--     You must not call this function before binding a compute pipeline.
+--
+--     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.
+--
+--     [@compute_pass@]: a compute pass handle.
+--
+--     [@groupcount_x@]: number of local workgroups to dispatch in the X dimension.
+--
+--     [@groupcount_y@]: number of local workgroups to dispatch in the Y dimension.
+--
+--     [@groupcount_z@]: number of local workgroups to dispatch in the Z dimension.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DispatchGPUCompute@, defined at @SDL3\/SDL_gpu.h 3790:34@
+sDL_DispatchGPUCompute
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUComputePass
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_DispatchGPUCompute =
+  BG.unsafePerformIO hs_bindgen_050145c7c0eda2a0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DispatchGPUComputeIndirect@
+foreign import ccall unsafe "hs_bindgen_6eed39e21086610c"
+  hs_bindgen_6eed39e21086610c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DispatchGPUComputeIndirect@
+hs_bindgen_6eed39e21086610c
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_GPUComputePass -> BG.Ptr SDL_GPUBuffer -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO ())
+       )
+hs_bindgen_6eed39e21086610c =
+  BG.fromFFIType hs_bindgen_6eed39e21086610c_base
+
+{-# NOINLINE sDL_DispatchGPUComputeIndirect #-}
+
+-- | Dispatches compute work with parameters set from a buffer.
+--
+--     The buffer layout should match the layout of 'SDL_GPUIndirectDispatchCommand'. You must not call this function before binding a compute pipeline.
+--
+--     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.
+--
+--     [@compute_pass@]: a compute pass handle.
+--
+--     [@buffer@]: a buffer containing dispatch parameters.
+--
+--     [@offset@]: the offset to start reading from the dispatch buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DispatchGPUComputeIndirect@, defined at @SDL3\/SDL_gpu.h 3814:34@
+sDL_DispatchGPUComputeIndirect
+  :: BG.FunPtr
+       (BG.Ptr SDL_GPUComputePass -> BG.Ptr SDL_GPUBuffer -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO ())
+sDL_DispatchGPUComputeIndirect =
+  BG.unsafePerformIO hs_bindgen_6eed39e21086610c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_EndGPUComputePass@
+foreign import ccall unsafe "hs_bindgen_3d69c010dbe2273d"
+  hs_bindgen_3d69c010dbe2273d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_EndGPUComputePass@
+hs_bindgen_3d69c010dbe2273d :: IO (BG.FunPtr (BG.Ptr SDL_GPUComputePass -> IO ()))
+hs_bindgen_3d69c010dbe2273d =
+  BG.fromFFIType hs_bindgen_3d69c010dbe2273d_base
+
+{-# NOINLINE sDL_EndGPUComputePass #-}
+
+-- | Ends the current compute pass.
+--
+--     All bound compute state on the command buffer is unset. The compute pass handle is now invalid.
+--
+--     [@compute_pass@]: a compute pass handle.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EndGPUComputePass@, defined at @SDL3\/SDL_gpu.h 3829:34@
+sDL_EndGPUComputePass :: BG.FunPtr (BG.Ptr SDL_GPUComputePass -> IO ())
+sDL_EndGPUComputePass =
+  BG.unsafePerformIO hs_bindgen_3d69c010dbe2273d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_MapGPUTransferBuffer@
+foreign import ccall unsafe "hs_bindgen_683b5935cd3f5940"
+  hs_bindgen_683b5935cd3f5940_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_MapGPUTransferBuffer@
+hs_bindgen_683b5935cd3f5940
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUTransferBuffer -> BG.CBool -> IO (BG.Ptr BG.Void)))
+hs_bindgen_683b5935cd3f5940 =
+  BG.fromFFIType hs_bindgen_683b5935cd3f5940_base
+
+{-# NOINLINE sDL_MapGPUTransferBuffer #-}
+
+-- | Maps a transfer buffer into application address space.
+--
+--     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.
+--
+--     [@device@]: a GPU context.
+--
+--     [@transfer_buffer@]: a transfer buffer.
+--
+--     [@cycle@]: if true, cycles the transfer buffer if it is already bound.
+--
+--     [Returns]: the address of the mapped transfer buffer memory, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_MapGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3849:36@
+sDL_MapGPUTransferBuffer
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUTransferBuffer -> BG.CBool -> IO (BG.Ptr BG.Void))
+sDL_MapGPUTransferBuffer =
+  BG.unsafePerformIO hs_bindgen_683b5935cd3f5940
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_UnmapGPUTransferBuffer@
+foreign import ccall unsafe "hs_bindgen_e33fd3a1127b2473"
+  hs_bindgen_e33fd3a1127b2473_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_UnmapGPUTransferBuffer@
+hs_bindgen_e33fd3a1127b2473
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUTransferBuffer -> IO ()))
+hs_bindgen_e33fd3a1127b2473 =
+  BG.fromFFIType hs_bindgen_e33fd3a1127b2473_base
+
+{-# NOINLINE sDL_UnmapGPUTransferBuffer #-}
+
+-- | Unmaps a previously mapped transfer buffer.
+--
+--     [@device@]: a GPU context.
+--
+--     [@transfer_buffer@]: a previously mapped transfer buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UnmapGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3862:34@
+sDL_UnmapGPUTransferBuffer
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUTransferBuffer -> IO ())
+sDL_UnmapGPUTransferBuffer =
+  BG.unsafePerformIO hs_bindgen_e33fd3a1127b2473
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BeginGPUCopyPass@
+foreign import ccall unsafe "hs_bindgen_26ebd2bad4c071ad"
+  hs_bindgen_26ebd2bad4c071ad_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BeginGPUCopyPass@
+hs_bindgen_26ebd2bad4c071ad
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> IO (BG.Ptr SDL_GPUCopyPass)))
+hs_bindgen_26ebd2bad4c071ad =
+  BG.fromFFIType hs_bindgen_26ebd2bad4c071ad_base
+
+{-# NOINLINE sDL_BeginGPUCopyPass #-}
+
+-- | Begins a copy pass on a command buffer.
+--
+--     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.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [Returns]: a copy pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EndGPUCopyPass'
+--
+--     [C declaration]: @SDL_BeginGPUCopyPass@, defined at @SDL3\/SDL_gpu.h 3882:47@
+sDL_BeginGPUCopyPass :: BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> IO (BG.Ptr SDL_GPUCopyPass))
+sDL_BeginGPUCopyPass =
+  BG.unsafePerformIO hs_bindgen_26ebd2bad4c071ad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_UploadToGPUTexture@
+foreign import ccall unsafe "hs_bindgen_ab0f032d9686e81d"
+  hs_bindgen_ab0f032d9686e81d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_UploadToGPUTexture@
+hs_bindgen_ab0f032d9686e81d
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCopyPass
+             -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+             -> PtrConst.PtrConst SDL_GPUTextureRegion
+             -> BG.CBool
+             -> IO ()
+           )
+       )
+hs_bindgen_ab0f032d9686e81d =
+  BG.fromFFIType hs_bindgen_ab0f032d9686e81d_base
+
+{-# NOINLINE sDL_UploadToGPUTexture #-}
+
+-- | Uploads data from a transfer buffer to a texture.
+--
+--     The upload occurs on the GPU timeline. You may assume that the upload has finished in subsequent commands.
+--
+--     You must align the data in the transfer buffer to a multiple of the texel size of the texture format.
+--
+--     [@copy_pass@]: a copy pass handle.
+--
+--     [@source@]: the source transfer buffer with image layout information.
+--
+--     [@destination@]: the destination texture region.
+--
+--     [@cycle@]: if true, cycles the texture if the texture is bound, otherwise overwrites the data.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UploadToGPUTexture@, defined at @SDL3\/SDL_gpu.h 3902:34@
+sDL_UploadToGPUTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCopyPass
+         -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+         -> PtrConst.PtrConst SDL_GPUTextureRegion
+         -> BG.CBool
+         -> IO ()
+       )
+sDL_UploadToGPUTexture =
+  BG.unsafePerformIO hs_bindgen_ab0f032d9686e81d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_UploadToGPUBuffer@
+foreign import ccall unsafe "hs_bindgen_d5ff839503d8766f"
+  hs_bindgen_d5ff839503d8766f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_UploadToGPUBuffer@
+hs_bindgen_d5ff839503d8766f
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCopyPass
+             -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+             -> PtrConst.PtrConst SDL_GPUBufferRegion
+             -> BG.CBool
+             -> IO ()
+           )
+       )
+hs_bindgen_d5ff839503d8766f =
+  BG.fromFFIType hs_bindgen_d5ff839503d8766f_base
+
+{-# NOINLINE sDL_UploadToGPUBuffer #-}
+
+-- | Uploads data from a transfer buffer to a buffer.
+--
+--     The upload occurs on the GPU timeline. You may assume that the upload has finished in subsequent commands.
+--
+--     [@copy_pass@]: a copy pass handle.
+--
+--     [@source@]: the source transfer buffer with offset.
+--
+--     [@destination@]: the destination buffer with offset and size.
+--
+--     [@cycle@]: if true, cycles the buffer if it is already bound, otherwise overwrites the data.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UploadToGPUBuffer@, defined at @SDL3\/SDL_gpu.h 3922:34@
+sDL_UploadToGPUBuffer
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCopyPass
+         -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+         -> PtrConst.PtrConst SDL_GPUBufferRegion
+         -> BG.CBool
+         -> IO ()
+       )
+sDL_UploadToGPUBuffer =
+  BG.unsafePerformIO hs_bindgen_d5ff839503d8766f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CopyGPUTextureToTexture@
+foreign import ccall unsafe "hs_bindgen_1cd400910067ddd5"
+  hs_bindgen_1cd400910067ddd5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CopyGPUTextureToTexture@
+hs_bindgen_1cd400910067ddd5
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCopyPass
+             -> PtrConst.PtrConst SDL_GPUTextureLocation
+             -> PtrConst.PtrConst SDL_GPUTextureLocation
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> BG.CBool
+             -> IO ()
+           )
+       )
+hs_bindgen_1cd400910067ddd5 =
+  BG.fromFFIType hs_bindgen_1cd400910067ddd5_base
+
+{-# NOINLINE sDL_CopyGPUTextureToTexture #-}
+
+-- | Performs a texture-to-texture copy.
+--
+--     This copy occurs on the GPU timeline. You may assume the copy has finished in subsequent commands.
+--
+--     This function does not support copying between depth and color textures. For those, copy the texture to a buffer and then to the destination texture.
+--
+--     [@copy_pass@]: a copy pass handle.
+--
+--     [@source@]: a source texture region.
+--
+--     [@destination@]: a destination texture region.
+--
+--     [@w@]: the width of the region to copy.
+--
+--     [@h@]: the height of the region to copy.
+--
+--     [@d@]: the depth of the region to copy.
+--
+--     [@cycle@]: if true, cycles the destination texture if the destination texture is bound, otherwise overwrites the data.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyGPUTextureToTexture@, defined at @SDL3\/SDL_gpu.h 3949:34@
+sDL_CopyGPUTextureToTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCopyPass
+         -> PtrConst.PtrConst SDL_GPUTextureLocation
+         -> PtrConst.PtrConst SDL_GPUTextureLocation
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> BG.CBool
+         -> IO ()
+       )
+sDL_CopyGPUTextureToTexture =
+  BG.unsafePerformIO hs_bindgen_1cd400910067ddd5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CopyGPUBufferToBuffer@
+foreign import ccall unsafe "hs_bindgen_f1c8dff3576eacd7"
+  hs_bindgen_f1c8dff3576eacd7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CopyGPUBufferToBuffer@
+hs_bindgen_f1c8dff3576eacd7
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCopyPass
+             -> PtrConst.PtrConst SDL_GPUBufferLocation
+             -> PtrConst.PtrConst SDL_GPUBufferLocation
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> BG.CBool
+             -> IO ()
+           )
+       )
+hs_bindgen_f1c8dff3576eacd7 =
+  BG.fromFFIType hs_bindgen_f1c8dff3576eacd7_base
+
+{-# NOINLINE sDL_CopyGPUBufferToBuffer #-}
+
+-- | Performs a buffer-to-buffer copy.
+--
+--     This copy occurs on the GPU timeline. You may assume the copy has finished in subsequent commands.
+--
+--     [@copy_pass@]: a copy pass handle.
+--
+--     [@source@]: the buffer and offset to copy from.
+--
+--     [@destination@]: the buffer and offset to copy to.
+--
+--     [@size@]: the length of the buffer to copy.
+--
+--     [@cycle@]: if true, cycles the destination buffer if it is already bound, otherwise overwrites the data.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyGPUBufferToBuffer@, defined at @SDL3\/SDL_gpu.h 3973:34@
+sDL_CopyGPUBufferToBuffer
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCopyPass
+         -> PtrConst.PtrConst SDL_GPUBufferLocation
+         -> PtrConst.PtrConst SDL_GPUBufferLocation
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> BG.CBool
+         -> IO ()
+       )
+sDL_CopyGPUBufferToBuffer =
+  BG.unsafePerformIO hs_bindgen_f1c8dff3576eacd7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DownloadFromGPUTexture@
+foreign import ccall unsafe "hs_bindgen_de2075aa3b528189"
+  hs_bindgen_de2075aa3b528189_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DownloadFromGPUTexture@
+hs_bindgen_de2075aa3b528189
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCopyPass
+             -> PtrConst.PtrConst SDL_GPUTextureRegion
+             -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+             -> IO ()
+           )
+       )
+hs_bindgen_de2075aa3b528189 =
+  BG.fromFFIType hs_bindgen_de2075aa3b528189_base
+
+{-# NOINLINE sDL_DownloadFromGPUTexture #-}
+
+-- | Copies data from a texture to a transfer buffer on the GPU timeline.
+--
+--     This data is not guaranteed to be copied until the command buffer fence is signaled.
+--
+--     [@copy_pass@]: a copy pass handle.
+--
+--     [@source@]: the source texture region.
+--
+--     [@destination@]: the destination transfer buffer with image layout information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DownloadFromGPUTexture@, defined at @SDL3\/SDL_gpu.h 3993:34@
+sDL_DownloadFromGPUTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCopyPass
+         -> PtrConst.PtrConst SDL_GPUTextureRegion
+         -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+         -> IO ()
+       )
+sDL_DownloadFromGPUTexture =
+  BG.unsafePerformIO hs_bindgen_de2075aa3b528189
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DownloadFromGPUBuffer@
+foreign import ccall unsafe "hs_bindgen_ba4b40201f2134bd"
+  hs_bindgen_ba4b40201f2134bd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_DownloadFromGPUBuffer@
+hs_bindgen_ba4b40201f2134bd
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCopyPass
+             -> PtrConst.PtrConst SDL_GPUBufferRegion
+             -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+             -> IO ()
+           )
+       )
+hs_bindgen_ba4b40201f2134bd =
+  BG.fromFFIType hs_bindgen_ba4b40201f2134bd_base
+
+{-# NOINLINE sDL_DownloadFromGPUBuffer #-}
+
+-- | Copies data from a buffer to a transfer buffer on the GPU timeline.
+--
+--     This data is not guaranteed to be copied until the command buffer fence is signaled.
+--
+--     [@copy_pass@]: a copy pass handle.
+--
+--     [@source@]: the source buffer with offset and size.
+--
+--     [@destination@]: the destination transfer buffer with offset.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DownloadFromGPUBuffer@, defined at @SDL3\/SDL_gpu.h 4010:34@
+sDL_DownloadFromGPUBuffer
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCopyPass
+         -> PtrConst.PtrConst SDL_GPUBufferRegion
+         -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+         -> IO ()
+       )
+sDL_DownloadFromGPUBuffer =
+  BG.unsafePerformIO hs_bindgen_ba4b40201f2134bd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_EndGPUCopyPass@
+foreign import ccall unsafe "hs_bindgen_b4b5fc61adee338e"
+  hs_bindgen_b4b5fc61adee338e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_EndGPUCopyPass@
+hs_bindgen_b4b5fc61adee338e :: IO (BG.FunPtr (BG.Ptr SDL_GPUCopyPass -> IO ()))
+hs_bindgen_b4b5fc61adee338e =
+  BG.fromFFIType hs_bindgen_b4b5fc61adee338e_base
+
+{-# NOINLINE sDL_EndGPUCopyPass #-}
+
+-- | Ends the current copy pass.
+--
+--     [@copy_pass@]: a copy pass handle.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EndGPUCopyPass@, defined at @SDL3\/SDL_gpu.h 4022:34@
+sDL_EndGPUCopyPass :: BG.FunPtr (BG.Ptr SDL_GPUCopyPass -> IO ())
+sDL_EndGPUCopyPass =
+  BG.unsafePerformIO hs_bindgen_b4b5fc61adee338e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GenerateMipmapsForGPUTexture@
+foreign import ccall unsafe "hs_bindgen_9678149e861907fc"
+  hs_bindgen_9678149e861907fc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GenerateMipmapsForGPUTexture@
+hs_bindgen_9678149e861907fc
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> BG.Ptr SDL_GPUTexture -> IO ()))
+hs_bindgen_9678149e861907fc =
+  BG.fromFFIType hs_bindgen_9678149e861907fc_base
+
+{-# NOINLINE sDL_GenerateMipmapsForGPUTexture #-}
+
+-- | Generates mipmaps for the given texture.
+--
+--     This function must not be called inside of any pass.
+--
+--     [@command_buffer@]: a command_buffer.
+--
+--     [@texture@]: a texture with more than 1 mip level.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GenerateMipmapsForGPUTexture@, defined at @SDL3\/SDL_gpu.h 4035:34@
+sDL_GenerateMipmapsForGPUTexture
+  :: BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> BG.Ptr SDL_GPUTexture -> IO ())
+sDL_GenerateMipmapsForGPUTexture =
+  BG.unsafePerformIO hs_bindgen_9678149e861907fc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BlitGPUTexture@
+foreign import ccall unsafe "hs_bindgen_7f45139e78bf4f56"
+  hs_bindgen_7f45139e78bf4f56_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_BlitGPUTexture@
+hs_bindgen_7f45139e78bf4f56
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> PtrConst.PtrConst SDL_GPUBlitInfo -> IO ()))
+hs_bindgen_7f45139e78bf4f56 =
+  BG.fromFFIType hs_bindgen_7f45139e78bf4f56_base
+
+{-# NOINLINE sDL_BlitGPUTexture #-}
+
+-- | Blits from a source texture region to a destination texture region.
+--
+--     This function must not be called inside of any pass.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [@info@]: the blit info struct containing the blit parameters.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BlitGPUTexture@, defined at @SDL3\/SDL_gpu.h 4049:34@
+sDL_BlitGPUTexture
+  :: BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> PtrConst.PtrConst SDL_GPUBlitInfo -> IO ())
+sDL_BlitGPUTexture =
+  BG.unsafePerformIO hs_bindgen_7f45139e78bf4f56
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WindowSupportsGPUSwapchainComposition@
+foreign import ccall unsafe "hs_bindgen_c59f48ad030d3274"
+  hs_bindgen_c59f48ad030d3274_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WindowSupportsGPUSwapchainComposition@
+hs_bindgen_c59f48ad030d3274
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUDevice
+             -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> SDL_GPUSwapchainComposition
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_c59f48ad030d3274 =
+  BG.fromFFIType hs_bindgen_c59f48ad030d3274_base
+
+{-# NOINLINE sDL_WindowSupportsGPUSwapchainComposition #-}
+
+-- | Determines whether a swapchain composition is supported by the window.
+--
+--     The window must be claimed before calling this function.
+--
+--     [@device@]: a GPU context.
+--
+--     [@window@]: an SDL_Window.
+--
+--     [@swapchain_composition@]: the swapchain composition to check.
+--
+--     [Returns]: true if supported, false if unsupported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice'
+--
+--     [C declaration]: @SDL_WindowSupportsGPUSwapchainComposition@, defined at @SDL3\/SDL_gpu.h 4069:34@
+sDL_WindowSupportsGPUSwapchainComposition
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUDevice
+         -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> SDL_GPUSwapchainComposition
+         -> IO BG.CBool
+       )
+sDL_WindowSupportsGPUSwapchainComposition =
+  BG.unsafePerformIO hs_bindgen_c59f48ad030d3274
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WindowSupportsGPUPresentMode@
+foreign import ccall unsafe "hs_bindgen_bf576ab13c340f27"
+  hs_bindgen_bf576ab13c340f27_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WindowSupportsGPUPresentMode@
+hs_bindgen_bf576ab13c340f27
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUDevice
+             -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> SDL_GPUPresentMode
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_bf576ab13c340f27 =
+  BG.fromFFIType hs_bindgen_bf576ab13c340f27_base
+
+{-# NOINLINE sDL_WindowSupportsGPUPresentMode #-}
+
+-- | Determines whether a presentation mode is supported by the window.
+--
+--     The window must be claimed before calling this function.
+--
+--     [@device@]: a GPU context.
+--
+--     [@window@]: an SDL_Window.
+--
+--     [@present_mode@]: the presentation mode to check.
+--
+--     [Returns]: true if supported, false if unsupported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice'
+--
+--     [C declaration]: @SDL_WindowSupportsGPUPresentMode@, defined at @SDL3\/SDL_gpu.h 4088:34@
+sDL_WindowSupportsGPUPresentMode
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUDevice
+         -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> SDL_GPUPresentMode
+         -> IO BG.CBool
+       )
+sDL_WindowSupportsGPUPresentMode =
+  BG.unsafePerformIO hs_bindgen_bf576ab13c340f27
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ClaimWindowForGPUDevice@
+foreign import ccall unsafe "hs_bindgen_4ecaa5beccefec7a"
+  hs_bindgen_4ecaa5beccefec7a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ClaimWindowForGPUDevice@
+hs_bindgen_4ecaa5beccefec7a
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool))
+hs_bindgen_4ecaa5beccefec7a =
+  BG.fromFFIType hs_bindgen_4ecaa5beccefec7a_base
+
+{-# NOINLINE sDL_ClaimWindowForGPUDevice #-}
+
+-- | Claims a window, creating a swapchain structure for it.
+--
+--     This must be called before SDL_AcquireGPUSwapchainTexture is called using the window. You should only call this function from the thread that created the window.
+--
+--     The swapchain will be created with SDL_GPU_SWAPCHAINCOMPOSITION_SDR and SDL_GPU_PRESENTMODE_VSYNC. If you want to have different swapchain parameters, you must call SDL_SetGPUSwapchainParameters after claiming the window.
+--
+--     [@device@]: a GPU context.
+--
+--     [@window@]: an SDL_Window.
+--
+--     [Returns]: true on success, or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_ReleaseWindowFromGPUDevice', 'sDL_WindowSupportsGPUPresentMode', 'sDL_WindowSupportsGPUSwapchainComposition'
+--
+--     [C declaration]: @SDL_ClaimWindowForGPUDevice@, defined at @SDL3\/SDL_gpu.h 4120:34@
+sDL_ClaimWindowForGPUDevice
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool)
+sDL_ClaimWindowForGPUDevice =
+  BG.unsafePerformIO hs_bindgen_4ecaa5beccefec7a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseWindowFromGPUDevice@
+foreign import ccall unsafe "hs_bindgen_196ff3ee33dc8751"
+  hs_bindgen_196ff3ee33dc8751_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseWindowFromGPUDevice@
+hs_bindgen_196ff3ee33dc8751
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO ()))
+hs_bindgen_196ff3ee33dc8751 =
+  BG.fromFFIType hs_bindgen_196ff3ee33dc8751_base
+
+{-# NOINLINE sDL_ReleaseWindowFromGPUDevice #-}
+
+-- | Unclaims a window, destroying its swapchain structure.
+--
+--     [@device@]: a GPU context.
+--
+--     [@window@]: an SDL_Window that has been claimed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice'
+--
+--     [C declaration]: @SDL_ReleaseWindowFromGPUDevice@, defined at @SDL3\/SDL_gpu.h 4134:34@
+sDL_ReleaseWindowFromGPUDevice
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO ())
+sDL_ReleaseWindowFromGPUDevice =
+  BG.unsafePerformIO hs_bindgen_196ff3ee33dc8751
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUSwapchainParameters@
+foreign import ccall unsafe "hs_bindgen_31ee67753f7ce365"
+  hs_bindgen_31ee67753f7ce365_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUSwapchainParameters@
+hs_bindgen_31ee67753f7ce365
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUDevice
+             -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> SDL_GPUSwapchainComposition
+             -> SDL_GPUPresentMode
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_31ee67753f7ce365 =
+  BG.fromFFIType hs_bindgen_31ee67753f7ce365_base
+
+{-# NOINLINE sDL_SetGPUSwapchainParameters #-}
+
+-- | Changes the swapchain parameters for the given claimed window.
+--
+--     This function will fail if the requested present mode or swapchain composition are unsupported by the device. Check if the parameters are supported via SDL_WindowSupportsGPUPresentMode \/ SDL_WindowSupportsGPUSwapchainComposition prior to calling this function.
+--
+--     SDL_GPU_PRESENTMODE_VSYNC with SDL_GPU_SWAPCHAINCOMPOSITION_SDR is always supported.
+--
+--     [@device@]: a GPU context.
+--
+--     [@window@]: an SDL_Window that has been claimed.
+--
+--     [@swapchain_composition@]: the desired composition of the swapchain.
+--
+--     [@present_mode@]: the desired present mode for the swapchain.
+--
+--     [Returns]: true if successful, false on error; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WindowSupportsGPUPresentMode', 'sDL_WindowSupportsGPUSwapchainComposition'
+--
+--     [C declaration]: @SDL_SetGPUSwapchainParameters@, defined at @SDL3\/SDL_gpu.h 4161:34@
+sDL_SetGPUSwapchainParameters
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUDevice
+         -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> SDL_GPUSwapchainComposition
+         -> SDL_GPUPresentMode
+         -> IO BG.CBool
+       )
+sDL_SetGPUSwapchainParameters =
+  BG.unsafePerformIO hs_bindgen_31ee67753f7ce365
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUAllowedFramesInFlight@
+foreign import ccall unsafe "hs_bindgen_cf8859de2d063dde"
+  hs_bindgen_cf8859de2d063dde_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SetGPUAllowedFramesInFlight@
+hs_bindgen_cf8859de2d063dde
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_cf8859de2d063dde =
+  BG.fromFFIType hs_bindgen_cf8859de2d063dde_base
+
+{-# NOINLINE sDL_SetGPUAllowedFramesInFlight #-}
+
+-- | Configures the maximum allowed number of frames in flight.
+--
+--     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 working on the first frame, @SDL_AcquireGPUSwapchainTexture()@ will fill the swapchain texture pointer with NULL, and @SDL_WaitAndAcquireGPUSwapchainTexture()@ will block.
+--
+--     Higher values increase throughput at the expense of visual latency. Lower values decrease visual latency at the expense of throughput.
+--
+--     Note that calling this function will stall and flush the command queue to prevent synchronization issues.
+--
+--     The minimum value of allowed frames in flight is 1, and the maximum is 3.
+--
+--     [@device@]: a GPU context.
+--
+--     [@allowed_frames_in_flight@]: the maximum number of frames that can be pending on the GPU.
+--
+--     [Returns]: true if successful, false on error; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUAllowedFramesInFlight@, defined at @SDL3\/SDL_gpu.h 4192:34@
+sDL_SetGPUAllowedFramesInFlight
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_SetGPUAllowedFramesInFlight =
+  BG.unsafePerformIO hs_bindgen_cf8859de2d063dde
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUSwapchainTextureFormat@
+foreign import ccall unsafe "hs_bindgen_2edc1414ddc93ec8"
+  hs_bindgen_2edc1414ddc93ec8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUSwapchainTextureFormat@
+hs_bindgen_2edc1414ddc93ec8
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO SDL_GPUTextureFormat)
+       )
+hs_bindgen_2edc1414ddc93ec8 =
+  BG.fromFFIType hs_bindgen_2edc1414ddc93ec8_base
+
+{-# NOINLINE sDL_GetGPUSwapchainTextureFormat #-}
+
+-- | Obtains the texture format of the swapchain for the given window.
+--
+--     Note that this format can change if the swapchain parameters change.
+--
+--     [@device@]: a GPU context.
+--
+--     [@window@]: an SDL_Window that has been claimed.
+--
+--     [Returns]: the texture format of the swapchain.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGPUSwapchainTextureFormat@, defined at @SDL3\/SDL_gpu.h 4207:50@
+sDL_GetGPUSwapchainTextureFormat
+  :: BG.FunPtr
+       (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO SDL_GPUTextureFormat)
+sDL_GetGPUSwapchainTextureFormat =
+  BG.unsafePerformIO hs_bindgen_2edc1414ddc93ec8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_AcquireGPUSwapchainTexture@
+foreign import ccall unsafe "hs_bindgen_3683da9bdd7123ad"
+  hs_bindgen_3683da9bdd7123ad_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_AcquireGPUSwapchainTexture@
+hs_bindgen_3683da9bdd7123ad
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCommandBuffer
+             -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_3683da9bdd7123ad =
+  BG.fromFFIType hs_bindgen_3683da9bdd7123ad_base
+
+{-# NOINLINE sDL_AcquireGPUSwapchainTexture #-}
+
+-- | Acquire a texture to use in presentation.
+--
+--     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 buffer used to acquire it.
+--
+--     This function will fill the swapchain texture handle with NULL if too many 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.
+--
+--     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.
+--
+--     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.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [@window@]: a window that has been claimed.
+--
+--     [@swapchain_texture@]: a pointer filled in with a swapchain texture handle.
+--
+--     [@swapchain_texture_width@]: a pointer filled in with the swapchain texture width, may be NULL.
+--
+--     [@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.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice', 'sDL_SubmitGPUCommandBuffer', 'sDL_SubmitGPUCommandBufferAndAcquireFence', 'sDL_CancelGPUCommandBuffer', SDL_GetWindowSizeInPixels, 'sDL_WaitForGPUSwapchain', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_SetGPUAllowedFramesInFlight'
+--
+--     [C declaration]: @SDL_AcquireGPUSwapchainTexture@, defined at @SDL3\/SDL_gpu.h 4259:34@
+sDL_AcquireGPUSwapchainTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCommandBuffer
+         -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_AcquireGPUSwapchainTexture =
+  BG.unsafePerformIO hs_bindgen_3683da9bdd7123ad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitForGPUSwapchain@
+foreign import ccall unsafe "hs_bindgen_ea0675458d59e8d7"
+  hs_bindgen_ea0675458d59e8d7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitForGPUSwapchain@
+hs_bindgen_ea0675458d59e8d7
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool))
+hs_bindgen_ea0675458d59e8d7 =
+  BG.fromFFIType hs_bindgen_ea0675458d59e8d7_base
+
+{-# NOINLINE sDL_WaitForGPUSwapchain #-}
+
+-- | Blocks the thread until a swapchain texture is available to be acquired.
+--
+--     [@device@]: a GPU context.
+--
+--     [@window@]: a window that has been claimed.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireGPUSwapchainTexture', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_SetGPUAllowedFramesInFlight'
+--
+--     [C declaration]: @SDL_WaitForGPUSwapchain@, defined at @SDL3\/SDL_gpu.h 4283:34@
+sDL_WaitForGPUSwapchain
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool)
+sDL_WaitForGPUSwapchain =
+  BG.unsafePerformIO hs_bindgen_ea0675458d59e8d7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitAndAcquireGPUSwapchainTexture@
+foreign import ccall unsafe "hs_bindgen_bd7e7771ebd38df5"
+  hs_bindgen_bd7e7771ebd38df5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitAndAcquireGPUSwapchainTexture@
+hs_bindgen_bd7e7771ebd38df5
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUCommandBuffer
+             -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_bd7e7771ebd38df5 =
+  BG.fromFFIType hs_bindgen_bd7e7771ebd38df5_base
+
+{-# NOINLINE sDL_WaitAndAcquireGPUSwapchainTexture #-}
+
+-- | Blocks the thread until a swapchain texture is available to be acquired, and then acquires it.
+--
+--     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 buffer used to acquire it. It is an error to call @SDL_CancelGPUCommandBuffer()@ after a swapchain texture is acquired.
+--
+--     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.
+--
+--     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.
+--
+--     The swapchain texture is write-only and cannot be used as a sampler or for another reading operation.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [@window@]: a window that has been claimed.
+--
+--     [@swapchain_texture@]: a pointer filled in with a swapchain texture handle.
+--
+--     [@swapchain_texture_width@]: a pointer filled in with the swapchain texture width, may be NULL.
+--
+--     [@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.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBuffer', 'sDL_SubmitGPUCommandBufferAndAcquireFence', 'sDL_AcquireGPUSwapchainTexture'
+--
+--     [C declaration]: @SDL_WaitAndAcquireGPUSwapchainTexture@, defined at @SDL3\/SDL_gpu.h 4329:34@
+sDL_WaitAndAcquireGPUSwapchainTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUCommandBuffer
+         -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_WaitAndAcquireGPUSwapchainTexture =
+  BG.unsafePerformIO hs_bindgen_bd7e7771ebd38df5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SubmitGPUCommandBuffer@
+foreign import ccall unsafe "hs_bindgen_8d4a9ce464622085"
+  hs_bindgen_8d4a9ce464622085_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SubmitGPUCommandBuffer@
+hs_bindgen_8d4a9ce464622085 :: IO (BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> IO BG.CBool))
+hs_bindgen_8d4a9ce464622085 =
+  BG.fromFFIType hs_bindgen_8d4a9ce464622085_base
+
+{-# NOINLINE sDL_SubmitGPUCommandBuffer #-}
+
+-- | Submits a command buffer so its commands can be processed on the GPU.
+--
+--     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.
+--
+--     All commands in the submission are guaranteed to begin executing before any command in a subsequent submission begins executing.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireGPUCommandBuffer', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_AcquireGPUSwapchainTexture', 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_SubmitGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 4357:34@
+sDL_SubmitGPUCommandBuffer :: BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> IO BG.CBool)
+sDL_SubmitGPUCommandBuffer =
+  BG.unsafePerformIO hs_bindgen_8d4a9ce464622085
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SubmitGPUCommandBufferAndAcquireFence@
+foreign import ccall unsafe "hs_bindgen_093495cd0f5ce3be"
+  hs_bindgen_093495cd0f5ce3be_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_SubmitGPUCommandBufferAndAcquireFence@
+hs_bindgen_093495cd0f5ce3be
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> IO (BG.Ptr SDL_GPUFence)))
+hs_bindgen_093495cd0f5ce3be =
+  BG.fromFFIType hs_bindgen_093495cd0f5ce3be_base
+
+{-# NOINLINE sDL_SubmitGPUCommandBufferAndAcquireFence #-}
+
+-- | 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.
+--
+--     This must be called from the thread the command buffer was acquired on.
+--
+--     All commands in the submission are guaranteed to begin executing before any command in a subsequent submission begins executing.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [Returns]: a fence associated with the command buffer, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireGPUCommandBuffer', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_AcquireGPUSwapchainTexture', 'sDL_SubmitGPUCommandBuffer', 'sDL_ReleaseGPUFence'
+--
+--     [C declaration]: @SDL_SubmitGPUCommandBufferAndAcquireFence@, defined at @SDL3\/SDL_gpu.h 4384:44@
+sDL_SubmitGPUCommandBufferAndAcquireFence
+  :: BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> IO (BG.Ptr SDL_GPUFence))
+sDL_SubmitGPUCommandBufferAndAcquireFence =
+  BG.unsafePerformIO hs_bindgen_093495cd0f5ce3be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CancelGPUCommandBuffer@
+foreign import ccall unsafe "hs_bindgen_83b736c86816e554"
+  hs_bindgen_83b736c86816e554_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CancelGPUCommandBuffer@
+hs_bindgen_83b736c86816e554 :: IO (BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> IO BG.CBool))
+hs_bindgen_83b736c86816e554 =
+  BG.fromFFIType hs_bindgen_83b736c86816e554_base
+
+{-# NOINLINE sDL_CancelGPUCommandBuffer #-}
+
+-- | Cancels a command buffer.
+--
+--     None of the enqueued commands are executed.
+--
+--     It is an error to call this function after a swapchain texture has been acquired.
+--
+--     This must be called from the thread the command buffer was acquired on.
+--
+--     You must not reference the command buffer after calling this function.
+--
+--     [@command_buffer@]: a command buffer.
+--
+--     [Returns]: true on success, false on error; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_AcquireGPUCommandBuffer', 'sDL_AcquireGPUSwapchainTexture'
+--
+--     [C declaration]: @SDL_CancelGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 4409:34@
+sDL_CancelGPUCommandBuffer :: BG.FunPtr (BG.Ptr SDL_GPUCommandBuffer -> IO BG.CBool)
+sDL_CancelGPUCommandBuffer =
+  BG.unsafePerformIO hs_bindgen_83b736c86816e554
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitForGPUIdle@
+foreign import ccall unsafe "hs_bindgen_34c07d40aff698e2"
+  hs_bindgen_34c07d40aff698e2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitForGPUIdle@
+hs_bindgen_34c07d40aff698e2 :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO BG.CBool))
+hs_bindgen_34c07d40aff698e2 =
+  BG.fromFFIType hs_bindgen_34c07d40aff698e2_base
+
+{-# NOINLINE sDL_WaitForGPUIdle #-}
+
+-- | Blocks the thread until the GPU is completely idle.
+--
+--     [@device@]: a GPU context.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitForGPUFences'
+--
+--     [C declaration]: @SDL_WaitForGPUIdle@, defined at @SDL3\/SDL_gpu.h 4423:34@
+sDL_WaitForGPUIdle :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> IO BG.CBool)
+sDL_WaitForGPUIdle =
+  BG.unsafePerformIO hs_bindgen_34c07d40aff698e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitForGPUFences@
+foreign import ccall unsafe "hs_bindgen_4cb9d239bc32f759"
+  hs_bindgen_4cb9d239bc32f759_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_WaitForGPUFences@
+hs_bindgen_4cb9d239bc32f759
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUDevice
+             -> BG.CBool
+             -> PtrConst.PtrConst (BG.Ptr SDL_GPUFence)
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_4cb9d239bc32f759 =
+  BG.fromFFIType hs_bindgen_4cb9d239bc32f759_base
+
+{-# NOINLINE sDL_WaitForGPUFences #-}
+
+-- | Blocks the thread until the given fences are signaled.
+--
+--     [@device@]: a GPU context.
+--
+--     [@wait_all@]: if 0, wait for any fence to be signaled, if 1, wait for all fences to be signaled.
+--
+--     [@fences@]: an array of fences to wait on.
+--
+--     [@num_fences@]: the number of fences in the fences array.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBufferAndAcquireFence', 'sDL_WaitForGPUIdle'
+--
+--     [C declaration]: @SDL_WaitForGPUFences@, defined at @SDL3\/SDL_gpu.h 4442:34@
+sDL_WaitForGPUFences
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUDevice
+         -> BG.CBool
+         -> PtrConst.PtrConst (BG.Ptr SDL_GPUFence)
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_WaitForGPUFences =
+  BG.unsafePerformIO hs_bindgen_4cb9d239bc32f759
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_QueryGPUFence@
+foreign import ccall unsafe "hs_bindgen_67c5db65f97a1de0"
+  hs_bindgen_67c5db65f97a1de0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_QueryGPUFence@
+hs_bindgen_67c5db65f97a1de0
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUFence -> IO BG.CBool))
+hs_bindgen_67c5db65f97a1de0 =
+  BG.fromFFIType hs_bindgen_67c5db65f97a1de0_base
+
+{-# NOINLINE sDL_QueryGPUFence #-}
+
+-- | Checks the status of a fence.
+--
+--     [@device@]: a GPU context.
+--
+--     [@fence@]: a fence.
+--
+--     [Returns]: true if the fence is signaled, false if it is not.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_QueryGPUFence@, defined at @SDL3\/SDL_gpu.h 4459:34@
+sDL_QueryGPUFence :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUFence -> IO BG.CBool)
+sDL_QueryGPUFence =
+  BG.unsafePerformIO hs_bindgen_67c5db65f97a1de0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUFence@
+foreign import ccall unsafe "hs_bindgen_8f9e7c0ed3e519a2"
+  hs_bindgen_8f9e7c0ed3e519a2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_ReleaseGPUFence@
+hs_bindgen_8f9e7c0ed3e519a2 :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUFence -> IO ()))
+hs_bindgen_8f9e7c0ed3e519a2 =
+  BG.fromFFIType hs_bindgen_8f9e7c0ed3e519a2_base
+
+{-# NOINLINE sDL_ReleaseGPUFence #-}
+
+-- | Releases a fence obtained from SDL_SubmitGPUCommandBufferAndAcquireFence.
+--
+--     You must not reference the fence after calling this function.
+--
+--     [@device@]: a GPU context.
+--
+--     [@fence@]: a fence.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_ReleaseGPUFence@, defined at @SDL3\/SDL_gpu.h 4475:34@
+sDL_ReleaseGPUFence :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> BG.Ptr SDL_GPUFence -> IO ())
+sDL_ReleaseGPUFence =
+  BG.unsafePerformIO hs_bindgen_8f9e7c0ed3e519a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUTextureFormatTexelBlockSize@
+foreign import ccall unsafe "hs_bindgen_7020eb5f7daa1796"
+  hs_bindgen_7020eb5f7daa1796_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUTextureFormatTexelBlockSize@
+hs_bindgen_7020eb5f7daa1796
+  :: IO (BG.FunPtr (SDL_GPUTextureFormat -> IO SDL3.Sys.Bindgen.Stdinc.Uint32))
+hs_bindgen_7020eb5f7daa1796 =
+  BG.fromFFIType hs_bindgen_7020eb5f7daa1796_base
+
+{-# NOINLINE sDL_GPUTextureFormatTexelBlockSize #-}
+
+-- | Obtains the texel block size for a texture format.
+--
+--     [@format@]: the texture format you want to know the texel size of.
+--
+--     [Returns]: the texel block size of the texture format.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUTexture'
+--
+--     [C declaration]: @SDL_GPUTextureFormatTexelBlockSize@, defined at @SDL3\/SDL_gpu.h 4491:36@
+sDL_GPUTextureFormatTexelBlockSize
+  :: BG.FunPtr (SDL_GPUTextureFormat -> IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+sDL_GPUTextureFormatTexelBlockSize =
+  BG.unsafePerformIO hs_bindgen_7020eb5f7daa1796
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUTextureSupportsFormat@
+foreign import ccall unsafe "hs_bindgen_3c6e764809d2a384"
+  hs_bindgen_3c6e764809d2a384_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUTextureSupportsFormat@
+hs_bindgen_3c6e764809d2a384
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPUDevice
+             -> SDL_GPUTextureFormat
+             -> SDL_GPUTextureType
+             -> SDL_GPUTextureUsageFlags
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_3c6e764809d2a384 =
+  BG.fromFFIType hs_bindgen_3c6e764809d2a384_base
+
+{-# NOINLINE sDL_GPUTextureSupportsFormat #-}
+
+-- | Determines whether a texture format is supported for a given type and usage.
+--
+--     [@device@]: a GPU context.
+--
+--     [@format@]: the texture format to check.
+--
+--     [@type@]: the type of texture (2D, 3D, Cube).
+--
+--     [@usage@]: a bitmask of all usage scenarios to check.
+--
+--     [Returns]: whether the texture format is supported for this type and usage.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GPUTextureSupportsFormat@, defined at @SDL3\/SDL_gpu.h 4506:34@
+sDL_GPUTextureSupportsFormat
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPUDevice
+         -> SDL_GPUTextureFormat
+         -> SDL_GPUTextureType
+         -> SDL_GPUTextureUsageFlags
+         -> IO BG.CBool
+       )
+sDL_GPUTextureSupportsFormat =
+  BG.unsafePerformIO hs_bindgen_3c6e764809d2a384
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUTextureSupportsSampleCount@
+foreign import ccall unsafe "hs_bindgen_6b69a9c844393ce7"
+  hs_bindgen_6b69a9c844393ce7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GPUTextureSupportsSampleCount@
+hs_bindgen_6b69a9c844393ce7
+  :: IO (BG.FunPtr (BG.Ptr SDL_GPUDevice -> SDL_GPUTextureFormat -> SDL_GPUSampleCount -> IO BG.CBool))
+hs_bindgen_6b69a9c844393ce7 =
+  BG.fromFFIType hs_bindgen_6b69a9c844393ce7_base
+
+{-# NOINLINE sDL_GPUTextureSupportsSampleCount #-}
+
+-- | Determines if a sample count for a texture format is supported.
+--
+--     [@device@]: a GPU context.
+--
+--     [@format@]: the texture format to check.
+--
+--     [@sample_count@]: the sample count to check.
+--
+--     [Returns]: whether the sample count is supported for this texture format.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GPUTextureSupportsSampleCount@, defined at @SDL3\/SDL_gpu.h 4522:34@
+sDL_GPUTextureSupportsSampleCount
+  :: BG.FunPtr (BG.Ptr SDL_GPUDevice -> SDL_GPUTextureFormat -> SDL_GPUSampleCount -> IO BG.CBool)
+sDL_GPUTextureSupportsSampleCount =
+  BG.unsafePerformIO hs_bindgen_6b69a9c844393ce7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CalculateGPUTextureFormatSize@
+foreign import ccall unsafe "hs_bindgen_fab34fd075b25f9a"
+  hs_bindgen_fab34fd075b25f9a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_CalculateGPUTextureFormatSize@
+hs_bindgen_fab34fd075b25f9a
+  :: IO
+       ( BG.FunPtr
+           ( SDL_GPUTextureFormat
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+           )
+       )
+hs_bindgen_fab34fd075b25f9a =
+  BG.fromFFIType hs_bindgen_fab34fd075b25f9a_base
+
+{-# NOINLINE sDL_CalculateGPUTextureFormatSize #-}
+
+-- | Calculate the size in bytes of a texture format with dimensions.
+--
+--     [@format@]: a texture format.
+--
+--     [@width@]: width in pixels.
+--
+--     [@height@]: height in pixels.
+--
+--     [@depth_or_layer_count@]: depth for 3D textures or layer count otherwise.
+--
+--     [Returns]: the size of a texture with this format and dimensions.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CalculateGPUTextureFormatSize@, defined at @SDL3\/SDL_gpu.h 4538:36@
+sDL_CalculateGPUTextureFormatSize
+  :: BG.FunPtr
+       ( SDL_GPUTextureFormat
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+       )
+sDL_CalculateGPUTextureFormatSize =
+  BG.unsafePerformIO hs_bindgen_fab34fd075b25f9a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetPixelFormatFromGPUTextureFormat@
+foreign import ccall unsafe "hs_bindgen_8fe9348f3a2816f5"
+  hs_bindgen_8fe9348f3a2816f5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetPixelFormatFromGPUTextureFormat@
+hs_bindgen_8fe9348f3a2816f5
+  :: IO (BG.FunPtr (SDL_GPUTextureFormat -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat))
+hs_bindgen_8fe9348f3a2816f5 =
+  BG.fromFFIType hs_bindgen_8fe9348f3a2816f5_base
+
+{-# NOINLINE sDL_GetPixelFormatFromGPUTextureFormat #-}
+
+-- | Get the SDL pixel format corresponding to a GPU texture format.
+--
+--     [@format@]: a texture format.
+--
+--     [Returns]: the corresponding pixel format, or SDL_PIXELFORMAT_UNKNOWN if there is no corresponding pixel format.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetPixelFormatFromGPUTextureFormat@, defined at @SDL3\/SDL_gpu.h 4553:45@
+sDL_GetPixelFormatFromGPUTextureFormat
+  :: BG.FunPtr (SDL_GPUTextureFormat -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat)
+sDL_GetPixelFormatFromGPUTextureFormat =
+  BG.unsafePerformIO hs_bindgen_8fe9348f3a2816f5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUTextureFormatFromPixelFormat@
+foreign import ccall unsafe "hs_bindgen_372069e59fc19080"
+  hs_bindgen_372069e59fc19080_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_get_SDL_GetGPUTextureFormatFromPixelFormat@
+hs_bindgen_372069e59fc19080
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat -> IO SDL_GPUTextureFormat))
+hs_bindgen_372069e59fc19080 =
+  BG.fromFFIType hs_bindgen_372069e59fc19080_base
+
+{-# NOINLINE sDL_GetGPUTextureFormatFromPixelFormat #-}
+
+-- | Get the GPU texture format corresponding to an SDL pixel format.
+--
+--     [@format@]: a pixel format.
+--
+--     [Returns]: the corresponding GPU texture format, or SDL_GPU_TEXTUREFORMAT_INVALID if there is no corresponding GPU texture format.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetGPUTextureFormatFromPixelFormat@, defined at @SDL3\/SDL_gpu.h 4565:50@
+sDL_GetGPUTextureFormatFromPixelFormat
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat -> IO SDL_GPUTextureFormat)
+sDL_GetGPUTextureFormatFromPixelFormat =
+  BG.unsafePerformIO hs_bindgen_372069e59fc19080
diff --git a/src/SDL3/Sys/Bindgen/Gpu/Safe.hs b/src/SDL3/Sys/Bindgen/Gpu/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Gpu/Safe.hs
@@ -0,0 +1,4992 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Gpu.Safe (
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GPUSupportsShaderFormats,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GPUSupportsProperties,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CreateGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CreateGPUDeviceWithProperties,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_DestroyGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GetNumGPUDrivers,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GetGPUDriver,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GetGPUDeviceDriver,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GetGPUShaderFormats,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GetGPUDeviceProperties,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CreateGPUComputePipeline,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CreateGPUGraphicsPipeline,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CreateGPUSampler,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CreateGPUShader,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CreateGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CreateGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CreateGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_SetGPUBufferName,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_SetGPUTextureName,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_InsertGPUDebugLabel,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_PushGPUDebugGroup,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_PopGPUDebugGroup,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_ReleaseGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_ReleaseGPUSampler,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_ReleaseGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_ReleaseGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_ReleaseGPUComputePipeline,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_ReleaseGPUShader,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_ReleaseGPUGraphicsPipeline,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_AcquireGPUCommandBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_PushGPUVertexUniformData,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_PushGPUFragmentUniformData,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_PushGPUComputeUniformData,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BeginGPURenderPass,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUGraphicsPipeline,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_SetGPUViewport,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_SetGPUScissor,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_SetGPUBlendConstants,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_SetGPUStencilReference,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUVertexBuffers,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUIndexBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUVertexSamplers,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUVertexStorageTextures,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUVertexStorageBuffers,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUFragmentSamplers,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUFragmentStorageTextures,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUFragmentStorageBuffers,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_DrawGPUIndexedPrimitives,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_DrawGPUPrimitives,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_DrawGPUPrimitivesIndirect,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_DrawGPUIndexedPrimitivesIndirect,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_EndGPURenderPass,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BeginGPUComputePass,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUComputePipeline,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUComputeSamplers,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUComputeStorageTextures,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BindGPUComputeStorageBuffers,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_DispatchGPUCompute,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_DispatchGPUComputeIndirect,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_EndGPUComputePass,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_MapGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_UnmapGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BeginGPUCopyPass,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_UploadToGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_UploadToGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CopyGPUTextureToTexture,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CopyGPUBufferToBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_DownloadFromGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_DownloadFromGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_EndGPUCopyPass,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GenerateMipmapsForGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_BlitGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_WindowSupportsGPUSwapchainComposition,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_WindowSupportsGPUPresentMode,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_ClaimWindowForGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_ReleaseWindowFromGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_SetGPUSwapchainParameters,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_SetGPUAllowedFramesInFlight,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GetGPUSwapchainTextureFormat,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_AcquireGPUSwapchainTexture,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_WaitForGPUSwapchain,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_WaitAndAcquireGPUSwapchainTexture,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_SubmitGPUCommandBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_SubmitGPUCommandBufferAndAcquireFence,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CancelGPUCommandBuffer,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_WaitForGPUIdle,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_WaitForGPUFences,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_QueryGPUFence,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_ReleaseGPUFence,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GPUTextureFormatTexelBlockSize,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GPUTextureSupportsFormat,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GPUTextureSupportsSampleCount,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_CalculateGPUTextureFormatSize,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GetPixelFormatFromGPUTextureFormat,
+  SDL3.Sys.Bindgen.Gpu.Safe.sDL_GetGPUTextureFormatFromPixelFormat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Gpu
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_gpu.h>"
+         , "_Bool hs_bindgen_aae5cc9f6839b5cc ("
+         , "  SDL_GPUShaderFormat arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GPUSupportsShaderFormats)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_eafef00f426d07de ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GPUSupportsProperties)(arg1);"
+         , "}"
+         , "SDL_GPUDevice *hs_bindgen_e18d5500edbbd7b5 ("
+         , "  SDL_GPUShaderFormat arg1,"
+         , "  _Bool arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUDevice)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_GPUDevice *hs_bindgen_79aa6b683079a4aa ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUDeviceWithProperties)(arg1);"
+         , "}"
+         , "void hs_bindgen_8880394a1e594bb0 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyGPUDevice)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_53d9edb0d1616675 (void)"
+         , "{"
+         , "  return (SDL_GetNumGPUDrivers)();"
+         , "}"
+         , "char const *hs_bindgen_bde1ec04c28e032c ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGPUDriver)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_2e09f9d54b7e174c ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGPUDeviceDriver)(arg1);"
+         , "}"
+         , "SDL_GPUShaderFormat hs_bindgen_0ac23e15856207d2 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGPUShaderFormats)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_PropertiesID hs_bindgen_24ec481b90601a40 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetGPUDeviceProperties)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetGPUDeviceProperties requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_GPUComputePipeline *hs_bindgen_be9942ef43a30dbb ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUComputePipelineCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUComputePipeline)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUGraphicsPipeline *hs_bindgen_3a818324fc7c3f58 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUGraphicsPipelineCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUGraphicsPipeline)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUSampler *hs_bindgen_604bbac908c436aa ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUSamplerCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUSampler)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUShader *hs_bindgen_3b5c95e61238095a ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUShaderCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUShader)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUTexture *hs_bindgen_c6685129d00ec509 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTextureCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUTexture)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUBuffer *hs_bindgen_5eca6d3125b183e7 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUBufferCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUBuffer)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUTransferBuffer *hs_bindgen_646007cc8d60e8f1 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBufferCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUTransferBuffer)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_35249b94fcee0ae6 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUBufferName)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_21f5dad8cd3caba0 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTexture *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUTextureName)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_e540ee9c7b74b716 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_InsertGPUDebugLabel)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_6cf1d5f7ad48ca4b ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_PushGPUDebugGroup)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_c82fe0d95b63b068 ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_PopGPUDebugGroup)(arg1);"
+         , "}"
+         , "void hs_bindgen_367c147bedca1380 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTexture *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUTexture)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_9d27e7a735191637 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUSampler *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUSampler)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_bc73e63cd04b292b ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUBuffer *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUBuffer)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_8e038ae5b291e93f ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBuffer *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUTransferBuffer)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_2ebc397e9dad3697 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUComputePipeline *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUComputePipeline)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_be87d6210d892952 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUShader *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUShader)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_c2a4e9cdd147b21b ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUGraphicsPipeline *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUGraphicsPipeline)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUCommandBuffer *hs_bindgen_92149d0718fb8464 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AcquireGPUCommandBuffer)(arg1);"
+         , "}"
+         , "void hs_bindgen_af2096650fa2d8d0 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_PushGPUVertexUniformData)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_d777c2d66931c0d7 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_PushGPUFragmentUniformData)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_c40f02ecbf0d1f10 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_PushGPUComputeUniformData)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "SDL_GPURenderPass *hs_bindgen_5d064478a0820b2c ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUColorTargetInfo const *arg2,"
+         , "  Uint32 arg3,"
+         , "  SDL_GPUDepthStencilTargetInfo const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_BeginGPURenderPass)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_43b6f6578491ba7f ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUGraphicsPipeline *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUGraphicsPipeline)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_710986e3fd99ba6a ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUViewport const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUViewport)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_8e81e30e4f1e1924 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUScissor)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_f727bad8e8b1ff3e ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_FColor *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUBlendConstants)(arg1, *arg2);"
+         , "}"
+         , "void hs_bindgen_4a62370048ec360b ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUStencilReference)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_6471bc849523bb14 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBufferBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUVertexBuffers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_084b99eea9396d40 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUBufferBinding const *arg2,"
+         , "  SDL_GPUIndexElementSize arg3"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUIndexBuffer)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_d275601b49dec50a ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTextureSamplerBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUVertexSamplers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_66cc372794c2ef55 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTexture *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUVertexStorageTextures)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_d7725fcd1492d52d ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBuffer *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUVertexStorageBuffers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_1a2c72585c211590 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTextureSamplerBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUFragmentSamplers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_0714ec46b44519f0 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTexture *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUFragmentStorageTextures)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_2afe5342dbcdb8ac ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBuffer *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUFragmentStorageBuffers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_954941bccb6ac959 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4,"
+         , "  Sint32 arg5,"
+         , "  Uint32 arg6"
+         , ")"
+         , "{"
+         , "  (SDL_DrawGPUIndexedPrimitives)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "void hs_bindgen_7e1d85570a924ed1 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  (SDL_DrawGPUPrimitives)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_999f4bafc18ca643 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_DrawGPUPrimitivesIndirect)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_2564f3889af73a8f ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_DrawGPUIndexedPrimitivesIndirect)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_d2de9afaf4e7a298 ("
+         , "  SDL_GPURenderPass *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_EndGPURenderPass)(arg1);"
+         , "}"
+         , "SDL_GPUComputePass *hs_bindgen_04814702f1c40b5f ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUStorageTextureReadWriteBinding const *arg2,"
+         , "  Uint32 arg3,"
+         , "  SDL_GPUStorageBufferReadWriteBinding const *arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_BeginGPUComputePass)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_b04b2c08eaccdba1 ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  SDL_GPUComputePipeline *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUComputePipeline)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_94f4eed2a54840f8 ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTextureSamplerBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUComputeSamplers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_f7ee457bab9d199a ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTexture *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUComputeStorageTextures)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_641e269a64317ba1 ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBuffer *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUComputeStorageBuffers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_bf60fb94f2ea8730 ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_DispatchGPUCompute)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_0f44002961b2beb1 ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  (SDL_DispatchGPUComputeIndirect)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_3dd5760089aac51a ("
+         , "  SDL_GPUComputePass *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_EndGPUComputePass)(arg1);"
+         , "}"
+         , "void *hs_bindgen_4482f6067e6e107e ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBuffer *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_MapGPUTransferBuffer)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_231a5479716b178e ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBuffer *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_UnmapGPUTransferBuffer)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUCopyPass *hs_bindgen_e6f2bf9a9fc498cb ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_BeginGPUCopyPass)(arg1);"
+         , "}"
+         , "void hs_bindgen_01d377001aa72f60 ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTextureTransferInfo const *arg2,"
+         , "  SDL_GPUTextureRegion const *arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  (SDL_UploadToGPUTexture)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_6e1f7474e78322ce ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTransferBufferLocation const *arg2,"
+         , "  SDL_GPUBufferRegion const *arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  (SDL_UploadToGPUBuffer)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_918f11a3023e9438 ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTextureLocation const *arg2,"
+         , "  SDL_GPUTextureLocation const *arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5,"
+         , "  Uint32 arg6,"
+         , "  _Bool arg7"
+         , ")"
+         , "{"
+         , "  (SDL_CopyGPUTextureToTexture)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "void hs_bindgen_7075b4fcc48051e5 ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUBufferLocation const *arg2,"
+         , "  SDL_GPUBufferLocation const *arg3,"
+         , "  Uint32 arg4,"
+         , "  _Bool arg5"
+         , ")"
+         , "{"
+         , "  (SDL_CopyGPUBufferToBuffer)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_26b4b49d8544fb8f ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTextureRegion const *arg2,"
+         , "  SDL_GPUTextureTransferInfo const *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_DownloadFromGPUTexture)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_d9824eebc00631e9 ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUBufferRegion const *arg2,"
+         , "  SDL_GPUTransferBufferLocation const *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_DownloadFromGPUBuffer)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_bf4e18ec8641dd60 ("
+         , "  SDL_GPUCopyPass *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_EndGPUCopyPass)(arg1);"
+         , "}"
+         , "void hs_bindgen_fa347415d8ba2bab ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUTexture *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_GenerateMipmapsForGPUTexture)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_2cf48971e4a0bb02 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUBlitInfo const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_BlitGPUTexture)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7f2a5f493596626a ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUSwapchainComposition arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WindowSupportsGPUSwapchainComposition)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_832a19beda5bc034 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUPresentMode arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WindowSupportsGPUPresentMode)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_5eeb91d45dc27764 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ClaimWindowForGPUDevice)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_00fb11a8b5935e0f ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseWindowFromGPUDevice)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_caf081d6c5e2aa14 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUSwapchainComposition arg3,"
+         , "  SDL_GPUPresentMode arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGPUSwapchainParameters)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_04ce0909a6c26d29 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGPUAllowedFramesInFlight)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUTextureFormat hs_bindgen_6389b81fd8780e8b ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGPUSwapchainTextureFormat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_92ebdfd004d30834 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUTexture **arg3,"
+         , "  Uint32 *arg4,"
+         , "  Uint32 *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_AcquireGPUSwapchainTexture)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_819c0e296688c2c8 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitForGPUSwapchain)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b7be4df3492ace1e ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUTexture **arg3,"
+         , "  Uint32 *arg4,"
+         , "  Uint32 *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitAndAcquireGPUSwapchainTexture)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_6f98a07dd7e96530 ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SubmitGPUCommandBuffer)(arg1);"
+         , "}"
+         , "SDL_GPUFence *hs_bindgen_897578b42f3c05e8 ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SubmitGPUCommandBufferAndAcquireFence)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_e7e00ea7d024e9e9 ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CancelGPUCommandBuffer)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_afeaba8d92329a17 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitForGPUIdle)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_c1152a4254c2282b ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  _Bool arg2,"
+         , "  SDL_GPUFence *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitForGPUFences)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_b6027b7729f79f17 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUFence *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_QueryGPUFence)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_60db26ce4b928463 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUFence *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUFence)(arg1, arg2);"
+         , "}"
+         , "Uint32 hs_bindgen_10b178c2418e1b7a ("
+         , "  SDL_GPUTextureFormat arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GPUTextureFormatTexelBlockSize)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_e7f998463fccba5a ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTextureFormat arg2,"
+         , "  SDL_GPUTextureType arg3,"
+         , "  SDL_GPUTextureUsageFlags arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GPUTextureSupportsFormat)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_de6deb1af3775431 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTextureFormat arg2,"
+         , "  SDL_GPUSampleCount arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GPUTextureSupportsSampleCount)(arg1, arg2, arg3);"
+         , "}"
+         , "Uint32 hs_bindgen_d9b37eb9aa5f44b5 ("
+         , "  SDL_GPUTextureFormat arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_CalculateGPUTextureFormatSize)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_PixelFormat hs_bindgen_128db189d446a117 ("
+         , "  SDL_GPUTextureFormat arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetPixelFormatFromGPUTextureFormat)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetPixelFormatFromGPUTextureFormat requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_GPUTextureFormat hs_bindgen_af0c7c8e2642605b ("
+         , "  SDL_PixelFormat arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetGPUTextureFormatFromPixelFormat)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetGPUTextureFormatFromPixelFormat requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GPUSupportsShaderFormats@
+foreign import ccall safe "hs_bindgen_aae5cc9f6839b5cc"
+  hs_bindgen_aae5cc9f6839b5cc_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GPUSupportsShaderFormats@
+hs_bindgen_aae5cc9f6839b5cc
+  :: SDL_GPUShaderFormat
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_aae5cc9f6839b5cc =
+  BG.fromFFIType hs_bindgen_aae5cc9f6839b5cc_base
+
+-- | Checks for GPU runtime support.
+--
+--     [Returns]: true if supported, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDevice'
+--
+--     [C declaration]: @SDL_GPUSupportsShaderFormats@, defined at @SDL3\/SDL_gpu.h 2200:34@
+sDL_GPUSupportsShaderFormats
+  :: SDL_GPUShaderFormat
+  -- ^
+  --
+  --           [@format_flags@]: a bitflag indicating which shader formats the app is able to provide.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the preferred GPU driver, or NULL to let SDL pick the optimal driver.
+  -> IO BG.CBool
+sDL_GPUSupportsShaderFormats =
+  hs_bindgen_aae5cc9f6839b5cc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GPUSupportsProperties@
+foreign import ccall safe "hs_bindgen_eafef00f426d07de"
+  hs_bindgen_eafef00f426d07de_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GPUSupportsProperties@
+hs_bindgen_eafef00f426d07de
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO BG.CBool
+hs_bindgen_eafef00f426d07de =
+  BG.fromFFIType hs_bindgen_eafef00f426d07de_base
+
+-- | Checks for GPU runtime support.
+--
+--     [Returns]: true if supported, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDeviceWithProperties'
+--
+--     [C declaration]: @SDL_GPUSupportsProperties@, defined at @SDL3\/SDL_gpu.h 2214:34@
+sDL_GPUSupportsProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO BG.CBool
+sDL_GPUSupportsProperties =
+  hs_bindgen_eafef00f426d07de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUDevice@
+foreign import ccall safe "hs_bindgen_e18d5500edbbd7b5"
+  hs_bindgen_e18d5500edbbd7b5_base
+    :: BG.Word32
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUDevice@
+hs_bindgen_e18d5500edbbd7b5
+  :: SDL_GPUShaderFormat
+  -> BG.CBool
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_GPUDevice)
+hs_bindgen_e18d5500edbbd7b5 =
+  BG.fromFFIType hs_bindgen_e18d5500edbbd7b5_base
+
+-- | Creates a GPU context.
+--
+--     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
+--
+--     [Returns]: a GPU context on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDeviceWithProperties', 'sDL_GetGPUShaderFormats', 'sDL_GetGPUDeviceDriver', 'sDL_DestroyGPUDevice', 'sDL_GPUSupportsShaderFormats'
+--
+--     [C declaration]: @SDL_CreateGPUDevice@, defined at @SDL3\/SDL_gpu.h 2243:45@
+sDL_CreateGPUDevice
+  :: SDL_GPUShaderFormat
+  -- ^
+  --
+  --           [@format_flags@]: a bitflag indicating which shader formats the app is able to provide.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@debug_mode@]: enable debug mode properties and validations.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the preferred GPU driver, or NULL to let SDL pick the optimal driver.
+  -> IO (BG.Ptr SDL_GPUDevice)
+sDL_CreateGPUDevice = hs_bindgen_e18d5500edbbd7b5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUDeviceWithProperties@
+foreign import ccall safe "hs_bindgen_79aa6b683079a4aa"
+  hs_bindgen_79aa6b683079a4aa_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUDeviceWithProperties@
+hs_bindgen_79aa6b683079a4aa
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_GPUDevice)
+hs_bindgen_79aa6b683079a4aa =
+  BG.fromFFIType hs_bindgen_79aa6b683079a4aa_base
+
+-- | Creates a GPU context.
+--
+--     These are the supported properties:
+--
+--     * @'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.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN'@: enable to automatically log useful debug information on device creation, defaults to true.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_NAME_STRING'@: the name of the GPU driver to use, if a specific one is desired.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN'@: Enable Vulkan device feature shaderClipDistance. If disabled, clip distances are not supported in shader code: gl_ClipDistance[] built-ins of GLSL, SV_ClipDistance0\/1 semantics of HLSL and [[clip_distance]] attribute of 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.
+--
+--     These are the current shader format properties:
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN'@: The app is able to provide shaders for an NDA platform.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN'@: The app is able to provide SPIR-V shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN'@: The app is able to provide DXBC shaders if applicable
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN'@: The app is able to provide DXIL shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN'@: The app is able to provide MSL shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN'@: The app is able to provide Metal shader libraries if applicable.
+--
+--     With the D3D12 backend:
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING'@: the prefix to use for all vertex semantics, default is \"TEXCOORD\".
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN'@: By default, Resourcing Binding Tier 2 is required for D3D12 support. However, an application can set this property to true to enable Tier 1 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 capacity. Defaults to false.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER'@: Certain feature checks are only possible on Windows 11 by default. By setting this alongside @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING'@ and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those feature checks possible on older platforms. The version you provide must match the one given in the DLL.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING'@: Certain feature checks are only possible on Windows 11 by default. By setting this alongside @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER'@ and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those feature checks possible on older platforms. The path you provide must be relative to the executable path of your app. Be sure not to put the DLL in the same directory as the exe; Microsoft strongly advises against this!
+--
+--     With the Vulkan backend:
+--
+--     * @'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.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER'@: a pointer to an '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 minimal set SDL requires.
+--
+--     With the Metal backend: - @'sDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN'@: By default, macOS support requires what Apple calls \"MTLGPUFamilyMac2\" hardware or newer. However, an application can set this property to true to enable support for \"MTLGPUFamilyMac1\" hardware, if (and only if) the application does not write to sRGB textures. (For history\'s sake: MacFamily1 also does not support indirect command buffers, MSAA depth resolve, and stencil resolve\/feedback, but these are not exposed features in SDL_GPU.)
+--
+--     [Returns]: a GPU context on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGPUShaderFormats', 'sDL_GetGPUDeviceDriver', 'sDL_DestroyGPUDevice', 'sDL_GPUSupportsProperties'
+--
+--     [C declaration]: @SDL_CreateGPUDeviceWithProperties@, defined at @SDL3\/SDL_gpu.h 2360:45@
+sDL_CreateGPUDeviceWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_GPUDevice)
+sDL_CreateGPUDeviceWithProperties =
+  hs_bindgen_79aa6b683079a4aa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DestroyGPUDevice@
+foreign import ccall safe "hs_bindgen_8880394a1e594bb0"
+  hs_bindgen_8880394a1e594bb0_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DestroyGPUDevice@
+hs_bindgen_8880394a1e594bb0
+  :: BG.Ptr SDL_GPUDevice
+  -> IO ()
+hs_bindgen_8880394a1e594bb0 =
+  BG.fromFFIType hs_bindgen_8880394a1e594bb0_base
+
+-- | Destroys a GPU context previously returned by SDL_CreateGPUDevice.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDevice'
+--
+--     [C declaration]: @SDL_DestroyGPUDevice@, defined at @SDL3\/SDL_gpu.h 2422:34@
+sDL_DestroyGPUDevice
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context to destroy.
+  -> IO ()
+sDL_DestroyGPUDevice = hs_bindgen_8880394a1e594bb0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetNumGPUDrivers@
+foreign import ccall safe "hs_bindgen_53d9edb0d1616675"
+  hs_bindgen_53d9edb0d1616675_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetNumGPUDrivers@
+hs_bindgen_53d9edb0d1616675 :: IO BG.CInt
+hs_bindgen_53d9edb0d1616675 =
+  BG.fromFFIType hs_bindgen_53d9edb0d1616675_base
+
+-- | Get the number of GPU drivers compiled into SDL.
+--
+--     [Returns]: the number of built in GPU drivers.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGPUDriver'
+--
+--     [C declaration]: @SDL_GetNumGPUDrivers@, defined at @SDL3\/SDL_gpu.h 2433:33@
+sDL_GetNumGPUDrivers :: IO BG.CInt
+sDL_GetNumGPUDrivers = hs_bindgen_53d9edb0d1616675
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUDriver@
+foreign import ccall safe "hs_bindgen_bde1ec04c28e032c"
+  hs_bindgen_bde1ec04c28e032c_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUDriver@
+hs_bindgen_bde1ec04c28e032c
+  :: BG.CInt
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_bde1ec04c28e032c =
+  BG.fromFFIType hs_bindgen_bde1ec04c28e032c_base
+
+-- | 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.
+--
+--     [Returns]: the name of the GPU driver with the given __index__.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumGPUDrivers'
+--
+--     [C declaration]: @SDL_GetGPUDriver@, defined at @SDL3\/SDL_gpu.h 2452:42@
+sDL_GetGPUDriver
+  :: BG.CInt
+  -- ^
+  --
+  --           [@index@]: the index of a GPU driver.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGPUDriver = hs_bindgen_bde1ec04c28e032c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUDeviceDriver@
+foreign import ccall safe "hs_bindgen_2e09f9d54b7e174c"
+  hs_bindgen_2e09f9d54b7e174c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUDeviceDriver@
+hs_bindgen_2e09f9d54b7e174c
+  :: BG.Ptr SDL_GPUDevice
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_2e09f9d54b7e174c =
+  BG.fromFFIType hs_bindgen_2e09f9d54b7e174c_base
+
+-- | Returns the name of the backend used to create this GPU context.
+--
+--     [Returns]: the name of the device\'s driver, or NULL on error.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGPUDeviceDriver@, defined at @SDL3\/SDL_gpu.h 2462:42@
+sDL_GetGPUDeviceDriver
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGPUDeviceDriver = hs_bindgen_2e09f9d54b7e174c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUShaderFormats@
+foreign import ccall safe "hs_bindgen_0ac23e15856207d2"
+  hs_bindgen_0ac23e15856207d2_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUShaderFormats@
+hs_bindgen_0ac23e15856207d2
+  :: BG.Ptr SDL_GPUDevice
+  -> IO SDL_GPUShaderFormat
+hs_bindgen_0ac23e15856207d2 =
+  BG.fromFFIType hs_bindgen_0ac23e15856207d2_base
+
+-- | Returns the supported shader formats for this GPU context.
+--
+--     [Returns]: a bitflag indicating which shader formats the driver is able to consume.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGPUShaderFormats@, defined at @SDL3\/SDL_gpu.h 2473:49@
+sDL_GetGPUShaderFormats
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO SDL_GPUShaderFormat
+sDL_GetGPUShaderFormats = hs_bindgen_0ac23e15856207d2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUDeviceProperties@
+foreign import ccall safe "hs_bindgen_24ec481b90601a40"
+  hs_bindgen_24ec481b90601a40_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUDeviceProperties@
+hs_bindgen_24ec481b90601a40
+  :: BG.Ptr SDL_GPUDevice
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_24ec481b90601a40 =
+  BG.fromFFIType hs_bindgen_24ec481b90601a40_base
+
+-- | Get the properties associated with a GPU device.
+--
+--     All properties are optional and may differ between GPU backends and SDL versions.
+--
+--     The following properties are provided by SDL:
+--
+--     @'sDL_PROP_GPU_DEVICE_NAME_STRING'@: Contains the name of the underlying device as reported by the system driver. This string has no standardized 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.
+--
+--     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 15D8: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 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.
+--
+--     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-00eac0.824c4f31403fb1fbf8ee1042422c2129
+--
+--     This string has also been observed to be a multiline string (which has a trailing newline):
+--
+--     @
+--     Driver Build: 85da404, I46ff5fc46f, 1606794520
+--     Date: 11\/30\/20
+--     Compiler Version: EV031.31.04.01
+--     Driver Branch: promo490_3_Google
+--     @
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetGPUDeviceProperties@, defined at @SDL3\/SDL_gpu.h 2577:46@
+sDL_GetGPUDeviceProperties
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetGPUDeviceProperties =
+  hs_bindgen_24ec481b90601a40
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUComputePipeline@
+foreign import ccall safe "hs_bindgen_be9942ef43a30dbb"
+  hs_bindgen_be9942ef43a30dbb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUComputePipeline@
+hs_bindgen_be9942ef43a30dbb
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUComputePipelineCreateInfo
+  -> IO (BG.Ptr SDL_GPUComputePipeline)
+hs_bindgen_be9942ef43a30dbb =
+  BG.fromFFIType hs_bindgen_be9942ef43a30dbb_base
+
+-- | Creates a pipeline object to be used in a compute workflow.
+--
+--     Shader resource bindings must be authored to follow a particular order depending on the shader format.
+--
+--     For SPIR-V shaders, use the following resource sets:
+--
+--     * 0: Sampled textures, followed by read-only storage textures, followed by read-only storage buffers
+--
+--     * 1: Read-write storage textures, followed by read-write storage buffers
+--
+--     * 2: Uniform buffers
+--
+--     For DXBC and DXIL shaders, use the following register order:
+--
+--     * (t[n], space0): Sampled textures, followed by read-only storage textures, followed by read-only storage buffers
+--
+--     * (u[n], space1): Read-write storage textures, followed by read-write storage buffers
+--
+--     * (b[n], space2): Uniform buffers
+--
+--     For MSL\/metallib, use the following order:
+--
+--     * [[buffer]]: Uniform buffers, followed by read-only storage buffers, followed by read-write storage buffers
+--
+--     * [[texture]]: Sampled textures, followed by read-only storage textures, followed by read-write storage textures
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a compute pipeline object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindGPUComputePipeline', 'sDL_ReleaseGPUComputePipeline'
+--
+--     [C declaration]: @SDL_CreateGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 2632:54@
+sDL_CreateGPUComputePipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUComputePipelineCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the compute pipeline to create.
+  -> IO (BG.Ptr SDL_GPUComputePipeline)
+sDL_CreateGPUComputePipeline =
+  hs_bindgen_be9942ef43a30dbb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUGraphicsPipeline@
+foreign import ccall safe "hs_bindgen_3a818324fc7c3f58"
+  hs_bindgen_3a818324fc7c3f58_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUGraphicsPipeline@
+hs_bindgen_3a818324fc7c3f58
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUGraphicsPipelineCreateInfo
+  -> IO (BG.Ptr SDL_GPUGraphicsPipeline)
+hs_bindgen_3a818324fc7c3f58 =
+  BG.fromFFIType hs_bindgen_3a818324fc7c3f58_base
+
+-- | Creates a pipeline object to be used in a graphics workflow.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a graphics pipeline object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader', 'sDL_BindGPUGraphicsPipeline', 'sDL_ReleaseGPUGraphicsPipeline'
+--
+--     [C declaration]: @SDL_CreateGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 2659:55@
+sDL_CreateGPUGraphicsPipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUGraphicsPipelineCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the graphics pipeline to create.
+  -> IO (BG.Ptr SDL_GPUGraphicsPipeline)
+sDL_CreateGPUGraphicsPipeline =
+  hs_bindgen_3a818324fc7c3f58
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUSampler@
+foreign import ccall safe "hs_bindgen_604bbac908c436aa"
+  hs_bindgen_604bbac908c436aa_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUSampler@
+hs_bindgen_604bbac908c436aa
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUSamplerCreateInfo
+  -> IO (BG.Ptr SDL_GPUSampler)
+hs_bindgen_604bbac908c436aa =
+  BG.fromFFIType hs_bindgen_604bbac908c436aa_base
+
+-- | Creates a sampler object to be used when binding textures in a graphics workflow.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a sampler object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindGPUVertexSamplers', 'sDL_BindGPUFragmentSamplers', 'sDL_ReleaseGPUSampler'
+--
+--     [C declaration]: @SDL_CreateGPUSampler@, defined at @SDL3\/SDL_gpu.h 2686:46@
+sDL_CreateGPUSampler
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUSamplerCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the sampler to create.
+  -> IO (BG.Ptr SDL_GPUSampler)
+sDL_CreateGPUSampler = hs_bindgen_604bbac908c436aa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUShader@
+foreign import ccall safe "hs_bindgen_3b5c95e61238095a"
+  hs_bindgen_3b5c95e61238095a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUShader@
+hs_bindgen_3b5c95e61238095a
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUShaderCreateInfo
+  -> IO (BG.Ptr SDL_GPUShader)
+hs_bindgen_3b5c95e61238095a =
+  BG.fromFFIType hs_bindgen_3b5c95e61238095a_base
+
+-- | Creates a shader to be used when creating a graphics pipeline.
+--
+--     Shader resource bindings must be authored to follow a particular order depending on the shader format.
+--
+--     For SPIR-V shaders, use the following resource sets:
+--
+--     For vertex shaders:
+--
+--     * 0: Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * 1: Uniform buffers
+--
+--     For fragment shaders:
+--
+--     * 2: Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * 3: Uniform buffers
+--
+--     For DXBC and DXIL shaders, use the following register order:
+--
+--     For vertex shaders:
+--
+--     * (t[n], space0): Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * (s[n], space0): Samplers with indices corresponding to the sampled textures
+--
+--     * (b[n], space1): Uniform buffers
+--
+--     For pixel shaders:
+--
+--     * (t[n], space2): Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * (s[n], space2): Samplers with indices corresponding to the sampled textures
+--
+--     * (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
+--
+--     * [[buffer]]: Uniform buffers, followed by storage buffers. Vertex buffer 0 is bound at [[buffer(14)]], vertex buffer 1 at [[buffer(15)]], and so on. Rather than manually authoring vertex buffer indices, use the [[stage_in]] attribute which will automatically use the vertex input information from the 'SDL_GPUGraphicsPipeline'.
+--
+--     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 SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING with @SDL_CreateGPUDeviceWithProperties()@.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_SHADER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a shader object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline', 'sDL_ReleaseGPUShader'
+--
+--     [C declaration]: @SDL_CreateGPUShader@, defined at @SDL3\/SDL_gpu.h 2765:45@
+sDL_CreateGPUShader
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUShaderCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the shader to create.
+  -> IO (BG.Ptr SDL_GPUShader)
+sDL_CreateGPUShader = hs_bindgen_3b5c95e61238095a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUTexture@
+foreign import ccall safe "hs_bindgen_c6685129d00ec509"
+  hs_bindgen_c6685129d00ec509_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUTexture@
+hs_bindgen_c6685129d00ec509
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUTextureCreateInfo
+  -> IO (BG.Ptr SDL_GPUTexture)
+hs_bindgen_c6685129d00ec509 =
+  BG.fromFFIType hs_bindgen_c6685129d00ec509_base
+
+-- | Creates a texture object to be used in graphics or compute workflows.
+--
+--     The contents of this texture are undefined until data is written to the texture, either via SDL_UploadToGPUTexture or by performing a render or compute pass with this texture as a target.
+--
+--     Note that certain combinations of usage flags are invalid. For example, a texture cannot have both the SAMPLER and GRAPHICS_STORAGE_READ flags.
+--
+--     If you request a sample count higher than the hardware supports, the implementation will automatically fall back to the highest available sample count.
+--
+--     There are optional properties that can be provided through 'SDL_GPUTextureCreateInfo' \'s @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this red intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this green intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this blue intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this alpha intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear the texture to a depth of this value. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear the texture to a stencil of this Uint8 value. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a texture object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUTexture', 'sDL_DownloadFromGPUTexture', 'sDL_BeginGPURenderPass', 'sDL_BeginGPUComputePass', 'sDL_BindGPUVertexSamplers', 'sDL_BindGPUVertexStorageTextures', 'sDL_BindGPUFragmentSamplers', 'sDL_BindGPUFragmentStorageTextures', 'sDL_BindGPUComputeStorageTextures', 'sDL_BlitGPUTexture', 'sDL_ReleaseGPUTexture', 'sDL_GPUTextureSupportsFormat'
+--
+--     [C declaration]: @SDL_CreateGPUTexture@, defined at @SDL3\/SDL_gpu.h 2829:46@
+sDL_CreateGPUTexture
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUTextureCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the texture to create.
+  -> IO (BG.Ptr SDL_GPUTexture)
+sDL_CreateGPUTexture = hs_bindgen_c6685129d00ec509
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUBuffer@
+foreign import ccall safe "hs_bindgen_5eca6d3125b183e7"
+  hs_bindgen_5eca6d3125b183e7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUBuffer@
+hs_bindgen_5eca6d3125b183e7
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUBufferCreateInfo
+  -> IO (BG.Ptr SDL_GPUBuffer)
+hs_bindgen_5eca6d3125b183e7 =
+  BG.fromFFIType hs_bindgen_5eca6d3125b183e7_base
+
+-- | Creates a buffer object to be used in graphics or compute workflows.
+--
+--     The contents of this buffer are undefined until data is written to the buffer.
+--
+--     Note that certain combinations of usage flags are invalid. For example, a buffer cannot have both the VERTEX and INDEX flags.
+--
+--     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.
+--
+--     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/) There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_BUFFER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a buffer object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUBuffer', 'sDL_DownloadFromGPUBuffer', 'sDL_CopyGPUBufferToBuffer', 'sDL_BindGPUVertexBuffers', 'sDL_BindGPUIndexBuffer', 'sDL_BindGPUVertexStorageBuffers', 'sDL_BindGPUFragmentStorageBuffers', 'sDL_DrawGPUPrimitivesIndirect', 'sDL_DrawGPUIndexedPrimitivesIndirect', 'sDL_BindGPUComputeStorageBuffers', 'sDL_DispatchGPUComputeIndirect', 'sDL_ReleaseGPUBuffer'
+--
+--     [C declaration]: @SDL_CreateGPUBuffer@, defined at @SDL3\/SDL_gpu.h 2885:45@
+sDL_CreateGPUBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUBufferCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the buffer to create.
+  -> IO (BG.Ptr SDL_GPUBuffer)
+sDL_CreateGPUBuffer = hs_bindgen_5eca6d3125b183e7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUTransferBuffer@
+foreign import ccall safe "hs_bindgen_646007cc8d60e8f1"
+  hs_bindgen_646007cc8d60e8f1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CreateGPUTransferBuffer@
+hs_bindgen_646007cc8d60e8f1
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUTransferBufferCreateInfo
+  -> IO (BG.Ptr SDL_GPUTransferBuffer)
+hs_bindgen_646007cc8d60e8f1 =
+  BG.fromFFIType hs_bindgen_646007cc8d60e8f1_base
+
+-- | Creates a transfer buffer to be used when uploading to or downloading from graphics resources.
+--
+--     Download buffers can be particularly expensive to create, so it is good practice to reuse them if data will be downloaded regularly.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a transfer buffer on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUBuffer', 'sDL_DownloadFromGPUBuffer', 'sDL_UploadToGPUTexture', 'sDL_DownloadFromGPUTexture', 'sDL_ReleaseGPUTransferBuffer'
+--
+--     [C declaration]: @SDL_CreateGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 2918:53@
+sDL_CreateGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the transfer buffer to create.
+  -> IO (BG.Ptr SDL_GPUTransferBuffer)
+sDL_CreateGPUTransferBuffer =
+  hs_bindgen_646007cc8d60e8f1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUBufferName@
+foreign import ccall safe "hs_bindgen_35249b94fcee0ae6"
+  hs_bindgen_35249b94fcee0ae6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUBufferName@
+hs_bindgen_35249b94fcee0ae6
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUBuffer
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_35249b94fcee0ae6 =
+  BG.fromFFIType hs_bindgen_35249b94fcee0ae6_base
+
+-- | Sets an arbitrary string constant to label a buffer.
+--
+--     You should use SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING with SDL_CreateGPUBuffer instead of this function to avoid thread safety issues.
+--
+--     [Thread safety]: This function is not thread safe, you must make sure the buffer is not simultaneously used by any other thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUBuffer'
+--
+--     [C declaration]: @SDL_SetGPUBufferName@, defined at @SDL3\/SDL_gpu.h 2943:34@
+sDL_SetGPUBufferName
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer to attach the name to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to mark as the name of the buffer.
+  -> IO ()
+sDL_SetGPUBufferName = hs_bindgen_35249b94fcee0ae6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUTextureName@
+foreign import ccall safe "hs_bindgen_21f5dad8cd3caba0"
+  hs_bindgen_21f5dad8cd3caba0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUTextureName@
+hs_bindgen_21f5dad8cd3caba0
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUTexture
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_21f5dad8cd3caba0 =
+  BG.fromFFIType hs_bindgen_21f5dad8cd3caba0_base
+
+-- | Sets an arbitrary string constant to label a texture.
+--
+--     You should use SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING with SDL_CreateGPUTexture instead of this function to avoid thread safety issues.
+--
+--     [Thread safety]: This function is not thread safe, you must make sure the texture is not simultaneously used by any other thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTexture'
+--
+--     [C declaration]: @SDL_SetGPUTextureName@, defined at @SDL3\/SDL_gpu.h 2966:34@
+sDL_SetGPUTextureName
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture to attach the name to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to mark as the name of the texture.
+  -> IO ()
+sDL_SetGPUTextureName = hs_bindgen_21f5dad8cd3caba0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_InsertGPUDebugLabel@
+foreign import ccall safe "hs_bindgen_e540ee9c7b74b716"
+  hs_bindgen_e540ee9c7b74b716_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_InsertGPUDebugLabel@
+hs_bindgen_e540ee9c7b74b716
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_e540ee9c7b74b716 =
+  BG.fromFFIType hs_bindgen_e540ee9c7b74b716_base
+
+-- | Inserts an arbitrary string label into the command buffer callstream.
+--
+--     Useful for debugging.
+--
+--     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/) for instructions on how to obtain it.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_InsertGPUDebugLabel@, defined at @SDL3\/SDL_gpu.h 2987:34@
+sDL_InsertGPUDebugLabel
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to insert as the label.
+  -> IO ()
+sDL_InsertGPUDebugLabel = hs_bindgen_e540ee9c7b74b716
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_PushGPUDebugGroup@
+foreign import ccall safe "hs_bindgen_6cf1d5f7ad48ca4b"
+  hs_bindgen_6cf1d5f7ad48ca4b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_PushGPUDebugGroup@
+hs_bindgen_6cf1d5f7ad48ca4b
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_6cf1d5f7ad48ca4b =
+  BG.fromFFIType hs_bindgen_6cf1d5f7ad48ca4b_base
+
+-- | Begins a debug group with an arbitrary name.
+--
+--     Used for denoting groups of calls when viewing the command buffer callstream in a graphics debugging tool.
+--
+--     Each call to SDL_PushGPUDebugGroup must have a corresponding call to SDL_PopGPUDebugGroup.
+--
+--     On Direct3D 12, using SDL_PushGPUDebugGroup requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable. See [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) for instructions on how to obtain it.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PopGPUDebugGroup'
+--
+--     [C declaration]: @SDL_PushGPUDebugGroup@, defined at @SDL3\/SDL_gpu.h 3017:34@
+sDL_PushGPUDebugGroup
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: a UTF-8 string constant that names the group.
+  -> IO ()
+sDL_PushGPUDebugGroup = hs_bindgen_6cf1d5f7ad48ca4b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_PopGPUDebugGroup@
+foreign import ccall safe "hs_bindgen_c82fe0d95b63b068"
+  hs_bindgen_c82fe0d95b63b068_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_PopGPUDebugGroup@
+hs_bindgen_c82fe0d95b63b068
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> IO ()
+hs_bindgen_c82fe0d95b63b068 =
+  BG.fromFFIType hs_bindgen_c82fe0d95b63b068_base
+
+-- | Ends the most-recently pushed debug group.
+--
+--     On Direct3D 12, using SDL_PopGPUDebugGroup requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable. See [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) for instructions on how to obtain it.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PushGPUDebugGroup'
+--
+--     [C declaration]: @SDL_PopGPUDebugGroup@, defined at @SDL3\/SDL_gpu.h 3035:34@
+sDL_PopGPUDebugGroup
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO ()
+sDL_PopGPUDebugGroup = hs_bindgen_c82fe0d95b63b068
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUTexture@
+foreign import ccall safe "hs_bindgen_367c147bedca1380"
+  hs_bindgen_367c147bedca1380_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUTexture@
+hs_bindgen_367c147bedca1380
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUTexture
+  -> IO ()
+hs_bindgen_367c147bedca1380 =
+  BG.fromFFIType hs_bindgen_367c147bedca1380_base
+
+-- | Frees the given texture as soon as it is safe to do so.
+--
+--     You must not reference the texture after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUTexture@, defined at @SDL3\/SDL_gpu.h 3050:34@
+sDL_ReleaseGPUTexture
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUTexture = hs_bindgen_367c147bedca1380
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUSampler@
+foreign import ccall safe "hs_bindgen_9d27e7a735191637"
+  hs_bindgen_9d27e7a735191637_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUSampler@
+hs_bindgen_9d27e7a735191637
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUSampler
+  -> IO ()
+hs_bindgen_9d27e7a735191637 =
+  BG.fromFFIType hs_bindgen_9d27e7a735191637_base
+
+-- | Frees the given sampler as soon as it is safe to do so.
+--
+--     You must not reference the sampler after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUSampler@, defined at @SDL3\/SDL_gpu.h 3064:34@
+sDL_ReleaseGPUSampler
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUSampler
+  -- ^
+  --
+  --           [@sampler@]: a sampler to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUSampler = hs_bindgen_9d27e7a735191637
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUBuffer@
+foreign import ccall safe "hs_bindgen_bc73e63cd04b292b"
+  hs_bindgen_bc73e63cd04b292b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUBuffer@
+hs_bindgen_bc73e63cd04b292b
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUBuffer
+  -> IO ()
+hs_bindgen_bc73e63cd04b292b =
+  BG.fromFFIType hs_bindgen_bc73e63cd04b292b_base
+
+-- | Frees the given buffer as soon as it is safe to do so.
+--
+--     You must not reference the buffer after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUBuffer@, defined at @SDL3\/SDL_gpu.h 3078:34@
+sDL_ReleaseGPUBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUBuffer = hs_bindgen_bc73e63cd04b292b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUTransferBuffer@
+foreign import ccall safe "hs_bindgen_8e038ae5b291e93f"
+  hs_bindgen_8e038ae5b291e93f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUTransferBuffer@
+hs_bindgen_8e038ae5b291e93f
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -> IO ()
+hs_bindgen_8e038ae5b291e93f =
+  BG.fromFFIType hs_bindgen_8e038ae5b291e93f_base
+
+-- | Frees the given transfer buffer as soon as it is safe to do so.
+--
+--     You must not reference the transfer buffer after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3092:34@
+sDL_ReleaseGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a transfer buffer to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUTransferBuffer =
+  hs_bindgen_8e038ae5b291e93f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUComputePipeline@
+foreign import ccall safe "hs_bindgen_2ebc397e9dad3697"
+  hs_bindgen_2ebc397e9dad3697_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUComputePipeline@
+hs_bindgen_2ebc397e9dad3697
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUComputePipeline
+  -> IO ()
+hs_bindgen_2ebc397e9dad3697 =
+  BG.fromFFIType hs_bindgen_2ebc397e9dad3697_base
+
+-- | Frees the given compute pipeline as soon as it is safe to do so.
+--
+--     You must not reference the compute pipeline after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 3106:34@
+sDL_ReleaseGPUComputePipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUComputePipeline
+  -- ^
+  --
+  --           [@compute_pipeline@]: a compute pipeline to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUComputePipeline =
+  hs_bindgen_2ebc397e9dad3697
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUShader@
+foreign import ccall safe "hs_bindgen_be87d6210d892952"
+  hs_bindgen_be87d6210d892952_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUShader@
+hs_bindgen_be87d6210d892952
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUShader
+  -> IO ()
+hs_bindgen_be87d6210d892952 =
+  BG.fromFFIType hs_bindgen_be87d6210d892952_base
+
+-- | Frees the given shader as soon as it is safe to do so.
+--
+--     You must not reference the shader after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUShader@, defined at @SDL3\/SDL_gpu.h 3120:34@
+sDL_ReleaseGPUShader
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUShader
+  -- ^
+  --
+  --           [@shader@]: a shader to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUShader = hs_bindgen_be87d6210d892952
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUGraphicsPipeline@
+foreign import ccall safe "hs_bindgen_c2a4e9cdd147b21b"
+  hs_bindgen_c2a4e9cdd147b21b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUGraphicsPipeline@
+hs_bindgen_c2a4e9cdd147b21b
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -> IO ()
+hs_bindgen_c2a4e9cdd147b21b =
+  BG.fromFFIType hs_bindgen_c2a4e9cdd147b21b_base
+
+-- | Frees the given graphics pipeline as soon as it is safe to do so.
+--
+--     You must not reference the graphics pipeline after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 3134:34@
+sDL_ReleaseGPUGraphicsPipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -- ^
+  --
+  --           [@graphics_pipeline@]: a graphics pipeline to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUGraphicsPipeline =
+  hs_bindgen_c2a4e9cdd147b21b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_AcquireGPUCommandBuffer@
+foreign import ccall safe "hs_bindgen_92149d0718fb8464"
+  hs_bindgen_92149d0718fb8464_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_AcquireGPUCommandBuffer@
+hs_bindgen_92149d0718fb8464
+  :: BG.Ptr SDL_GPUDevice
+  -> IO (BG.Ptr SDL_GPUCommandBuffer)
+hs_bindgen_92149d0718fb8464 =
+  BG.fromFFIType hs_bindgen_92149d0718fb8464_base
+
+-- | Acquire a command buffer.
+--
+--     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.
+--
+--     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.
+--
+--     [Returns]: a command buffer, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBuffer', 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_AcquireGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 3162:52@
+sDL_AcquireGPUCommandBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> IO (BG.Ptr SDL_GPUCommandBuffer)
+sDL_AcquireGPUCommandBuffer =
+  hs_bindgen_92149d0718fb8464
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_PushGPUVertexUniformData@
+foreign import ccall safe "hs_bindgen_af2096650fa2d8d0"
+  hs_bindgen_af2096650fa2d8d0_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_PushGPUVertexUniformData@
+hs_bindgen_af2096650fa2d8d0
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_af2096650fa2d8d0 =
+  BG.fromFFIType hs_bindgen_af2096650fa2d8d0_base
+
+-- | Pushes data to a vertex uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     For detailed information about accessing uniform data from a shader, please refer to SDL_CreateGPUShader.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PushGPUVertexUniformData@, defined at @SDL3\/SDL_gpu.h 3186:34@
+sDL_PushGPUVertexUniformData
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@slot_index@]: the vertex uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+sDL_PushGPUVertexUniformData =
+  hs_bindgen_af2096650fa2d8d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_PushGPUFragmentUniformData@
+foreign import ccall safe "hs_bindgen_d777c2d66931c0d7"
+  hs_bindgen_d777c2d66931c0d7_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_PushGPUFragmentUniformData@
+hs_bindgen_d777c2d66931c0d7
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_d777c2d66931c0d7 =
+  BG.fromFFIType hs_bindgen_d777c2d66931c0d7_base
+
+-- | Pushes data to a fragment uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PushGPUFragmentUniformData@, defined at @SDL3\/SDL_gpu.h 3208:34@
+sDL_PushGPUFragmentUniformData
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@slot_index@]: the fragment uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+sDL_PushGPUFragmentUniformData =
+  hs_bindgen_d777c2d66931c0d7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_PushGPUComputeUniformData@
+foreign import ccall safe "hs_bindgen_c40f02ecbf0d1f10"
+  hs_bindgen_c40f02ecbf0d1f10_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_PushGPUComputeUniformData@
+hs_bindgen_c40f02ecbf0d1f10
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_c40f02ecbf0d1f10 =
+  BG.fromFFIType hs_bindgen_c40f02ecbf0d1f10_base
+
+-- | Pushes data to a uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PushGPUComputeUniformData@, defined at @SDL3\/SDL_gpu.h 3230:34@
+sDL_PushGPUComputeUniformData
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@slot_index@]: the uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+sDL_PushGPUComputeUniformData =
+  hs_bindgen_c40f02ecbf0d1f10
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BeginGPURenderPass@
+foreign import ccall safe "hs_bindgen_5d064478a0820b2c"
+  hs_bindgen_5d064478a0820b2c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BeginGPURenderPass@
+hs_bindgen_5d064478a0820b2c
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> PtrConst.PtrConst SDL_GPUColorTargetInfo
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUDepthStencilTargetInfo
+  -> IO (BG.Ptr SDL_GPURenderPass)
+hs_bindgen_5d064478a0820b2c =
+  BG.fromFFIType hs_bindgen_5d064478a0820b2c_base
+
+-- | Begins a render pass on a command buffer.
+--
+--     A render pass consists of a set of texture subresources (or depth slices in the 3D 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.
+--
+--     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.
+--
+--     [Returns]: a render pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EndGPURenderPass'
+--
+--     [C declaration]: @SDL_BeginGPURenderPass@, defined at @SDL3\/SDL_gpu.h 3271:49@
+sDL_BeginGPURenderPass
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUColorTargetInfo
+  -- ^
+  --
+  --           [@color_target_infos@]: an array of texture subresources with corresponding clear values and load\/store ops.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_color_targets@]: the number of color targets in the color_target_infos array.
+  -> PtrConst.PtrConst SDL_GPUDepthStencilTargetInfo
+  -- ^
+  --
+  --           [@depth_stencil_target_info@]: a texture subresource with corresponding clear value and load\/store ops, may be NULL.
+  -> IO (BG.Ptr SDL_GPURenderPass)
+sDL_BeginGPURenderPass = hs_bindgen_5d064478a0820b2c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUGraphicsPipeline@
+foreign import ccall safe "hs_bindgen_43b6f6578491ba7f"
+  hs_bindgen_43b6f6578491ba7f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUGraphicsPipeline@
+hs_bindgen_43b6f6578491ba7f
+  :: BG.Ptr SDL_GPURenderPass
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -> IO ()
+hs_bindgen_43b6f6578491ba7f =
+  BG.fromFFIType hs_bindgen_43b6f6578491ba7f_base
+
+-- | Binds a graphics pipeline on a render pass to be used in rendering.
+--
+--     A graphics pipeline must be bound before making any draw calls.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 3287:34@
+sDL_BindGPUGraphicsPipeline
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -- ^
+  --
+  --           [@graphics_pipeline@]: the graphics pipeline to bind.
+  -> IO ()
+sDL_BindGPUGraphicsPipeline =
+  hs_bindgen_43b6f6578491ba7f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUViewport@
+foreign import ccall safe "hs_bindgen_710986e3fd99ba6a"
+  hs_bindgen_710986e3fd99ba6a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUViewport@
+hs_bindgen_710986e3fd99ba6a
+  :: BG.Ptr SDL_GPURenderPass
+  -> PtrConst.PtrConst SDL_GPUViewport
+  -> IO ()
+hs_bindgen_710986e3fd99ba6a =
+  BG.fromFFIType hs_bindgen_710986e3fd99ba6a_base
+
+-- | Sets the current viewport state on a command buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUViewport@, defined at @SDL3\/SDL_gpu.h 3299:34@
+sDL_SetGPUViewport
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL_GPUViewport
+  -- ^
+  --
+  --           [@viewport@]: the viewport to set.
+  -> IO ()
+sDL_SetGPUViewport = hs_bindgen_710986e3fd99ba6a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUScissor@
+foreign import ccall safe "hs_bindgen_8e81e30e4f1e1924"
+  hs_bindgen_8e81e30e4f1e1924_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUScissor@
+hs_bindgen_8e81e30e4f1e1924
+  :: BG.Ptr SDL_GPURenderPass
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO ()
+hs_bindgen_8e81e30e4f1e1924 =
+  BG.fromFFIType hs_bindgen_8e81e30e4f1e1924_base
+
+-- | Sets the current scissor state on a command buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUScissor@, defined at @SDL3\/SDL_gpu.h 3311:34@
+sDL_SetGPUScissor
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@scissor@]: the scissor area to set.
+  -> IO ()
+sDL_SetGPUScissor = hs_bindgen_8e81e30e4f1e1924
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUBlendConstants@
+foreign import ccall safe "hs_bindgen_f727bad8e8b1ff3e"
+  hs_bindgen_f727bad8e8b1ff3e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUBlendConstants@
+hs_bindgen_f727bad8e8b1ff3e
+  :: BG.Ptr SDL_GPURenderPass
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -> IO ()
+hs_bindgen_f727bad8e8b1ff3e =
+  BG.fromFFIType hs_bindgen_f727bad8e8b1ff3e_base
+
+-- | Sets the current blend constants on a command buffer.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_GPU_BLENDFACTOR_CONSTANT_COLOR@, @SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR@
+--
+--     [C declaration]: @SDL_SetGPUBlendConstants@, defined at @SDL3\/SDL_gpu.h 3326:34@
+sDL_SetGPUBlendConstants
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^
+  --
+  --           [@blend_constants@]: the blend constant color.
+  -> IO ()
+sDL_SetGPUBlendConstants =
+  \render_pass0 ->
+    \blend_constants1 ->
+      BG.with
+        blend_constants1
+        ( \blend_constants2 ->
+            hs_bindgen_f727bad8e8b1ff3e render_pass0 blend_constants2
+        )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUStencilReference@
+foreign import ccall safe "hs_bindgen_4a62370048ec360b"
+  hs_bindgen_4a62370048ec360b_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUStencilReference@
+hs_bindgen_4a62370048ec360b
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO ()
+hs_bindgen_4a62370048ec360b =
+  BG.fromFFIType hs_bindgen_4a62370048ec360b_base
+
+-- | Sets the current stencil reference value on a command buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUStencilReference@, defined at @SDL3\/SDL_gpu.h 3338:34@
+sDL_SetGPUStencilReference
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@reference@]: the stencil reference value to set.
+  -> IO ()
+sDL_SetGPUStencilReference =
+  hs_bindgen_4a62370048ec360b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUVertexBuffers@
+foreign import ccall safe "hs_bindgen_6471bc849523bb14"
+  hs_bindgen_6471bc849523bb14_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUVertexBuffers@
+hs_bindgen_6471bc849523bb14
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_6471bc849523bb14 =
+  BG.fromFFIType hs_bindgen_6471bc849523bb14_base
+
+-- | Binds vertex buffers on a command buffer for use with subsequent draw calls.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUVertexBuffers@, defined at @SDL3\/SDL_gpu.h 3354:34@
+sDL_BindGPUVertexBuffers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex buffer slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -- ^
+  --
+  --           [@bindings@]: an array of 'SDL_GPUBufferBinding' structs containing vertex buffers and offset values.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of bindings in the bindings array.
+  -> IO ()
+sDL_BindGPUVertexBuffers =
+  hs_bindgen_6471bc849523bb14
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUIndexBuffer@
+foreign import ccall safe "hs_bindgen_084b99eea9396d40"
+  hs_bindgen_084b99eea9396d40_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUIndexBuffer@
+hs_bindgen_084b99eea9396d40
+  :: BG.Ptr SDL_GPURenderPass
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -> SDL_GPUIndexElementSize
+  -> IO ()
+hs_bindgen_084b99eea9396d40 =
+  BG.fromFFIType hs_bindgen_084b99eea9396d40_base
+
+-- | Binds an index buffer on a command buffer for use with subsequent draw calls.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUIndexBuffer@, defined at @SDL3\/SDL_gpu.h 3371:34@
+sDL_BindGPUIndexBuffer
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -- ^
+  --
+  --           [@binding@]: a pointer to a struct containing an index buffer and offset.
+  -> SDL_GPUIndexElementSize
+  -- ^
+  --
+  --           [@index_element_size@]: whether the index values in the buffer are 16- or 32-bit.
+  -> IO ()
+sDL_BindGPUIndexBuffer = hs_bindgen_084b99eea9396d40
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUVertexSamplers@
+foreign import ccall safe "hs_bindgen_d275601b49dec50a"
+  hs_bindgen_d275601b49dec50a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUVertexSamplers@
+hs_bindgen_d275601b49dec50a
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_d275601b49dec50a =
+  BG.fromFFIType hs_bindgen_d275601b49dec50a_base
+
+-- | Binds texture-sampler pairs for use on the vertex shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUVertexSamplers@, defined at @SDL3\/SDL_gpu.h 3395:34@
+sDL_BindGPUVertexSamplers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler pairs to bind from the array.
+  -> IO ()
+sDL_BindGPUVertexSamplers =
+  hs_bindgen_d275601b49dec50a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUVertexStorageTextures@
+foreign import ccall safe "hs_bindgen_66cc372794c2ef55"
+  hs_bindgen_66cc372794c2ef55_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUVertexStorageTextures@
+hs_bindgen_66cc372794c2ef55
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_66cc372794c2ef55 =
+  BG.fromFFIType hs_bindgen_66cc372794c2ef55_base
+
+-- | Binds storage textures for use on the vertex shader.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUVertexStorageTextures@, defined at @SDL3\/SDL_gpu.h 3419:34@
+sDL_BindGPUVertexStorageTextures
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage texture to bind from the array.
+  -> IO ()
+sDL_BindGPUVertexStorageTextures =
+  hs_bindgen_66cc372794c2ef55
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUVertexStorageBuffers@
+foreign import ccall safe "hs_bindgen_d7725fcd1492d52d"
+  hs_bindgen_d7725fcd1492d52d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUVertexStorageBuffers@
+hs_bindgen_d7725fcd1492d52d
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_d7725fcd1492d52d =
+  BG.fromFFIType hs_bindgen_d7725fcd1492d52d_base
+
+-- | Binds storage buffers for use on the vertex shader.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUVertexStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3443:34@
+sDL_BindGPUVertexStorageBuffers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of buffers.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of buffers to bind from the array.
+  -> IO ()
+sDL_BindGPUVertexStorageBuffers =
+  hs_bindgen_d7725fcd1492d52d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUFragmentSamplers@
+foreign import ccall safe "hs_bindgen_1a2c72585c211590"
+  hs_bindgen_1a2c72585c211590_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUFragmentSamplers@
+hs_bindgen_1a2c72585c211590
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_1a2c72585c211590 =
+  BG.fromFFIType hs_bindgen_1a2c72585c211590_base
+
+-- | Binds texture-sampler pairs for use on the fragment shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUFragmentSamplers@, defined at @SDL3\/SDL_gpu.h 3468:34@
+sDL_BindGPUFragmentSamplers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler pairs to bind from the array.
+  -> IO ()
+sDL_BindGPUFragmentSamplers =
+  hs_bindgen_1a2c72585c211590
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUFragmentStorageTextures@
+foreign import ccall safe "hs_bindgen_0714ec46b44519f0"
+  hs_bindgen_0714ec46b44519f0_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUFragmentStorageTextures@
+hs_bindgen_0714ec46b44519f0
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_0714ec46b44519f0 =
+  BG.fromFFIType hs_bindgen_0714ec46b44519f0_base
+
+-- | Binds storage textures for use on the fragment shader.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUFragmentStorageTextures@, defined at @SDL3\/SDL_gpu.h 3492:34@
+sDL_BindGPUFragmentStorageTextures
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage textures to bind from the array.
+  -> IO ()
+sDL_BindGPUFragmentStorageTextures =
+  hs_bindgen_0714ec46b44519f0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUFragmentStorageBuffers@
+foreign import ccall safe "hs_bindgen_2afe5342dbcdb8ac"
+  hs_bindgen_2afe5342dbcdb8ac_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUFragmentStorageBuffers@
+hs_bindgen_2afe5342dbcdb8ac
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_2afe5342dbcdb8ac =
+  BG.fromFFIType hs_bindgen_2afe5342dbcdb8ac_base
+
+-- | Binds storage buffers for use on the fragment shader.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUFragmentStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3516:34@
+sDL_BindGPUFragmentStorageBuffers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of storage buffers.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage buffers to bind from the array.
+  -> IO ()
+sDL_BindGPUFragmentStorageBuffers =
+  hs_bindgen_2afe5342dbcdb8ac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DrawGPUIndexedPrimitives@
+foreign import ccall safe "hs_bindgen_954941bccb6ac959"
+  hs_bindgen_954941bccb6ac959_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Int32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DrawGPUIndexedPrimitives@
+hs_bindgen_954941bccb6ac959
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_954941bccb6ac959 =
+  BG.fromFFIType hs_bindgen_954941bccb6ac959_base
+
+-- | Draws data using bound graphics state with an index buffer and instancing enabled.
+--
+--     You must not call this function before binding a graphics pipeline.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUIndexedPrimitives@, defined at @SDL3\/SDL_gpu.h 3547:34@
+sDL_DrawGPUIndexedPrimitives
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_indices@]: the number of indices to draw per instance.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_instances@]: the number of instances to draw.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_index@]: the starting index within the index buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@vertex_offset@]: value added to vertex index before indexing into the vertex buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_instance@]: the ID of the first instance to draw.
+  -> IO ()
+sDL_DrawGPUIndexedPrimitives =
+  hs_bindgen_954941bccb6ac959
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DrawGPUPrimitives@
+foreign import ccall safe "hs_bindgen_7e1d85570a924ed1"
+  hs_bindgen_7e1d85570a924ed1_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DrawGPUPrimitives@
+hs_bindgen_7e1d85570a924ed1
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_7e1d85570a924ed1 =
+  BG.fromFFIType hs_bindgen_7e1d85570a924ed1_base
+
+-- | Draws data using bound graphics state.
+--
+--     You must not call this function before binding a graphics pipeline.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUPrimitives@, defined at @SDL3\/SDL_gpu.h 3575:34@
+sDL_DrawGPUPrimitives
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_vertices@]: the number of vertices to draw.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_instances@]: the number of instances that will be drawn.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_vertex@]: the index of the first vertex to draw.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_instance@]: the ID of the first instance to draw.
+  -> IO ()
+sDL_DrawGPUPrimitives = hs_bindgen_7e1d85570a924ed1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DrawGPUPrimitivesIndirect@
+foreign import ccall safe "hs_bindgen_999f4bafc18ca643"
+  hs_bindgen_999f4bafc18ca643_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DrawGPUPrimitivesIndirect@
+hs_bindgen_999f4bafc18ca643
+  :: BG.Ptr SDL_GPURenderPass
+  -> BG.Ptr SDL_GPUBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_999f4bafc18ca643 =
+  BG.fromFFIType hs_bindgen_999f4bafc18ca643_base
+
+-- | Draws data using bound graphics state and with draw parameters set from a buffer.
+--
+--     The buffer must consist of tightly-packed draw parameter sets that each match the layout of 'SDL_GPUIndirectDrawCommand'. You must not call this function before binding a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUPrimitivesIndirect@, defined at @SDL3\/SDL_gpu.h 3598:34@
+sDL_DrawGPUPrimitivesIndirect
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing draw parameters.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the draw buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@draw_count@]: the number of draw parameter sets that should be read from the draw buffer.
+  -> IO ()
+sDL_DrawGPUPrimitivesIndirect =
+  hs_bindgen_999f4bafc18ca643
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DrawGPUIndexedPrimitivesIndirect@
+foreign import ccall safe "hs_bindgen_2564f3889af73a8f"
+  hs_bindgen_2564f3889af73a8f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DrawGPUIndexedPrimitivesIndirect@
+hs_bindgen_2564f3889af73a8f
+  :: BG.Ptr SDL_GPURenderPass
+  -> BG.Ptr SDL_GPUBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_2564f3889af73a8f =
+  BG.fromFFIType hs_bindgen_2564f3889af73a8f_base
+
+-- | Draws data using bound graphics state with an index buffer enabled and with draw parameters set from a buffer.
+--
+--     The buffer must consist of tightly-packed draw parameter sets that each match the layout of 'SDL_GPUIndexedIndirectDrawCommand'. You must not call this function before binding a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUIndexedPrimitivesIndirect@, defined at @SDL3\/SDL_gpu.h 3620:34@
+sDL_DrawGPUIndexedPrimitivesIndirect
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing draw parameters.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the draw buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@draw_count@]: the number of draw parameter sets that should be read from the draw buffer.
+  -> IO ()
+sDL_DrawGPUIndexedPrimitivesIndirect =
+  hs_bindgen_2564f3889af73a8f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_EndGPURenderPass@
+foreign import ccall safe "hs_bindgen_d2de9afaf4e7a298"
+  hs_bindgen_d2de9afaf4e7a298_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_EndGPURenderPass@
+hs_bindgen_d2de9afaf4e7a298
+  :: BG.Ptr SDL_GPURenderPass
+  -> IO ()
+hs_bindgen_d2de9afaf4e7a298 =
+  BG.fromFFIType hs_bindgen_d2de9afaf4e7a298_base
+
+-- | Ends the given render pass.
+--
+--     All bound graphics state on the render pass command buffer is unset. The render pass handle is now invalid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EndGPURenderPass@, defined at @SDL3\/SDL_gpu.h 3636:34@
+sDL_EndGPURenderPass
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> IO ()
+sDL_EndGPURenderPass = hs_bindgen_d2de9afaf4e7a298
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BeginGPUComputePass@
+foreign import ccall safe "hs_bindgen_04814702f1c40b5f"
+  hs_bindgen_04814702f1c40b5f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BeginGPUComputePass@
+hs_bindgen_04814702f1c40b5f
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> PtrConst.PtrConst SDL_GPUStorageTextureReadWriteBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUStorageBufferReadWriteBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO (BG.Ptr SDL_GPUComputePass)
+hs_bindgen_04814702f1c40b5f =
+  BG.fromFFIType hs_bindgen_04814702f1c40b5f_base
+
+-- | Begins a compute pass on a command buffer.
+--
+--     A compute pass is defined by a set of texture subresources and buffers that may be written to by compute pipelines. These textures and buffers must 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!
+--
+--     [Returns]: a compute pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EndGPUComputePass'
+--
+--     [C declaration]: @SDL_BeginGPUComputePass@, defined at @SDL3\/SDL_gpu.h 3678:50@
+sDL_BeginGPUComputePass
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUStorageTextureReadWriteBinding
+  -- ^
+  --
+  --           [@storage_texture_bindings@]: an array of writeable storage texture binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_storage_texture_bindings@]: the number of storage textures to bind from the array.
+  -> PtrConst.PtrConst SDL_GPUStorageBufferReadWriteBinding
+  -- ^
+  --
+  --           [@storage_buffer_bindings@]: an array of writeable storage buffer binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_storage_buffer_bindings@]: the number of storage buffers to bind from the array.
+  -> IO (BG.Ptr SDL_GPUComputePass)
+sDL_BeginGPUComputePass = hs_bindgen_04814702f1c40b5f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUComputePipeline@
+foreign import ccall safe "hs_bindgen_b04b2c08eaccdba1"
+  hs_bindgen_b04b2c08eaccdba1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUComputePipeline@
+hs_bindgen_b04b2c08eaccdba1
+  :: BG.Ptr SDL_GPUComputePass
+  -> BG.Ptr SDL_GPUComputePipeline
+  -> IO ()
+hs_bindgen_b04b2c08eaccdba1 =
+  BG.fromFFIType hs_bindgen_b04b2c08eaccdba1_base
+
+-- | Binds a compute pipeline on a command buffer for use in compute dispatch.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 3693:34@
+sDL_BindGPUComputePipeline
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Ptr SDL_GPUComputePipeline
+  -- ^
+  --
+  --           [@compute_pipeline@]: a compute pipeline to bind.
+  -> IO ()
+sDL_BindGPUComputePipeline =
+  hs_bindgen_b04b2c08eaccdba1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUComputeSamplers@
+foreign import ccall safe "hs_bindgen_94f4eed2a54840f8"
+  hs_bindgen_94f4eed2a54840f8_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUComputeSamplers@
+hs_bindgen_94f4eed2a54840f8
+  :: BG.Ptr SDL_GPUComputePass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_94f4eed2a54840f8 =
+  BG.fromFFIType hs_bindgen_94f4eed2a54840f8_base
+
+-- | Binds texture-sampler pairs for use on the compute shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUComputePipeline()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline'
+--
+--     [C declaration]: @SDL_BindGPUComputeSamplers@, defined at @SDL3\/SDL_gpu.h 3716:34@
+sDL_BindGPUComputeSamplers
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the compute sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler bindings to bind from the array.
+  -> IO ()
+sDL_BindGPUComputeSamplers =
+  hs_bindgen_94f4eed2a54840f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUComputeStorageTextures@
+foreign import ccall safe "hs_bindgen_f7ee457bab9d199a"
+  hs_bindgen_f7ee457bab9d199a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUComputeStorageTextures@
+hs_bindgen_f7ee457bab9d199a
+  :: BG.Ptr SDL_GPUComputePass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_f7ee457bab9d199a =
+  BG.fromFFIType hs_bindgen_f7ee457bab9d199a_base
+
+-- | Binds storage textures as readonly for use on the compute pipeline.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUComputePipeline()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline'
+--
+--     [C declaration]: @SDL_BindGPUComputeStorageTextures@, defined at @SDL3\/SDL_gpu.h 3740:34@
+sDL_BindGPUComputeStorageTextures
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the compute storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage textures to bind from the array.
+  -> IO ()
+sDL_BindGPUComputeStorageTextures =
+  hs_bindgen_f7ee457bab9d199a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUComputeStorageBuffers@
+foreign import ccall safe "hs_bindgen_641e269a64317ba1"
+  hs_bindgen_641e269a64317ba1_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BindGPUComputeStorageBuffers@
+hs_bindgen_641e269a64317ba1
+  :: BG.Ptr SDL_GPUComputePass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_641e269a64317ba1 =
+  BG.fromFFIType hs_bindgen_641e269a64317ba1_base
+
+-- | Binds storage buffers as readonly for use on the compute pipeline.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUComputePipeline()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline'
+--
+--     [C declaration]: @SDL_BindGPUComputeStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3764:34@
+sDL_BindGPUComputeStorageBuffers
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the compute storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of storage buffer binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage buffers to bind from the array.
+  -> IO ()
+sDL_BindGPUComputeStorageBuffers =
+  hs_bindgen_641e269a64317ba1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DispatchGPUCompute@
+foreign import ccall safe "hs_bindgen_bf60fb94f2ea8730"
+  hs_bindgen_bf60fb94f2ea8730_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DispatchGPUCompute@
+hs_bindgen_bf60fb94f2ea8730
+  :: BG.Ptr SDL_GPUComputePass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_bf60fb94f2ea8730 =
+  BG.fromFFIType hs_bindgen_bf60fb94f2ea8730_base
+
+-- | Dispatches compute work.
+--
+--     You must not call this function before binding a compute pipeline.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DispatchGPUCompute@, defined at @SDL3\/SDL_gpu.h 3790:34@
+sDL_DispatchGPUCompute
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@groupcount_x@]: number of local workgroups to dispatch in the X dimension.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@groupcount_y@]: number of local workgroups to dispatch in the Y dimension.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@groupcount_z@]: number of local workgroups to dispatch in the Z dimension.
+  -> IO ()
+sDL_DispatchGPUCompute = hs_bindgen_bf60fb94f2ea8730
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DispatchGPUComputeIndirect@
+foreign import ccall safe "hs_bindgen_0f44002961b2beb1"
+  hs_bindgen_0f44002961b2beb1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DispatchGPUComputeIndirect@
+hs_bindgen_0f44002961b2beb1
+  :: BG.Ptr SDL_GPUComputePass
+  -> BG.Ptr SDL_GPUBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_0f44002961b2beb1 =
+  BG.fromFFIType hs_bindgen_0f44002961b2beb1_base
+
+-- | Dispatches compute work with parameters set from a buffer.
+--
+--     The buffer layout should match the layout of 'SDL_GPUIndirectDispatchCommand'. You must not call this function before binding a compute pipeline.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DispatchGPUComputeIndirect@, defined at @SDL3\/SDL_gpu.h 3814:34@
+sDL_DispatchGPUComputeIndirect
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing dispatch parameters.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the dispatch buffer.
+  -> IO ()
+sDL_DispatchGPUComputeIndirect =
+  hs_bindgen_0f44002961b2beb1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_EndGPUComputePass@
+foreign import ccall safe "hs_bindgen_3dd5760089aac51a"
+  hs_bindgen_3dd5760089aac51a_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_EndGPUComputePass@
+hs_bindgen_3dd5760089aac51a
+  :: BG.Ptr SDL_GPUComputePass
+  -> IO ()
+hs_bindgen_3dd5760089aac51a =
+  BG.fromFFIType hs_bindgen_3dd5760089aac51a_base
+
+-- | Ends the current compute pass.
+--
+--     All bound compute state on the command buffer is unset. The compute pass handle is now invalid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EndGPUComputePass@, defined at @SDL3\/SDL_gpu.h 3829:34@
+sDL_EndGPUComputePass
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> IO ()
+sDL_EndGPUComputePass = hs_bindgen_3dd5760089aac51a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_MapGPUTransferBuffer@
+foreign import ccall safe "hs_bindgen_4482f6067e6e107e"
+  hs_bindgen_4482f6067e6e107e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_MapGPUTransferBuffer@
+hs_bindgen_4482f6067e6e107e
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -> BG.CBool
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_4482f6067e6e107e =
+  BG.fromFFIType hs_bindgen_4482f6067e6e107e_base
+
+-- | Maps a transfer buffer into application address space.
+--
+--     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.
+--
+--     [Returns]: the address of the mapped transfer buffer memory, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_MapGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3849:36@
+sDL_MapGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a transfer buffer.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the transfer buffer if it is already bound.
+  -> IO (BG.Ptr BG.Void)
+sDL_MapGPUTransferBuffer =
+  hs_bindgen_4482f6067e6e107e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_UnmapGPUTransferBuffer@
+foreign import ccall safe "hs_bindgen_231a5479716b178e"
+  hs_bindgen_231a5479716b178e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_UnmapGPUTransferBuffer@
+hs_bindgen_231a5479716b178e
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -> IO ()
+hs_bindgen_231a5479716b178e =
+  BG.fromFFIType hs_bindgen_231a5479716b178e_base
+
+-- | Unmaps a previously mapped transfer buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UnmapGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3862:34@
+sDL_UnmapGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a previously mapped transfer buffer.
+  -> IO ()
+sDL_UnmapGPUTransferBuffer =
+  hs_bindgen_231a5479716b178e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BeginGPUCopyPass@
+foreign import ccall safe "hs_bindgen_e6f2bf9a9fc498cb"
+  hs_bindgen_e6f2bf9a9fc498cb_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BeginGPUCopyPass@
+hs_bindgen_e6f2bf9a9fc498cb
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> IO (BG.Ptr SDL_GPUCopyPass)
+hs_bindgen_e6f2bf9a9fc498cb =
+  BG.fromFFIType hs_bindgen_e6f2bf9a9fc498cb_base
+
+-- | Begins a copy pass on a command buffer.
+--
+--     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.
+--
+--     [Returns]: a copy pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EndGPUCopyPass'
+--
+--     [C declaration]: @SDL_BeginGPUCopyPass@, defined at @SDL3\/SDL_gpu.h 3882:47@
+sDL_BeginGPUCopyPass
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO (BG.Ptr SDL_GPUCopyPass)
+sDL_BeginGPUCopyPass = hs_bindgen_e6f2bf9a9fc498cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_UploadToGPUTexture@
+foreign import ccall safe "hs_bindgen_01d377001aa72f60"
+  hs_bindgen_01d377001aa72f60_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_UploadToGPUTexture@
+hs_bindgen_01d377001aa72f60
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_01d377001aa72f60 =
+  BG.fromFFIType hs_bindgen_01d377001aa72f60_base
+
+-- | Uploads data from a transfer buffer to a texture.
+--
+--     The upload occurs on the GPU timeline. You may assume that the upload has finished in subsequent commands.
+--
+--     You must align the data in the transfer buffer to a multiple of the texel size of the texture format.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UploadToGPUTexture@, defined at @SDL3\/SDL_gpu.h 3902:34@
+sDL_UploadToGPUTexture
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -- ^
+  --
+  --           [@source@]: the source transfer buffer with image layout information.
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -- ^
+  --
+  --           [@destination@]: the destination texture region.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the texture if the texture is bound, otherwise overwrites the data.
+  -> IO ()
+sDL_UploadToGPUTexture = hs_bindgen_01d377001aa72f60
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_UploadToGPUBuffer@
+foreign import ccall safe "hs_bindgen_6e1f7474e78322ce"
+  hs_bindgen_6e1f7474e78322ce_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_UploadToGPUBuffer@
+hs_bindgen_6e1f7474e78322ce
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_6e1f7474e78322ce =
+  BG.fromFFIType hs_bindgen_6e1f7474e78322ce_base
+
+-- | Uploads data from a transfer buffer to a buffer.
+--
+--     The upload occurs on the GPU timeline. You may assume that the upload has finished in subsequent commands.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UploadToGPUBuffer@, defined at @SDL3\/SDL_gpu.h 3922:34@
+sDL_UploadToGPUBuffer
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -- ^
+  --
+  --           [@source@]: the source transfer buffer with offset.
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -- ^
+  --
+  --           [@destination@]: the destination buffer with offset and size.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the buffer if it is already bound, otherwise overwrites the data.
+  -> IO ()
+sDL_UploadToGPUBuffer = hs_bindgen_6e1f7474e78322ce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CopyGPUTextureToTexture@
+foreign import ccall safe "hs_bindgen_918f11a3023e9438"
+  hs_bindgen_918f11a3023e9438_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CopyGPUTextureToTexture@
+hs_bindgen_918f11a3023e9438
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_918f11a3023e9438 =
+  BG.fromFFIType hs_bindgen_918f11a3023e9438_base
+
+-- | Performs a texture-to-texture copy.
+--
+--     This copy occurs on the GPU timeline. You may assume the copy has finished in subsequent commands.
+--
+--     This function does not support copying between depth and color textures. For those, copy the texture to a buffer and then to the destination texture.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyGPUTextureToTexture@, defined at @SDL3\/SDL_gpu.h 3949:34@
+sDL_CopyGPUTextureToTexture
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -- ^
+  --
+  --           [@source@]: a source texture region.
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -- ^
+  --
+  --           [@destination@]: a destination texture region.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@w@]: the width of the region to copy.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@h@]: the height of the region to copy.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@d@]: the depth of the region to copy.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the destination texture if the destination texture is bound, otherwise overwrites the data.
+  -> IO ()
+sDL_CopyGPUTextureToTexture =
+  hs_bindgen_918f11a3023e9438
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CopyGPUBufferToBuffer@
+foreign import ccall safe "hs_bindgen_7075b4fcc48051e5"
+  hs_bindgen_7075b4fcc48051e5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CopyGPUBufferToBuffer@
+hs_bindgen_7075b4fcc48051e5
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_7075b4fcc48051e5 =
+  BG.fromFFIType hs_bindgen_7075b4fcc48051e5_base
+
+-- | Performs a buffer-to-buffer copy.
+--
+--     This copy occurs on the GPU timeline. You may assume the copy has finished in subsequent commands.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyGPUBufferToBuffer@, defined at @SDL3\/SDL_gpu.h 3973:34@
+sDL_CopyGPUBufferToBuffer
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -- ^
+  --
+  --           [@source@]: the buffer and offset to copy from.
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -- ^
+  --
+  --           [@destination@]: the buffer and offset to copy to.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@size@]: the length of the buffer to copy.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the destination buffer if it is already bound, otherwise overwrites the data.
+  -> IO ()
+sDL_CopyGPUBufferToBuffer =
+  hs_bindgen_7075b4fcc48051e5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DownloadFromGPUTexture@
+foreign import ccall safe "hs_bindgen_26b4b49d8544fb8f"
+  hs_bindgen_26b4b49d8544fb8f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DownloadFromGPUTexture@
+hs_bindgen_26b4b49d8544fb8f
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -> IO ()
+hs_bindgen_26b4b49d8544fb8f =
+  BG.fromFFIType hs_bindgen_26b4b49d8544fb8f_base
+
+-- | Copies data from a texture to a transfer buffer on the GPU timeline.
+--
+--     This data is not guaranteed to be copied until the command buffer fence is signaled.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DownloadFromGPUTexture@, defined at @SDL3\/SDL_gpu.h 3993:34@
+sDL_DownloadFromGPUTexture
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -- ^
+  --
+  --           [@source@]: the source texture region.
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -- ^
+  --
+  --           [@destination@]: the destination transfer buffer with image layout information.
+  -> IO ()
+sDL_DownloadFromGPUTexture =
+  hs_bindgen_26b4b49d8544fb8f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DownloadFromGPUBuffer@
+foreign import ccall safe "hs_bindgen_d9824eebc00631e9"
+  hs_bindgen_d9824eebc00631e9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_DownloadFromGPUBuffer@
+hs_bindgen_d9824eebc00631e9
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -> IO ()
+hs_bindgen_d9824eebc00631e9 =
+  BG.fromFFIType hs_bindgen_d9824eebc00631e9_base
+
+-- | Copies data from a buffer to a transfer buffer on the GPU timeline.
+--
+--     This data is not guaranteed to be copied until the command buffer fence is signaled.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DownloadFromGPUBuffer@, defined at @SDL3\/SDL_gpu.h 4010:34@
+sDL_DownloadFromGPUBuffer
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -- ^
+  --
+  --           [@source@]: the source buffer with offset and size.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -- ^
+  --
+  --           [@destination@]: the destination transfer buffer with offset.
+  -> IO ()
+sDL_DownloadFromGPUBuffer =
+  hs_bindgen_d9824eebc00631e9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_EndGPUCopyPass@
+foreign import ccall safe "hs_bindgen_bf4e18ec8641dd60"
+  hs_bindgen_bf4e18ec8641dd60_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_EndGPUCopyPass@
+hs_bindgen_bf4e18ec8641dd60
+  :: BG.Ptr SDL_GPUCopyPass
+  -> IO ()
+hs_bindgen_bf4e18ec8641dd60 =
+  BG.fromFFIType hs_bindgen_bf4e18ec8641dd60_base
+
+-- | Ends the current copy pass.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EndGPUCopyPass@, defined at @SDL3\/SDL_gpu.h 4022:34@
+sDL_EndGPUCopyPass
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> IO ()
+sDL_EndGPUCopyPass = hs_bindgen_bf4e18ec8641dd60
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GenerateMipmapsForGPUTexture@
+foreign import ccall safe "hs_bindgen_fa347415d8ba2bab"
+  hs_bindgen_fa347415d8ba2bab_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GenerateMipmapsForGPUTexture@
+hs_bindgen_fa347415d8ba2bab
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> BG.Ptr SDL_GPUTexture
+  -> IO ()
+hs_bindgen_fa347415d8ba2bab =
+  BG.fromFFIType hs_bindgen_fa347415d8ba2bab_base
+
+-- | Generates mipmaps for the given texture.
+--
+--     This function must not be called inside of any pass.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GenerateMipmapsForGPUTexture@, defined at @SDL3\/SDL_gpu.h 4035:34@
+sDL_GenerateMipmapsForGPUTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command_buffer.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture with more than 1 mip level.
+  -> IO ()
+sDL_GenerateMipmapsForGPUTexture =
+  hs_bindgen_fa347415d8ba2bab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BlitGPUTexture@
+foreign import ccall safe "hs_bindgen_2cf48971e4a0bb02"
+  hs_bindgen_2cf48971e4a0bb02_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_BlitGPUTexture@
+hs_bindgen_2cf48971e4a0bb02
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> PtrConst.PtrConst SDL_GPUBlitInfo
+  -> IO ()
+hs_bindgen_2cf48971e4a0bb02 =
+  BG.fromFFIType hs_bindgen_2cf48971e4a0bb02_base
+
+-- | Blits from a source texture region to a destination texture region.
+--
+--     This function must not be called inside of any pass.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BlitGPUTexture@, defined at @SDL3\/SDL_gpu.h 4049:34@
+sDL_BlitGPUTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUBlitInfo
+  -- ^
+  --
+  --           [@info@]: the blit info struct containing the blit parameters.
+  -> IO ()
+sDL_BlitGPUTexture = hs_bindgen_2cf48971e4a0bb02
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WindowSupportsGPUSwapchainComposition@
+foreign import ccall safe "hs_bindgen_7f2a5f493596626a"
+  hs_bindgen_7f2a5f493596626a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WindowSupportsGPUSwapchainComposition@
+hs_bindgen_7f2a5f493596626a
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> SDL_GPUSwapchainComposition
+  -> IO BG.CBool
+hs_bindgen_7f2a5f493596626a =
+  BG.fromFFIType hs_bindgen_7f2a5f493596626a_base
+
+-- | Determines whether a swapchain composition is supported by the window.
+--
+--     The window must be claimed before calling this function.
+--
+--     [Returns]: true if supported, false if unsupported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice'
+--
+--     [C declaration]: @SDL_WindowSupportsGPUSwapchainComposition@, defined at @SDL3\/SDL_gpu.h 4069:34@
+sDL_WindowSupportsGPUSwapchainComposition
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> SDL_GPUSwapchainComposition
+  -- ^
+  --
+  --           [@swapchain_composition@]: the swapchain composition to check.
+  -> IO BG.CBool
+sDL_WindowSupportsGPUSwapchainComposition =
+  hs_bindgen_7f2a5f493596626a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WindowSupportsGPUPresentMode@
+foreign import ccall safe "hs_bindgen_832a19beda5bc034"
+  hs_bindgen_832a19beda5bc034_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WindowSupportsGPUPresentMode@
+hs_bindgen_832a19beda5bc034
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> SDL_GPUPresentMode
+  -> IO BG.CBool
+hs_bindgen_832a19beda5bc034 =
+  BG.fromFFIType hs_bindgen_832a19beda5bc034_base
+
+-- | Determines whether a presentation mode is supported by the window.
+--
+--     The window must be claimed before calling this function.
+--
+--     [Returns]: true if supported, false if unsupported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice'
+--
+--     [C declaration]: @SDL_WindowSupportsGPUPresentMode@, defined at @SDL3\/SDL_gpu.h 4088:34@
+sDL_WindowSupportsGPUPresentMode
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> SDL_GPUPresentMode
+  -- ^
+  --
+  --           [@present_mode@]: the presentation mode to check.
+  -> IO BG.CBool
+sDL_WindowSupportsGPUPresentMode =
+  hs_bindgen_832a19beda5bc034
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ClaimWindowForGPUDevice@
+foreign import ccall safe "hs_bindgen_5eeb91d45dc27764"
+  hs_bindgen_5eeb91d45dc27764_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ClaimWindowForGPUDevice@
+hs_bindgen_5eeb91d45dc27764
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_5eeb91d45dc27764 =
+  BG.fromFFIType hs_bindgen_5eeb91d45dc27764_base
+
+-- | Claims a window, creating a swapchain structure for it.
+--
+--     This must be called before SDL_AcquireGPUSwapchainTexture is called using the window. You should only call this function from the thread that created the window.
+--
+--     The swapchain will be created with SDL_GPU_SWAPCHAINCOMPOSITION_SDR and SDL_GPU_PRESENTMODE_VSYNC. If you want to have different swapchain parameters, you must call SDL_SetGPUSwapchainParameters after claiming the window.
+--
+--     [Returns]: true on success, or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_ReleaseWindowFromGPUDevice', 'sDL_WindowSupportsGPUPresentMode', 'sDL_WindowSupportsGPUSwapchainComposition'
+--
+--     [C declaration]: @SDL_ClaimWindowForGPUDevice@, defined at @SDL3\/SDL_gpu.h 4120:34@
+sDL_ClaimWindowForGPUDevice
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> IO BG.CBool
+sDL_ClaimWindowForGPUDevice =
+  hs_bindgen_5eeb91d45dc27764
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseWindowFromGPUDevice@
+foreign import ccall safe "hs_bindgen_00fb11a8b5935e0f"
+  hs_bindgen_00fb11a8b5935e0f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseWindowFromGPUDevice@
+hs_bindgen_00fb11a8b5935e0f
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO ()
+hs_bindgen_00fb11a8b5935e0f =
+  BG.fromFFIType hs_bindgen_00fb11a8b5935e0f_base
+
+-- | Unclaims a window, destroying its swapchain structure.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice'
+--
+--     [C declaration]: @SDL_ReleaseWindowFromGPUDevice@, defined at @SDL3\/SDL_gpu.h 4134:34@
+sDL_ReleaseWindowFromGPUDevice
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> IO ()
+sDL_ReleaseWindowFromGPUDevice =
+  hs_bindgen_00fb11a8b5935e0f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUSwapchainParameters@
+foreign import ccall safe "hs_bindgen_caf081d6c5e2aa14"
+  hs_bindgen_caf081d6c5e2aa14_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUSwapchainParameters@
+hs_bindgen_caf081d6c5e2aa14
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> SDL_GPUSwapchainComposition
+  -> SDL_GPUPresentMode
+  -> IO BG.CBool
+hs_bindgen_caf081d6c5e2aa14 =
+  BG.fromFFIType hs_bindgen_caf081d6c5e2aa14_base
+
+-- | Changes the swapchain parameters for the given claimed window.
+--
+--     This function will fail if the requested present mode or swapchain composition are unsupported by the device. Check if the parameters are supported via SDL_WindowSupportsGPUPresentMode \/ SDL_WindowSupportsGPUSwapchainComposition prior to calling this function.
+--
+--     SDL_GPU_PRESENTMODE_VSYNC with SDL_GPU_SWAPCHAINCOMPOSITION_SDR is always supported.
+--
+--     [Returns]: true if successful, false on error; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WindowSupportsGPUPresentMode', 'sDL_WindowSupportsGPUSwapchainComposition'
+--
+--     [C declaration]: @SDL_SetGPUSwapchainParameters@, defined at @SDL3\/SDL_gpu.h 4161:34@
+sDL_SetGPUSwapchainParameters
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> SDL_GPUSwapchainComposition
+  -- ^
+  --
+  --           [@swapchain_composition@]: the desired composition of the swapchain.
+  -> SDL_GPUPresentMode
+  -- ^
+  --
+  --           [@present_mode@]: the desired present mode for the swapchain.
+  -> IO BG.CBool
+sDL_SetGPUSwapchainParameters =
+  hs_bindgen_caf081d6c5e2aa14
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUAllowedFramesInFlight@
+foreign import ccall safe "hs_bindgen_04ce0909a6c26d29"
+  hs_bindgen_04ce0909a6c26d29_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SetGPUAllowedFramesInFlight@
+hs_bindgen_04ce0909a6c26d29
+  :: BG.Ptr SDL_GPUDevice
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_04ce0909a6c26d29 =
+  BG.fromFFIType hs_bindgen_04ce0909a6c26d29_base
+
+-- | Configures the maximum allowed number of frames in flight.
+--
+--     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 working on the first frame, @SDL_AcquireGPUSwapchainTexture()@ will fill the swapchain texture pointer with NULL, and @SDL_WaitAndAcquireGPUSwapchainTexture()@ will block.
+--
+--     Higher values increase throughput at the expense of visual latency. Lower values decrease visual latency at the expense of throughput.
+--
+--     Note that calling this function will stall and flush the command queue to prevent synchronization issues.
+--
+--     The minimum value of allowed frames in flight is 1, and the maximum is 3.
+--
+--     [Returns]: true if successful, false on error; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUAllowedFramesInFlight@, defined at @SDL3\/SDL_gpu.h 4192:34@
+sDL_SetGPUAllowedFramesInFlight
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@allowed_frames_in_flight@]: the maximum number of frames that can be pending on the GPU.
+  -> IO BG.CBool
+sDL_SetGPUAllowedFramesInFlight =
+  hs_bindgen_04ce0909a6c26d29
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUSwapchainTextureFormat@
+foreign import ccall safe "hs_bindgen_6389b81fd8780e8b"
+  hs_bindgen_6389b81fd8780e8b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUSwapchainTextureFormat@
+hs_bindgen_6389b81fd8780e8b
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO SDL_GPUTextureFormat
+hs_bindgen_6389b81fd8780e8b =
+  BG.fromFFIType hs_bindgen_6389b81fd8780e8b_base
+
+-- | Obtains the texture format of the swapchain for the given window.
+--
+--     Note that this format can change if the swapchain parameters change.
+--
+--     [Returns]: the texture format of the swapchain.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGPUSwapchainTextureFormat@, defined at @SDL3\/SDL_gpu.h 4207:50@
+sDL_GetGPUSwapchainTextureFormat
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> IO SDL_GPUTextureFormat
+sDL_GetGPUSwapchainTextureFormat =
+  hs_bindgen_6389b81fd8780e8b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_AcquireGPUSwapchainTexture@
+foreign import ccall safe "hs_bindgen_92ebdfd004d30834"
+  hs_bindgen_92ebdfd004d30834_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_AcquireGPUSwapchainTexture@
+hs_bindgen_92ebdfd004d30834
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_92ebdfd004d30834 =
+  BG.fromFFIType hs_bindgen_92ebdfd004d30834_base
+
+-- | Acquire a texture to use in presentation.
+--
+--     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 buffer used to acquire it.
+--
+--     This function will fill the swapchain texture handle with NULL if too many 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.
+--
+--     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.
+--
+--     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.
+--
+--     [Returns]: true on success, false on error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice', 'sDL_SubmitGPUCommandBuffer', 'sDL_SubmitGPUCommandBufferAndAcquireFence', 'sDL_CancelGPUCommandBuffer', SDL_GetWindowSizeInPixels, 'sDL_WaitForGPUSwapchain', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_SetGPUAllowedFramesInFlight'
+--
+--     [C declaration]: @SDL_AcquireGPUSwapchainTexture@, defined at @SDL3\/SDL_gpu.h 4259:34@
+sDL_AcquireGPUSwapchainTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@swapchain_texture@]: a pointer filled in with a swapchain texture handle.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_width@]: a pointer filled in with the swapchain texture width, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_height@]: a pointer filled in with the swapchain texture height, may be NULL.
+  -> IO BG.CBool
+sDL_AcquireGPUSwapchainTexture =
+  hs_bindgen_92ebdfd004d30834
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WaitForGPUSwapchain@
+foreign import ccall safe "hs_bindgen_819c0e296688c2c8"
+  hs_bindgen_819c0e296688c2c8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WaitForGPUSwapchain@
+hs_bindgen_819c0e296688c2c8
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_819c0e296688c2c8 =
+  BG.fromFFIType hs_bindgen_819c0e296688c2c8_base
+
+-- | Blocks the thread until a swapchain texture is available to be acquired.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireGPUSwapchainTexture', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_SetGPUAllowedFramesInFlight'
+--
+--     [C declaration]: @SDL_WaitForGPUSwapchain@, defined at @SDL3\/SDL_gpu.h 4283:34@
+sDL_WaitForGPUSwapchain
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> IO BG.CBool
+sDL_WaitForGPUSwapchain = hs_bindgen_819c0e296688c2c8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WaitAndAcquireGPUSwapchainTexture@
+foreign import ccall safe "hs_bindgen_b7be4df3492ace1e"
+  hs_bindgen_b7be4df3492ace1e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WaitAndAcquireGPUSwapchainTexture@
+hs_bindgen_b7be4df3492ace1e
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_b7be4df3492ace1e =
+  BG.fromFFIType hs_bindgen_b7be4df3492ace1e_base
+
+-- | Blocks the thread until a swapchain texture is available to be acquired, and then acquires it.
+--
+--     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 buffer used to acquire it. It is an error to call @SDL_CancelGPUCommandBuffer()@ after a swapchain texture is acquired.
+--
+--     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.
+--
+--     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.
+--
+--     The swapchain texture is write-only and cannot be used as a sampler or for another reading operation.
+--
+--     [Returns]: true on success, false on error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBuffer', 'sDL_SubmitGPUCommandBufferAndAcquireFence', 'sDL_AcquireGPUSwapchainTexture'
+--
+--     [C declaration]: @SDL_WaitAndAcquireGPUSwapchainTexture@, defined at @SDL3\/SDL_gpu.h 4329:34@
+sDL_WaitAndAcquireGPUSwapchainTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@swapchain_texture@]: a pointer filled in with a swapchain texture handle.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_width@]: a pointer filled in with the swapchain texture width, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_height@]: a pointer filled in with the swapchain texture height, may be NULL.
+  -> IO BG.CBool
+sDL_WaitAndAcquireGPUSwapchainTexture =
+  hs_bindgen_b7be4df3492ace1e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SubmitGPUCommandBuffer@
+foreign import ccall safe "hs_bindgen_6f98a07dd7e96530"
+  hs_bindgen_6f98a07dd7e96530_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SubmitGPUCommandBuffer@
+hs_bindgen_6f98a07dd7e96530
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> IO BG.CBool
+hs_bindgen_6f98a07dd7e96530 =
+  BG.fromFFIType hs_bindgen_6f98a07dd7e96530_base
+
+-- | Submits a command buffer so its commands can be processed on the GPU.
+--
+--     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.
+--
+--     All commands in the submission are guaranteed to begin executing before any command in a subsequent submission begins executing.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireGPUCommandBuffer', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_AcquireGPUSwapchainTexture', 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_SubmitGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 4357:34@
+sDL_SubmitGPUCommandBuffer
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO BG.CBool
+sDL_SubmitGPUCommandBuffer =
+  hs_bindgen_6f98a07dd7e96530
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SubmitGPUCommandBufferAndAcquireFence@
+foreign import ccall safe "hs_bindgen_897578b42f3c05e8"
+  hs_bindgen_897578b42f3c05e8_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_SubmitGPUCommandBufferAndAcquireFence@
+hs_bindgen_897578b42f3c05e8
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> IO (BG.Ptr SDL_GPUFence)
+hs_bindgen_897578b42f3c05e8 =
+  BG.fromFFIType hs_bindgen_897578b42f3c05e8_base
+
+-- | 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.
+--
+--     This must be called from the thread the command buffer was acquired on.
+--
+--     All commands in the submission are guaranteed to begin executing before any command in a subsequent submission begins executing.
+--
+--     [Returns]: a fence associated with the command buffer, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireGPUCommandBuffer', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_AcquireGPUSwapchainTexture', 'sDL_SubmitGPUCommandBuffer', 'sDL_ReleaseGPUFence'
+--
+--     [C declaration]: @SDL_SubmitGPUCommandBufferAndAcquireFence@, defined at @SDL3\/SDL_gpu.h 4384:44@
+sDL_SubmitGPUCommandBufferAndAcquireFence
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO (BG.Ptr SDL_GPUFence)
+sDL_SubmitGPUCommandBufferAndAcquireFence =
+  hs_bindgen_897578b42f3c05e8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CancelGPUCommandBuffer@
+foreign import ccall safe "hs_bindgen_e7e00ea7d024e9e9"
+  hs_bindgen_e7e00ea7d024e9e9_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CancelGPUCommandBuffer@
+hs_bindgen_e7e00ea7d024e9e9
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> IO BG.CBool
+hs_bindgen_e7e00ea7d024e9e9 =
+  BG.fromFFIType hs_bindgen_e7e00ea7d024e9e9_base
+
+-- | Cancels a command buffer.
+--
+--     None of the enqueued commands are executed.
+--
+--     It is an error to call this function after a swapchain texture has been acquired.
+--
+--     This must be called from the thread the command buffer was acquired on.
+--
+--     You must not reference the command buffer after calling this function.
+--
+--     [Returns]: true on success, false on error; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_AcquireGPUCommandBuffer', 'sDL_AcquireGPUSwapchainTexture'
+--
+--     [C declaration]: @SDL_CancelGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 4409:34@
+sDL_CancelGPUCommandBuffer
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO BG.CBool
+sDL_CancelGPUCommandBuffer =
+  hs_bindgen_e7e00ea7d024e9e9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WaitForGPUIdle@
+foreign import ccall safe "hs_bindgen_afeaba8d92329a17"
+  hs_bindgen_afeaba8d92329a17_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WaitForGPUIdle@
+hs_bindgen_afeaba8d92329a17
+  :: BG.Ptr SDL_GPUDevice
+  -> IO BG.CBool
+hs_bindgen_afeaba8d92329a17 =
+  BG.fromFFIType hs_bindgen_afeaba8d92329a17_base
+
+-- | Blocks the thread until the GPU is completely idle.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitForGPUFences'
+--
+--     [C declaration]: @SDL_WaitForGPUIdle@, defined at @SDL3\/SDL_gpu.h 4423:34@
+sDL_WaitForGPUIdle
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> IO BG.CBool
+sDL_WaitForGPUIdle = hs_bindgen_afeaba8d92329a17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WaitForGPUFences@
+foreign import ccall safe "hs_bindgen_c1152a4254c2282b"
+  hs_bindgen_c1152a4254c2282b_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_WaitForGPUFences@
+hs_bindgen_c1152a4254c2282b
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.CBool
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUFence)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_c1152a4254c2282b =
+  BG.fromFFIType hs_bindgen_c1152a4254c2282b_base
+
+-- | Blocks the thread until the given fences are signaled.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBufferAndAcquireFence', 'sDL_WaitForGPUIdle'
+--
+--     [C declaration]: @SDL_WaitForGPUFences@, defined at @SDL3\/SDL_gpu.h 4442:34@
+sDL_WaitForGPUFences
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@wait_all@]: if 0, wait for any fence to be signaled, if 1, wait for all fences to be signaled.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUFence)
+  -- ^
+  --
+  --           [@fences@]: an array of fences to wait on.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_fences@]: the number of fences in the fences array.
+  -> IO BG.CBool
+sDL_WaitForGPUFences = hs_bindgen_c1152a4254c2282b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_QueryGPUFence@
+foreign import ccall safe "hs_bindgen_b6027b7729f79f17"
+  hs_bindgen_b6027b7729f79f17_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_QueryGPUFence@
+hs_bindgen_b6027b7729f79f17
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUFence
+  -> IO BG.CBool
+hs_bindgen_b6027b7729f79f17 =
+  BG.fromFFIType hs_bindgen_b6027b7729f79f17_base
+
+-- | Checks the status of a fence.
+--
+--     [Returns]: true if the fence is signaled, false if it is not.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_QueryGPUFence@, defined at @SDL3\/SDL_gpu.h 4459:34@
+sDL_QueryGPUFence
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUFence
+  -- ^
+  --
+  --           [@fence@]: a fence.
+  -> IO BG.CBool
+sDL_QueryGPUFence = hs_bindgen_b6027b7729f79f17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUFence@
+foreign import ccall safe "hs_bindgen_60db26ce4b928463"
+  hs_bindgen_60db26ce4b928463_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_ReleaseGPUFence@
+hs_bindgen_60db26ce4b928463
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUFence
+  -> IO ()
+hs_bindgen_60db26ce4b928463 =
+  BG.fromFFIType hs_bindgen_60db26ce4b928463_base
+
+-- | Releases a fence obtained from SDL_SubmitGPUCommandBufferAndAcquireFence.
+--
+--     You must not reference the fence after calling this function.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_ReleaseGPUFence@, defined at @SDL3\/SDL_gpu.h 4475:34@
+sDL_ReleaseGPUFence
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUFence
+  -- ^
+  --
+  --           [@fence@]: a fence.
+  -> IO ()
+sDL_ReleaseGPUFence = hs_bindgen_60db26ce4b928463
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GPUTextureFormatTexelBlockSize@
+foreign import ccall safe "hs_bindgen_10b178c2418e1b7a"
+  hs_bindgen_10b178c2418e1b7a_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GPUTextureFormatTexelBlockSize@
+hs_bindgen_10b178c2418e1b7a
+  :: SDL_GPUTextureFormat
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_10b178c2418e1b7a =
+  BG.fromFFIType hs_bindgen_10b178c2418e1b7a_base
+
+-- | Obtains the texel block size for a texture format.
+--
+--     [Returns]: the texel block size of the texture format.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUTexture'
+--
+--     [C declaration]: @SDL_GPUTextureFormatTexelBlockSize@, defined at @SDL3\/SDL_gpu.h 4491:36@
+sDL_GPUTextureFormatTexelBlockSize
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format you want to know the texel size of.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_GPUTextureFormatTexelBlockSize =
+  hs_bindgen_10b178c2418e1b7a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GPUTextureSupportsFormat@
+foreign import ccall safe "hs_bindgen_e7f998463fccba5a"
+  hs_bindgen_e7f998463fccba5a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GPUTextureSupportsFormat@
+hs_bindgen_e7f998463fccba5a
+  :: BG.Ptr SDL_GPUDevice
+  -> SDL_GPUTextureFormat
+  -> SDL_GPUTextureType
+  -> SDL_GPUTextureUsageFlags
+  -> IO BG.CBool
+hs_bindgen_e7f998463fccba5a =
+  BG.fromFFIType hs_bindgen_e7f998463fccba5a_base
+
+-- | Determines whether a texture format is supported for a given type and usage.
+--
+--     [Returns]: whether the texture format is supported for this type and usage.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GPUTextureSupportsFormat@, defined at @SDL3\/SDL_gpu.h 4506:34@
+sDL_GPUTextureSupportsFormat
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format to check.
+  -> SDL_GPUTextureType
+  -- ^
+  --
+  --           [@type@]: the type of texture (2D, 3D, Cube).
+  -> SDL_GPUTextureUsageFlags
+  -- ^
+  --
+  --           [@usage@]: a bitmask of all usage scenarios to check.
+  -> IO BG.CBool
+sDL_GPUTextureSupportsFormat =
+  hs_bindgen_e7f998463fccba5a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GPUTextureSupportsSampleCount@
+foreign import ccall safe "hs_bindgen_de6deb1af3775431"
+  hs_bindgen_de6deb1af3775431_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GPUTextureSupportsSampleCount@
+hs_bindgen_de6deb1af3775431
+  :: BG.Ptr SDL_GPUDevice
+  -> SDL_GPUTextureFormat
+  -> SDL_GPUSampleCount
+  -> IO BG.CBool
+hs_bindgen_de6deb1af3775431 =
+  BG.fromFFIType hs_bindgen_de6deb1af3775431_base
+
+-- | Determines if a sample count for a texture format is supported.
+--
+--     [Returns]: whether the sample count is supported for this texture format.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GPUTextureSupportsSampleCount@, defined at @SDL3\/SDL_gpu.h 4522:34@
+sDL_GPUTextureSupportsSampleCount
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format to check.
+  -> SDL_GPUSampleCount
+  -- ^
+  --
+  --           [@sample_count@]: the sample count to check.
+  -> IO BG.CBool
+sDL_GPUTextureSupportsSampleCount =
+  hs_bindgen_de6deb1af3775431
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CalculateGPUTextureFormatSize@
+foreign import ccall safe "hs_bindgen_d9b37eb9aa5f44b5"
+  hs_bindgen_d9b37eb9aa5f44b5_base
+    :: BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_CalculateGPUTextureFormatSize@
+hs_bindgen_d9b37eb9aa5f44b5
+  :: SDL_GPUTextureFormat
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_d9b37eb9aa5f44b5 =
+  BG.fromFFIType hs_bindgen_d9b37eb9aa5f44b5_base
+
+-- | Calculate the size in bytes of a texture format with dimensions.
+--
+--     [Returns]: the size of a texture with this format and dimensions.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CalculateGPUTextureFormatSize@, defined at @SDL3\/SDL_gpu.h 4538:36@
+sDL_CalculateGPUTextureFormatSize
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: a texture format.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@width@]: width in pixels.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@height@]: height in pixels.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@depth_or_layer_count@]: depth for 3D textures or layer count otherwise.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_CalculateGPUTextureFormatSize =
+  hs_bindgen_d9b37eb9aa5f44b5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetPixelFormatFromGPUTextureFormat@
+foreign import ccall safe "hs_bindgen_128db189d446a117"
+  hs_bindgen_128db189d446a117_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetPixelFormatFromGPUTextureFormat@
+hs_bindgen_128db189d446a117
+  :: SDL_GPUTextureFormat
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+hs_bindgen_128db189d446a117 =
+  BG.fromFFIType hs_bindgen_128db189d446a117_base
+
+-- | Get the SDL pixel format corresponding to a GPU texture format.
+--
+--     [Returns]: the corresponding pixel format, or SDL_PIXELFORMAT_UNKNOWN if there is no corresponding pixel format.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetPixelFormatFromGPUTextureFormat@, defined at @SDL3\/SDL_gpu.h 4553:45@
+sDL_GetPixelFormatFromGPUTextureFormat
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: a texture format.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+sDL_GetPixelFormatFromGPUTextureFormat =
+  hs_bindgen_128db189d446a117
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUTextureFormatFromPixelFormat@
+foreign import ccall safe "hs_bindgen_af0c7c8e2642605b"
+  hs_bindgen_af0c7c8e2642605b_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Safe_SDL_GetGPUTextureFormatFromPixelFormat@
+hs_bindgen_af0c7c8e2642605b
+  :: SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> IO SDL_GPUTextureFormat
+hs_bindgen_af0c7c8e2642605b =
+  BG.fromFFIType hs_bindgen_af0c7c8e2642605b_base
+
+-- | Get the GPU texture format corresponding to an SDL pixel format.
+--
+--     [Returns]: the corresponding GPU texture format, or SDL_GPU_TEXTUREFORMAT_INVALID if there is no corresponding GPU texture format.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetGPUTextureFormatFromPixelFormat@, defined at @SDL3\/SDL_gpu.h 4565:50@
+sDL_GetGPUTextureFormatFromPixelFormat
+  :: SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: a pixel format.
+  -> IO SDL_GPUTextureFormat
+sDL_GetGPUTextureFormatFromPixelFormat =
+  hs_bindgen_af0c7c8e2642605b
diff --git a/src/SDL3/Sys/Bindgen/Gpu/Unsafe.hs b/src/SDL3/Sys/Bindgen/Gpu/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Gpu/Unsafe.hs
@@ -0,0 +1,4992 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Gpu.Unsafe (
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GPUSupportsShaderFormats,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GPUSupportsProperties,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CreateGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CreateGPUDeviceWithProperties,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_DestroyGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GetNumGPUDrivers,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GetGPUDriver,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GetGPUDeviceDriver,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GetGPUShaderFormats,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GetGPUDeviceProperties,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CreateGPUComputePipeline,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CreateGPUGraphicsPipeline,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CreateGPUSampler,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CreateGPUShader,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CreateGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CreateGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CreateGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_SetGPUBufferName,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_SetGPUTextureName,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_InsertGPUDebugLabel,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_PushGPUDebugGroup,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_PopGPUDebugGroup,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_ReleaseGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_ReleaseGPUSampler,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_ReleaseGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_ReleaseGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_ReleaseGPUComputePipeline,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_ReleaseGPUShader,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_ReleaseGPUGraphicsPipeline,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_AcquireGPUCommandBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_PushGPUVertexUniformData,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_PushGPUFragmentUniformData,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_PushGPUComputeUniformData,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BeginGPURenderPass,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUGraphicsPipeline,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_SetGPUViewport,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_SetGPUScissor,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_SetGPUBlendConstants,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_SetGPUStencilReference,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUVertexBuffers,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUIndexBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUVertexSamplers,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUVertexStorageTextures,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUVertexStorageBuffers,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUFragmentSamplers,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUFragmentStorageTextures,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUFragmentStorageBuffers,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_DrawGPUIndexedPrimitives,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_DrawGPUPrimitives,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_DrawGPUPrimitivesIndirect,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_DrawGPUIndexedPrimitivesIndirect,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_EndGPURenderPass,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BeginGPUComputePass,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUComputePipeline,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUComputeSamplers,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUComputeStorageTextures,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BindGPUComputeStorageBuffers,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_DispatchGPUCompute,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_DispatchGPUComputeIndirect,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_EndGPUComputePass,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_MapGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_UnmapGPUTransferBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BeginGPUCopyPass,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_UploadToGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_UploadToGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CopyGPUTextureToTexture,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CopyGPUBufferToBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_DownloadFromGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_DownloadFromGPUBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_EndGPUCopyPass,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GenerateMipmapsForGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_BlitGPUTexture,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_WindowSupportsGPUSwapchainComposition,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_WindowSupportsGPUPresentMode,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_ClaimWindowForGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_ReleaseWindowFromGPUDevice,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_SetGPUSwapchainParameters,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_SetGPUAllowedFramesInFlight,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GetGPUSwapchainTextureFormat,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_AcquireGPUSwapchainTexture,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_WaitForGPUSwapchain,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_WaitAndAcquireGPUSwapchainTexture,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_SubmitGPUCommandBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_SubmitGPUCommandBufferAndAcquireFence,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CancelGPUCommandBuffer,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_WaitForGPUIdle,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_WaitForGPUFences,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_QueryGPUFence,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_ReleaseGPUFence,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GPUTextureFormatTexelBlockSize,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GPUTextureSupportsFormat,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GPUTextureSupportsSampleCount,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_CalculateGPUTextureFormatSize,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GetPixelFormatFromGPUTextureFormat,
+  SDL3.Sys.Bindgen.Gpu.Unsafe.sDL_GetGPUTextureFormatFromPixelFormat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Gpu
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_gpu.h>"
+         , "_Bool hs_bindgen_e2f3f6a8de0de73c ("
+         , "  SDL_GPUShaderFormat arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GPUSupportsShaderFormats)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c9ca417a5f641e3f ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GPUSupportsProperties)(arg1);"
+         , "}"
+         , "SDL_GPUDevice *hs_bindgen_b51ca46a4251feb8 ("
+         , "  SDL_GPUShaderFormat arg1,"
+         , "  _Bool arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUDevice)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_GPUDevice *hs_bindgen_376515fb91ec90e3 ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUDeviceWithProperties)(arg1);"
+         , "}"
+         , "void hs_bindgen_7ff5a8cdf38e3bf0 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyGPUDevice)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_6011a5df785dd689 (void)"
+         , "{"
+         , "  return (SDL_GetNumGPUDrivers)();"
+         , "}"
+         , "char const *hs_bindgen_5bd47cd4296c5cf8 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGPUDriver)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_bf49abcda2b24803 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGPUDeviceDriver)(arg1);"
+         , "}"
+         , "SDL_GPUShaderFormat hs_bindgen_20513b344f1e3b64 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGPUShaderFormats)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_PropertiesID hs_bindgen_caf8299b42e53b94 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetGPUDeviceProperties)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetGPUDeviceProperties requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_GPUComputePipeline *hs_bindgen_47c9f4418564565f ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUComputePipelineCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUComputePipeline)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUGraphicsPipeline *hs_bindgen_18c5db2a0d02cde2 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUGraphicsPipelineCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUGraphicsPipeline)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUSampler *hs_bindgen_a1a95a3f30be0f83 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUSamplerCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUSampler)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUShader *hs_bindgen_9bba04f484907a46 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUShaderCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUShader)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUTexture *hs_bindgen_e954a5b015dea03b ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTextureCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUTexture)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUBuffer *hs_bindgen_ed280f9c2dd5b278 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUBufferCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUBuffer)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUTransferBuffer *hs_bindgen_848522e8bdb350b2 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBufferCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateGPUTransferBuffer)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_b8e2db9733a08cbe ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUBufferName)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_6831ff7e87614fc1 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTexture *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUTextureName)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_56a7e36b3e8524dd ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_InsertGPUDebugLabel)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_41af45d04529f84d ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_PushGPUDebugGroup)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_5dae404b2ebaa08b ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_PopGPUDebugGroup)(arg1);"
+         , "}"
+         , "void hs_bindgen_64db5410128eae2d ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTexture *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUTexture)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_13cdb1700ceeed7f ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUSampler *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUSampler)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_fcdfc18ed875a278 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUBuffer *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUBuffer)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_e731b5deaeeee3c1 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBuffer *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUTransferBuffer)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_f9bd20900c9e4080 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUComputePipeline *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUComputePipeline)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_e516abeced8d372b ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUShader *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUShader)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_9c01a03b4ad6f8be ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUGraphicsPipeline *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUGraphicsPipeline)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUCommandBuffer *hs_bindgen_27337c63b7093b75 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AcquireGPUCommandBuffer)(arg1);"
+         , "}"
+         , "void hs_bindgen_a5504d727b5181e0 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_PushGPUVertexUniformData)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_c1b93561fe6f3eb8 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_PushGPUFragmentUniformData)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_267be67577031d05 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_PushGPUComputeUniformData)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "SDL_GPURenderPass *hs_bindgen_b04297da6f821242 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUColorTargetInfo const *arg2,"
+         , "  Uint32 arg3,"
+         , "  SDL_GPUDepthStencilTargetInfo const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_BeginGPURenderPass)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_a6ebeaec23a3eebc ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUGraphicsPipeline *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUGraphicsPipeline)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_f53e27fd1f10bfea ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUViewport const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUViewport)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_bc8dd2f3086d94d5 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUScissor)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_85e648c31f1fcb70 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_FColor *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUBlendConstants)(arg1, *arg2);"
+         , "}"
+         , "void hs_bindgen_142400b7edd5f15e ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetGPUStencilReference)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_049713abad47ef65 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBufferBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUVertexBuffers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_eebac58434b8d6c1 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUBufferBinding const *arg2,"
+         , "  SDL_GPUIndexElementSize arg3"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUIndexBuffer)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_466757558b7a4998 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTextureSamplerBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUVertexSamplers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_3099fb36563a23bf ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTexture *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUVertexStorageTextures)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_114f1ec46d1c4ca1 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBuffer *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUVertexStorageBuffers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_6120c617bd5f9a53 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTextureSamplerBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUFragmentSamplers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_a5741f59885921f3 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTexture *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUFragmentStorageTextures)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_2cc12141ee4494d6 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBuffer *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUFragmentStorageBuffers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_87e007a9ec36edc3 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4,"
+         , "  Sint32 arg5,"
+         , "  Uint32 arg6"
+         , ")"
+         , "{"
+         , "  (SDL_DrawGPUIndexedPrimitives)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "void hs_bindgen_7b242b637f0074d8 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  (SDL_DrawGPUPrimitives)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_38685ef53cdffb5f ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_DrawGPUPrimitivesIndirect)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_04835577dd24b594 ("
+         , "  SDL_GPURenderPass *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_DrawGPUIndexedPrimitivesIndirect)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_cd298cdaadbf367d ("
+         , "  SDL_GPURenderPass *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_EndGPURenderPass)(arg1);"
+         , "}"
+         , "SDL_GPUComputePass *hs_bindgen_7e4922a40e945137 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUStorageTextureReadWriteBinding const *arg2,"
+         , "  Uint32 arg3,"
+         , "  SDL_GPUStorageBufferReadWriteBinding const *arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_BeginGPUComputePass)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_3d4216ca508a9022 ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  SDL_GPUComputePipeline *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUComputePipeline)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_2a02bb807885f88d ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTextureSamplerBinding const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUComputeSamplers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_a743533e288c69f5 ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUTexture *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUComputeStorageTextures)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_1be365d38addb5cf ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  SDL_GPUBuffer *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_BindGPUComputeStorageBuffers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_08d7249b66bd0658 ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  (SDL_DispatchGPUCompute)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_9b425608a854a4f5 ("
+         , "  SDL_GPUComputePass *arg1,"
+         , "  SDL_GPUBuffer *arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  (SDL_DispatchGPUComputeIndirect)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_bf20561443153c08 ("
+         , "  SDL_GPUComputePass *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_EndGPUComputePass)(arg1);"
+         , "}"
+         , "void *hs_bindgen_075892bcba4ad890 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBuffer *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_MapGPUTransferBuffer)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_8721518ac51d5884 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTransferBuffer *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_UnmapGPUTransferBuffer)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUCopyPass *hs_bindgen_7990c88447a637d9 ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_BeginGPUCopyPass)(arg1);"
+         , "}"
+         , "void hs_bindgen_7dc2e64aebecaf47 ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTextureTransferInfo const *arg2,"
+         , "  SDL_GPUTextureRegion const *arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  (SDL_UploadToGPUTexture)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_c8311e817b0149e1 ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTransferBufferLocation const *arg2,"
+         , "  SDL_GPUBufferRegion const *arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  (SDL_UploadToGPUBuffer)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_8d76c446224fa54a ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTextureLocation const *arg2,"
+         , "  SDL_GPUTextureLocation const *arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5,"
+         , "  Uint32 arg6,"
+         , "  _Bool arg7"
+         , ")"
+         , "{"
+         , "  (SDL_CopyGPUTextureToTexture)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "void hs_bindgen_72560eca0be1bbd9 ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUBufferLocation const *arg2,"
+         , "  SDL_GPUBufferLocation const *arg3,"
+         , "  Uint32 arg4,"
+         , "  _Bool arg5"
+         , ")"
+         , "{"
+         , "  (SDL_CopyGPUBufferToBuffer)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_f583e024c47915e6 ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUTextureRegion const *arg2,"
+         , "  SDL_GPUTextureTransferInfo const *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_DownloadFromGPUTexture)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_d1604453e77cbbd9 ("
+         , "  SDL_GPUCopyPass *arg1,"
+         , "  SDL_GPUBufferRegion const *arg2,"
+         , "  SDL_GPUTransferBufferLocation const *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_DownloadFromGPUBuffer)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_37f1aba920cf70df ("
+         , "  SDL_GPUCopyPass *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_EndGPUCopyPass)(arg1);"
+         , "}"
+         , "void hs_bindgen_487b5d55898cb8c9 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUTexture *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_GenerateMipmapsForGPUTexture)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_5ea32ac13985443b ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_GPUBlitInfo const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_BlitGPUTexture)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7874a69b9fb7574a ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUSwapchainComposition arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WindowSupportsGPUSwapchainComposition)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_e7e69a1723f7ad13 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUPresentMode arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WindowSupportsGPUPresentMode)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_709c34298cd845c0 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ClaimWindowForGPUDevice)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_5580ffa5115be31a ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseWindowFromGPUDevice)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_dd5044a4ed37551c ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUSwapchainComposition arg3,"
+         , "  SDL_GPUPresentMode arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGPUSwapchainParameters)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_376c36f4c99e1f9a ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetGPUAllowedFramesInFlight)(arg1, arg2);"
+         , "}"
+         , "SDL_GPUTextureFormat hs_bindgen_4dd16ea5d2d75e5c ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGPUSwapchainTextureFormat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_458d79c8728f00ab ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUTexture **arg3,"
+         , "  Uint32 *arg4,"
+         , "  Uint32 *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_AcquireGPUSwapchainTexture)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_fb018ba3fc209740 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitForGPUSwapchain)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a454f9124adeea81 ("
+         , "  SDL_GPUCommandBuffer *arg1,"
+         , "  SDL_Window *arg2,"
+         , "  SDL_GPUTexture **arg3,"
+         , "  Uint32 *arg4,"
+         , "  Uint32 *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitAndAcquireGPUSwapchainTexture)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_82bac871c3cbe3e4 ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SubmitGPUCommandBuffer)(arg1);"
+         , "}"
+         , "SDL_GPUFence *hs_bindgen_34bbe24268d3620c ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SubmitGPUCommandBufferAndAcquireFence)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_34c4d8861fe9ae5b ("
+         , "  SDL_GPUCommandBuffer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CancelGPUCommandBuffer)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_2cf574d324b28e44 ("
+         , "  SDL_GPUDevice *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitForGPUIdle)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_90c7f8f4aae22e6a ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  _Bool arg2,"
+         , "  SDL_GPUFence *const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitForGPUFences)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_09f80c8e0b395d04 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUFence *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_QueryGPUFence)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_97087dbb893b61af ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUFence *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_ReleaseGPUFence)(arg1, arg2);"
+         , "}"
+         , "Uint32 hs_bindgen_121bf00d55a1a113 ("
+         , "  SDL_GPUTextureFormat arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GPUTextureFormatTexelBlockSize)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0c3c275a5e945ebd ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTextureFormat arg2,"
+         , "  SDL_GPUTextureType arg3,"
+         , "  SDL_GPUTextureUsageFlags arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GPUTextureSupportsFormat)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_0870889673874577 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_GPUTextureFormat arg2,"
+         , "  SDL_GPUSampleCount arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GPUTextureSupportsSampleCount)(arg1, arg2, arg3);"
+         , "}"
+         , "Uint32 hs_bindgen_222b65bb58cce08e ("
+         , "  SDL_GPUTextureFormat arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_CalculateGPUTextureFormatSize)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_PixelFormat hs_bindgen_3a8763f112daa871 ("
+         , "  SDL_GPUTextureFormat arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetPixelFormatFromGPUTextureFormat)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetPixelFormatFromGPUTextureFormat requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_GPUTextureFormat hs_bindgen_77c5ed2882b80ff3 ("
+         , "  SDL_PixelFormat arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetGPUTextureFormatFromPixelFormat)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetGPUTextureFormatFromPixelFormat requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GPUSupportsShaderFormats@
+foreign import ccall unsafe "hs_bindgen_e2f3f6a8de0de73c"
+  hs_bindgen_e2f3f6a8de0de73c_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GPUSupportsShaderFormats@
+hs_bindgen_e2f3f6a8de0de73c
+  :: SDL_GPUShaderFormat
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_e2f3f6a8de0de73c =
+  BG.fromFFIType hs_bindgen_e2f3f6a8de0de73c_base
+
+-- | Checks for GPU runtime support.
+--
+--     [Returns]: true if supported, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDevice'
+--
+--     [C declaration]: @SDL_GPUSupportsShaderFormats@, defined at @SDL3\/SDL_gpu.h 2200:34@
+sDL_GPUSupportsShaderFormats
+  :: SDL_GPUShaderFormat
+  -- ^
+  --
+  --           [@format_flags@]: a bitflag indicating which shader formats the app is able to provide.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the preferred GPU driver, or NULL to let SDL pick the optimal driver.
+  -> IO BG.CBool
+sDL_GPUSupportsShaderFormats =
+  hs_bindgen_e2f3f6a8de0de73c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GPUSupportsProperties@
+foreign import ccall unsafe "hs_bindgen_c9ca417a5f641e3f"
+  hs_bindgen_c9ca417a5f641e3f_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GPUSupportsProperties@
+hs_bindgen_c9ca417a5f641e3f
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO BG.CBool
+hs_bindgen_c9ca417a5f641e3f =
+  BG.fromFFIType hs_bindgen_c9ca417a5f641e3f_base
+
+-- | Checks for GPU runtime support.
+--
+--     [Returns]: true if supported, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDeviceWithProperties'
+--
+--     [C declaration]: @SDL_GPUSupportsProperties@, defined at @SDL3\/SDL_gpu.h 2214:34@
+sDL_GPUSupportsProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO BG.CBool
+sDL_GPUSupportsProperties =
+  hs_bindgen_c9ca417a5f641e3f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUDevice@
+foreign import ccall unsafe "hs_bindgen_b51ca46a4251feb8"
+  hs_bindgen_b51ca46a4251feb8_base
+    :: BG.Word32
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUDevice@
+hs_bindgen_b51ca46a4251feb8
+  :: SDL_GPUShaderFormat
+  -> BG.CBool
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_GPUDevice)
+hs_bindgen_b51ca46a4251feb8 =
+  BG.fromFFIType hs_bindgen_b51ca46a4251feb8_base
+
+-- | Creates a GPU context.
+--
+--     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
+--
+--     [Returns]: a GPU context on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDeviceWithProperties', 'sDL_GetGPUShaderFormats', 'sDL_GetGPUDeviceDriver', 'sDL_DestroyGPUDevice', 'sDL_GPUSupportsShaderFormats'
+--
+--     [C declaration]: @SDL_CreateGPUDevice@, defined at @SDL3\/SDL_gpu.h 2243:45@
+sDL_CreateGPUDevice
+  :: SDL_GPUShaderFormat
+  -- ^
+  --
+  --           [@format_flags@]: a bitflag indicating which shader formats the app is able to provide.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@debug_mode@]: enable debug mode properties and validations.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the preferred GPU driver, or NULL to let SDL pick the optimal driver.
+  -> IO (BG.Ptr SDL_GPUDevice)
+sDL_CreateGPUDevice = hs_bindgen_b51ca46a4251feb8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUDeviceWithProperties@
+foreign import ccall unsafe "hs_bindgen_376515fb91ec90e3"
+  hs_bindgen_376515fb91ec90e3_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUDeviceWithProperties@
+hs_bindgen_376515fb91ec90e3
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_GPUDevice)
+hs_bindgen_376515fb91ec90e3 =
+  BG.fromFFIType hs_bindgen_376515fb91ec90e3_base
+
+-- | Creates a GPU context.
+--
+--     These are the supported properties:
+--
+--     * @'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.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN'@: enable to automatically log useful debug information on device creation, defaults to true.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_NAME_STRING'@: the name of the GPU driver to use, if a specific one is desired.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN'@: Enable Vulkan device feature shaderClipDistance. If disabled, clip distances are not supported in shader code: gl_ClipDistance[] built-ins of GLSL, SV_ClipDistance0\/1 semantics of HLSL and [[clip_distance]] attribute of 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.
+--
+--     These are the current shader format properties:
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN'@: The app is able to provide shaders for an NDA platform.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN'@: The app is able to provide SPIR-V shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN'@: The app is able to provide DXBC shaders if applicable
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN'@: The app is able to provide DXIL shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN'@: The app is able to provide MSL shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN'@: The app is able to provide Metal shader libraries if applicable.
+--
+--     With the D3D12 backend:
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING'@: the prefix to use for all vertex semantics, default is \"TEXCOORD\".
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN'@: By default, Resourcing Binding Tier 2 is required for D3D12 support. However, an application can set this property to true to enable Tier 1 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 capacity. Defaults to false.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER'@: Certain feature checks are only possible on Windows 11 by default. By setting this alongside @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING'@ and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those feature checks possible on older platforms. The version you provide must match the one given in the DLL.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING'@: Certain feature checks are only possible on Windows 11 by default. By setting this alongside @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER'@ and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those feature checks possible on older platforms. The path you provide must be relative to the executable path of your app. Be sure not to put the DLL in the same directory as the exe; Microsoft strongly advises against this!
+--
+--     With the Vulkan backend:
+--
+--     * @'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.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER'@: a pointer to an '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 minimal set SDL requires.
+--
+--     With the Metal backend: - @'sDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN'@: By default, macOS support requires what Apple calls \"MTLGPUFamilyMac2\" hardware or newer. However, an application can set this property to true to enable support for \"MTLGPUFamilyMac1\" hardware, if (and only if) the application does not write to sRGB textures. (For history\'s sake: MacFamily1 also does not support indirect command buffers, MSAA depth resolve, and stencil resolve\/feedback, but these are not exposed features in SDL_GPU.)
+--
+--     [Returns]: a GPU context on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGPUShaderFormats', 'sDL_GetGPUDeviceDriver', 'sDL_DestroyGPUDevice', 'sDL_GPUSupportsProperties'
+--
+--     [C declaration]: @SDL_CreateGPUDeviceWithProperties@, defined at @SDL3\/SDL_gpu.h 2360:45@
+sDL_CreateGPUDeviceWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_GPUDevice)
+sDL_CreateGPUDeviceWithProperties =
+  hs_bindgen_376515fb91ec90e3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DestroyGPUDevice@
+foreign import ccall unsafe "hs_bindgen_7ff5a8cdf38e3bf0"
+  hs_bindgen_7ff5a8cdf38e3bf0_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DestroyGPUDevice@
+hs_bindgen_7ff5a8cdf38e3bf0
+  :: BG.Ptr SDL_GPUDevice
+  -> IO ()
+hs_bindgen_7ff5a8cdf38e3bf0 =
+  BG.fromFFIType hs_bindgen_7ff5a8cdf38e3bf0_base
+
+-- | Destroys a GPU context previously returned by SDL_CreateGPUDevice.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUDevice'
+--
+--     [C declaration]: @SDL_DestroyGPUDevice@, defined at @SDL3\/SDL_gpu.h 2422:34@
+sDL_DestroyGPUDevice
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context to destroy.
+  -> IO ()
+sDL_DestroyGPUDevice = hs_bindgen_7ff5a8cdf38e3bf0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetNumGPUDrivers@
+foreign import ccall unsafe "hs_bindgen_6011a5df785dd689"
+  hs_bindgen_6011a5df785dd689_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetNumGPUDrivers@
+hs_bindgen_6011a5df785dd689 :: IO BG.CInt
+hs_bindgen_6011a5df785dd689 =
+  BG.fromFFIType hs_bindgen_6011a5df785dd689_base
+
+-- | Get the number of GPU drivers compiled into SDL.
+--
+--     [Returns]: the number of built in GPU drivers.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGPUDriver'
+--
+--     [C declaration]: @SDL_GetNumGPUDrivers@, defined at @SDL3\/SDL_gpu.h 2433:33@
+sDL_GetNumGPUDrivers :: IO BG.CInt
+sDL_GetNumGPUDrivers = hs_bindgen_6011a5df785dd689
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUDriver@
+foreign import ccall unsafe "hs_bindgen_5bd47cd4296c5cf8"
+  hs_bindgen_5bd47cd4296c5cf8_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUDriver@
+hs_bindgen_5bd47cd4296c5cf8
+  :: BG.CInt
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_5bd47cd4296c5cf8 =
+  BG.fromFFIType hs_bindgen_5bd47cd4296c5cf8_base
+
+-- | 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.
+--
+--     [Returns]: the name of the GPU driver with the given __index__.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumGPUDrivers'
+--
+--     [C declaration]: @SDL_GetGPUDriver@, defined at @SDL3\/SDL_gpu.h 2452:42@
+sDL_GetGPUDriver
+  :: BG.CInt
+  -- ^
+  --
+  --           [@index@]: the index of a GPU driver.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGPUDriver = hs_bindgen_5bd47cd4296c5cf8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUDeviceDriver@
+foreign import ccall unsafe "hs_bindgen_bf49abcda2b24803"
+  hs_bindgen_bf49abcda2b24803_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUDeviceDriver@
+hs_bindgen_bf49abcda2b24803
+  :: BG.Ptr SDL_GPUDevice
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_bf49abcda2b24803 =
+  BG.fromFFIType hs_bindgen_bf49abcda2b24803_base
+
+-- | Returns the name of the backend used to create this GPU context.
+--
+--     [Returns]: the name of the device\'s driver, or NULL on error.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGPUDeviceDriver@, defined at @SDL3\/SDL_gpu.h 2462:42@
+sDL_GetGPUDeviceDriver
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetGPUDeviceDriver = hs_bindgen_bf49abcda2b24803
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUShaderFormats@
+foreign import ccall unsafe "hs_bindgen_20513b344f1e3b64"
+  hs_bindgen_20513b344f1e3b64_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUShaderFormats@
+hs_bindgen_20513b344f1e3b64
+  :: BG.Ptr SDL_GPUDevice
+  -> IO SDL_GPUShaderFormat
+hs_bindgen_20513b344f1e3b64 =
+  BG.fromFFIType hs_bindgen_20513b344f1e3b64_base
+
+-- | Returns the supported shader formats for this GPU context.
+--
+--     [Returns]: a bitflag indicating which shader formats the driver is able to consume.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGPUShaderFormats@, defined at @SDL3\/SDL_gpu.h 2473:49@
+sDL_GetGPUShaderFormats
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO SDL_GPUShaderFormat
+sDL_GetGPUShaderFormats = hs_bindgen_20513b344f1e3b64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUDeviceProperties@
+foreign import ccall unsafe "hs_bindgen_caf8299b42e53b94"
+  hs_bindgen_caf8299b42e53b94_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUDeviceProperties@
+hs_bindgen_caf8299b42e53b94
+  :: BG.Ptr SDL_GPUDevice
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_caf8299b42e53b94 =
+  BG.fromFFIType hs_bindgen_caf8299b42e53b94_base
+
+-- | Get the properties associated with a GPU device.
+--
+--     All properties are optional and may differ between GPU backends and SDL versions.
+--
+--     The following properties are provided by SDL:
+--
+--     @'sDL_PROP_GPU_DEVICE_NAME_STRING'@: Contains the name of the underlying device as reported by the system driver. This string has no standardized 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.
+--
+--     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 15D8: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 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.
+--
+--     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-00eac0.824c4f31403fb1fbf8ee1042422c2129
+--
+--     This string has also been observed to be a multiline string (which has a trailing newline):
+--
+--     @
+--     Driver Build: 85da404, I46ff5fc46f, 1606794520
+--     Date: 11\/30\/20
+--     Compiler Version: EV031.31.04.01
+--     Driver Branch: promo490_3_Google
+--     @
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetGPUDeviceProperties@, defined at @SDL3\/SDL_gpu.h 2577:46@
+sDL_GetGPUDeviceProperties
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetGPUDeviceProperties =
+  hs_bindgen_caf8299b42e53b94
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUComputePipeline@
+foreign import ccall unsafe "hs_bindgen_47c9f4418564565f"
+  hs_bindgen_47c9f4418564565f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUComputePipeline@
+hs_bindgen_47c9f4418564565f
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUComputePipelineCreateInfo
+  -> IO (BG.Ptr SDL_GPUComputePipeline)
+hs_bindgen_47c9f4418564565f =
+  BG.fromFFIType hs_bindgen_47c9f4418564565f_base
+
+-- | Creates a pipeline object to be used in a compute workflow.
+--
+--     Shader resource bindings must be authored to follow a particular order depending on the shader format.
+--
+--     For SPIR-V shaders, use the following resource sets:
+--
+--     * 0: Sampled textures, followed by read-only storage textures, followed by read-only storage buffers
+--
+--     * 1: Read-write storage textures, followed by read-write storage buffers
+--
+--     * 2: Uniform buffers
+--
+--     For DXBC and DXIL shaders, use the following register order:
+--
+--     * (t[n], space0): Sampled textures, followed by read-only storage textures, followed by read-only storage buffers
+--
+--     * (u[n], space1): Read-write storage textures, followed by read-write storage buffers
+--
+--     * (b[n], space2): Uniform buffers
+--
+--     For MSL\/metallib, use the following order:
+--
+--     * [[buffer]]: Uniform buffers, followed by read-only storage buffers, followed by read-write storage buffers
+--
+--     * [[texture]]: Sampled textures, followed by read-only storage textures, followed by read-write storage textures
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a compute pipeline object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindGPUComputePipeline', 'sDL_ReleaseGPUComputePipeline'
+--
+--     [C declaration]: @SDL_CreateGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 2632:54@
+sDL_CreateGPUComputePipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUComputePipelineCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the compute pipeline to create.
+  -> IO (BG.Ptr SDL_GPUComputePipeline)
+sDL_CreateGPUComputePipeline =
+  hs_bindgen_47c9f4418564565f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUGraphicsPipeline@
+foreign import ccall unsafe "hs_bindgen_18c5db2a0d02cde2"
+  hs_bindgen_18c5db2a0d02cde2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUGraphicsPipeline@
+hs_bindgen_18c5db2a0d02cde2
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUGraphicsPipelineCreateInfo
+  -> IO (BG.Ptr SDL_GPUGraphicsPipeline)
+hs_bindgen_18c5db2a0d02cde2 =
+  BG.fromFFIType hs_bindgen_18c5db2a0d02cde2_base
+
+-- | Creates a pipeline object to be used in a graphics workflow.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a graphics pipeline object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader', 'sDL_BindGPUGraphicsPipeline', 'sDL_ReleaseGPUGraphicsPipeline'
+--
+--     [C declaration]: @SDL_CreateGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 2659:55@
+sDL_CreateGPUGraphicsPipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUGraphicsPipelineCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the graphics pipeline to create.
+  -> IO (BG.Ptr SDL_GPUGraphicsPipeline)
+sDL_CreateGPUGraphicsPipeline =
+  hs_bindgen_18c5db2a0d02cde2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUSampler@
+foreign import ccall unsafe "hs_bindgen_a1a95a3f30be0f83"
+  hs_bindgen_a1a95a3f30be0f83_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUSampler@
+hs_bindgen_a1a95a3f30be0f83
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUSamplerCreateInfo
+  -> IO (BG.Ptr SDL_GPUSampler)
+hs_bindgen_a1a95a3f30be0f83 =
+  BG.fromFFIType hs_bindgen_a1a95a3f30be0f83_base
+
+-- | Creates a sampler object to be used when binding textures in a graphics workflow.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a sampler object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BindGPUVertexSamplers', 'sDL_BindGPUFragmentSamplers', 'sDL_ReleaseGPUSampler'
+--
+--     [C declaration]: @SDL_CreateGPUSampler@, defined at @SDL3\/SDL_gpu.h 2686:46@
+sDL_CreateGPUSampler
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUSamplerCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the sampler to create.
+  -> IO (BG.Ptr SDL_GPUSampler)
+sDL_CreateGPUSampler = hs_bindgen_a1a95a3f30be0f83
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUShader@
+foreign import ccall unsafe "hs_bindgen_9bba04f484907a46"
+  hs_bindgen_9bba04f484907a46_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUShader@
+hs_bindgen_9bba04f484907a46
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUShaderCreateInfo
+  -> IO (BG.Ptr SDL_GPUShader)
+hs_bindgen_9bba04f484907a46 =
+  BG.fromFFIType hs_bindgen_9bba04f484907a46_base
+
+-- | Creates a shader to be used when creating a graphics pipeline.
+--
+--     Shader resource bindings must be authored to follow a particular order depending on the shader format.
+--
+--     For SPIR-V shaders, use the following resource sets:
+--
+--     For vertex shaders:
+--
+--     * 0: Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * 1: Uniform buffers
+--
+--     For fragment shaders:
+--
+--     * 2: Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * 3: Uniform buffers
+--
+--     For DXBC and DXIL shaders, use the following register order:
+--
+--     For vertex shaders:
+--
+--     * (t[n], space0): Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * (s[n], space0): Samplers with indices corresponding to the sampled textures
+--
+--     * (b[n], space1): Uniform buffers
+--
+--     For pixel shaders:
+--
+--     * (t[n], space2): Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * (s[n], space2): Samplers with indices corresponding to the sampled textures
+--
+--     * (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
+--
+--     * [[buffer]]: Uniform buffers, followed by storage buffers. Vertex buffer 0 is bound at [[buffer(14)]], vertex buffer 1 at [[buffer(15)]], and so on. Rather than manually authoring vertex buffer indices, use the [[stage_in]] attribute which will automatically use the vertex input information from the 'SDL_GPUGraphicsPipeline'.
+--
+--     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 SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING with @SDL_CreateGPUDeviceWithProperties()@.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_SHADER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a shader object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUGraphicsPipeline', 'sDL_ReleaseGPUShader'
+--
+--     [C declaration]: @SDL_CreateGPUShader@, defined at @SDL3\/SDL_gpu.h 2765:45@
+sDL_CreateGPUShader
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUShaderCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the shader to create.
+  -> IO (BG.Ptr SDL_GPUShader)
+sDL_CreateGPUShader = hs_bindgen_9bba04f484907a46
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUTexture@
+foreign import ccall unsafe "hs_bindgen_e954a5b015dea03b"
+  hs_bindgen_e954a5b015dea03b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUTexture@
+hs_bindgen_e954a5b015dea03b
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUTextureCreateInfo
+  -> IO (BG.Ptr SDL_GPUTexture)
+hs_bindgen_e954a5b015dea03b =
+  BG.fromFFIType hs_bindgen_e954a5b015dea03b_base
+
+-- | Creates a texture object to be used in graphics or compute workflows.
+--
+--     The contents of this texture are undefined until data is written to the texture, either via SDL_UploadToGPUTexture or by performing a render or compute pass with this texture as a target.
+--
+--     Note that certain combinations of usage flags are invalid. For example, a texture cannot have both the SAMPLER and GRAPHICS_STORAGE_READ flags.
+--
+--     If you request a sample count higher than the hardware supports, the implementation will automatically fall back to the highest available sample count.
+--
+--     There are optional properties that can be provided through 'SDL_GPUTextureCreateInfo' \'s @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this red intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this green intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this blue intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this alpha intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear the texture to a depth of this value. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear the texture to a stencil of this Uint8 value. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a texture object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUTexture', 'sDL_DownloadFromGPUTexture', 'sDL_BeginGPURenderPass', 'sDL_BeginGPUComputePass', 'sDL_BindGPUVertexSamplers', 'sDL_BindGPUVertexStorageTextures', 'sDL_BindGPUFragmentSamplers', 'sDL_BindGPUFragmentStorageTextures', 'sDL_BindGPUComputeStorageTextures', 'sDL_BlitGPUTexture', 'sDL_ReleaseGPUTexture', 'sDL_GPUTextureSupportsFormat'
+--
+--     [C declaration]: @SDL_CreateGPUTexture@, defined at @SDL3\/SDL_gpu.h 2829:46@
+sDL_CreateGPUTexture
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUTextureCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the texture to create.
+  -> IO (BG.Ptr SDL_GPUTexture)
+sDL_CreateGPUTexture = hs_bindgen_e954a5b015dea03b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUBuffer@
+foreign import ccall unsafe "hs_bindgen_ed280f9c2dd5b278"
+  hs_bindgen_ed280f9c2dd5b278_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUBuffer@
+hs_bindgen_ed280f9c2dd5b278
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUBufferCreateInfo
+  -> IO (BG.Ptr SDL_GPUBuffer)
+hs_bindgen_ed280f9c2dd5b278 =
+  BG.fromFFIType hs_bindgen_ed280f9c2dd5b278_base
+
+-- | Creates a buffer object to be used in graphics or compute workflows.
+--
+--     The contents of this buffer are undefined until data is written to the buffer.
+--
+--     Note that certain combinations of usage flags are invalid. For example, a buffer cannot have both the VERTEX and INDEX flags.
+--
+--     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.
+--
+--     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/) There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_BUFFER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a buffer object on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUBuffer', 'sDL_DownloadFromGPUBuffer', 'sDL_CopyGPUBufferToBuffer', 'sDL_BindGPUVertexBuffers', 'sDL_BindGPUIndexBuffer', 'sDL_BindGPUVertexStorageBuffers', 'sDL_BindGPUFragmentStorageBuffers', 'sDL_DrawGPUPrimitivesIndirect', 'sDL_DrawGPUIndexedPrimitivesIndirect', 'sDL_BindGPUComputeStorageBuffers', 'sDL_DispatchGPUComputeIndirect', 'sDL_ReleaseGPUBuffer'
+--
+--     [C declaration]: @SDL_CreateGPUBuffer@, defined at @SDL3\/SDL_gpu.h 2885:45@
+sDL_CreateGPUBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUBufferCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the buffer to create.
+  -> IO (BG.Ptr SDL_GPUBuffer)
+sDL_CreateGPUBuffer = hs_bindgen_ed280f9c2dd5b278
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUTransferBuffer@
+foreign import ccall unsafe "hs_bindgen_848522e8bdb350b2"
+  hs_bindgen_848522e8bdb350b2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CreateGPUTransferBuffer@
+hs_bindgen_848522e8bdb350b2
+  :: BG.Ptr SDL_GPUDevice
+  -> PtrConst.PtrConst SDL_GPUTransferBufferCreateInfo
+  -> IO (BG.Ptr SDL_GPUTransferBuffer)
+hs_bindgen_848522e8bdb350b2 =
+  BG.fromFFIType hs_bindgen_848522e8bdb350b2_base
+
+-- | Creates a transfer buffer to be used when uploading to or downloading from graphics resources.
+--
+--     Download buffers can be particularly expensive to create, so it is good practice to reuse them if data will be downloaded regularly.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a transfer buffer on success, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUBuffer', 'sDL_DownloadFromGPUBuffer', 'sDL_UploadToGPUTexture', 'sDL_DownloadFromGPUTexture', 'sDL_ReleaseGPUTransferBuffer'
+--
+--     [C declaration]: @SDL_CreateGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 2918:53@
+sDL_CreateGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the transfer buffer to create.
+  -> IO (BG.Ptr SDL_GPUTransferBuffer)
+sDL_CreateGPUTransferBuffer =
+  hs_bindgen_848522e8bdb350b2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUBufferName@
+foreign import ccall unsafe "hs_bindgen_b8e2db9733a08cbe"
+  hs_bindgen_b8e2db9733a08cbe_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUBufferName@
+hs_bindgen_b8e2db9733a08cbe
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUBuffer
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_b8e2db9733a08cbe =
+  BG.fromFFIType hs_bindgen_b8e2db9733a08cbe_base
+
+-- | Sets an arbitrary string constant to label a buffer.
+--
+--     You should use SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING with SDL_CreateGPUBuffer instead of this function to avoid thread safety issues.
+--
+--     [Thread safety]: This function is not thread safe, you must make sure the buffer is not simultaneously used by any other thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUBuffer'
+--
+--     [C declaration]: @SDL_SetGPUBufferName@, defined at @SDL3\/SDL_gpu.h 2943:34@
+sDL_SetGPUBufferName
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer to attach the name to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to mark as the name of the buffer.
+  -> IO ()
+sDL_SetGPUBufferName = hs_bindgen_b8e2db9733a08cbe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUTextureName@
+foreign import ccall unsafe "hs_bindgen_6831ff7e87614fc1"
+  hs_bindgen_6831ff7e87614fc1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUTextureName@
+hs_bindgen_6831ff7e87614fc1
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUTexture
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_6831ff7e87614fc1 =
+  BG.fromFFIType hs_bindgen_6831ff7e87614fc1_base
+
+-- | Sets an arbitrary string constant to label a texture.
+--
+--     You should use SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING with SDL_CreateGPUTexture instead of this function to avoid thread safety issues.
+--
+--     [Thread safety]: This function is not thread safe, you must make sure the texture is not simultaneously used by any other thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUTexture'
+--
+--     [C declaration]: @SDL_SetGPUTextureName@, defined at @SDL3\/SDL_gpu.h 2966:34@
+sDL_SetGPUTextureName
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture to attach the name to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to mark as the name of the texture.
+  -> IO ()
+sDL_SetGPUTextureName = hs_bindgen_6831ff7e87614fc1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_InsertGPUDebugLabel@
+foreign import ccall unsafe "hs_bindgen_56a7e36b3e8524dd"
+  hs_bindgen_56a7e36b3e8524dd_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_InsertGPUDebugLabel@
+hs_bindgen_56a7e36b3e8524dd
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_56a7e36b3e8524dd =
+  BG.fromFFIType hs_bindgen_56a7e36b3e8524dd_base
+
+-- | Inserts an arbitrary string label into the command buffer callstream.
+--
+--     Useful for debugging.
+--
+--     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/) for instructions on how to obtain it.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_InsertGPUDebugLabel@, defined at @SDL3\/SDL_gpu.h 2987:34@
+sDL_InsertGPUDebugLabel
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to insert as the label.
+  -> IO ()
+sDL_InsertGPUDebugLabel = hs_bindgen_56a7e36b3e8524dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_PushGPUDebugGroup@
+foreign import ccall unsafe "hs_bindgen_41af45d04529f84d"
+  hs_bindgen_41af45d04529f84d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_PushGPUDebugGroup@
+hs_bindgen_41af45d04529f84d
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_41af45d04529f84d =
+  BG.fromFFIType hs_bindgen_41af45d04529f84d_base
+
+-- | Begins a debug group with an arbitrary name.
+--
+--     Used for denoting groups of calls when viewing the command buffer callstream in a graphics debugging tool.
+--
+--     Each call to SDL_PushGPUDebugGroup must have a corresponding call to SDL_PopGPUDebugGroup.
+--
+--     On Direct3D 12, using SDL_PushGPUDebugGroup requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable. See [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) for instructions on how to obtain it.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PopGPUDebugGroup'
+--
+--     [C declaration]: @SDL_PushGPUDebugGroup@, defined at @SDL3\/SDL_gpu.h 3017:34@
+sDL_PushGPUDebugGroup
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: a UTF-8 string constant that names the group.
+  -> IO ()
+sDL_PushGPUDebugGroup = hs_bindgen_41af45d04529f84d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_PopGPUDebugGroup@
+foreign import ccall unsafe "hs_bindgen_5dae404b2ebaa08b"
+  hs_bindgen_5dae404b2ebaa08b_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_PopGPUDebugGroup@
+hs_bindgen_5dae404b2ebaa08b
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> IO ()
+hs_bindgen_5dae404b2ebaa08b =
+  BG.fromFFIType hs_bindgen_5dae404b2ebaa08b_base
+
+-- | Ends the most-recently pushed debug group.
+--
+--     On Direct3D 12, using SDL_PopGPUDebugGroup requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable. See [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) for instructions on how to obtain it.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PushGPUDebugGroup'
+--
+--     [C declaration]: @SDL_PopGPUDebugGroup@, defined at @SDL3\/SDL_gpu.h 3035:34@
+sDL_PopGPUDebugGroup
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO ()
+sDL_PopGPUDebugGroup = hs_bindgen_5dae404b2ebaa08b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUTexture@
+foreign import ccall unsafe "hs_bindgen_64db5410128eae2d"
+  hs_bindgen_64db5410128eae2d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUTexture@
+hs_bindgen_64db5410128eae2d
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUTexture
+  -> IO ()
+hs_bindgen_64db5410128eae2d =
+  BG.fromFFIType hs_bindgen_64db5410128eae2d_base
+
+-- | Frees the given texture as soon as it is safe to do so.
+--
+--     You must not reference the texture after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUTexture@, defined at @SDL3\/SDL_gpu.h 3050:34@
+sDL_ReleaseGPUTexture
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUTexture = hs_bindgen_64db5410128eae2d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUSampler@
+foreign import ccall unsafe "hs_bindgen_13cdb1700ceeed7f"
+  hs_bindgen_13cdb1700ceeed7f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUSampler@
+hs_bindgen_13cdb1700ceeed7f
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUSampler
+  -> IO ()
+hs_bindgen_13cdb1700ceeed7f =
+  BG.fromFFIType hs_bindgen_13cdb1700ceeed7f_base
+
+-- | Frees the given sampler as soon as it is safe to do so.
+--
+--     You must not reference the sampler after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUSampler@, defined at @SDL3\/SDL_gpu.h 3064:34@
+sDL_ReleaseGPUSampler
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUSampler
+  -- ^
+  --
+  --           [@sampler@]: a sampler to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUSampler = hs_bindgen_13cdb1700ceeed7f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUBuffer@
+foreign import ccall unsafe "hs_bindgen_fcdfc18ed875a278"
+  hs_bindgen_fcdfc18ed875a278_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUBuffer@
+hs_bindgen_fcdfc18ed875a278
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUBuffer
+  -> IO ()
+hs_bindgen_fcdfc18ed875a278 =
+  BG.fromFFIType hs_bindgen_fcdfc18ed875a278_base
+
+-- | Frees the given buffer as soon as it is safe to do so.
+--
+--     You must not reference the buffer after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUBuffer@, defined at @SDL3\/SDL_gpu.h 3078:34@
+sDL_ReleaseGPUBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUBuffer = hs_bindgen_fcdfc18ed875a278
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUTransferBuffer@
+foreign import ccall unsafe "hs_bindgen_e731b5deaeeee3c1"
+  hs_bindgen_e731b5deaeeee3c1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUTransferBuffer@
+hs_bindgen_e731b5deaeeee3c1
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -> IO ()
+hs_bindgen_e731b5deaeeee3c1 =
+  BG.fromFFIType hs_bindgen_e731b5deaeeee3c1_base
+
+-- | Frees the given transfer buffer as soon as it is safe to do so.
+--
+--     You must not reference the transfer buffer after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3092:34@
+sDL_ReleaseGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a transfer buffer to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUTransferBuffer =
+  hs_bindgen_e731b5deaeeee3c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUComputePipeline@
+foreign import ccall unsafe "hs_bindgen_f9bd20900c9e4080"
+  hs_bindgen_f9bd20900c9e4080_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUComputePipeline@
+hs_bindgen_f9bd20900c9e4080
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUComputePipeline
+  -> IO ()
+hs_bindgen_f9bd20900c9e4080 =
+  BG.fromFFIType hs_bindgen_f9bd20900c9e4080_base
+
+-- | Frees the given compute pipeline as soon as it is safe to do so.
+--
+--     You must not reference the compute pipeline after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 3106:34@
+sDL_ReleaseGPUComputePipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUComputePipeline
+  -- ^
+  --
+  --           [@compute_pipeline@]: a compute pipeline to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUComputePipeline =
+  hs_bindgen_f9bd20900c9e4080
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUShader@
+foreign import ccall unsafe "hs_bindgen_e516abeced8d372b"
+  hs_bindgen_e516abeced8d372b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUShader@
+hs_bindgen_e516abeced8d372b
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUShader
+  -> IO ()
+hs_bindgen_e516abeced8d372b =
+  BG.fromFFIType hs_bindgen_e516abeced8d372b_base
+
+-- | Frees the given shader as soon as it is safe to do so.
+--
+--     You must not reference the shader after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUShader@, defined at @SDL3\/SDL_gpu.h 3120:34@
+sDL_ReleaseGPUShader
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUShader
+  -- ^
+  --
+  --           [@shader@]: a shader to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUShader = hs_bindgen_e516abeced8d372b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUGraphicsPipeline@
+foreign import ccall unsafe "hs_bindgen_9c01a03b4ad6f8be"
+  hs_bindgen_9c01a03b4ad6f8be_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUGraphicsPipeline@
+hs_bindgen_9c01a03b4ad6f8be
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -> IO ()
+hs_bindgen_9c01a03b4ad6f8be =
+  BG.fromFFIType hs_bindgen_9c01a03b4ad6f8be_base
+
+-- | Frees the given graphics pipeline as soon as it is safe to do so.
+--
+--     You must not reference the graphics pipeline after calling this function.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReleaseGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 3134:34@
+sDL_ReleaseGPUGraphicsPipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -- ^
+  --
+  --           [@graphics_pipeline@]: a graphics pipeline to be destroyed.
+  -> IO ()
+sDL_ReleaseGPUGraphicsPipeline =
+  hs_bindgen_9c01a03b4ad6f8be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_AcquireGPUCommandBuffer@
+foreign import ccall unsafe "hs_bindgen_27337c63b7093b75"
+  hs_bindgen_27337c63b7093b75_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_AcquireGPUCommandBuffer@
+hs_bindgen_27337c63b7093b75
+  :: BG.Ptr SDL_GPUDevice
+  -> IO (BG.Ptr SDL_GPUCommandBuffer)
+hs_bindgen_27337c63b7093b75 =
+  BG.fromFFIType hs_bindgen_27337c63b7093b75_base
+
+-- | Acquire a command buffer.
+--
+--     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.
+--
+--     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.
+--
+--     [Returns]: a command buffer, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBuffer', 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_AcquireGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 3162:52@
+sDL_AcquireGPUCommandBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> IO (BG.Ptr SDL_GPUCommandBuffer)
+sDL_AcquireGPUCommandBuffer =
+  hs_bindgen_27337c63b7093b75
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_PushGPUVertexUniformData@
+foreign import ccall unsafe "hs_bindgen_a5504d727b5181e0"
+  hs_bindgen_a5504d727b5181e0_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_PushGPUVertexUniformData@
+hs_bindgen_a5504d727b5181e0
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_a5504d727b5181e0 =
+  BG.fromFFIType hs_bindgen_a5504d727b5181e0_base
+
+-- | Pushes data to a vertex uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     For detailed information about accessing uniform data from a shader, please refer to SDL_CreateGPUShader.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PushGPUVertexUniformData@, defined at @SDL3\/SDL_gpu.h 3186:34@
+sDL_PushGPUVertexUniformData
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@slot_index@]: the vertex uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+sDL_PushGPUVertexUniformData =
+  hs_bindgen_a5504d727b5181e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_PushGPUFragmentUniformData@
+foreign import ccall unsafe "hs_bindgen_c1b93561fe6f3eb8"
+  hs_bindgen_c1b93561fe6f3eb8_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_PushGPUFragmentUniformData@
+hs_bindgen_c1b93561fe6f3eb8
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_c1b93561fe6f3eb8 =
+  BG.fromFFIType hs_bindgen_c1b93561fe6f3eb8_base
+
+-- | Pushes data to a fragment uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PushGPUFragmentUniformData@, defined at @SDL3\/SDL_gpu.h 3208:34@
+sDL_PushGPUFragmentUniformData
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@slot_index@]: the fragment uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+sDL_PushGPUFragmentUniformData =
+  hs_bindgen_c1b93561fe6f3eb8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_PushGPUComputeUniformData@
+foreign import ccall unsafe "hs_bindgen_267be67577031d05"
+  hs_bindgen_267be67577031d05_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_PushGPUComputeUniformData@
+hs_bindgen_267be67577031d05
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_267be67577031d05 =
+  BG.fromFFIType hs_bindgen_267be67577031d05_base
+
+-- | Pushes data to a uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PushGPUComputeUniformData@, defined at @SDL3\/SDL_gpu.h 3230:34@
+sDL_PushGPUComputeUniformData
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@slot_index@]: the uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+sDL_PushGPUComputeUniformData =
+  hs_bindgen_267be67577031d05
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BeginGPURenderPass@
+foreign import ccall unsafe "hs_bindgen_b04297da6f821242"
+  hs_bindgen_b04297da6f821242_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BeginGPURenderPass@
+hs_bindgen_b04297da6f821242
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> PtrConst.PtrConst SDL_GPUColorTargetInfo
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUDepthStencilTargetInfo
+  -> IO (BG.Ptr SDL_GPURenderPass)
+hs_bindgen_b04297da6f821242 =
+  BG.fromFFIType hs_bindgen_b04297da6f821242_base
+
+-- | Begins a render pass on a command buffer.
+--
+--     A render pass consists of a set of texture subresources (or depth slices in the 3D 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.
+--
+--     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.
+--
+--     [Returns]: a render pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EndGPURenderPass'
+--
+--     [C declaration]: @SDL_BeginGPURenderPass@, defined at @SDL3\/SDL_gpu.h 3271:49@
+sDL_BeginGPURenderPass
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUColorTargetInfo
+  -- ^
+  --
+  --           [@color_target_infos@]: an array of texture subresources with corresponding clear values and load\/store ops.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_color_targets@]: the number of color targets in the color_target_infos array.
+  -> PtrConst.PtrConst SDL_GPUDepthStencilTargetInfo
+  -- ^
+  --
+  --           [@depth_stencil_target_info@]: a texture subresource with corresponding clear value and load\/store ops, may be NULL.
+  -> IO (BG.Ptr SDL_GPURenderPass)
+sDL_BeginGPURenderPass = hs_bindgen_b04297da6f821242
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUGraphicsPipeline@
+foreign import ccall unsafe "hs_bindgen_a6ebeaec23a3eebc"
+  hs_bindgen_a6ebeaec23a3eebc_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUGraphicsPipeline@
+hs_bindgen_a6ebeaec23a3eebc
+  :: BG.Ptr SDL_GPURenderPass
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -> IO ()
+hs_bindgen_a6ebeaec23a3eebc =
+  BG.fromFFIType hs_bindgen_a6ebeaec23a3eebc_base
+
+-- | Binds a graphics pipeline on a render pass to be used in rendering.
+--
+--     A graphics pipeline must be bound before making any draw calls.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 3287:34@
+sDL_BindGPUGraphicsPipeline
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -- ^
+  --
+  --           [@graphics_pipeline@]: the graphics pipeline to bind.
+  -> IO ()
+sDL_BindGPUGraphicsPipeline =
+  hs_bindgen_a6ebeaec23a3eebc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUViewport@
+foreign import ccall unsafe "hs_bindgen_f53e27fd1f10bfea"
+  hs_bindgen_f53e27fd1f10bfea_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUViewport@
+hs_bindgen_f53e27fd1f10bfea
+  :: BG.Ptr SDL_GPURenderPass
+  -> PtrConst.PtrConst SDL_GPUViewport
+  -> IO ()
+hs_bindgen_f53e27fd1f10bfea =
+  BG.fromFFIType hs_bindgen_f53e27fd1f10bfea_base
+
+-- | Sets the current viewport state on a command buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUViewport@, defined at @SDL3\/SDL_gpu.h 3299:34@
+sDL_SetGPUViewport
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL_GPUViewport
+  -- ^
+  --
+  --           [@viewport@]: the viewport to set.
+  -> IO ()
+sDL_SetGPUViewport = hs_bindgen_f53e27fd1f10bfea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUScissor@
+foreign import ccall unsafe "hs_bindgen_bc8dd2f3086d94d5"
+  hs_bindgen_bc8dd2f3086d94d5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUScissor@
+hs_bindgen_bc8dd2f3086d94d5
+  :: BG.Ptr SDL_GPURenderPass
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO ()
+hs_bindgen_bc8dd2f3086d94d5 =
+  BG.fromFFIType hs_bindgen_bc8dd2f3086d94d5_base
+
+-- | Sets the current scissor state on a command buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUScissor@, defined at @SDL3\/SDL_gpu.h 3311:34@
+sDL_SetGPUScissor
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@scissor@]: the scissor area to set.
+  -> IO ()
+sDL_SetGPUScissor = hs_bindgen_bc8dd2f3086d94d5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUBlendConstants@
+foreign import ccall unsafe "hs_bindgen_85e648c31f1fcb70"
+  hs_bindgen_85e648c31f1fcb70_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUBlendConstants@
+hs_bindgen_85e648c31f1fcb70
+  :: BG.Ptr SDL_GPURenderPass
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -> IO ()
+hs_bindgen_85e648c31f1fcb70 =
+  BG.fromFFIType hs_bindgen_85e648c31f1fcb70_base
+
+-- | Sets the current blend constants on a command buffer.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_GPU_BLENDFACTOR_CONSTANT_COLOR@, @SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR@
+--
+--     [C declaration]: @SDL_SetGPUBlendConstants@, defined at @SDL3\/SDL_gpu.h 3326:34@
+sDL_SetGPUBlendConstants
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^
+  --
+  --           [@blend_constants@]: the blend constant color.
+  -> IO ()
+sDL_SetGPUBlendConstants =
+  \render_pass0 ->
+    \blend_constants1 ->
+      BG.with
+        blend_constants1
+        ( \blend_constants2 ->
+            hs_bindgen_85e648c31f1fcb70 render_pass0 blend_constants2
+        )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUStencilReference@
+foreign import ccall unsafe "hs_bindgen_142400b7edd5f15e"
+  hs_bindgen_142400b7edd5f15e_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUStencilReference@
+hs_bindgen_142400b7edd5f15e
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO ()
+hs_bindgen_142400b7edd5f15e =
+  BG.fromFFIType hs_bindgen_142400b7edd5f15e_base
+
+-- | Sets the current stencil reference value on a command buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUStencilReference@, defined at @SDL3\/SDL_gpu.h 3338:34@
+sDL_SetGPUStencilReference
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@reference@]: the stencil reference value to set.
+  -> IO ()
+sDL_SetGPUStencilReference =
+  hs_bindgen_142400b7edd5f15e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUVertexBuffers@
+foreign import ccall unsafe "hs_bindgen_049713abad47ef65"
+  hs_bindgen_049713abad47ef65_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUVertexBuffers@
+hs_bindgen_049713abad47ef65
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_049713abad47ef65 =
+  BG.fromFFIType hs_bindgen_049713abad47ef65_base
+
+-- | Binds vertex buffers on a command buffer for use with subsequent draw calls.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUVertexBuffers@, defined at @SDL3\/SDL_gpu.h 3354:34@
+sDL_BindGPUVertexBuffers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex buffer slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -- ^
+  --
+  --           [@bindings@]: an array of 'SDL_GPUBufferBinding' structs containing vertex buffers and offset values.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of bindings in the bindings array.
+  -> IO ()
+sDL_BindGPUVertexBuffers =
+  hs_bindgen_049713abad47ef65
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUIndexBuffer@
+foreign import ccall unsafe "hs_bindgen_eebac58434b8d6c1"
+  hs_bindgen_eebac58434b8d6c1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUIndexBuffer@
+hs_bindgen_eebac58434b8d6c1
+  :: BG.Ptr SDL_GPURenderPass
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -> SDL_GPUIndexElementSize
+  -> IO ()
+hs_bindgen_eebac58434b8d6c1 =
+  BG.fromFFIType hs_bindgen_eebac58434b8d6c1_base
+
+-- | Binds an index buffer on a command buffer for use with subsequent draw calls.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUIndexBuffer@, defined at @SDL3\/SDL_gpu.h 3371:34@
+sDL_BindGPUIndexBuffer
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -- ^
+  --
+  --           [@binding@]: a pointer to a struct containing an index buffer and offset.
+  -> SDL_GPUIndexElementSize
+  -- ^
+  --
+  --           [@index_element_size@]: whether the index values in the buffer are 16- or 32-bit.
+  -> IO ()
+sDL_BindGPUIndexBuffer = hs_bindgen_eebac58434b8d6c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUVertexSamplers@
+foreign import ccall unsafe "hs_bindgen_466757558b7a4998"
+  hs_bindgen_466757558b7a4998_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUVertexSamplers@
+hs_bindgen_466757558b7a4998
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_466757558b7a4998 =
+  BG.fromFFIType hs_bindgen_466757558b7a4998_base
+
+-- | Binds texture-sampler pairs for use on the vertex shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUVertexSamplers@, defined at @SDL3\/SDL_gpu.h 3395:34@
+sDL_BindGPUVertexSamplers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler pairs to bind from the array.
+  -> IO ()
+sDL_BindGPUVertexSamplers =
+  hs_bindgen_466757558b7a4998
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUVertexStorageTextures@
+foreign import ccall unsafe "hs_bindgen_3099fb36563a23bf"
+  hs_bindgen_3099fb36563a23bf_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUVertexStorageTextures@
+hs_bindgen_3099fb36563a23bf
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_3099fb36563a23bf =
+  BG.fromFFIType hs_bindgen_3099fb36563a23bf_base
+
+-- | Binds storage textures for use on the vertex shader.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUVertexStorageTextures@, defined at @SDL3\/SDL_gpu.h 3419:34@
+sDL_BindGPUVertexStorageTextures
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage texture to bind from the array.
+  -> IO ()
+sDL_BindGPUVertexStorageTextures =
+  hs_bindgen_3099fb36563a23bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUVertexStorageBuffers@
+foreign import ccall unsafe "hs_bindgen_114f1ec46d1c4ca1"
+  hs_bindgen_114f1ec46d1c4ca1_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUVertexStorageBuffers@
+hs_bindgen_114f1ec46d1c4ca1
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_114f1ec46d1c4ca1 =
+  BG.fromFFIType hs_bindgen_114f1ec46d1c4ca1_base
+
+-- | Binds storage buffers for use on the vertex shader.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUVertexStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3443:34@
+sDL_BindGPUVertexStorageBuffers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of buffers.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of buffers to bind from the array.
+  -> IO ()
+sDL_BindGPUVertexStorageBuffers =
+  hs_bindgen_114f1ec46d1c4ca1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUFragmentSamplers@
+foreign import ccall unsafe "hs_bindgen_6120c617bd5f9a53"
+  hs_bindgen_6120c617bd5f9a53_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUFragmentSamplers@
+hs_bindgen_6120c617bd5f9a53
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_6120c617bd5f9a53 =
+  BG.fromFFIType hs_bindgen_6120c617bd5f9a53_base
+
+-- | Binds texture-sampler pairs for use on the fragment shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUFragmentSamplers@, defined at @SDL3\/SDL_gpu.h 3468:34@
+sDL_BindGPUFragmentSamplers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler pairs to bind from the array.
+  -> IO ()
+sDL_BindGPUFragmentSamplers =
+  hs_bindgen_6120c617bd5f9a53
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUFragmentStorageTextures@
+foreign import ccall unsafe "hs_bindgen_a5741f59885921f3"
+  hs_bindgen_a5741f59885921f3_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUFragmentStorageTextures@
+hs_bindgen_a5741f59885921f3
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_a5741f59885921f3 =
+  BG.fromFFIType hs_bindgen_a5741f59885921f3_base
+
+-- | Binds storage textures for use on the fragment shader.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUFragmentStorageTextures@, defined at @SDL3\/SDL_gpu.h 3492:34@
+sDL_BindGPUFragmentStorageTextures
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage textures to bind from the array.
+  -> IO ()
+sDL_BindGPUFragmentStorageTextures =
+  hs_bindgen_a5741f59885921f3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUFragmentStorageBuffers@
+foreign import ccall unsafe "hs_bindgen_2cc12141ee4494d6"
+  hs_bindgen_2cc12141ee4494d6_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUFragmentStorageBuffers@
+hs_bindgen_2cc12141ee4494d6
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_2cc12141ee4494d6 =
+  BG.fromFFIType hs_bindgen_2cc12141ee4494d6_base
+
+-- | Binds storage buffers for use on the fragment shader.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUShader()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUShader'
+--
+--     [C declaration]: @SDL_BindGPUFragmentStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3516:34@
+sDL_BindGPUFragmentStorageBuffers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of storage buffers.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage buffers to bind from the array.
+  -> IO ()
+sDL_BindGPUFragmentStorageBuffers =
+  hs_bindgen_2cc12141ee4494d6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DrawGPUIndexedPrimitives@
+foreign import ccall unsafe "hs_bindgen_87e007a9ec36edc3"
+  hs_bindgen_87e007a9ec36edc3_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Int32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DrawGPUIndexedPrimitives@
+hs_bindgen_87e007a9ec36edc3
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_87e007a9ec36edc3 =
+  BG.fromFFIType hs_bindgen_87e007a9ec36edc3_base
+
+-- | Draws data using bound graphics state with an index buffer and instancing enabled.
+--
+--     You must not call this function before binding a graphics pipeline.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUIndexedPrimitives@, defined at @SDL3\/SDL_gpu.h 3547:34@
+sDL_DrawGPUIndexedPrimitives
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_indices@]: the number of indices to draw per instance.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_instances@]: the number of instances to draw.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_index@]: the starting index within the index buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@vertex_offset@]: value added to vertex index before indexing into the vertex buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_instance@]: the ID of the first instance to draw.
+  -> IO ()
+sDL_DrawGPUIndexedPrimitives =
+  hs_bindgen_87e007a9ec36edc3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DrawGPUPrimitives@
+foreign import ccall unsafe "hs_bindgen_7b242b637f0074d8"
+  hs_bindgen_7b242b637f0074d8_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DrawGPUPrimitives@
+hs_bindgen_7b242b637f0074d8
+  :: BG.Ptr SDL_GPURenderPass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_7b242b637f0074d8 =
+  BG.fromFFIType hs_bindgen_7b242b637f0074d8_base
+
+-- | Draws data using bound graphics state.
+--
+--     You must not call this function before binding a graphics pipeline.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUPrimitives@, defined at @SDL3\/SDL_gpu.h 3575:34@
+sDL_DrawGPUPrimitives
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_vertices@]: the number of vertices to draw.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_instances@]: the number of instances that will be drawn.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_vertex@]: the index of the first vertex to draw.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_instance@]: the ID of the first instance to draw.
+  -> IO ()
+sDL_DrawGPUPrimitives = hs_bindgen_7b242b637f0074d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DrawGPUPrimitivesIndirect@
+foreign import ccall unsafe "hs_bindgen_38685ef53cdffb5f"
+  hs_bindgen_38685ef53cdffb5f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DrawGPUPrimitivesIndirect@
+hs_bindgen_38685ef53cdffb5f
+  :: BG.Ptr SDL_GPURenderPass
+  -> BG.Ptr SDL_GPUBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_38685ef53cdffb5f =
+  BG.fromFFIType hs_bindgen_38685ef53cdffb5f_base
+
+-- | Draws data using bound graphics state and with draw parameters set from a buffer.
+--
+--     The buffer must consist of tightly-packed draw parameter sets that each match the layout of 'SDL_GPUIndirectDrawCommand'. You must not call this function before binding a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUPrimitivesIndirect@, defined at @SDL3\/SDL_gpu.h 3598:34@
+sDL_DrawGPUPrimitivesIndirect
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing draw parameters.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the draw buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@draw_count@]: the number of draw parameter sets that should be read from the draw buffer.
+  -> IO ()
+sDL_DrawGPUPrimitivesIndirect =
+  hs_bindgen_38685ef53cdffb5f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DrawGPUIndexedPrimitivesIndirect@
+foreign import ccall unsafe "hs_bindgen_04835577dd24b594"
+  hs_bindgen_04835577dd24b594_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DrawGPUIndexedPrimitivesIndirect@
+hs_bindgen_04835577dd24b594
+  :: BG.Ptr SDL_GPURenderPass
+  -> BG.Ptr SDL_GPUBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_04835577dd24b594 =
+  BG.fromFFIType hs_bindgen_04835577dd24b594_base
+
+-- | Draws data using bound graphics state with an index buffer enabled and with draw parameters set from a buffer.
+--
+--     The buffer must consist of tightly-packed draw parameter sets that each match the layout of 'SDL_GPUIndexedIndirectDrawCommand'. You must not call this function before binding a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DrawGPUIndexedPrimitivesIndirect@, defined at @SDL3\/SDL_gpu.h 3620:34@
+sDL_DrawGPUIndexedPrimitivesIndirect
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing draw parameters.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the draw buffer.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@draw_count@]: the number of draw parameter sets that should be read from the draw buffer.
+  -> IO ()
+sDL_DrawGPUIndexedPrimitivesIndirect =
+  hs_bindgen_04835577dd24b594
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_EndGPURenderPass@
+foreign import ccall unsafe "hs_bindgen_cd298cdaadbf367d"
+  hs_bindgen_cd298cdaadbf367d_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_EndGPURenderPass@
+hs_bindgen_cd298cdaadbf367d
+  :: BG.Ptr SDL_GPURenderPass
+  -> IO ()
+hs_bindgen_cd298cdaadbf367d =
+  BG.fromFFIType hs_bindgen_cd298cdaadbf367d_base
+
+-- | Ends the given render pass.
+--
+--     All bound graphics state on the render pass command buffer is unset. The render pass handle is now invalid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EndGPURenderPass@, defined at @SDL3\/SDL_gpu.h 3636:34@
+sDL_EndGPURenderPass
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> IO ()
+sDL_EndGPURenderPass = hs_bindgen_cd298cdaadbf367d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BeginGPUComputePass@
+foreign import ccall unsafe "hs_bindgen_7e4922a40e945137"
+  hs_bindgen_7e4922a40e945137_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BeginGPUComputePass@
+hs_bindgen_7e4922a40e945137
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> PtrConst.PtrConst SDL_GPUStorageTextureReadWriteBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUStorageBufferReadWriteBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO (BG.Ptr SDL_GPUComputePass)
+hs_bindgen_7e4922a40e945137 =
+  BG.fromFFIType hs_bindgen_7e4922a40e945137_base
+
+-- | Begins a compute pass on a command buffer.
+--
+--     A compute pass is defined by a set of texture subresources and buffers that may be written to by compute pipelines. These textures and buffers must 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!
+--
+--     [Returns]: a compute pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EndGPUComputePass'
+--
+--     [C declaration]: @SDL_BeginGPUComputePass@, defined at @SDL3\/SDL_gpu.h 3678:50@
+sDL_BeginGPUComputePass
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUStorageTextureReadWriteBinding
+  -- ^
+  --
+  --           [@storage_texture_bindings@]: an array of writeable storage texture binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_storage_texture_bindings@]: the number of storage textures to bind from the array.
+  -> PtrConst.PtrConst SDL_GPUStorageBufferReadWriteBinding
+  -- ^
+  --
+  --           [@storage_buffer_bindings@]: an array of writeable storage buffer binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_storage_buffer_bindings@]: the number of storage buffers to bind from the array.
+  -> IO (BG.Ptr SDL_GPUComputePass)
+sDL_BeginGPUComputePass = hs_bindgen_7e4922a40e945137
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUComputePipeline@
+foreign import ccall unsafe "hs_bindgen_3d4216ca508a9022"
+  hs_bindgen_3d4216ca508a9022_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUComputePipeline@
+hs_bindgen_3d4216ca508a9022
+  :: BG.Ptr SDL_GPUComputePass
+  -> BG.Ptr SDL_GPUComputePipeline
+  -> IO ()
+hs_bindgen_3d4216ca508a9022 =
+  BG.fromFFIType hs_bindgen_3d4216ca508a9022_base
+
+-- | Binds a compute pipeline on a command buffer for use in compute dispatch.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BindGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 3693:34@
+sDL_BindGPUComputePipeline
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Ptr SDL_GPUComputePipeline
+  -- ^
+  --
+  --           [@compute_pipeline@]: a compute pipeline to bind.
+  -> IO ()
+sDL_BindGPUComputePipeline =
+  hs_bindgen_3d4216ca508a9022
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUComputeSamplers@
+foreign import ccall unsafe "hs_bindgen_2a02bb807885f88d"
+  hs_bindgen_2a02bb807885f88d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUComputeSamplers@
+hs_bindgen_2a02bb807885f88d
+  :: BG.Ptr SDL_GPUComputePass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_2a02bb807885f88d =
+  BG.fromFFIType hs_bindgen_2a02bb807885f88d_base
+
+-- | Binds texture-sampler pairs for use on the compute shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUComputePipeline()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline'
+--
+--     [C declaration]: @SDL_BindGPUComputeSamplers@, defined at @SDL3\/SDL_gpu.h 3716:34@
+sDL_BindGPUComputeSamplers
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the compute sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler bindings to bind from the array.
+  -> IO ()
+sDL_BindGPUComputeSamplers =
+  hs_bindgen_2a02bb807885f88d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUComputeStorageTextures@
+foreign import ccall unsafe "hs_bindgen_a743533e288c69f5"
+  hs_bindgen_a743533e288c69f5_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUComputeStorageTextures@
+hs_bindgen_a743533e288c69f5
+  :: BG.Ptr SDL_GPUComputePass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_a743533e288c69f5 =
+  BG.fromFFIType hs_bindgen_a743533e288c69f5_base
+
+-- | Binds storage textures as readonly for use on the compute pipeline.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUComputePipeline()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline'
+--
+--     [C declaration]: @SDL_BindGPUComputeStorageTextures@, defined at @SDL3\/SDL_gpu.h 3740:34@
+sDL_BindGPUComputeStorageTextures
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the compute storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage textures to bind from the array.
+  -> IO ()
+sDL_BindGPUComputeStorageTextures =
+  hs_bindgen_a743533e288c69f5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUComputeStorageBuffers@
+foreign import ccall unsafe "hs_bindgen_1be365d38addb5cf"
+  hs_bindgen_1be365d38addb5cf_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BindGPUComputeStorageBuffers@
+hs_bindgen_1be365d38addb5cf
+  :: BG.Ptr SDL_GPUComputePass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_1be365d38addb5cf =
+  BG.fromFFIType hs_bindgen_1be365d38addb5cf_base
+
+-- | Binds storage buffers as readonly for use on the compute pipeline.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @SDL_CreateGPUComputePipeline()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateGPUComputePipeline'
+--
+--     [C declaration]: @SDL_BindGPUComputeStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3764:34@
+sDL_BindGPUComputeStorageBuffers
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@first_slot@]: the compute storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of storage buffer binding structs.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage buffers to bind from the array.
+  -> IO ()
+sDL_BindGPUComputeStorageBuffers =
+  hs_bindgen_1be365d38addb5cf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DispatchGPUCompute@
+foreign import ccall unsafe "hs_bindgen_08d7249b66bd0658"
+  hs_bindgen_08d7249b66bd0658_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DispatchGPUCompute@
+hs_bindgen_08d7249b66bd0658
+  :: BG.Ptr SDL_GPUComputePass
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_08d7249b66bd0658 =
+  BG.fromFFIType hs_bindgen_08d7249b66bd0658_base
+
+-- | Dispatches compute work.
+--
+--     You must not call this function before binding a compute pipeline.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DispatchGPUCompute@, defined at @SDL3\/SDL_gpu.h 3790:34@
+sDL_DispatchGPUCompute
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@groupcount_x@]: number of local workgroups to dispatch in the X dimension.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@groupcount_y@]: number of local workgroups to dispatch in the Y dimension.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@groupcount_z@]: number of local workgroups to dispatch in the Z dimension.
+  -> IO ()
+sDL_DispatchGPUCompute = hs_bindgen_08d7249b66bd0658
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DispatchGPUComputeIndirect@
+foreign import ccall unsafe "hs_bindgen_9b425608a854a4f5"
+  hs_bindgen_9b425608a854a4f5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DispatchGPUComputeIndirect@
+hs_bindgen_9b425608a854a4f5
+  :: BG.Ptr SDL_GPUComputePass
+  -> BG.Ptr SDL_GPUBuffer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_9b425608a854a4f5 =
+  BG.fromFFIType hs_bindgen_9b425608a854a4f5_base
+
+-- | Dispatches compute work with parameters set from a buffer.
+--
+--     The buffer layout should match the layout of 'SDL_GPUIndirectDispatchCommand'. You must not call this function before binding a compute pipeline.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DispatchGPUComputeIndirect@, defined at @SDL3\/SDL_gpu.h 3814:34@
+sDL_DispatchGPUComputeIndirect
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing dispatch parameters.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the dispatch buffer.
+  -> IO ()
+sDL_DispatchGPUComputeIndirect =
+  hs_bindgen_9b425608a854a4f5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_EndGPUComputePass@
+foreign import ccall unsafe "hs_bindgen_bf20561443153c08"
+  hs_bindgen_bf20561443153c08_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_EndGPUComputePass@
+hs_bindgen_bf20561443153c08
+  :: BG.Ptr SDL_GPUComputePass
+  -> IO ()
+hs_bindgen_bf20561443153c08 =
+  BG.fromFFIType hs_bindgen_bf20561443153c08_base
+
+-- | Ends the current compute pass.
+--
+--     All bound compute state on the command buffer is unset. The compute pass handle is now invalid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EndGPUComputePass@, defined at @SDL3\/SDL_gpu.h 3829:34@
+sDL_EndGPUComputePass
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> IO ()
+sDL_EndGPUComputePass = hs_bindgen_bf20561443153c08
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_MapGPUTransferBuffer@
+foreign import ccall unsafe "hs_bindgen_075892bcba4ad890"
+  hs_bindgen_075892bcba4ad890_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_MapGPUTransferBuffer@
+hs_bindgen_075892bcba4ad890
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -> BG.CBool
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_075892bcba4ad890 =
+  BG.fromFFIType hs_bindgen_075892bcba4ad890_base
+
+-- | Maps a transfer buffer into application address space.
+--
+--     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.
+--
+--     [Returns]: the address of the mapped transfer buffer memory, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_MapGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3849:36@
+sDL_MapGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a transfer buffer.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the transfer buffer if it is already bound.
+  -> IO (BG.Ptr BG.Void)
+sDL_MapGPUTransferBuffer =
+  hs_bindgen_075892bcba4ad890
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_UnmapGPUTransferBuffer@
+foreign import ccall unsafe "hs_bindgen_8721518ac51d5884"
+  hs_bindgen_8721518ac51d5884_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_UnmapGPUTransferBuffer@
+hs_bindgen_8721518ac51d5884
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -> IO ()
+hs_bindgen_8721518ac51d5884 =
+  BG.fromFFIType hs_bindgen_8721518ac51d5884_base
+
+-- | Unmaps a previously mapped transfer buffer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UnmapGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3862:34@
+sDL_UnmapGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a previously mapped transfer buffer.
+  -> IO ()
+sDL_UnmapGPUTransferBuffer =
+  hs_bindgen_8721518ac51d5884
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BeginGPUCopyPass@
+foreign import ccall unsafe "hs_bindgen_7990c88447a637d9"
+  hs_bindgen_7990c88447a637d9_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BeginGPUCopyPass@
+hs_bindgen_7990c88447a637d9
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> IO (BG.Ptr SDL_GPUCopyPass)
+hs_bindgen_7990c88447a637d9 =
+  BG.fromFFIType hs_bindgen_7990c88447a637d9_base
+
+-- | Begins a copy pass on a command buffer.
+--
+--     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.
+--
+--     [Returns]: a copy pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EndGPUCopyPass'
+--
+--     [C declaration]: @SDL_BeginGPUCopyPass@, defined at @SDL3\/SDL_gpu.h 3882:47@
+sDL_BeginGPUCopyPass
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO (BG.Ptr SDL_GPUCopyPass)
+sDL_BeginGPUCopyPass = hs_bindgen_7990c88447a637d9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_UploadToGPUTexture@
+foreign import ccall unsafe "hs_bindgen_7dc2e64aebecaf47"
+  hs_bindgen_7dc2e64aebecaf47_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_UploadToGPUTexture@
+hs_bindgen_7dc2e64aebecaf47
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_7dc2e64aebecaf47 =
+  BG.fromFFIType hs_bindgen_7dc2e64aebecaf47_base
+
+-- | Uploads data from a transfer buffer to a texture.
+--
+--     The upload occurs on the GPU timeline. You may assume that the upload has finished in subsequent commands.
+--
+--     You must align the data in the transfer buffer to a multiple of the texel size of the texture format.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UploadToGPUTexture@, defined at @SDL3\/SDL_gpu.h 3902:34@
+sDL_UploadToGPUTexture
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -- ^
+  --
+  --           [@source@]: the source transfer buffer with image layout information.
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -- ^
+  --
+  --           [@destination@]: the destination texture region.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the texture if the texture is bound, otherwise overwrites the data.
+  -> IO ()
+sDL_UploadToGPUTexture = hs_bindgen_7dc2e64aebecaf47
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_UploadToGPUBuffer@
+foreign import ccall unsafe "hs_bindgen_c8311e817b0149e1"
+  hs_bindgen_c8311e817b0149e1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_UploadToGPUBuffer@
+hs_bindgen_c8311e817b0149e1
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_c8311e817b0149e1 =
+  BG.fromFFIType hs_bindgen_c8311e817b0149e1_base
+
+-- | Uploads data from a transfer buffer to a buffer.
+--
+--     The upload occurs on the GPU timeline. You may assume that the upload has finished in subsequent commands.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UploadToGPUBuffer@, defined at @SDL3\/SDL_gpu.h 3922:34@
+sDL_UploadToGPUBuffer
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -- ^
+  --
+  --           [@source@]: the source transfer buffer with offset.
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -- ^
+  --
+  --           [@destination@]: the destination buffer with offset and size.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the buffer if it is already bound, otherwise overwrites the data.
+  -> IO ()
+sDL_UploadToGPUBuffer = hs_bindgen_c8311e817b0149e1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CopyGPUTextureToTexture@
+foreign import ccall unsafe "hs_bindgen_8d76c446224fa54a"
+  hs_bindgen_8d76c446224fa54a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CopyGPUTextureToTexture@
+hs_bindgen_8d76c446224fa54a
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_8d76c446224fa54a =
+  BG.fromFFIType hs_bindgen_8d76c446224fa54a_base
+
+-- | Performs a texture-to-texture copy.
+--
+--     This copy occurs on the GPU timeline. You may assume the copy has finished in subsequent commands.
+--
+--     This function does not support copying between depth and color textures. For those, copy the texture to a buffer and then to the destination texture.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyGPUTextureToTexture@, defined at @SDL3\/SDL_gpu.h 3949:34@
+sDL_CopyGPUTextureToTexture
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -- ^
+  --
+  --           [@source@]: a source texture region.
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -- ^
+  --
+  --           [@destination@]: a destination texture region.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@w@]: the width of the region to copy.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@h@]: the height of the region to copy.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@d@]: the depth of the region to copy.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the destination texture if the destination texture is bound, otherwise overwrites the data.
+  -> IO ()
+sDL_CopyGPUTextureToTexture =
+  hs_bindgen_8d76c446224fa54a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CopyGPUBufferToBuffer@
+foreign import ccall unsafe "hs_bindgen_72560eca0be1bbd9"
+  hs_bindgen_72560eca0be1bbd9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CopyGPUBufferToBuffer@
+hs_bindgen_72560eca0be1bbd9
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_72560eca0be1bbd9 =
+  BG.fromFFIType hs_bindgen_72560eca0be1bbd9_base
+
+-- | Performs a buffer-to-buffer copy.
+--
+--     This copy occurs on the GPU timeline. You may assume the copy has finished in subsequent commands.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyGPUBufferToBuffer@, defined at @SDL3\/SDL_gpu.h 3973:34@
+sDL_CopyGPUBufferToBuffer
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -- ^
+  --
+  --           [@source@]: the buffer and offset to copy from.
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -- ^
+  --
+  --           [@destination@]: the buffer and offset to copy to.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@size@]: the length of the buffer to copy.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the destination buffer if it is already bound, otherwise overwrites the data.
+  -> IO ()
+sDL_CopyGPUBufferToBuffer =
+  hs_bindgen_72560eca0be1bbd9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DownloadFromGPUTexture@
+foreign import ccall unsafe "hs_bindgen_f583e024c47915e6"
+  hs_bindgen_f583e024c47915e6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DownloadFromGPUTexture@
+hs_bindgen_f583e024c47915e6
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -> IO ()
+hs_bindgen_f583e024c47915e6 =
+  BG.fromFFIType hs_bindgen_f583e024c47915e6_base
+
+-- | Copies data from a texture to a transfer buffer on the GPU timeline.
+--
+--     This data is not guaranteed to be copied until the command buffer fence is signaled.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DownloadFromGPUTexture@, defined at @SDL3\/SDL_gpu.h 3993:34@
+sDL_DownloadFromGPUTexture
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -- ^
+  --
+  --           [@source@]: the source texture region.
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -- ^
+  --
+  --           [@destination@]: the destination transfer buffer with image layout information.
+  -> IO ()
+sDL_DownloadFromGPUTexture =
+  hs_bindgen_f583e024c47915e6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DownloadFromGPUBuffer@
+foreign import ccall unsafe "hs_bindgen_d1604453e77cbbd9"
+  hs_bindgen_d1604453e77cbbd9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_DownloadFromGPUBuffer@
+hs_bindgen_d1604453e77cbbd9
+  :: BG.Ptr SDL_GPUCopyPass
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -> IO ()
+hs_bindgen_d1604453e77cbbd9 =
+  BG.fromFFIType hs_bindgen_d1604453e77cbbd9_base
+
+-- | Copies data from a buffer to a transfer buffer on the GPU timeline.
+--
+--     This data is not guaranteed to be copied until the command buffer fence is signaled.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DownloadFromGPUBuffer@, defined at @SDL3\/SDL_gpu.h 4010:34@
+sDL_DownloadFromGPUBuffer
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -- ^
+  --
+  --           [@source@]: the source buffer with offset and size.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -- ^
+  --
+  --           [@destination@]: the destination transfer buffer with offset.
+  -> IO ()
+sDL_DownloadFromGPUBuffer =
+  hs_bindgen_d1604453e77cbbd9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_EndGPUCopyPass@
+foreign import ccall unsafe "hs_bindgen_37f1aba920cf70df"
+  hs_bindgen_37f1aba920cf70df_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_EndGPUCopyPass@
+hs_bindgen_37f1aba920cf70df
+  :: BG.Ptr SDL_GPUCopyPass
+  -> IO ()
+hs_bindgen_37f1aba920cf70df =
+  BG.fromFFIType hs_bindgen_37f1aba920cf70df_base
+
+-- | Ends the current copy pass.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EndGPUCopyPass@, defined at @SDL3\/SDL_gpu.h 4022:34@
+sDL_EndGPUCopyPass
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> IO ()
+sDL_EndGPUCopyPass = hs_bindgen_37f1aba920cf70df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GenerateMipmapsForGPUTexture@
+foreign import ccall unsafe "hs_bindgen_487b5d55898cb8c9"
+  hs_bindgen_487b5d55898cb8c9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GenerateMipmapsForGPUTexture@
+hs_bindgen_487b5d55898cb8c9
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> BG.Ptr SDL_GPUTexture
+  -> IO ()
+hs_bindgen_487b5d55898cb8c9 =
+  BG.fromFFIType hs_bindgen_487b5d55898cb8c9_base
+
+-- | Generates mipmaps for the given texture.
+--
+--     This function must not be called inside of any pass.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GenerateMipmapsForGPUTexture@, defined at @SDL3\/SDL_gpu.h 4035:34@
+sDL_GenerateMipmapsForGPUTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command_buffer.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture with more than 1 mip level.
+  -> IO ()
+sDL_GenerateMipmapsForGPUTexture =
+  hs_bindgen_487b5d55898cb8c9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BlitGPUTexture@
+foreign import ccall unsafe "hs_bindgen_5ea32ac13985443b"
+  hs_bindgen_5ea32ac13985443b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_BlitGPUTexture@
+hs_bindgen_5ea32ac13985443b
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> PtrConst.PtrConst SDL_GPUBlitInfo
+  -> IO ()
+hs_bindgen_5ea32ac13985443b =
+  BG.fromFFIType hs_bindgen_5ea32ac13985443b_base
+
+-- | Blits from a source texture region to a destination texture region.
+--
+--     This function must not be called inside of any pass.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_BlitGPUTexture@, defined at @SDL3\/SDL_gpu.h 4049:34@
+sDL_BlitGPUTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUBlitInfo
+  -- ^
+  --
+  --           [@info@]: the blit info struct containing the blit parameters.
+  -> IO ()
+sDL_BlitGPUTexture = hs_bindgen_5ea32ac13985443b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WindowSupportsGPUSwapchainComposition@
+foreign import ccall unsafe "hs_bindgen_7874a69b9fb7574a"
+  hs_bindgen_7874a69b9fb7574a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WindowSupportsGPUSwapchainComposition@
+hs_bindgen_7874a69b9fb7574a
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> SDL_GPUSwapchainComposition
+  -> IO BG.CBool
+hs_bindgen_7874a69b9fb7574a =
+  BG.fromFFIType hs_bindgen_7874a69b9fb7574a_base
+
+-- | Determines whether a swapchain composition is supported by the window.
+--
+--     The window must be claimed before calling this function.
+--
+--     [Returns]: true if supported, false if unsupported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice'
+--
+--     [C declaration]: @SDL_WindowSupportsGPUSwapchainComposition@, defined at @SDL3\/SDL_gpu.h 4069:34@
+sDL_WindowSupportsGPUSwapchainComposition
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> SDL_GPUSwapchainComposition
+  -- ^
+  --
+  --           [@swapchain_composition@]: the swapchain composition to check.
+  -> IO BG.CBool
+sDL_WindowSupportsGPUSwapchainComposition =
+  hs_bindgen_7874a69b9fb7574a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WindowSupportsGPUPresentMode@
+foreign import ccall unsafe "hs_bindgen_e7e69a1723f7ad13"
+  hs_bindgen_e7e69a1723f7ad13_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WindowSupportsGPUPresentMode@
+hs_bindgen_e7e69a1723f7ad13
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> SDL_GPUPresentMode
+  -> IO BG.CBool
+hs_bindgen_e7e69a1723f7ad13 =
+  BG.fromFFIType hs_bindgen_e7e69a1723f7ad13_base
+
+-- | Determines whether a presentation mode is supported by the window.
+--
+--     The window must be claimed before calling this function.
+--
+--     [Returns]: true if supported, false if unsupported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice'
+--
+--     [C declaration]: @SDL_WindowSupportsGPUPresentMode@, defined at @SDL3\/SDL_gpu.h 4088:34@
+sDL_WindowSupportsGPUPresentMode
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> SDL_GPUPresentMode
+  -- ^
+  --
+  --           [@present_mode@]: the presentation mode to check.
+  -> IO BG.CBool
+sDL_WindowSupportsGPUPresentMode =
+  hs_bindgen_e7e69a1723f7ad13
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ClaimWindowForGPUDevice@
+foreign import ccall unsafe "hs_bindgen_709c34298cd845c0"
+  hs_bindgen_709c34298cd845c0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ClaimWindowForGPUDevice@
+hs_bindgen_709c34298cd845c0
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_709c34298cd845c0 =
+  BG.fromFFIType hs_bindgen_709c34298cd845c0_base
+
+-- | Claims a window, creating a swapchain structure for it.
+--
+--     This must be called before SDL_AcquireGPUSwapchainTexture is called using the window. You should only call this function from the thread that created the window.
+--
+--     The swapchain will be created with SDL_GPU_SWAPCHAINCOMPOSITION_SDR and SDL_GPU_PRESENTMODE_VSYNC. If you want to have different swapchain parameters, you must call SDL_SetGPUSwapchainParameters after claiming the window.
+--
+--     [Returns]: true on success, or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_ReleaseWindowFromGPUDevice', 'sDL_WindowSupportsGPUPresentMode', 'sDL_WindowSupportsGPUSwapchainComposition'
+--
+--     [C declaration]: @SDL_ClaimWindowForGPUDevice@, defined at @SDL3\/SDL_gpu.h 4120:34@
+sDL_ClaimWindowForGPUDevice
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> IO BG.CBool
+sDL_ClaimWindowForGPUDevice =
+  hs_bindgen_709c34298cd845c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseWindowFromGPUDevice@
+foreign import ccall unsafe "hs_bindgen_5580ffa5115be31a"
+  hs_bindgen_5580ffa5115be31a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseWindowFromGPUDevice@
+hs_bindgen_5580ffa5115be31a
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO ()
+hs_bindgen_5580ffa5115be31a =
+  BG.fromFFIType hs_bindgen_5580ffa5115be31a_base
+
+-- | Unclaims a window, destroying its swapchain structure.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice'
+--
+--     [C declaration]: @SDL_ReleaseWindowFromGPUDevice@, defined at @SDL3\/SDL_gpu.h 4134:34@
+sDL_ReleaseWindowFromGPUDevice
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> IO ()
+sDL_ReleaseWindowFromGPUDevice =
+  hs_bindgen_5580ffa5115be31a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUSwapchainParameters@
+foreign import ccall unsafe "hs_bindgen_dd5044a4ed37551c"
+  hs_bindgen_dd5044a4ed37551c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUSwapchainParameters@
+hs_bindgen_dd5044a4ed37551c
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> SDL_GPUSwapchainComposition
+  -> SDL_GPUPresentMode
+  -> IO BG.CBool
+hs_bindgen_dd5044a4ed37551c =
+  BG.fromFFIType hs_bindgen_dd5044a4ed37551c_base
+
+-- | Changes the swapchain parameters for the given claimed window.
+--
+--     This function will fail if the requested present mode or swapchain composition are unsupported by the device. Check if the parameters are supported via SDL_WindowSupportsGPUPresentMode \/ SDL_WindowSupportsGPUSwapchainComposition prior to calling this function.
+--
+--     SDL_GPU_PRESENTMODE_VSYNC with SDL_GPU_SWAPCHAINCOMPOSITION_SDR is always supported.
+--
+--     [Returns]: true if successful, false on error; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WindowSupportsGPUPresentMode', 'sDL_WindowSupportsGPUSwapchainComposition'
+--
+--     [C declaration]: @SDL_SetGPUSwapchainParameters@, defined at @SDL3\/SDL_gpu.h 4161:34@
+sDL_SetGPUSwapchainParameters
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> SDL_GPUSwapchainComposition
+  -- ^
+  --
+  --           [@swapchain_composition@]: the desired composition of the swapchain.
+  -> SDL_GPUPresentMode
+  -- ^
+  --
+  --           [@present_mode@]: the desired present mode for the swapchain.
+  -> IO BG.CBool
+sDL_SetGPUSwapchainParameters =
+  hs_bindgen_dd5044a4ed37551c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUAllowedFramesInFlight@
+foreign import ccall unsafe "hs_bindgen_376c36f4c99e1f9a"
+  hs_bindgen_376c36f4c99e1f9a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SetGPUAllowedFramesInFlight@
+hs_bindgen_376c36f4c99e1f9a
+  :: BG.Ptr SDL_GPUDevice
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_376c36f4c99e1f9a =
+  BG.fromFFIType hs_bindgen_376c36f4c99e1f9a_base
+
+-- | Configures the maximum allowed number of frames in flight.
+--
+--     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 working on the first frame, @SDL_AcquireGPUSwapchainTexture()@ will fill the swapchain texture pointer with NULL, and @SDL_WaitAndAcquireGPUSwapchainTexture()@ will block.
+--
+--     Higher values increase throughput at the expense of visual latency. Lower values decrease visual latency at the expense of throughput.
+--
+--     Note that calling this function will stall and flush the command queue to prevent synchronization issues.
+--
+--     The minimum value of allowed frames in flight is 1, and the maximum is 3.
+--
+--     [Returns]: true if successful, false on error; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetGPUAllowedFramesInFlight@, defined at @SDL3\/SDL_gpu.h 4192:34@
+sDL_SetGPUAllowedFramesInFlight
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@allowed_frames_in_flight@]: the maximum number of frames that can be pending on the GPU.
+  -> IO BG.CBool
+sDL_SetGPUAllowedFramesInFlight =
+  hs_bindgen_376c36f4c99e1f9a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUSwapchainTextureFormat@
+foreign import ccall unsafe "hs_bindgen_4dd16ea5d2d75e5c"
+  hs_bindgen_4dd16ea5d2d75e5c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUSwapchainTextureFormat@
+hs_bindgen_4dd16ea5d2d75e5c
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO SDL_GPUTextureFormat
+hs_bindgen_4dd16ea5d2d75e5c =
+  BG.fromFFIType hs_bindgen_4dd16ea5d2d75e5c_base
+
+-- | Obtains the texture format of the swapchain for the given window.
+--
+--     Note that this format can change if the swapchain parameters change.
+--
+--     [Returns]: the texture format of the swapchain.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGPUSwapchainTextureFormat@, defined at @SDL3\/SDL_gpu.h 4207:50@
+sDL_GetGPUSwapchainTextureFormat
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> IO SDL_GPUTextureFormat
+sDL_GetGPUSwapchainTextureFormat =
+  hs_bindgen_4dd16ea5d2d75e5c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_AcquireGPUSwapchainTexture@
+foreign import ccall unsafe "hs_bindgen_458d79c8728f00ab"
+  hs_bindgen_458d79c8728f00ab_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_AcquireGPUSwapchainTexture@
+hs_bindgen_458d79c8728f00ab
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_458d79c8728f00ab =
+  BG.fromFFIType hs_bindgen_458d79c8728f00ab_base
+
+-- | Acquire a texture to use in presentation.
+--
+--     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 buffer used to acquire it.
+--
+--     This function will fill the swapchain texture handle with NULL if too many 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.
+--
+--     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.
+--
+--     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.
+--
+--     [Returns]: true on success, false on error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ClaimWindowForGPUDevice', 'sDL_SubmitGPUCommandBuffer', 'sDL_SubmitGPUCommandBufferAndAcquireFence', 'sDL_CancelGPUCommandBuffer', SDL_GetWindowSizeInPixels, 'sDL_WaitForGPUSwapchain', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_SetGPUAllowedFramesInFlight'
+--
+--     [C declaration]: @SDL_AcquireGPUSwapchainTexture@, defined at @SDL3\/SDL_gpu.h 4259:34@
+sDL_AcquireGPUSwapchainTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@swapchain_texture@]: a pointer filled in with a swapchain texture handle.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_width@]: a pointer filled in with the swapchain texture width, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_height@]: a pointer filled in with the swapchain texture height, may be NULL.
+  -> IO BG.CBool
+sDL_AcquireGPUSwapchainTexture =
+  hs_bindgen_458d79c8728f00ab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WaitForGPUSwapchain@
+foreign import ccall unsafe "hs_bindgen_fb018ba3fc209740"
+  hs_bindgen_fb018ba3fc209740_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WaitForGPUSwapchain@
+hs_bindgen_fb018ba3fc209740
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_fb018ba3fc209740 =
+  BG.fromFFIType hs_bindgen_fb018ba3fc209740_base
+
+-- | Blocks the thread until a swapchain texture is available to be acquired.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireGPUSwapchainTexture', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_SetGPUAllowedFramesInFlight'
+--
+--     [C declaration]: @SDL_WaitForGPUSwapchain@, defined at @SDL3\/SDL_gpu.h 4283:34@
+sDL_WaitForGPUSwapchain
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> IO BG.CBool
+sDL_WaitForGPUSwapchain = hs_bindgen_fb018ba3fc209740
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WaitAndAcquireGPUSwapchainTexture@
+foreign import ccall unsafe "hs_bindgen_a454f9124adeea81"
+  hs_bindgen_a454f9124adeea81_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WaitAndAcquireGPUSwapchainTexture@
+hs_bindgen_a454f9124adeea81
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_a454f9124adeea81 =
+  BG.fromFFIType hs_bindgen_a454f9124adeea81_base
+
+-- | Blocks the thread until a swapchain texture is available to be acquired, and then acquires it.
+--
+--     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 buffer used to acquire it. It is an error to call @SDL_CancelGPUCommandBuffer()@ after a swapchain texture is acquired.
+--
+--     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.
+--
+--     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.
+--
+--     The swapchain texture is write-only and cannot be used as a sampler or for another reading operation.
+--
+--     [Returns]: true on success, false on error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBuffer', 'sDL_SubmitGPUCommandBufferAndAcquireFence', 'sDL_AcquireGPUSwapchainTexture'
+--
+--     [C declaration]: @SDL_WaitAndAcquireGPUSwapchainTexture@, defined at @SDL3\/SDL_gpu.h 4329:34@
+sDL_WaitAndAcquireGPUSwapchainTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@swapchain_texture@]: a pointer filled in with a swapchain texture handle.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_width@]: a pointer filled in with the swapchain texture width, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_height@]: a pointer filled in with the swapchain texture height, may be NULL.
+  -> IO BG.CBool
+sDL_WaitAndAcquireGPUSwapchainTexture =
+  hs_bindgen_a454f9124adeea81
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SubmitGPUCommandBuffer@
+foreign import ccall unsafe "hs_bindgen_82bac871c3cbe3e4"
+  hs_bindgen_82bac871c3cbe3e4_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SubmitGPUCommandBuffer@
+hs_bindgen_82bac871c3cbe3e4
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> IO BG.CBool
+hs_bindgen_82bac871c3cbe3e4 =
+  BG.fromFFIType hs_bindgen_82bac871c3cbe3e4_base
+
+-- | Submits a command buffer so its commands can be processed on the GPU.
+--
+--     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.
+--
+--     All commands in the submission are guaranteed to begin executing before any command in a subsequent submission begins executing.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireGPUCommandBuffer', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_AcquireGPUSwapchainTexture', 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_SubmitGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 4357:34@
+sDL_SubmitGPUCommandBuffer
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO BG.CBool
+sDL_SubmitGPUCommandBuffer =
+  hs_bindgen_82bac871c3cbe3e4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SubmitGPUCommandBufferAndAcquireFence@
+foreign import ccall unsafe "hs_bindgen_34bbe24268d3620c"
+  hs_bindgen_34bbe24268d3620c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_SubmitGPUCommandBufferAndAcquireFence@
+hs_bindgen_34bbe24268d3620c
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> IO (BG.Ptr SDL_GPUFence)
+hs_bindgen_34bbe24268d3620c =
+  BG.fromFFIType hs_bindgen_34bbe24268d3620c_base
+
+-- | 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.
+--
+--     This must be called from the thread the command buffer was acquired on.
+--
+--     All commands in the submission are guaranteed to begin executing before any command in a subsequent submission begins executing.
+--
+--     [Returns]: a fence associated with the command buffer, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AcquireGPUCommandBuffer', 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_AcquireGPUSwapchainTexture', 'sDL_SubmitGPUCommandBuffer', 'sDL_ReleaseGPUFence'
+--
+--     [C declaration]: @SDL_SubmitGPUCommandBufferAndAcquireFence@, defined at @SDL3\/SDL_gpu.h 4384:44@
+sDL_SubmitGPUCommandBufferAndAcquireFence
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO (BG.Ptr SDL_GPUFence)
+sDL_SubmitGPUCommandBufferAndAcquireFence =
+  hs_bindgen_34bbe24268d3620c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CancelGPUCommandBuffer@
+foreign import ccall unsafe "hs_bindgen_34c4d8861fe9ae5b"
+  hs_bindgen_34c4d8861fe9ae5b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CancelGPUCommandBuffer@
+hs_bindgen_34c4d8861fe9ae5b
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -> IO BG.CBool
+hs_bindgen_34c4d8861fe9ae5b =
+  BG.fromFFIType hs_bindgen_34c4d8861fe9ae5b_base
+
+-- | Cancels a command buffer.
+--
+--     None of the enqueued commands are executed.
+--
+--     It is an error to call this function after a swapchain texture has been acquired.
+--
+--     This must be called from the thread the command buffer was acquired on.
+--
+--     You must not reference the command buffer after calling this function.
+--
+--     [Returns]: true on success, false on error; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitAndAcquireGPUSwapchainTexture', 'sDL_AcquireGPUCommandBuffer', 'sDL_AcquireGPUSwapchainTexture'
+--
+--     [C declaration]: @SDL_CancelGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 4409:34@
+sDL_CancelGPUCommandBuffer
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO BG.CBool
+sDL_CancelGPUCommandBuffer =
+  hs_bindgen_34c4d8861fe9ae5b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WaitForGPUIdle@
+foreign import ccall unsafe "hs_bindgen_2cf574d324b28e44"
+  hs_bindgen_2cf574d324b28e44_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WaitForGPUIdle@
+hs_bindgen_2cf574d324b28e44
+  :: BG.Ptr SDL_GPUDevice
+  -> IO BG.CBool
+hs_bindgen_2cf574d324b28e44 =
+  BG.fromFFIType hs_bindgen_2cf574d324b28e44_base
+
+-- | Blocks the thread until the GPU is completely idle.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WaitForGPUFences'
+--
+--     [C declaration]: @SDL_WaitForGPUIdle@, defined at @SDL3\/SDL_gpu.h 4423:34@
+sDL_WaitForGPUIdle
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> IO BG.CBool
+sDL_WaitForGPUIdle = hs_bindgen_2cf574d324b28e44
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WaitForGPUFences@
+foreign import ccall unsafe "hs_bindgen_90c7f8f4aae22e6a"
+  hs_bindgen_90c7f8f4aae22e6a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_WaitForGPUFences@
+hs_bindgen_90c7f8f4aae22e6a
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.CBool
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUFence)
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_90c7f8f4aae22e6a =
+  BG.fromFFIType hs_bindgen_90c7f8f4aae22e6a_base
+
+-- | Blocks the thread until the given fences are signaled.
+--
+--     [Returns]: true on success, false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBufferAndAcquireFence', 'sDL_WaitForGPUIdle'
+--
+--     [C declaration]: @SDL_WaitForGPUFences@, defined at @SDL3\/SDL_gpu.h 4442:34@
+sDL_WaitForGPUFences
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@wait_all@]: if 0, wait for any fence to be signaled, if 1, wait for all fences to be signaled.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUFence)
+  -- ^
+  --
+  --           [@fences@]: an array of fences to wait on.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@num_fences@]: the number of fences in the fences array.
+  -> IO BG.CBool
+sDL_WaitForGPUFences = hs_bindgen_90c7f8f4aae22e6a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_QueryGPUFence@
+foreign import ccall unsafe "hs_bindgen_09f80c8e0b395d04"
+  hs_bindgen_09f80c8e0b395d04_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_QueryGPUFence@
+hs_bindgen_09f80c8e0b395d04
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUFence
+  -> IO BG.CBool
+hs_bindgen_09f80c8e0b395d04 =
+  BG.fromFFIType hs_bindgen_09f80c8e0b395d04_base
+
+-- | Checks the status of a fence.
+--
+--     [Returns]: true if the fence is signaled, false if it is not.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_QueryGPUFence@, defined at @SDL3\/SDL_gpu.h 4459:34@
+sDL_QueryGPUFence
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUFence
+  -- ^
+  --
+  --           [@fence@]: a fence.
+  -> IO BG.CBool
+sDL_QueryGPUFence = hs_bindgen_09f80c8e0b395d04
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUFence@
+foreign import ccall unsafe "hs_bindgen_97087dbb893b61af"
+  hs_bindgen_97087dbb893b61af_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_ReleaseGPUFence@
+hs_bindgen_97087dbb893b61af
+  :: BG.Ptr SDL_GPUDevice
+  -> BG.Ptr SDL_GPUFence
+  -> IO ()
+hs_bindgen_97087dbb893b61af =
+  BG.fromFFIType hs_bindgen_97087dbb893b61af_base
+
+-- | Releases a fence obtained from SDL_SubmitGPUCommandBufferAndAcquireFence.
+--
+--     You must not reference the fence after calling this function.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SubmitGPUCommandBufferAndAcquireFence'
+--
+--     [C declaration]: @SDL_ReleaseGPUFence@, defined at @SDL3\/SDL_gpu.h 4475:34@
+sDL_ReleaseGPUFence
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUFence
+  -- ^
+  --
+  --           [@fence@]: a fence.
+  -> IO ()
+sDL_ReleaseGPUFence = hs_bindgen_97087dbb893b61af
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GPUTextureFormatTexelBlockSize@
+foreign import ccall unsafe "hs_bindgen_121bf00d55a1a113"
+  hs_bindgen_121bf00d55a1a113_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GPUTextureFormatTexelBlockSize@
+hs_bindgen_121bf00d55a1a113
+  :: SDL_GPUTextureFormat
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_121bf00d55a1a113 =
+  BG.fromFFIType hs_bindgen_121bf00d55a1a113_base
+
+-- | Obtains the texel block size for a texture format.
+--
+--     [Returns]: the texel block size of the texture format.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UploadToGPUTexture'
+--
+--     [C declaration]: @SDL_GPUTextureFormatTexelBlockSize@, defined at @SDL3\/SDL_gpu.h 4491:36@
+sDL_GPUTextureFormatTexelBlockSize
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format you want to know the texel size of.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_GPUTextureFormatTexelBlockSize =
+  hs_bindgen_121bf00d55a1a113
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GPUTextureSupportsFormat@
+foreign import ccall unsafe "hs_bindgen_0c3c275a5e945ebd"
+  hs_bindgen_0c3c275a5e945ebd_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GPUTextureSupportsFormat@
+hs_bindgen_0c3c275a5e945ebd
+  :: BG.Ptr SDL_GPUDevice
+  -> SDL_GPUTextureFormat
+  -> SDL_GPUTextureType
+  -> SDL_GPUTextureUsageFlags
+  -> IO BG.CBool
+hs_bindgen_0c3c275a5e945ebd =
+  BG.fromFFIType hs_bindgen_0c3c275a5e945ebd_base
+
+-- | Determines whether a texture format is supported for a given type and usage.
+--
+--     [Returns]: whether the texture format is supported for this type and usage.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GPUTextureSupportsFormat@, defined at @SDL3\/SDL_gpu.h 4506:34@
+sDL_GPUTextureSupportsFormat
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format to check.
+  -> SDL_GPUTextureType
+  -- ^
+  --
+  --           [@type@]: the type of texture (2D, 3D, Cube).
+  -> SDL_GPUTextureUsageFlags
+  -- ^
+  --
+  --           [@usage@]: a bitmask of all usage scenarios to check.
+  -> IO BG.CBool
+sDL_GPUTextureSupportsFormat =
+  hs_bindgen_0c3c275a5e945ebd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GPUTextureSupportsSampleCount@
+foreign import ccall unsafe "hs_bindgen_0870889673874577"
+  hs_bindgen_0870889673874577_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GPUTextureSupportsSampleCount@
+hs_bindgen_0870889673874577
+  :: BG.Ptr SDL_GPUDevice
+  -> SDL_GPUTextureFormat
+  -> SDL_GPUSampleCount
+  -> IO BG.CBool
+hs_bindgen_0870889673874577 =
+  BG.fromFFIType hs_bindgen_0870889673874577_base
+
+-- | Determines if a sample count for a texture format is supported.
+--
+--     [Returns]: whether the sample count is supported for this texture format.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GPUTextureSupportsSampleCount@, defined at @SDL3\/SDL_gpu.h 4522:34@
+sDL_GPUTextureSupportsSampleCount
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format to check.
+  -> SDL_GPUSampleCount
+  -- ^
+  --
+  --           [@sample_count@]: the sample count to check.
+  -> IO BG.CBool
+sDL_GPUTextureSupportsSampleCount =
+  hs_bindgen_0870889673874577
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CalculateGPUTextureFormatSize@
+foreign import ccall unsafe "hs_bindgen_222b65bb58cce08e"
+  hs_bindgen_222b65bb58cce08e_base
+    :: BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_CalculateGPUTextureFormatSize@
+hs_bindgen_222b65bb58cce08e
+  :: SDL_GPUTextureFormat
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_222b65bb58cce08e =
+  BG.fromFFIType hs_bindgen_222b65bb58cce08e_base
+
+-- | Calculate the size in bytes of a texture format with dimensions.
+--
+--     [Returns]: the size of a texture with this format and dimensions.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CalculateGPUTextureFormatSize@, defined at @SDL3\/SDL_gpu.h 4538:36@
+sDL_CalculateGPUTextureFormatSize
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: a texture format.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@width@]: width in pixels.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@height@]: height in pixels.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@depth_or_layer_count@]: depth for 3D textures or layer count otherwise.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_CalculateGPUTextureFormatSize =
+  hs_bindgen_222b65bb58cce08e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetPixelFormatFromGPUTextureFormat@
+foreign import ccall unsafe "hs_bindgen_3a8763f112daa871"
+  hs_bindgen_3a8763f112daa871_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetPixelFormatFromGPUTextureFormat@
+hs_bindgen_3a8763f112daa871
+  :: SDL_GPUTextureFormat
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+hs_bindgen_3a8763f112daa871 =
+  BG.fromFFIType hs_bindgen_3a8763f112daa871_base
+
+-- | Get the SDL pixel format corresponding to a GPU texture format.
+--
+--     [Returns]: the corresponding pixel format, or SDL_PIXELFORMAT_UNKNOWN if there is no corresponding pixel format.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetPixelFormatFromGPUTextureFormat@, defined at @SDL3\/SDL_gpu.h 4553:45@
+sDL_GetPixelFormatFromGPUTextureFormat
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: a texture format.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+sDL_GetPixelFormatFromGPUTextureFormat =
+  hs_bindgen_3a8763f112daa871
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUTextureFormatFromPixelFormat@
+foreign import ccall unsafe "hs_bindgen_77c5ed2882b80ff3"
+  hs_bindgen_77c5ed2882b80ff3_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Gpu_Unsafe_SDL_GetGPUTextureFormatFromPixelFormat@
+hs_bindgen_77c5ed2882b80ff3
+  :: SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> IO SDL_GPUTextureFormat
+hs_bindgen_77c5ed2882b80ff3 =
+  BG.fromFFIType hs_bindgen_77c5ed2882b80ff3_base
+
+-- | Get the GPU texture format corresponding to an SDL pixel format.
+--
+--     [Returns]: the corresponding GPU texture format, or SDL_GPU_TEXTUREFORMAT_INVALID if there is no corresponding GPU texture format.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetGPUTextureFormatFromPixelFormat@, defined at @SDL3\/SDL_gpu.h 4565:50@
+sDL_GetGPUTextureFormatFromPixelFormat
+  :: SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: a pixel format.
+  -> IO SDL_GPUTextureFormat
+sDL_GetGPUTextureFormatFromPixelFormat =
+  hs_bindgen_77c5ed2882b80ff3
diff --git a/src/SDL3/Sys/Bindgen/Guid.hs b/src/SDL3/Sys/Bindgen/Guid.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Guid.hs
@@ -0,0 +1,90 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | A GUID is a 128-bit value that represents something that is uniquely identifiable by this value: \"globally unique.\"
+--
+--     SDL provides functions to convert a GUID to\/from a string. An 'SDL_GUID' is a 128-bit identifier for an input device that identifies that device across runs of SDL programs on the same platform.
+--
+--     If the device is detached and then re-attached to a different port, or if the base system is rebooted, the device should still report the same GUID.
+--
+--     GUIDs are as precise as possible but are not guaranteed to distinguish physically distinct but equivalent devices. For example, two game controllers from the same vendor with the same product ID and revision may have the same GUID.
+--
+--     GUIDs may be platform-dependent (i.e., the same device may report different GUIDs on different operating systems).
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Guid (
+  SDL3.Sys.Bindgen.Guid.SDL_GUID (..),
+)
+where
+
+import HsBindgen.Runtime.ConstantArray qualified as CA
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @struct SDL_GUID@, defined at @SDL3\/SDL_guid.h 61:16@
+data SDL_GUID = SDL_GUID
+  { data' :: CA.ConstantArray 16 SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @data@, defined at @SDL3\/SDL_guid.h 62:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GUID where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (1 :: Int)
+
+instance Marshal.ReadRaw SDL_GUID where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GUID
+        <*> HasCField.readRaw (BG.Proxy @"data'") ptr0
+
+instance Marshal.WriteRaw SDL_GUID where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GUID data'2 ->
+            HasCField.writeRaw (BG.Proxy @"data'") ptr0 data'2
+
+deriving via Marshal.EquivStorable SDL_GUID instance BG.Storable SDL_GUID
+
+instance
+  (ty ~ CA.ConstantArray 16 SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "data'" SDL_GUID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GUID{data' = y1}
+      , BG.getField @"data'" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 16 SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "data'" (BG.Ptr SDL_GUID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data'")
+
+instance HasCField.HasCField SDL_GUID "data'" where
+  type
+    CFieldType SDL_GUID "data'" =
+      CA.ConstantArray 16 SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Guid/FunPtr.hs b/src/SDL3/Sys/Bindgen/Guid/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Guid/FunPtr.hs
@@ -0,0 +1,101 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Guid.FunPtr (
+  SDL3.Sys.Bindgen.Guid.FunPtr.sDL_GUIDToString,
+  SDL3.Sys.Bindgen.Guid.FunPtr.sDL_StringToGUID,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Guid
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_guid.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Guid_get_SDL_GUIDToString */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_b89f8bb369b8de4d (void)) ("
+         , "  SDL_GUID arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GUIDToString;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Guid_get_SDL_StringToGUID */"
+         , "__attribute__ ((const))"
+         , "SDL_GUID (*hs_bindgen_0ce736a26b941e7b (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_StringToGUID;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_get_SDL_GUIDToString@
+foreign import ccall unsafe "hs_bindgen_b89f8bb369b8de4d"
+  hs_bindgen_b89f8bb369b8de4d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_get_SDL_GUIDToString@
+hs_bindgen_b89f8bb369b8de4d :: IO (BG.FunPtr (SDL_GUID -> BG.Ptr BG.CChar -> BG.CInt -> IO ()))
+hs_bindgen_b89f8bb369b8de4d =
+  BG.fromFFIType hs_bindgen_b89f8bb369b8de4d_base
+
+{-# NOINLINE sDL_GUIDToString #-}
+
+-- | Get an ASCII string representation for a given 'SDL_GUID'.
+--
+--     [@guid@]: the 'SDL_GUID' you wish to convert to string.
+--
+--     [@pszGUID@]: buffer in which to write the ASCII string.
+--
+--     [@cbGUID@]: the size of pszGUID, should be at least 33 bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StringToGUID'
+--
+--     [C declaration]: @SDL_GUIDToString@, defined at @SDL3\/SDL_guid.h 80:34@
+sDL_GUIDToString :: BG.FunPtr (SDL_GUID -> BG.Ptr BG.CChar -> BG.CInt -> IO ())
+sDL_GUIDToString =
+  BG.unsafePerformIO hs_bindgen_b89f8bb369b8de4d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_get_SDL_StringToGUID@
+foreign import ccall unsafe "hs_bindgen_0ce736a26b941e7b"
+  hs_bindgen_0ce736a26b941e7b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_get_SDL_StringToGUID@
+hs_bindgen_0ce736a26b941e7b :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL_GUID))
+hs_bindgen_0ce736a26b941e7b =
+  BG.fromFFIType hs_bindgen_0ce736a26b941e7b_base
+
+{-# NOINLINE sDL_StringToGUID #-}
+
+-- | Convert a GUID string into a 'SDL_GUID' structure.
+--
+--     Performs no error checking. If this function is given a string containing an invalid GUID, the function will silently succeed, but the GUID generated will not be useful.
+--
+--     [@pchGUID@]: string containing an ASCII representation of a GUID.
+--
+--     [Returns]: a 'SDL_GUID' structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GUIDToString'
+--
+--     [C declaration]: @SDL_StringToGUID@, defined at @SDL3\/SDL_guid.h 98:38@
+sDL_StringToGUID :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL_GUID)
+sDL_StringToGUID =
+  BG.unsafePerformIO hs_bindgen_0ce736a26b941e7b
diff --git a/src/SDL3/Sys/Bindgen/Guid/Safe.hs b/src/SDL3/Sys/Bindgen/Guid/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Guid/Safe.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Guid.Safe (
+  SDL3.Sys.Bindgen.Guid.Safe.sDL_GUIDToString,
+  SDL3.Sys.Bindgen.Guid.Safe.sDL_StringToGUID,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Guid
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_guid.h>"
+         , "void hs_bindgen_33e8afba591e5cdf ("
+         , "  SDL_GUID *arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  (SDL_GUIDToString)(*arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_260d7fbde1a12e5d ("
+         , "  char const *arg1,"
+         , "  SDL_GUID *arg2"
+         , ")"
+         , "{"
+         , "  *arg2 = (SDL_StringToGUID)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_Safe_SDL_GUIDToString@
+foreign import ccall safe "hs_bindgen_33e8afba591e5cdf"
+  hs_bindgen_33e8afba591e5cdf_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_Safe_SDL_GUIDToString@
+hs_bindgen_33e8afba591e5cdf
+  :: BG.Ptr SDL_GUID
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO ()
+hs_bindgen_33e8afba591e5cdf =
+  BG.fromFFIType hs_bindgen_33e8afba591e5cdf_base
+
+-- | Get an ASCII string representation for a given 'SDL_GUID'.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StringToGUID'
+--
+--     [C declaration]: @SDL_GUIDToString@, defined at @SDL3\/SDL_guid.h 80:34@
+sDL_GUIDToString
+  :: SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: the 'SDL_GUID' you wish to convert to string.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@pszGUID@]: buffer in which to write the ASCII string.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@cbGUID@]: the size of pszGUID, should be at least 33 bytes.
+  -> IO ()
+sDL_GUIDToString =
+  \guid0 ->
+    \pszGUID1 ->
+      \cbGUID2 ->
+        BG.with
+          guid0
+          ( \guid3 ->
+              hs_bindgen_33e8afba591e5cdf guid3 pszGUID1 cbGUID2
+          )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_Safe_SDL_StringToGUID@
+foreign import ccall safe "hs_bindgen_260d7fbde1a12e5d"
+  hs_bindgen_260d7fbde1a12e5d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_Safe_SDL_StringToGUID@
+hs_bindgen_260d7fbde1a12e5d
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL_GUID
+  -> IO ()
+hs_bindgen_260d7fbde1a12e5d =
+  BG.fromFFIType hs_bindgen_260d7fbde1a12e5d_base
+
+-- | Convert a GUID string into a 'SDL_GUID' structure.
+--
+--     Performs no error checking. If this function is given a string containing an invalid GUID, the function will silently succeed, but the GUID generated will not be useful.
+--
+--     [Returns]: a 'SDL_GUID' structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GUIDToString'
+--
+--     [C declaration]: @SDL_StringToGUID@, defined at @SDL3\/SDL_guid.h 98:38@
+sDL_StringToGUID
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pchGUID@]: string containing an ASCII representation of a GUID.
+  -> IO SDL_GUID
+sDL_StringToGUID =
+  \pchGUID0 ->
+    BG.allocaAndPeek
+      ( \res1 ->
+          hs_bindgen_260d7fbde1a12e5d pchGUID0 res1
+      )
diff --git a/src/SDL3/Sys/Bindgen/Guid/Unsafe.hs b/src/SDL3/Sys/Bindgen/Guid/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Guid/Unsafe.hs
@@ -0,0 +1,127 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Guid.Unsafe (
+  SDL3.Sys.Bindgen.Guid.Unsafe.sDL_GUIDToString,
+  SDL3.Sys.Bindgen.Guid.Unsafe.sDL_StringToGUID,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Guid
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_guid.h>"
+         , "void hs_bindgen_8df1ca830111b8be ("
+         , "  SDL_GUID *arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  (SDL_GUIDToString)(*arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_5e01e589522eb138 ("
+         , "  char const *arg1,"
+         , "  SDL_GUID *arg2"
+         , ")"
+         , "{"
+         , "  *arg2 = (SDL_StringToGUID)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_Unsafe_SDL_GUIDToString@
+foreign import ccall unsafe "hs_bindgen_8df1ca830111b8be"
+  hs_bindgen_8df1ca830111b8be_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_Unsafe_SDL_GUIDToString@
+hs_bindgen_8df1ca830111b8be
+  :: BG.Ptr SDL_GUID
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO ()
+hs_bindgen_8df1ca830111b8be =
+  BG.fromFFIType hs_bindgen_8df1ca830111b8be_base
+
+-- | Get an ASCII string representation for a given 'SDL_GUID'.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StringToGUID'
+--
+--     [C declaration]: @SDL_GUIDToString@, defined at @SDL3\/SDL_guid.h 80:34@
+sDL_GUIDToString
+  :: SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: the 'SDL_GUID' you wish to convert to string.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@pszGUID@]: buffer in which to write the ASCII string.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@cbGUID@]: the size of pszGUID, should be at least 33 bytes.
+  -> IO ()
+sDL_GUIDToString =
+  \guid0 ->
+    \pszGUID1 ->
+      \cbGUID2 ->
+        BG.with
+          guid0
+          ( \guid3 ->
+              hs_bindgen_8df1ca830111b8be guid3 pszGUID1 cbGUID2
+          )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_Unsafe_SDL_StringToGUID@
+foreign import ccall unsafe "hs_bindgen_5e01e589522eb138"
+  hs_bindgen_5e01e589522eb138_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Guid_Unsafe_SDL_StringToGUID@
+hs_bindgen_5e01e589522eb138
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL_GUID
+  -> IO ()
+hs_bindgen_5e01e589522eb138 =
+  BG.fromFFIType hs_bindgen_5e01e589522eb138_base
+
+-- | Convert a GUID string into a 'SDL_GUID' structure.
+--
+--     Performs no error checking. If this function is given a string containing an invalid GUID, the function will silently succeed, but the GUID generated will not be useful.
+--
+--     [Returns]: a 'SDL_GUID' structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GUIDToString'
+--
+--     [C declaration]: @SDL_StringToGUID@, defined at @SDL3\/SDL_guid.h 98:38@
+sDL_StringToGUID
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pchGUID@]: string containing an ASCII representation of a GUID.
+  -> IO SDL_GUID
+sDL_StringToGUID =
+  \pchGUID0 ->
+    BG.allocaAndPeek
+      ( \res1 ->
+          hs_bindgen_5e01e589522eb138 pchGUID0 res1
+      )
diff --git a/src/SDL3/Sys/Bindgen/Haptic.hs b/src/SDL3/Sys/Bindgen/Haptic.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Haptic.hs
@@ -0,0 +1,4391 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | The SDL haptic subsystem manages haptic (force feedback) devices.
+--
+--     The basic usage is as follows:
+--
+--     * Initialize the subsystem (SDL_INIT_HAPTIC).
+--
+--     * Open a haptic device.
+--
+--     * @SDL_OpenHaptic()@ to open from index.
+--
+--     * @SDL_OpenHapticFromJoystick()@ to open from an existing joystick.
+--
+--     * Create an effect ('SDL_HapticEffect').
+--
+--     * Upload the effect with @SDL_CreateHapticEffect()@.
+--
+--     * Run the effect with @SDL_RunHapticEffect()@.
+--
+--     * (optional) Free the effect with @SDL_DestroyHapticEffect()@.
+--
+--     * Close the haptic device with @SDL_CloseHaptic()@.
+--
+--     Simple rumble example:
+--
+--     @
+--     SDL_Haptic *haptic = NULL;
+--
+--     \/\/ Open the device
+--     SDL_HapticID *haptics = SDL_GetHaptics(NULL);
+--     if (haptics) {
+--         haptic = SDL_OpenHaptic(haptics[0]);
+--         SDL_free(haptics);
+--     }
+--     if (haptic == NULL)
+--        return;
+--
+--     \/\/ Initialize simple rumble
+--     if (!SDL_InitHapticRumble(haptic))
+--        return;
+--
+--     \/\/ Play effect at 50% strength for 2 seconds
+--     if (!SDL_PlayHapticRumble(haptic, 0.5, 2000))
+--        return;
+--     SDL_Delay(2000);
+--
+--     \/\/ Clean up
+--     SDL_CloseHaptic(haptic);
+--     @
+--
+--     Complete example:
+--
+--     @
+--     bool test_haptic(SDL_Joystick *joystick)
+--     {
+--        SDL_Haptic *haptic;
+--        SDL_HapticEffect effect;
+--        SDL_HapticEffectID effect_id;
+--
+--        \/\/ Open the device
+--        haptic = SDL_OpenHapticFromJoystick(joystick);
+--        if (haptic == NULL) return false; \/\/ Most likely joystick isn\'t haptic
+--
+--        \/\/ See if it can do sine waves
+--        if ((SDL_GetHapticFeatures(haptic) & SDL_HAPTIC_SINE)==0) {
+--           SDL_CloseHaptic(haptic); \/\/ No sine effect
+--           return false;
+--        }
+--
+--        \/\/ Create the effect
+--        SDL_memset(&effect, 0, sizeof(SDL_HapticEffect)); \/\/ 0 is safe default
+--        effect.type = SDL_HAPTIC_SINE;
+--        effect.periodic.direction.type = SDL_HAPTIC_POLAR; \/\/ Polar coordinates
+--        effect.periodic.direction.dir[0] = 18000; \/\/ Force comes from south
+--        effect.periodic.period = 1000; \/\/ 1000 ms
+--        effect.periodic.magnitude = 20000; \/\/ 20000\/32767 strength
+--        effect.periodic.length = 5000; \/\/ 5 seconds long
+--        effect.periodic.attack_length = 1000; \/\/ Takes 1 second to get max strength
+--        effect.periodic.fade_length = 1000; \/\/ Takes 1 second to fade away
+--
+--        \/\/ Upload the effect
+--        effect_id = SDL_CreateHapticEffect(haptic, &effect);
+--
+--        \/\/ Test the effect
+--        SDL_RunHapticEffect(haptic, effect_id, 1);
+--        SDL_Delay(5000); \/\/ Wait for the effect to finish
+--
+--        \/\/ We destroy the effect, although closing the device also does this
+--        SDL_DestroyHapticEffect(haptic, effect_id);
+--
+--        \/\/ Close the device
+--        SDL_CloseHaptic(haptic);
+--
+--        return true; \/\/ Success
+--     }
+--     @
+--
+--     Note that the SDL haptic subsystem is not thread-safe. The haptic structure used to identify an SDL haptic.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHaptic', 'sDL_OpenHapticFromJoystick', 'sDL_CloseHaptic'
+module SDL3.Sys.Bindgen.Haptic (
+  SDL3.Sys.Bindgen.Haptic.SDL_Haptic,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_INFINITY,
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticEffectType (..),
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_CONSTANT,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_SINE,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_SQUARE,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_TRIANGLE,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_SAWTOOTHUP,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_SAWTOOTHDOWN,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_RAMP,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_SPRING,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_DAMPER,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_INERTIA,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_FRICTION,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_LEFTRIGHT,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_RESERVED1,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_RESERVED2,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_RESERVED3,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_CUSTOM,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_GAIN,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_AUTOCENTER,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_STATUS,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_PAUSE,
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticDirectionType (..),
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_POLAR,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_CARTESIAN,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_SPHERICAL,
+  SDL3.Sys.Bindgen.Haptic.sDL_HAPTIC_STEERING_AXIS,
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticEffectID (..),
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticDirection (..),
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticConstant (..),
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticPeriodic (..),
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticCondition (..),
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticRamp (..),
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticLeftRight (..),
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticCustom (..),
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticEffect (..),
+  SDL3.Sys.Bindgen.Haptic.SDL_HapticID (..),
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.ConstantArray qualified as CA
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import HsBindgen.Runtime.Union qualified as Union
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @struct SDL_Haptic@, defined at @SDL3\/SDL_haptic.h 150:16@
+data SDL_Haptic
+
+-- | Used to play a device an infinite number of times.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunHapticEffect'
+--
+--     [C declaration]: @macro SDL_HAPTIC_INFINITY@, defined at @SDL3\/SDL_haptic.h 163:9@
+sDL_HAPTIC_INFINITY :: BG.CUInt
+sDL_HAPTIC_INFINITY = (4294967295 :: BG.CUInt)
+
+-- | Type of haptic effect.
+--
+--     [C declaration]: @SDL_HapticEffectType@, defined at @SDL3\/SDL_haptic.h 181:16@
+newtype SDL_HapticEffectType = SDL_HapticEffectType
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "unwrap" SDL_HapticEffectType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticEffectType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "unwrap" (BG.Ptr SDL_HapticEffectType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_HapticEffectType "unwrap" where
+  type
+    CFieldType SDL_HapticEffectType "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 0
+
+-- | Constant effect supported.
+--
+--     Constant haptic effect.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticCondition'
+--
+--     [C declaration]: @macro SDL_HAPTIC_CONSTANT@, defined at @SDL3\/SDL_haptic.h 192:9@
+sDL_HAPTIC_CONSTANT :: BG.CUInt
+sDL_HAPTIC_CONSTANT =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (0 :: BG.CInt)
+
+-- | Sine wave effect supported.
+--
+--     Periodic haptic effect that simulates sine waves.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticPeriodic'
+--
+--     [C declaration]: @macro SDL_HAPTIC_SINE@, defined at @SDL3\/SDL_haptic.h 203:9@
+sDL_HAPTIC_SINE :: BG.CUInt
+sDL_HAPTIC_SINE =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (1 :: BG.CInt)
+
+-- | Square wave effect supported.
+--
+--     Periodic haptic effect that simulates square waves.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticPeriodic'
+--
+--     [C declaration]: @macro SDL_HAPTIC_SQUARE@, defined at @SDL3\/SDL_haptic.h 214:9@
+sDL_HAPTIC_SQUARE :: BG.CUInt
+sDL_HAPTIC_SQUARE =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (2 :: BG.CInt)
+
+-- | Triangle wave effect supported.
+--
+--     Periodic haptic effect that simulates triangular waves.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticPeriodic'
+--
+--     [C declaration]: @macro SDL_HAPTIC_TRIANGLE@, defined at @SDL3\/SDL_haptic.h 225:9@
+sDL_HAPTIC_TRIANGLE :: BG.CUInt
+sDL_HAPTIC_TRIANGLE =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (3 :: BG.CInt)
+
+-- | Sawtoothup wave effect supported.
+--
+--     Periodic haptic effect that simulates saw tooth up waves.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticPeriodic'
+--
+--     [C declaration]: @macro SDL_HAPTIC_SAWTOOTHUP@, defined at @SDL3\/SDL_haptic.h 236:9@
+sDL_HAPTIC_SAWTOOTHUP :: BG.CUInt
+sDL_HAPTIC_SAWTOOTHUP =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (4 :: BG.CInt)
+
+-- | Sawtoothdown wave effect supported.
+--
+--     Periodic haptic effect that simulates saw tooth down waves.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticPeriodic'
+--
+--     [C declaration]: @macro SDL_HAPTIC_SAWTOOTHDOWN@, defined at @SDL3\/SDL_haptic.h 247:9@
+sDL_HAPTIC_SAWTOOTHDOWN :: BG.CUInt
+sDL_HAPTIC_SAWTOOTHDOWN =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (5 :: BG.CInt)
+
+-- | Ramp effect supported.
+--
+--     Ramp haptic effect.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticRamp'
+--
+--     [C declaration]: @macro SDL_HAPTIC_RAMP@, defined at @SDL3\/SDL_haptic.h 258:9@
+sDL_HAPTIC_RAMP :: BG.CUInt
+sDL_HAPTIC_RAMP =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (6 :: BG.CInt)
+
+-- | Spring effect supported - uses axes position.
+--
+--     Condition haptic effect that simulates a spring. Effect is based on the axes position.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticCondition'
+--
+--     [C declaration]: @macro SDL_HAPTIC_SPRING@, defined at @SDL3\/SDL_haptic.h 270:9@
+sDL_HAPTIC_SPRING :: BG.CUInt
+sDL_HAPTIC_SPRING =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (7 :: BG.CInt)
+
+-- | Damper effect supported - uses axes velocity.
+--
+--     Condition haptic effect that simulates dampening. Effect is based on the axes velocity.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticCondition'
+--
+--     [C declaration]: @macro SDL_HAPTIC_DAMPER@, defined at @SDL3\/SDL_haptic.h 282:9@
+sDL_HAPTIC_DAMPER :: BG.CUInt
+sDL_HAPTIC_DAMPER =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (8 :: BG.CInt)
+
+-- | Inertia effect supported - uses axes acceleration.
+--
+--     Condition haptic effect that simulates inertia. Effect is based on the axes acceleration.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticCondition'
+--
+--     [C declaration]: @macro SDL_HAPTIC_INERTIA@, defined at @SDL3\/SDL_haptic.h 294:9@
+sDL_HAPTIC_INERTIA :: BG.CUInt
+sDL_HAPTIC_INERTIA =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (9 :: BG.CInt)
+
+-- | Friction effect supported - uses axes movement.
+--
+--     Condition haptic effect that simulates friction. Effect is based on the axes movement.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticCondition'
+--
+--     [C declaration]: @macro SDL_HAPTIC_FRICTION@, defined at @SDL3\/SDL_haptic.h 306:9@
+sDL_HAPTIC_FRICTION :: BG.CUInt
+sDL_HAPTIC_FRICTION =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (10 :: BG.CInt)
+
+-- | Left\/Right effect supported.
+--
+--     Haptic effect for direct control over high\/low frequency motors.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticLeftRight'
+--
+--     [C declaration]: @macro SDL_HAPTIC_LEFTRIGHT@, defined at @SDL3\/SDL_haptic.h 317:9@
+sDL_HAPTIC_LEFTRIGHT :: BG.CUInt
+sDL_HAPTIC_LEFTRIGHT =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (11 :: BG.CInt)
+
+-- | Reserved for future use.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HAPTIC_RESERVED1@, defined at @SDL3\/SDL_haptic.h 324:9@
+sDL_HAPTIC_RESERVED1 :: BG.CUInt
+sDL_HAPTIC_RESERVED1 =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (12 :: BG.CInt)
+
+-- | Reserved for future use.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HAPTIC_RESERVED2@, defined at @SDL3\/SDL_haptic.h 331:9@
+sDL_HAPTIC_RESERVED2 :: BG.CUInt
+sDL_HAPTIC_RESERVED2 =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (13 :: BG.CInt)
+
+-- | Reserved for future use.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HAPTIC_RESERVED3@, defined at @SDL3\/SDL_haptic.h 338:9@
+sDL_HAPTIC_RESERVED3 :: BG.CUInt
+sDL_HAPTIC_RESERVED3 =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (14 :: BG.CInt)
+
+-- | Custom effect is supported.
+--
+--     User defined custom haptic effect.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HAPTIC_CUSTOM@, defined at @SDL3\/SDL_haptic.h 347:9@
+sDL_HAPTIC_CUSTOM :: BG.CUInt
+sDL_HAPTIC_CUSTOM =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (15 :: BG.CInt)
+
+-- | Device can set global gain.
+--
+--     Device supports setting the global gain.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetHapticGain'
+--
+--     [C declaration]: @macro SDL_HAPTIC_GAIN@, defined at @SDL3\/SDL_haptic.h 362:9@
+sDL_HAPTIC_GAIN :: BG.CUInt
+sDL_HAPTIC_GAIN =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (16 :: BG.CInt)
+
+-- | Device can set autocenter.
+--
+--     Device supports setting autocenter.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetHapticAutocenter'
+--
+--     [C declaration]: @macro SDL_HAPTIC_AUTOCENTER@, defined at @SDL3\/SDL_haptic.h 373:9@
+sDL_HAPTIC_AUTOCENTER :: BG.CUInt
+sDL_HAPTIC_AUTOCENTER =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (17 :: BG.CInt)
+
+-- | Device can be queried for effect status.
+--
+--     Device supports querying effect status.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticEffectStatus'
+--
+--     [C declaration]: @macro SDL_HAPTIC_STATUS@, defined at @SDL3\/SDL_haptic.h 384:9@
+sDL_HAPTIC_STATUS :: BG.CUInt
+sDL_HAPTIC_STATUS =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (18 :: BG.CInt)
+
+-- | Device can be paused.
+--
+--     Devices supports being paused.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseHaptic', 'sDL_ResumeHaptic'
+--
+--     [C declaration]: @macro SDL_HAPTIC_PAUSE@, defined at @SDL3\/SDL_haptic.h 396:9@
+sDL_HAPTIC_PAUSE :: BG.CUInt
+sDL_HAPTIC_PAUSE =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (19 :: BG.CInt)
+
+-- | Type of coordinates used for haptic direction.
+--
+--     [C declaration]: @SDL_HapticDirectionType@, defined at @SDL3\/SDL_haptic.h 407:15@
+newtype SDL_HapticDirectionType = SDL_HapticDirectionType
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "unwrap" SDL_HapticDirectionType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticDirectionType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "unwrap" (BG.Ptr SDL_HapticDirectionType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_HapticDirectionType "unwrap" where
+  type
+    CFieldType SDL_HapticDirectionType "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 0
+
+-- | Uses polar coordinates for the direction.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticDirection'
+--
+--     [C declaration]: @macro SDL_HAPTIC_POLAR@, defined at @SDL3\/SDL_haptic.h 416:9@
+sDL_HAPTIC_POLAR :: BG.CInt
+sDL_HAPTIC_POLAR = (0 :: BG.CInt)
+
+-- | Uses cartesian coordinates for the direction.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticDirection'
+--
+--     [C declaration]: @macro SDL_HAPTIC_CARTESIAN@, defined at @SDL3\/SDL_haptic.h 425:9@
+sDL_HAPTIC_CARTESIAN :: BG.CInt
+sDL_HAPTIC_CARTESIAN = (1 :: BG.CInt)
+
+-- | Uses spherical coordinates for the direction.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticDirection'
+--
+--     [C declaration]: @macro SDL_HAPTIC_SPHERICAL@, defined at @SDL3\/SDL_haptic.h 434:9@
+sDL_HAPTIC_SPHERICAL :: BG.CInt
+sDL_HAPTIC_SPHERICAL = (2 :: BG.CInt)
+
+-- | Use this value to play an effect on the steering wheel axis.
+--
+--     This provides better compatibility across platforms and devices as SDL will guess the correct axis.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticDirection'
+--
+--     [C declaration]: @macro SDL_HAPTIC_STEERING_AXIS@, defined at @SDL3\/SDL_haptic.h 446:9@
+sDL_HAPTIC_STEERING_AXIS :: BG.CInt
+sDL_HAPTIC_STEERING_AXIS = (3 :: BG.CInt)
+
+-- | ID for haptic effects.
+--
+--     This is -1 if the ID is invalid.
+--
+--     [See also]: 'sDL_CreateHapticEffect'
+--
+--     [C declaration]: @SDL_HapticEffectID@, defined at @SDL3\/SDL_haptic.h 460:13@
+newtype SDL_HapticEffectID = SDL_HapticEffectID
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_HapticEffectID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticEffectID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_HapticEffectID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_HapticEffectID "unwrap" where
+  type CFieldType SDL_HapticEffectID "unwrap" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Structure that represents a haptic direction.
+--
+--     This is the direction where the force comes from, instead of the direction in which the force is exerted.
+--
+--     Directions can be specified by:
+--
+--     * SDL_HAPTIC_POLAR : Specified by polar coordinates.
+--
+--     * SDL_HAPTIC_CARTESIAN : Specified by cartesian coordinates.
+--
+--     * SDL_HAPTIC_SPHERICAL : Specified by spherical coordinates.
+--
+--     Cardinal directions of the haptic device are relative to the positioning of the device. North is considered to be away from the user.
+--
+--     The following diagram represents the cardinal directions:
+--
+--     @
+--                   .--.
+--                   |__| .-------.
+--                   |=.| |.-----.|
+--                   |--| ||     ||
+--                   |  | |\'-----\'|
+--                   |__|~\')_____(\'
+--                     [ COMPUTER ]
+--
+--
+--                       North (0,-1)
+--                           ^
+--                           |
+--                           |
+--     (-1,0)  West \<----[ HAPTIC ]----> East (1,0)
+--                           |
+--                           |
+--                           v
+--                        South (0,1)
+--
+--
+--                        [ USER ]
+--                          \\|||\/
+--                          (o o)
+--                    ---ooO-(_)-Ooo---
+--     @
+--
+--     If type is SDL_HAPTIC_POLAR, direction is encoded by hundredths of a degree starting north and turning clockwise. SDL_HAPTIC_POLAR only uses the first @dir@ parameter. The cardinal directions would be:
+--
+--     * North: 0 (0 degrees)
+--
+--     * East: 9000 (90 degrees)
+--
+--     * South: 18000 (180 degrees)
+--
+--     * West: 27000 (270 degrees)
+--
+--     If type is SDL_HAPTIC_CARTESIAN, direction is encoded by three positions (X axis, Y axis and Z axis (with 3 axes)). SDL_HAPTIC_CARTESIAN uses the first three @dir@ parameters. The cardinal directions would be:
+--
+--     * North: 0,-1, 0
+--
+--     * East: 1, 0, 0
+--
+--     * South: 0, 1, 0
+--
+--     * West: -1, 0, 0
+--
+--     The Z axis represents the height of the effect if supported, otherwise it\'s unused. In cartesian encoding (1, 2) would be the same as (2, 4), you can use any multiple you want, only the direction matters.
+--
+--     If type is SDL_HAPTIC_SPHERICAL, direction is encoded by two rotations. The first two @dir@ parameters are used. The @dir@ parameters are as follows (all values are in hundredths of degrees):
+--
+--     * Degrees from (1, 0) rotated towards (0, 1).
+--
+--     * Degrees towards (0, 0, 1) (device needs at least 3 axes).
+--
+--     Example of force coming from the south with all encodings (force coming from the south means the user will have to pull the stick to counteract):
+--
+--     @
+--     SDL_HapticDirection direction;
+--
+--     \/\/ Cartesian directions
+--     direction.type = SDL_HAPTIC_CARTESIAN; \/\/ Using cartesian direction encoding.
+--     direction.dir[0] = 0; \/\/ X position
+--     direction.dir[1] = 1; \/\/ Y position
+--     \/\/ Assuming the device has 2 axes, we don\'t need to specify third parameter.
+--
+--     \/\/ Polar directions
+--     direction.type = SDL_HAPTIC_POLAR; \/\/ We\'ll be using polar direction encoding.
+--     direction.dir[0] = 18000; \/\/ Polar only uses first parameter
+--
+--     \/\/ Spherical coordinates
+--     direction.type = SDL_HAPTIC_SPHERICAL; \/\/ Spherical encoding
+--     direction.dir[0] = 9000; \/\/ Since we only have two axes we don\'t need more parameters.
+--     @
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HAPTIC_POLAR', 'sDL_HAPTIC_CARTESIAN', 'sDL_HAPTIC_SPHERICAL', 'sDL_HAPTIC_STEERING_AXIS', 'SDL_HapticEffect', 'sDL_GetNumHapticAxes'
+--
+--     [C declaration]: @struct SDL_HapticDirection@, defined at @SDL3\/SDL_haptic.h 566:16@
+data SDL_HapticDirection = SDL_HapticDirection
+  { type' :: SDL_HapticDirectionType
+  -- ^ The type of encoding.
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_haptic.h 568:29@
+  , dir :: CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The encoded direction.
+  --
+  --          [C declaration]: @dir@, defined at @SDL3\/SDL_haptic.h 569:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_HapticDirection where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_HapticDirection where
+  readRaw =
+    \ptr0 ->
+      pure SDL_HapticDirection
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"dir") ptr0
+
+instance Marshal.WriteRaw SDL_HapticDirection where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_HapticDirection type'2 dir3 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"dir") ptr0 dir3
+
+deriving via Marshal.EquivStorable SDL_HapticDirection instance BG.Storable SDL_HapticDirection
+
+instance
+  (ty ~ SDL_HapticDirectionType)
+  => BG.CompatHasField.HasField "type'" SDL_HapticDirection ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticDirection{type' = y1, dir = BG.getField @"dir" x0}
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_HapticDirectionType)
+  => BG.HasField "type'" (BG.Ptr SDL_HapticDirection) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_HapticDirection "type'" where
+  type
+    CFieldType SDL_HapticDirection "type'" =
+      SDL_HapticDirectionType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "dir" SDL_HapticDirection ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticDirection{dir = y1, type' = BG.getField @"type'" x0}
+      , BG.getField @"dir" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "dir" (BG.Ptr SDL_HapticDirection) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"dir")
+
+instance HasCField.HasCField SDL_HapticDirection "dir" where
+  type
+    CFieldType SDL_HapticDirection "dir" =
+      CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 4
+
+-- | A structure containing a template for a Constant effect.
+--
+--     This struct is exclusively for the SDL_HAPTIC_CONSTANT effect.
+--
+--     A constant effect applies a constant force in the specified direction to the joystick.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HAPTIC_CONSTANT', 'SDL_HapticEffect'
+--
+--     [C declaration]: @struct SDL_HapticConstant@, defined at @SDL3\/SDL_haptic.h 586:16@
+data SDL_HapticConstant = SDL_HapticConstant
+  { type' :: SDL_HapticEffectType
+  -- ^ SDL_HAPTIC_CONSTANT
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_haptic.h 589:26@
+  , direction :: SDL_HapticDirection
+  -- ^ Direction of the effect.
+  --
+  --          [C declaration]: @direction@, defined at @SDL3\/SDL_haptic.h 590:25@
+  , length :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Duration of the effect.
+  --
+  --          [C declaration]: @length@, defined at @SDL3\/SDL_haptic.h 593:12@
+  , delay :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Delay before starting the effect.
+  --
+  --          [C declaration]: @delay@, defined at @SDL3\/SDL_haptic.h 594:12@
+  , button :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Button that triggers the effect.
+  --
+  --          [C declaration]: @button@, defined at @SDL3\/SDL_haptic.h 597:12@
+  , interval :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ How soon it can be triggered again after button.
+  --
+  --          [C declaration]: @interval@, defined at @SDL3\/SDL_haptic.h 598:12@
+  , level :: SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ Strength of the constant effect.
+  --
+  --          [C declaration]: @level@, defined at @SDL3\/SDL_haptic.h 601:12@
+  , attack_length :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Duration of the attack.
+  --
+  --          [C declaration]: @attack_length@, defined at @SDL3\/SDL_haptic.h 604:12@
+  , attack_level :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Level at the start of the attack.
+  --
+  --          [C declaration]: @attack_level@, defined at @SDL3\/SDL_haptic.h 605:12@
+  , fade_length :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Duration of the fade.
+  --
+  --          [C declaration]: @fade_length@, defined at @SDL3\/SDL_haptic.h 606:12@
+  , fade_level :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Level at the end of the fade.
+  --
+  --          [C declaration]: @fade_level@, defined at @SDL3\/SDL_haptic.h 607:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_HapticConstant where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_HapticConstant where
+  readRaw =
+    \ptr0 ->
+      pure SDL_HapticConstant
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"direction") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"delay") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"button") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"interval") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"attack_length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"attack_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"fade_length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"fade_level") ptr0
+
+instance Marshal.WriteRaw SDL_HapticConstant where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_HapticConstant
+            type'2
+            direction3
+            length4
+            delay5
+            button6
+            interval7
+            level8
+            attack_length9
+            attack_level10
+            fade_length11
+            fade_level12 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"direction") ptr0 direction3
+                >> HasCField.writeRaw (BG.Proxy @"length") ptr0 length4
+                >> HasCField.writeRaw (BG.Proxy @"delay") ptr0 delay5
+                >> HasCField.writeRaw (BG.Proxy @"button") ptr0 button6
+                >> HasCField.writeRaw (BG.Proxy @"interval") ptr0 interval7
+                >> HasCField.writeRaw (BG.Proxy @"level") ptr0 level8
+                >> HasCField.writeRaw (BG.Proxy @"attack_length") ptr0 attack_length9
+                >> HasCField.writeRaw (BG.Proxy @"attack_level") ptr0 attack_level10
+                >> HasCField.writeRaw (BG.Proxy @"fade_length") ptr0 fade_length11
+                >> HasCField.writeRaw (BG.Proxy @"fade_level") ptr0 fade_level12
+
+deriving via Marshal.EquivStorable SDL_HapticConstant instance BG.Storable SDL_HapticConstant
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.CompatHasField.HasField "type'" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { type' = y1
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , level = BG.getField @"level" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.HasField "type'" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_HapticConstant "type'" where
+  type
+    CFieldType SDL_HapticConstant "type'" =
+      SDL_HapticEffectType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_HapticDirection)
+  => BG.CompatHasField.HasField "direction" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { direction = y1
+            , type' = BG.getField @"type'" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , level = BG.getField @"level" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"direction" x0
+      )
+
+instance
+  (ty ~ SDL_HapticDirection)
+  => BG.HasField "direction" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"direction")
+
+instance HasCField.HasCField SDL_HapticConstant "direction" where
+  type
+    CFieldType SDL_HapticConstant "direction" =
+      SDL_HapticDirection
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "length" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , level = BG.getField @"level" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "length" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"length")
+
+instance HasCField.HasCField SDL_HapticConstant "length" where
+  type
+    CFieldType SDL_HapticConstant "length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "delay" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { delay = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , level = BG.getField @"level" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"delay" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "delay" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"delay")
+
+instance HasCField.HasCField SDL_HapticConstant "delay" where
+  type
+    CFieldType SDL_HapticConstant "delay" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "button" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { button = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , interval = BG.getField @"interval" x0
+            , level = BG.getField @"level" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"button" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "button" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_HapticConstant "button" where
+  type
+    CFieldType SDL_HapticConstant "button" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 26
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "interval" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { interval = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , level = BG.getField @"level" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"interval" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "interval" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"interval")
+
+instance HasCField.HasCField SDL_HapticConstant "interval" where
+  type
+    CFieldType SDL_HapticConstant "interval" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "level" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { level = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "level" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"level")
+
+instance HasCField.HasCField SDL_HapticConstant "level" where
+  type
+    CFieldType SDL_HapticConstant "level" =
+      SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 30
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "attack_length" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { attack_length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , level = BG.getField @"level" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"attack_length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "attack_length" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"attack_length")
+
+instance HasCField.HasCField SDL_HapticConstant "attack_length" where
+  type
+    CFieldType SDL_HapticConstant "attack_length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "attack_level" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { attack_level = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , level = BG.getField @"level" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"attack_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "attack_level" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"attack_level")
+
+instance HasCField.HasCField SDL_HapticConstant "attack_level" where
+  type
+    CFieldType SDL_HapticConstant "attack_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 34
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "fade_length" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { fade_length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , level = BG.getField @"level" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"fade_length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "fade_length" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"fade_length")
+
+instance HasCField.HasCField SDL_HapticConstant "fade_length" where
+  type
+    CFieldType SDL_HapticConstant "fade_length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "fade_level" SDL_HapticConstant ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticConstant
+            { fade_level = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , level = BG.getField @"level" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            }
+      , BG.getField @"fade_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "fade_level" (BG.Ptr SDL_HapticConstant) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"fade_level")
+
+instance HasCField.HasCField SDL_HapticConstant "fade_level" where
+  type
+    CFieldType SDL_HapticConstant "fade_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 38
+
+-- | A structure containing a template for a Periodic effect.
+--
+--     The struct handles the following effects:
+--
+--     * SDL_HAPTIC_SINE
+--
+--     * SDL_HAPTIC_SQUARE
+--
+--     * SDL_HAPTIC_TRIANGLE
+--
+--     * SDL_HAPTIC_SAWTOOTHUP
+--
+--     * SDL_HAPTIC_SAWTOOTHDOWN
+--
+--     A periodic effect consists in a wave-shaped effect that repeats itself over time. The type determines the shape of the wave and the parameters determine the dimensions of the wave.
+--
+--     Phase is given by hundredth of a degree meaning that giving the phase a value of 9000 will displace it 25% of its period. Here are sample values:
+--
+--     * 0: No phase displacement.
+--
+--     * 9000: Displaced 25% of its period.
+--
+--     * 18000: Displaced 50% of its period.
+--
+--     * 27000: Displaced 75% of its period.
+--
+--     * 36000: Displaced 100% of its period, same as 0, but 0 is preferred.
+--
+--     Examples:
+--
+--     @
+--     SDL_HAPTIC_SINE
+--       __      __      __      __
+--      \/  \\    \/  \\    \/  \\    \/
+--     \/    \\__\/    \\__\/    \\__\/
+--
+--     SDL_HAPTIC_SQUARE
+--      __    __    __    __    __
+--     |  |  |  |  |  |  |  |  |  |
+--     |  |__|  |__|  |__|  |__|  |
+--
+--     SDL_HAPTIC_TRIANGLE
+--       \/\\    \/\\    \/\\    \/\\    \/\\
+--      \/  \\  \/  \\  \/  \\  \/  \\  \/
+--     \/    \\\/    \\\/    \\\/    \\\/
+--
+--     SDL_HAPTIC_SAWTOOTHUP
+--       \/|  \/|  \/|  \/|  \/|  \/|  \/|
+--      \/ | \/ | \/ | \/ | \/ | \/ | \/ |
+--     \/  |\/  |\/  |\/  |\/  |\/  |\/  |
+--
+--     SDL_HAPTIC_SAWTOOTHDOWN
+--     \\  |\\  |\\  |\\  |\\  |\\  |\\  |
+--      \\ | \\ | \\ | \\ | \\ | \\ | \\ |
+--       \\|  \\|  \\|  \\|  \\|  \\|  \\|
+--     @
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HAPTIC_SINE', 'sDL_HAPTIC_SQUARE', 'sDL_HAPTIC_TRIANGLE', 'sDL_HAPTIC_SAWTOOTHUP', 'sDL_HAPTIC_SAWTOOTHDOWN', 'SDL_HapticEffect'
+--
+--     [C declaration]: @struct SDL_HapticPeriodic@, defined at @SDL3\/SDL_haptic.h 672:16@
+data SDL_HapticPeriodic = SDL_HapticPeriodic
+  { type' :: SDL_HapticEffectType
+  -- ^ SDL_HAPTIC_SINE, SDL_HAPTIC_SQUARE SDL_HAPTIC_TRIANGLE, SDL_HAPTIC_SAWTOOTHUP or SDL_HAPTIC_SAWTOOTHDOWN
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_haptic.h 675:26@
+  , direction :: SDL_HapticDirection
+  -- ^ Direction of the effect.
+  --
+  --          [C declaration]: @direction@, defined at @SDL3\/SDL_haptic.h 678:25@
+  , length :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Duration of the effect.
+  --
+  --          [C declaration]: @length@, defined at @SDL3\/SDL_haptic.h 681:12@
+  , delay :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Delay before starting the effect.
+  --
+  --          [C declaration]: @delay@, defined at @SDL3\/SDL_haptic.h 682:12@
+  , button :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Button that triggers the effect.
+  --
+  --          [C declaration]: @button@, defined at @SDL3\/SDL_haptic.h 685:12@
+  , interval :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ How soon it can be triggered again after button.
+  --
+  --          [C declaration]: @interval@, defined at @SDL3\/SDL_haptic.h 686:12@
+  , period :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Period of the wave.
+  --
+  --          [C declaration]: @period@, defined at @SDL3\/SDL_haptic.h 689:12@
+  , magnitude :: SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ Peak value; if negative, equivalent to 180 degrees extra phase shift.
+  --
+  --          [C declaration]: @magnitude@, defined at @SDL3\/SDL_haptic.h 690:12@
+  , offset :: SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ Mean value of the wave.
+  --
+  --          [C declaration]: @offset@, defined at @SDL3\/SDL_haptic.h 691:12@
+  , phase :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Positive phase shift given by hundredth of a degree.
+  --
+  --          [C declaration]: @phase@, defined at @SDL3\/SDL_haptic.h 692:12@
+  , attack_length :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Duration of the attack.
+  --
+  --          [C declaration]: @attack_length@, defined at @SDL3\/SDL_haptic.h 695:12@
+  , attack_level :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Level at the start of the attack.
+  --
+  --          [C declaration]: @attack_level@, defined at @SDL3\/SDL_haptic.h 696:12@
+  , fade_length :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Duration of the fade.
+  --
+  --          [C declaration]: @fade_length@, defined at @SDL3\/SDL_haptic.h 697:12@
+  , fade_level :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Level at the end of the fade.
+  --
+  --          [C declaration]: @fade_level@, defined at @SDL3\/SDL_haptic.h 698:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_HapticPeriodic where
+  staticSizeOf = \_ -> (48 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_HapticPeriodic where
+  readRaw =
+    \ptr0 ->
+      pure SDL_HapticPeriodic
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"direction") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"delay") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"button") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"interval") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"period") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"magnitude") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"offset") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"phase") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"attack_length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"attack_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"fade_length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"fade_level") ptr0
+
+instance Marshal.WriteRaw SDL_HapticPeriodic where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_HapticPeriodic
+            type'2
+            direction3
+            length4
+            delay5
+            button6
+            interval7
+            period8
+            magnitude9
+            offset10
+            phase11
+            attack_length12
+            attack_level13
+            fade_length14
+            fade_level15 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"direction") ptr0 direction3
+                >> HasCField.writeRaw (BG.Proxy @"length") ptr0 length4
+                >> HasCField.writeRaw (BG.Proxy @"delay") ptr0 delay5
+                >> HasCField.writeRaw (BG.Proxy @"button") ptr0 button6
+                >> HasCField.writeRaw (BG.Proxy @"interval") ptr0 interval7
+                >> HasCField.writeRaw (BG.Proxy @"period") ptr0 period8
+                >> HasCField.writeRaw (BG.Proxy @"magnitude") ptr0 magnitude9
+                >> HasCField.writeRaw (BG.Proxy @"offset") ptr0 offset10
+                >> HasCField.writeRaw (BG.Proxy @"phase") ptr0 phase11
+                >> HasCField.writeRaw (BG.Proxy @"attack_length") ptr0 attack_length12
+                >> HasCField.writeRaw (BG.Proxy @"attack_level") ptr0 attack_level13
+                >> HasCField.writeRaw (BG.Proxy @"fade_length") ptr0 fade_length14
+                >> HasCField.writeRaw (BG.Proxy @"fade_level") ptr0 fade_level15
+
+deriving via Marshal.EquivStorable SDL_HapticPeriodic instance BG.Storable SDL_HapticPeriodic
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.CompatHasField.HasField "type'" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { type' = y1
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.HasField "type'" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_HapticPeriodic "type'" where
+  type
+    CFieldType SDL_HapticPeriodic "type'" =
+      SDL_HapticEffectType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_HapticDirection)
+  => BG.CompatHasField.HasField "direction" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { direction = y1
+            , type' = BG.getField @"type'" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"direction" x0
+      )
+
+instance
+  (ty ~ SDL_HapticDirection)
+  => BG.HasField "direction" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"direction")
+
+instance HasCField.HasCField SDL_HapticPeriodic "direction" where
+  type
+    CFieldType SDL_HapticPeriodic "direction" =
+      SDL_HapticDirection
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "length" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "length" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"length")
+
+instance HasCField.HasCField SDL_HapticPeriodic "length" where
+  type
+    CFieldType SDL_HapticPeriodic "length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "delay" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { delay = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"delay" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "delay" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"delay")
+
+instance HasCField.HasCField SDL_HapticPeriodic "delay" where
+  type
+    CFieldType SDL_HapticPeriodic "delay" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "button" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { button = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"button" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "button" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_HapticPeriodic "button" where
+  type
+    CFieldType SDL_HapticPeriodic "button" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 26
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "interval" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { interval = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"interval" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "interval" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"interval")
+
+instance HasCField.HasCField SDL_HapticPeriodic "interval" where
+  type
+    CFieldType SDL_HapticPeriodic "interval" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "period" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { period = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"period" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "period" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"period")
+
+instance HasCField.HasCField SDL_HapticPeriodic "period" where
+  type
+    CFieldType SDL_HapticPeriodic "period" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 30
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "magnitude" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { magnitude = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"magnitude" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "magnitude" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"magnitude")
+
+instance HasCField.HasCField SDL_HapticPeriodic "magnitude" where
+  type
+    CFieldType SDL_HapticPeriodic "magnitude" =
+      SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "offset" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { offset = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"offset" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "offset" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"offset")
+
+instance HasCField.HasCField SDL_HapticPeriodic "offset" where
+  type
+    CFieldType SDL_HapticPeriodic "offset" =
+      SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 34
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "phase" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { phase = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"phase" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "phase" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"phase")
+
+instance HasCField.HasCField SDL_HapticPeriodic "phase" where
+  type
+    CFieldType SDL_HapticPeriodic "phase" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "attack_length" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { attack_length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"attack_length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "attack_length" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"attack_length")
+
+instance HasCField.HasCField SDL_HapticPeriodic "attack_length" where
+  type
+    CFieldType SDL_HapticPeriodic "attack_length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 38
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "attack_level" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { attack_level = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"attack_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "attack_level" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"attack_level")
+
+instance HasCField.HasCField SDL_HapticPeriodic "attack_level" where
+  type
+    CFieldType SDL_HapticPeriodic "attack_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "fade_length" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { fade_length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"fade_length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "fade_length" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"fade_length")
+
+instance HasCField.HasCField SDL_HapticPeriodic "fade_length" where
+  type
+    CFieldType SDL_HapticPeriodic "fade_length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 42
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "fade_level" SDL_HapticPeriodic ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticPeriodic
+            { fade_level = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , magnitude = BG.getField @"magnitude" x0
+            , offset = BG.getField @"offset" x0
+            , phase = BG.getField @"phase" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            }
+      , BG.getField @"fade_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "fade_level" (BG.Ptr SDL_HapticPeriodic) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"fade_level")
+
+instance HasCField.HasCField SDL_HapticPeriodic "fade_level" where
+  type
+    CFieldType SDL_HapticPeriodic "fade_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 44
+
+-- | A structure containing a template for a Condition effect.
+--
+--     The struct handles the following effects:
+--
+--     * SDL_HAPTIC_SPRING: Effect based on axes position.
+--
+--     * SDL_HAPTIC_DAMPER: Effect based on axes velocity.
+--
+--     * SDL_HAPTIC_INERTIA: Effect based on axes acceleration.
+--
+--     * SDL_HAPTIC_FRICTION: Effect based on axes movement.
+--
+--     Direction is handled by condition internals instead of a direction member. The condition effect specific members have three parameters. The first refers to the X axis, the second refers to the Y axis and the third refers to the Z axis. The right terms refer to the positive side of the axis and the left terms refer to the negative side of the axis. Please refer to the 'SDL_HapticDirection' diagram for which side is positive and which is negative.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticDirection', 'sDL_HAPTIC_SPRING', 'sDL_HAPTIC_DAMPER', 'sDL_HAPTIC_INERTIA', 'sDL_HAPTIC_FRICTION', 'SDL_HapticEffect'
+--
+--     [C declaration]: @struct SDL_HapticCondition@, defined at @SDL3\/SDL_haptic.h 728:16@
+data SDL_HapticCondition = SDL_HapticCondition
+  { type' :: SDL_HapticEffectType
+  -- ^ SDL_HAPTIC_SPRING, SDL_HAPTIC_DAMPER, SDL_HAPTIC_INERTIA or SDL_HAPTIC_FRICTION
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_haptic.h 731:26@
+  , direction :: SDL_HapticDirection
+  -- ^ Direction of the effect.
+  --
+  --          [C declaration]: @direction@, defined at @SDL3\/SDL_haptic.h 733:25@
+  , length :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Duration of the effect.
+  --
+  --          [C declaration]: @length@, defined at @SDL3\/SDL_haptic.h 736:12@
+  , delay :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Delay before starting the effect.
+  --
+  --          [C declaration]: @delay@, defined at @SDL3\/SDL_haptic.h 737:12@
+  , button :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Button that triggers the effect.
+  --
+  --          [C declaration]: @button@, defined at @SDL3\/SDL_haptic.h 740:12@
+  , interval :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ How soon it can be triggered again after button.
+  --
+  --          [C declaration]: @interval@, defined at @SDL3\/SDL_haptic.h 741:12@
+  , right_sat :: CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Level when joystick is to the positive side; max 0xFFFF.
+  --
+  --          [C declaration]: @right_sat@, defined at @SDL3\/SDL_haptic.h 744:12@
+  , left_sat :: CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Level when joystick is to the negative side; max 0xFFFF.
+  --
+  --          [C declaration]: @left_sat@, defined at @SDL3\/SDL_haptic.h 745:12@
+  , right_coeff :: CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ How fast to increase the force towards the positive side.
+  --
+  --          [C declaration]: @right_coeff@, defined at @SDL3\/SDL_haptic.h 746:12@
+  , left_coeff :: CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ How fast to increase the force towards the negative side.
+  --
+  --          [C declaration]: @left_coeff@, defined at @SDL3\/SDL_haptic.h 747:12@
+  , deadband :: CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Size of the dead zone; max 0xFFFF: whole axis-range when 0-centered.
+  --
+  --          [C declaration]: @deadband@, defined at @SDL3\/SDL_haptic.h 748:12@
+  , center :: CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ Position of the dead zone.
+  --
+  --          [C declaration]: @center@, defined at @SDL3\/SDL_haptic.h 749:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_HapticCondition where
+  staticSizeOf = \_ -> (68 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_HapticCondition where
+  readRaw =
+    \ptr0 ->
+      pure SDL_HapticCondition
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"direction") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"delay") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"button") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"interval") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"right_sat") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"left_sat") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"right_coeff") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"left_coeff") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"deadband") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"center") ptr0
+
+instance Marshal.WriteRaw SDL_HapticCondition where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_HapticCondition
+            type'2
+            direction3
+            length4
+            delay5
+            button6
+            interval7
+            right_sat8
+            left_sat9
+            right_coeff10
+            left_coeff11
+            deadband12
+            center13 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"direction") ptr0 direction3
+                >> HasCField.writeRaw (BG.Proxy @"length") ptr0 length4
+                >> HasCField.writeRaw (BG.Proxy @"delay") ptr0 delay5
+                >> HasCField.writeRaw (BG.Proxy @"button") ptr0 button6
+                >> HasCField.writeRaw (BG.Proxy @"interval") ptr0 interval7
+                >> HasCField.writeRaw (BG.Proxy @"right_sat") ptr0 right_sat8
+                >> HasCField.writeRaw (BG.Proxy @"left_sat") ptr0 left_sat9
+                >> HasCField.writeRaw (BG.Proxy @"right_coeff") ptr0 right_coeff10
+                >> HasCField.writeRaw (BG.Proxy @"left_coeff") ptr0 left_coeff11
+                >> HasCField.writeRaw (BG.Proxy @"deadband") ptr0 deadband12
+                >> HasCField.writeRaw (BG.Proxy @"center") ptr0 center13
+
+deriving via Marshal.EquivStorable SDL_HapticCondition instance BG.Storable SDL_HapticCondition
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.CompatHasField.HasField "type'" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { type' = y1
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.HasField "type'" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_HapticCondition "type'" where
+  type
+    CFieldType SDL_HapticCondition "type'" =
+      SDL_HapticEffectType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_HapticDirection)
+  => BG.CompatHasField.HasField "direction" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { direction = y1
+            , type' = BG.getField @"type'" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"direction" x0
+      )
+
+instance
+  (ty ~ SDL_HapticDirection)
+  => BG.HasField "direction" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"direction")
+
+instance HasCField.HasCField SDL_HapticCondition "direction" where
+  type
+    CFieldType SDL_HapticCondition "direction" =
+      SDL_HapticDirection
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "length" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "length" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"length")
+
+instance HasCField.HasCField SDL_HapticCondition "length" where
+  type
+    CFieldType SDL_HapticCondition "length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "delay" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { delay = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"delay" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "delay" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"delay")
+
+instance HasCField.HasCField SDL_HapticCondition "delay" where
+  type
+    CFieldType SDL_HapticCondition "delay" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "button" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { button = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , interval = BG.getField @"interval" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"button" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "button" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_HapticCondition "button" where
+  type
+    CFieldType SDL_HapticCondition "button" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 26
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "interval" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { interval = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"interval" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "interval" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"interval")
+
+instance HasCField.HasCField SDL_HapticCondition "interval" where
+  type
+    CFieldType SDL_HapticCondition "interval" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "right_sat" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { right_sat = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"right_sat" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "right_sat" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"right_sat")
+
+instance HasCField.HasCField SDL_HapticCondition "right_sat" where
+  type
+    CFieldType SDL_HapticCondition "right_sat" =
+      CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 30
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "left_sat" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { left_sat = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"left_sat" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "left_sat" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"left_sat")
+
+instance HasCField.HasCField SDL_HapticCondition "left_sat" where
+  type
+    CFieldType SDL_HapticCondition "left_sat" =
+      CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "right_coeff" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { right_coeff = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"right_coeff" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "right_coeff" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"right_coeff")
+
+instance HasCField.HasCField SDL_HapticCondition "right_coeff" where
+  type
+    CFieldType SDL_HapticCondition "right_coeff" =
+      CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 42
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "left_coeff" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { left_coeff = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"left_coeff" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "left_coeff" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"left_coeff")
+
+instance HasCField.HasCField SDL_HapticCondition "left_coeff" where
+  type
+    CFieldType SDL_HapticCondition "left_coeff" =
+      CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 48
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "deadband" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { deadband = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , center = BG.getField @"center" x0
+            }
+      , BG.getField @"deadband" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "deadband" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"deadband")
+
+instance HasCField.HasCField SDL_HapticCondition "deadband" where
+  type
+    CFieldType SDL_HapticCondition "deadband" =
+      CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 54
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "center" SDL_HapticCondition ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCondition
+            { center = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , right_sat = BG.getField @"right_sat" x0
+            , left_sat = BG.getField @"left_sat" x0
+            , right_coeff = BG.getField @"right_coeff" x0
+            , left_coeff = BG.getField @"left_coeff" x0
+            , deadband = BG.getField @"deadband" x0
+            }
+      , BG.getField @"center" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "center" (BG.Ptr SDL_HapticCondition) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"center")
+
+instance HasCField.HasCField SDL_HapticCondition "center" where
+  type
+    CFieldType SDL_HapticCondition "center" =
+      CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 60
+
+-- | A structure containing a template for a Ramp effect.
+--
+--     This struct is exclusively for the SDL_HAPTIC_RAMP effect.
+--
+--     The ramp effect starts at start strength and ends at end strength. It augments in linear fashion. If you use attack and fade with a ramp the effects get added to the ramp effect making the effect become quadratic instead of linear.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HAPTIC_RAMP', 'SDL_HapticEffect'
+--
+--     [C declaration]: @struct SDL_HapticRamp@, defined at @SDL3\/SDL_haptic.h 767:16@
+data SDL_HapticRamp = SDL_HapticRamp
+  { type' :: SDL_HapticEffectType
+  -- ^ SDL_HAPTIC_RAMP
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_haptic.h 770:26@
+  , direction :: SDL_HapticDirection
+  -- ^ Direction of the effect.
+  --
+  --          [C declaration]: @direction@, defined at @SDL3\/SDL_haptic.h 771:25@
+  , length :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Duration of the effect.
+  --
+  --          [C declaration]: @length@, defined at @SDL3\/SDL_haptic.h 774:12@
+  , delay :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Delay before starting the effect.
+  --
+  --          [C declaration]: @delay@, defined at @SDL3\/SDL_haptic.h 775:12@
+  , button :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Button that triggers the effect.
+  --
+  --          [C declaration]: @button@, defined at @SDL3\/SDL_haptic.h 778:12@
+  , interval :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ How soon it can be triggered again after button.
+  --
+  --          [C declaration]: @interval@, defined at @SDL3\/SDL_haptic.h 779:12@
+  , start :: SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ Beginning strength level.
+  --
+  --          [C declaration]: @start@, defined at @SDL3\/SDL_haptic.h 782:12@
+  , end :: SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^ Ending strength level.
+  --
+  --          [C declaration]: @end@, defined at @SDL3\/SDL_haptic.h 783:12@
+  , attack_length :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Duration of the attack.
+  --
+  --          [C declaration]: @attack_length@, defined at @SDL3\/SDL_haptic.h 786:12@
+  , attack_level :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Level at the start of the attack.
+  --
+  --          [C declaration]: @attack_level@, defined at @SDL3\/SDL_haptic.h 787:12@
+  , fade_length :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Duration of the fade.
+  --
+  --          [C declaration]: @fade_length@, defined at @SDL3\/SDL_haptic.h 788:12@
+  , fade_level :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Level at the end of the fade.
+  --
+  --          [C declaration]: @fade_level@, defined at @SDL3\/SDL_haptic.h 789:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_HapticRamp where
+  staticSizeOf = \_ -> (44 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_HapticRamp where
+  readRaw =
+    \ptr0 ->
+      pure SDL_HapticRamp
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"direction") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"delay") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"button") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"interval") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"start") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"end") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"attack_length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"attack_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"fade_length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"fade_level") ptr0
+
+instance Marshal.WriteRaw SDL_HapticRamp where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_HapticRamp
+            type'2
+            direction3
+            length4
+            delay5
+            button6
+            interval7
+            start8
+            end9
+            attack_length10
+            attack_level11
+            fade_length12
+            fade_level13 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"direction") ptr0 direction3
+                >> HasCField.writeRaw (BG.Proxy @"length") ptr0 length4
+                >> HasCField.writeRaw (BG.Proxy @"delay") ptr0 delay5
+                >> HasCField.writeRaw (BG.Proxy @"button") ptr0 button6
+                >> HasCField.writeRaw (BG.Proxy @"interval") ptr0 interval7
+                >> HasCField.writeRaw (BG.Proxy @"start") ptr0 start8
+                >> HasCField.writeRaw (BG.Proxy @"end") ptr0 end9
+                >> HasCField.writeRaw (BG.Proxy @"attack_length") ptr0 attack_length10
+                >> HasCField.writeRaw (BG.Proxy @"attack_level") ptr0 attack_level11
+                >> HasCField.writeRaw (BG.Proxy @"fade_length") ptr0 fade_length12
+                >> HasCField.writeRaw (BG.Proxy @"fade_level") ptr0 fade_level13
+
+deriving via Marshal.EquivStorable SDL_HapticRamp instance BG.Storable SDL_HapticRamp
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.CompatHasField.HasField "type'" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { type' = y1
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , start = BG.getField @"start" x0
+            , end = BG.getField @"end" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.HasField "type'" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_HapticRamp "type'" where
+  type
+    CFieldType SDL_HapticRamp "type'" =
+      SDL_HapticEffectType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_HapticDirection)
+  => BG.CompatHasField.HasField "direction" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { direction = y1
+            , type' = BG.getField @"type'" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , start = BG.getField @"start" x0
+            , end = BG.getField @"end" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"direction" x0
+      )
+
+instance
+  (ty ~ SDL_HapticDirection)
+  => BG.HasField "direction" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"direction")
+
+instance HasCField.HasCField SDL_HapticRamp "direction" where
+  type
+    CFieldType SDL_HapticRamp "direction" =
+      SDL_HapticDirection
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "length" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , start = BG.getField @"start" x0
+            , end = BG.getField @"end" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "length" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"length")
+
+instance HasCField.HasCField SDL_HapticRamp "length" where
+  type
+    CFieldType SDL_HapticRamp "length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "delay" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { delay = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , start = BG.getField @"start" x0
+            , end = BG.getField @"end" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"delay" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "delay" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"delay")
+
+instance HasCField.HasCField SDL_HapticRamp "delay" where
+  type
+    CFieldType SDL_HapticRamp "delay" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "button" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { button = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , interval = BG.getField @"interval" x0
+            , start = BG.getField @"start" x0
+            , end = BG.getField @"end" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"button" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "button" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_HapticRamp "button" where
+  type
+    CFieldType SDL_HapticRamp "button" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 26
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "interval" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { interval = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , start = BG.getField @"start" x0
+            , end = BG.getField @"end" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"interval" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "interval" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"interval")
+
+instance HasCField.HasCField SDL_HapticRamp "interval" where
+  type
+    CFieldType SDL_HapticRamp "interval" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "start" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { start = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , end = BG.getField @"end" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"start" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "start" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"start")
+
+instance HasCField.HasCField SDL_HapticRamp "start" where
+  type
+    CFieldType SDL_HapticRamp "start" =
+      SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 30
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.CompatHasField.HasField "end" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { end = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , start = BG.getField @"start" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"end" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint16)
+  => BG.HasField "end" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"end")
+
+instance HasCField.HasCField SDL_HapticRamp "end" where
+  type
+    CFieldType SDL_HapticRamp "end" =
+      SDL3.Sys.Bindgen.Stdinc.Sint16
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "attack_length" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { attack_length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , start = BG.getField @"start" x0
+            , end = BG.getField @"end" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"attack_length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "attack_length" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"attack_length")
+
+instance HasCField.HasCField SDL_HapticRamp "attack_length" where
+  type
+    CFieldType SDL_HapticRamp "attack_length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 34
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "attack_level" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { attack_level = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , start = BG.getField @"start" x0
+            , end = BG.getField @"end" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"attack_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "attack_level" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"attack_level")
+
+instance HasCField.HasCField SDL_HapticRamp "attack_level" where
+  type
+    CFieldType SDL_HapticRamp "attack_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 36
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "fade_length" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { fade_length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , start = BG.getField @"start" x0
+            , end = BG.getField @"end" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"fade_length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "fade_length" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"fade_length")
+
+instance HasCField.HasCField SDL_HapticRamp "fade_length" where
+  type
+    CFieldType SDL_HapticRamp "fade_length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 38
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "fade_level" SDL_HapticRamp ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticRamp
+            { fade_level = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , start = BG.getField @"start" x0
+            , end = BG.getField @"end" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            }
+      , BG.getField @"fade_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "fade_level" (BG.Ptr SDL_HapticRamp) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"fade_level")
+
+instance HasCField.HasCField SDL_HapticRamp "fade_level" where
+  type
+    CFieldType SDL_HapticRamp "fade_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 40
+
+-- | A structure containing a template for a Left\/Right effect.
+--
+--     This struct is exclusively for the SDL_HAPTIC_LEFTRIGHT effect.
+--
+--     The Left\/Right effect is used to explicitly control the large and small motors, commonly found in modern game controllers. The small (right) motor is high frequency, and the large (left) motor is low frequency.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HAPTIC_LEFTRIGHT', 'SDL_HapticEffect'
+--
+--     [C declaration]: @struct SDL_HapticLeftRight@, defined at @SDL3\/SDL_haptic.h 806:16@
+data SDL_HapticLeftRight = SDL_HapticLeftRight
+  { type' :: SDL_HapticEffectType
+  -- ^ SDL_HAPTIC_LEFTRIGHT
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_haptic.h 809:26@
+  , length :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Duration of the effect in milliseconds.
+  --
+  --          [C declaration]: @length@, defined at @SDL3\/SDL_haptic.h 812:12@
+  , large_magnitude :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Control of the large controller motor.
+  --
+  --          [C declaration]: @large_magnitude@, defined at @SDL3\/SDL_haptic.h 815:12@
+  , small_magnitude :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Control of the small controller motor.
+  --
+  --          [C declaration]: @small_magnitude@, defined at @SDL3\/SDL_haptic.h 816:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_HapticLeftRight where
+  staticSizeOf = \_ -> (12 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_HapticLeftRight where
+  readRaw =
+    \ptr0 ->
+      pure SDL_HapticLeftRight
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"large_magnitude") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"small_magnitude") ptr0
+
+instance Marshal.WriteRaw SDL_HapticLeftRight where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_HapticLeftRight type'2 length3 large_magnitude4 small_magnitude5 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"length") ptr0 length3
+              >> HasCField.writeRaw (BG.Proxy @"large_magnitude") ptr0 large_magnitude4
+              >> HasCField.writeRaw (BG.Proxy @"small_magnitude") ptr0 small_magnitude5
+
+deriving via Marshal.EquivStorable SDL_HapticLeftRight instance BG.Storable SDL_HapticLeftRight
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.CompatHasField.HasField "type'" SDL_HapticLeftRight ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticLeftRight
+            { type' = y1
+            , length = BG.getField @"length" x0
+            , large_magnitude = BG.getField @"large_magnitude" x0
+            , small_magnitude = BG.getField @"small_magnitude" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.HasField "type'" (BG.Ptr SDL_HapticLeftRight) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_HapticLeftRight "type'" where
+  type
+    CFieldType SDL_HapticLeftRight "type'" =
+      SDL_HapticEffectType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "length" SDL_HapticLeftRight ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticLeftRight
+            { length = y1
+            , type' = BG.getField @"type'" x0
+            , large_magnitude = BG.getField @"large_magnitude" x0
+            , small_magnitude = BG.getField @"small_magnitude" x0
+            }
+      , BG.getField @"length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "length" (BG.Ptr SDL_HapticLeftRight) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"length")
+
+instance HasCField.HasCField SDL_HapticLeftRight "length" where
+  type
+    CFieldType SDL_HapticLeftRight "length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "large_magnitude" SDL_HapticLeftRight ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticLeftRight
+            { large_magnitude = y1
+            , type' = BG.getField @"type'" x0
+            , length = BG.getField @"length" x0
+            , small_magnitude = BG.getField @"small_magnitude" x0
+            }
+      , BG.getField @"large_magnitude" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "large_magnitude" (BG.Ptr SDL_HapticLeftRight) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"large_magnitude")
+
+instance HasCField.HasCField SDL_HapticLeftRight "large_magnitude" where
+  type
+    CFieldType SDL_HapticLeftRight "large_magnitude" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "small_magnitude" SDL_HapticLeftRight ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticLeftRight
+            { small_magnitude = y1
+            , type' = BG.getField @"type'" x0
+            , length = BG.getField @"length" x0
+            , large_magnitude = BG.getField @"large_magnitude" x0
+            }
+      , BG.getField @"small_magnitude" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "small_magnitude" (BG.Ptr SDL_HapticLeftRight) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"small_magnitude")
+
+instance HasCField.HasCField SDL_HapticLeftRight "small_magnitude" where
+  type
+    CFieldType SDL_HapticLeftRight "small_magnitude" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 10
+
+-- | A structure containing a template for the SDL_HAPTIC_CUSTOM effect.
+--
+--     This struct is exclusively for the SDL_HAPTIC_CUSTOM effect.
+--
+--     A custom force feedback effect is much like a periodic effect, where the application can define its exact shape. You will have to allocate the data yourself. Data should consist of channels * samples Uint16 samples.
+--
+--     If channels is one, the effect is rotated using the defined direction. Otherwise it uses the samples in data for the different axes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HAPTIC_CUSTOM', 'SDL_HapticEffect'
+--
+--     [C declaration]: @struct SDL_HapticCustom@, defined at @SDL3\/SDL_haptic.h 836:16@
+data SDL_HapticCustom = SDL_HapticCustom
+  { type' :: SDL_HapticEffectType
+  -- ^ SDL_HAPTIC_CUSTOM
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_haptic.h 839:26@
+  , direction :: SDL_HapticDirection
+  -- ^ Direction of the effect.
+  --
+  --          [C declaration]: @direction@, defined at @SDL3\/SDL_haptic.h 840:25@
+  , length :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ Duration of the effect.
+  --
+  --          [C declaration]: @length@, defined at @SDL3\/SDL_haptic.h 843:12@
+  , delay :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Delay before starting the effect.
+  --
+  --          [C declaration]: @delay@, defined at @SDL3\/SDL_haptic.h 844:12@
+  , button :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Button that triggers the effect.
+  --
+  --          [C declaration]: @button@, defined at @SDL3\/SDL_haptic.h 847:12@
+  , interval :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ How soon it can be triggered again after button.
+  --
+  --          [C declaration]: @interval@, defined at @SDL3\/SDL_haptic.h 848:12@
+  , channels :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ Axes to use, minimum of one.
+  --
+  --          [C declaration]: @channels@, defined at @SDL3\/SDL_haptic.h 851:11@
+  , period :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Sample periods.
+  --
+  --          [C declaration]: @period@, defined at @SDL3\/SDL_haptic.h 852:12@
+  , samples :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Amount of samples.
+  --
+  --          [C declaration]: @samples@, defined at @SDL3\/SDL_haptic.h 853:12@
+  , data' :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Should contain channels*samples items.
+  --
+  --          [C declaration]: @data@, defined at @SDL3\/SDL_haptic.h 854:13@
+  , attack_length :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Duration of the attack.
+  --
+  --          [C declaration]: @attack_length@, defined at @SDL3\/SDL_haptic.h 857:12@
+  , attack_level :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Level at the start of the attack.
+  --
+  --          [C declaration]: @attack_level@, defined at @SDL3\/SDL_haptic.h 858:12@
+  , fade_length :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Duration of the fade.
+  --
+  --          [C declaration]: @fade_length@, defined at @SDL3\/SDL_haptic.h 859:12@
+  , fade_level :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ Level at the end of the fade.
+  --
+  --          [C declaration]: @fade_level@, defined at @SDL3\/SDL_haptic.h 860:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_HapticCustom where
+  staticSizeOf = \_ -> (56 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_HapticCustom where
+  readRaw =
+    \ptr0 ->
+      pure SDL_HapticCustom
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"direction") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"delay") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"button") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"interval") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"channels") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"period") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"samples") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"data'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"attack_length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"attack_level") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"fade_length") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"fade_level") ptr0
+
+instance Marshal.WriteRaw SDL_HapticCustom where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_HapticCustom
+            type'2
+            direction3
+            length4
+            delay5
+            button6
+            interval7
+            channels8
+            period9
+            samples10
+            data'11
+            attack_length12
+            attack_level13
+            fade_length14
+            fade_level15 ->
+              HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+                >> HasCField.writeRaw (BG.Proxy @"direction") ptr0 direction3
+                >> HasCField.writeRaw (BG.Proxy @"length") ptr0 length4
+                >> HasCField.writeRaw (BG.Proxy @"delay") ptr0 delay5
+                >> HasCField.writeRaw (BG.Proxy @"button") ptr0 button6
+                >> HasCField.writeRaw (BG.Proxy @"interval") ptr0 interval7
+                >> HasCField.writeRaw (BG.Proxy @"channels") ptr0 channels8
+                >> HasCField.writeRaw (BG.Proxy @"period") ptr0 period9
+                >> HasCField.writeRaw (BG.Proxy @"samples") ptr0 samples10
+                >> HasCField.writeRaw (BG.Proxy @"data'") ptr0 data'11
+                >> HasCField.writeRaw (BG.Proxy @"attack_length") ptr0 attack_length12
+                >> HasCField.writeRaw (BG.Proxy @"attack_level") ptr0 attack_level13
+                >> HasCField.writeRaw (BG.Proxy @"fade_length") ptr0 fade_length14
+                >> HasCField.writeRaw (BG.Proxy @"fade_level") ptr0 fade_level15
+
+deriving via Marshal.EquivStorable SDL_HapticCustom instance BG.Storable SDL_HapticCustom
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.CompatHasField.HasField "type'" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { type' = y1
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.HasField "type'" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_HapticCustom "type'" where
+  type
+    CFieldType SDL_HapticCustom "type'" =
+      SDL_HapticEffectType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL_HapticDirection)
+  => BG.CompatHasField.HasField "direction" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { direction = y1
+            , type' = BG.getField @"type'" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"direction" x0
+      )
+
+instance
+  (ty ~ SDL_HapticDirection)
+  => BG.HasField "direction" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"direction")
+
+instance HasCField.HasCField SDL_HapticCustom "direction" where
+  type
+    CFieldType SDL_HapticCustom "direction" =
+      SDL_HapticDirection
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "length" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "length" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"length")
+
+instance HasCField.HasCField SDL_HapticCustom "length" where
+  type
+    CFieldType SDL_HapticCustom "length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "delay" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { delay = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"delay" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "delay" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"delay")
+
+instance HasCField.HasCField SDL_HapticCustom "delay" where
+  type
+    CFieldType SDL_HapticCustom "delay" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "button" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { button = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"button" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "button" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"button")
+
+instance HasCField.HasCField SDL_HapticCustom "button" where
+  type
+    CFieldType SDL_HapticCustom "button" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 26
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "interval" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { interval = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"interval" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "interval" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"interval")
+
+instance HasCField.HasCField SDL_HapticCustom "interval" where
+  type
+    CFieldType SDL_HapticCustom "interval" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "channels" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { channels = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"channels" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "channels" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"channels")
+
+instance HasCField.HasCField SDL_HapticCustom "channels" where
+  type
+    CFieldType SDL_HapticCustom "channels" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 30
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "period" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { period = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"period" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "period" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"period")
+
+instance HasCField.HasCField SDL_HapticCustom "period" where
+  type
+    CFieldType SDL_HapticCustom "period" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "samples" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { samples = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"samples" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "samples" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"samples")
+
+instance HasCField.HasCField SDL_HapticCustom "samples" where
+  type
+    CFieldType SDL_HapticCustom "samples" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 34
+
+instance
+  (ty ~ BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "data'" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { data' = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"data'" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "data'" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"data'")
+
+instance HasCField.HasCField SDL_HapticCustom "data'" where
+  type
+    CFieldType SDL_HapticCustom "data'" =
+      BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "attack_length" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { attack_length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"attack_length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "attack_length" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"attack_length")
+
+instance HasCField.HasCField SDL_HapticCustom "attack_length" where
+  type
+    CFieldType SDL_HapticCustom "attack_length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 48
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "attack_level" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { attack_level = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , fade_length = BG.getField @"fade_length" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"attack_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "attack_level" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"attack_level")
+
+instance HasCField.HasCField SDL_HapticCustom "attack_level" where
+  type
+    CFieldType SDL_HapticCustom "attack_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 50
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "fade_length" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { fade_length = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_level = BG.getField @"fade_level" x0
+            }
+      , BG.getField @"fade_length" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "fade_length" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"fade_length")
+
+instance HasCField.HasCField SDL_HapticCustom "fade_length" where
+  type
+    CFieldType SDL_HapticCustom "fade_length" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 52
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "fade_level" SDL_HapticCustom ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticCustom
+            { fade_level = y1
+            , type' = BG.getField @"type'" x0
+            , direction = BG.getField @"direction" x0
+            , length = BG.getField @"length" x0
+            , delay = BG.getField @"delay" x0
+            , button = BG.getField @"button" x0
+            , interval = BG.getField @"interval" x0
+            , channels = BG.getField @"channels" x0
+            , period = BG.getField @"period" x0
+            , samples = BG.getField @"samples" x0
+            , data' = BG.getField @"data'" x0
+            , attack_length = BG.getField @"attack_length" x0
+            , attack_level = BG.getField @"attack_level" x0
+            , fade_length = BG.getField @"fade_length" x0
+            }
+      , BG.getField @"fade_level" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "fade_level" (BG.Ptr SDL_HapticCustom) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"fade_level")
+
+instance HasCField.HasCField SDL_HapticCustom "fade_level" where
+  type
+    CFieldType SDL_HapticCustom "fade_level" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 54
+
+-- | The generic template for any haptic effect.
+--
+--     All values max at 32767 (0x7FFF). Signed values also can be negative. Time values unless specified otherwise are in milliseconds.
+--
+--     You can also pass SDL_HAPTIC_INFINITY to length instead of a 0-32767 value. Neither delay, interval, attack_length nor fade_length support SDL_HAPTIC_INFINITY. Fade will also not be used since effect never ends.
+--
+--     Additionally, the SDL_HAPTIC_RAMP effect does not support a duration of SDL_HAPTIC_INFINITY.
+--
+--     Button triggers may not be supported on all devices, it is advised to not use them if possible. Buttons start at index 1 instead of index 0 like the joystick.
+--
+--     If both attack_length and fade_level are 0, the envelope is not used, otherwise both values are used.
+--
+--     Common parts:
+--
+--     @
+--     \/\/ Replay - All effects have this
+--     Uint32 length;        \/\/ Duration of effect (ms).
+--     Uint16 delay;         \/\/ Delay before starting effect.
+--
+--     \/\/ Trigger - All effects have this
+--     Uint16 button;        \/\/ Button that triggers effect.
+--     Uint16 interval;      \/\/ How soon before effect can be triggered again.
+--
+--     \/\/ Envelope - All effects except condition effects have this
+--     Uint16 attack_length; \/\/ Duration of the attack (ms).
+--     Uint16 attack_level;  \/\/ Level at the start of the attack.
+--     Uint16 fade_length;   \/\/ Duration of the fade out (ms).
+--     Uint16 fade_level;    \/\/ Level at the end of the fade.
+--     @
+--
+--     Here we have an example of a constant effect evolution in time:
+--
+--     @
+--     Strength
+--     ^
+--     |
+--     |    effect level -->  _________________
+--     |                     \/                 \\
+--     |                    \/                   \\
+--     |                   \/                     \\
+--     |                  \/                       \\
+--     | attack_level --> |                        \\
+--     |                  |                        |  \<---  fade_level
+--     |
+--     +--------------------------------------------------> Time
+--                        [--]                 [---]
+--                        attack_length        fade_length
+--
+--     [------------------][-----------------------]
+--     delay               length
+--     @
+--
+--     Note either the attack_level or the fade_level may be above the actual effect level.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HapticConstant', 'SDL_HapticPeriodic', 'SDL_HapticCondition', 'SDL_HapticRamp', 'SDL_HapticLeftRight', 'SDL_HapticCustom'
+--
+--     [C declaration]: @union SDL_HapticEffect@, defined at @SDL3\/SDL_haptic.h 935:15@
+newtype SDL_HapticEffect = SDL_HapticEffect
+  { unwrap :: BG.ByteArray
+  }
+  deriving stock (BG.Generic)
+
+deriving via BG.SizedByteArray 72 8 instance Marshal.StaticSize SDL_HapticEffect
+
+deriving via BG.SizedByteArray 72 8 instance Marshal.ReadRaw SDL_HapticEffect
+
+deriving via BG.SizedByteArray 72 8 instance Marshal.WriteRaw SDL_HapticEffect
+
+deriving via Marshal.EquivStorable SDL_HapticEffect instance BG.Storable SDL_HapticEffect
+
+deriving via BG.SizedByteArray 72 8 instance Union.IsUnion SDL_HapticEffect
+
+-- | Effect type.
+--
+--     [C declaration]: @type@, defined at @SDL3\/SDL_haptic.h 938:26@
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.HasField "type'" SDL_HapticEffect ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Effect type.
+--
+--     [C declaration]: @type@, defined at @SDL3\/SDL_haptic.h 938:26@
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.CompatHasField.HasField "type'" SDL_HapticEffect ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"type'" x0)
+
+instance
+  (ty ~ SDL_HapticEffectType)
+  => BG.HasField "type'" (BG.Ptr SDL_HapticEffect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_HapticEffect "type'" where
+  type
+    CFieldType SDL_HapticEffect "type'" =
+      SDL_HapticEffectType
+
+  offset# = \_ -> \_ -> 0
+
+-- | Constant effect.
+--
+--     [C declaration]: @constant@, defined at @SDL3\/SDL_haptic.h 939:24@
+instance
+  (ty ~ SDL_HapticConstant)
+  => BG.HasField "constant" SDL_HapticEffect ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Constant effect.
+--
+--     [C declaration]: @constant@, defined at @SDL3\/SDL_haptic.h 939:24@
+instance
+  (ty ~ SDL_HapticConstant)
+  => BG.CompatHasField.HasField "constant" SDL_HapticEffect ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"constant" x0)
+
+instance
+  (ty ~ SDL_HapticConstant)
+  => BG.HasField "constant" (BG.Ptr SDL_HapticEffect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"constant")
+
+instance HasCField.HasCField SDL_HapticEffect "constant" where
+  type
+    CFieldType SDL_HapticEffect "constant" =
+      SDL_HapticConstant
+
+  offset# = \_ -> \_ -> 0
+
+-- | Periodic effect.
+--
+--     [C declaration]: @periodic@, defined at @SDL3\/SDL_haptic.h 940:24@
+instance
+  (ty ~ SDL_HapticPeriodic)
+  => BG.HasField "periodic" SDL_HapticEffect ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Periodic effect.
+--
+--     [C declaration]: @periodic@, defined at @SDL3\/SDL_haptic.h 940:24@
+instance
+  (ty ~ SDL_HapticPeriodic)
+  => BG.CompatHasField.HasField "periodic" SDL_HapticEffect ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"periodic" x0)
+
+instance
+  (ty ~ SDL_HapticPeriodic)
+  => BG.HasField "periodic" (BG.Ptr SDL_HapticEffect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"periodic")
+
+instance HasCField.HasCField SDL_HapticEffect "periodic" where
+  type
+    CFieldType SDL_HapticEffect "periodic" =
+      SDL_HapticPeriodic
+
+  offset# = \_ -> \_ -> 0
+
+-- | Condition effect.
+--
+--     [C declaration]: @condition@, defined at @SDL3\/SDL_haptic.h 941:25@
+instance
+  (ty ~ SDL_HapticCondition)
+  => BG.HasField "condition" SDL_HapticEffect ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Condition effect.
+--
+--     [C declaration]: @condition@, defined at @SDL3\/SDL_haptic.h 941:25@
+instance
+  (ty ~ SDL_HapticCondition)
+  => BG.CompatHasField.HasField "condition" SDL_HapticEffect ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"condition" x0)
+
+instance
+  (ty ~ SDL_HapticCondition)
+  => BG.HasField "condition" (BG.Ptr SDL_HapticEffect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"condition")
+
+instance HasCField.HasCField SDL_HapticEffect "condition" where
+  type
+    CFieldType SDL_HapticEffect "condition" =
+      SDL_HapticCondition
+
+  offset# = \_ -> \_ -> 0
+
+-- | Ramp effect.
+--
+--     [C declaration]: @ramp@, defined at @SDL3\/SDL_haptic.h 942:20@
+instance (ty ~ SDL_HapticRamp) => BG.HasField "ramp" SDL_HapticEffect ty where
+  getField = BG.getUnionPayload
+
+-- | Ramp effect.
+--
+--     [C declaration]: @ramp@, defined at @SDL3\/SDL_haptic.h 942:20@
+instance
+  (ty ~ SDL_HapticRamp)
+  => BG.CompatHasField.HasField "ramp" SDL_HapticEffect ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"ramp" x0)
+
+instance
+  (ty ~ SDL_HapticRamp)
+  => BG.HasField "ramp" (BG.Ptr SDL_HapticEffect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"ramp")
+
+instance HasCField.HasCField SDL_HapticEffect "ramp" where
+  type
+    CFieldType SDL_HapticEffect "ramp" =
+      SDL_HapticRamp
+
+  offset# = \_ -> \_ -> 0
+
+-- | Left\/Right effect.
+--
+--     [C declaration]: @leftright@, defined at @SDL3\/SDL_haptic.h 943:25@
+instance
+  (ty ~ SDL_HapticLeftRight)
+  => BG.HasField "leftright" SDL_HapticEffect ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Left\/Right effect.
+--
+--     [C declaration]: @leftright@, defined at @SDL3\/SDL_haptic.h 943:25@
+instance
+  (ty ~ SDL_HapticLeftRight)
+  => BG.CompatHasField.HasField "leftright" SDL_HapticEffect ty
+  where
+  hasField =
+    \x0 ->
+      (BG.setUnionPayload, BG.getField @"leftright" x0)
+
+instance
+  (ty ~ SDL_HapticLeftRight)
+  => BG.HasField "leftright" (BG.Ptr SDL_HapticEffect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"leftright")
+
+instance HasCField.HasCField SDL_HapticEffect "leftright" where
+  type
+    CFieldType SDL_HapticEffect "leftright" =
+      SDL_HapticLeftRight
+
+  offset# = \_ -> \_ -> 0
+
+-- | Custom effect.
+--
+--     [C declaration]: @custom@, defined at @SDL3\/SDL_haptic.h 944:22@
+instance
+  (ty ~ SDL_HapticCustom)
+  => BG.HasField "custom" SDL_HapticEffect ty
+  where
+  getField = BG.getUnionPayload
+
+-- | Custom effect.
+--
+--     [C declaration]: @custom@, defined at @SDL3\/SDL_haptic.h 944:22@
+instance
+  (ty ~ SDL_HapticCustom)
+  => BG.CompatHasField.HasField "custom" SDL_HapticEffect ty
+  where
+  hasField =
+    \x0 -> (BG.setUnionPayload, BG.getField @"custom" x0)
+
+instance
+  (ty ~ SDL_HapticCustom)
+  => BG.HasField "custom" (BG.Ptr SDL_HapticEffect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"custom")
+
+instance HasCField.HasCField SDL_HapticEffect "custom" where
+  type
+    CFieldType SDL_HapticEffect "custom" =
+      SDL_HapticCustom
+
+  offset# = \_ -> \_ -> 0
+
+-- | This is a unique ID for a haptic device for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     If the haptic device is disconnected and reconnected, it will get a new ID.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_HapticID@, defined at @SDL3\/SDL_haptic.h 957:16@
+newtype SDL_HapticID = SDL_HapticID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_HapticID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HapticID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_HapticID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_HapticID "unwrap" where
+  type
+    CFieldType SDL_HapticID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Haptic/FunPtr.hs b/src/SDL3/Sys/Bindgen/Haptic/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Haptic/FunPtr.hs
@@ -0,0 +1,1241 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Haptic.FunPtr (
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_GetHaptics,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_GetHapticNameForID,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_OpenHaptic,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_GetHapticFromID,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_GetHapticID,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_GetHapticName,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_IsMouseHaptic,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_OpenHapticFromMouse,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_IsJoystickHaptic,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_OpenHapticFromJoystick,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_CloseHaptic,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_GetMaxHapticEffects,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_GetMaxHapticEffectsPlaying,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_GetHapticFeatures,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_GetNumHapticAxes,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_HapticEffectSupported,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_CreateHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_UpdateHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_RunHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_StopHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_DestroyHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_GetHapticEffectStatus,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_SetHapticGain,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_SetHapticAutocenter,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_PauseHaptic,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_ResumeHaptic,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_StopHapticEffects,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_HapticRumbleSupported,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_InitHapticRumble,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_PlayHapticRumble,
+  SDL3.Sys.Bindgen.Haptic.FunPtr.sDL_StopHapticRumble,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Haptic
+import SDL3.Sys.Bindgen.Joystick qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_haptic.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHaptics */"
+         , "__attribute__ ((const))"
+         , "SDL_HapticID *(*hs_bindgen_d1b059ba233bbd57 (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetHaptics;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticNameForID */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_001c4531a8b9b26b (void)) ("
+         , "  SDL_HapticID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetHapticNameForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_OpenHaptic */"
+         , "__attribute__ ((const))"
+         , "SDL_Haptic *(*hs_bindgen_90101d520a764d47 (void)) ("
+         , "  SDL_HapticID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenHaptic;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticFromID */"
+         , "__attribute__ ((const))"
+         , "SDL_Haptic *(*hs_bindgen_3a7e21ae2b159d8e (void)) ("
+         , "  SDL_HapticID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetHapticFromID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticID */"
+         , "__attribute__ ((const))"
+         , "SDL_HapticID (*hs_bindgen_13f07892e26e3cf7 (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetHapticID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_85514e3e9f32e1c1 (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetHapticName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_IsMouseHaptic */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_65b6f3b19cf6ac88 (void)) (void)"
+         , "{"
+         , "  return &SDL_IsMouseHaptic;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_OpenHapticFromMouse */"
+         , "__attribute__ ((const))"
+         , "SDL_Haptic *(*hs_bindgen_b758521fa797c2c0 (void)) (void)"
+         , "{"
+         , "  return &SDL_OpenHapticFromMouse;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_IsJoystickHaptic */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_67654cd95ff86143 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_IsJoystickHaptic;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_OpenHapticFromJoystick */"
+         , "__attribute__ ((const))"
+         , "SDL_Haptic *(*hs_bindgen_fc6652b37d40c658 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenHapticFromJoystick;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_CloseHaptic */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_6b737e2ed08a147c (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CloseHaptic;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetMaxHapticEffects */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_31a97143613121ea (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetMaxHapticEffects;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetMaxHapticEffectsPlaying */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_f659a245012233bf (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetMaxHapticEffectsPlaying;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticFeatures */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_dbbb380d4518b29f (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetHapticFeatures;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetNumHapticAxes */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_da903e5d3b66ca38 (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetNumHapticAxes;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_HapticEffectSupported */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e66937f5ebbed3b2 (void)) ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_HapticEffectSupported;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_CreateHapticEffect */"
+         , "__attribute__ ((const))"
+         , "SDL_HapticEffectID (*hs_bindgen_4f599110559e7af3 (void)) ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateHapticEffect;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_UpdateHapticEffect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6d9817b120393c0f (void)) ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2,"
+         , "  SDL_HapticEffect const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_UpdateHapticEffect;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_RunHapticEffect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a02a57984673b21e (void)) ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_RunHapticEffect;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_StopHapticEffect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_30eca5319f79857b (void)) ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_StopHapticEffect;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_DestroyHapticEffect */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_ac32175b5d132b5c (void)) ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyHapticEffect;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticEffectStatus */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c5abea2492dab75a (void)) ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetHapticEffectStatus;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_SetHapticGain */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2c6528b48cffc964 (void)) ("
+         , "  SDL_Haptic *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetHapticGain;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_SetHapticAutocenter */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_568d338611d0f80d (void)) ("
+         , "  SDL_Haptic *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetHapticAutocenter;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_PauseHaptic */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2300eaaf5179d227 (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_PauseHaptic;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_ResumeHaptic */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d1b63d6dd09df218 (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ResumeHaptic;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_StopHapticEffects */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_5cc314419a9f2703 (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_StopHapticEffects;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_HapticRumbleSupported */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_62fc953aa6c9d61a (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_HapticRumbleSupported;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_InitHapticRumble */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7d0705a7e6ebb724 (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_InitHapticRumble;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_PlayHapticRumble */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_41c52ad08dc2e874 (void)) ("
+         , "  SDL_Haptic *arg1,"
+         , "  float arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_PlayHapticRumble;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_StopHapticRumble */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e3ee0b83eaad3e1f (void)) ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_StopHapticRumble;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHaptics@
+foreign import ccall unsafe "hs_bindgen_d1b059ba233bbd57"
+  hs_bindgen_d1b059ba233bbd57_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHaptics@
+hs_bindgen_d1b059ba233bbd57 :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_HapticID)))
+hs_bindgen_d1b059ba233bbd57 =
+  BG.fromFFIType hs_bindgen_d1b059ba233bbd57_base
+
+{-# NOINLINE sDL_GetHaptics #-}
+
+-- | Get a list of currently connected haptic devices.
+--
+--     [@count@]: a pointer filled in with the number of haptic devices returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of haptic device instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHaptic'
+--
+--     [C declaration]: @SDL_GetHaptics@, defined at @SDL3\/SDL_haptic.h 975:44@
+sDL_GetHaptics :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_HapticID))
+sDL_GetHaptics =
+  BG.unsafePerformIO hs_bindgen_d1b059ba233bbd57
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticNameForID@
+foreign import ccall unsafe "hs_bindgen_001c4531a8b9b26b"
+  hs_bindgen_001c4531a8b9b26b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticNameForID@
+hs_bindgen_001c4531a8b9b26b :: IO (BG.FunPtr (SDL_HapticID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_001c4531a8b9b26b =
+  BG.fromFFIType hs_bindgen_001c4531a8b9b26b_base
+
+{-# NOINLINE sDL_GetHapticNameForID #-}
+
+-- | Get the implementation dependent name of a haptic device.
+--
+--     This can be called before any haptic devices are opened.
+--
+--     [@instance_id@]: the haptic device instance ID.
+--
+--     [Returns]: the name of the selected haptic device. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticName', 'sDL_OpenHaptic'
+--
+--     [C declaration]: @SDL_GetHapticNameForID@, defined at @SDL3\/SDL_haptic.h 992:42@
+sDL_GetHapticNameForID :: BG.FunPtr (SDL_HapticID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetHapticNameForID =
+  BG.unsafePerformIO hs_bindgen_001c4531a8b9b26b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_OpenHaptic@
+foreign import ccall unsafe "hs_bindgen_90101d520a764d47"
+  hs_bindgen_90101d520a764d47_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_OpenHaptic@
+hs_bindgen_90101d520a764d47 :: IO (BG.FunPtr (SDL_HapticID -> IO (BG.Ptr SDL_Haptic)))
+hs_bindgen_90101d520a764d47 =
+  BG.fromFFIType hs_bindgen_90101d520a764d47_base
+
+{-# NOINLINE sDL_OpenHaptic #-}
+
+-- | Open a haptic device for use.
+--
+--     The index passed as an argument refers to the N\'th haptic device on this system.
+--
+--     When opening a haptic device, its gain will be set to maximum and autocenter will be disabled. To modify these values use @SDL_SetHapticGain()@ and @SDL_SetHapticAutocenter()@.
+--
+--     [@instance_id@]: the haptic device instance ID.
+--
+--     [Returns]: the device identifier or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseHaptic', 'sDL_GetHaptics', 'sDL_OpenHapticFromJoystick', 'sDL_OpenHapticFromMouse', 'sDL_SetHapticAutocenter', 'sDL_SetHapticGain'
+--
+--     [C declaration]: @SDL_OpenHaptic@, defined at @SDL3\/SDL_haptic.h 1017:42@
+sDL_OpenHaptic :: BG.FunPtr (SDL_HapticID -> IO (BG.Ptr SDL_Haptic))
+sDL_OpenHaptic =
+  BG.unsafePerformIO hs_bindgen_90101d520a764d47
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticFromID@
+foreign import ccall unsafe "hs_bindgen_3a7e21ae2b159d8e"
+  hs_bindgen_3a7e21ae2b159d8e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticFromID@
+hs_bindgen_3a7e21ae2b159d8e :: IO (BG.FunPtr (SDL_HapticID -> IO (BG.Ptr SDL_Haptic)))
+hs_bindgen_3a7e21ae2b159d8e =
+  BG.fromFFIType hs_bindgen_3a7e21ae2b159d8e_base
+
+{-# NOINLINE sDL_GetHapticFromID #-}
+
+-- | Get the 'SDL_Haptic' associated with an instance ID, if it has been opened.
+--
+--     [@instance_id@]: the instance ID to get the 'SDL_Haptic' for.
+--
+--     [Returns]: an 'SDL_Haptic' on success or NULL on failure or if it hasn\'t been opened yet; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetHapticFromID@, defined at @SDL3\/SDL_haptic.h 1029:42@
+sDL_GetHapticFromID :: BG.FunPtr (SDL_HapticID -> IO (BG.Ptr SDL_Haptic))
+sDL_GetHapticFromID =
+  BG.unsafePerformIO hs_bindgen_3a7e21ae2b159d8e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticID@
+foreign import ccall unsafe "hs_bindgen_13f07892e26e3cf7"
+  hs_bindgen_13f07892e26e3cf7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticID@
+hs_bindgen_13f07892e26e3cf7 :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO SDL_HapticID))
+hs_bindgen_13f07892e26e3cf7 =
+  BG.fromFFIType hs_bindgen_13f07892e26e3cf7_base
+
+{-# NOINLINE sDL_GetHapticID #-}
+
+-- | Get the instance ID of an opened haptic device.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to query.
+--
+--     [Returns]: the instance ID of the specified haptic device on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetHapticID@, defined at @SDL3\/SDL_haptic.h 1040:42@
+sDL_GetHapticID :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO SDL_HapticID)
+sDL_GetHapticID =
+  BG.unsafePerformIO hs_bindgen_13f07892e26e3cf7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticName@
+foreign import ccall unsafe "hs_bindgen_85514e3e9f32e1c1"
+  hs_bindgen_85514e3e9f32e1c1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticName@
+hs_bindgen_85514e3e9f32e1c1 :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_85514e3e9f32e1c1 =
+  BG.fromFFIType hs_bindgen_85514e3e9f32e1c1_base
+
+{-# NOINLINE sDL_GetHapticName #-}
+
+-- | Get the implementation dependent name of a haptic device.
+--
+--     [@haptic@]: the 'SDL_Haptic' obtained from SDL_OpenJoystick().
+--
+--     [Returns]: the name of the selected haptic device. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticNameForID'
+--
+--     [C declaration]: @SDL_GetHapticName@, defined at @SDL3\/SDL_haptic.h 1054:42@
+sDL_GetHapticName :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetHapticName =
+  BG.unsafePerformIO hs_bindgen_85514e3e9f32e1c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_IsMouseHaptic@
+foreign import ccall unsafe "hs_bindgen_65b6f3b19cf6ac88"
+  hs_bindgen_65b6f3b19cf6ac88_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_IsMouseHaptic@
+hs_bindgen_65b6f3b19cf6ac88 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_65b6f3b19cf6ac88 =
+  BG.fromFFIType hs_bindgen_65b6f3b19cf6ac88_base
+
+{-# NOINLINE sDL_IsMouseHaptic #-}
+
+-- | Query whether or not the current mouse has haptic capabilities.
+--
+--     [Returns]: true if the mouse is haptic or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHapticFromMouse'
+--
+--     [C declaration]: @SDL_IsMouseHaptic@, defined at @SDL3\/SDL_haptic.h 1065:34@
+sDL_IsMouseHaptic :: BG.FunPtr (IO BG.CBool)
+sDL_IsMouseHaptic =
+  BG.unsafePerformIO hs_bindgen_65b6f3b19cf6ac88
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_OpenHapticFromMouse@
+foreign import ccall unsafe "hs_bindgen_b758521fa797c2c0"
+  hs_bindgen_b758521fa797c2c0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_OpenHapticFromMouse@
+hs_bindgen_b758521fa797c2c0 :: IO (BG.FunPtr (IO (BG.Ptr SDL_Haptic)))
+hs_bindgen_b758521fa797c2c0 =
+  BG.fromFFIType hs_bindgen_b758521fa797c2c0_base
+
+{-# NOINLINE sDL_OpenHapticFromMouse #-}
+
+-- | Try to open a haptic device from the current mouse.
+--
+--     [Returns]: the haptic device identifier or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseHaptic', 'sDL_IsMouseHaptic'
+--
+--     [C declaration]: @SDL_OpenHapticFromMouse@, defined at @SDL3\/SDL_haptic.h 1078:42@
+sDL_OpenHapticFromMouse :: BG.FunPtr (IO (BG.Ptr SDL_Haptic))
+sDL_OpenHapticFromMouse =
+  BG.unsafePerformIO hs_bindgen_b758521fa797c2c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_IsJoystickHaptic@
+foreign import ccall unsafe "hs_bindgen_67654cd95ff86143"
+  hs_bindgen_67654cd95ff86143_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_IsJoystickHaptic@
+hs_bindgen_67654cd95ff86143
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick -> IO BG.CBool))
+hs_bindgen_67654cd95ff86143 =
+  BG.fromFFIType hs_bindgen_67654cd95ff86143_base
+
+{-# NOINLINE sDL_IsJoystickHaptic #-}
+
+-- | Query if a joystick has haptic features.
+--
+--     [@joystick@]: the SDL_Joystick to test for haptic capabilities.
+--
+--     [Returns]: true if the joystick is haptic or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHapticFromJoystick'
+--
+--     [C declaration]: @SDL_IsJoystickHaptic@, defined at @SDL3\/SDL_haptic.h 1090:34@
+sDL_IsJoystickHaptic :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick -> IO BG.CBool)
+sDL_IsJoystickHaptic =
+  BG.unsafePerformIO hs_bindgen_67654cd95ff86143
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_OpenHapticFromJoystick@
+foreign import ccall unsafe "hs_bindgen_fc6652b37d40c658"
+  hs_bindgen_fc6652b37d40c658_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_OpenHapticFromJoystick@
+hs_bindgen_fc6652b37d40c658
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick -> IO (BG.Ptr SDL_Haptic)))
+hs_bindgen_fc6652b37d40c658 =
+  BG.fromFFIType hs_bindgen_fc6652b37d40c658_base
+
+{-# NOINLINE sDL_OpenHapticFromJoystick #-}
+
+-- | Open a haptic device for use from a joystick device.
+--
+--     You must still close the haptic device separately. It will not be closed with the joystick.
+--
+--     When opened from a joystick you should first close the haptic device before closing the joystick device. If not, on some implementations the haptic device will also get unallocated and you\'ll be unable to use force feedback on that device.
+--
+--     [@joystick@]: the SDL_Joystick to create a haptic device from.
+--
+--     [Returns]: a valid haptic device identifier on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseHaptic', 'sDL_IsJoystickHaptic'
+--
+--     [C declaration]: @SDL_OpenHapticFromJoystick@, defined at @SDL3\/SDL_haptic.h 1112:42@
+sDL_OpenHapticFromJoystick
+  :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick -> IO (BG.Ptr SDL_Haptic))
+sDL_OpenHapticFromJoystick =
+  BG.unsafePerformIO hs_bindgen_fc6652b37d40c658
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_CloseHaptic@
+foreign import ccall unsafe "hs_bindgen_6b737e2ed08a147c"
+  hs_bindgen_6b737e2ed08a147c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_CloseHaptic@
+hs_bindgen_6b737e2ed08a147c :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO ()))
+hs_bindgen_6b737e2ed08a147c =
+  BG.fromFFIType hs_bindgen_6b737e2ed08a147c_base
+
+{-# NOINLINE sDL_CloseHaptic #-}
+
+-- | Close a haptic device previously opened with @SDL_OpenHaptic()@.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to close.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHaptic'
+--
+--     [C declaration]: @SDL_CloseHaptic@, defined at @SDL3\/SDL_haptic.h 1123:34@
+sDL_CloseHaptic :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO ())
+sDL_CloseHaptic =
+  BG.unsafePerformIO hs_bindgen_6b737e2ed08a147c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetMaxHapticEffects@
+foreign import ccall unsafe "hs_bindgen_31a97143613121ea"
+  hs_bindgen_31a97143613121ea_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetMaxHapticEffects@
+hs_bindgen_31a97143613121ea :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CInt))
+hs_bindgen_31a97143613121ea =
+  BG.fromFFIType hs_bindgen_31a97143613121ea_base
+
+{-# NOINLINE sDL_GetMaxHapticEffects #-}
+
+-- | Get the number of effects a haptic device can store.
+--
+--     On some platforms this isn\'t fully supported, and therefore is an approximation. Always check to see if your created effect was actually created and do not rely solely on @SDL_GetMaxHapticEffects()@.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to query.
+--
+--     [Returns]: the number of effects the haptic device can store or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMaxHapticEffectsPlaying', 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_GetMaxHapticEffects@, defined at @SDL3\/SDL_haptic.h 1141:33@
+sDL_GetMaxHapticEffects :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CInt)
+sDL_GetMaxHapticEffects =
+  BG.unsafePerformIO hs_bindgen_31a97143613121ea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetMaxHapticEffectsPlaying@
+foreign import ccall unsafe "hs_bindgen_f659a245012233bf"
+  hs_bindgen_f659a245012233bf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetMaxHapticEffectsPlaying@
+hs_bindgen_f659a245012233bf :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CInt))
+hs_bindgen_f659a245012233bf =
+  BG.fromFFIType hs_bindgen_f659a245012233bf_base
+
+{-# NOINLINE sDL_GetMaxHapticEffectsPlaying #-}
+
+-- | Get the number of effects a haptic device can play at the same time.
+--
+--     This is not supported on all platforms, but will always return a value.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to query maximum playing effects.
+--
+--     [Returns]: the number of effects the haptic device can play at the same time or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMaxHapticEffects', 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_GetMaxHapticEffectsPlaying@, defined at @SDL3\/SDL_haptic.h 1157:33@
+sDL_GetMaxHapticEffectsPlaying :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CInt)
+sDL_GetMaxHapticEffectsPlaying =
+  BG.unsafePerformIO hs_bindgen_f659a245012233bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticFeatures@
+foreign import ccall unsafe "hs_bindgen_dbbb380d4518b29f"
+  hs_bindgen_dbbb380d4518b29f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticFeatures@
+hs_bindgen_dbbb380d4518b29f
+  :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO SDL3.Sys.Bindgen.Stdinc.Uint32))
+hs_bindgen_dbbb380d4518b29f =
+  BG.fromFFIType hs_bindgen_dbbb380d4518b29f_base
+
+{-# NOINLINE sDL_GetHapticFeatures #-}
+
+-- | Get the haptic device\'s supported features in bitwise manner.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to query.
+--
+--     [Returns]: a list of supported haptic features in bitwise manner (OR\'d), or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HapticEffectSupported', 'sDL_GetMaxHapticEffects'
+--
+--     [C declaration]: @SDL_GetHapticFeatures@, defined at @SDL3\/SDL_haptic.h 1171:36@
+sDL_GetHapticFeatures :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+sDL_GetHapticFeatures =
+  BG.unsafePerformIO hs_bindgen_dbbb380d4518b29f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetNumHapticAxes@
+foreign import ccall unsafe "hs_bindgen_da903e5d3b66ca38"
+  hs_bindgen_da903e5d3b66ca38_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetNumHapticAxes@
+hs_bindgen_da903e5d3b66ca38 :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CInt))
+hs_bindgen_da903e5d3b66ca38 =
+  BG.fromFFIType hs_bindgen_da903e5d3b66ca38_base
+
+{-# NOINLINE sDL_GetNumHapticAxes #-}
+
+-- | Get the number of haptic axes the device has.
+--
+--     The number of haptic axes might be useful if working with the 'SDL_HapticDirection' effect.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to query.
+--
+--     [Returns]: the number of axes on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetNumHapticAxes@, defined at @SDL3\/SDL_haptic.h 1185:33@
+sDL_GetNumHapticAxes :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CInt)
+sDL_GetNumHapticAxes =
+  BG.unsafePerformIO hs_bindgen_da903e5d3b66ca38
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_HapticEffectSupported@
+foreign import ccall unsafe "hs_bindgen_e66937f5ebbed3b2"
+  hs_bindgen_e66937f5ebbed3b2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_HapticEffectSupported@
+hs_bindgen_e66937f5ebbed3b2
+  :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> PtrConst.PtrConst SDL_HapticEffect -> IO BG.CBool))
+hs_bindgen_e66937f5ebbed3b2 =
+  BG.fromFFIType hs_bindgen_e66937f5ebbed3b2_base
+
+{-# NOINLINE sDL_HapticEffectSupported #-}
+
+-- | Check to see if an effect is supported by a haptic device.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to query.
+--
+--     [@effect@]: the desired effect to query.
+--
+--     [Returns]: true if the effect is supported or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateHapticEffect', 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_HapticEffectSupported@, defined at @SDL3\/SDL_haptic.h 1199:34@
+sDL_HapticEffectSupported
+  :: BG.FunPtr (BG.Ptr SDL_Haptic -> PtrConst.PtrConst SDL_HapticEffect -> IO BG.CBool)
+sDL_HapticEffectSupported =
+  BG.unsafePerformIO hs_bindgen_e66937f5ebbed3b2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_CreateHapticEffect@
+foreign import ccall unsafe "hs_bindgen_4f599110559e7af3"
+  hs_bindgen_4f599110559e7af3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_CreateHapticEffect@
+hs_bindgen_4f599110559e7af3
+  :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> PtrConst.PtrConst SDL_HapticEffect -> IO SDL_HapticEffectID))
+hs_bindgen_4f599110559e7af3 =
+  BG.fromFFIType hs_bindgen_4f599110559e7af3_base
+
+{-# NOINLINE sDL_CreateHapticEffect #-}
+
+-- | Create a new haptic effect on a specified device.
+--
+--     [@haptic@]: an 'SDL_Haptic' device to create the effect on.
+--
+--     [@effect@]: an 'SDL_HapticEffect' structure containing the properties of the effect to create.
+--
+--     [Returns]: the ID of the effect on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyHapticEffect', 'sDL_RunHapticEffect', 'sDL_UpdateHapticEffect'
+--
+--     [C declaration]: @SDL_CreateHapticEffect@, defined at @SDL3\/SDL_haptic.h 1216:48@
+sDL_CreateHapticEffect
+  :: BG.FunPtr (BG.Ptr SDL_Haptic -> PtrConst.PtrConst SDL_HapticEffect -> IO SDL_HapticEffectID)
+sDL_CreateHapticEffect =
+  BG.unsafePerformIO hs_bindgen_4f599110559e7af3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_UpdateHapticEffect@
+foreign import ccall unsafe "hs_bindgen_6d9817b120393c0f"
+  hs_bindgen_6d9817b120393c0f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_UpdateHapticEffect@
+hs_bindgen_6d9817b120393c0f
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Haptic -> SDL_HapticEffectID -> PtrConst.PtrConst SDL_HapticEffect -> IO BG.CBool)
+       )
+hs_bindgen_6d9817b120393c0f =
+  BG.fromFFIType hs_bindgen_6d9817b120393c0f_base
+
+{-# NOINLINE sDL_UpdateHapticEffect #-}
+
+-- | Update the properties of an effect.
+--
+--     Can be used dynamically, although behavior when dynamically changing direction may be strange. Specifically the effect may re-upload itself and start playing from the start. You also cannot change the type either when running @SDL_UpdateHapticEffect()@.
+--
+--     [@haptic@]: the 'SDL_Haptic' device that has the effect.
+--
+--     [@effect@]: the identifier of the effect to update.
+--
+--     [@data@]: an 'SDL_HapticEffect' structure containing the new effect properties to use.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateHapticEffect', 'sDL_RunHapticEffect'
+--
+--     [C declaration]: @SDL_UpdateHapticEffect@, defined at @SDL3\/SDL_haptic.h 1238:34@
+sDL_UpdateHapticEffect
+  :: BG.FunPtr
+       (BG.Ptr SDL_Haptic -> SDL_HapticEffectID -> PtrConst.PtrConst SDL_HapticEffect -> IO BG.CBool)
+sDL_UpdateHapticEffect =
+  BG.unsafePerformIO hs_bindgen_6d9817b120393c0f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_RunHapticEffect@
+foreign import ccall unsafe "hs_bindgen_a02a57984673b21e"
+  hs_bindgen_a02a57984673b21e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_RunHapticEffect@
+hs_bindgen_a02a57984673b21e
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Haptic -> SDL_HapticEffectID -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_a02a57984673b21e =
+  BG.fromFFIType hs_bindgen_a02a57984673b21e_base
+
+{-# NOINLINE sDL_RunHapticEffect #-}
+
+-- | Run the haptic effect on its associated haptic device.
+--
+--     To repeat the effect over and over indefinitely, set @iterations@ to @'sDL_HAPTIC_INFINITY'@. (Repeats the envelope - attack and fade.) To make one instance of the effect last indefinitely (so the effect does not fade), set the effect\'s @length@ in its structure\/union to @'sDL_HAPTIC_INFINITY'@ instead.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to run the effect on.
+--
+--     [@effect@]: the ID of the haptic effect to run.
+--
+--     [@iterations@]: the number of iterations to run the effect; use @'sDL_HAPTIC_INFINITY'@ to repeat forever.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticEffectStatus', 'sDL_StopHapticEffect', 'sDL_StopHapticEffects'
+--
+--     [C declaration]: @SDL_RunHapticEffect@, defined at @SDL3\/SDL_haptic.h 1262:34@
+sDL_RunHapticEffect
+  :: BG.FunPtr (BG.Ptr SDL_Haptic -> SDL_HapticEffectID -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_RunHapticEffect =
+  BG.unsafePerformIO hs_bindgen_a02a57984673b21e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_StopHapticEffect@
+foreign import ccall unsafe "hs_bindgen_30eca5319f79857b"
+  hs_bindgen_30eca5319f79857b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_StopHapticEffect@
+hs_bindgen_30eca5319f79857b
+  :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> SDL_HapticEffectID -> IO BG.CBool))
+hs_bindgen_30eca5319f79857b =
+  BG.fromFFIType hs_bindgen_30eca5319f79857b_base
+
+{-# NOINLINE sDL_StopHapticEffect #-}
+
+-- | Stop the haptic effect on its associated haptic device.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to stop the effect on.
+--
+--     [@effect@]: the ID of the haptic effect to stop.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunHapticEffect', 'sDL_StopHapticEffects'
+--
+--     [C declaration]: @SDL_StopHapticEffect@, defined at @SDL3\/SDL_haptic.h 1277:34@
+sDL_StopHapticEffect :: BG.FunPtr (BG.Ptr SDL_Haptic -> SDL_HapticEffectID -> IO BG.CBool)
+sDL_StopHapticEffect =
+  BG.unsafePerformIO hs_bindgen_30eca5319f79857b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_DestroyHapticEffect@
+foreign import ccall unsafe "hs_bindgen_ac32175b5d132b5c"
+  hs_bindgen_ac32175b5d132b5c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_DestroyHapticEffect@
+hs_bindgen_ac32175b5d132b5c :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> SDL_HapticEffectID -> IO ()))
+hs_bindgen_ac32175b5d132b5c =
+  BG.fromFFIType hs_bindgen_ac32175b5d132b5c_base
+
+{-# NOINLINE sDL_DestroyHapticEffect #-}
+
+-- | Destroy a haptic effect on the device.
+--
+--     This will stop the effect if it\'s running. Effects are automatically destroyed when the device is closed.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to destroy the effect on.
+--
+--     [@effect@]: the ID of the haptic effect to destroy.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateHapticEffect'
+--
+--     [C declaration]: @SDL_DestroyHapticEffect@, defined at @SDL3\/SDL_haptic.h 1292:34@
+sDL_DestroyHapticEffect :: BG.FunPtr (BG.Ptr SDL_Haptic -> SDL_HapticEffectID -> IO ())
+sDL_DestroyHapticEffect =
+  BG.unsafePerformIO hs_bindgen_ac32175b5d132b5c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticEffectStatus@
+foreign import ccall unsafe "hs_bindgen_c5abea2492dab75a"
+  hs_bindgen_c5abea2492dab75a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_GetHapticEffectStatus@
+hs_bindgen_c5abea2492dab75a
+  :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> SDL_HapticEffectID -> IO BG.CBool))
+hs_bindgen_c5abea2492dab75a =
+  BG.fromFFIType hs_bindgen_c5abea2492dab75a_base
+
+{-# NOINLINE sDL_GetHapticEffectStatus #-}
+
+-- | Get the status of the current effect on the specified haptic device.
+--
+--     Device must support the SDL_HAPTIC_STATUS feature.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to query for the effect status on.
+--
+--     [@effect@]: the ID of the haptic effect to query its status.
+--
+--     [Returns]: true if it is playing, false if it isn\'t playing or haptic status isn\'t supported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_GetHapticEffectStatus@, defined at @SDL3\/SDL_haptic.h 1308:34@
+sDL_GetHapticEffectStatus :: BG.FunPtr (BG.Ptr SDL_Haptic -> SDL_HapticEffectID -> IO BG.CBool)
+sDL_GetHapticEffectStatus =
+  BG.unsafePerformIO hs_bindgen_c5abea2492dab75a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_SetHapticGain@
+foreign import ccall unsafe "hs_bindgen_2c6528b48cffc964"
+  hs_bindgen_2c6528b48cffc964_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_SetHapticGain@
+hs_bindgen_2c6528b48cffc964 :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> BG.CInt -> IO BG.CBool))
+hs_bindgen_2c6528b48cffc964 =
+  BG.fromFFIType hs_bindgen_2c6528b48cffc964_base
+
+{-# NOINLINE sDL_SetHapticGain #-}
+
+-- | Set the global gain of the specified haptic device.
+--
+--     Device must support the SDL_HAPTIC_GAIN feature.
+--
+--     The user may specify the maximum gain by setting the environment variable @SDL_HAPTIC_GAIN_MAX@ which should be between 0 and 100. All calls to @SDL_SetHapticGain()@ will scale linearly using @SDL_HAPTIC_GAIN_MAX@ as the maximum.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to set the gain on.
+--
+--     [@gain@]: value to set the gain to, should be between 0 and 100 (0 - 100).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_SetHapticGain@, defined at @SDL3\/SDL_haptic.h 1330:34@
+sDL_SetHapticGain :: BG.FunPtr (BG.Ptr SDL_Haptic -> BG.CInt -> IO BG.CBool)
+sDL_SetHapticGain =
+  BG.unsafePerformIO hs_bindgen_2c6528b48cffc964
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_SetHapticAutocenter@
+foreign import ccall unsafe "hs_bindgen_568d338611d0f80d"
+  hs_bindgen_568d338611d0f80d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_SetHapticAutocenter@
+hs_bindgen_568d338611d0f80d :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> BG.CInt -> IO BG.CBool))
+hs_bindgen_568d338611d0f80d =
+  BG.fromFFIType hs_bindgen_568d338611d0f80d_base
+
+{-# NOINLINE sDL_SetHapticAutocenter #-}
+
+-- | Set the global autocenter of the device.
+--
+--     Autocenter should be between 0 and 100. Setting it to 0 will disable autocentering.
+--
+--     Device must support the SDL_HAPTIC_AUTOCENTER feature.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to set autocentering on.
+--
+--     [@autocenter@]: value to set autocenter to (0-100).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_SetHapticAutocenter@, defined at @SDL3\/SDL_haptic.h 1349:34@
+sDL_SetHapticAutocenter :: BG.FunPtr (BG.Ptr SDL_Haptic -> BG.CInt -> IO BG.CBool)
+sDL_SetHapticAutocenter =
+  BG.unsafePerformIO hs_bindgen_568d338611d0f80d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_PauseHaptic@
+foreign import ccall unsafe "hs_bindgen_2300eaaf5179d227"
+  hs_bindgen_2300eaaf5179d227_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_PauseHaptic@
+hs_bindgen_2300eaaf5179d227 :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool))
+hs_bindgen_2300eaaf5179d227 =
+  BG.fromFFIType hs_bindgen_2300eaaf5179d227_base
+
+{-# NOINLINE sDL_PauseHaptic #-}
+
+-- | Pause a haptic device.
+--
+--     Device must support the @'sDL_HAPTIC_PAUSE'@ feature. Call @SDL_ResumeHaptic()@ to resume playback.
+--
+--     Do not modify the effects nor add new ones while the device is paused. That can cause all sorts of weird errors.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to pause.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResumeHaptic'
+--
+--     [C declaration]: @SDL_PauseHaptic@, defined at @SDL3\/SDL_haptic.h 1368:34@
+sDL_PauseHaptic :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool)
+sDL_PauseHaptic =
+  BG.unsafePerformIO hs_bindgen_2300eaaf5179d227
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_ResumeHaptic@
+foreign import ccall unsafe "hs_bindgen_d1b63d6dd09df218"
+  hs_bindgen_d1b63d6dd09df218_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_ResumeHaptic@
+hs_bindgen_d1b63d6dd09df218 :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool))
+hs_bindgen_d1b63d6dd09df218 =
+  BG.fromFFIType hs_bindgen_d1b63d6dd09df218_base
+
+{-# NOINLINE sDL_ResumeHaptic #-}
+
+-- | Resume a haptic device.
+--
+--     Call to unpause after @SDL_PauseHaptic()@.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to unpause.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseHaptic'
+--
+--     [C declaration]: @SDL_ResumeHaptic@, defined at @SDL3\/SDL_haptic.h 1383:34@
+sDL_ResumeHaptic :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool)
+sDL_ResumeHaptic =
+  BG.unsafePerformIO hs_bindgen_d1b63d6dd09df218
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_StopHapticEffects@
+foreign import ccall unsafe "hs_bindgen_5cc314419a9f2703"
+  hs_bindgen_5cc314419a9f2703_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_StopHapticEffects@
+hs_bindgen_5cc314419a9f2703 :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool))
+hs_bindgen_5cc314419a9f2703 =
+  BG.fromFFIType hs_bindgen_5cc314419a9f2703_base
+
+{-# NOINLINE sDL_StopHapticEffects #-}
+
+-- | Stop all the currently playing effects on a haptic device.
+--
+--     [@haptic@]: the 'SDL_Haptic' device to stop.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunHapticEffect', 'sDL_StopHapticEffects'
+--
+--     [C declaration]: @SDL_StopHapticEffects@, defined at @SDL3\/SDL_haptic.h 1397:34@
+sDL_StopHapticEffects :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool)
+sDL_StopHapticEffects =
+  BG.unsafePerformIO hs_bindgen_5cc314419a9f2703
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_HapticRumbleSupported@
+foreign import ccall unsafe "hs_bindgen_62fc953aa6c9d61a"
+  hs_bindgen_62fc953aa6c9d61a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_HapticRumbleSupported@
+hs_bindgen_62fc953aa6c9d61a :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool))
+hs_bindgen_62fc953aa6c9d61a =
+  BG.fromFFIType hs_bindgen_62fc953aa6c9d61a_base
+
+{-# NOINLINE sDL_HapticRumbleSupported #-}
+
+-- | Check whether rumble is supported on a haptic device.
+--
+--     [@haptic@]: haptic device to check for rumble support.
+--
+--     [Returns]: true if the effect is supported or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InitHapticRumble'
+--
+--     [C declaration]: @SDL_HapticRumbleSupported@, defined at @SDL3\/SDL_haptic.h 1409:34@
+sDL_HapticRumbleSupported :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool)
+sDL_HapticRumbleSupported =
+  BG.unsafePerformIO hs_bindgen_62fc953aa6c9d61a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_InitHapticRumble@
+foreign import ccall unsafe "hs_bindgen_7d0705a7e6ebb724"
+  hs_bindgen_7d0705a7e6ebb724_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_InitHapticRumble@
+hs_bindgen_7d0705a7e6ebb724 :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool))
+hs_bindgen_7d0705a7e6ebb724 =
+  BG.fromFFIType hs_bindgen_7d0705a7e6ebb724_base
+
+{-# NOINLINE sDL_InitHapticRumble #-}
+
+-- | Initialize a haptic device for simple rumble playback.
+--
+--     [@haptic@]: the haptic device to initialize for simple rumble playback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PlayHapticRumble', 'sDL_StopHapticRumble', 'sDL_HapticRumbleSupported'
+--
+--     [C declaration]: @SDL_InitHapticRumble@, defined at @SDL3\/SDL_haptic.h 1424:34@
+sDL_InitHapticRumble :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool)
+sDL_InitHapticRumble =
+  BG.unsafePerformIO hs_bindgen_7d0705a7e6ebb724
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_PlayHapticRumble@
+foreign import ccall unsafe "hs_bindgen_41c52ad08dc2e874"
+  hs_bindgen_41c52ad08dc2e874_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_PlayHapticRumble@
+hs_bindgen_41c52ad08dc2e874
+  :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> BG.CFloat -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_41c52ad08dc2e874 =
+  BG.fromFFIType hs_bindgen_41c52ad08dc2e874_base
+
+{-# NOINLINE sDL_PlayHapticRumble #-}
+
+-- | Run a simple rumble effect on a haptic device.
+--
+--     [@haptic@]: the haptic device to play the rumble effect on.
+--
+--     [@strength@]: strength of the rumble to play as a 0-1 float value.
+--
+--     [@length@]: length of the rumble to play in milliseconds.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InitHapticRumble', 'sDL_StopHapticRumble'
+--
+--     [C declaration]: @SDL_PlayHapticRumble@, defined at @SDL3\/SDL_haptic.h 1440:34@
+sDL_PlayHapticRumble
+  :: BG.FunPtr (BG.Ptr SDL_Haptic -> BG.CFloat -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_PlayHapticRumble =
+  BG.unsafePerformIO hs_bindgen_41c52ad08dc2e874
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_StopHapticRumble@
+foreign import ccall unsafe "hs_bindgen_e3ee0b83eaad3e1f"
+  hs_bindgen_e3ee0b83eaad3e1f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_get_SDL_StopHapticRumble@
+hs_bindgen_e3ee0b83eaad3e1f :: IO (BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool))
+hs_bindgen_e3ee0b83eaad3e1f =
+  BG.fromFFIType hs_bindgen_e3ee0b83eaad3e1f_base
+
+{-# NOINLINE sDL_StopHapticRumble #-}
+
+-- | Stop the simple rumble on a haptic device.
+--
+--     [@haptic@]: the haptic device to stop the rumble effect on.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PlayHapticRumble'
+--
+--     [C declaration]: @SDL_StopHapticRumble@, defined at @SDL3\/SDL_haptic.h 1453:34@
+sDL_StopHapticRumble :: BG.FunPtr (BG.Ptr SDL_Haptic -> IO BG.CBool)
+sDL_StopHapticRumble =
+  BG.unsafePerformIO hs_bindgen_e3ee0b83eaad3e1f
diff --git a/src/SDL3/Sys/Bindgen/Haptic/Safe.hs b/src/SDL3/Sys/Bindgen/Haptic/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Haptic/Safe.hs
@@ -0,0 +1,1296 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Haptic.Safe (
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_GetHaptics,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_GetHapticNameForID,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_OpenHaptic,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_GetHapticFromID,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_GetHapticID,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_GetHapticName,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_IsMouseHaptic,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_OpenHapticFromMouse,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_IsJoystickHaptic,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_OpenHapticFromJoystick,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_CloseHaptic,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_GetMaxHapticEffects,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_GetMaxHapticEffectsPlaying,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_GetHapticFeatures,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_GetNumHapticAxes,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_HapticEffectSupported,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_CreateHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_UpdateHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_RunHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_StopHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_DestroyHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_GetHapticEffectStatus,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_SetHapticGain,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_SetHapticAutocenter,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_PauseHaptic,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_ResumeHaptic,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_StopHapticEffects,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_HapticRumbleSupported,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_InitHapticRumble,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_PlayHapticRumble,
+  SDL3.Sys.Bindgen.Haptic.Safe.sDL_StopHapticRumble,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Haptic
+import SDL3.Sys.Bindgen.Joystick qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_haptic.h>"
+         , "SDL_HapticID *hs_bindgen_0fa1139acd663b7b ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHaptics)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_9314d546163bea9b ("
+         , "  SDL_HapticID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticNameForID)(arg1);"
+         , "}"
+         , "SDL_Haptic *hs_bindgen_dbff4b31baeb7b51 ("
+         , "  SDL_HapticID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenHaptic)(arg1);"
+         , "}"
+         , "SDL_Haptic *hs_bindgen_1785e32cd90d0d06 ("
+         , "  SDL_HapticID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticFromID)(arg1);"
+         , "}"
+         , "SDL_HapticID hs_bindgen_de8498981e0f6223 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticID)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_360c0a89e793b7ad ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticName)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_4c4f92c17cae6f18 (void)"
+         , "{"
+         , "  return (SDL_IsMouseHaptic)();"
+         , "}"
+         , "SDL_Haptic *hs_bindgen_8e6b94caa3e52d98 (void)"
+         , "{"
+         , "  return (SDL_OpenHapticFromMouse)();"
+         , "}"
+         , "_Bool hs_bindgen_c5f4f376b01c2e4f ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_IsJoystickHaptic)(arg1);"
+         , "}"
+         , "SDL_Haptic *hs_bindgen_01eda3f2b59f9aab ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenHapticFromJoystick)(arg1);"
+         , "}"
+         , "void hs_bindgen_f6f5492f48ba2e5b ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseHaptic)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_366d199432bdd8e0 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMaxHapticEffects)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_5bf116c6af24ad82 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMaxHapticEffectsPlaying)(arg1);"
+         , "}"
+         , "Uint32 hs_bindgen_13fda9a87e4ece91 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticFeatures)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_7ed42e0a43315641 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumHapticAxes)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_5f13cffbd392579e ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_HapticEffectSupported)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "SDL_HapticEffectID hs_bindgen_15baa0f4a78836ae ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateHapticEffect)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "_Bool hs_bindgen_0492468c6fb17ac5 ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2,"
+         , "  SDL_HapticEffect const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateHapticEffect)(arg1, arg2, arg3);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "_Bool hs_bindgen_a614a05d61f4001a ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RunHapticEffect)(arg1, arg2, arg3);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "_Bool hs_bindgen_62c7aa3038b74c27 ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_StopHapticEffect)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "void hs_bindgen_6ebf1b15d73c024c ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyHapticEffect)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "_Bool hs_bindgen_8953e9e35530a132 ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticEffectStatus)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_33d36e11c46c206d ("
+         , "  SDL_Haptic *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetHapticGain)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_713374147201159e ("
+         , "  SDL_Haptic *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetHapticAutocenter)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d4344f317b2d7325 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_PauseHaptic)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_79c16f8418a90f86 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ResumeHaptic)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_f452836b38dc6590 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_StopHapticEffects)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_113ac21fbd9de22e ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_HapticRumbleSupported)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ae32c683da240a6e ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_InitHapticRumble)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_10fe16fce6a60bfe ("
+         , "  SDL_Haptic *arg1,"
+         , "  float arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_PlayHapticRumble)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_2b55fdb7a5a8262a ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_StopHapticRumble)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHaptics@
+foreign import ccall safe "hs_bindgen_0fa1139acd663b7b"
+  hs_bindgen_0fa1139acd663b7b_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHaptics@
+hs_bindgen_0fa1139acd663b7b
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_HapticID)
+hs_bindgen_0fa1139acd663b7b =
+  BG.fromFFIType hs_bindgen_0fa1139acd663b7b_base
+
+-- | Get a list of currently connected haptic devices.
+--
+--     [Returns]: a 0 terminated array of haptic device instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHaptic'
+--
+--     [C declaration]: @SDL_GetHaptics@, defined at @SDL3\/SDL_haptic.h 975:44@
+sDL_GetHaptics
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of haptic devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_HapticID)
+sDL_GetHaptics = hs_bindgen_0fa1139acd663b7b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticNameForID@
+foreign import ccall safe "hs_bindgen_9314d546163bea9b"
+  hs_bindgen_9314d546163bea9b_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticNameForID@
+hs_bindgen_9314d546163bea9b
+  :: SDL_HapticID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_9314d546163bea9b =
+  BG.fromFFIType hs_bindgen_9314d546163bea9b_base
+
+-- | Get the implementation dependent name of a haptic device.
+--
+--     This can be called before any haptic devices are opened.
+--
+--     [Returns]: the name of the selected haptic device. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticName', 'sDL_OpenHaptic'
+--
+--     [C declaration]: @SDL_GetHapticNameForID@, defined at @SDL3\/SDL_haptic.h 992:42@
+sDL_GetHapticNameForID
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the haptic device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetHapticNameForID = hs_bindgen_9314d546163bea9b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_OpenHaptic@
+foreign import ccall safe "hs_bindgen_dbff4b31baeb7b51"
+  hs_bindgen_dbff4b31baeb7b51_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_OpenHaptic@
+hs_bindgen_dbff4b31baeb7b51
+  :: SDL_HapticID
+  -> IO (BG.Ptr SDL_Haptic)
+hs_bindgen_dbff4b31baeb7b51 =
+  BG.fromFFIType hs_bindgen_dbff4b31baeb7b51_base
+
+-- | Open a haptic device for use.
+--
+--     The index passed as an argument refers to the N\'th haptic device on this system.
+--
+--     When opening a haptic device, its gain will be set to maximum and autocenter will be disabled. To modify these values use @SDL_SetHapticGain()@ and @SDL_SetHapticAutocenter()@.
+--
+--     [Returns]: the device identifier or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseHaptic', 'sDL_GetHaptics', 'sDL_OpenHapticFromJoystick', 'sDL_OpenHapticFromMouse', 'sDL_SetHapticAutocenter', 'sDL_SetHapticGain'
+--
+--     [C declaration]: @SDL_OpenHaptic@, defined at @SDL3\/SDL_haptic.h 1017:42@
+sDL_OpenHaptic
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the haptic device instance ID.
+  -> IO (BG.Ptr SDL_Haptic)
+sDL_OpenHaptic = hs_bindgen_dbff4b31baeb7b51
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticFromID@
+foreign import ccall safe "hs_bindgen_1785e32cd90d0d06"
+  hs_bindgen_1785e32cd90d0d06_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticFromID@
+hs_bindgen_1785e32cd90d0d06
+  :: SDL_HapticID
+  -> IO (BG.Ptr SDL_Haptic)
+hs_bindgen_1785e32cd90d0d06 =
+  BG.fromFFIType hs_bindgen_1785e32cd90d0d06_base
+
+-- | Get the 'SDL_Haptic' associated with an instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Haptic' on success or NULL on failure or if it hasn\'t been opened yet; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetHapticFromID@, defined at @SDL3\/SDL_haptic.h 1029:42@
+sDL_GetHapticFromID
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the instance ID to get the 'SDL_Haptic' for.
+  -> IO (BG.Ptr SDL_Haptic)
+sDL_GetHapticFromID = hs_bindgen_1785e32cd90d0d06
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticID@
+foreign import ccall safe "hs_bindgen_de8498981e0f6223"
+  hs_bindgen_de8498981e0f6223_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticID@
+hs_bindgen_de8498981e0f6223
+  :: BG.Ptr SDL_Haptic
+  -> IO SDL_HapticID
+hs_bindgen_de8498981e0f6223 =
+  BG.fromFFIType hs_bindgen_de8498981e0f6223_base
+
+-- | Get the instance ID of an opened haptic device.
+--
+--     [Returns]: the instance ID of the specified haptic device on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetHapticID@, defined at @SDL3\/SDL_haptic.h 1040:42@
+sDL_GetHapticID
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO SDL_HapticID
+sDL_GetHapticID = hs_bindgen_de8498981e0f6223
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticName@
+foreign import ccall safe "hs_bindgen_360c0a89e793b7ad"
+  hs_bindgen_360c0a89e793b7ad_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticName@
+hs_bindgen_360c0a89e793b7ad
+  :: BG.Ptr SDL_Haptic
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_360c0a89e793b7ad =
+  BG.fromFFIType hs_bindgen_360c0a89e793b7ad_base
+
+-- | Get the implementation dependent name of a haptic device.
+--
+--     [Returns]: the name of the selected haptic device. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticNameForID'
+--
+--     [C declaration]: @SDL_GetHapticName@, defined at @SDL3\/SDL_haptic.h 1054:42@
+sDL_GetHapticName
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' obtained from SDL_OpenJoystick().
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetHapticName = hs_bindgen_360c0a89e793b7ad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_IsMouseHaptic@
+foreign import ccall safe "hs_bindgen_4c4f92c17cae6f18"
+  hs_bindgen_4c4f92c17cae6f18_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_IsMouseHaptic@
+hs_bindgen_4c4f92c17cae6f18 :: IO BG.CBool
+hs_bindgen_4c4f92c17cae6f18 =
+  BG.fromFFIType hs_bindgen_4c4f92c17cae6f18_base
+
+-- | Query whether or not the current mouse has haptic capabilities.
+--
+--     [Returns]: true if the mouse is haptic or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHapticFromMouse'
+--
+--     [C declaration]: @SDL_IsMouseHaptic@, defined at @SDL3\/SDL_haptic.h 1065:34@
+sDL_IsMouseHaptic :: IO BG.CBool
+sDL_IsMouseHaptic = hs_bindgen_4c4f92c17cae6f18
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_OpenHapticFromMouse@
+foreign import ccall safe "hs_bindgen_8e6b94caa3e52d98"
+  hs_bindgen_8e6b94caa3e52d98_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_OpenHapticFromMouse@
+hs_bindgen_8e6b94caa3e52d98 :: IO (BG.Ptr SDL_Haptic)
+hs_bindgen_8e6b94caa3e52d98 =
+  BG.fromFFIType hs_bindgen_8e6b94caa3e52d98_base
+
+-- | Try to open a haptic device from the current mouse.
+--
+--     [Returns]: the haptic device identifier or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseHaptic', 'sDL_IsMouseHaptic'
+--
+--     [C declaration]: @SDL_OpenHapticFromMouse@, defined at @SDL3\/SDL_haptic.h 1078:42@
+sDL_OpenHapticFromMouse :: IO (BG.Ptr SDL_Haptic)
+sDL_OpenHapticFromMouse = hs_bindgen_8e6b94caa3e52d98
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_IsJoystickHaptic@
+foreign import ccall safe "hs_bindgen_c5f4f376b01c2e4f"
+  hs_bindgen_c5f4f376b01c2e4f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_IsJoystickHaptic@
+hs_bindgen_c5f4f376b01c2e4f
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -> IO BG.CBool
+hs_bindgen_c5f4f376b01c2e4f =
+  BG.fromFFIType hs_bindgen_c5f4f376b01c2e4f_base
+
+-- | Query if a joystick has haptic features.
+--
+--     [Returns]: true if the joystick is haptic or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHapticFromJoystick'
+--
+--     [C declaration]: @SDL_IsJoystickHaptic@, defined at @SDL3\/SDL_haptic.h 1090:34@
+sDL_IsJoystickHaptic
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the SDL_Joystick to test for haptic capabilities.
+  -> IO BG.CBool
+sDL_IsJoystickHaptic = hs_bindgen_c5f4f376b01c2e4f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_OpenHapticFromJoystick@
+foreign import ccall safe "hs_bindgen_01eda3f2b59f9aab"
+  hs_bindgen_01eda3f2b59f9aab_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_OpenHapticFromJoystick@
+hs_bindgen_01eda3f2b59f9aab
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -> IO (BG.Ptr SDL_Haptic)
+hs_bindgen_01eda3f2b59f9aab =
+  BG.fromFFIType hs_bindgen_01eda3f2b59f9aab_base
+
+-- | Open a haptic device for use from a joystick device.
+--
+--     You must still close the haptic device separately. It will not be closed with the joystick.
+--
+--     When opened from a joystick you should first close the haptic device before closing the joystick device. If not, on some implementations the haptic device will also get unallocated and you\'ll be unable to use force feedback on that device.
+--
+--     [Returns]: a valid haptic device identifier on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseHaptic', 'sDL_IsJoystickHaptic'
+--
+--     [C declaration]: @SDL_OpenHapticFromJoystick@, defined at @SDL3\/SDL_haptic.h 1112:42@
+sDL_OpenHapticFromJoystick
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the SDL_Joystick to create a haptic device from.
+  -> IO (BG.Ptr SDL_Haptic)
+sDL_OpenHapticFromJoystick =
+  hs_bindgen_01eda3f2b59f9aab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_CloseHaptic@
+foreign import ccall safe "hs_bindgen_f6f5492f48ba2e5b"
+  hs_bindgen_f6f5492f48ba2e5b_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_CloseHaptic@
+hs_bindgen_f6f5492f48ba2e5b
+  :: BG.Ptr SDL_Haptic
+  -> IO ()
+hs_bindgen_f6f5492f48ba2e5b =
+  BG.fromFFIType hs_bindgen_f6f5492f48ba2e5b_base
+
+-- | Close a haptic device previously opened with @SDL_OpenHaptic()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHaptic'
+--
+--     [C declaration]: @SDL_CloseHaptic@, defined at @SDL3\/SDL_haptic.h 1123:34@
+sDL_CloseHaptic
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to close.
+  -> IO ()
+sDL_CloseHaptic = hs_bindgen_f6f5492f48ba2e5b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetMaxHapticEffects@
+foreign import ccall safe "hs_bindgen_366d199432bdd8e0"
+  hs_bindgen_366d199432bdd8e0_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetMaxHapticEffects@
+hs_bindgen_366d199432bdd8e0
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CInt
+hs_bindgen_366d199432bdd8e0 =
+  BG.fromFFIType hs_bindgen_366d199432bdd8e0_base
+
+-- | Get the number of effects a haptic device can store.
+--
+--     On some platforms this isn\'t fully supported, and therefore is an approximation. Always check to see if your created effect was actually created and do not rely solely on @SDL_GetMaxHapticEffects()@.
+--
+--     [Returns]: the number of effects the haptic device can store or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMaxHapticEffectsPlaying', 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_GetMaxHapticEffects@, defined at @SDL3\/SDL_haptic.h 1141:33@
+sDL_GetMaxHapticEffects
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO BG.CInt
+sDL_GetMaxHapticEffects = hs_bindgen_366d199432bdd8e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetMaxHapticEffectsPlaying@
+foreign import ccall safe "hs_bindgen_5bf116c6af24ad82"
+  hs_bindgen_5bf116c6af24ad82_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetMaxHapticEffectsPlaying@
+hs_bindgen_5bf116c6af24ad82
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CInt
+hs_bindgen_5bf116c6af24ad82 =
+  BG.fromFFIType hs_bindgen_5bf116c6af24ad82_base
+
+-- | Get the number of effects a haptic device can play at the same time.
+--
+--     This is not supported on all platforms, but will always return a value.
+--
+--     [Returns]: the number of effects the haptic device can play at the same time or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMaxHapticEffects', 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_GetMaxHapticEffectsPlaying@, defined at @SDL3\/SDL_haptic.h 1157:33@
+sDL_GetMaxHapticEffectsPlaying
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query maximum playing effects.
+  -> IO BG.CInt
+sDL_GetMaxHapticEffectsPlaying =
+  hs_bindgen_5bf116c6af24ad82
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticFeatures@
+foreign import ccall safe "hs_bindgen_13fda9a87e4ece91"
+  hs_bindgen_13fda9a87e4ece91_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticFeatures@
+hs_bindgen_13fda9a87e4ece91
+  :: BG.Ptr SDL_Haptic
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_13fda9a87e4ece91 =
+  BG.fromFFIType hs_bindgen_13fda9a87e4ece91_base
+
+-- | Get the haptic device\'s supported features in bitwise manner.
+--
+--     [Returns]: a list of supported haptic features in bitwise manner (OR\'d), or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HapticEffectSupported', 'sDL_GetMaxHapticEffects'
+--
+--     [C declaration]: @SDL_GetHapticFeatures@, defined at @SDL3\/SDL_haptic.h 1171:36@
+sDL_GetHapticFeatures
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_GetHapticFeatures = hs_bindgen_13fda9a87e4ece91
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetNumHapticAxes@
+foreign import ccall safe "hs_bindgen_7ed42e0a43315641"
+  hs_bindgen_7ed42e0a43315641_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetNumHapticAxes@
+hs_bindgen_7ed42e0a43315641
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CInt
+hs_bindgen_7ed42e0a43315641 =
+  BG.fromFFIType hs_bindgen_7ed42e0a43315641_base
+
+-- | Get the number of haptic axes the device has.
+--
+--     The number of haptic axes might be useful if working with the 'SDL_HapticDirection' effect.
+--
+--     [Returns]: the number of axes on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetNumHapticAxes@, defined at @SDL3\/SDL_haptic.h 1185:33@
+sDL_GetNumHapticAxes
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO BG.CInt
+sDL_GetNumHapticAxes = hs_bindgen_7ed42e0a43315641
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_HapticEffectSupported@
+foreign import ccall safe "hs_bindgen_5f13cffbd392579e"
+  hs_bindgen_5f13cffbd392579e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_HapticEffectSupported@
+hs_bindgen_5f13cffbd392579e
+  :: BG.Ptr SDL_Haptic
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -> IO BG.CBool
+hs_bindgen_5f13cffbd392579e =
+  BG.fromFFIType hs_bindgen_5f13cffbd392579e_base
+
+-- | Check to see if an effect is supported by a haptic device.
+--
+--     [Returns]: true if the effect is supported or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateHapticEffect', 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_HapticEffectSupported@, defined at @SDL3\/SDL_haptic.h 1199:34@
+sDL_HapticEffectSupported
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@effect@]: the desired effect to query.
+  -> IO BG.CBool
+sDL_HapticEffectSupported =
+  hs_bindgen_5f13cffbd392579e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_CreateHapticEffect@
+foreign import ccall safe "hs_bindgen_15baa0f4a78836ae"
+  hs_bindgen_15baa0f4a78836ae_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_CreateHapticEffect@
+hs_bindgen_15baa0f4a78836ae
+  :: BG.Ptr SDL_Haptic
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -> IO SDL_HapticEffectID
+hs_bindgen_15baa0f4a78836ae =
+  BG.fromFFIType hs_bindgen_15baa0f4a78836ae_base
+
+-- | Create a new haptic effect on a specified device.
+--
+--     [Returns]: the ID of the effect on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyHapticEffect', 'sDL_RunHapticEffect', 'sDL_UpdateHapticEffect'
+--
+--     [C declaration]: @SDL_CreateHapticEffect@, defined at @SDL3\/SDL_haptic.h 1216:48@
+sDL_CreateHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: an 'SDL_Haptic' device to create the effect on.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@effect@]: an 'SDL_HapticEffect' structure containing the properties of the effect to create.
+  -> IO SDL_HapticEffectID
+sDL_CreateHapticEffect = hs_bindgen_15baa0f4a78836ae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_UpdateHapticEffect@
+foreign import ccall safe "hs_bindgen_0492468c6fb17ac5"
+  hs_bindgen_0492468c6fb17ac5_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_UpdateHapticEffect@
+hs_bindgen_0492468c6fb17ac5
+  :: BG.Ptr SDL_Haptic
+  -> SDL_HapticEffectID
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -> IO BG.CBool
+hs_bindgen_0492468c6fb17ac5 =
+  BG.fromFFIType hs_bindgen_0492468c6fb17ac5_base
+
+-- | Update the properties of an effect.
+--
+--     Can be used dynamically, although behavior when dynamically changing direction may be strange. Specifically the effect may re-upload itself and start playing from the start. You also cannot change the type either when running @SDL_UpdateHapticEffect()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateHapticEffect', 'sDL_RunHapticEffect'
+--
+--     [C declaration]: @SDL_UpdateHapticEffect@, defined at @SDL3\/SDL_haptic.h 1238:34@
+sDL_UpdateHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device that has the effect.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the identifier of the effect to update.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@data@]: an 'SDL_HapticEffect' structure containing the new effect properties to use.
+  -> IO BG.CBool
+sDL_UpdateHapticEffect = hs_bindgen_0492468c6fb17ac5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_RunHapticEffect@
+foreign import ccall safe "hs_bindgen_a614a05d61f4001a"
+  hs_bindgen_a614a05d61f4001a_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_RunHapticEffect@
+hs_bindgen_a614a05d61f4001a
+  :: BG.Ptr SDL_Haptic
+  -> SDL_HapticEffectID
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_a614a05d61f4001a =
+  BG.fromFFIType hs_bindgen_a614a05d61f4001a_base
+
+-- | Run the haptic effect on its associated haptic device.
+--
+--     To repeat the effect over and over indefinitely, set @iterations@ to @'sDL_HAPTIC_INFINITY'@. (Repeats the envelope - attack and fade.) To make one instance of the effect last indefinitely (so the effect does not fade), set the effect\'s @length@ in its structure\/union to @'sDL_HAPTIC_INFINITY'@ instead.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticEffectStatus', 'sDL_StopHapticEffect', 'sDL_StopHapticEffects'
+--
+--     [C declaration]: @SDL_RunHapticEffect@, defined at @SDL3\/SDL_haptic.h 1262:34@
+sDL_RunHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to run the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to run.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@iterations@]: the number of iterations to run the effect; use @'sDL_HAPTIC_INFINITY'@ to repeat forever.
+  -> IO BG.CBool
+sDL_RunHapticEffect = hs_bindgen_a614a05d61f4001a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_StopHapticEffect@
+foreign import ccall safe "hs_bindgen_62c7aa3038b74c27"
+  hs_bindgen_62c7aa3038b74c27_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_StopHapticEffect@
+hs_bindgen_62c7aa3038b74c27
+  :: BG.Ptr SDL_Haptic
+  -> SDL_HapticEffectID
+  -> IO BG.CBool
+hs_bindgen_62c7aa3038b74c27 =
+  BG.fromFFIType hs_bindgen_62c7aa3038b74c27_base
+
+-- | Stop the haptic effect on its associated haptic device.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunHapticEffect', 'sDL_StopHapticEffects'
+--
+--     [C declaration]: @SDL_StopHapticEffect@, defined at @SDL3\/SDL_haptic.h 1277:34@
+sDL_StopHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to stop the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to stop.
+  -> IO BG.CBool
+sDL_StopHapticEffect = hs_bindgen_62c7aa3038b74c27
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_DestroyHapticEffect@
+foreign import ccall safe "hs_bindgen_6ebf1b15d73c024c"
+  hs_bindgen_6ebf1b15d73c024c_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_DestroyHapticEffect@
+hs_bindgen_6ebf1b15d73c024c
+  :: BG.Ptr SDL_Haptic
+  -> SDL_HapticEffectID
+  -> IO ()
+hs_bindgen_6ebf1b15d73c024c =
+  BG.fromFFIType hs_bindgen_6ebf1b15d73c024c_base
+
+-- | Destroy a haptic effect on the device.
+--
+--     This will stop the effect if it\'s running. Effects are automatically destroyed when the device is closed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateHapticEffect'
+--
+--     [C declaration]: @SDL_DestroyHapticEffect@, defined at @SDL3\/SDL_haptic.h 1292:34@
+sDL_DestroyHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to destroy the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to destroy.
+  -> IO ()
+sDL_DestroyHapticEffect = hs_bindgen_6ebf1b15d73c024c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticEffectStatus@
+foreign import ccall safe "hs_bindgen_8953e9e35530a132"
+  hs_bindgen_8953e9e35530a132_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_GetHapticEffectStatus@
+hs_bindgen_8953e9e35530a132
+  :: BG.Ptr SDL_Haptic
+  -> SDL_HapticEffectID
+  -> IO BG.CBool
+hs_bindgen_8953e9e35530a132 =
+  BG.fromFFIType hs_bindgen_8953e9e35530a132_base
+
+-- | Get the status of the current effect on the specified haptic device.
+--
+--     Device must support the SDL_HAPTIC_STATUS feature.
+--
+--     [Returns]: true if it is playing, false if it isn\'t playing or haptic status isn\'t supported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_GetHapticEffectStatus@, defined at @SDL3\/SDL_haptic.h 1308:34@
+sDL_GetHapticEffectStatus
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query for the effect status on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to query its status.
+  -> IO BG.CBool
+sDL_GetHapticEffectStatus =
+  hs_bindgen_8953e9e35530a132
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_SetHapticGain@
+foreign import ccall safe "hs_bindgen_33d36e11c46c206d"
+  hs_bindgen_33d36e11c46c206d_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_SetHapticGain@
+hs_bindgen_33d36e11c46c206d
+  :: BG.Ptr SDL_Haptic
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_33d36e11c46c206d =
+  BG.fromFFIType hs_bindgen_33d36e11c46c206d_base
+
+-- | Set the global gain of the specified haptic device.
+--
+--     Device must support the SDL_HAPTIC_GAIN feature.
+--
+--     The user may specify the maximum gain by setting the environment variable @SDL_HAPTIC_GAIN_MAX@ which should be between 0 and 100. All calls to @SDL_SetHapticGain()@ will scale linearly using @SDL_HAPTIC_GAIN_MAX@ as the maximum.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_SetHapticGain@, defined at @SDL3\/SDL_haptic.h 1330:34@
+sDL_SetHapticGain
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to set the gain on.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@gain@]: value to set the gain to, should be between 0 and 100 (0 - 100).
+  -> IO BG.CBool
+sDL_SetHapticGain = hs_bindgen_33d36e11c46c206d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_SetHapticAutocenter@
+foreign import ccall safe "hs_bindgen_713374147201159e"
+  hs_bindgen_713374147201159e_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_SetHapticAutocenter@
+hs_bindgen_713374147201159e
+  :: BG.Ptr SDL_Haptic
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_713374147201159e =
+  BG.fromFFIType hs_bindgen_713374147201159e_base
+
+-- | Set the global autocenter of the device.
+--
+--     Autocenter should be between 0 and 100. Setting it to 0 will disable autocentering.
+--
+--     Device must support the SDL_HAPTIC_AUTOCENTER feature.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_SetHapticAutocenter@, defined at @SDL3\/SDL_haptic.h 1349:34@
+sDL_SetHapticAutocenter
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to set autocentering on.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@autocenter@]: value to set autocenter to (0-100).
+  -> IO BG.CBool
+sDL_SetHapticAutocenter = hs_bindgen_713374147201159e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_PauseHaptic@
+foreign import ccall safe "hs_bindgen_d4344f317b2d7325"
+  hs_bindgen_d4344f317b2d7325_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_PauseHaptic@
+hs_bindgen_d4344f317b2d7325
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_d4344f317b2d7325 =
+  BG.fromFFIType hs_bindgen_d4344f317b2d7325_base
+
+-- | Pause a haptic device.
+--
+--     Device must support the @'sDL_HAPTIC_PAUSE'@ feature. Call @SDL_ResumeHaptic()@ to resume playback.
+--
+--     Do not modify the effects nor add new ones while the device is paused. That can cause all sorts of weird errors.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResumeHaptic'
+--
+--     [C declaration]: @SDL_PauseHaptic@, defined at @SDL3\/SDL_haptic.h 1368:34@
+sDL_PauseHaptic
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to pause.
+  -> IO BG.CBool
+sDL_PauseHaptic = hs_bindgen_d4344f317b2d7325
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_ResumeHaptic@
+foreign import ccall safe "hs_bindgen_79c16f8418a90f86"
+  hs_bindgen_79c16f8418a90f86_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_ResumeHaptic@
+hs_bindgen_79c16f8418a90f86
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_79c16f8418a90f86 =
+  BG.fromFFIType hs_bindgen_79c16f8418a90f86_base
+
+-- | Resume a haptic device.
+--
+--     Call to unpause after @SDL_PauseHaptic()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseHaptic'
+--
+--     [C declaration]: @SDL_ResumeHaptic@, defined at @SDL3\/SDL_haptic.h 1383:34@
+sDL_ResumeHaptic
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to unpause.
+  -> IO BG.CBool
+sDL_ResumeHaptic = hs_bindgen_79c16f8418a90f86
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_StopHapticEffects@
+foreign import ccall safe "hs_bindgen_f452836b38dc6590"
+  hs_bindgen_f452836b38dc6590_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_StopHapticEffects@
+hs_bindgen_f452836b38dc6590
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_f452836b38dc6590 =
+  BG.fromFFIType hs_bindgen_f452836b38dc6590_base
+
+-- | Stop all the currently playing effects on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunHapticEffect', 'sDL_StopHapticEffects'
+--
+--     [C declaration]: @SDL_StopHapticEffects@, defined at @SDL3\/SDL_haptic.h 1397:34@
+sDL_StopHapticEffects
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to stop.
+  -> IO BG.CBool
+sDL_StopHapticEffects = hs_bindgen_f452836b38dc6590
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_HapticRumbleSupported@
+foreign import ccall safe "hs_bindgen_113ac21fbd9de22e"
+  hs_bindgen_113ac21fbd9de22e_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_HapticRumbleSupported@
+hs_bindgen_113ac21fbd9de22e
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_113ac21fbd9de22e =
+  BG.fromFFIType hs_bindgen_113ac21fbd9de22e_base
+
+-- | Check whether rumble is supported on a haptic device.
+--
+--     [Returns]: true if the effect is supported or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InitHapticRumble'
+--
+--     [C declaration]: @SDL_HapticRumbleSupported@, defined at @SDL3\/SDL_haptic.h 1409:34@
+sDL_HapticRumbleSupported
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: haptic device to check for rumble support.
+  -> IO BG.CBool
+sDL_HapticRumbleSupported =
+  hs_bindgen_113ac21fbd9de22e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_InitHapticRumble@
+foreign import ccall safe "hs_bindgen_ae32c683da240a6e"
+  hs_bindgen_ae32c683da240a6e_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_InitHapticRumble@
+hs_bindgen_ae32c683da240a6e
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_ae32c683da240a6e =
+  BG.fromFFIType hs_bindgen_ae32c683da240a6e_base
+
+-- | Initialize a haptic device for simple rumble playback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PlayHapticRumble', 'sDL_StopHapticRumble', 'sDL_HapticRumbleSupported'
+--
+--     [C declaration]: @SDL_InitHapticRumble@, defined at @SDL3\/SDL_haptic.h 1424:34@
+sDL_InitHapticRumble
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to initialize for simple rumble playback.
+  -> IO BG.CBool
+sDL_InitHapticRumble = hs_bindgen_ae32c683da240a6e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_PlayHapticRumble@
+foreign import ccall safe "hs_bindgen_10fe16fce6a60bfe"
+  hs_bindgen_10fe16fce6a60bfe_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_PlayHapticRumble@
+hs_bindgen_10fe16fce6a60bfe
+  :: BG.Ptr SDL_Haptic
+  -> BG.CFloat
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_10fe16fce6a60bfe =
+  BG.fromFFIType hs_bindgen_10fe16fce6a60bfe_base
+
+-- | Run a simple rumble effect on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InitHapticRumble', 'sDL_StopHapticRumble'
+--
+--     [C declaration]: @SDL_PlayHapticRumble@, defined at @SDL3\/SDL_haptic.h 1440:34@
+sDL_PlayHapticRumble
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to play the rumble effect on.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@strength@]: strength of the rumble to play as a 0-1 float value.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@length@]: length of the rumble to play in milliseconds.
+  -> IO BG.CBool
+sDL_PlayHapticRumble = hs_bindgen_10fe16fce6a60bfe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_StopHapticRumble@
+foreign import ccall safe "hs_bindgen_2b55fdb7a5a8262a"
+  hs_bindgen_2b55fdb7a5a8262a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Safe_SDL_StopHapticRumble@
+hs_bindgen_2b55fdb7a5a8262a
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_2b55fdb7a5a8262a =
+  BG.fromFFIType hs_bindgen_2b55fdb7a5a8262a_base
+
+-- | Stop the simple rumble on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PlayHapticRumble'
+--
+--     [C declaration]: @SDL_StopHapticRumble@, defined at @SDL3\/SDL_haptic.h 1453:34@
+sDL_StopHapticRumble
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to stop the rumble effect on.
+  -> IO BG.CBool
+sDL_StopHapticRumble = hs_bindgen_2b55fdb7a5a8262a
diff --git a/src/SDL3/Sys/Bindgen/Haptic/Unsafe.hs b/src/SDL3/Sys/Bindgen/Haptic/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Haptic/Unsafe.hs
@@ -0,0 +1,1296 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Haptic.Unsafe (
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_GetHaptics,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_GetHapticNameForID,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_OpenHaptic,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_GetHapticFromID,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_GetHapticID,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_GetHapticName,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_IsMouseHaptic,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_OpenHapticFromMouse,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_IsJoystickHaptic,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_OpenHapticFromJoystick,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_CloseHaptic,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_GetMaxHapticEffects,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_GetMaxHapticEffectsPlaying,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_GetHapticFeatures,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_GetNumHapticAxes,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_HapticEffectSupported,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_CreateHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_UpdateHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_RunHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_StopHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_DestroyHapticEffect,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_GetHapticEffectStatus,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_SetHapticGain,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_SetHapticAutocenter,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_PauseHaptic,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_ResumeHaptic,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_StopHapticEffects,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_HapticRumbleSupported,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_InitHapticRumble,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_PlayHapticRumble,
+  SDL3.Sys.Bindgen.Haptic.Unsafe.sDL_StopHapticRumble,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Haptic
+import SDL3.Sys.Bindgen.Joystick qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_haptic.h>"
+         , "SDL_HapticID *hs_bindgen_9144fd217aed3644 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHaptics)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_0bc6c8aa0c9268ef ("
+         , "  SDL_HapticID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticNameForID)(arg1);"
+         , "}"
+         , "SDL_Haptic *hs_bindgen_e145a39ad8de4588 ("
+         , "  SDL_HapticID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenHaptic)(arg1);"
+         , "}"
+         , "SDL_Haptic *hs_bindgen_3eb0e70beaf705a6 ("
+         , "  SDL_HapticID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticFromID)(arg1);"
+         , "}"
+         , "SDL_HapticID hs_bindgen_733c1ac4379b685f ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticID)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_65ea37324067e4e8 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticName)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_7f6b487ecec1bdc7 (void)"
+         , "{"
+         , "  return (SDL_IsMouseHaptic)();"
+         , "}"
+         , "SDL_Haptic *hs_bindgen_fdfe5c61a81c94fd (void)"
+         , "{"
+         , "  return (SDL_OpenHapticFromMouse)();"
+         , "}"
+         , "_Bool hs_bindgen_136048137b058f4b ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_IsJoystickHaptic)(arg1);"
+         , "}"
+         , "SDL_Haptic *hs_bindgen_1ee4f9bee2fcd4f3 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenHapticFromJoystick)(arg1);"
+         , "}"
+         , "void hs_bindgen_5dc34bbc05254c40 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseHaptic)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_5cd0622005566196 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMaxHapticEffects)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_ed10e8124384dcc6 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMaxHapticEffectsPlaying)(arg1);"
+         , "}"
+         , "Uint32 hs_bindgen_53effd9f65bf5118 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticFeatures)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_fc1fa543654842e5 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumHapticAxes)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ddf7667b0951f535 ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_HapticEffectSupported)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "SDL_HapticEffectID hs_bindgen_8b8594cfaa325bcf ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateHapticEffect)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "_Bool hs_bindgen_9a5d65efc573a34d ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2,"
+         , "  SDL_HapticEffect const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateHapticEffect)(arg1, arg2, arg3);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "_Bool hs_bindgen_a491b2976f3c0e2a ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RunHapticEffect)(arg1, arg2, arg3);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "_Bool hs_bindgen_a1ba32f8ccf55d38 ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_StopHapticEffect)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "void hs_bindgen_2cf548acecd92e79 ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyHapticEffect)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_HapticEffectID;"
+         , "#endif"
+         , "_Bool hs_bindgen_a77bda94890e1c73 ("
+         , "  SDL_Haptic *arg1,"
+         , "  SDL_HapticEffectID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHapticEffectStatus)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_206db73edc8fadd4 ("
+         , "  SDL_Haptic *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetHapticGain)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_f0b69ddce282f135 ("
+         , "  SDL_Haptic *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetHapticAutocenter)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_98b65e257f12670a ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_PauseHaptic)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_d54e536e172fdf2a ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ResumeHaptic)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_10f2c8457cada0f1 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_StopHapticEffects)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0b0f01d261871ca4 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_HapticRumbleSupported)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_1d3609585fc8a6db ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_InitHapticRumble)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_9a900e80b5933810 ("
+         , "  SDL_Haptic *arg1,"
+         , "  float arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_PlayHapticRumble)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_8eb60197e5125e42 ("
+         , "  SDL_Haptic *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_StopHapticRumble)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHaptics@
+foreign import ccall unsafe "hs_bindgen_9144fd217aed3644"
+  hs_bindgen_9144fd217aed3644_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHaptics@
+hs_bindgen_9144fd217aed3644
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_HapticID)
+hs_bindgen_9144fd217aed3644 =
+  BG.fromFFIType hs_bindgen_9144fd217aed3644_base
+
+-- | Get a list of currently connected haptic devices.
+--
+--     [Returns]: a 0 terminated array of haptic device instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHaptic'
+--
+--     [C declaration]: @SDL_GetHaptics@, defined at @SDL3\/SDL_haptic.h 975:44@
+sDL_GetHaptics
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of haptic devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_HapticID)
+sDL_GetHaptics = hs_bindgen_9144fd217aed3644
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticNameForID@
+foreign import ccall unsafe "hs_bindgen_0bc6c8aa0c9268ef"
+  hs_bindgen_0bc6c8aa0c9268ef_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticNameForID@
+hs_bindgen_0bc6c8aa0c9268ef
+  :: SDL_HapticID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_0bc6c8aa0c9268ef =
+  BG.fromFFIType hs_bindgen_0bc6c8aa0c9268ef_base
+
+-- | Get the implementation dependent name of a haptic device.
+--
+--     This can be called before any haptic devices are opened.
+--
+--     [Returns]: the name of the selected haptic device. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticName', 'sDL_OpenHaptic'
+--
+--     [C declaration]: @SDL_GetHapticNameForID@, defined at @SDL3\/SDL_haptic.h 992:42@
+sDL_GetHapticNameForID
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the haptic device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetHapticNameForID = hs_bindgen_0bc6c8aa0c9268ef
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_OpenHaptic@
+foreign import ccall unsafe "hs_bindgen_e145a39ad8de4588"
+  hs_bindgen_e145a39ad8de4588_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_OpenHaptic@
+hs_bindgen_e145a39ad8de4588
+  :: SDL_HapticID
+  -> IO (BG.Ptr SDL_Haptic)
+hs_bindgen_e145a39ad8de4588 =
+  BG.fromFFIType hs_bindgen_e145a39ad8de4588_base
+
+-- | Open a haptic device for use.
+--
+--     The index passed as an argument refers to the N\'th haptic device on this system.
+--
+--     When opening a haptic device, its gain will be set to maximum and autocenter will be disabled. To modify these values use @SDL_SetHapticGain()@ and @SDL_SetHapticAutocenter()@.
+--
+--     [Returns]: the device identifier or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseHaptic', 'sDL_GetHaptics', 'sDL_OpenHapticFromJoystick', 'sDL_OpenHapticFromMouse', 'sDL_SetHapticAutocenter', 'sDL_SetHapticGain'
+--
+--     [C declaration]: @SDL_OpenHaptic@, defined at @SDL3\/SDL_haptic.h 1017:42@
+sDL_OpenHaptic
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the haptic device instance ID.
+  -> IO (BG.Ptr SDL_Haptic)
+sDL_OpenHaptic = hs_bindgen_e145a39ad8de4588
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticFromID@
+foreign import ccall unsafe "hs_bindgen_3eb0e70beaf705a6"
+  hs_bindgen_3eb0e70beaf705a6_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticFromID@
+hs_bindgen_3eb0e70beaf705a6
+  :: SDL_HapticID
+  -> IO (BG.Ptr SDL_Haptic)
+hs_bindgen_3eb0e70beaf705a6 =
+  BG.fromFFIType hs_bindgen_3eb0e70beaf705a6_base
+
+-- | Get the 'SDL_Haptic' associated with an instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Haptic' on success or NULL on failure or if it hasn\'t been opened yet; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetHapticFromID@, defined at @SDL3\/SDL_haptic.h 1029:42@
+sDL_GetHapticFromID
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the instance ID to get the 'SDL_Haptic' for.
+  -> IO (BG.Ptr SDL_Haptic)
+sDL_GetHapticFromID = hs_bindgen_3eb0e70beaf705a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticID@
+foreign import ccall unsafe "hs_bindgen_733c1ac4379b685f"
+  hs_bindgen_733c1ac4379b685f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticID@
+hs_bindgen_733c1ac4379b685f
+  :: BG.Ptr SDL_Haptic
+  -> IO SDL_HapticID
+hs_bindgen_733c1ac4379b685f =
+  BG.fromFFIType hs_bindgen_733c1ac4379b685f_base
+
+-- | Get the instance ID of an opened haptic device.
+--
+--     [Returns]: the instance ID of the specified haptic device on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetHapticID@, defined at @SDL3\/SDL_haptic.h 1040:42@
+sDL_GetHapticID
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO SDL_HapticID
+sDL_GetHapticID = hs_bindgen_733c1ac4379b685f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticName@
+foreign import ccall unsafe "hs_bindgen_65ea37324067e4e8"
+  hs_bindgen_65ea37324067e4e8_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticName@
+hs_bindgen_65ea37324067e4e8
+  :: BG.Ptr SDL_Haptic
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_65ea37324067e4e8 =
+  BG.fromFFIType hs_bindgen_65ea37324067e4e8_base
+
+-- | Get the implementation dependent name of a haptic device.
+--
+--     [Returns]: the name of the selected haptic device. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticNameForID'
+--
+--     [C declaration]: @SDL_GetHapticName@, defined at @SDL3\/SDL_haptic.h 1054:42@
+sDL_GetHapticName
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' obtained from SDL_OpenJoystick().
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetHapticName = hs_bindgen_65ea37324067e4e8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_IsMouseHaptic@
+foreign import ccall unsafe "hs_bindgen_7f6b487ecec1bdc7"
+  hs_bindgen_7f6b487ecec1bdc7_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_IsMouseHaptic@
+hs_bindgen_7f6b487ecec1bdc7 :: IO BG.CBool
+hs_bindgen_7f6b487ecec1bdc7 =
+  BG.fromFFIType hs_bindgen_7f6b487ecec1bdc7_base
+
+-- | Query whether or not the current mouse has haptic capabilities.
+--
+--     [Returns]: true if the mouse is haptic or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHapticFromMouse'
+--
+--     [C declaration]: @SDL_IsMouseHaptic@, defined at @SDL3\/SDL_haptic.h 1065:34@
+sDL_IsMouseHaptic :: IO BG.CBool
+sDL_IsMouseHaptic = hs_bindgen_7f6b487ecec1bdc7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_OpenHapticFromMouse@
+foreign import ccall unsafe "hs_bindgen_fdfe5c61a81c94fd"
+  hs_bindgen_fdfe5c61a81c94fd_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_OpenHapticFromMouse@
+hs_bindgen_fdfe5c61a81c94fd :: IO (BG.Ptr SDL_Haptic)
+hs_bindgen_fdfe5c61a81c94fd =
+  BG.fromFFIType hs_bindgen_fdfe5c61a81c94fd_base
+
+-- | Try to open a haptic device from the current mouse.
+--
+--     [Returns]: the haptic device identifier or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseHaptic', 'sDL_IsMouseHaptic'
+--
+--     [C declaration]: @SDL_OpenHapticFromMouse@, defined at @SDL3\/SDL_haptic.h 1078:42@
+sDL_OpenHapticFromMouse :: IO (BG.Ptr SDL_Haptic)
+sDL_OpenHapticFromMouse = hs_bindgen_fdfe5c61a81c94fd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_IsJoystickHaptic@
+foreign import ccall unsafe "hs_bindgen_136048137b058f4b"
+  hs_bindgen_136048137b058f4b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_IsJoystickHaptic@
+hs_bindgen_136048137b058f4b
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -> IO BG.CBool
+hs_bindgen_136048137b058f4b =
+  BG.fromFFIType hs_bindgen_136048137b058f4b_base
+
+-- | Query if a joystick has haptic features.
+--
+--     [Returns]: true if the joystick is haptic or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHapticFromJoystick'
+--
+--     [C declaration]: @SDL_IsJoystickHaptic@, defined at @SDL3\/SDL_haptic.h 1090:34@
+sDL_IsJoystickHaptic
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the SDL_Joystick to test for haptic capabilities.
+  -> IO BG.CBool
+sDL_IsJoystickHaptic = hs_bindgen_136048137b058f4b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_OpenHapticFromJoystick@
+foreign import ccall unsafe "hs_bindgen_1ee4f9bee2fcd4f3"
+  hs_bindgen_1ee4f9bee2fcd4f3_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_OpenHapticFromJoystick@
+hs_bindgen_1ee4f9bee2fcd4f3
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -> IO (BG.Ptr SDL_Haptic)
+hs_bindgen_1ee4f9bee2fcd4f3 =
+  BG.fromFFIType hs_bindgen_1ee4f9bee2fcd4f3_base
+
+-- | Open a haptic device for use from a joystick device.
+--
+--     You must still close the haptic device separately. It will not be closed with the joystick.
+--
+--     When opened from a joystick you should first close the haptic device before closing the joystick device. If not, on some implementations the haptic device will also get unallocated and you\'ll be unable to use force feedback on that device.
+--
+--     [Returns]: a valid haptic device identifier on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseHaptic', 'sDL_IsJoystickHaptic'
+--
+--     [C declaration]: @SDL_OpenHapticFromJoystick@, defined at @SDL3\/SDL_haptic.h 1112:42@
+sDL_OpenHapticFromJoystick
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the SDL_Joystick to create a haptic device from.
+  -> IO (BG.Ptr SDL_Haptic)
+sDL_OpenHapticFromJoystick =
+  hs_bindgen_1ee4f9bee2fcd4f3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_CloseHaptic@
+foreign import ccall unsafe "hs_bindgen_5dc34bbc05254c40"
+  hs_bindgen_5dc34bbc05254c40_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_CloseHaptic@
+hs_bindgen_5dc34bbc05254c40
+  :: BG.Ptr SDL_Haptic
+  -> IO ()
+hs_bindgen_5dc34bbc05254c40 =
+  BG.fromFFIType hs_bindgen_5dc34bbc05254c40_base
+
+-- | Close a haptic device previously opened with @SDL_OpenHaptic()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenHaptic'
+--
+--     [C declaration]: @SDL_CloseHaptic@, defined at @SDL3\/SDL_haptic.h 1123:34@
+sDL_CloseHaptic
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to close.
+  -> IO ()
+sDL_CloseHaptic = hs_bindgen_5dc34bbc05254c40
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetMaxHapticEffects@
+foreign import ccall unsafe "hs_bindgen_5cd0622005566196"
+  hs_bindgen_5cd0622005566196_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetMaxHapticEffects@
+hs_bindgen_5cd0622005566196
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CInt
+hs_bindgen_5cd0622005566196 =
+  BG.fromFFIType hs_bindgen_5cd0622005566196_base
+
+-- | Get the number of effects a haptic device can store.
+--
+--     On some platforms this isn\'t fully supported, and therefore is an approximation. Always check to see if your created effect was actually created and do not rely solely on @SDL_GetMaxHapticEffects()@.
+--
+--     [Returns]: the number of effects the haptic device can store or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMaxHapticEffectsPlaying', 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_GetMaxHapticEffects@, defined at @SDL3\/SDL_haptic.h 1141:33@
+sDL_GetMaxHapticEffects
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO BG.CInt
+sDL_GetMaxHapticEffects = hs_bindgen_5cd0622005566196
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetMaxHapticEffectsPlaying@
+foreign import ccall unsafe "hs_bindgen_ed10e8124384dcc6"
+  hs_bindgen_ed10e8124384dcc6_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetMaxHapticEffectsPlaying@
+hs_bindgen_ed10e8124384dcc6
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CInt
+hs_bindgen_ed10e8124384dcc6 =
+  BG.fromFFIType hs_bindgen_ed10e8124384dcc6_base
+
+-- | Get the number of effects a haptic device can play at the same time.
+--
+--     This is not supported on all platforms, but will always return a value.
+--
+--     [Returns]: the number of effects the haptic device can play at the same time or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMaxHapticEffects', 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_GetMaxHapticEffectsPlaying@, defined at @SDL3\/SDL_haptic.h 1157:33@
+sDL_GetMaxHapticEffectsPlaying
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query maximum playing effects.
+  -> IO BG.CInt
+sDL_GetMaxHapticEffectsPlaying =
+  hs_bindgen_ed10e8124384dcc6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticFeatures@
+foreign import ccall unsafe "hs_bindgen_53effd9f65bf5118"
+  hs_bindgen_53effd9f65bf5118_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticFeatures@
+hs_bindgen_53effd9f65bf5118
+  :: BG.Ptr SDL_Haptic
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_53effd9f65bf5118 =
+  BG.fromFFIType hs_bindgen_53effd9f65bf5118_base
+
+-- | Get the haptic device\'s supported features in bitwise manner.
+--
+--     [Returns]: a list of supported haptic features in bitwise manner (OR\'d), or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HapticEffectSupported', 'sDL_GetMaxHapticEffects'
+--
+--     [C declaration]: @SDL_GetHapticFeatures@, defined at @SDL3\/SDL_haptic.h 1171:36@
+sDL_GetHapticFeatures
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_GetHapticFeatures = hs_bindgen_53effd9f65bf5118
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetNumHapticAxes@
+foreign import ccall unsafe "hs_bindgen_fc1fa543654842e5"
+  hs_bindgen_fc1fa543654842e5_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetNumHapticAxes@
+hs_bindgen_fc1fa543654842e5
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CInt
+hs_bindgen_fc1fa543654842e5 =
+  BG.fromFFIType hs_bindgen_fc1fa543654842e5_base
+
+-- | Get the number of haptic axes the device has.
+--
+--     The number of haptic axes might be useful if working with the 'SDL_HapticDirection' effect.
+--
+--     [Returns]: the number of axes on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetNumHapticAxes@, defined at @SDL3\/SDL_haptic.h 1185:33@
+sDL_GetNumHapticAxes
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO BG.CInt
+sDL_GetNumHapticAxes = hs_bindgen_fc1fa543654842e5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_HapticEffectSupported@
+foreign import ccall unsafe "hs_bindgen_ddf7667b0951f535"
+  hs_bindgen_ddf7667b0951f535_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_HapticEffectSupported@
+hs_bindgen_ddf7667b0951f535
+  :: BG.Ptr SDL_Haptic
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -> IO BG.CBool
+hs_bindgen_ddf7667b0951f535 =
+  BG.fromFFIType hs_bindgen_ddf7667b0951f535_base
+
+-- | Check to see if an effect is supported by a haptic device.
+--
+--     [Returns]: true if the effect is supported or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateHapticEffect', 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_HapticEffectSupported@, defined at @SDL3\/SDL_haptic.h 1199:34@
+sDL_HapticEffectSupported
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@effect@]: the desired effect to query.
+  -> IO BG.CBool
+sDL_HapticEffectSupported =
+  hs_bindgen_ddf7667b0951f535
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_CreateHapticEffect@
+foreign import ccall unsafe "hs_bindgen_8b8594cfaa325bcf"
+  hs_bindgen_8b8594cfaa325bcf_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_CreateHapticEffect@
+hs_bindgen_8b8594cfaa325bcf
+  :: BG.Ptr SDL_Haptic
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -> IO SDL_HapticEffectID
+hs_bindgen_8b8594cfaa325bcf =
+  BG.fromFFIType hs_bindgen_8b8594cfaa325bcf_base
+
+-- | Create a new haptic effect on a specified device.
+--
+--     [Returns]: the ID of the effect on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyHapticEffect', 'sDL_RunHapticEffect', 'sDL_UpdateHapticEffect'
+--
+--     [C declaration]: @SDL_CreateHapticEffect@, defined at @SDL3\/SDL_haptic.h 1216:48@
+sDL_CreateHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: an 'SDL_Haptic' device to create the effect on.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@effect@]: an 'SDL_HapticEffect' structure containing the properties of the effect to create.
+  -> IO SDL_HapticEffectID
+sDL_CreateHapticEffect = hs_bindgen_8b8594cfaa325bcf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_UpdateHapticEffect@
+foreign import ccall unsafe "hs_bindgen_9a5d65efc573a34d"
+  hs_bindgen_9a5d65efc573a34d_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_UpdateHapticEffect@
+hs_bindgen_9a5d65efc573a34d
+  :: BG.Ptr SDL_Haptic
+  -> SDL_HapticEffectID
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -> IO BG.CBool
+hs_bindgen_9a5d65efc573a34d =
+  BG.fromFFIType hs_bindgen_9a5d65efc573a34d_base
+
+-- | Update the properties of an effect.
+--
+--     Can be used dynamically, although behavior when dynamically changing direction may be strange. Specifically the effect may re-upload itself and start playing from the start. You also cannot change the type either when running @SDL_UpdateHapticEffect()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateHapticEffect', 'sDL_RunHapticEffect'
+--
+--     [C declaration]: @SDL_UpdateHapticEffect@, defined at @SDL3\/SDL_haptic.h 1238:34@
+sDL_UpdateHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device that has the effect.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the identifier of the effect to update.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@data@]: an 'SDL_HapticEffect' structure containing the new effect properties to use.
+  -> IO BG.CBool
+sDL_UpdateHapticEffect = hs_bindgen_9a5d65efc573a34d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_RunHapticEffect@
+foreign import ccall unsafe "hs_bindgen_a491b2976f3c0e2a"
+  hs_bindgen_a491b2976f3c0e2a_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_RunHapticEffect@
+hs_bindgen_a491b2976f3c0e2a
+  :: BG.Ptr SDL_Haptic
+  -> SDL_HapticEffectID
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_a491b2976f3c0e2a =
+  BG.fromFFIType hs_bindgen_a491b2976f3c0e2a_base
+
+-- | Run the haptic effect on its associated haptic device.
+--
+--     To repeat the effect over and over indefinitely, set @iterations@ to @'sDL_HAPTIC_INFINITY'@. (Repeats the envelope - attack and fade.) To make one instance of the effect last indefinitely (so the effect does not fade), set the effect\'s @length@ in its structure\/union to @'sDL_HAPTIC_INFINITY'@ instead.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticEffectStatus', 'sDL_StopHapticEffect', 'sDL_StopHapticEffects'
+--
+--     [C declaration]: @SDL_RunHapticEffect@, defined at @SDL3\/SDL_haptic.h 1262:34@
+sDL_RunHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to run the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to run.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@iterations@]: the number of iterations to run the effect; use @'sDL_HAPTIC_INFINITY'@ to repeat forever.
+  -> IO BG.CBool
+sDL_RunHapticEffect = hs_bindgen_a491b2976f3c0e2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_StopHapticEffect@
+foreign import ccall unsafe "hs_bindgen_a1ba32f8ccf55d38"
+  hs_bindgen_a1ba32f8ccf55d38_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_StopHapticEffect@
+hs_bindgen_a1ba32f8ccf55d38
+  :: BG.Ptr SDL_Haptic
+  -> SDL_HapticEffectID
+  -> IO BG.CBool
+hs_bindgen_a1ba32f8ccf55d38 =
+  BG.fromFFIType hs_bindgen_a1ba32f8ccf55d38_base
+
+-- | Stop the haptic effect on its associated haptic device.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunHapticEffect', 'sDL_StopHapticEffects'
+--
+--     [C declaration]: @SDL_StopHapticEffect@, defined at @SDL3\/SDL_haptic.h 1277:34@
+sDL_StopHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to stop the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to stop.
+  -> IO BG.CBool
+sDL_StopHapticEffect = hs_bindgen_a1ba32f8ccf55d38
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_DestroyHapticEffect@
+foreign import ccall unsafe "hs_bindgen_2cf548acecd92e79"
+  hs_bindgen_2cf548acecd92e79_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_DestroyHapticEffect@
+hs_bindgen_2cf548acecd92e79
+  :: BG.Ptr SDL_Haptic
+  -> SDL_HapticEffectID
+  -> IO ()
+hs_bindgen_2cf548acecd92e79 =
+  BG.fromFFIType hs_bindgen_2cf548acecd92e79_base
+
+-- | Destroy a haptic effect on the device.
+--
+--     This will stop the effect if it\'s running. Effects are automatically destroyed when the device is closed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateHapticEffect'
+--
+--     [C declaration]: @SDL_DestroyHapticEffect@, defined at @SDL3\/SDL_haptic.h 1292:34@
+sDL_DestroyHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to destroy the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to destroy.
+  -> IO ()
+sDL_DestroyHapticEffect = hs_bindgen_2cf548acecd92e79
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticEffectStatus@
+foreign import ccall unsafe "hs_bindgen_a77bda94890e1c73"
+  hs_bindgen_a77bda94890e1c73_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_GetHapticEffectStatus@
+hs_bindgen_a77bda94890e1c73
+  :: BG.Ptr SDL_Haptic
+  -> SDL_HapticEffectID
+  -> IO BG.CBool
+hs_bindgen_a77bda94890e1c73 =
+  BG.fromFFIType hs_bindgen_a77bda94890e1c73_base
+
+-- | Get the status of the current effect on the specified haptic device.
+--
+--     Device must support the SDL_HAPTIC_STATUS feature.
+--
+--     [Returns]: true if it is playing, false if it isn\'t playing or haptic status isn\'t supported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_GetHapticEffectStatus@, defined at @SDL3\/SDL_haptic.h 1308:34@
+sDL_GetHapticEffectStatus
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query for the effect status on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to query its status.
+  -> IO BG.CBool
+sDL_GetHapticEffectStatus =
+  hs_bindgen_a77bda94890e1c73
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_SetHapticGain@
+foreign import ccall unsafe "hs_bindgen_206db73edc8fadd4"
+  hs_bindgen_206db73edc8fadd4_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_SetHapticGain@
+hs_bindgen_206db73edc8fadd4
+  :: BG.Ptr SDL_Haptic
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_206db73edc8fadd4 =
+  BG.fromFFIType hs_bindgen_206db73edc8fadd4_base
+
+-- | Set the global gain of the specified haptic device.
+--
+--     Device must support the SDL_HAPTIC_GAIN feature.
+--
+--     The user may specify the maximum gain by setting the environment variable @SDL_HAPTIC_GAIN_MAX@ which should be between 0 and 100. All calls to @SDL_SetHapticGain()@ will scale linearly using @SDL_HAPTIC_GAIN_MAX@ as the maximum.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_SetHapticGain@, defined at @SDL3\/SDL_haptic.h 1330:34@
+sDL_SetHapticGain
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to set the gain on.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@gain@]: value to set the gain to, should be between 0 and 100 (0 - 100).
+  -> IO BG.CBool
+sDL_SetHapticGain = hs_bindgen_206db73edc8fadd4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_SetHapticAutocenter@
+foreign import ccall unsafe "hs_bindgen_f0b69ddce282f135"
+  hs_bindgen_f0b69ddce282f135_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_SetHapticAutocenter@
+hs_bindgen_f0b69ddce282f135
+  :: BG.Ptr SDL_Haptic
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_f0b69ddce282f135 =
+  BG.fromFFIType hs_bindgen_f0b69ddce282f135_base
+
+-- | Set the global autocenter of the device.
+--
+--     Autocenter should be between 0 and 100. Setting it to 0 will disable autocentering.
+--
+--     Device must support the SDL_HAPTIC_AUTOCENTER feature.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHapticFeatures'
+--
+--     [C declaration]: @SDL_SetHapticAutocenter@, defined at @SDL3\/SDL_haptic.h 1349:34@
+sDL_SetHapticAutocenter
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to set autocentering on.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@autocenter@]: value to set autocenter to (0-100).
+  -> IO BG.CBool
+sDL_SetHapticAutocenter = hs_bindgen_f0b69ddce282f135
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_PauseHaptic@
+foreign import ccall unsafe "hs_bindgen_98b65e257f12670a"
+  hs_bindgen_98b65e257f12670a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_PauseHaptic@
+hs_bindgen_98b65e257f12670a
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_98b65e257f12670a =
+  BG.fromFFIType hs_bindgen_98b65e257f12670a_base
+
+-- | Pause a haptic device.
+--
+--     Device must support the @'sDL_HAPTIC_PAUSE'@ feature. Call @SDL_ResumeHaptic()@ to resume playback.
+--
+--     Do not modify the effects nor add new ones while the device is paused. That can cause all sorts of weird errors.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResumeHaptic'
+--
+--     [C declaration]: @SDL_PauseHaptic@, defined at @SDL3\/SDL_haptic.h 1368:34@
+sDL_PauseHaptic
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to pause.
+  -> IO BG.CBool
+sDL_PauseHaptic = hs_bindgen_98b65e257f12670a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_ResumeHaptic@
+foreign import ccall unsafe "hs_bindgen_d54e536e172fdf2a"
+  hs_bindgen_d54e536e172fdf2a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_ResumeHaptic@
+hs_bindgen_d54e536e172fdf2a
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_d54e536e172fdf2a =
+  BG.fromFFIType hs_bindgen_d54e536e172fdf2a_base
+
+-- | Resume a haptic device.
+--
+--     Call to unpause after @SDL_PauseHaptic()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PauseHaptic'
+--
+--     [C declaration]: @SDL_ResumeHaptic@, defined at @SDL3\/SDL_haptic.h 1383:34@
+sDL_ResumeHaptic
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to unpause.
+  -> IO BG.CBool
+sDL_ResumeHaptic = hs_bindgen_d54e536e172fdf2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_StopHapticEffects@
+foreign import ccall unsafe "hs_bindgen_10f2c8457cada0f1"
+  hs_bindgen_10f2c8457cada0f1_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_StopHapticEffects@
+hs_bindgen_10f2c8457cada0f1
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_10f2c8457cada0f1 =
+  BG.fromFFIType hs_bindgen_10f2c8457cada0f1_base
+
+-- | Stop all the currently playing effects on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunHapticEffect', 'sDL_StopHapticEffects'
+--
+--     [C declaration]: @SDL_StopHapticEffects@, defined at @SDL3\/SDL_haptic.h 1397:34@
+sDL_StopHapticEffects
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to stop.
+  -> IO BG.CBool
+sDL_StopHapticEffects = hs_bindgen_10f2c8457cada0f1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_HapticRumbleSupported@
+foreign import ccall unsafe "hs_bindgen_0b0f01d261871ca4"
+  hs_bindgen_0b0f01d261871ca4_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_HapticRumbleSupported@
+hs_bindgen_0b0f01d261871ca4
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_0b0f01d261871ca4 =
+  BG.fromFFIType hs_bindgen_0b0f01d261871ca4_base
+
+-- | Check whether rumble is supported on a haptic device.
+--
+--     [Returns]: true if the effect is supported or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InitHapticRumble'
+--
+--     [C declaration]: @SDL_HapticRumbleSupported@, defined at @SDL3\/SDL_haptic.h 1409:34@
+sDL_HapticRumbleSupported
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: haptic device to check for rumble support.
+  -> IO BG.CBool
+sDL_HapticRumbleSupported =
+  hs_bindgen_0b0f01d261871ca4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_InitHapticRumble@
+foreign import ccall unsafe "hs_bindgen_1d3609585fc8a6db"
+  hs_bindgen_1d3609585fc8a6db_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_InitHapticRumble@
+hs_bindgen_1d3609585fc8a6db
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_1d3609585fc8a6db =
+  BG.fromFFIType hs_bindgen_1d3609585fc8a6db_base
+
+-- | Initialize a haptic device for simple rumble playback.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PlayHapticRumble', 'sDL_StopHapticRumble', 'sDL_HapticRumbleSupported'
+--
+--     [C declaration]: @SDL_InitHapticRumble@, defined at @SDL3\/SDL_haptic.h 1424:34@
+sDL_InitHapticRumble
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to initialize for simple rumble playback.
+  -> IO BG.CBool
+sDL_InitHapticRumble = hs_bindgen_1d3609585fc8a6db
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_PlayHapticRumble@
+foreign import ccall unsafe "hs_bindgen_9a900e80b5933810"
+  hs_bindgen_9a900e80b5933810_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_PlayHapticRumble@
+hs_bindgen_9a900e80b5933810
+  :: BG.Ptr SDL_Haptic
+  -> BG.CFloat
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_9a900e80b5933810 =
+  BG.fromFFIType hs_bindgen_9a900e80b5933810_base
+
+-- | Run a simple rumble effect on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InitHapticRumble', 'sDL_StopHapticRumble'
+--
+--     [C declaration]: @SDL_PlayHapticRumble@, defined at @SDL3\/SDL_haptic.h 1440:34@
+sDL_PlayHapticRumble
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to play the rumble effect on.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@strength@]: strength of the rumble to play as a 0-1 float value.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@length@]: length of the rumble to play in milliseconds.
+  -> IO BG.CBool
+sDL_PlayHapticRumble = hs_bindgen_9a900e80b5933810
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_StopHapticRumble@
+foreign import ccall unsafe "hs_bindgen_8eb60197e5125e42"
+  hs_bindgen_8eb60197e5125e42_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Haptic_Unsafe_SDL_StopHapticRumble@
+hs_bindgen_8eb60197e5125e42
+  :: BG.Ptr SDL_Haptic
+  -> IO BG.CBool
+hs_bindgen_8eb60197e5125e42 =
+  BG.fromFFIType hs_bindgen_8eb60197e5125e42_base
+
+-- | Stop the simple rumble on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PlayHapticRumble'
+--
+--     [C declaration]: @SDL_StopHapticRumble@, defined at @SDL3\/SDL_haptic.h 1453:34@
+sDL_StopHapticRumble
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to stop the rumble effect on.
+  -> IO BG.CBool
+sDL_StopHapticRumble = hs_bindgen_8eb60197e5125e42
diff --git a/src/SDL3/Sys/Bindgen/Hidapi.hs b/src/SDL3/Sys/Bindgen/Hidapi.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Hidapi.hs
@@ -0,0 +1,968 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Header file for SDL HIDAPI functions.
+--
+--     This is an adaptation of the original HIDAPI interface by Alan Ott, and includes source code licensed under the following license:
+--
+--     @
+--     HIDAPI - Multi-Platform library for
+--     communication with HID devices.
+--
+--     Copyright 2009, Alan Ott, Signal 11 Software.
+--     All Rights Reserved.
+--
+--     This software may be used by anyone for any reason so
+--     long as the copyright notice in the source files
+--     remains intact.
+--     @
+--
+--     (Note that this license is the same as item three of SDL\'s zlib license, so it adds no new requirements on the user.)
+--
+--     If you would like a version of SDL without this code, you can build SDL with SDL_HIDAPI_DISABLED defined to 1. You might want to do this for example on iOS or tvOS to avoid a dependency on the CoreBluetooth framework. An opaque handle representing an open HID device.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Hidapi (
+  SDL3.Sys.Bindgen.Hidapi.SDL_hid_device,
+  SDL3.Sys.Bindgen.Hidapi.SDL_hid_bus_type (..),
+  pattern SDL3.Sys.Bindgen.Hidapi.SDL_HID_API_BUS_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Hidapi.SDL_HID_API_BUS_USB,
+  pattern SDL3.Sys.Bindgen.Hidapi.SDL_HID_API_BUS_BLUETOOTH,
+  pattern SDL3.Sys.Bindgen.Hidapi.SDL_HID_API_BUS_I2C,
+  pattern SDL3.Sys.Bindgen.Hidapi.SDL_HID_API_BUS_SPI,
+  SDL3.Sys.Bindgen.Hidapi.SDL_hid_device_info (..),
+  SDL3.Sys.Bindgen.Hidapi.sDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @struct SDL_hid_device@, defined at @SDL3\/SDL_hidapi.h 71:16@
+data SDL_hid_device
+
+-- | HID underlying bus types.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_hid_bus_type@, defined at @SDL3\/SDL_hidapi.h 78:14@
+newtype SDL_hid_bus_type = SDL_hid_bus_type
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_hid_bus_type where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_hid_bus_type where
+  readRaw =
+    \ptr0 ->
+      pure SDL_hid_bus_type
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_hid_bus_type where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_hid_bus_type unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_hid_bus_type instance BG.Storable SDL_hid_bus_type
+
+deriving via BG.CUInt instance BG.Prim SDL_hid_bus_type
+
+instance CEnum.CEnum SDL_hid_bus_type where
+  type CEnumZ SDL_hid_bus_type = BG.CUInt
+
+  toCEnum = SDL_hid_bus_type
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_HID_API_BUS_UNKNOWN")
+        , (1, BG.singleton "SDL_HID_API_BUS_USB")
+        , (2, BG.singleton "SDL_HID_API_BUS_BLUETOOTH")
+        , (3, BG.singleton "SDL_HID_API_BUS_I2C")
+        , (4, BG.singleton "SDL_HID_API_BUS_SPI")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_hid_bus_type"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_hid_bus_type"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_hid_bus_type where
+  minDeclaredValue = SDL_HID_API_BUS_UNKNOWN
+
+  maxDeclaredValue = SDL_HID_API_BUS_SPI
+
+instance Show SDL_hid_bus_type where
+  showsPrec = CEnum.shows
+
+instance Read SDL_hid_bus_type where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_hid_bus_type ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_bus_type{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_hid_bus_type) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_hid_bus_type "unwrap" where
+  type CFieldType SDL_hid_bus_type "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Unknown bus type
+--
+--     [C declaration]: @SDL_HID_API_BUS_UNKNOWN@, defined at @SDL3\/SDL_hidapi.h 80:5@
+pattern SDL_HID_API_BUS_UNKNOWN :: SDL_hid_bus_type
+pattern SDL_HID_API_BUS_UNKNOWN = SDL_hid_bus_type 0
+
+-- | USB bus Specifications: [https:\/\/usb.org\/hid](https://usb.org/hid)
+--
+--     [C declaration]: @SDL_HID_API_BUS_USB@, defined at @SDL3\/SDL_hidapi.h 85:5@
+pattern SDL_HID_API_BUS_USB :: SDL_hid_bus_type
+pattern SDL_HID_API_BUS_USB = SDL_hid_bus_type 1
+
+-- | Bluetooth or Bluetooth LE bus Specifications: [https:\/\/www.bluetooth.com\/specifications\/specs\/human-interface-device-profile-1-1-1\/](https://www.bluetooth.com/specifications/specs/human-interface-device-profile-1-1-1/) [https:\/\/www.bluetooth.com\/specifications\/specs\/hid-service-1-0\/](https://www.bluetooth.com/specifications/specs/hid-service-1-0/) [https:\/\/www.bluetooth.com\/specifications\/specs\/hid-over-gatt-profile-1-0\/](https://www.bluetooth.com/specifications/specs/hid-over-gatt-profile-1-0/)
+--
+--     [C declaration]: @SDL_HID_API_BUS_BLUETOOTH@, defined at @SDL3\/SDL_hidapi.h 92:5@
+pattern SDL_HID_API_BUS_BLUETOOTH :: SDL_hid_bus_type
+pattern SDL_HID_API_BUS_BLUETOOTH = SDL_hid_bus_type 2
+
+-- | I2C bus Specifications: [https:\/\/docs.microsoft.com\/previous-versions\/windows\/hardware\/design\/dn642101(v=vs.85)](https://docs.microsoft.com/previous-versions/windows/hardware/design/dn642101(v=vs.85))
+--
+--     [C declaration]: @SDL_HID_API_BUS_I2C@, defined at @SDL3\/SDL_hidapi.h 97:5@
+pattern SDL_HID_API_BUS_I2C :: SDL_hid_bus_type
+pattern SDL_HID_API_BUS_I2C = SDL_hid_bus_type 3
+
+-- | SPI bus Specifications: [https:\/\/www.microsoft.com\/download\/details.aspx?id=103325](https://www.microsoft.com/download/details.aspx?id=103325)
+--
+--     [C declaration]: @SDL_HID_API_BUS_SPI@, defined at @SDL3\/SDL_hidapi.h 102:5@
+pattern SDL_HID_API_BUS_SPI :: SDL_hid_bus_type
+pattern SDL_HID_API_BUS_SPI = SDL_hid_bus_type 4
+
+-- | hidapi info structure Information about a connected HID device
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_hid_device_info@, defined at @SDL3\/SDL_hidapi.h 113:16@
+data SDL_hid_device_info = SDL_hid_device_info
+  { path :: BG.Ptr BG.CChar
+  -- ^ Platform-specific device path
+  --
+  --          [C declaration]: @path@, defined at @SDL3\/SDL_hidapi.h 116:11@
+  , vendor_id :: BG.CUShort
+  -- ^ Device Vendor ID
+  --
+  --          [C declaration]: @vendor_id@, defined at @SDL3\/SDL_hidapi.h 118:20@
+  , product_id :: BG.CUShort
+  -- ^ Device Product ID
+  --
+  --          [C declaration]: @product_id@, defined at @SDL3\/SDL_hidapi.h 120:20@
+  , serial_number :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^ Serial Number
+  --
+  --          [C declaration]: @serial_number@, defined at @SDL3\/SDL_hidapi.h 122:14@
+  , release_number :: BG.CUShort
+  -- ^ Device Release Number in binary-coded decimal, also known as Device Version Number
+  --
+  --          [C declaration]: @release_number@, defined at @SDL3\/SDL_hidapi.h 125:20@
+  , manufacturer_string :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^ Manufacturer String
+  --
+  --          [C declaration]: @manufacturer_string@, defined at @SDL3\/SDL_hidapi.h 127:14@
+  , product_string :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^ Product string
+  --
+  --          [C declaration]: @product_string@, defined at @SDL3\/SDL_hidapi.h 129:14@
+  , usage_page :: BG.CUShort
+  -- ^ Usage Page for this Device\/Interface (Windows\/Mac\/hidraw only)
+  --
+  --          [C declaration]: @usage_page@, defined at @SDL3\/SDL_hidapi.h 132:20@
+  , usage :: BG.CUShort
+  -- ^ Usage for this Device\/Interface (Windows\/Mac\/hidraw only)
+  --
+  --          [C declaration]: @usage@, defined at @SDL3\/SDL_hidapi.h 135:20@
+  , interface_number :: BG.CInt
+  -- ^ The USB interface which this logical device represents.
+  --
+  --          Valid only if the device is a USB HID device. Set to -1 in all other cases.
+  --
+  --          [C declaration]: @interface_number@, defined at @SDL3\/SDL_hidapi.h 142:9@
+  , interface_class :: BG.CInt
+  -- ^ Additional information about the USB interface. Valid on libusb and Android implementations.
+  --
+  --          [C declaration]: @interface_class@, defined at @SDL3\/SDL_hidapi.h 146:9@
+  , interface_subclass :: BG.CInt
+  -- ^ [C declaration]: @interface_subclass@, defined at @SDL3\/SDL_hidapi.h 147:9@
+  , interface_protocol :: BG.CInt
+  -- ^ [C declaration]: @interface_protocol@, defined at @SDL3\/SDL_hidapi.h 148:9@
+  , bus_type :: SDL_hid_bus_type
+  -- ^ Underlying bus type
+  --
+  --          [C declaration]: @bus_type@, defined at @SDL3\/SDL_hidapi.h 151:22@
+  , next :: BG.Ptr SDL_hid_device_info
+  -- ^ Pointer to the next device
+  --
+  --          [C declaration]: @next@, defined at @SDL3\/SDL_hidapi.h 154:33@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_hid_device_info where
+  staticSizeOf = \_ -> (80 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_hid_device_info where
+  readRaw =
+    \ptr0 ->
+      pure SDL_hid_device_info
+        <*> HasCField.readRaw (BG.Proxy @"path") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"vendor_id") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"product_id") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"serial_number") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"release_number") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"manufacturer_string") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"product_string") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"usage_page") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"usage") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"interface_number") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"interface_class") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"interface_subclass") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"interface_protocol") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"bus_type") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"next") ptr0
+
+instance Marshal.WriteRaw SDL_hid_device_info where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_hid_device_info
+            path2
+            vendor_id3
+            product_id4
+            serial_number5
+            release_number6
+            manufacturer_string7
+            product_string8
+            usage_page9
+            usage10
+            interface_number11
+            interface_class12
+            interface_subclass13
+            interface_protocol14
+            bus_type15
+            next16 ->
+              HasCField.writeRaw (BG.Proxy @"path") ptr0 path2
+                >> HasCField.writeRaw (BG.Proxy @"vendor_id") ptr0 vendor_id3
+                >> HasCField.writeRaw (BG.Proxy @"product_id") ptr0 product_id4
+                >> HasCField.writeRaw (BG.Proxy @"serial_number") ptr0 serial_number5
+                >> HasCField.writeRaw (BG.Proxy @"release_number") ptr0 release_number6
+                >> HasCField.writeRaw (BG.Proxy @"manufacturer_string") ptr0 manufacturer_string7
+                >> HasCField.writeRaw (BG.Proxy @"product_string") ptr0 product_string8
+                >> HasCField.writeRaw (BG.Proxy @"usage_page") ptr0 usage_page9
+                >> HasCField.writeRaw (BG.Proxy @"usage") ptr0 usage10
+                >> HasCField.writeRaw (BG.Proxy @"interface_number") ptr0 interface_number11
+                >> HasCField.writeRaw (BG.Proxy @"interface_class") ptr0 interface_class12
+                >> HasCField.writeRaw (BG.Proxy @"interface_subclass") ptr0 interface_subclass13
+                >> HasCField.writeRaw (BG.Proxy @"interface_protocol") ptr0 interface_protocol14
+                >> HasCField.writeRaw (BG.Proxy @"bus_type") ptr0 bus_type15
+                >> HasCField.writeRaw (BG.Proxy @"next") ptr0 next16
+
+deriving via Marshal.EquivStorable SDL_hid_device_info instance BG.Storable SDL_hid_device_info
+
+instance
+  (ty ~ BG.Ptr BG.CChar)
+  => BG.CompatHasField.HasField "path" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { path = y1
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"path" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.CChar)
+  => BG.HasField "path" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"path")
+
+instance HasCField.HasCField SDL_hid_device_info "path" where
+  type
+    CFieldType SDL_hid_device_info "path" =
+      BG.Ptr BG.CChar
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CUShort)
+  => BG.CompatHasField.HasField "vendor_id" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { vendor_id = y1
+            , path = BG.getField @"path" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"vendor_id" x0
+      )
+
+instance
+  (ty ~ BG.CUShort)
+  => BG.HasField "vendor_id" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"vendor_id")
+
+instance HasCField.HasCField SDL_hid_device_info "vendor_id" where
+  type
+    CFieldType SDL_hid_device_info "vendor_id" =
+      BG.CUShort
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.CUShort)
+  => BG.CompatHasField.HasField "product_id" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { product_id = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"product_id" x0
+      )
+
+instance
+  (ty ~ BG.CUShort)
+  => BG.HasField "product_id" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"product_id")
+
+instance HasCField.HasCField SDL_hid_device_info "product_id" where
+  type
+    CFieldType SDL_hid_device_info "product_id" =
+      BG.CUShort
+
+  offset# = \_ -> \_ -> 10
+
+instance
+  (ty ~ BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+  => BG.CompatHasField.HasField "serial_number" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { serial_number = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"serial_number" x0
+      )
+
+instance
+  (ty ~ BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+  => BG.HasField "serial_number" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"serial_number")
+
+instance HasCField.HasCField SDL_hid_device_info "serial_number" where
+  type
+    CFieldType SDL_hid_device_info "serial_number" =
+      BG.Ptr HsBindgen.Runtime.LibC.CWchar
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.CUShort)
+  => BG.CompatHasField.HasField "release_number" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { release_number = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"release_number" x0
+      )
+
+instance
+  (ty ~ BG.CUShort)
+  => BG.HasField "release_number" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"release_number")
+
+instance HasCField.HasCField SDL_hid_device_info "release_number" where
+  type
+    CFieldType SDL_hid_device_info "release_number" =
+      BG.CUShort
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+  => BG.CompatHasField.HasField "manufacturer_string" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { manufacturer_string = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"manufacturer_string" x0
+      )
+
+instance
+  (ty ~ BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+  => BG.HasField "manufacturer_string" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"manufacturer_string")
+
+instance HasCField.HasCField SDL_hid_device_info "manufacturer_string" where
+  type
+    CFieldType SDL_hid_device_info "manufacturer_string" =
+      BG.Ptr HsBindgen.Runtime.LibC.CWchar
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+  => BG.CompatHasField.HasField "product_string" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { product_string = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"product_string" x0
+      )
+
+instance
+  (ty ~ BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+  => BG.HasField "product_string" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"product_string")
+
+instance HasCField.HasCField SDL_hid_device_info "product_string" where
+  type
+    CFieldType SDL_hid_device_info "product_string" =
+      BG.Ptr HsBindgen.Runtime.LibC.CWchar
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ BG.CUShort)
+  => BG.CompatHasField.HasField "usage_page" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { usage_page = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"usage_page" x0
+      )
+
+instance
+  (ty ~ BG.CUShort)
+  => BG.HasField "usage_page" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"usage_page")
+
+instance HasCField.HasCField SDL_hid_device_info "usage_page" where
+  type
+    CFieldType SDL_hid_device_info "usage_page" =
+      BG.CUShort
+
+  offset# = \_ -> \_ -> 48
+
+instance
+  (ty ~ BG.CUShort)
+  => BG.CompatHasField.HasField "usage" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { usage = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"usage" x0
+      )
+
+instance
+  (ty ~ BG.CUShort)
+  => BG.HasField "usage" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"usage")
+
+instance HasCField.HasCField SDL_hid_device_info "usage" where
+  type
+    CFieldType SDL_hid_device_info "usage" =
+      BG.CUShort
+
+  offset# = \_ -> \_ -> 50
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "interface_number" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { interface_number = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"interface_number" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "interface_number" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"interface_number")
+
+instance HasCField.HasCField SDL_hid_device_info "interface_number" where
+  type
+    CFieldType SDL_hid_device_info "interface_number" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 52
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "interface_class" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { interface_class = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"interface_class" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "interface_class" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"interface_class")
+
+instance HasCField.HasCField SDL_hid_device_info "interface_class" where
+  type
+    CFieldType SDL_hid_device_info "interface_class" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 56
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "interface_subclass" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { interface_subclass = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"interface_subclass" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "interface_subclass" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"interface_subclass")
+
+instance HasCField.HasCField SDL_hid_device_info "interface_subclass" where
+  type
+    CFieldType SDL_hid_device_info "interface_subclass" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 60
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "interface_protocol" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { interface_protocol = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , bus_type = BG.getField @"bus_type" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"interface_protocol" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "interface_protocol" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"interface_protocol")
+
+instance HasCField.HasCField SDL_hid_device_info "interface_protocol" where
+  type
+    CFieldType SDL_hid_device_info "interface_protocol" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 64
+
+instance
+  (ty ~ SDL_hid_bus_type)
+  => BG.CompatHasField.HasField "bus_type" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { bus_type = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , next = BG.getField @"next" x0
+            }
+      , BG.getField @"bus_type" x0
+      )
+
+instance
+  (ty ~ SDL_hid_bus_type)
+  => BG.HasField "bus_type" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"bus_type")
+
+instance HasCField.HasCField SDL_hid_device_info "bus_type" where
+  type
+    CFieldType SDL_hid_device_info "bus_type" =
+      SDL_hid_bus_type
+
+  offset# = \_ -> \_ -> 68
+
+instance
+  (ty ~ BG.Ptr SDL_hid_device_info)
+  => BG.CompatHasField.HasField "next" SDL_hid_device_info ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_hid_device_info
+            { next = y1
+            , path = BG.getField @"path" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , serial_number = BG.getField @"serial_number" x0
+            , release_number = BG.getField @"release_number" x0
+            , manufacturer_string = BG.getField @"manufacturer_string" x0
+            , product_string = BG.getField @"product_string" x0
+            , usage_page = BG.getField @"usage_page" x0
+            , usage = BG.getField @"usage" x0
+            , interface_number = BG.getField @"interface_number" x0
+            , interface_class = BG.getField @"interface_class" x0
+            , interface_subclass = BG.getField @"interface_subclass" x0
+            , interface_protocol = BG.getField @"interface_protocol" x0
+            , bus_type = BG.getField @"bus_type" x0
+            }
+      , BG.getField @"next" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_hid_device_info)
+  => BG.HasField "next" (BG.Ptr SDL_hid_device_info) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"next")
+
+instance HasCField.HasCField SDL_hid_device_info "next" where
+  type
+    CFieldType SDL_hid_device_info "next" =
+      BG.Ptr SDL_hid_device_info
+
+  offset# = \_ -> \_ -> 72
+
+-- | [C declaration]: @macro SDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER@, literal @\"SDL.hidapi.libusb.device.handle\"@, defined at @SDL3\/SDL_hidapi.h 303:9@
+sDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER :: BG.ByteString
+sDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x68
+    , 0x69
+    , 0x64
+    , 0x61
+    , 0x70
+    , 0x69
+    , 0x2E
+    , 0x6C
+    , 0x69
+    , 0x62
+    , 0x75
+    , 0x73
+    , 0x62
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x68
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x6C
+    , 0x65
+    ]
diff --git a/src/SDL3/Sys/Bindgen/Hidapi/FunPtr.hs b/src/SDL3/Sys/Bindgen/Hidapi/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Hidapi/FunPtr.hs
@@ -0,0 +1,1041 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Hidapi.FunPtr (
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_init,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_exit,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_device_change_count,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_enumerate,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_free_enumeration,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_open,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_open_path,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_get_properties,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_write,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_read_timeout,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_read,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_set_nonblocking,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_send_feature_report,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_get_feature_report,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_get_input_report,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_close,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_get_manufacturer_string,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_get_product_string,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_get_serial_number_string,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_get_indexed_string,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_get_device_info,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_get_report_descriptor,
+  SDL3.Sys.Bindgen.Hidapi.FunPtr.sDL_hid_ble_scan,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Hidapi
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_hidapi.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_init */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_32091c4e86355dc7 (void)) (void)"
+         , "{"
+         , "  return &SDL_hid_init;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_exit */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_26665e772cf695e7 (void)) (void)"
+         , "{"
+         , "  return &SDL_hid_exit;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_device_change_count */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_1ed9703a6ccb5ef9 (void)) (void)"
+         , "{"
+         , "  return &SDL_hid_device_change_count;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_enumerate */"
+         , "__attribute__ ((const))"
+         , "SDL_hid_device_info *(*hs_bindgen_4922fe8bf9d9ed1b (void)) ("
+         , "  unsigned short arg1,"
+         , "  unsigned short arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_enumerate;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_free_enumeration */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_3b866ca94af10a38 (void)) ("
+         , "  SDL_hid_device_info *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_free_enumeration;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_open */"
+         , "__attribute__ ((const))"
+         , "SDL_hid_device *(*hs_bindgen_8d0a3f3bb4b21256 (void)) ("
+         , "  unsigned short arg1,"
+         , "  unsigned short arg2,"
+         , "  wchar_t const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_open;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_open_path */"
+         , "__attribute__ ((const))"
+         , "SDL_hid_device *(*hs_bindgen_39c4427d9dd0caf0 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_open_path;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef Uint32 SDL_PropertiesID;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_properties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_4b11bd7f6e7541a7 (void)) ("
+         , "  SDL_hid_device *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_hid_get_properties;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_hid_get_properties requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_write */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_1bf3f0f5190069e0 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_write;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_read_timeout */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_5383d32d2b5eeb41 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_read_timeout;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_read */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_7c7263baa49b4db7 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_read;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_set_nonblocking */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_bc3545d8ad76b094 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_set_nonblocking;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_send_feature_report */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_4dc350ff8dbbd851 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_send_feature_report;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_feature_report */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_d11cee38ea38b8b0 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_get_feature_report;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_input_report */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_f7e6c98c847d43b6 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_get_input_report;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_close */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_a3778a783d0b375c (void)) ("
+         , "  SDL_hid_device *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_close;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_manufacturer_string */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_2886098b9152b5a2 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  wchar_t *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_get_manufacturer_string;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_product_string */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_e9dcf914acc87392 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  wchar_t *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_get_product_string;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_serial_number_string */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_6d6557d49ee90dad (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  wchar_t *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_get_serial_number_string;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_indexed_string */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_5cef67d9ce2e1563 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  signed int arg2,"
+         , "  wchar_t *arg3,"
+         , "  size_t arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_get_indexed_string;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_device_info */"
+         , "__attribute__ ((const))"
+         , "SDL_hid_device_info *(*hs_bindgen_9b2d929812d327f4 (void)) ("
+         , "  SDL_hid_device *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_get_device_info;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_report_descriptor */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_056ff18230bbb5e2 (void)) ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_get_report_descriptor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_ble_scan */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_7634f6f83062373e (void)) ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_hid_ble_scan;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_init@
+foreign import ccall unsafe "hs_bindgen_32091c4e86355dc7"
+  hs_bindgen_32091c4e86355dc7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_init@
+hs_bindgen_32091c4e86355dc7 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_32091c4e86355dc7 =
+  BG.fromFFIType hs_bindgen_32091c4e86355dc7_base
+
+{-# NOINLINE sDL_hid_init #-}
+
+-- | Initialize the HIDAPI library.
+--
+--     This function initializes the HIDAPI library. Calling it is not strictly necessary, as it will be called automatically by @SDL_hid_enumerate()@ and any of the SDL_hid_open_*() functions if it is needed. This function should be called at the beginning of execution however, if there is a chance of HIDAPI handles being opened by different threads simultaneously.
+--
+--     Each call to this function should have a matching call to @SDL_hid_exit()@
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_exit'
+--
+--     [C declaration]: @SDL_hid_init@, defined at @SDL3\/SDL_hidapi.h 177:33@
+sDL_hid_init :: BG.FunPtr (IO BG.CInt)
+sDL_hid_init =
+  BG.unsafePerformIO hs_bindgen_32091c4e86355dc7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_exit@
+foreign import ccall unsafe "hs_bindgen_26665e772cf695e7"
+  hs_bindgen_26665e772cf695e7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_exit@
+hs_bindgen_26665e772cf695e7 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_26665e772cf695e7 =
+  BG.fromFFIType hs_bindgen_26665e772cf695e7_base
+
+{-# NOINLINE sDL_hid_exit #-}
+
+-- | Finalize the HIDAPI library.
+--
+--     This function frees all of the static data associated with HIDAPI. It should be called at the end of execution to avoid memory leaks.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_init'
+--
+--     [C declaration]: @SDL_hid_exit@, defined at @SDL3\/SDL_hidapi.h 192:33@
+sDL_hid_exit :: BG.FunPtr (IO BG.CInt)
+sDL_hid_exit =
+  BG.unsafePerformIO hs_bindgen_26665e772cf695e7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_device_change_count@
+foreign import ccall unsafe "hs_bindgen_1ed9703a6ccb5ef9"
+  hs_bindgen_1ed9703a6ccb5ef9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_device_change_count@
+hs_bindgen_1ed9703a6ccb5ef9 :: IO (BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.Uint32))
+hs_bindgen_1ed9703a6ccb5ef9 =
+  BG.fromFFIType hs_bindgen_1ed9703a6ccb5ef9_base
+
+{-# NOINLINE sDL_hid_device_change_count #-}
+
+-- | Check to see if devices may have been added or removed.
+--
+--     Enumerating the HID devices is an expensive operation, so you can call this to see if there have been any system device changes since the last call to this function. A change in the counter returned doesn\'t necessarily mean that anything has changed, but you can call @SDL_hid_enumerate()@ to get an updated device list.
+--
+--     Calling this function for the first time may cause a thread or other system resource to be allocated to track device change notifications.
+--
+--     [Returns]: a change counter that is incremented with each potential device change, or 0 if device change detection isn\'t available.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_enumerate'
+--
+--     [C declaration]: @SDL_hid_device_change_count@, defined at @SDL3\/SDL_hidapi.h 213:36@
+sDL_hid_device_change_count :: BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+sDL_hid_device_change_count =
+  BG.unsafePerformIO hs_bindgen_1ed9703a6ccb5ef9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_enumerate@
+foreign import ccall unsafe "hs_bindgen_4922fe8bf9d9ed1b"
+  hs_bindgen_4922fe8bf9d9ed1b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_enumerate@
+hs_bindgen_4922fe8bf9d9ed1b
+  :: IO (BG.FunPtr (BG.CUShort -> BG.CUShort -> IO (BG.Ptr SDL_hid_device_info)))
+hs_bindgen_4922fe8bf9d9ed1b =
+  BG.fromFFIType hs_bindgen_4922fe8bf9d9ed1b_base
+
+{-# NOINLINE sDL_hid_enumerate #-}
+
+-- | Enumerate the HID Devices.
+--
+--     This function returns a linked list of all the HID devices attached to the system which match vendor_id and product_id. If @vendor_id@ is set to 0 then any vendor matches. If @product_id@ is set to 0 then any product matches. If @vendor_id@ and @product_id@ are both set to 0, then all HID devices will be returned.
+--
+--     By default SDL will only enumerate controllers, to reduce risk of hanging or crashing on bad drivers, but SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS can be set to \"0\" to enumerate all HID devices.
+--
+--     [@vendor_id@]: the Vendor ID (VID) of the types of device to open, or 0 to match any vendor.
+--
+--     [@product_id@]: the Product ID (PID) of the types of device to open, or 0 to match any product.
+--
+--     [Returns]: a pointer to a linked list of type 'SDL_hid_device_info', containing information about the HID devices attached to the system, or NULL in the case of failure. Free this linked list by calling @SDL_hid_free_enumeration()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_device_change_count'
+--
+--     [C declaration]: @SDL_hid_enumerate@, defined at @SDL3\/SDL_hidapi.h 241:51@
+sDL_hid_enumerate :: BG.FunPtr (BG.CUShort -> BG.CUShort -> IO (BG.Ptr SDL_hid_device_info))
+sDL_hid_enumerate =
+  BG.unsafePerformIO hs_bindgen_4922fe8bf9d9ed1b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_free_enumeration@
+foreign import ccall unsafe "hs_bindgen_3b866ca94af10a38"
+  hs_bindgen_3b866ca94af10a38_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_free_enumeration@
+hs_bindgen_3b866ca94af10a38 :: IO (BG.FunPtr (BG.Ptr SDL_hid_device_info -> IO ()))
+hs_bindgen_3b866ca94af10a38 =
+  BG.fromFFIType hs_bindgen_3b866ca94af10a38_base
+
+{-# NOINLINE sDL_hid_free_enumeration #-}
+
+-- | Free an enumeration linked list.
+--
+--     This function frees a linked list created by @SDL_hid_enumerate()@.
+--
+--     [@devs@]: pointer to a list of struct_device returned from @SDL_hid_enumerate()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_free_enumeration@, defined at @SDL3\/SDL_hidapi.h 253:34@
+sDL_hid_free_enumeration :: BG.FunPtr (BG.Ptr SDL_hid_device_info -> IO ())
+sDL_hid_free_enumeration =
+  BG.unsafePerformIO hs_bindgen_3b866ca94af10a38
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_open@
+foreign import ccall unsafe "hs_bindgen_8d0a3f3bb4b21256"
+  hs_bindgen_8d0a3f3bb4b21256_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_open@
+hs_bindgen_8d0a3f3bb4b21256
+  :: IO
+       ( BG.FunPtr
+           ( BG.CUShort
+             -> BG.CUShort
+             -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> IO (BG.Ptr SDL_hid_device)
+           )
+       )
+hs_bindgen_8d0a3f3bb4b21256 =
+  BG.fromFFIType hs_bindgen_8d0a3f3bb4b21256_base
+
+{-# NOINLINE sDL_hid_open #-}
+
+-- | Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally a serial number.
+--
+--     If @serial_number@ is NULL, the first device with the specified VID and PID is opened.
+--
+--     [@vendor_id@]: the Vendor ID (VID) of the device to open.
+--
+--     [@product_id@]: the Product ID (PID) of the device to open.
+--
+--     [@serial_number@]: the Serial Number of the device to open (Optionally NULL).
+--
+--     [Returns]: a pointer to a 'SDL_hid_device' object on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_open@, defined at @SDL3\/SDL_hidapi.h 271:46@
+sDL_hid_open
+  :: BG.FunPtr
+       ( BG.CUShort
+         -> BG.CUShort
+         -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> IO (BG.Ptr SDL_hid_device)
+       )
+sDL_hid_open =
+  BG.unsafePerformIO hs_bindgen_8d0a3f3bb4b21256
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_open_path@
+foreign import ccall unsafe "hs_bindgen_39c4427d9dd0caf0"
+  hs_bindgen_39c4427d9dd0caf0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_open_path@
+hs_bindgen_39c4427d9dd0caf0
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_hid_device)))
+hs_bindgen_39c4427d9dd0caf0 =
+  BG.fromFFIType hs_bindgen_39c4427d9dd0caf0_base
+
+{-# NOINLINE sDL_hid_open_path #-}
+
+-- | Open a HID device by its path name.
+--
+--     The path name be determined by calling @SDL_hid_enumerate()@, or a platform-specific path name can be used (eg: \/dev\/hidraw0 on Linux).
+--
+--     [@path@]: the path name of the device to open.
+--
+--     [Returns]: a pointer to a 'SDL_hid_device' object on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_open_path@, defined at @SDL3\/SDL_hidapi.h 285:46@
+sDL_hid_open_path :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_hid_device))
+sDL_hid_open_path =
+  BG.unsafePerformIO hs_bindgen_39c4427d9dd0caf0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_properties@
+foreign import ccall unsafe "hs_bindgen_4b11bd7f6e7541a7"
+  hs_bindgen_4b11bd7f6e7541a7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_properties@
+hs_bindgen_4b11bd7f6e7541a7
+  :: IO (BG.FunPtr (BG.Ptr SDL_hid_device -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_4b11bd7f6e7541a7 =
+  BG.fromFFIType hs_bindgen_4b11bd7f6e7541a7_base
+
+{-# NOINLINE sDL_hid_get_properties #-}
+
+-- | Get the properties associated with an 'SDL_hid_device'.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER'@: the libusb_device_handle associated with the device, if it was opened using libusb.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_hid_get_properties@, defined at @SDL3\/SDL_hidapi.h 301:46@
+sDL_hid_get_properties
+  :: BG.FunPtr (BG.Ptr SDL_hid_device -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_hid_get_properties =
+  BG.unsafePerformIO hs_bindgen_4b11bd7f6e7541a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_write@
+foreign import ccall unsafe "hs_bindgen_1bf3f0f5190069e0"
+  hs_bindgen_1bf3f0f5190069e0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_write@
+hs_bindgen_1bf3f0f5190069e0
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_hid_device -> PtrConst.PtrConst BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt)
+       )
+hs_bindgen_1bf3f0f5190069e0 =
+  BG.fromFFIType hs_bindgen_1bf3f0f5190069e0_base
+
+{-# NOINLINE sDL_hid_write #-}
+
+-- | Write an Output report to a HID device.
+--
+--     The first byte of @data@ must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to @SDL_hid_write()@ will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to @SDL_hid_write()@, the Report ID (or 0x0, for devices with a single report), followed by the report data (16 bytes). In this example, the length passed in would be 17.
+--
+--     @SDL_hid_write()@ will send the data on the first OUT endpoint, if one exists. If it does not, it will send the data through the Control Endpoint (Endpoint 0).
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@data@]: the data to send, including the report number as the first byte.
+--
+--     [@length@]: the length in bytes of the data to send.
+--
+--     [Returns]: the actual number of bytes written and -1 on on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_write@, defined at @SDL3\/SDL_hidapi.h 330:33@
+sDL_hid_write
+  :: BG.FunPtr
+       (BG.Ptr SDL_hid_device -> PtrConst.PtrConst BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt)
+sDL_hid_write =
+  BG.unsafePerformIO hs_bindgen_1bf3f0f5190069e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_read_timeout@
+foreign import ccall unsafe "hs_bindgen_5383d32d2b5eeb41"
+  hs_bindgen_5383d32d2b5eeb41_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_read_timeout@
+hs_bindgen_5383d32d2b5eeb41
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_hid_device -> BG.Ptr BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> BG.CInt -> IO BG.CInt)
+       )
+hs_bindgen_5383d32d2b5eeb41 =
+  BG.fromFFIType hs_bindgen_5383d32d2b5eeb41_base
+
+{-# NOINLINE sDL_hid_read_timeout #-}
+
+-- | Read an Input report from a HID device with timeout.
+--
+--     Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@data@]: a buffer to put the read data into.
+--
+--     [@length@]: the number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number.
+--
+--     [@milliseconds@]: timeout in milliseconds or -1 for blocking wait.
+--
+--     [Returns]: the actual number of bytes read and -1 on on failure; call SDL_GetError() for more information. If no packet was available to be read within the timeout period, this function returns 0.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_read_timeout@, defined at @SDL3\/SDL_hidapi.h 351:33@
+sDL_hid_read_timeout
+  :: BG.FunPtr
+       (BG.Ptr SDL_hid_device -> BG.Ptr BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> BG.CInt -> IO BG.CInt)
+sDL_hid_read_timeout =
+  BG.unsafePerformIO hs_bindgen_5383d32d2b5eeb41
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_read@
+foreign import ccall unsafe "hs_bindgen_7c7263baa49b4db7"
+  hs_bindgen_7c7263baa49b4db7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_read@
+hs_bindgen_7c7263baa49b4db7
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_hid_device -> BG.Ptr BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt))
+hs_bindgen_7c7263baa49b4db7 =
+  BG.fromFFIType hs_bindgen_7c7263baa49b4db7_base
+
+{-# NOINLINE sDL_hid_read #-}
+
+-- | Read an Input report from a HID device.
+--
+--     Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@data@]: a buffer to put the read data into.
+--
+--     [@length@]: the number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number.
+--
+--     [Returns]: the actual number of bytes read and -1 on failure; call SDL_GetError() for more information. If no packet was available to be read and the handle is in non-blocking mode, this function returns 0.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_read@, defined at @SDL3\/SDL_hidapi.h 372:33@
+sDL_hid_read
+  :: BG.FunPtr (BG.Ptr SDL_hid_device -> BG.Ptr BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt)
+sDL_hid_read =
+  BG.unsafePerformIO hs_bindgen_7c7263baa49b4db7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_set_nonblocking@
+foreign import ccall unsafe "hs_bindgen_bc3545d8ad76b094"
+  hs_bindgen_bc3545d8ad76b094_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_set_nonblocking@
+hs_bindgen_bc3545d8ad76b094 :: IO (BG.FunPtr (BG.Ptr SDL_hid_device -> BG.CInt -> IO BG.CInt))
+hs_bindgen_bc3545d8ad76b094 =
+  BG.fromFFIType hs_bindgen_bc3545d8ad76b094_base
+
+{-# NOINLINE sDL_hid_set_nonblocking #-}
+
+-- | Set the device handle to be non-blocking.
+--
+--     In non-blocking mode calls to @SDL_hid_read()@ will return immediately with a value of 0 if there is no data to be read. In blocking mode, @SDL_hid_read()@ will wait (block) until there is data to read before returning.
+--
+--     Nonblocking can be turned on and off at any time.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@nonblock@]: enable or not the nonblocking reads - 1 to enable nonblocking - 0 to disable nonblocking.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_set_nonblocking@, defined at @SDL3\/SDL_hidapi.h 391:33@
+sDL_hid_set_nonblocking :: BG.FunPtr (BG.Ptr SDL_hid_device -> BG.CInt -> IO BG.CInt)
+sDL_hid_set_nonblocking =
+  BG.unsafePerformIO hs_bindgen_bc3545d8ad76b094
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_send_feature_report@
+foreign import ccall unsafe "hs_bindgen_4dc350ff8dbbd851"
+  hs_bindgen_4dc350ff8dbbd851_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_send_feature_report@
+hs_bindgen_4dc350ff8dbbd851
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_hid_device -> PtrConst.PtrConst BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt)
+       )
+hs_bindgen_4dc350ff8dbbd851 =
+  BG.fromFFIType hs_bindgen_4dc350ff8dbbd851_base
+
+{-# NOINLINE sDL_hid_send_feature_report #-}
+
+-- | Send a Feature report to the device.
+--
+--     Feature reports are sent over the Control endpoint as a Set_Report transfer. The first byte of @data@ must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to @SDL_hid_send_feature_report()@ will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to @SDL_hid_send_feature_report()@: the Report ID (or 0x0, for devices which do not use numbered reports), followed by the report data (16 bytes). In this example, the length passed in would be 17.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@data@]: the data to send, including the report number as the first byte.
+--
+--     [@length@]: the length in bytes of the data to send, including the report number.
+--
+--     [Returns]: the actual number of bytes written and -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_send_feature_report@, defined at @SDL3\/SDL_hidapi.h 416:33@
+sDL_hid_send_feature_report
+  :: BG.FunPtr
+       (BG.Ptr SDL_hid_device -> PtrConst.PtrConst BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt)
+sDL_hid_send_feature_report =
+  BG.unsafePerformIO hs_bindgen_4dc350ff8dbbd851
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_feature_report@
+foreign import ccall unsafe "hs_bindgen_d11cee38ea38b8b0"
+  hs_bindgen_d11cee38ea38b8b0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_feature_report@
+hs_bindgen_d11cee38ea38b8b0
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_hid_device -> BG.Ptr BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt))
+hs_bindgen_d11cee38ea38b8b0 =
+  BG.fromFFIType hs_bindgen_d11cee38ea38b8b0_base
+
+{-# NOINLINE sDL_hid_get_feature_report #-}
+
+-- | Get a feature report from a HID device.
+--
+--     Set the first byte of @data@ to the Report ID of the report to be read. Make sure to allow space for this extra byte in @data@. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1].
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@data@]: a buffer to put the read data into, including the Report ID. Set the first byte of @data@ to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports.
+--
+--     [@length@]: the number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report.
+--
+--     [Returns]: the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_feature_report@, defined at @SDL3\/SDL_hidapi.h 439:33@
+sDL_hid_get_feature_report
+  :: BG.FunPtr (BG.Ptr SDL_hid_device -> BG.Ptr BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt)
+sDL_hid_get_feature_report =
+  BG.unsafePerformIO hs_bindgen_d11cee38ea38b8b0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_input_report@
+foreign import ccall unsafe "hs_bindgen_f7e6c98c847d43b6"
+  hs_bindgen_f7e6c98c847d43b6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_input_report@
+hs_bindgen_f7e6c98c847d43b6
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_hid_device -> BG.Ptr BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt))
+hs_bindgen_f7e6c98c847d43b6 =
+  BG.fromFFIType hs_bindgen_f7e6c98c847d43b6_base
+
+{-# NOINLINE sDL_hid_get_input_report #-}
+
+-- | Get an input report from a HID device.
+--
+--     Set the first byte of @data@ to the Report ID of the report to be read. Make sure to allow space for this extra byte in @data@. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1].
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@data@]: a buffer to put the read data into, including the Report ID. Set the first byte of @data@ to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports.
+--
+--     [@length@]: the number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report.
+--
+--     [Returns]: the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_input_report@, defined at @SDL3\/SDL_hidapi.h 462:33@
+sDL_hid_get_input_report
+  :: BG.FunPtr (BG.Ptr SDL_hid_device -> BG.Ptr BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt)
+sDL_hid_get_input_report =
+  BG.unsafePerformIO hs_bindgen_f7e6c98c847d43b6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_close@
+foreign import ccall unsafe "hs_bindgen_a3778a783d0b375c"
+  hs_bindgen_a3778a783d0b375c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_close@
+hs_bindgen_a3778a783d0b375c :: IO (BG.FunPtr (BG.Ptr SDL_hid_device -> IO BG.CInt))
+hs_bindgen_a3778a783d0b375c =
+  BG.fromFFIType hs_bindgen_a3778a783d0b375c_base
+
+{-# NOINLINE sDL_hid_close #-}
+
+-- | Close a HID device.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_close@, defined at @SDL3\/SDL_hidapi.h 473:33@
+sDL_hid_close :: BG.FunPtr (BG.Ptr SDL_hid_device -> IO BG.CInt)
+sDL_hid_close =
+  BG.unsafePerformIO hs_bindgen_a3778a783d0b375c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_manufacturer_string@
+foreign import ccall unsafe "hs_bindgen_2886098b9152b5a2"
+  hs_bindgen_2886098b9152b5a2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_manufacturer_string@
+hs_bindgen_2886098b9152b5a2
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_hid_device
+             -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_2886098b9152b5a2 =
+  BG.fromFFIType hs_bindgen_2886098b9152b5a2_base
+
+{-# NOINLINE sDL_hid_get_manufacturer_string #-}
+
+-- | Get The Manufacturer String from a HID device.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@string@]: a wide string buffer to put the data into.
+--
+--     [@maxlen@]: the length of the buffer in multiples of wchar_t.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_manufacturer_string@, defined at @SDL3\/SDL_hidapi.h 486:33@
+sDL_hid_get_manufacturer_string
+  :: BG.FunPtr
+       ( BG.Ptr SDL_hid_device
+         -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CInt
+       )
+sDL_hid_get_manufacturer_string =
+  BG.unsafePerformIO hs_bindgen_2886098b9152b5a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_product_string@
+foreign import ccall unsafe "hs_bindgen_e9dcf914acc87392"
+  hs_bindgen_e9dcf914acc87392_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_product_string@
+hs_bindgen_e9dcf914acc87392
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_hid_device
+             -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_e9dcf914acc87392 =
+  BG.fromFFIType hs_bindgen_e9dcf914acc87392_base
+
+{-# NOINLINE sDL_hid_get_product_string #-}
+
+-- | Get The Product String from a HID device.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@string@]: a wide string buffer to put the data into.
+--
+--     [@maxlen@]: the length of the buffer in multiples of wchar_t.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_product_string@, defined at @SDL3\/SDL_hidapi.h 499:33@
+sDL_hid_get_product_string
+  :: BG.FunPtr
+       ( BG.Ptr SDL_hid_device
+         -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CInt
+       )
+sDL_hid_get_product_string =
+  BG.unsafePerformIO hs_bindgen_e9dcf914acc87392
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_serial_number_string@
+foreign import ccall unsafe "hs_bindgen_6d6557d49ee90dad"
+  hs_bindgen_6d6557d49ee90dad_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_serial_number_string@
+hs_bindgen_6d6557d49ee90dad
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_hid_device
+             -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_6d6557d49ee90dad =
+  BG.fromFFIType hs_bindgen_6d6557d49ee90dad_base
+
+{-# NOINLINE sDL_hid_get_serial_number_string #-}
+
+-- | Get The Serial Number String from a HID device.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@string@]: a wide string buffer to put the data into.
+--
+--     [@maxlen@]: the length of the buffer in multiples of wchar_t.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_serial_number_string@, defined at @SDL3\/SDL_hidapi.h 512:33@
+sDL_hid_get_serial_number_string
+  :: BG.FunPtr
+       ( BG.Ptr SDL_hid_device
+         -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CInt
+       )
+sDL_hid_get_serial_number_string =
+  BG.unsafePerformIO hs_bindgen_6d6557d49ee90dad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_indexed_string@
+foreign import ccall unsafe "hs_bindgen_5cef67d9ce2e1563"
+  hs_bindgen_5cef67d9ce2e1563_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_indexed_string@
+hs_bindgen_5cef67d9ce2e1563
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_hid_device
+             -> BG.CInt
+             -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_5cef67d9ce2e1563 =
+  BG.fromFFIType hs_bindgen_5cef67d9ce2e1563_base
+
+{-# NOINLINE sDL_hid_get_indexed_string #-}
+
+-- | Get a string from a HID device, based on its string index.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@string_index@]: the index of the string to get.
+--
+--     [@string@]: a wide string buffer to put the data into.
+--
+--     [@maxlen@]: the length of the buffer in multiples of wchar_t.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_indexed_string@, defined at @SDL3\/SDL_hidapi.h 526:33@
+sDL_hid_get_indexed_string
+  :: BG.FunPtr
+       ( BG.Ptr SDL_hid_device
+         -> BG.CInt
+         -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CInt
+       )
+sDL_hid_get_indexed_string =
+  BG.unsafePerformIO hs_bindgen_5cef67d9ce2e1563
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_device_info@
+foreign import ccall unsafe "hs_bindgen_9b2d929812d327f4"
+  hs_bindgen_9b2d929812d327f4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_device_info@
+hs_bindgen_9b2d929812d327f4
+  :: IO (BG.FunPtr (BG.Ptr SDL_hid_device -> IO (BG.Ptr SDL_hid_device_info)))
+hs_bindgen_9b2d929812d327f4 =
+  BG.fromFFIType hs_bindgen_9b2d929812d327f4_base
+
+{-# NOINLINE sDL_hid_get_device_info #-}
+
+-- | Get the device info from a HID device.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [Returns]: a pointer to the 'SDL_hid_device_info' for this hid_device or NULL on failure; call SDL_GetError() for more information. This struct is valid until the device is closed with @SDL_hid_close()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_device_info@, defined at @SDL3\/SDL_hidapi.h 538:51@
+sDL_hid_get_device_info :: BG.FunPtr (BG.Ptr SDL_hid_device -> IO (BG.Ptr SDL_hid_device_info))
+sDL_hid_get_device_info =
+  BG.unsafePerformIO hs_bindgen_9b2d929812d327f4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_report_descriptor@
+foreign import ccall unsafe "hs_bindgen_056ff18230bbb5e2"
+  hs_bindgen_056ff18230bbb5e2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_get_report_descriptor@
+hs_bindgen_056ff18230bbb5e2
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_hid_device -> BG.Ptr BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt))
+hs_bindgen_056ff18230bbb5e2 =
+  BG.fromFFIType hs_bindgen_056ff18230bbb5e2_base
+
+{-# NOINLINE sDL_hid_get_report_descriptor #-}
+
+-- | Get a report descriptor from a HID device.
+--
+--     User has to provide a preallocated buffer where descriptor will be copied to. The recommended size for a preallocated buffer is 4096 bytes.
+--
+--     [@dev@]: a device handle returned from @SDL_hid_open()@.
+--
+--     [@buf@]: the buffer to copy descriptor into.
+--
+--     [@buf_size@]: the size of the buffer in bytes.
+--
+--     [Returns]: the number of bytes actually copied or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_report_descriptor@, defined at @SDL3\/SDL_hidapi.h 554:33@
+sDL_hid_get_report_descriptor
+  :: BG.FunPtr (BG.Ptr SDL_hid_device -> BG.Ptr BG.CUChar -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt)
+sDL_hid_get_report_descriptor =
+  BG.unsafePerformIO hs_bindgen_056ff18230bbb5e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_ble_scan@
+foreign import ccall unsafe "hs_bindgen_7634f6f83062373e"
+  hs_bindgen_7634f6f83062373e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_get_SDL_hid_ble_scan@
+hs_bindgen_7634f6f83062373e :: IO (BG.FunPtr (BG.CBool -> IO ()))
+hs_bindgen_7634f6f83062373e =
+  BG.fromFFIType hs_bindgen_7634f6f83062373e_base
+
+{-# NOINLINE sDL_hid_ble_scan #-}
+
+-- | Start or stop a BLE scan on iOS and tvOS to pair Steam Controllers.
+--
+--     [@active@]: true to start the scan, false to stop the scan.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_ble_scan@, defined at @SDL3\/SDL_hidapi.h 563:34@
+sDL_hid_ble_scan :: BG.FunPtr (BG.CBool -> IO ())
+sDL_hid_ble_scan =
+  BG.unsafePerformIO hs_bindgen_7634f6f83062373e
diff --git a/src/SDL3/Sys/Bindgen/Hidapi/Safe.hs b/src/SDL3/Sys/Bindgen/Hidapi/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Hidapi/Safe.hs
@@ -0,0 +1,1061 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Hidapi.Safe (
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_init,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_exit,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_device_change_count,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_enumerate,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_free_enumeration,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_open,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_open_path,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_get_properties,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_write,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_read_timeout,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_read,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_set_nonblocking,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_send_feature_report,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_get_feature_report,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_get_input_report,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_close,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_get_manufacturer_string,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_get_product_string,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_get_serial_number_string,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_get_indexed_string,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_get_device_info,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_get_report_descriptor,
+  SDL3.Sys.Bindgen.Hidapi.Safe.sDL_hid_ble_scan,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Hidapi
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_hidapi.h>"
+         , "signed int hs_bindgen_e23ad4638e4651c5 (void)"
+         , "{"
+         , "  return (SDL_hid_init)();"
+         , "}"
+         , "signed int hs_bindgen_7eaeed138e676c34 (void)"
+         , "{"
+         , "  return (SDL_hid_exit)();"
+         , "}"
+         , "Uint32 hs_bindgen_68b6879ddc50fc82 (void)"
+         , "{"
+         , "  return (SDL_hid_device_change_count)();"
+         , "}"
+         , "SDL_hid_device_info *hs_bindgen_eb498439d31d5942 ("
+         , "  unsigned short arg1,"
+         , "  unsigned short arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_enumerate)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_1de5e5c103bbeb76 ("
+         , "  SDL_hid_device_info *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_hid_free_enumeration)(arg1);"
+         , "}"
+         , "SDL_hid_device *hs_bindgen_4dc258d14565e3b1 ("
+         , "  unsigned short arg1,"
+         , "  unsigned short arg2,"
+         , "  wchar_t const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_open)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_hid_device *hs_bindgen_c079ea49eff1706e ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_open_path)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef Uint32 SDL_PropertiesID;"
+         , "#endif"
+         , "SDL_PropertiesID hs_bindgen_18716020d09fa299 ("
+         , "  SDL_hid_device *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_hid_get_properties)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_hid_get_properties requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "signed int hs_bindgen_7ffa302bd453f29d ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_write)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_a9bb09f6978bf010 ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_read_timeout)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "signed int hs_bindgen_71bc97f6f0149b6b ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_read)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_a4718c506d2c7f0f ("
+         , "  SDL_hid_device *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_set_nonblocking)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_3f1829d40ff45783 ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_send_feature_report)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_9bc7b92776c7a78c ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_feature_report)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_71a9fd2459b81356 ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_input_report)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_ac431d883efee041 ("
+         , "  SDL_hid_device *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_close)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_d928c5175963fa2b ("
+         , "  SDL_hid_device *arg1,"
+         , "  wchar_t *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_manufacturer_string)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_6efd06cbd0be2ac4 ("
+         , "  SDL_hid_device *arg1,"
+         , "  wchar_t *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_product_string)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_d39732d6a3cf4069 ("
+         , "  SDL_hid_device *arg1,"
+         , "  wchar_t *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_serial_number_string)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_b1f4db11ff770839 ("
+         , "  SDL_hid_device *arg1,"
+         , "  signed int arg2,"
+         , "  wchar_t *arg3,"
+         , "  size_t arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_indexed_string)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "SDL_hid_device_info *hs_bindgen_16acf6e683b8f908 ("
+         , "  SDL_hid_device *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_device_info)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_a73f2ef51699b1a7 ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_report_descriptor)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_5f872b3d74ffb765 ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  (SDL_hid_ble_scan)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_init@
+foreign import ccall safe "hs_bindgen_e23ad4638e4651c5"
+  hs_bindgen_e23ad4638e4651c5_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_init@
+hs_bindgen_e23ad4638e4651c5 :: IO BG.CInt
+hs_bindgen_e23ad4638e4651c5 =
+  BG.fromFFIType hs_bindgen_e23ad4638e4651c5_base
+
+-- | Initialize the HIDAPI library.
+--
+--     This function initializes the HIDAPI library. Calling it is not strictly necessary, as it will be called automatically by @SDL_hid_enumerate()@ and any of the SDL_hid_open_*() functions if it is needed. This function should be called at the beginning of execution however, if there is a chance of HIDAPI handles being opened by different threads simultaneously.
+--
+--     Each call to this function should have a matching call to @SDL_hid_exit()@
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_exit'
+--
+--     [C declaration]: @SDL_hid_init@, defined at @SDL3\/SDL_hidapi.h 177:33@
+sDL_hid_init :: IO BG.CInt
+sDL_hid_init = hs_bindgen_e23ad4638e4651c5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_exit@
+foreign import ccall safe "hs_bindgen_7eaeed138e676c34"
+  hs_bindgen_7eaeed138e676c34_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_exit@
+hs_bindgen_7eaeed138e676c34 :: IO BG.CInt
+hs_bindgen_7eaeed138e676c34 =
+  BG.fromFFIType hs_bindgen_7eaeed138e676c34_base
+
+-- | Finalize the HIDAPI library.
+--
+--     This function frees all of the static data associated with HIDAPI. It should be called at the end of execution to avoid memory leaks.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_init'
+--
+--     [C declaration]: @SDL_hid_exit@, defined at @SDL3\/SDL_hidapi.h 192:33@
+sDL_hid_exit :: IO BG.CInt
+sDL_hid_exit = hs_bindgen_7eaeed138e676c34
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_device_change_count@
+foreign import ccall safe "hs_bindgen_68b6879ddc50fc82"
+  hs_bindgen_68b6879ddc50fc82_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_device_change_count@
+hs_bindgen_68b6879ddc50fc82 :: IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_68b6879ddc50fc82 =
+  BG.fromFFIType hs_bindgen_68b6879ddc50fc82_base
+
+-- | Check to see if devices may have been added or removed.
+--
+--     Enumerating the HID devices is an expensive operation, so you can call this to see if there have been any system device changes since the last call to this function. A change in the counter returned doesn\'t necessarily mean that anything has changed, but you can call @SDL_hid_enumerate()@ to get an updated device list.
+--
+--     Calling this function for the first time may cause a thread or other system resource to be allocated to track device change notifications.
+--
+--     [Returns]: a change counter that is incremented with each potential device change, or 0 if device change detection isn\'t available.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_enumerate'
+--
+--     [C declaration]: @SDL_hid_device_change_count@, defined at @SDL3\/SDL_hidapi.h 213:36@
+sDL_hid_device_change_count :: IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_hid_device_change_count =
+  hs_bindgen_68b6879ddc50fc82
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_enumerate@
+foreign import ccall safe "hs_bindgen_eb498439d31d5942"
+  hs_bindgen_eb498439d31d5942_base
+    :: BG.Word16
+    -> BG.Word16
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_enumerate@
+hs_bindgen_eb498439d31d5942
+  :: BG.CUShort
+  -> BG.CUShort
+  -> IO (BG.Ptr SDL_hid_device_info)
+hs_bindgen_eb498439d31d5942 =
+  BG.fromFFIType hs_bindgen_eb498439d31d5942_base
+
+-- | Enumerate the HID Devices.
+--
+--     This function returns a linked list of all the HID devices attached to the system which match vendor_id and product_id. If @vendor_id@ is set to 0 then any vendor matches. If @product_id@ is set to 0 then any product matches. If @vendor_id@ and @product_id@ are both set to 0, then all HID devices will be returned.
+--
+--     By default SDL will only enumerate controllers, to reduce risk of hanging or crashing on bad drivers, but SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS can be set to \"0\" to enumerate all HID devices.
+--
+--     [Returns]: a pointer to a linked list of type 'SDL_hid_device_info', containing information about the HID devices attached to the system, or NULL in the case of failure. Free this linked list by calling @SDL_hid_free_enumeration()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_device_change_count'
+--
+--     [C declaration]: @SDL_hid_enumerate@, defined at @SDL3\/SDL_hidapi.h 241:51@
+sDL_hid_enumerate
+  :: BG.CUShort
+  -- ^
+  --
+  --           [@vendor_id@]: the Vendor ID (VID) of the types of device to open, or 0 to match any vendor.
+  -> BG.CUShort
+  -- ^
+  --
+  --           [@product_id@]: the Product ID (PID) of the types of device to open, or 0 to match any product.
+  -> IO (BG.Ptr SDL_hid_device_info)
+sDL_hid_enumerate = hs_bindgen_eb498439d31d5942
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_free_enumeration@
+foreign import ccall safe "hs_bindgen_1de5e5c103bbeb76"
+  hs_bindgen_1de5e5c103bbeb76_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_free_enumeration@
+hs_bindgen_1de5e5c103bbeb76
+  :: BG.Ptr SDL_hid_device_info
+  -> IO ()
+hs_bindgen_1de5e5c103bbeb76 =
+  BG.fromFFIType hs_bindgen_1de5e5c103bbeb76_base
+
+-- | Free an enumeration linked list.
+--
+--     This function frees a linked list created by @SDL_hid_enumerate()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_free_enumeration@, defined at @SDL3\/SDL_hidapi.h 253:34@
+sDL_hid_free_enumeration
+  :: BG.Ptr SDL_hid_device_info
+  -- ^
+  --
+  --           [@devs@]: pointer to a list of struct_device returned from @SDL_hid_enumerate()@.
+  -> IO ()
+sDL_hid_free_enumeration =
+  hs_bindgen_1de5e5c103bbeb76
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_open@
+foreign import ccall safe "hs_bindgen_4dc258d14565e3b1"
+  hs_bindgen_4dc258d14565e3b1_base
+    :: BG.Word16
+    -> BG.Word16
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_open@
+hs_bindgen_4dc258d14565e3b1
+  :: BG.CUShort
+  -> BG.CUShort
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO (BG.Ptr SDL_hid_device)
+hs_bindgen_4dc258d14565e3b1 =
+  BG.fromFFIType hs_bindgen_4dc258d14565e3b1_base
+
+-- | Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally a serial number.
+--
+--     If @serial_number@ is NULL, the first device with the specified VID and PID is opened.
+--
+--     [Returns]: a pointer to a 'SDL_hid_device' object on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_open@, defined at @SDL3\/SDL_hidapi.h 271:46@
+sDL_hid_open
+  :: BG.CUShort
+  -- ^
+  --
+  --           [@vendor_id@]: the Vendor ID (VID) of the device to open.
+  -> BG.CUShort
+  -- ^
+  --
+  --           [@product_id@]: the Product ID (PID) of the device to open.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@serial_number@]: the Serial Number of the device to open (Optionally NULL).
+  -> IO (BG.Ptr SDL_hid_device)
+sDL_hid_open = hs_bindgen_4dc258d14565e3b1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_open_path@
+foreign import ccall safe "hs_bindgen_c079ea49eff1706e"
+  hs_bindgen_c079ea49eff1706e_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_open_path@
+hs_bindgen_c079ea49eff1706e
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_hid_device)
+hs_bindgen_c079ea49eff1706e =
+  BG.fromFFIType hs_bindgen_c079ea49eff1706e_base
+
+-- | Open a HID device by its path name.
+--
+--     The path name be determined by calling @SDL_hid_enumerate()@, or a platform-specific path name can be used (eg: \/dev\/hidraw0 on Linux).
+--
+--     [Returns]: a pointer to a 'SDL_hid_device' object on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_open_path@, defined at @SDL3\/SDL_hidapi.h 285:46@
+sDL_hid_open_path
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path name of the device to open.
+  -> IO (BG.Ptr SDL_hid_device)
+sDL_hid_open_path = hs_bindgen_c079ea49eff1706e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_properties@
+foreign import ccall safe "hs_bindgen_18716020d09fa299"
+  hs_bindgen_18716020d09fa299_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_properties@
+hs_bindgen_18716020d09fa299
+  :: BG.Ptr SDL_hid_device
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_18716020d09fa299 =
+  BG.fromFFIType hs_bindgen_18716020d09fa299_base
+
+-- | Get the properties associated with an 'SDL_hid_device'.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER'@: the libusb_device_handle associated with the device, if it was opened using libusb.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_hid_get_properties@, defined at @SDL3\/SDL_hidapi.h 301:46@
+sDL_hid_get_properties
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_hid_get_properties = hs_bindgen_18716020d09fa299
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_write@
+foreign import ccall safe "hs_bindgen_7ffa302bd453f29d"
+  hs_bindgen_7ffa302bd453f29d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_write@
+hs_bindgen_7ffa302bd453f29d
+  :: BG.Ptr SDL_hid_device
+  -> PtrConst.PtrConst BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_7ffa302bd453f29d =
+  BG.fromFFIType hs_bindgen_7ffa302bd453f29d_base
+
+-- | Write an Output report to a HID device.
+--
+--     The first byte of @data@ must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to @SDL_hid_write()@ will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to @SDL_hid_write()@, the Report ID (or 0x0, for devices with a single report), followed by the report data (16 bytes). In this example, the length passed in would be 17.
+--
+--     @SDL_hid_write()@ will send the data on the first OUT endpoint, if one exists. If it does not, it will send the data through the Control Endpoint (Endpoint 0).
+--
+--     [Returns]: the actual number of bytes written and -1 on on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_write@, defined at @SDL3\/SDL_hidapi.h 330:33@
+sDL_hid_write
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> PtrConst.PtrConst BG.CUChar
+  -- ^
+  --
+  --           [@data@]: the data to send, including the report number as the first byte.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the length in bytes of the data to send.
+  -> IO BG.CInt
+sDL_hid_write = hs_bindgen_7ffa302bd453f29d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_read_timeout@
+foreign import ccall safe "hs_bindgen_a9bb09f6978bf010"
+  hs_bindgen_a9bb09f6978bf010_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_read_timeout@
+hs_bindgen_a9bb09f6978bf010
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_a9bb09f6978bf010 =
+  BG.fromFFIType hs_bindgen_a9bb09f6978bf010_base
+
+-- | Read an Input report from a HID device with timeout.
+--
+--     Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports.
+--
+--     [Returns]: the actual number of bytes read and -1 on on failure; call SDL_GetError() for more information. If no packet was available to be read within the timeout period, this function returns 0.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_read_timeout@, defined at @SDL3\/SDL_hidapi.h 351:33@
+sDL_hid_read_timeout
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@milliseconds@]: timeout in milliseconds or -1 for blocking wait.
+  -> IO BG.CInt
+sDL_hid_read_timeout = hs_bindgen_a9bb09f6978bf010
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_read@
+foreign import ccall safe "hs_bindgen_71bc97f6f0149b6b"
+  hs_bindgen_71bc97f6f0149b6b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_read@
+hs_bindgen_71bc97f6f0149b6b
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_71bc97f6f0149b6b =
+  BG.fromFFIType hs_bindgen_71bc97f6f0149b6b_base
+
+-- | Read an Input report from a HID device.
+--
+--     Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports.
+--
+--     [Returns]: the actual number of bytes read and -1 on failure; call SDL_GetError() for more information. If no packet was available to be read and the handle is in non-blocking mode, this function returns 0.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_read@, defined at @SDL3\/SDL_hidapi.h 372:33@
+sDL_hid_read
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number.
+  -> IO BG.CInt
+sDL_hid_read = hs_bindgen_71bc97f6f0149b6b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_set_nonblocking@
+foreign import ccall safe "hs_bindgen_a4718c506d2c7f0f"
+  hs_bindgen_a4718c506d2c7f0f_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_set_nonblocking@
+hs_bindgen_a4718c506d2c7f0f
+  :: BG.Ptr SDL_hid_device
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_a4718c506d2c7f0f =
+  BG.fromFFIType hs_bindgen_a4718c506d2c7f0f_base
+
+-- | Set the device handle to be non-blocking.
+--
+--     In non-blocking mode calls to @SDL_hid_read()@ will return immediately with a value of 0 if there is no data to be read. In blocking mode, @SDL_hid_read()@ will wait (block) until there is data to read before returning.
+--
+--     Nonblocking can be turned on and off at any time.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_set_nonblocking@, defined at @SDL3\/SDL_hidapi.h 391:33@
+sDL_hid_set_nonblocking
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@nonblock@]: enable or not the nonblocking reads - 1 to enable nonblocking - 0 to disable nonblocking.
+  -> IO BG.CInt
+sDL_hid_set_nonblocking = hs_bindgen_a4718c506d2c7f0f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_send_feature_report@
+foreign import ccall safe "hs_bindgen_3f1829d40ff45783"
+  hs_bindgen_3f1829d40ff45783_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_send_feature_report@
+hs_bindgen_3f1829d40ff45783
+  :: BG.Ptr SDL_hid_device
+  -> PtrConst.PtrConst BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_3f1829d40ff45783 =
+  BG.fromFFIType hs_bindgen_3f1829d40ff45783_base
+
+-- | Send a Feature report to the device.
+--
+--     Feature reports are sent over the Control endpoint as a Set_Report transfer. The first byte of @data@ must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to @SDL_hid_send_feature_report()@ will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to @SDL_hid_send_feature_report()@: the Report ID (or 0x0, for devices which do not use numbered reports), followed by the report data (16 bytes). In this example, the length passed in would be 17.
+--
+--     [Returns]: the actual number of bytes written and -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_send_feature_report@, defined at @SDL3\/SDL_hidapi.h 416:33@
+sDL_hid_send_feature_report
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> PtrConst.PtrConst BG.CUChar
+  -- ^
+  --
+  --           [@data@]: the data to send, including the report number as the first byte.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the length in bytes of the data to send, including the report number.
+  -> IO BG.CInt
+sDL_hid_send_feature_report =
+  hs_bindgen_3f1829d40ff45783
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_feature_report@
+foreign import ccall safe "hs_bindgen_9bc7b92776c7a78c"
+  hs_bindgen_9bc7b92776c7a78c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_feature_report@
+hs_bindgen_9bc7b92776c7a78c
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_9bc7b92776c7a78c =
+  BG.fromFFIType hs_bindgen_9bc7b92776c7a78c_base
+
+-- | Get a feature report from a HID device.
+--
+--     Set the first byte of @data@ to the Report ID of the report to be read. Make sure to allow space for this extra byte in @data@. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1].
+--
+--     [Returns]: the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_feature_report@, defined at @SDL3\/SDL_hidapi.h 439:33@
+sDL_hid_get_feature_report
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into, including the Report ID. Set the first byte of @data@ to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report.
+  -> IO BG.CInt
+sDL_hid_get_feature_report =
+  hs_bindgen_9bc7b92776c7a78c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_input_report@
+foreign import ccall safe "hs_bindgen_71a9fd2459b81356"
+  hs_bindgen_71a9fd2459b81356_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_input_report@
+hs_bindgen_71a9fd2459b81356
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_71a9fd2459b81356 =
+  BG.fromFFIType hs_bindgen_71a9fd2459b81356_base
+
+-- | Get an input report from a HID device.
+--
+--     Set the first byte of @data@ to the Report ID of the report to be read. Make sure to allow space for this extra byte in @data@. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1].
+--
+--     [Returns]: the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_input_report@, defined at @SDL3\/SDL_hidapi.h 462:33@
+sDL_hid_get_input_report
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into, including the Report ID. Set the first byte of @data@ to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report.
+  -> IO BG.CInt
+sDL_hid_get_input_report =
+  hs_bindgen_71a9fd2459b81356
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_close@
+foreign import ccall safe "hs_bindgen_ac431d883efee041"
+  hs_bindgen_ac431d883efee041_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_close@
+hs_bindgen_ac431d883efee041
+  :: BG.Ptr SDL_hid_device
+  -> IO BG.CInt
+hs_bindgen_ac431d883efee041 =
+  BG.fromFFIType hs_bindgen_ac431d883efee041_base
+
+-- | Close a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_close@, defined at @SDL3\/SDL_hidapi.h 473:33@
+sDL_hid_close
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> IO BG.CInt
+sDL_hid_close = hs_bindgen_ac431d883efee041
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_manufacturer_string@
+foreign import ccall safe "hs_bindgen_d928c5175963fa2b"
+  hs_bindgen_d928c5175963fa2b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_manufacturer_string@
+hs_bindgen_d928c5175963fa2b
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_d928c5175963fa2b =
+  BG.fromFFIType hs_bindgen_d928c5175963fa2b_base
+
+-- | Get The Manufacturer String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_manufacturer_string@, defined at @SDL3\/SDL_hidapi.h 486:33@
+sDL_hid_get_manufacturer_string
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.CInt
+sDL_hid_get_manufacturer_string =
+  hs_bindgen_d928c5175963fa2b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_product_string@
+foreign import ccall safe "hs_bindgen_6efd06cbd0be2ac4"
+  hs_bindgen_6efd06cbd0be2ac4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_product_string@
+hs_bindgen_6efd06cbd0be2ac4
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_6efd06cbd0be2ac4 =
+  BG.fromFFIType hs_bindgen_6efd06cbd0be2ac4_base
+
+-- | Get The Product String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_product_string@, defined at @SDL3\/SDL_hidapi.h 499:33@
+sDL_hid_get_product_string
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.CInt
+sDL_hid_get_product_string =
+  hs_bindgen_6efd06cbd0be2ac4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_serial_number_string@
+foreign import ccall safe "hs_bindgen_d39732d6a3cf4069"
+  hs_bindgen_d39732d6a3cf4069_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_serial_number_string@
+hs_bindgen_d39732d6a3cf4069
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_d39732d6a3cf4069 =
+  BG.fromFFIType hs_bindgen_d39732d6a3cf4069_base
+
+-- | Get The Serial Number String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_serial_number_string@, defined at @SDL3\/SDL_hidapi.h 512:33@
+sDL_hid_get_serial_number_string
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.CInt
+sDL_hid_get_serial_number_string =
+  hs_bindgen_d39732d6a3cf4069
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_indexed_string@
+foreign import ccall safe "hs_bindgen_b1f4db11ff770839"
+  hs_bindgen_b1f4db11ff770839_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_indexed_string@
+hs_bindgen_b1f4db11ff770839
+  :: BG.Ptr SDL_hid_device
+  -> BG.CInt
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_b1f4db11ff770839 =
+  BG.fromFFIType hs_bindgen_b1f4db11ff770839_base
+
+-- | Get a string from a HID device, based on its string index.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_indexed_string@, defined at @SDL3\/SDL_hidapi.h 526:33@
+sDL_hid_get_indexed_string
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@string_index@]: the index of the string to get.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.CInt
+sDL_hid_get_indexed_string =
+  hs_bindgen_b1f4db11ff770839
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_device_info@
+foreign import ccall safe "hs_bindgen_16acf6e683b8f908"
+  hs_bindgen_16acf6e683b8f908_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_device_info@
+hs_bindgen_16acf6e683b8f908
+  :: BG.Ptr SDL_hid_device
+  -> IO (BG.Ptr SDL_hid_device_info)
+hs_bindgen_16acf6e683b8f908 =
+  BG.fromFFIType hs_bindgen_16acf6e683b8f908_base
+
+-- | Get the device info from a HID device.
+--
+--     [Returns]: a pointer to the 'SDL_hid_device_info' for this hid_device or NULL on failure; call SDL_GetError() for more information. This struct is valid until the device is closed with @SDL_hid_close()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_device_info@, defined at @SDL3\/SDL_hidapi.h 538:51@
+sDL_hid_get_device_info
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> IO (BG.Ptr SDL_hid_device_info)
+sDL_hid_get_device_info = hs_bindgen_16acf6e683b8f908
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_report_descriptor@
+foreign import ccall safe "hs_bindgen_a73f2ef51699b1a7"
+  hs_bindgen_a73f2ef51699b1a7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_get_report_descriptor@
+hs_bindgen_a73f2ef51699b1a7
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_a73f2ef51699b1a7 =
+  BG.fromFFIType hs_bindgen_a73f2ef51699b1a7_base
+
+-- | Get a report descriptor from a HID device.
+--
+--     User has to provide a preallocated buffer where descriptor will be copied to. The recommended size for a preallocated buffer is 4096 bytes.
+--
+--     [Returns]: the number of bytes actually copied or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_report_descriptor@, defined at @SDL3\/SDL_hidapi.h 554:33@
+sDL_hid_get_report_descriptor
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@buf@]: the buffer to copy descriptor into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@buf_size@]: the size of the buffer in bytes.
+  -> IO BG.CInt
+sDL_hid_get_report_descriptor =
+  hs_bindgen_a73f2ef51699b1a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_ble_scan@
+foreign import ccall safe "hs_bindgen_5f872b3d74ffb765"
+  hs_bindgen_5f872b3d74ffb765_base
+    :: BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Safe_SDL_hid_ble_scan@
+hs_bindgen_5f872b3d74ffb765
+  :: BG.CBool
+  -> IO ()
+hs_bindgen_5f872b3d74ffb765 =
+  BG.fromFFIType hs_bindgen_5f872b3d74ffb765_base
+
+-- | Start or stop a BLE scan on iOS and tvOS to pair Steam Controllers.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_ble_scan@, defined at @SDL3\/SDL_hidapi.h 563:34@
+sDL_hid_ble_scan
+  :: BG.CBool
+  -- ^
+  --
+  --           [@active@]: true to start the scan, false to stop the scan.
+  -> IO ()
+sDL_hid_ble_scan = hs_bindgen_5f872b3d74ffb765
diff --git a/src/SDL3/Sys/Bindgen/Hidapi/Unsafe.hs b/src/SDL3/Sys/Bindgen/Hidapi/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Hidapi/Unsafe.hs
@@ -0,0 +1,1061 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Hidapi.Unsafe (
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_init,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_exit,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_device_change_count,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_enumerate,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_free_enumeration,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_open,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_open_path,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_get_properties,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_write,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_read_timeout,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_read,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_set_nonblocking,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_send_feature_report,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_get_feature_report,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_get_input_report,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_close,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_get_manufacturer_string,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_get_product_string,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_get_serial_number_string,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_get_indexed_string,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_get_device_info,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_get_report_descriptor,
+  SDL3.Sys.Bindgen.Hidapi.Unsafe.sDL_hid_ble_scan,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Hidapi
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_hidapi.h>"
+         , "signed int hs_bindgen_dcb8375e747bb624 (void)"
+         , "{"
+         , "  return (SDL_hid_init)();"
+         , "}"
+         , "signed int hs_bindgen_e6649bca54c7158a (void)"
+         , "{"
+         , "  return (SDL_hid_exit)();"
+         , "}"
+         , "Uint32 hs_bindgen_8428495b7bd2b7e5 (void)"
+         , "{"
+         , "  return (SDL_hid_device_change_count)();"
+         , "}"
+         , "SDL_hid_device_info *hs_bindgen_c80fee489024b2f6 ("
+         , "  unsigned short arg1,"
+         , "  unsigned short arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_enumerate)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_576ebef2d717239d ("
+         , "  SDL_hid_device_info *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_hid_free_enumeration)(arg1);"
+         , "}"
+         , "SDL_hid_device *hs_bindgen_1acfa083bac0fefe ("
+         , "  unsigned short arg1,"
+         , "  unsigned short arg2,"
+         , "  wchar_t const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_open)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_hid_device *hs_bindgen_3c5436d1ddca078c ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_open_path)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef Uint32 SDL_PropertiesID;"
+         , "#endif"
+         , "SDL_PropertiesID hs_bindgen_e9b48243d3f24ba7 ("
+         , "  SDL_hid_device *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_hid_get_properties)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_hid_get_properties requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "signed int hs_bindgen_224530f741f7e012 ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_write)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_7989f96f3123402c ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_read_timeout)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "signed int hs_bindgen_67f9e2c762f1f561 ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_read)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_461a1d4ecaa70f7b ("
+         , "  SDL_hid_device *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_set_nonblocking)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_e2bc17c282363a0a ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_send_feature_report)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_9a50cca655a383d6 ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_feature_report)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_69c42f891dcf07ec ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_input_report)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_f1b65245de342510 ("
+         , "  SDL_hid_device *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_close)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_618b34900d079096 ("
+         , "  SDL_hid_device *arg1,"
+         , "  wchar_t *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_manufacturer_string)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_56bf4b52bb0ee8a4 ("
+         , "  SDL_hid_device *arg1,"
+         , "  wchar_t *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_product_string)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_dec4af789ee01ecf ("
+         , "  SDL_hid_device *arg1,"
+         , "  wchar_t *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_serial_number_string)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_4ec0bddefa08ebea ("
+         , "  SDL_hid_device *arg1,"
+         , "  signed int arg2,"
+         , "  wchar_t *arg3,"
+         , "  size_t arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_indexed_string)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "SDL_hid_device_info *hs_bindgen_48075159cccbc3cd ("
+         , "  SDL_hid_device *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_device_info)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_682cc2cefec05416 ("
+         , "  SDL_hid_device *arg1,"
+         , "  unsigned char *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_hid_get_report_descriptor)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_5c88299056af21de ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  (SDL_hid_ble_scan)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_init@
+foreign import ccall unsafe "hs_bindgen_dcb8375e747bb624"
+  hs_bindgen_dcb8375e747bb624_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_init@
+hs_bindgen_dcb8375e747bb624 :: IO BG.CInt
+hs_bindgen_dcb8375e747bb624 =
+  BG.fromFFIType hs_bindgen_dcb8375e747bb624_base
+
+-- | Initialize the HIDAPI library.
+--
+--     This function initializes the HIDAPI library. Calling it is not strictly necessary, as it will be called automatically by @SDL_hid_enumerate()@ and any of the SDL_hid_open_*() functions if it is needed. This function should be called at the beginning of execution however, if there is a chance of HIDAPI handles being opened by different threads simultaneously.
+--
+--     Each call to this function should have a matching call to @SDL_hid_exit()@
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_exit'
+--
+--     [C declaration]: @SDL_hid_init@, defined at @SDL3\/SDL_hidapi.h 177:33@
+sDL_hid_init :: IO BG.CInt
+sDL_hid_init = hs_bindgen_dcb8375e747bb624
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_exit@
+foreign import ccall unsafe "hs_bindgen_e6649bca54c7158a"
+  hs_bindgen_e6649bca54c7158a_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_exit@
+hs_bindgen_e6649bca54c7158a :: IO BG.CInt
+hs_bindgen_e6649bca54c7158a =
+  BG.fromFFIType hs_bindgen_e6649bca54c7158a_base
+
+-- | Finalize the HIDAPI library.
+--
+--     This function frees all of the static data associated with HIDAPI. It should be called at the end of execution to avoid memory leaks.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_init'
+--
+--     [C declaration]: @SDL_hid_exit@, defined at @SDL3\/SDL_hidapi.h 192:33@
+sDL_hid_exit :: IO BG.CInt
+sDL_hid_exit = hs_bindgen_e6649bca54c7158a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_device_change_count@
+foreign import ccall unsafe "hs_bindgen_8428495b7bd2b7e5"
+  hs_bindgen_8428495b7bd2b7e5_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_device_change_count@
+hs_bindgen_8428495b7bd2b7e5 :: IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_8428495b7bd2b7e5 =
+  BG.fromFFIType hs_bindgen_8428495b7bd2b7e5_base
+
+-- | Check to see if devices may have been added or removed.
+--
+--     Enumerating the HID devices is an expensive operation, so you can call this to see if there have been any system device changes since the last call to this function. A change in the counter returned doesn\'t necessarily mean that anything has changed, but you can call @SDL_hid_enumerate()@ to get an updated device list.
+--
+--     Calling this function for the first time may cause a thread or other system resource to be allocated to track device change notifications.
+--
+--     [Returns]: a change counter that is incremented with each potential device change, or 0 if device change detection isn\'t available.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_enumerate'
+--
+--     [C declaration]: @SDL_hid_device_change_count@, defined at @SDL3\/SDL_hidapi.h 213:36@
+sDL_hid_device_change_count :: IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_hid_device_change_count =
+  hs_bindgen_8428495b7bd2b7e5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_enumerate@
+foreign import ccall unsafe "hs_bindgen_c80fee489024b2f6"
+  hs_bindgen_c80fee489024b2f6_base
+    :: BG.Word16
+    -> BG.Word16
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_enumerate@
+hs_bindgen_c80fee489024b2f6
+  :: BG.CUShort
+  -> BG.CUShort
+  -> IO (BG.Ptr SDL_hid_device_info)
+hs_bindgen_c80fee489024b2f6 =
+  BG.fromFFIType hs_bindgen_c80fee489024b2f6_base
+
+-- | Enumerate the HID Devices.
+--
+--     This function returns a linked list of all the HID devices attached to the system which match vendor_id and product_id. If @vendor_id@ is set to 0 then any vendor matches. If @product_id@ is set to 0 then any product matches. If @vendor_id@ and @product_id@ are both set to 0, then all HID devices will be returned.
+--
+--     By default SDL will only enumerate controllers, to reduce risk of hanging or crashing on bad drivers, but SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS can be set to \"0\" to enumerate all HID devices.
+--
+--     [Returns]: a pointer to a linked list of type 'SDL_hid_device_info', containing information about the HID devices attached to the system, or NULL in the case of failure. Free this linked list by calling @SDL_hid_free_enumeration()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_hid_device_change_count'
+--
+--     [C declaration]: @SDL_hid_enumerate@, defined at @SDL3\/SDL_hidapi.h 241:51@
+sDL_hid_enumerate
+  :: BG.CUShort
+  -- ^
+  --
+  --           [@vendor_id@]: the Vendor ID (VID) of the types of device to open, or 0 to match any vendor.
+  -> BG.CUShort
+  -- ^
+  --
+  --           [@product_id@]: the Product ID (PID) of the types of device to open, or 0 to match any product.
+  -> IO (BG.Ptr SDL_hid_device_info)
+sDL_hid_enumerate = hs_bindgen_c80fee489024b2f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_free_enumeration@
+foreign import ccall unsafe "hs_bindgen_576ebef2d717239d"
+  hs_bindgen_576ebef2d717239d_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_free_enumeration@
+hs_bindgen_576ebef2d717239d
+  :: BG.Ptr SDL_hid_device_info
+  -> IO ()
+hs_bindgen_576ebef2d717239d =
+  BG.fromFFIType hs_bindgen_576ebef2d717239d_base
+
+-- | Free an enumeration linked list.
+--
+--     This function frees a linked list created by @SDL_hid_enumerate()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_free_enumeration@, defined at @SDL3\/SDL_hidapi.h 253:34@
+sDL_hid_free_enumeration
+  :: BG.Ptr SDL_hid_device_info
+  -- ^
+  --
+  --           [@devs@]: pointer to a list of struct_device returned from @SDL_hid_enumerate()@.
+  -> IO ()
+sDL_hid_free_enumeration =
+  hs_bindgen_576ebef2d717239d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_open@
+foreign import ccall unsafe "hs_bindgen_1acfa083bac0fefe"
+  hs_bindgen_1acfa083bac0fefe_base
+    :: BG.Word16
+    -> BG.Word16
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_open@
+hs_bindgen_1acfa083bac0fefe
+  :: BG.CUShort
+  -> BG.CUShort
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO (BG.Ptr SDL_hid_device)
+hs_bindgen_1acfa083bac0fefe =
+  BG.fromFFIType hs_bindgen_1acfa083bac0fefe_base
+
+-- | Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally a serial number.
+--
+--     If @serial_number@ is NULL, the first device with the specified VID and PID is opened.
+--
+--     [Returns]: a pointer to a 'SDL_hid_device' object on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_open@, defined at @SDL3\/SDL_hidapi.h 271:46@
+sDL_hid_open
+  :: BG.CUShort
+  -- ^
+  --
+  --           [@vendor_id@]: the Vendor ID (VID) of the device to open.
+  -> BG.CUShort
+  -- ^
+  --
+  --           [@product_id@]: the Product ID (PID) of the device to open.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@serial_number@]: the Serial Number of the device to open (Optionally NULL).
+  -> IO (BG.Ptr SDL_hid_device)
+sDL_hid_open = hs_bindgen_1acfa083bac0fefe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_open_path@
+foreign import ccall unsafe "hs_bindgen_3c5436d1ddca078c"
+  hs_bindgen_3c5436d1ddca078c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_open_path@
+hs_bindgen_3c5436d1ddca078c
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_hid_device)
+hs_bindgen_3c5436d1ddca078c =
+  BG.fromFFIType hs_bindgen_3c5436d1ddca078c_base
+
+-- | Open a HID device by its path name.
+--
+--     The path name be determined by calling @SDL_hid_enumerate()@, or a platform-specific path name can be used (eg: \/dev\/hidraw0 on Linux).
+--
+--     [Returns]: a pointer to a 'SDL_hid_device' object on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_open_path@, defined at @SDL3\/SDL_hidapi.h 285:46@
+sDL_hid_open_path
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path name of the device to open.
+  -> IO (BG.Ptr SDL_hid_device)
+sDL_hid_open_path = hs_bindgen_3c5436d1ddca078c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_properties@
+foreign import ccall unsafe "hs_bindgen_e9b48243d3f24ba7"
+  hs_bindgen_e9b48243d3f24ba7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_properties@
+hs_bindgen_e9b48243d3f24ba7
+  :: BG.Ptr SDL_hid_device
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_e9b48243d3f24ba7 =
+  BG.fromFFIType hs_bindgen_e9b48243d3f24ba7_base
+
+-- | Get the properties associated with an 'SDL_hid_device'.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER'@: the libusb_device_handle associated with the device, if it was opened using libusb.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_hid_get_properties@, defined at @SDL3\/SDL_hidapi.h 301:46@
+sDL_hid_get_properties
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_hid_get_properties = hs_bindgen_e9b48243d3f24ba7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_write@
+foreign import ccall unsafe "hs_bindgen_224530f741f7e012"
+  hs_bindgen_224530f741f7e012_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_write@
+hs_bindgen_224530f741f7e012
+  :: BG.Ptr SDL_hid_device
+  -> PtrConst.PtrConst BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_224530f741f7e012 =
+  BG.fromFFIType hs_bindgen_224530f741f7e012_base
+
+-- | Write an Output report to a HID device.
+--
+--     The first byte of @data@ must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to @SDL_hid_write()@ will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to @SDL_hid_write()@, the Report ID (or 0x0, for devices with a single report), followed by the report data (16 bytes). In this example, the length passed in would be 17.
+--
+--     @SDL_hid_write()@ will send the data on the first OUT endpoint, if one exists. If it does not, it will send the data through the Control Endpoint (Endpoint 0).
+--
+--     [Returns]: the actual number of bytes written and -1 on on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_write@, defined at @SDL3\/SDL_hidapi.h 330:33@
+sDL_hid_write
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> PtrConst.PtrConst BG.CUChar
+  -- ^
+  --
+  --           [@data@]: the data to send, including the report number as the first byte.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the length in bytes of the data to send.
+  -> IO BG.CInt
+sDL_hid_write = hs_bindgen_224530f741f7e012
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_read_timeout@
+foreign import ccall unsafe "hs_bindgen_7989f96f3123402c"
+  hs_bindgen_7989f96f3123402c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_read_timeout@
+hs_bindgen_7989f96f3123402c
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_7989f96f3123402c =
+  BG.fromFFIType hs_bindgen_7989f96f3123402c_base
+
+-- | Read an Input report from a HID device with timeout.
+--
+--     Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports.
+--
+--     [Returns]: the actual number of bytes read and -1 on on failure; call SDL_GetError() for more information. If no packet was available to be read within the timeout period, this function returns 0.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_read_timeout@, defined at @SDL3\/SDL_hidapi.h 351:33@
+sDL_hid_read_timeout
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@milliseconds@]: timeout in milliseconds or -1 for blocking wait.
+  -> IO BG.CInt
+sDL_hid_read_timeout = hs_bindgen_7989f96f3123402c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_read@
+foreign import ccall unsafe "hs_bindgen_67f9e2c762f1f561"
+  hs_bindgen_67f9e2c762f1f561_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_read@
+hs_bindgen_67f9e2c762f1f561
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_67f9e2c762f1f561 =
+  BG.fromFFIType hs_bindgen_67f9e2c762f1f561_base
+
+-- | Read an Input report from a HID device.
+--
+--     Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports.
+--
+--     [Returns]: the actual number of bytes read and -1 on failure; call SDL_GetError() for more information. If no packet was available to be read and the handle is in non-blocking mode, this function returns 0.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_read@, defined at @SDL3\/SDL_hidapi.h 372:33@
+sDL_hid_read
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number.
+  -> IO BG.CInt
+sDL_hid_read = hs_bindgen_67f9e2c762f1f561
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_set_nonblocking@
+foreign import ccall unsafe "hs_bindgen_461a1d4ecaa70f7b"
+  hs_bindgen_461a1d4ecaa70f7b_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_set_nonblocking@
+hs_bindgen_461a1d4ecaa70f7b
+  :: BG.Ptr SDL_hid_device
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_461a1d4ecaa70f7b =
+  BG.fromFFIType hs_bindgen_461a1d4ecaa70f7b_base
+
+-- | Set the device handle to be non-blocking.
+--
+--     In non-blocking mode calls to @SDL_hid_read()@ will return immediately with a value of 0 if there is no data to be read. In blocking mode, @SDL_hid_read()@ will wait (block) until there is data to read before returning.
+--
+--     Nonblocking can be turned on and off at any time.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_set_nonblocking@, defined at @SDL3\/SDL_hidapi.h 391:33@
+sDL_hid_set_nonblocking
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@nonblock@]: enable or not the nonblocking reads - 1 to enable nonblocking - 0 to disable nonblocking.
+  -> IO BG.CInt
+sDL_hid_set_nonblocking = hs_bindgen_461a1d4ecaa70f7b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_send_feature_report@
+foreign import ccall unsafe "hs_bindgen_e2bc17c282363a0a"
+  hs_bindgen_e2bc17c282363a0a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_send_feature_report@
+hs_bindgen_e2bc17c282363a0a
+  :: BG.Ptr SDL_hid_device
+  -> PtrConst.PtrConst BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_e2bc17c282363a0a =
+  BG.fromFFIType hs_bindgen_e2bc17c282363a0a_base
+
+-- | Send a Feature report to the device.
+--
+--     Feature reports are sent over the Control endpoint as a Set_Report transfer. The first byte of @data@ must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to @SDL_hid_send_feature_report()@ will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to @SDL_hid_send_feature_report()@: the Report ID (or 0x0, for devices which do not use numbered reports), followed by the report data (16 bytes). In this example, the length passed in would be 17.
+--
+--     [Returns]: the actual number of bytes written and -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_send_feature_report@, defined at @SDL3\/SDL_hidapi.h 416:33@
+sDL_hid_send_feature_report
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> PtrConst.PtrConst BG.CUChar
+  -- ^
+  --
+  --           [@data@]: the data to send, including the report number as the first byte.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the length in bytes of the data to send, including the report number.
+  -> IO BG.CInt
+sDL_hid_send_feature_report =
+  hs_bindgen_e2bc17c282363a0a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_feature_report@
+foreign import ccall unsafe "hs_bindgen_9a50cca655a383d6"
+  hs_bindgen_9a50cca655a383d6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_feature_report@
+hs_bindgen_9a50cca655a383d6
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_9a50cca655a383d6 =
+  BG.fromFFIType hs_bindgen_9a50cca655a383d6_base
+
+-- | Get a feature report from a HID device.
+--
+--     Set the first byte of @data@ to the Report ID of the report to be read. Make sure to allow space for this extra byte in @data@. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1].
+--
+--     [Returns]: the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_feature_report@, defined at @SDL3\/SDL_hidapi.h 439:33@
+sDL_hid_get_feature_report
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into, including the Report ID. Set the first byte of @data@ to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report.
+  -> IO BG.CInt
+sDL_hid_get_feature_report =
+  hs_bindgen_9a50cca655a383d6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_input_report@
+foreign import ccall unsafe "hs_bindgen_69c42f891dcf07ec"
+  hs_bindgen_69c42f891dcf07ec_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_input_report@
+hs_bindgen_69c42f891dcf07ec
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_69c42f891dcf07ec =
+  BG.fromFFIType hs_bindgen_69c42f891dcf07ec_base
+
+-- | Get an input report from a HID device.
+--
+--     Set the first byte of @data@ to the Report ID of the report to be read. Make sure to allow space for this extra byte in @data@. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1].
+--
+--     [Returns]: the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_input_report@, defined at @SDL3\/SDL_hidapi.h 462:33@
+sDL_hid_get_input_report
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into, including the Report ID. Set the first byte of @data@ to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report.
+  -> IO BG.CInt
+sDL_hid_get_input_report =
+  hs_bindgen_69c42f891dcf07ec
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_close@
+foreign import ccall unsafe "hs_bindgen_f1b65245de342510"
+  hs_bindgen_f1b65245de342510_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_close@
+hs_bindgen_f1b65245de342510
+  :: BG.Ptr SDL_hid_device
+  -> IO BG.CInt
+hs_bindgen_f1b65245de342510 =
+  BG.fromFFIType hs_bindgen_f1b65245de342510_base
+
+-- | Close a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_close@, defined at @SDL3\/SDL_hidapi.h 473:33@
+sDL_hid_close
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> IO BG.CInt
+sDL_hid_close = hs_bindgen_f1b65245de342510
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_manufacturer_string@
+foreign import ccall unsafe "hs_bindgen_618b34900d079096"
+  hs_bindgen_618b34900d079096_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_manufacturer_string@
+hs_bindgen_618b34900d079096
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_618b34900d079096 =
+  BG.fromFFIType hs_bindgen_618b34900d079096_base
+
+-- | Get The Manufacturer String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_manufacturer_string@, defined at @SDL3\/SDL_hidapi.h 486:33@
+sDL_hid_get_manufacturer_string
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.CInt
+sDL_hid_get_manufacturer_string =
+  hs_bindgen_618b34900d079096
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_product_string@
+foreign import ccall unsafe "hs_bindgen_56bf4b52bb0ee8a4"
+  hs_bindgen_56bf4b52bb0ee8a4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_product_string@
+hs_bindgen_56bf4b52bb0ee8a4
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_56bf4b52bb0ee8a4 =
+  BG.fromFFIType hs_bindgen_56bf4b52bb0ee8a4_base
+
+-- | Get The Product String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_product_string@, defined at @SDL3\/SDL_hidapi.h 499:33@
+sDL_hid_get_product_string
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.CInt
+sDL_hid_get_product_string =
+  hs_bindgen_56bf4b52bb0ee8a4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_serial_number_string@
+foreign import ccall unsafe "hs_bindgen_dec4af789ee01ecf"
+  hs_bindgen_dec4af789ee01ecf_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_serial_number_string@
+hs_bindgen_dec4af789ee01ecf
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_dec4af789ee01ecf =
+  BG.fromFFIType hs_bindgen_dec4af789ee01ecf_base
+
+-- | Get The Serial Number String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_serial_number_string@, defined at @SDL3\/SDL_hidapi.h 512:33@
+sDL_hid_get_serial_number_string
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.CInt
+sDL_hid_get_serial_number_string =
+  hs_bindgen_dec4af789ee01ecf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_indexed_string@
+foreign import ccall unsafe "hs_bindgen_4ec0bddefa08ebea"
+  hs_bindgen_4ec0bddefa08ebea_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_indexed_string@
+hs_bindgen_4ec0bddefa08ebea
+  :: BG.Ptr SDL_hid_device
+  -> BG.CInt
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_4ec0bddefa08ebea =
+  BG.fromFFIType hs_bindgen_4ec0bddefa08ebea_base
+
+-- | Get a string from a HID device, based on its string index.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_indexed_string@, defined at @SDL3\/SDL_hidapi.h 526:33@
+sDL_hid_get_indexed_string
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@string_index@]: the index of the string to get.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.CInt
+sDL_hid_get_indexed_string =
+  hs_bindgen_4ec0bddefa08ebea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_device_info@
+foreign import ccall unsafe "hs_bindgen_48075159cccbc3cd"
+  hs_bindgen_48075159cccbc3cd_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_device_info@
+hs_bindgen_48075159cccbc3cd
+  :: BG.Ptr SDL_hid_device
+  -> IO (BG.Ptr SDL_hid_device_info)
+hs_bindgen_48075159cccbc3cd =
+  BG.fromFFIType hs_bindgen_48075159cccbc3cd_base
+
+-- | Get the device info from a HID device.
+--
+--     [Returns]: a pointer to the 'SDL_hid_device_info' for this hid_device or NULL on failure; call SDL_GetError() for more information. This struct is valid until the device is closed with @SDL_hid_close()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_device_info@, defined at @SDL3\/SDL_hidapi.h 538:51@
+sDL_hid_get_device_info
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> IO (BG.Ptr SDL_hid_device_info)
+sDL_hid_get_device_info = hs_bindgen_48075159cccbc3cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_report_descriptor@
+foreign import ccall unsafe "hs_bindgen_682cc2cefec05416"
+  hs_bindgen_682cc2cefec05416_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_get_report_descriptor@
+hs_bindgen_682cc2cefec05416
+  :: BG.Ptr SDL_hid_device
+  -> BG.Ptr BG.CUChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_682cc2cefec05416 =
+  BG.fromFFIType hs_bindgen_682cc2cefec05416_base
+
+-- | Get a report descriptor from a HID device.
+--
+--     User has to provide a preallocated buffer where descriptor will be copied to. The recommended size for a preallocated buffer is 4096 bytes.
+--
+--     [Returns]: the number of bytes actually copied or -1 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_get_report_descriptor@, defined at @SDL3\/SDL_hidapi.h 554:33@
+sDL_hid_get_report_descriptor
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @SDL_hid_open()@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@buf@]: the buffer to copy descriptor into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@buf_size@]: the size of the buffer in bytes.
+  -> IO BG.CInt
+sDL_hid_get_report_descriptor =
+  hs_bindgen_682cc2cefec05416
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_ble_scan@
+foreign import ccall unsafe "hs_bindgen_5c88299056af21de"
+  hs_bindgen_5c88299056af21de_base
+    :: BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hidapi_Unsafe_SDL_hid_ble_scan@
+hs_bindgen_5c88299056af21de
+  :: BG.CBool
+  -> IO ()
+hs_bindgen_5c88299056af21de =
+  BG.fromFFIType hs_bindgen_5c88299056af21de_base
+
+-- | Start or stop a BLE scan on iOS and tvOS to pair Steam Controllers.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_hid_ble_scan@, defined at @SDL3\/SDL_hidapi.h 563:34@
+sDL_hid_ble_scan
+  :: BG.CBool
+  -- ^
+  --
+  --           [@active@]: true to start the scan, false to stop the scan.
+  -> IO ()
+sDL_hid_ble_scan = hs_bindgen_5c88299056af21de
diff --git a/src/SDL3/Sys/Bindgen/Hints.hs b/src/SDL3/Sys/Bindgen/Hints.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Hints.hs
@@ -0,0 +1,12246 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | This file contains functions to set and get configuration hints, as well as listing each of them alphabetically.
+--
+--     The convention for naming hints is SDL_HINT_X, where \"SDL_X\" is the environment variable that can be used to override the default.
+--
+--     In general these hints are just that - they may or may not be supported or applicable on any given platform, but they provide a way for an application or user to give the library a hint as to how they would like the library to work. Specify the behavior of Alt+Tab while the keyboard is grabbed.
+--
+--     By default, SDL emulates Alt+Tab functionality while the keyboard is grabbed and your window is full-screen. This prevents the user from getting stuck in your application if you\'ve enabled keyboard grab.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": SDL will not handle Alt+Tab. Your application is responsible for handling Alt+Tab while the keyboard is grabbed.
+--
+--     * \"1\": SDL will minimize your window when Alt+Tab is pressed (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Hints (
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_ANDROID_BLOCK_ON_PAUSE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_ANDROID_LOW_LATENCY_AUDIO,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_ANDROID_TRAP_BACK_BUTTON,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_APP_ID,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_APP_NAME,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_CATEGORY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_CHANNELS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_DEVICE_APP_ICON_NAME,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_DEVICE_STREAM_NAME,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_DEVICE_STREAM_ROLE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_DEVICE_RAW_STREAM,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_DISK_INPUT_FILE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_DISK_OUTPUT_FILE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_DISK_TIMESCALE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_DRIVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_DUMMY_TIMESCALE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_FORMAT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_FREQUENCY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUDIO_INCLUDE_MONITORS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUTO_UPDATE_JOYSTICKS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_AUTO_UPDATE_SENSORS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_BMP_SAVE_LEGACY_FORMAT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_CAMERA_DRIVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_CPU_FEATURE_MASK,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_DIRECTINPUT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_FILE_DIALOG_DRIVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_DISPLAY_USABLE_BOUNDS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_INVALID_PARAM_CHECKS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_EMSCRIPTEN_ASYNCIFY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_EMSCRIPTEN_CANVAS_SELECTOR,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_ENABLE_SCREEN_KEYBOARD,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_EVDEV_DEVICES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_EVENT_LOGGING,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_FORCE_RAISEWINDOW,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_FRAMEBUFFER_ACCELERATION,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GAMECONTROLLERCONFIG,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GAMECONTROLLERCONFIG_FILE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GAMECONTROLLERTYPE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GAMECONTROLLER_IGNORE_DEVICES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GAMECONTROLLER_SENSOR_FUSION,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GDK_TEXTINPUT_DESCRIPTION,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GDK_TEXTINPUT_MAX_LENGTH,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GDK_TEXTINPUT_SCOPE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GDK_TEXTINPUT_TITLE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_HIDAPI_LIBUSB,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_HIDAPI_LIBUSB_GAMECUBE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_HIDAPI_LIBUSB_WHITELIST,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_HIDAPI_UDEV,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_GPU_DRIVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_HIDAPI_IGNORE_DEVICES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_IME_IMPLEMENTED_UI,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_IOS_HIDE_HOME_INDICATOR,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_ARCADESTICK_DEVICES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_BLACKLIST_DEVICES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_DEVICE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_ENHANCED_REPORTS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_GAMEINPUT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_GAMECUBE_DEVICES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_GAMECUBE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_JOY_CONS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_LUNA,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_PS3,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_PS4,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_PS5,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_SHIELD,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_STADIA,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_STEAM,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_STEAM_HOME_LED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_STEAMDECK,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_STEAM_HORI,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_LG4FF,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_8BITDO,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_SINPUT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_ZUIKI,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_FLYDIGI,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_SWITCH,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_SWITCH2,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_WII,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_XBOX,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_XBOX_360,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_GIP,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HIDAPI_GIP_RESET_FOR_METADATA,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_IOKIT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_LINUX_CLASSIC,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_LINUX_DEADZONES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_MFI,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_RAWINPUT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_ROG_CHAKRAM,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_THREAD,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_THROTTLE_DEVICES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_THROTTLE_DEVICES_EXCLUDED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_WGI,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_WHEEL_DEVICES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_WHEEL_DEVICES_EXCLUDED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_ZERO_CENTERED_DEVICES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_JOYSTICK_HAPTIC_AXES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_KEYCODE_OPTIONS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_KMSDRM_DEVICE_INDEX,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_KMSDRM_REQUIRE_DRM_MASTER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_KMSDRM_ATOMIC,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_LOGGING,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MAC_BACKGROUND_APP,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MAC_OPENGL_ASYNC_DISPATCH,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MAC_OPTION_AS_ALT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MAC_SCROLL_MOMENTUM,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MAC_PRESS_AND_HOLD,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MAIN_CALLBACK_RATE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_AUTO_CAPTURE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_DOUBLE_CLICK_TIME,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_DEFAULT_SYSTEM_CURSOR,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_DPI_SCALE_CURSORS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_EMULATE_WARP_WITH_RELATIVE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_FOCUS_CLICKTHROUGH,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_NORMAL_SPEED_SCALE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_RELATIVE_MODE_CENTER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_RELATIVE_SPEED_SCALE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_RELATIVE_WARP_MOTION,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MOUSE_TOUCH_EVENTS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_MUTE_CONSOLE_KEYBOARD,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_NO_SIGNAL_HANDLERS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_OPENGL_LIBRARY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_EGL_LIBRARY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_OPENGL_ES_DRIVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_OPENGL_FORCE_SRGB_FRAMEBUFFER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_OPENVR_LIBRARY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_ORIENTATIONS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_POLL_SENTINEL,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_PREFERRED_LOCALES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RENDER_DIRECT3D_THREADSAFE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RENDER_DIRECT3D11_DEBUG,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RENDER_DIRECT3D11_WARP,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RENDER_VULKAN_DEBUG,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RENDER_GPU_DEBUG,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RENDER_GPU_LOW_POWER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RENDER_DRIVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RENDER_LINE_METHOD,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RENDER_VSYNC,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RETURN_KEY_HIDES_IME,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_ROG_GAMEPAD_MICE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_PS2_GS_WIDTH,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_PS2_GS_HEIGHT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_PS2_GS_PROGRESSIVE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_PS2_GS_MODE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_RPI_VIDEO_LAYER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_SHUTDOWN_DBUS_ON_QUIT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_STORAGE_TITLE_DRIVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_STORAGE_USER_DRIVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_THREAD_PRIORITY_POLICY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_TIMER_RESOLUTION,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_TOUCH_MOUSE_EVENTS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_TRACKPAD_IS_TOUCH_ONLY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_TV_REMOTE_AS_JOYSTICK,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_ALLOW_SCREENSAVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_DISPLAY_PRIORITY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_DOUBLE_BUFFER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_DRIVER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_DUMMY_SAVE_FRAMES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_FORCE_EGL,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_METAL_AUTO_RESIZE_DRAWABLE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_MATCH_EXCLUSIVE_MODE_ON_MOVE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_OFFSCREEN_SAVE_FRAMES,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_WAYLAND_MODE_EMULATION,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_WAYLAND_MODE_SCALING,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_WAYLAND_SCALE_TO_DISPLAY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_WIN_D3DCOMPILER,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_X11_EXTERNAL_WINDOW_INPUT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_X11_NET_WM_PING,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_X11_NODIRECTCOLOR,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_X11_SCALING_FACTOR,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_X11_VISUALID,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_X11_WINDOW_VISUALID,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VIDEO_X11_XRANDR,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VITA_ENABLE_BACK_TOUCH,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VITA_ENABLE_FRONT_TOUCH,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VITA_MODULE_PATH,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VITA_PVR_INIT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VITA_RESOLUTION,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VITA_PVR_OPENGL,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VITA_TOUCH_MOUSE_DEVICE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VULKAN_DISPLAY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_VULKAN_LIBRARY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WAVE_FACT_CHUNK,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WAVE_CHUNK_LIMIT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WAVE_RIFF_CHUNK_SIZE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WAVE_TRUNCATION,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOW_ALLOW_TOPMOST,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_CLOSE_ON_ALT_F4,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_ENABLE_MESSAGELOOP,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_GAMEINPUT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_RAW_KEYBOARD,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_INTRESOURCE_ICON,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_USE_D3D9EX,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_WINDOWS_ERASE_BACKGROUND_MODE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_X11_FORCE_OVERRIDE_REDIRECT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_X11_WINDOW_TYPE,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_X11_XCB_LIBRARY,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_XINPUT_ENABLED,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_ASSERT,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_PEN_MOUSE_EVENTS,
+  SDL3.Sys.Bindgen.Hints.sDL_HINT_PEN_TOUCH_EVENTS,
+  SDL3.Sys.Bindgen.Hints.SDL_HintPriority (..),
+  pattern SDL3.Sys.Bindgen.Hints.SDL_HINT_DEFAULT,
+  pattern SDL3.Sys.Bindgen.Hints.SDL_HINT_NORMAL,
+  pattern SDL3.Sys.Bindgen.Hints.SDL_HINT_OVERRIDE,
+  SDL3.Sys.Bindgen.Hints.SDL_HintCallback_Aux (..),
+  SDL3.Sys.Bindgen.Hints.SDL_HintCallback (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @macro SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED@, literal @\"SDL_ALLOW_ALT_TAB_WHILE_GRABBED\"@, defined at @SDL3\/SDL_hints.h 66:9@
+sDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED :: BG.ByteString
+sDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x54
+    , 0x5F
+    , 0x54
+    , 0x41
+    , 0x42
+    , 0x5F
+    , 0x57
+    , 0x48
+    , 0x49
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x47
+    , 0x52
+    , 0x41
+    , 0x42
+    , 0x42
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable to control whether the SDL activity is allowed to be re-created.
+--
+--     If this hint is true, the activity can be recreated on demand by the OS, and Java static data and C++ static data remain with their current values. If this hint is false, then SDL will call exit() when you return from your main function and the application will be terminated and then started fresh each time.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The application starts fresh at each launch. (default)
+--
+--     * \"1\": The application activity can be recreated by the OS.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY@, literal @\"SDL_ANDROID_ALLOW_RECREATE_ACTIVITY\"@, defined at @SDL3\/SDL_hints.h 86:9@
+sDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY :: BG.ByteString
+sDL_HINT_ANDROID_ALLOW_RECREATE_ACTIVITY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x52
+    , 0x4F
+    , 0x49
+    , 0x44
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x43
+    , 0x52
+    , 0x45
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x41
+    , 0x43
+    , 0x54
+    , 0x49
+    , 0x56
+    , 0x49
+    , 0x54
+    , 0x59
+    ]
+
+-- | A variable to control whether the event loop will block itself when the app is paused.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Non blocking.
+--
+--     * \"1\": Blocking. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_ANDROID_BLOCK_ON_PAUSE@, literal @\"SDL_ANDROID_BLOCK_ON_PAUSE\"@, defined at @SDL3\/SDL_hints.h 101:9@
+sDL_HINT_ANDROID_BLOCK_ON_PAUSE :: BG.ByteString
+sDL_HINT_ANDROID_BLOCK_ON_PAUSE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x52
+    , 0x4F
+    , 0x49
+    , 0x44
+    , 0x5F
+    , 0x42
+    , 0x4C
+    , 0x4F
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x4F
+    , 0x4E
+    , 0x5F
+    , 0x50
+    , 0x41
+    , 0x55
+    , 0x53
+    , 0x45
+    ]
+
+-- | A variable to control whether low latency audio should be enabled.
+--
+--     Some devices have poor quality output when this is enabled, but this is usually an improvement in audio latency.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Low latency audio is not enabled.
+--
+--     * \"1\": Low latency audio is enabled. (default)
+--
+--     This hint should be set before SDL audio is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_ANDROID_LOW_LATENCY_AUDIO@, literal @\"SDL_ANDROID_LOW_LATENCY_AUDIO\"@, defined at @SDL3\/SDL_hints.h 118:9@
+sDL_HINT_ANDROID_LOW_LATENCY_AUDIO :: BG.ByteString
+sDL_HINT_ANDROID_LOW_LATENCY_AUDIO =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x52
+    , 0x4F
+    , 0x49
+    , 0x44
+    , 0x5F
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x4E
+    , 0x43
+    , 0x59
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    ]
+
+-- | A variable to control whether we trap the Android back button to handle it manually.
+--
+--     This is necessary for the right mouse button to work on some Android devices, or to be able to trap the back button for use in your code reliably. If this hint is true, the back button will show up as an SDL_EVENT_KEY_DOWN \/ SDL_EVENT_KEY_UP pair with a keycode of SDL_SCANCODE_AC_BACK.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Back button will be handled as usual for system. (default)
+--
+--     * \"1\": Back button will be trapped, allowing you to handle the key press manually. (This will also let right mouse click work on systems where the right mouse button functions as back.)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_ANDROID_TRAP_BACK_BUTTON@, literal @\"SDL_ANDROID_TRAP_BACK_BUTTON\"@, defined at @SDL3\/SDL_hints.h 141:9@
+sDL_HINT_ANDROID_TRAP_BACK_BUTTON :: BG.ByteString
+sDL_HINT_ANDROID_TRAP_BACK_BUTTON =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x52
+    , 0x4F
+    , 0x49
+    , 0x44
+    , 0x5F
+    , 0x54
+    , 0x52
+    , 0x41
+    , 0x50
+    , 0x5F
+    , 0x42
+    , 0x41
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x42
+    , 0x55
+    , 0x54
+    , 0x54
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | A variable setting the app ID string.
+--
+--     This string is used by desktop compositors to identify and group windows together, as well as match applications with associated desktop settings and icons.
+--
+--     This will override SDL_PROP_APP_METADATA_IDENTIFIER_STRING, if set by the application.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_APP_ID@, literal @\"SDL_APP_ID\"@, defined at @SDL3\/SDL_hints.h 157:9@
+sDL_HINT_APP_ID :: BG.ByteString
+sDL_HINT_APP_ID =
+  BG.pack [0x53, 0x44, 0x4C, 0x5F, 0x41, 0x50, 0x50, 0x5F, 0x49, 0x44]
+
+-- | A variable setting the application name.
+--
+--     This hint lets you specify the application name sent to the OS when required. For example, this will often appear in volume control applets for audio streams, and in lists of applications which are inhibiting the screensaver. You should use a string that describes your program (\"My Game 2: The Revenge\")
+--
+--     This will override SDL_PROP_APP_METADATA_NAME_STRING, if set by the application.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_APP_NAME@, literal @\"SDL_APP_NAME\"@, defined at @SDL3\/SDL_hints.h 175:9@
+sDL_HINT_APP_NAME :: BG.ByteString
+sDL_HINT_APP_NAME =
+  BG.pack [0x53, 0x44, 0x4C, 0x5F, 0x41, 0x50, 0x50, 0x5F, 0x4E, 0x41, 0x4D, 0x45]
+
+-- | A variable controlling whether controllers used with the Apple TV generate UI events.
+--
+--     When UI events are generated by controller input, the app will be backgrounded when the Apple TV remote\'s menu button is pressed, and when the pause or B buttons on gamepads are pressed.
+--
+--     More information about properly making use of controllers for the Apple TV can be found here: [https:\/\/developer.apple.com\/tvos\/human-interface-guidelines\/remote-and-controllers\/](https://developer.apple.com/tvos/human-interface-guidelines/remote-and-controllers/)
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Controller input does not generate UI events. (default)
+--
+--     * \"1\": Controller input generates UI events.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS@, literal @\"SDL_APPLE_TV_CONTROLLER_UI_EVENTS\"@, defined at @SDL3\/SDL_hints.h 198:9@
+sDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS :: BG.ByteString
+sDL_HINT_APPLE_TV_CONTROLLER_UI_EVENTS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x50
+    , 0x50
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x54
+    , 0x56
+    , 0x5F
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x54
+    , 0x52
+    , 0x4F
+    , 0x4C
+    , 0x4C
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x55
+    , 0x49
+    , 0x5F
+    , 0x45
+    , 0x56
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x53
+    ]
+
+-- | A variable controlling whether the Apple TV remote\'s joystick axes will automatically match the rotation of the remote.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Remote orientation does not affect joystick axes. (default)
+--
+--     * \"1\": Joystick axes are based on the orientation of the remote.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION@, literal @\"SDL_APPLE_TV_REMOTE_ALLOW_ROTATION\"@, defined at @SDL3\/SDL_hints.h 213:9@
+sDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION :: BG.ByteString
+sDL_HINT_APPLE_TV_REMOTE_ALLOW_ROTATION =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x50
+    , 0x50
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x54
+    , 0x56
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4D
+    , 0x4F
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x52
+    , 0x4F
+    , 0x54
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | Specify the default ALSA audio device name.
+--
+--     This variable is a specific audio device to open when the \"default\" audio device is used.
+--
+--     This hint will be ignored when opening the default playback device if SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE is set, or when opening the default recording device if SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE is set.
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE', 'sDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE'
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE@, literal @\"SDL_AUDIO_ALSA_DEFAULT_DEVICE\"@, defined at @SDL3\/SDL_hints.h 233:9@
+sDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE :: BG.ByteString
+sDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x53
+    , 0x41
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x46
+    , 0x41
+    , 0x55
+    , 0x4C
+    , 0x54
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    ]
+
+-- | Specify the default ALSA audio playback device name.
+--
+--     This variable is a specific audio device to open for playback, when the \"default\" audio device is used.
+--
+--     If this hint isn\'t set, SDL will check SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE before choosing a reasonable default.
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE', 'sDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE'
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE@, literal @\"SDL_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE\"@, defined at @SDL3\/SDL_hints.h 251:9@
+sDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE :: BG.ByteString
+sDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x53
+    , 0x41
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x46
+    , 0x41
+    , 0x55
+    , 0x4C
+    , 0x54
+    , 0x5F
+    , 0x50
+    , 0x4C
+    , 0x41
+    , 0x59
+    , 0x42
+    , 0x41
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    ]
+
+-- | Specify the default ALSA audio recording device name.
+--
+--     This variable is a specific audio device to open for recording, when the \"default\" audio device is used.
+--
+--     If this hint isn\'t set, SDL will check SDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE before choosing a reasonable default.
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HINT_AUDIO_ALSA_DEFAULT_PLAYBACK_DEVICE', 'sDL_HINT_AUDIO_ALSA_DEFAULT_DEVICE'
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE@, literal @\"SDL_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE\"@, defined at @SDL3\/SDL_hints.h 269:9@
+sDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE :: BG.ByteString
+sDL_HINT_AUDIO_ALSA_DEFAULT_RECORDING_DEVICE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x53
+    , 0x41
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x46
+    , 0x41
+    , 0x55
+    , 0x4C
+    , 0x54
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x43
+    , 0x4F
+    , 0x52
+    , 0x44
+    , 0x49
+    , 0x4E
+    , 0x47
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    ]
+
+-- | A variable controlling the audio category on iOS and macOS.
+--
+--     The variable can be set to the following values:
+--
+--     * \"ambient\": Use the AVAudioSessionCategoryAmbient audio category, will be muted by the phone mute switch (default)
+--
+--     * \"playback\": Use the AVAudioSessionCategoryPlayback category.
+--
+--     For more information, see Apple\'s documentation: [https:\/\/developer.apple.com\/library\/content\/documentation\/Audio\/Conceptual\/AudioSessionProgrammingGuide\/AudioSessionCategoriesandModes\/AudioSessionCategoriesandModes.html](https://developer.apple.com/library/content/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/AudioSessionCategoriesandModes/AudioSessionCategoriesandModes.html)
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_CATEGORY@, literal @\"SDL_AUDIO_CATEGORY\"@, defined at @SDL3\/SDL_hints.h 287:9@
+sDL_HINT_AUDIO_CATEGORY :: BG.ByteString
+sDL_HINT_AUDIO_CATEGORY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x43
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x47
+    , 0x4F
+    , 0x52
+    , 0x59
+    ]
+
+-- | A variable controlling the default audio channel count.
+--
+--     If the application doesn\'t specify the audio channel count when opening the device, this hint can be used to specify a default channel count that will be used. This defaults to \"1\" for recording and \"2\" for playback devices.
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_CHANNELS@, literal @\"SDL_AUDIO_CHANNELS\"@, defined at @SDL3\/SDL_hints.h 300:9@
+sDL_HINT_AUDIO_CHANNELS :: BG.ByteString
+sDL_HINT_AUDIO_CHANNELS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x43
+    , 0x48
+    , 0x41
+    , 0x4E
+    , 0x4E
+    , 0x45
+    , 0x4C
+    , 0x53
+    ]
+
+-- | Specify an application icon name for an audio device.
+--
+--     Some audio backends (such as Pulseaudio and Pipewire) allow you to set an XDG icon name for your application. Among other things, this icon might show up in a system control panel that lets the user adjust the volume on specific audio streams instead of using one giant master volume slider. Note that this is unrelated to the icon used by the windowing system, which may be set with SDL_SetWindowIcon (or via desktop file on Wayland).
+--
+--     Setting this to \"\" or leaving it unset will have SDL use a reasonable default, \"applications-games\", which is likely to be installed. See [https:\/\/specifications.freedesktop.org\/icon-theme-spec\/icon-theme-spec-latest.html](https://specifications.freedesktop.org/icon-theme-spec/icon-theme-spec-latest.html) and [https:\/\/specifications.freedesktop.org\/icon-naming-spec\/icon-naming-spec-latest.html](https://specifications.freedesktop.org/icon-naming-spec/icon-naming-spec-latest.html) for the relevant XDG icon specs.
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_DEVICE_APP_ICON_NAME@, literal @\"SDL_AUDIO_DEVICE_APP_ICON_NAME\"@, defined at @SDL3\/SDL_hints.h 323:9@
+sDL_HINT_AUDIO_DEVICE_APP_ICON_NAME :: BG.ByteString
+sDL_HINT_AUDIO_DEVICE_APP_ICON_NAME =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x41
+    , 0x50
+    , 0x50
+    , 0x5F
+    , 0x49
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x5F
+    , 0x4E
+    , 0x41
+    , 0x4D
+    , 0x45
+    ]
+
+-- | A variable controlling device buffer size.
+--
+--     This hint is an integer > 0, that represents the size of the device\'s buffer in sample frames (stereo audio data in 16-bit format is 4 bytes per sample frame, for example).
+--
+--     SDL3 generally decides this value on behalf of the app, but if for some reason the app needs to dictate this (because they want either lower latency or higher throughput AND ARE WILLING TO DEAL WITH what that might require of the app), they can specify it.
+--
+--     SDL will try to accommodate this value, but there is no promise you\'ll get the buffer size requested. Many platforms won\'t honor this request at all, or might adjust it.
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES@, literal @\"SDL_AUDIO_DEVICE_SAMPLE_FRAMES\"@, defined at @SDL3\/SDL_hints.h 345:9@
+sDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES :: BG.ByteString
+sDL_HINT_AUDIO_DEVICE_SAMPLE_FRAMES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x53
+    , 0x41
+    , 0x4D
+    , 0x50
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x46
+    , 0x52
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x53
+    ]
+
+-- | Specify an audio stream name for an audio device.
+--
+--     Some audio backends (such as PulseAudio) allow you to describe your audio stream. Among other things, this description might show up in a system control panel that lets the user adjust the volume on specific audio streams instead of using one giant master volume slider.
+--
+--     This hints lets you transmit that information to the OS. The contents of this hint are used while opening an audio device. You should use a string that describes your what your program is playing (\"audio stream\" is probably sufficient in many cases, but this could be useful for something like \"team chat\" if you have a headset playing VoIP audio separately).
+--
+--     Setting this to \"\" or leaving it unset will have SDL use a reasonable default: \"audio stream\" or something similar.
+--
+--     Note that while this talks about audio streams, this is an OS-level concept, so it applies to a physical audio device in this case, and not an SDL_AudioStream, nor an SDL logical audio device.
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_DEVICE_STREAM_NAME@, literal @\"SDL_AUDIO_DEVICE_STREAM_NAME\"@, defined at @SDL3\/SDL_hints.h 372:9@
+sDL_HINT_AUDIO_DEVICE_STREAM_NAME :: BG.ByteString
+sDL_HINT_AUDIO_DEVICE_STREAM_NAME =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x53
+    , 0x54
+    , 0x52
+    , 0x45
+    , 0x41
+    , 0x4D
+    , 0x5F
+    , 0x4E
+    , 0x41
+    , 0x4D
+    , 0x45
+    ]
+
+-- | Specify an application role for an audio device.
+--
+--     Some audio backends (such as Pipewire) allow you to describe the role of your audio stream. Among other things, this description might show up in a system control panel or software for displaying and manipulating media playback\/recording graphs.
+--
+--     This hints lets you transmit that information to the OS. The contents of this hint are used while opening an audio device. You should use a string that describes your what your program is playing (Game, Music, Movie, etc...).
+--
+--     Setting this to \"\" or leaving it unset will have SDL use a reasonable default: \"Game\" or something similar.
+--
+--     Note that while this talks about audio streams, this is an OS-level concept, so it applies to a physical audio device in this case, and not an SDL_AudioStream, nor an SDL logical audio device.
+--
+--     For Windows WASAPI audio, the following roles are supported, and map to @AUDIO_STREAM_CATEGORY@:
+--
+--     * \"Other\" (default)
+--
+--     * \"Communications\" - Real-time communications, such as VOIP or chat
+--
+--     * \"Game\" - Game audio
+--
+--     * \"GameChat\" - Game chat audio, similar to \"Communications\" except that this will not attenuate other audio streams
+--
+--     * \"Movie\" - Music or sound with dialog
+--
+--     * \"Media\" - Music or sound without dialog
+--
+--     If your application applies its own echo cancellation, gain control, and noise reduction it should also set SDL_HINT_AUDIO_DEVICE_RAW_STREAM.
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_DEVICE_STREAM_ROLE@, literal @\"SDL_AUDIO_DEVICE_STREAM_ROLE\"@, defined at @SDL3\/SDL_hints.h 412:9@
+sDL_HINT_AUDIO_DEVICE_STREAM_ROLE :: BG.ByteString
+sDL_HINT_AUDIO_DEVICE_STREAM_ROLE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x53
+    , 0x54
+    , 0x52
+    , 0x45
+    , 0x41
+    , 0x4D
+    , 0x5F
+    , 0x52
+    , 0x4F
+    , 0x4C
+    , 0x45
+    ]
+
+-- | Specify whether this audio device should do audio processing.
+--
+--     Some operating systems perform echo cancellation, gain control, and noise reduction as needed. If your application already handles these, you can set this hint to prevent the OS from doing additional audio processing.
+--
+--     This corresponds to the WASAPI audio option @AUDCLNT_STREAMOPTIONS_RAW@.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": audio processing can be done by the OS. (default)
+--
+--     * \"1\": audio processing is done by the application.
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_DEVICE_RAW_STREAM@, literal @\"SDL_AUDIO_DEVICE_RAW_STREAM\"@, defined at @SDL3\/SDL_hints.h 432:9@
+sDL_HINT_AUDIO_DEVICE_RAW_STREAM :: BG.ByteString
+sDL_HINT_AUDIO_DEVICE_RAW_STREAM =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x41
+    , 0x57
+    , 0x5F
+    , 0x53
+    , 0x54
+    , 0x52
+    , 0x45
+    , 0x41
+    , 0x4D
+    ]
+
+-- | Specify the input file when recording audio using the disk audio driver.
+--
+--     This defaults to \"sdlaudio-in.raw\"
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_DISK_INPUT_FILE@, literal @\"SDL_AUDIO_DISK_INPUT_FILE\"@, defined at @SDL3\/SDL_hints.h 443:9@
+sDL_HINT_AUDIO_DISK_INPUT_FILE :: BG.ByteString
+sDL_HINT_AUDIO_DISK_INPUT_FILE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x53
+    , 0x4B
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    , 0x5F
+    , 0x46
+    , 0x49
+    , 0x4C
+    , 0x45
+    ]
+
+-- | Specify the output file when playing audio using the disk audio driver.
+--
+--     This defaults to \"sdlaudio.raw\"
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_DISK_OUTPUT_FILE@, literal @\"SDL_AUDIO_DISK_OUTPUT_FILE\"@, defined at @SDL3\/SDL_hints.h 454:9@
+sDL_HINT_AUDIO_DISK_OUTPUT_FILE :: BG.ByteString
+sDL_HINT_AUDIO_DISK_OUTPUT_FILE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x53
+    , 0x4B
+    , 0x5F
+    , 0x4F
+    , 0x55
+    , 0x54
+    , 0x50
+    , 0x55
+    , 0x54
+    , 0x5F
+    , 0x46
+    , 0x49
+    , 0x4C
+    , 0x45
+    ]
+
+-- | A variable controlling the audio rate when using the disk audio driver.
+--
+--     The disk audio driver normally simulates real-time for the audio rate that was specified, but you can use this variable to adjust this rate higher or lower down to 0. The default value is \"1.0\".
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_DISK_TIMESCALE@, literal @\"SDL_AUDIO_DISK_TIMESCALE\"@, defined at @SDL3\/SDL_hints.h 467:9@
+sDL_HINT_AUDIO_DISK_TIMESCALE :: BG.ByteString
+sDL_HINT_AUDIO_DISK_TIMESCALE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x53
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x49
+    , 0x4D
+    , 0x45
+    , 0x53
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x45
+    ]
+
+-- | A variable that specifies an audio backend to use.
+--
+--     By default, SDL will try all available audio backends in a reasonable order until it finds one that can work, but this hint allows the app or user to force a specific driver, such as \"pipewire\" if, say, you are on PulseAudio but want to try talking to the lower level instead.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_DRIVER@, literal @\"SDL_AUDIO_DRIVER\"@, defined at @SDL3\/SDL_hints.h 481:9@
+sDL_HINT_AUDIO_DRIVER :: BG.ByteString
+sDL_HINT_AUDIO_DRIVER =
+  BG.pack
+    [0x53, 0x44, 0x4C, 0x5F, 0x41, 0x55, 0x44, 0x49, 0x4F, 0x5F, 0x44, 0x52, 0x49, 0x56, 0x45, 0x52]
+
+-- | A variable controlling the audio rate when using the dummy audio driver.
+--
+--     The dummy audio driver normally simulates real-time for the audio rate that was specified, but you can use this variable to adjust this rate higher or lower down to 0. The default value is \"1.0\".
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_DUMMY_TIMESCALE@, literal @\"SDL_AUDIO_DUMMY_TIMESCALE\"@, defined at @SDL3\/SDL_hints.h 494:9@
+sDL_HINT_AUDIO_DUMMY_TIMESCALE :: BG.ByteString
+sDL_HINT_AUDIO_DUMMY_TIMESCALE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x55
+    , 0x4D
+    , 0x4D
+    , 0x59
+    , 0x5F
+    , 0x54
+    , 0x49
+    , 0x4D
+    , 0x45
+    , 0x53
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x45
+    ]
+
+-- | A variable controlling the default audio format.
+--
+--     If the application doesn\'t specify the audio format when opening the device, this hint can be used to specify a default format that will be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"U8\": Unsigned 8-bit audio
+--
+--     * \"S8\": Signed 8-bit audio
+--
+--     * \"S16LE\": Signed 16-bit little-endian audio
+--
+--     * \"S16BE\": Signed 16-bit big-endian audio
+--
+--     * \"S16\": Signed 16-bit native-endian audio (default)
+--
+--     * \"S32LE\": Signed 32-bit little-endian audio
+--
+--     * \"S32BE\": Signed 32-bit big-endian audio
+--
+--     * \"S32\": Signed 32-bit native-endian audio
+--
+--     * \"F32LE\": Floating point little-endian audio
+--
+--     * \"F32BE\": Floating point big-endian audio
+--
+--     * \"F32\": Floating point native-endian audio
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_FORMAT@, literal @\"SDL_AUDIO_FORMAT\"@, defined at @SDL3\/SDL_hints.h 521:9@
+sDL_HINT_AUDIO_FORMAT :: BG.ByteString
+sDL_HINT_AUDIO_FORMAT =
+  BG.pack
+    [0x53, 0x44, 0x4C, 0x5F, 0x41, 0x55, 0x44, 0x49, 0x4F, 0x5F, 0x46, 0x4F, 0x52, 0x4D, 0x41, 0x54]
+
+-- | A variable controlling the default audio frequency.
+--
+--     If the application doesn\'t specify the audio frequency when opening the device, this hint can be used to specify a default frequency that will be used. This defaults to \"44100\".
+--
+--     This hint should be set before an audio device is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_FREQUENCY@, literal @\"SDL_AUDIO_FREQUENCY\"@, defined at @SDL3\/SDL_hints.h 534:9@
+sDL_HINT_AUDIO_FREQUENCY :: BG.ByteString
+sDL_HINT_AUDIO_FREQUENCY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x46
+    , 0x52
+    , 0x45
+    , 0x51
+    , 0x55
+    , 0x45
+    , 0x4E
+    , 0x43
+    , 0x59
+    ]
+
+-- | A variable that causes SDL to not ignore audio \"monitors\".
+--
+--     This is currently only used by the PulseAudio driver.
+--
+--     By default, SDL ignores audio devices that aren\'t associated with physical hardware. Changing this hint to \"1\" will expose anything SDL sees that appears to be an audio source or sink. This will add \"devices\" to the list that the user probably doesn\'t want or need, but it can be useful in scenarios where you want to hook up SDL to some sort of virtual device, etc.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Audio monitor devices will be ignored. (default)
+--
+--     * \"1\": Audio monitor devices will show up in the device list.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUDIO_INCLUDE_MONITORS@, literal @\"SDL_AUDIO_INCLUDE_MONITORS\"@, defined at @SDL3\/SDL_hints.h 557:9@
+sDL_HINT_AUDIO_INCLUDE_MONITORS :: BG.ByteString
+sDL_HINT_AUDIO_INCLUDE_MONITORS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x44
+    , 0x49
+    , 0x4F
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x43
+    , 0x4C
+    , 0x55
+    , 0x44
+    , 0x45
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x4E
+    , 0x49
+    , 0x54
+    , 0x4F
+    , 0x52
+    , 0x53
+    ]
+
+-- | A variable controlling whether SDL updates joystick state when getting input events.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": You\'ll call SDL_UpdateJoysticks() manually.
+--
+--     * \"1\": SDL will automatically call SDL_UpdateJoysticks(). (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUTO_UPDATE_JOYSTICKS@, literal @\"SDL_AUTO_UPDATE_JOYSTICKS\"@, defined at @SDL3\/SDL_hints.h 572:9@
+sDL_HINT_AUTO_UPDATE_JOYSTICKS :: BG.ByteString
+sDL_HINT_AUTO_UPDATE_JOYSTICKS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x54
+    , 0x4F
+    , 0x5F
+    , 0x55
+    , 0x50
+    , 0x44
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x53
+    ]
+
+-- | A variable controlling whether SDL updates sensor state when getting input events.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": You\'ll call SDL_UpdateSensors() manually.
+--
+--     * \"1\": SDL will automatically call SDL_UpdateSensors(). (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_AUTO_UPDATE_SENSORS@, literal @\"SDL_AUTO_UPDATE_SENSORS\"@, defined at @SDL3\/SDL_hints.h 587:9@
+sDL_HINT_AUTO_UPDATE_SENSORS :: BG.ByteString
+sDL_HINT_AUTO_UPDATE_SENSORS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x54
+    , 0x4F
+    , 0x5F
+    , 0x55
+    , 0x50
+    , 0x44
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x53
+    , 0x45
+    , 0x4E
+    , 0x53
+    , 0x4F
+    , 0x52
+    , 0x53
+    ]
+
+-- | Prevent SDL from using version 4 of the bitmap header when saving BMPs.
+--
+--     The bitmap header version 4 is required for proper alpha channel support and SDL will use it when required. Should this not be desired, this hint can force the use of the 40 byte header version which is supported everywhere.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Surfaces with a colorkey or an alpha channel are saved to a 32-bit BMP file with an alpha mask. SDL will use the bitmap header version 4 and set the alpha mask accordingly. (default)
+--
+--     * \"1\": Surfaces with a colorkey or an alpha channel are saved to a 32-bit BMP file without an alpha mask. The alpha channel data will be in the file, but applications are going to ignore it.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_BMP_SAVE_LEGACY_FORMAT@, literal @\"SDL_BMP_SAVE_LEGACY_FORMAT\"@, defined at @SDL3\/SDL_hints.h 610:9@
+sDL_HINT_BMP_SAVE_LEGACY_FORMAT :: BG.ByteString
+sDL_HINT_BMP_SAVE_LEGACY_FORMAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x42
+    , 0x4D
+    , 0x50
+    , 0x5F
+    , 0x53
+    , 0x41
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x4C
+    , 0x45
+    , 0x47
+    , 0x41
+    , 0x43
+    , 0x59
+    , 0x5F
+    , 0x46
+    , 0x4F
+    , 0x52
+    , 0x4D
+    , 0x41
+    , 0x54
+    ]
+
+-- | A variable that decides what camera backend to use.
+--
+--     By default, SDL will try all available camera backends in a reasonable order until it finds one that can work, but this hint allows the app or user to force a specific target, such as \"directshow\" if, say, you are on Windows Media Foundations but want to try DirectShow instead.
+--
+--     The default value is unset, in which case SDL will try to figure out the best camera backend on your behalf. This hint needs to be set before SDL_Init() is called to be useful.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_CAMERA_DRIVER@, literal @\"SDL_CAMERA_DRIVER\"@, defined at @SDL3\/SDL_hints.h 626:9@
+sDL_HINT_CAMERA_DRIVER :: BG.ByteString
+sDL_HINT_CAMERA_DRIVER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x43
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x52
+    , 0x41
+    , 0x5F
+    , 0x44
+    , 0x52
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x52
+    ]
+
+-- | A variable that limits what CPU features are available.
+--
+--     By default, SDL marks all features the current CPU supports as available. This hint allows the enabled features to be limited to a subset.
+--
+--     When the hint is unset, or empty, SDL will enable all detected CPU features.
+--
+--     The variable can be set to a comma separated list containing the following items:
+--
+--     * \"all\"
+--
+--     * \"altivec\"
+--
+--     * \"sse\"
+--
+--     * \"sse2\"
+--
+--     * \"sse3\"
+--
+--     * \"sse41\"
+--
+--     * \"sse42\"
+--
+--     * \"avx\"
+--
+--     * \"avx2\"
+--
+--     * \"avx512f\"
+--
+--     * \"arm-simd\"
+--
+--     * \"neon\"
+--
+--     * \"lsx\"
+--
+--     * \"lasx\"
+--
+--     The items can be prefixed by \'+\'\/\'-\' to add\/remove features.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_CPU_FEATURE_MASK@, literal @\"SDL_CPU_FEATURE_MASK\"@, defined at @SDL3\/SDL_hints.h 659:9@
+sDL_HINT_CPU_FEATURE_MASK :: BG.ByteString
+sDL_HINT_CPU_FEATURE_MASK =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x43
+    , 0x50
+    , 0x55
+    , 0x5F
+    , 0x46
+    , 0x45
+    , 0x41
+    , 0x54
+    , 0x55
+    , 0x52
+    , 0x45
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x53
+    , 0x4B
+    ]
+
+-- | A variable controlling whether DirectInput should be used for controllers.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable DirectInput detection.
+--
+--     * \"1\": Enable DirectInput detection. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_DIRECTINPUT@, literal @\"SDL_JOYSTICK_DIRECTINPUT\"@, defined at @SDL3\/SDL_hints.h 673:9@
+sDL_HINT_JOYSTICK_DIRECTINPUT :: BG.ByteString
+sDL_HINT_JOYSTICK_DIRECTINPUT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x52
+    , 0x45
+    , 0x43
+    , 0x54
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    ]
+
+-- | A variable that specifies a dialog backend to use.
+--
+--     By default, SDL will try all available dialog backends in a reasonable order until it finds one that can work, but this hint allows the app or user to force a specific target.
+--
+--     If the specified target does not exist or is not available, the dialog-related function calls will fail.
+--
+--     This hint currently only applies to platforms using the generic \"Unix\" dialog implementation, but may be extended to more platforms in the future. Note that some Unix and Unix-like platforms have their own implementation, such as macOS and Haiku.
+--
+--     The variable can be set to the following values:
+--
+--     * NULL: Select automatically (default, all platforms)
+--
+--     * \"portal\": Use XDG Portals through DBus (Unix only)
+--
+--     * \"zenity\": Use the Zenity program (Unix only)
+--
+--     More options may be added in the future.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_FILE_DIALOG_DRIVER@, literal @\"SDL_FILE_DIALOG_DRIVER\"@, defined at @SDL3\/SDL_hints.h 702:9@
+sDL_HINT_FILE_DIALOG_DRIVER :: BG.ByteString
+sDL_HINT_FILE_DIALOG_DRIVER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x46
+    , 0x49
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x41
+    , 0x4C
+    , 0x4F
+    , 0x47
+    , 0x5F
+    , 0x44
+    , 0x52
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x52
+    ]
+
+-- | Override for SDL_GetDisplayUsableBounds().
+--
+--     If set, this hint will override the expected results for SDL_GetDisplayUsableBounds() for display index 0. Generally you don\'t want to do this, but this allows an embedded system to request that some of the screen be reserved for other uses when paired with a well-behaved application.
+--
+--     The contents of this hint must be 4 comma-separated integers, the first is the bounds x, then y, width and height, in that order.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_DISPLAY_USABLE_BOUNDS@, literal @\"SDL_DISPLAY_USABLE_BOUNDS\"@, defined at @SDL3\/SDL_hints.h 720:9@
+sDL_HINT_DISPLAY_USABLE_BOUNDS :: BG.ByteString
+sDL_HINT_DISPLAY_USABLE_BOUNDS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x53
+    , 0x50
+    , 0x4C
+    , 0x41
+    , 0x59
+    , 0x5F
+    , 0x55
+    , 0x53
+    , 0x41
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x42
+    , 0x4F
+    , 0x55
+    , 0x4E
+    , 0x44
+    , 0x53
+    ]
+
+-- | Set the level of checking for invalid parameters passed to SDL functions.
+--
+--     The variable can be set to the following values:
+--
+--     * \"1\": Enable fast parameter error checking, e.g. quick NULL checks, etc.
+--
+--     * \"2\": Enable full parameter error checking, e.g. validating objects are the correct type, etc. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_INVALID_PARAM_CHECKS@, literal @\"SDL_INVALID_PARAM_CHECKS\"@, defined at @SDL3\/SDL_hints.h 735:9@
+sDL_HINT_INVALID_PARAM_CHECKS :: BG.ByteString
+sDL_HINT_INVALID_PARAM_CHECKS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x56
+    , 0x41
+    , 0x4C
+    , 0x49
+    , 0x44
+    , 0x5F
+    , 0x50
+    , 0x41
+    , 0x52
+    , 0x41
+    , 0x4D
+    , 0x5F
+    , 0x43
+    , 0x48
+    , 0x45
+    , 0x43
+    , 0x4B
+    , 0x53
+    ]
+
+-- | Disable giving back control to the browser automatically when running with asyncify.
+--
+--     With -s ASYNCIFY, SDL calls emscripten_sleep during operations such as refreshing the screen or polling events.
+--
+--     This hint only applies to the emscripten platform.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable emscripten_sleep calls (if you give back browser control manually or use asyncify for other purposes).
+--
+--     * \"1\": Enable emscripten_sleep calls. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_EMSCRIPTEN_ASYNCIFY@, literal @\"SDL_EMSCRIPTEN_ASYNCIFY\"@, defined at @SDL3\/SDL_hints.h 756:9@
+sDL_HINT_EMSCRIPTEN_ASYNCIFY :: BG.ByteString
+sDL_HINT_EMSCRIPTEN_ASYNCIFY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x45
+    , 0x4D
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x49
+    , 0x50
+    , 0x54
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x41
+    , 0x53
+    , 0x59
+    , 0x4E
+    , 0x43
+    , 0x49
+    , 0x46
+    , 0x59
+    ]
+
+-- | Specify the CSS selector used for the \"default\" window\/canvas.
+--
+--     This hint only applies to the emscripten platform.
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_EMSCRIPTEN_CANVAS_SELECTOR@, literal @\"SDL_EMSCRIPTEN_CANVAS_SELECTOR\"@, defined at @SDL3\/SDL_hints.h 767:9@
+sDL_HINT_EMSCRIPTEN_CANVAS_SELECTOR :: BG.ByteString
+sDL_HINT_EMSCRIPTEN_CANVAS_SELECTOR =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x45
+    , 0x4D
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x49
+    , 0x50
+    , 0x54
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x43
+    , 0x41
+    , 0x4E
+    , 0x56
+    , 0x41
+    , 0x53
+    , 0x5F
+    , 0x53
+    , 0x45
+    , 0x4C
+    , 0x45
+    , 0x43
+    , 0x54
+    , 0x4F
+    , 0x52
+    ]
+
+-- | Override the binding element for keyboard inputs for Emscripten builds.
+--
+--     This hint only applies to the emscripten platform.
+--
+--     The variable can be one of:
+--
+--     * \"\#window\": the javascript window object
+--
+--     * \"\#document\": the javascript document object
+--
+--     * \"\#screen\": the javascript window.screen object
+--
+--     * \"\#canvas\": the WebGL canvas element
+--
+--     * \"\#none\": Don\'t bind anything at all
+--
+--     * any other string without a leading \# sign applies to the element on the page with that ID.
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT@, literal @\"SDL_EMSCRIPTEN_KEYBOARD_ELEMENT\"@, defined at @SDL3\/SDL_hints.h 788:9@
+sDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT :: BG.ByteString
+sDL_HINT_EMSCRIPTEN_KEYBOARD_ELEMENT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x45
+    , 0x4D
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x49
+    , 0x50
+    , 0x54
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x4B
+    , 0x45
+    , 0x59
+    , 0x42
+    , 0x4F
+    , 0x41
+    , 0x52
+    , 0x44
+    , 0x5F
+    , 0x45
+    , 0x4C
+    , 0x45
+    , 0x4D
+    , 0x45
+    , 0x4E
+    , 0x54
+    ]
+
+-- | A variable that controls whether the on-screen keyboard should be shown when text input is active.
+--
+--     The variable can be set to the following values:
+--
+--     * \"auto\": The on-screen keyboard will be shown if there is no physical keyboard attached. (default)
+--
+--     * \"0\": Do not show the on-screen keyboard.
+--
+--     * \"1\": Show the on-screen keyboard, if available.
+--
+--     This hint must be set before SDL_StartTextInput() is called
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_ENABLE_SCREEN_KEYBOARD@, literal @\"SDL_ENABLE_SCREEN_KEYBOARD\"@, defined at @SDL3\/SDL_hints.h 805:9@
+sDL_HINT_ENABLE_SCREEN_KEYBOARD :: BG.ByteString
+sDL_HINT_ENABLE_SCREEN_KEYBOARD =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x45
+    , 0x4E
+    , 0x41
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x45
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x4B
+    , 0x45
+    , 0x59
+    , 0x42
+    , 0x4F
+    , 0x41
+    , 0x52
+    , 0x44
+    ]
+
+-- | A variable containing a list of evdev devices to use if udev is not available.
+--
+--     The list of devices is in the form:
+--
+--     deviceclass:path[,deviceclass:path[,...]]
+--
+--     where device class is an integer representing the SDL_UDEV_deviceclass and path is the full path to the event device.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_EVDEV_DEVICES@, literal @\"SDL_EVDEV_DEVICES\"@, defined at @SDL3\/SDL_hints.h 822:9@
+sDL_HINT_EVDEV_DEVICES :: BG.ByteString
+sDL_HINT_EVDEV_DEVICES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x45
+    , 0x56
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable controlling verbosity of the logging of SDL events pushed onto the internal queue.
+--
+--     The variable can be set to the following values, from least to most verbose:
+--
+--     * \"0\": Don\'t log any events. (default)
+--
+--     * \"1\": Log most events (other than the really spammy ones).
+--
+--     * \"2\": Include mouse and finger motion events.
+--
+--     This is generally meant to be used to debug SDL itself, but can be useful for application developers that need better visibility into what is going on in the event queue. Logged events are sent through SDL_Log(), which means by default they appear on stdout on most platforms or maybe OutputDebugString() on Windows, and can be funneled by the app with SDL_SetLogOutputFunction(), etc.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_EVENT_LOGGING@, literal @\"SDL_EVENT_LOGGING\"@, defined at @SDL3\/SDL_hints.h 846:9@
+sDL_HINT_EVENT_LOGGING :: BG.ByteString
+sDL_HINT_EVENT_LOGGING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x45
+    , 0x56
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x5F
+    , 0x4C
+    , 0x4F
+    , 0x47
+    , 0x47
+    , 0x49
+    , 0x4E
+    , 0x47
+    ]
+
+-- | A variable controlling whether raising the window should be done more forcefully.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Honor the OS policy for raising windows. (default)
+--
+--     * \"1\": Force the window to be raised, overriding any OS policy.
+--
+--     At present, this is only an issue under MS Windows, which makes it nearly impossible to programmatically move a window to the foreground, for \"security\" reasons. See [http:\/\/stackoverflow.com\/a\/34414846](http://stackoverflow.com/a/34414846) for a discussion.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_FORCE_RAISEWINDOW@, literal @\"SDL_FORCE_RAISEWINDOW\"@, defined at @SDL3\/SDL_hints.h 866:9@
+sDL_HINT_FORCE_RAISEWINDOW :: BG.ByteString
+sDL_HINT_FORCE_RAISEWINDOW =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x46
+    , 0x4F
+    , 0x52
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x41
+    , 0x49
+    , 0x53
+    , 0x45
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    ]
+
+-- | A variable controlling how 3D acceleration is used to accelerate the SDL screen surface.
+--
+--     SDL can try to accelerate the SDL screen surface by using streaming textures with a 3D rendering engine. This variable controls whether and how this is done.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable 3D acceleration
+--
+--     * \"1\": Enable 3D acceleration, using the default renderer. (default)
+--
+--     * \"X\": Enable 3D acceleration, using X where X is one of the valid rendering drivers. (e.g. \"direct3d\", \"opengl\", etc.)
+--
+--     This hint should be set before calling SDL_GetWindowSurface()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_FRAMEBUFFER_ACCELERATION@, literal @\"SDL_FRAMEBUFFER_ACCELERATION\"@, defined at @SDL3\/SDL_hints.h 887:9@
+sDL_HINT_FRAMEBUFFER_ACCELERATION :: BG.ByteString
+sDL_HINT_FRAMEBUFFER_ACCELERATION =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x46
+    , 0x52
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x42
+    , 0x55
+    , 0x46
+    , 0x46
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x41
+    , 0x43
+    , 0x43
+    , 0x45
+    , 0x4C
+    , 0x45
+    , 0x52
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | A variable that lets you manually hint extra gamecontroller db entries.
+--
+--     The variable should be newline delimited rows of gamecontroller config data, see SDL_gamepad.h
+--
+--     You can update mappings after SDL is initialized with SDL_GetGamepadMappingForGUID() and SDL_AddGamepadMapping()
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GAMECONTROLLERCONFIG@, literal @\"SDL_GAMECONTROLLERCONFIG\"@, defined at @SDL3\/SDL_hints.h 902:9@
+sDL_HINT_GAMECONTROLLERCONFIG :: BG.ByteString
+sDL_HINT_GAMECONTROLLERCONFIG =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x54
+    , 0x52
+    , 0x4F
+    , 0x4C
+    , 0x4C
+    , 0x45
+    , 0x52
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x46
+    , 0x49
+    , 0x47
+    ]
+
+-- | A variable that lets you provide a file with extra gamecontroller db entries.
+--
+--     The file should contain lines of gamecontroller config data, see SDL_gamepad.h
+--
+--     You can update mappings after SDL is initialized with SDL_GetGamepadMappingForGUID() and SDL_AddGamepadMapping()
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GAMECONTROLLERCONFIG_FILE@, literal @\"SDL_GAMECONTROLLERCONFIG_FILE\"@, defined at @SDL3\/SDL_hints.h 918:9@
+sDL_HINT_GAMECONTROLLERCONFIG_FILE :: BG.ByteString
+sDL_HINT_GAMECONTROLLERCONFIG_FILE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x54
+    , 0x52
+    , 0x4F
+    , 0x4C
+    , 0x4C
+    , 0x45
+    , 0x52
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x46
+    , 0x49
+    , 0x47
+    , 0x5F
+    , 0x46
+    , 0x49
+    , 0x4C
+    , 0x45
+    ]
+
+-- | A variable that overrides the automatic controller type detection.
+--
+--     The variable should be comma separated entries, in the form: VID\/PID=type
+--
+--     The VID and PID should be hexadecimal with exactly 4 digits, e.g. 0x00fd
+--
+--     This hint affects what low level protocol is used with the HIDAPI driver.
+--
+--     The variable can be set to the following values:
+--
+--     * \"Xbox360\"
+--
+--     * \"XboxOne\"
+--
+--     * \"PS3\"
+--
+--     * \"PS4\"
+--
+--     * \"PS5\"
+--
+--     * \"SwitchPro\"
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GAMECONTROLLERTYPE@, literal @\"SDL_GAMECONTROLLERTYPE\"@, defined at @SDL3\/SDL_hints.h 942:9@
+sDL_HINT_GAMECONTROLLERTYPE :: BG.ByteString
+sDL_HINT_GAMECONTROLLERTYPE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x54
+    , 0x52
+    , 0x4F
+    , 0x4C
+    , 0x4C
+    , 0x45
+    , 0x52
+    , 0x54
+    , 0x59
+    , 0x50
+    , 0x45
+    ]
+
+-- | A variable containing a list of devices to skip when scanning for game controllers.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     0xAAAA\/0xBBBB,0xCCCC\/0xDDDD
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES@, literal @\"SDL_GAMECONTROLLER_IGNORE_DEVICES\"@, defined at @SDL3\/SDL_hints.h 960:9@
+sDL_HINT_GAMECONTROLLER_IGNORE_DEVICES :: BG.ByteString
+sDL_HINT_GAMECONTROLLER_IGNORE_DEVICES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x54
+    , 0x52
+    , 0x4F
+    , 0x4C
+    , 0x4C
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x49
+    , 0x47
+    , 0x4E
+    , 0x4F
+    , 0x52
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | If set, all devices will be skipped when scanning for game controllers except for the ones listed in this variable.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     0xAAAA\/0xBBBB,0xCCCC\/0xDDDD
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT@, literal @\"SDL_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT\"@, defined at @SDL3\/SDL_hints.h 978:9@
+sDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT :: BG.ByteString
+sDL_HINT_GAMECONTROLLER_IGNORE_DEVICES_EXCEPT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x54
+    , 0x52
+    , 0x4F
+    , 0x4C
+    , 0x4C
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x49
+    , 0x47
+    , 0x4E
+    , 0x4F
+    , 0x52
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x43
+    , 0x45
+    , 0x50
+    , 0x54
+    ]
+
+-- | A variable that controls whether the device\'s built-in accelerometer and gyro should be used as sensors for gamepads.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Sensor fusion is disabled
+--
+--     * \"1\": Sensor fusion is enabled for all controllers that lack sensors
+--
+--     Or the variable can be a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     0xAAAA\/0xBBBB,0xCCCC\/0xDDDD
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint should be set before a gamepad is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GAMECONTROLLER_SENSOR_FUSION@, literal @\"SDL_GAMECONTROLLER_SENSOR_FUSION\"@, defined at @SDL3\/SDL_hints.h 1001:9@
+sDL_HINT_GAMECONTROLLER_SENSOR_FUSION :: BG.ByteString
+sDL_HINT_GAMECONTROLLER_SENSOR_FUSION =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x54
+    , 0x52
+    , 0x4F
+    , 0x4C
+    , 0x4C
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x53
+    , 0x45
+    , 0x4E
+    , 0x53
+    , 0x4F
+    , 0x52
+    , 0x5F
+    , 0x46
+    , 0x55
+    , 0x53
+    , 0x49
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | This variable sets the default text of the TextInput window on GDK platforms.
+--
+--     This hint is available only if SDL_GDK_TEXTINPUT defined.
+--
+--     This hint should be set before calling SDL_StartTextInput()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT@, literal @\"SDL_GDK_TEXTINPUT_DEFAULT_TEXT\"@, defined at @SDL3\/SDL_hints.h 1013:9@
+sDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT :: BG.ByteString
+sDL_HINT_GDK_TEXTINPUT_DEFAULT_TEXT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x44
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x45
+    , 0x58
+    , 0x54
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x46
+    , 0x41
+    , 0x55
+    , 0x4C
+    , 0x54
+    , 0x5F
+    , 0x54
+    , 0x45
+    , 0x58
+    , 0x54
+    ]
+
+-- | This variable sets the description of the TextInput window on GDK platforms.
+--
+--     This hint is available only if SDL_GDK_TEXTINPUT defined.
+--
+--     This hint should be set before calling SDL_StartTextInput()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GDK_TEXTINPUT_DESCRIPTION@, literal @\"SDL_GDK_TEXTINPUT_DESCRIPTION\"@, defined at @SDL3\/SDL_hints.h 1025:9@
+sDL_HINT_GDK_TEXTINPUT_DESCRIPTION :: BG.ByteString
+sDL_HINT_GDK_TEXTINPUT_DESCRIPTION =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x44
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x45
+    , 0x58
+    , 0x54
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x49
+    , 0x50
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | This variable sets the maximum input length of the TextInput window on GDK platforms.
+--
+--     The value must be a stringified integer, for example \"10\" to allow for up to 10 characters of text input.
+--
+--     This hint is available only if SDL_GDK_TEXTINPUT defined.
+--
+--     This hint should be set before calling SDL_StartTextInput()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GDK_TEXTINPUT_MAX_LENGTH@, literal @\"SDL_GDK_TEXTINPUT_MAX_LENGTH\"@, defined at @SDL3\/SDL_hints.h 1040:9@
+sDL_HINT_GDK_TEXTINPUT_MAX_LENGTH :: BG.ByteString
+sDL_HINT_GDK_TEXTINPUT_MAX_LENGTH =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x44
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x45
+    , 0x58
+    , 0x54
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x58
+    , 0x5F
+    , 0x4C
+    , 0x45
+    , 0x4E
+    , 0x47
+    , 0x54
+    , 0x48
+    ]
+
+-- | This variable sets the input scope of the TextInput window on GDK platforms.
+--
+--     Set this hint to change the XGameUiTextEntryInputScope value that will be passed to the window creation function. The value must be a stringified integer, for example \"0\" for XGameUiTextEntryInputScope::Default.
+--
+--     This hint is available only if SDL_GDK_TEXTINPUT defined.
+--
+--     This hint should be set before calling SDL_StartTextInput()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GDK_TEXTINPUT_SCOPE@, literal @\"SDL_GDK_TEXTINPUT_SCOPE\"@, defined at @SDL3\/SDL_hints.h 1056:9@
+sDL_HINT_GDK_TEXTINPUT_SCOPE :: BG.ByteString
+sDL_HINT_GDK_TEXTINPUT_SCOPE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x44
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x45
+    , 0x58
+    , 0x54
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x4F
+    , 0x50
+    , 0x45
+    ]
+
+-- | This variable sets the title of the TextInput window on GDK platforms.
+--
+--     This hint is available only if SDL_GDK_TEXTINPUT defined.
+--
+--     This hint should be set before calling SDL_StartTextInput()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GDK_TEXTINPUT_TITLE@, literal @\"SDL_GDK_TEXTINPUT_TITLE\"@, defined at @SDL3\/SDL_hints.h 1067:9@
+sDL_HINT_GDK_TEXTINPUT_TITLE :: BG.ByteString
+sDL_HINT_GDK_TEXTINPUT_TITLE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x47
+    , 0x44
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x45
+    , 0x58
+    , 0x54
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    , 0x5F
+    , 0x54
+    , 0x49
+    , 0x54
+    , 0x4C
+    , 0x45
+    ]
+
+-- | A variable to control whether HIDAPI uses libusb for device access.
+--
+--     By default libusb will only be used for a few devices that require direct USB access, and this can be controlled with SDL_HINT_HIDAPI_LIBUSB_WHITELIST.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI will not use libusb for device access.
+--
+--     * \"1\": HIDAPI will use libusb for device access if available. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_HIDAPI_LIBUSB@, literal @\"SDL_HIDAPI_LIBUSB\"@, defined at @SDL3\/SDL_hints.h 1085:9@
+sDL_HINT_HIDAPI_LIBUSB :: BG.ByteString
+sDL_HINT_HIDAPI_LIBUSB =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x42
+    , 0x55
+    , 0x53
+    , 0x42
+    ]
+
+-- | A variable to control whether HIDAPI uses libusb for GameCube adapters.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI will not use libusb for GameCube adapters.
+--
+--     * \"1\": HIDAPI will use libusb for GameCube adapters if available. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_HIDAPI_LIBUSB_GAMECUBE@, literal @\"SDL_HIDAPI_LIBUSB_GAMECUBE\"@, defined at @SDL3\/SDL_hints.h 1100:9@
+sDL_HINT_HIDAPI_LIBUSB_GAMECUBE :: BG.ByteString
+sDL_HINT_HIDAPI_LIBUSB_GAMECUBE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x42
+    , 0x55
+    , 0x53
+    , 0x42
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x55
+    , 0x42
+    , 0x45
+    ]
+
+-- | A variable to control whether HIDAPI uses libusb only for whitelisted devices.
+--
+--     By default libusb will only be used for a few devices that require direct USB access.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI will use libusb for all device access.
+--
+--     * \"1\": HIDAPI will use libusb only for whitelisted devices. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_HIDAPI_LIBUSB_WHITELIST@, literal @\"SDL_HIDAPI_LIBUSB_WHITELIST\"@, defined at @SDL3\/SDL_hints.h 1118:9@
+sDL_HINT_HIDAPI_LIBUSB_WHITELIST :: BG.ByteString
+sDL_HINT_HIDAPI_LIBUSB_WHITELIST =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x42
+    , 0x55
+    , 0x53
+    , 0x42
+    , 0x5F
+    , 0x57
+    , 0x48
+    , 0x49
+    , 0x54
+    , 0x45
+    , 0x4C
+    , 0x49
+    , 0x53
+    , 0x54
+    ]
+
+-- | A variable to control whether HIDAPI uses udev for device detection.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI will poll for device changes.
+--
+--     * \"1\": HIDAPI will use udev for device detection. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_HIDAPI_UDEV@, literal @\"SDL_HIDAPI_UDEV\"@, defined at @SDL3\/SDL_hints.h 1132:9@
+sDL_HINT_HIDAPI_UDEV :: BG.ByteString
+sDL_HINT_HIDAPI_UDEV =
+  BG.pack [0x53, 0x44, 0x4C, 0x5F, 0x48, 0x49, 0x44, 0x41, 0x50, 0x49, 0x5F, 0x55, 0x44, 0x45, 0x56]
+
+-- | A variable that specifies a GPU backend to use.
+--
+--     By default, SDL will try all available GPU backends in a reasonable order until it finds one that can work, but this hint allows the app or user to force a specific target, such as \"direct3d12\" if, say, your hardware supports Vulkan but you want to try using D3D12 instead.
+--
+--     This hint should be set before any GPU functions are called.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_GPU_DRIVER@, literal @\"SDL_GPU_DRIVER\"@, defined at @SDL3\/SDL_hints.h 1146:9@
+sDL_HINT_GPU_DRIVER :: BG.ByteString
+sDL_HINT_GPU_DRIVER =
+  BG.pack [0x53, 0x44, 0x4C, 0x5F, 0x47, 0x50, 0x55, 0x5F, 0x44, 0x52, 0x49, 0x56, 0x45, 0x52]
+
+-- | A variable to control whether SDL_hid_enumerate() enumerates all HID devices or only controllers.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": SDL_hid_enumerate() will enumerate all HID devices.
+--
+--     * \"1\": SDL_hid_enumerate() will only enumerate controllers. (default)
+--
+--     By default SDL will only enumerate controllers, to reduce risk of hanging or crashing on devices with bad drivers and avoiding macOS keyboard capture permission prompts.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS@, literal @\"SDL_HIDAPI_ENUMERATE_ONLY_CONTROLLERS\"@, defined at @SDL3\/SDL_hints.h 1165:9@
+sDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS :: BG.ByteString
+sDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x45
+    , 0x4E
+    , 0x55
+    , 0x4D
+    , 0x45
+    , 0x52
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x4F
+    , 0x4E
+    , 0x4C
+    , 0x59
+    , 0x5F
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x54
+    , 0x52
+    , 0x4F
+    , 0x4C
+    , 0x4C
+    , 0x45
+    , 0x52
+    , 0x53
+    ]
+
+-- | A variable containing a list of devices to ignore in SDL_hid_enumerate().
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     For example, to ignore the Shanwan DS3 controller and any Valve controller, you might use the string \"0x2563\/0x0523,0x28de\/0x0000\"
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_HIDAPI_IGNORE_DEVICES@, literal @\"SDL_HIDAPI_IGNORE_DEVICES\"@, defined at @SDL3\/SDL_hints.h 1182:9@
+sDL_HINT_HIDAPI_IGNORE_DEVICES :: BG.ByteString
+sDL_HINT_HIDAPI_IGNORE_DEVICES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x49
+    , 0x47
+    , 0x4E
+    , 0x4F
+    , 0x52
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable describing what IME UI elements the application can display.
+--
+--     By default IME UI is handled using native components by the OS where possible, however this can interfere with or not be visible when exclusive fullscreen mode is used.
+--
+--     The variable can be set to a comma separated list containing the following items:
+--
+--     * \"none\" or \"0\": The application can\'t render any IME elements, and native UI should be used. (default)
+--
+--     * \"composition\": The application handles SDL_EVENT_TEXT_EDITING events and can render the composition text.
+--
+--     * \"candidates\": The application handles SDL_EVENT_TEXT_EDITING_CANDIDATES and can render the candidate list.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_IME_IMPLEMENTED_UI@, literal @\"SDL_IME_IMPLEMENTED_UI\"@, defined at @SDL3\/SDL_hints.h 1205:9@
+sDL_HINT_IME_IMPLEMENTED_UI :: BG.ByteString
+sDL_HINT_IME_IMPLEMENTED_UI =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x49
+    , 0x4D
+    , 0x45
+    , 0x5F
+    , 0x49
+    , 0x4D
+    , 0x50
+    , 0x4C
+    , 0x45
+    , 0x4D
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x45
+    , 0x44
+    , 0x5F
+    , 0x55
+    , 0x49
+    ]
+
+-- | A variable controlling whether the home indicator bar on iPhone X and later should be hidden.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The indicator bar is not hidden. (default for windowed applications)
+--
+--     * \"1\": The indicator bar is hidden and is shown when the screen is touched (useful for movie playback applications).
+--
+--     * \"2\": The indicator bar is dim and the first swipe makes it visible and the second swipe performs the \"home\" action. (default for fullscreen applications)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_IOS_HIDE_HOME_INDICATOR@, literal @\"SDL_IOS_HIDE_HOME_INDICATOR\"@, defined at @SDL3\/SDL_hints.h 1224:9@
+sDL_HINT_IOS_HIDE_HOME_INDICATOR :: BG.ByteString
+sDL_HINT_IOS_HIDE_HOME_INDICATOR =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x49
+    , 0x4F
+    , 0x53
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x5F
+    , 0x48
+    , 0x4F
+    , 0x4D
+    , 0x45
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x49
+    , 0x43
+    , 0x41
+    , 0x54
+    , 0x4F
+    , 0x52
+    ]
+
+-- | A variable that lets you enable joystick (and gamecontroller) events even when your app is in the background.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable joystick & gamecontroller input events when the application is in the background. (default)
+--
+--     * \"1\": Enable joystick & gamecontroller input events when the application is in the background.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS@, literal @\"SDL_JOYSTICK_ALLOW_BACKGROUND_EVENTS\"@, defined at @SDL3\/SDL_hints.h 1241:9@
+sDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS :: BG.ByteString
+sDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x42
+    , 0x41
+    , 0x43
+    , 0x4B
+    , 0x47
+    , 0x52
+    , 0x4F
+    , 0x55
+    , 0x4E
+    , 0x44
+    , 0x5F
+    , 0x45
+    , 0x56
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x53
+    ]
+
+-- | A variable containing a list of arcade stick style controllers.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES@, literal @\"SDL_JOYSTICK_ARCADESTICK_DEVICES\"@, defined at @SDL3\/SDL_hints.h 1258:9@
+sDL_HINT_JOYSTICK_ARCADESTICK_DEVICES :: BG.ByteString
+sDL_HINT_JOYSTICK_ARCADESTICK_DEVICES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x41
+    , 0x52
+    , 0x43
+    , 0x41
+    , 0x44
+    , 0x45
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable containing a list of devices that are not arcade stick style controllers.
+--
+--     This will override SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES and the built in device list.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED@, literal @\"SDL_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED\"@, defined at @SDL3\/SDL_hints.h 1279:9@
+sDL_HINT_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED :: BG.ByteString
+sDL_HINT_JOYSTICK_ARCADESTICK_DEVICES_EXCLUDED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x41
+    , 0x52
+    , 0x43
+    , 0x41
+    , 0x44
+    , 0x45
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x43
+    , 0x4C
+    , 0x55
+    , 0x44
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable containing a list of devices that should not be considered joysticks.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_BLACKLIST_DEVICES@, literal @\"SDL_JOYSTICK_BLACKLIST_DEVICES\"@, defined at @SDL3\/SDL_hints.h 1297:9@
+sDL_HINT_JOYSTICK_BLACKLIST_DEVICES :: BG.ByteString
+sDL_HINT_JOYSTICK_BLACKLIST_DEVICES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x42
+    , 0x4C
+    , 0x41
+    , 0x43
+    , 0x4B
+    , 0x4C
+    , 0x49
+    , 0x53
+    , 0x54
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable containing a list of devices that should be considered joysticks.
+--
+--     This will override SDL_HINT_JOYSTICK_BLACKLIST_DEVICES and the built in device list.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED@, literal @\"SDL_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED\"@, defined at @SDL3\/SDL_hints.h 1318:9@
+sDL_HINT_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED :: BG.ByteString
+sDL_HINT_JOYSTICK_BLACKLIST_DEVICES_EXCLUDED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x42
+    , 0x4C
+    , 0x41
+    , 0x43
+    , 0x4B
+    , 0x4C
+    , 0x49
+    , 0x53
+    , 0x54
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x43
+    , 0x4C
+    , 0x55
+    , 0x44
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable containing a comma separated list of devices to open as joysticks.
+--
+--     This variable is currently only used by the Linux joystick driver.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_DEVICE@, literal @\"SDL_JOYSTICK_DEVICE\"@, defined at @SDL3\/SDL_hints.h 1328:9@
+sDL_HINT_JOYSTICK_DEVICE :: BG.ByteString
+sDL_HINT_JOYSTICK_DEVICE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    ]
+
+-- | A variable controlling whether enhanced reports should be used for controllers when using the HIDAPI driver.
+--
+--     Enhanced reports allow rumble and effects on Bluetooth PlayStation controllers and gyro on Nintendo Switch controllers, but break Windows DirectInput for other applications that don\'t use SDL.
+--
+--     Once enhanced reports are enabled, they can\'t be disabled on PlayStation controllers without power cycling the controller.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": enhanced reports are not enabled.
+--
+--     * \"1\": enhanced reports are enabled. (default)
+--
+--     * \"auto\": enhanced features are advertised to the application, but SDL doesn\'t change the controller report mode unless the application uses them.
+--
+--     This hint can be enabled anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_ENHANCED_REPORTS@, literal @\"SDL_JOYSTICK_ENHANCED_REPORTS\"@, defined at @SDL3\/SDL_hints.h 1353:9@
+sDL_HINT_JOYSTICK_ENHANCED_REPORTS :: BG.ByteString
+sDL_HINT_JOYSTICK_ENHANCED_REPORTS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x45
+    , 0x4E
+    , 0x48
+    , 0x41
+    , 0x4E
+    , 0x43
+    , 0x45
+    , 0x44
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x50
+    , 0x4F
+    , 0x52
+    , 0x54
+    , 0x53
+    ]
+
+-- | [C declaration]: @macro SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES@, literal @\"SDL_JOYSTICK_FLIGHTSTICK_DEVICES\"@, defined at @SDL3\/SDL_hints.h 1370:9@
+sDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES :: BG.ByteString
+sDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x46
+    , 0x4C
+    , 0x49
+    , 0x47
+    , 0x48
+    , 0x54
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable containing a list of devices that are not flightstick style controllers.
+--
+--     This will override SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES and the built in device list.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED@, literal @\"SDL_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED\"@, defined at @SDL3\/SDL_hints.h 1391:9@
+sDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED :: BG.ByteString
+sDL_HINT_JOYSTICK_FLIGHTSTICK_DEVICES_EXCLUDED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x46
+    , 0x4C
+    , 0x49
+    , 0x47
+    , 0x48
+    , 0x54
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x43
+    , 0x4C
+    , 0x55
+    , 0x44
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether GameInput should be used for controller handling on Windows.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": GameInput is not used.
+--
+--     * \"1\": GameInput is used.
+--
+--     The default is \"1\" on GDK platforms, and \"0\" otherwise.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_GAMEINPUT@, literal @\"SDL_JOYSTICK_GAMEINPUT\"@, defined at @SDL3\/SDL_hints.h 1408:9@
+sDL_HINT_JOYSTICK_GAMEINPUT :: BG.ByteString
+sDL_HINT_JOYSTICK_GAMEINPUT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    ]
+
+-- | A variable containing a list of devices known to have a GameCube form factor.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_GAMECUBE_DEVICES@, literal @\"SDL_JOYSTICK_GAMECUBE_DEVICES\"@, defined at @SDL3\/SDL_hints.h 1426:9@
+sDL_HINT_JOYSTICK_GAMECUBE_DEVICES :: BG.ByteString
+sDL_HINT_JOYSTICK_GAMECUBE_DEVICES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x55
+    , 0x42
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable containing a list of devices known not to have a GameCube form factor.
+--
+--     This will override SDL_HINT_JOYSTICK_GAMECUBE_DEVICES and the built in device list.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED@, literal @\"SDL_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED\"@, defined at @SDL3\/SDL_hints.h 1447:9@
+sDL_HINT_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED :: BG.ByteString
+sDL_HINT_JOYSTICK_GAMECUBE_DEVICES_EXCLUDED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x55
+    , 0x42
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x43
+    , 0x4C
+    , 0x55
+    , 0x44
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether the HIDAPI joystick drivers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI drivers are not used.
+--
+--     * \"1\": HIDAPI drivers are used. (default)
+--
+--     This variable is the default for all drivers, but can be overridden by the hints for specific drivers below.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI@, literal @\"SDL_JOYSTICK_HIDAPI\"@, defined at @SDL3\/SDL_hints.h 1464:9@
+sDL_HINT_JOYSTICK_HIDAPI :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    ]
+
+-- | A variable controlling whether Nintendo Switch Joy-Con controllers will be combined into a single Pro-like controller when using the HIDAPI driver.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Left and right Joy-Con controllers will not be combined and each will be a mini-gamepad.
+--
+--     * \"1\": Left and right Joy-Con controllers will be combined into a single controller. (default)
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS@, literal @\"SDL_JOYSTICK_HIDAPI_COMBINE_JOY_CONS\"@, defined at @SDL3\/SDL_hints.h 1481:9@
+sDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_COMBINE_JOY_CONS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x43
+    , 0x4F
+    , 0x4D
+    , 0x42
+    , 0x49
+    , 0x4E
+    , 0x45
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x5F
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x53
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for Nintendo GameCube controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE@, literal @\"SDL_JOYSTICK_HIDAPI_GAMECUBE\"@, defined at @SDL3\/SDL_hints.h 1498:9@
+sDL_HINT_JOYSTICK_HIDAPI_GAMECUBE :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_GAMECUBE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x55
+    , 0x42
+    , 0x45
+    ]
+
+-- | A variable controlling whether rumble is used to implement the GameCube controller\'s 3 rumble modes, Stop(0), Rumble(1), and StopHard(2).
+--
+--     This is useful for applications that need full compatibility for things like ADSR envelopes. - Stop is implemented by setting low_frequency_rumble to 0 and high_frequency_rumble >0 - Rumble is both at any arbitrary value - StopHard is implemented by setting both low_frequency_rumble and high_frequency_rumble to 0
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Normal rumble behavior is behavior is used. (default)
+--
+--     * \"1\": Proper GameCube controller rumble behavior is used.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE@, literal @\"SDL_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE\"@, defined at @SDL3\/SDL_hints.h 1519:9@
+sDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_GAMECUBE_RUMBLE_BRAKE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x43
+    , 0x55
+    , 0x42
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x55
+    , 0x4D
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x42
+    , 0x52
+    , 0x41
+    , 0x4B
+    , 0x45
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for Nintendo Switch Joy-Cons should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_JOY_CONS@, literal @\"SDL_JOYSTICK_HIDAPI_JOY_CONS\"@, defined at @SDL3\/SDL_hints.h 1536:9@
+sDL_HINT_JOYSTICK_HIDAPI_JOY_CONS :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_JOY_CONS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x5F
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x53
+    ]
+
+-- | A variable controlling whether the Home button LED should be turned on when a Nintendo Switch Joy-Con controller is opened.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": home button LED is turned off
+--
+--     * \"1\": home button LED is turned on
+--
+--     By default the Home button LED state is not changed. This hint can also be set to a floating point value between 0.0 and 1.0 which controls the brightness of the Home button LED.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED@, literal @\"SDL_JOYSTICK_HIDAPI_JOYCON_HOME_LED\"@, defined at @SDL3\/SDL_hints.h 1555:9@
+sDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_JOYCON_HOME_LED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x5F
+    , 0x48
+    , 0x4F
+    , 0x4D
+    , 0x45
+    , 0x5F
+    , 0x4C
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for Amazon Luna controllers connected via Bluetooth should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_LUNA@, literal @\"SDL_JOYSTICK_HIDAPI_LUNA\"@, defined at @SDL3\/SDL_hints.h 1572:9@
+sDL_HINT_JOYSTICK_HIDAPI_LUNA :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_LUNA =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x4C
+    , 0x55
+    , 0x4E
+    , 0x41
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for Nintendo Online classic controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC@, literal @\"SDL_JOYSTICK_HIDAPI_NINTENDO_CLASSIC\"@, defined at @SDL3\/SDL_hints.h 1589:9@
+sDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_NINTENDO_CLASSIC =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x4E
+    , 0x49
+    , 0x4E
+    , 0x54
+    , 0x45
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x5F
+    , 0x43
+    , 0x4C
+    , 0x41
+    , 0x53
+    , 0x53
+    , 0x49
+    , 0x43
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for PS3 controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI on macOS, and \"0\" on other platforms.
+--
+--     For official Sony driver (sixaxis.sys) use SDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER. See [https:\/\/github.com\/ViGEm\/DsHidMini](https://github.com/ViGEm/DsHidMini) for an alternative driver on Windows.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_PS3@, literal @\"SDL_JOYSTICK_HIDAPI_PS3\"@, defined at @SDL3\/SDL_hints.h 1611:9@
+sDL_HINT_JOYSTICK_HIDAPI_PS3 :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_PS3 =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x50
+    , 0x53
+    , 0x33
+    ]
+
+-- | A variable controlling whether the Sony driver (sixaxis.sys) for PS3 controllers (Sixaxis\/DualShock 3) should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Sony driver (sixaxis.sys) is not used.
+--
+--     * \"1\": Sony driver (sixaxis.sys) is used.
+--
+--     The default value is 0.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER@, literal @\"SDL_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER\"@, defined at @SDL3\/SDL_hints.h 1628:9@
+sDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_PS3_SIXAXIS_DRIVER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x50
+    , 0x53
+    , 0x33
+    , 0x5F
+    , 0x53
+    , 0x49
+    , 0x58
+    , 0x41
+    , 0x58
+    , 0x49
+    , 0x53
+    , 0x5F
+    , 0x44
+    , 0x52
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x52
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for PS4 controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_PS4@, literal @\"SDL_JOYSTICK_HIDAPI_PS4\"@, defined at @SDL3\/SDL_hints.h 1645:9@
+sDL_HINT_JOYSTICK_HIDAPI_PS4 :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_PS4 =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x50
+    , 0x53
+    , 0x34
+    ]
+
+-- | A variable controlling the update rate of the PS4 controller over Bluetooth when using the HIDAPI driver.
+--
+--     This defaults to 4 ms, to match the behavior over USB, and to be more friendly to other Bluetooth devices and older Bluetooth hardware on the computer. It can be set to \"1\" (1000Hz), \"2\" (500Hz) and \"4\" (250Hz)
+--
+--     This hint can be set anytime, but only takes effect when extended input reports are enabled.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL@, literal @\"SDL_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL\"@, defined at @SDL3\/SDL_hints.h 1660:9@
+sDL_HINT_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_PS4_REPORT_INTERVAL =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x50
+    , 0x53
+    , 0x34
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x50
+    , 0x4F
+    , 0x52
+    , 0x54
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x54
+    , 0x45
+    , 0x52
+    , 0x56
+    , 0x41
+    , 0x4C
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for PS5 controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_PS5@, literal @\"SDL_JOYSTICK_HIDAPI_PS5\"@, defined at @SDL3\/SDL_hints.h 1677:9@
+sDL_HINT_JOYSTICK_HIDAPI_PS5 :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_PS5 =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x50
+    , 0x53
+    , 0x35
+    ]
+
+-- | A variable controlling whether the player LEDs should be lit to indicate which player is associated with a PS5 controller.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": player LEDs are not enabled.
+--
+--     * \"1\": player LEDs are enabled. (default)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED@, literal @\"SDL_JOYSTICK_HIDAPI_PS5_PLAYER_LED\"@, defined at @SDL3\/SDL_hints.h 1690:9@
+sDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_PS5_PLAYER_LED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x50
+    , 0x53
+    , 0x35
+    , 0x5F
+    , 0x50
+    , 0x4C
+    , 0x41
+    , 0x59
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x4C
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for NVIDIA SHIELD controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_SHIELD@, literal @\"SDL_JOYSTICK_HIDAPI_SHIELD\"@, defined at @SDL3\/SDL_hints.h 1707:9@
+sDL_HINT_JOYSTICK_HIDAPI_SHIELD :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_SHIELD =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x48
+    , 0x49
+    , 0x45
+    , 0x4C
+    , 0x44
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for Google Stadia controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_STADIA@, literal @\"SDL_JOYSTICK_HIDAPI_STADIA\"@, defined at @SDL3\/SDL_hints.h 1722:9@
+sDL_HINT_JOYSTICK_HIDAPI_STADIA :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_STADIA =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x54
+    , 0x41
+    , 0x44
+    , 0x49
+    , 0x41
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for Bluetooth Steam Controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used. (default)
+--
+--     * \"1\": HIDAPI driver is used for Steam Controllers, which requires Bluetooth access and may prompt the user for permission on iOS and Android.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_STEAM@, literal @\"SDL_JOYSTICK_HIDAPI_STEAM\"@, defined at @SDL3\/SDL_hints.h 1739:9@
+sDL_HINT_JOYSTICK_HIDAPI_STEAM :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_STEAM =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x54
+    , 0x45
+    , 0x41
+    , 0x4D
+    ]
+
+-- | A variable controlling whether the Steam button LED should be turned on when a Steam controller is opened.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Steam button LED is turned off.
+--
+--     * \"1\": Steam button LED is turned on.
+--
+--     By default the Steam button LED state is not changed. This hint can also be set to a floating point value between 0.0 and 1.0 which controls the brightness of the Steam button LED.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_STEAM_HOME_LED@, literal @\"SDL_JOYSTICK_HIDAPI_STEAM_HOME_LED\"@, defined at @SDL3\/SDL_hints.h 1758:9@
+sDL_HINT_JOYSTICK_HIDAPI_STEAM_HOME_LED :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_STEAM_HOME_LED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x54
+    , 0x45
+    , 0x41
+    , 0x4D
+    , 0x5F
+    , 0x48
+    , 0x4F
+    , 0x4D
+    , 0x45
+    , 0x5F
+    , 0x4C
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for the Steam Deck builtin controller should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_STEAMDECK@, literal @\"SDL_JOYSTICK_HIDAPI_STEAMDECK\"@, defined at @SDL3\/SDL_hints.h 1775:9@
+sDL_HINT_JOYSTICK_HIDAPI_STEAMDECK :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_STEAMDECK =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x54
+    , 0x45
+    , 0x41
+    , 0x4D
+    , 0x44
+    , 0x45
+    , 0x43
+    , 0x4B
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for HORI licensed Steam controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_STEAM_HORI@, literal @\"SDL_JOYSTICK_HIDAPI_STEAM_HORI\"@, defined at @SDL3\/SDL_hints.h 1792:9@
+sDL_HINT_JOYSTICK_HIDAPI_STEAM_HORI :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_STEAM_HORI =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x54
+    , 0x45
+    , 0x41
+    , 0x4D
+    , 0x5F
+    , 0x48
+    , 0x4F
+    , 0x52
+    , 0x49
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for some Logitech wheels should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_LG4FF@, literal @\"SDL_JOYSTICK_HIDAPI_LG4FF\"@, defined at @SDL3\/SDL_hints.h 1809:9@
+sDL_HINT_JOYSTICK_HIDAPI_LG4FF :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_LG4FF =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x4C
+    , 0x47
+    , 0x34
+    , 0x46
+    , 0x46
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for 8BitDo controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_8BITDO@, literal @\"SDL_JOYSTICK_HIDAPI_8BITDO\"@, defined at @SDL3\/SDL_hints.h 1826:9@
+sDL_HINT_JOYSTICK_HIDAPI_8BITDO :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_8BITDO =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x38
+    , 0x42
+    , 0x49
+    , 0x54
+    , 0x44
+    , 0x4F
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for SInput controllers should be used.
+--
+--     More info - [https:\/\/github.com\/HandHeldLegend\/SInput-HID](https://github.com/HandHeldLegend/SInput-HID)
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_SINPUT@, literal @\"SDL_JOYSTICK_HIDAPI_SINPUT\"@, defined at @SDL3\/SDL_hints.h 1845:9@
+sDL_HINT_JOYSTICK_HIDAPI_SINPUT :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_SINPUT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for ZUIKI controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_ZUIKI@, literal @\"SDL_JOYSTICK_HIDAPI_ZUIKI\"@, defined at @SDL3\/SDL_hints.h 1862:9@
+sDL_HINT_JOYSTICK_HIDAPI_ZUIKI :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_ZUIKI =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x5A
+    , 0x55
+    , 0x49
+    , 0x4B
+    , 0x49
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for Flydigi controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_FLYDIGI@, literal @\"SDL_JOYSTICK_HIDAPI_FLYDIGI\"@, defined at @SDL3\/SDL_hints.h 1879:9@
+sDL_HINT_JOYSTICK_HIDAPI_FLYDIGI :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_FLYDIGI =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x46
+    , 0x4C
+    , 0x59
+    , 0x44
+    , 0x49
+    , 0x47
+    , 0x49
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for Nintendo Switch controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_SWITCH@, literal @\"SDL_JOYSTICK_HIDAPI_SWITCH\"@, defined at @SDL3\/SDL_hints.h 1896:9@
+sDL_HINT_JOYSTICK_HIDAPI_SWITCH :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_SWITCH =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x57
+    , 0x49
+    , 0x54
+    , 0x43
+    , 0x48
+    ]
+
+-- | A variable controlling whether the Home button LED should be turned on when a Nintendo Switch Pro controller is opened.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Home button LED is turned off.
+--
+--     * \"1\": Home button LED is turned on.
+--
+--     By default the Home button LED state is not changed. This hint can also be set to a floating point value between 0.0 and 1.0 which controls the brightness of the Home button LED.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED@, literal @\"SDL_JOYSTICK_HIDAPI_SWITCH_HOME_LED\"@, defined at @SDL3\/SDL_hints.h 1915:9@
+sDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_SWITCH_HOME_LED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x57
+    , 0x49
+    , 0x54
+    , 0x43
+    , 0x48
+    , 0x5F
+    , 0x48
+    , 0x4F
+    , 0x4D
+    , 0x45
+    , 0x5F
+    , 0x4C
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether the player LEDs should be lit to indicate which player is associated with a Nintendo Switch controller.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Player LEDs are not enabled.
+--
+--     * \"1\": Player LEDs are enabled. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED@, literal @\"SDL_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED\"@, defined at @SDL3\/SDL_hints.h 1930:9@
+sDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_SWITCH_PLAYER_LED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x57
+    , 0x49
+    , 0x54
+    , 0x43
+    , 0x48
+    , 0x5F
+    , 0x50
+    , 0x4C
+    , 0x41
+    , 0x59
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x4C
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for Nintendo Switch 2 controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_SWITCH2@, literal @\"SDL_JOYSTICK_HIDAPI_SWITCH2\"@, defined at @SDL3\/SDL_hints.h 1947:9@
+sDL_HINT_JOYSTICK_HIDAPI_SWITCH2 :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_SWITCH2 =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x57
+    , 0x49
+    , 0x54
+    , 0x43
+    , 0x48
+    , 0x32
+    ]
+
+-- | A variable controlling whether Nintendo Switch Joy-Con controllers will be in vertical mode when using the HIDAPI driver.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Left and right Joy-Con controllers will not be in vertical mode. (default)
+--
+--     * \"1\": Left and right Joy-Con controllers will be in vertical mode.
+--
+--     This hint should be set before opening a Joy-Con controller.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS@, literal @\"SDL_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS\"@, defined at @SDL3\/SDL_hints.h 1963:9@
+sDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_VERTICAL_JOY_CONS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x56
+    , 0x45
+    , 0x52
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x5F
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x53
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for Nintendo Wii and Wii U controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     This driver doesn\'t work with the dolphinbar, so the default is false for now.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_WII@, literal @\"SDL_JOYSTICK_HIDAPI_WII\"@, defined at @SDL3\/SDL_hints.h 1981:9@
+sDL_HINT_JOYSTICK_HIDAPI_WII :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_WII =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x49
+    ]
+
+-- | A variable controlling whether the player LEDs should be lit to indicate which player is associated with a Wii controller.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Player LEDs are not enabled.
+--
+--     * \"1\": Player LEDs are enabled. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED@, literal @\"SDL_JOYSTICK_HIDAPI_WII_PLAYER_LED\"@, defined at @SDL3\/SDL_hints.h 1996:9@
+sDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_WII_PLAYER_LED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x49
+    , 0x5F
+    , 0x50
+    , 0x4C
+    , 0x41
+    , 0x59
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x4C
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for XBox controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is \"0\" on Windows, otherwise the value of SDL_HINT_JOYSTICK_HIDAPI
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_XBOX@, literal @\"SDL_JOYSTICK_HIDAPI_XBOX\"@, defined at @SDL3\/SDL_hints.h 2014:9@
+sDL_HINT_JOYSTICK_HIDAPI_XBOX :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_XBOX =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x58
+    , 0x42
+    , 0x4F
+    , 0x58
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for XBox 360 controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_XBOX_360@, literal @\"SDL_JOYSTICK_HIDAPI_XBOX_360\"@, defined at @SDL3\/SDL_hints.h 2031:9@
+sDL_HINT_JOYSTICK_HIDAPI_XBOX_360 :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_XBOX_360 =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x58
+    , 0x42
+    , 0x4F
+    , 0x58
+    , 0x5F
+    , 0x33
+    , 0x36
+    , 0x30
+    ]
+
+-- | A variable controlling whether the player LEDs should be lit to indicate which player is associated with an Xbox 360 controller.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Player LEDs are not enabled.
+--
+--     * \"1\": Player LEDs are enabled. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED@, literal @\"SDL_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED\"@, defined at @SDL3\/SDL_hints.h 2046:9@
+sDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_XBOX_360_PLAYER_LED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x58
+    , 0x42
+    , 0x4F
+    , 0x58
+    , 0x5F
+    , 0x33
+    , 0x36
+    , 0x30
+    , 0x5F
+    , 0x50
+    , 0x4C
+    , 0x41
+    , 0x59
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x4C
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for XBox 360 wireless controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX_360
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS@, literal @\"SDL_JOYSTICK_HIDAPI_XBOX_360_WIRELESS\"@, defined at @SDL3\/SDL_hints.h 2063:9@
+sDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_XBOX_360_WIRELESS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x58
+    , 0x42
+    , 0x4F
+    , 0x58
+    , 0x5F
+    , 0x33
+    , 0x36
+    , 0x30
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x52
+    , 0x45
+    , 0x4C
+    , 0x45
+    , 0x53
+    , 0x53
+    ]
+
+-- | A variable controlling whether the HIDAPI driver for XBox One controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE@, literal @\"SDL_JOYSTICK_HIDAPI_XBOX_ONE\"@, defined at @SDL3\/SDL_hints.h 2080:9@
+sDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x58
+    , 0x42
+    , 0x4F
+    , 0x58
+    , 0x5F
+    , 0x4F
+    , 0x4E
+    , 0x45
+    ]
+
+-- | A variable controlling whether the Home button LED should be turned on when an Xbox One controller is opened.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Home button LED is turned off.
+--
+--     * \"1\": Home button LED is turned on.
+--
+--     By default the Home button LED state is not changed. This hint can also be set to a floating point value between 0.0 and 1.0 which controls the brightness of the Home button LED. The default brightness is 0.4.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED@, literal @\"SDL_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED\"@, defined at @SDL3\/SDL_hints.h 2099:9@
+sDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE_HOME_LED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x58
+    , 0x42
+    , 0x4F
+    , 0x58
+    , 0x5F
+    , 0x4F
+    , 0x4E
+    , 0x45
+    , 0x5F
+    , 0x48
+    , 0x4F
+    , 0x4D
+    , 0x45
+    , 0x5F
+    , 0x4C
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether the new HIDAPI driver for wired Xbox One (GIP) controllers should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": HIDAPI driver is not used.
+--
+--     * \"1\": HIDAPI driver is used.
+--
+--     The default is the value of SDL_HINT_JOYSTICK_HIDAPI_XBOX_ONE.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_GIP@, literal @\"SDL_JOYSTICK_HIDAPI_GIP\"@, defined at @SDL3\/SDL_hints.h 2116:9@
+sDL_HINT_JOYSTICK_HIDAPI_GIP :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_GIP =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x47
+    , 0x49
+    , 0x50
+    ]
+
+-- | A variable controlling whether the new HIDAPI driver for wired Xbox One (GIP) controllers should reset the controller if it can\'t get the metadata from the controller.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Assume this is a generic controller.
+--
+--     * \"1\": Reset the controller to get metadata.
+--
+--     By default the controller is not reset.
+--
+--     This hint should be set before initializing joysticks and gamepads.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HIDAPI_GIP_RESET_FOR_METADATA@, literal @\"SDL_JOYSTICK_HIDAPI_GIP_RESET_FOR_METADATA\"@, defined at @SDL3\/SDL_hints.h 2134:9@
+sDL_HINT_JOYSTICK_HIDAPI_GIP_RESET_FOR_METADATA :: BG.ByteString
+sDL_HINT_JOYSTICK_HIDAPI_GIP_RESET_FOR_METADATA =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x41
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x47
+    , 0x49
+    , 0x50
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x53
+    , 0x45
+    , 0x54
+    , 0x5F
+    , 0x46
+    , 0x4F
+    , 0x52
+    , 0x5F
+    , 0x4D
+    , 0x45
+    , 0x54
+    , 0x41
+    , 0x44
+    , 0x41
+    , 0x54
+    , 0x41
+    ]
+
+-- | A variable controlling whether IOKit should be used for controller handling.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": IOKit is not used.
+--
+--     * \"1\": IOKit is used. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_IOKIT@, literal @\"SDL_JOYSTICK_IOKIT\"@, defined at @SDL3\/SDL_hints.h 2149:9@
+sDL_HINT_JOYSTICK_IOKIT :: BG.ByteString
+sDL_HINT_JOYSTICK_IOKIT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x49
+    , 0x4F
+    , 0x4B
+    , 0x49
+    , 0x54
+    ]
+
+-- | A variable controlling whether to use the classic \/dev\/input\/js* joystick interface or the newer \/dev\/input\/event* joystick interface on Linux.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Use \/dev\/input\/event* (default)
+--
+--     * \"1\": Use \/dev\/input\/js*
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_LINUX_CLASSIC@, literal @\"SDL_JOYSTICK_LINUX_CLASSIC\"@, defined at @SDL3\/SDL_hints.h 2164:9@
+sDL_HINT_JOYSTICK_LINUX_CLASSIC :: BG.ByteString
+sDL_HINT_JOYSTICK_LINUX_CLASSIC =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x4E
+    , 0x55
+    , 0x58
+    , 0x5F
+    , 0x43
+    , 0x4C
+    , 0x41
+    , 0x53
+    , 0x53
+    , 0x49
+    , 0x43
+    ]
+
+-- | A variable controlling whether joysticks on Linux adhere to their HID-defined deadzones or return unfiltered values.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Return unfiltered joystick axis values. (default)
+--
+--     * \"1\": Return axis values with deadzones taken into account.
+--
+--     This hint should be set before a controller is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_LINUX_DEADZONES@, literal @\"SDL_JOYSTICK_LINUX_DEADZONES\"@, defined at @SDL3\/SDL_hints.h 2179:9@
+sDL_HINT_JOYSTICK_LINUX_DEADZONES :: BG.ByteString
+sDL_HINT_JOYSTICK_LINUX_DEADZONES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x4E
+    , 0x55
+    , 0x58
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x41
+    , 0x44
+    , 0x5A
+    , 0x4F
+    , 0x4E
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable controlling whether joysticks on Linux will always treat \'hat\' axis inputs (ABS_HAT0X - ABS_HAT3Y) as 8-way digital hats without checking whether they may be analog.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Only map hat axis inputs to digital hat outputs if the input axes appear to actually be digital. (default)
+--
+--     * \"1\": Always handle the input axes numbered ABS_HAT0X to ABS_HAT3Y as digital hats.
+--
+--     This hint should be set before a controller is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS@, literal @\"SDL_JOYSTICK_LINUX_DIGITAL_HATS\"@, defined at @SDL3\/SDL_hints.h 2197:9@
+sDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS :: BG.ByteString
+sDL_HINT_JOYSTICK_LINUX_DIGITAL_HATS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x4E
+    , 0x55
+    , 0x58
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x47
+    , 0x49
+    , 0x54
+    , 0x41
+    , 0x4C
+    , 0x5F
+    , 0x48
+    , 0x41
+    , 0x54
+    , 0x53
+    ]
+
+-- | A variable controlling whether digital hats on Linux will apply deadzones to their underlying input axes or use unfiltered values.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Return digital hat values based on unfiltered input axis values.
+--
+--     * \"1\": Return digital hat values with deadzones on the input axes taken into account. (default)
+--
+--     This hint should be set before a controller is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES@, literal @\"SDL_JOYSTICK_LINUX_HAT_DEADZONES\"@, defined at @SDL3\/SDL_hints.h 2213:9@
+sDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES :: BG.ByteString
+sDL_HINT_JOYSTICK_LINUX_HAT_DEADZONES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x4E
+    , 0x55
+    , 0x58
+    , 0x5F
+    , 0x48
+    , 0x41
+    , 0x54
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x41
+    , 0x44
+    , 0x5A
+    , 0x4F
+    , 0x4E
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable controlling whether GCController should be used for controller handling.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": GCController is not used.
+--
+--     * \"1\": GCController is used. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_MFI@, literal @\"SDL_JOYSTICK_MFI\"@, defined at @SDL3\/SDL_hints.h 2228:9@
+sDL_HINT_JOYSTICK_MFI :: BG.ByteString
+sDL_HINT_JOYSTICK_MFI =
+  BG.pack
+    [0x53, 0x44, 0x4C, 0x5F, 0x4A, 0x4F, 0x59, 0x53, 0x54, 0x49, 0x43, 0x4B, 0x5F, 0x4D, 0x46, 0x49]
+
+-- | A variable controlling whether the RAWINPUT joystick drivers should be used for better handling XInput-capable devices.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": RAWINPUT drivers are not used. (default)
+--
+--     * \"1\": RAWINPUT drivers are used.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_RAWINPUT@, literal @\"SDL_JOYSTICK_RAWINPUT\"@, defined at @SDL3\/SDL_hints.h 2243:9@
+sDL_HINT_JOYSTICK_RAWINPUT :: BG.ByteString
+sDL_HINT_JOYSTICK_RAWINPUT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x52
+    , 0x41
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    ]
+
+-- | A variable controlling whether the RAWINPUT driver should pull correlated data from XInput.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": RAWINPUT driver will only use data from raw input APIs.
+--
+--     * \"1\": RAWINPUT driver will also pull data from XInput and Windows.Gaming.Input, providing better trigger axes, guide button presses, and rumble support for Xbox controllers. (default)
+--
+--     This hint should be set before a gamepad is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT@, literal @\"SDL_JOYSTICK_RAWINPUT_CORRELATE_XINPUT\"@, defined at @SDL3\/SDL_hints.h 2260:9@
+sDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT :: BG.ByteString
+sDL_HINT_JOYSTICK_RAWINPUT_CORRELATE_XINPUT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x52
+    , 0x41
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    , 0x5F
+    , 0x43
+    , 0x4F
+    , 0x52
+    , 0x52
+    , 0x45
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x58
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    ]
+
+-- | A variable controlling whether the ROG Chakram mice should show up as joysticks.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": ROG Chakram mice do not show up as joysticks. (default)
+--
+--     * \"1\": ROG Chakram mice show up as joysticks.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_ROG_CHAKRAM@, literal @\"SDL_JOYSTICK_ROG_CHAKRAM\"@, defined at @SDL3\/SDL_hints.h 2275:9@
+sDL_HINT_JOYSTICK_ROG_CHAKRAM :: BG.ByteString
+sDL_HINT_JOYSTICK_ROG_CHAKRAM =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x52
+    , 0x4F
+    , 0x47
+    , 0x5F
+    , 0x43
+    , 0x48
+    , 0x41
+    , 0x4B
+    , 0x52
+    , 0x41
+    , 0x4D
+    ]
+
+-- | A variable controlling whether a separate thread should be used for handling joystick detection and raw input messages on Windows.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": A separate thread is not used.
+--
+--     * \"1\": A separate thread is used for handling raw input messages. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_THREAD@, literal @\"SDL_JOYSTICK_THREAD\"@, defined at @SDL3\/SDL_hints.h 2290:9@
+sDL_HINT_JOYSTICK_THREAD :: BG.ByteString
+sDL_HINT_JOYSTICK_THREAD =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x48
+    , 0x52
+    , 0x45
+    , 0x41
+    , 0x44
+    ]
+
+-- | A variable containing a list of throttle style controllers.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_THROTTLE_DEVICES@, literal @\"SDL_JOYSTICK_THROTTLE_DEVICES\"@, defined at @SDL3\/SDL_hints.h 2307:9@
+sDL_HINT_JOYSTICK_THROTTLE_DEVICES :: BG.ByteString
+sDL_HINT_JOYSTICK_THROTTLE_DEVICES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x48
+    , 0x52
+    , 0x4F
+    , 0x54
+    , 0x54
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable containing a list of devices that are not throttle style controllers.
+--
+--     This will override SDL_HINT_JOYSTICK_THROTTLE_DEVICES and the built in device list.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_THROTTLE_DEVICES_EXCLUDED@, literal @\"SDL_JOYSTICK_THROTTLE_DEVICES_EXCLUDED\"@, defined at @SDL3\/SDL_hints.h 2328:9@
+sDL_HINT_JOYSTICK_THROTTLE_DEVICES_EXCLUDED :: BG.ByteString
+sDL_HINT_JOYSTICK_THROTTLE_DEVICES_EXCLUDED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x48
+    , 0x52
+    , 0x4F
+    , 0x54
+    , 0x54
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x43
+    , 0x4C
+    , 0x55
+    , 0x44
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether Windows.Gaming.Input should be used for controller handling.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": WGI is not used. (default)
+--
+--     * \"1\": WGI is used.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_WGI@, literal @\"SDL_JOYSTICK_WGI\"@, defined at @SDL3\/SDL_hints.h 2343:9@
+sDL_HINT_JOYSTICK_WGI :: BG.ByteString
+sDL_HINT_JOYSTICK_WGI =
+  BG.pack
+    [0x53, 0x44, 0x4C, 0x5F, 0x4A, 0x4F, 0x59, 0x53, 0x54, 0x49, 0x43, 0x4B, 0x5F, 0x57, 0x47, 0x49]
+
+-- | A variable containing a list of wheel style controllers.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_WHEEL_DEVICES@, literal @\"SDL_JOYSTICK_WHEEL_DEVICES\"@, defined at @SDL3\/SDL_hints.h 2360:9@
+sDL_HINT_JOYSTICK_WHEEL_DEVICES :: BG.ByteString
+sDL_HINT_JOYSTICK_WHEEL_DEVICES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x57
+    , 0x48
+    , 0x45
+    , 0x45
+    , 0x4C
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable containing a list of devices that are not wheel style controllers.
+--
+--     This will override SDL_HINT_JOYSTICK_WHEEL_DEVICES and the built in device list.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_WHEEL_DEVICES_EXCLUDED@, literal @\"SDL_JOYSTICK_WHEEL_DEVICES_EXCLUDED\"@, defined at @SDL3\/SDL_hints.h 2381:9@
+sDL_HINT_JOYSTICK_WHEEL_DEVICES_EXCLUDED :: BG.ByteString
+sDL_HINT_JOYSTICK_WHEEL_DEVICES_EXCLUDED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x57
+    , 0x48
+    , 0x45
+    , 0x45
+    , 0x4C
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x43
+    , 0x4C
+    , 0x55
+    , 0x44
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable containing a list of devices known to have all axes centered at zero.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint should be set before a controller is opened.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_ZERO_CENTERED_DEVICES@, literal @\"SDL_JOYSTICK_ZERO_CENTERED_DEVICES\"@, defined at @SDL3\/SDL_hints.h 2399:9@
+sDL_HINT_JOYSTICK_ZERO_CENTERED_DEVICES :: BG.ByteString
+sDL_HINT_JOYSTICK_ZERO_CENTERED_DEVICES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x5A
+    , 0x45
+    , 0x52
+    , 0x4F
+    , 0x5F
+    , 0x43
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x45
+    , 0x52
+    , 0x45
+    , 0x44
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable containing a list of devices and their desired number of haptic (force feedback) enabled axis.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form plus the number of desired axes, e.g.
+--
+--     @0xAAAA\/0xBBBB\/1,0xCCCC\/0xDDDD\/3@
+--
+--     This hint supports a \"wildcard\" device that will set the number of haptic axes on all initialized haptic devices which were not defined explicitly in this hint.
+--
+--     @0xFFFF\/0xFFFF\/1@
+--
+--     This hint should be set before a controller is opened. The number of haptic axes won\'t exceed the number of real axes found on the device.
+--
+--     @since 3.2.5
+--
+--     [C declaration]: @macro SDL_HINT_JOYSTICK_HAPTIC_AXES@, literal @\"SDL_JOYSTICK_HAPTIC_AXES\"@, defined at @SDL3\/SDL_hints.h 2421:9@
+sDL_HINT_JOYSTICK_HAPTIC_AXES :: BG.ByteString
+sDL_HINT_JOYSTICK_HAPTIC_AXES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x48
+    , 0x41
+    , 0x50
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x5F
+    , 0x41
+    , 0x58
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable that controls keycode representation in keyboard events.
+--
+--     This variable is a comma separated set of options for translating keycodes in events:
+--
+--     * \"none\": Keycode options are cleared, this overrides other options.
+--
+--     * \"hide_numpad\": The numpad keysyms will be translated into their non-numpad versions based on the current NumLock state. For example, SDLK_KP_4 would become SDLK_4 if SDL_KMOD_NUM is set in the event modifiers, and SDLK_LEFT if it is unset.
+--
+--     * \"french_numbers\": The number row on French keyboards is inverted, so pressing the 1 key would yield the keycode SDLK_1, or \'1\', instead of SDLK_AMPERSAND, or \'&\'
+--
+--     * \"latin_letters\": For keyboards using non-Latin letters, such as Russian or Thai, the letter keys generate keycodes as though it had an English QWERTY layout. e.g. pressing the key associated with SDL_SCANCODE_A on a Russian keyboard would yield \'a\' instead of a Cyrillic letter.
+--
+--     The default value for this hint is \"french_numbers,latin_letters\"
+--
+--     Some platforms like Emscripten only provide modified keycodes and the options are not used.
+--
+--     These options do not affect the return value of SDL_GetKeyFromScancode() or SDL_GetScancodeFromKey(), they just apply to the keycode included in key events.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_KEYCODE_OPTIONS@, literal @\"SDL_KEYCODE_OPTIONS\"@, defined at @SDL3\/SDL_hints.h 2455:9@
+sDL_HINT_KEYCODE_OPTIONS :: BG.ByteString
+sDL_HINT_KEYCODE_OPTIONS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4B
+    , 0x45
+    , 0x59
+    , 0x43
+    , 0x4F
+    , 0x44
+    , 0x45
+    , 0x5F
+    , 0x4F
+    , 0x50
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    , 0x53
+    ]
+
+-- | A variable that controls what KMSDRM device to use.
+--
+--     SDL might open something like \"\/dev\/dri\/cardNN\" to access KMSDRM functionality, where \"NN\" is a device index number. SDL makes a guess at the best index to use (usually zero), but the app or user can set this hint to a number between 0 and 99 to force selection.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_KMSDRM_DEVICE_INDEX@, literal @\"SDL_KMSDRM_DEVICE_INDEX\"@, defined at @SDL3\/SDL_hints.h 2469:9@
+sDL_HINT_KMSDRM_DEVICE_INDEX :: BG.ByteString
+sDL_HINT_KMSDRM_DEVICE_INDEX =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4B
+    , 0x4D
+    , 0x53
+    , 0x44
+    , 0x52
+    , 0x4D
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x45
+    , 0x58
+    ]
+
+-- | A variable that controls whether SDL requires DRM master access in order to initialize the KMSDRM video backend.
+--
+--     The DRM subsystem has a concept of a \"DRM master\" which is a DRM client that has the ability to set planes, set cursor, etc. When SDL is DRM master, it can draw to the screen using the SDL rendering APIs. Without DRM master, SDL is still able to process input and query attributes of attached displays, but it cannot change display state or draw to the screen directly.
+--
+--     In some cases, it can be useful to have the KMSDRM backend even if it cannot be used for rendering. An app may want to use SDL for input processing while using another rendering API (such as an MMAL overlay on Raspberry Pi) or using its own code to render to DRM overlays that SDL doesn\'t support.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": SDL will allow usage of the KMSDRM backend without DRM master.
+--
+--     * \"1\": SDL Will require DRM master to use the KMSDRM backend. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_KMSDRM_REQUIRE_DRM_MASTER@, literal @\"SDL_KMSDRM_REQUIRE_DRM_MASTER\"@, defined at @SDL3\/SDL_hints.h 2497:9@
+sDL_HINT_KMSDRM_REQUIRE_DRM_MASTER :: BG.ByteString
+sDL_HINT_KMSDRM_REQUIRE_DRM_MASTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4B
+    , 0x4D
+    , 0x53
+    , 0x44
+    , 0x52
+    , 0x4D
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x51
+    , 0x55
+    , 0x49
+    , 0x52
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x52
+    , 0x4D
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x53
+    , 0x54
+    , 0x45
+    , 0x52
+    ]
+
+-- | A variable that controls whether KMSDRM will use \"atomic\" functionality.
+--
+--     The KMSDRM backend can use atomic commits, if both DRM_CLIENT_CAP_ATOMIC and DRM_CLIENT_CAP_UNIVERSAL_PLANES is supported by the system. As of SDL 3.4.0, it will favor this functionality, but in case this doesn\'t work well on a given system or other surprises, this hint can be used to disable it.
+--
+--     This hint can not enable the functionality if it isn\'t available.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": SDL will not use the KMSDRM \"atomic\" functionality.
+--
+--     * \"1\": SDL will allow usage of the KMSDRM \"atomic\" functionality. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_KMSDRM_ATOMIC@, literal @\"SDL_KMSDRM_ATOMIC\"@, defined at @SDL3\/SDL_hints.h 2518:9@
+sDL_HINT_KMSDRM_ATOMIC :: BG.ByteString
+sDL_HINT_KMSDRM_ATOMIC =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4B
+    , 0x4D
+    , 0x53
+    , 0x44
+    , 0x52
+    , 0x4D
+    , 0x5F
+    , 0x41
+    , 0x54
+    , 0x4F
+    , 0x4D
+    , 0x49
+    , 0x43
+    ]
+
+-- | A variable controlling the default SDL log levels.
+--
+--     This variable is a comma separated set of category=level tokens that define the default logging levels for SDL applications.
+--
+--     The category can be a numeric category, one of \"app\", \"error\", \"assert\", \"system\", \"audio\", \"video\", \"render\", \"input\", \"test\", or @*@ for any unspecified category.
+--
+--     The level can be a numeric level, one of \"verbose\", \"debug\", \"info\", \"warn\", \"error\", \"critical\", or \"quiet\" to disable that category.
+--
+--     You can omit the category if you want to set the logging level for all categories.
+--
+--     If this hint isn\'t set, the default log levels are equivalent to:
+--
+--     @app=info,assert=warn,test=verbose,*=error@
+--
+--     If the @DEBUG_INVOCATION@ environment variable is set to \"1\", the default log levels are equivalent to:
+--
+--     @assert=warn,test=verbose,*=debug@
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_LOGGING@, literal @\"SDL_LOGGING\"@, defined at @SDL3\/SDL_hints.h 2549:9@
+sDL_HINT_LOGGING :: BG.ByteString
+sDL_HINT_LOGGING =
+  BG.pack [0x53, 0x44, 0x4C, 0x5F, 0x4C, 0x4F, 0x47, 0x47, 0x49, 0x4E, 0x47]
+
+-- | A variable controlling whether to force the application to become the foreground process when launched on macOS.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The application is brought to the foreground when launched. (default)
+--
+--     * \"1\": The application may remain in the background when launched.
+--
+--     This hint needs to be set before SDL_Init().
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MAC_BACKGROUND_APP@, literal @\"SDL_MAC_BACKGROUND_APP\"@, defined at @SDL3\/SDL_hints.h 2565:9@
+sDL_HINT_MAC_BACKGROUND_APP :: BG.ByteString
+sDL_HINT_MAC_BACKGROUND_APP =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x43
+    , 0x5F
+    , 0x42
+    , 0x41
+    , 0x43
+    , 0x4B
+    , 0x47
+    , 0x52
+    , 0x4F
+    , 0x55
+    , 0x4E
+    , 0x44
+    , 0x5F
+    , 0x41
+    , 0x50
+    , 0x50
+    ]
+
+-- | A variable that determines whether Ctrl+Click should generate a right-click event on macOS.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Ctrl+Click does not generate a right mouse button click event. (default)
+--
+--     * \"1\": Ctrl+Click generated a right mouse button click event.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK@, literal @\"SDL_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK\"@, defined at @SDL3\/SDL_hints.h 2581:9@
+sDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK :: BG.ByteString
+sDL_HINT_MAC_CTRL_CLICK_EMULATE_RIGHT_CLICK =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x43
+    , 0x5F
+    , 0x43
+    , 0x54
+    , 0x52
+    , 0x4C
+    , 0x5F
+    , 0x43
+    , 0x4C
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x45
+    , 0x4D
+    , 0x55
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x49
+    , 0x47
+    , 0x48
+    , 0x54
+    , 0x5F
+    , 0x43
+    , 0x4C
+    , 0x49
+    , 0x43
+    , 0x4B
+    ]
+
+-- | A variable controlling whether dispatching OpenGL context updates should block the dispatching thread until the main thread finishes processing on macOS.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Dispatching OpenGL context updates will block the dispatching thread until the main thread finishes processing. (default)
+--
+--     * \"1\": Dispatching OpenGL context updates will allow the dispatching thread to continue execution.
+--
+--     Generally you want the default, but if you have OpenGL code in a background thread on a Mac, and the main thread hangs because it\'s waiting for that background thread, but that background thread is also hanging because it\'s waiting for the main thread to do an update, this might fix your issue.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MAC_OPENGL_ASYNC_DISPATCH@, literal @\"SDL_MAC_OPENGL_ASYNC_DISPATCH\"@, defined at @SDL3\/SDL_hints.h 2604:9@
+sDL_HINT_MAC_OPENGL_ASYNC_DISPATCH :: BG.ByteString
+sDL_HINT_MAC_OPENGL_ASYNC_DISPATCH =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x43
+    , 0x5F
+    , 0x4F
+    , 0x50
+    , 0x45
+    , 0x4E
+    , 0x47
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x53
+    , 0x59
+    , 0x4E
+    , 0x43
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x53
+    , 0x50
+    , 0x41
+    , 0x54
+    , 0x43
+    , 0x48
+    ]
+
+-- | A variable controlling whether the Option key on macOS should be remapped to act as the Alt key.
+--
+--     The variable can be set to the following values:
+--
+--     * \"none\": The Option key is not remapped to Alt. (default)
+--
+--     * \"only_left\": Only the left Option key is remapped to Alt.
+--
+--     * \"only_right\": Only the right Option key is remapped to Alt.
+--
+--     * \"both\": Both Option keys are remapped to Alt.
+--
+--     This will prevent the triggering of key compositions that rely on the Option key, but will still send the Alt modifier for keyboard events. In the case that both Alt and Option are pressed, the Option key will be ignored. This is particularly useful for applications like terminal emulators and graphical user interfaces (GUIs) that rely on Alt key functionality for shortcuts or navigation. This does not apply to SDL_GetKeyFromScancode and only has an effect if IME is enabled.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MAC_OPTION_AS_ALT@, literal @\"SDL_MAC_OPTION_AS_ALT\"@, defined at @SDL3\/SDL_hints.h 2629:9@
+sDL_HINT_MAC_OPTION_AS_ALT :: BG.ByteString
+sDL_HINT_MAC_OPTION_AS_ALT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x43
+    , 0x5F
+    , 0x4F
+    , 0x50
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    , 0x5F
+    , 0x41
+    , 0x53
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x54
+    ]
+
+-- | A variable controlling whether SDL_EVENT_MOUSE_WHEEL event values will have momentum on macOS.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The mouse wheel events will have no momentum. (default)
+--
+--     * \"1\": The mouse wheel events will have momentum.
+--
+--     This hint needs to be set before SDL_Init().
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MAC_SCROLL_MOMENTUM@, literal @\"SDL_MAC_SCROLL_MOMENTUM\"@, defined at @SDL3\/SDL_hints.h 2644:9@
+sDL_HINT_MAC_SCROLL_MOMENTUM :: BG.ByteString
+sDL_HINT_MAC_SCROLL_MOMENTUM =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x43
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x4F
+    , 0x4C
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x4D
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x55
+    , 0x4D
+    ]
+
+-- | A variable controlling whether holding down a key will repeat the pressed key or open the accents menu on macOS.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Holding a key will repeat the pressed key.
+--
+--     * \"1\": Holding a key will open the accents menu for that key. (default)
+--
+--     This hint needs to be set before SDL_Init().
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_MAC_PRESS_AND_HOLD@, literal @\"SDL_MAC_PRESS_AND_HOLD\"@, defined at @SDL3\/SDL_hints.h 2659:9@
+sDL_HINT_MAC_PRESS_AND_HOLD :: BG.ByteString
+sDL_HINT_MAC_PRESS_AND_HOLD =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x43
+    , 0x5F
+    , 0x50
+    , 0x52
+    , 0x45
+    , 0x53
+    , 0x53
+    , 0x5F
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x5F
+    , 0x48
+    , 0x4F
+    , 0x4C
+    , 0x44
+    ]
+
+-- | Request SDL_AppIterate() be called at a specific rate.
+--
+--     If this is set to a number, it represents Hz, so \"60\" means try to iterate 60 times per second. \"0\" means to iterate as fast as possible. Negative values are illegal, but reserved, in case they are useful in a future revision of SDL.
+--
+--     There are other strings that have special meaning. If set to \"waitevent\", SDL_AppIterate will not be called until new event(s) have arrived (and been processed by SDL_AppEvent). This can be useful for apps that are completely idle except in response to input.
+--
+--     On some platforms, or if you are using SDL_main instead of SDL_AppIterate, this hint is ignored. When the hint can be used, it is allowed to be changed at any time.
+--
+--     This defaults to 0, and specifying NULL for the hint\'s value will restore the default.
+--
+--     This doesn\'t have to be an integer value. For example, \"59.94\" won\'t be rounded to an integer rate; the digits after the decimal are actually respected.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MAIN_CALLBACK_RATE@, literal @\"SDL_MAIN_CALLBACK_RATE\"@, defined at @SDL3\/SDL_hints.h 2689:9@
+sDL_HINT_MAIN_CALLBACK_RATE :: BG.ByteString
+sDL_HINT_MAIN_CALLBACK_RATE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x49
+    , 0x4E
+    , 0x5F
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x4C
+    , 0x42
+    , 0x41
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x52
+    , 0x41
+    , 0x54
+    , 0x45
+    ]
+
+-- | A variable controlling whether the mouse is captured while mouse buttons are pressed.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The mouse is not captured while mouse buttons are pressed.
+--
+--     * \"1\": The mouse is captured while mouse buttons are pressed.
+--
+--     By default the mouse is captured while mouse buttons are pressed so if the mouse is dragged outside the window, the application continues to receive mouse events until the button is released.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_AUTO_CAPTURE@, literal @\"SDL_MOUSE_AUTO_CAPTURE\"@, defined at @SDL3\/SDL_hints.h 2708:9@
+sDL_HINT_MOUSE_AUTO_CAPTURE :: BG.ByteString
+sDL_HINT_MOUSE_AUTO_CAPTURE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x54
+    , 0x4F
+    , 0x5F
+    , 0x43
+    , 0x41
+    , 0x50
+    , 0x54
+    , 0x55
+    , 0x52
+    , 0x45
+    ]
+
+-- | A variable setting the double click radius, in pixels.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS@, literal @\"SDL_MOUSE_DOUBLE_CLICK_RADIUS\"@, defined at @SDL3\/SDL_hints.h 2717:9@
+sDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS :: BG.ByteString
+sDL_HINT_MOUSE_DOUBLE_CLICK_RADIUS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x4F
+    , 0x55
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x43
+    , 0x4C
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x52
+    , 0x41
+    , 0x44
+    , 0x49
+    , 0x55
+    , 0x53
+    ]
+
+-- | A variable setting the double click time, in milliseconds.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_DOUBLE_CLICK_TIME@, literal @\"SDL_MOUSE_DOUBLE_CLICK_TIME\"@, defined at @SDL3\/SDL_hints.h 2726:9@
+sDL_HINT_MOUSE_DOUBLE_CLICK_TIME :: BG.ByteString
+sDL_HINT_MOUSE_DOUBLE_CLICK_TIME =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x4F
+    , 0x55
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x43
+    , 0x4C
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x49
+    , 0x4D
+    , 0x45
+    ]
+
+-- | A variable setting which system cursor to use as the default cursor.
+--
+--     This should be an integer corresponding to the SDL_SystemCursor enum. The default value is zero (SDL_SYSTEM_CURSOR_DEFAULT).
+--
+--     This hint needs to be set before SDL_Init().
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_DEFAULT_SYSTEM_CURSOR@, literal @\"SDL_MOUSE_DEFAULT_SYSTEM_CURSOR\"@, defined at @SDL3\/SDL_hints.h 2738:9@
+sDL_HINT_MOUSE_DEFAULT_SYSTEM_CURSOR :: BG.ByteString
+sDL_HINT_MOUSE_DEFAULT_SYSTEM_CURSOR =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x46
+    , 0x41
+    , 0x55
+    , 0x4C
+    , 0x54
+    , 0x5F
+    , 0x53
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x45
+    , 0x4D
+    , 0x5F
+    , 0x43
+    , 0x55
+    , 0x52
+    , 0x53
+    , 0x4F
+    , 0x52
+    ]
+
+-- | A variable setting whether we should scale cursors by the current display scale.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Cursors will not change size based on the display content scale. (default)
+--
+--     * \"1\": Cursors will automatically match the display content scale (e.g. a 2x sized cursor will be used when the window is on a monitor with 200% scale). This is currently implemented on Windows and Wayland.
+--
+--     This hint needs to be set before creating cursors.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_DPI_SCALE_CURSORS@, literal @\"SDL_MOUSE_DPI_SCALE_CURSORS\"@, defined at @SDL3\/SDL_hints.h 2756:9@
+sDL_HINT_MOUSE_DPI_SCALE_CURSORS :: BG.ByteString
+sDL_HINT_MOUSE_DPI_SCALE_CURSORS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x43
+    , 0x55
+    , 0x52
+    , 0x53
+    , 0x4F
+    , 0x52
+    , 0x53
+    ]
+
+-- | A variable controlling whether warping a hidden mouse cursor will activate relative mouse mode.
+--
+--     When this hint is set, the mouse cursor is hidden, and multiple warps to the window center occur within a short time period, SDL will emulate mouse warps using relative mouse mode. This can provide smoother and more reliable mouse motion for some older games, which continuously calculate the distance traveled by the mouse pointer and warp it back to the center of the window, rather than using relative mouse motion.
+--
+--     Note that relative mouse mode may have different mouse acceleration behavior than pointer warps.
+--
+--     If your application needs to repeatedly warp the hidden mouse cursor at a high-frequency for other purposes, it should disable this hint.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Attempts to warp the mouse will always be made.
+--
+--     * \"1\": Some mouse warps will be emulated by forcing relative mouse mode. (default)
+--
+--     If not set, this is automatically enabled unless an application uses relative mouse mode directly.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_EMULATE_WARP_WITH_RELATIVE@, literal @\"SDL_MOUSE_EMULATE_WARP_WITH_RELATIVE\"@, defined at @SDL3\/SDL_hints.h 2788:9@
+sDL_HINT_MOUSE_EMULATE_WARP_WITH_RELATIVE :: BG.ByteString
+sDL_HINT_MOUSE_EMULATE_WARP_WITH_RELATIVE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x45
+    , 0x4D
+    , 0x55
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x52
+    , 0x50
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x54
+    , 0x48
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x56
+    , 0x45
+    ]
+
+-- | Allow mouse click events when clicking to focus an SDL window.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Ignore mouse clicks that activate a window. (default)
+--
+--     * \"1\": Generate events for mouse clicks that activate a window.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_FOCUS_CLICKTHROUGH@, literal @\"SDL_MOUSE_FOCUS_CLICKTHROUGH\"@, defined at @SDL3\/SDL_hints.h 2802:9@
+sDL_HINT_MOUSE_FOCUS_CLICKTHROUGH :: BG.ByteString
+sDL_HINT_MOUSE_FOCUS_CLICKTHROUGH =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x46
+    , 0x4F
+    , 0x43
+    , 0x55
+    , 0x53
+    , 0x5F
+    , 0x43
+    , 0x4C
+    , 0x49
+    , 0x43
+    , 0x4B
+    , 0x54
+    , 0x48
+    , 0x52
+    , 0x4F
+    , 0x55
+    , 0x47
+    , 0x48
+    ]
+
+-- | A variable setting the speed scale for mouse motion, in floating point, when the mouse is not in relative mode.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_NORMAL_SPEED_SCALE@, literal @\"SDL_MOUSE_NORMAL_SPEED_SCALE\"@, defined at @SDL3\/SDL_hints.h 2812:9@
+sDL_HINT_MOUSE_NORMAL_SPEED_SCALE :: BG.ByteString
+sDL_HINT_MOUSE_NORMAL_SPEED_SCALE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x4E
+    , 0x4F
+    , 0x52
+    , 0x4D
+    , 0x41
+    , 0x4C
+    , 0x5F
+    , 0x53
+    , 0x50
+    , 0x45
+    , 0x45
+    , 0x44
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x45
+    ]
+
+-- | A variable controlling whether relative mouse mode constrains the mouse to the center of the window.
+--
+--     Constraining to the center of the window works better for FPS games and when the application is running over RDP. Constraining to the whole window works better for 2D games and increases the chance that the mouse will be in the correct position when using high DPI mice.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Relative mouse mode constrains the mouse to the window.
+--
+--     * \"1\": Relative mouse mode constrains the mouse to the center of the window. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_RELATIVE_MODE_CENTER@, literal @\"SDL_MOUSE_RELATIVE_MODE_CENTER\"@, defined at @SDL3\/SDL_hints.h 2833:9@
+sDL_HINT_MOUSE_RELATIVE_MODE_CENTER :: BG.ByteString
+sDL_HINT_MOUSE_RELATIVE_MODE_CENTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x44
+    , 0x45
+    , 0x5F
+    , 0x43
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x45
+    , 0x52
+    ]
+
+-- | A variable setting the scale for mouse motion, in floating point, when the mouse is in relative mode.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE@, literal @\"SDL_MOUSE_RELATIVE_SPEED_SCALE\"@, defined at @SDL3\/SDL_hints.h 2843:9@
+sDL_HINT_MOUSE_RELATIVE_SPEED_SCALE :: BG.ByteString
+sDL_HINT_MOUSE_RELATIVE_SPEED_SCALE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x53
+    , 0x50
+    , 0x45
+    , 0x45
+    , 0x44
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x45
+    ]
+
+-- | A variable controlling whether the system mouse acceleration curve is used for relative mouse motion.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Relative mouse motion will be unscaled. (default)
+--
+--     * \"1\": Relative mouse motion will be scaled using the system mouse acceleration curve.
+--
+--     If SDL_HINT_MOUSE_RELATIVE_SPEED_SCALE is set, that will be applied after system speed scale.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE@, literal @\"SDL_MOUSE_RELATIVE_SYSTEM_SCALE\"@, defined at @SDL3\/SDL_hints.h 2862:9@
+sDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE :: BG.ByteString
+sDL_HINT_MOUSE_RELATIVE_SYSTEM_SCALE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x53
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x45
+    , 0x4D
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x45
+    ]
+
+-- | A variable controlling whether a motion event should be generated for mouse warping in relative mode.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Warping the mouse will not generate a motion event in relative mode
+--
+--     * \"1\": Warping the mouse will generate a motion event in relative mode
+--
+--     By default warping the mouse will not generate motion events in relative mode. This avoids the application having to filter out large relative motion due to warping.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_RELATIVE_WARP_MOTION@, literal @\"SDL_MOUSE_RELATIVE_WARP_MOTION\"@, defined at @SDL3\/SDL_hints.h 2881:9@
+sDL_HINT_MOUSE_RELATIVE_WARP_MOTION :: BG.ByteString
+sDL_HINT_MOUSE_RELATIVE_WARP_MOTION =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x52
+    , 0x50
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | A variable controlling whether the hardware cursor stays visible when relative mode is active.
+--
+--     This variable can be set to the following values:
+--
+--     * \"0\": The cursor will be hidden while relative mode is active (default)
+--
+--     * \"1\": The cursor will remain visible while relative mode is active
+--
+--     Note that for systems without raw hardware inputs, relative mode is implemented using warping, so the hardware cursor will visibly warp between frames if this is enabled on those systems.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE@, literal @\"SDL_MOUSE_RELATIVE_CURSOR_VISIBLE\"@, defined at @SDL3\/SDL_hints.h 2900:9@
+sDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE :: BG.ByteString
+sDL_HINT_MOUSE_RELATIVE_CURSOR_VISIBLE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x43
+    , 0x55
+    , 0x52
+    , 0x53
+    , 0x4F
+    , 0x52
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x53
+    , 0x49
+    , 0x42
+    , 0x4C
+    , 0x45
+    ]
+
+-- | A variable controlling whether mouse events should generate synthetic touch events.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Mouse events will not generate touch events. (default for desktop platforms)
+--
+--     * \"1\": Mouse events will generate touch events. (default for mobile platforms, such as Android and iOS)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MOUSE_TOUCH_EVENTS@, literal @\"SDL_MOUSE_TOUCH_EVENTS\"@, defined at @SDL3\/SDL_hints.h 2917:9@
+sDL_HINT_MOUSE_TOUCH_EVENTS :: BG.ByteString
+sDL_HINT_MOUSE_TOUCH_EVENTS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x54
+    , 0x4F
+    , 0x55
+    , 0x43
+    , 0x48
+    , 0x5F
+    , 0x45
+    , 0x56
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x53
+    ]
+
+-- | A variable controlling whether the keyboard should be muted on the console.
+--
+--     Normally the keyboard is muted while SDL applications are running so that keyboard input doesn\'t show up as key strokes on the console. This hint allows you to turn that off for debugging purposes.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Allow keystrokes to go through to the console.
+--
+--     * \"1\": Mute keyboard input so it doesn\'t show up on the console. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_MUTE_CONSOLE_KEYBOARD@, literal @\"SDL_MUTE_CONSOLE_KEYBOARD\"@, defined at @SDL3\/SDL_hints.h 2935:9@
+sDL_HINT_MUTE_CONSOLE_KEYBOARD :: BG.ByteString
+sDL_HINT_MUTE_CONSOLE_KEYBOARD =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4D
+    , 0x55
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x53
+    , 0x4F
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x4B
+    , 0x45
+    , 0x59
+    , 0x42
+    , 0x4F
+    , 0x41
+    , 0x52
+    , 0x44
+    ]
+
+-- | Tell SDL not to catch the SIGINT or SIGTERM signals on POSIX platforms.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": SDL will install a SIGINT and SIGTERM handler, and when it catches a signal, convert it into an SDL_EVENT_QUIT event. (default)
+--
+--     * \"1\": SDL will not install a signal handler at all.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_NO_SIGNAL_HANDLERS@, literal @\"SDL_NO_SIGNAL_HANDLERS\"@, defined at @SDL3\/SDL_hints.h 2950:9@
+sDL_HINT_NO_SIGNAL_HANDLERS :: BG.ByteString
+sDL_HINT_NO_SIGNAL_HANDLERS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4E
+    , 0x4F
+    , 0x5F
+    , 0x53
+    , 0x49
+    , 0x47
+    , 0x4E
+    , 0x41
+    , 0x4C
+    , 0x5F
+    , 0x48
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x4C
+    , 0x45
+    , 0x52
+    , 0x53
+    ]
+
+-- | Specify the OpenGL library to load.
+--
+--     This hint should be set before creating an OpenGL window or creating an OpenGL context. If this hint isn\'t set, SDL will choose a reasonable default.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_OPENGL_LIBRARY@, literal @\"SDL_OPENGL_LIBRARY\"@, defined at @SDL3\/SDL_hints.h 2961:9@
+sDL_HINT_OPENGL_LIBRARY :: BG.ByteString
+sDL_HINT_OPENGL_LIBRARY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4F
+    , 0x50
+    , 0x45
+    , 0x4E
+    , 0x47
+    , 0x4C
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x42
+    , 0x52
+    , 0x41
+    , 0x52
+    , 0x59
+    ]
+
+-- | Specify the EGL library to load.
+--
+--     This hint should be set before creating an OpenGL window or creating an OpenGL context. This hint is only considered if SDL is using EGL to manage OpenGL contexts. If this hint isn\'t set, SDL will choose a reasonable default.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_EGL_LIBRARY@, literal @\"SDL_EGL_LIBRARY\"@, defined at @SDL3\/SDL_hints.h 2973:9@
+sDL_HINT_EGL_LIBRARY :: BG.ByteString
+sDL_HINT_EGL_LIBRARY =
+  BG.pack [0x53, 0x44, 0x4C, 0x5F, 0x45, 0x47, 0x4C, 0x5F, 0x4C, 0x49, 0x42, 0x52, 0x41, 0x52, 0x59]
+
+-- | A variable controlling what driver to use for OpenGL ES contexts.
+--
+--     On some platforms, currently Windows and X11, OpenGL drivers may support creating contexts with an OpenGL ES profile. By default SDL uses these profiles, when available, otherwise it attempts to load an OpenGL ES library, e.g. that provided by the ANGLE project. This variable controls whether SDL follows this default behaviour or will always load an OpenGL ES library.
+--
+--     Circumstances where this is useful include - Testing an app with a particular OpenGL ES implementation, e.g ANGLE, or emulator, e.g. those from ARM, Imagination or Qualcomm. - Resolving OpenGL ES function addresses at link time by linking with the OpenGL ES library instead of querying them at run time with SDL_GL_GetProcAddress().
+--
+--     Caution: for an application to work with the default behaviour across different OpenGL drivers it must query the OpenGL ES function addresses at run time using SDL_GL_GetProcAddress().
+--
+--     This variable is ignored on most platforms because OpenGL ES is native or not supported.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Use ES profile of OpenGL, if available. (default)
+--
+--     * \"1\": Load OpenGL ES library using the default library names.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_OPENGL_ES_DRIVER@, literal @\"SDL_OPENGL_ES_DRIVER\"@, defined at @SDL3\/SDL_hints.h 3007:9@
+sDL_HINT_OPENGL_ES_DRIVER :: BG.ByteString
+sDL_HINT_OPENGL_ES_DRIVER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4F
+    , 0x50
+    , 0x45
+    , 0x4E
+    , 0x47
+    , 0x4C
+    , 0x5F
+    , 0x45
+    , 0x53
+    , 0x5F
+    , 0x44
+    , 0x52
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x52
+    ]
+
+-- | A variable controlling whether to force an sRGB-capable OpenGL context.
+--
+--     At OpenGL context creation time, some platforms can request an sRGB-capable context. However, sometimes any form of the request can cause surprising results on some drivers, platforms, and hardware. Usually the surprise is in the form of rendering that is either a little darker or a little brighter than intended.
+--
+--     This hint allows the user to override the app\'s sRGB requests and either force a specific value, or avoid requesting anything at all, depending on what makes things work correctly for their system.
+--
+--     This is meant as a fail-safe; apps should probably not explicitly set this, and most users should not, either.
+--
+--     Note that some platforms cannot make this request at all, and on all platforms this request can be denied by the operating system.
+--
+--     In addition to attempting to obtain the type of sRGB-capable OpenGL context requested by this hint, SDL will try to force the state of GL_FRAMEBUFFER_SRGB on the new context, if appropriate.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Force a request for an OpenGL context that is /not/ sRGB-capable.
+--
+--     * \"1\": Force a request for an OpenGL context that /is/ sRGB-capable.
+--
+--     * \"skip\": Don\'t make any request for an sRGB-capable context (don\'t specify the attribute at all during context creation time).
+--
+--     * any other string is undefined behavior.
+--
+--     If unset, or set to an empty string, SDL will make a request using the value the app specified with the SDL_GL_FRAMEBUFFER_SRGB_CAPABLE attribute.
+--
+--     This hint should be set before an OpenGL context is created.
+--
+--     @since 3.4.2
+--
+--     [C declaration]: @macro SDL_HINT_OPENGL_FORCE_SRGB_FRAMEBUFFER@, literal @\"SDL_OPENGL_FORCE_SRGB_FRAMEBUFFER\"@, defined at @SDL3\/SDL_hints.h 3047:9@
+sDL_HINT_OPENGL_FORCE_SRGB_FRAMEBUFFER :: BG.ByteString
+sDL_HINT_OPENGL_FORCE_SRGB_FRAMEBUFFER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4F
+    , 0x50
+    , 0x45
+    , 0x4E
+    , 0x47
+    , 0x4C
+    , 0x5F
+    , 0x46
+    , 0x4F
+    , 0x52
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x53
+    , 0x52
+    , 0x47
+    , 0x42
+    , 0x5F
+    , 0x46
+    , 0x52
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x42
+    , 0x55
+    , 0x46
+    , 0x46
+    , 0x45
+    , 0x52
+    ]
+
+-- | Mechanism to specify openvr_api library location
+--
+--     By default, when using the OpenVR driver, it will search for the API library in the current folder. But, if you wish to use a system API you can specify that by using this hint. This should be the full or relative path to a .dll on Windows or .so on Linux.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_OPENVR_LIBRARY@, literal @\"SDL_OPENVR_LIBRARY\"@, defined at @SDL3\/SDL_hints.h 3059:9@
+sDL_HINT_OPENVR_LIBRARY :: BG.ByteString
+sDL_HINT_OPENVR_LIBRARY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x4F
+    , 0x50
+    , 0x45
+    , 0x4E
+    , 0x56
+    , 0x52
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x42
+    , 0x52
+    , 0x41
+    , 0x52
+    , 0x59
+    ]
+
+-- | A variable controlling which orientations are allowed on iOS\/Android.
+--
+--     In some circumstances it is necessary to be able to explicitly control which UI orientations are allowed.
+--
+--     This variable is a space delimited list of the following values:
+--
+--     * \"LandscapeLeft\"
+--
+--     * \"LandscapeRight\"
+--
+--     * \"Portrait\"
+--
+--     * \"PortraitUpsideDown\"
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_ORIENTATIONS@, literal @\"SDL_ORIENTATIONS\"@, defined at @SDL3\/SDL_hints.h 3078:9@
+sDL_HINT_ORIENTATIONS :: BG.ByteString
+sDL_HINT_ORIENTATIONS =
+  BG.pack
+    [0x53, 0x44, 0x4C, 0x5F, 0x4F, 0x52, 0x49, 0x45, 0x4E, 0x54, 0x41, 0x54, 0x49, 0x4F, 0x4E, 0x53]
+
+-- | A variable controlling the use of a sentinel event when polling the event queue.
+--
+--     When polling for events, SDL_PumpEvents is used to gather new events from devices. If a device keeps producing new events between calls to SDL_PumpEvents, a poll loop will become stuck until the new events stop. This is most noticeable when moving a high frequency mouse.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable poll sentinels.
+--
+--     * \"1\": Enable poll sentinels. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_POLL_SENTINEL@, literal @\"SDL_POLL_SENTINEL\"@, defined at @SDL3\/SDL_hints.h 3098:9@
+sDL_HINT_POLL_SENTINEL :: BG.ByteString
+sDL_HINT_POLL_SENTINEL =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x50
+    , 0x4F
+    , 0x4C
+    , 0x4C
+    , 0x5F
+    , 0x53
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x49
+    , 0x4E
+    , 0x45
+    , 0x4C
+    ]
+
+-- | Override for SDL_GetPreferredLocales().
+--
+--     If set, this will be favored over anything the OS might report for the user\'s preferred locales. Changing this hint at runtime will not generate a SDL_EVENT_LOCALE_CHANGED event (but if you can change the hint, you can push your own event, if you want).
+--
+--     The format of this hint is a comma-separated list of language and locale, combined with an underscore, as is a common format: \"en_GB\". Locale is optional: \"en\". So you might have a list like this: \"en_GB,jp,es_PT\"
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_PREFERRED_LOCALES@, literal @\"SDL_PREFERRED_LOCALES\"@, defined at @SDL3\/SDL_hints.h 3116:9@
+sDL_HINT_PREFERRED_LOCALES :: BG.ByteString
+sDL_HINT_PREFERRED_LOCALES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x50
+    , 0x52
+    , 0x45
+    , 0x46
+    , 0x45
+    , 0x52
+    , 0x52
+    , 0x45
+    , 0x44
+    , 0x5F
+    , 0x4C
+    , 0x4F
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable that decides whether to send SDL_EVENT_QUIT when closing the last window.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": SDL will not send an SDL_EVENT_QUIT event when the last window is requesting to close. Note that in this case, there are still other legitimate reasons one might get an SDL_EVENT_QUIT event: choosing \"Quit\" from the macOS menu bar, sending a SIGINT (ctrl-c) on Unix, etc.
+--
+--     * \"1\": SDL will send a quit event when the last window is requesting to close. (default)
+--
+--     If there is at least one active system tray icon, SDL_EVENT_QUIT will instead be sent when both the last window will be closed and the last tray icon will be destroyed.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE@, literal @\"SDL_QUIT_ON_LAST_WINDOW_CLOSE\"@, defined at @SDL3\/SDL_hints.h 3139:9@
+sDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE :: BG.ByteString
+sDL_HINT_QUIT_ON_LAST_WINDOW_CLOSE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x51
+    , 0x55
+    , 0x49
+    , 0x54
+    , 0x5F
+    , 0x4F
+    , 0x4E
+    , 0x5F
+    , 0x4C
+    , 0x41
+    , 0x53
+    , 0x54
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x43
+    , 0x4C
+    , 0x4F
+    , 0x53
+    , 0x45
+    ]
+
+-- | A variable controlling whether the Direct3D device is initialized for thread-safe operations.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Thread-safety is not enabled. (default)
+--
+--     * \"1\": Thread-safety is enabled.
+--
+--     This hint should be set before creating a renderer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RENDER_DIRECT3D_THREADSAFE@, literal @\"SDL_RENDER_DIRECT3D_THREADSAFE\"@, defined at @SDL3\/SDL_hints.h 3154:9@
+sDL_HINT_RENDER_DIRECT3D_THREADSAFE :: BG.ByteString
+sDL_HINT_RENDER_DIRECT3D_THREADSAFE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4E
+    , 0x44
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x52
+    , 0x45
+    , 0x43
+    , 0x54
+    , 0x33
+    , 0x44
+    , 0x5F
+    , 0x54
+    , 0x48
+    , 0x52
+    , 0x45
+    , 0x41
+    , 0x44
+    , 0x53
+    , 0x41
+    , 0x46
+    , 0x45
+    ]
+
+-- | A variable controlling whether to enable Direct3D 11+\'s Debug Layer.
+--
+--     This variable does not have any effect on the Direct3D 9 based renderer.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable Debug Layer use. (default)
+--
+--     * \"1\": Enable Debug Layer use.
+--
+--     This hint should be set before creating a renderer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RENDER_DIRECT3D11_DEBUG@, literal @\"SDL_RENDER_DIRECT3D11_DEBUG\"@, defined at @SDL3\/SDL_hints.h 3170:9@
+sDL_HINT_RENDER_DIRECT3D11_DEBUG :: BG.ByteString
+sDL_HINT_RENDER_DIRECT3D11_DEBUG =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4E
+    , 0x44
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x52
+    , 0x45
+    , 0x43
+    , 0x54
+    , 0x33
+    , 0x44
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x42
+    , 0x55
+    , 0x47
+    ]
+
+-- | A variable controlling whether to use the Direct3D 11 WARP software rasterizer.
+--
+--     For more information, see: [https:\/\/learn.microsoft.com\/en-us\/windows\/win32\/direct3darticles\/directx-warp](https://learn.microsoft.com/en-us/windows/win32/direct3darticles/directx-warp)
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable WARP rasterizer. (default)
+--
+--     * \"1\": Enable WARP rasterizer.
+--
+--     This hint should be set before creating a renderer.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_RENDER_DIRECT3D11_WARP@, literal @\"SDL_RENDER_DIRECT3D11_WARP\"@, defined at @SDL3\/SDL_hints.h 3188:9@
+sDL_HINT_RENDER_DIRECT3D11_WARP :: BG.ByteString
+sDL_HINT_RENDER_DIRECT3D11_WARP =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4E
+    , 0x44
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x52
+    , 0x45
+    , 0x43
+    , 0x54
+    , 0x33
+    , 0x44
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x52
+    , 0x50
+    ]
+
+-- | A variable controlling whether to enable Vulkan Validation Layers.
+--
+--     This variable can be set to the following values:
+--
+--     * \"0\": Disable Validation Layer use
+--
+--     * \"1\": Enable Validation Layer use
+--
+--     By default, SDL does not use Vulkan Validation Layers.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RENDER_VULKAN_DEBUG@, literal @\"SDL_RENDER_VULKAN_DEBUG\"@, defined at @SDL3\/SDL_hints.h 3202:9@
+sDL_HINT_RENDER_VULKAN_DEBUG :: BG.ByteString
+sDL_HINT_RENDER_VULKAN_DEBUG =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4E
+    , 0x44
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x56
+    , 0x55
+    , 0x4C
+    , 0x4B
+    , 0x41
+    , 0x4E
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x42
+    , 0x55
+    , 0x47
+    ]
+
+-- | A variable controlling whether to create the GPU device in debug mode.
+--
+--     This variable can be set to the following values:
+--
+--     * \"0\": Disable debug mode use (default)
+--
+--     * \"1\": Enable debug mode use
+--
+--     This hint should be set before creating a renderer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RENDER_GPU_DEBUG@, literal @\"SDL_RENDER_GPU_DEBUG\"@, defined at @SDL3\/SDL_hints.h 3216:9@
+sDL_HINT_RENDER_GPU_DEBUG :: BG.ByteString
+sDL_HINT_RENDER_GPU_DEBUG =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4E
+    , 0x44
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x47
+    , 0x50
+    , 0x55
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x42
+    , 0x55
+    , 0x47
+    ]
+
+-- | A variable controlling whether to prefer a low-power GPU on multi-GPU systems.
+--
+--     This variable can be set to the following values:
+--
+--     * \"0\": Prefer high-performance GPU (default)
+--
+--     * \"1\": Prefer low-power GPU
+--
+--     This hint should be set before creating a renderer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RENDER_GPU_LOW_POWER@, literal @\"SDL_RENDER_GPU_LOW_POWER\"@, defined at @SDL3\/SDL_hints.h 3231:9@
+sDL_HINT_RENDER_GPU_LOW_POWER :: BG.ByteString
+sDL_HINT_RENDER_GPU_LOW_POWER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4E
+    , 0x44
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x47
+    , 0x50
+    , 0x55
+    , 0x5F
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x50
+    , 0x4F
+    , 0x57
+    , 0x45
+    , 0x52
+    ]
+
+-- | A variable specifying which render driver to use.
+--
+--     If the application doesn\'t pick a specific renderer to use, this variable specifies the name of the preferred renderer. If the preferred renderer can\'t be initialized, creating a renderer will fail.
+--
+--     This variable is case insensitive and can be set to the following values:
+--
+--     * \"direct3d\"
+--
+--     * \"direct3d11\"
+--
+--     * \"direct3d12\"
+--
+--     * \"opengl\"
+--
+--     * \"opengles2\"
+--
+--     * \"opengles\"
+--
+--     * \"metal\"
+--
+--     * \"vulkan\"
+--
+--     * \"gpu\"
+--
+--     * \"software\"
+--
+--     This hint accepts a comma-separated list of driver names, and each will be tried in the order listed when creating a renderer until one succeeds or all of them fail.
+--
+--     The default varies by platform, but it\'s the first one in the list that is available on the current platform.
+--
+--     This hint should be set before creating a renderer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RENDER_DRIVER@, literal @\"SDL_RENDER_DRIVER\"@, defined at @SDL3\/SDL_hints.h 3264:9@
+sDL_HINT_RENDER_DRIVER :: BG.ByteString
+sDL_HINT_RENDER_DRIVER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4E
+    , 0x44
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x44
+    , 0x52
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x52
+    ]
+
+-- | A variable controlling how the 2D render API renders lines.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Use the default line drawing method (Bresenham\'s line algorithm)
+--
+--     * \"1\": Use the driver point API using Bresenham\'s line algorithm (correct, draws many points)
+--
+--     * \"2\": Use the driver line API (occasionally misses line endpoints based on hardware driver quirks
+--
+--     * \"3\": Use the driver geometry API (correct, draws thicker diagonal lines)
+--
+--     This hint should be set before creating a renderer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RENDER_LINE_METHOD@, literal @\"SDL_RENDER_LINE_METHOD\"@, defined at @SDL3\/SDL_hints.h 3282:9@
+sDL_HINT_RENDER_LINE_METHOD :: BG.ByteString
+sDL_HINT_RENDER_LINE_METHOD =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4E
+    , 0x44
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x4E
+    , 0x45
+    , 0x5F
+    , 0x4D
+    , 0x45
+    , 0x54
+    , 0x48
+    , 0x4F
+    , 0x44
+    ]
+
+-- | A variable controlling whether the Metal render driver select low power device over default one.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Use the preferred OS device. (default)
+--
+--     * \"1\": Select a low power device.
+--
+--     This hint should be set before creating a renderer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE@, literal @\"SDL_RENDER_METAL_PREFER_LOW_POWER_DEVICE\"@, defined at @SDL3\/SDL_hints.h 3297:9@
+sDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE :: BG.ByteString
+sDL_HINT_RENDER_METAL_PREFER_LOW_POWER_DEVICE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4E
+    , 0x44
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x4D
+    , 0x45
+    , 0x54
+    , 0x41
+    , 0x4C
+    , 0x5F
+    , 0x50
+    , 0x52
+    , 0x45
+    , 0x46
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x50
+    , 0x4F
+    , 0x57
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    ]
+
+-- | A variable controlling whether updates to the SDL screen surface should be synchronized with the vertical refresh, to avoid tearing.
+--
+--     This hint overrides the application preference when creating a renderer.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable vsync. (default)
+--
+--     * \"1\": Enable vsync.
+--
+--     This hint should be set before creating a renderer.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RENDER_VSYNC@, literal @\"SDL_RENDER_VSYNC\"@, defined at @SDL3\/SDL_hints.h 3314:9@
+sDL_HINT_RENDER_VSYNC :: BG.ByteString
+sDL_HINT_RENDER_VSYNC =
+  BG.pack
+    [0x53, 0x44, 0x4C, 0x5F, 0x52, 0x45, 0x4E, 0x44, 0x45, 0x52, 0x5F, 0x56, 0x53, 0x59, 0x4E, 0x43]
+
+-- | A variable to control whether the return key on the soft keyboard should hide the soft keyboard on Android and iOS.
+--
+--     This hint sets the default value of SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The return key will be handled as a key event. (default)
+--
+--     * \"1\": The return key will hide the keyboard.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RETURN_KEY_HIDES_IME@, literal @\"SDL_RETURN_KEY_HIDES_IME\"@, defined at @SDL3\/SDL_hints.h 3331:9@
+sDL_HINT_RETURN_KEY_HIDES_IME :: BG.ByteString
+sDL_HINT_RETURN_KEY_HIDES_IME =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x54
+    , 0x55
+    , 0x52
+    , 0x4E
+    , 0x5F
+    , 0x4B
+    , 0x45
+    , 0x59
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x53
+    , 0x5F
+    , 0x49
+    , 0x4D
+    , 0x45
+    ]
+
+-- | A variable containing a list of ROG gamepad capable mice.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED'
+--
+--     [C declaration]: @macro SDL_HINT_ROG_GAMEPAD_MICE@, literal @\"SDL_ROG_GAMEPAD_MICE\"@, defined at @SDL3\/SDL_hints.h 3350:9@
+sDL_HINT_ROG_GAMEPAD_MICE :: BG.ByteString
+sDL_HINT_ROG_GAMEPAD_MICE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x4F
+    , 0x47
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x50
+    , 0x41
+    , 0x44
+    , 0x5F
+    , 0x4D
+    , 0x49
+    , 0x43
+    , 0x45
+    ]
+
+-- | A variable containing a list of devices that are not ROG gamepad capable mice.
+--
+--     This will override SDL_HINT_ROG_GAMEPAD_MICE and the built in device list.
+--
+--     The format of the string is a comma separated list of USB VID\/PID pairs in hexadecimal form, e.g.
+--
+--     @0xAAAA\/0xBBBB,0xCCCC\/0xDDDD@
+--
+--     The variable can also take the form of \"\@file\", in which case the named file will be loaded and interpreted as the value of the variable.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED@, literal @\"SDL_ROG_GAMEPAD_MICE_EXCLUDED\"@, defined at @SDL3\/SDL_hints.h 3370:9@
+sDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED :: BG.ByteString
+sDL_HINT_ROG_GAMEPAD_MICE_EXCLUDED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x4F
+    , 0x47
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x50
+    , 0x41
+    , 0x44
+    , 0x5F
+    , 0x4D
+    , 0x49
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x43
+    , 0x4C
+    , 0x55
+    , 0x44
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling the width of the PS2\'s framebuffer in pixels.
+--
+--     By default, the variable is \"640\".
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_PS2_GS_WIDTH@, literal @\"SDL_PS2_GS_WIDTH\"@, defined at @SDL3\/SDL_hints.h 3379:9@
+sDL_HINT_PS2_GS_WIDTH :: BG.ByteString
+sDL_HINT_PS2_GS_WIDTH =
+  BG.pack
+    [0x53, 0x44, 0x4C, 0x5F, 0x50, 0x53, 0x32, 0x5F, 0x47, 0x53, 0x5F, 0x57, 0x49, 0x44, 0x54, 0x48]
+
+-- | A variable controlling the height of the PS2\'s framebuffer in pixels.
+--
+--     By default, the variable is \"448\".
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_PS2_GS_HEIGHT@, literal @\"SDL_PS2_GS_HEIGHT\"@, defined at @SDL3\/SDL_hints.h 3388:9@
+sDL_HINT_PS2_GS_HEIGHT :: BG.ByteString
+sDL_HINT_PS2_GS_HEIGHT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x50
+    , 0x53
+    , 0x32
+    , 0x5F
+    , 0x47
+    , 0x53
+    , 0x5F
+    , 0x48
+    , 0x45
+    , 0x49
+    , 0x47
+    , 0x48
+    , 0x54
+    ]
+
+-- | A variable controlling whether the signal is interlaced or progressive.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Image is interlaced. (default)
+--
+--     * \"1\": Image is progressive.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_PS2_GS_PROGRESSIVE@, literal @\"SDL_PS2_GS_PROGRESSIVE\"@, defined at @SDL3\/SDL_hints.h 3400:9@
+sDL_HINT_PS2_GS_PROGRESSIVE :: BG.ByteString
+sDL_HINT_PS2_GS_PROGRESSIVE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x50
+    , 0x53
+    , 0x32
+    , 0x5F
+    , 0x47
+    , 0x53
+    , 0x5F
+    , 0x50
+    , 0x52
+    , 0x4F
+    , 0x47
+    , 0x52
+    , 0x45
+    , 0x53
+    , 0x53
+    , 0x49
+    , 0x56
+    , 0x45
+    ]
+
+-- | A variable controlling the video mode of the console.
+--
+--     The variable can be set to the following values:
+--
+--     * \"\": Console-native. (default)
+--
+--     * \"NTSC\": 60hz region.
+--
+--     * \"PAL\": 50hz region.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_PS2_GS_MODE@, literal @\"SDL_PS2_GS_MODE\"@, defined at @SDL3\/SDL_hints.h 3413:9@
+sDL_HINT_PS2_GS_MODE :: BG.ByteString
+sDL_HINT_PS2_GS_MODE =
+  BG.pack [0x53, 0x44, 0x4C, 0x5F, 0x50, 0x53, 0x32, 0x5F, 0x47, 0x53, 0x5F, 0x4D, 0x4F, 0x44, 0x45]
+
+-- | A variable controlling which Dispmanx layer to use on a Raspberry PI.
+--
+--     Also known as Z-order. The variable can take a negative or positive value. The default is 10000.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_RPI_VIDEO_LAYER@, literal @\"SDL_RPI_VIDEO_LAYER\"@, defined at @SDL3\/SDL_hints.h 3425:9@
+sDL_HINT_RPI_VIDEO_LAYER :: BG.ByteString
+sDL_HINT_RPI_VIDEO_LAYER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x52
+    , 0x50
+    , 0x49
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x4C
+    , 0x41
+    , 0x59
+    , 0x45
+    , 0x52
+    ]
+
+-- | Specify an \"activity name\" for screensaver inhibition.
+--
+--     Some platforms, notably Linux desktops, list the applications which are inhibiting the screensaver or other power-saving features.
+--
+--     This hint lets you specify the \"activity name\" sent to the OS when SDL_DisableScreenSaver() is used (or the screensaver is automatically disabled). The contents of this hint are used when the screensaver is disabled. You should use a string that describes what your program is doing (and, therefore, why the screensaver is disabled). For example, \"Playing a game\" or \"Watching a video\".
+--
+--     Setting this to \"\" or leaving it unset will have SDL use a reasonable default: \"Playing a game\" or something similar.
+--
+--     This hint should be set before calling SDL_DisableScreenSaver()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME@, literal @\"SDL_SCREENSAVER_INHIBIT_ACTIVITY_NAME\"@, defined at @SDL3\/SDL_hints.h 3447:9@
+sDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME :: BG.ByteString
+sDL_HINT_SCREENSAVER_INHIBIT_ACTIVITY_NAME =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x45
+    , 0x45
+    , 0x4E
+    , 0x53
+    , 0x41
+    , 0x56
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x48
+    , 0x49
+    , 0x42
+    , 0x49
+    , 0x54
+    , 0x5F
+    , 0x41
+    , 0x43
+    , 0x54
+    , 0x49
+    , 0x56
+    , 0x49
+    , 0x54
+    , 0x59
+    , 0x5F
+    , 0x4E
+    , 0x41
+    , 0x4D
+    , 0x45
+    ]
+
+-- | A variable controlling whether SDL calls dbus_shutdown() on quit.
+--
+--     This is useful as a debug tool to validate memory leaks, but shouldn\'t ever be set in production applications, as other libraries used by the application might use dbus under the hood and this can cause crashes if they continue after SDL_Quit().
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": SDL will not call dbus_shutdown() on quit. (default)
+--
+--     * \"1\": SDL will call dbus_shutdown() on quit.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_SHUTDOWN_DBUS_ON_QUIT@, literal @\"SDL_SHUTDOWN_DBUS_ON_QUIT\"@, defined at @SDL3\/SDL_hints.h 3466:9@
+sDL_HINT_SHUTDOWN_DBUS_ON_QUIT :: BG.ByteString
+sDL_HINT_SHUTDOWN_DBUS_ON_QUIT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x53
+    , 0x48
+    , 0x55
+    , 0x54
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x4E
+    , 0x5F
+    , 0x44
+    , 0x42
+    , 0x55
+    , 0x53
+    , 0x5F
+    , 0x4F
+    , 0x4E
+    , 0x5F
+    , 0x51
+    , 0x55
+    , 0x49
+    , 0x54
+    ]
+
+-- | A variable that specifies a backend to use for title storage.
+--
+--     By default, SDL will try all available storage backends in a reasonable order until it finds one that can work, but this hint allows the app or user to force a specific target, such as \"pc\" if, say, you are on Steam but want to avoid SteamRemoteStorage for title data.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_STORAGE_TITLE_DRIVER@, literal @\"SDL_STORAGE_TITLE_DRIVER\"@, defined at @SDL3\/SDL_hints.h 3480:9@
+sDL_HINT_STORAGE_TITLE_DRIVER :: BG.ByteString
+sDL_HINT_STORAGE_TITLE_DRIVER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x53
+    , 0x54
+    , 0x4F
+    , 0x52
+    , 0x41
+    , 0x47
+    , 0x45
+    , 0x5F
+    , 0x54
+    , 0x49
+    , 0x54
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x52
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x52
+    ]
+
+-- | A variable that specifies a backend to use for user storage.
+--
+--     By default, SDL will try all available storage backends in a reasonable order until it finds one that can work, but this hint allows the app or user to force a specific target, such as \"pc\" if, say, you are on Steam but want to avoid SteamRemoteStorage for user data.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_STORAGE_USER_DRIVER@, literal @\"SDL_STORAGE_USER_DRIVER\"@, defined at @SDL3\/SDL_hints.h 3494:9@
+sDL_HINT_STORAGE_USER_DRIVER :: BG.ByteString
+sDL_HINT_STORAGE_USER_DRIVER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x53
+    , 0x54
+    , 0x4F
+    , 0x52
+    , 0x41
+    , 0x47
+    , 0x45
+    , 0x5F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x44
+    , 0x52
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x52
+    ]
+
+-- | Specifies whether SDL_THREAD_PRIORITY_TIME_CRITICAL should be treated as realtime.
+--
+--     On some platforms, like Linux, a realtime priority thread may be subject to restrictions that require special handling by the application. This hint exists to let SDL know that the app is prepared to handle said restrictions.
+--
+--     On Linux, SDL will apply the following configuration to any thread that becomes realtime:
+--
+--     * The SCHED_RESET_ON_FORK bit will be set on the scheduling policy,
+--
+--     * An RLIMIT_RTTIME budget will be configured to the rtkit specified limit.
+--
+--     * Exceeding this limit will result in the kernel sending SIGKILL to the app, refer to the man pages for more information.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": default platform specific behaviour
+--
+--     * \"1\": Force SDL_THREAD_PRIORITY_TIME_CRITICAL to a realtime scheduling policy
+--
+--     This hint should be set before calling SDL_SetCurrentThreadPriority()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL@, literal @\"SDL_THREAD_FORCE_REALTIME_TIME_CRITICAL\"@, defined at @SDL3\/SDL_hints.h 3523:9@
+sDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL :: BG.ByteString
+sDL_HINT_THREAD_FORCE_REALTIME_TIME_CRITICAL =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x54
+    , 0x48
+    , 0x52
+    , 0x45
+    , 0x41
+    , 0x44
+    , 0x5F
+    , 0x46
+    , 0x4F
+    , 0x52
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x41
+    , 0x4C
+    , 0x54
+    , 0x49
+    , 0x4D
+    , 0x45
+    , 0x5F
+    , 0x54
+    , 0x49
+    , 0x4D
+    , 0x45
+    , 0x5F
+    , 0x43
+    , 0x52
+    , 0x49
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x41
+    , 0x4C
+    ]
+
+-- | A string specifying additional information to use with SDL_SetCurrentThreadPriority.
+--
+--     By default SDL_SetCurrentThreadPriority will make appropriate system changes in order to apply a thread priority. For example on systems using pthreads the scheduler policy is changed automatically to a policy that works well with a given priority. Code which has specific requirements can override SDL\'s default behavior with this hint.
+--
+--     pthread hint values are \"current\", \"other\", \"fifo\" and \"rr\". Currently no other platform hint values are defined but may be in the future.
+--
+--     On Linux, the kernel may send SIGKILL to realtime tasks which exceed the distro configured execution budget for rtkit. This budget can be queried through RLIMIT_RTTIME after calling SDL_SetCurrentThreadPriority().
+--
+--     This hint should be set before calling SDL_SetCurrentThreadPriority()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_THREAD_PRIORITY_POLICY@, literal @\"SDL_THREAD_PRIORITY_POLICY\"@, defined at @SDL3\/SDL_hints.h 3546:9@
+sDL_HINT_THREAD_PRIORITY_POLICY :: BG.ByteString
+sDL_HINT_THREAD_PRIORITY_POLICY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x54
+    , 0x48
+    , 0x52
+    , 0x45
+    , 0x41
+    , 0x44
+    , 0x5F
+    , 0x50
+    , 0x52
+    , 0x49
+    , 0x4F
+    , 0x52
+    , 0x49
+    , 0x54
+    , 0x59
+    , 0x5F
+    , 0x50
+    , 0x4F
+    , 0x4C
+    , 0x49
+    , 0x43
+    , 0x59
+    ]
+
+-- | A variable that controls the timer resolution, in milliseconds.
+--
+--     The higher resolution the timer, the more frequently the CPU services timer interrupts, and the more precise delays are, but this takes up power and CPU time. This hint is only used on Windows.
+--
+--     See this blog post for more information: [http:\/\/randomascii.wordpress.com\/2013\/07\/08\/windows-timer-resolution-megawatts-wasted\/](http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/)
+--
+--     The default value is \"1\".
+--
+--     If this variable is set to \"0\", the system timer resolution is not set.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_TIMER_RESOLUTION@, literal @\"SDL_TIMER_RESOLUTION\"@, defined at @SDL3\/SDL_hints.h 3566:9@
+sDL_HINT_TIMER_RESOLUTION :: BG.ByteString
+sDL_HINT_TIMER_RESOLUTION =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x54
+    , 0x49
+    , 0x4D
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x53
+    , 0x4F
+    , 0x4C
+    , 0x55
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | A variable controlling whether touch events should generate synthetic mouse events.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Touch events will not generate mouse events.
+--
+--     * \"1\": Touch events will generate mouse events. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_TOUCH_MOUSE_EVENTS@, literal @\"SDL_TOUCH_MOUSE_EVENTS\"@, defined at @SDL3\/SDL_hints.h 3581:9@
+sDL_HINT_TOUCH_MOUSE_EVENTS :: BG.ByteString
+sDL_HINT_TOUCH_MOUSE_EVENTS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x54
+    , 0x4F
+    , 0x55
+    , 0x43
+    , 0x48
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x45
+    , 0x56
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x53
+    ]
+
+-- | A variable controlling whether trackpads should be treated as touch devices.
+--
+--     On macOS (and possibly other platforms in the future), SDL will report touches on a trackpad as mouse input, which is generally what users expect from this device; however, these are often actually full multitouch-capable touch devices, so it might be preferable to some apps to treat them as such.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Trackpad will send mouse events. (default)
+--
+--     * \"1\": Trackpad will send touch events.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_TRACKPAD_IS_TOUCH_ONLY@, literal @\"SDL_TRACKPAD_IS_TOUCH_ONLY\"@, defined at @SDL3\/SDL_hints.h 3602:9@
+sDL_HINT_TRACKPAD_IS_TOUCH_ONLY :: BG.ByteString
+sDL_HINT_TRACKPAD_IS_TOUCH_ONLY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x54
+    , 0x52
+    , 0x41
+    , 0x43
+    , 0x4B
+    , 0x50
+    , 0x41
+    , 0x44
+    , 0x5F
+    , 0x49
+    , 0x53
+    , 0x5F
+    , 0x54
+    , 0x4F
+    , 0x55
+    , 0x43
+    , 0x48
+    , 0x5F
+    , 0x4F
+    , 0x4E
+    , 0x4C
+    , 0x59
+    ]
+
+-- | A variable controlling whether the Android \/ tvOS remotes should be listed as joystick devices, instead of sending keyboard events.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Remotes send enter\/escape\/arrow key events.
+--
+--     * \"1\": Remotes are available as 2 axis, 2 button joysticks. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_TV_REMOTE_AS_JOYSTICK@, literal @\"SDL_TV_REMOTE_AS_JOYSTICK\"@, defined at @SDL3\/SDL_hints.h 3617:9@
+sDL_HINT_TV_REMOTE_AS_JOYSTICK :: BG.ByteString
+sDL_HINT_TV_REMOTE_AS_JOYSTICK =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x54
+    , 0x56
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x4D
+    , 0x4F
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x41
+    , 0x53
+    , 0x5F
+    , 0x4A
+    , 0x4F
+    , 0x59
+    , 0x53
+    , 0x54
+    , 0x49
+    , 0x43
+    , 0x4B
+    ]
+
+-- | A variable controlling whether the screensaver is enabled.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable screensaver. (default)
+--
+--     * \"1\": Enable screensaver.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_ALLOW_SCREENSAVER@, literal @\"SDL_VIDEO_ALLOW_SCREENSAVER\"@, defined at @SDL3\/SDL_hints.h 3631:9@
+sDL_HINT_VIDEO_ALLOW_SCREENSAVER :: BG.ByteString
+sDL_HINT_VIDEO_ALLOW_SCREENSAVER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x45
+    , 0x45
+    , 0x4E
+    , 0x53
+    , 0x41
+    , 0x56
+    , 0x45
+    , 0x52
+    ]
+
+-- | A comma separated list containing the names of the displays that SDL should sort to the front of the display list.
+--
+--     When this hint is set, displays with matching name strings will be prioritized in the list of displays, as exposed by calling SDL_GetDisplays(), with the first listed becoming the primary display. The naming convention can vary depending on the environment, but it is usually a connector name (e.g. \'DP-1\', \'DP-2\', \'HDMI-A-1\', etc...).
+--
+--     On Wayland desktops, the connector names associated with displays can be found in the @name@ property of the info output from @wayland-info -i wl_output@. On X11 desktops, the @xrandr@ utility can be used to retrieve the connector names associated with displays.
+--
+--     This hint is currently supported on the following drivers:
+--
+--     * KMSDRM (kmsdrm)
+--
+--     * Wayland (wayland)
+--
+--     * X11 (x11)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_DISPLAY_PRIORITY@, literal @\"SDL_VIDEO_DISPLAY_PRIORITY\"@, defined at @SDL3\/SDL_hints.h 3658:9@
+sDL_HINT_VIDEO_DISPLAY_PRIORITY :: BG.ByteString
+sDL_HINT_VIDEO_DISPLAY_PRIORITY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x53
+    , 0x50
+    , 0x4C
+    , 0x41
+    , 0x59
+    , 0x5F
+    , 0x50
+    , 0x52
+    , 0x49
+    , 0x4F
+    , 0x52
+    , 0x49
+    , 0x54
+    , 0x59
+    ]
+
+-- | Tell the video driver that we only want a double buffer.
+--
+--     By default, most lowlevel 2D APIs will use a triple buffer scheme that wastes no CPU time on waiting for vsync after issuing a flip, but introduces a frame of latency. On the other hand, using a double buffer scheme instead is recommended for cases where low latency is an important factor because we save a whole frame of latency.
+--
+--     We do so by waiting for vsync immediately after issuing a flip, usually just after eglSwapBuffers call in the backend\'s *_SwapWindow function.
+--
+--     This hint is currently supported on the following drivers:
+--
+--     * Raspberry Pi (raspberrypi)
+--
+--     * Wayland (wayland)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_DOUBLE_BUFFER@, literal @\"SDL_VIDEO_DOUBLE_BUFFER\"@, defined at @SDL3\/SDL_hints.h 3681:9@
+sDL_HINT_VIDEO_DOUBLE_BUFFER :: BG.ByteString
+sDL_HINT_VIDEO_DOUBLE_BUFFER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x4F
+    , 0x55
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x42
+    , 0x55
+    , 0x46
+    , 0x46
+    , 0x45
+    , 0x52
+    ]
+
+-- | A variable that specifies a video backend to use.
+--
+--     By default, SDL will try all available video backends in a reasonable order until it finds one that can work, but this hint allows the app or user to force a specific target, such as \"x11\" if, say, you are on Wayland but want to try talking to the X server instead.
+--
+--     This hint accepts a comma-separated list of driver names, and each will be tried in the order listed during init, until one succeeds or all of them fail.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_DRIVER@, literal @\"SDL_VIDEO_DRIVER\"@, defined at @SDL3\/SDL_hints.h 3699:9@
+sDL_HINT_VIDEO_DRIVER :: BG.ByteString
+sDL_HINT_VIDEO_DRIVER =
+  BG.pack
+    [0x53, 0x44, 0x4C, 0x5F, 0x56, 0x49, 0x44, 0x45, 0x4F, 0x5F, 0x44, 0x52, 0x49, 0x56, 0x45, 0x52]
+
+-- | A variable controlling whether the dummy video driver saves output frames.
+--
+--     * \"0\": Video frames are not saved to disk. (default)
+--
+--     * \"1\": Video frames are saved to files in the format \"SDL_windowX-Y.bmp\", where X is the window ID, and Y is the frame number.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_DUMMY_SAVE_FRAMES@, literal @\"SDL_VIDEO_DUMMY_SAVE_FRAMES\"@, defined at @SDL3\/SDL_hints.h 3712:9@
+sDL_HINT_VIDEO_DUMMY_SAVE_FRAMES :: BG.ByteString
+sDL_HINT_VIDEO_DUMMY_SAVE_FRAMES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x55
+    , 0x4D
+    , 0x4D
+    , 0x59
+    , 0x5F
+    , 0x53
+    , 0x41
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x46
+    , 0x52
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x53
+    ]
+
+-- | If eglGetPlatformDisplay fails, fall back to calling eglGetDisplay.
+--
+--     The variable can be set to one of the following values:
+--
+--     * \"0\": Do not fall back to eglGetDisplay.
+--
+--     * \"1\": Fall back to eglGetDisplay if eglGetPlatformDisplay fails. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK@, literal @\"SDL_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK\"@, defined at @SDL3\/SDL_hints.h 3726:9@
+sDL_HINT_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK :: BG.ByteString
+sDL_HINT_VIDEO_EGL_ALLOW_GETDISPLAY_FALLBACK =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x45
+    , 0x47
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x47
+    , 0x45
+    , 0x54
+    , 0x44
+    , 0x49
+    , 0x53
+    , 0x50
+    , 0x4C
+    , 0x41
+    , 0x59
+    , 0x5F
+    , 0x46
+    , 0x41
+    , 0x4C
+    , 0x4C
+    , 0x42
+    , 0x41
+    , 0x43
+    , 0x4B
+    ]
+
+-- | A variable controlling whether the OpenGL context should be created with EGL.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Use platform-specific GL context creation API (GLX, WGL, CGL, etc). (default)
+--
+--     * \"1\": Use EGL
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_FORCE_EGL@, literal @\"SDL_VIDEO_FORCE_EGL\"@, defined at @SDL3\/SDL_hints.h 3742:9@
+sDL_HINT_VIDEO_FORCE_EGL :: BG.ByteString
+sDL_HINT_VIDEO_FORCE_EGL =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x46
+    , 0x4F
+    , 0x52
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x45
+    , 0x47
+    , 0x4C
+    ]
+
+-- | A variable that specifies the policy for fullscreen Spaces on macOS.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable Spaces support (FULLSCREEN_DESKTOP won\'t use them and SDL_WINDOW_RESIZABLE windows won\'t offer the \"fullscreen\" button on their titlebars).
+--
+--     * \"1\": Enable Spaces support (FULLSCREEN_DESKTOP will use them and SDL_WINDOW_RESIZABLE windows will offer the \"fullscreen\" button on their titlebars). (default)
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES@, literal @\"SDL_VIDEO_MAC_FULLSCREEN_SPACES\"@, defined at @SDL3\/SDL_hints.h 3760:9@
+sDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES :: BG.ByteString
+sDL_HINT_VIDEO_MAC_FULLSCREEN_SPACES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x43
+    , 0x5F
+    , 0x46
+    , 0x55
+    , 0x4C
+    , 0x4C
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x45
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x53
+    , 0x50
+    , 0x41
+    , 0x43
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable that specifies the menu visibility when a window is fullscreen in Spaces on macOS.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The menu will be hidden when the window is in a fullscreen space, and not accessible by moving the mouse to the top of the screen.
+--
+--     * \"1\": The menu will be accessible when the window is in a fullscreen space.
+--
+--     * \"auto\": The menu will be hidden if fullscreen mode was toggled on programmatically via @SDL_SetWindowFullscreen()@, and accessible if fullscreen was entered via the \"fullscreen\" button on the window title bar. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY@, literal @\"SDL_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY\"@, defined at @SDL3\/SDL_hints.h 3781:9@
+sDL_HINT_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY :: BG.ByteString
+sDL_HINT_VIDEO_MAC_FULLSCREEN_MENU_VISIBILITY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x43
+    , 0x5F
+    , 0x46
+    , 0x55
+    , 0x4C
+    , 0x4C
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x45
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x4D
+    , 0x45
+    , 0x4E
+    , 0x55
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x53
+    , 0x49
+    , 0x42
+    , 0x49
+    , 0x4C
+    , 0x49
+    , 0x54
+    , 0x59
+    ]
+
+-- | A variable indicating whether the metal layer drawable size should be updated for the SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event on macOS.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": the metal layer drawable size will not be updated on the SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event.
+--
+--     * \"1\": the metal layer drawable size will be updated on the SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event. (default)
+--
+--     This hint should be set before SDL_Metal_CreateView called.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_METAL_AUTO_RESIZE_DRAWABLE@, literal @\"SDL_VIDEO_METAL_AUTO_RESIZE_DRAWABLE\"@, defined at @SDL3\/SDL_hints.h 3798:9@
+sDL_HINT_VIDEO_METAL_AUTO_RESIZE_DRAWABLE :: BG.ByteString
+sDL_HINT_VIDEO_METAL_AUTO_RESIZE_DRAWABLE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x4D
+    , 0x45
+    , 0x54
+    , 0x41
+    , 0x4C
+    , 0x5F
+    , 0x41
+    , 0x55
+    , 0x54
+    , 0x4F
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x53
+    , 0x49
+    , 0x5A
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x52
+    , 0x41
+    , 0x57
+    , 0x41
+    , 0x42
+    , 0x4C
+    , 0x45
+    ]
+
+-- | A variable controlling whether SDL will attempt to automatically set the destination display to a mode most closely matching that of the previous display if an exclusive fullscreen window is moved onto it.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": SDL will not attempt to automatically set a matching mode on the destination display. If an exclusive fullscreen window is moved to a new display, the window will become fullscreen desktop.
+--
+--     * \"1\": SDL will attempt to automatically set a mode on the destination display that most closely matches the mode of the display that the exclusive fullscreen window was previously on. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_MATCH_EXCLUSIVE_MODE_ON_MOVE@, literal @\"SDL_VIDEO_MATCH_EXCLUSIVE_MODE_ON_MOVE\"@, defined at @SDL3\/SDL_hints.h 3818:9@
+sDL_HINT_VIDEO_MATCH_EXCLUSIVE_MODE_ON_MOVE :: BG.ByteString
+sDL_HINT_VIDEO_MATCH_EXCLUSIVE_MODE_ON_MOVE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x4D
+    , 0x41
+    , 0x54
+    , 0x43
+    , 0x48
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x43
+    , 0x4C
+    , 0x55
+    , 0x53
+    , 0x49
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x44
+    , 0x45
+    , 0x5F
+    , 0x4F
+    , 0x4E
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x56
+    , 0x45
+    ]
+
+-- | A variable controlling whether fullscreen windows are minimized when they lose focus.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Fullscreen windows will not be minimized when they lose focus.
+--
+--     * \"1\": Fullscreen windows are minimized when they lose focus.
+--
+--     * \"auto\": Fullscreen windows are minimized when they lose focus if they use exclusive fullscreen modes, so the desktop video mode is restored. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS@, literal @\"SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS\"@, defined at @SDL3\/SDL_hints.h 3836:9@
+sDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS :: BG.ByteString
+sDL_HINT_VIDEO_MINIMIZE_ON_FOCUS_LOSS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x4D
+    , 0x49
+    , 0x4E
+    , 0x49
+    , 0x4D
+    , 0x49
+    , 0x5A
+    , 0x45
+    , 0x5F
+    , 0x4F
+    , 0x4E
+    , 0x5F
+    , 0x46
+    , 0x4F
+    , 0x43
+    , 0x55
+    , 0x53
+    , 0x5F
+    , 0x4C
+    , 0x4F
+    , 0x53
+    , 0x53
+    ]
+
+-- | A variable controlling whether the offscreen video driver saves output frames.
+--
+--     This only saves frames that are generated using software rendering, not accelerated OpenGL rendering.
+--
+--     * \"0\": Video frames are not saved to disk. (default)
+--
+--     * \"1\": Video frames are saved to files in the format \"SDL_windowX-Y.bmp\", where X is the window ID, and Y is the frame number.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_OFFSCREEN_SAVE_FRAMES@, literal @\"SDL_VIDEO_OFFSCREEN_SAVE_FRAMES\"@, defined at @SDL3\/SDL_hints.h 3853:9@
+sDL_HINT_VIDEO_OFFSCREEN_SAVE_FRAMES :: BG.ByteString
+sDL_HINT_VIDEO_OFFSCREEN_SAVE_FRAMES =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x4F
+    , 0x46
+    , 0x46
+    , 0x53
+    , 0x43
+    , 0x52
+    , 0x45
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x53
+    , 0x41
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x46
+    , 0x52
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x53
+    ]
+
+-- | A variable controlling whether all window operations will block until complete.
+--
+--     Window systems that run asynchronously may not have the results of window operations that resize or move the window applied immediately upon the return of the requesting function. Setting this hint will cause such operations to block after every call until the pending operation has completed. Setting this to \'1\' is the equivalent of calling SDL_SyncWindow() after every function call.
+--
+--     Be aware that amount of time spent blocking while waiting for window operations to complete can be quite lengthy, as animations may have to complete, which can take upwards of multiple seconds in some cases.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Window operations are non-blocking. (default)
+--
+--     * \"1\": Window operations will block until completed.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS@, literal @\"SDL_VIDEO_SYNC_WINDOW_OPERATIONS\"@, defined at @SDL3\/SDL_hints.h 3879:9@
+sDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS :: BG.ByteString
+sDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x53
+    , 0x59
+    , 0x4E
+    , 0x43
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x4F
+    , 0x50
+    , 0x45
+    , 0x52
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    , 0x53
+    ]
+
+-- | A variable controlling whether the libdecor Wayland backend is allowed to be used.
+--
+--     libdecor is used over xdg-shell when xdg-decoration protocol is unavailable.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": libdecor use is disabled.
+--
+--     * \"1\": libdecor use is enabled. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR@, literal @\"SDL_VIDEO_WAYLAND_ALLOW_LIBDECOR\"@, defined at @SDL3\/SDL_hints.h 3897:9@
+sDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR :: BG.ByteString
+sDL_HINT_VIDEO_WAYLAND_ALLOW_LIBDECOR =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x59
+    , 0x4C
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x42
+    , 0x44
+    , 0x45
+    , 0x43
+    , 0x4F
+    , 0x52
+    ]
+
+-- | A variable controlling whether video mode emulation is enabled under Wayland.
+--
+--     When this hint is set, a standard set of emulated CVT video modes will be exposed for use by the application. If it is disabled, the only modes exposed will be the logical desktop size and, in the case of a scaled desktop, the native display resolution.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Video mode emulation is disabled.
+--
+--     * \"1\": Video mode emulation is enabled. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_WAYLAND_MODE_EMULATION@, literal @\"SDL_VIDEO_WAYLAND_MODE_EMULATION\"@, defined at @SDL3\/SDL_hints.h 3917:9@
+sDL_HINT_VIDEO_WAYLAND_MODE_EMULATION :: BG.ByteString
+sDL_HINT_VIDEO_WAYLAND_MODE_EMULATION =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x59
+    , 0x4C
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x44
+    , 0x45
+    , 0x5F
+    , 0x45
+    , 0x4D
+    , 0x55
+    , 0x4C
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | A variable controlling how modes with a non-native aspect ratio are displayed under Wayland.
+--
+--     When this hint is set, the requested scaling will be used when displaying fullscreen video modes that don\'t match the display\'s native aspect ratio. This is contingent on compositor viewport support.
+--
+--     The variable can be set to the following values:
+--
+--     * \"aspect\" - Video modes will be displayed scaled, in their proper aspect ratio, with black bars.
+--
+--     * \"stretch\" - Video modes will be scaled to fill the entire display. (default)
+--
+--     * \"none\" - Video modes will be displayed as 1:1 with no scaling.
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_WAYLAND_MODE_SCALING@, literal @\"SDL_VIDEO_WAYLAND_MODE_SCALING\"@, defined at @SDL3\/SDL_hints.h 3939:9@
+sDL_HINT_VIDEO_WAYLAND_MODE_SCALING :: BG.ByteString
+sDL_HINT_VIDEO_WAYLAND_MODE_SCALING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x59
+    , 0x4C
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x44
+    , 0x45
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x49
+    , 0x4E
+    , 0x47
+    ]
+
+-- | A variable controlling whether the libdecor Wayland backend is preferred over native decorations.
+--
+--     When this hint is set, libdecor will be used to provide window decorations, even if xdg-decoration is available. (Note that, by default, libdecor will use xdg-decoration itself if available).
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": libdecor is enabled only if server-side decorations are unavailable. (default)
+--
+--     * \"1\": libdecor is always enabled if available.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR@, literal @\"SDL_VIDEO_WAYLAND_PREFER_LIBDECOR\"@, defined at @SDL3\/SDL_hints.h 3959:9@
+sDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR :: BG.ByteString
+sDL_HINT_VIDEO_WAYLAND_PREFER_LIBDECOR =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x59
+    , 0x4C
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x5F
+    , 0x50
+    , 0x52
+    , 0x45
+    , 0x46
+    , 0x45
+    , 0x52
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x42
+    , 0x44
+    , 0x45
+    , 0x43
+    , 0x4F
+    , 0x52
+    ]
+
+-- | A variable forcing non-DPI-aware Wayland windows to output at 1:1 scaling.
+--
+--     This must be set before initializing the video subsystem.
+--
+--     When this hint is set, Wayland windows that are not flagged as being DPI-aware will be output with scaling designed to force 1:1 pixel mapping.
+--
+--     This is intended to allow legacy applications to be displayed without desktop scaling being applied, and has issues with certain display configurations, as this forces the window to behave in a way that Wayland desktops were not designed to accommodate:
+--
+--     * Rounding errors can result with odd window sizes and\/or desktop scales, which can cause the window contents to appear slightly blurry.
+--
+--     * Positioning the window may be imprecise due to unit conversions and rounding.
+--
+--     * The window may be unusably small on scaled desktops.
+--
+--     * The window may jump in size when moving between displays of different scale factors.
+--
+--     * Displays may appear to overlap when using a multi-monitor setup with scaling enabled.
+--
+--     * Possible loss of cursor precision due to the logical size of the window being reduced.
+--
+--     New applications should be designed with proper DPI awareness handling instead of enabling this.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Windows will be scaled normally.
+--
+--     * \"1\": Windows will be forced to scale to achieve 1:1 output.
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_WAYLAND_SCALE_TO_DISPLAY@, literal @\"SDL_VIDEO_WAYLAND_SCALE_TO_DISPLAY\"@, defined at @SDL3\/SDL_hints.h 3998:9@
+sDL_HINT_VIDEO_WAYLAND_SCALE_TO_DISPLAY :: BG.ByteString
+sDL_HINT_VIDEO_WAYLAND_SCALE_TO_DISPLAY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x59
+    , 0x4C
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x54
+    , 0x4F
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x53
+    , 0x50
+    , 0x4C
+    , 0x41
+    , 0x59
+    ]
+
+-- | A variable specifying which shader compiler to preload when using the Chrome ANGLE binaries.
+--
+--     SDL has EGL and OpenGL ES2 support on Windows via the ANGLE project. It can use two different sets of binaries, those compiled by the user from source or those provided by the Chrome browser. In the later case, these binaries require that SDL loads a DLL providing the shader compiler.
+--
+--     The variable can be set to the following values:
+--
+--     * \"d3dcompiler_46.dll\" - best for Vista or later. (default)
+--
+--     * \"d3dcompiler_43.dll\" - for XP support.
+--
+--     * \"none\" - do not load any library, useful if you compiled ANGLE from source and included the compiler in your binaries.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_WIN_D3DCOMPILER@, literal @\"SDL_VIDEO_WIN_D3DCOMPILER\"@, defined at @SDL3\/SDL_hints.h 4020:9@
+sDL_HINT_VIDEO_WIN_D3DCOMPILER :: BG.ByteString
+sDL_HINT_VIDEO_WIN_D3DCOMPILER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x5F
+    , 0x44
+    , 0x33
+    , 0x44
+    , 0x43
+    , 0x4F
+    , 0x4D
+    , 0x50
+    , 0x49
+    , 0x4C
+    , 0x45
+    , 0x52
+    ]
+
+-- | A variable controlling whether SDL should call XSelectInput() to enable input events on X11 windows wrapped by SDL windows.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Don\'t call XSelectInput(), assuming the native window code has done it already.
+--
+--     * \"1\": Call XSelectInput() to enable input events. (default)
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.10
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_X11_EXTERNAL_WINDOW_INPUT@, literal @\"SDL_VIDEO_X11_EXTERNAL_WINDOW_INPUT\"@, defined at @SDL3\/SDL_hints.h 4036:9@
+sDL_HINT_VIDEO_X11_EXTERNAL_WINDOW_INPUT :: BG.ByteString
+sDL_HINT_VIDEO_X11_EXTERNAL_WINDOW_INPUT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x54
+    , 0x45
+    , 0x52
+    , 0x4E
+    , 0x41
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    ]
+
+-- | A variable controlling whether the X11 _NET_WM_BYPASS_COMPOSITOR hint should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable _NET_WM_BYPASS_COMPOSITOR.
+--
+--     * \"1\": Enable _NET_WM_BYPASS_COMPOSITOR. (default)
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR@, literal @\"SDL_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR\"@, defined at @SDL3\/SDL_hints.h 4051:9@
+sDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR :: BG.ByteString
+sDL_HINT_VIDEO_X11_NET_WM_BYPASS_COMPOSITOR =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x4E
+    , 0x45
+    , 0x54
+    , 0x5F
+    , 0x57
+    , 0x4D
+    , 0x5F
+    , 0x42
+    , 0x59
+    , 0x50
+    , 0x41
+    , 0x53
+    , 0x53
+    , 0x5F
+    , 0x43
+    , 0x4F
+    , 0x4D
+    , 0x50
+    , 0x4F
+    , 0x53
+    , 0x49
+    , 0x54
+    , 0x4F
+    , 0x52
+    ]
+
+-- | A variable controlling whether the X11 _NET_WM_PING protocol should be supported.
+--
+--     By default SDL will use _NET_WM_PING, but for applications that know they will not always be able to respond to ping requests in a timely manner they can turn it off to avoid the window manager thinking the app is hung.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable _NET_WM_PING.
+--
+--     * \"1\": Enable _NET_WM_PING. (default)
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_X11_NET_WM_PING@, literal @\"SDL_VIDEO_X11_NET_WM_PING\"@, defined at @SDL3\/SDL_hints.h 4070:9@
+sDL_HINT_VIDEO_X11_NET_WM_PING :: BG.ByteString
+sDL_HINT_VIDEO_X11_NET_WM_PING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x4E
+    , 0x45
+    , 0x54
+    , 0x5F
+    , 0x57
+    , 0x4D
+    , 0x5F
+    , 0x50
+    , 0x49
+    , 0x4E
+    , 0x47
+    ]
+
+-- | A variable controlling whether SDL uses DirectColor visuals.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable DirectColor visuals.
+--
+--     * \"1\": Enable DirectColor visuals. (default)
+--
+--     This hint should be set before initializing the video subsystem.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_X11_NODIRECTCOLOR@, literal @\"SDL_VIDEO_X11_NODIRECTCOLOR\"@, defined at @SDL3\/SDL_hints.h 4084:9@
+sDL_HINT_VIDEO_X11_NODIRECTCOLOR :: BG.ByteString
+sDL_HINT_VIDEO_X11_NODIRECTCOLOR =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x4E
+    , 0x4F
+    , 0x44
+    , 0x49
+    , 0x52
+    , 0x45
+    , 0x43
+    , 0x54
+    , 0x43
+    , 0x4F
+    , 0x4C
+    , 0x4F
+    , 0x52
+    ]
+
+-- | A variable forcing the content scaling factor for X11 displays.
+--
+--     The variable can be set to a floating point value in the range 1.0-10.0f
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_X11_SCALING_FACTOR@, literal @\"SDL_VIDEO_X11_SCALING_FACTOR\"@, defined at @SDL3\/SDL_hints.h 4095:9@
+sDL_HINT_VIDEO_X11_SCALING_FACTOR :: BG.ByteString
+sDL_HINT_VIDEO_X11_SCALING_FACTOR =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x53
+    , 0x43
+    , 0x41
+    , 0x4C
+    , 0x49
+    , 0x4E
+    , 0x47
+    , 0x5F
+    , 0x46
+    , 0x41
+    , 0x43
+    , 0x54
+    , 0x4F
+    , 0x52
+    ]
+
+-- | A variable forcing the visual ID used for X11 display modes.
+--
+--     This hint should be set before initializing the video subsystem.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_X11_VISUALID@, literal @\"SDL_VIDEO_X11_VISUALID\"@, defined at @SDL3\/SDL_hints.h 4104:9@
+sDL_HINT_VIDEO_X11_VISUALID :: BG.ByteString
+sDL_HINT_VIDEO_X11_VISUALID =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x53
+    , 0x55
+    , 0x41
+    , 0x4C
+    , 0x49
+    , 0x44
+    ]
+
+-- | A variable forcing the visual ID chosen for new X11 windows.
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_X11_WINDOW_VISUALID@, literal @\"SDL_VIDEO_X11_WINDOW_VISUALID\"@, defined at @SDL3\/SDL_hints.h 4113:9@
+sDL_HINT_VIDEO_X11_WINDOW_VISUALID :: BG.ByteString
+sDL_HINT_VIDEO_X11_WINDOW_VISUALID =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x53
+    , 0x55
+    , 0x41
+    , 0x4C
+    , 0x49
+    , 0x44
+    ]
+
+-- | A variable controlling whether the X11 XRandR extension should be used.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable XRandR.
+--
+--     * \"1\": Enable XRandR. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VIDEO_X11_XRANDR@, literal @\"SDL_VIDEO_X11_XRANDR\"@, defined at @SDL3\/SDL_hints.h 4127:9@
+sDL_HINT_VIDEO_X11_XRANDR :: BG.ByteString
+sDL_HINT_VIDEO_X11_XRANDR =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x4F
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x58
+    , 0x52
+    , 0x41
+    , 0x4E
+    , 0x44
+    , 0x52
+    ]
+
+-- | A variable controlling whether touch should be enabled on the back panel of the PlayStation Vita.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable touch on the back panel.
+--
+--     * \"1\": Enable touch on the back panel. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VITA_ENABLE_BACK_TOUCH@, literal @\"SDL_VITA_ENABLE_BACK_TOUCH\"@, defined at @SDL3\/SDL_hints.h 4142:9@
+sDL_HINT_VITA_ENABLE_BACK_TOUCH :: BG.ByteString
+sDL_HINT_VITA_ENABLE_BACK_TOUCH =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x54
+    , 0x41
+    , 0x5F
+    , 0x45
+    , 0x4E
+    , 0x41
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x42
+    , 0x41
+    , 0x43
+    , 0x4B
+    , 0x5F
+    , 0x54
+    , 0x4F
+    , 0x55
+    , 0x43
+    , 0x48
+    ]
+
+-- | A variable controlling whether touch should be enabled on the front panel of the PlayStation Vita.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Disable touch on the front panel.
+--
+--     * \"1\": Enable touch on the front panel. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VITA_ENABLE_FRONT_TOUCH@, literal @\"SDL_VITA_ENABLE_FRONT_TOUCH\"@, defined at @SDL3\/SDL_hints.h 4157:9@
+sDL_HINT_VITA_ENABLE_FRONT_TOUCH :: BG.ByteString
+sDL_HINT_VITA_ENABLE_FRONT_TOUCH =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x54
+    , 0x41
+    , 0x5F
+    , 0x45
+    , 0x4E
+    , 0x41
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x46
+    , 0x52
+    , 0x4F
+    , 0x4E
+    , 0x54
+    , 0x5F
+    , 0x54
+    , 0x4F
+    , 0x55
+    , 0x43
+    , 0x48
+    ]
+
+-- | A variable controlling the module path on the PlayStation Vita.
+--
+--     This hint defaults to \"app0:module\"
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VITA_MODULE_PATH@, literal @\"SDL_VITA_MODULE_PATH\"@, defined at @SDL3\/SDL_hints.h 4168:9@
+sDL_HINT_VITA_MODULE_PATH :: BG.ByteString
+sDL_HINT_VITA_MODULE_PATH =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x54
+    , 0x41
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x44
+    , 0x55
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x50
+    , 0x41
+    , 0x54
+    , 0x48
+    ]
+
+-- | A variable controlling whether to perform PVR initialization on the PlayStation Vita.
+--
+--     * \"0\": Skip PVR initialization.
+--
+--     * \"1\": Perform the normal PVR initialization. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VITA_PVR_INIT@, literal @\"SDL_VITA_PVR_INIT\"@, defined at @SDL3\/SDL_hints.h 4181:9@
+sDL_HINT_VITA_PVR_INIT :: BG.ByteString
+sDL_HINT_VITA_PVR_INIT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x54
+    , 0x41
+    , 0x5F
+    , 0x50
+    , 0x56
+    , 0x52
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x49
+    , 0x54
+    ]
+
+-- | A variable overriding the resolution reported on the PlayStation Vita.
+--
+--     The variable can be set to the following values:
+--
+--     * \"544\": 544p (default)
+--
+--     * \"720\": 725p for PSTV
+--
+--     * \"1080\": 1088i for PSTV
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VITA_RESOLUTION@, literal @\"SDL_VITA_RESOLUTION\"@, defined at @SDL3\/SDL_hints.h 4196:9@
+sDL_HINT_VITA_RESOLUTION :: BG.ByteString
+sDL_HINT_VITA_RESOLUTION =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x54
+    , 0x41
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x53
+    , 0x4F
+    , 0x4C
+    , 0x55
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | A variable controlling whether OpenGL should be used instead of OpenGL ES on the PlayStation Vita.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Use OpenGL ES. (default)
+--
+--     * \"1\": Use OpenGL.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VITA_PVR_OPENGL@, literal @\"SDL_VITA_PVR_OPENGL\"@, defined at @SDL3\/SDL_hints.h 4211:9@
+sDL_HINT_VITA_PVR_OPENGL :: BG.ByteString
+sDL_HINT_VITA_PVR_OPENGL =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x54
+    , 0x41
+    , 0x5F
+    , 0x50
+    , 0x56
+    , 0x52
+    , 0x5F
+    , 0x4F
+    , 0x50
+    , 0x45
+    , 0x4E
+    , 0x47
+    , 0x4C
+    ]
+
+-- | A variable controlling which touchpad should generate synthetic mouse events.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Only front touchpad should generate mouse events. (default)
+--
+--     * \"1\": Only back touchpad should generate mouse events.
+--
+--     * \"2\": Both touchpads should generate mouse events.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VITA_TOUCH_MOUSE_DEVICE@, literal @\"SDL_VITA_TOUCH_MOUSE_DEVICE\"@, defined at @SDL3\/SDL_hints.h 4227:9@
+sDL_HINT_VITA_TOUCH_MOUSE_DEVICE :: BG.ByteString
+sDL_HINT_VITA_TOUCH_MOUSE_DEVICE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x49
+    , 0x54
+    , 0x41
+    , 0x5F
+    , 0x54
+    , 0x4F
+    , 0x55
+    , 0x43
+    , 0x48
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x45
+    , 0x56
+    , 0x49
+    , 0x43
+    , 0x45
+    ]
+
+-- | A variable overriding the display index used in SDL_Vulkan_CreateSurface()
+--
+--     The display index starts at 0, which is the default.
+--
+--     This hint should be set before calling SDL_Vulkan_CreateSurface()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VULKAN_DISPLAY@, literal @\"SDL_VULKAN_DISPLAY\"@, defined at @SDL3\/SDL_hints.h 4238:9@
+sDL_HINT_VULKAN_DISPLAY :: BG.ByteString
+sDL_HINT_VULKAN_DISPLAY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x55
+    , 0x4C
+    , 0x4B
+    , 0x41
+    , 0x4E
+    , 0x5F
+    , 0x44
+    , 0x49
+    , 0x53
+    , 0x50
+    , 0x4C
+    , 0x41
+    , 0x59
+    ]
+
+-- | Specify the Vulkan library to load.
+--
+--     This hint should be set before creating a Vulkan window or calling SDL_Vulkan_LoadLibrary().
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_VULKAN_LIBRARY@, literal @\"SDL_VULKAN_LIBRARY\"@, defined at @SDL3\/SDL_hints.h 4248:9@
+sDL_HINT_VULKAN_LIBRARY :: BG.ByteString
+sDL_HINT_VULKAN_LIBRARY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x56
+    , 0x55
+    , 0x4C
+    , 0x4B
+    , 0x41
+    , 0x4E
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x42
+    , 0x52
+    , 0x41
+    , 0x52
+    , 0x59
+    ]
+
+-- | A variable controlling how the fact chunk affects the loading of a WAVE file.
+--
+--     The fact chunk stores information about the number of samples of a WAVE file. The Standards Update from Microsoft notes that this value can be used to \'determine the length of the data in seconds\'. This is especially useful for compressed formats (for which this is a mandatory chunk) if they produce multiple sample frames per block and truncating the block is not allowed. The fact chunk can exactly specify how many sample frames there should be in this case.
+--
+--     Unfortunately, most application seem to ignore the fact chunk and so SDL ignores it by default as well.
+--
+--     The variable can be set to the following values:
+--
+--     * \"truncate\" - Use the number of samples to truncate the wave data if the fact chunk is present and valid.
+--
+--     * \"strict\" - Like \"truncate\", but raise an error if the fact chunk is invalid, not present for non-PCM formats, or if the data chunk doesn\'t have that many samples.
+--
+--     * \"ignorezero\" - Like \"truncate\", but ignore fact chunk if the number of samples is zero.
+--
+--     * \"ignore\" - Ignore fact chunk entirely. (default)
+--
+--     This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WAVE_FACT_CHUNK@, literal @\"SDL_WAVE_FACT_CHUNK\"@, defined at @SDL3\/SDL_hints.h 4280:9@
+sDL_HINT_WAVE_FACT_CHUNK :: BG.ByteString
+sDL_HINT_WAVE_FACT_CHUNK =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x46
+    , 0x41
+    , 0x43
+    , 0x54
+    , 0x5F
+    , 0x43
+    , 0x48
+    , 0x55
+    , 0x4E
+    , 0x4B
+    ]
+
+-- | A variable controlling the maximum number of chunks in a WAVE file.
+--
+--     This sets an upper bound on the number of chunks in a WAVE file to avoid wasting time on malformed or corrupt WAVE files. This defaults to \"10000\".
+--
+--     This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WAVE_CHUNK_LIMIT@, literal @\"SDL_WAVE_CHUNK_LIMIT\"@, defined at @SDL3\/SDL_hints.h 4292:9@
+sDL_HINT_WAVE_CHUNK_LIMIT :: BG.ByteString
+sDL_HINT_WAVE_CHUNK_LIMIT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x43
+    , 0x48
+    , 0x55
+    , 0x4E
+    , 0x4B
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x4D
+    , 0x49
+    , 0x54
+    ]
+
+-- | A variable controlling how the size of the RIFF chunk affects the loading of a WAVE file.
+--
+--     The size of the RIFF chunk (which includes all the sub-chunks of the WAVE file) is not always reliable. In case the size is wrong, it\'s possible to just ignore it and step through the chunks until a fixed limit is reached.
+--
+--     Note that files that have trailing data unrelated to the WAVE file or corrupt files may slow down the loading process without a reliable boundary. By default, SDL stops after 10000 chunks to prevent wasting time. Use SDL_HINT_WAVE_CHUNK_LIMIT to adjust this value.
+--
+--     The variable can be set to the following values:
+--
+--     * \"force\" - Always use the RIFF chunk size as a boundary for the chunk search.
+--
+--     * \"ignorezero\" - Like \"force\", but a zero size searches up to 4 GiB. (default)
+--
+--     * \"ignore\" - Ignore the RIFF chunk size and always search up to 4 GiB.
+--
+--     * \"maximum\" - Search for chunks until the end of file. (not recommended)
+--
+--     This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WAVE_RIFF_CHUNK_SIZE@, literal @\"SDL_WAVE_RIFF_CHUNK_SIZE\"@, defined at @SDL3\/SDL_hints.h 4320:9@
+sDL_HINT_WAVE_RIFF_CHUNK_SIZE :: BG.ByteString
+sDL_HINT_WAVE_RIFF_CHUNK_SIZE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x49
+    , 0x46
+    , 0x46
+    , 0x5F
+    , 0x43
+    , 0x48
+    , 0x55
+    , 0x4E
+    , 0x4B
+    , 0x5F
+    , 0x53
+    , 0x49
+    , 0x5A
+    , 0x45
+    ]
+
+-- | A variable controlling how a truncated WAVE file is handled.
+--
+--     A WAVE file is considered truncated if any of the chunks are incomplete or the data chunk size is not a multiple of the block size. By default, SDL decodes until the first incomplete block, as most applications seem to do.
+--
+--     The variable can be set to the following values:
+--
+--     * \"verystrict\" - Raise an error if the file is truncated.
+--
+--     * \"strict\" - Like \"verystrict\", but the size of the RIFF chunk is ignored.
+--
+--     * \"dropframe\" - Decode until the first incomplete sample frame.
+--
+--     * \"dropblock\" - Decode until the first incomplete block. (default)
+--
+--     This hint should be set before calling SDL_LoadWAV() or SDL_LoadWAV_IO()
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WAVE_TRUNCATION@, literal @\"SDL_WAVE_TRUNCATION\"@, defined at @SDL3\/SDL_hints.h 4340:9@
+sDL_HINT_WAVE_TRUNCATION :: BG.ByteString
+sDL_HINT_WAVE_TRUNCATION =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x41
+    , 0x56
+    , 0x45
+    , 0x5F
+    , 0x54
+    , 0x52
+    , 0x55
+    , 0x4E
+    , 0x43
+    , 0x41
+    , 0x54
+    , 0x49
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | A variable controlling whether the window is activated when the SDL_RaiseWindow function is called.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The window is not activated when the SDL_RaiseWindow function is called.
+--
+--     * \"1\": The window is activated when the SDL_RaiseWindow function is called. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED@, literal @\"SDL_WINDOW_ACTIVATE_WHEN_RAISED\"@, defined at @SDL3\/SDL_hints.h 4357:9@
+sDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED :: BG.ByteString
+sDL_HINT_WINDOW_ACTIVATE_WHEN_RAISED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x41
+    , 0x43
+    , 0x54
+    , 0x49
+    , 0x56
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x57
+    , 0x48
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x52
+    , 0x41
+    , 0x49
+    , 0x53
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling whether the window is activated when the SDL_ShowWindow function is called.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The window is not activated when the SDL_ShowWindow function is called.
+--
+--     * \"1\": The window is activated when the SDL_ShowWindow function is called. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN@, literal @\"SDL_WINDOW_ACTIVATE_WHEN_SHOWN\"@, defined at @SDL3\/SDL_hints.h 4374:9@
+sDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN :: BG.ByteString
+sDL_HINT_WINDOW_ACTIVATE_WHEN_SHOWN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x41
+    , 0x43
+    , 0x54
+    , 0x49
+    , 0x56
+    , 0x41
+    , 0x54
+    , 0x45
+    , 0x5F
+    , 0x57
+    , 0x48
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x53
+    , 0x48
+    , 0x4F
+    , 0x57
+    , 0x4E
+    ]
+
+-- | If set to \"0\" then never set the top-most flag on an SDL Window even if the application requests it.
+--
+--     This is a debugging aid for developers and not expected to be used by end users.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": don\'t allow topmost
+--
+--     * \"1\": allow topmost (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOW_ALLOW_TOPMOST@, literal @\"SDL_WINDOW_ALLOW_TOPMOST\"@, defined at @SDL3\/SDL_hints.h 4392:9@
+sDL_HINT_WINDOW_ALLOW_TOPMOST :: BG.ByteString
+sDL_HINT_WINDOW_ALLOW_TOPMOST =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x4C
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x54
+    , 0x4F
+    , 0x50
+    , 0x4D
+    , 0x4F
+    , 0x53
+    , 0x54
+    ]
+
+-- | A variable controlling whether the window frame and title bar are interactive when the cursor is hidden.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The window frame is not interactive when the cursor is hidden (no move, resize, etc).
+--
+--     * \"1\": The window frame is interactive when the cursor is hidden. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN@, literal @\"SDL_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN\"@, defined at @SDL3\/SDL_hints.h 4408:9@
+sDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN :: BG.ByteString
+sDL_HINT_WINDOW_FRAME_USABLE_WHILE_CURSOR_HIDDEN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x46
+    , 0x52
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x5F
+    , 0x55
+    , 0x53
+    , 0x41
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x57
+    , 0x48
+    , 0x49
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x43
+    , 0x55
+    , 0x52
+    , 0x53
+    , 0x4F
+    , 0x52
+    , 0x5F
+    , 0x48
+    , 0x49
+    , 0x44
+    , 0x44
+    , 0x45
+    , 0x4E
+    ]
+
+-- | A variable controlling whether SDL generates window-close events for Alt+F4 on Windows.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": SDL will only do normal key handling for Alt+F4.
+--
+--     * \"1\": SDL will generate a window-close event when it sees Alt+F4. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_CLOSE_ON_ALT_F4@, literal @\"SDL_WINDOWS_CLOSE_ON_ALT_F4\"@, defined at @SDL3\/SDL_hints.h 4424:9@
+sDL_HINT_WINDOWS_CLOSE_ON_ALT_F4 :: BG.ByteString
+sDL_HINT_WINDOWS_CLOSE_ON_ALT_F4 =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x43
+    , 0x4C
+    , 0x4F
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x4F
+    , 0x4E
+    , 0x5F
+    , 0x41
+    , 0x4C
+    , 0x54
+    , 0x5F
+    , 0x46
+    , 0x34
+    ]
+
+-- | A variable controlling whether menus can be opened with their keyboard shortcut (Alt+mnemonic).
+--
+--     If the mnemonics are enabled, then menus can be opened by pressing the Alt key and the corresponding mnemonic (for example, Alt+F opens the File menu). However, in case an invalid mnemonic is pressed, Windows makes an audible beep to convey that nothing happened. This is true even if the window has no menu at all!
+--
+--     Because most SDL applications don\'t have menus, and some want to use the Alt key for other purposes, SDL disables mnemonics (and the beeping) by default.
+--
+--     Note: This also affects keyboard events: with mnemonics enabled, when a menu is opened from the keyboard, you will not receive a KEYUP event for the mnemonic key, and /might/ not receive one for Alt.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Alt+mnemonic does nothing, no beeping. (default)
+--
+--     * \"1\": Alt+mnemonic opens menus, invalid mnemonics produce a beep.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS@, literal @\"SDL_WINDOWS_ENABLE_MENU_MNEMONICS\"@, defined at @SDL3\/SDL_hints.h 4453:9@
+sDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS :: BG.ByteString
+sDL_HINT_WINDOWS_ENABLE_MENU_MNEMONICS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x45
+    , 0x4E
+    , 0x41
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x4D
+    , 0x45
+    , 0x4E
+    , 0x55
+    , 0x5F
+    , 0x4D
+    , 0x4E
+    , 0x45
+    , 0x4D
+    , 0x4F
+    , 0x4E
+    , 0x49
+    , 0x43
+    , 0x53
+    ]
+
+-- | A variable controlling whether the windows message loop is processed by SDL.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The window message loop is not run.
+--
+--     * \"1\": The window message loop is processed in SDL_PumpEvents(). (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_ENABLE_MESSAGELOOP@, literal @\"SDL_WINDOWS_ENABLE_MESSAGELOOP\"@, defined at @SDL3\/SDL_hints.h 4468:9@
+sDL_HINT_WINDOWS_ENABLE_MESSAGELOOP :: BG.ByteString
+sDL_HINT_WINDOWS_ENABLE_MESSAGELOOP =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x45
+    , 0x4E
+    , 0x41
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x5F
+    , 0x4D
+    , 0x45
+    , 0x53
+    , 0x53
+    , 0x41
+    , 0x47
+    , 0x45
+    , 0x4C
+    , 0x4F
+    , 0x4F
+    , 0x50
+    ]
+
+-- | A variable controlling whether GameInput is used for raw keyboard and mouse on Windows.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": GameInput is not used for raw keyboard and mouse events. (default)
+--
+--     * \"1\": GameInput is used for raw keyboard and mouse events, if available.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_GAMEINPUT@, literal @\"SDL_WINDOWS_GAMEINPUT\"@, defined at @SDL3\/SDL_hints.h 4483:9@
+sDL_HINT_WINDOWS_GAMEINPUT :: BG.ByteString
+sDL_HINT_WINDOWS_GAMEINPUT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x47
+    , 0x41
+    , 0x4D
+    , 0x45
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    ]
+
+-- | A variable controlling whether raw keyboard events are used on Windows.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": The Windows message loop is used for keyboard events. (default)
+--
+--     * \"1\": Low latency raw keyboard events are used.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_RAW_KEYBOARD@, literal @\"SDL_WINDOWS_RAW_KEYBOARD\"@, defined at @SDL3\/SDL_hints.h 4497:9@
+sDL_HINT_WINDOWS_RAW_KEYBOARD :: BG.ByteString
+sDL_HINT_WINDOWS_RAW_KEYBOARD =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x52
+    , 0x41
+    , 0x57
+    , 0x5F
+    , 0x4B
+    , 0x45
+    , 0x59
+    , 0x42
+    , 0x4F
+    , 0x41
+    , 0x52
+    , 0x44
+    ]
+
+-- | A variable controlling whether or not the RIDEV_NOHOTKEYS flag is set when enabling Windows raw keyboard events.
+--
+--     This blocks any hotkeys that have been registered by applications from having any effect beyond generating raw WM_INPUT events.
+--
+--     This flag does not affect system-hotkeys like ALT-TAB or CTRL-ALT-DEL, but does affect the Windows Logo key since it is a userland hotkey registered by explorer.exe.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Hotkeys are not excluded. (default)
+--
+--     * \"1\": Hotkeys are excluded.
+--
+--     This hint can be set anytime.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS@, literal @\"SDL_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS\"@, defined at @SDL3\/SDL_hints.h 4519:9@
+sDL_HINT_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS :: BG.ByteString
+sDL_HINT_WINDOWS_RAW_KEYBOARD_EXCLUDE_HOTKEYS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x52
+    , 0x41
+    , 0x57
+    , 0x5F
+    , 0x4B
+    , 0x45
+    , 0x59
+    , 0x42
+    , 0x4F
+    , 0x41
+    , 0x52
+    , 0x44
+    , 0x5F
+    , 0x45
+    , 0x58
+    , 0x43
+    , 0x4C
+    , 0x55
+    , 0x44
+    , 0x45
+    , 0x5F
+    , 0x48
+    , 0x4F
+    , 0x54
+    , 0x4B
+    , 0x45
+    , 0x59
+    , 0x53
+    ]
+
+-- | A variable controlling whether SDL uses Kernel Semaphores on Windows.
+--
+--     Kernel Semaphores are inter-process and require a context switch on every interaction. On Windows 8 and newer, the WaitOnAddress API is available. Using that and atomics to implement semaphores increases performance. SDL will fall back to Kernel Objects on older OS versions or if forced to by this hint.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Use Atomics and WaitOnAddress API when available, otherwise fall back to Kernel Objects. (default)
+--
+--     * \"1\": Force the use of Kernel Objects in all cases.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL@, literal @\"SDL_WINDOWS_FORCE_SEMAPHORE_KERNEL\"@, defined at @SDL3\/SDL_hints.h 4540:9@
+sDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL :: BG.ByteString
+sDL_HINT_WINDOWS_FORCE_SEMAPHORE_KERNEL =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x46
+    , 0x4F
+    , 0x52
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x53
+    , 0x45
+    , 0x4D
+    , 0x41
+    , 0x50
+    , 0x48
+    , 0x4F
+    , 0x52
+    , 0x45
+    , 0x5F
+    , 0x4B
+    , 0x45
+    , 0x52
+    , 0x4E
+    , 0x45
+    , 0x4C
+    ]
+
+-- | A variable to specify custom icon resource id from RC file on Windows platform.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_INTRESOURCE_ICON@, literal @\"SDL_WINDOWS_INTRESOURCE_ICON\"@, defined at @SDL3\/SDL_hints.h 4550:9@
+sDL_HINT_WINDOWS_INTRESOURCE_ICON :: BG.ByteString
+sDL_HINT_WINDOWS_INTRESOURCE_ICON =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x54
+    , 0x52
+    , 0x45
+    , 0x53
+    , 0x4F
+    , 0x55
+    , 0x52
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x49
+    , 0x43
+    , 0x4F
+    , 0x4E
+    ]
+
+-- | A variable to specify custom icon resource id from RC file on Windows platform.
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL@, literal @\"SDL_WINDOWS_INTRESOURCE_ICON_SMALL\"@, defined at @SDL3\/SDL_hints.h 4560:9@
+sDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL :: BG.ByteString
+sDL_HINT_WINDOWS_INTRESOURCE_ICON_SMALL =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x49
+    , 0x4E
+    , 0x54
+    , 0x52
+    , 0x45
+    , 0x53
+    , 0x4F
+    , 0x55
+    , 0x52
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x49
+    , 0x43
+    , 0x4F
+    , 0x4E
+    , 0x5F
+    , 0x53
+    , 0x4D
+    , 0x41
+    , 0x4C
+    , 0x4C
+    ]
+
+-- | A variable controlling whether SDL uses the D3D9Ex API introduced in Windows Vista, instead of normal D3D9.
+--
+--     Direct3D 9Ex contains changes to state management that can eliminate device loss errors during scenarios like Alt+Tab or UAC prompts. D3D9Ex may require some changes to your application to cope with the new behavior, so this is disabled by default.
+--
+--     For more information on Direct3D 9Ex, see:
+--
+--     * [https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/direct3darticles\/graphics-apis-in-windows-vista\#direct3d-9ex](https://docs.microsoft.com/en-us/windows/win32/direct3darticles/graphics-apis-in-windows-vista#direct3d-9ex)
+--
+--     * [https:\/\/docs.microsoft.com\/en-us\/windows\/win32\/direct3darticles\/direct3d-9ex-improvements](https://docs.microsoft.com/en-us/windows/win32/direct3darticles/direct3d-9ex-improvements)
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Use the original Direct3D 9 API. (default)
+--
+--     * \"1\": Use the Direct3D 9Ex API on Vista and later (and fall back if D3D9Ex is unavailable)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_USE_D3D9EX@, literal @\"SDL_WINDOWS_USE_D3D9EX\"@, defined at @SDL3\/SDL_hints.h 4586:9@
+sDL_HINT_WINDOWS_USE_D3D9EX :: BG.ByteString
+sDL_HINT_WINDOWS_USE_D3D9EX =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x44
+    , 0x33
+    , 0x44
+    , 0x39
+    , 0x45
+    , 0x58
+    ]
+
+-- | A variable controlling whether SDL will clear the window contents when the WM_ERASEBKGND message is received.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\"\/\"never\": Never clear the window.
+--
+--     * \"1\"\/\"initial\": Clear the window when the first WM_ERASEBKGND event fires. (default)
+--
+--     * \"2\"\/\"always\": Clear the window on every WM_ERASEBKGND event.
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_WINDOWS_ERASE_BACKGROUND_MODE@, literal @\"SDL_WINDOWS_ERASE_BACKGROUND_MODE\"@, defined at @SDL3\/SDL_hints.h 4603:9@
+sDL_HINT_WINDOWS_ERASE_BACKGROUND_MODE :: BG.ByteString
+sDL_HINT_WINDOWS_ERASE_BACKGROUND_MODE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x53
+    , 0x5F
+    , 0x45
+    , 0x52
+    , 0x41
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x42
+    , 0x41
+    , 0x43
+    , 0x4B
+    , 0x47
+    , 0x52
+    , 0x4F
+    , 0x55
+    , 0x4E
+    , 0x44
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x44
+    , 0x45
+    ]
+
+-- | A variable controlling whether X11 windows are marked as override-redirect.
+--
+--     If set, this /might/ increase framerate at the expense of the desktop not working as expected. Override-redirect windows aren\'t noticed by the window manager at all.
+--
+--     You should probably only use this for fullscreen windows, and you probably shouldn\'t even use it for that. But it\'s here if you want to try!
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Do not mark the window as override-redirect. (default)
+--
+--     * \"1\": Mark the window as override-redirect.
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_X11_FORCE_OVERRIDE_REDIRECT@, literal @\"SDL_X11_FORCE_OVERRIDE_REDIRECT\"@, defined at @SDL3\/SDL_hints.h 4624:9@
+sDL_HINT_X11_FORCE_OVERRIDE_REDIRECT :: BG.ByteString
+sDL_HINT_X11_FORCE_OVERRIDE_REDIRECT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x46
+    , 0x4F
+    , 0x52
+    , 0x43
+    , 0x45
+    , 0x5F
+    , 0x4F
+    , 0x56
+    , 0x45
+    , 0x52
+    , 0x52
+    , 0x49
+    , 0x44
+    , 0x45
+    , 0x5F
+    , 0x52
+    , 0x45
+    , 0x44
+    , 0x49
+    , 0x52
+    , 0x45
+    , 0x43
+    , 0x54
+    ]
+
+-- | A variable specifying the type of an X11 window.
+--
+--     During SDL_CreateWindow, SDL uses the _NET_WM_WINDOW_TYPE X11 property to report to the window manager the type of window it wants to create. This might be set to various things if SDL_WINDOW_TOOLTIP or SDL_WINDOW_POPUP_MENU, etc, were specified. For \"normal\" windows that haven\'t set a specific type, this hint can be used to specify a custom type. For example, a dock window might set this to \"_NET_WM_WINDOW_TYPE_DOCK\".
+--
+--     This hint should be set before creating a window.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_X11_WINDOW_TYPE@, literal @\"SDL_X11_WINDOW_TYPE\"@, defined at @SDL3\/SDL_hints.h 4641:9@
+sDL_HINT_X11_WINDOW_TYPE :: BG.ByteString
+sDL_HINT_X11_WINDOW_TYPE =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x57
+    , 0x49
+    , 0x4E
+    , 0x44
+    , 0x4F
+    , 0x57
+    , 0x5F
+    , 0x54
+    , 0x59
+    , 0x50
+    , 0x45
+    ]
+
+-- | Specify the XCB library to load for the X11 driver.
+--
+--     The default is platform-specific, often \"libX11-xcb.so.1\".
+--
+--     This hint should be set before initializing the video subsystem.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_X11_XCB_LIBRARY@, literal @\"SDL_X11_XCB_LIBRARY\"@, defined at @SDL3\/SDL_hints.h 4652:9@
+sDL_HINT_X11_XCB_LIBRARY :: BG.ByteString
+sDL_HINT_X11_XCB_LIBRARY =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x58
+    , 0x31
+    , 0x31
+    , 0x5F
+    , 0x58
+    , 0x43
+    , 0x42
+    , 0x5F
+    , 0x4C
+    , 0x49
+    , 0x42
+    , 0x52
+    , 0x41
+    , 0x52
+    , 0x59
+    ]
+
+-- | A variable controlling whether XInput should be used for controller handling.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": XInput is not enabled.
+--
+--     * \"1\": XInput is enabled. (default)
+--
+--     This hint should be set before SDL is initialized.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_XINPUT_ENABLED@, literal @\"SDL_XINPUT_ENABLED\"@, defined at @SDL3\/SDL_hints.h 4667:9@
+sDL_HINT_XINPUT_ENABLED :: BG.ByteString
+sDL_HINT_XINPUT_ENABLED =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x58
+    , 0x49
+    , 0x4E
+    , 0x50
+    , 0x55
+    , 0x54
+    , 0x5F
+    , 0x45
+    , 0x4E
+    , 0x41
+    , 0x42
+    , 0x4C
+    , 0x45
+    , 0x44
+    ]
+
+-- | A variable controlling response to SDL_assert failures.
+--
+--     The variable can be set to the following case-sensitive values:
+--
+--     * \"abort\": Program terminates immediately.
+--
+--     * \"break\": Program triggers a debugger breakpoint.
+--
+--     * \"retry\": Program reruns the SDL_assert\'s test again.
+--
+--     * \"ignore\": Program continues on, ignoring this assertion failure this time.
+--
+--     * \"always_ignore\": Program continues on, ignoring this assertion failure for the rest of the run.
+--
+--     Note that SDL_SetAssertionHandler offers a programmatic means to deal with assertion failures through a callback, and this hint is largely intended to be used via environment variables by end users and automated tools.
+--
+--     This hint should be set before an assertion failure is triggered and can be changed at any time.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_ASSERT@, literal @\"SDL_ASSERT\"@, defined at @SDL3\/SDL_hints.h 4691:9@
+sDL_HINT_ASSERT :: BG.ByteString
+sDL_HINT_ASSERT =
+  BG.pack [0x53, 0x44, 0x4C, 0x5F, 0x41, 0x53, 0x53, 0x45, 0x52, 0x54]
+
+-- | A variable controlling whether pen events should generate synthetic mouse events.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Pen events will not generate mouse events.
+--
+--     * \"1\": Pen events will generate mouse events. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_PEN_MOUSE_EVENTS@, literal @\"SDL_PEN_MOUSE_EVENTS\"@, defined at @SDL3\/SDL_hints.h 4706:9@
+sDL_HINT_PEN_MOUSE_EVENTS :: BG.ByteString
+sDL_HINT_PEN_MOUSE_EVENTS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x50
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x4D
+    , 0x4F
+    , 0x55
+    , 0x53
+    , 0x45
+    , 0x5F
+    , 0x45
+    , 0x56
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x53
+    ]
+
+-- | A variable controlling whether pen events should generate synthetic touch events.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": Pen events will not generate touch events.
+--
+--     * \"1\": Pen events will generate touch events. (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_HINT_PEN_TOUCH_EVENTS@, literal @\"SDL_PEN_TOUCH_EVENTS\"@, defined at @SDL3\/SDL_hints.h 4721:9@
+sDL_HINT_PEN_TOUCH_EVENTS :: BG.ByteString
+sDL_HINT_PEN_TOUCH_EVENTS =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x5F
+    , 0x50
+    , 0x45
+    , 0x4E
+    , 0x5F
+    , 0x54
+    , 0x4F
+    , 0x55
+    , 0x43
+    , 0x48
+    , 0x5F
+    , 0x45
+    , 0x56
+    , 0x45
+    , 0x4E
+    , 0x54
+    , 0x53
+    ]
+
+-- | An enumeration of hint priorities.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_HintPriority@, defined at @SDL3\/SDL_hints.h 4728:14@
+newtype SDL_HintPriority = SDL_HintPriority
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_HintPriority where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_HintPriority where
+  readRaw =
+    \ptr0 ->
+      pure SDL_HintPriority
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_HintPriority where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_HintPriority unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_HintPriority instance BG.Storable SDL_HintPriority
+
+deriving via BG.CUInt instance BG.Prim SDL_HintPriority
+
+instance CEnum.CEnum SDL_HintPriority where
+  type CEnumZ SDL_HintPriority = BG.CUInt
+
+  toCEnum = SDL_HintPriority
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_HINT_DEFAULT")
+        , (1, BG.singleton "SDL_HINT_NORMAL")
+        , (2, BG.singleton "SDL_HINT_OVERRIDE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_HintPriority"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_HintPriority"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_HintPriority where
+  minDeclaredValue = SDL_HINT_DEFAULT
+
+  maxDeclaredValue = SDL_HINT_OVERRIDE
+
+instance Show SDL_HintPriority where
+  showsPrec = CEnum.shows
+
+instance Read SDL_HintPriority where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_HintPriority ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HintPriority{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_HintPriority) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_HintPriority "unwrap" where
+  type CFieldType SDL_HintPriority "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_HINT_DEFAULT@, defined at @SDL3\/SDL_hints.h 4730:5@
+pattern SDL_HINT_DEFAULT :: SDL_HintPriority
+pattern SDL_HINT_DEFAULT = SDL_HintPriority 0
+
+-- | [C declaration]: @SDL_HINT_NORMAL@, defined at @SDL3\/SDL_hints.h 4731:5@
+pattern SDL_HINT_NORMAL :: SDL_HintPriority
+pattern SDL_HINT_NORMAL = SDL_HintPriority 1
+
+-- | [C declaration]: @SDL_HINT_OVERRIDE@, defined at @SDL3\/SDL_hints.h 4732:5@
+pattern SDL_HINT_OVERRIDE :: SDL_HintPriority
+pattern SDL_HINT_OVERRIDE = SDL_HintPriority 2
+
+-- | Auxiliary type used by 'SDL_HintCallback'
+--
+--     [C declaration]: @SDL_HintCallback@, defined at @SDL3\/SDL_hints.h 4866:23@
+newtype SDL_HintCallback_Aux = SDL_HintCallback_Aux
+  { unwrap
+      :: BG.Ptr BG.Void
+      -> PtrConst.PtrConst BG.CChar
+      -> PtrConst.PtrConst BG.CChar
+      -> PtrConst.PtrConst BG.CChar
+      -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_HintCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_d373a1a98e80dd1f_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ()))
+
+-- __unique:__ @toSDL_HintCallback_Aux@
+hs_bindgen_d373a1a98e80dd1f
+  :: SDL_HintCallback_Aux
+  -> IO (BG.FunPtr SDL_HintCallback_Aux)
+hs_bindgen_d373a1a98e80dd1f =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_d373a1a98e80dd1f_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_HintCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_52c5a5e7b6578189_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ())
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @fromSDL_HintCallback_Aux@
+hs_bindgen_52c5a5e7b6578189
+  :: BG.FunPtr SDL_HintCallback_Aux
+  -> SDL_HintCallback_Aux
+hs_bindgen_52c5a5e7b6578189 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_52c5a5e7b6578189_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_HintCallback_Aux where
+  toFunPtr = hs_bindgen_d373a1a98e80dd1f
+
+instance BG.FromFunPtr SDL_HintCallback_Aux where
+  fromFunPtr = hs_bindgen_52c5a5e7b6578189
+
+instance
+  ( ty
+      ~ ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.CChar
+          -> PtrConst.PtrConst BG.CChar
+          -> PtrConst.PtrConst BG.CChar
+          -> IO ()
+        )
+  )
+  => BG.CompatHasField.HasField "unwrap" SDL_HintCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HintCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  ( ty
+      ~ ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.CChar
+          -> PtrConst.PtrConst BG.CChar
+          -> PtrConst.PtrConst BG.CChar
+          -> IO ()
+        )
+  )
+  => BG.HasField "unwrap" (BG.Ptr SDL_HintCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_HintCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_HintCallback_Aux "unwrap" =
+      BG.Ptr BG.Void
+      -> PtrConst.PtrConst BG.CChar
+      -> PtrConst.PtrConst BG.CChar
+      -> PtrConst.PtrConst BG.CChar
+      -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback used to send notifications of hint value changes.
+--
+--     This is called an initial time during SDL_AddHintCallback with the hint\'s current value, and then again each time the hint\'s value changes.
+--
+--     [@userdata@]: what was passed as @userdata@ to @SDL_AddHintCallback()@.
+--
+--     [@name@]: what was passed as @name@ to @SDL_AddHintCallback()@.
+--
+--     [@oldValue@]: the previous hint value.
+--
+--     [@newValue@]: the new value hint is to be set to.
+--
+--     [Thread safety]: This callback is fired from whatever thread is setting a new hint value. SDL holds a lock on the hint subsystem when calling this callback.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddHintCallback'
+--
+--     [C declaration]: @SDL_HintCallback@, defined at @SDL3\/SDL_hints.h 4866:23@
+newtype SDL_HintCallback = SDL_HintCallback
+  { unwrap :: BG.FunPtr SDL_HintCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_HintCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_HintCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HintCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_HintCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_HintCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_HintCallback "unwrap" where
+  type
+    CFieldType SDL_HintCallback "unwrap" =
+      BG.FunPtr SDL_HintCallback_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Hints/FunPtr.hs b/src/SDL3/Sys/Bindgen/Hints/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Hints/FunPtr.hs
@@ -0,0 +1,362 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Hints.FunPtr (
+  SDL3.Sys.Bindgen.Hints.FunPtr.sDL_SetHintWithPriority,
+  SDL3.Sys.Bindgen.Hints.FunPtr.sDL_SetHint,
+  SDL3.Sys.Bindgen.Hints.FunPtr.sDL_ResetHint,
+  SDL3.Sys.Bindgen.Hints.FunPtr.sDL_ResetHints,
+  SDL3.Sys.Bindgen.Hints.FunPtr.sDL_GetHint,
+  SDL3.Sys.Bindgen.Hints.FunPtr.sDL_GetHintBoolean,
+  SDL3.Sys.Bindgen.Hints.FunPtr.sDL_AddHintCallback,
+  SDL3.Sys.Bindgen.Hints.FunPtr.sDL_RemoveHintCallback,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Hints
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_hints.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_SetHintWithPriority */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a1124b908df29b8d (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_HintPriority arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetHintWithPriority;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_SetHint */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_67e0f6aa5619e9be (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetHint;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_ResetHint */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_978a3ef046005881 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ResetHint;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_ResetHints */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_55759cca20a8fc7a (void)) (void)"
+         , "{"
+         , "  return &SDL_ResetHints;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_GetHint */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_76a1a86d4bb7fe80 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetHint;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_GetHintBoolean */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_31d7e0760df235bb (void)) ("
+         , "  char const *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetHintBoolean;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_AddHintCallback */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e8ea72aae64e3056 (void)) ("
+         , "  char const *arg1,"
+         , "  SDL_HintCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_AddHintCallback;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_RemoveHintCallback */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_266d8b3206b888d9 (void)) ("
+         , "  char const *arg1,"
+         , "  SDL_HintCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_RemoveHintCallback;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_SetHintWithPriority@
+foreign import ccall unsafe "hs_bindgen_a1124b908df29b8d"
+  hs_bindgen_a1124b908df29b8d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_SetHintWithPriority@
+hs_bindgen_a1124b908df29b8d
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> SDL_HintPriority -> IO BG.CBool)
+       )
+hs_bindgen_a1124b908df29b8d =
+  BG.fromFFIType hs_bindgen_a1124b908df29b8d_base
+
+{-# NOINLINE sDL_SetHintWithPriority #-}
+
+-- | Set a hint with a specific priority.
+--
+--     The priority controls the behavior when setting a hint that already has a value. Hints will replace existing hints of their priority and lower. Environment variables are considered to have override priority.
+--
+--     [@name@]: the hint to set.
+--
+--     [@value@]: the value of the hint variable.
+--
+--     [@priority@]: the 'SDL_HintPriority' level for the hint.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHint', 'sDL_ResetHint', 'sDL_SetHint'
+--
+--     [C declaration]: @SDL_SetHintWithPriority@, defined at @SDL3\/SDL_hints.h 4756:34@
+sDL_SetHintWithPriority
+  :: BG.FunPtr
+       (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> SDL_HintPriority -> IO BG.CBool)
+sDL_SetHintWithPriority =
+  BG.unsafePerformIO hs_bindgen_a1124b908df29b8d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_SetHint@
+foreign import ccall unsafe "hs_bindgen_67e0f6aa5619e9be"
+  hs_bindgen_67e0f6aa5619e9be_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_SetHint@
+hs_bindgen_67e0f6aa5619e9be
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_67e0f6aa5619e9be =
+  BG.fromFFIType hs_bindgen_67e0f6aa5619e9be_base
+
+{-# NOINLINE sDL_SetHint #-}
+
+-- | Set a hint with normal priority.
+--
+--     Hints will not be set if there is an existing override hint or environment variable that takes precedence. You can use @SDL_SetHintWithPriority()@ to set the hint with override priority instead.
+--
+--     [@name@]: the hint to set.
+--
+--     [@value@]: the value of the hint variable.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHint', 'sDL_ResetHint', 'sDL_SetHintWithPriority'
+--
+--     [C declaration]: @SDL_SetHint@, defined at @SDL3\/SDL_hints.h 4778:34@
+sDL_SetHint :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SetHint =
+  BG.unsafePerformIO hs_bindgen_67e0f6aa5619e9be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_ResetHint@
+foreign import ccall unsafe "hs_bindgen_978a3ef046005881"
+  hs_bindgen_978a3ef046005881_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_ResetHint@
+hs_bindgen_978a3ef046005881 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_978a3ef046005881 =
+  BG.fromFFIType hs_bindgen_978a3ef046005881_base
+
+{-# NOINLINE sDL_ResetHint #-}
+
+-- | Reset a hint to the default value.
+--
+--     This will reset a hint to the value of the environment variable, or NULL if the environment isn\'t set. Callbacks will be called normally with this change.
+--
+--     [@name@]: the hint to set.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetHint', 'sDL_ResetHints'
+--
+--     [C declaration]: @SDL_ResetHint@, defined at @SDL3\/SDL_hints.h 4798:34@
+sDL_ResetHint :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_ResetHint =
+  BG.unsafePerformIO hs_bindgen_978a3ef046005881
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_ResetHints@
+foreign import ccall unsafe "hs_bindgen_55759cca20a8fc7a"
+  hs_bindgen_55759cca20a8fc7a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_ResetHints@
+hs_bindgen_55759cca20a8fc7a :: IO (BG.FunPtr (IO ()))
+hs_bindgen_55759cca20a8fc7a =
+  BG.fromFFIType hs_bindgen_55759cca20a8fc7a_base
+
+{-# NOINLINE sDL_ResetHints #-}
+
+-- | Reset all hints to the default values.
+--
+--     This will reset all hints to the value of the associated environment variable, or NULL if the environment isn\'t set. Callbacks will be called normally with this change.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResetHint'
+--
+--     [C declaration]: @SDL_ResetHints@, defined at @SDL3\/SDL_hints.h 4813:34@
+sDL_ResetHints :: BG.FunPtr (IO ())
+sDL_ResetHints =
+  BG.unsafePerformIO hs_bindgen_55759cca20a8fc7a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_GetHint@
+foreign import ccall unsafe "hs_bindgen_76a1a86d4bb7fe80"
+  hs_bindgen_76a1a86d4bb7fe80_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_GetHint@
+hs_bindgen_76a1a86d4bb7fe80
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_76a1a86d4bb7fe80 =
+  BG.fromFFIType hs_bindgen_76a1a86d4bb7fe80_base
+
+{-# NOINLINE sDL_GetHint #-}
+
+-- | Get the value of a hint.
+--
+--     [@name@]: the hint to query.
+--
+--     [Returns]: the string value of a hint or NULL if the hint isn\'t set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetHint', 'sDL_SetHintWithPriority'
+--
+--     [C declaration]: @SDL_GetHint@, defined at @SDL3\/SDL_hints.h 4828:41@
+sDL_GetHint :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetHint =
+  BG.unsafePerformIO hs_bindgen_76a1a86d4bb7fe80
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_GetHintBoolean@
+foreign import ccall unsafe "hs_bindgen_31d7e0760df235bb"
+  hs_bindgen_31d7e0760df235bb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_GetHintBoolean@
+hs_bindgen_31d7e0760df235bb
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.CBool -> IO BG.CBool))
+hs_bindgen_31d7e0760df235bb =
+  BG.fromFFIType hs_bindgen_31d7e0760df235bb_base
+
+{-# NOINLINE sDL_GetHintBoolean #-}
+
+-- | Get the boolean value of a hint variable.
+--
+--     [@name@]: the name of the hint to get the boolean value from.
+--
+--     [@default_value@]: the value to return if the hint does not exist.
+--
+--     [Returns]: the boolean value of a hint or the provided default value if the hint does not exist.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHint', 'sDL_SetHint'
+--
+--     [C declaration]: @SDL_GetHintBoolean@, defined at @SDL3\/SDL_hints.h 4845:34@
+sDL_GetHintBoolean :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.CBool -> IO BG.CBool)
+sDL_GetHintBoolean =
+  BG.unsafePerformIO hs_bindgen_31d7e0760df235bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_AddHintCallback@
+foreign import ccall unsafe "hs_bindgen_e8ea72aae64e3056"
+  hs_bindgen_e8ea72aae64e3056_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_AddHintCallback@
+hs_bindgen_e8ea72aae64e3056
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> SDL_HintCallback -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_e8ea72aae64e3056 =
+  BG.fromFFIType hs_bindgen_e8ea72aae64e3056_base
+
+{-# NOINLINE sDL_AddHintCallback #-}
+
+-- | Add a function to watch a particular hint.
+--
+--     The callback function is called /during/ this function, to provide it an initial value, and again each time the hint\'s value changes.
+--
+--     [@name@]: the hint to watch.
+--
+--     [@callback@]: An 'SDL_HintCallback' function that will be called when the hint value changes.
+--
+--     [@userdata@]: a pointer to pass to the callback function.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveHintCallback'
+--
+--     [C declaration]: @SDL_AddHintCallback@, defined at @SDL3\/SDL_hints.h 4887:34@
+sDL_AddHintCallback
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> SDL_HintCallback -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_AddHintCallback =
+  BG.unsafePerformIO hs_bindgen_e8ea72aae64e3056
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_RemoveHintCallback@
+foreign import ccall unsafe "hs_bindgen_266d8b3206b888d9"
+  hs_bindgen_266d8b3206b888d9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_get_SDL_RemoveHintCallback@
+hs_bindgen_266d8b3206b888d9
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> SDL_HintCallback -> BG.Ptr BG.Void -> IO ()))
+hs_bindgen_266d8b3206b888d9 =
+  BG.fromFFIType hs_bindgen_266d8b3206b888d9_base
+
+{-# NOINLINE sDL_RemoveHintCallback #-}
+
+-- | Remove a function watching a particular hint.
+--
+--     [@name@]: the hint being watched.
+--
+--     [@callback@]: an 'SDL_HintCallback' function that will be called when the hint value changes.
+--
+--     [@userdata@]: a pointer being passed to the callback function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddHintCallback'
+--
+--     [C declaration]: @SDL_RemoveHintCallback@, defined at @SDL3\/SDL_hints.h 4903:34@
+sDL_RemoveHintCallback
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> SDL_HintCallback -> BG.Ptr BG.Void -> IO ())
+sDL_RemoveHintCallback =
+  BG.unsafePerformIO hs_bindgen_266d8b3206b888d9
diff --git a/src/SDL3/Sys/Bindgen/Hints/Safe.hs b/src/SDL3/Sys/Bindgen/Hints/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Hints/Safe.hs
@@ -0,0 +1,383 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Hints.Safe (
+  SDL3.Sys.Bindgen.Hints.Safe.sDL_SetHintWithPriority,
+  SDL3.Sys.Bindgen.Hints.Safe.sDL_SetHint,
+  SDL3.Sys.Bindgen.Hints.Safe.sDL_ResetHint,
+  SDL3.Sys.Bindgen.Hints.Safe.sDL_ResetHints,
+  SDL3.Sys.Bindgen.Hints.Safe.sDL_GetHint,
+  SDL3.Sys.Bindgen.Hints.Safe.sDL_GetHintBoolean,
+  SDL3.Sys.Bindgen.Hints.Safe.sDL_AddHintCallback,
+  SDL3.Sys.Bindgen.Hints.Safe.sDL_RemoveHintCallback,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Hints
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_hints.h>"
+         , "_Bool hs_bindgen_0d58d8e15d9ee871 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_HintPriority arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetHintWithPriority)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_eab3698ef04ccc46 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetHint)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_f97886c40bcfbc20 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ResetHint)(arg1);"
+         , "}"
+         , "void hs_bindgen_fd2e64a782ded6df (void)"
+         , "{"
+         , "  (SDL_ResetHints)();"
+         , "}"
+         , "char const *hs_bindgen_9ee7b58437f0684a ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHint)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_5a0b364272f99749 ("
+         , "  char const *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHintBoolean)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d78b382b71fb1c63 ("
+         , "  char const *arg1,"
+         , "  SDL_HintCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_AddHintCallback)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_c51a1a939bae0509 ("
+         , "  char const *arg1,"
+         , "  SDL_HintCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_RemoveHintCallback)(arg1, arg2, arg3);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_SetHintWithPriority@
+foreign import ccall safe "hs_bindgen_0d58d8e15d9ee871"
+  hs_bindgen_0d58d8e15d9ee871_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_SetHintWithPriority@
+hs_bindgen_0d58d8e15d9ee871
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL_HintPriority
+  -> IO BG.CBool
+hs_bindgen_0d58d8e15d9ee871 =
+  BG.fromFFIType hs_bindgen_0d58d8e15d9ee871_base
+
+-- | Set a hint with a specific priority.
+--
+--     The priority controls the behavior when setting a hint that already has a value. Hints will replace existing hints of their priority and lower. Environment variables are considered to have override priority.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHint', 'sDL_ResetHint', 'sDL_SetHint'
+--
+--     [C declaration]: @SDL_SetHintWithPriority@, defined at @SDL3\/SDL_hints.h 4756:34@
+sDL_SetHintWithPriority
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the hint variable.
+  -> SDL_HintPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_HintPriority' level for the hint.
+  -> IO BG.CBool
+sDL_SetHintWithPriority = hs_bindgen_0d58d8e15d9ee871
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_SetHint@
+foreign import ccall safe "hs_bindgen_eab3698ef04ccc46"
+  hs_bindgen_eab3698ef04ccc46_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_SetHint@
+hs_bindgen_eab3698ef04ccc46
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_eab3698ef04ccc46 =
+  BG.fromFFIType hs_bindgen_eab3698ef04ccc46_base
+
+-- | Set a hint with normal priority.
+--
+--     Hints will not be set if there is an existing override hint or environment variable that takes precedence. You can use @SDL_SetHintWithPriority()@ to set the hint with override priority instead.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHint', 'sDL_ResetHint', 'sDL_SetHintWithPriority'
+--
+--     [C declaration]: @SDL_SetHint@, defined at @SDL3\/SDL_hints.h 4778:34@
+sDL_SetHint
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the hint variable.
+  -> IO BG.CBool
+sDL_SetHint = hs_bindgen_eab3698ef04ccc46
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_ResetHint@
+foreign import ccall safe "hs_bindgen_f97886c40bcfbc20"
+  hs_bindgen_f97886c40bcfbc20_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_ResetHint@
+hs_bindgen_f97886c40bcfbc20
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_f97886c40bcfbc20 =
+  BG.fromFFIType hs_bindgen_f97886c40bcfbc20_base
+
+-- | Reset a hint to the default value.
+--
+--     This will reset a hint to the value of the environment variable, or NULL if the environment isn\'t set. Callbacks will be called normally with this change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetHint', 'sDL_ResetHints'
+--
+--     [C declaration]: @SDL_ResetHint@, defined at @SDL3\/SDL_hints.h 4798:34@
+sDL_ResetHint
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> IO BG.CBool
+sDL_ResetHint = hs_bindgen_f97886c40bcfbc20
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_ResetHints@
+foreign import ccall safe "hs_bindgen_fd2e64a782ded6df"
+  hs_bindgen_fd2e64a782ded6df_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_ResetHints@
+hs_bindgen_fd2e64a782ded6df :: IO ()
+hs_bindgen_fd2e64a782ded6df =
+  BG.fromFFIType hs_bindgen_fd2e64a782ded6df_base
+
+-- | Reset all hints to the default values.
+--
+--     This will reset all hints to the value of the associated environment variable, or NULL if the environment isn\'t set. Callbacks will be called normally with this change.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResetHint'
+--
+--     [C declaration]: @SDL_ResetHints@, defined at @SDL3\/SDL_hints.h 4813:34@
+sDL_ResetHints :: IO ()
+sDL_ResetHints = hs_bindgen_fd2e64a782ded6df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_GetHint@
+foreign import ccall safe "hs_bindgen_9ee7b58437f0684a"
+  hs_bindgen_9ee7b58437f0684a_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_GetHint@
+hs_bindgen_9ee7b58437f0684a
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_9ee7b58437f0684a =
+  BG.fromFFIType hs_bindgen_9ee7b58437f0684a_base
+
+-- | Get the value of a hint.
+--
+--     [Returns]: the string value of a hint or NULL if the hint isn\'t set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetHint', 'sDL_SetHintWithPriority'
+--
+--     [C declaration]: @SDL_GetHint@, defined at @SDL3\/SDL_hints.h 4828:41@
+sDL_GetHint
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetHint = hs_bindgen_9ee7b58437f0684a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_GetHintBoolean@
+foreign import ccall safe "hs_bindgen_5a0b364272f99749"
+  hs_bindgen_5a0b364272f99749_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_GetHintBoolean@
+hs_bindgen_5a0b364272f99749
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_5a0b364272f99749 =
+  BG.fromFFIType hs_bindgen_5a0b364272f99749_base
+
+-- | Get the boolean value of a hint variable.
+--
+--     [Returns]: the boolean value of a hint or the provided default value if the hint does not exist.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHint', 'sDL_SetHint'
+--
+--     [C declaration]: @SDL_GetHintBoolean@, defined at @SDL3\/SDL_hints.h 4845:34@
+sDL_GetHintBoolean
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the hint to get the boolean value from.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@default_value@]: the value to return if the hint does not exist.
+  -> IO BG.CBool
+sDL_GetHintBoolean = hs_bindgen_5a0b364272f99749
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_AddHintCallback@
+foreign import ccall safe "hs_bindgen_d78b382b71fb1c63"
+  hs_bindgen_d78b382b71fb1c63_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_AddHintCallback@
+hs_bindgen_d78b382b71fb1c63
+  :: PtrConst.PtrConst BG.CChar
+  -> SDL_HintCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_d78b382b71fb1c63 =
+  BG.fromFFIType hs_bindgen_d78b382b71fb1c63_base
+
+-- | Add a function to watch a particular hint.
+--
+--     The callback function is called /during/ this function, to provide it an initial value, and again each time the hint\'s value changes.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveHintCallback'
+--
+--     [C declaration]: @SDL_AddHintCallback@, defined at @SDL3\/SDL_hints.h 4887:34@
+sDL_AddHintCallback
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to watch.
+  -> SDL_HintCallback
+  -- ^
+  --
+  --           [@callback@]: An 'SDL_HintCallback' function that will be called when the hint value changes.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to the callback function.
+  -> IO BG.CBool
+sDL_AddHintCallback = hs_bindgen_d78b382b71fb1c63
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_RemoveHintCallback@
+foreign import ccall safe "hs_bindgen_c51a1a939bae0509"
+  hs_bindgen_c51a1a939bae0509_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Safe_SDL_RemoveHintCallback@
+hs_bindgen_c51a1a939bae0509
+  :: PtrConst.PtrConst BG.CChar
+  -> SDL_HintCallback
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_c51a1a939bae0509 =
+  BG.fromFFIType hs_bindgen_c51a1a939bae0509_base
+
+-- | Remove a function watching a particular hint.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddHintCallback'
+--
+--     [C declaration]: @SDL_RemoveHintCallback@, defined at @SDL3\/SDL_hints.h 4903:34@
+sDL_RemoveHintCallback
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint being watched.
+  -> SDL_HintCallback
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_HintCallback' function that will be called when the hint value changes.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer being passed to the callback function.
+  -> IO ()
+sDL_RemoveHintCallback = hs_bindgen_c51a1a939bae0509
diff --git a/src/SDL3/Sys/Bindgen/Hints/Unsafe.hs b/src/SDL3/Sys/Bindgen/Hints/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Hints/Unsafe.hs
@@ -0,0 +1,383 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Hints.Unsafe (
+  SDL3.Sys.Bindgen.Hints.Unsafe.sDL_SetHintWithPriority,
+  SDL3.Sys.Bindgen.Hints.Unsafe.sDL_SetHint,
+  SDL3.Sys.Bindgen.Hints.Unsafe.sDL_ResetHint,
+  SDL3.Sys.Bindgen.Hints.Unsafe.sDL_ResetHints,
+  SDL3.Sys.Bindgen.Hints.Unsafe.sDL_GetHint,
+  SDL3.Sys.Bindgen.Hints.Unsafe.sDL_GetHintBoolean,
+  SDL3.Sys.Bindgen.Hints.Unsafe.sDL_AddHintCallback,
+  SDL3.Sys.Bindgen.Hints.Unsafe.sDL_RemoveHintCallback,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Hints
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_hints.h>"
+         , "_Bool hs_bindgen_cb82b52002f46100 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_HintPriority arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetHintWithPriority)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_3f922ee38b008540 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetHint)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_3d1b9b2531cc28fe ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ResetHint)(arg1);"
+         , "}"
+         , "void hs_bindgen_55d0a8bf7baacba4 (void)"
+         , "{"
+         , "  (SDL_ResetHints)();"
+         , "}"
+         , "char const *hs_bindgen_637ba7b5c2a54073 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHint)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_df016d033ceb7b47 ("
+         , "  char const *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetHintBoolean)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5d061e74b3f3440a ("
+         , "  char const *arg1,"
+         , "  SDL_HintCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_AddHintCallback)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_7b0a9c503e7af491 ("
+         , "  char const *arg1,"
+         , "  SDL_HintCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_RemoveHintCallback)(arg1, arg2, arg3);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_SetHintWithPriority@
+foreign import ccall unsafe "hs_bindgen_cb82b52002f46100"
+  hs_bindgen_cb82b52002f46100_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_SetHintWithPriority@
+hs_bindgen_cb82b52002f46100
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL_HintPriority
+  -> IO BG.CBool
+hs_bindgen_cb82b52002f46100 =
+  BG.fromFFIType hs_bindgen_cb82b52002f46100_base
+
+-- | Set a hint with a specific priority.
+--
+--     The priority controls the behavior when setting a hint that already has a value. Hints will replace existing hints of their priority and lower. Environment variables are considered to have override priority.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHint', 'sDL_ResetHint', 'sDL_SetHint'
+--
+--     [C declaration]: @SDL_SetHintWithPriority@, defined at @SDL3\/SDL_hints.h 4756:34@
+sDL_SetHintWithPriority
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the hint variable.
+  -> SDL_HintPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_HintPriority' level for the hint.
+  -> IO BG.CBool
+sDL_SetHintWithPriority = hs_bindgen_cb82b52002f46100
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_SetHint@
+foreign import ccall unsafe "hs_bindgen_3f922ee38b008540"
+  hs_bindgen_3f922ee38b008540_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_SetHint@
+hs_bindgen_3f922ee38b008540
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_3f922ee38b008540 =
+  BG.fromFFIType hs_bindgen_3f922ee38b008540_base
+
+-- | Set a hint with normal priority.
+--
+--     Hints will not be set if there is an existing override hint or environment variable that takes precedence. You can use @SDL_SetHintWithPriority()@ to set the hint with override priority instead.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHint', 'sDL_ResetHint', 'sDL_SetHintWithPriority'
+--
+--     [C declaration]: @SDL_SetHint@, defined at @SDL3\/SDL_hints.h 4778:34@
+sDL_SetHint
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the hint variable.
+  -> IO BG.CBool
+sDL_SetHint = hs_bindgen_3f922ee38b008540
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_ResetHint@
+foreign import ccall unsafe "hs_bindgen_3d1b9b2531cc28fe"
+  hs_bindgen_3d1b9b2531cc28fe_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_ResetHint@
+hs_bindgen_3d1b9b2531cc28fe
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_3d1b9b2531cc28fe =
+  BG.fromFFIType hs_bindgen_3d1b9b2531cc28fe_base
+
+-- | Reset a hint to the default value.
+--
+--     This will reset a hint to the value of the environment variable, or NULL if the environment isn\'t set. Callbacks will be called normally with this change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetHint', 'sDL_ResetHints'
+--
+--     [C declaration]: @SDL_ResetHint@, defined at @SDL3\/SDL_hints.h 4798:34@
+sDL_ResetHint
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> IO BG.CBool
+sDL_ResetHint = hs_bindgen_3d1b9b2531cc28fe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_ResetHints@
+foreign import ccall unsafe "hs_bindgen_55d0a8bf7baacba4"
+  hs_bindgen_55d0a8bf7baacba4_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_ResetHints@
+hs_bindgen_55d0a8bf7baacba4 :: IO ()
+hs_bindgen_55d0a8bf7baacba4 =
+  BG.fromFFIType hs_bindgen_55d0a8bf7baacba4_base
+
+-- | Reset all hints to the default values.
+--
+--     This will reset all hints to the value of the associated environment variable, or NULL if the environment isn\'t set. Callbacks will be called normally with this change.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResetHint'
+--
+--     [C declaration]: @SDL_ResetHints@, defined at @SDL3\/SDL_hints.h 4813:34@
+sDL_ResetHints :: IO ()
+sDL_ResetHints = hs_bindgen_55d0a8bf7baacba4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_GetHint@
+foreign import ccall unsafe "hs_bindgen_637ba7b5c2a54073"
+  hs_bindgen_637ba7b5c2a54073_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_GetHint@
+hs_bindgen_637ba7b5c2a54073
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_637ba7b5c2a54073 =
+  BG.fromFFIType hs_bindgen_637ba7b5c2a54073_base
+
+-- | Get the value of a hint.
+--
+--     [Returns]: the string value of a hint or NULL if the hint isn\'t set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetHint', 'sDL_SetHintWithPriority'
+--
+--     [C declaration]: @SDL_GetHint@, defined at @SDL3\/SDL_hints.h 4828:41@
+sDL_GetHint
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetHint = hs_bindgen_637ba7b5c2a54073
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_GetHintBoolean@
+foreign import ccall unsafe "hs_bindgen_df016d033ceb7b47"
+  hs_bindgen_df016d033ceb7b47_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_GetHintBoolean@
+hs_bindgen_df016d033ceb7b47
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_df016d033ceb7b47 =
+  BG.fromFFIType hs_bindgen_df016d033ceb7b47_base
+
+-- | Get the boolean value of a hint variable.
+--
+--     [Returns]: the boolean value of a hint or the provided default value if the hint does not exist.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetHint', 'sDL_SetHint'
+--
+--     [C declaration]: @SDL_GetHintBoolean@, defined at @SDL3\/SDL_hints.h 4845:34@
+sDL_GetHintBoolean
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the hint to get the boolean value from.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@default_value@]: the value to return if the hint does not exist.
+  -> IO BG.CBool
+sDL_GetHintBoolean = hs_bindgen_df016d033ceb7b47
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_AddHintCallback@
+foreign import ccall unsafe "hs_bindgen_5d061e74b3f3440a"
+  hs_bindgen_5d061e74b3f3440a_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_AddHintCallback@
+hs_bindgen_5d061e74b3f3440a
+  :: PtrConst.PtrConst BG.CChar
+  -> SDL_HintCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_5d061e74b3f3440a =
+  BG.fromFFIType hs_bindgen_5d061e74b3f3440a_base
+
+-- | Add a function to watch a particular hint.
+--
+--     The callback function is called /during/ this function, to provide it an initial value, and again each time the hint\'s value changes.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveHintCallback'
+--
+--     [C declaration]: @SDL_AddHintCallback@, defined at @SDL3\/SDL_hints.h 4887:34@
+sDL_AddHintCallback
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to watch.
+  -> SDL_HintCallback
+  -- ^
+  --
+  --           [@callback@]: An 'SDL_HintCallback' function that will be called when the hint value changes.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to the callback function.
+  -> IO BG.CBool
+sDL_AddHintCallback = hs_bindgen_5d061e74b3f3440a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_RemoveHintCallback@
+foreign import ccall unsafe "hs_bindgen_7b0a9c503e7af491"
+  hs_bindgen_7b0a9c503e7af491_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Hints_Unsafe_SDL_RemoveHintCallback@
+hs_bindgen_7b0a9c503e7af491
+  :: PtrConst.PtrConst BG.CChar
+  -> SDL_HintCallback
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_7b0a9c503e7af491 =
+  BG.fromFFIType hs_bindgen_7b0a9c503e7af491_base
+
+-- | Remove a function watching a particular hint.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddHintCallback'
+--
+--     [C declaration]: @SDL_RemoveHintCallback@, defined at @SDL3\/SDL_hints.h 4903:34@
+sDL_RemoveHintCallback
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint being watched.
+  -> SDL_HintCallback
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_HintCallback' function that will be called when the hint value changes.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer being passed to the callback function.
+  -> IO ()
+sDL_RemoveHintCallback = hs_bindgen_7b0a9c503e7af491
diff --git a/src/SDL3/Sys/Bindgen/Init.hs b/src/SDL3/Sys/Bindgen/Init.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Init.hs
@@ -0,0 +1,1094 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | All SDL programs need to initialize the library before starting to work with it.
+--
+--     Almost everything can simply call @SDL_Init()@ near startup, with a handful of flags to specify subsystems to touch. These are here to make sure SDL does not even attempt to touch low-level pieces of the operating system that you don\'t intend to use. For example, you might be using SDL for video and input but chose an external library for audio, and in this case you would just need to leave off the @'sDL_INIT_AUDIO'@ flag to make sure that external library has complete control.
+--
+--     Most apps, when terminating, should call @SDL_Quit()@. This will clean up (nearly) everything that SDL might have allocated, and crucially, it\'ll make sure that the display\'s resolution is back to what the user expects if you had previously changed it for your game.
+--
+--     SDL3 apps are strongly encouraged to call @SDL_SetAppMetadata()@ at startup to fill in details about the program. This is completely optional, but it helps in small ways (we can provide an About dialog box for the macOS menu, we can name the app in the system\'s audio mixer, etc). Those that want to provide a /lot/ of information should look at the more-detailed @SDL_SetAppMetadataProperty()@. Initialization flags for SDL_Init and\/or SDL_InitSubSystem
+--
+--     These are the flags which may be passed to @SDL_Init()@. You should specify the subsystems which you will be using in your application.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Init', 'sDL_Quit', 'sDL_InitSubSystem', 'sDL_QuitSubSystem', 'sDL_WasInit'
+module SDL3.Sys.Bindgen.Init (
+  SDL3.Sys.Bindgen.Init.SDL_InitFlags (..),
+  SDL3.Sys.Bindgen.Init.sDL_INIT_AUDIO,
+  SDL3.Sys.Bindgen.Init.sDL_INIT_VIDEO,
+  SDL3.Sys.Bindgen.Init.sDL_INIT_JOYSTICK,
+  SDL3.Sys.Bindgen.Init.sDL_INIT_HAPTIC,
+  SDL3.Sys.Bindgen.Init.sDL_INIT_GAMEPAD,
+  SDL3.Sys.Bindgen.Init.sDL_INIT_EVENTS,
+  SDL3.Sys.Bindgen.Init.sDL_INIT_SENSOR,
+  SDL3.Sys.Bindgen.Init.sDL_INIT_CAMERA,
+  SDL3.Sys.Bindgen.Init.SDL_AppResult (..),
+  pattern SDL3.Sys.Bindgen.Init.SDL_APP_CONTINUE,
+  pattern SDL3.Sys.Bindgen.Init.SDL_APP_SUCCESS,
+  pattern SDL3.Sys.Bindgen.Init.SDL_APP_FAILURE,
+  SDL3.Sys.Bindgen.Init.SDL_AppInit_func_Aux (..),
+  SDL3.Sys.Bindgen.Init.SDL_AppInit_func (..),
+  SDL3.Sys.Bindgen.Init.SDL_AppIterate_func_Aux (..),
+  SDL3.Sys.Bindgen.Init.SDL_AppIterate_func (..),
+  SDL3.Sys.Bindgen.Init.SDL_AppEvent_func_Aux (..),
+  SDL3.Sys.Bindgen.Init.SDL_AppEvent_func (..),
+  SDL3.Sys.Bindgen.Init.SDL_AppQuit_func_Aux (..),
+  SDL3.Sys.Bindgen.Init.SDL_AppQuit_func (..),
+  SDL3.Sys.Bindgen.Init.SDL_MainThreadCallback_Aux (..),
+  SDL3.Sys.Bindgen.Init.SDL_MainThreadCallback (..),
+  SDL3.Sys.Bindgen.Init.sDL_PROP_APP_METADATA_NAME_STRING,
+  SDL3.Sys.Bindgen.Init.sDL_PROP_APP_METADATA_VERSION_STRING,
+  SDL3.Sys.Bindgen.Init.sDL_PROP_APP_METADATA_IDENTIFIER_STRING,
+  SDL3.Sys.Bindgen.Init.sDL_PROP_APP_METADATA_CREATOR_STRING,
+  SDL3.Sys.Bindgen.Init.sDL_PROP_APP_METADATA_COPYRIGHT_STRING,
+  SDL3.Sys.Bindgen.Init.sDL_PROP_APP_METADATA_URL_STRING,
+  SDL3.Sys.Bindgen.Init.sDL_PROP_APP_METADATA_TYPE_STRING,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.IncompleteArray qualified as IA
+import HsBindgen.Runtime.IsArray qualified as IsA
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Events qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_InitFlags@, defined at @SDL3\/SDL_init.h 78:16@
+newtype SDL_InitFlags = SDL_InitFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_InitFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_InitFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_InitFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_InitFlags "unwrap" where
+  type
+    CFieldType SDL_InitFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | @'sDL_INIT_AUDIO'@ implies @'sDL_INIT_EVENTS'@
+--
+--     [C declaration]: @macro SDL_INIT_AUDIO@, defined at @SDL3\/SDL_init.h 80:9@
+sDL_INIT_AUDIO :: BG.CUInt
+sDL_INIT_AUDIO = (16 :: BG.CUInt)
+
+-- | @'sDL_INIT_VIDEO'@ implies @'sDL_INIT_EVENTS'@, should be initialized on the main thread
+--
+--     [C declaration]: @macro SDL_INIT_VIDEO@, defined at @SDL3\/SDL_init.h 81:9@
+sDL_INIT_VIDEO :: BG.CUInt
+sDL_INIT_VIDEO = (32 :: BG.CUInt)
+
+-- | @'sDL_INIT_JOYSTICK'@ implies @'sDL_INIT_EVENTS'@
+--
+--     [C declaration]: @macro SDL_INIT_JOYSTICK@, defined at @SDL3\/SDL_init.h 82:9@
+sDL_INIT_JOYSTICK :: BG.CUInt
+sDL_INIT_JOYSTICK = (512 :: BG.CUInt)
+
+-- | [C declaration]: @macro SDL_INIT_HAPTIC@, defined at @SDL3\/SDL_init.h 83:9@
+sDL_INIT_HAPTIC :: BG.CUInt
+sDL_INIT_HAPTIC = (4096 :: BG.CUInt)
+
+-- | @'sDL_INIT_GAMEPAD'@ implies @'sDL_INIT_JOYSTICK'@
+--
+--     [C declaration]: @macro SDL_INIT_GAMEPAD@, defined at @SDL3\/SDL_init.h 84:9@
+sDL_INIT_GAMEPAD :: BG.CUInt
+sDL_INIT_GAMEPAD = (8192 :: BG.CUInt)
+
+-- | [C declaration]: @macro SDL_INIT_EVENTS@, defined at @SDL3\/SDL_init.h 85:9@
+sDL_INIT_EVENTS :: BG.CUInt
+sDL_INIT_EVENTS = (16384 :: BG.CUInt)
+
+-- | @'sDL_INIT_SENSOR'@ implies @'sDL_INIT_EVENTS'@
+--
+--     [C declaration]: @macro SDL_INIT_SENSOR@, defined at @SDL3\/SDL_init.h 86:9@
+sDL_INIT_SENSOR :: BG.CUInt
+sDL_INIT_SENSOR = (32768 :: BG.CUInt)
+
+-- | @'sDL_INIT_CAMERA'@ implies @'sDL_INIT_EVENTS'@
+--
+--     [C declaration]: @macro SDL_INIT_CAMERA@, defined at @SDL3\/SDL_init.h 87:9@
+sDL_INIT_CAMERA :: BG.CUInt
+sDL_INIT_CAMERA = (65536 :: BG.CUInt)
+
+-- | Return values for optional main callbacks.
+--
+--     Returning SDL_APP_SUCCESS or SDL_APP_FAILURE from SDL_AppInit, SDL_AppEvent, or SDL_AppIterate will terminate the program and report success\/failure to the operating system. What that means is platform-dependent. On Unix, for example, on success, the process error code will be zero, and on failure it will be 1. This interface doesn\'t allow you to return specific exit codes, just whether there was an error generally or not.
+--
+--     Returning SDL_APP_CONTINUE from these functions will let the app continue to run.
+--
+--     See [Main callbacks in SDL3](https://wiki.libsdl.org/SDL3/README-main-functions#main-callbacks-in-sdl3) for complete details.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_AppResult@, defined at @SDL3\/SDL_init.h 109:14@
+newtype SDL_AppResult = SDL_AppResult
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_AppResult where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_AppResult where
+  readRaw =
+    \ptr0 ->
+      pure SDL_AppResult
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_AppResult where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_AppResult unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_AppResult instance BG.Storable SDL_AppResult
+
+deriving via BG.CUInt instance BG.Prim SDL_AppResult
+
+instance CEnum.CEnum SDL_AppResult where
+  type CEnumZ SDL_AppResult = BG.CUInt
+
+  toCEnum = SDL_AppResult
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_APP_CONTINUE")
+        , (1, BG.singleton "SDL_APP_SUCCESS")
+        , (2, BG.singleton "SDL_APP_FAILURE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_AppResult"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_AppResult"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_AppResult where
+  minDeclaredValue = SDL_APP_CONTINUE
+
+  maxDeclaredValue = SDL_APP_FAILURE
+
+instance Show SDL_AppResult where
+  showsPrec = CEnum.shows
+
+instance Read SDL_AppResult where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_AppResult ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AppResult{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AppResult) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AppResult "unwrap" where
+  type CFieldType SDL_AppResult "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Value that requests that the app continue from the main callbacks.
+--
+--     [C declaration]: @SDL_APP_CONTINUE@, defined at @SDL3\/SDL_init.h 111:5@
+pattern SDL_APP_CONTINUE :: SDL_AppResult
+pattern SDL_APP_CONTINUE = SDL_AppResult 0
+
+-- | Value that requests termination with success from the main callbacks.
+--
+--     [C declaration]: @SDL_APP_SUCCESS@, defined at @SDL3\/SDL_init.h 112:5@
+pattern SDL_APP_SUCCESS :: SDL_AppResult
+pattern SDL_APP_SUCCESS = SDL_AppResult 1
+
+-- | Value that requests termination with error from the main callbacks.
+--
+--     [C declaration]: @SDL_APP_FAILURE@, defined at @SDL3\/SDL_init.h 113:5@
+pattern SDL_APP_FAILURE :: SDL_AppResult
+pattern SDL_APP_FAILURE = SDL_AppResult 2
+
+-- | Auxiliary type used by 'SDL_AppInit_func'
+--
+--     [C declaration]: @SDL_AppInit_func@, defined at @SDL3\/SDL_init.h 133:33@
+newtype SDL_AppInit_func_Aux = SDL_AppInit_func_Aux
+  { unwrap
+      :: BG.Ptr (BG.Ptr BG.Void)
+      -> BG.CInt
+      -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+      -> IO SDL_AppResult
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_AppInit_func_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_c9f12691f8f9f34d_base
+    :: (BG.Ptr BG.Void -> BG.Int32 -> BG.Ptr BG.Void -> IO BG.Word32)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Int32 -> BG.Ptr BG.Void -> IO BG.Word32))
+
+-- __unique:__ @toSDL_AppInit_func_Aux@
+hs_bindgen_c9f12691f8f9f34d
+  :: SDL_AppInit_func_Aux
+  -> IO (BG.FunPtr SDL_AppInit_func_Aux)
+hs_bindgen_c9f12691f8f9f34d =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_c9f12691f8f9f34d_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_AppInit_func_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_1ceb806dcbf0a04a_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Int32 -> BG.Ptr BG.Void -> IO BG.Word32)
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @fromSDL_AppInit_func_Aux@
+hs_bindgen_1ceb806dcbf0a04a
+  :: BG.FunPtr SDL_AppInit_func_Aux
+  -> SDL_AppInit_func_Aux
+hs_bindgen_1ceb806dcbf0a04a =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_1ceb806dcbf0a04a_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_AppInit_func_Aux where
+  toFunPtr = hs_bindgen_c9f12691f8f9f34d
+
+instance BG.FromFunPtr SDL_AppInit_func_Aux where
+  fromFunPtr = hs_bindgen_1ceb806dcbf0a04a
+
+instance
+  ( ty
+      ~ ( BG.Ptr (BG.Ptr BG.Void)
+          -> BG.CInt
+          -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+          -> IO SDL_AppResult
+        )
+  )
+  => BG.CompatHasField.HasField "unwrap" SDL_AppInit_func_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AppInit_func_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  ( ty
+      ~ ( BG.Ptr (BG.Ptr BG.Void)
+          -> BG.CInt
+          -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+          -> IO SDL_AppResult
+        )
+  )
+  => BG.HasField "unwrap" (BG.Ptr SDL_AppInit_func_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AppInit_func_Aux "unwrap" where
+  type
+    CFieldType SDL_AppInit_func_Aux "unwrap" =
+      BG.Ptr (BG.Ptr BG.Void)
+      -> BG.CInt
+      -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+      -> IO SDL_AppResult
+
+  offset# = \_ -> \_ -> 0
+
+-- | Function pointer typedef for SDL_AppInit.
+--
+--     These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind the scenes for apps using the optional main callbacks. Apps that want to use this should just implement SDL_AppInit directly.
+--
+--     [@appstate@]: a place where the app can optionally store a pointer for future use.
+--
+--     [@argc@]: the standard ANSI C main\'s argc; number of elements in @argv@.
+--
+--     [@argv@]: the standard ANSI C main\'s argv; array of command line arguments.
+--
+--     [Returns]: SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to terminate with success, SDL_APP_CONTINUE to continue.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_AppInit_func@, defined at @SDL3\/SDL_init.h 133:33@
+newtype SDL_AppInit_func = SDL_AppInit_func
+  { unwrap :: BG.FunPtr SDL_AppInit_func_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_AppInit_func_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_AppInit_func ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AppInit_func{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_AppInit_func_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AppInit_func) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AppInit_func "unwrap" where
+  type
+    CFieldType SDL_AppInit_func "unwrap" =
+      BG.FunPtr SDL_AppInit_func_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_AppIterate_func'
+--
+--     [C declaration]: @SDL_AppIterate_func@, defined at @SDL3\/SDL_init.h 148:33@
+newtype SDL_AppIterate_func_Aux = SDL_AppIterate_func_Aux
+  { unwrap :: BG.Ptr BG.Void -> IO SDL_AppResult
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_AppIterate_func_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_8620c17cf1102621_base
+    :: (BG.Ptr BG.Void -> IO BG.Word32)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> IO BG.Word32))
+
+-- __unique:__ @toSDL_AppIterate_func_Aux@
+hs_bindgen_8620c17cf1102621
+  :: SDL_AppIterate_func_Aux
+  -> IO (BG.FunPtr SDL_AppIterate_func_Aux)
+hs_bindgen_8620c17cf1102621 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_8620c17cf1102621_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_AppIterate_func_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_eafa84799a5f2ef1_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> IO BG.Word32)
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @fromSDL_AppIterate_func_Aux@
+hs_bindgen_eafa84799a5f2ef1
+  :: BG.FunPtr SDL_AppIterate_func_Aux
+  -> SDL_AppIterate_func_Aux
+hs_bindgen_eafa84799a5f2ef1 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_eafa84799a5f2ef1_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_AppIterate_func_Aux where
+  toFunPtr = hs_bindgen_8620c17cf1102621
+
+instance BG.FromFunPtr SDL_AppIterate_func_Aux where
+  fromFunPtr = hs_bindgen_eafa84799a5f2ef1
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO SDL_AppResult))
+  => BG.CompatHasField.HasField "unwrap" SDL_AppIterate_func_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AppIterate_func_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO SDL_AppResult))
+  => BG.HasField "unwrap" (BG.Ptr SDL_AppIterate_func_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AppIterate_func_Aux "unwrap" where
+  type
+    CFieldType SDL_AppIterate_func_Aux "unwrap" =
+      BG.Ptr BG.Void -> IO SDL_AppResult
+
+  offset# = \_ -> \_ -> 0
+
+-- | Function pointer typedef for SDL_AppIterate.
+--
+--     These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind the scenes for apps using the optional main callbacks. Apps that want to use this should just implement SDL_AppIterate directly.
+--
+--     [@appstate@]: an optional pointer, provided by the app in SDL_AppInit.
+--
+--     [Returns]: SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to terminate with success, SDL_APP_CONTINUE to continue.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_AppIterate_func@, defined at @SDL3\/SDL_init.h 148:33@
+newtype SDL_AppIterate_func = SDL_AppIterate_func
+  { unwrap :: BG.FunPtr SDL_AppIterate_func_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_AppIterate_func_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_AppIterate_func ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AppIterate_func{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_AppIterate_func_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AppIterate_func) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AppIterate_func "unwrap" where
+  type
+    CFieldType SDL_AppIterate_func "unwrap" =
+      BG.FunPtr SDL_AppIterate_func_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_AppEvent_func'
+--
+--     [C declaration]: @SDL_AppEvent_func@, defined at @SDL3\/SDL_init.h 164:33@
+newtype SDL_AppEvent_func_Aux = SDL_AppEvent_func_Aux
+  { unwrap :: BG.Ptr BG.Void -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event -> IO SDL_AppResult
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_AppEvent_func_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_2b9dfae6ab23e116_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32))
+
+-- __unique:__ @toSDL_AppEvent_func_Aux@
+hs_bindgen_2b9dfae6ab23e116
+  :: SDL_AppEvent_func_Aux
+  -> IO (BG.FunPtr SDL_AppEvent_func_Aux)
+hs_bindgen_2b9dfae6ab23e116 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_2b9dfae6ab23e116_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_AppEvent_func_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_5d33518a4254e343_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32)
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @fromSDL_AppEvent_func_Aux@
+hs_bindgen_5d33518a4254e343
+  :: BG.FunPtr SDL_AppEvent_func_Aux
+  -> SDL_AppEvent_func_Aux
+hs_bindgen_5d33518a4254e343 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_5d33518a4254e343_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_AppEvent_func_Aux where
+  toFunPtr = hs_bindgen_2b9dfae6ab23e116
+
+instance BG.FromFunPtr SDL_AppEvent_func_Aux where
+  fromFunPtr = hs_bindgen_5d33518a4254e343
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event -> IO SDL_AppResult))
+  => BG.CompatHasField.HasField "unwrap" SDL_AppEvent_func_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AppEvent_func_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event -> IO SDL_AppResult))
+  => BG.HasField "unwrap" (BG.Ptr SDL_AppEvent_func_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AppEvent_func_Aux "unwrap" where
+  type
+    CFieldType SDL_AppEvent_func_Aux "unwrap" =
+      BG.Ptr BG.Void -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event -> IO SDL_AppResult
+
+  offset# = \_ -> \_ -> 0
+
+-- | Function pointer typedef for SDL_AppEvent.
+--
+--     These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind the scenes for apps using the optional main callbacks. Apps that want to use this should just implement SDL_AppEvent directly.
+--
+--     [@appstate@]: an optional pointer, provided by the app in SDL_AppInit.
+--
+--     [@event@]: the new event for the app to examine.
+--
+--     [Returns]: SDL_APP_FAILURE to terminate with an error, SDL_APP_SUCCESS to terminate with success, SDL_APP_CONTINUE to continue.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_AppEvent_func@, defined at @SDL3\/SDL_init.h 164:33@
+newtype SDL_AppEvent_func = SDL_AppEvent_func
+  { unwrap :: BG.FunPtr SDL_AppEvent_func_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_AppEvent_func_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_AppEvent_func ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AppEvent_func{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_AppEvent_func_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AppEvent_func) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AppEvent_func "unwrap" where
+  type
+    CFieldType SDL_AppEvent_func "unwrap" =
+      BG.FunPtr SDL_AppEvent_func_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_AppQuit_func'
+--
+--     [C declaration]: @SDL_AppQuit_func@, defined at @SDL3\/SDL_init.h 178:24@
+newtype SDL_AppQuit_func_Aux = SDL_AppQuit_func_Aux
+  { unwrap :: BG.Ptr BG.Void -> SDL_AppResult -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_AppQuit_func_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_fabdaa4c4e54b1de_base
+    :: (BG.Ptr BG.Void -> BG.Word32 -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Word32 -> IO ()))
+
+-- __unique:__ @toSDL_AppQuit_func_Aux@
+hs_bindgen_fabdaa4c4e54b1de
+  :: SDL_AppQuit_func_Aux
+  -> IO (BG.FunPtr SDL_AppQuit_func_Aux)
+hs_bindgen_fabdaa4c4e54b1de =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_fabdaa4c4e54b1de_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_AppQuit_func_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_7021ade2d0ddec93_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Word32 -> IO ())
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @fromSDL_AppQuit_func_Aux@
+hs_bindgen_7021ade2d0ddec93
+  :: BG.FunPtr SDL_AppQuit_func_Aux
+  -> SDL_AppQuit_func_Aux
+hs_bindgen_7021ade2d0ddec93 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_7021ade2d0ddec93_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_AppQuit_func_Aux where
+  toFunPtr = hs_bindgen_fabdaa4c4e54b1de
+
+instance BG.FromFunPtr SDL_AppQuit_func_Aux where
+  fromFunPtr = hs_bindgen_7021ade2d0ddec93
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> SDL_AppResult -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_AppQuit_func_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AppQuit_func_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> SDL_AppResult -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_AppQuit_func_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AppQuit_func_Aux "unwrap" where
+  type
+    CFieldType SDL_AppQuit_func_Aux "unwrap" =
+      BG.Ptr BG.Void -> SDL_AppResult -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | Function pointer typedef for SDL_AppQuit.
+--
+--     These are used by SDL_EnterAppMainCallbacks. This mechanism operates behind the scenes for apps using the optional main callbacks. Apps that want to use this should just implement SDL_AppEvent directly.
+--
+--     [@appstate@]: an optional pointer, provided by the app in SDL_AppInit.
+--
+--     [@result@]: the result code that terminated the app (success or failure).
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_AppQuit_func@, defined at @SDL3\/SDL_init.h 178:24@
+newtype SDL_AppQuit_func = SDL_AppQuit_func
+  { unwrap :: BG.FunPtr SDL_AppQuit_func_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_AppQuit_func_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_AppQuit_func ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_AppQuit_func{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_AppQuit_func_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_AppQuit_func) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_AppQuit_func "unwrap" where
+  type
+    CFieldType SDL_AppQuit_func "unwrap" =
+      BG.FunPtr SDL_AppQuit_func_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_MainThreadCallback'
+--
+--     [C declaration]: @SDL_MainThreadCallback@, defined at @SDL3\/SDL_init.h 341:24@
+newtype SDL_MainThreadCallback_Aux = SDL_MainThreadCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_MainThreadCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_0ddfb0aab2235e28_base
+    :: (BG.Ptr BG.Void -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> IO ()))
+
+-- __unique:__ @toSDL_MainThreadCallback_Aux@
+hs_bindgen_0ddfb0aab2235e28
+  :: SDL_MainThreadCallback_Aux
+  -> IO (BG.FunPtr SDL_MainThreadCallback_Aux)
+hs_bindgen_0ddfb0aab2235e28 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_0ddfb0aab2235e28_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_MainThreadCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_b1a0621ae55dc01c_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> IO ())
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @fromSDL_MainThreadCallback_Aux@
+hs_bindgen_b1a0621ae55dc01c
+  :: BG.FunPtr SDL_MainThreadCallback_Aux
+  -> SDL_MainThreadCallback_Aux
+hs_bindgen_b1a0621ae55dc01c =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_b1a0621ae55dc01c_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_MainThreadCallback_Aux where
+  toFunPtr = hs_bindgen_0ddfb0aab2235e28
+
+instance BG.FromFunPtr SDL_MainThreadCallback_Aux where
+  fromFunPtr = hs_bindgen_b1a0621ae55dc01c
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_MainThreadCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MainThreadCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_MainThreadCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MainThreadCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_MainThreadCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | Callback run on the main thread.
+--
+--     [@userdata@]: an app-controlled pointer that is passed to the callback.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunOnMainThread'
+--
+--     [C declaration]: @SDL_MainThreadCallback@, defined at @SDL3\/SDL_init.h 341:24@
+newtype SDL_MainThreadCallback = SDL_MainThreadCallback
+  { unwrap :: BG.FunPtr SDL_MainThreadCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_MainThreadCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_MainThreadCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MainThreadCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_MainThreadCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_MainThreadCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MainThreadCallback "unwrap" where
+  type
+    CFieldType SDL_MainThreadCallback "unwrap" =
+      BG.FunPtr SDL_MainThreadCallback_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @macro SDL_PROP_APP_METADATA_NAME_STRING@, literal @\"SDL.app.metadata.name\"@, defined at @SDL3\/SDL_init.h 470:9@
+sDL_PROP_APP_METADATA_NAME_STRING :: BG.ByteString
+sDL_PROP_APP_METADATA_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x61
+    , 0x70
+    , 0x70
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x64
+    , 0x61
+    , 0x74
+    , 0x61
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_APP_METADATA_VERSION_STRING@, literal @\"SDL.app.metadata.version\"@, defined at @SDL3\/SDL_init.h 471:9@
+sDL_PROP_APP_METADATA_VERSION_STRING :: BG.ByteString
+sDL_PROP_APP_METADATA_VERSION_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x61
+    , 0x70
+    , 0x70
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x64
+    , 0x61
+    , 0x74
+    , 0x61
+    , 0x2E
+    , 0x76
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_APP_METADATA_IDENTIFIER_STRING@, literal @\"SDL.app.metadata.identifier\"@, defined at @SDL3\/SDL_init.h 472:9@
+sDL_PROP_APP_METADATA_IDENTIFIER_STRING :: BG.ByteString
+sDL_PROP_APP_METADATA_IDENTIFIER_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x61
+    , 0x70
+    , 0x70
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x64
+    , 0x61
+    , 0x74
+    , 0x61
+    , 0x2E
+    , 0x69
+    , 0x64
+    , 0x65
+    , 0x6E
+    , 0x74
+    , 0x69
+    , 0x66
+    , 0x69
+    , 0x65
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_APP_METADATA_CREATOR_STRING@, literal @\"SDL.app.metadata.creator\"@, defined at @SDL3\/SDL_init.h 473:9@
+sDL_PROP_APP_METADATA_CREATOR_STRING :: BG.ByteString
+sDL_PROP_APP_METADATA_CREATOR_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x61
+    , 0x70
+    , 0x70
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x64
+    , 0x61
+    , 0x74
+    , 0x61
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x6F
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_APP_METADATA_COPYRIGHT_STRING@, literal @\"SDL.app.metadata.copyright\"@, defined at @SDL3\/SDL_init.h 474:9@
+sDL_PROP_APP_METADATA_COPYRIGHT_STRING :: BG.ByteString
+sDL_PROP_APP_METADATA_COPYRIGHT_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x61
+    , 0x70
+    , 0x70
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x64
+    , 0x61
+    , 0x74
+    , 0x61
+    , 0x2E
+    , 0x63
+    , 0x6F
+    , 0x70
+    , 0x79
+    , 0x72
+    , 0x69
+    , 0x67
+    , 0x68
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_APP_METADATA_URL_STRING@, literal @\"SDL.app.metadata.url\"@, defined at @SDL3\/SDL_init.h 475:9@
+sDL_PROP_APP_METADATA_URL_STRING :: BG.ByteString
+sDL_PROP_APP_METADATA_URL_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x61
+    , 0x70
+    , 0x70
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x64
+    , 0x61
+    , 0x74
+    , 0x61
+    , 0x2E
+    , 0x75
+    , 0x72
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_APP_METADATA_TYPE_STRING@, literal @\"SDL.app.metadata.type\"@, defined at @SDL3\/SDL_init.h 476:9@
+sDL_PROP_APP_METADATA_TYPE_STRING :: BG.ByteString
+sDL_PROP_APP_METADATA_TYPE_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x61
+    , 0x70
+    , 0x70
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x64
+    , 0x61
+    , 0x74
+    , 0x61
+    , 0x2E
+    , 0x74
+    , 0x79
+    , 0x70
+    , 0x65
+    ]
diff --git a/src/SDL3/Sys/Bindgen/Init/FunPtr.hs b/src/SDL3/Sys/Bindgen/Init/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Init/FunPtr.hs
@@ -0,0 +1,500 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Init.FunPtr (
+  SDL3.Sys.Bindgen.Init.FunPtr.sDL_Init,
+  SDL3.Sys.Bindgen.Init.FunPtr.sDL_InitSubSystem,
+  SDL3.Sys.Bindgen.Init.FunPtr.sDL_QuitSubSystem,
+  SDL3.Sys.Bindgen.Init.FunPtr.sDL_WasInit,
+  SDL3.Sys.Bindgen.Init.FunPtr.sDL_Quit,
+  SDL3.Sys.Bindgen.Init.FunPtr.sDL_IsMainThread,
+  SDL3.Sys.Bindgen.Init.FunPtr.sDL_RunOnMainThread,
+  SDL3.Sys.Bindgen.Init.FunPtr.sDL_SetAppMetadata,
+  SDL3.Sys.Bindgen.Init.FunPtr.sDL_SetAppMetadataProperty,
+  SDL3.Sys.Bindgen.Init.FunPtr.sDL_GetAppMetadataProperty,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Init
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_init.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_Init */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_dfba4f22209c9554 (void)) ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_Init;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_InitSubSystem */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_5bce25b55e9d45e3 (void)) ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_InitSubSystem;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_QuitSubSystem */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_149d9b7709db6751 (void)) ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_QuitSubSystem;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_WasInit */"
+         , "__attribute__ ((const))"
+         , "SDL_InitFlags (*hs_bindgen_53dd2f1aac19a298 (void)) ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_WasInit;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_Quit */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_9b631cb78cf1671f (void)) (void)"
+         , "{"
+         , "  return &SDL_Quit;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_IsMainThread */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a902ff5ab130bb25 (void)) (void)"
+         , "{"
+         , "  return &SDL_IsMainThread;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_RunOnMainThread */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1cff011229869063 (void)) ("
+         , "  SDL_MainThreadCallback arg1,"
+         , "  void *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_RunOnMainThread;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_SetAppMetadata */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7a68851346541d78 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAppMetadata;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_SetAppMetadataProperty */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d0081e390d662467 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetAppMetadataProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_GetAppMetadataProperty */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_fdbd2caae5327fdc (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetAppMetadataProperty;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_Init@
+foreign import ccall unsafe "hs_bindgen_dfba4f22209c9554"
+  hs_bindgen_dfba4f22209c9554_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_Init@
+hs_bindgen_dfba4f22209c9554 :: IO (BG.FunPtr (SDL_InitFlags -> IO BG.CBool))
+hs_bindgen_dfba4f22209c9554 =
+  BG.fromFFIType hs_bindgen_dfba4f22209c9554_base
+
+{-# NOINLINE sDL_Init #-}
+
+-- | Initialize the SDL library.
+--
+--     @SDL_Init()@ simply forwards to calling @SDL_InitSubSystem()@. Therefore, the two may be used interchangeably. Though for readability of your code @SDL_InitSubSystem()@ might be preferred.
+--
+--     The file I\/O (for example: SDL_IOFromFile) and threading (SDL_CreateThread) subsystems are initialized by default. Message boxes (SDL_ShowSimpleMessageBox) also attempt to work without initializing the video subsystem, in hopes of being useful in showing an error dialog when SDL_Init fails. You must specifically initialize other subsystems if you use them in your application.
+--
+--     Logging (such as SDL_Log) works without initialization, too.
+--
+--     @flags@ may be any of the following OR\'d together:
+--
+--     * @'sDL_INIT_AUDIO'@: audio subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_VIDEO'@: video subsystem; automatically initializes the events subsystem, should be initialized on the main thread.
+--
+--     * @'sDL_INIT_JOYSTICK'@: joystick subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_HAPTIC'@: haptic (force feedback) subsystem
+--
+--     * @'sDL_INIT_GAMEPAD'@: gamepad subsystem; automatically initializes the joystick subsystem
+--
+--     * @'sDL_INIT_EVENTS'@: events subsystem
+--
+--     * @'sDL_INIT_SENSOR'@: sensor subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_CAMERA'@: camera subsystem; automatically initializes the events subsystem
+--
+--     Subsystem initialization is ref-counted, you must call @SDL_QuitSubSystem()@ for each @SDL_InitSubSystem()@ to correctly shutdown a subsystem manually (or call @SDL_Quit()@ to force shutdown). If a subsystem is already loaded then this call will increase the ref-count and return.
+--
+--     Consider reporting some basic metadata about your application before calling SDL_Init, using either @SDL_SetAppMetadata()@ or @SDL_SetAppMetadataProperty()@.
+--
+--     [@flags@]: subsystem initialization flags.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAppMetadata', 'sDL_SetAppMetadataProperty', 'sDL_InitSubSystem', 'sDL_Quit', SDL_SetMainReady, 'sDL_WasInit'
+--
+--     [C declaration]: @SDL_Init@, defined at @SDL3\/SDL_init.h 238:34@
+sDL_Init :: BG.FunPtr (SDL_InitFlags -> IO BG.CBool)
+sDL_Init =
+  BG.unsafePerformIO hs_bindgen_dfba4f22209c9554
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_InitSubSystem@
+foreign import ccall unsafe "hs_bindgen_5bce25b55e9d45e3"
+  hs_bindgen_5bce25b55e9d45e3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_InitSubSystem@
+hs_bindgen_5bce25b55e9d45e3 :: IO (BG.FunPtr (SDL_InitFlags -> IO BG.CBool))
+hs_bindgen_5bce25b55e9d45e3 =
+  BG.fromFFIType hs_bindgen_5bce25b55e9d45e3_base
+
+{-# NOINLINE sDL_InitSubSystem #-}
+
+-- | Compatibility function to initialize the SDL library.
+--
+--     This function and @SDL_Init()@ are interchangeable.
+--
+--     [@flags@]: any of the flags used by @SDL_Init()@; see SDL_Init for details.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Init', 'sDL_Quit', 'sDL_QuitSubSystem'
+--
+--     [C declaration]: @SDL_InitSubSystem@, defined at @SDL3\/SDL_init.h 257:34@
+sDL_InitSubSystem :: BG.FunPtr (SDL_InitFlags -> IO BG.CBool)
+sDL_InitSubSystem =
+  BG.unsafePerformIO hs_bindgen_5bce25b55e9d45e3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_QuitSubSystem@
+foreign import ccall unsafe "hs_bindgen_149d9b7709db6751"
+  hs_bindgen_149d9b7709db6751_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_QuitSubSystem@
+hs_bindgen_149d9b7709db6751 :: IO (BG.FunPtr (SDL_InitFlags -> IO ()))
+hs_bindgen_149d9b7709db6751 =
+  BG.fromFFIType hs_bindgen_149d9b7709db6751_base
+
+{-# NOINLINE sDL_QuitSubSystem #-}
+
+-- | Shut down specific SDL subsystems.
+--
+--     You still need to call @SDL_Quit()@ even if you close all open subsystems with @SDL_QuitSubSystem()@.
+--
+--     [@flags@]: any of the flags used by @SDL_Init()@; see SDL_Init for details.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InitSubSystem', 'sDL_Quit'
+--
+--     [C declaration]: @SDL_QuitSubSystem@, defined at @SDL3\/SDL_init.h 274:34@
+sDL_QuitSubSystem :: BG.FunPtr (SDL_InitFlags -> IO ())
+sDL_QuitSubSystem =
+  BG.unsafePerformIO hs_bindgen_149d9b7709db6751
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_WasInit@
+foreign import ccall unsafe "hs_bindgen_53dd2f1aac19a298"
+  hs_bindgen_53dd2f1aac19a298_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_WasInit@
+hs_bindgen_53dd2f1aac19a298 :: IO (BG.FunPtr (SDL_InitFlags -> IO SDL_InitFlags))
+hs_bindgen_53dd2f1aac19a298 =
+  BG.fromFFIType hs_bindgen_53dd2f1aac19a298_base
+
+{-# NOINLINE sDL_WasInit #-}
+
+-- | Get a mask of the specified subsystems which are currently initialized.
+--
+--     [@flags@]: any of the flags used by @SDL_Init()@; see SDL_Init for details.
+--
+--     [Returns]: a mask of all initialized subsystems if @flags@ is 0, otherwise it returns the initialization status of the specified subsystems.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Init', 'sDL_InitSubSystem'
+--
+--     [C declaration]: @SDL_WasInit@, defined at @SDL3\/SDL_init.h 290:43@
+sDL_WasInit :: BG.FunPtr (SDL_InitFlags -> IO SDL_InitFlags)
+sDL_WasInit =
+  BG.unsafePerformIO hs_bindgen_53dd2f1aac19a298
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_Quit@
+foreign import ccall unsafe "hs_bindgen_9b631cb78cf1671f"
+  hs_bindgen_9b631cb78cf1671f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_Quit@
+hs_bindgen_9b631cb78cf1671f :: IO (BG.FunPtr (IO ()))
+hs_bindgen_9b631cb78cf1671f =
+  BG.fromFFIType hs_bindgen_9b631cb78cf1671f_base
+
+{-# NOINLINE sDL_Quit #-}
+
+-- | Clean up all initialized subsystems.
+--
+--     You should call this function even if you have already shutdown each initialized subsystem with @SDL_QuitSubSystem()@. It is safe to call this function even in the case of errors in initialization.
+--
+--     You can use this function with atexit() to ensure that it is run when your application is shutdown, but it is not wise to do this from a library or other dynamically loaded code.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Init', 'sDL_QuitSubSystem'
+--
+--     [C declaration]: @SDL_Quit@, defined at @SDL3\/SDL_init.h 310:34@
+sDL_Quit :: BG.FunPtr (IO ())
+sDL_Quit =
+  BG.unsafePerformIO hs_bindgen_9b631cb78cf1671f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_IsMainThread@
+foreign import ccall unsafe "hs_bindgen_a902ff5ab130bb25"
+  hs_bindgen_a902ff5ab130bb25_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_IsMainThread@
+hs_bindgen_a902ff5ab130bb25 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_a902ff5ab130bb25 =
+  BG.fromFFIType hs_bindgen_a902ff5ab130bb25_base
+
+{-# NOINLINE sDL_IsMainThread #-}
+
+-- | Return whether this is the main thread.
+--
+--     On Apple platforms, the main thread is the thread that runs your program\'s main() entry point. On other platforms, the main thread is the one that calls SDL_Init(SDL_INIT_VIDEO), which should usually be the one that runs your program\'s main() entry point. If you are using the main callbacks, SDL_AppInit(), SDL_AppIterate(), and SDL_AppQuit() are all called on the main thread.
+--
+--     [Returns]: true if this thread is the main thread, or false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunOnMainThread'
+--
+--     [C declaration]: @SDL_IsMainThread@, defined at @SDL3\/SDL_init.h 330:34@
+sDL_IsMainThread :: BG.FunPtr (IO BG.CBool)
+sDL_IsMainThread =
+  BG.unsafePerformIO hs_bindgen_a902ff5ab130bb25
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_RunOnMainThread@
+foreign import ccall unsafe "hs_bindgen_1cff011229869063"
+  hs_bindgen_1cff011229869063_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_RunOnMainThread@
+hs_bindgen_1cff011229869063
+  :: IO (BG.FunPtr (SDL_MainThreadCallback -> BG.Ptr BG.Void -> BG.CBool -> IO BG.CBool))
+hs_bindgen_1cff011229869063 =
+  BG.fromFFIType hs_bindgen_1cff011229869063_base
+
+{-# NOINLINE sDL_RunOnMainThread #-}
+
+-- | Call a function on the main thread during event processing.
+--
+--     If this is called on the main thread, the callback is executed immediately. If this is called on another thread, this callback is queued for execution on the main thread during event processing.
+--
+--     Be careful of deadlocks when using this functionality. You should not have the main thread wait for the current thread while this function is being called with @wait_complete@ true.
+--
+--     [@callback@]: the callback to call on the main thread.
+--
+--     [@userdata@]: a pointer that is passed to @callback@.
+--
+--     [@wait_complete@]: true to wait for the callback to complete, false to return immediately.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_IsMainThread'
+--
+--     [C declaration]: @SDL_RunOnMainThread@, defined at @SDL3\/SDL_init.h 367:34@
+sDL_RunOnMainThread
+  :: BG.FunPtr (SDL_MainThreadCallback -> BG.Ptr BG.Void -> BG.CBool -> IO BG.CBool)
+sDL_RunOnMainThread =
+  BG.unsafePerformIO hs_bindgen_1cff011229869063
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_SetAppMetadata@
+foreign import ccall unsafe "hs_bindgen_7a68851346541d78"
+  hs_bindgen_7a68851346541d78_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_SetAppMetadata@
+hs_bindgen_7a68851346541d78
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_7a68851346541d78 =
+  BG.fromFFIType hs_bindgen_7a68851346541d78_base
+
+{-# NOINLINE sDL_SetAppMetadata #-}
+
+-- | Specify basic metadata about your app.
+--
+--     You can optionally provide metadata about your app to SDL. This is not required, but strongly encouraged.
+--
+--     There are several locations where SDL can make use of metadata (an \"About\" box in the macOS menu bar, the name of the app can be shown on some audio mixers, etc). Any piece of metadata can be left as NULL, if a specific detail doesn\'t make sense for the app.
+--
+--     This function should be called as early as possible, before SDL_Init. Multiple calls to this function are allowed, but various state might not change once it has been set up with a previous call to this function.
+--
+--     Passing a NULL removes any previous metadata.
+--
+--     This is a simplified interface for the most important information. You can supply significantly more detailed metadata with @SDL_SetAppMetadataProperty()@.
+--
+--     [@appname@]: The name of the application (\"My Game 2: Bad Guy\'s Revenge!\").
+--
+--     [@appversion@]: The version of the application (\"1.0.0beta5\" or a git hash, or whatever makes sense).
+--
+--     [@appidentifier@]: A unique string in reverse-domain format that identifies this app (\"com.example.mygame2\").
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAppMetadataProperty'
+--
+--     [C declaration]: @SDL_SetAppMetadata@, defined at @SDL3\/SDL_init.h 405:34@
+sDL_SetAppMetadata
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> IO BG.CBool
+       )
+sDL_SetAppMetadata =
+  BG.unsafePerformIO hs_bindgen_7a68851346541d78
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_SetAppMetadataProperty@
+foreign import ccall unsafe "hs_bindgen_d0081e390d662467"
+  hs_bindgen_d0081e390d662467_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_SetAppMetadataProperty@
+hs_bindgen_d0081e390d662467
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_d0081e390d662467 =
+  BG.fromFFIType hs_bindgen_d0081e390d662467_base
+
+{-# NOINLINE sDL_SetAppMetadataProperty #-}
+
+-- | Specify metadata about your app through a set of properties.
+--
+--     You can optionally provide metadata about your app to SDL. This is not required, but strongly encouraged.
+--
+--     There are several locations where SDL can make use of metadata (an \"About\" box in the macOS menu bar, the name of the app can be shown on some audio mixers, etc). Any piece of metadata can be left out, if a specific detail doesn\'t make sense for the app.
+--
+--     This function should be called as early as possible, before SDL_Init. Multiple calls to this function are allowed, but various state might not change once it has been set up with a previous call to this function.
+--
+--     Once set, this metadata can be read using @SDL_GetAppMetadataProperty()@.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_APP_METADATA_NAME_STRING'@: The human-readable name of the application, like \"My Game 2: Bad Guy\'s Revenge!\". This will show up anywhere the OS shows the name of the application separately from window titles, such as volume control applets, etc. This defaults to \"SDL Application\".
+--
+--     * @'sDL_PROP_APP_METADATA_VERSION_STRING'@: The version of the app that is running; there are no rules on format, so \"1.0.3beta2\" and \"April 22nd, 2024\" and a git hash are all valid options. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_IDENTIFIER_STRING'@: A unique string that identifies this app. This must be in reverse-domain format, like \"com.example.mygame2\". This string is used by desktop compositors to identify and group windows together, as well as match applications with associated desktop settings and icons. If you plan to package your application in a container such as Flatpak, the app ID should match the name of your Flatpak container as well. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_CREATOR_STRING'@: The human-readable name of the creator\/developer\/maker of this app, like \"MojoWorkshop, LLC\"
+--
+--     * @'sDL_PROP_APP_METADATA_COPYRIGHT_STRING'@: The human-readable copyright notice, like \"Copyright (c) 2024 MojoWorkshop, LLC\" or whatnot. Keep this to one line, don\'t paste a copy of a whole software license in here. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_URL_STRING'@: A URL to the app on the web. Maybe a product page, or a storefront, or even a GitHub repository, for user\'s further information This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_TYPE_STRING'@: The type of application this is. Currently this string can be \"game\" for a video game, \"mediaplayer\" for a media player, or generically \"application\" if nothing else applies. Future versions of SDL might add new types. This defaults to \"application\".
+--
+--     [@name@]: the name of the metadata property to set.
+--
+--     [@value@]: the value of the property, or NULL to remove that property.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAppMetadataProperty', 'sDL_SetAppMetadata'
+--
+--     [C declaration]: @SDL_SetAppMetadataProperty@, defined at @SDL3\/SDL_init.h 468:34@
+sDL_SetAppMetadataProperty
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SetAppMetadataProperty =
+  BG.unsafePerformIO hs_bindgen_d0081e390d662467
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_GetAppMetadataProperty@
+foreign import ccall unsafe "hs_bindgen_fdbd2caae5327fdc"
+  hs_bindgen_fdbd2caae5327fdc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_get_SDL_GetAppMetadataProperty@
+hs_bindgen_fdbd2caae5327fdc
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_fdbd2caae5327fdc =
+  BG.fromFFIType hs_bindgen_fdbd2caae5327fdc_base
+
+{-# NOINLINE sDL_GetAppMetadataProperty #-}
+
+-- | Get metadata about your app.
+--
+--     This returns metadata previously set using @SDL_SetAppMetadata()@ or @SDL_SetAppMetadataProperty()@. See @SDL_SetAppMetadataProperty()@ for the list of available properties and their meanings.
+--
+--     [@name@]: the name of the metadata property to get.
+--
+--     [Returns]: the current value of the metadata property, or the default if it is not set, NULL for properties with no default.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the string returned is not protected and could potentially be freed if you call @SDL_SetAppMetadataProperty()@ to set that property from another thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAppMetadata', 'sDL_SetAppMetadataProperty'
+--
+--     [C declaration]: @SDL_GetAppMetadataProperty@, defined at @SDL3\/SDL_init.h 499:42@
+sDL_GetAppMetadataProperty
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetAppMetadataProperty =
+  BG.unsafePerformIO hs_bindgen_fdbd2caae5327fdc
diff --git a/src/SDL3/Sys/Bindgen/Init/Safe.hs b/src/SDL3/Sys/Bindgen/Init/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Init/Safe.hs
@@ -0,0 +1,500 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Init.Safe (
+  SDL3.Sys.Bindgen.Init.Safe.sDL_Init,
+  SDL3.Sys.Bindgen.Init.Safe.sDL_InitSubSystem,
+  SDL3.Sys.Bindgen.Init.Safe.sDL_QuitSubSystem,
+  SDL3.Sys.Bindgen.Init.Safe.sDL_WasInit,
+  SDL3.Sys.Bindgen.Init.Safe.sDL_Quit,
+  SDL3.Sys.Bindgen.Init.Safe.sDL_IsMainThread,
+  SDL3.Sys.Bindgen.Init.Safe.sDL_RunOnMainThread,
+  SDL3.Sys.Bindgen.Init.Safe.sDL_SetAppMetadata,
+  SDL3.Sys.Bindgen.Init.Safe.sDL_SetAppMetadataProperty,
+  SDL3.Sys.Bindgen.Init.Safe.sDL_GetAppMetadataProperty,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Init
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_init.h>"
+         , "_Bool hs_bindgen_cce05a9def0ccffc ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_Init)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_7c583c295e3b8523 ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_InitSubSystem)(arg1);"
+         , "}"
+         , "void hs_bindgen_c31cb1c8dc07319b ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  (SDL_QuitSubSystem)(arg1);"
+         , "}"
+         , "SDL_InitFlags hs_bindgen_6d57cac3c583d674 ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_WasInit)(arg1);"
+         , "}"
+         , "void hs_bindgen_96d0ac915668fb34 (void)"
+         , "{"
+         , "  (SDL_Quit)();"
+         , "}"
+         , "_Bool hs_bindgen_45b2d9eafd0eabc3 (void)"
+         , "{"
+         , "  return (SDL_IsMainThread)();"
+         , "}"
+         , "_Bool hs_bindgen_d86c3ceed06f5ebf ("
+         , "  SDL_MainThreadCallback arg1,"
+         , "  void *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RunOnMainThread)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_d087dffccd50b723 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAppMetadata)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_85f726d170efe2ac ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAppMetadataProperty)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_0affadab10f86eb8 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAppMetadataProperty)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_Init@
+foreign import ccall safe "hs_bindgen_cce05a9def0ccffc"
+  hs_bindgen_cce05a9def0ccffc_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_Init@
+hs_bindgen_cce05a9def0ccffc
+  :: SDL_InitFlags
+  -> IO BG.CBool
+hs_bindgen_cce05a9def0ccffc =
+  BG.fromFFIType hs_bindgen_cce05a9def0ccffc_base
+
+-- | Initialize the SDL library.
+--
+--     @SDL_Init()@ simply forwards to calling @SDL_InitSubSystem()@. Therefore, the two may be used interchangeably. Though for readability of your code @SDL_InitSubSystem()@ might be preferred.
+--
+--     The file I\/O (for example: SDL_IOFromFile) and threading (SDL_CreateThread) subsystems are initialized by default. Message boxes (SDL_ShowSimpleMessageBox) also attempt to work without initializing the video subsystem, in hopes of being useful in showing an error dialog when SDL_Init fails. You must specifically initialize other subsystems if you use them in your application.
+--
+--     Logging (such as SDL_Log) works without initialization, too.
+--
+--     @flags@ may be any of the following OR\'d together:
+--
+--     * @'sDL_INIT_AUDIO'@: audio subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_VIDEO'@: video subsystem; automatically initializes the events subsystem, should be initialized on the main thread.
+--
+--     * @'sDL_INIT_JOYSTICK'@: joystick subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_HAPTIC'@: haptic (force feedback) subsystem
+--
+--     * @'sDL_INIT_GAMEPAD'@: gamepad subsystem; automatically initializes the joystick subsystem
+--
+--     * @'sDL_INIT_EVENTS'@: events subsystem
+--
+--     * @'sDL_INIT_SENSOR'@: sensor subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_CAMERA'@: camera subsystem; automatically initializes the events subsystem
+--
+--     Subsystem initialization is ref-counted, you must call @SDL_QuitSubSystem()@ for each @SDL_InitSubSystem()@ to correctly shutdown a subsystem manually (or call @SDL_Quit()@ to force shutdown). If a subsystem is already loaded then this call will increase the ref-count and return.
+--
+--     Consider reporting some basic metadata about your application before calling SDL_Init, using either @SDL_SetAppMetadata()@ or @SDL_SetAppMetadataProperty()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAppMetadata', 'sDL_SetAppMetadataProperty', 'sDL_InitSubSystem', 'sDL_Quit', SDL_SetMainReady, 'sDL_WasInit'
+--
+--     [C declaration]: @SDL_Init@, defined at @SDL3\/SDL_init.h 238:34@
+sDL_Init
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: subsystem initialization flags.
+  -> IO BG.CBool
+sDL_Init = hs_bindgen_cce05a9def0ccffc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_InitSubSystem@
+foreign import ccall safe "hs_bindgen_7c583c295e3b8523"
+  hs_bindgen_7c583c295e3b8523_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_InitSubSystem@
+hs_bindgen_7c583c295e3b8523
+  :: SDL_InitFlags
+  -> IO BG.CBool
+hs_bindgen_7c583c295e3b8523 =
+  BG.fromFFIType hs_bindgen_7c583c295e3b8523_base
+
+-- | Compatibility function to initialize the SDL library.
+--
+--     This function and @SDL_Init()@ are interchangeable.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Init', 'sDL_Quit', 'sDL_QuitSubSystem'
+--
+--     [C declaration]: @SDL_InitSubSystem@, defined at @SDL3\/SDL_init.h 257:34@
+sDL_InitSubSystem
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @SDL_Init()@; see SDL_Init for details.
+  -> IO BG.CBool
+sDL_InitSubSystem = hs_bindgen_7c583c295e3b8523
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_QuitSubSystem@
+foreign import ccall safe "hs_bindgen_c31cb1c8dc07319b"
+  hs_bindgen_c31cb1c8dc07319b_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_QuitSubSystem@
+hs_bindgen_c31cb1c8dc07319b
+  :: SDL_InitFlags
+  -> IO ()
+hs_bindgen_c31cb1c8dc07319b =
+  BG.fromFFIType hs_bindgen_c31cb1c8dc07319b_base
+
+-- | Shut down specific SDL subsystems.
+--
+--     You still need to call @SDL_Quit()@ even if you close all open subsystems with @SDL_QuitSubSystem()@.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InitSubSystem', 'sDL_Quit'
+--
+--     [C declaration]: @SDL_QuitSubSystem@, defined at @SDL3\/SDL_init.h 274:34@
+sDL_QuitSubSystem
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @SDL_Init()@; see SDL_Init for details.
+  -> IO ()
+sDL_QuitSubSystem = hs_bindgen_c31cb1c8dc07319b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_WasInit@
+foreign import ccall safe "hs_bindgen_6d57cac3c583d674"
+  hs_bindgen_6d57cac3c583d674_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_WasInit@
+hs_bindgen_6d57cac3c583d674
+  :: SDL_InitFlags
+  -> IO SDL_InitFlags
+hs_bindgen_6d57cac3c583d674 =
+  BG.fromFFIType hs_bindgen_6d57cac3c583d674_base
+
+-- | Get a mask of the specified subsystems which are currently initialized.
+--
+--     [Returns]: a mask of all initialized subsystems if @flags@ is 0, otherwise it returns the initialization status of the specified subsystems.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Init', 'sDL_InitSubSystem'
+--
+--     [C declaration]: @SDL_WasInit@, defined at @SDL3\/SDL_init.h 290:43@
+sDL_WasInit
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @SDL_Init()@; see SDL_Init for details.
+  -> IO SDL_InitFlags
+sDL_WasInit = hs_bindgen_6d57cac3c583d674
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_Quit@
+foreign import ccall safe "hs_bindgen_96d0ac915668fb34"
+  hs_bindgen_96d0ac915668fb34_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_Quit@
+hs_bindgen_96d0ac915668fb34 :: IO ()
+hs_bindgen_96d0ac915668fb34 =
+  BG.fromFFIType hs_bindgen_96d0ac915668fb34_base
+
+-- | Clean up all initialized subsystems.
+--
+--     You should call this function even if you have already shutdown each initialized subsystem with @SDL_QuitSubSystem()@. It is safe to call this function even in the case of errors in initialization.
+--
+--     You can use this function with atexit() to ensure that it is run when your application is shutdown, but it is not wise to do this from a library or other dynamically loaded code.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Init', 'sDL_QuitSubSystem'
+--
+--     [C declaration]: @SDL_Quit@, defined at @SDL3\/SDL_init.h 310:34@
+sDL_Quit :: IO ()
+sDL_Quit = hs_bindgen_96d0ac915668fb34
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_IsMainThread@
+foreign import ccall safe "hs_bindgen_45b2d9eafd0eabc3"
+  hs_bindgen_45b2d9eafd0eabc3_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_IsMainThread@
+hs_bindgen_45b2d9eafd0eabc3 :: IO BG.CBool
+hs_bindgen_45b2d9eafd0eabc3 =
+  BG.fromFFIType hs_bindgen_45b2d9eafd0eabc3_base
+
+-- | Return whether this is the main thread.
+--
+--     On Apple platforms, the main thread is the thread that runs your program\'s main() entry point. On other platforms, the main thread is the one that calls SDL_Init(SDL_INIT_VIDEO), which should usually be the one that runs your program\'s main() entry point. If you are using the main callbacks, SDL_AppInit(), SDL_AppIterate(), and SDL_AppQuit() are all called on the main thread.
+--
+--     [Returns]: true if this thread is the main thread, or false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunOnMainThread'
+--
+--     [C declaration]: @SDL_IsMainThread@, defined at @SDL3\/SDL_init.h 330:34@
+sDL_IsMainThread :: IO BG.CBool
+sDL_IsMainThread = hs_bindgen_45b2d9eafd0eabc3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_RunOnMainThread@
+foreign import ccall safe "hs_bindgen_d86c3ceed06f5ebf"
+  hs_bindgen_d86c3ceed06f5ebf_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_RunOnMainThread@
+hs_bindgen_d86c3ceed06f5ebf
+  :: SDL_MainThreadCallback
+  -> BG.Ptr BG.Void
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_d86c3ceed06f5ebf =
+  BG.fromFFIType hs_bindgen_d86c3ceed06f5ebf_base
+
+-- | Call a function on the main thread during event processing.
+--
+--     If this is called on the main thread, the callback is executed immediately. If this is called on another thread, this callback is queued for execution on the main thread during event processing.
+--
+--     Be careful of deadlocks when using this functionality. You should not have the main thread wait for the current thread while this function is being called with @wait_complete@ true.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_IsMainThread'
+--
+--     [C declaration]: @SDL_RunOnMainThread@, defined at @SDL3\/SDL_init.h 367:34@
+sDL_RunOnMainThread
+  :: SDL_MainThreadCallback
+  -- ^
+  --
+  --           [@callback@]: the callback to call on the main thread.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@wait_complete@]: true to wait for the callback to complete, false to return immediately.
+  -> IO BG.CBool
+sDL_RunOnMainThread = hs_bindgen_d86c3ceed06f5ebf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_SetAppMetadata@
+foreign import ccall safe "hs_bindgen_d087dffccd50b723"
+  hs_bindgen_d087dffccd50b723_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_SetAppMetadata@
+hs_bindgen_d087dffccd50b723
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_d087dffccd50b723 =
+  BG.fromFFIType hs_bindgen_d087dffccd50b723_base
+
+-- | Specify basic metadata about your app.
+--
+--     You can optionally provide metadata about your app to SDL. This is not required, but strongly encouraged.
+--
+--     There are several locations where SDL can make use of metadata (an \"About\" box in the macOS menu bar, the name of the app can be shown on some audio mixers, etc). Any piece of metadata can be left as NULL, if a specific detail doesn\'t make sense for the app.
+--
+--     This function should be called as early as possible, before SDL_Init. Multiple calls to this function are allowed, but various state might not change once it has been set up with a previous call to this function.
+--
+--     Passing a NULL removes any previous metadata.
+--
+--     This is a simplified interface for the most important information. You can supply significantly more detailed metadata with @SDL_SetAppMetadataProperty()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAppMetadataProperty'
+--
+--     [C declaration]: @SDL_SetAppMetadata@, defined at @SDL3\/SDL_init.h 405:34@
+sDL_SetAppMetadata
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appname@]: The name of the application (\"My Game 2: Bad Guy\'s Revenge!\").
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appversion@]: The version of the application (\"1.0.0beta5\" or a git hash, or whatever makes sense).
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appidentifier@]: A unique string in reverse-domain format that identifies this app (\"com.example.mygame2\").
+  -> IO BG.CBool
+sDL_SetAppMetadata = hs_bindgen_d087dffccd50b723
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_SetAppMetadataProperty@
+foreign import ccall safe "hs_bindgen_85f726d170efe2ac"
+  hs_bindgen_85f726d170efe2ac_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_SetAppMetadataProperty@
+hs_bindgen_85f726d170efe2ac
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_85f726d170efe2ac =
+  BG.fromFFIType hs_bindgen_85f726d170efe2ac_base
+
+-- | Specify metadata about your app through a set of properties.
+--
+--     You can optionally provide metadata about your app to SDL. This is not required, but strongly encouraged.
+--
+--     There are several locations where SDL can make use of metadata (an \"About\" box in the macOS menu bar, the name of the app can be shown on some audio mixers, etc). Any piece of metadata can be left out, if a specific detail doesn\'t make sense for the app.
+--
+--     This function should be called as early as possible, before SDL_Init. Multiple calls to this function are allowed, but various state might not change once it has been set up with a previous call to this function.
+--
+--     Once set, this metadata can be read using @SDL_GetAppMetadataProperty()@.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_APP_METADATA_NAME_STRING'@: The human-readable name of the application, like \"My Game 2: Bad Guy\'s Revenge!\". This will show up anywhere the OS shows the name of the application separately from window titles, such as volume control applets, etc. This defaults to \"SDL Application\".
+--
+--     * @'sDL_PROP_APP_METADATA_VERSION_STRING'@: The version of the app that is running; there are no rules on format, so \"1.0.3beta2\" and \"April 22nd, 2024\" and a git hash are all valid options. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_IDENTIFIER_STRING'@: A unique string that identifies this app. This must be in reverse-domain format, like \"com.example.mygame2\". This string is used by desktop compositors to identify and group windows together, as well as match applications with associated desktop settings and icons. If you plan to package your application in a container such as Flatpak, the app ID should match the name of your Flatpak container as well. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_CREATOR_STRING'@: The human-readable name of the creator\/developer\/maker of this app, like \"MojoWorkshop, LLC\"
+--
+--     * @'sDL_PROP_APP_METADATA_COPYRIGHT_STRING'@: The human-readable copyright notice, like \"Copyright (c) 2024 MojoWorkshop, LLC\" or whatnot. Keep this to one line, don\'t paste a copy of a whole software license in here. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_URL_STRING'@: A URL to the app on the web. Maybe a product page, or a storefront, or even a GitHub repository, for user\'s further information This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_TYPE_STRING'@: The type of application this is. Currently this string can be \"game\" for a video game, \"mediaplayer\" for a media player, or generically \"application\" if nothing else applies. Future versions of SDL might add new types. This defaults to \"application\".
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAppMetadataProperty', 'sDL_SetAppMetadata'
+--
+--     [C declaration]: @SDL_SetAppMetadataProperty@, defined at @SDL3\/SDL_init.h 468:34@
+sDL_SetAppMetadataProperty
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the metadata property to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the property, or NULL to remove that property.
+  -> IO BG.CBool
+sDL_SetAppMetadataProperty =
+  hs_bindgen_85f726d170efe2ac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_GetAppMetadataProperty@
+foreign import ccall safe "hs_bindgen_0affadab10f86eb8"
+  hs_bindgen_0affadab10f86eb8_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Safe_SDL_GetAppMetadataProperty@
+hs_bindgen_0affadab10f86eb8
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_0affadab10f86eb8 =
+  BG.fromFFIType hs_bindgen_0affadab10f86eb8_base
+
+-- | Get metadata about your app.
+--
+--     This returns metadata previously set using @SDL_SetAppMetadata()@ or @SDL_SetAppMetadataProperty()@. See @SDL_SetAppMetadataProperty()@ for the list of available properties and their meanings.
+--
+--     [Returns]: the current value of the metadata property, or the default if it is not set, NULL for properties with no default.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the string returned is not protected and could potentially be freed if you call @SDL_SetAppMetadataProperty()@ to set that property from another thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAppMetadata', 'sDL_SetAppMetadataProperty'
+--
+--     [C declaration]: @SDL_GetAppMetadataProperty@, defined at @SDL3\/SDL_init.h 499:42@
+sDL_GetAppMetadataProperty
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the metadata property to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetAppMetadataProperty =
+  hs_bindgen_0affadab10f86eb8
diff --git a/src/SDL3/Sys/Bindgen/Init/Unsafe.hs b/src/SDL3/Sys/Bindgen/Init/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Init/Unsafe.hs
@@ -0,0 +1,500 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Init.Unsafe (
+  SDL3.Sys.Bindgen.Init.Unsafe.sDL_Init,
+  SDL3.Sys.Bindgen.Init.Unsafe.sDL_InitSubSystem,
+  SDL3.Sys.Bindgen.Init.Unsafe.sDL_QuitSubSystem,
+  SDL3.Sys.Bindgen.Init.Unsafe.sDL_WasInit,
+  SDL3.Sys.Bindgen.Init.Unsafe.sDL_Quit,
+  SDL3.Sys.Bindgen.Init.Unsafe.sDL_IsMainThread,
+  SDL3.Sys.Bindgen.Init.Unsafe.sDL_RunOnMainThread,
+  SDL3.Sys.Bindgen.Init.Unsafe.sDL_SetAppMetadata,
+  SDL3.Sys.Bindgen.Init.Unsafe.sDL_SetAppMetadataProperty,
+  SDL3.Sys.Bindgen.Init.Unsafe.sDL_GetAppMetadataProperty,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Init
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_init.h>"
+         , "_Bool hs_bindgen_3146d3eb9a1aad3e ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_Init)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_57954ca9dc375557 ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_InitSubSystem)(arg1);"
+         , "}"
+         , "void hs_bindgen_5d9dc091dfdc8bd7 ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  (SDL_QuitSubSystem)(arg1);"
+         , "}"
+         , "SDL_InitFlags hs_bindgen_5abb235ceb2564c2 ("
+         , "  SDL_InitFlags arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_WasInit)(arg1);"
+         , "}"
+         , "void hs_bindgen_d99f89f24c86653e (void)"
+         , "{"
+         , "  (SDL_Quit)();"
+         , "}"
+         , "_Bool hs_bindgen_d6dd8b3588afcaaa (void)"
+         , "{"
+         , "  return (SDL_IsMainThread)();"
+         , "}"
+         , "_Bool hs_bindgen_886c10728e9044d1 ("
+         , "  SDL_MainThreadCallback arg1,"
+         , "  void *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RunOnMainThread)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_7113951a96cf8697 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAppMetadata)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_f74424c7b29a0aec ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetAppMetadataProperty)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_564623fbc2006948 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetAppMetadataProperty)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_Init@
+foreign import ccall unsafe "hs_bindgen_3146d3eb9a1aad3e"
+  hs_bindgen_3146d3eb9a1aad3e_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_Init@
+hs_bindgen_3146d3eb9a1aad3e
+  :: SDL_InitFlags
+  -> IO BG.CBool
+hs_bindgen_3146d3eb9a1aad3e =
+  BG.fromFFIType hs_bindgen_3146d3eb9a1aad3e_base
+
+-- | Initialize the SDL library.
+--
+--     @SDL_Init()@ simply forwards to calling @SDL_InitSubSystem()@. Therefore, the two may be used interchangeably. Though for readability of your code @SDL_InitSubSystem()@ might be preferred.
+--
+--     The file I\/O (for example: SDL_IOFromFile) and threading (SDL_CreateThread) subsystems are initialized by default. Message boxes (SDL_ShowSimpleMessageBox) also attempt to work without initializing the video subsystem, in hopes of being useful in showing an error dialog when SDL_Init fails. You must specifically initialize other subsystems if you use them in your application.
+--
+--     Logging (such as SDL_Log) works without initialization, too.
+--
+--     @flags@ may be any of the following OR\'d together:
+--
+--     * @'sDL_INIT_AUDIO'@: audio subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_VIDEO'@: video subsystem; automatically initializes the events subsystem, should be initialized on the main thread.
+--
+--     * @'sDL_INIT_JOYSTICK'@: joystick subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_HAPTIC'@: haptic (force feedback) subsystem
+--
+--     * @'sDL_INIT_GAMEPAD'@: gamepad subsystem; automatically initializes the joystick subsystem
+--
+--     * @'sDL_INIT_EVENTS'@: events subsystem
+--
+--     * @'sDL_INIT_SENSOR'@: sensor subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_CAMERA'@: camera subsystem; automatically initializes the events subsystem
+--
+--     Subsystem initialization is ref-counted, you must call @SDL_QuitSubSystem()@ for each @SDL_InitSubSystem()@ to correctly shutdown a subsystem manually (or call @SDL_Quit()@ to force shutdown). If a subsystem is already loaded then this call will increase the ref-count and return.
+--
+--     Consider reporting some basic metadata about your application before calling SDL_Init, using either @SDL_SetAppMetadata()@ or @SDL_SetAppMetadataProperty()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAppMetadata', 'sDL_SetAppMetadataProperty', 'sDL_InitSubSystem', 'sDL_Quit', SDL_SetMainReady, 'sDL_WasInit'
+--
+--     [C declaration]: @SDL_Init@, defined at @SDL3\/SDL_init.h 238:34@
+sDL_Init
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: subsystem initialization flags.
+  -> IO BG.CBool
+sDL_Init = hs_bindgen_3146d3eb9a1aad3e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_InitSubSystem@
+foreign import ccall unsafe "hs_bindgen_57954ca9dc375557"
+  hs_bindgen_57954ca9dc375557_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_InitSubSystem@
+hs_bindgen_57954ca9dc375557
+  :: SDL_InitFlags
+  -> IO BG.CBool
+hs_bindgen_57954ca9dc375557 =
+  BG.fromFFIType hs_bindgen_57954ca9dc375557_base
+
+-- | Compatibility function to initialize the SDL library.
+--
+--     This function and @SDL_Init()@ are interchangeable.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Init', 'sDL_Quit', 'sDL_QuitSubSystem'
+--
+--     [C declaration]: @SDL_InitSubSystem@, defined at @SDL3\/SDL_init.h 257:34@
+sDL_InitSubSystem
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @SDL_Init()@; see SDL_Init for details.
+  -> IO BG.CBool
+sDL_InitSubSystem = hs_bindgen_57954ca9dc375557
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_QuitSubSystem@
+foreign import ccall unsafe "hs_bindgen_5d9dc091dfdc8bd7"
+  hs_bindgen_5d9dc091dfdc8bd7_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_QuitSubSystem@
+hs_bindgen_5d9dc091dfdc8bd7
+  :: SDL_InitFlags
+  -> IO ()
+hs_bindgen_5d9dc091dfdc8bd7 =
+  BG.fromFFIType hs_bindgen_5d9dc091dfdc8bd7_base
+
+-- | Shut down specific SDL subsystems.
+--
+--     You still need to call @SDL_Quit()@ even if you close all open subsystems with @SDL_QuitSubSystem()@.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InitSubSystem', 'sDL_Quit'
+--
+--     [C declaration]: @SDL_QuitSubSystem@, defined at @SDL3\/SDL_init.h 274:34@
+sDL_QuitSubSystem
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @SDL_Init()@; see SDL_Init for details.
+  -> IO ()
+sDL_QuitSubSystem = hs_bindgen_5d9dc091dfdc8bd7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_WasInit@
+foreign import ccall unsafe "hs_bindgen_5abb235ceb2564c2"
+  hs_bindgen_5abb235ceb2564c2_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_WasInit@
+hs_bindgen_5abb235ceb2564c2
+  :: SDL_InitFlags
+  -> IO SDL_InitFlags
+hs_bindgen_5abb235ceb2564c2 =
+  BG.fromFFIType hs_bindgen_5abb235ceb2564c2_base
+
+-- | Get a mask of the specified subsystems which are currently initialized.
+--
+--     [Returns]: a mask of all initialized subsystems if @flags@ is 0, otherwise it returns the initialization status of the specified subsystems.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Init', 'sDL_InitSubSystem'
+--
+--     [C declaration]: @SDL_WasInit@, defined at @SDL3\/SDL_init.h 290:43@
+sDL_WasInit
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @SDL_Init()@; see SDL_Init for details.
+  -> IO SDL_InitFlags
+sDL_WasInit = hs_bindgen_5abb235ceb2564c2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_Quit@
+foreign import ccall unsafe "hs_bindgen_d99f89f24c86653e"
+  hs_bindgen_d99f89f24c86653e_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_Quit@
+hs_bindgen_d99f89f24c86653e :: IO ()
+hs_bindgen_d99f89f24c86653e =
+  BG.fromFFIType hs_bindgen_d99f89f24c86653e_base
+
+-- | Clean up all initialized subsystems.
+--
+--     You should call this function even if you have already shutdown each initialized subsystem with @SDL_QuitSubSystem()@. It is safe to call this function even in the case of errors in initialization.
+--
+--     You can use this function with atexit() to ensure that it is run when your application is shutdown, but it is not wise to do this from a library or other dynamically loaded code.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Init', 'sDL_QuitSubSystem'
+--
+--     [C declaration]: @SDL_Quit@, defined at @SDL3\/SDL_init.h 310:34@
+sDL_Quit :: IO ()
+sDL_Quit = hs_bindgen_d99f89f24c86653e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_IsMainThread@
+foreign import ccall unsafe "hs_bindgen_d6dd8b3588afcaaa"
+  hs_bindgen_d6dd8b3588afcaaa_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_IsMainThread@
+hs_bindgen_d6dd8b3588afcaaa :: IO BG.CBool
+hs_bindgen_d6dd8b3588afcaaa =
+  BG.fromFFIType hs_bindgen_d6dd8b3588afcaaa_base
+
+-- | Return whether this is the main thread.
+--
+--     On Apple platforms, the main thread is the thread that runs your program\'s main() entry point. On other platforms, the main thread is the one that calls SDL_Init(SDL_INIT_VIDEO), which should usually be the one that runs your program\'s main() entry point. If you are using the main callbacks, SDL_AppInit(), SDL_AppIterate(), and SDL_AppQuit() are all called on the main thread.
+--
+--     [Returns]: true if this thread is the main thread, or false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RunOnMainThread'
+--
+--     [C declaration]: @SDL_IsMainThread@, defined at @SDL3\/SDL_init.h 330:34@
+sDL_IsMainThread :: IO BG.CBool
+sDL_IsMainThread = hs_bindgen_d6dd8b3588afcaaa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_RunOnMainThread@
+foreign import ccall unsafe "hs_bindgen_886c10728e9044d1"
+  hs_bindgen_886c10728e9044d1_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_RunOnMainThread@
+hs_bindgen_886c10728e9044d1
+  :: SDL_MainThreadCallback
+  -> BG.Ptr BG.Void
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_886c10728e9044d1 =
+  BG.fromFFIType hs_bindgen_886c10728e9044d1_base
+
+-- | Call a function on the main thread during event processing.
+--
+--     If this is called on the main thread, the callback is executed immediately. If this is called on another thread, this callback is queued for execution on the main thread during event processing.
+--
+--     Be careful of deadlocks when using this functionality. You should not have the main thread wait for the current thread while this function is being called with @wait_complete@ true.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_IsMainThread'
+--
+--     [C declaration]: @SDL_RunOnMainThread@, defined at @SDL3\/SDL_init.h 367:34@
+sDL_RunOnMainThread
+  :: SDL_MainThreadCallback
+  -- ^
+  --
+  --           [@callback@]: the callback to call on the main thread.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@wait_complete@]: true to wait for the callback to complete, false to return immediately.
+  -> IO BG.CBool
+sDL_RunOnMainThread = hs_bindgen_886c10728e9044d1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_SetAppMetadata@
+foreign import ccall unsafe "hs_bindgen_7113951a96cf8697"
+  hs_bindgen_7113951a96cf8697_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_SetAppMetadata@
+hs_bindgen_7113951a96cf8697
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_7113951a96cf8697 =
+  BG.fromFFIType hs_bindgen_7113951a96cf8697_base
+
+-- | Specify basic metadata about your app.
+--
+--     You can optionally provide metadata about your app to SDL. This is not required, but strongly encouraged.
+--
+--     There are several locations where SDL can make use of metadata (an \"About\" box in the macOS menu bar, the name of the app can be shown on some audio mixers, etc). Any piece of metadata can be left as NULL, if a specific detail doesn\'t make sense for the app.
+--
+--     This function should be called as early as possible, before SDL_Init. Multiple calls to this function are allowed, but various state might not change once it has been set up with a previous call to this function.
+--
+--     Passing a NULL removes any previous metadata.
+--
+--     This is a simplified interface for the most important information. You can supply significantly more detailed metadata with @SDL_SetAppMetadataProperty()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAppMetadataProperty'
+--
+--     [C declaration]: @SDL_SetAppMetadata@, defined at @SDL3\/SDL_init.h 405:34@
+sDL_SetAppMetadata
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appname@]: The name of the application (\"My Game 2: Bad Guy\'s Revenge!\").
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appversion@]: The version of the application (\"1.0.0beta5\" or a git hash, or whatever makes sense).
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appidentifier@]: A unique string in reverse-domain format that identifies this app (\"com.example.mygame2\").
+  -> IO BG.CBool
+sDL_SetAppMetadata = hs_bindgen_7113951a96cf8697
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_SetAppMetadataProperty@
+foreign import ccall unsafe "hs_bindgen_f74424c7b29a0aec"
+  hs_bindgen_f74424c7b29a0aec_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_SetAppMetadataProperty@
+hs_bindgen_f74424c7b29a0aec
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_f74424c7b29a0aec =
+  BG.fromFFIType hs_bindgen_f74424c7b29a0aec_base
+
+-- | Specify metadata about your app through a set of properties.
+--
+--     You can optionally provide metadata about your app to SDL. This is not required, but strongly encouraged.
+--
+--     There are several locations where SDL can make use of metadata (an \"About\" box in the macOS menu bar, the name of the app can be shown on some audio mixers, etc). Any piece of metadata can be left out, if a specific detail doesn\'t make sense for the app.
+--
+--     This function should be called as early as possible, before SDL_Init. Multiple calls to this function are allowed, but various state might not change once it has been set up with a previous call to this function.
+--
+--     Once set, this metadata can be read using @SDL_GetAppMetadataProperty()@.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_APP_METADATA_NAME_STRING'@: The human-readable name of the application, like \"My Game 2: Bad Guy\'s Revenge!\". This will show up anywhere the OS shows the name of the application separately from window titles, such as volume control applets, etc. This defaults to \"SDL Application\".
+--
+--     * @'sDL_PROP_APP_METADATA_VERSION_STRING'@: The version of the app that is running; there are no rules on format, so \"1.0.3beta2\" and \"April 22nd, 2024\" and a git hash are all valid options. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_IDENTIFIER_STRING'@: A unique string that identifies this app. This must be in reverse-domain format, like \"com.example.mygame2\". This string is used by desktop compositors to identify and group windows together, as well as match applications with associated desktop settings and icons. If you plan to package your application in a container such as Flatpak, the app ID should match the name of your Flatpak container as well. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_CREATOR_STRING'@: The human-readable name of the creator\/developer\/maker of this app, like \"MojoWorkshop, LLC\"
+--
+--     * @'sDL_PROP_APP_METADATA_COPYRIGHT_STRING'@: The human-readable copyright notice, like \"Copyright (c) 2024 MojoWorkshop, LLC\" or whatnot. Keep this to one line, don\'t paste a copy of a whole software license in here. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_URL_STRING'@: A URL to the app on the web. Maybe a product page, or a storefront, or even a GitHub repository, for user\'s further information This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_TYPE_STRING'@: The type of application this is. Currently this string can be \"game\" for a video game, \"mediaplayer\" for a media player, or generically \"application\" if nothing else applies. Future versions of SDL might add new types. This defaults to \"application\".
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetAppMetadataProperty', 'sDL_SetAppMetadata'
+--
+--     [C declaration]: @SDL_SetAppMetadataProperty@, defined at @SDL3\/SDL_init.h 468:34@
+sDL_SetAppMetadataProperty
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the metadata property to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the property, or NULL to remove that property.
+  -> IO BG.CBool
+sDL_SetAppMetadataProperty =
+  hs_bindgen_f74424c7b29a0aec
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_GetAppMetadataProperty@
+foreign import ccall unsafe "hs_bindgen_564623fbc2006948"
+  hs_bindgen_564623fbc2006948_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Init_Unsafe_SDL_GetAppMetadataProperty@
+hs_bindgen_564623fbc2006948
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_564623fbc2006948 =
+  BG.fromFFIType hs_bindgen_564623fbc2006948_base
+
+-- | Get metadata about your app.
+--
+--     This returns metadata previously set using @SDL_SetAppMetadata()@ or @SDL_SetAppMetadataProperty()@. See @SDL_SetAppMetadataProperty()@ for the list of available properties and their meanings.
+--
+--     [Returns]: the current value of the metadata property, or the default if it is not set, NULL for properties with no default.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the string returned is not protected and could potentially be freed if you call @SDL_SetAppMetadataProperty()@ to set that property from another thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetAppMetadata', 'sDL_SetAppMetadataProperty'
+--
+--     [C declaration]: @SDL_GetAppMetadataProperty@, defined at @SDL3\/SDL_init.h 499:42@
+sDL_GetAppMetadataProperty
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the metadata property to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetAppMetadataProperty =
+  hs_bindgen_564623fbc2006948
diff --git a/src/SDL3/Sys/Bindgen/Iostream.hs b/src/SDL3/Sys/Bindgen/Iostream.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Iostream.hs
@@ -0,0 +1,973 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL provides an abstract interface for reading and writing data streams. It offers implementations for files, memory, etc, and the app can provide their own implementations, too.
+--
+--     'SDL_IOStream' is not related to the standard C++ iostream class, other than both are abstract interfaces to read\/write data. 'SDL_IOStream' status, set by a read or write operation.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Iostream (
+  SDL3.Sys.Bindgen.Iostream.SDL_IOStatus (..),
+  pattern SDL3.Sys.Bindgen.Iostream.SDL_IO_STATUS_READY,
+  pattern SDL3.Sys.Bindgen.Iostream.SDL_IO_STATUS_ERROR,
+  pattern SDL3.Sys.Bindgen.Iostream.SDL_IO_STATUS_EOF,
+  pattern SDL3.Sys.Bindgen.Iostream.SDL_IO_STATUS_NOT_READY,
+  pattern SDL3.Sys.Bindgen.Iostream.SDL_IO_STATUS_READONLY,
+  pattern SDL3.Sys.Bindgen.Iostream.SDL_IO_STATUS_WRITEONLY,
+  SDL3.Sys.Bindgen.Iostream.SDL_IOWhence (..),
+  pattern SDL3.Sys.Bindgen.Iostream.SDL_IO_SEEK_SET,
+  pattern SDL3.Sys.Bindgen.Iostream.SDL_IO_SEEK_CUR,
+  pattern SDL3.Sys.Bindgen.Iostream.SDL_IO_SEEK_END,
+  SDL3.Sys.Bindgen.Iostream.SDL_IOStreamInterface (..),
+  SDL3.Sys.Bindgen.Iostream.SDL_IOStream,
+  SDL3.Sys.Bindgen.Iostream.sDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER,
+  SDL3.Sys.Bindgen.Iostream.sDL_PROP_IOSTREAM_STDIO_FILE_POINTER,
+  SDL3.Sys.Bindgen.Iostream.sDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER,
+  SDL3.Sys.Bindgen.Iostream.sDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER,
+  SDL3.Sys.Bindgen.Iostream.sDL_PROP_IOSTREAM_MEMORY_POINTER,
+  SDL3.Sys.Bindgen.Iostream.sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER,
+  SDL3.Sys.Bindgen.Iostream.sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER,
+  SDL3.Sys.Bindgen.Iostream.sDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER,
+  SDL3.Sys.Bindgen.Iostream.sDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @enum SDL_IOStatus@, defined at @SDL3\/SDL_iostream.h 53:14@
+newtype SDL_IOStatus = SDL_IOStatus
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_IOStatus where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_IOStatus where
+  readRaw =
+    \ptr0 ->
+      pure SDL_IOStatus
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_IOStatus where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_IOStatus unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_IOStatus instance BG.Storable SDL_IOStatus
+
+deriving via BG.CUInt instance BG.Prim SDL_IOStatus
+
+instance CEnum.CEnum SDL_IOStatus where
+  type CEnumZ SDL_IOStatus = BG.CUInt
+
+  toCEnum = SDL_IOStatus
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_IO_STATUS_READY")
+        , (1, BG.singleton "SDL_IO_STATUS_ERROR")
+        , (2, BG.singleton "SDL_IO_STATUS_EOF")
+        , (3, BG.singleton "SDL_IO_STATUS_NOT_READY")
+        , (4, BG.singleton "SDL_IO_STATUS_READONLY")
+        , (5, BG.singleton "SDL_IO_STATUS_WRITEONLY")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_IOStatus"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_IOStatus"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_IOStatus where
+  minDeclaredValue = SDL_IO_STATUS_READY
+
+  maxDeclaredValue = SDL_IO_STATUS_WRITEONLY
+
+instance Show SDL_IOStatus where
+  showsPrec = CEnum.shows
+
+instance Read SDL_IOStatus where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_IOStatus ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_IOStatus{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_IOStatus) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_IOStatus "unwrap" where
+  type CFieldType SDL_IOStatus "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Everything is ready (no errors and not EOF).
+--
+--     [C declaration]: @SDL_IO_STATUS_READY@, defined at @SDL3\/SDL_iostream.h 55:5@
+pattern SDL_IO_STATUS_READY :: SDL_IOStatus
+pattern SDL_IO_STATUS_READY = SDL_IOStatus 0
+
+-- | Read or write I\/O error
+--
+--     [C declaration]: @SDL_IO_STATUS_ERROR@, defined at @SDL3\/SDL_iostream.h 56:5@
+pattern SDL_IO_STATUS_ERROR :: SDL_IOStatus
+pattern SDL_IO_STATUS_ERROR = SDL_IOStatus 1
+
+-- | End of file
+--
+--     [C declaration]: @SDL_IO_STATUS_EOF@, defined at @SDL3\/SDL_iostream.h 57:5@
+pattern SDL_IO_STATUS_EOF :: SDL_IOStatus
+pattern SDL_IO_STATUS_EOF = SDL_IOStatus 2
+
+-- | Non blocking I\/O, not ready
+--
+--     [C declaration]: @SDL_IO_STATUS_NOT_READY@, defined at @SDL3\/SDL_iostream.h 58:5@
+pattern SDL_IO_STATUS_NOT_READY :: SDL_IOStatus
+pattern SDL_IO_STATUS_NOT_READY = SDL_IOStatus 3
+
+-- | Tried to write a read-only buffer
+--
+--     [C declaration]: @SDL_IO_STATUS_READONLY@, defined at @SDL3\/SDL_iostream.h 59:5@
+pattern SDL_IO_STATUS_READONLY :: SDL_IOStatus
+pattern SDL_IO_STATUS_READONLY = SDL_IOStatus 4
+
+-- | Tried to read a write-only buffer
+--
+--     [C declaration]: @SDL_IO_STATUS_WRITEONLY@, defined at @SDL3\/SDL_iostream.h 60:5@
+pattern SDL_IO_STATUS_WRITEONLY :: SDL_IOStatus
+pattern SDL_IO_STATUS_WRITEONLY = SDL_IOStatus 5
+
+-- | Possible @whence@ values for 'SDL_IOStream' seeking.
+--
+--     These map to the same \"whence\" concept that @fseek@ or @lseek@ use in the standard C runtime.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_IOWhence@, defined at @SDL3\/SDL_iostream.h 71:14@
+newtype SDL_IOWhence = SDL_IOWhence
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_IOWhence where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_IOWhence where
+  readRaw =
+    \ptr0 ->
+      pure SDL_IOWhence
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_IOWhence where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_IOWhence unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_IOWhence instance BG.Storable SDL_IOWhence
+
+deriving via BG.CUInt instance BG.Prim SDL_IOWhence
+
+instance CEnum.CEnum SDL_IOWhence where
+  type CEnumZ SDL_IOWhence = BG.CUInt
+
+  toCEnum = SDL_IOWhence
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_IO_SEEK_SET")
+        , (1, BG.singleton "SDL_IO_SEEK_CUR")
+        , (2, BG.singleton "SDL_IO_SEEK_END")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_IOWhence"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_IOWhence"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_IOWhence where
+  minDeclaredValue = SDL_IO_SEEK_SET
+
+  maxDeclaredValue = SDL_IO_SEEK_END
+
+instance Show SDL_IOWhence where
+  showsPrec = CEnum.shows
+
+instance Read SDL_IOWhence where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_IOWhence ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_IOWhence{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_IOWhence) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_IOWhence "unwrap" where
+  type CFieldType SDL_IOWhence "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Seek from the beginning of data
+--
+--     [C declaration]: @SDL_IO_SEEK_SET@, defined at @SDL3\/SDL_iostream.h 73:5@
+pattern SDL_IO_SEEK_SET :: SDL_IOWhence
+pattern SDL_IO_SEEK_SET = SDL_IOWhence 0
+
+-- | Seek relative to current read point
+--
+--     [C declaration]: @SDL_IO_SEEK_CUR@, defined at @SDL3\/SDL_iostream.h 74:5@
+pattern SDL_IO_SEEK_CUR :: SDL_IOWhence
+pattern SDL_IO_SEEK_CUR = SDL_IOWhence 1
+
+-- | Seek relative to the end of data
+--
+--     [C declaration]: @SDL_IO_SEEK_END@, defined at @SDL3\/SDL_iostream.h 75:5@
+pattern SDL_IO_SEEK_END :: SDL_IOWhence
+pattern SDL_IO_SEEK_END = SDL_IOWhence 2
+
+-- | The function pointers that drive an 'SDL_IOStream'.
+--
+--     Applications can provide this struct to @SDL_OpenIO()@ to create their own implementation of 'SDL_IOStream'. This is not necessarily required, as SDL already offers several common types of I\/O streams, via functions like @SDL_IOFromFile()@ and @SDL_IOFromMem()@.
+--
+--     This structure should be initialized using SDL_INIT_INTERFACE()
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_INIT_INTERFACE
+--
+--     [C declaration]: @struct SDL_IOStreamInterface@, defined at @SDL3\/SDL_iostream.h 92:16@
+data SDL_IOStreamInterface = SDL_IOStreamInterface
+  { version :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @version@, defined at @SDL3\/SDL_iostream.h 95:12@
+  , size :: BG.FunPtr (BG.Ptr BG.Void -> IO SDL3.Sys.Bindgen.Stdinc.Sint64)
+  -- ^ [C declaration]: @size@, defined at @SDL3\/SDL_iostream.h 102:22@
+  , seek
+      :: BG.FunPtr
+           ( BG.Ptr BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Sint64
+             -> SDL_IOWhence
+             -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+           )
+  -- ^ [C declaration]: @seek@, defined at @SDL3\/SDL_iostream.h 110:22@
+  , read
+      :: BG.FunPtr
+           ( BG.Ptr BG.Void
+             -> BG.Ptr BG.Void
+             -> HsBindgen.Runtime.LibC.CSize
+             -> BG.Ptr SDL_IOStatus
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+  -- ^ [C declaration]: @read@, defined at @SDL3\/SDL_iostream.h 122:22@
+  , write
+      :: BG.FunPtr
+           ( BG.Ptr BG.Void
+             -> PtrConst.PtrConst BG.Void
+             -> HsBindgen.Runtime.LibC.CSize
+             -> BG.Ptr SDL_IOStatus
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+  -- ^ [C declaration]: @write@, defined at @SDL3\/SDL_iostream.h 134:22@
+  , flush :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr SDL_IOStatus -> IO BG.CBool)
+  -- ^ [C declaration]: @flush@, defined at @SDL3\/SDL_iostream.h 145:20@
+  , close :: BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool)
+  -- ^ [C declaration]: @close@, defined at @SDL3\/SDL_iostream.h 158:20@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_IOStreamInterface where
+  staticSizeOf = \_ -> (56 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_IOStreamInterface where
+  readRaw =
+    \ptr0 ->
+      pure SDL_IOStreamInterface
+        <*> HasCField.readRaw (BG.Proxy @"version") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"size") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"seek") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"read") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"write") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"flush") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"close") ptr0
+
+instance Marshal.WriteRaw SDL_IOStreamInterface where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_IOStreamInterface version2 size3 seek4 read5 write6 flush7 close8 ->
+            HasCField.writeRaw (BG.Proxy @"version") ptr0 version2
+              >> HasCField.writeRaw (BG.Proxy @"size") ptr0 size3
+              >> HasCField.writeRaw (BG.Proxy @"seek") ptr0 seek4
+              >> HasCField.writeRaw (BG.Proxy @"read") ptr0 read5
+              >> HasCField.writeRaw (BG.Proxy @"write") ptr0 write6
+              >> HasCField.writeRaw (BG.Proxy @"flush") ptr0 flush7
+              >> HasCField.writeRaw (BG.Proxy @"close") ptr0 close8
+
+deriving via Marshal.EquivStorable SDL_IOStreamInterface instance BG.Storable SDL_IOStreamInterface
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "version" SDL_IOStreamInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_IOStreamInterface
+            { version = y1
+            , size = BG.getField @"size" x0
+            , seek = BG.getField @"seek" x0
+            , read = BG.getField @"read" x0
+            , write = BG.getField @"write" x0
+            , flush = BG.getField @"flush" x0
+            , close = BG.getField @"close" x0
+            }
+      , BG.getField @"version" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "version" (BG.Ptr SDL_IOStreamInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"version")
+
+instance HasCField.HasCField SDL_IOStreamInterface "version" where
+  type
+    CFieldType SDL_IOStreamInterface "version" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO SDL3.Sys.Bindgen.Stdinc.Sint64))
+  => BG.CompatHasField.HasField "size" SDL_IOStreamInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_IOStreamInterface
+            { size = y1
+            , version = BG.getField @"version" x0
+            , seek = BG.getField @"seek" x0
+            , read = BG.getField @"read" x0
+            , write = BG.getField @"write" x0
+            , flush = BG.getField @"flush" x0
+            , close = BG.getField @"close" x0
+            }
+      , BG.getField @"size" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO SDL3.Sys.Bindgen.Stdinc.Sint64))
+  => BG.HasField "size" (BG.Ptr SDL_IOStreamInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"size")
+
+instance HasCField.HasCField SDL_IOStreamInterface "size" where
+  type
+    CFieldType SDL_IOStreamInterface "size" =
+      BG.FunPtr (BG.Ptr BG.Void -> IO SDL3.Sys.Bindgen.Stdinc.Sint64)
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> SDL3.Sys.Bindgen.Stdinc.Sint64
+            -> SDL_IOWhence
+            -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+          )
+  )
+  => BG.CompatHasField.HasField "seek" SDL_IOStreamInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_IOStreamInterface
+            { seek = y1
+            , version = BG.getField @"version" x0
+            , size = BG.getField @"size" x0
+            , read = BG.getField @"read" x0
+            , write = BG.getField @"write" x0
+            , flush = BG.getField @"flush" x0
+            , close = BG.getField @"close" x0
+            }
+      , BG.getField @"seek" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> SDL3.Sys.Bindgen.Stdinc.Sint64
+            -> SDL_IOWhence
+            -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+          )
+  )
+  => BG.HasField "seek" (BG.Ptr SDL_IOStreamInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"seek")
+
+instance HasCField.HasCField SDL_IOStreamInterface "seek" where
+  type
+    CFieldType SDL_IOStreamInterface "seek" =
+      BG.FunPtr
+        ( BG.Ptr BG.Void
+          -> SDL3.Sys.Bindgen.Stdinc.Sint64
+          -> SDL_IOWhence
+          -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+        )
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> BG.Ptr BG.Void
+            -> HsBindgen.Runtime.LibC.CSize
+            -> BG.Ptr SDL_IOStatus
+            -> IO HsBindgen.Runtime.LibC.CSize
+          )
+  )
+  => BG.CompatHasField.HasField "read" SDL_IOStreamInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_IOStreamInterface
+            { read = y1
+            , version = BG.getField @"version" x0
+            , size = BG.getField @"size" x0
+            , seek = BG.getField @"seek" x0
+            , write = BG.getField @"write" x0
+            , flush = BG.getField @"flush" x0
+            , close = BG.getField @"close" x0
+            }
+      , BG.getField @"read" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> BG.Ptr BG.Void
+            -> HsBindgen.Runtime.LibC.CSize
+            -> BG.Ptr SDL_IOStatus
+            -> IO HsBindgen.Runtime.LibC.CSize
+          )
+  )
+  => BG.HasField "read" (BG.Ptr SDL_IOStreamInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"read")
+
+instance HasCField.HasCField SDL_IOStreamInterface "read" where
+  type
+    CFieldType SDL_IOStreamInterface "read" =
+      BG.FunPtr
+        ( BG.Ptr BG.Void
+          -> BG.Ptr BG.Void
+          -> HsBindgen.Runtime.LibC.CSize
+          -> BG.Ptr SDL_IOStatus
+          -> IO HsBindgen.Runtime.LibC.CSize
+        )
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> PtrConst.PtrConst BG.Void
+            -> HsBindgen.Runtime.LibC.CSize
+            -> BG.Ptr SDL_IOStatus
+            -> IO HsBindgen.Runtime.LibC.CSize
+          )
+  )
+  => BG.CompatHasField.HasField "write" SDL_IOStreamInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_IOStreamInterface
+            { write = y1
+            , version = BG.getField @"version" x0
+            , size = BG.getField @"size" x0
+            , seek = BG.getField @"seek" x0
+            , read = BG.getField @"read" x0
+            , flush = BG.getField @"flush" x0
+            , close = BG.getField @"close" x0
+            }
+      , BG.getField @"write" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> PtrConst.PtrConst BG.Void
+            -> HsBindgen.Runtime.LibC.CSize
+            -> BG.Ptr SDL_IOStatus
+            -> IO HsBindgen.Runtime.LibC.CSize
+          )
+  )
+  => BG.HasField "write" (BG.Ptr SDL_IOStreamInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"write")
+
+instance HasCField.HasCField SDL_IOStreamInterface "write" where
+  type
+    CFieldType SDL_IOStreamInterface "write" =
+      BG.FunPtr
+        ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.Void
+          -> HsBindgen.Runtime.LibC.CSize
+          -> BG.Ptr SDL_IOStatus
+          -> IO HsBindgen.Runtime.LibC.CSize
+        )
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr SDL_IOStatus -> IO BG.CBool))
+  => BG.CompatHasField.HasField "flush" SDL_IOStreamInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_IOStreamInterface
+            { flush = y1
+            , version = BG.getField @"version" x0
+            , size = BG.getField @"size" x0
+            , seek = BG.getField @"seek" x0
+            , read = BG.getField @"read" x0
+            , write = BG.getField @"write" x0
+            , close = BG.getField @"close" x0
+            }
+      , BG.getField @"flush" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr SDL_IOStatus -> IO BG.CBool))
+  => BG.HasField "flush" (BG.Ptr SDL_IOStreamInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"flush")
+
+instance HasCField.HasCField SDL_IOStreamInterface "flush" where
+  type
+    CFieldType SDL_IOStreamInterface "flush" =
+      BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr SDL_IOStatus -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool))
+  => BG.CompatHasField.HasField "close" SDL_IOStreamInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_IOStreamInterface
+            { close = y1
+            , version = BG.getField @"version" x0
+            , size = BG.getField @"size" x0
+            , seek = BG.getField @"seek" x0
+            , read = BG.getField @"read" x0
+            , write = BG.getField @"write" x0
+            , flush = BG.getField @"flush" x0
+            }
+      , BG.getField @"close" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool))
+  => BG.HasField "close" (BG.Ptr SDL_IOStreamInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"close")
+
+instance HasCField.HasCField SDL_IOStreamInterface "close" where
+  type
+    CFieldType SDL_IOStreamInterface "close" =
+      BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 48
+
+-- | The read\/write operation structure.
+--
+--     This operates as an opaque handle. There are several APIs to create various types of I\/O streams, or an app can supply an 'SDL_IOStreamInterface' to @SDL_OpenIO()@ to provide their own stream implementation behind this struct\'s abstract interface.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_IOStream@, defined at @SDL3\/SDL_iostream.h 182:16@
+data SDL_IOStream
+
+-- | [C declaration]: @macro SDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER@, literal @\"SDL.iostream.windows.handle\"@, defined at @SDL3\/SDL_iostream.h 280:9@
+sDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER :: BG.ByteString
+sDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x69
+    , 0x6F
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x6D
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x73
+    , 0x2E
+    , 0x68
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x6C
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_IOSTREAM_STDIO_FILE_POINTER@, literal @\"SDL.iostream.stdio.file\"@, defined at @SDL3\/SDL_iostream.h 281:9@
+sDL_PROP_IOSTREAM_STDIO_FILE_POINTER :: BG.ByteString
+sDL_PROP_IOSTREAM_STDIO_FILE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x69
+    , 0x6F
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x6D
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x69
+    , 0x6F
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER@, literal @\"SDL.iostream.file_descriptor\"@, defined at @SDL3\/SDL_iostream.h 282:9@
+sDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER :: BG.ByteString
+sDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x69
+    , 0x6F
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x6D
+    , 0x2E
+    , 0x66
+    , 0x69
+    , 0x6C
+    , 0x65
+    , 0x5F
+    , 0x64
+    , 0x65
+    , 0x73
+    , 0x63
+    , 0x72
+    , 0x69
+    , 0x70
+    , 0x74
+    , 0x6F
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER@, literal @\"SDL.iostream.android.aasset\"@, defined at @SDL3\/SDL_iostream.h 283:9@
+sDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER :: BG.ByteString
+sDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x69
+    , 0x6F
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x6D
+    , 0x2E
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x72
+    , 0x6F
+    , 0x69
+    , 0x64
+    , 0x2E
+    , 0x61
+    , 0x61
+    , 0x73
+    , 0x73
+    , 0x65
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_IOSTREAM_MEMORY_POINTER@, literal @\"SDL.iostream.memory.base\"@, defined at @SDL3\/SDL_iostream.h 332:9@
+sDL_PROP_IOSTREAM_MEMORY_POINTER :: BG.ByteString
+sDL_PROP_IOSTREAM_MEMORY_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x69
+    , 0x6F
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x6D
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x6D
+    , 0x6F
+    , 0x72
+    , 0x79
+    , 0x2E
+    , 0x62
+    , 0x61
+    , 0x73
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER@, literal @\"SDL.iostream.memory.size\"@, defined at @SDL3\/SDL_iostream.h 333:9@
+sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER :: BG.ByteString
+sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x69
+    , 0x6F
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x6D
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x6D
+    , 0x6F
+    , 0x72
+    , 0x79
+    , 0x2E
+    , 0x73
+    , 0x69
+    , 0x7A
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER@, literal @\"SDL.iostream.memory.free\"@, defined at @SDL3\/SDL_iostream.h 334:9@
+sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER :: BG.ByteString
+sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x69
+    , 0x6F
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x6D
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x6D
+    , 0x6F
+    , 0x72
+    , 0x79
+    , 0x2E
+    , 0x66
+    , 0x72
+    , 0x65
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER@, literal @\"SDL.iostream.dynamic.memory\"@, defined at @SDL3\/SDL_iostream.h 413:9@
+sDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER :: BG.ByteString
+sDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x69
+    , 0x6F
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x6D
+    , 0x2E
+    , 0x64
+    , 0x79
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x69
+    , 0x63
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x6D
+    , 0x6F
+    , 0x72
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER@, literal @\"SDL.iostream.dynamic.chunksize\"@, defined at @SDL3\/SDL_iostream.h 414:9@
+sDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER :: BG.ByteString
+sDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x69
+    , 0x6F
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x6D
+    , 0x2E
+    , 0x64
+    , 0x79
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x69
+    , 0x63
+    , 0x2E
+    , 0x63
+    , 0x68
+    , 0x75
+    , 0x6E
+    , 0x6B
+    , 0x73
+    , 0x69
+    , 0x7A
+    , 0x65
+    ]
diff --git a/src/SDL3/Sys/Bindgen/Iostream/FunPtr.hs b/src/SDL3/Sys/Bindgen/Iostream/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Iostream/FunPtr.hs
@@ -0,0 +1,2184 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Iostream.FunPtr (
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_IOFromFile,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_IOFromMem,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_IOFromConstMem,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_IOFromDynamicMem,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_OpenIO,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_CloseIO,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_GetIOProperties,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_GetIOStatus,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_GetIOSize,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_SeekIO,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_TellIO,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadIO,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteIO,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_FlushIO,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_LoadFile_IO,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_LoadFile,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_SaveFile_IO,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_SaveFile,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadU8,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadS8,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadU16LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadS16LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadU16BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadS16BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadU32LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadS32LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadU32BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadS32BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadU64LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadS64LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadU64BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_ReadS64BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteU8,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteS8,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteU16LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteS16LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteU16BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteS16BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteU32LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteS32LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteU32BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteS32BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteU64LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteS64LE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteU64BE,
+  SDL3.Sys.Bindgen.Iostream.FunPtr.sDL_WriteS64BE,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Iostream
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_iostream.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromFile */"
+         , "__attribute__ ((const))"
+         , "SDL_IOStream *(*hs_bindgen_201a8b6453f8984e (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_IOFromFile;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromMem */"
+         , "__attribute__ ((const))"
+         , "SDL_IOStream *(*hs_bindgen_85f5d4c89469983e (void)) ("
+         , "  void *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_IOFromMem;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromConstMem */"
+         , "__attribute__ ((const))"
+         , "SDL_IOStream *(*hs_bindgen_8e9894d9b76b4508 (void)) ("
+         , "  void const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_IOFromConstMem;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromDynamicMem */"
+         , "__attribute__ ((const))"
+         , "SDL_IOStream *(*hs_bindgen_0bc01e6fcc469c5d (void)) (void)"
+         , "{"
+         , "  return &SDL_IOFromDynamicMem;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_OpenIO */"
+         , "__attribute__ ((const))"
+         , "SDL_IOStream *(*hs_bindgen_6ff7847ea63b8084 (void)) ("
+         , "  SDL_IOStreamInterface const *arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_CloseIO */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f6068828da8e5825 (void)) ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CloseIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_GetIOProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_8dacbe3916578a37 (void)) ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetIOProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_GetIOStatus */"
+         , "__attribute__ ((const))"
+         , "SDL_IOStatus (*hs_bindgen_31f5af3182a34a32 (void)) ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetIOStatus;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_GetIOSize */"
+         , "__attribute__ ((const))"
+         , "Sint64 (*hs_bindgen_322d6819ddbd6d39 (void)) ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetIOSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_SeekIO */"
+         , "__attribute__ ((const))"
+         , "Sint64 (*hs_bindgen_0a9b2c955dab0026 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 arg2,"
+         , "  SDL_IOWhence arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SeekIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_TellIO */"
+         , "__attribute__ ((const))"
+         , "Sint64 (*hs_bindgen_bef67ceee53b6142 (void)) ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_TellIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadIO */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_0c9d4db36a2719b6 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  void *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteIO */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_d9956d7898ea90e2 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_FlushIO */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ae112d17ec9c64f0 (void)) ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_FlushIO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_LoadFile_IO */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_e46ab82952c4c1d4 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  size_t *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_LoadFile_IO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_LoadFile */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_ea9bbd4467b9e2c6 (void)) ("
+         , "  char const *arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_LoadFile;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_SaveFile_IO */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_de0267086f8fc295 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SaveFile_IO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_SaveFile */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_841c544344507810 (void)) ("
+         , "  char const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SaveFile;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU8 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c304f9e2b3baf9dd (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint8 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadU8;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS8 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c39406dce63371f8 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint8 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadS8;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU16LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6849a0e565e7ac74 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadU16LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS16LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fe15c03a2323f8ee (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadS16LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU16BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_04f5c88868a2821e (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadU16BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS16BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ab83010c5ae7ab35 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadS16BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU32LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4dedf81005dea655 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadU32LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS32LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fffd09bacab3320d (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadS32LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU32BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_42b0f1d027be0c67 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadU32BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS32BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_97bc8b4d68748597 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadS32BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU64LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_076f54bb27254ddb (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadU64LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS64LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1aa96b5b13230b9b (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadS64LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU64BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b0379b9f20acb50b (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadU64BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS64BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_91c79c6f23b10cea (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadS64BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU8 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6a41201b6dedc01d (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteU8;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS8 */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7779de5157457a4b (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint8 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteS8;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU16LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d47e66728dda1cb5 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteU16LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS16LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_93f38ce5f51dbf43 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteS16LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU16BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e336b4900affdc95 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteU16BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS16BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ae3652657a7f54ff (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteS16BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU32LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3eafe174eec9869a (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteU32LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS32LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_93d996acdc68faa4 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteS32LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU32BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b65faf115109388d (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteU32BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS32BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_dfe1b91f6dd8a3fa (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteS32BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU64LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2d1c699323094d03 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteU64LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS64LE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fe1f17e206d55f2a (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteS64LE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU64BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9dd43ac41e9a2bb2 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteU64BE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS64BE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fbc1776f62682806 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteS64BE;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromFile@
+foreign import ccall unsafe "hs_bindgen_201a8b6453f8984e"
+  hs_bindgen_201a8b6453f8984e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromFile@
+hs_bindgen_201a8b6453f8984e
+  :: IO
+       (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_IOStream)))
+hs_bindgen_201a8b6453f8984e =
+  BG.fromFFIType hs_bindgen_201a8b6453f8984e_base
+
+{-# NOINLINE sDL_IOFromFile #-}
+
+-- | Use this function to create a new 'SDL_IOStream' structure for reading from and\/or writing to a named file.
+--
+--     The @mode@ string is treated roughly the same as in a call to the C library\'s fopen(), even if SDL doesn\'t happen to use fopen() behind the scenes.
+--
+--     Available @mode@ strings:
+--
+--     * \"r\": Open a file for reading. The file must exist.
+--
+--     * \"w\": Create an empty file for writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     * \"wx\": Create an empty file for writing. If a file with the same name already exists, the call fails.
+--
+--     * \"a\": Append to a file. Writing operations append data at the end of the file. The file is created if it does not exist.
+--
+--     * \"r+\": Open a file for update both reading and writing. The file must exist.
+--
+--     * \"w+\": Create an empty file for both reading and writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     * \"w+x\": Create an empty file for both reading and writing. If a file with the same name already exists, the call fails.
+--
+--     * \"a+\": Open a file for reading and appending. All writing operations are performed at the end of the file, protecting the previous content to be overwritten. You can reposition (fseek, rewind) the internal pointer to anywhere in the file for reading, but writing operations will move it back to the end of file. The file is created if it does not exist.
+--
+--     __NOTE__: In order to open a file as a binary file, a \"b\" character has to be included in the @mode@ string. This additional \"b\" character can either be appended at the end of the string (thus making the following compound modes: \"rb\", \"wb\", \"ab\", \"r+b\", \"w+b\", \"a+b\") or be inserted between the letter and the \"+\" sign for the mixed modes (\"rb+\", \"wb+\", \"ab+\"). Additional characters may follow the sequence, although they should have no effect. For example, \"t\" is sometimes appended to make explicit the file is a text file.
+--
+--     This function supports Unicode filenames, but they must be encoded in UTF-8 format, regardless of the underlying operating system.
+--
+--     In Android, @SDL_IOFromFile()@ can be used to open content:\/\/ URIs. As a fallback, @SDL_IOFromFile()@ will transparently open a matching filename in the app\'s @assets@.
+--
+--     Closing the 'SDL_IOStream' will close SDL\'s internal file handle.
+--
+--     The following properties may be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER'@: a pointer, that can be cast to a win32 @HANDLE@, that this 'SDL_IOStream' is using to access the filesystem. If the program isn\'t running on Windows, or SDL used some other method to access the filesystem, this property will not be set.
+--
+--     * @'sDL_PROP_IOSTREAM_STDIO_FILE_POINTER'@: a pointer, that can be cast to a stdio @FILE *@, that this 'SDL_IOStream' is using to access the filesystem. If SDL used some other method to access the filesystem, this property will not be set. PLEASE NOTE that if SDL is using a different C runtime than your app, trying to use this pointer will almost certainly result in a crash! This is mostly a problem on Windows; make sure you build SDL and your app with the same compiler and settings to avoid it.
+--
+--     * @'sDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER'@: a file descriptor that this 'SDL_IOStream' is using to access the filesystem.
+--
+--     * @'sDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER'@: a pointer, that can be cast to an Android NDK @AAsset *@, that this 'SDL_IOStream' is using to access the filesystem. If SDL used some other method to access the filesystem, this property will not be set.
+--
+--     [@file@]: a UTF-8 string representing the filename to open.
+--
+--     [@mode@]: an ASCII string representing the mode to be used for opening the file.
+--
+--     [Returns]: a pointer to the 'SDL_IOStream' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseIO', 'sDL_FlushIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_IOFromFile@, defined at @SDL3\/SDL_iostream.h 278:44@
+sDL_IOFromFile
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_IOStream))
+sDL_IOFromFile =
+  BG.unsafePerformIO hs_bindgen_201a8b6453f8984e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromMem@
+foreign import ccall unsafe "hs_bindgen_85f5d4c89469983e"
+  hs_bindgen_85f5d4c89469983e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromMem@
+hs_bindgen_85f5d4c89469983e
+  :: IO (BG.FunPtr (BG.Ptr BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr SDL_IOStream)))
+hs_bindgen_85f5d4c89469983e =
+  BG.fromFFIType hs_bindgen_85f5d4c89469983e_base
+
+{-# NOINLINE sDL_IOFromMem #-}
+
+-- | Use this function to prepare a read-write memory buffer for use with 'SDL_IOStream'.
+--
+--     This function sets up an 'SDL_IOStream' struct based on a memory area of a certain size, for both read and write access.
+--
+--     This memory buffer is not copied by the 'SDL_IOStream'; the pointer you provide must remain valid until you close the stream.
+--
+--     If you need to make sure the 'SDL_IOStream' never writes to the memory buffer, you should use @SDL_IOFromConstMem()@ with a read-only buffer of memory instead.
+--
+--     The following properties will be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_POINTER'@: this will be the @mem@ parameter that was passed to this function.
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER'@: this will be the @size@ parameter that was passed to this function.
+--
+--     Additionally, the following properties are recognized:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER'@: if this property is set to a non-NULL value it will be interpreted as a function of SDL_free_func type and called with the passed @mem@ pointer when closing the stream. By default it is unset, i.e., the memory will not be freed.
+--
+--     [@mem@]: a pointer to a buffer to feed an 'SDL_IOStream' stream.
+--
+--     [@size@]: the buffer size, in bytes.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_IOFromConstMem', 'sDL_CloseIO', 'sDL_FlushIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_IOFromMem@, defined at @SDL3\/SDL_iostream.h 330:44@
+sDL_IOFromMem
+  :: BG.FunPtr (BG.Ptr BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr SDL_IOStream))
+sDL_IOFromMem =
+  BG.unsafePerformIO hs_bindgen_85f5d4c89469983e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromConstMem@
+foreign import ccall unsafe "hs_bindgen_8e9894d9b76b4508"
+  hs_bindgen_8e9894d9b76b4508_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromConstMem@
+hs_bindgen_8e9894d9b76b4508
+  :: IO
+       (BG.FunPtr (PtrConst.PtrConst BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr SDL_IOStream)))
+hs_bindgen_8e9894d9b76b4508 =
+  BG.fromFFIType hs_bindgen_8e9894d9b76b4508_base
+
+{-# NOINLINE sDL_IOFromConstMem #-}
+
+-- | Use this function to prepare a read-only memory buffer for use with 'SDL_IOStream'.
+--
+--     This function sets up an 'SDL_IOStream' struct based on a memory area of a certain size. It assumes the memory area is not writable.
+--
+--     Attempting to write to this 'SDL_IOStream' stream will report an error without writing to the memory buffer.
+--
+--     This memory buffer is not copied by the 'SDL_IOStream'; the pointer you provide must remain valid until you close the stream.
+--
+--     If you need to write to a memory buffer, you should use @SDL_IOFromMem()@ with a writable buffer of memory instead.
+--
+--     The following properties will be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_POINTER'@: this will be the @mem@ parameter that was passed to this function.
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER'@: this will be the @size@ parameter that was passed to this function.
+--
+--     Additionally, the following properties are recognized:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER'@: if this property is set to a non-NULL value it will be interpreted as a function of SDL_free_func type and called with the passed @mem@ pointer when closing the stream. By default it is unset, i.e., the memory will not be freed.
+--
+--     [@mem@]: a pointer to a read-only buffer to feed an 'SDL_IOStream' stream.
+--
+--     [@size@]: the buffer size, in bytes.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_IOFromMem', 'sDL_CloseIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO'
+--
+--     [C declaration]: @SDL_IOFromConstMem@, defined at @SDL3\/SDL_iostream.h 381:44@
+sDL_IOFromConstMem
+  :: BG.FunPtr (PtrConst.PtrConst BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr SDL_IOStream))
+sDL_IOFromConstMem =
+  BG.unsafePerformIO hs_bindgen_8e9894d9b76b4508
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromDynamicMem@
+foreign import ccall unsafe "hs_bindgen_0bc01e6fcc469c5d"
+  hs_bindgen_0bc01e6fcc469c5d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_IOFromDynamicMem@
+hs_bindgen_0bc01e6fcc469c5d :: IO (BG.FunPtr (IO (BG.Ptr SDL_IOStream)))
+hs_bindgen_0bc01e6fcc469c5d =
+  BG.fromFFIType hs_bindgen_0bc01e6fcc469c5d_base
+
+{-# NOINLINE sDL_IOFromDynamicMem #-}
+
+-- | Use this function to create an 'SDL_IOStream' that is backed by dynamically allocated memory.
+--
+--     This supports the following properties to provide access to the memory and control over allocations:
+--
+--     * @'sDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER'@: a pointer to the internal memory of the stream. This can be set to NULL to transfer ownership of the memory to the application, which should free the memory with SDL_free(). If this is done, the next operation on the stream must be @SDL_CloseIO()@.
+--
+--     * @'sDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER'@: memory will be allocated in multiples of this size, defaulting to 1024.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_IOFromDynamicMem@, defined at @SDL3\/SDL_iostream.h 411:44@
+sDL_IOFromDynamicMem :: BG.FunPtr (IO (BG.Ptr SDL_IOStream))
+sDL_IOFromDynamicMem =
+  BG.unsafePerformIO hs_bindgen_0bc01e6fcc469c5d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_OpenIO@
+foreign import ccall unsafe "hs_bindgen_6ff7847ea63b8084"
+  hs_bindgen_6ff7847ea63b8084_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_OpenIO@
+hs_bindgen_6ff7847ea63b8084
+  :: IO
+       (BG.FunPtr (PtrConst.PtrConst SDL_IOStreamInterface -> BG.Ptr BG.Void -> IO (BG.Ptr SDL_IOStream)))
+hs_bindgen_6ff7847ea63b8084 =
+  BG.fromFFIType hs_bindgen_6ff7847ea63b8084_base
+
+{-# NOINLINE sDL_OpenIO #-}
+
+-- | Create a custom 'SDL_IOStream'.
+--
+--     Applications do not need to use this function unless they are providing their own 'SDL_IOStream' implementation. If you just need an 'SDL_IOStream' to read\/write a common data source, you should use the built-in implementations in SDL, like @SDL_IOFromFile()@ or @SDL_IOFromMem()@, etc.
+--
+--     This function makes a copy of @iface@ and the caller does not need to keep it around after this call.
+--
+--     [@iface@]: the interface that implements this 'SDL_IOStream', initialized using SDL_INIT_INTERFACE().
+--
+--     [@userdata@]: the pointer that will be passed to the interface functions.
+--
+--     [Returns]: a pointer to the allocated memory on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseIO', SDL_INIT_INTERFACE, 'sDL_IOFromConstMem', 'sDL_IOFromFile', 'sDL_IOFromMem'
+--
+--     [C declaration]: @SDL_OpenIO@, defined at @SDL3\/SDL_iostream.h 446:44@
+sDL_OpenIO
+  :: BG.FunPtr (PtrConst.PtrConst SDL_IOStreamInterface -> BG.Ptr BG.Void -> IO (BG.Ptr SDL_IOStream))
+sDL_OpenIO =
+  BG.unsafePerformIO hs_bindgen_6ff7847ea63b8084
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_CloseIO@
+foreign import ccall unsafe "hs_bindgen_f6068828da8e5825"
+  hs_bindgen_f6068828da8e5825_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_CloseIO@
+hs_bindgen_f6068828da8e5825 :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> IO BG.CBool))
+hs_bindgen_f6068828da8e5825 =
+  BG.fromFFIType hs_bindgen_f6068828da8e5825_base
+
+{-# NOINLINE sDL_CloseIO #-}
+
+-- | Close and free an allocated 'SDL_IOStream' structure.
+--
+--     @SDL_CloseIO()@ closes and cleans up the 'SDL_IOStream' stream. It releases any resources used by the stream and frees the 'SDL_IOStream' itself. This returns true on success, or false if the stream failed to flush to its output (e.g. to disk).
+--
+--     Note that if this fails to flush the stream for any reason, this function reports an error, but the 'SDL_IOStream' is still invalid once this function returns.
+--
+--     This call flushes any buffered writes to the operating system, but there are no guarantees that those writes have gone to physical media; they might be in the OS\'s file cache, waiting to go to disk later. If it\'s absolutely crucial that writes go to disk immediately, so they are definitely stored even if the power fails before the file cache would have caught up, one should call @SDL_FlushIO()@ before closing. Note that flushing takes time and makes the system and your app operate less efficiently, so do so sparingly.
+--
+--     [@context@]: 'SDL_IOStream' structure to close.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenIO'
+--
+--     [C declaration]: @SDL_CloseIO@, defined at @SDL3\/SDL_iostream.h 478:34@
+sDL_CloseIO :: BG.FunPtr (BG.Ptr SDL_IOStream -> IO BG.CBool)
+sDL_CloseIO =
+  BG.unsafePerformIO hs_bindgen_f6068828da8e5825
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_GetIOProperties@
+foreign import ccall unsafe "hs_bindgen_8dacbe3916578a37"
+  hs_bindgen_8dacbe3916578a37_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_GetIOProperties@
+hs_bindgen_8dacbe3916578a37
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_8dacbe3916578a37 =
+  BG.fromFFIType hs_bindgen_8dacbe3916578a37_base
+
+{-# NOINLINE sDL_GetIOProperties #-}
+
+-- | Get the properties associated with an 'SDL_IOStream'.
+--
+--     [@context@]: a pointer to an 'SDL_IOStream' structure.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetIOProperties@, defined at @SDL3\/SDL_iostream.h 491:46@
+sDL_GetIOProperties
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetIOProperties =
+  BG.unsafePerformIO hs_bindgen_8dacbe3916578a37
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_GetIOStatus@
+foreign import ccall unsafe "hs_bindgen_31f5af3182a34a32"
+  hs_bindgen_31f5af3182a34a32_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_GetIOStatus@
+hs_bindgen_31f5af3182a34a32 :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> IO SDL_IOStatus))
+hs_bindgen_31f5af3182a34a32 =
+  BG.fromFFIType hs_bindgen_31f5af3182a34a32_base
+
+{-# NOINLINE sDL_GetIOStatus #-}
+
+-- | Query the stream status of an 'SDL_IOStream'.
+--
+--     This information can be useful to decide if a short read or write was due to an error, an EOF, or a non-blocking operation that isn\'t yet ready to complete.
+--
+--     An 'SDL_IOStream' \'s status is only expected to change after a SDL_ReadIO or SDL_WriteIO call; don\'t expect it to change if you just call this query function in a tight loop.
+--
+--     [@context@]: the 'SDL_IOStream' to query.
+--
+--     [Returns]: an 'SDL_IOStatus' enum with the current state.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetIOStatus@, defined at @SDL3\/SDL_iostream.h 511:42@
+sDL_GetIOStatus :: BG.FunPtr (BG.Ptr SDL_IOStream -> IO SDL_IOStatus)
+sDL_GetIOStatus =
+  BG.unsafePerformIO hs_bindgen_31f5af3182a34a32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_GetIOSize@
+foreign import ccall unsafe "hs_bindgen_322d6819ddbd6d39"
+  hs_bindgen_322d6819ddbd6d39_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_GetIOSize@
+hs_bindgen_322d6819ddbd6d39
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> IO SDL3.Sys.Bindgen.Stdinc.Sint64))
+hs_bindgen_322d6819ddbd6d39 =
+  BG.fromFFIType hs_bindgen_322d6819ddbd6d39_base
+
+{-# NOINLINE sDL_GetIOSize #-}
+
+-- | Use this function to get the size of the data stream in an 'SDL_IOStream'.
+--
+--     [@context@]: the 'SDL_IOStream' to get the size of the data stream from.
+--
+--     [Returns]: the size of the data stream in the 'SDL_IOStream' on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetIOSize@, defined at @SDL3\/SDL_iostream.h 525:36@
+sDL_GetIOSize :: BG.FunPtr (BG.Ptr SDL_IOStream -> IO SDL3.Sys.Bindgen.Stdinc.Sint64)
+sDL_GetIOSize =
+  BG.unsafePerformIO hs_bindgen_322d6819ddbd6d39
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_SeekIO@
+foreign import ccall unsafe "hs_bindgen_0a9b2c955dab0026"
+  hs_bindgen_0a9b2c955dab0026_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_SeekIO@
+hs_bindgen_0a9b2c955dab0026
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_IOStream
+             -> SDL3.Sys.Bindgen.Stdinc.Sint64
+             -> SDL_IOWhence
+             -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+           )
+       )
+hs_bindgen_0a9b2c955dab0026 =
+  BG.fromFFIType hs_bindgen_0a9b2c955dab0026_base
+
+{-# NOINLINE sDL_SeekIO #-}
+
+-- | Seek within an 'SDL_IOStream' data stream.
+--
+--     This function seeks to byte @offset@, relative to @whence@.
+--
+--     @whence@ may be any of the following values:
+--
+--     * @SDL_IO_SEEK_SET@: seek from the beginning of data
+--
+--     * @SDL_IO_SEEK_CUR@: seek relative to current read point
+--
+--     * @SDL_IO_SEEK_END@: seek relative to the end of data
+--
+--     If this stream can not seek, it will return -1.
+--
+--     [@context@]: a pointer to an 'SDL_IOStream' structure.
+--
+--     [@offset@]: an offset in bytes, relative to @whence@ location; can be negative.
+--
+--     [@whence@]: any of @SDL_IO_SEEK_SET@, @SDL_IO_SEEK_CUR@, @SDL_IO_SEEK_END@.
+--
+--     [Returns]: the final offset in the data stream after the seek or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TellIO'
+--
+--     [C declaration]: @SDL_SeekIO@, defined at @SDL3\/SDL_iostream.h 554:36@
+sDL_SeekIO
+  :: BG.FunPtr
+       ( BG.Ptr SDL_IOStream
+         -> SDL3.Sys.Bindgen.Stdinc.Sint64
+         -> SDL_IOWhence
+         -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+       )
+sDL_SeekIO =
+  BG.unsafePerformIO hs_bindgen_0a9b2c955dab0026
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_TellIO@
+foreign import ccall unsafe "hs_bindgen_bef67ceee53b6142"
+  hs_bindgen_bef67ceee53b6142_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_TellIO@
+hs_bindgen_bef67ceee53b6142
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> IO SDL3.Sys.Bindgen.Stdinc.Sint64))
+hs_bindgen_bef67ceee53b6142 =
+  BG.fromFFIType hs_bindgen_bef67ceee53b6142_base
+
+{-# NOINLINE sDL_TellIO #-}
+
+-- | Determine the current read\/write offset in an 'SDL_IOStream' data stream.
+--
+--     SDL_TellIO is actually a wrapper function that calls the 'SDL_IOStream' \'s @seek@ method, with an offset of 0 bytes from @SDL_IO_SEEK_CUR@, to simplify application development.
+--
+--     [@context@]: an 'SDL_IOStream' data stream object from which to get the current offset.
+--
+--     [Returns]: the current offset in the stream, or -1 if the information can not be determined.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SeekIO'
+--
+--     [C declaration]: @SDL_TellIO@, defined at @SDL3\/SDL_iostream.h 574:36@
+sDL_TellIO :: BG.FunPtr (BG.Ptr SDL_IOStream -> IO SDL3.Sys.Bindgen.Stdinc.Sint64)
+sDL_TellIO =
+  BG.unsafePerformIO hs_bindgen_bef67ceee53b6142
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadIO@
+foreign import ccall unsafe "hs_bindgen_0c9d4db36a2719b6"
+  hs_bindgen_0c9d4db36a2719b6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadIO@
+hs_bindgen_0c9d4db36a2719b6
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_IOStream
+             -> BG.Ptr BG.Void
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+       )
+hs_bindgen_0c9d4db36a2719b6 =
+  BG.fromFFIType hs_bindgen_0c9d4db36a2719b6_base
+
+{-# NOINLINE sDL_ReadIO #-}
+
+-- | Read from a data source.
+--
+--     This function reads up @size@ bytes from the data source to the area pointed at by @ptr@. This function may read less bytes than requested.
+--
+--     This function will return zero when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If zero is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     A request for zero bytes on a valid stream will return zero immediately without accessing the stream, so the stream status (EOF, err, etc) will not change.
+--
+--     [@context@]: a pointer to an 'SDL_IOStream' structure.
+--
+--     [@ptr@]: a pointer to a buffer to read data into.
+--
+--     [@size@]: the number of bytes to read from the data source.
+--
+--     [Returns]: the number of bytes read, or 0 on end of file or other failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WriteIO', 'sDL_GetIOStatus'
+--
+--     [C declaration]: @SDL_ReadIO@, defined at @SDL3\/SDL_iostream.h 604:36@
+sDL_ReadIO
+  :: BG.FunPtr
+       ( BG.Ptr SDL_IOStream
+         -> BG.Ptr BG.Void
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO HsBindgen.Runtime.LibC.CSize
+       )
+sDL_ReadIO =
+  BG.unsafePerformIO hs_bindgen_0c9d4db36a2719b6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteIO@
+foreign import ccall unsafe "hs_bindgen_d9956d7898ea90e2"
+  hs_bindgen_d9956d7898ea90e2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteIO@
+hs_bindgen_d9956d7898ea90e2
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_IOStream
+             -> PtrConst.PtrConst BG.Void
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+       )
+hs_bindgen_d9956d7898ea90e2 =
+  BG.fromFFIType hs_bindgen_d9956d7898ea90e2_base
+
+{-# NOINLINE sDL_WriteIO #-}
+
+-- | Write to an 'SDL_IOStream' data stream.
+--
+--     This function writes exactly @size@ bytes from the area pointed at by @ptr@ to the stream. If this fails for any reason, it\'ll return less than @size@ to demonstrate how far the write progressed. On success, it returns @size@.
+--
+--     On error, this function still attempts to write as much as possible, so it might return a positive value less than the requested write size.
+--
+--     The caller can use @SDL_GetIOStatus()@ to determine if the problem is recoverable, such as a non-blocking write that can simply be retried later, or a fatal error.
+--
+--     A request for zero bytes on a valid stream will return zero immediately without accessing the stream, so the stream status (EOF, err, etc) will not change.
+--
+--     [@context@]: a pointer to an 'SDL_IOStream' structure.
+--
+--     [@ptr@]: a pointer to a buffer containing data to write.
+--
+--     [@size@]: the number of bytes to write.
+--
+--     [Returns]: the number of bytes written, which will be less than @size@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_IOprintf@, 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_FlushIO', 'sDL_GetIOStatus'
+--
+--     [C declaration]: @SDL_WriteIO@, defined at @SDL3\/SDL_iostream.h 640:36@
+sDL_WriteIO
+  :: BG.FunPtr
+       ( BG.Ptr SDL_IOStream
+         -> PtrConst.PtrConst BG.Void
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO HsBindgen.Runtime.LibC.CSize
+       )
+sDL_WriteIO =
+  BG.unsafePerformIO hs_bindgen_d9956d7898ea90e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_FlushIO@
+foreign import ccall unsafe "hs_bindgen_ae112d17ec9c64f0"
+  hs_bindgen_ae112d17ec9c64f0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_FlushIO@
+hs_bindgen_ae112d17ec9c64f0 :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> IO BG.CBool))
+hs_bindgen_ae112d17ec9c64f0 =
+  BG.fromFFIType hs_bindgen_ae112d17ec9c64f0_base
+
+{-# NOINLINE sDL_FlushIO #-}
+
+-- | Flush any buffered data in the stream.
+--
+--     This function makes sure that any buffered data is written to the stream. Normally this isn\'t necessary but if the stream is a pipe or socket it guarantees that any pending data is sent.
+--
+--     [@context@]: 'SDL_IOStream' structure to flush.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_FlushIO@, defined at @SDL3\/SDL_iostream.h 701:34@
+sDL_FlushIO :: BG.FunPtr (BG.Ptr SDL_IOStream -> IO BG.CBool)
+sDL_FlushIO =
+  BG.unsafePerformIO hs_bindgen_ae112d17ec9c64f0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_LoadFile_IO@
+foreign import ccall unsafe "hs_bindgen_e46ab82952c4c1d4"
+  hs_bindgen_e46ab82952c4c1d4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_LoadFile_IO@
+hs_bindgen_e46ab82952c4c1d4
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_IOStream -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> BG.CBool -> IO (BG.Ptr BG.Void))
+       )
+hs_bindgen_e46ab82952c4c1d4 =
+  BG.fromFFIType hs_bindgen_e46ab82952c4c1d4_base
+
+{-# NOINLINE sDL_LoadFile_IO #-}
+
+-- | Load all the data from an SDL data stream.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with SDL_free().
+--
+--     [@src@]: the 'SDL_IOStream' to read all available data from.
+--
+--     [@datasize@]: a pointer filled in with the number of bytes read, may be NULL.
+--
+--     [@closeio@]: if true, calls @SDL_CloseIO()@ on @src@ before returning, even in the case of an error.
+--
+--     [Returns]: the data or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadFile', 'sDL_SaveFile_IO'
+--
+--     [C declaration]: @SDL_LoadFile_IO@, defined at @SDL3\/SDL_iostream.h 727:36@
+sDL_LoadFile_IO
+  :: BG.FunPtr
+       (BG.Ptr SDL_IOStream -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> BG.CBool -> IO (BG.Ptr BG.Void))
+sDL_LoadFile_IO =
+  BG.unsafePerformIO hs_bindgen_e46ab82952c4c1d4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_LoadFile@
+foreign import ccall unsafe "hs_bindgen_ea9bbd4467b9e2c6"
+  hs_bindgen_ea9bbd4467b9e2c6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_LoadFile@
+hs_bindgen_ea9bbd4467b9e2c6
+  :: IO
+       (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+hs_bindgen_ea9bbd4467b9e2c6 =
+  BG.fromFFIType hs_bindgen_ea9bbd4467b9e2c6_base
+
+{-# NOINLINE sDL_LoadFile #-}
+
+-- | Load all the data from a file path.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with SDL_free().
+--
+--     [@file@]: the path to read all available data from.
+--
+--     [@datasize@]: if not NULL, will store the number of bytes read.
+--
+--     [Returns]: the data or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadFile_IO', 'sDL_SaveFile'
+--
+--     [C declaration]: @SDL_LoadFile@, defined at @SDL3\/SDL_iostream.h 750:36@
+sDL_LoadFile
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void))
+sDL_LoadFile =
+  BG.unsafePerformIO hs_bindgen_ea9bbd4467b9e2c6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_SaveFile_IO@
+foreign import ccall unsafe "hs_bindgen_de0267086f8fc295"
+  hs_bindgen_de0267086f8fc295_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_SaveFile_IO@
+hs_bindgen_de0267086f8fc295
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_IOStream
+             -> PtrConst.PtrConst BG.Void
+             -> HsBindgen.Runtime.LibC.CSize
+             -> BG.CBool
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_de0267086f8fc295 =
+  BG.fromFFIType hs_bindgen_de0267086f8fc295_base
+
+{-# NOINLINE sDL_SaveFile_IO #-}
+
+-- | Save all the data into an SDL data stream.
+--
+--     [@src@]: the 'SDL_IOStream' to write all data to.
+--
+--     [@data@]: the data to be written. If datasize is 0, may be NULL or a invalid pointer.
+--
+--     [@datasize@]: the number of bytes to be written.
+--
+--     [@closeio@]: if true, calls @SDL_CloseIO()@ on @src@ before returning, even in the case of an error.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SaveFile', 'sDL_LoadFile_IO'
+--
+--     [C declaration]: @SDL_SaveFile_IO@, defined at @SDL3\/SDL_iostream.h 771:34@
+sDL_SaveFile_IO
+  :: BG.FunPtr
+       ( BG.Ptr SDL_IOStream
+         -> PtrConst.PtrConst BG.Void
+         -> HsBindgen.Runtime.LibC.CSize
+         -> BG.CBool
+         -> IO BG.CBool
+       )
+sDL_SaveFile_IO =
+  BG.unsafePerformIO hs_bindgen_de0267086f8fc295
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_SaveFile@
+foreign import ccall unsafe "hs_bindgen_841c544344507810"
+  hs_bindgen_841c544344507810_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_SaveFile@
+hs_bindgen_841c544344507810
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.Void
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_841c544344507810 =
+  BG.fromFFIType hs_bindgen_841c544344507810_base
+
+{-# NOINLINE sDL_SaveFile #-}
+
+-- | Save all the data into a file path.
+--
+--     [@file@]: the path to write all available data into.
+--
+--     [@data@]: the data to be written. If datasize is 0, may be NULL or a invalid pointer.
+--
+--     [@datasize@]: the number of bytes to be written.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SaveFile_IO', 'sDL_LoadFile'
+--
+--     [C declaration]: @SDL_SaveFile@, defined at @SDL3\/SDL_iostream.h 790:34@
+sDL_SaveFile
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.Void
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CBool
+       )
+sDL_SaveFile =
+  BG.unsafePerformIO hs_bindgen_841c544344507810
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU8@
+foreign import ccall unsafe "hs_bindgen_c304f9e2b3baf9dd"
+  hs_bindgen_c304f9e2b3baf9dd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU8@
+hs_bindgen_c304f9e2b3baf9dd
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool))
+hs_bindgen_c304f9e2b3baf9dd =
+  BG.fromFFIType hs_bindgen_c304f9e2b3baf9dd_base
+
+{-# NOINLINE sDL_ReadU8 #-}
+
+-- | Use this function to read a byte from an 'SDL_IOStream'.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the 'SDL_IOStream' to read from.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on success or false on failure or EOF; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU8@, defined at @SDL3\/SDL_iostream.h 816:34@
+sDL_ReadU8 :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool)
+sDL_ReadU8 =
+  BG.unsafePerformIO hs_bindgen_c304f9e2b3baf9dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS8@
+foreign import ccall unsafe "hs_bindgen_c39406dce63371f8"
+  hs_bindgen_c39406dce63371f8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS8@
+hs_bindgen_c39406dce63371f8
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint8 -> IO BG.CBool))
+hs_bindgen_c39406dce63371f8 =
+  BG.fromFFIType hs_bindgen_c39406dce63371f8_base
+
+{-# NOINLINE sDL_ReadS8 #-}
+
+-- | Use this function to read a signed byte from an 'SDL_IOStream'.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the 'SDL_IOStream' to read from.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS8@, defined at @SDL3\/SDL_iostream.h 835:34@
+sDL_ReadS8 :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint8 -> IO BG.CBool)
+sDL_ReadS8 =
+  BG.unsafePerformIO hs_bindgen_c39406dce63371f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU16LE@
+foreign import ccall unsafe "hs_bindgen_6849a0e565e7ac74"
+  hs_bindgen_6849a0e565e7ac74_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU16LE@
+hs_bindgen_6849a0e565e7ac74
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool))
+hs_bindgen_6849a0e565e7ac74 =
+  BG.fromFFIType hs_bindgen_6849a0e565e7ac74_base
+
+{-# NOINLINE sDL_ReadU16LE #-}
+
+-- | Use this function to read 16 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU16LE@, defined at @SDL3\/SDL_iostream.h 858:34@
+sDL_ReadU16LE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+sDL_ReadU16LE =
+  BG.unsafePerformIO hs_bindgen_6849a0e565e7ac74
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS16LE@
+foreign import ccall unsafe "hs_bindgen_fe15c03a2323f8ee"
+  hs_bindgen_fe15c03a2323f8ee_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS16LE@
+hs_bindgen_fe15c03a2323f8ee
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool))
+hs_bindgen_fe15c03a2323f8ee =
+  BG.fromFFIType hs_bindgen_fe15c03a2323f8ee_base
+
+{-# NOINLINE sDL_ReadS16LE #-}
+
+-- | Use this function to read 16 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS16LE@, defined at @SDL3\/SDL_iostream.h 881:34@
+sDL_ReadS16LE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool)
+sDL_ReadS16LE =
+  BG.unsafePerformIO hs_bindgen_fe15c03a2323f8ee
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU16BE@
+foreign import ccall unsafe "hs_bindgen_04f5c88868a2821e"
+  hs_bindgen_04f5c88868a2821e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU16BE@
+hs_bindgen_04f5c88868a2821e
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool))
+hs_bindgen_04f5c88868a2821e =
+  BG.fromFFIType hs_bindgen_04f5c88868a2821e_base
+
+{-# NOINLINE sDL_ReadU16BE #-}
+
+-- | Use this function to read 16 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU16BE@, defined at @SDL3\/SDL_iostream.h 904:34@
+sDL_ReadU16BE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+sDL_ReadU16BE =
+  BG.unsafePerformIO hs_bindgen_04f5c88868a2821e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS16BE@
+foreign import ccall unsafe "hs_bindgen_ab83010c5ae7ab35"
+  hs_bindgen_ab83010c5ae7ab35_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS16BE@
+hs_bindgen_ab83010c5ae7ab35
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool))
+hs_bindgen_ab83010c5ae7ab35 =
+  BG.fromFFIType hs_bindgen_ab83010c5ae7ab35_base
+
+{-# NOINLINE sDL_ReadS16BE #-}
+
+-- | Use this function to read 16 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS16BE@, defined at @SDL3\/SDL_iostream.h 927:34@
+sDL_ReadS16BE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool)
+sDL_ReadS16BE =
+  BG.unsafePerformIO hs_bindgen_ab83010c5ae7ab35
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU32LE@
+foreign import ccall unsafe "hs_bindgen_4dedf81005dea655"
+  hs_bindgen_4dedf81005dea655_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU32LE@
+hs_bindgen_4dedf81005dea655
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_4dedf81005dea655 =
+  BG.fromFFIType hs_bindgen_4dedf81005dea655_base
+
+{-# NOINLINE sDL_ReadU32LE #-}
+
+-- | Use this function to read 32 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU32LE@, defined at @SDL3\/SDL_iostream.h 950:34@
+sDL_ReadU32LE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_ReadU32LE =
+  BG.unsafePerformIO hs_bindgen_4dedf81005dea655
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS32LE@
+foreign import ccall unsafe "hs_bindgen_fffd09bacab3320d"
+  hs_bindgen_fffd09bacab3320d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS32LE@
+hs_bindgen_fffd09bacab3320d
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool))
+hs_bindgen_fffd09bacab3320d =
+  BG.fromFFIType hs_bindgen_fffd09bacab3320d_base
+
+{-# NOINLINE sDL_ReadS32LE #-}
+
+-- | Use this function to read 32 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS32LE@, defined at @SDL3\/SDL_iostream.h 973:34@
+sDL_ReadS32LE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool)
+sDL_ReadS32LE =
+  BG.unsafePerformIO hs_bindgen_fffd09bacab3320d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU32BE@
+foreign import ccall unsafe "hs_bindgen_42b0f1d027be0c67"
+  hs_bindgen_42b0f1d027be0c67_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU32BE@
+hs_bindgen_42b0f1d027be0c67
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_42b0f1d027be0c67 =
+  BG.fromFFIType hs_bindgen_42b0f1d027be0c67_base
+
+{-# NOINLINE sDL_ReadU32BE #-}
+
+-- | Use this function to read 32 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU32BE@, defined at @SDL3\/SDL_iostream.h 996:34@
+sDL_ReadU32BE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_ReadU32BE =
+  BG.unsafePerformIO hs_bindgen_42b0f1d027be0c67
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS32BE@
+foreign import ccall unsafe "hs_bindgen_97bc8b4d68748597"
+  hs_bindgen_97bc8b4d68748597_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS32BE@
+hs_bindgen_97bc8b4d68748597
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool))
+hs_bindgen_97bc8b4d68748597 =
+  BG.fromFFIType hs_bindgen_97bc8b4d68748597_base
+
+{-# NOINLINE sDL_ReadS32BE #-}
+
+-- | Use this function to read 32 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS32BE@, defined at @SDL3\/SDL_iostream.h 1019:34@
+sDL_ReadS32BE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool)
+sDL_ReadS32BE =
+  BG.unsafePerformIO hs_bindgen_97bc8b4d68748597
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU64LE@
+foreign import ccall unsafe "hs_bindgen_076f54bb27254ddb"
+  hs_bindgen_076f54bb27254ddb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU64LE@
+hs_bindgen_076f54bb27254ddb
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO BG.CBool))
+hs_bindgen_076f54bb27254ddb =
+  BG.fromFFIType hs_bindgen_076f54bb27254ddb_base
+
+{-# NOINLINE sDL_ReadU64LE #-}
+
+-- | Use this function to read 64 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU64LE@, defined at @SDL3\/SDL_iostream.h 1042:34@
+sDL_ReadU64LE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO BG.CBool)
+sDL_ReadU64LE =
+  BG.unsafePerformIO hs_bindgen_076f54bb27254ddb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS64LE@
+foreign import ccall unsafe "hs_bindgen_1aa96b5b13230b9b"
+  hs_bindgen_1aa96b5b13230b9b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS64LE@
+hs_bindgen_1aa96b5b13230b9b
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64 -> IO BG.CBool))
+hs_bindgen_1aa96b5b13230b9b =
+  BG.fromFFIType hs_bindgen_1aa96b5b13230b9b_base
+
+{-# NOINLINE sDL_ReadS64LE #-}
+
+-- | Use this function to read 64 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS64LE@, defined at @SDL3\/SDL_iostream.h 1065:34@
+sDL_ReadS64LE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64 -> IO BG.CBool)
+sDL_ReadS64LE =
+  BG.unsafePerformIO hs_bindgen_1aa96b5b13230b9b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU64BE@
+foreign import ccall unsafe "hs_bindgen_b0379b9f20acb50b"
+  hs_bindgen_b0379b9f20acb50b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadU64BE@
+hs_bindgen_b0379b9f20acb50b
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO BG.CBool))
+hs_bindgen_b0379b9f20acb50b =
+  BG.fromFFIType hs_bindgen_b0379b9f20acb50b_base
+
+{-# NOINLINE sDL_ReadU64BE #-}
+
+-- | Use this function to read 64 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU64BE@, defined at @SDL3\/SDL_iostream.h 1088:34@
+sDL_ReadU64BE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO BG.CBool)
+sDL_ReadU64BE =
+  BG.unsafePerformIO hs_bindgen_b0379b9f20acb50b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS64BE@
+foreign import ccall unsafe "hs_bindgen_91c79c6f23b10cea"
+  hs_bindgen_91c79c6f23b10cea_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_ReadS64BE@
+hs_bindgen_91c79c6f23b10cea
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64 -> IO BG.CBool))
+hs_bindgen_91c79c6f23b10cea =
+  BG.fromFFIType hs_bindgen_91c79c6f23b10cea_base
+
+{-# NOINLINE sDL_ReadS64BE #-}
+
+-- | Use this function to read 64 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [@src@]: the stream from which to read data.
+--
+--     [@value@]: a pointer filled in with the data read.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS64BE@, defined at @SDL3\/SDL_iostream.h 1111:34@
+sDL_ReadS64BE
+  :: BG.FunPtr (BG.Ptr SDL_IOStream -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64 -> IO BG.CBool)
+sDL_ReadS64BE =
+  BG.unsafePerformIO hs_bindgen_91c79c6f23b10cea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU8@
+foreign import ccall unsafe "hs_bindgen_6a41201b6dedc01d"
+  hs_bindgen_6a41201b6dedc01d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU8@
+hs_bindgen_6a41201b6dedc01d
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool))
+hs_bindgen_6a41201b6dedc01d =
+  BG.fromFFIType hs_bindgen_6a41201b6dedc01d_base
+
+{-# NOINLINE sDL_WriteU8 #-}
+
+-- | Use this function to write a byte to an 'SDL_IOStream'.
+--
+--     [@dst@]: the 'SDL_IOStream' to write to.
+--
+--     [@value@]: the byte value to write.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU8@, defined at @SDL3\/SDL_iostream.h 1133:34@
+sDL_WriteU8 :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool)
+sDL_WriteU8 =
+  BG.unsafePerformIO hs_bindgen_6a41201b6dedc01d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS8@
+foreign import ccall unsafe "hs_bindgen_7779de5157457a4b"
+  hs_bindgen_7779de5157457a4b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS8@
+hs_bindgen_7779de5157457a4b
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint8 -> IO BG.CBool))
+hs_bindgen_7779de5157457a4b =
+  BG.fromFFIType hs_bindgen_7779de5157457a4b_base
+
+{-# NOINLINE sDL_WriteS8 #-}
+
+-- | Use this function to write a signed byte to an 'SDL_IOStream'.
+--
+--     [@dst@]: the 'SDL_IOStream' to write to.
+--
+--     [@value@]: the byte value to write.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS8@, defined at @SDL3\/SDL_iostream.h 1147:34@
+sDL_WriteS8 :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint8 -> IO BG.CBool)
+sDL_WriteS8 =
+  BG.unsafePerformIO hs_bindgen_7779de5157457a4b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU16LE@
+foreign import ccall unsafe "hs_bindgen_d47e66728dda1cb5"
+  hs_bindgen_d47e66728dda1cb5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU16LE@
+hs_bindgen_d47e66728dda1cb5
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool))
+hs_bindgen_d47e66728dda1cb5 =
+  BG.fromFFIType hs_bindgen_d47e66728dda1cb5_base
+
+{-# NOINLINE sDL_WriteU16LE #-}
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU16LE@, defined at @SDL3\/SDL_iostream.h 1166:34@
+sDL_WriteU16LE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+sDL_WriteU16LE =
+  BG.unsafePerformIO hs_bindgen_d47e66728dda1cb5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS16LE@
+foreign import ccall unsafe "hs_bindgen_93f38ce5f51dbf43"
+  hs_bindgen_93f38ce5f51dbf43_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS16LE@
+hs_bindgen_93f38ce5f51dbf43
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool))
+hs_bindgen_93f38ce5f51dbf43 =
+  BG.fromFFIType hs_bindgen_93f38ce5f51dbf43_base
+
+{-# NOINLINE sDL_WriteS16LE #-}
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS16LE@, defined at @SDL3\/SDL_iostream.h 1185:34@
+sDL_WriteS16LE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool)
+sDL_WriteS16LE =
+  BG.unsafePerformIO hs_bindgen_93f38ce5f51dbf43
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU16BE@
+foreign import ccall unsafe "hs_bindgen_e336b4900affdc95"
+  hs_bindgen_e336b4900affdc95_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU16BE@
+hs_bindgen_e336b4900affdc95
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool))
+hs_bindgen_e336b4900affdc95 =
+  BG.fromFFIType hs_bindgen_e336b4900affdc95_base
+
+{-# NOINLINE sDL_WriteU16BE #-}
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU16BE@, defined at @SDL3\/SDL_iostream.h 1203:34@
+sDL_WriteU16BE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+sDL_WriteU16BE =
+  BG.unsafePerformIO hs_bindgen_e336b4900affdc95
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS16BE@
+foreign import ccall unsafe "hs_bindgen_ae3652657a7f54ff"
+  hs_bindgen_ae3652657a7f54ff_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS16BE@
+hs_bindgen_ae3652657a7f54ff
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool))
+hs_bindgen_ae3652657a7f54ff =
+  BG.fromFFIType hs_bindgen_ae3652657a7f54ff_base
+
+{-# NOINLINE sDL_WriteS16BE #-}
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS16BE@, defined at @SDL3\/SDL_iostream.h 1221:34@
+sDL_WriteS16BE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool)
+sDL_WriteS16BE =
+  BG.unsafePerformIO hs_bindgen_ae3652657a7f54ff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU32LE@
+foreign import ccall unsafe "hs_bindgen_3eafe174eec9869a"
+  hs_bindgen_3eafe174eec9869a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU32LE@
+hs_bindgen_3eafe174eec9869a
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_3eafe174eec9869a =
+  BG.fromFFIType hs_bindgen_3eafe174eec9869a_base
+
+{-# NOINLINE sDL_WriteU32LE #-}
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU32LE@, defined at @SDL3\/SDL_iostream.h 1240:34@
+sDL_WriteU32LE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_WriteU32LE =
+  BG.unsafePerformIO hs_bindgen_3eafe174eec9869a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS32LE@
+foreign import ccall unsafe "hs_bindgen_93d996acdc68faa4"
+  hs_bindgen_93d996acdc68faa4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS32LE@
+hs_bindgen_93d996acdc68faa4
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool))
+hs_bindgen_93d996acdc68faa4 =
+  BG.fromFFIType hs_bindgen_93d996acdc68faa4_base
+
+{-# NOINLINE sDL_WriteS32LE #-}
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS32LE@, defined at @SDL3\/SDL_iostream.h 1259:34@
+sDL_WriteS32LE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool)
+sDL_WriteS32LE =
+  BG.unsafePerformIO hs_bindgen_93d996acdc68faa4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU32BE@
+foreign import ccall unsafe "hs_bindgen_b65faf115109388d"
+  hs_bindgen_b65faf115109388d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU32BE@
+hs_bindgen_b65faf115109388d
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_b65faf115109388d =
+  BG.fromFFIType hs_bindgen_b65faf115109388d_base
+
+{-# NOINLINE sDL_WriteU32BE #-}
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU32BE@, defined at @SDL3\/SDL_iostream.h 1277:34@
+sDL_WriteU32BE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_WriteU32BE =
+  BG.unsafePerformIO hs_bindgen_b65faf115109388d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS32BE@
+foreign import ccall unsafe "hs_bindgen_dfe1b91f6dd8a3fa"
+  hs_bindgen_dfe1b91f6dd8a3fa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS32BE@
+hs_bindgen_dfe1b91f6dd8a3fa
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool))
+hs_bindgen_dfe1b91f6dd8a3fa =
+  BG.fromFFIType hs_bindgen_dfe1b91f6dd8a3fa_base
+
+{-# NOINLINE sDL_WriteS32BE #-}
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS32BE@, defined at @SDL3\/SDL_iostream.h 1295:34@
+sDL_WriteS32BE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool)
+sDL_WriteS32BE =
+  BG.unsafePerformIO hs_bindgen_dfe1b91f6dd8a3fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU64LE@
+foreign import ccall unsafe "hs_bindgen_2d1c699323094d03"
+  hs_bindgen_2d1c699323094d03_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU64LE@
+hs_bindgen_2d1c699323094d03
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO BG.CBool))
+hs_bindgen_2d1c699323094d03 =
+  BG.fromFFIType hs_bindgen_2d1c699323094d03_base
+
+{-# NOINLINE sDL_WriteU64LE #-}
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU64LE@, defined at @SDL3\/SDL_iostream.h 1314:34@
+sDL_WriteU64LE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO BG.CBool)
+sDL_WriteU64LE =
+  BG.unsafePerformIO hs_bindgen_2d1c699323094d03
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS64LE@
+foreign import ccall unsafe "hs_bindgen_fe1f17e206d55f2a"
+  hs_bindgen_fe1f17e206d55f2a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS64LE@
+hs_bindgen_fe1f17e206d55f2a
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint64 -> IO BG.CBool))
+hs_bindgen_fe1f17e206d55f2a =
+  BG.fromFFIType hs_bindgen_fe1f17e206d55f2a_base
+
+{-# NOINLINE sDL_WriteS64LE #-}
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS64LE@, defined at @SDL3\/SDL_iostream.h 1333:34@
+sDL_WriteS64LE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint64 -> IO BG.CBool)
+sDL_WriteS64LE =
+  BG.unsafePerformIO hs_bindgen_fe1f17e206d55f2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU64BE@
+foreign import ccall unsafe "hs_bindgen_9dd43ac41e9a2bb2"
+  hs_bindgen_9dd43ac41e9a2bb2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteU64BE@
+hs_bindgen_9dd43ac41e9a2bb2
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO BG.CBool))
+hs_bindgen_9dd43ac41e9a2bb2 =
+  BG.fromFFIType hs_bindgen_9dd43ac41e9a2bb2_base
+
+{-# NOINLINE sDL_WriteU64BE #-}
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU64BE@, defined at @SDL3\/SDL_iostream.h 1351:34@
+sDL_WriteU64BE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO BG.CBool)
+sDL_WriteU64BE =
+  BG.unsafePerformIO hs_bindgen_9dd43ac41e9a2bb2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS64BE@
+foreign import ccall unsafe "hs_bindgen_fbc1776f62682806"
+  hs_bindgen_fbc1776f62682806_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_get_SDL_WriteS64BE@
+hs_bindgen_fbc1776f62682806
+  :: IO (BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint64 -> IO BG.CBool))
+hs_bindgen_fbc1776f62682806 =
+  BG.fromFFIType hs_bindgen_fbc1776f62682806_base
+
+{-# NOINLINE sDL_WriteS64BE #-}
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [@dst@]: the stream to which data will be written.
+--
+--     [@value@]: the data to be written, in native format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS64BE@, defined at @SDL3\/SDL_iostream.h 1369:34@
+sDL_WriteS64BE :: BG.FunPtr (BG.Ptr SDL_IOStream -> SDL3.Sys.Bindgen.Stdinc.Sint64 -> IO BG.CBool)
+sDL_WriteS64BE =
+  BG.unsafePerformIO hs_bindgen_fbc1776f62682806
diff --git a/src/SDL3/Sys/Bindgen/Iostream/Safe.hs b/src/SDL3/Sys/Bindgen/Iostream/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Iostream/Safe.hs
@@ -0,0 +1,2272 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Iostream.Safe (
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_IOFromFile,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_IOFromMem,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_IOFromConstMem,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_IOFromDynamicMem,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_OpenIO,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_CloseIO,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_GetIOProperties,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_GetIOStatus,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_GetIOSize,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_SeekIO,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_TellIO,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadIO,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteIO,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_FlushIO,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_LoadFile_IO,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_LoadFile,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_SaveFile_IO,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_SaveFile,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadU8,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadS8,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadU16LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadS16LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadU16BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadS16BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadU32LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadS32LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadU32BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadS32BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadU64LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadS64LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadU64BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_ReadS64BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteU8,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteS8,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteU16LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteS16LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteU16BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteS16BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteU32LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteS32LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteU32BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteS32BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteU64LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteS64LE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteU64BE,
+  SDL3.Sys.Bindgen.Iostream.Safe.sDL_WriteS64BE,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Iostream
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_iostream.h>"
+         , "SDL_IOStream *hs_bindgen_34e479a8367942af ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_IOFromFile)(arg1, arg2);"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_cf3ad24eb5c5fc0a ("
+         , "  void *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_IOFromMem)(arg1, arg2);"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_5e86d852c63fbcca ("
+         , "  void const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_IOFromConstMem)(arg1, arg2);"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_683cd141fd8245a6 (void)"
+         , "{"
+         , "  return (SDL_IOFromDynamicMem)();"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_03754d9f752b3672 ("
+         , "  SDL_IOStreamInterface const *arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenIO)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_3194e5e921bc697c ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CloseIO)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_16a31766d73c85ef ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetIOProperties)(arg1);"
+         , "}"
+         , "SDL_IOStatus hs_bindgen_aa2e9a65d05ce21f ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetIOStatus)(arg1);"
+         , "}"
+         , "Sint64 hs_bindgen_54da1584c7a84cda ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetIOSize)(arg1);"
+         , "}"
+         , "Sint64 hs_bindgen_0c3b6f6c9596a5d8 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 arg2,"
+         , "  SDL_IOWhence arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SeekIO)(arg1, arg2, arg3);"
+         , "}"
+         , "Sint64 hs_bindgen_094df7d1bb2e26ac ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TellIO)(arg1);"
+         , "}"
+         , "size_t hs_bindgen_04c1c6ca873e76fc ("
+         , "  SDL_IOStream *arg1,"
+         , "  void *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadIO)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_ec9c16b5e587afb8 ("
+         , "  SDL_IOStream *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteIO)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_bbb89fd7a1a95596 ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_FlushIO)(arg1);"
+         , "}"
+         , "void *hs_bindgen_8fefdb56bfbc407b ("
+         , "  SDL_IOStream *arg1,"
+         , "  size_t *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadFile_IO)(arg1, arg2, arg3);"
+         , "}"
+         , "void *hs_bindgen_3ffc176218094904 ("
+         , "  char const *arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadFile)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ee2bf39575dd56cd ("
+         , "  SDL_IOStream *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SaveFile_IO)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_1157ae79ba240b92 ("
+         , "  char const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SaveFile)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_9458dbc19d3102af ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint8 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU8)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_9ef691b554f38735 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint8 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS8)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_312b11f2676e3c2f ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU16LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_bfc3c7dd523a2b73 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS16LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_9b3b157e729c0965 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU16BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_53f6414a33954d51 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS16BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_cf9bb68f7e8594b1 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU32LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_e2c2855a2483a810 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS32LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8cce948b1185d898 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU32BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_74529309d09c0236 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS32BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a50de42944661366 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU64LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5dc23c0193ff348f ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS64LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5c7313fe19df3bc5 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU64BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_77cc43bf1b465b08 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS64BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_06be6eeabea4ef7e ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU8)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b7f1551a531fd2e5 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint8 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS8)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_dc258899c026cf6f ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU16LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a1111b4c96df3259 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS16LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a4cb3983fa64c5c7 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU16BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_161a5c3e908403a2 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS16BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ae468e82155587e1 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU32LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_175539b403c6fd0c ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS32LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_f6e00995ced904a6 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU32BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7986b77b455fd8d4 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS32BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_065f64617e3e327c ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU64LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_846e3f81a5b9c657 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS64LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8f9d3f23bd1a20e7 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU64BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ef095eaa3e7cb9b4 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS64BE)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_IOFromFile@
+foreign import ccall safe "hs_bindgen_34e479a8367942af"
+  hs_bindgen_34e479a8367942af_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_IOFromFile@
+hs_bindgen_34e479a8367942af
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_IOStream)
+hs_bindgen_34e479a8367942af =
+  BG.fromFFIType hs_bindgen_34e479a8367942af_base
+
+-- | Use this function to create a new 'SDL_IOStream' structure for reading from and\/or writing to a named file.
+--
+--     The @mode@ string is treated roughly the same as in a call to the C library\'s fopen(), even if SDL doesn\'t happen to use fopen() behind the scenes.
+--
+--     Available @mode@ strings:
+--
+--     * \"r\": Open a file for reading. The file must exist.
+--
+--     * \"w\": Create an empty file for writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     * \"wx\": Create an empty file for writing. If a file with the same name already exists, the call fails.
+--
+--     * \"a\": Append to a file. Writing operations append data at the end of the file. The file is created if it does not exist.
+--
+--     * \"r+\": Open a file for update both reading and writing. The file must exist.
+--
+--     * \"w+\": Create an empty file for both reading and writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     * \"w+x\": Create an empty file for both reading and writing. If a file with the same name already exists, the call fails.
+--
+--     * \"a+\": Open a file for reading and appending. All writing operations are performed at the end of the file, protecting the previous content to be overwritten. You can reposition (fseek, rewind) the internal pointer to anywhere in the file for reading, but writing operations will move it back to the end of file. The file is created if it does not exist.
+--
+--     __NOTE__: In order to open a file as a binary file, a \"b\" character has to be included in the @mode@ string. This additional \"b\" character can either be appended at the end of the string (thus making the following compound modes: \"rb\", \"wb\", \"ab\", \"r+b\", \"w+b\", \"a+b\") or be inserted between the letter and the \"+\" sign for the mixed modes (\"rb+\", \"wb+\", \"ab+\"). Additional characters may follow the sequence, although they should have no effect. For example, \"t\" is sometimes appended to make explicit the file is a text file.
+--
+--     This function supports Unicode filenames, but they must be encoded in UTF-8 format, regardless of the underlying operating system.
+--
+--     In Android, @SDL_IOFromFile()@ can be used to open content:\/\/ URIs. As a fallback, @SDL_IOFromFile()@ will transparently open a matching filename in the app\'s @assets@.
+--
+--     Closing the 'SDL_IOStream' will close SDL\'s internal file handle.
+--
+--     The following properties may be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER'@: a pointer, that can be cast to a win32 @HANDLE@, that this 'SDL_IOStream' is using to access the filesystem. If the program isn\'t running on Windows, or SDL used some other method to access the filesystem, this property will not be set.
+--
+--     * @'sDL_PROP_IOSTREAM_STDIO_FILE_POINTER'@: a pointer, that can be cast to a stdio @FILE *@, that this 'SDL_IOStream' is using to access the filesystem. If SDL used some other method to access the filesystem, this property will not be set. PLEASE NOTE that if SDL is using a different C runtime than your app, trying to use this pointer will almost certainly result in a crash! This is mostly a problem on Windows; make sure you build SDL and your app with the same compiler and settings to avoid it.
+--
+--     * @'sDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER'@: a file descriptor that this 'SDL_IOStream' is using to access the filesystem.
+--
+--     * @'sDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER'@: a pointer, that can be cast to an Android NDK @AAsset *@, that this 'SDL_IOStream' is using to access the filesystem. If SDL used some other method to access the filesystem, this property will not be set.
+--
+--     [Returns]: a pointer to the 'SDL_IOStream' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseIO', 'sDL_FlushIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_IOFromFile@, defined at @SDL3\/SDL_iostream.h 278:44@
+sDL_IOFromFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a UTF-8 string representing the filename to open.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mode@]: an ASCII string representing the mode to be used for opening the file.
+  -> IO (BG.Ptr SDL_IOStream)
+sDL_IOFromFile = hs_bindgen_34e479a8367942af
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_IOFromMem@
+foreign import ccall safe "hs_bindgen_cf3ad24eb5c5fc0a"
+  hs_bindgen_cf3ad24eb5c5fc0a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_IOFromMem@
+hs_bindgen_cf3ad24eb5c5fc0a
+  :: BG.Ptr BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr SDL_IOStream)
+hs_bindgen_cf3ad24eb5c5fc0a =
+  BG.fromFFIType hs_bindgen_cf3ad24eb5c5fc0a_base
+
+-- | Use this function to prepare a read-write memory buffer for use with 'SDL_IOStream'.
+--
+--     This function sets up an 'SDL_IOStream' struct based on a memory area of a certain size, for both read and write access.
+--
+--     This memory buffer is not copied by the 'SDL_IOStream'; the pointer you provide must remain valid until you close the stream.
+--
+--     If you need to make sure the 'SDL_IOStream' never writes to the memory buffer, you should use @SDL_IOFromConstMem()@ with a read-only buffer of memory instead.
+--
+--     The following properties will be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_POINTER'@: this will be the @mem@ parameter that was passed to this function.
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER'@: this will be the @size@ parameter that was passed to this function.
+--
+--     Additionally, the following properties are recognized:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER'@: if this property is set to a non-NULL value it will be interpreted as a function of SDL_free_func type and called with the passed @mem@ pointer when closing the stream. By default it is unset, i.e., the memory will not be freed.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_IOFromConstMem', 'sDL_CloseIO', 'sDL_FlushIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_IOFromMem@, defined at @SDL3\/SDL_iostream.h 330:44@
+sDL_IOFromMem
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to a buffer to feed an 'SDL_IOStream' stream.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the buffer size, in bytes.
+  -> IO (BG.Ptr SDL_IOStream)
+sDL_IOFromMem = hs_bindgen_cf3ad24eb5c5fc0a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_IOFromConstMem@
+foreign import ccall safe "hs_bindgen_5e86d852c63fbcca"
+  hs_bindgen_5e86d852c63fbcca_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_IOFromConstMem@
+hs_bindgen_5e86d852c63fbcca
+  :: PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr SDL_IOStream)
+hs_bindgen_5e86d852c63fbcca =
+  BG.fromFFIType hs_bindgen_5e86d852c63fbcca_base
+
+-- | Use this function to prepare a read-only memory buffer for use with 'SDL_IOStream'.
+--
+--     This function sets up an 'SDL_IOStream' struct based on a memory area of a certain size. It assumes the memory area is not writable.
+--
+--     Attempting to write to this 'SDL_IOStream' stream will report an error without writing to the memory buffer.
+--
+--     This memory buffer is not copied by the 'SDL_IOStream'; the pointer you provide must remain valid until you close the stream.
+--
+--     If you need to write to a memory buffer, you should use @SDL_IOFromMem()@ with a writable buffer of memory instead.
+--
+--     The following properties will be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_POINTER'@: this will be the @mem@ parameter that was passed to this function.
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER'@: this will be the @size@ parameter that was passed to this function.
+--
+--     Additionally, the following properties are recognized:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER'@: if this property is set to a non-NULL value it will be interpreted as a function of SDL_free_func type and called with the passed @mem@ pointer when closing the stream. By default it is unset, i.e., the memory will not be freed.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_IOFromMem', 'sDL_CloseIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO'
+--
+--     [C declaration]: @SDL_IOFromConstMem@, defined at @SDL3\/SDL_iostream.h 381:44@
+sDL_IOFromConstMem
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to a read-only buffer to feed an 'SDL_IOStream' stream.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the buffer size, in bytes.
+  -> IO (BG.Ptr SDL_IOStream)
+sDL_IOFromConstMem = hs_bindgen_5e86d852c63fbcca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_IOFromDynamicMem@
+foreign import ccall safe "hs_bindgen_683cd141fd8245a6"
+  hs_bindgen_683cd141fd8245a6_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_IOFromDynamicMem@
+hs_bindgen_683cd141fd8245a6 :: IO (BG.Ptr SDL_IOStream)
+hs_bindgen_683cd141fd8245a6 =
+  BG.fromFFIType hs_bindgen_683cd141fd8245a6_base
+
+-- | Use this function to create an 'SDL_IOStream' that is backed by dynamically allocated memory.
+--
+--     This supports the following properties to provide access to the memory and control over allocations:
+--
+--     * @'sDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER'@: a pointer to the internal memory of the stream. This can be set to NULL to transfer ownership of the memory to the application, which should free the memory with SDL_free(). If this is done, the next operation on the stream must be @SDL_CloseIO()@.
+--
+--     * @'sDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER'@: memory will be allocated in multiples of this size, defaulting to 1024.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_IOFromDynamicMem@, defined at @SDL3\/SDL_iostream.h 411:44@
+sDL_IOFromDynamicMem :: IO (BG.Ptr SDL_IOStream)
+sDL_IOFromDynamicMem = hs_bindgen_683cd141fd8245a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_OpenIO@
+foreign import ccall safe "hs_bindgen_03754d9f752b3672"
+  hs_bindgen_03754d9f752b3672_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_OpenIO@
+hs_bindgen_03754d9f752b3672
+  :: PtrConst.PtrConst SDL_IOStreamInterface
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr SDL_IOStream)
+hs_bindgen_03754d9f752b3672 =
+  BG.fromFFIType hs_bindgen_03754d9f752b3672_base
+
+-- | Create a custom 'SDL_IOStream'.
+--
+--     Applications do not need to use this function unless they are providing their own 'SDL_IOStream' implementation. If you just need an 'SDL_IOStream' to read\/write a common data source, you should use the built-in implementations in SDL, like @SDL_IOFromFile()@ or @SDL_IOFromMem()@, etc.
+--
+--     This function makes a copy of @iface@ and the caller does not need to keep it around after this call.
+--
+--     [Returns]: a pointer to the allocated memory on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseIO', SDL_INIT_INTERFACE, 'sDL_IOFromConstMem', 'sDL_IOFromFile', 'sDL_IOFromMem'
+--
+--     [C declaration]: @SDL_OpenIO@, defined at @SDL3\/SDL_iostream.h 446:44@
+sDL_OpenIO
+  :: PtrConst.PtrConst SDL_IOStreamInterface
+  -- ^
+  --
+  --           [@iface@]: the interface that implements this 'SDL_IOStream', initialized using SDL_INIT_INTERFACE().
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer that will be passed to the interface functions.
+  -> IO (BG.Ptr SDL_IOStream)
+sDL_OpenIO = hs_bindgen_03754d9f752b3672
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_CloseIO@
+foreign import ccall safe "hs_bindgen_3194e5e921bc697c"
+  hs_bindgen_3194e5e921bc697c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_CloseIO@
+hs_bindgen_3194e5e921bc697c
+  :: BG.Ptr SDL_IOStream
+  -> IO BG.CBool
+hs_bindgen_3194e5e921bc697c =
+  BG.fromFFIType hs_bindgen_3194e5e921bc697c_base
+
+-- | Close and free an allocated 'SDL_IOStream' structure.
+--
+--     @SDL_CloseIO()@ closes and cleans up the 'SDL_IOStream' stream. It releases any resources used by the stream and frees the 'SDL_IOStream' itself. This returns true on success, or false if the stream failed to flush to its output (e.g. to disk).
+--
+--     Note that if this fails to flush the stream for any reason, this function reports an error, but the 'SDL_IOStream' is still invalid once this function returns.
+--
+--     This call flushes any buffered writes to the operating system, but there are no guarantees that those writes have gone to physical media; they might be in the OS\'s file cache, waiting to go to disk later. If it\'s absolutely crucial that writes go to disk immediately, so they are definitely stored even if the power fails before the file cache would have caught up, one should call @SDL_FlushIO()@ before closing. Note that flushing takes time and makes the system and your app operate less efficiently, so do so sparingly.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenIO'
+--
+--     [C declaration]: @SDL_CloseIO@, defined at @SDL3\/SDL_iostream.h 478:34@
+sDL_CloseIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: 'SDL_IOStream' structure to close.
+  -> IO BG.CBool
+sDL_CloseIO = hs_bindgen_3194e5e921bc697c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_GetIOProperties@
+foreign import ccall safe "hs_bindgen_16a31766d73c85ef"
+  hs_bindgen_16a31766d73c85ef_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_GetIOProperties@
+hs_bindgen_16a31766d73c85ef
+  :: BG.Ptr SDL_IOStream
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_16a31766d73c85ef =
+  BG.fromFFIType hs_bindgen_16a31766d73c85ef_base
+
+-- | Get the properties associated with an 'SDL_IOStream'.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetIOProperties@, defined at @SDL3\/SDL_iostream.h 491:46@
+sDL_GetIOProperties
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetIOProperties = hs_bindgen_16a31766d73c85ef
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_GetIOStatus@
+foreign import ccall safe "hs_bindgen_aa2e9a65d05ce21f"
+  hs_bindgen_aa2e9a65d05ce21f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_GetIOStatus@
+hs_bindgen_aa2e9a65d05ce21f
+  :: BG.Ptr SDL_IOStream
+  -> IO SDL_IOStatus
+hs_bindgen_aa2e9a65d05ce21f =
+  BG.fromFFIType hs_bindgen_aa2e9a65d05ce21f_base
+
+-- | Query the stream status of an 'SDL_IOStream'.
+--
+--     This information can be useful to decide if a short read or write was due to an error, an EOF, or a non-blocking operation that isn\'t yet ready to complete.
+--
+--     An 'SDL_IOStream' \'s status is only expected to change after a SDL_ReadIO or SDL_WriteIO call; don\'t expect it to change if you just call this query function in a tight loop.
+--
+--     [Returns]: an 'SDL_IOStatus' enum with the current state.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetIOStatus@, defined at @SDL3\/SDL_iostream.h 511:42@
+sDL_GetIOStatus
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: the 'SDL_IOStream' to query.
+  -> IO SDL_IOStatus
+sDL_GetIOStatus = hs_bindgen_aa2e9a65d05ce21f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_GetIOSize@
+foreign import ccall safe "hs_bindgen_54da1584c7a84cda"
+  hs_bindgen_54da1584c7a84cda_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_GetIOSize@
+hs_bindgen_54da1584c7a84cda
+  :: BG.Ptr SDL_IOStream
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+hs_bindgen_54da1584c7a84cda =
+  BG.fromFFIType hs_bindgen_54da1584c7a84cda_base
+
+-- | Use this function to get the size of the data stream in an 'SDL_IOStream'.
+--
+--     [Returns]: the size of the data stream in the 'SDL_IOStream' on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetIOSize@, defined at @SDL3\/SDL_iostream.h 525:36@
+sDL_GetIOSize
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: the 'SDL_IOStream' to get the size of the data stream from.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+sDL_GetIOSize = hs_bindgen_54da1584c7a84cda
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_SeekIO@
+foreign import ccall safe "hs_bindgen_0c3b6f6c9596a5d8"
+  hs_bindgen_0c3b6f6c9596a5d8_base
+    :: BG.Ptr BG.Void
+    -> BG.Int64
+    -> BG.Word32
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_SeekIO@
+hs_bindgen_0c3b6f6c9596a5d8
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> SDL_IOWhence
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+hs_bindgen_0c3b6f6c9596a5d8 =
+  BG.fromFFIType hs_bindgen_0c3b6f6c9596a5d8_base
+
+-- | Seek within an 'SDL_IOStream' data stream.
+--
+--     This function seeks to byte @offset@, relative to @whence@.
+--
+--     @whence@ may be any of the following values:
+--
+--     * @SDL_IO_SEEK_SET@: seek from the beginning of data
+--
+--     * @SDL_IO_SEEK_CUR@: seek relative to current read point
+--
+--     * @SDL_IO_SEEK_END@: seek relative to the end of data
+--
+--     If this stream can not seek, it will return -1.
+--
+--     [Returns]: the final offset in the data stream after the seek or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TellIO'
+--
+--     [C declaration]: @SDL_SeekIO@, defined at @SDL3\/SDL_iostream.h 554:36@
+sDL_SeekIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@offset@]: an offset in bytes, relative to @whence@ location; can be negative.
+  -> SDL_IOWhence
+  -- ^
+  --
+  --           [@whence@]: any of @SDL_IO_SEEK_SET@, @SDL_IO_SEEK_CUR@, @SDL_IO_SEEK_END@.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+sDL_SeekIO = hs_bindgen_0c3b6f6c9596a5d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_TellIO@
+foreign import ccall safe "hs_bindgen_094df7d1bb2e26ac"
+  hs_bindgen_094df7d1bb2e26ac_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_TellIO@
+hs_bindgen_094df7d1bb2e26ac
+  :: BG.Ptr SDL_IOStream
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+hs_bindgen_094df7d1bb2e26ac =
+  BG.fromFFIType hs_bindgen_094df7d1bb2e26ac_base
+
+-- | Determine the current read\/write offset in an 'SDL_IOStream' data stream.
+--
+--     SDL_TellIO is actually a wrapper function that calls the 'SDL_IOStream' \'s @seek@ method, with an offset of 0 bytes from @SDL_IO_SEEK_CUR@, to simplify application development.
+--
+--     [Returns]: the current offset in the stream, or -1 if the information can not be determined.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SeekIO'
+--
+--     [C declaration]: @SDL_TellIO@, defined at @SDL3\/SDL_iostream.h 574:36@
+sDL_TellIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: an 'SDL_IOStream' data stream object from which to get the current offset.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+sDL_TellIO = hs_bindgen_094df7d1bb2e26ac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadIO@
+foreign import ccall safe "hs_bindgen_04c1c6ca873e76fc"
+  hs_bindgen_04c1c6ca873e76fc_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadIO@
+hs_bindgen_04c1c6ca873e76fc
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_04c1c6ca873e76fc =
+  BG.fromFFIType hs_bindgen_04c1c6ca873e76fc_base
+
+-- | Read from a data source.
+--
+--     This function reads up @size@ bytes from the data source to the area pointed at by @ptr@. This function may read less bytes than requested.
+--
+--     This function will return zero when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If zero is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     A request for zero bytes on a valid stream will return zero immediately without accessing the stream, so the stream status (EOF, err, etc) will not change.
+--
+--     [Returns]: the number of bytes read, or 0 on end of file or other failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WriteIO', 'sDL_GetIOStatus'
+--
+--     [C declaration]: @SDL_ReadIO@, defined at @SDL3\/SDL_iostream.h 604:36@
+sDL_ReadIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to read data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the number of bytes to read from the data source.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_ReadIO = hs_bindgen_04c1c6ca873e76fc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteIO@
+foreign import ccall safe "hs_bindgen_ec9c16b5e587afb8"
+  hs_bindgen_ec9c16b5e587afb8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteIO@
+hs_bindgen_ec9c16b5e587afb8
+  :: BG.Ptr SDL_IOStream
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_ec9c16b5e587afb8 =
+  BG.fromFFIType hs_bindgen_ec9c16b5e587afb8_base
+
+-- | Write to an 'SDL_IOStream' data stream.
+--
+--     This function writes exactly @size@ bytes from the area pointed at by @ptr@ to the stream. If this fails for any reason, it\'ll return less than @size@ to demonstrate how far the write progressed. On success, it returns @size@.
+--
+--     On error, this function still attempts to write as much as possible, so it might return a positive value less than the requested write size.
+--
+--     The caller can use @SDL_GetIOStatus()@ to determine if the problem is recoverable, such as a non-blocking write that can simply be retried later, or a fatal error.
+--
+--     A request for zero bytes on a valid stream will return zero immediately without accessing the stream, so the stream status (EOF, err, etc) will not change.
+--
+--     [Returns]: the number of bytes written, which will be less than @size@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_IOprintf@, 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_FlushIO', 'sDL_GetIOStatus'
+--
+--     [C declaration]: @SDL_WriteIO@, defined at @SDL3\/SDL_iostream.h 640:36@
+sDL_WriteIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer containing data to write.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the number of bytes to write.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_WriteIO = hs_bindgen_ec9c16b5e587afb8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_FlushIO@
+foreign import ccall safe "hs_bindgen_bbb89fd7a1a95596"
+  hs_bindgen_bbb89fd7a1a95596_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_FlushIO@
+hs_bindgen_bbb89fd7a1a95596
+  :: BG.Ptr SDL_IOStream
+  -> IO BG.CBool
+hs_bindgen_bbb89fd7a1a95596 =
+  BG.fromFFIType hs_bindgen_bbb89fd7a1a95596_base
+
+-- | Flush any buffered data in the stream.
+--
+--     This function makes sure that any buffered data is written to the stream. Normally this isn\'t necessary but if the stream is a pipe or socket it guarantees that any pending data is sent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_FlushIO@, defined at @SDL3\/SDL_iostream.h 701:34@
+sDL_FlushIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: 'SDL_IOStream' structure to flush.
+  -> IO BG.CBool
+sDL_FlushIO = hs_bindgen_bbb89fd7a1a95596
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_LoadFile_IO@
+foreign import ccall safe "hs_bindgen_8fefdb56bfbc407b"
+  hs_bindgen_8fefdb56bfbc407b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_LoadFile_IO@
+hs_bindgen_8fefdb56bfbc407b
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> BG.CBool
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_8fefdb56bfbc407b =
+  BG.fromFFIType hs_bindgen_8fefdb56bfbc407b_base
+
+-- | Load all the data from an SDL data stream.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with SDL_free().
+--
+--     [Returns]: the data or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadFile', 'sDL_SaveFile_IO'
+--
+--     [C declaration]: @SDL_LoadFile_IO@, defined at @SDL3\/SDL_iostream.h 727:36@
+sDL_LoadFile_IO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read all available data from.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: a pointer filled in with the number of bytes read, may be NULL.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls @SDL_CloseIO()@ on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr BG.Void)
+sDL_LoadFile_IO = hs_bindgen_8fefdb56bfbc407b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_LoadFile@
+foreign import ccall safe "hs_bindgen_3ffc176218094904"
+  hs_bindgen_3ffc176218094904_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_LoadFile@
+hs_bindgen_3ffc176218094904
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_3ffc176218094904 =
+  BG.fromFFIType hs_bindgen_3ffc176218094904_base
+
+-- | Load all the data from a file path.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with SDL_free().
+--
+--     [Returns]: the data or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadFile_IO', 'sDL_SaveFile'
+--
+--     [C declaration]: @SDL_LoadFile@, defined at @SDL3\/SDL_iostream.h 750:36@
+sDL_LoadFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to read all available data from.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: if not NULL, will store the number of bytes read.
+  -> IO (BG.Ptr BG.Void)
+sDL_LoadFile = hs_bindgen_3ffc176218094904
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_SaveFile_IO@
+foreign import ccall safe "hs_bindgen_ee2bf39575dd56cd"
+  hs_bindgen_ee2bf39575dd56cd_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_SaveFile_IO@
+hs_bindgen_ee2bf39575dd56cd
+  :: BG.Ptr SDL_IOStream
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_ee2bf39575dd56cd =
+  BG.fromFFIType hs_bindgen_ee2bf39575dd56cd_base
+
+-- | Save all the data into an SDL data stream.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SaveFile', 'sDL_LoadFile_IO'
+--
+--     [C declaration]: @SDL_SaveFile_IO@, defined at @SDL3\/SDL_iostream.h 771:34@
+sDL_SaveFile_IO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to write all data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be written. If datasize is 0, may be NULL or a invalid pointer.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: the number of bytes to be written.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls @SDL_CloseIO()@ on @src@ before returning, even in the case of an error.
+  -> IO BG.CBool
+sDL_SaveFile_IO = hs_bindgen_ee2bf39575dd56cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_SaveFile@
+foreign import ccall safe "hs_bindgen_1157ae79ba240b92"
+  hs_bindgen_1157ae79ba240b92_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_SaveFile@
+hs_bindgen_1157ae79ba240b92
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CBool
+hs_bindgen_1157ae79ba240b92 =
+  BG.fromFFIType hs_bindgen_1157ae79ba240b92_base
+
+-- | Save all the data into a file path.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SaveFile_IO', 'sDL_LoadFile'
+--
+--     [C declaration]: @SDL_SaveFile@, defined at @SDL3\/SDL_iostream.h 790:34@
+sDL_SaveFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to write all available data into.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be written. If datasize is 0, may be NULL or a invalid pointer.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: the number of bytes to be written.
+  -> IO BG.CBool
+sDL_SaveFile = hs_bindgen_1157ae79ba240b92
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU8@
+foreign import ccall safe "hs_bindgen_9458dbc19d3102af"
+  hs_bindgen_9458dbc19d3102af_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU8@
+hs_bindgen_9458dbc19d3102af
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_9458dbc19d3102af =
+  BG.fromFFIType hs_bindgen_9458dbc19d3102af_base
+
+-- | Use this function to read a byte from an 'SDL_IOStream'.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on success or false on failure or EOF; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU8@, defined at @SDL3\/SDL_iostream.h 816:34@
+sDL_ReadU8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU8 = hs_bindgen_9458dbc19d3102af
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS8@
+foreign import ccall safe "hs_bindgen_9ef691b554f38735"
+  hs_bindgen_9ef691b554f38735_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS8@
+hs_bindgen_9ef691b554f38735
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint8
+  -> IO BG.CBool
+hs_bindgen_9ef691b554f38735 =
+  BG.fromFFIType hs_bindgen_9ef691b554f38735_base
+
+-- | Use this function to read a signed byte from an 'SDL_IOStream'.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS8@, defined at @SDL3\/SDL_iostream.h 835:34@
+sDL_ReadS8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint8
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS8 = hs_bindgen_9ef691b554f38735
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU16LE@
+foreign import ccall safe "hs_bindgen_312b11f2676e3c2f"
+  hs_bindgen_312b11f2676e3c2f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU16LE@
+hs_bindgen_312b11f2676e3c2f
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> IO BG.CBool
+hs_bindgen_312b11f2676e3c2f =
+  BG.fromFFIType hs_bindgen_312b11f2676e3c2f_base
+
+-- | Use this function to read 16 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU16LE@, defined at @SDL3\/SDL_iostream.h 858:34@
+sDL_ReadU16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU16LE = hs_bindgen_312b11f2676e3c2f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS16LE@
+foreign import ccall safe "hs_bindgen_bfc3c7dd523a2b73"
+  hs_bindgen_bfc3c7dd523a2b73_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS16LE@
+hs_bindgen_bfc3c7dd523a2b73
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_bfc3c7dd523a2b73 =
+  BG.fromFFIType hs_bindgen_bfc3c7dd523a2b73_base
+
+-- | Use this function to read 16 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS16LE@, defined at @SDL3\/SDL_iostream.h 881:34@
+sDL_ReadS16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS16LE = hs_bindgen_bfc3c7dd523a2b73
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU16BE@
+foreign import ccall safe "hs_bindgen_9b3b157e729c0965"
+  hs_bindgen_9b3b157e729c0965_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU16BE@
+hs_bindgen_9b3b157e729c0965
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> IO BG.CBool
+hs_bindgen_9b3b157e729c0965 =
+  BG.fromFFIType hs_bindgen_9b3b157e729c0965_base
+
+-- | Use this function to read 16 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU16BE@, defined at @SDL3\/SDL_iostream.h 904:34@
+sDL_ReadU16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU16BE = hs_bindgen_9b3b157e729c0965
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS16BE@
+foreign import ccall safe "hs_bindgen_53f6414a33954d51"
+  hs_bindgen_53f6414a33954d51_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS16BE@
+hs_bindgen_53f6414a33954d51
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_53f6414a33954d51 =
+  BG.fromFFIType hs_bindgen_53f6414a33954d51_base
+
+-- | Use this function to read 16 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS16BE@, defined at @SDL3\/SDL_iostream.h 927:34@
+sDL_ReadS16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS16BE = hs_bindgen_53f6414a33954d51
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU32LE@
+foreign import ccall safe "hs_bindgen_cf9bb68f7e8594b1"
+  hs_bindgen_cf9bb68f7e8594b1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU32LE@
+hs_bindgen_cf9bb68f7e8594b1
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_cf9bb68f7e8594b1 =
+  BG.fromFFIType hs_bindgen_cf9bb68f7e8594b1_base
+
+-- | Use this function to read 32 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU32LE@, defined at @SDL3\/SDL_iostream.h 950:34@
+sDL_ReadU32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU32LE = hs_bindgen_cf9bb68f7e8594b1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS32LE@
+foreign import ccall safe "hs_bindgen_e2c2855a2483a810"
+  hs_bindgen_e2c2855a2483a810_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS32LE@
+hs_bindgen_e2c2855a2483a810
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_e2c2855a2483a810 =
+  BG.fromFFIType hs_bindgen_e2c2855a2483a810_base
+
+-- | Use this function to read 32 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS32LE@, defined at @SDL3\/SDL_iostream.h 973:34@
+sDL_ReadS32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS32LE = hs_bindgen_e2c2855a2483a810
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU32BE@
+foreign import ccall safe "hs_bindgen_8cce948b1185d898"
+  hs_bindgen_8cce948b1185d898_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU32BE@
+hs_bindgen_8cce948b1185d898
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_8cce948b1185d898 =
+  BG.fromFFIType hs_bindgen_8cce948b1185d898_base
+
+-- | Use this function to read 32 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU32BE@, defined at @SDL3\/SDL_iostream.h 996:34@
+sDL_ReadU32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU32BE = hs_bindgen_8cce948b1185d898
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS32BE@
+foreign import ccall safe "hs_bindgen_74529309d09c0236"
+  hs_bindgen_74529309d09c0236_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS32BE@
+hs_bindgen_74529309d09c0236
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_74529309d09c0236 =
+  BG.fromFFIType hs_bindgen_74529309d09c0236_base
+
+-- | Use this function to read 32 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS32BE@, defined at @SDL3\/SDL_iostream.h 1019:34@
+sDL_ReadS32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS32BE = hs_bindgen_74529309d09c0236
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU64LE@
+foreign import ccall safe "hs_bindgen_a50de42944661366"
+  hs_bindgen_a50de42944661366_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU64LE@
+hs_bindgen_a50de42944661366
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_a50de42944661366 =
+  BG.fromFFIType hs_bindgen_a50de42944661366_base
+
+-- | Use this function to read 64 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU64LE@, defined at @SDL3\/SDL_iostream.h 1042:34@
+sDL_ReadU64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU64LE = hs_bindgen_a50de42944661366
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS64LE@
+foreign import ccall safe "hs_bindgen_5dc23c0193ff348f"
+  hs_bindgen_5dc23c0193ff348f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS64LE@
+hs_bindgen_5dc23c0193ff348f
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_5dc23c0193ff348f =
+  BG.fromFFIType hs_bindgen_5dc23c0193ff348f_base
+
+-- | Use this function to read 64 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS64LE@, defined at @SDL3\/SDL_iostream.h 1065:34@
+sDL_ReadS64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS64LE = hs_bindgen_5dc23c0193ff348f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU64BE@
+foreign import ccall safe "hs_bindgen_5c7313fe19df3bc5"
+  hs_bindgen_5c7313fe19df3bc5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadU64BE@
+hs_bindgen_5c7313fe19df3bc5
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_5c7313fe19df3bc5 =
+  BG.fromFFIType hs_bindgen_5c7313fe19df3bc5_base
+
+-- | Use this function to read 64 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU64BE@, defined at @SDL3\/SDL_iostream.h 1088:34@
+sDL_ReadU64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU64BE = hs_bindgen_5c7313fe19df3bc5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS64BE@
+foreign import ccall safe "hs_bindgen_77cc43bf1b465b08"
+  hs_bindgen_77cc43bf1b465b08_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_ReadS64BE@
+hs_bindgen_77cc43bf1b465b08
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_77cc43bf1b465b08 =
+  BG.fromFFIType hs_bindgen_77cc43bf1b465b08_base
+
+-- | Use this function to read 64 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS64BE@, defined at @SDL3\/SDL_iostream.h 1111:34@
+sDL_ReadS64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS64BE = hs_bindgen_77cc43bf1b465b08
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU8@
+foreign import ccall safe "hs_bindgen_06be6eeabea4ef7e"
+  hs_bindgen_06be6eeabea4ef7e_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU8@
+hs_bindgen_06be6eeabea4ef7e
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_06be6eeabea4ef7e =
+  BG.fromFFIType hs_bindgen_06be6eeabea4ef7e_base
+
+-- | Use this function to write a byte to an 'SDL_IOStream'.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU8@, defined at @SDL3\/SDL_iostream.h 1133:34@
+sDL_WriteU8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_IOStream' to write to.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@value@]: the byte value to write.
+  -> IO BG.CBool
+sDL_WriteU8 = hs_bindgen_06be6eeabea4ef7e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS8@
+foreign import ccall safe "hs_bindgen_b7f1551a531fd2e5"
+  hs_bindgen_b7f1551a531fd2e5_base
+    :: BG.Ptr BG.Void
+    -> BG.Int8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS8@
+hs_bindgen_b7f1551a531fd2e5
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint8
+  -> IO BG.CBool
+hs_bindgen_b7f1551a531fd2e5 =
+  BG.fromFFIType hs_bindgen_b7f1551a531fd2e5_base
+
+-- | Use this function to write a signed byte to an 'SDL_IOStream'.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS8@, defined at @SDL3\/SDL_iostream.h 1147:34@
+sDL_WriteS8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_IOStream' to write to.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint8
+  -- ^
+  --
+  --           [@value@]: the byte value to write.
+  -> IO BG.CBool
+sDL_WriteS8 = hs_bindgen_b7f1551a531fd2e5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU16LE@
+foreign import ccall safe "hs_bindgen_dc258899c026cf6f"
+  hs_bindgen_dc258899c026cf6f_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU16LE@
+hs_bindgen_dc258899c026cf6f
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> IO BG.CBool
+hs_bindgen_dc258899c026cf6f =
+  BG.fromFFIType hs_bindgen_dc258899c026cf6f_base
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU16LE@, defined at @SDL3\/SDL_iostream.h 1166:34@
+sDL_WriteU16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU16LE = hs_bindgen_dc258899c026cf6f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS16LE@
+foreign import ccall safe "hs_bindgen_a1111b4c96df3259"
+  hs_bindgen_a1111b4c96df3259_base
+    :: BG.Ptr BG.Void
+    -> BG.Int16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS16LE@
+hs_bindgen_a1111b4c96df3259
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_a1111b4c96df3259 =
+  BG.fromFFIType hs_bindgen_a1111b4c96df3259_base
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS16LE@, defined at @SDL3\/SDL_iostream.h 1185:34@
+sDL_WriteS16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS16LE = hs_bindgen_a1111b4c96df3259
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU16BE@
+foreign import ccall safe "hs_bindgen_a4cb3983fa64c5c7"
+  hs_bindgen_a4cb3983fa64c5c7_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU16BE@
+hs_bindgen_a4cb3983fa64c5c7
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> IO BG.CBool
+hs_bindgen_a4cb3983fa64c5c7 =
+  BG.fromFFIType hs_bindgen_a4cb3983fa64c5c7_base
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU16BE@, defined at @SDL3\/SDL_iostream.h 1203:34@
+sDL_WriteU16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU16BE = hs_bindgen_a4cb3983fa64c5c7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS16BE@
+foreign import ccall safe "hs_bindgen_161a5c3e908403a2"
+  hs_bindgen_161a5c3e908403a2_base
+    :: BG.Ptr BG.Void
+    -> BG.Int16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS16BE@
+hs_bindgen_161a5c3e908403a2
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_161a5c3e908403a2 =
+  BG.fromFFIType hs_bindgen_161a5c3e908403a2_base
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS16BE@, defined at @SDL3\/SDL_iostream.h 1221:34@
+sDL_WriteS16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS16BE = hs_bindgen_161a5c3e908403a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU32LE@
+foreign import ccall safe "hs_bindgen_ae468e82155587e1"
+  hs_bindgen_ae468e82155587e1_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU32LE@
+hs_bindgen_ae468e82155587e1
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_ae468e82155587e1 =
+  BG.fromFFIType hs_bindgen_ae468e82155587e1_base
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU32LE@, defined at @SDL3\/SDL_iostream.h 1240:34@
+sDL_WriteU32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU32LE = hs_bindgen_ae468e82155587e1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS32LE@
+foreign import ccall safe "hs_bindgen_175539b403c6fd0c"
+  hs_bindgen_175539b403c6fd0c_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS32LE@
+hs_bindgen_175539b403c6fd0c
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_175539b403c6fd0c =
+  BG.fromFFIType hs_bindgen_175539b403c6fd0c_base
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS32LE@, defined at @SDL3\/SDL_iostream.h 1259:34@
+sDL_WriteS32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS32LE = hs_bindgen_175539b403c6fd0c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU32BE@
+foreign import ccall safe "hs_bindgen_f6e00995ced904a6"
+  hs_bindgen_f6e00995ced904a6_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU32BE@
+hs_bindgen_f6e00995ced904a6
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_f6e00995ced904a6 =
+  BG.fromFFIType hs_bindgen_f6e00995ced904a6_base
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU32BE@, defined at @SDL3\/SDL_iostream.h 1277:34@
+sDL_WriteU32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU32BE = hs_bindgen_f6e00995ced904a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS32BE@
+foreign import ccall safe "hs_bindgen_7986b77b455fd8d4"
+  hs_bindgen_7986b77b455fd8d4_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS32BE@
+hs_bindgen_7986b77b455fd8d4
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_7986b77b455fd8d4 =
+  BG.fromFFIType hs_bindgen_7986b77b455fd8d4_base
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS32BE@, defined at @SDL3\/SDL_iostream.h 1295:34@
+sDL_WriteS32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS32BE = hs_bindgen_7986b77b455fd8d4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU64LE@
+foreign import ccall safe "hs_bindgen_065f64617e3e327c"
+  hs_bindgen_065f64617e3e327c_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU64LE@
+hs_bindgen_065f64617e3e327c
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_065f64617e3e327c =
+  BG.fromFFIType hs_bindgen_065f64617e3e327c_base
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU64LE@, defined at @SDL3\/SDL_iostream.h 1314:34@
+sDL_WriteU64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU64LE = hs_bindgen_065f64617e3e327c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS64LE@
+foreign import ccall safe "hs_bindgen_846e3f81a5b9c657"
+  hs_bindgen_846e3f81a5b9c657_base
+    :: BG.Ptr BG.Void
+    -> BG.Int64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS64LE@
+hs_bindgen_846e3f81a5b9c657
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_846e3f81a5b9c657 =
+  BG.fromFFIType hs_bindgen_846e3f81a5b9c657_base
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS64LE@, defined at @SDL3\/SDL_iostream.h 1333:34@
+sDL_WriteS64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS64LE = hs_bindgen_846e3f81a5b9c657
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU64BE@
+foreign import ccall safe "hs_bindgen_8f9d3f23bd1a20e7"
+  hs_bindgen_8f9d3f23bd1a20e7_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteU64BE@
+hs_bindgen_8f9d3f23bd1a20e7
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_8f9d3f23bd1a20e7 =
+  BG.fromFFIType hs_bindgen_8f9d3f23bd1a20e7_base
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU64BE@, defined at @SDL3\/SDL_iostream.h 1351:34@
+sDL_WriteU64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU64BE = hs_bindgen_8f9d3f23bd1a20e7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS64BE@
+foreign import ccall safe "hs_bindgen_ef095eaa3e7cb9b4"
+  hs_bindgen_ef095eaa3e7cb9b4_base
+    :: BG.Ptr BG.Void
+    -> BG.Int64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Safe_SDL_WriteS64BE@
+hs_bindgen_ef095eaa3e7cb9b4
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_ef095eaa3e7cb9b4 =
+  BG.fromFFIType hs_bindgen_ef095eaa3e7cb9b4_base
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS64BE@, defined at @SDL3\/SDL_iostream.h 1369:34@
+sDL_WriteS64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS64BE = hs_bindgen_ef095eaa3e7cb9b4
diff --git a/src/SDL3/Sys/Bindgen/Iostream/Unsafe.hs b/src/SDL3/Sys/Bindgen/Iostream/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Iostream/Unsafe.hs
@@ -0,0 +1,2272 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Iostream.Unsafe (
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_IOFromFile,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_IOFromMem,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_IOFromConstMem,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_IOFromDynamicMem,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_OpenIO,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_CloseIO,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_GetIOProperties,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_GetIOStatus,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_GetIOSize,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_SeekIO,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_TellIO,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadIO,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteIO,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_FlushIO,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_LoadFile_IO,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_LoadFile,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_SaveFile_IO,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_SaveFile,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadU8,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadS8,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadU16LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadS16LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadU16BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadS16BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadU32LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadS32LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadU32BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadS32BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadU64LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadS64LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadU64BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_ReadS64BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteU8,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteS8,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteU16LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteS16LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteU16BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteS16BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteU32LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteS32LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteU32BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteS32BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteU64LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteS64LE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteU64BE,
+  SDL3.Sys.Bindgen.Iostream.Unsafe.sDL_WriteS64BE,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Iostream
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_iostream.h>"
+         , "SDL_IOStream *hs_bindgen_8b8c09f1f05c3c68 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_IOFromFile)(arg1, arg2);"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_38dc0cd7a21f676a ("
+         , "  void *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_IOFromMem)(arg1, arg2);"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_7db7a44d6863f5af ("
+         , "  void const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_IOFromConstMem)(arg1, arg2);"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_8b5a0a64dc4bfeed (void)"
+         , "{"
+         , "  return (SDL_IOFromDynamicMem)();"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_5fcee53dabf5e4a5 ("
+         , "  SDL_IOStreamInterface const *arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenIO)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c8ffca82bc3714ea ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CloseIO)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_c33e25d9e6f53535 ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetIOProperties)(arg1);"
+         , "}"
+         , "SDL_IOStatus hs_bindgen_2dadd7990de850df ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetIOStatus)(arg1);"
+         , "}"
+         , "Sint64 hs_bindgen_001759e01a1dcb96 ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetIOSize)(arg1);"
+         , "}"
+         , "Sint64 hs_bindgen_501f4e8bfb646025 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 arg2,"
+         , "  SDL_IOWhence arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SeekIO)(arg1, arg2, arg3);"
+         , "}"
+         , "Sint64 hs_bindgen_c618e703fbe3da7e ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TellIO)(arg1);"
+         , "}"
+         , "size_t hs_bindgen_23496bbdb54b0e23 ("
+         , "  SDL_IOStream *arg1,"
+         , "  void *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadIO)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_2b2fc1036073bd5d ("
+         , "  SDL_IOStream *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteIO)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_1bf3de05eea73b47 ("
+         , "  SDL_IOStream *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_FlushIO)(arg1);"
+         , "}"
+         , "void *hs_bindgen_8acc89fe9bbc77ba ("
+         , "  SDL_IOStream *arg1,"
+         , "  size_t *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadFile_IO)(arg1, arg2, arg3);"
+         , "}"
+         , "void *hs_bindgen_2ff49a3a9a587592 ("
+         , "  char const *arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadFile)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_cc427af5b7d6a992 ("
+         , "  SDL_IOStream *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SaveFile_IO)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_ffc2a22709d13ea5 ("
+         , "  char const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SaveFile)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_b1b1e0a90daf22ef ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint8 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU8)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_e87d63e49d240616 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint8 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS8)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d3e2c7a83368733b ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU16LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_479681c9d7efb4b6 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS16LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_9f0f6b734c649005 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU16BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_f2e57f79f83f7ccb ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS16BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_4c7ed5f362c69100 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU32LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_6817084863d4f803 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS32LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a689b6518018f0f8 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU32BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8803a44bce7c7e75 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS32BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_e3dd1a0b9ab72b6e ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU64LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ad567c6f2b1bd0a7 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS64LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_2e71cf93b76724a0 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadU64BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_95ecf77ce8aa6634 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadS64BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_054c3110f978dbc5 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU8)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d0a9827894815b9e ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint8 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS8)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_197d92df5116e339 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU16LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_6bf86c914d8f27c9 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS16LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_22ad038fcf74bfca ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint16 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU16BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_3a1b7a64deee39d0 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint16 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS16BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_e3779860ffb0e190 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU32LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_3b943b45962d4109 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS32LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_88b11c56e4dcdce7 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU32BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8f32aca42f3f9abc ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS32BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5b5ed260c10314c5 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU64LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_6b0d99f99a1f8f14 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS64LE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8d6f10b5ca6caad3 ("
+         , "  SDL_IOStream *arg1,"
+         , "  Uint64 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteU64BE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_50adbb19351b1adb ("
+         , "  SDL_IOStream *arg1,"
+         , "  Sint64 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteS64BE)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_IOFromFile@
+foreign import ccall unsafe "hs_bindgen_8b8c09f1f05c3c68"
+  hs_bindgen_8b8c09f1f05c3c68_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_IOFromFile@
+hs_bindgen_8b8c09f1f05c3c68
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_IOStream)
+hs_bindgen_8b8c09f1f05c3c68 =
+  BG.fromFFIType hs_bindgen_8b8c09f1f05c3c68_base
+
+-- | Use this function to create a new 'SDL_IOStream' structure for reading from and\/or writing to a named file.
+--
+--     The @mode@ string is treated roughly the same as in a call to the C library\'s fopen(), even if SDL doesn\'t happen to use fopen() behind the scenes.
+--
+--     Available @mode@ strings:
+--
+--     * \"r\": Open a file for reading. The file must exist.
+--
+--     * \"w\": Create an empty file for writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     * \"wx\": Create an empty file for writing. If a file with the same name already exists, the call fails.
+--
+--     * \"a\": Append to a file. Writing operations append data at the end of the file. The file is created if it does not exist.
+--
+--     * \"r+\": Open a file for update both reading and writing. The file must exist.
+--
+--     * \"w+\": Create an empty file for both reading and writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     * \"w+x\": Create an empty file for both reading and writing. If a file with the same name already exists, the call fails.
+--
+--     * \"a+\": Open a file for reading and appending. All writing operations are performed at the end of the file, protecting the previous content to be overwritten. You can reposition (fseek, rewind) the internal pointer to anywhere in the file for reading, but writing operations will move it back to the end of file. The file is created if it does not exist.
+--
+--     __NOTE__: In order to open a file as a binary file, a \"b\" character has to be included in the @mode@ string. This additional \"b\" character can either be appended at the end of the string (thus making the following compound modes: \"rb\", \"wb\", \"ab\", \"r+b\", \"w+b\", \"a+b\") or be inserted between the letter and the \"+\" sign for the mixed modes (\"rb+\", \"wb+\", \"ab+\"). Additional characters may follow the sequence, although they should have no effect. For example, \"t\" is sometimes appended to make explicit the file is a text file.
+--
+--     This function supports Unicode filenames, but they must be encoded in UTF-8 format, regardless of the underlying operating system.
+--
+--     In Android, @SDL_IOFromFile()@ can be used to open content:\/\/ URIs. As a fallback, @SDL_IOFromFile()@ will transparently open a matching filename in the app\'s @assets@.
+--
+--     Closing the 'SDL_IOStream' will close SDL\'s internal file handle.
+--
+--     The following properties may be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER'@: a pointer, that can be cast to a win32 @HANDLE@, that this 'SDL_IOStream' is using to access the filesystem. If the program isn\'t running on Windows, or SDL used some other method to access the filesystem, this property will not be set.
+--
+--     * @'sDL_PROP_IOSTREAM_STDIO_FILE_POINTER'@: a pointer, that can be cast to a stdio @FILE *@, that this 'SDL_IOStream' is using to access the filesystem. If SDL used some other method to access the filesystem, this property will not be set. PLEASE NOTE that if SDL is using a different C runtime than your app, trying to use this pointer will almost certainly result in a crash! This is mostly a problem on Windows; make sure you build SDL and your app with the same compiler and settings to avoid it.
+--
+--     * @'sDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER'@: a file descriptor that this 'SDL_IOStream' is using to access the filesystem.
+--
+--     * @'sDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER'@: a pointer, that can be cast to an Android NDK @AAsset *@, that this 'SDL_IOStream' is using to access the filesystem. If SDL used some other method to access the filesystem, this property will not be set.
+--
+--     [Returns]: a pointer to the 'SDL_IOStream' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseIO', 'sDL_FlushIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_IOFromFile@, defined at @SDL3\/SDL_iostream.h 278:44@
+sDL_IOFromFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a UTF-8 string representing the filename to open.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mode@]: an ASCII string representing the mode to be used for opening the file.
+  -> IO (BG.Ptr SDL_IOStream)
+sDL_IOFromFile = hs_bindgen_8b8c09f1f05c3c68
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_IOFromMem@
+foreign import ccall unsafe "hs_bindgen_38dc0cd7a21f676a"
+  hs_bindgen_38dc0cd7a21f676a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_IOFromMem@
+hs_bindgen_38dc0cd7a21f676a
+  :: BG.Ptr BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr SDL_IOStream)
+hs_bindgen_38dc0cd7a21f676a =
+  BG.fromFFIType hs_bindgen_38dc0cd7a21f676a_base
+
+-- | Use this function to prepare a read-write memory buffer for use with 'SDL_IOStream'.
+--
+--     This function sets up an 'SDL_IOStream' struct based on a memory area of a certain size, for both read and write access.
+--
+--     This memory buffer is not copied by the 'SDL_IOStream'; the pointer you provide must remain valid until you close the stream.
+--
+--     If you need to make sure the 'SDL_IOStream' never writes to the memory buffer, you should use @SDL_IOFromConstMem()@ with a read-only buffer of memory instead.
+--
+--     The following properties will be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_POINTER'@: this will be the @mem@ parameter that was passed to this function.
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER'@: this will be the @size@ parameter that was passed to this function.
+--
+--     Additionally, the following properties are recognized:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER'@: if this property is set to a non-NULL value it will be interpreted as a function of SDL_free_func type and called with the passed @mem@ pointer when closing the stream. By default it is unset, i.e., the memory will not be freed.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_IOFromConstMem', 'sDL_CloseIO', 'sDL_FlushIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_IOFromMem@, defined at @SDL3\/SDL_iostream.h 330:44@
+sDL_IOFromMem
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to a buffer to feed an 'SDL_IOStream' stream.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the buffer size, in bytes.
+  -> IO (BG.Ptr SDL_IOStream)
+sDL_IOFromMem = hs_bindgen_38dc0cd7a21f676a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_IOFromConstMem@
+foreign import ccall unsafe "hs_bindgen_7db7a44d6863f5af"
+  hs_bindgen_7db7a44d6863f5af_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_IOFromConstMem@
+hs_bindgen_7db7a44d6863f5af
+  :: PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr SDL_IOStream)
+hs_bindgen_7db7a44d6863f5af =
+  BG.fromFFIType hs_bindgen_7db7a44d6863f5af_base
+
+-- | Use this function to prepare a read-only memory buffer for use with 'SDL_IOStream'.
+--
+--     This function sets up an 'SDL_IOStream' struct based on a memory area of a certain size. It assumes the memory area is not writable.
+--
+--     Attempting to write to this 'SDL_IOStream' stream will report an error without writing to the memory buffer.
+--
+--     This memory buffer is not copied by the 'SDL_IOStream'; the pointer you provide must remain valid until you close the stream.
+--
+--     If you need to write to a memory buffer, you should use @SDL_IOFromMem()@ with a writable buffer of memory instead.
+--
+--     The following properties will be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_POINTER'@: this will be the @mem@ parameter that was passed to this function.
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER'@: this will be the @size@ parameter that was passed to this function.
+--
+--     Additionally, the following properties are recognized:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER'@: if this property is set to a non-NULL value it will be interpreted as a function of SDL_free_func type and called with the passed @mem@ pointer when closing the stream. By default it is unset, i.e., the memory will not be freed.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_IOFromMem', 'sDL_CloseIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO'
+--
+--     [C declaration]: @SDL_IOFromConstMem@, defined at @SDL3\/SDL_iostream.h 381:44@
+sDL_IOFromConstMem
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to a read-only buffer to feed an 'SDL_IOStream' stream.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the buffer size, in bytes.
+  -> IO (BG.Ptr SDL_IOStream)
+sDL_IOFromConstMem = hs_bindgen_7db7a44d6863f5af
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_IOFromDynamicMem@
+foreign import ccall unsafe "hs_bindgen_8b5a0a64dc4bfeed"
+  hs_bindgen_8b5a0a64dc4bfeed_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_IOFromDynamicMem@
+hs_bindgen_8b5a0a64dc4bfeed :: IO (BG.Ptr SDL_IOStream)
+hs_bindgen_8b5a0a64dc4bfeed =
+  BG.fromFFIType hs_bindgen_8b5a0a64dc4bfeed_base
+
+-- | Use this function to create an 'SDL_IOStream' that is backed by dynamically allocated memory.
+--
+--     This supports the following properties to provide access to the memory and control over allocations:
+--
+--     * @'sDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER'@: a pointer to the internal memory of the stream. This can be set to NULL to transfer ownership of the memory to the application, which should free the memory with SDL_free(). If this is done, the next operation on the stream must be @SDL_CloseIO()@.
+--
+--     * @'sDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER'@: memory will be allocated in multiples of this size, defaulting to 1024.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseIO', 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_TellIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_IOFromDynamicMem@, defined at @SDL3\/SDL_iostream.h 411:44@
+sDL_IOFromDynamicMem :: IO (BG.Ptr SDL_IOStream)
+sDL_IOFromDynamicMem = hs_bindgen_8b5a0a64dc4bfeed
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_OpenIO@
+foreign import ccall unsafe "hs_bindgen_5fcee53dabf5e4a5"
+  hs_bindgen_5fcee53dabf5e4a5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_OpenIO@
+hs_bindgen_5fcee53dabf5e4a5
+  :: PtrConst.PtrConst SDL_IOStreamInterface
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr SDL_IOStream)
+hs_bindgen_5fcee53dabf5e4a5 =
+  BG.fromFFIType hs_bindgen_5fcee53dabf5e4a5_base
+
+-- | Create a custom 'SDL_IOStream'.
+--
+--     Applications do not need to use this function unless they are providing their own 'SDL_IOStream' implementation. If you just need an 'SDL_IOStream' to read\/write a common data source, you should use the built-in implementations in SDL, like @SDL_IOFromFile()@ or @SDL_IOFromMem()@, etc.
+--
+--     This function makes a copy of @iface@ and the caller does not need to keep it around after this call.
+--
+--     [Returns]: a pointer to the allocated memory on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseIO', SDL_INIT_INTERFACE, 'sDL_IOFromConstMem', 'sDL_IOFromFile', 'sDL_IOFromMem'
+--
+--     [C declaration]: @SDL_OpenIO@, defined at @SDL3\/SDL_iostream.h 446:44@
+sDL_OpenIO
+  :: PtrConst.PtrConst SDL_IOStreamInterface
+  -- ^
+  --
+  --           [@iface@]: the interface that implements this 'SDL_IOStream', initialized using SDL_INIT_INTERFACE().
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer that will be passed to the interface functions.
+  -> IO (BG.Ptr SDL_IOStream)
+sDL_OpenIO = hs_bindgen_5fcee53dabf5e4a5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_CloseIO@
+foreign import ccall unsafe "hs_bindgen_c8ffca82bc3714ea"
+  hs_bindgen_c8ffca82bc3714ea_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_CloseIO@
+hs_bindgen_c8ffca82bc3714ea
+  :: BG.Ptr SDL_IOStream
+  -> IO BG.CBool
+hs_bindgen_c8ffca82bc3714ea =
+  BG.fromFFIType hs_bindgen_c8ffca82bc3714ea_base
+
+-- | Close and free an allocated 'SDL_IOStream' structure.
+--
+--     @SDL_CloseIO()@ closes and cleans up the 'SDL_IOStream' stream. It releases any resources used by the stream and frees the 'SDL_IOStream' itself. This returns true on success, or false if the stream failed to flush to its output (e.g. to disk).
+--
+--     Note that if this fails to flush the stream for any reason, this function reports an error, but the 'SDL_IOStream' is still invalid once this function returns.
+--
+--     This call flushes any buffered writes to the operating system, but there are no guarantees that those writes have gone to physical media; they might be in the OS\'s file cache, waiting to go to disk later. If it\'s absolutely crucial that writes go to disk immediately, so they are definitely stored even if the power fails before the file cache would have caught up, one should call @SDL_FlushIO()@ before closing. Note that flushing takes time and makes the system and your app operate less efficiently, so do so sparingly.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenIO'
+--
+--     [C declaration]: @SDL_CloseIO@, defined at @SDL3\/SDL_iostream.h 478:34@
+sDL_CloseIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: 'SDL_IOStream' structure to close.
+  -> IO BG.CBool
+sDL_CloseIO = hs_bindgen_c8ffca82bc3714ea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_GetIOProperties@
+foreign import ccall unsafe "hs_bindgen_c33e25d9e6f53535"
+  hs_bindgen_c33e25d9e6f53535_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_GetIOProperties@
+hs_bindgen_c33e25d9e6f53535
+  :: BG.Ptr SDL_IOStream
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_c33e25d9e6f53535 =
+  BG.fromFFIType hs_bindgen_c33e25d9e6f53535_base
+
+-- | Get the properties associated with an 'SDL_IOStream'.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetIOProperties@, defined at @SDL3\/SDL_iostream.h 491:46@
+sDL_GetIOProperties
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetIOProperties = hs_bindgen_c33e25d9e6f53535
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_GetIOStatus@
+foreign import ccall unsafe "hs_bindgen_2dadd7990de850df"
+  hs_bindgen_2dadd7990de850df_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_GetIOStatus@
+hs_bindgen_2dadd7990de850df
+  :: BG.Ptr SDL_IOStream
+  -> IO SDL_IOStatus
+hs_bindgen_2dadd7990de850df =
+  BG.fromFFIType hs_bindgen_2dadd7990de850df_base
+
+-- | Query the stream status of an 'SDL_IOStream'.
+--
+--     This information can be useful to decide if a short read or write was due to an error, an EOF, or a non-blocking operation that isn\'t yet ready to complete.
+--
+--     An 'SDL_IOStream' \'s status is only expected to change after a SDL_ReadIO or SDL_WriteIO call; don\'t expect it to change if you just call this query function in a tight loop.
+--
+--     [Returns]: an 'SDL_IOStatus' enum with the current state.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetIOStatus@, defined at @SDL3\/SDL_iostream.h 511:42@
+sDL_GetIOStatus
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: the 'SDL_IOStream' to query.
+  -> IO SDL_IOStatus
+sDL_GetIOStatus = hs_bindgen_2dadd7990de850df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_GetIOSize@
+foreign import ccall unsafe "hs_bindgen_001759e01a1dcb96"
+  hs_bindgen_001759e01a1dcb96_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_GetIOSize@
+hs_bindgen_001759e01a1dcb96
+  :: BG.Ptr SDL_IOStream
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+hs_bindgen_001759e01a1dcb96 =
+  BG.fromFFIType hs_bindgen_001759e01a1dcb96_base
+
+-- | Use this function to get the size of the data stream in an 'SDL_IOStream'.
+--
+--     [Returns]: the size of the data stream in the 'SDL_IOStream' on success or a negative error code on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetIOSize@, defined at @SDL3\/SDL_iostream.h 525:36@
+sDL_GetIOSize
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: the 'SDL_IOStream' to get the size of the data stream from.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+sDL_GetIOSize = hs_bindgen_001759e01a1dcb96
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_SeekIO@
+foreign import ccall unsafe "hs_bindgen_501f4e8bfb646025"
+  hs_bindgen_501f4e8bfb646025_base
+    :: BG.Ptr BG.Void
+    -> BG.Int64
+    -> BG.Word32
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_SeekIO@
+hs_bindgen_501f4e8bfb646025
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> SDL_IOWhence
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+hs_bindgen_501f4e8bfb646025 =
+  BG.fromFFIType hs_bindgen_501f4e8bfb646025_base
+
+-- | Seek within an 'SDL_IOStream' data stream.
+--
+--     This function seeks to byte @offset@, relative to @whence@.
+--
+--     @whence@ may be any of the following values:
+--
+--     * @SDL_IO_SEEK_SET@: seek from the beginning of data
+--
+--     * @SDL_IO_SEEK_CUR@: seek relative to current read point
+--
+--     * @SDL_IO_SEEK_END@: seek relative to the end of data
+--
+--     If this stream can not seek, it will return -1.
+--
+--     [Returns]: the final offset in the data stream after the seek or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TellIO'
+--
+--     [C declaration]: @SDL_SeekIO@, defined at @SDL3\/SDL_iostream.h 554:36@
+sDL_SeekIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@offset@]: an offset in bytes, relative to @whence@ location; can be negative.
+  -> SDL_IOWhence
+  -- ^
+  --
+  --           [@whence@]: any of @SDL_IO_SEEK_SET@, @SDL_IO_SEEK_CUR@, @SDL_IO_SEEK_END@.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+sDL_SeekIO = hs_bindgen_501f4e8bfb646025
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_TellIO@
+foreign import ccall unsafe "hs_bindgen_c618e703fbe3da7e"
+  hs_bindgen_c618e703fbe3da7e_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_TellIO@
+hs_bindgen_c618e703fbe3da7e
+  :: BG.Ptr SDL_IOStream
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+hs_bindgen_c618e703fbe3da7e =
+  BG.fromFFIType hs_bindgen_c618e703fbe3da7e_base
+
+-- | Determine the current read\/write offset in an 'SDL_IOStream' data stream.
+--
+--     SDL_TellIO is actually a wrapper function that calls the 'SDL_IOStream' \'s @seek@ method, with an offset of 0 bytes from @SDL_IO_SEEK_CUR@, to simplify application development.
+--
+--     [Returns]: the current offset in the stream, or -1 if the information can not be determined.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SeekIO'
+--
+--     [C declaration]: @SDL_TellIO@, defined at @SDL3\/SDL_iostream.h 574:36@
+sDL_TellIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: an 'SDL_IOStream' data stream object from which to get the current offset.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+sDL_TellIO = hs_bindgen_c618e703fbe3da7e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadIO@
+foreign import ccall unsafe "hs_bindgen_23496bbdb54b0e23"
+  hs_bindgen_23496bbdb54b0e23_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadIO@
+hs_bindgen_23496bbdb54b0e23
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_23496bbdb54b0e23 =
+  BG.fromFFIType hs_bindgen_23496bbdb54b0e23_base
+
+-- | Read from a data source.
+--
+--     This function reads up @size@ bytes from the data source to the area pointed at by @ptr@. This function may read less bytes than requested.
+--
+--     This function will return zero when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If zero is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     A request for zero bytes on a valid stream will return zero immediately without accessing the stream, so the stream status (EOF, err, etc) will not change.
+--
+--     [Returns]: the number of bytes read, or 0 on end of file or other failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WriteIO', 'sDL_GetIOStatus'
+--
+--     [C declaration]: @SDL_ReadIO@, defined at @SDL3\/SDL_iostream.h 604:36@
+sDL_ReadIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to read data into.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the number of bytes to read from the data source.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_ReadIO = hs_bindgen_23496bbdb54b0e23
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteIO@
+foreign import ccall unsafe "hs_bindgen_2b2fc1036073bd5d"
+  hs_bindgen_2b2fc1036073bd5d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteIO@
+hs_bindgen_2b2fc1036073bd5d
+  :: BG.Ptr SDL_IOStream
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_2b2fc1036073bd5d =
+  BG.fromFFIType hs_bindgen_2b2fc1036073bd5d_base
+
+-- | Write to an 'SDL_IOStream' data stream.
+--
+--     This function writes exactly @size@ bytes from the area pointed at by @ptr@ to the stream. If this fails for any reason, it\'ll return less than @size@ to demonstrate how far the write progressed. On success, it returns @size@.
+--
+--     On error, this function still attempts to write as much as possible, so it might return a positive value less than the requested write size.
+--
+--     The caller can use @SDL_GetIOStatus()@ to determine if the problem is recoverable, such as a non-blocking write that can simply be retried later, or a fatal error.
+--
+--     A request for zero bytes on a valid stream will return zero immediately without accessing the stream, so the stream status (EOF, err, etc) will not change.
+--
+--     [Returns]: the number of bytes written, which will be less than @size@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_IOprintf@, 'sDL_ReadIO', 'sDL_SeekIO', 'sDL_FlushIO', 'sDL_GetIOStatus'
+--
+--     [C declaration]: @SDL_WriteIO@, defined at @SDL3\/SDL_iostream.h 640:36@
+sDL_WriteIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer containing data to write.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the number of bytes to write.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_WriteIO = hs_bindgen_2b2fc1036073bd5d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_FlushIO@
+foreign import ccall unsafe "hs_bindgen_1bf3de05eea73b47"
+  hs_bindgen_1bf3de05eea73b47_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_FlushIO@
+hs_bindgen_1bf3de05eea73b47
+  :: BG.Ptr SDL_IOStream
+  -> IO BG.CBool
+hs_bindgen_1bf3de05eea73b47 =
+  BG.fromFFIType hs_bindgen_1bf3de05eea73b47_base
+
+-- | Flush any buffered data in the stream.
+--
+--     This function makes sure that any buffered data is written to the stream. Normally this isn\'t necessary but if the stream is a pipe or socket it guarantees that any pending data is sent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenIO', 'sDL_WriteIO'
+--
+--     [C declaration]: @SDL_FlushIO@, defined at @SDL3\/SDL_iostream.h 701:34@
+sDL_FlushIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: 'SDL_IOStream' structure to flush.
+  -> IO BG.CBool
+sDL_FlushIO = hs_bindgen_1bf3de05eea73b47
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_LoadFile_IO@
+foreign import ccall unsafe "hs_bindgen_8acc89fe9bbc77ba"
+  hs_bindgen_8acc89fe9bbc77ba_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_LoadFile_IO@
+hs_bindgen_8acc89fe9bbc77ba
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> BG.CBool
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_8acc89fe9bbc77ba =
+  BG.fromFFIType hs_bindgen_8acc89fe9bbc77ba_base
+
+-- | Load all the data from an SDL data stream.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with SDL_free().
+--
+--     [Returns]: the data or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadFile', 'sDL_SaveFile_IO'
+--
+--     [C declaration]: @SDL_LoadFile_IO@, defined at @SDL3\/SDL_iostream.h 727:36@
+sDL_LoadFile_IO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read all available data from.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: a pointer filled in with the number of bytes read, may be NULL.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls @SDL_CloseIO()@ on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr BG.Void)
+sDL_LoadFile_IO = hs_bindgen_8acc89fe9bbc77ba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_LoadFile@
+foreign import ccall unsafe "hs_bindgen_2ff49a3a9a587592"
+  hs_bindgen_2ff49a3a9a587592_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_LoadFile@
+hs_bindgen_2ff49a3a9a587592
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_2ff49a3a9a587592 =
+  BG.fromFFIType hs_bindgen_2ff49a3a9a587592_base
+
+-- | Load all the data from a file path.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with SDL_free().
+--
+--     [Returns]: the data or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadFile_IO', 'sDL_SaveFile'
+--
+--     [C declaration]: @SDL_LoadFile@, defined at @SDL3\/SDL_iostream.h 750:36@
+sDL_LoadFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to read all available data from.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: if not NULL, will store the number of bytes read.
+  -> IO (BG.Ptr BG.Void)
+sDL_LoadFile = hs_bindgen_2ff49a3a9a587592
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_SaveFile_IO@
+foreign import ccall unsafe "hs_bindgen_cc427af5b7d6a992"
+  hs_bindgen_cc427af5b7d6a992_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_SaveFile_IO@
+hs_bindgen_cc427af5b7d6a992
+  :: BG.Ptr SDL_IOStream
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_cc427af5b7d6a992 =
+  BG.fromFFIType hs_bindgen_cc427af5b7d6a992_base
+
+-- | Save all the data into an SDL data stream.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SaveFile', 'sDL_LoadFile_IO'
+--
+--     [C declaration]: @SDL_SaveFile_IO@, defined at @SDL3\/SDL_iostream.h 771:34@
+sDL_SaveFile_IO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to write all data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be written. If datasize is 0, may be NULL or a invalid pointer.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: the number of bytes to be written.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls @SDL_CloseIO()@ on @src@ before returning, even in the case of an error.
+  -> IO BG.CBool
+sDL_SaveFile_IO = hs_bindgen_cc427af5b7d6a992
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_SaveFile@
+foreign import ccall unsafe "hs_bindgen_ffc2a22709d13ea5"
+  hs_bindgen_ffc2a22709d13ea5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_SaveFile@
+hs_bindgen_ffc2a22709d13ea5
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CBool
+hs_bindgen_ffc2a22709d13ea5 =
+  BG.fromFFIType hs_bindgen_ffc2a22709d13ea5_base
+
+-- | Save all the data into a file path.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SaveFile_IO', 'sDL_LoadFile'
+--
+--     [C declaration]: @SDL_SaveFile@, defined at @SDL3\/SDL_iostream.h 790:34@
+sDL_SaveFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to write all available data into.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be written. If datasize is 0, may be NULL or a invalid pointer.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: the number of bytes to be written.
+  -> IO BG.CBool
+sDL_SaveFile = hs_bindgen_ffc2a22709d13ea5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU8@
+foreign import ccall unsafe "hs_bindgen_b1b1e0a90daf22ef"
+  hs_bindgen_b1b1e0a90daf22ef_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU8@
+hs_bindgen_b1b1e0a90daf22ef
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_b1b1e0a90daf22ef =
+  BG.fromFFIType hs_bindgen_b1b1e0a90daf22ef_base
+
+-- | Use this function to read a byte from an 'SDL_IOStream'.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on success or false on failure or EOF; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU8@, defined at @SDL3\/SDL_iostream.h 816:34@
+sDL_ReadU8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU8 = hs_bindgen_b1b1e0a90daf22ef
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS8@
+foreign import ccall unsafe "hs_bindgen_e87d63e49d240616"
+  hs_bindgen_e87d63e49d240616_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS8@
+hs_bindgen_e87d63e49d240616
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint8
+  -> IO BG.CBool
+hs_bindgen_e87d63e49d240616 =
+  BG.fromFFIType hs_bindgen_e87d63e49d240616_base
+
+-- | Use this function to read a signed byte from an 'SDL_IOStream'.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS8@, defined at @SDL3\/SDL_iostream.h 835:34@
+sDL_ReadS8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint8
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS8 = hs_bindgen_e87d63e49d240616
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU16LE@
+foreign import ccall unsafe "hs_bindgen_d3e2c7a83368733b"
+  hs_bindgen_d3e2c7a83368733b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU16LE@
+hs_bindgen_d3e2c7a83368733b
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> IO BG.CBool
+hs_bindgen_d3e2c7a83368733b =
+  BG.fromFFIType hs_bindgen_d3e2c7a83368733b_base
+
+-- | Use this function to read 16 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU16LE@, defined at @SDL3\/SDL_iostream.h 858:34@
+sDL_ReadU16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU16LE = hs_bindgen_d3e2c7a83368733b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS16LE@
+foreign import ccall unsafe "hs_bindgen_479681c9d7efb4b6"
+  hs_bindgen_479681c9d7efb4b6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS16LE@
+hs_bindgen_479681c9d7efb4b6
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_479681c9d7efb4b6 =
+  BG.fromFFIType hs_bindgen_479681c9d7efb4b6_base
+
+-- | Use this function to read 16 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS16LE@, defined at @SDL3\/SDL_iostream.h 881:34@
+sDL_ReadS16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS16LE = hs_bindgen_479681c9d7efb4b6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU16BE@
+foreign import ccall unsafe "hs_bindgen_9f0f6b734c649005"
+  hs_bindgen_9f0f6b734c649005_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU16BE@
+hs_bindgen_9f0f6b734c649005
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> IO BG.CBool
+hs_bindgen_9f0f6b734c649005 =
+  BG.fromFFIType hs_bindgen_9f0f6b734c649005_base
+
+-- | Use this function to read 16 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU16BE@, defined at @SDL3\/SDL_iostream.h 904:34@
+sDL_ReadU16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU16BE = hs_bindgen_9f0f6b734c649005
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS16BE@
+foreign import ccall unsafe "hs_bindgen_f2e57f79f83f7ccb"
+  hs_bindgen_f2e57f79f83f7ccb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS16BE@
+hs_bindgen_f2e57f79f83f7ccb
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_f2e57f79f83f7ccb =
+  BG.fromFFIType hs_bindgen_f2e57f79f83f7ccb_base
+
+-- | Use this function to read 16 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS16BE@, defined at @SDL3\/SDL_iostream.h 927:34@
+sDL_ReadS16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS16BE = hs_bindgen_f2e57f79f83f7ccb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU32LE@
+foreign import ccall unsafe "hs_bindgen_4c7ed5f362c69100"
+  hs_bindgen_4c7ed5f362c69100_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU32LE@
+hs_bindgen_4c7ed5f362c69100
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_4c7ed5f362c69100 =
+  BG.fromFFIType hs_bindgen_4c7ed5f362c69100_base
+
+-- | Use this function to read 32 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU32LE@, defined at @SDL3\/SDL_iostream.h 950:34@
+sDL_ReadU32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU32LE = hs_bindgen_4c7ed5f362c69100
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS32LE@
+foreign import ccall unsafe "hs_bindgen_6817084863d4f803"
+  hs_bindgen_6817084863d4f803_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS32LE@
+hs_bindgen_6817084863d4f803
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_6817084863d4f803 =
+  BG.fromFFIType hs_bindgen_6817084863d4f803_base
+
+-- | Use this function to read 32 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS32LE@, defined at @SDL3\/SDL_iostream.h 973:34@
+sDL_ReadS32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS32LE = hs_bindgen_6817084863d4f803
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU32BE@
+foreign import ccall unsafe "hs_bindgen_a689b6518018f0f8"
+  hs_bindgen_a689b6518018f0f8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU32BE@
+hs_bindgen_a689b6518018f0f8
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_a689b6518018f0f8 =
+  BG.fromFFIType hs_bindgen_a689b6518018f0f8_base
+
+-- | Use this function to read 32 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU32BE@, defined at @SDL3\/SDL_iostream.h 996:34@
+sDL_ReadU32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU32BE = hs_bindgen_a689b6518018f0f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS32BE@
+foreign import ccall unsafe "hs_bindgen_8803a44bce7c7e75"
+  hs_bindgen_8803a44bce7c7e75_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS32BE@
+hs_bindgen_8803a44bce7c7e75
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_8803a44bce7c7e75 =
+  BG.fromFFIType hs_bindgen_8803a44bce7c7e75_base
+
+-- | Use this function to read 32 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS32BE@, defined at @SDL3\/SDL_iostream.h 1019:34@
+sDL_ReadS32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS32BE = hs_bindgen_8803a44bce7c7e75
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU64LE@
+foreign import ccall unsafe "hs_bindgen_e3dd1a0b9ab72b6e"
+  hs_bindgen_e3dd1a0b9ab72b6e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU64LE@
+hs_bindgen_e3dd1a0b9ab72b6e
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_e3dd1a0b9ab72b6e =
+  BG.fromFFIType hs_bindgen_e3dd1a0b9ab72b6e_base
+
+-- | Use this function to read 64 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU64LE@, defined at @SDL3\/SDL_iostream.h 1042:34@
+sDL_ReadU64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU64LE = hs_bindgen_e3dd1a0b9ab72b6e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS64LE@
+foreign import ccall unsafe "hs_bindgen_ad567c6f2b1bd0a7"
+  hs_bindgen_ad567c6f2b1bd0a7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS64LE@
+hs_bindgen_ad567c6f2b1bd0a7
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_ad567c6f2b1bd0a7 =
+  BG.fromFFIType hs_bindgen_ad567c6f2b1bd0a7_base
+
+-- | Use this function to read 64 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS64LE@, defined at @SDL3\/SDL_iostream.h 1065:34@
+sDL_ReadS64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS64LE = hs_bindgen_ad567c6f2b1bd0a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU64BE@
+foreign import ccall unsafe "hs_bindgen_2e71cf93b76724a0"
+  hs_bindgen_2e71cf93b76724a0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadU64BE@
+hs_bindgen_2e71cf93b76724a0
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_2e71cf93b76724a0 =
+  BG.fromFFIType hs_bindgen_2e71cf93b76724a0_base
+
+-- | Use this function to read 64 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadU64BE@, defined at @SDL3\/SDL_iostream.h 1088:34@
+sDL_ReadU64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadU64BE = hs_bindgen_2e71cf93b76724a0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS64BE@
+foreign import ccall unsafe "hs_bindgen_95ecf77ce8aa6634"
+  hs_bindgen_95ecf77ce8aa6634_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_ReadS64BE@
+hs_bindgen_95ecf77ce8aa6634
+  :: BG.Ptr SDL_IOStream
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_95ecf77ce8aa6634 =
+  BG.fromFFIType hs_bindgen_95ecf77ce8aa6634_base
+
+-- | Use this function to read 64 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @SDL_GetIOStatus()@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @SDL_GetIOStatus()@ will return a different error value and SDL_GetError() will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadS64BE@, defined at @SDL3\/SDL_iostream.h 1111:34@
+sDL_ReadS64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO BG.CBool
+sDL_ReadS64BE = hs_bindgen_95ecf77ce8aa6634
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU8@
+foreign import ccall unsafe "hs_bindgen_054c3110f978dbc5"
+  hs_bindgen_054c3110f978dbc5_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU8@
+hs_bindgen_054c3110f978dbc5
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_054c3110f978dbc5 =
+  BG.fromFFIType hs_bindgen_054c3110f978dbc5_base
+
+-- | Use this function to write a byte to an 'SDL_IOStream'.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU8@, defined at @SDL3\/SDL_iostream.h 1133:34@
+sDL_WriteU8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_IOStream' to write to.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@value@]: the byte value to write.
+  -> IO BG.CBool
+sDL_WriteU8 = hs_bindgen_054c3110f978dbc5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS8@
+foreign import ccall unsafe "hs_bindgen_d0a9827894815b9e"
+  hs_bindgen_d0a9827894815b9e_base
+    :: BG.Ptr BG.Void
+    -> BG.Int8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS8@
+hs_bindgen_d0a9827894815b9e
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint8
+  -> IO BG.CBool
+hs_bindgen_d0a9827894815b9e =
+  BG.fromFFIType hs_bindgen_d0a9827894815b9e_base
+
+-- | Use this function to write a signed byte to an 'SDL_IOStream'.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS8@, defined at @SDL3\/SDL_iostream.h 1147:34@
+sDL_WriteS8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_IOStream' to write to.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint8
+  -- ^
+  --
+  --           [@value@]: the byte value to write.
+  -> IO BG.CBool
+sDL_WriteS8 = hs_bindgen_d0a9827894815b9e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU16LE@
+foreign import ccall unsafe "hs_bindgen_197d92df5116e339"
+  hs_bindgen_197d92df5116e339_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU16LE@
+hs_bindgen_197d92df5116e339
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> IO BG.CBool
+hs_bindgen_197d92df5116e339 =
+  BG.fromFFIType hs_bindgen_197d92df5116e339_base
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU16LE@, defined at @SDL3\/SDL_iostream.h 1166:34@
+sDL_WriteU16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU16LE = hs_bindgen_197d92df5116e339
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS16LE@
+foreign import ccall unsafe "hs_bindgen_6bf86c914d8f27c9"
+  hs_bindgen_6bf86c914d8f27c9_base
+    :: BG.Ptr BG.Void
+    -> BG.Int16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS16LE@
+hs_bindgen_6bf86c914d8f27c9
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_6bf86c914d8f27c9 =
+  BG.fromFFIType hs_bindgen_6bf86c914d8f27c9_base
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS16LE@, defined at @SDL3\/SDL_iostream.h 1185:34@
+sDL_WriteS16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS16LE = hs_bindgen_6bf86c914d8f27c9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU16BE@
+foreign import ccall unsafe "hs_bindgen_22ad038fcf74bfca"
+  hs_bindgen_22ad038fcf74bfca_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU16BE@
+hs_bindgen_22ad038fcf74bfca
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> IO BG.CBool
+hs_bindgen_22ad038fcf74bfca =
+  BG.fromFFIType hs_bindgen_22ad038fcf74bfca_base
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU16BE@, defined at @SDL3\/SDL_iostream.h 1203:34@
+sDL_WriteU16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU16BE = hs_bindgen_22ad038fcf74bfca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS16BE@
+foreign import ccall unsafe "hs_bindgen_3a1b7a64deee39d0"
+  hs_bindgen_3a1b7a64deee39d0_base
+    :: BG.Ptr BG.Void
+    -> BG.Int16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS16BE@
+hs_bindgen_3a1b7a64deee39d0
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_3a1b7a64deee39d0 =
+  BG.fromFFIType hs_bindgen_3a1b7a64deee39d0_base
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS16BE@, defined at @SDL3\/SDL_iostream.h 1221:34@
+sDL_WriteS16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS16BE = hs_bindgen_3a1b7a64deee39d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU32LE@
+foreign import ccall unsafe "hs_bindgen_e3779860ffb0e190"
+  hs_bindgen_e3779860ffb0e190_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU32LE@
+hs_bindgen_e3779860ffb0e190
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_e3779860ffb0e190 =
+  BG.fromFFIType hs_bindgen_e3779860ffb0e190_base
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU32LE@, defined at @SDL3\/SDL_iostream.h 1240:34@
+sDL_WriteU32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU32LE = hs_bindgen_e3779860ffb0e190
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS32LE@
+foreign import ccall unsafe "hs_bindgen_3b943b45962d4109"
+  hs_bindgen_3b943b45962d4109_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS32LE@
+hs_bindgen_3b943b45962d4109
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_3b943b45962d4109 =
+  BG.fromFFIType hs_bindgen_3b943b45962d4109_base
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS32LE@, defined at @SDL3\/SDL_iostream.h 1259:34@
+sDL_WriteS32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS32LE = hs_bindgen_3b943b45962d4109
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU32BE@
+foreign import ccall unsafe "hs_bindgen_88b11c56e4dcdce7"
+  hs_bindgen_88b11c56e4dcdce7_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU32BE@
+hs_bindgen_88b11c56e4dcdce7
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_88b11c56e4dcdce7 =
+  BG.fromFFIType hs_bindgen_88b11c56e4dcdce7_base
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU32BE@, defined at @SDL3\/SDL_iostream.h 1277:34@
+sDL_WriteU32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU32BE = hs_bindgen_88b11c56e4dcdce7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS32BE@
+foreign import ccall unsafe "hs_bindgen_8f32aca42f3f9abc"
+  hs_bindgen_8f32aca42f3f9abc_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS32BE@
+hs_bindgen_8f32aca42f3f9abc
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_8f32aca42f3f9abc =
+  BG.fromFFIType hs_bindgen_8f32aca42f3f9abc_base
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS32BE@, defined at @SDL3\/SDL_iostream.h 1295:34@
+sDL_WriteS32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS32BE = hs_bindgen_8f32aca42f3f9abc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU64LE@
+foreign import ccall unsafe "hs_bindgen_5b5ed260c10314c5"
+  hs_bindgen_5b5ed260c10314c5_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU64LE@
+hs_bindgen_5b5ed260c10314c5
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_5b5ed260c10314c5 =
+  BG.fromFFIType hs_bindgen_5b5ed260c10314c5_base
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU64LE@, defined at @SDL3\/SDL_iostream.h 1314:34@
+sDL_WriteU64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU64LE = hs_bindgen_5b5ed260c10314c5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS64LE@
+foreign import ccall unsafe "hs_bindgen_6b0d99f99a1f8f14"
+  hs_bindgen_6b0d99f99a1f8f14_base
+    :: BG.Ptr BG.Void
+    -> BG.Int64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS64LE@
+hs_bindgen_6b0d99f99a1f8f14
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_6b0d99f99a1f8f14 =
+  BG.fromFFIType hs_bindgen_6b0d99f99a1f8f14_base
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS64LE@, defined at @SDL3\/SDL_iostream.h 1333:34@
+sDL_WriteS64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS64LE = hs_bindgen_6b0d99f99a1f8f14
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU64BE@
+foreign import ccall unsafe "hs_bindgen_8d6f10b5ca6caad3"
+  hs_bindgen_8d6f10b5ca6caad3_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteU64BE@
+hs_bindgen_8d6f10b5ca6caad3
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_8d6f10b5ca6caad3 =
+  BG.fromFFIType hs_bindgen_8d6f10b5ca6caad3_base
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteU64BE@, defined at @SDL3\/SDL_iostream.h 1351:34@
+sDL_WriteU64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteU64BE = hs_bindgen_8d6f10b5ca6caad3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS64BE@
+foreign import ccall unsafe "hs_bindgen_50adbb19351b1adb"
+  hs_bindgen_50adbb19351b1adb_base
+    :: BG.Ptr BG.Void
+    -> BG.Int64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Iostream_Unsafe_SDL_WriteS64BE@
+hs_bindgen_50adbb19351b1adb
+  :: BG.Ptr SDL_IOStream
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_50adbb19351b1adb =
+  BG.fromFFIType hs_bindgen_50adbb19351b1adb_base
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteS64BE@, defined at @SDL3\/SDL_iostream.h 1369:34@
+sDL_WriteS64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO BG.CBool
+sDL_WriteS64BE = hs_bindgen_50adbb19351b1adb
diff --git a/src/SDL3/Sys/Bindgen/Joystick.hs b/src/SDL3/Sys/Bindgen/Joystick.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Joystick.hs
@@ -0,0 +1,2409 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL joystick support.
+--
+--     This is the lower-level joystick handling. If you want the simpler option, where what each button does is well-defined, you should use the gamepad API instead.
+--
+--     The term \"instance_id\" is the current instantiation of a joystick device in the system. If the joystick is removed and then re-inserted then it will get a new instance_id. instance_id\'s are monotonically increasing identifiers of a joystick plugged in.
+--
+--     The term \"player_index\" is the number assigned to a player on a specific controller. For XInput controllers this returns the XInput user index. Many joysticks will not be able to supply this information.
+--
+--     SDL_GUID is used as a stable 128-bit identifier for a joystick device that does not change over time. It identifies class of the device (a X360 wired controller for example). This identifier is platform dependent.
+--
+--     In order to use these functions, SDL_Init() must have been called with the SDL_INIT_JOYSTICK flag. This causes SDL to scan the system for joysticks, and load appropriate drivers.
+--
+--     If you would like to receive joystick updates while the application is in the background, you should set the following hint before calling SDL_Init(): SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
+--
+--     SDL can provide virtual joysticks as well: the app defines an imaginary controller with @SDL_AttachVirtualJoystick()@, and then can provide inputs for it via @SDL_SetJoystickVirtualAxis()@, @SDL_SetJoystickVirtualButton()@, etc. As this data is supplied, it will look like a normal joystick to SDL, just not backed by a hardware driver. This has been used to make unusual devices, like VR headset controllers, look like normal joysticks, or provide recording\/playback of game inputs, etc. The joystick structure used to identify an SDL joystick.
+--
+--     This is opaque data.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Joystick (
+  SDL3.Sys.Bindgen.Joystick.SDL_Joystick,
+  SDL3.Sys.Bindgen.Joystick.SDL_JoystickID (..),
+  SDL3.Sys.Bindgen.Joystick.SDL_JoystickType (..),
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_GAMEPAD,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_WHEEL,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_ARCADE_STICK,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_FLIGHT_STICK,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_DANCE_PAD,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_GUITAR,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_DRUM_KIT,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_ARCADE_PAD,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_THROTTLE,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_TYPE_COUNT,
+  SDL3.Sys.Bindgen.Joystick.SDL_JoystickConnectionState (..),
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_CONNECTION_INVALID,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_CONNECTION_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_CONNECTION_WIRED,
+  pattern SDL3.Sys.Bindgen.Joystick.SDL_JOYSTICK_CONNECTION_WIRELESS,
+  SDL3.Sys.Bindgen.Joystick.sDL_JOYSTICK_AXIS_MAX,
+  SDL3.Sys.Bindgen.Joystick.sDL_JOYSTICK_AXIS_MIN,
+  SDL3.Sys.Bindgen.Joystick.SDL_VirtualJoystickTouchpadDesc (..),
+  SDL3.Sys.Bindgen.Joystick.SDL_VirtualJoystickSensorDesc (..),
+  SDL3.Sys.Bindgen.Joystick.SDL_VirtualJoystickDesc (..),
+  SDL3.Sys.Bindgen.Joystick.sDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN,
+  SDL3.Sys.Bindgen.Joystick.sDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN,
+  SDL3.Sys.Bindgen.Joystick.sDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN,
+  SDL3.Sys.Bindgen.Joystick.sDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN,
+  SDL3.Sys.Bindgen.Joystick.sDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN,
+  SDL3.Sys.Bindgen.Joystick.sDL_HAT_CENTERED,
+  SDL3.Sys.Bindgen.Joystick.sDL_HAT_UP,
+  SDL3.Sys.Bindgen.Joystick.sDL_HAT_RIGHT,
+  SDL3.Sys.Bindgen.Joystick.sDL_HAT_DOWN,
+  SDL3.Sys.Bindgen.Joystick.sDL_HAT_LEFT,
+  SDL3.Sys.Bindgen.Joystick.sDL_HAT_RIGHTUP,
+  SDL3.Sys.Bindgen.Joystick.sDL_HAT_RIGHTDOWN,
+  SDL3.Sys.Bindgen.Joystick.sDL_HAT_LEFTUP,
+  SDL3.Sys.Bindgen.Joystick.sDL_HAT_LEFTDOWN,
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.ConstantArray qualified as CA
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Sensor qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @struct SDL_Joystick@, defined at @SDL3\/SDL_joystick.h 94:16@
+data SDL_Joystick
+
+-- | This is a unique ID for a joystick for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     If the joystick is disconnected and reconnected, it will get a new ID.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_JoystickID@, defined at @SDL3\/SDL_joystick.h 106:16@
+newtype SDL_JoystickID = SDL_JoystickID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_JoystickID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoystickID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_JoystickID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_JoystickID "unwrap" where
+  type
+    CFieldType SDL_JoystickID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | An enum of some common joystick types.
+--
+--     In some cases, SDL can identify a low-level joystick as being a certain type of device, and will report it through SDL_GetJoystickType (or SDL_GetJoystickTypeForID).
+--
+--     This is by no means a complete list of everything that can be plugged into a computer.
+--
+--     You may refer to [XInput Controller Types](https://learn.microsoft.com/en-us/windows/win32/xinput/xinput-and-controller-subtypes) table for a general understanding of each joystick type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_JoystickType@, defined at @SDL3\/SDL_joystick.h 124:14@
+newtype SDL_JoystickType = SDL_JoystickType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_JoystickType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_JoystickType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_JoystickType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_JoystickType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_JoystickType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_JoystickType instance BG.Storable SDL_JoystickType
+
+deriving via BG.CUInt instance BG.Prim SDL_JoystickType
+
+instance CEnum.CEnum SDL_JoystickType where
+  type CEnumZ SDL_JoystickType = BG.CUInt
+
+  toCEnum = SDL_JoystickType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_JOYSTICK_TYPE_UNKNOWN")
+        , (1, BG.singleton "SDL_JOYSTICK_TYPE_GAMEPAD")
+        , (2, BG.singleton "SDL_JOYSTICK_TYPE_WHEEL")
+        , (3, BG.singleton "SDL_JOYSTICK_TYPE_ARCADE_STICK")
+        , (4, BG.singleton "SDL_JOYSTICK_TYPE_FLIGHT_STICK")
+        , (5, BG.singleton "SDL_JOYSTICK_TYPE_DANCE_PAD")
+        , (6, BG.singleton "SDL_JOYSTICK_TYPE_GUITAR")
+        , (7, BG.singleton "SDL_JOYSTICK_TYPE_DRUM_KIT")
+        , (8, BG.singleton "SDL_JOYSTICK_TYPE_ARCADE_PAD")
+        , (9, BG.singleton "SDL_JOYSTICK_TYPE_THROTTLE")
+        , (10, BG.singleton "SDL_JOYSTICK_TYPE_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_JoystickType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_JoystickType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_JoystickType where
+  minDeclaredValue = SDL_JOYSTICK_TYPE_UNKNOWN
+
+  maxDeclaredValue = SDL_JOYSTICK_TYPE_COUNT
+
+instance Show SDL_JoystickType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_JoystickType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_JoystickType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoystickType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_JoystickType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_JoystickType "unwrap" where
+  type CFieldType SDL_JoystickType "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_UNKNOWN@, defined at @SDL3\/SDL_joystick.h 126:5@
+pattern SDL_JOYSTICK_TYPE_UNKNOWN :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_UNKNOWN = SDL_JoystickType 0
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_GAMEPAD@, defined at @SDL3\/SDL_joystick.h 127:5@
+pattern SDL_JOYSTICK_TYPE_GAMEPAD :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_GAMEPAD = SDL_JoystickType 1
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_WHEEL@, defined at @SDL3\/SDL_joystick.h 128:5@
+pattern SDL_JOYSTICK_TYPE_WHEEL :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_WHEEL = SDL_JoystickType 2
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_ARCADE_STICK@, defined at @SDL3\/SDL_joystick.h 129:5@
+pattern SDL_JOYSTICK_TYPE_ARCADE_STICK :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_ARCADE_STICK = SDL_JoystickType 3
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_FLIGHT_STICK@, defined at @SDL3\/SDL_joystick.h 130:5@
+pattern SDL_JOYSTICK_TYPE_FLIGHT_STICK :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_FLIGHT_STICK = SDL_JoystickType 4
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_DANCE_PAD@, defined at @SDL3\/SDL_joystick.h 131:5@
+pattern SDL_JOYSTICK_TYPE_DANCE_PAD :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_DANCE_PAD = SDL_JoystickType 5
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_GUITAR@, defined at @SDL3\/SDL_joystick.h 132:5@
+pattern SDL_JOYSTICK_TYPE_GUITAR :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_GUITAR = SDL_JoystickType 6
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_DRUM_KIT@, defined at @SDL3\/SDL_joystick.h 133:5@
+pattern SDL_JOYSTICK_TYPE_DRUM_KIT :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_DRUM_KIT = SDL_JoystickType 7
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_ARCADE_PAD@, defined at @SDL3\/SDL_joystick.h 134:5@
+pattern SDL_JOYSTICK_TYPE_ARCADE_PAD :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_ARCADE_PAD = SDL_JoystickType 8
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_THROTTLE@, defined at @SDL3\/SDL_joystick.h 135:5@
+pattern SDL_JOYSTICK_TYPE_THROTTLE :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_THROTTLE = SDL_JoystickType 9
+
+-- | [C declaration]: @SDL_JOYSTICK_TYPE_COUNT@, defined at @SDL3\/SDL_joystick.h 136:5@
+pattern SDL_JOYSTICK_TYPE_COUNT :: SDL_JoystickType
+pattern SDL_JOYSTICK_TYPE_COUNT = SDL_JoystickType 10
+
+-- | Possible connection states for a joystick device.
+--
+--     This is used by SDL_GetJoystickConnectionState to report how a device is connected to the system.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_JoystickConnectionState@, defined at @SDL3\/SDL_joystick.h 147:14@
+newtype SDL_JoystickConnectionState = SDL_JoystickConnectionState
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_JoystickConnectionState where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_JoystickConnectionState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_JoystickConnectionState
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_JoystickConnectionState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_JoystickConnectionState unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_JoystickConnectionState
+  instance
+    BG.Storable SDL_JoystickConnectionState
+
+deriving via BG.CInt instance BG.Prim SDL_JoystickConnectionState
+
+instance CEnum.CEnum SDL_JoystickConnectionState where
+  type CEnumZ SDL_JoystickConnectionState = BG.CInt
+
+  toCEnum = SDL_JoystickConnectionState
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_JOYSTICK_CONNECTION_INVALID")
+        , (0, BG.singleton "SDL_JOYSTICK_CONNECTION_UNKNOWN")
+        , (1, BG.singleton "SDL_JOYSTICK_CONNECTION_WIRED")
+        , (2, BG.singleton "SDL_JOYSTICK_CONNECTION_WIRELESS")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_JoystickConnectionState"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_JoystickConnectionState"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_JoystickConnectionState where
+  minDeclaredValue = SDL_JOYSTICK_CONNECTION_INVALID
+
+  maxDeclaredValue = SDL_JOYSTICK_CONNECTION_WIRELESS
+
+instance Show SDL_JoystickConnectionState where
+  showsPrec = CEnum.shows
+
+instance Read SDL_JoystickConnectionState where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_JoystickConnectionState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_JoystickConnectionState{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_JoystickConnectionState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_JoystickConnectionState "unwrap" where
+  type
+    CFieldType SDL_JoystickConnectionState "unwrap" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_JOYSTICK_CONNECTION_INVALID@, defined at @SDL3\/SDL_joystick.h 149:5@
+pattern SDL_JOYSTICK_CONNECTION_INVALID :: SDL_JoystickConnectionState
+pattern SDL_JOYSTICK_CONNECTION_INVALID = SDL_JoystickConnectionState (-1)
+
+-- | [C declaration]: @SDL_JOYSTICK_CONNECTION_UNKNOWN@, defined at @SDL3\/SDL_joystick.h 150:5@
+pattern SDL_JOYSTICK_CONNECTION_UNKNOWN :: SDL_JoystickConnectionState
+pattern SDL_JOYSTICK_CONNECTION_UNKNOWN = SDL_JoystickConnectionState 0
+
+-- | [C declaration]: @SDL_JOYSTICK_CONNECTION_WIRED@, defined at @SDL3\/SDL_joystick.h 151:5@
+pattern SDL_JOYSTICK_CONNECTION_WIRED :: SDL_JoystickConnectionState
+pattern SDL_JOYSTICK_CONNECTION_WIRED = SDL_JoystickConnectionState 1
+
+-- | [C declaration]: @SDL_JOYSTICK_CONNECTION_WIRELESS@, defined at @SDL3\/SDL_joystick.h 152:5@
+pattern SDL_JOYSTICK_CONNECTION_WIRELESS :: SDL_JoystickConnectionState
+pattern SDL_JOYSTICK_CONNECTION_WIRELESS = SDL_JoystickConnectionState 2
+
+-- | The largest value an 'SDL_Joystick' \'s axis can report.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_JOYSTICK_AXIS_MIN'
+--
+--     [C declaration]: @macro SDL_JOYSTICK_AXIS_MAX@, defined at @SDL3\/SDL_joystick.h 162:9@
+sDL_JOYSTICK_AXIS_MAX :: BG.CInt
+sDL_JOYSTICK_AXIS_MAX = (32767 :: BG.CInt)
+
+-- | The smallest value an 'SDL_Joystick' \'s axis can report.
+--
+--     This is a negative number!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_JOYSTICK_AXIS_MAX'
+--
+--     [C declaration]: @macro SDL_JOYSTICK_AXIS_MIN@, defined at @SDL3\/SDL_joystick.h 173:9@
+sDL_JOYSTICK_AXIS_MIN :: BG.CInt
+sDL_JOYSTICK_AXIS_MIN =
+  C.Expr.HostPlatform.negate (32768 :: BG.CInt)
+
+-- | The structure that describes a virtual joystick touchpad.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_VirtualJoystickDesc'
+--
+--     [C declaration]: @struct SDL_VirtualJoystickTouchpadDesc@, defined at @SDL3\/SDL_joystick.h 433:16@
+data SDL_VirtualJoystickTouchpadDesc = SDL_VirtualJoystickTouchpadDesc
+  { nfingers :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ the number of simultaneous fingers on this touchpad
+  --
+  --          [C declaration]: @nfingers@, defined at @SDL3\/SDL_joystick.h 435:12@
+  , padding :: CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ [C declaration]: @padding@, defined at @SDL3\/SDL_joystick.h 436:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_VirtualJoystickTouchpadDesc where
+  staticSizeOf = \_ -> (8 :: Int)
+
+  staticAlignment = \_ -> (2 :: Int)
+
+instance Marshal.ReadRaw SDL_VirtualJoystickTouchpadDesc where
+  readRaw =
+    \ptr0 ->
+      pure SDL_VirtualJoystickTouchpadDesc
+        <*> HasCField.readRaw (BG.Proxy @"nfingers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding") ptr0
+
+instance Marshal.WriteRaw SDL_VirtualJoystickTouchpadDesc where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_VirtualJoystickTouchpadDesc nfingers2 padding3 ->
+            HasCField.writeRaw (BG.Proxy @"nfingers") ptr0 nfingers2
+              >> HasCField.writeRaw (BG.Proxy @"padding") ptr0 padding3
+
+deriving via
+  Marshal.EquivStorable SDL_VirtualJoystickTouchpadDesc
+  instance
+    BG.Storable SDL_VirtualJoystickTouchpadDesc
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "nfingers" SDL_VirtualJoystickTouchpadDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickTouchpadDesc{nfingers = y1, padding = BG.getField @"padding" x0}
+      , BG.getField @"nfingers" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "nfingers" (BG.Ptr SDL_VirtualJoystickTouchpadDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"nfingers")
+
+instance HasCField.HasCField SDL_VirtualJoystickTouchpadDesc "nfingers" where
+  type
+    CFieldType SDL_VirtualJoystickTouchpadDesc "nfingers" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "padding" SDL_VirtualJoystickTouchpadDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickTouchpadDesc{padding = y1, nfingers = BG.getField @"nfingers" x0}
+      , BG.getField @"padding" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "padding" (BG.Ptr SDL_VirtualJoystickTouchpadDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding")
+
+instance HasCField.HasCField SDL_VirtualJoystickTouchpadDesc "padding" where
+  type
+    CFieldType SDL_VirtualJoystickTouchpadDesc "padding" =
+      CA.ConstantArray 3 SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 2
+
+-- | The structure that describes a virtual joystick sensor.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_VirtualJoystickDesc'
+--
+--     [C declaration]: @struct SDL_VirtualJoystickSensorDesc@, defined at @SDL3\/SDL_joystick.h 446:16@
+data SDL_VirtualJoystickSensorDesc = SDL_VirtualJoystickSensorDesc
+  { type' :: SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^ the type of this sensor
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_joystick.h 448:20@
+  , rate :: BG.CFloat
+  -- ^ the update frequency of this sensor, may be 0.0f
+  --
+  --          [C declaration]: @rate@, defined at @SDL3\/SDL_joystick.h 449:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_VirtualJoystickSensorDesc where
+  staticSizeOf = \_ -> (8 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_VirtualJoystickSensorDesc where
+  readRaw =
+    \ptr0 ->
+      pure SDL_VirtualJoystickSensorDesc
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"rate") ptr0
+
+instance Marshal.WriteRaw SDL_VirtualJoystickSensorDesc where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_VirtualJoystickSensorDesc type'2 rate3 ->
+            HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'2
+              >> HasCField.writeRaw (BG.Proxy @"rate") ptr0 rate3
+
+deriving via
+  Marshal.EquivStorable SDL_VirtualJoystickSensorDesc
+  instance
+    BG.Storable SDL_VirtualJoystickSensorDesc
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Sensor.SDL_SensorType)
+  => BG.CompatHasField.HasField "type'" SDL_VirtualJoystickSensorDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickSensorDesc{type' = y1, rate = BG.getField @"rate" x0}
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Sensor.SDL_SensorType)
+  => BG.HasField "type'" (BG.Ptr SDL_VirtualJoystickSensorDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_VirtualJoystickSensorDesc "type'" where
+  type
+    CFieldType SDL_VirtualJoystickSensorDesc "type'" =
+      SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "rate" SDL_VirtualJoystickSensorDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickSensorDesc{rate = y1, type' = BG.getField @"type'" x0}
+      , BG.getField @"rate" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "rate" (BG.Ptr SDL_VirtualJoystickSensorDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"rate")
+
+instance HasCField.HasCField SDL_VirtualJoystickSensorDesc "rate" where
+  type
+    CFieldType SDL_VirtualJoystickSensorDesc "rate" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 4
+
+-- | The structure that describes a virtual joystick.
+--
+--     This structure should be initialized using SDL_INIT_INTERFACE(). All elements of this structure are optional.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AttachVirtualJoystick', SDL_INIT_INTERFACE, 'SDL_VirtualJoystickSensorDesc', 'SDL_VirtualJoystickTouchpadDesc'
+--
+--     [C declaration]: @struct SDL_VirtualJoystickDesc@, defined at @SDL3\/SDL_joystick.h 465:16@
+data SDL_VirtualJoystickDesc = SDL_VirtualJoystickDesc
+  { version :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ the version of this interface
+  --
+  --          [C declaration]: @version@, defined at @SDL3\/SDL_joystick.h 467:12@
+  , type' :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ @'SDL_JoystickType'@
+  --
+  --          [C declaration]: @type@, defined at @SDL3\/SDL_joystick.h 468:12@
+  , padding :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ unused
+  --
+  --          [C declaration]: @padding@, defined at @SDL3\/SDL_joystick.h 469:12@
+  , vendor_id :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ the USB vendor ID of this joystick
+  --
+  --          [C declaration]: @vendor_id@, defined at @SDL3\/SDL_joystick.h 470:12@
+  , product_id :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ the USB product ID of this joystick
+  --
+  --          [C declaration]: @product_id@, defined at @SDL3\/SDL_joystick.h 471:12@
+  , naxes :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ the number of axes on this joystick
+  --
+  --          [C declaration]: @naxes@, defined at @SDL3\/SDL_joystick.h 472:12@
+  , nbuttons :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ the number of buttons on this joystick
+  --
+  --          [C declaration]: @nbuttons@, defined at @SDL3\/SDL_joystick.h 473:12@
+  , nballs :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ the number of balls on this joystick
+  --
+  --          [C declaration]: @nballs@, defined at @SDL3\/SDL_joystick.h 474:12@
+  , nhats :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ the number of hats on this joystick
+  --
+  --          [C declaration]: @nhats@, defined at @SDL3\/SDL_joystick.h 475:12@
+  , ntouchpads :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ the number of touchpads on this joystick, requires @touchpads@ to point at valid descriptions
+  --
+  --          [C declaration]: @ntouchpads@, defined at @SDL3\/SDL_joystick.h 476:12@
+  , nsensors :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ the number of sensors on this joystick, requires @sensors@ to point at valid descriptions
+  --
+  --          [C declaration]: @nsensors@, defined at @SDL3\/SDL_joystick.h 477:12@
+  , padding2 :: CA.ConstantArray 2 SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^ unused
+  --
+  --          [C declaration]: @padding2@, defined at @SDL3\/SDL_joystick.h 478:12@
+  , button_mask :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ A mask of which buttons are valid for this controller e.g. (1 \<\< SDL_GAMEPAD_BUTTON_SOUTH)
+  --
+  --          [C declaration]: @button_mask@, defined at @SDL3\/SDL_joystick.h 479:12@
+  , axis_mask :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ A mask of which axes are valid for this controller e.g. (1 \<\< SDL_GAMEPAD_AXIS_LEFTX)
+  --
+  --          [C declaration]: @axis_mask@, defined at @SDL3\/SDL_joystick.h 481:12@
+  , name :: PtrConst.PtrConst BG.CChar
+  -- ^ the name of the joystick
+  --
+  --          [C declaration]: @name@, defined at @SDL3\/SDL_joystick.h 483:17@
+  , touchpads :: PtrConst.PtrConst SDL_VirtualJoystickTouchpadDesc
+  -- ^ A pointer to an array of touchpad descriptions, required if @ntouchpads@ is > 0
+  --
+  --          [C declaration]: @touchpads@, defined at @SDL3\/SDL_joystick.h 484:44@
+  , sensors :: PtrConst.PtrConst SDL_VirtualJoystickSensorDesc
+  -- ^ A pointer to an array of sensor descriptions, required if @nsensors@ is > 0
+  --
+  --          [C declaration]: @sensors@, defined at @SDL3\/SDL_joystick.h 485:42@
+  , userdata :: BG.Ptr BG.Void
+  -- ^ User data pointer passed to callbacks
+  --
+  --          [C declaration]: @userdata@, defined at @SDL3\/SDL_joystick.h 487:11@
+  , update :: BG.FunPtr (BG.Ptr BG.Void -> IO ())
+  -- ^ [C declaration]: @Update@, defined at @SDL3\/SDL_joystick.h 488:20@
+  , setPlayerIndex :: BG.FunPtr (BG.Ptr BG.Void -> BG.CInt -> IO ())
+  -- ^ [C declaration]: @SetPlayerIndex@, defined at @SDL3\/SDL_joystick.h 489:20@
+  , rumble
+      :: BG.FunPtr
+           (BG.Ptr BG.Void -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+  -- ^ [C declaration]: @Rumble@, defined at @SDL3\/SDL_joystick.h 490:20@
+  , rumbleTriggers
+      :: BG.FunPtr
+           (BG.Ptr BG.Void -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+  -- ^ [C declaration]: @RumbleTriggers@, defined at @SDL3\/SDL_joystick.h 491:20@
+  , setLED
+      :: BG.FunPtr
+           ( BG.Ptr BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+  -- ^ [C declaration]: @SetLED@, defined at @SDL3\/SDL_joystick.h 492:20@
+  , sendEffect :: BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO BG.CBool)
+  -- ^ [C declaration]: @SendEffect@, defined at @SDL3\/SDL_joystick.h 493:20@
+  , setSensorsEnabled :: BG.FunPtr (BG.Ptr BG.Void -> BG.CBool -> IO BG.CBool)
+  -- ^ [C declaration]: @SetSensorsEnabled@, defined at @SDL3\/SDL_joystick.h 494:20@
+  , cleanup :: BG.FunPtr (BG.Ptr BG.Void -> IO ())
+  -- ^ [C declaration]: @Cleanup@, defined at @SDL3\/SDL_joystick.h 495:20@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_VirtualJoystickDesc where
+  staticSizeOf = \_ -> (136 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_VirtualJoystickDesc where
+  readRaw =
+    \ptr0 ->
+      pure SDL_VirtualJoystickDesc
+        <*> HasCField.readRaw (BG.Proxy @"version") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"type'") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"vendor_id") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"product_id") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"naxes") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"nbuttons") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"nballs") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"nhats") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"ntouchpads") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"nsensors") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding2") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"button_mask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"axis_mask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"name") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"touchpads") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"sensors") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"userdata") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"update") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"setPlayerIndex") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"rumble") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"rumbleTriggers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"setLED") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"sendEffect") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"setSensorsEnabled") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"cleanup") ptr0
+
+instance Marshal.WriteRaw SDL_VirtualJoystickDesc where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_VirtualJoystickDesc
+            version2
+            type'3
+            padding4
+            vendor_id5
+            product_id6
+            naxes7
+            nbuttons8
+            nballs9
+            nhats10
+            ntouchpads11
+            nsensors12
+            padding213
+            button_mask14
+            axis_mask15
+            name16
+            touchpads17
+            sensors18
+            userdata19
+            update20
+            setPlayerIndex21
+            rumble22
+            rumbleTriggers23
+            setLED24
+            sendEffect25
+            setSensorsEnabled26
+            cleanup27 ->
+              HasCField.writeRaw (BG.Proxy @"version") ptr0 version2
+                >> HasCField.writeRaw (BG.Proxy @"type'") ptr0 type'3
+                >> HasCField.writeRaw (BG.Proxy @"padding") ptr0 padding4
+                >> HasCField.writeRaw (BG.Proxy @"vendor_id") ptr0 vendor_id5
+                >> HasCField.writeRaw (BG.Proxy @"product_id") ptr0 product_id6
+                >> HasCField.writeRaw (BG.Proxy @"naxes") ptr0 naxes7
+                >> HasCField.writeRaw (BG.Proxy @"nbuttons") ptr0 nbuttons8
+                >> HasCField.writeRaw (BG.Proxy @"nballs") ptr0 nballs9
+                >> HasCField.writeRaw (BG.Proxy @"nhats") ptr0 nhats10
+                >> HasCField.writeRaw (BG.Proxy @"ntouchpads") ptr0 ntouchpads11
+                >> HasCField.writeRaw (BG.Proxy @"nsensors") ptr0 nsensors12
+                >> HasCField.writeRaw (BG.Proxy @"padding2") ptr0 padding213
+                >> HasCField.writeRaw (BG.Proxy @"button_mask") ptr0 button_mask14
+                >> HasCField.writeRaw (BG.Proxy @"axis_mask") ptr0 axis_mask15
+                >> HasCField.writeRaw (BG.Proxy @"name") ptr0 name16
+                >> HasCField.writeRaw (BG.Proxy @"touchpads") ptr0 touchpads17
+                >> HasCField.writeRaw (BG.Proxy @"sensors") ptr0 sensors18
+                >> HasCField.writeRaw (BG.Proxy @"userdata") ptr0 userdata19
+                >> HasCField.writeRaw (BG.Proxy @"update") ptr0 update20
+                >> HasCField.writeRaw (BG.Proxy @"setPlayerIndex") ptr0 setPlayerIndex21
+                >> HasCField.writeRaw (BG.Proxy @"rumble") ptr0 rumble22
+                >> HasCField.writeRaw (BG.Proxy @"rumbleTriggers") ptr0 rumbleTriggers23
+                >> HasCField.writeRaw (BG.Proxy @"setLED") ptr0 setLED24
+                >> HasCField.writeRaw (BG.Proxy @"sendEffect") ptr0 sendEffect25
+                >> HasCField.writeRaw (BG.Proxy @"setSensorsEnabled") ptr0 setSensorsEnabled26
+                >> HasCField.writeRaw (BG.Proxy @"cleanup") ptr0 cleanup27
+
+deriving via
+  Marshal.EquivStorable SDL_VirtualJoystickDesc
+  instance
+    BG.Storable SDL_VirtualJoystickDesc
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "version" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { version = y1
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"version" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "version" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"version")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "version" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "version" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "type'" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { type' = y1
+            , version = BG.getField @"version" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"type'" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "type'" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"type'")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "type'" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "type'" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "padding" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { padding = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"padding" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "padding" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "padding" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "padding" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 6
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "vendor_id" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { vendor_id = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"vendor_id" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "vendor_id" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"vendor_id")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "vendor_id" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "vendor_id" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "product_id" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { product_id = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"product_id" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "product_id" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"product_id")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "product_id" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "product_id" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 10
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "naxes" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { naxes = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"naxes" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "naxes" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"naxes")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "naxes" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "naxes" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "nbuttons" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { nbuttons = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"nbuttons" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "nbuttons" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"nbuttons")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "nbuttons" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "nbuttons" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 14
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "nballs" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { nballs = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"nballs" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "nballs" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"nballs")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "nballs" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "nballs" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "nhats" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { nhats = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"nhats" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "nhats" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"nhats")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "nhats" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "nhats" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 18
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "ntouchpads" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { ntouchpads = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"ntouchpads" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "ntouchpads" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"ntouchpads")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "ntouchpads" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "ntouchpads" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "nsensors" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { nsensors = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"nsensors" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "nsensors" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"nsensors")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "nsensors" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "nsensors" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 22
+
+instance
+  (ty ~ CA.ConstantArray 2 SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "padding2" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { padding2 = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"padding2" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 2 SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "padding2" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding2")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "padding2" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "padding2" =
+      CA.ConstantArray 2 SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "button_mask" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { button_mask = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"button_mask" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "button_mask" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"button_mask")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "button_mask" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "button_mask" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "axis_mask" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { axis_mask = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"axis_mask" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "axis_mask" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"axis_mask")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "axis_mask" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "axis_mask" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "name" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { name = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"name" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "name" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"name")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "name" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "name" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_VirtualJoystickTouchpadDesc)
+  => BG.CompatHasField.HasField "touchpads" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { touchpads = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"touchpads" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_VirtualJoystickTouchpadDesc)
+  => BG.HasField "touchpads" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"touchpads")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "touchpads" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "touchpads" =
+      PtrConst.PtrConst SDL_VirtualJoystickTouchpadDesc
+
+  offset# = \_ -> \_ -> 48
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_VirtualJoystickSensorDesc)
+  => BG.CompatHasField.HasField "sensors" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { sensors = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"sensors" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_VirtualJoystickSensorDesc)
+  => BG.HasField "sensors" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"sensors")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "sensors" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "sensors" =
+      PtrConst.PtrConst SDL_VirtualJoystickSensorDesc
+
+  offset# = \_ -> \_ -> 56
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "userdata" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { userdata = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"userdata" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "userdata" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"userdata")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "userdata" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "userdata" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 64
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO ()))
+  => BG.CompatHasField.HasField "update" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { update = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"update" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO ()))
+  => BG.HasField "update" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"update")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "update" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "update" =
+      BG.FunPtr (BG.Ptr BG.Void -> IO ())
+
+  offset# = \_ -> \_ -> 72
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> BG.CInt -> IO ()))
+  => BG.CompatHasField.HasField "setPlayerIndex" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { setPlayerIndex = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"setPlayerIndex" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> BG.CInt -> IO ()))
+  => BG.HasField "setPlayerIndex" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"setPlayerIndex")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "setPlayerIndex" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "setPlayerIndex" =
+      BG.FunPtr (BG.Ptr BG.Void -> BG.CInt -> IO ())
+
+  offset# = \_ -> \_ -> 80
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          (BG.Ptr BG.Void -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+  )
+  => BG.CompatHasField.HasField "rumble" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { rumble = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"rumble" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          (BG.Ptr BG.Void -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+  )
+  => BG.HasField "rumble" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"rumble")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "rumble" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "rumble" =
+      BG.FunPtr
+        (BG.Ptr BG.Void -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 88
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          (BG.Ptr BG.Void -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+  )
+  => BG.CompatHasField.HasField "rumbleTriggers" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { rumbleTriggers = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"rumbleTriggers" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          (BG.Ptr BG.Void -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+  )
+  => BG.HasField "rumbleTriggers" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"rumbleTriggers")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "rumbleTriggers" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "rumbleTriggers" =
+      BG.FunPtr
+        (BG.Ptr BG.Void -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> SDL3.Sys.Bindgen.Stdinc.Uint16 -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 96
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> SDL3.Sys.Bindgen.Stdinc.Uint8
+            -> SDL3.Sys.Bindgen.Stdinc.Uint8
+            -> SDL3.Sys.Bindgen.Stdinc.Uint8
+            -> IO BG.CBool
+          )
+  )
+  => BG.CompatHasField.HasField "setLED" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { setLED = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"setLED" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> SDL3.Sys.Bindgen.Stdinc.Uint8
+            -> SDL3.Sys.Bindgen.Stdinc.Uint8
+            -> SDL3.Sys.Bindgen.Stdinc.Uint8
+            -> IO BG.CBool
+          )
+  )
+  => BG.HasField "setLED" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"setLED")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "setLED" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "setLED" =
+      BG.FunPtr
+        ( BG.Ptr BG.Void
+          -> SDL3.Sys.Bindgen.Stdinc.Uint8
+          -> SDL3.Sys.Bindgen.Stdinc.Uint8
+          -> SDL3.Sys.Bindgen.Stdinc.Uint8
+          -> IO BG.CBool
+        )
+
+  offset# = \_ -> \_ -> 104
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO BG.CBool))
+  => BG.CompatHasField.HasField "sendEffect" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { sendEffect = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"sendEffect" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO BG.CBool))
+  => BG.HasField "sendEffect" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"sendEffect")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "sendEffect" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "sendEffect" =
+      BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 112
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> BG.CBool -> IO BG.CBool))
+  => BG.CompatHasField.HasField "setSensorsEnabled" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { setSensorsEnabled = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , cleanup = BG.getField @"cleanup" x0
+            }
+      , BG.getField @"setSensorsEnabled" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> BG.CBool -> IO BG.CBool))
+  => BG.HasField "setSensorsEnabled" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"setSensorsEnabled")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "setSensorsEnabled" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "setSensorsEnabled" =
+      BG.FunPtr (BG.Ptr BG.Void -> BG.CBool -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 120
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO ()))
+  => BG.CompatHasField.HasField "cleanup" SDL_VirtualJoystickDesc ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_VirtualJoystickDesc
+            { cleanup = y1
+            , version = BG.getField @"version" x0
+            , type' = BG.getField @"type'" x0
+            , padding = BG.getField @"padding" x0
+            , vendor_id = BG.getField @"vendor_id" x0
+            , product_id = BG.getField @"product_id" x0
+            , naxes = BG.getField @"naxes" x0
+            , nbuttons = BG.getField @"nbuttons" x0
+            , nballs = BG.getField @"nballs" x0
+            , nhats = BG.getField @"nhats" x0
+            , ntouchpads = BG.getField @"ntouchpads" x0
+            , nsensors = BG.getField @"nsensors" x0
+            , padding2 = BG.getField @"padding2" x0
+            , button_mask = BG.getField @"button_mask" x0
+            , axis_mask = BG.getField @"axis_mask" x0
+            , name = BG.getField @"name" x0
+            , touchpads = BG.getField @"touchpads" x0
+            , sensors = BG.getField @"sensors" x0
+            , userdata = BG.getField @"userdata" x0
+            , update = BG.getField @"update" x0
+            , setPlayerIndex = BG.getField @"setPlayerIndex" x0
+            , rumble = BG.getField @"rumble" x0
+            , rumbleTriggers = BG.getField @"rumbleTriggers" x0
+            , setLED = BG.getField @"setLED" x0
+            , sendEffect = BG.getField @"sendEffect" x0
+            , setSensorsEnabled = BG.getField @"setSensorsEnabled" x0
+            }
+      , BG.getField @"cleanup" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO ()))
+  => BG.HasField "cleanup" (BG.Ptr SDL_VirtualJoystickDesc) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"cleanup")
+
+instance HasCField.HasCField SDL_VirtualJoystickDesc "cleanup" where
+  type
+    CFieldType SDL_VirtualJoystickDesc "cleanup" =
+      BG.FunPtr (BG.Ptr BG.Void -> IO ())
+
+  offset# = \_ -> \_ -> 128
+
+-- | [C declaration]: @macro SDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN@, literal @\"SDL.joystick.cap.mono_led\"@, defined at @SDL3\/SDL_joystick.h 772:9@
+sDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN :: BG.ByteString
+sDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x6A
+    , 0x6F
+    , 0x79
+    , 0x73
+    , 0x74
+    , 0x69
+    , 0x63
+    , 0x6B
+    , 0x2E
+    , 0x63
+    , 0x61
+    , 0x70
+    , 0x2E
+    , 0x6D
+    , 0x6F
+    , 0x6E
+    , 0x6F
+    , 0x5F
+    , 0x6C
+    , 0x65
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN@, literal @\"SDL.joystick.cap.rgb_led\"@, defined at @SDL3\/SDL_joystick.h 773:9@
+sDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN :: BG.ByteString
+sDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x6A
+    , 0x6F
+    , 0x79
+    , 0x73
+    , 0x74
+    , 0x69
+    , 0x63
+    , 0x6B
+    , 0x2E
+    , 0x63
+    , 0x61
+    , 0x70
+    , 0x2E
+    , 0x72
+    , 0x67
+    , 0x62
+    , 0x5F
+    , 0x6C
+    , 0x65
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN@, literal @\"SDL.joystick.cap.player_led\"@, defined at @SDL3\/SDL_joystick.h 774:9@
+sDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN :: BG.ByteString
+sDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x6A
+    , 0x6F
+    , 0x79
+    , 0x73
+    , 0x74
+    , 0x69
+    , 0x63
+    , 0x6B
+    , 0x2E
+    , 0x63
+    , 0x61
+    , 0x70
+    , 0x2E
+    , 0x70
+    , 0x6C
+    , 0x61
+    , 0x79
+    , 0x65
+    , 0x72
+    , 0x5F
+    , 0x6C
+    , 0x65
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN@, literal @\"SDL.joystick.cap.rumble\"@, defined at @SDL3\/SDL_joystick.h 775:9@
+sDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN :: BG.ByteString
+sDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x6A
+    , 0x6F
+    , 0x79
+    , 0x73
+    , 0x74
+    , 0x69
+    , 0x63
+    , 0x6B
+    , 0x2E
+    , 0x63
+    , 0x61
+    , 0x70
+    , 0x2E
+    , 0x72
+    , 0x75
+    , 0x6D
+    , 0x62
+    , 0x6C
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN@, literal @\"SDL.joystick.cap.trigger_rumble\"@, defined at @SDL3\/SDL_joystick.h 776:9@
+sDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN :: BG.ByteString
+sDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x6A
+    , 0x6F
+    , 0x79
+    , 0x73
+    , 0x74
+    , 0x69
+    , 0x63
+    , 0x6B
+    , 0x2E
+    , 0x63
+    , 0x61
+    , 0x70
+    , 0x2E
+    , 0x74
+    , 0x72
+    , 0x69
+    , 0x67
+    , 0x67
+    , 0x65
+    , 0x72
+    , 0x5F
+    , 0x72
+    , 0x75
+    , 0x6D
+    , 0x62
+    , 0x6C
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_HAT_CENTERED@, defined at @SDL3\/SDL_joystick.h 1212:9@
+sDL_HAT_CENTERED :: BG.CUInt
+sDL_HAT_CENTERED = (0 :: BG.CUInt)
+
+-- | [C declaration]: @macro SDL_HAT_UP@, defined at @SDL3\/SDL_joystick.h 1213:9@
+sDL_HAT_UP :: BG.CUInt
+sDL_HAT_UP = (1 :: BG.CUInt)
+
+-- | [C declaration]: @macro SDL_HAT_RIGHT@, defined at @SDL3\/SDL_joystick.h 1214:9@
+sDL_HAT_RIGHT :: BG.CUInt
+sDL_HAT_RIGHT = (2 :: BG.CUInt)
+
+-- | [C declaration]: @macro SDL_HAT_DOWN@, defined at @SDL3\/SDL_joystick.h 1215:9@
+sDL_HAT_DOWN :: BG.CUInt
+sDL_HAT_DOWN = (4 :: BG.CUInt)
+
+-- | [C declaration]: @macro SDL_HAT_LEFT@, defined at @SDL3\/SDL_joystick.h 1216:9@
+sDL_HAT_LEFT :: BG.CUInt
+sDL_HAT_LEFT = (8 :: BG.CUInt)
+
+-- | [C declaration]: @macro SDL_HAT_RIGHTUP@, defined at @SDL3\/SDL_joystick.h 1217:9@
+sDL_HAT_RIGHTUP :: BG.CUInt
+sDL_HAT_RIGHTUP =
+  (C.Expr.HostPlatform..|.) sDL_HAT_RIGHT sDL_HAT_UP
+
+-- | [C declaration]: @macro SDL_HAT_RIGHTDOWN@, defined at @SDL3\/SDL_joystick.h 1218:9@
+sDL_HAT_RIGHTDOWN :: BG.CUInt
+sDL_HAT_RIGHTDOWN =
+  (C.Expr.HostPlatform..|.) sDL_HAT_RIGHT sDL_HAT_DOWN
+
+-- | [C declaration]: @macro SDL_HAT_LEFTUP@, defined at @SDL3\/SDL_joystick.h 1219:9@
+sDL_HAT_LEFTUP :: BG.CUInt
+sDL_HAT_LEFTUP =
+  (C.Expr.HostPlatform..|.) sDL_HAT_LEFT sDL_HAT_UP
+
+-- | [C declaration]: @macro SDL_HAT_LEFTDOWN@, defined at @SDL3\/SDL_joystick.h 1220:9@
+sDL_HAT_LEFTDOWN :: BG.CUInt
+sDL_HAT_LEFTDOWN =
+  (C.Expr.HostPlatform..|.) sDL_HAT_LEFT sDL_HAT_DOWN
diff --git a/src/SDL3/Sys/Bindgen/Joystick/FunPtr.hs b/src/SDL3/Sys/Bindgen/Joystick/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Joystick/FunPtr.hs
@@ -0,0 +1,2560 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Joystick.FunPtr (
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_LockJoysticks,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_UnlockJoysticks,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_HasJoystick,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoysticks,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickNameForID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickPathForID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickPlayerIndexForID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickGUIDForID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickVendorForID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickProductForID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickProductVersionForID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickTypeForID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_OpenJoystick,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickFromID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickFromPlayerIndex,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_AttachVirtualJoystick,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_DetachVirtualJoystick,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_IsJoystickVirtual,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_SetJoystickVirtualAxis,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_SetJoystickVirtualBall,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_SetJoystickVirtualButton,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_SetJoystickVirtualHat,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_SetJoystickVirtualTouchpad,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_SendJoystickVirtualSensorData,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickProperties,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickName,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickPath,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickPlayerIndex,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_SetJoystickPlayerIndex,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickGUID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickVendor,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickProduct,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickProductVersion,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickFirmwareVersion,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickSerial,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickType,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickGUIDInfo,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_JoystickConnected,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickID,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetNumJoystickAxes,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetNumJoystickBalls,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetNumJoystickHats,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetNumJoystickButtons,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_SetJoystickEventsEnabled,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_JoystickEventsEnabled,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_UpdateJoysticks,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickAxis,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickAxisInitialState,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickBall,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickHat,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickButton,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_RumbleJoystick,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_RumbleJoystickTriggers,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_SetJoystickLED,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_SendJoystickEffect,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_CloseJoystick,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickConnectionState,
+  SDL3.Sys.Bindgen.Joystick.FunPtr.sDL_GetJoystickPowerInfo,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Guid qualified
+import SDL3.Sys.Bindgen.Joystick
+import SDL3.Sys.Bindgen.Power qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_joystick.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_LockJoysticks */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_114e63986aa83034 (void)) (void)"
+         , "{"
+         , "  return &SDL_LockJoysticks;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_UnlockJoysticks */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_08af331be04bcfc6 (void)) (void)"
+         , "{"
+         , "  return &SDL_UnlockJoysticks;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_HasJoystick */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_43b30c46c7a64c3f (void)) (void)"
+         , "{"
+         , "  return &SDL_HasJoystick;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoysticks */"
+         , "__attribute__ ((const))"
+         , "SDL_JoystickID *(*hs_bindgen_8980d2e00276c32b (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoysticks;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickNameForID */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_609608d63d9b62ea (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickNameForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPathForID */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_5ac5dcd7fcf6852e (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickPathForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPlayerIndexForID */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_cba85122d2af347d (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickPlayerIndexForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickGUIDForID */"
+         , "__attribute__ ((const))"
+         , "SDL_GUID (*hs_bindgen_449e28b8e0e67e88 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickGUIDForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickVendorForID */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_44ce4b8a7fdf6cbf (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickVendorForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProductForID */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_820a9291485cee97 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickProductForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProductVersionForID */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_3a0e1d9bde47f0ff (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickProductVersionForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickTypeForID */"
+         , "__attribute__ ((const))"
+         , "SDL_JoystickType (*hs_bindgen_a20dfde681f6caa0 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickTypeForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_OpenJoystick */"
+         , "__attribute__ ((const))"
+         , "SDL_Joystick *(*hs_bindgen_c7b5fbf5268defc4 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenJoystick;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickFromID */"
+         , "__attribute__ ((const))"
+         , "SDL_Joystick *(*hs_bindgen_e1dd196b7b6820f0 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickFromID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickFromPlayerIndex */"
+         , "__attribute__ ((const))"
+         , "SDL_Joystick *(*hs_bindgen_557bcf514d2319d8 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickFromPlayerIndex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_AttachVirtualJoystick */"
+         , "__attribute__ ((const))"
+         , "SDL_JoystickID (*hs_bindgen_1ad626510c8533e6 (void)) ("
+         , "  SDL_VirtualJoystickDesc const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_AttachVirtualJoystick;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_DetachVirtualJoystick */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_cce198ac8f90dd3d (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DetachVirtualJoystick;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_IsJoystickVirtual */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f63774bb7235f389 (void)) ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_IsJoystickVirtual;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualAxis */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_25ad7457e11fdfc6 (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Sint16 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetJoystickVirtualAxis;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualBall */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_883279d52c622be7 (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Sint16 arg3,"
+         , "  Sint16 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetJoystickVirtualBall;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualButton */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c874e2ca8a04d63f (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetJoystickVirtualButton;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualHat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c1356b5e756048fc (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Uint8 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetJoystickVirtualHat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualTouchpad */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_170b87771a92a148 (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  _Bool arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7"
+         , ")"
+         , "{"
+         , "  return &SDL_SetJoystickVirtualTouchpad;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SendJoystickVirtualSensorData */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_5c51fdc7918227aa (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  SDL_SensorType arg2,"
+         , "  Uint64 arg3,"
+         , "  float const *arg4,"
+         , "  signed int arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_SendJoystickVirtualSensorData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_9c72e51496d953ec (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_6d93bd8000de4d74 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPath */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_2e7828c53ff173b7 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickPath;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPlayerIndex */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_63f024097bd9c12b (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickPlayerIndex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickPlayerIndex */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_258294b3081be5f1 (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetJoystickPlayerIndex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickGUID */"
+         , "__attribute__ ((const))"
+         , "SDL_GUID (*hs_bindgen_aea836abf82f48b9 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickGUID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickVendor */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_9cd3279f0e0ca747 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickVendor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProduct */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_22acb36edfbd0e8c (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickProduct;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProductVersion */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_0bae3c3de11e8bcd (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickProductVersion;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickFirmwareVersion */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_38f91890f6c8dd34 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickFirmwareVersion;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickSerial */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_a8489b391d128726 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickSerial;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickType */"
+         , "__attribute__ ((const))"
+         , "SDL_JoystickType (*hs_bindgen_27fa723927645a5b (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickType;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickGUIDInfo */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_43f734d8766d207f (void)) ("
+         , "  SDL_GUID arg1,"
+         , "  Uint16 *arg2,"
+         , "  Uint16 *arg3,"
+         , "  Uint16 *arg4,"
+         , "  Uint16 *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickGUIDInfo;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_JoystickConnected */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_34fe2e0cf303a75f (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_JoystickConnected;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickID */"
+         , "__attribute__ ((const))"
+         , "SDL_JoystickID (*hs_bindgen_db36c45c44877744 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickAxes */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_c743dc688bb6eabd (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetNumJoystickAxes;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickBalls */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_948af313b23a1c65 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetNumJoystickBalls;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickHats */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_2bfa757cb6822a72 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetNumJoystickHats;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickButtons */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_a91d035d49fdc8d2 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetNumJoystickButtons;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickEventsEnabled */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_33fbade22db04a59 (void)) ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SetJoystickEventsEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_JoystickEventsEnabled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ddd93029215cfd37 (void)) (void)"
+         , "{"
+         , "  return &SDL_JoystickEventsEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_UpdateJoysticks */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_fab2d264eddcaffa (void)) (void)"
+         , "{"
+         , "  return &SDL_UpdateJoysticks;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickAxis */"
+         , "__attribute__ ((const))"
+         , "Sint16 (*hs_bindgen_f60a6cb5f1d09a81 (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickAxis;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickAxisInitialState */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c09eb5cfd016adfb (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Sint16 *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickAxisInitialState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickBall */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ea4bd75fcfd7173a (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  signed int *arg3,"
+         , "  signed int *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickBall;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickHat */"
+         , "__attribute__ ((const))"
+         , "Uint8 (*hs_bindgen_79462e0207a041dd (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickHat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickButton */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8db4e8a6fc998c72 (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickButton;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_RumbleJoystick */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_01a69fecc103bd0a (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_RumbleJoystick;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_RumbleJoystickTriggers */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9190634ce5c1726f (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_RumbleJoystickTriggers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickLED */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a99b95fd254e2484 (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetJoystickLED;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SendJoystickEffect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2552aba22a4e5237 (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SendJoystickEffect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_CloseJoystick */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_85ce86bc3120d0c6 (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CloseJoystick;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickConnectionState */"
+         , "__attribute__ ((const))"
+         , "SDL_JoystickConnectionState (*hs_bindgen_47061e113b50ffdc (void)) ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickConnectionState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPowerInfo */"
+         , "__attribute__ ((const))"
+         , "SDL_PowerState (*hs_bindgen_cf314c27d59c09a1 (void)) ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetJoystickPowerInfo;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_LockJoysticks@
+foreign import ccall unsafe "hs_bindgen_114e63986aa83034"
+  hs_bindgen_114e63986aa83034_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_LockJoysticks@
+hs_bindgen_114e63986aa83034 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_114e63986aa83034 =
+  BG.fromFFIType hs_bindgen_114e63986aa83034_base
+
+{-# NOINLINE sDL_LockJoysticks #-}
+
+-- | Locking for atomic access to the joystick API.
+--
+--     The SDL joystick functions are thread-safe, however you can lock the joysticks while processing to guarantee that the joystick list won\'t change and joystick and gamepad events will not be delivered.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_LockJoysticks@, defined at @SDL3\/SDL_joystick.h 189:34@
+sDL_LockJoysticks :: BG.FunPtr (IO ())
+sDL_LockJoysticks =
+  BG.unsafePerformIO hs_bindgen_114e63986aa83034
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_UnlockJoysticks@
+foreign import ccall unsafe "hs_bindgen_08af331be04bcfc6"
+  hs_bindgen_08af331be04bcfc6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_UnlockJoysticks@
+hs_bindgen_08af331be04bcfc6 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_08af331be04bcfc6 =
+  BG.fromFFIType hs_bindgen_08af331be04bcfc6_base
+
+{-# NOINLINE sDL_UnlockJoysticks #-}
+
+-- | Unlocking for atomic access to the joystick API.
+--
+--     [Thread safety]: This should be called from the same thread that called @SDL_LockJoysticks()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UnlockJoysticks@, defined at @SDL3\/SDL_joystick.h 199:34@
+sDL_UnlockJoysticks :: BG.FunPtr (IO ())
+sDL_UnlockJoysticks =
+  BG.unsafePerformIO hs_bindgen_08af331be04bcfc6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_HasJoystick@
+foreign import ccall unsafe "hs_bindgen_43b30c46c7a64c3f"
+  hs_bindgen_43b30c46c7a64c3f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_HasJoystick@
+hs_bindgen_43b30c46c7a64c3f :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_43b30c46c7a64c3f =
+  BG.fromFFIType hs_bindgen_43b30c46c7a64c3f_base
+
+{-# NOINLINE sDL_HasJoystick #-}
+
+-- | Return whether a joystick is currently connected.
+--
+--     [Returns]: true if a joystick is connected, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_HasJoystick@, defined at @SDL3\/SDL_joystick.h 212:34@
+sDL_HasJoystick :: BG.FunPtr (IO BG.CBool)
+sDL_HasJoystick =
+  BG.unsafePerformIO hs_bindgen_43b30c46c7a64c3f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoysticks@
+foreign import ccall unsafe "hs_bindgen_8980d2e00276c32b"
+  hs_bindgen_8980d2e00276c32b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoysticks@
+hs_bindgen_8980d2e00276c32b :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_JoystickID)))
+hs_bindgen_8980d2e00276c32b =
+  BG.fromFFIType hs_bindgen_8980d2e00276c32b_base
+
+{-# NOINLINE sDL_GetJoysticks #-}
+
+-- | Get a list of currently connected joysticks.
+--
+--     [@count@]: a pointer filled in with the number of joysticks returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of joystick instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasJoystick', 'sDL_OpenJoystick'
+--
+--     [C declaration]: @SDL_GetJoysticks@, defined at @SDL3\/SDL_joystick.h 230:46@
+sDL_GetJoysticks :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_JoystickID))
+sDL_GetJoysticks =
+  BG.unsafePerformIO hs_bindgen_8980d2e00276c32b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickNameForID@
+foreign import ccall unsafe "hs_bindgen_609608d63d9b62ea"
+  hs_bindgen_609608d63d9b62ea_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickNameForID@
+hs_bindgen_609608d63d9b62ea :: IO (BG.FunPtr (SDL_JoystickID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_609608d63d9b62ea =
+  BG.fromFFIType hs_bindgen_609608d63d9b62ea_base
+
+{-# NOINLINE sDL_GetJoystickNameForID #-}
+
+-- | Get the implementation dependent name of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the name of the selected joystick. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickName', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickNameForID@, defined at @SDL3\/SDL_joystick.h 248:42@
+sDL_GetJoystickNameForID :: BG.FunPtr (SDL_JoystickID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetJoystickNameForID =
+  BG.unsafePerformIO hs_bindgen_609608d63d9b62ea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPathForID@
+foreign import ccall unsafe "hs_bindgen_5ac5dcd7fcf6852e"
+  hs_bindgen_5ac5dcd7fcf6852e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPathForID@
+hs_bindgen_5ac5dcd7fcf6852e :: IO (BG.FunPtr (SDL_JoystickID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_5ac5dcd7fcf6852e =
+  BG.fromFFIType hs_bindgen_5ac5dcd7fcf6852e_base
+
+{-# NOINLINE sDL_GetJoystickPathForID #-}
+
+-- | Get the implementation dependent path of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the path of the selected joystick. If no path can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPath', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickPathForID@, defined at @SDL3\/SDL_joystick.h 266:42@
+sDL_GetJoystickPathForID :: BG.FunPtr (SDL_JoystickID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetJoystickPathForID =
+  BG.unsafePerformIO hs_bindgen_5ac5dcd7fcf6852e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPlayerIndexForID@
+foreign import ccall unsafe "hs_bindgen_cba85122d2af347d"
+  hs_bindgen_cba85122d2af347d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPlayerIndexForID@
+hs_bindgen_cba85122d2af347d :: IO (BG.FunPtr (SDL_JoystickID -> IO BG.CInt))
+hs_bindgen_cba85122d2af347d =
+  BG.fromFFIType hs_bindgen_cba85122d2af347d_base
+
+{-# NOINLINE sDL_GetJoystickPlayerIndexForID #-}
+
+-- | Get the player index of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the player index of a joystick, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPlayerIndex', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickPlayerIndexForID@, defined at @SDL3\/SDL_joystick.h 283:33@
+sDL_GetJoystickPlayerIndexForID :: BG.FunPtr (SDL_JoystickID -> IO BG.CInt)
+sDL_GetJoystickPlayerIndexForID =
+  BG.unsafePerformIO hs_bindgen_cba85122d2af347d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickGUIDForID@
+foreign import ccall unsafe "hs_bindgen_449e28b8e0e67e88"
+  hs_bindgen_449e28b8e0e67e88_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickGUIDForID@
+hs_bindgen_449e28b8e0e67e88 :: IO (BG.FunPtr (SDL_JoystickID -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID))
+hs_bindgen_449e28b8e0e67e88 =
+  BG.fromFFIType hs_bindgen_449e28b8e0e67e88_base
+
+{-# NOINLINE sDL_GetJoystickGUIDForID #-}
+
+-- | Get the implementation-dependent GUID of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the GUID of the selected joystick. If called with an invalid instance_id, this function returns a zero GUID.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickGUID', SDL_GUIDToString
+--
+--     [C declaration]: @SDL_GetJoystickGUIDForID@, defined at @SDL3\/SDL_joystick.h 301:38@
+sDL_GetJoystickGUIDForID :: BG.FunPtr (SDL_JoystickID -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID)
+sDL_GetJoystickGUIDForID =
+  BG.unsafePerformIO hs_bindgen_449e28b8e0e67e88
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickVendorForID@
+foreign import ccall unsafe "hs_bindgen_44ce4b8a7fdf6cbf"
+  hs_bindgen_44ce4b8a7fdf6cbf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickVendorForID@
+hs_bindgen_44ce4b8a7fdf6cbf :: IO (BG.FunPtr (SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_44ce4b8a7fdf6cbf =
+  BG.fromFFIType hs_bindgen_44ce4b8a7fdf6cbf_base
+
+{-# NOINLINE sDL_GetJoystickVendorForID #-}
+
+-- | Get the USB vendor ID of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the vendor ID isn\'t available this function returns 0.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the USB vendor ID of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickVendor', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickVendorForID@, defined at @SDL3\/SDL_joystick.h 320:36@
+sDL_GetJoystickVendorForID :: BG.FunPtr (SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetJoystickVendorForID =
+  BG.unsafePerformIO hs_bindgen_44ce4b8a7fdf6cbf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProductForID@
+foreign import ccall unsafe "hs_bindgen_820a9291485cee97"
+  hs_bindgen_820a9291485cee97_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProductForID@
+hs_bindgen_820a9291485cee97 :: IO (BG.FunPtr (SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_820a9291485cee97 =
+  BG.fromFFIType hs_bindgen_820a9291485cee97_base
+
+{-# NOINLINE sDL_GetJoystickProductForID #-}
+
+-- | Get the USB product ID of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the product ID isn\'t available this function returns 0.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the USB product ID of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProduct', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickProductForID@, defined at @SDL3\/SDL_joystick.h 339:36@
+sDL_GetJoystickProductForID :: BG.FunPtr (SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetJoystickProductForID =
+  BG.unsafePerformIO hs_bindgen_820a9291485cee97
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProductVersionForID@
+foreign import ccall unsafe "hs_bindgen_3a0e1d9bde47f0ff"
+  hs_bindgen_3a0e1d9bde47f0ff_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProductVersionForID@
+hs_bindgen_3a0e1d9bde47f0ff :: IO (BG.FunPtr (SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_3a0e1d9bde47f0ff =
+  BG.fromFFIType hs_bindgen_3a0e1d9bde47f0ff_base
+
+{-# NOINLINE sDL_GetJoystickProductVersionForID #-}
+
+-- | Get the product version of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the product version isn\'t available this function returns 0.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the product version of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProductVersion', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickProductVersionForID@, defined at @SDL3\/SDL_joystick.h 358:36@
+sDL_GetJoystickProductVersionForID
+  :: BG.FunPtr (SDL_JoystickID -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetJoystickProductVersionForID =
+  BG.unsafePerformIO hs_bindgen_3a0e1d9bde47f0ff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickTypeForID@
+foreign import ccall unsafe "hs_bindgen_a20dfde681f6caa0"
+  hs_bindgen_a20dfde681f6caa0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickTypeForID@
+hs_bindgen_a20dfde681f6caa0 :: IO (BG.FunPtr (SDL_JoystickID -> IO SDL_JoystickType))
+hs_bindgen_a20dfde681f6caa0 =
+  BG.fromFFIType hs_bindgen_a20dfde681f6caa0_base
+
+{-# NOINLINE sDL_GetJoystickTypeForID #-}
+
+-- | Get the type of a joystick, if available.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: the 'SDL_JoystickType' of the selected joystick. If called with an invalid instance_id, this function returns @SDL_JOYSTICK_TYPE_UNKNOWN@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickType', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickTypeForID@, defined at @SDL3\/SDL_joystick.h 377:46@
+sDL_GetJoystickTypeForID :: BG.FunPtr (SDL_JoystickID -> IO SDL_JoystickType)
+sDL_GetJoystickTypeForID =
+  BG.unsafePerformIO hs_bindgen_a20dfde681f6caa0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_OpenJoystick@
+foreign import ccall unsafe "hs_bindgen_c7b5fbf5268defc4"
+  hs_bindgen_c7b5fbf5268defc4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_OpenJoystick@
+hs_bindgen_c7b5fbf5268defc4 :: IO (BG.FunPtr (SDL_JoystickID -> IO (BG.Ptr SDL_Joystick)))
+hs_bindgen_c7b5fbf5268defc4 =
+  BG.fromFFIType hs_bindgen_c7b5fbf5268defc4_base
+
+{-# NOINLINE sDL_OpenJoystick #-}
+
+-- | Open a joystick for use.
+--
+--     The joystick subsystem must be initialized before a joystick can be opened for use.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: a joystick identifier or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseJoystick'
+--
+--     [C declaration]: @SDL_OpenJoystick@, defined at @SDL3\/SDL_joystick.h 395:44@
+sDL_OpenJoystick :: BG.FunPtr (SDL_JoystickID -> IO (BG.Ptr SDL_Joystick))
+sDL_OpenJoystick =
+  BG.unsafePerformIO hs_bindgen_c7b5fbf5268defc4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickFromID@
+foreign import ccall unsafe "hs_bindgen_e1dd196b7b6820f0"
+  hs_bindgen_e1dd196b7b6820f0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickFromID@
+hs_bindgen_e1dd196b7b6820f0 :: IO (BG.FunPtr (SDL_JoystickID -> IO (BG.Ptr SDL_Joystick)))
+hs_bindgen_e1dd196b7b6820f0 =
+  BG.fromFFIType hs_bindgen_e1dd196b7b6820f0_base
+
+{-# NOINLINE sDL_GetJoystickFromID #-}
+
+-- | Get the 'SDL_Joystick' associated with an instance ID, if it has been opened.
+--
+--     [@instance_id@]: the instance ID to get the 'SDL_Joystick' for.
+--
+--     [Returns]: an 'SDL_Joystick' on success or NULL on failure or if it hasn\'t been opened yet; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickFromID@, defined at @SDL3\/SDL_joystick.h 408:44@
+sDL_GetJoystickFromID :: BG.FunPtr (SDL_JoystickID -> IO (BG.Ptr SDL_Joystick))
+sDL_GetJoystickFromID =
+  BG.unsafePerformIO hs_bindgen_e1dd196b7b6820f0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickFromPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_557bcf514d2319d8"
+  hs_bindgen_557bcf514d2319d8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickFromPlayerIndex@
+hs_bindgen_557bcf514d2319d8 :: IO (BG.FunPtr (BG.CInt -> IO (BG.Ptr SDL_Joystick)))
+hs_bindgen_557bcf514d2319d8 =
+  BG.fromFFIType hs_bindgen_557bcf514d2319d8_base
+
+{-# NOINLINE sDL_GetJoystickFromPlayerIndex #-}
+
+-- | Get the 'SDL_Joystick' associated with a player index.
+--
+--     [@player_index@]: the player index to get the 'SDL_Joystick' for.
+--
+--     [Returns]: an 'SDL_Joystick' on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPlayerIndex', 'sDL_SetJoystickPlayerIndex'
+--
+--     [C declaration]: @SDL_GetJoystickFromPlayerIndex@, defined at @SDL3\/SDL_joystick.h 424:44@
+sDL_GetJoystickFromPlayerIndex :: BG.FunPtr (BG.CInt -> IO (BG.Ptr SDL_Joystick))
+sDL_GetJoystickFromPlayerIndex =
+  BG.unsafePerformIO hs_bindgen_557bcf514d2319d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_AttachVirtualJoystick@
+foreign import ccall unsafe "hs_bindgen_1ad626510c8533e6"
+  hs_bindgen_1ad626510c8533e6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_AttachVirtualJoystick@
+hs_bindgen_1ad626510c8533e6
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_VirtualJoystickDesc -> IO SDL_JoystickID))
+hs_bindgen_1ad626510c8533e6 =
+  BG.fromFFIType hs_bindgen_1ad626510c8533e6_base
+
+{-# NOINLINE sDL_AttachVirtualJoystick #-}
+
+-- | Attach a new virtual joystick.
+--
+--     Apps can create virtual joysticks, that exist without hardware directly backing them, and have program-supplied inputs. Once attached, a virtual joystick looks like any other joystick that SDL can access. These can be used to make other things look like joysticks, or provide pre-recorded input, etc.
+--
+--     Once attached, the app can send joystick inputs to the new virtual joystick using @SDL_SetJoystickVirtualAxis()@, etc.
+--
+--     When no longer needed, the virtual joystick can be removed by calling @SDL_DetachVirtualJoystick()@.
+--
+--     [@desc@]: joystick description, initialized using SDL_INIT_INTERFACE().
+--
+--     [Returns]: the joystick instance ID, or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DetachVirtualJoystick', 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_AttachVirtualJoystick@, defined at @SDL3\/SDL_joystick.h 539:44@
+sDL_AttachVirtualJoystick
+  :: BG.FunPtr (PtrConst.PtrConst SDL_VirtualJoystickDesc -> IO SDL_JoystickID)
+sDL_AttachVirtualJoystick =
+  BG.unsafePerformIO hs_bindgen_1ad626510c8533e6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_DetachVirtualJoystick@
+foreign import ccall unsafe "hs_bindgen_cce198ac8f90dd3d"
+  hs_bindgen_cce198ac8f90dd3d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_DetachVirtualJoystick@
+hs_bindgen_cce198ac8f90dd3d :: IO (BG.FunPtr (SDL_JoystickID -> IO BG.CBool))
+hs_bindgen_cce198ac8f90dd3d =
+  BG.fromFFIType hs_bindgen_cce198ac8f90dd3d_base
+
+{-# NOINLINE sDL_DetachVirtualJoystick #-}
+
+-- | Detach a virtual joystick.
+--
+--     [@instance_id@]: the joystick instance ID, previously returned from @SDL_AttachVirtualJoystick()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AttachVirtualJoystick'
+--
+--     [C declaration]: @SDL_DetachVirtualJoystick@, defined at @SDL3\/SDL_joystick.h 555:34@
+sDL_DetachVirtualJoystick :: BG.FunPtr (SDL_JoystickID -> IO BG.CBool)
+sDL_DetachVirtualJoystick =
+  BG.unsafePerformIO hs_bindgen_cce198ac8f90dd3d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_IsJoystickVirtual@
+foreign import ccall unsafe "hs_bindgen_f63774bb7235f389"
+  hs_bindgen_f63774bb7235f389_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_IsJoystickVirtual@
+hs_bindgen_f63774bb7235f389 :: IO (BG.FunPtr (SDL_JoystickID -> IO BG.CBool))
+hs_bindgen_f63774bb7235f389 =
+  BG.fromFFIType hs_bindgen_f63774bb7235f389_base
+
+{-# NOINLINE sDL_IsJoystickVirtual #-}
+
+-- | Query whether or not a joystick is virtual.
+--
+--     [@instance_id@]: the joystick instance ID.
+--
+--     [Returns]: true if the joystick is virtual, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsJoystickVirtual@, defined at @SDL3\/SDL_joystick.h 567:34@
+sDL_IsJoystickVirtual :: BG.FunPtr (SDL_JoystickID -> IO BG.CBool)
+sDL_IsJoystickVirtual =
+  BG.unsafePerformIO hs_bindgen_f63774bb7235f389
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualAxis@
+foreign import ccall unsafe "hs_bindgen_25ad7457e11fdfc6"
+  hs_bindgen_25ad7457e11fdfc6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualAxis@
+hs_bindgen_25ad7457e11fdfc6
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool))
+hs_bindgen_25ad7457e11fdfc6 =
+  BG.fromFFIType hs_bindgen_25ad7457e11fdfc6_base
+
+{-# NOINLINE sDL_SetJoystickVirtualAxis #-}
+
+-- | Set the state of an axis on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     Note that when sending trigger axes, you should scale the value to the full range of Sint16. For example, a trigger at rest would have the value of @'sDL_JOYSTICK_AXIS_MIN'@.
+--
+--     [@joystick@]: the virtual joystick on which to set state.
+--
+--     [@axis@]: the index of the axis on the virtual joystick to update.
+--
+--     [@value@]: the new value for the specified axis.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualAxis@, defined at @SDL3\/SDL_joystick.h 598:34@
+sDL_SetJoystickVirtualAxis
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool)
+sDL_SetJoystickVirtualAxis =
+  BG.unsafePerformIO hs_bindgen_25ad7457e11fdfc6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualBall@
+foreign import ccall unsafe "hs_bindgen_883279d52c622be7"
+  hs_bindgen_883279d52c622be7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualBall@
+hs_bindgen_883279d52c622be7
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Joystick
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Stdinc.Sint16
+             -> SDL3.Sys.Bindgen.Stdinc.Sint16
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_883279d52c622be7 =
+  BG.fromFFIType hs_bindgen_883279d52c622be7_base
+
+{-# NOINLINE sDL_SetJoystickVirtualBall #-}
+
+-- | Generate ball motion on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [@joystick@]: the virtual joystick on which to set state.
+--
+--     [@ball@]: the index of the ball on the virtual joystick to update.
+--
+--     [@xrel@]: the relative motion on the X axis.
+--
+--     [@yrel@]: the relative motion on the Y axis.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualBall@, defined at @SDL3\/SDL_joystick.h 626:34@
+sDL_SetJoystickVirtualBall
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Joystick
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Stdinc.Sint16
+         -> SDL3.Sys.Bindgen.Stdinc.Sint16
+         -> IO BG.CBool
+       )
+sDL_SetJoystickVirtualBall =
+  BG.unsafePerformIO hs_bindgen_883279d52c622be7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualButton@
+foreign import ccall unsafe "hs_bindgen_c874e2ca8a04d63f"
+  hs_bindgen_c874e2ca8a04d63f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualButton@
+hs_bindgen_c874e2ca8a04d63f
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> BG.CBool -> IO BG.CBool))
+hs_bindgen_c874e2ca8a04d63f =
+  BG.fromFFIType hs_bindgen_c874e2ca8a04d63f_base
+
+{-# NOINLINE sDL_SetJoystickVirtualButton #-}
+
+-- | Set the state of a button on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [@joystick@]: the virtual joystick on which to set state.
+--
+--     [@button@]: the index of the button on the virtual joystick to update.
+--
+--     [@down@]: true if the button is pressed, false otherwise.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualButton@, defined at @SDL3\/SDL_joystick.h 653:34@
+sDL_SetJoystickVirtualButton
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> BG.CBool -> IO BG.CBool)
+sDL_SetJoystickVirtualButton =
+  BG.unsafePerformIO hs_bindgen_c874e2ca8a04d63f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualHat@
+foreign import ccall unsafe "hs_bindgen_c1356b5e756048fc"
+  hs_bindgen_c1356b5e756048fc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualHat@
+hs_bindgen_c1356b5e756048fc
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool))
+hs_bindgen_c1356b5e756048fc =
+  BG.fromFFIType hs_bindgen_c1356b5e756048fc_base
+
+{-# NOINLINE sDL_SetJoystickVirtualHat #-}
+
+-- | Set the state of a hat on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [@joystick@]: the virtual joystick on which to set state.
+--
+--     [@hat@]: the index of the hat on the virtual joystick to update.
+--
+--     [@value@]: the new value for the specified hat.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualHat@, defined at @SDL3\/SDL_joystick.h 680:34@
+sDL_SetJoystickVirtualHat
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool)
+sDL_SetJoystickVirtualHat =
+  BG.unsafePerformIO hs_bindgen_c1356b5e756048fc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualTouchpad@
+foreign import ccall unsafe "hs_bindgen_170b87771a92a148"
+  hs_bindgen_170b87771a92a148_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickVirtualTouchpad@
+hs_bindgen_170b87771a92a148
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Joystick
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.CBool
+             -> BG.CFloat
+             -> BG.CFloat
+             -> BG.CFloat
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_170b87771a92a148 =
+  BG.fromFFIType hs_bindgen_170b87771a92a148_base
+
+{-# NOINLINE sDL_SetJoystickVirtualTouchpad #-}
+
+-- | Set touchpad finger state on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [@joystick@]: the virtual joystick on which to set state.
+--
+--     [@touchpad@]: the index of the touchpad on the virtual joystick to update.
+--
+--     [@finger@]: the index of the finger on the touchpad to set.
+--
+--     [@down@]: true if the finger is pressed, false if the finger is released.
+--
+--     [@x@]: the x coordinate of the finger on the touchpad, normalized 0 to 1, with the origin in the upper left.
+--
+--     [@y@]: the y coordinate of the finger on the touchpad, normalized 0 to 1, with the origin in the upper left.
+--
+--     [@pressure@]: the pressure of the finger.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualTouchpad@, defined at @SDL3\/SDL_joystick.h 714:34@
+sDL_SetJoystickVirtualTouchpad
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Joystick
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.CBool
+         -> BG.CFloat
+         -> BG.CFloat
+         -> BG.CFloat
+         -> IO BG.CBool
+       )
+sDL_SetJoystickVirtualTouchpad =
+  BG.unsafePerformIO hs_bindgen_170b87771a92a148
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SendJoystickVirtualSensorData@
+foreign import ccall unsafe "hs_bindgen_5c51fdc7918227aa"
+  hs_bindgen_5c51fdc7918227aa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SendJoystickVirtualSensorData@
+hs_bindgen_5c51fdc7918227aa
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Joystick
+             -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+             -> SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> PtrConst.PtrConst BG.CFloat
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_5c51fdc7918227aa =
+  BG.fromFFIType hs_bindgen_5c51fdc7918227aa_base
+
+{-# NOINLINE sDL_SendJoystickVirtualSensorData #-}
+
+-- | Send a sensor update for an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [@joystick@]: the virtual joystick on which to set state.
+--
+--     [@type@]: the type of the sensor on the virtual joystick to update.
+--
+--     [@sensor_timestamp@]: a 64-bit timestamp in nanoseconds associated with the sensor reading.
+--
+--     [@data@]: the data associated with the sensor reading.
+--
+--     [@num_values@]: the number of values pointed to by @data@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad'
+--
+--     [C declaration]: @SDL_SendJoystickVirtualSensorData@, defined at @SDL3\/SDL_joystick.h 744:34@
+sDL_SendJoystickVirtualSensorData
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Joystick
+         -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+         -> SDL3.Sys.Bindgen.Stdinc.Uint64
+         -> PtrConst.PtrConst BG.CFloat
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_SendJoystickVirtualSensorData =
+  BG.unsafePerformIO hs_bindgen_5c51fdc7918227aa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProperties@
+foreign import ccall unsafe "hs_bindgen_9c72e51496d953ec"
+  hs_bindgen_9c72e51496d953ec_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProperties@
+hs_bindgen_9c72e51496d953ec
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_9c72e51496d953ec =
+  BG.fromFFIType hs_bindgen_9c72e51496d953ec_base
+
+{-# NOINLINE sDL_GetJoystickProperties #-}
+
+-- | Get the properties associated with a joystick.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN'@: true if this joystick has an LED that has adjustable brightness
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN'@: true if this joystick has an LED that has adjustable color
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN'@: true if this joystick has a player LED
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN'@: true if this joystick has left\/right rumble
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN'@: true if this joystick has simple trigger rumble
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickProperties@, defined at @SDL3\/SDL_joystick.h 770:46@
+sDL_GetJoystickProperties
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetJoystickProperties =
+  BG.unsafePerformIO hs_bindgen_9c72e51496d953ec
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickName@
+foreign import ccall unsafe "hs_bindgen_6d93bd8000de4d74"
+  hs_bindgen_6d93bd8000de4d74_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickName@
+hs_bindgen_6d93bd8000de4d74
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_6d93bd8000de4d74 =
+  BG.fromFFIType hs_bindgen_6d93bd8000de4d74_base
+
+{-# NOINLINE sDL_GetJoystickName #-}
+
+-- | Get the implementation dependent name of a joystick.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: the name of the selected joystick. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickNameForID'
+--
+--     [C declaration]: @SDL_GetJoystickName@, defined at @SDL3\/SDL_joystick.h 791:42@
+sDL_GetJoystickName :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetJoystickName =
+  BG.unsafePerformIO hs_bindgen_6d93bd8000de4d74
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPath@
+foreign import ccall unsafe "hs_bindgen_2e7828c53ff173b7"
+  hs_bindgen_2e7828c53ff173b7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPath@
+hs_bindgen_2e7828c53ff173b7
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_2e7828c53ff173b7 =
+  BG.fromFFIType hs_bindgen_2e7828c53ff173b7_base
+
+{-# NOINLINE sDL_GetJoystickPath #-}
+
+-- | Get the implementation dependent path of a joystick.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: the path of the selected joystick. If no path can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPathForID'
+--
+--     [C declaration]: @SDL_GetJoystickPath@, defined at @SDL3\/SDL_joystick.h 806:42@
+sDL_GetJoystickPath :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetJoystickPath =
+  BG.unsafePerformIO hs_bindgen_2e7828c53ff173b7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_63f024097bd9c12b"
+  hs_bindgen_63f024097bd9c12b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPlayerIndex@
+hs_bindgen_63f024097bd9c12b :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CInt))
+hs_bindgen_63f024097bd9c12b =
+  BG.fromFFIType hs_bindgen_63f024097bd9c12b_base
+
+{-# NOINLINE sDL_GetJoystickPlayerIndex #-}
+
+-- | Get the player index of an opened joystick.
+--
+--     For XInput controllers this returns the XInput user index. Many joysticks will not be able to supply this information.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: the player index, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickPlayerIndex'
+--
+--     [C declaration]: @SDL_GetJoystickPlayerIndex@, defined at @SDL3\/SDL_joystick.h 823:33@
+sDL_GetJoystickPlayerIndex :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CInt)
+sDL_GetJoystickPlayerIndex =
+  BG.unsafePerformIO hs_bindgen_63f024097bd9c12b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_258294b3081be5f1"
+  hs_bindgen_258294b3081be5f1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickPlayerIndex@
+hs_bindgen_258294b3081be5f1 :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> IO BG.CBool))
+hs_bindgen_258294b3081be5f1 =
+  BG.fromFFIType hs_bindgen_258294b3081be5f1_base
+
+{-# NOINLINE sDL_SetJoystickPlayerIndex #-}
+
+-- | Set the player index of an opened joystick.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [@player_index@]: player index to assign to this joystick, or -1 to clear the player index and turn off player LEDs.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPlayerIndex'
+--
+--     [C declaration]: @SDL_SetJoystickPlayerIndex@, defined at @SDL3\/SDL_joystick.h 840:34@
+sDL_SetJoystickPlayerIndex :: BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> IO BG.CBool)
+sDL_SetJoystickPlayerIndex =
+  BG.unsafePerformIO hs_bindgen_258294b3081be5f1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickGUID@
+foreign import ccall unsafe "hs_bindgen_aea836abf82f48b9"
+  hs_bindgen_aea836abf82f48b9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickGUID@
+hs_bindgen_aea836abf82f48b9
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID))
+hs_bindgen_aea836abf82f48b9 =
+  BG.fromFFIType hs_bindgen_aea836abf82f48b9_base
+
+{-# NOINLINE sDL_GetJoystickGUID #-}
+
+-- | Get the implementation-dependent GUID for the joystick.
+--
+--     This function requires an open joystick.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: the GUID of the given joystick. If called on an invalid index, this function returns a zero GUID; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickGUIDForID', SDL_GUIDToString
+--
+--     [C declaration]: @SDL_GetJoystickGUID@, defined at @SDL3\/SDL_joystick.h 859:38@
+sDL_GetJoystickGUID :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID)
+sDL_GetJoystickGUID =
+  BG.unsafePerformIO hs_bindgen_aea836abf82f48b9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickVendor@
+foreign import ccall unsafe "hs_bindgen_9cd3279f0e0ca747"
+  hs_bindgen_9cd3279f0e0ca747_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickVendor@
+hs_bindgen_9cd3279f0e0ca747
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_9cd3279f0e0ca747 =
+  BG.fromFFIType hs_bindgen_9cd3279f0e0ca747_base
+
+{-# NOINLINE sDL_GetJoystickVendor #-}
+
+-- | Get the USB vendor ID of an opened joystick, if available.
+--
+--     If the vendor ID isn\'t available this function returns 0.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: the USB vendor ID of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickVendorForID'
+--
+--     [C declaration]: @SDL_GetJoystickVendor@, defined at @SDL3\/SDL_joystick.h 875:36@
+sDL_GetJoystickVendor :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetJoystickVendor =
+  BG.unsafePerformIO hs_bindgen_9cd3279f0e0ca747
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProduct@
+foreign import ccall unsafe "hs_bindgen_22acb36edfbd0e8c"
+  hs_bindgen_22acb36edfbd0e8c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProduct@
+hs_bindgen_22acb36edfbd0e8c
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_22acb36edfbd0e8c =
+  BG.fromFFIType hs_bindgen_22acb36edfbd0e8c_base
+
+{-# NOINLINE sDL_GetJoystickProduct #-}
+
+-- | Get the USB product ID of an opened joystick, if available.
+--
+--     If the product ID isn\'t available this function returns 0.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: the USB product ID of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProductForID'
+--
+--     [C declaration]: @SDL_GetJoystickProduct@, defined at @SDL3\/SDL_joystick.h 891:36@
+sDL_GetJoystickProduct :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetJoystickProduct =
+  BG.unsafePerformIO hs_bindgen_22acb36edfbd0e8c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProductVersion@
+foreign import ccall unsafe "hs_bindgen_0bae3c3de11e8bcd"
+  hs_bindgen_0bae3c3de11e8bcd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickProductVersion@
+hs_bindgen_0bae3c3de11e8bcd
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_0bae3c3de11e8bcd =
+  BG.fromFFIType hs_bindgen_0bae3c3de11e8bcd_base
+
+{-# NOINLINE sDL_GetJoystickProductVersion #-}
+
+-- | Get the product version of an opened joystick, if available.
+--
+--     If the product version isn\'t available this function returns 0.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: the product version of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProductVersionForID'
+--
+--     [C declaration]: @SDL_GetJoystickProductVersion@, defined at @SDL3\/SDL_joystick.h 907:36@
+sDL_GetJoystickProductVersion
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetJoystickProductVersion =
+  BG.unsafePerformIO hs_bindgen_0bae3c3de11e8bcd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickFirmwareVersion@
+foreign import ccall unsafe "hs_bindgen_38f91890f6c8dd34"
+  hs_bindgen_38f91890f6c8dd34_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickFirmwareVersion@
+hs_bindgen_38f91890f6c8dd34
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Stdinc.Uint16))
+hs_bindgen_38f91890f6c8dd34 =
+  BG.fromFFIType hs_bindgen_38f91890f6c8dd34_base
+
+{-# NOINLINE sDL_GetJoystickFirmwareVersion #-}
+
+-- | Get the firmware version of an opened joystick, if available.
+--
+--     If the firmware version isn\'t available this function returns 0.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: the firmware version of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickFirmwareVersion@, defined at @SDL3\/SDL_joystick.h 922:36@
+sDL_GetJoystickFirmwareVersion
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL3.Sys.Bindgen.Stdinc.Uint16)
+sDL_GetJoystickFirmwareVersion =
+  BG.unsafePerformIO hs_bindgen_38f91890f6c8dd34
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickSerial@
+foreign import ccall unsafe "hs_bindgen_a8489b391d128726"
+  hs_bindgen_a8489b391d128726_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickSerial@
+hs_bindgen_a8489b391d128726
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_a8489b391d128726 =
+  BG.fromFFIType hs_bindgen_a8489b391d128726_base
+
+{-# NOINLINE sDL_GetJoystickSerial #-}
+
+-- | Get the serial number of an opened joystick, if available.
+--
+--     Returns the serial number of the joystick, or NULL if it is not available.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: the serial number of the selected joystick, or NULL if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickSerial@, defined at @SDL3\/SDL_joystick.h 937:42@
+sDL_GetJoystickSerial :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetJoystickSerial =
+  BG.unsafePerformIO hs_bindgen_a8489b391d128726
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickType@
+foreign import ccall unsafe "hs_bindgen_27fa723927645a5b"
+  hs_bindgen_27fa723927645a5b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickType@
+hs_bindgen_27fa723927645a5b :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL_JoystickType))
+hs_bindgen_27fa723927645a5b =
+  BG.fromFFIType hs_bindgen_27fa723927645a5b_base
+
+{-# NOINLINE sDL_GetJoystickType #-}
+
+-- | Get the type of an opened joystick.
+--
+--     [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+--
+--     [Returns]: the 'SDL_JoystickType' of the selected joystick.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickTypeForID'
+--
+--     [C declaration]: @SDL_GetJoystickType@, defined at @SDL3\/SDL_joystick.h 951:46@
+sDL_GetJoystickType :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL_JoystickType)
+sDL_GetJoystickType =
+  BG.unsafePerformIO hs_bindgen_27fa723927645a5b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickGUIDInfo@
+foreign import ccall unsafe "hs_bindgen_43f734d8766d207f"
+  hs_bindgen_43f734d8766d207f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickGUIDInfo@
+hs_bindgen_43f734d8766d207f
+  :: IO
+       ( BG.FunPtr
+           ( SDL3.Sys.Bindgen.Guid.SDL_GUID
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> IO ()
+           )
+       )
+hs_bindgen_43f734d8766d207f =
+  BG.fromFFIType hs_bindgen_43f734d8766d207f_base
+
+{-# NOINLINE sDL_GetJoystickGUIDInfo #-}
+
+-- | Get the device information encoded in a SDL_GUID structure.
+--
+--     [@guid@]: the SDL_GUID you wish to get info about.
+--
+--     [@vendor@]: a pointer filled in with the device VID, or 0 if not available.
+--
+--     [@product@]: a pointer filled in with the device PID, or 0 if not available.
+--
+--     [@version@]: a pointer filled in with the device version, or 0 if not available.
+--
+--     [@crc16@]: a pointer filled in with a CRC used to distinguish different products with the same VID\/PID, or 0 if not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickGUIDForID'
+--
+--     [C declaration]: @SDL_GetJoystickGUIDInfo@, defined at @SDL3\/SDL_joystick.h 972:34@
+sDL_GetJoystickGUIDInfo
+  :: BG.FunPtr
+       ( SDL3.Sys.Bindgen.Guid.SDL_GUID
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> IO ()
+       )
+sDL_GetJoystickGUIDInfo =
+  BG.unsafePerformIO hs_bindgen_43f734d8766d207f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_JoystickConnected@
+foreign import ccall unsafe "hs_bindgen_34fe2e0cf303a75f"
+  hs_bindgen_34fe2e0cf303a75f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_JoystickConnected@
+hs_bindgen_34fe2e0cf303a75f :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CBool))
+hs_bindgen_34fe2e0cf303a75f =
+  BG.fromFFIType hs_bindgen_34fe2e0cf303a75f_base
+
+{-# NOINLINE sDL_JoystickConnected #-}
+
+-- | Get the status of a specified joystick.
+--
+--     [@joystick@]: the joystick to query.
+--
+--     [Returns]: true if the joystick has been opened, false if it has not; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_JoystickConnected@, defined at @SDL3\/SDL_joystick.h 985:34@
+sDL_JoystickConnected :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CBool)
+sDL_JoystickConnected =
+  BG.unsafePerformIO hs_bindgen_34fe2e0cf303a75f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickID@
+foreign import ccall unsafe "hs_bindgen_db36c45c44877744"
+  hs_bindgen_db36c45c44877744_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickID@
+hs_bindgen_db36c45c44877744 :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL_JoystickID))
+hs_bindgen_db36c45c44877744 =
+  BG.fromFFIType hs_bindgen_db36c45c44877744_base
+
+{-# NOINLINE sDL_GetJoystickID #-}
+
+-- | Get the instance ID of an opened joystick.
+--
+--     [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+--
+--     [Returns]: the instance ID of the specified joystick on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickID@, defined at @SDL3\/SDL_joystick.h 998:44@
+sDL_GetJoystickID :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL_JoystickID)
+sDL_GetJoystickID =
+  BG.unsafePerformIO hs_bindgen_db36c45c44877744
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickAxes@
+foreign import ccall unsafe "hs_bindgen_c743dc688bb6eabd"
+  hs_bindgen_c743dc688bb6eabd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickAxes@
+hs_bindgen_c743dc688bb6eabd :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CInt))
+hs_bindgen_c743dc688bb6eabd =
+  BG.fromFFIType hs_bindgen_c743dc688bb6eabd_base
+
+{-# NOINLINE sDL_GetNumJoystickAxes #-}
+
+-- | Get the number of general axis controls on a joystick.
+--
+--     Often, the directional pad on a game controller will either look like 4 separate buttons or a POV hat, and not axes, but all of this is up to the device and platform.
+--
+--     [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+--
+--     [Returns]: the number of axis controls\/number of axes on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickAxis', 'sDL_GetNumJoystickBalls', 'sDL_GetNumJoystickButtons', 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetNumJoystickAxes@, defined at @SDL3\/SDL_joystick.h 1020:33@
+sDL_GetNumJoystickAxes :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CInt)
+sDL_GetNumJoystickAxes =
+  BG.unsafePerformIO hs_bindgen_c743dc688bb6eabd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickBalls@
+foreign import ccall unsafe "hs_bindgen_948af313b23a1c65"
+  hs_bindgen_948af313b23a1c65_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickBalls@
+hs_bindgen_948af313b23a1c65 :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CInt))
+hs_bindgen_948af313b23a1c65 =
+  BG.fromFFIType hs_bindgen_948af313b23a1c65_base
+
+{-# NOINLINE sDL_GetNumJoystickBalls #-}
+
+-- | Get the number of trackballs on a joystick.
+--
+--     Joystick trackballs have only relative motion events associated with them and their state cannot be polled.
+--
+--     Most joysticks do not have trackballs.
+--
+--     [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+--
+--     [Returns]: the number of trackballs on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickBall', 'sDL_GetNumJoystickAxes', 'sDL_GetNumJoystickButtons', 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetNumJoystickBalls@, defined at @SDL3\/SDL_joystick.h 1043:33@
+sDL_GetNumJoystickBalls :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CInt)
+sDL_GetNumJoystickBalls =
+  BG.unsafePerformIO hs_bindgen_948af313b23a1c65
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickHats@
+foreign import ccall unsafe "hs_bindgen_2bfa757cb6822a72"
+  hs_bindgen_2bfa757cb6822a72_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickHats@
+hs_bindgen_2bfa757cb6822a72 :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CInt))
+hs_bindgen_2bfa757cb6822a72 =
+  BG.fromFFIType hs_bindgen_2bfa757cb6822a72_base
+
+{-# NOINLINE sDL_GetNumJoystickHats #-}
+
+-- | Get the number of POV hats on a joystick.
+--
+--     [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+--
+--     [Returns]: the number of POV hats on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickHat', 'sDL_GetNumJoystickAxes', 'sDL_GetNumJoystickBalls', 'sDL_GetNumJoystickButtons'
+--
+--     [C declaration]: @SDL_GetNumJoystickHats@, defined at @SDL3\/SDL_joystick.h 1061:33@
+sDL_GetNumJoystickHats :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CInt)
+sDL_GetNumJoystickHats =
+  BG.unsafePerformIO hs_bindgen_2bfa757cb6822a72
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickButtons@
+foreign import ccall unsafe "hs_bindgen_a91d035d49fdc8d2"
+  hs_bindgen_a91d035d49fdc8d2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetNumJoystickButtons@
+hs_bindgen_a91d035d49fdc8d2 :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CInt))
+hs_bindgen_a91d035d49fdc8d2 =
+  BG.fromFFIType hs_bindgen_a91d035d49fdc8d2_base
+
+{-# NOINLINE sDL_GetNumJoystickButtons #-}
+
+-- | Get the number of buttons on a joystick.
+--
+--     [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+--
+--     [Returns]: the number of buttons on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickButton', 'sDL_GetNumJoystickAxes', 'sDL_GetNumJoystickBalls', 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetNumJoystickButtons@, defined at @SDL3\/SDL_joystick.h 1079:33@
+sDL_GetNumJoystickButtons :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO BG.CInt)
+sDL_GetNumJoystickButtons =
+  BG.unsafePerformIO hs_bindgen_a91d035d49fdc8d2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickEventsEnabled@
+foreign import ccall unsafe "hs_bindgen_33fbade22db04a59"
+  hs_bindgen_33fbade22db04a59_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickEventsEnabled@
+hs_bindgen_33fbade22db04a59 :: IO (BG.FunPtr (BG.CBool -> IO ()))
+hs_bindgen_33fbade22db04a59 =
+  BG.fromFFIType hs_bindgen_33fbade22db04a59_base
+
+{-# NOINLINE sDL_SetJoystickEventsEnabled #-}
+
+-- | Set the state of joystick event processing.
+--
+--     If joystick events are disabled, you must call @SDL_UpdateJoysticks()@ yourself and check the state of the joystick when you want joystick information.
+--
+--     [@enabled@]: whether to process joystick events or not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_JoystickEventsEnabled', 'sDL_UpdateJoysticks'
+--
+--     [C declaration]: @SDL_SetJoystickEventsEnabled@, defined at @SDL3\/SDL_joystick.h 1097:34@
+sDL_SetJoystickEventsEnabled :: BG.FunPtr (BG.CBool -> IO ())
+sDL_SetJoystickEventsEnabled =
+  BG.unsafePerformIO hs_bindgen_33fbade22db04a59
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_JoystickEventsEnabled@
+foreign import ccall unsafe "hs_bindgen_ddd93029215cfd37"
+  hs_bindgen_ddd93029215cfd37_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_JoystickEventsEnabled@
+hs_bindgen_ddd93029215cfd37 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_ddd93029215cfd37 =
+  BG.fromFFIType hs_bindgen_ddd93029215cfd37_base
+
+{-# NOINLINE sDL_JoystickEventsEnabled #-}
+
+-- | Query the state of joystick event processing.
+--
+--     If joystick events are disabled, you must call @SDL_UpdateJoysticks()@ yourself and check the state of the joystick when you want joystick information.
+--
+--     [Returns]: true if joystick events are being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickEventsEnabled'
+--
+--     [C declaration]: @SDL_JoystickEventsEnabled@, defined at @SDL3\/SDL_joystick.h 1114:34@
+sDL_JoystickEventsEnabled :: BG.FunPtr (IO BG.CBool)
+sDL_JoystickEventsEnabled =
+  BG.unsafePerformIO hs_bindgen_ddd93029215cfd37
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_UpdateJoysticks@
+foreign import ccall unsafe "hs_bindgen_fab2d264eddcaffa"
+  hs_bindgen_fab2d264eddcaffa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_UpdateJoysticks@
+hs_bindgen_fab2d264eddcaffa :: IO (BG.FunPtr (IO ()))
+hs_bindgen_fab2d264eddcaffa =
+  BG.fromFFIType hs_bindgen_fab2d264eddcaffa_base
+
+{-# NOINLINE sDL_UpdateJoysticks #-}
+
+-- | Update the current state of the open joysticks.
+--
+--     This is called automatically by the event loop if any joystick events are enabled.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateJoysticks@, defined at @SDL3\/SDL_joystick.h 1126:34@
+sDL_UpdateJoysticks :: BG.FunPtr (IO ())
+sDL_UpdateJoysticks =
+  BG.unsafePerformIO hs_bindgen_fab2d264eddcaffa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickAxis@
+foreign import ccall unsafe "hs_bindgen_f60a6cb5f1d09a81"
+  hs_bindgen_f60a6cb5f1d09a81_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickAxis@
+hs_bindgen_f60a6cb5f1d09a81
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> IO SDL3.Sys.Bindgen.Stdinc.Sint16))
+hs_bindgen_f60a6cb5f1d09a81 =
+  BG.fromFFIType hs_bindgen_f60a6cb5f1d09a81_base
+
+{-# NOINLINE sDL_GetJoystickAxis #-}
+
+-- | Get the current state of an axis control on a joystick.
+--
+--     SDL makes no promises about what part of the joystick any given axis refers to. Your game should have some sort of configuration UI to let users specify what each axis should be bound to. Alternately, SDL\'s higher-level Game Controller API makes a great effort to apply order to this lower-level interface, so you know that a specific axis is the \"left thumb stick,\" etc.
+--
+--     The value returned by @SDL_GetJoystickAxis()@ is a signed integer (-32768 to 32767) representing the current position of the axis. It may be necessary to impose certain tolerances on these values to account for jitter.
+--
+--     [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+--
+--     [@axis@]: the axis to query; the axis indices start at index 0.
+--
+--     [Returns]: a 16-bit signed integer representing the current position of the axis or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickAxes'
+--
+--     [C declaration]: @SDL_GetJoystickAxis@, defined at @SDL3\/SDL_joystick.h 1152:36@
+sDL_GetJoystickAxis
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> IO SDL3.Sys.Bindgen.Stdinc.Sint16)
+sDL_GetJoystickAxis =
+  BG.unsafePerformIO hs_bindgen_f60a6cb5f1d09a81
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickAxisInitialState@
+foreign import ccall unsafe "hs_bindgen_c09eb5cfd016adfb"
+  hs_bindgen_c09eb5cfd016adfb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickAxisInitialState@
+hs_bindgen_c09eb5cfd016adfb
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool))
+hs_bindgen_c09eb5cfd016adfb =
+  BG.fromFFIType hs_bindgen_c09eb5cfd016adfb_base
+
+{-# NOINLINE sDL_GetJoystickAxisInitialState #-}
+
+-- | Get the initial state of an axis control on a joystick.
+--
+--     The state is a value ranging from -32768 to 32767.
+--
+--     The axis indices start at index 0.
+--
+--     [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+--
+--     [@axis@]: the axis to query; the axis indices start at index 0.
+--
+--     [@state@]: upon return, the initial value is supplied here.
+--
+--     [Returns]: true if this axis has any initial value, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickAxisInitialState@, defined at @SDL3\/SDL_joystick.h 1170:34@
+sDL_GetJoystickAxisInitialState
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16 -> IO BG.CBool)
+sDL_GetJoystickAxisInitialState =
+  BG.unsafePerformIO hs_bindgen_c09eb5cfd016adfb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickBall@
+foreign import ccall unsafe "hs_bindgen_ea4bd75fcfd7173a"
+  hs_bindgen_ea4bd75fcfd7173a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickBall@
+hs_bindgen_ea4bd75fcfd7173a
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_ea4bd75fcfd7173a =
+  BG.fromFFIType hs_bindgen_ea4bd75fcfd7173a_base
+
+{-# NOINLINE sDL_GetJoystickBall #-}
+
+-- | Get the ball axis change since the last poll.
+--
+--     Trackballs can only return relative motion since the last call to @SDL_GetJoystickBall()@, these motion deltas are placed into @dx@ and @dy@.
+--
+--     Most joysticks do not have trackballs.
+--
+--     [@joystick@]: the 'SDL_Joystick' to query.
+--
+--     [@ball@]: the ball index to query; ball indices start at index 0.
+--
+--     [@dx@]: stores the difference in the x axis position since the last poll.
+--
+--     [@dy@]: stores the difference in the y axis position since the last poll.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickBalls'
+--
+--     [C declaration]: @SDL_GetJoystickBall@, defined at @SDL3\/SDL_joystick.h 1193:34@
+sDL_GetJoystickBall
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetJoystickBall =
+  BG.unsafePerformIO hs_bindgen_ea4bd75fcfd7173a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickHat@
+foreign import ccall unsafe "hs_bindgen_79462e0207a041dd"
+  hs_bindgen_79462e0207a041dd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickHat@
+hs_bindgen_79462e0207a041dd
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> IO SDL3.Sys.Bindgen.Stdinc.Uint8))
+hs_bindgen_79462e0207a041dd =
+  BG.fromFFIType hs_bindgen_79462e0207a041dd_base
+
+{-# NOINLINE sDL_GetJoystickHat #-}
+
+-- | Get the current state of a POV hat on a joystick.
+--
+--     The returned value will be one of the @SDL_HAT_*@ values.
+--
+--     [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+--
+--     [@hat@]: the hat index to get the state from; indices start at index 0.
+--
+--     [Returns]: the current hat position.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetJoystickHat@, defined at @SDL3\/SDL_joystick.h 1210:35@
+sDL_GetJoystickHat :: BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> IO SDL3.Sys.Bindgen.Stdinc.Uint8)
+sDL_GetJoystickHat =
+  BG.unsafePerformIO hs_bindgen_79462e0207a041dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickButton@
+foreign import ccall unsafe "hs_bindgen_8db4e8a6fc998c72"
+  hs_bindgen_8db4e8a6fc998c72_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickButton@
+hs_bindgen_8db4e8a6fc998c72 :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> IO BG.CBool))
+hs_bindgen_8db4e8a6fc998c72 =
+  BG.fromFFIType hs_bindgen_8db4e8a6fc998c72_base
+
+{-# NOINLINE sDL_GetJoystickButton #-}
+
+-- | Get the current state of a button on a joystick.
+--
+--     [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+--
+--     [@button@]: the button index to get the state from; indices start at index 0.
+--
+--     [Returns]: true if the button is pressed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickButtons'
+--
+--     [C declaration]: @SDL_GetJoystickButton@, defined at @SDL3\/SDL_joystick.h 1236:34@
+sDL_GetJoystickButton :: BG.FunPtr (BG.Ptr SDL_Joystick -> BG.CInt -> IO BG.CBool)
+sDL_GetJoystickButton =
+  BG.unsafePerformIO hs_bindgen_8db4e8a6fc998c72
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_RumbleJoystick@
+foreign import ccall unsafe "hs_bindgen_01a69fecc103bd0a"
+  hs_bindgen_01a69fecc103bd0a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_RumbleJoystick@
+hs_bindgen_01a69fecc103bd0a
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Joystick
+             -> SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_01a69fecc103bd0a =
+  BG.fromFFIType hs_bindgen_01a69fecc103bd0a_base
+
+{-# NOINLINE sDL_RumbleJoystick #-}
+
+-- | Start a rumble effect.
+--
+--     Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     This function requires you to process SDL events or call @SDL_UpdateJoysticks()@ to update rumble state.
+--
+--     [@joystick@]: the joystick to vibrate.
+--
+--     [@low_frequency_rumble@]: the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF.
+--
+--     [@high_frequency_rumble@]: the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF.
+--
+--     [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+--
+--     [Returns]: true, or false if rumble isn\'t supported on this joystick.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RumbleJoystick@, defined at @SDL3\/SDL_joystick.h 1259:34@
+sDL_RumbleJoystick
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Joystick
+         -> SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_RumbleJoystick =
+  BG.unsafePerformIO hs_bindgen_01a69fecc103bd0a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_RumbleJoystickTriggers@
+foreign import ccall unsafe "hs_bindgen_9190634ce5c1726f"
+  hs_bindgen_9190634ce5c1726f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_RumbleJoystickTriggers@
+hs_bindgen_9190634ce5c1726f
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Joystick
+             -> SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> SDL3.Sys.Bindgen.Stdinc.Uint16
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_9190634ce5c1726f =
+  BG.fromFFIType hs_bindgen_9190634ce5c1726f_base
+
+{-# NOINLINE sDL_RumbleJoystickTriggers #-}
+
+-- | Start a rumble effect in the joystick\'s triggers.
+--
+--     Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     Note that this is rumbling of the /triggers/ and not the game controller as a whole. This is currently only supported on Xbox One controllers. If you want the (more common) whole-controller rumble, use @SDL_RumbleJoystick()@ instead.
+--
+--     This function requires you to process SDL events or call @SDL_UpdateJoysticks()@ to update rumble state.
+--
+--     [@joystick@]: the joystick to vibrate.
+--
+--     [@left_rumble@]: the intensity of the left trigger rumble motor, from 0 to 0xFFFF.
+--
+--     [@right_rumble@]: the intensity of the right trigger rumble motor, from 0 to 0xFFFF.
+--
+--     [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RumbleJoystick'
+--
+--     [C declaration]: @SDL_RumbleJoystickTriggers@, defined at @SDL3\/SDL_joystick.h 1290:34@
+sDL_RumbleJoystickTriggers
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Joystick
+         -> SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> SDL3.Sys.Bindgen.Stdinc.Uint16
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_RumbleJoystickTriggers =
+  BG.unsafePerformIO hs_bindgen_9190634ce5c1726f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickLED@
+foreign import ccall unsafe "hs_bindgen_a99b95fd254e2484"
+  hs_bindgen_a99b95fd254e2484_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SetJoystickLED@
+hs_bindgen_a99b95fd254e2484
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Joystick
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_a99b95fd254e2484 =
+  BG.fromFFIType hs_bindgen_a99b95fd254e2484_base
+
+{-# NOINLINE sDL_SetJoystickLED #-}
+
+-- | Update a joystick\'s LED color.
+--
+--     An example of a joystick LED is the light on the back of a PlayStation 4\'s DualShock 4 controller.
+--
+--     For joysticks with a single color LED, the maximum of the RGB values will be used as the LED brightness.
+--
+--     [@joystick@]: the joystick to update.
+--
+--     [@red@]: the intensity of the red LED.
+--
+--     [@green@]: the intensity of the green LED.
+--
+--     [@blue@]: the intensity of the blue LED.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetJoystickLED@, defined at @SDL3\/SDL_joystick.h 1312:34@
+sDL_SetJoystickLED
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Joystick
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO BG.CBool
+       )
+sDL_SetJoystickLED =
+  BG.unsafePerformIO hs_bindgen_a99b95fd254e2484
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SendJoystickEffect@
+foreign import ccall unsafe "hs_bindgen_2552aba22a4e5237"
+  hs_bindgen_2552aba22a4e5237_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_SendJoystickEffect@
+hs_bindgen_2552aba22a4e5237
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO BG.CBool))
+hs_bindgen_2552aba22a4e5237 =
+  BG.fromFFIType hs_bindgen_2552aba22a4e5237_base
+
+{-# NOINLINE sDL_SendJoystickEffect #-}
+
+-- | Send a joystick specific effect packet.
+--
+--     [@joystick@]: the joystick to affect.
+--
+--     [@data@]: the data to send to the joystick.
+--
+--     [@size@]: the size of the data to send to the joystick.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SendJoystickEffect@, defined at @SDL3\/SDL_joystick.h 1327:34@
+sDL_SendJoystickEffect
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> PtrConst.PtrConst BG.Void -> BG.CInt -> IO BG.CBool)
+sDL_SendJoystickEffect =
+  BG.unsafePerformIO hs_bindgen_2552aba22a4e5237
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_CloseJoystick@
+foreign import ccall unsafe "hs_bindgen_85ce86bc3120d0c6"
+  hs_bindgen_85ce86bc3120d0c6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_CloseJoystick@
+hs_bindgen_85ce86bc3120d0c6 :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO ()))
+hs_bindgen_85ce86bc3120d0c6 =
+  BG.fromFFIType hs_bindgen_85ce86bc3120d0c6_base
+
+{-# NOINLINE sDL_CloseJoystick #-}
+
+-- | Close a joystick previously opened with @SDL_OpenJoystick()@.
+--
+--     [@joystick@]: the joystick device to close.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenJoystick'
+--
+--     [C declaration]: @SDL_CloseJoystick@, defined at @SDL3\/SDL_joystick.h 1340:34@
+sDL_CloseJoystick :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO ())
+sDL_CloseJoystick =
+  BG.unsafePerformIO hs_bindgen_85ce86bc3120d0c6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickConnectionState@
+foreign import ccall unsafe "hs_bindgen_47061e113b50ffdc"
+  hs_bindgen_47061e113b50ffdc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickConnectionState@
+hs_bindgen_47061e113b50ffdc
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL_JoystickConnectionState))
+hs_bindgen_47061e113b50ffdc =
+  BG.fromFFIType hs_bindgen_47061e113b50ffdc_base
+
+{-# NOINLINE sDL_GetJoystickConnectionState #-}
+
+-- | Get the connection state of a joystick.
+--
+--     [@joystick@]: the joystick to query.
+--
+--     [Returns]: the connection state on success or @SDL_JOYSTICK_CONNECTION_INVALID@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickConnectionState@, defined at @SDL3\/SDL_joystick.h 1354:57@
+sDL_GetJoystickConnectionState :: BG.FunPtr (BG.Ptr SDL_Joystick -> IO SDL_JoystickConnectionState)
+sDL_GetJoystickConnectionState =
+  BG.unsafePerformIO hs_bindgen_47061e113b50ffdc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPowerInfo@
+foreign import ccall unsafe "hs_bindgen_cf314c27d59c09a1"
+  hs_bindgen_cf314c27d59c09a1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_get_SDL_GetJoystickPowerInfo@
+hs_bindgen_cf314c27d59c09a1
+  :: IO (BG.FunPtr (BG.Ptr SDL_Joystick -> BG.Ptr BG.CInt -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState))
+hs_bindgen_cf314c27d59c09a1 =
+  BG.fromFFIType hs_bindgen_cf314c27d59c09a1_base
+
+{-# NOINLINE sDL_GetJoystickPowerInfo #-}
+
+-- | Get the battery state of a joystick.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     [@joystick@]: the joystick to query.
+--
+--     [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 we can\'t determine a value or there is no battery.
+--
+--     [Returns]: the current battery state or @SDL_POWERSTATE_ERROR@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickPowerInfo@, defined at @SDL3\/SDL_joystick.h 1377:44@
+sDL_GetJoystickPowerInfo
+  :: BG.FunPtr (BG.Ptr SDL_Joystick -> BG.Ptr BG.CInt -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState)
+sDL_GetJoystickPowerInfo =
+  BG.unsafePerformIO hs_bindgen_cf314c27d59c09a1
diff --git a/src/SDL3/Sys/Bindgen/Joystick/Safe.hs b/src/SDL3/Sys/Bindgen/Joystick/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Joystick/Safe.hs
@@ -0,0 +1,2662 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Joystick.Safe (
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_LockJoysticks,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_UnlockJoysticks,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_HasJoystick,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoysticks,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickNameForID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickPathForID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickPlayerIndexForID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickGUIDForID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickVendorForID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickProductForID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickProductVersionForID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickTypeForID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_OpenJoystick,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickFromID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickFromPlayerIndex,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_AttachVirtualJoystick,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_DetachVirtualJoystick,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_IsJoystickVirtual,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_SetJoystickVirtualAxis,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_SetJoystickVirtualBall,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_SetJoystickVirtualButton,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_SetJoystickVirtualHat,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_SetJoystickVirtualTouchpad,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_SendJoystickVirtualSensorData,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickProperties,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickName,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickPath,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickPlayerIndex,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_SetJoystickPlayerIndex,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickGUID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickVendor,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickProduct,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickProductVersion,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickFirmwareVersion,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickSerial,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickType,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickGUIDInfo,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_JoystickConnected,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickID,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetNumJoystickAxes,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetNumJoystickBalls,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetNumJoystickHats,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetNumJoystickButtons,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_SetJoystickEventsEnabled,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_JoystickEventsEnabled,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_UpdateJoysticks,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickAxis,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickAxisInitialState,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickBall,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickHat,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickButton,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_RumbleJoystick,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_RumbleJoystickTriggers,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_SetJoystickLED,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_SendJoystickEffect,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_CloseJoystick,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickConnectionState,
+  SDL3.Sys.Bindgen.Joystick.Safe.sDL_GetJoystickPowerInfo,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Guid qualified
+import SDL3.Sys.Bindgen.Joystick
+import SDL3.Sys.Bindgen.Power qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_joystick.h>"
+         , "void hs_bindgen_19b2fb0e1aa23b4e (void)"
+         , "{"
+         , "  (SDL_LockJoysticks)();"
+         , "}"
+         , "void hs_bindgen_1e385ec73db339ad (void)"
+         , "{"
+         , "  (SDL_UnlockJoysticks)();"
+         , "}"
+         , "_Bool hs_bindgen_35e62bce1113cd99 (void)"
+         , "{"
+         , "  return (SDL_HasJoystick)();"
+         , "}"
+         , "SDL_JoystickID *hs_bindgen_a648e48d15a7195e ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoysticks)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_25173d20a8c29264 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickNameForID)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_bdd23d794dc05a80 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickPathForID)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_79f42832d2cd073a ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickPlayerIndexForID)(arg1);"
+         , "}"
+         , "void hs_bindgen_f9a989144ab124be ("
+         , "  SDL_JoystickID arg1,"
+         , "  SDL_GUID *arg2"
+         , ")"
+         , "{"
+         , "  *arg2 = (SDL_GetJoystickGUIDForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_eadbde2ef191eb5b ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickVendorForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_bb593396127cd149 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickProductForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_44e1a599dadd0805 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickProductVersionForID)(arg1);"
+         , "}"
+         , "SDL_JoystickType hs_bindgen_336781da50ffa73f ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickTypeForID)(arg1);"
+         , "}"
+         , "SDL_Joystick *hs_bindgen_a95f6ee451f3128f ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenJoystick)(arg1);"
+         , "}"
+         , "SDL_Joystick *hs_bindgen_8b8e060d989b32c5 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickFromID)(arg1);"
+         , "}"
+         , "SDL_Joystick *hs_bindgen_435b2937a9d773b0 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickFromPlayerIndex)(arg1);"
+         , "}"
+         , "SDL_JoystickID hs_bindgen_9b992b621bc9d228 ("
+         , "  SDL_VirtualJoystickDesc const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AttachVirtualJoystick)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_95f96ae58c7060c5 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_DetachVirtualJoystick)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_b4d6fc0d358b2610 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_IsJoystickVirtual)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_950280d1c0af9b76 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Sint16 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickVirtualAxis)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_ebe45871302400bf ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Sint16 arg3,"
+         , "  Sint16 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickVirtualBall)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_943b4ea8f02f7dfb ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickVirtualButton)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_466a950a48c1bafe ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Uint8 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickVirtualHat)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_520069e80ffda161 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  _Bool arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickVirtualTouchpad)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_502da6838ce8a4f8 ("
+         , "  SDL_Joystick *arg1,"
+         , "  SDL_SensorType arg2,"
+         , "  Uint64 arg3,"
+         , "  float const *arg4,"
+         , "  signed int arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_SendJoystickVirtualSensorData)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_0e41310a58070b5c ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickProperties)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_a9e087059d7ddd66 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickName)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_33ba12816518ab07 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickPath)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_3f3bef7e45cb79c2 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickPlayerIndex)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_24bf75158e208f66 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickPlayerIndex)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_9d48edfe80deea21 ("
+         , "  SDL_Joystick *arg1,"
+         , "  SDL_GUID *arg2"
+         , ")"
+         , "{"
+         , "  *arg2 = (SDL_GetJoystickGUID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_58e23abd1321767d ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickVendor)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_a1a810fac491b03c ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickProduct)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_ffcb72c6f02c76c7 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickProductVersion)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_990e53211d186662 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickFirmwareVersion)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_b1bfb007ec57169c ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickSerial)(arg1);"
+         , "}"
+         , "SDL_JoystickType hs_bindgen_4bbfdbe521ae4448 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickType)(arg1);"
+         , "}"
+         , "void hs_bindgen_ac4457e1668303cb ("
+         , "  SDL_GUID *arg1,"
+         , "  Uint16 *arg2,"
+         , "  Uint16 *arg3,"
+         , "  Uint16 *arg4,"
+         , "  Uint16 *arg5"
+         , ")"
+         , "{"
+         , "  (SDL_GetJoystickGUIDInfo)(*arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_fd1547f6643cd55d ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_JoystickConnected)(arg1);"
+         , "}"
+         , "SDL_JoystickID hs_bindgen_e792f601776227ad ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickID)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_eb5cf1b5a80cb490 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumJoystickAxes)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_e856e95bf561b58f ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumJoystickBalls)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_14f7806c41b802cb ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumJoystickHats)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_737397e3a398beb9 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumJoystickButtons)(arg1);"
+         , "}"
+         , "void hs_bindgen_ed51a1754ff9d6c7 ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SetJoystickEventsEnabled)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_86ece04390ea5953 (void)"
+         , "{"
+         , "  return (SDL_JoystickEventsEnabled)();"
+         , "}"
+         , "void hs_bindgen_277bf35db967cb76 (void)"
+         , "{"
+         , "  (SDL_UpdateJoysticks)();"
+         , "}"
+         , "Sint16 hs_bindgen_5ffa383d290b6a82 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickAxis)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_427de097dfec8d31 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Sint16 *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickAxisInitialState)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_aee21b71d3004e03 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  signed int *arg3,"
+         , "  signed int *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickBall)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "Uint8 hs_bindgen_03a81f7b52479c1f ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickHat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_066ace0739b36572 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickButton)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7e8a72caa95f2c2b ("
+         , "  SDL_Joystick *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RumbleJoystick)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_301092a71603b81a ("
+         , "  SDL_Joystick *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RumbleJoystickTriggers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_8b94c1cbb487385b ("
+         , "  SDL_Joystick *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickLED)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_f7e59a6e5bb608fe ("
+         , "  SDL_Joystick *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SendJoystickEffect)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_ea0c624f184dccba ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseJoystick)(arg1);"
+         , "}"
+         , "SDL_JoystickConnectionState hs_bindgen_08992afe945eb606 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickConnectionState)(arg1);"
+         , "}"
+         , "SDL_PowerState hs_bindgen_8bfbd5889037e579 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickPowerInfo)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_LockJoysticks@
+foreign import ccall safe "hs_bindgen_19b2fb0e1aa23b4e"
+  hs_bindgen_19b2fb0e1aa23b4e_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_LockJoysticks@
+hs_bindgen_19b2fb0e1aa23b4e :: IO ()
+hs_bindgen_19b2fb0e1aa23b4e =
+  BG.fromFFIType hs_bindgen_19b2fb0e1aa23b4e_base
+
+-- | Locking for atomic access to the joystick API.
+--
+--     The SDL joystick functions are thread-safe, however you can lock the joysticks while processing to guarantee that the joystick list won\'t change and joystick and gamepad events will not be delivered.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_LockJoysticks@, defined at @SDL3\/SDL_joystick.h 189:34@
+sDL_LockJoysticks :: IO ()
+sDL_LockJoysticks = hs_bindgen_19b2fb0e1aa23b4e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_UnlockJoysticks@
+foreign import ccall safe "hs_bindgen_1e385ec73db339ad"
+  hs_bindgen_1e385ec73db339ad_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_UnlockJoysticks@
+hs_bindgen_1e385ec73db339ad :: IO ()
+hs_bindgen_1e385ec73db339ad =
+  BG.fromFFIType hs_bindgen_1e385ec73db339ad_base
+
+-- | Unlocking for atomic access to the joystick API.
+--
+--     [Thread safety]: This should be called from the same thread that called @SDL_LockJoysticks()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UnlockJoysticks@, defined at @SDL3\/SDL_joystick.h 199:34@
+sDL_UnlockJoysticks :: IO ()
+sDL_UnlockJoysticks = hs_bindgen_1e385ec73db339ad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_HasJoystick@
+foreign import ccall safe "hs_bindgen_35e62bce1113cd99"
+  hs_bindgen_35e62bce1113cd99_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_HasJoystick@
+hs_bindgen_35e62bce1113cd99 :: IO BG.CBool
+hs_bindgen_35e62bce1113cd99 =
+  BG.fromFFIType hs_bindgen_35e62bce1113cd99_base
+
+-- | Return whether a joystick is currently connected.
+--
+--     [Returns]: true if a joystick is connected, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_HasJoystick@, defined at @SDL3\/SDL_joystick.h 212:34@
+sDL_HasJoystick :: IO BG.CBool
+sDL_HasJoystick = hs_bindgen_35e62bce1113cd99
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoysticks@
+foreign import ccall safe "hs_bindgen_a648e48d15a7195e"
+  hs_bindgen_a648e48d15a7195e_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoysticks@
+hs_bindgen_a648e48d15a7195e
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_JoystickID)
+hs_bindgen_a648e48d15a7195e =
+  BG.fromFFIType hs_bindgen_a648e48d15a7195e_base
+
+-- | Get a list of currently connected joysticks.
+--
+--     [Returns]: a 0 terminated array of joystick instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasJoystick', 'sDL_OpenJoystick'
+--
+--     [C declaration]: @SDL_GetJoysticks@, defined at @SDL3\/SDL_joystick.h 230:46@
+sDL_GetJoysticks
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of joysticks returned, may be NULL.
+  -> IO (BG.Ptr SDL_JoystickID)
+sDL_GetJoysticks = hs_bindgen_a648e48d15a7195e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickNameForID@
+foreign import ccall safe "hs_bindgen_25173d20a8c29264"
+  hs_bindgen_25173d20a8c29264_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickNameForID@
+hs_bindgen_25173d20a8c29264
+  :: SDL_JoystickID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_25173d20a8c29264 =
+  BG.fromFFIType hs_bindgen_25173d20a8c29264_base
+
+-- | Get the implementation dependent name of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the name of the selected joystick. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickName', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickNameForID@, defined at @SDL3\/SDL_joystick.h 248:42@
+sDL_GetJoystickNameForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetJoystickNameForID =
+  hs_bindgen_25173d20a8c29264
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickPathForID@
+foreign import ccall safe "hs_bindgen_bdd23d794dc05a80"
+  hs_bindgen_bdd23d794dc05a80_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickPathForID@
+hs_bindgen_bdd23d794dc05a80
+  :: SDL_JoystickID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_bdd23d794dc05a80 =
+  BG.fromFFIType hs_bindgen_bdd23d794dc05a80_base
+
+-- | Get the implementation dependent path of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the path of the selected joystick. If no path can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPath', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickPathForID@, defined at @SDL3\/SDL_joystick.h 266:42@
+sDL_GetJoystickPathForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetJoystickPathForID =
+  hs_bindgen_bdd23d794dc05a80
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickPlayerIndexForID@
+foreign import ccall safe "hs_bindgen_79f42832d2cd073a"
+  hs_bindgen_79f42832d2cd073a_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickPlayerIndexForID@
+hs_bindgen_79f42832d2cd073a
+  :: SDL_JoystickID
+  -> IO BG.CInt
+hs_bindgen_79f42832d2cd073a =
+  BG.fromFFIType hs_bindgen_79f42832d2cd073a_base
+
+-- | Get the player index of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the player index of a joystick, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPlayerIndex', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickPlayerIndexForID@, defined at @SDL3\/SDL_joystick.h 283:33@
+sDL_GetJoystickPlayerIndexForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.CInt
+sDL_GetJoystickPlayerIndexForID =
+  hs_bindgen_79f42832d2cd073a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickGUIDForID@
+foreign import ccall safe "hs_bindgen_f9a989144ab124be"
+  hs_bindgen_f9a989144ab124be_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickGUIDForID@
+hs_bindgen_f9a989144ab124be
+  :: SDL_JoystickID
+  -> BG.Ptr SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -> IO ()
+hs_bindgen_f9a989144ab124be =
+  BG.fromFFIType hs_bindgen_f9a989144ab124be_base
+
+-- | Get the implementation-dependent GUID of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the GUID of the selected joystick. If called with an invalid instance_id, this function returns a zero GUID.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickGUID', SDL_GUIDToString
+--
+--     [C declaration]: @SDL_GetJoystickGUIDForID@, defined at @SDL3\/SDL_joystick.h 301:38@
+sDL_GetJoystickGUIDForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+sDL_GetJoystickGUIDForID =
+  \instance_id0 ->
+    BG.allocaAndPeek
+      ( \res1 ->
+          hs_bindgen_f9a989144ab124be instance_id0 res1
+      )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickVendorForID@
+foreign import ccall safe "hs_bindgen_eadbde2ef191eb5b"
+  hs_bindgen_eadbde2ef191eb5b_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickVendorForID@
+hs_bindgen_eadbde2ef191eb5b
+  :: SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_eadbde2ef191eb5b =
+  BG.fromFFIType hs_bindgen_eadbde2ef191eb5b_base
+
+-- | Get the USB vendor ID of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickVendor', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickVendorForID@, defined at @SDL3\/SDL_joystick.h 320:36@
+sDL_GetJoystickVendorForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickVendorForID =
+  hs_bindgen_eadbde2ef191eb5b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickProductForID@
+foreign import ccall safe "hs_bindgen_bb593396127cd149"
+  hs_bindgen_bb593396127cd149_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickProductForID@
+hs_bindgen_bb593396127cd149
+  :: SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_bb593396127cd149 =
+  BG.fromFFIType hs_bindgen_bb593396127cd149_base
+
+-- | Get the USB product ID of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProduct', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickProductForID@, defined at @SDL3\/SDL_joystick.h 339:36@
+sDL_GetJoystickProductForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickProductForID =
+  hs_bindgen_bb593396127cd149
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickProductVersionForID@
+foreign import ccall safe "hs_bindgen_44e1a599dadd0805"
+  hs_bindgen_44e1a599dadd0805_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickProductVersionForID@
+hs_bindgen_44e1a599dadd0805
+  :: SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_44e1a599dadd0805 =
+  BG.fromFFIType hs_bindgen_44e1a599dadd0805_base
+
+-- | Get the product version of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProductVersion', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickProductVersionForID@, defined at @SDL3\/SDL_joystick.h 358:36@
+sDL_GetJoystickProductVersionForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickProductVersionForID =
+  hs_bindgen_44e1a599dadd0805
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickTypeForID@
+foreign import ccall safe "hs_bindgen_336781da50ffa73f"
+  hs_bindgen_336781da50ffa73f_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickTypeForID@
+hs_bindgen_336781da50ffa73f
+  :: SDL_JoystickID
+  -> IO SDL_JoystickType
+hs_bindgen_336781da50ffa73f =
+  BG.fromFFIType hs_bindgen_336781da50ffa73f_base
+
+-- | Get the type of a joystick, if available.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the 'SDL_JoystickType' of the selected joystick. If called with an invalid instance_id, this function returns @SDL_JOYSTICK_TYPE_UNKNOWN@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickType', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickTypeForID@, defined at @SDL3\/SDL_joystick.h 377:46@
+sDL_GetJoystickTypeForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_JoystickType
+sDL_GetJoystickTypeForID =
+  hs_bindgen_336781da50ffa73f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_OpenJoystick@
+foreign import ccall safe "hs_bindgen_a95f6ee451f3128f"
+  hs_bindgen_a95f6ee451f3128f_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_OpenJoystick@
+hs_bindgen_a95f6ee451f3128f
+  :: SDL_JoystickID
+  -> IO (BG.Ptr SDL_Joystick)
+hs_bindgen_a95f6ee451f3128f =
+  BG.fromFFIType hs_bindgen_a95f6ee451f3128f_base
+
+-- | Open a joystick for use.
+--
+--     The joystick subsystem must be initialized before a joystick can be opened for use.
+--
+--     [Returns]: a joystick identifier or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseJoystick'
+--
+--     [C declaration]: @SDL_OpenJoystick@, defined at @SDL3\/SDL_joystick.h 395:44@
+sDL_OpenJoystick
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr SDL_Joystick)
+sDL_OpenJoystick = hs_bindgen_a95f6ee451f3128f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickFromID@
+foreign import ccall safe "hs_bindgen_8b8e060d989b32c5"
+  hs_bindgen_8b8e060d989b32c5_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickFromID@
+hs_bindgen_8b8e060d989b32c5
+  :: SDL_JoystickID
+  -> IO (BG.Ptr SDL_Joystick)
+hs_bindgen_8b8e060d989b32c5 =
+  BG.fromFFIType hs_bindgen_8b8e060d989b32c5_base
+
+-- | Get the 'SDL_Joystick' associated with an instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Joystick' on success or NULL on failure or if it hasn\'t been opened yet; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickFromID@, defined at @SDL3\/SDL_joystick.h 408:44@
+sDL_GetJoystickFromID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the instance ID to get the 'SDL_Joystick' for.
+  -> IO (BG.Ptr SDL_Joystick)
+sDL_GetJoystickFromID = hs_bindgen_8b8e060d989b32c5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickFromPlayerIndex@
+foreign import ccall safe "hs_bindgen_435b2937a9d773b0"
+  hs_bindgen_435b2937a9d773b0_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickFromPlayerIndex@
+hs_bindgen_435b2937a9d773b0
+  :: BG.CInt
+  -> IO (BG.Ptr SDL_Joystick)
+hs_bindgen_435b2937a9d773b0 =
+  BG.fromFFIType hs_bindgen_435b2937a9d773b0_base
+
+-- | Get the 'SDL_Joystick' associated with a player index.
+--
+--     [Returns]: an 'SDL_Joystick' on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPlayerIndex', 'sDL_SetJoystickPlayerIndex'
+--
+--     [C declaration]: @SDL_GetJoystickFromPlayerIndex@, defined at @SDL3\/SDL_joystick.h 424:44@
+sDL_GetJoystickFromPlayerIndex
+  :: BG.CInt
+  -- ^
+  --
+  --           [@player_index@]: the player index to get the 'SDL_Joystick' for.
+  -> IO (BG.Ptr SDL_Joystick)
+sDL_GetJoystickFromPlayerIndex =
+  hs_bindgen_435b2937a9d773b0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_AttachVirtualJoystick@
+foreign import ccall safe "hs_bindgen_9b992b621bc9d228"
+  hs_bindgen_9b992b621bc9d228_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_AttachVirtualJoystick@
+hs_bindgen_9b992b621bc9d228
+  :: PtrConst.PtrConst SDL_VirtualJoystickDesc
+  -> IO SDL_JoystickID
+hs_bindgen_9b992b621bc9d228 =
+  BG.fromFFIType hs_bindgen_9b992b621bc9d228_base
+
+-- | Attach a new virtual joystick.
+--
+--     Apps can create virtual joysticks, that exist without hardware directly backing them, and have program-supplied inputs. Once attached, a virtual joystick looks like any other joystick that SDL can access. These can be used to make other things look like joysticks, or provide pre-recorded input, etc.
+--
+--     Once attached, the app can send joystick inputs to the new virtual joystick using @SDL_SetJoystickVirtualAxis()@, etc.
+--
+--     When no longer needed, the virtual joystick can be removed by calling @SDL_DetachVirtualJoystick()@.
+--
+--     [Returns]: the joystick instance ID, or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DetachVirtualJoystick', 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_AttachVirtualJoystick@, defined at @SDL3\/SDL_joystick.h 539:44@
+sDL_AttachVirtualJoystick
+  :: PtrConst.PtrConst SDL_VirtualJoystickDesc
+  -- ^
+  --
+  --           [@desc@]: joystick description, initialized using SDL_INIT_INTERFACE().
+  -> IO SDL_JoystickID
+sDL_AttachVirtualJoystick =
+  hs_bindgen_9b992b621bc9d228
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_DetachVirtualJoystick@
+foreign import ccall safe "hs_bindgen_95f96ae58c7060c5"
+  hs_bindgen_95f96ae58c7060c5_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_DetachVirtualJoystick@
+hs_bindgen_95f96ae58c7060c5
+  :: SDL_JoystickID
+  -> IO BG.CBool
+hs_bindgen_95f96ae58c7060c5 =
+  BG.fromFFIType hs_bindgen_95f96ae58c7060c5_base
+
+-- | Detach a virtual joystick.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AttachVirtualJoystick'
+--
+--     [C declaration]: @SDL_DetachVirtualJoystick@, defined at @SDL3\/SDL_joystick.h 555:34@
+sDL_DetachVirtualJoystick
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID, previously returned from @SDL_AttachVirtualJoystick()@.
+  -> IO BG.CBool
+sDL_DetachVirtualJoystick =
+  hs_bindgen_95f96ae58c7060c5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_IsJoystickVirtual@
+foreign import ccall safe "hs_bindgen_b4d6fc0d358b2610"
+  hs_bindgen_b4d6fc0d358b2610_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_IsJoystickVirtual@
+hs_bindgen_b4d6fc0d358b2610
+  :: SDL_JoystickID
+  -> IO BG.CBool
+hs_bindgen_b4d6fc0d358b2610 =
+  BG.fromFFIType hs_bindgen_b4d6fc0d358b2610_base
+
+-- | Query whether or not a joystick is virtual.
+--
+--     [Returns]: true if the joystick is virtual, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsJoystickVirtual@, defined at @SDL3\/SDL_joystick.h 567:34@
+sDL_IsJoystickVirtual
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.CBool
+sDL_IsJoystickVirtual = hs_bindgen_b4d6fc0d358b2610
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickVirtualAxis@
+foreign import ccall safe "hs_bindgen_950280d1c0af9b76"
+  hs_bindgen_950280d1c0af9b76_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickVirtualAxis@
+hs_bindgen_950280d1c0af9b76
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_950280d1c0af9b76 =
+  BG.fromFFIType hs_bindgen_950280d1c0af9b76_base
+
+-- | Set the state of an axis on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     Note that when sending trigger axes, you should scale the value to the full range of Sint16. For example, a trigger at rest would have the value of @'sDL_JOYSTICK_AXIS_MIN'@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualAxis@, defined at @SDL3\/SDL_joystick.h 598:34@
+sDL_SetJoystickVirtualAxis
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@axis@]: the index of the axis on the virtual joystick to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: the new value for the specified axis.
+  -> IO BG.CBool
+sDL_SetJoystickVirtualAxis =
+  hs_bindgen_950280d1c0af9b76
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickVirtualBall@
+foreign import ccall safe "hs_bindgen_ebe45871302400bf"
+  hs_bindgen_ebe45871302400bf_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int16
+    -> BG.Int16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickVirtualBall@
+hs_bindgen_ebe45871302400bf
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_ebe45871302400bf =
+  BG.fromFFIType hs_bindgen_ebe45871302400bf_base
+
+-- | Generate ball motion on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualBall@, defined at @SDL3\/SDL_joystick.h 626:34@
+sDL_SetJoystickVirtualBall
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@ball@]: the index of the ball on the virtual joystick to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@xrel@]: the relative motion on the X axis.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@yrel@]: the relative motion on the Y axis.
+  -> IO BG.CBool
+sDL_SetJoystickVirtualBall =
+  hs_bindgen_ebe45871302400bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickVirtualButton@
+foreign import ccall safe "hs_bindgen_943b4ea8f02f7dfb"
+  hs_bindgen_943b4ea8f02f7dfb_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickVirtualButton@
+hs_bindgen_943b4ea8f02f7dfb
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_943b4ea8f02f7dfb =
+  BG.fromFFIType hs_bindgen_943b4ea8f02f7dfb_base
+
+-- | Set the state of a button on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualButton@, defined at @SDL3\/SDL_joystick.h 653:34@
+sDL_SetJoystickVirtualButton
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@button@]: the index of the button on the virtual joystick to update.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@down@]: true if the button is pressed, false otherwise.
+  -> IO BG.CBool
+sDL_SetJoystickVirtualButton =
+  hs_bindgen_943b4ea8f02f7dfb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickVirtualHat@
+foreign import ccall safe "hs_bindgen_466a950a48c1bafe"
+  hs_bindgen_466a950a48c1bafe_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickVirtualHat@
+hs_bindgen_466a950a48c1bafe
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_466a950a48c1bafe =
+  BG.fromFFIType hs_bindgen_466a950a48c1bafe_base
+
+-- | Set the state of a hat on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualHat@, defined at @SDL3\/SDL_joystick.h 680:34@
+sDL_SetJoystickVirtualHat
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hat@]: the index of the hat on the virtual joystick to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@value@]: the new value for the specified hat.
+  -> IO BG.CBool
+sDL_SetJoystickVirtualHat =
+  hs_bindgen_466a950a48c1bafe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickVirtualTouchpad@
+foreign import ccall safe "hs_bindgen_520069e80ffda161"
+  hs_bindgen_520069e80ffda161_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word8
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickVirtualTouchpad@
+hs_bindgen_520069e80ffda161
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CBool
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_520069e80ffda161 =
+  BG.fromFFIType hs_bindgen_520069e80ffda161_base
+
+-- | Set touchpad finger state on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualTouchpad@, defined at @SDL3\/SDL_joystick.h 714:34@
+sDL_SetJoystickVirtualTouchpad
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@touchpad@]: the index of the touchpad on the virtual joystick to update.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@finger@]: the index of the finger on the touchpad to set.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@down@]: true if the finger is pressed, false if the finger is released.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the finger on the touchpad, normalized 0 to 1, with the origin in the upper left.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the finger on the touchpad, normalized 0 to 1, with the origin in the upper left.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@pressure@]: the pressure of the finger.
+  -> IO BG.CBool
+sDL_SetJoystickVirtualTouchpad =
+  hs_bindgen_520069e80ffda161
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SendJoystickVirtualSensorData@
+foreign import ccall safe "hs_bindgen_502da6838ce8a4f8"
+  hs_bindgen_502da6838ce8a4f8_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SendJoystickVirtualSensorData@
+hs_bindgen_502da6838ce8a4f8
+  :: BG.Ptr SDL_Joystick
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> PtrConst.PtrConst BG.CFloat
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_502da6838ce8a4f8 =
+  BG.fromFFIType hs_bindgen_502da6838ce8a4f8_base
+
+-- | Send a sensor update for an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad'
+--
+--     [C declaration]: @SDL_SendJoystickVirtualSensorData@, defined at @SDL3\/SDL_joystick.h 744:34@
+sDL_SendJoystickVirtualSensorData
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of the sensor on the virtual joystick to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@sensor_timestamp@]: a 64-bit timestamp in nanoseconds associated with the sensor reading.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@data@]: the data associated with the sensor reading.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_values@]: the number of values pointed to by @data@.
+  -> IO BG.CBool
+sDL_SendJoystickVirtualSensorData =
+  hs_bindgen_502da6838ce8a4f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickProperties@
+foreign import ccall safe "hs_bindgen_0e41310a58070b5c"
+  hs_bindgen_0e41310a58070b5c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickProperties@
+hs_bindgen_0e41310a58070b5c
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_0e41310a58070b5c =
+  BG.fromFFIType hs_bindgen_0e41310a58070b5c_base
+
+-- | Get the properties associated with a joystick.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN'@: true if this joystick has an LED that has adjustable brightness
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN'@: true if this joystick has an LED that has adjustable color
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN'@: true if this joystick has a player LED
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN'@: true if this joystick has left\/right rumble
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN'@: true if this joystick has simple trigger rumble
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickProperties@, defined at @SDL3\/SDL_joystick.h 770:46@
+sDL_GetJoystickProperties
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetJoystickProperties =
+  hs_bindgen_0e41310a58070b5c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickName@
+foreign import ccall safe "hs_bindgen_a9e087059d7ddd66"
+  hs_bindgen_a9e087059d7ddd66_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickName@
+hs_bindgen_a9e087059d7ddd66
+  :: BG.Ptr SDL_Joystick
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_a9e087059d7ddd66 =
+  BG.fromFFIType hs_bindgen_a9e087059d7ddd66_base
+
+-- | Get the implementation dependent name of a joystick.
+--
+--     [Returns]: the name of the selected joystick. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickNameForID'
+--
+--     [C declaration]: @SDL_GetJoystickName@, defined at @SDL3\/SDL_joystick.h 791:42@
+sDL_GetJoystickName
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetJoystickName = hs_bindgen_a9e087059d7ddd66
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickPath@
+foreign import ccall safe "hs_bindgen_33ba12816518ab07"
+  hs_bindgen_33ba12816518ab07_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickPath@
+hs_bindgen_33ba12816518ab07
+  :: BG.Ptr SDL_Joystick
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_33ba12816518ab07 =
+  BG.fromFFIType hs_bindgen_33ba12816518ab07_base
+
+-- | Get the implementation dependent path of a joystick.
+--
+--     [Returns]: the path of the selected joystick. If no path can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPathForID'
+--
+--     [C declaration]: @SDL_GetJoystickPath@, defined at @SDL3\/SDL_joystick.h 806:42@
+sDL_GetJoystickPath
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetJoystickPath = hs_bindgen_33ba12816518ab07
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickPlayerIndex@
+foreign import ccall safe "hs_bindgen_3f3bef7e45cb79c2"
+  hs_bindgen_3f3bef7e45cb79c2_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickPlayerIndex@
+hs_bindgen_3f3bef7e45cb79c2
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CInt
+hs_bindgen_3f3bef7e45cb79c2 =
+  BG.fromFFIType hs_bindgen_3f3bef7e45cb79c2_base
+
+-- | Get the player index of an opened joystick.
+--
+--     For XInput controllers this returns the XInput user index. Many joysticks will not be able to supply this information.
+--
+--     [Returns]: the player index, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickPlayerIndex'
+--
+--     [C declaration]: @SDL_GetJoystickPlayerIndex@, defined at @SDL3\/SDL_joystick.h 823:33@
+sDL_GetJoystickPlayerIndex
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO BG.CInt
+sDL_GetJoystickPlayerIndex =
+  hs_bindgen_3f3bef7e45cb79c2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickPlayerIndex@
+foreign import ccall safe "hs_bindgen_24bf75158e208f66"
+  hs_bindgen_24bf75158e208f66_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickPlayerIndex@
+hs_bindgen_24bf75158e208f66
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_24bf75158e208f66 =
+  BG.fromFFIType hs_bindgen_24bf75158e208f66_base
+
+-- | Set the player index of an opened joystick.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPlayerIndex'
+--
+--     [C declaration]: @SDL_SetJoystickPlayerIndex@, defined at @SDL3\/SDL_joystick.h 840:34@
+sDL_SetJoystickPlayerIndex
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@player_index@]: player index to assign to this joystick, or -1 to clear the player index and turn off player LEDs.
+  -> IO BG.CBool
+sDL_SetJoystickPlayerIndex =
+  hs_bindgen_24bf75158e208f66
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickGUID@
+foreign import ccall safe "hs_bindgen_9d48edfe80deea21"
+  hs_bindgen_9d48edfe80deea21_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickGUID@
+hs_bindgen_9d48edfe80deea21
+  :: BG.Ptr SDL_Joystick
+  -> BG.Ptr SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -> IO ()
+hs_bindgen_9d48edfe80deea21 =
+  BG.fromFFIType hs_bindgen_9d48edfe80deea21_base
+
+-- | Get the implementation-dependent GUID for the joystick.
+--
+--     This function requires an open joystick.
+--
+--     [Returns]: the GUID of the given joystick. If called on an invalid index, this function returns a zero GUID; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickGUIDForID', SDL_GUIDToString
+--
+--     [C declaration]: @SDL_GetJoystickGUID@, defined at @SDL3\/SDL_joystick.h 859:38@
+sDL_GetJoystickGUID
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+sDL_GetJoystickGUID =
+  \joystick0 ->
+    BG.allocaAndPeek
+      ( \res1 ->
+          hs_bindgen_9d48edfe80deea21 joystick0 res1
+      )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickVendor@
+foreign import ccall safe "hs_bindgen_58e23abd1321767d"
+  hs_bindgen_58e23abd1321767d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickVendor@
+hs_bindgen_58e23abd1321767d
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_58e23abd1321767d =
+  BG.fromFFIType hs_bindgen_58e23abd1321767d_base
+
+-- | Get the USB vendor ID of an opened joystick, if available.
+--
+--     If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickVendorForID'
+--
+--     [C declaration]: @SDL_GetJoystickVendor@, defined at @SDL3\/SDL_joystick.h 875:36@
+sDL_GetJoystickVendor
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickVendor = hs_bindgen_58e23abd1321767d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickProduct@
+foreign import ccall safe "hs_bindgen_a1a810fac491b03c"
+  hs_bindgen_a1a810fac491b03c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickProduct@
+hs_bindgen_a1a810fac491b03c
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_a1a810fac491b03c =
+  BG.fromFFIType hs_bindgen_a1a810fac491b03c_base
+
+-- | Get the USB product ID of an opened joystick, if available.
+--
+--     If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProductForID'
+--
+--     [C declaration]: @SDL_GetJoystickProduct@, defined at @SDL3\/SDL_joystick.h 891:36@
+sDL_GetJoystickProduct
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickProduct = hs_bindgen_a1a810fac491b03c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickProductVersion@
+foreign import ccall safe "hs_bindgen_ffcb72c6f02c76c7"
+  hs_bindgen_ffcb72c6f02c76c7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickProductVersion@
+hs_bindgen_ffcb72c6f02c76c7
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_ffcb72c6f02c76c7 =
+  BG.fromFFIType hs_bindgen_ffcb72c6f02c76c7_base
+
+-- | Get the product version of an opened joystick, if available.
+--
+--     If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProductVersionForID'
+--
+--     [C declaration]: @SDL_GetJoystickProductVersion@, defined at @SDL3\/SDL_joystick.h 907:36@
+sDL_GetJoystickProductVersion
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickProductVersion =
+  hs_bindgen_ffcb72c6f02c76c7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickFirmwareVersion@
+foreign import ccall safe "hs_bindgen_990e53211d186662"
+  hs_bindgen_990e53211d186662_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickFirmwareVersion@
+hs_bindgen_990e53211d186662
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_990e53211d186662 =
+  BG.fromFFIType hs_bindgen_990e53211d186662_base
+
+-- | Get the firmware version of an opened joystick, if available.
+--
+--     If the firmware version isn\'t available this function returns 0.
+--
+--     [Returns]: the firmware version of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickFirmwareVersion@, defined at @SDL3\/SDL_joystick.h 922:36@
+sDL_GetJoystickFirmwareVersion
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickFirmwareVersion =
+  hs_bindgen_990e53211d186662
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickSerial@
+foreign import ccall safe "hs_bindgen_b1bfb007ec57169c"
+  hs_bindgen_b1bfb007ec57169c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickSerial@
+hs_bindgen_b1bfb007ec57169c
+  :: BG.Ptr SDL_Joystick
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_b1bfb007ec57169c =
+  BG.fromFFIType hs_bindgen_b1bfb007ec57169c_base
+
+-- | Get the serial number of an opened joystick, if available.
+--
+--     Returns the serial number of the joystick, or NULL if it is not available.
+--
+--     [Returns]: the serial number of the selected joystick, or NULL if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickSerial@, defined at @SDL3\/SDL_joystick.h 937:42@
+sDL_GetJoystickSerial
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetJoystickSerial = hs_bindgen_b1bfb007ec57169c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickType@
+foreign import ccall safe "hs_bindgen_4bbfdbe521ae4448"
+  hs_bindgen_4bbfdbe521ae4448_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickType@
+hs_bindgen_4bbfdbe521ae4448
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL_JoystickType
+hs_bindgen_4bbfdbe521ae4448 =
+  BG.fromFFIType hs_bindgen_4bbfdbe521ae4448_base
+
+-- | Get the type of an opened joystick.
+--
+--     [Returns]: the 'SDL_JoystickType' of the selected joystick.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickTypeForID'
+--
+--     [C declaration]: @SDL_GetJoystickType@, defined at @SDL3\/SDL_joystick.h 951:46@
+sDL_GetJoystickType
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL_JoystickType
+sDL_GetJoystickType = hs_bindgen_4bbfdbe521ae4448
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickGUIDInfo@
+foreign import ccall safe "hs_bindgen_ac4457e1668303cb"
+  hs_bindgen_ac4457e1668303cb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickGUIDInfo@
+hs_bindgen_ac4457e1668303cb
+  :: BG.Ptr SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> IO ()
+hs_bindgen_ac4457e1668303cb =
+  BG.fromFFIType hs_bindgen_ac4457e1668303cb_base
+
+-- | Get the device information encoded in a SDL_GUID structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickGUIDForID'
+--
+--     [C declaration]: @SDL_GetJoystickGUIDInfo@, defined at @SDL3\/SDL_joystick.h 972:34@
+sDL_GetJoystickGUIDInfo
+  :: SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: the SDL_GUID you wish to get info about.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@vendor@]: a pointer filled in with the device VID, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@product@]: a pointer filled in with the device PID, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@version@]: a pointer filled in with the device version, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@crc16@]: a pointer filled in with a CRC used to distinguish different products with the same VID\/PID, or 0 if not available.
+  -> IO ()
+sDL_GetJoystickGUIDInfo =
+  \guid0 ->
+    \vendor1 ->
+      \product2 ->
+        \version3 ->
+          \crc164 ->
+            BG.with
+              guid0
+              ( \guid5 ->
+                  hs_bindgen_ac4457e1668303cb guid5 vendor1 product2 version3 crc164
+              )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_JoystickConnected@
+foreign import ccall safe "hs_bindgen_fd1547f6643cd55d"
+  hs_bindgen_fd1547f6643cd55d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_JoystickConnected@
+hs_bindgen_fd1547f6643cd55d
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CBool
+hs_bindgen_fd1547f6643cd55d =
+  BG.fromFFIType hs_bindgen_fd1547f6643cd55d_base
+
+-- | Get the status of a specified joystick.
+--
+--     [Returns]: true if the joystick has been opened, false if it has not; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_JoystickConnected@, defined at @SDL3\/SDL_joystick.h 985:34@
+sDL_JoystickConnected
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> IO BG.CBool
+sDL_JoystickConnected = hs_bindgen_fd1547f6643cd55d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickID@
+foreign import ccall safe "hs_bindgen_e792f601776227ad"
+  hs_bindgen_e792f601776227ad_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickID@
+hs_bindgen_e792f601776227ad
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL_JoystickID
+hs_bindgen_e792f601776227ad =
+  BG.fromFFIType hs_bindgen_e792f601776227ad_base
+
+-- | Get the instance ID of an opened joystick.
+--
+--     [Returns]: the instance ID of the specified joystick on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickID@, defined at @SDL3\/SDL_joystick.h 998:44@
+sDL_GetJoystickID
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO SDL_JoystickID
+sDL_GetJoystickID = hs_bindgen_e792f601776227ad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetNumJoystickAxes@
+foreign import ccall safe "hs_bindgen_eb5cf1b5a80cb490"
+  hs_bindgen_eb5cf1b5a80cb490_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetNumJoystickAxes@
+hs_bindgen_eb5cf1b5a80cb490
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CInt
+hs_bindgen_eb5cf1b5a80cb490 =
+  BG.fromFFIType hs_bindgen_eb5cf1b5a80cb490_base
+
+-- | Get the number of general axis controls on a joystick.
+--
+--     Often, the directional pad on a game controller will either look like 4 separate buttons or a POV hat, and not axes, but all of this is up to the device and platform.
+--
+--     [Returns]: the number of axis controls\/number of axes on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickAxis', 'sDL_GetNumJoystickBalls', 'sDL_GetNumJoystickButtons', 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetNumJoystickAxes@, defined at @SDL3\/SDL_joystick.h 1020:33@
+sDL_GetNumJoystickAxes
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.CInt
+sDL_GetNumJoystickAxes = hs_bindgen_eb5cf1b5a80cb490
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetNumJoystickBalls@
+foreign import ccall safe "hs_bindgen_e856e95bf561b58f"
+  hs_bindgen_e856e95bf561b58f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetNumJoystickBalls@
+hs_bindgen_e856e95bf561b58f
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CInt
+hs_bindgen_e856e95bf561b58f =
+  BG.fromFFIType hs_bindgen_e856e95bf561b58f_base
+
+-- | Get the number of trackballs on a joystick.
+--
+--     Joystick trackballs have only relative motion events associated with them and their state cannot be polled.
+--
+--     Most joysticks do not have trackballs.
+--
+--     [Returns]: the number of trackballs on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickBall', 'sDL_GetNumJoystickAxes', 'sDL_GetNumJoystickButtons', 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetNumJoystickBalls@, defined at @SDL3\/SDL_joystick.h 1043:33@
+sDL_GetNumJoystickBalls
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.CInt
+sDL_GetNumJoystickBalls = hs_bindgen_e856e95bf561b58f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetNumJoystickHats@
+foreign import ccall safe "hs_bindgen_14f7806c41b802cb"
+  hs_bindgen_14f7806c41b802cb_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetNumJoystickHats@
+hs_bindgen_14f7806c41b802cb
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CInt
+hs_bindgen_14f7806c41b802cb =
+  BG.fromFFIType hs_bindgen_14f7806c41b802cb_base
+
+-- | Get the number of POV hats on a joystick.
+--
+--     [Returns]: the number of POV hats on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickHat', 'sDL_GetNumJoystickAxes', 'sDL_GetNumJoystickBalls', 'sDL_GetNumJoystickButtons'
+--
+--     [C declaration]: @SDL_GetNumJoystickHats@, defined at @SDL3\/SDL_joystick.h 1061:33@
+sDL_GetNumJoystickHats
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.CInt
+sDL_GetNumJoystickHats = hs_bindgen_14f7806c41b802cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetNumJoystickButtons@
+foreign import ccall safe "hs_bindgen_737397e3a398beb9"
+  hs_bindgen_737397e3a398beb9_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetNumJoystickButtons@
+hs_bindgen_737397e3a398beb9
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CInt
+hs_bindgen_737397e3a398beb9 =
+  BG.fromFFIType hs_bindgen_737397e3a398beb9_base
+
+-- | Get the number of buttons on a joystick.
+--
+--     [Returns]: the number of buttons on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickButton', 'sDL_GetNumJoystickAxes', 'sDL_GetNumJoystickBalls', 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetNumJoystickButtons@, defined at @SDL3\/SDL_joystick.h 1079:33@
+sDL_GetNumJoystickButtons
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.CInt
+sDL_GetNumJoystickButtons =
+  hs_bindgen_737397e3a398beb9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickEventsEnabled@
+foreign import ccall safe "hs_bindgen_ed51a1754ff9d6c7"
+  hs_bindgen_ed51a1754ff9d6c7_base
+    :: BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickEventsEnabled@
+hs_bindgen_ed51a1754ff9d6c7
+  :: BG.CBool
+  -> IO ()
+hs_bindgen_ed51a1754ff9d6c7 =
+  BG.fromFFIType hs_bindgen_ed51a1754ff9d6c7_base
+
+-- | Set the state of joystick event processing.
+--
+--     If joystick events are disabled, you must call @SDL_UpdateJoysticks()@ yourself and check the state of the joystick when you want joystick information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_JoystickEventsEnabled', 'sDL_UpdateJoysticks'
+--
+--     [C declaration]: @SDL_SetJoystickEventsEnabled@, defined at @SDL3\/SDL_joystick.h 1097:34@
+sDL_SetJoystickEventsEnabled
+  :: BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: whether to process joystick events or not.
+  -> IO ()
+sDL_SetJoystickEventsEnabled =
+  hs_bindgen_ed51a1754ff9d6c7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_JoystickEventsEnabled@
+foreign import ccall safe "hs_bindgen_86ece04390ea5953"
+  hs_bindgen_86ece04390ea5953_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_JoystickEventsEnabled@
+hs_bindgen_86ece04390ea5953 :: IO BG.CBool
+hs_bindgen_86ece04390ea5953 =
+  BG.fromFFIType hs_bindgen_86ece04390ea5953_base
+
+-- | Query the state of joystick event processing.
+--
+--     If joystick events are disabled, you must call @SDL_UpdateJoysticks()@ yourself and check the state of the joystick when you want joystick information.
+--
+--     [Returns]: true if joystick events are being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickEventsEnabled'
+--
+--     [C declaration]: @SDL_JoystickEventsEnabled@, defined at @SDL3\/SDL_joystick.h 1114:34@
+sDL_JoystickEventsEnabled :: IO BG.CBool
+sDL_JoystickEventsEnabled =
+  hs_bindgen_86ece04390ea5953
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_UpdateJoysticks@
+foreign import ccall safe "hs_bindgen_277bf35db967cb76"
+  hs_bindgen_277bf35db967cb76_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_UpdateJoysticks@
+hs_bindgen_277bf35db967cb76 :: IO ()
+hs_bindgen_277bf35db967cb76 =
+  BG.fromFFIType hs_bindgen_277bf35db967cb76_base
+
+-- | Update the current state of the open joysticks.
+--
+--     This is called automatically by the event loop if any joystick events are enabled.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateJoysticks@, defined at @SDL3\/SDL_joystick.h 1126:34@
+sDL_UpdateJoysticks :: IO ()
+sDL_UpdateJoysticks = hs_bindgen_277bf35db967cb76
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickAxis@
+foreign import ccall safe "hs_bindgen_5ffa383d290b6a82"
+  hs_bindgen_5ffa383d290b6a82_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickAxis@
+hs_bindgen_5ffa383d290b6a82
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint16
+hs_bindgen_5ffa383d290b6a82 =
+  BG.fromFFIType hs_bindgen_5ffa383d290b6a82_base
+
+-- | Get the current state of an axis control on a joystick.
+--
+--     SDL makes no promises about what part of the joystick any given axis refers to. Your game should have some sort of configuration UI to let users specify what each axis should be bound to. Alternately, SDL\'s higher-level Game Controller API makes a great effort to apply order to this lower-level interface, so you know that a specific axis is the \"left thumb stick,\" etc.
+--
+--     The value returned by @SDL_GetJoystickAxis()@ is a signed integer (-32768 to 32767) representing the current position of the axis. It may be necessary to impose certain tolerances on these values to account for jitter.
+--
+--     [Returns]: a 16-bit signed integer representing the current position of the axis or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickAxes'
+--
+--     [C declaration]: @SDL_GetJoystickAxis@, defined at @SDL3\/SDL_joystick.h 1152:36@
+sDL_GetJoystickAxis
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@axis@]: the axis to query; the axis indices start at index 0.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint16
+sDL_GetJoystickAxis = hs_bindgen_5ffa383d290b6a82
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickAxisInitialState@
+foreign import ccall safe "hs_bindgen_427de097dfec8d31"
+  hs_bindgen_427de097dfec8d31_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickAxisInitialState@
+hs_bindgen_427de097dfec8d31
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_427de097dfec8d31 =
+  BG.fromFFIType hs_bindgen_427de097dfec8d31_base
+
+-- | Get the initial state of an axis control on a joystick.
+--
+--     The state is a value ranging from -32768 to 32767.
+--
+--     The axis indices start at index 0.
+--
+--     [Returns]: true if this axis has any initial value, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickAxisInitialState@, defined at @SDL3\/SDL_joystick.h 1170:34@
+sDL_GetJoystickAxisInitialState
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@axis@]: the axis to query; the axis indices start at index 0.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@state@]: upon return, the initial value is supplied here.
+  -> IO BG.CBool
+sDL_GetJoystickAxisInitialState =
+  hs_bindgen_427de097dfec8d31
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickBall@
+foreign import ccall safe "hs_bindgen_aee21b71d3004e03"
+  hs_bindgen_aee21b71d3004e03_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickBall@
+hs_bindgen_aee21b71d3004e03
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_aee21b71d3004e03 =
+  BG.fromFFIType hs_bindgen_aee21b71d3004e03_base
+
+-- | Get the ball axis change since the last poll.
+--
+--     Trackballs can only return relative motion since the last call to @SDL_GetJoystickBall()@, these motion deltas are placed into @dx@ and @dy@.
+--
+--     Most joysticks do not have trackballs.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickBalls'
+--
+--     [C declaration]: @SDL_GetJoystickBall@, defined at @SDL3\/SDL_joystick.h 1193:34@
+sDL_GetJoystickBall
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' to query.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@ball@]: the ball index to query; ball indices start at index 0.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dx@]: stores the difference in the x axis position since the last poll.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dy@]: stores the difference in the y axis position since the last poll.
+  -> IO BG.CBool
+sDL_GetJoystickBall = hs_bindgen_aee21b71d3004e03
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickHat@
+foreign import ccall safe "hs_bindgen_03a81f7b52479c1f"
+  hs_bindgen_03a81f7b52479c1f_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickHat@
+hs_bindgen_03a81f7b52479c1f
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint8
+hs_bindgen_03a81f7b52479c1f =
+  BG.fromFFIType hs_bindgen_03a81f7b52479c1f_base
+
+-- | Get the current state of a POV hat on a joystick.
+--
+--     The returned value will be one of the @SDL_HAT_*@ values.
+--
+--     [Returns]: the current hat position.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetJoystickHat@, defined at @SDL3\/SDL_joystick.h 1210:35@
+sDL_GetJoystickHat
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hat@]: the hat index to get the state from; indices start at index 0.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint8
+sDL_GetJoystickHat = hs_bindgen_03a81f7b52479c1f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickButton@
+foreign import ccall safe "hs_bindgen_066ace0739b36572"
+  hs_bindgen_066ace0739b36572_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickButton@
+hs_bindgen_066ace0739b36572
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_066ace0739b36572 =
+  BG.fromFFIType hs_bindgen_066ace0739b36572_base
+
+-- | Get the current state of a button on a joystick.
+--
+--     [Returns]: true if the button is pressed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickButtons'
+--
+--     [C declaration]: @SDL_GetJoystickButton@, defined at @SDL3\/SDL_joystick.h 1236:34@
+sDL_GetJoystickButton
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@button@]: the button index to get the state from; indices start at index 0.
+  -> IO BG.CBool
+sDL_GetJoystickButton = hs_bindgen_066ace0739b36572
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_RumbleJoystick@
+foreign import ccall safe "hs_bindgen_7e8a72caa95f2c2b"
+  hs_bindgen_7e8a72caa95f2c2b_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> BG.Word16
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_RumbleJoystick@
+hs_bindgen_7e8a72caa95f2c2b
+  :: BG.Ptr SDL_Joystick
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_7e8a72caa95f2c2b =
+  BG.fromFFIType hs_bindgen_7e8a72caa95f2c2b_base
+
+-- | Start a rumble effect.
+--
+--     Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     This function requires you to process SDL events or call @SDL_UpdateJoysticks()@ to update rumble state.
+--
+--     [Returns]: true, or false if rumble isn\'t supported on this joystick.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RumbleJoystick@, defined at @SDL3\/SDL_joystick.h 1259:34@
+sDL_RumbleJoystick
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to vibrate.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@low_frequency_rumble@]: the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@high_frequency_rumble@]: the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO BG.CBool
+sDL_RumbleJoystick = hs_bindgen_7e8a72caa95f2c2b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_RumbleJoystickTriggers@
+foreign import ccall safe "hs_bindgen_301092a71603b81a"
+  hs_bindgen_301092a71603b81a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> BG.Word16
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_RumbleJoystickTriggers@
+hs_bindgen_301092a71603b81a
+  :: BG.Ptr SDL_Joystick
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_301092a71603b81a =
+  BG.fromFFIType hs_bindgen_301092a71603b81a_base
+
+-- | Start a rumble effect in the joystick\'s triggers.
+--
+--     Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     Note that this is rumbling of the /triggers/ and not the game controller as a whole. This is currently only supported on Xbox One controllers. If you want the (more common) whole-controller rumble, use @SDL_RumbleJoystick()@ instead.
+--
+--     This function requires you to process SDL events or call @SDL_UpdateJoysticks()@ to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RumbleJoystick'
+--
+--     [C declaration]: @SDL_RumbleJoystickTriggers@, defined at @SDL3\/SDL_joystick.h 1290:34@
+sDL_RumbleJoystickTriggers
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to vibrate.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@left_rumble@]: the intensity of the left trigger rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@right_rumble@]: the intensity of the right trigger rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO BG.CBool
+sDL_RumbleJoystickTriggers =
+  hs_bindgen_301092a71603b81a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickLED@
+foreign import ccall safe "hs_bindgen_8b94c1cbb487385b"
+  hs_bindgen_8b94c1cbb487385b_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SetJoystickLED@
+hs_bindgen_8b94c1cbb487385b
+  :: BG.Ptr SDL_Joystick
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_8b94c1cbb487385b =
+  BG.fromFFIType hs_bindgen_8b94c1cbb487385b_base
+
+-- | Update a joystick\'s LED color.
+--
+--     An example of a joystick LED is the light on the back of a PlayStation 4\'s DualShock 4 controller.
+--
+--     For joysticks with a single color LED, the maximum of the RGB values will be used as the LED brightness.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetJoystickLED@, defined at @SDL3\/SDL_joystick.h 1312:34@
+sDL_SetJoystickLED
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@red@]: the intensity of the red LED.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@green@]: the intensity of the green LED.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@blue@]: the intensity of the blue LED.
+  -> IO BG.CBool
+sDL_SetJoystickLED = hs_bindgen_8b94c1cbb487385b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SendJoystickEffect@
+foreign import ccall safe "hs_bindgen_f7e59a6e5bb608fe"
+  hs_bindgen_f7e59a6e5bb608fe_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_SendJoystickEffect@
+hs_bindgen_f7e59a6e5bb608fe
+  :: BG.Ptr SDL_Joystick
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_f7e59a6e5bb608fe =
+  BG.fromFFIType hs_bindgen_f7e59a6e5bb608fe_base
+
+-- | Send a joystick specific effect packet.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SendJoystickEffect@, defined at @SDL3\/SDL_joystick.h 1327:34@
+sDL_SendJoystickEffect
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to affect.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to send to the joystick.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@size@]: the size of the data to send to the joystick.
+  -> IO BG.CBool
+sDL_SendJoystickEffect = hs_bindgen_f7e59a6e5bb608fe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_CloseJoystick@
+foreign import ccall safe "hs_bindgen_ea0c624f184dccba"
+  hs_bindgen_ea0c624f184dccba_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_CloseJoystick@
+hs_bindgen_ea0c624f184dccba
+  :: BG.Ptr SDL_Joystick
+  -> IO ()
+hs_bindgen_ea0c624f184dccba =
+  BG.fromFFIType hs_bindgen_ea0c624f184dccba_base
+
+-- | Close a joystick previously opened with @SDL_OpenJoystick()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenJoystick'
+--
+--     [C declaration]: @SDL_CloseJoystick@, defined at @SDL3\/SDL_joystick.h 1340:34@
+sDL_CloseJoystick
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick device to close.
+  -> IO ()
+sDL_CloseJoystick = hs_bindgen_ea0c624f184dccba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickConnectionState@
+foreign import ccall safe "hs_bindgen_08992afe945eb606"
+  hs_bindgen_08992afe945eb606_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickConnectionState@
+hs_bindgen_08992afe945eb606
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL_JoystickConnectionState
+hs_bindgen_08992afe945eb606 =
+  BG.fromFFIType hs_bindgen_08992afe945eb606_base
+
+-- | Get the connection state of a joystick.
+--
+--     [Returns]: the connection state on success or @SDL_JOYSTICK_CONNECTION_INVALID@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickConnectionState@, defined at @SDL3\/SDL_joystick.h 1354:57@
+sDL_GetJoystickConnectionState
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> IO SDL_JoystickConnectionState
+sDL_GetJoystickConnectionState =
+  hs_bindgen_08992afe945eb606
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickPowerInfo@
+foreign import ccall safe "hs_bindgen_8bfbd5889037e579"
+  hs_bindgen_8bfbd5889037e579_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Safe_SDL_GetJoystickPowerInfo@
+hs_bindgen_8bfbd5889037e579
+  :: BG.Ptr SDL_Joystick
+  -> BG.Ptr BG.CInt
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+hs_bindgen_8bfbd5889037e579 =
+  BG.fromFFIType hs_bindgen_8bfbd5889037e579_base
+
+-- | Get the battery state of a joystick.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     [Returns]: the current battery state or @SDL_POWERSTATE_ERROR@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickPowerInfo@, defined at @SDL3\/SDL_joystick.h 1377:44@
+sDL_GetJoystickPowerInfo
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 we can\'t determine a value or there is no battery.
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+sDL_GetJoystickPowerInfo =
+  hs_bindgen_8bfbd5889037e579
diff --git a/src/SDL3/Sys/Bindgen/Joystick/Unsafe.hs b/src/SDL3/Sys/Bindgen/Joystick/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Joystick/Unsafe.hs
@@ -0,0 +1,2662 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Joystick.Unsafe (
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_LockJoysticks,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_UnlockJoysticks,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_HasJoystick,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoysticks,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickNameForID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickPathForID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickPlayerIndexForID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickGUIDForID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickVendorForID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickProductForID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickProductVersionForID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickTypeForID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_OpenJoystick,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickFromID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickFromPlayerIndex,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_AttachVirtualJoystick,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_DetachVirtualJoystick,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_IsJoystickVirtual,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_SetJoystickVirtualAxis,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_SetJoystickVirtualBall,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_SetJoystickVirtualButton,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_SetJoystickVirtualHat,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_SetJoystickVirtualTouchpad,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_SendJoystickVirtualSensorData,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickProperties,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickName,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickPath,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickPlayerIndex,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_SetJoystickPlayerIndex,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickGUID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickVendor,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickProduct,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickProductVersion,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickFirmwareVersion,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickSerial,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickType,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickGUIDInfo,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_JoystickConnected,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickID,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetNumJoystickAxes,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetNumJoystickBalls,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetNumJoystickHats,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetNumJoystickButtons,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_SetJoystickEventsEnabled,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_JoystickEventsEnabled,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_UpdateJoysticks,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickAxis,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickAxisInitialState,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickBall,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickHat,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickButton,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_RumbleJoystick,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_RumbleJoystickTriggers,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_SetJoystickLED,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_SendJoystickEffect,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_CloseJoystick,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickConnectionState,
+  SDL3.Sys.Bindgen.Joystick.Unsafe.sDL_GetJoystickPowerInfo,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Guid qualified
+import SDL3.Sys.Bindgen.Joystick
+import SDL3.Sys.Bindgen.Power qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_joystick.h>"
+         , "void hs_bindgen_a5f9679bb55a9be2 (void)"
+         , "{"
+         , "  (SDL_LockJoysticks)();"
+         , "}"
+         , "void hs_bindgen_4fb7bf5674b81cd5 (void)"
+         , "{"
+         , "  (SDL_UnlockJoysticks)();"
+         , "}"
+         , "_Bool hs_bindgen_6974c5058c398636 (void)"
+         , "{"
+         , "  return (SDL_HasJoystick)();"
+         , "}"
+         , "SDL_JoystickID *hs_bindgen_52b14e92fdb53649 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoysticks)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_7e75165c0d2f9d72 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickNameForID)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_2161a8b12229ac30 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickPathForID)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_386a2da9898f9057 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickPlayerIndexForID)(arg1);"
+         , "}"
+         , "void hs_bindgen_bfb7bb52d70dab96 ("
+         , "  SDL_JoystickID arg1,"
+         , "  SDL_GUID *arg2"
+         , ")"
+         , "{"
+         , "  *arg2 = (SDL_GetJoystickGUIDForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_43fce2fd8176f766 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickVendorForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_942a59625bde2720 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickProductForID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_c4f2f0cc80e64773 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickProductVersionForID)(arg1);"
+         , "}"
+         , "SDL_JoystickType hs_bindgen_d95cbbc03c3eccf3 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickTypeForID)(arg1);"
+         , "}"
+         , "SDL_Joystick *hs_bindgen_96b31a30b26b761d ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenJoystick)(arg1);"
+         , "}"
+         , "SDL_Joystick *hs_bindgen_79e317a6737caef2 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickFromID)(arg1);"
+         , "}"
+         , "SDL_Joystick *hs_bindgen_533baada064a0d12 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickFromPlayerIndex)(arg1);"
+         , "}"
+         , "SDL_JoystickID hs_bindgen_f778cfec8f93ba4b ("
+         , "  SDL_VirtualJoystickDesc const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_AttachVirtualJoystick)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_b1026bd68d5bfd9e ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_DetachVirtualJoystick)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_d1c274bbe874b100 ("
+         , "  SDL_JoystickID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_IsJoystickVirtual)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8eb5e45ef7f888cc ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Sint16 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickVirtualAxis)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_2e47467a34561f41 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Sint16 arg3,"
+         , "  Sint16 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickVirtualBall)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_d61b8aa1cc7bcea2 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickVirtualButton)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_9e983d431a7b8fe6 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Uint8 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickVirtualHat)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_5bb42b2517c1eb69 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  _Bool arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickVirtualTouchpad)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_3d0650aed2d406ec ("
+         , "  SDL_Joystick *arg1,"
+         , "  SDL_SensorType arg2,"
+         , "  Uint64 arg3,"
+         , "  float const *arg4,"
+         , "  signed int arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_SendJoystickVirtualSensorData)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_7b418051f3497220 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickProperties)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_efa173428595a9f5 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickName)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_1b1b5dcb365287fd ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickPath)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_55ef8dfcc4d84345 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickPlayerIndex)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_5e98a74b28f72b8e ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickPlayerIndex)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_e5b4be9fcfc28bc3 ("
+         , "  SDL_Joystick *arg1,"
+         , "  SDL_GUID *arg2"
+         , ")"
+         , "{"
+         , "  *arg2 = (SDL_GetJoystickGUID)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_62c6fda961bf2fa9 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickVendor)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_d7e0f0c36e50f0e2 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickProduct)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_4d80e87af7618ebc ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickProductVersion)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_29a99ec3dcd0fa98 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickFirmwareVersion)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_a4795a75ac263066 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickSerial)(arg1);"
+         , "}"
+         , "SDL_JoystickType hs_bindgen_76843a2261bd1972 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickType)(arg1);"
+         , "}"
+         , "void hs_bindgen_436078b1ecf22b0d ("
+         , "  SDL_GUID *arg1,"
+         , "  Uint16 *arg2,"
+         , "  Uint16 *arg3,"
+         , "  Uint16 *arg4,"
+         , "  Uint16 *arg5"
+         , ")"
+         , "{"
+         , "  (SDL_GetJoystickGUIDInfo)(*arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_0241ed6d6117fa6f ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_JoystickConnected)(arg1);"
+         , "}"
+         , "SDL_JoystickID hs_bindgen_ca7a1f2ac4ecb56d ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickID)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_1510ba234e23c104 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumJoystickAxes)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_69d452e9cc046adb ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumJoystickBalls)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_cc24966a772d0240 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumJoystickHats)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_aeac535e5fa443a0 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumJoystickButtons)(arg1);"
+         , "}"
+         , "void hs_bindgen_4ca6ee37a9e122b5 ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SetJoystickEventsEnabled)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_fd430a3c399eb18b (void)"
+         , "{"
+         , "  return (SDL_JoystickEventsEnabled)();"
+         , "}"
+         , "void hs_bindgen_2766ee6323a0f722 (void)"
+         , "{"
+         , "  (SDL_UpdateJoysticks)();"
+         , "}"
+         , "Sint16 hs_bindgen_c16201bd08e902dc ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickAxis)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_803984b597c873b4 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  Sint16 *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickAxisInitialState)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_f564c6f917207491 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2,"
+         , "  signed int *arg3,"
+         , "  signed int *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickBall)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "Uint8 hs_bindgen_bdb3e1a3519b04dc ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickHat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c3fe9ce78b1fb4e4 ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickButton)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_83d21d7ab5b5f640 ("
+         , "  SDL_Joystick *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RumbleJoystick)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_b273e29ac9df2371 ("
+         , "  SDL_Joystick *arg1,"
+         , "  Uint16 arg2,"
+         , "  Uint16 arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RumbleJoystickTriggers)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_afcd4a7ee63caeb4 ("
+         , "  SDL_Joystick *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetJoystickLED)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_6b3ca271f1d12b4d ("
+         , "  SDL_Joystick *arg1,"
+         , "  void const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SendJoystickEffect)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_24a578a58e09e216 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseJoystick)(arg1);"
+         , "}"
+         , "SDL_JoystickConnectionState hs_bindgen_d6589b95cb209778 ("
+         , "  SDL_Joystick *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickConnectionState)(arg1);"
+         , "}"
+         , "SDL_PowerState hs_bindgen_eb82ac709209a25a ("
+         , "  SDL_Joystick *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetJoystickPowerInfo)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_LockJoysticks@
+foreign import ccall unsafe "hs_bindgen_a5f9679bb55a9be2"
+  hs_bindgen_a5f9679bb55a9be2_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_LockJoysticks@
+hs_bindgen_a5f9679bb55a9be2 :: IO ()
+hs_bindgen_a5f9679bb55a9be2 =
+  BG.fromFFIType hs_bindgen_a5f9679bb55a9be2_base
+
+-- | Locking for atomic access to the joystick API.
+--
+--     The SDL joystick functions are thread-safe, however you can lock the joysticks while processing to guarantee that the joystick list won\'t change and joystick and gamepad events will not be delivered.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_LockJoysticks@, defined at @SDL3\/SDL_joystick.h 189:34@
+sDL_LockJoysticks :: IO ()
+sDL_LockJoysticks = hs_bindgen_a5f9679bb55a9be2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_UnlockJoysticks@
+foreign import ccall unsafe "hs_bindgen_4fb7bf5674b81cd5"
+  hs_bindgen_4fb7bf5674b81cd5_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_UnlockJoysticks@
+hs_bindgen_4fb7bf5674b81cd5 :: IO ()
+hs_bindgen_4fb7bf5674b81cd5 =
+  BG.fromFFIType hs_bindgen_4fb7bf5674b81cd5_base
+
+-- | Unlocking for atomic access to the joystick API.
+--
+--     [Thread safety]: This should be called from the same thread that called @SDL_LockJoysticks()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UnlockJoysticks@, defined at @SDL3\/SDL_joystick.h 199:34@
+sDL_UnlockJoysticks :: IO ()
+sDL_UnlockJoysticks = hs_bindgen_4fb7bf5674b81cd5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_HasJoystick@
+foreign import ccall unsafe "hs_bindgen_6974c5058c398636"
+  hs_bindgen_6974c5058c398636_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_HasJoystick@
+hs_bindgen_6974c5058c398636 :: IO BG.CBool
+hs_bindgen_6974c5058c398636 =
+  BG.fromFFIType hs_bindgen_6974c5058c398636_base
+
+-- | Return whether a joystick is currently connected.
+--
+--     [Returns]: true if a joystick is connected, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_HasJoystick@, defined at @SDL3\/SDL_joystick.h 212:34@
+sDL_HasJoystick :: IO BG.CBool
+sDL_HasJoystick = hs_bindgen_6974c5058c398636
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoysticks@
+foreign import ccall unsafe "hs_bindgen_52b14e92fdb53649"
+  hs_bindgen_52b14e92fdb53649_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoysticks@
+hs_bindgen_52b14e92fdb53649
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_JoystickID)
+hs_bindgen_52b14e92fdb53649 =
+  BG.fromFFIType hs_bindgen_52b14e92fdb53649_base
+
+-- | Get a list of currently connected joysticks.
+--
+--     [Returns]: a 0 terminated array of joystick instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasJoystick', 'sDL_OpenJoystick'
+--
+--     [C declaration]: @SDL_GetJoysticks@, defined at @SDL3\/SDL_joystick.h 230:46@
+sDL_GetJoysticks
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of joysticks returned, may be NULL.
+  -> IO (BG.Ptr SDL_JoystickID)
+sDL_GetJoysticks = hs_bindgen_52b14e92fdb53649
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickNameForID@
+foreign import ccall unsafe "hs_bindgen_7e75165c0d2f9d72"
+  hs_bindgen_7e75165c0d2f9d72_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickNameForID@
+hs_bindgen_7e75165c0d2f9d72
+  :: SDL_JoystickID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_7e75165c0d2f9d72 =
+  BG.fromFFIType hs_bindgen_7e75165c0d2f9d72_base
+
+-- | Get the implementation dependent name of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the name of the selected joystick. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickName', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickNameForID@, defined at @SDL3\/SDL_joystick.h 248:42@
+sDL_GetJoystickNameForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetJoystickNameForID =
+  hs_bindgen_7e75165c0d2f9d72
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickPathForID@
+foreign import ccall unsafe "hs_bindgen_2161a8b12229ac30"
+  hs_bindgen_2161a8b12229ac30_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickPathForID@
+hs_bindgen_2161a8b12229ac30
+  :: SDL_JoystickID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_2161a8b12229ac30 =
+  BG.fromFFIType hs_bindgen_2161a8b12229ac30_base
+
+-- | Get the implementation dependent path of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the path of the selected joystick. If no path can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPath', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickPathForID@, defined at @SDL3\/SDL_joystick.h 266:42@
+sDL_GetJoystickPathForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetJoystickPathForID =
+  hs_bindgen_2161a8b12229ac30
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickPlayerIndexForID@
+foreign import ccall unsafe "hs_bindgen_386a2da9898f9057"
+  hs_bindgen_386a2da9898f9057_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickPlayerIndexForID@
+hs_bindgen_386a2da9898f9057
+  :: SDL_JoystickID
+  -> IO BG.CInt
+hs_bindgen_386a2da9898f9057 =
+  BG.fromFFIType hs_bindgen_386a2da9898f9057_base
+
+-- | Get the player index of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the player index of a joystick, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPlayerIndex', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickPlayerIndexForID@, defined at @SDL3\/SDL_joystick.h 283:33@
+sDL_GetJoystickPlayerIndexForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.CInt
+sDL_GetJoystickPlayerIndexForID =
+  hs_bindgen_386a2da9898f9057
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickGUIDForID@
+foreign import ccall unsafe "hs_bindgen_bfb7bb52d70dab96"
+  hs_bindgen_bfb7bb52d70dab96_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickGUIDForID@
+hs_bindgen_bfb7bb52d70dab96
+  :: SDL_JoystickID
+  -> BG.Ptr SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -> IO ()
+hs_bindgen_bfb7bb52d70dab96 =
+  BG.fromFFIType hs_bindgen_bfb7bb52d70dab96_base
+
+-- | Get the implementation-dependent GUID of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the GUID of the selected joystick. If called with an invalid instance_id, this function returns a zero GUID.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickGUID', SDL_GUIDToString
+--
+--     [C declaration]: @SDL_GetJoystickGUIDForID@, defined at @SDL3\/SDL_joystick.h 301:38@
+sDL_GetJoystickGUIDForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+sDL_GetJoystickGUIDForID =
+  \instance_id0 ->
+    BG.allocaAndPeek
+      ( \res1 ->
+          hs_bindgen_bfb7bb52d70dab96 instance_id0 res1
+      )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickVendorForID@
+foreign import ccall unsafe "hs_bindgen_43fce2fd8176f766"
+  hs_bindgen_43fce2fd8176f766_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickVendorForID@
+hs_bindgen_43fce2fd8176f766
+  :: SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_43fce2fd8176f766 =
+  BG.fromFFIType hs_bindgen_43fce2fd8176f766_base
+
+-- | Get the USB vendor ID of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickVendor', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickVendorForID@, defined at @SDL3\/SDL_joystick.h 320:36@
+sDL_GetJoystickVendorForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickVendorForID =
+  hs_bindgen_43fce2fd8176f766
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickProductForID@
+foreign import ccall unsafe "hs_bindgen_942a59625bde2720"
+  hs_bindgen_942a59625bde2720_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickProductForID@
+hs_bindgen_942a59625bde2720
+  :: SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_942a59625bde2720 =
+  BG.fromFFIType hs_bindgen_942a59625bde2720_base
+
+-- | Get the USB product ID of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProduct', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickProductForID@, defined at @SDL3\/SDL_joystick.h 339:36@
+sDL_GetJoystickProductForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickProductForID =
+  hs_bindgen_942a59625bde2720
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickProductVersionForID@
+foreign import ccall unsafe "hs_bindgen_c4f2f0cc80e64773"
+  hs_bindgen_c4f2f0cc80e64773_base
+    :: BG.Word32
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickProductVersionForID@
+hs_bindgen_c4f2f0cc80e64773
+  :: SDL_JoystickID
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_c4f2f0cc80e64773 =
+  BG.fromFFIType hs_bindgen_c4f2f0cc80e64773_base
+
+-- | Get the product version of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProductVersion', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickProductVersionForID@, defined at @SDL3\/SDL_joystick.h 358:36@
+sDL_GetJoystickProductVersionForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickProductVersionForID =
+  hs_bindgen_c4f2f0cc80e64773
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickTypeForID@
+foreign import ccall unsafe "hs_bindgen_d95cbbc03c3eccf3"
+  hs_bindgen_d95cbbc03c3eccf3_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickTypeForID@
+hs_bindgen_d95cbbc03c3eccf3
+  :: SDL_JoystickID
+  -> IO SDL_JoystickType
+hs_bindgen_d95cbbc03c3eccf3 =
+  BG.fromFFIType hs_bindgen_d95cbbc03c3eccf3_base
+
+-- | Get the type of a joystick, if available.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the 'SDL_JoystickType' of the selected joystick. If called with an invalid instance_id, this function returns @SDL_JOYSTICK_TYPE_UNKNOWN@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickType', 'sDL_GetJoysticks'
+--
+--     [C declaration]: @SDL_GetJoystickTypeForID@, defined at @SDL3\/SDL_joystick.h 377:46@
+sDL_GetJoystickTypeForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_JoystickType
+sDL_GetJoystickTypeForID =
+  hs_bindgen_d95cbbc03c3eccf3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_OpenJoystick@
+foreign import ccall unsafe "hs_bindgen_96b31a30b26b761d"
+  hs_bindgen_96b31a30b26b761d_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_OpenJoystick@
+hs_bindgen_96b31a30b26b761d
+  :: SDL_JoystickID
+  -> IO (BG.Ptr SDL_Joystick)
+hs_bindgen_96b31a30b26b761d =
+  BG.fromFFIType hs_bindgen_96b31a30b26b761d_base
+
+-- | Open a joystick for use.
+--
+--     The joystick subsystem must be initialized before a joystick can be opened for use.
+--
+--     [Returns]: a joystick identifier or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseJoystick'
+--
+--     [C declaration]: @SDL_OpenJoystick@, defined at @SDL3\/SDL_joystick.h 395:44@
+sDL_OpenJoystick
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr SDL_Joystick)
+sDL_OpenJoystick = hs_bindgen_96b31a30b26b761d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickFromID@
+foreign import ccall unsafe "hs_bindgen_79e317a6737caef2"
+  hs_bindgen_79e317a6737caef2_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickFromID@
+hs_bindgen_79e317a6737caef2
+  :: SDL_JoystickID
+  -> IO (BG.Ptr SDL_Joystick)
+hs_bindgen_79e317a6737caef2 =
+  BG.fromFFIType hs_bindgen_79e317a6737caef2_base
+
+-- | Get the 'SDL_Joystick' associated with an instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Joystick' on success or NULL on failure or if it hasn\'t been opened yet; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickFromID@, defined at @SDL3\/SDL_joystick.h 408:44@
+sDL_GetJoystickFromID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the instance ID to get the 'SDL_Joystick' for.
+  -> IO (BG.Ptr SDL_Joystick)
+sDL_GetJoystickFromID = hs_bindgen_79e317a6737caef2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickFromPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_533baada064a0d12"
+  hs_bindgen_533baada064a0d12_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickFromPlayerIndex@
+hs_bindgen_533baada064a0d12
+  :: BG.CInt
+  -> IO (BG.Ptr SDL_Joystick)
+hs_bindgen_533baada064a0d12 =
+  BG.fromFFIType hs_bindgen_533baada064a0d12_base
+
+-- | Get the 'SDL_Joystick' associated with a player index.
+--
+--     [Returns]: an 'SDL_Joystick' on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPlayerIndex', 'sDL_SetJoystickPlayerIndex'
+--
+--     [C declaration]: @SDL_GetJoystickFromPlayerIndex@, defined at @SDL3\/SDL_joystick.h 424:44@
+sDL_GetJoystickFromPlayerIndex
+  :: BG.CInt
+  -- ^
+  --
+  --           [@player_index@]: the player index to get the 'SDL_Joystick' for.
+  -> IO (BG.Ptr SDL_Joystick)
+sDL_GetJoystickFromPlayerIndex =
+  hs_bindgen_533baada064a0d12
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_AttachVirtualJoystick@
+foreign import ccall unsafe "hs_bindgen_f778cfec8f93ba4b"
+  hs_bindgen_f778cfec8f93ba4b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_AttachVirtualJoystick@
+hs_bindgen_f778cfec8f93ba4b
+  :: PtrConst.PtrConst SDL_VirtualJoystickDesc
+  -> IO SDL_JoystickID
+hs_bindgen_f778cfec8f93ba4b =
+  BG.fromFFIType hs_bindgen_f778cfec8f93ba4b_base
+
+-- | Attach a new virtual joystick.
+--
+--     Apps can create virtual joysticks, that exist without hardware directly backing them, and have program-supplied inputs. Once attached, a virtual joystick looks like any other joystick that SDL can access. These can be used to make other things look like joysticks, or provide pre-recorded input, etc.
+--
+--     Once attached, the app can send joystick inputs to the new virtual joystick using @SDL_SetJoystickVirtualAxis()@, etc.
+--
+--     When no longer needed, the virtual joystick can be removed by calling @SDL_DetachVirtualJoystick()@.
+--
+--     [Returns]: the joystick instance ID, or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DetachVirtualJoystick', 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_AttachVirtualJoystick@, defined at @SDL3\/SDL_joystick.h 539:44@
+sDL_AttachVirtualJoystick
+  :: PtrConst.PtrConst SDL_VirtualJoystickDesc
+  -- ^
+  --
+  --           [@desc@]: joystick description, initialized using SDL_INIT_INTERFACE().
+  -> IO SDL_JoystickID
+sDL_AttachVirtualJoystick =
+  hs_bindgen_f778cfec8f93ba4b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_DetachVirtualJoystick@
+foreign import ccall unsafe "hs_bindgen_b1026bd68d5bfd9e"
+  hs_bindgen_b1026bd68d5bfd9e_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_DetachVirtualJoystick@
+hs_bindgen_b1026bd68d5bfd9e
+  :: SDL_JoystickID
+  -> IO BG.CBool
+hs_bindgen_b1026bd68d5bfd9e =
+  BG.fromFFIType hs_bindgen_b1026bd68d5bfd9e_base
+
+-- | Detach a virtual joystick.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AttachVirtualJoystick'
+--
+--     [C declaration]: @SDL_DetachVirtualJoystick@, defined at @SDL3\/SDL_joystick.h 555:34@
+sDL_DetachVirtualJoystick
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID, previously returned from @SDL_AttachVirtualJoystick()@.
+  -> IO BG.CBool
+sDL_DetachVirtualJoystick =
+  hs_bindgen_b1026bd68d5bfd9e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_IsJoystickVirtual@
+foreign import ccall unsafe "hs_bindgen_d1c274bbe874b100"
+  hs_bindgen_d1c274bbe874b100_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_IsJoystickVirtual@
+hs_bindgen_d1c274bbe874b100
+  :: SDL_JoystickID
+  -> IO BG.CBool
+hs_bindgen_d1c274bbe874b100 =
+  BG.fromFFIType hs_bindgen_d1c274bbe874b100_base
+
+-- | Query whether or not a joystick is virtual.
+--
+--     [Returns]: true if the joystick is virtual, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsJoystickVirtual@, defined at @SDL3\/SDL_joystick.h 567:34@
+sDL_IsJoystickVirtual
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.CBool
+sDL_IsJoystickVirtual = hs_bindgen_d1c274bbe874b100
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickVirtualAxis@
+foreign import ccall unsafe "hs_bindgen_8eb5e45ef7f888cc"
+  hs_bindgen_8eb5e45ef7f888cc_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickVirtualAxis@
+hs_bindgen_8eb5e45ef7f888cc
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_8eb5e45ef7f888cc =
+  BG.fromFFIType hs_bindgen_8eb5e45ef7f888cc_base
+
+-- | Set the state of an axis on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     Note that when sending trigger axes, you should scale the value to the full range of Sint16. For example, a trigger at rest would have the value of @'sDL_JOYSTICK_AXIS_MIN'@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualAxis@, defined at @SDL3\/SDL_joystick.h 598:34@
+sDL_SetJoystickVirtualAxis
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@axis@]: the index of the axis on the virtual joystick to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: the new value for the specified axis.
+  -> IO BG.CBool
+sDL_SetJoystickVirtualAxis =
+  hs_bindgen_8eb5e45ef7f888cc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickVirtualBall@
+foreign import ccall unsafe "hs_bindgen_2e47467a34561f41"
+  hs_bindgen_2e47467a34561f41_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int16
+    -> BG.Int16
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickVirtualBall@
+hs_bindgen_2e47467a34561f41
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_2e47467a34561f41 =
+  BG.fromFFIType hs_bindgen_2e47467a34561f41_base
+
+-- | Generate ball motion on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualBall@, defined at @SDL3\/SDL_joystick.h 626:34@
+sDL_SetJoystickVirtualBall
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@ball@]: the index of the ball on the virtual joystick to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@xrel@]: the relative motion on the X axis.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@yrel@]: the relative motion on the Y axis.
+  -> IO BG.CBool
+sDL_SetJoystickVirtualBall =
+  hs_bindgen_2e47467a34561f41
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickVirtualButton@
+foreign import ccall unsafe "hs_bindgen_d61b8aa1cc7bcea2"
+  hs_bindgen_d61b8aa1cc7bcea2_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickVirtualButton@
+hs_bindgen_d61b8aa1cc7bcea2
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_d61b8aa1cc7bcea2 =
+  BG.fromFFIType hs_bindgen_d61b8aa1cc7bcea2_base
+
+-- | Set the state of a button on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualButton@, defined at @SDL3\/SDL_joystick.h 653:34@
+sDL_SetJoystickVirtualButton
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@button@]: the index of the button on the virtual joystick to update.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@down@]: true if the button is pressed, false otherwise.
+  -> IO BG.CBool
+sDL_SetJoystickVirtualButton =
+  hs_bindgen_d61b8aa1cc7bcea2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickVirtualHat@
+foreign import ccall unsafe "hs_bindgen_9e983d431a7b8fe6"
+  hs_bindgen_9e983d431a7b8fe6_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickVirtualHat@
+hs_bindgen_9e983d431a7b8fe6
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_9e983d431a7b8fe6 =
+  BG.fromFFIType hs_bindgen_9e983d431a7b8fe6_base
+
+-- | Set the state of a hat on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualHat@, defined at @SDL3\/SDL_joystick.h 680:34@
+sDL_SetJoystickVirtualHat
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hat@]: the index of the hat on the virtual joystick to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@value@]: the new value for the specified hat.
+  -> IO BG.CBool
+sDL_SetJoystickVirtualHat =
+  hs_bindgen_9e983d431a7b8fe6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickVirtualTouchpad@
+foreign import ccall unsafe "hs_bindgen_5bb42b2517c1eb69"
+  hs_bindgen_5bb42b2517c1eb69_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word8
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickVirtualTouchpad@
+hs_bindgen_5bb42b2517c1eb69
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CBool
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_5bb42b2517c1eb69 =
+  BG.fromFFIType hs_bindgen_5bb42b2517c1eb69_base
+
+-- | Set touchpad finger state on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', SDL_SetJoystickVirtualSensorData
+--
+--     [C declaration]: @SDL_SetJoystickVirtualTouchpad@, defined at @SDL3\/SDL_joystick.h 714:34@
+sDL_SetJoystickVirtualTouchpad
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@touchpad@]: the index of the touchpad on the virtual joystick to update.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@finger@]: the index of the finger on the touchpad to set.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@down@]: true if the finger is pressed, false if the finger is released.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the finger on the touchpad, normalized 0 to 1, with the origin in the upper left.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the finger on the touchpad, normalized 0 to 1, with the origin in the upper left.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@pressure@]: the pressure of the finger.
+  -> IO BG.CBool
+sDL_SetJoystickVirtualTouchpad =
+  hs_bindgen_5bb42b2517c1eb69
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SendJoystickVirtualSensorData@
+foreign import ccall unsafe "hs_bindgen_3d0650aed2d406ec"
+  hs_bindgen_3d0650aed2d406ec_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SendJoystickVirtualSensorData@
+hs_bindgen_3d0650aed2d406ec
+  :: BG.Ptr SDL_Joystick
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> PtrConst.PtrConst BG.CFloat
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_3d0650aed2d406ec =
+  BG.fromFFIType hs_bindgen_3d0650aed2d406ec_base
+
+-- | Send a sensor update for an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to SDL_UpdateJoysticks, which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: SDL_PollEvent, SDL_PumpEvents, SDL_WaitEventTimeout, SDL_WaitEvent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickVirtualAxis', 'sDL_SetJoystickVirtualButton', 'sDL_SetJoystickVirtualBall', 'sDL_SetJoystickVirtualHat', 'sDL_SetJoystickVirtualTouchpad'
+--
+--     [C declaration]: @SDL_SendJoystickVirtualSensorData@, defined at @SDL3\/SDL_joystick.h 744:34@
+sDL_SendJoystickVirtualSensorData
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of the sensor on the virtual joystick to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@sensor_timestamp@]: a 64-bit timestamp in nanoseconds associated with the sensor reading.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@data@]: the data associated with the sensor reading.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_values@]: the number of values pointed to by @data@.
+  -> IO BG.CBool
+sDL_SendJoystickVirtualSensorData =
+  hs_bindgen_3d0650aed2d406ec
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickProperties@
+foreign import ccall unsafe "hs_bindgen_7b418051f3497220"
+  hs_bindgen_7b418051f3497220_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickProperties@
+hs_bindgen_7b418051f3497220
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_7b418051f3497220 =
+  BG.fromFFIType hs_bindgen_7b418051f3497220_base
+
+-- | Get the properties associated with a joystick.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN'@: true if this joystick has an LED that has adjustable brightness
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN'@: true if this joystick has an LED that has adjustable color
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN'@: true if this joystick has a player LED
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN'@: true if this joystick has left\/right rumble
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN'@: true if this joystick has simple trigger rumble
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickProperties@, defined at @SDL3\/SDL_joystick.h 770:46@
+sDL_GetJoystickProperties
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetJoystickProperties =
+  hs_bindgen_7b418051f3497220
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickName@
+foreign import ccall unsafe "hs_bindgen_efa173428595a9f5"
+  hs_bindgen_efa173428595a9f5_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickName@
+hs_bindgen_efa173428595a9f5
+  :: BG.Ptr SDL_Joystick
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_efa173428595a9f5 =
+  BG.fromFFIType hs_bindgen_efa173428595a9f5_base
+
+-- | Get the implementation dependent name of a joystick.
+--
+--     [Returns]: the name of the selected joystick. If no name can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickNameForID'
+--
+--     [C declaration]: @SDL_GetJoystickName@, defined at @SDL3\/SDL_joystick.h 791:42@
+sDL_GetJoystickName
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetJoystickName = hs_bindgen_efa173428595a9f5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickPath@
+foreign import ccall unsafe "hs_bindgen_1b1b5dcb365287fd"
+  hs_bindgen_1b1b5dcb365287fd_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickPath@
+hs_bindgen_1b1b5dcb365287fd
+  :: BG.Ptr SDL_Joystick
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_1b1b5dcb365287fd =
+  BG.fromFFIType hs_bindgen_1b1b5dcb365287fd_base
+
+-- | Get the implementation dependent path of a joystick.
+--
+--     [Returns]: the path of the selected joystick. If no path can be found, this function returns NULL; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPathForID'
+--
+--     [C declaration]: @SDL_GetJoystickPath@, defined at @SDL3\/SDL_joystick.h 806:42@
+sDL_GetJoystickPath
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetJoystickPath = hs_bindgen_1b1b5dcb365287fd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_55ef8dfcc4d84345"
+  hs_bindgen_55ef8dfcc4d84345_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickPlayerIndex@
+hs_bindgen_55ef8dfcc4d84345
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CInt
+hs_bindgen_55ef8dfcc4d84345 =
+  BG.fromFFIType hs_bindgen_55ef8dfcc4d84345_base
+
+-- | Get the player index of an opened joystick.
+--
+--     For XInput controllers this returns the XInput user index. Many joysticks will not be able to supply this information.
+--
+--     [Returns]: the player index, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickPlayerIndex'
+--
+--     [C declaration]: @SDL_GetJoystickPlayerIndex@, defined at @SDL3\/SDL_joystick.h 823:33@
+sDL_GetJoystickPlayerIndex
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO BG.CInt
+sDL_GetJoystickPlayerIndex =
+  hs_bindgen_55ef8dfcc4d84345
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickPlayerIndex@
+foreign import ccall unsafe "hs_bindgen_5e98a74b28f72b8e"
+  hs_bindgen_5e98a74b28f72b8e_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickPlayerIndex@
+hs_bindgen_5e98a74b28f72b8e
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_5e98a74b28f72b8e =
+  BG.fromFFIType hs_bindgen_5e98a74b28f72b8e_base
+
+-- | Set the player index of an opened joystick.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickPlayerIndex'
+--
+--     [C declaration]: @SDL_SetJoystickPlayerIndex@, defined at @SDL3\/SDL_joystick.h 840:34@
+sDL_SetJoystickPlayerIndex
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@player_index@]: player index to assign to this joystick, or -1 to clear the player index and turn off player LEDs.
+  -> IO BG.CBool
+sDL_SetJoystickPlayerIndex =
+  hs_bindgen_5e98a74b28f72b8e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickGUID@
+foreign import ccall unsafe "hs_bindgen_e5b4be9fcfc28bc3"
+  hs_bindgen_e5b4be9fcfc28bc3_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickGUID@
+hs_bindgen_e5b4be9fcfc28bc3
+  :: BG.Ptr SDL_Joystick
+  -> BG.Ptr SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -> IO ()
+hs_bindgen_e5b4be9fcfc28bc3 =
+  BG.fromFFIType hs_bindgen_e5b4be9fcfc28bc3_base
+
+-- | Get the implementation-dependent GUID for the joystick.
+--
+--     This function requires an open joystick.
+--
+--     [Returns]: the GUID of the given joystick. If called on an invalid index, this function returns a zero GUID; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickGUIDForID', SDL_GUIDToString
+--
+--     [C declaration]: @SDL_GetJoystickGUID@, defined at @SDL3\/SDL_joystick.h 859:38@
+sDL_GetJoystickGUID
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+sDL_GetJoystickGUID =
+  \joystick0 ->
+    BG.allocaAndPeek
+      ( \res1 ->
+          hs_bindgen_e5b4be9fcfc28bc3 joystick0 res1
+      )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickVendor@
+foreign import ccall unsafe "hs_bindgen_62c6fda961bf2fa9"
+  hs_bindgen_62c6fda961bf2fa9_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickVendor@
+hs_bindgen_62c6fda961bf2fa9
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_62c6fda961bf2fa9 =
+  BG.fromFFIType hs_bindgen_62c6fda961bf2fa9_base
+
+-- | Get the USB vendor ID of an opened joystick, if available.
+--
+--     If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickVendorForID'
+--
+--     [C declaration]: @SDL_GetJoystickVendor@, defined at @SDL3\/SDL_joystick.h 875:36@
+sDL_GetJoystickVendor
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickVendor = hs_bindgen_62c6fda961bf2fa9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickProduct@
+foreign import ccall unsafe "hs_bindgen_d7e0f0c36e50f0e2"
+  hs_bindgen_d7e0f0c36e50f0e2_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickProduct@
+hs_bindgen_d7e0f0c36e50f0e2
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_d7e0f0c36e50f0e2 =
+  BG.fromFFIType hs_bindgen_d7e0f0c36e50f0e2_base
+
+-- | Get the USB product ID of an opened joystick, if available.
+--
+--     If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProductForID'
+--
+--     [C declaration]: @SDL_GetJoystickProduct@, defined at @SDL3\/SDL_joystick.h 891:36@
+sDL_GetJoystickProduct
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickProduct = hs_bindgen_d7e0f0c36e50f0e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickProductVersion@
+foreign import ccall unsafe "hs_bindgen_4d80e87af7618ebc"
+  hs_bindgen_4d80e87af7618ebc_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickProductVersion@
+hs_bindgen_4d80e87af7618ebc
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_4d80e87af7618ebc =
+  BG.fromFFIType hs_bindgen_4d80e87af7618ebc_base
+
+-- | Get the product version of an opened joystick, if available.
+--
+--     If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickProductVersionForID'
+--
+--     [C declaration]: @SDL_GetJoystickProductVersion@, defined at @SDL3\/SDL_joystick.h 907:36@
+sDL_GetJoystickProductVersion
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickProductVersion =
+  hs_bindgen_4d80e87af7618ebc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickFirmwareVersion@
+foreign import ccall unsafe "hs_bindgen_29a99ec3dcd0fa98"
+  hs_bindgen_29a99ec3dcd0fa98_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickFirmwareVersion@
+hs_bindgen_29a99ec3dcd0fa98
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+hs_bindgen_29a99ec3dcd0fa98 =
+  BG.fromFFIType hs_bindgen_29a99ec3dcd0fa98_base
+
+-- | Get the firmware version of an opened joystick, if available.
+--
+--     If the firmware version isn\'t available this function returns 0.
+--
+--     [Returns]: the firmware version of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickFirmwareVersion@, defined at @SDL3\/SDL_joystick.h 922:36@
+sDL_GetJoystickFirmwareVersion
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint16
+sDL_GetJoystickFirmwareVersion =
+  hs_bindgen_29a99ec3dcd0fa98
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickSerial@
+foreign import ccall unsafe "hs_bindgen_a4795a75ac263066"
+  hs_bindgen_a4795a75ac263066_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickSerial@
+hs_bindgen_a4795a75ac263066
+  :: BG.Ptr SDL_Joystick
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_a4795a75ac263066 =
+  BG.fromFFIType hs_bindgen_a4795a75ac263066_base
+
+-- | Get the serial number of an opened joystick, if available.
+--
+--     Returns the serial number of the joystick, or NULL if it is not available.
+--
+--     [Returns]: the serial number of the selected joystick, or NULL if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickSerial@, defined at @SDL3\/SDL_joystick.h 937:42@
+sDL_GetJoystickSerial
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetJoystickSerial = hs_bindgen_a4795a75ac263066
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickType@
+foreign import ccall unsafe "hs_bindgen_76843a2261bd1972"
+  hs_bindgen_76843a2261bd1972_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickType@
+hs_bindgen_76843a2261bd1972
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL_JoystickType
+hs_bindgen_76843a2261bd1972 =
+  BG.fromFFIType hs_bindgen_76843a2261bd1972_base
+
+-- | Get the type of an opened joystick.
+--
+--     [Returns]: the 'SDL_JoystickType' of the selected joystick.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickTypeForID'
+--
+--     [C declaration]: @SDL_GetJoystickType@, defined at @SDL3\/SDL_joystick.h 951:46@
+sDL_GetJoystickType
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @SDL_OpenJoystick()@.
+  -> IO SDL_JoystickType
+sDL_GetJoystickType = hs_bindgen_76843a2261bd1972
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickGUIDInfo@
+foreign import ccall unsafe "hs_bindgen_436078b1ecf22b0d"
+  hs_bindgen_436078b1ecf22b0d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickGUIDInfo@
+hs_bindgen_436078b1ecf22b0d
+  :: BG.Ptr SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> IO ()
+hs_bindgen_436078b1ecf22b0d =
+  BG.fromFFIType hs_bindgen_436078b1ecf22b0d_base
+
+-- | Get the device information encoded in a SDL_GUID structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickGUIDForID'
+--
+--     [C declaration]: @SDL_GetJoystickGUIDInfo@, defined at @SDL3\/SDL_joystick.h 972:34@
+sDL_GetJoystickGUIDInfo
+  :: SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: the SDL_GUID you wish to get info about.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@vendor@]: a pointer filled in with the device VID, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@product@]: a pointer filled in with the device PID, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@version@]: a pointer filled in with the device version, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@crc16@]: a pointer filled in with a CRC used to distinguish different products with the same VID\/PID, or 0 if not available.
+  -> IO ()
+sDL_GetJoystickGUIDInfo =
+  \guid0 ->
+    \vendor1 ->
+      \product2 ->
+        \version3 ->
+          \crc164 ->
+            BG.with
+              guid0
+              ( \guid5 ->
+                  hs_bindgen_436078b1ecf22b0d guid5 vendor1 product2 version3 crc164
+              )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_JoystickConnected@
+foreign import ccall unsafe "hs_bindgen_0241ed6d6117fa6f"
+  hs_bindgen_0241ed6d6117fa6f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_JoystickConnected@
+hs_bindgen_0241ed6d6117fa6f
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CBool
+hs_bindgen_0241ed6d6117fa6f =
+  BG.fromFFIType hs_bindgen_0241ed6d6117fa6f_base
+
+-- | Get the status of a specified joystick.
+--
+--     [Returns]: true if the joystick has been opened, false if it has not; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_JoystickConnected@, defined at @SDL3\/SDL_joystick.h 985:34@
+sDL_JoystickConnected
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> IO BG.CBool
+sDL_JoystickConnected = hs_bindgen_0241ed6d6117fa6f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickID@
+foreign import ccall unsafe "hs_bindgen_ca7a1f2ac4ecb56d"
+  hs_bindgen_ca7a1f2ac4ecb56d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickID@
+hs_bindgen_ca7a1f2ac4ecb56d
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL_JoystickID
+hs_bindgen_ca7a1f2ac4ecb56d =
+  BG.fromFFIType hs_bindgen_ca7a1f2ac4ecb56d_base
+
+-- | Get the instance ID of an opened joystick.
+--
+--     [Returns]: the instance ID of the specified joystick on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickID@, defined at @SDL3\/SDL_joystick.h 998:44@
+sDL_GetJoystickID
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO SDL_JoystickID
+sDL_GetJoystickID = hs_bindgen_ca7a1f2ac4ecb56d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetNumJoystickAxes@
+foreign import ccall unsafe "hs_bindgen_1510ba234e23c104"
+  hs_bindgen_1510ba234e23c104_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetNumJoystickAxes@
+hs_bindgen_1510ba234e23c104
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CInt
+hs_bindgen_1510ba234e23c104 =
+  BG.fromFFIType hs_bindgen_1510ba234e23c104_base
+
+-- | Get the number of general axis controls on a joystick.
+--
+--     Often, the directional pad on a game controller will either look like 4 separate buttons or a POV hat, and not axes, but all of this is up to the device and platform.
+--
+--     [Returns]: the number of axis controls\/number of axes on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickAxis', 'sDL_GetNumJoystickBalls', 'sDL_GetNumJoystickButtons', 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetNumJoystickAxes@, defined at @SDL3\/SDL_joystick.h 1020:33@
+sDL_GetNumJoystickAxes
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.CInt
+sDL_GetNumJoystickAxes = hs_bindgen_1510ba234e23c104
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetNumJoystickBalls@
+foreign import ccall unsafe "hs_bindgen_69d452e9cc046adb"
+  hs_bindgen_69d452e9cc046adb_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetNumJoystickBalls@
+hs_bindgen_69d452e9cc046adb
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CInt
+hs_bindgen_69d452e9cc046adb =
+  BG.fromFFIType hs_bindgen_69d452e9cc046adb_base
+
+-- | Get the number of trackballs on a joystick.
+--
+--     Joystick trackballs have only relative motion events associated with them and their state cannot be polled.
+--
+--     Most joysticks do not have trackballs.
+--
+--     [Returns]: the number of trackballs on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickBall', 'sDL_GetNumJoystickAxes', 'sDL_GetNumJoystickButtons', 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetNumJoystickBalls@, defined at @SDL3\/SDL_joystick.h 1043:33@
+sDL_GetNumJoystickBalls
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.CInt
+sDL_GetNumJoystickBalls = hs_bindgen_69d452e9cc046adb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetNumJoystickHats@
+foreign import ccall unsafe "hs_bindgen_cc24966a772d0240"
+  hs_bindgen_cc24966a772d0240_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetNumJoystickHats@
+hs_bindgen_cc24966a772d0240
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CInt
+hs_bindgen_cc24966a772d0240 =
+  BG.fromFFIType hs_bindgen_cc24966a772d0240_base
+
+-- | Get the number of POV hats on a joystick.
+--
+--     [Returns]: the number of POV hats on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickHat', 'sDL_GetNumJoystickAxes', 'sDL_GetNumJoystickBalls', 'sDL_GetNumJoystickButtons'
+--
+--     [C declaration]: @SDL_GetNumJoystickHats@, defined at @SDL3\/SDL_joystick.h 1061:33@
+sDL_GetNumJoystickHats
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.CInt
+sDL_GetNumJoystickHats = hs_bindgen_cc24966a772d0240
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetNumJoystickButtons@
+foreign import ccall unsafe "hs_bindgen_aeac535e5fa443a0"
+  hs_bindgen_aeac535e5fa443a0_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetNumJoystickButtons@
+hs_bindgen_aeac535e5fa443a0
+  :: BG.Ptr SDL_Joystick
+  -> IO BG.CInt
+hs_bindgen_aeac535e5fa443a0 =
+  BG.fromFFIType hs_bindgen_aeac535e5fa443a0_base
+
+-- | Get the number of buttons on a joystick.
+--
+--     [Returns]: the number of buttons on success or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetJoystickButton', 'sDL_GetNumJoystickAxes', 'sDL_GetNumJoystickBalls', 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetNumJoystickButtons@, defined at @SDL3\/SDL_joystick.h 1079:33@
+sDL_GetNumJoystickButtons
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.CInt
+sDL_GetNumJoystickButtons =
+  hs_bindgen_aeac535e5fa443a0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickEventsEnabled@
+foreign import ccall unsafe "hs_bindgen_4ca6ee37a9e122b5"
+  hs_bindgen_4ca6ee37a9e122b5_base
+    :: BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickEventsEnabled@
+hs_bindgen_4ca6ee37a9e122b5
+  :: BG.CBool
+  -> IO ()
+hs_bindgen_4ca6ee37a9e122b5 =
+  BG.fromFFIType hs_bindgen_4ca6ee37a9e122b5_base
+
+-- | Set the state of joystick event processing.
+--
+--     If joystick events are disabled, you must call @SDL_UpdateJoysticks()@ yourself and check the state of the joystick when you want joystick information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_JoystickEventsEnabled', 'sDL_UpdateJoysticks'
+--
+--     [C declaration]: @SDL_SetJoystickEventsEnabled@, defined at @SDL3\/SDL_joystick.h 1097:34@
+sDL_SetJoystickEventsEnabled
+  :: BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: whether to process joystick events or not.
+  -> IO ()
+sDL_SetJoystickEventsEnabled =
+  hs_bindgen_4ca6ee37a9e122b5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_JoystickEventsEnabled@
+foreign import ccall unsafe "hs_bindgen_fd430a3c399eb18b"
+  hs_bindgen_fd430a3c399eb18b_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_JoystickEventsEnabled@
+hs_bindgen_fd430a3c399eb18b :: IO BG.CBool
+hs_bindgen_fd430a3c399eb18b =
+  BG.fromFFIType hs_bindgen_fd430a3c399eb18b_base
+
+-- | Query the state of joystick event processing.
+--
+--     If joystick events are disabled, you must call @SDL_UpdateJoysticks()@ yourself and check the state of the joystick when you want joystick information.
+--
+--     [Returns]: true if joystick events are being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetJoystickEventsEnabled'
+--
+--     [C declaration]: @SDL_JoystickEventsEnabled@, defined at @SDL3\/SDL_joystick.h 1114:34@
+sDL_JoystickEventsEnabled :: IO BG.CBool
+sDL_JoystickEventsEnabled =
+  hs_bindgen_fd430a3c399eb18b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_UpdateJoysticks@
+foreign import ccall unsafe "hs_bindgen_2766ee6323a0f722"
+  hs_bindgen_2766ee6323a0f722_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_UpdateJoysticks@
+hs_bindgen_2766ee6323a0f722 :: IO ()
+hs_bindgen_2766ee6323a0f722 =
+  BG.fromFFIType hs_bindgen_2766ee6323a0f722_base
+
+-- | Update the current state of the open joysticks.
+--
+--     This is called automatically by the event loop if any joystick events are enabled.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateJoysticks@, defined at @SDL3\/SDL_joystick.h 1126:34@
+sDL_UpdateJoysticks :: IO ()
+sDL_UpdateJoysticks = hs_bindgen_2766ee6323a0f722
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickAxis@
+foreign import ccall unsafe "hs_bindgen_c16201bd08e902dc"
+  hs_bindgen_c16201bd08e902dc_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickAxis@
+hs_bindgen_c16201bd08e902dc
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint16
+hs_bindgen_c16201bd08e902dc =
+  BG.fromFFIType hs_bindgen_c16201bd08e902dc_base
+
+-- | Get the current state of an axis control on a joystick.
+--
+--     SDL makes no promises about what part of the joystick any given axis refers to. Your game should have some sort of configuration UI to let users specify what each axis should be bound to. Alternately, SDL\'s higher-level Game Controller API makes a great effort to apply order to this lower-level interface, so you know that a specific axis is the \"left thumb stick,\" etc.
+--
+--     The value returned by @SDL_GetJoystickAxis()@ is a signed integer (-32768 to 32767) representing the current position of the axis. It may be necessary to impose certain tolerances on these values to account for jitter.
+--
+--     [Returns]: a 16-bit signed integer representing the current position of the axis or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickAxes'
+--
+--     [C declaration]: @SDL_GetJoystickAxis@, defined at @SDL3\/SDL_joystick.h 1152:36@
+sDL_GetJoystickAxis
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@axis@]: the axis to query; the axis indices start at index 0.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint16
+sDL_GetJoystickAxis = hs_bindgen_c16201bd08e902dc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickAxisInitialState@
+foreign import ccall unsafe "hs_bindgen_803984b597c873b4"
+  hs_bindgen_803984b597c873b4_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickAxisInitialState@
+hs_bindgen_803984b597c873b4
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -> IO BG.CBool
+hs_bindgen_803984b597c873b4 =
+  BG.fromFFIType hs_bindgen_803984b597c873b4_base
+
+-- | Get the initial state of an axis control on a joystick.
+--
+--     The state is a value ranging from -32768 to 32767.
+--
+--     The axis indices start at index 0.
+--
+--     [Returns]: true if this axis has any initial value, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickAxisInitialState@, defined at @SDL3\/SDL_joystick.h 1170:34@
+sDL_GetJoystickAxisInitialState
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@axis@]: the axis to query; the axis indices start at index 0.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@state@]: upon return, the initial value is supplied here.
+  -> IO BG.CBool
+sDL_GetJoystickAxisInitialState =
+  hs_bindgen_803984b597c873b4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickBall@
+foreign import ccall unsafe "hs_bindgen_f564c6f917207491"
+  hs_bindgen_f564c6f917207491_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickBall@
+hs_bindgen_f564c6f917207491
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_f564c6f917207491 =
+  BG.fromFFIType hs_bindgen_f564c6f917207491_base
+
+-- | Get the ball axis change since the last poll.
+--
+--     Trackballs can only return relative motion since the last call to @SDL_GetJoystickBall()@, these motion deltas are placed into @dx@ and @dy@.
+--
+--     Most joysticks do not have trackballs.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickBalls'
+--
+--     [C declaration]: @SDL_GetJoystickBall@, defined at @SDL3\/SDL_joystick.h 1193:34@
+sDL_GetJoystickBall
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' to query.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@ball@]: the ball index to query; ball indices start at index 0.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dx@]: stores the difference in the x axis position since the last poll.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dy@]: stores the difference in the y axis position since the last poll.
+  -> IO BG.CBool
+sDL_GetJoystickBall = hs_bindgen_f564c6f917207491
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickHat@
+foreign import ccall unsafe "hs_bindgen_bdb3e1a3519b04dc"
+  hs_bindgen_bdb3e1a3519b04dc_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickHat@
+hs_bindgen_bdb3e1a3519b04dc
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint8
+hs_bindgen_bdb3e1a3519b04dc =
+  BG.fromFFIType hs_bindgen_bdb3e1a3519b04dc_base
+
+-- | Get the current state of a POV hat on a joystick.
+--
+--     The returned value will be one of the @SDL_HAT_*@ values.
+--
+--     [Returns]: the current hat position.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickHats'
+--
+--     [C declaration]: @SDL_GetJoystickHat@, defined at @SDL3\/SDL_joystick.h 1210:35@
+sDL_GetJoystickHat
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hat@]: the hat index to get the state from; indices start at index 0.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint8
+sDL_GetJoystickHat = hs_bindgen_bdb3e1a3519b04dc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickButton@
+foreign import ccall unsafe "hs_bindgen_c3fe9ce78b1fb4e4"
+  hs_bindgen_c3fe9ce78b1fb4e4_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickButton@
+hs_bindgen_c3fe9ce78b1fb4e4
+  :: BG.Ptr SDL_Joystick
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_c3fe9ce78b1fb4e4 =
+  BG.fromFFIType hs_bindgen_c3fe9ce78b1fb4e4_base
+
+-- | Get the current state of a button on a joystick.
+--
+--     [Returns]: true if the button is pressed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumJoystickButtons'
+--
+--     [C declaration]: @SDL_GetJoystickButton@, defined at @SDL3\/SDL_joystick.h 1236:34@
+sDL_GetJoystickButton
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@button@]: the button index to get the state from; indices start at index 0.
+  -> IO BG.CBool
+sDL_GetJoystickButton = hs_bindgen_c3fe9ce78b1fb4e4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_RumbleJoystick@
+foreign import ccall unsafe "hs_bindgen_83d21d7ab5b5f640"
+  hs_bindgen_83d21d7ab5b5f640_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> BG.Word16
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_RumbleJoystick@
+hs_bindgen_83d21d7ab5b5f640
+  :: BG.Ptr SDL_Joystick
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_83d21d7ab5b5f640 =
+  BG.fromFFIType hs_bindgen_83d21d7ab5b5f640_base
+
+-- | Start a rumble effect.
+--
+--     Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     This function requires you to process SDL events or call @SDL_UpdateJoysticks()@ to update rumble state.
+--
+--     [Returns]: true, or false if rumble isn\'t supported on this joystick.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RumbleJoystick@, defined at @SDL3\/SDL_joystick.h 1259:34@
+sDL_RumbleJoystick
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to vibrate.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@low_frequency_rumble@]: the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@high_frequency_rumble@]: the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO BG.CBool
+sDL_RumbleJoystick = hs_bindgen_83d21d7ab5b5f640
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_RumbleJoystickTriggers@
+foreign import ccall unsafe "hs_bindgen_b273e29ac9df2371"
+  hs_bindgen_b273e29ac9df2371_base
+    :: BG.Ptr BG.Void
+    -> BG.Word16
+    -> BG.Word16
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_RumbleJoystickTriggers@
+hs_bindgen_b273e29ac9df2371
+  :: BG.Ptr SDL_Joystick
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_b273e29ac9df2371 =
+  BG.fromFFIType hs_bindgen_b273e29ac9df2371_base
+
+-- | Start a rumble effect in the joystick\'s triggers.
+--
+--     Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     Note that this is rumbling of the /triggers/ and not the game controller as a whole. This is currently only supported on Xbox One controllers. If you want the (more common) whole-controller rumble, use @SDL_RumbleJoystick()@ instead.
+--
+--     This function requires you to process SDL events or call @SDL_UpdateJoysticks()@ to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RumbleJoystick'
+--
+--     [C declaration]: @SDL_RumbleJoystickTriggers@, defined at @SDL3\/SDL_joystick.h 1290:34@
+sDL_RumbleJoystickTriggers
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to vibrate.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@left_rumble@]: the intensity of the left trigger rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@right_rumble@]: the intensity of the right trigger rumble motor, from 0 to 0xFFFF.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO BG.CBool
+sDL_RumbleJoystickTriggers =
+  hs_bindgen_b273e29ac9df2371
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickLED@
+foreign import ccall unsafe "hs_bindgen_afcd4a7ee63caeb4"
+  hs_bindgen_afcd4a7ee63caeb4_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SetJoystickLED@
+hs_bindgen_afcd4a7ee63caeb4
+  :: BG.Ptr SDL_Joystick
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_afcd4a7ee63caeb4 =
+  BG.fromFFIType hs_bindgen_afcd4a7ee63caeb4_base
+
+-- | Update a joystick\'s LED color.
+--
+--     An example of a joystick LED is the light on the back of a PlayStation 4\'s DualShock 4 controller.
+--
+--     For joysticks with a single color LED, the maximum of the RGB values will be used as the LED brightness.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetJoystickLED@, defined at @SDL3\/SDL_joystick.h 1312:34@
+sDL_SetJoystickLED
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@red@]: the intensity of the red LED.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@green@]: the intensity of the green LED.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@blue@]: the intensity of the blue LED.
+  -> IO BG.CBool
+sDL_SetJoystickLED = hs_bindgen_afcd4a7ee63caeb4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SendJoystickEffect@
+foreign import ccall unsafe "hs_bindgen_6b3ca271f1d12b4d"
+  hs_bindgen_6b3ca271f1d12b4d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_SendJoystickEffect@
+hs_bindgen_6b3ca271f1d12b4d
+  :: BG.Ptr SDL_Joystick
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_6b3ca271f1d12b4d =
+  BG.fromFFIType hs_bindgen_6b3ca271f1d12b4d_base
+
+-- | Send a joystick specific effect packet.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SendJoystickEffect@, defined at @SDL3\/SDL_joystick.h 1327:34@
+sDL_SendJoystickEffect
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to affect.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to send to the joystick.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@size@]: the size of the data to send to the joystick.
+  -> IO BG.CBool
+sDL_SendJoystickEffect = hs_bindgen_6b3ca271f1d12b4d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_CloseJoystick@
+foreign import ccall unsafe "hs_bindgen_24a578a58e09e216"
+  hs_bindgen_24a578a58e09e216_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_CloseJoystick@
+hs_bindgen_24a578a58e09e216
+  :: BG.Ptr SDL_Joystick
+  -> IO ()
+hs_bindgen_24a578a58e09e216 =
+  BG.fromFFIType hs_bindgen_24a578a58e09e216_base
+
+-- | Close a joystick previously opened with @SDL_OpenJoystick()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenJoystick'
+--
+--     [C declaration]: @SDL_CloseJoystick@, defined at @SDL3\/SDL_joystick.h 1340:34@
+sDL_CloseJoystick
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick device to close.
+  -> IO ()
+sDL_CloseJoystick = hs_bindgen_24a578a58e09e216
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickConnectionState@
+foreign import ccall unsafe "hs_bindgen_d6589b95cb209778"
+  hs_bindgen_d6589b95cb209778_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickConnectionState@
+hs_bindgen_d6589b95cb209778
+  :: BG.Ptr SDL_Joystick
+  -> IO SDL_JoystickConnectionState
+hs_bindgen_d6589b95cb209778 =
+  BG.fromFFIType hs_bindgen_d6589b95cb209778_base
+
+-- | Get the connection state of a joystick.
+--
+--     [Returns]: the connection state on success or @SDL_JOYSTICK_CONNECTION_INVALID@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickConnectionState@, defined at @SDL3\/SDL_joystick.h 1354:57@
+sDL_GetJoystickConnectionState
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> IO SDL_JoystickConnectionState
+sDL_GetJoystickConnectionState =
+  hs_bindgen_d6589b95cb209778
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickPowerInfo@
+foreign import ccall unsafe "hs_bindgen_eb82ac709209a25a"
+  hs_bindgen_eb82ac709209a25a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Joystick_Unsafe_SDL_GetJoystickPowerInfo@
+hs_bindgen_eb82ac709209a25a
+  :: BG.Ptr SDL_Joystick
+  -> BG.Ptr BG.CInt
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+hs_bindgen_eb82ac709209a25a =
+  BG.fromFFIType hs_bindgen_eb82ac709209a25a_base
+
+-- | Get the battery state of a joystick.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     [Returns]: the current battery state or @SDL_POWERSTATE_ERROR@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetJoystickPowerInfo@, defined at @SDL3\/SDL_joystick.h 1377:44@
+sDL_GetJoystickPowerInfo
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 we can\'t determine a value or there is no battery.
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+sDL_GetJoystickPowerInfo =
+  hs_bindgen_eb82ac709209a25a
diff --git a/src/SDL3/Sys/Bindgen/Keyboard.hs b/src/SDL3/Sys/Bindgen/Keyboard.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Keyboard.hs
@@ -0,0 +1,552 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL keyboard management.
+--
+--     Please refer to the Best Keyboard Practices document for details on how best to accept keyboard input in various types of programs:
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/BestKeyboardPractices](https://wiki.libsdl.org/SDL3/BestKeyboardPractices) This is a unique ID for a keyboard for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     If the keyboard is disconnected and reconnected, it will get a new ID.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Keyboard (
+  SDL3.Sys.Bindgen.Keyboard.SDL_KeyboardID (..),
+  SDL3.Sys.Bindgen.Keyboard.SDL_TextInputType (..),
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_TEXTINPUT_TYPE_TEXT,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_TEXTINPUT_TYPE_TEXT_NAME,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_TEXTINPUT_TYPE_TEXT_EMAIL,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_TEXTINPUT_TYPE_TEXT_USERNAME,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_TEXTINPUT_TYPE_NUMBER,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE,
+  SDL3.Sys.Bindgen.Keyboard.SDL_Capitalization (..),
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_CAPITALIZE_NONE,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_CAPITALIZE_SENTENCES,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_CAPITALIZE_WORDS,
+  pattern SDL3.Sys.Bindgen.Keyboard.SDL_CAPITALIZE_LETTERS,
+  SDL3.Sys.Bindgen.Keyboard.sDL_PROP_TEXTINPUT_TYPE_NUMBER,
+  SDL3.Sys.Bindgen.Keyboard.sDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER,
+  SDL3.Sys.Bindgen.Keyboard.sDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN,
+  SDL3.Sys.Bindgen.Keyboard.sDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN,
+  SDL3.Sys.Bindgen.Keyboard.sDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_KeyboardID@, defined at @SDL3\/SDL_keyboard.h 60:16@
+newtype SDL_KeyboardID = SDL_KeyboardID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_KeyboardID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_KeyboardID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_KeyboardID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_KeyboardID "unwrap" where
+  type
+    CFieldType SDL_KeyboardID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Text input type.
+--
+--     These are the valid values for SDL_PROP_TEXTINPUT_TYPE_NUMBER. Not every value is valid on every platform, but where a value isn\'t supported, a reasonable fallback will be used.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInputWithProperties'
+--
+--     [C declaration]: @enum SDL_TextInputType@, defined at @SDL3\/SDL_keyboard.h 391:14@
+newtype SDL_TextInputType = SDL_TextInputType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_TextInputType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_TextInputType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_TextInputType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_TextInputType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_TextInputType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_TextInputType instance BG.Storable SDL_TextInputType
+
+deriving via BG.CUInt instance BG.Prim SDL_TextInputType
+
+instance CEnum.CEnum SDL_TextInputType where
+  type CEnumZ SDL_TextInputType = BG.CUInt
+
+  toCEnum = SDL_TextInputType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_TEXTINPUT_TYPE_TEXT")
+        , (1, BG.singleton "SDL_TEXTINPUT_TYPE_TEXT_NAME")
+        , (2, BG.singleton "SDL_TEXTINPUT_TYPE_TEXT_EMAIL")
+        , (3, BG.singleton "SDL_TEXTINPUT_TYPE_TEXT_USERNAME")
+        , (4, BG.singleton "SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN")
+        , (5, BG.singleton "SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE")
+        , (6, BG.singleton "SDL_TEXTINPUT_TYPE_NUMBER")
+        , (7, BG.singleton "SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN")
+        , (8, BG.singleton "SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_TextInputType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_TextInputType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_TextInputType where
+  minDeclaredValue = SDL_TEXTINPUT_TYPE_TEXT
+
+  maxDeclaredValue =
+    SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE
+
+instance Show SDL_TextInputType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_TextInputType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_TextInputType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextInputType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TextInputType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TextInputType "unwrap" where
+  type CFieldType SDL_TextInputType "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The input is text
+--
+--     [C declaration]: @SDL_TEXTINPUT_TYPE_TEXT@, defined at @SDL3\/SDL_keyboard.h 393:5@
+pattern SDL_TEXTINPUT_TYPE_TEXT :: SDL_TextInputType
+pattern SDL_TEXTINPUT_TYPE_TEXT = SDL_TextInputType 0
+
+-- | The input is a person\'s name
+--
+--     [C declaration]: @SDL_TEXTINPUT_TYPE_TEXT_NAME@, defined at @SDL3\/SDL_keyboard.h 394:5@
+pattern SDL_TEXTINPUT_TYPE_TEXT_NAME :: SDL_TextInputType
+pattern SDL_TEXTINPUT_TYPE_TEXT_NAME = SDL_TextInputType 1
+
+-- | The input is an e-mail address
+--
+--     [C declaration]: @SDL_TEXTINPUT_TYPE_TEXT_EMAIL@, defined at @SDL3\/SDL_keyboard.h 395:5@
+pattern SDL_TEXTINPUT_TYPE_TEXT_EMAIL :: SDL_TextInputType
+pattern SDL_TEXTINPUT_TYPE_TEXT_EMAIL = SDL_TextInputType 2
+
+-- | The input is a username
+--
+--     [C declaration]: @SDL_TEXTINPUT_TYPE_TEXT_USERNAME@, defined at @SDL3\/SDL_keyboard.h 396:5@
+pattern SDL_TEXTINPUT_TYPE_TEXT_USERNAME :: SDL_TextInputType
+pattern SDL_TEXTINPUT_TYPE_TEXT_USERNAME = SDL_TextInputType 3
+
+-- | The input is a secure password that is hidden
+--
+--     [C declaration]: @SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN@, defined at @SDL3\/SDL_keyboard.h 397:5@
+pattern SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN :: SDL_TextInputType
+pattern SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_HIDDEN = SDL_TextInputType 4
+
+-- | The input is a secure password that is visible
+--
+--     [C declaration]: @SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE@, defined at @SDL3\/SDL_keyboard.h 398:5@
+pattern SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE :: SDL_TextInputType
+pattern SDL_TEXTINPUT_TYPE_TEXT_PASSWORD_VISIBLE = SDL_TextInputType 5
+
+-- | The input is a number
+--
+--     [C declaration]: @SDL_TEXTINPUT_TYPE_NUMBER@, defined at @SDL3\/SDL_keyboard.h 399:5@
+pattern SDL_TEXTINPUT_TYPE_NUMBER :: SDL_TextInputType
+pattern SDL_TEXTINPUT_TYPE_NUMBER = SDL_TextInputType 6
+
+-- | The input is a secure PIN that is hidden
+--
+--     [C declaration]: @SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN@, defined at @SDL3\/SDL_keyboard.h 400:5@
+pattern SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN :: SDL_TextInputType
+pattern SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_HIDDEN = SDL_TextInputType 7
+
+-- | The input is a secure PIN that is visible
+--
+--     [C declaration]: @SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE@, defined at @SDL3\/SDL_keyboard.h 401:5@
+pattern SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE :: SDL_TextInputType
+pattern SDL_TEXTINPUT_TYPE_NUMBER_PASSWORD_VISIBLE = SDL_TextInputType 8
+
+-- | Auto capitalization type.
+--
+--     These are the valid values for SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER. Not every value is valid on every platform, but where a value isn\'t supported, a reasonable fallback will be used.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInputWithProperties'
+--
+--     [C declaration]: @enum SDL_Capitalization@, defined at @SDL3\/SDL_keyboard.h 415:14@
+newtype SDL_Capitalization = SDL_Capitalization
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_Capitalization where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_Capitalization where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Capitalization
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_Capitalization where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Capitalization unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_Capitalization instance BG.Storable SDL_Capitalization
+
+deriving via BG.CUInt instance BG.Prim SDL_Capitalization
+
+instance CEnum.CEnum SDL_Capitalization where
+  type CEnumZ SDL_Capitalization = BG.CUInt
+
+  toCEnum = SDL_Capitalization
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_CAPITALIZE_NONE")
+        , (1, BG.singleton "SDL_CAPITALIZE_SENTENCES")
+        , (2, BG.singleton "SDL_CAPITALIZE_WORDS")
+        , (3, BG.singleton "SDL_CAPITALIZE_LETTERS")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_Capitalization"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_Capitalization"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_Capitalization where
+  minDeclaredValue = SDL_CAPITALIZE_NONE
+
+  maxDeclaredValue = SDL_CAPITALIZE_LETTERS
+
+instance Show SDL_Capitalization where
+  showsPrec = CEnum.shows
+
+instance Read SDL_Capitalization where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_Capitalization ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Capitalization{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_Capitalization) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_Capitalization "unwrap" where
+  type
+    CFieldType SDL_Capitalization "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | No auto-capitalization will be done
+--
+--     [C declaration]: @SDL_CAPITALIZE_NONE@, defined at @SDL3\/SDL_keyboard.h 417:5@
+pattern SDL_CAPITALIZE_NONE :: SDL_Capitalization
+pattern SDL_CAPITALIZE_NONE = SDL_Capitalization 0
+
+-- | The first letter of sentences will be capitalized
+--
+--     [C declaration]: @SDL_CAPITALIZE_SENTENCES@, defined at @SDL3\/SDL_keyboard.h 418:5@
+pattern SDL_CAPITALIZE_SENTENCES :: SDL_Capitalization
+pattern SDL_CAPITALIZE_SENTENCES = SDL_Capitalization 1
+
+-- | The first letter of words will be capitalized
+--
+--     [C declaration]: @SDL_CAPITALIZE_WORDS@, defined at @SDL3\/SDL_keyboard.h 419:5@
+pattern SDL_CAPITALIZE_WORDS :: SDL_Capitalization
+pattern SDL_CAPITALIZE_WORDS = SDL_Capitalization 2
+
+-- | All letters will be capitalized
+--
+--     [C declaration]: @SDL_CAPITALIZE_LETTERS@, defined at @SDL3\/SDL_keyboard.h 420:5@
+pattern SDL_CAPITALIZE_LETTERS :: SDL_Capitalization
+pattern SDL_CAPITALIZE_LETTERS = SDL_Capitalization 3
+
+-- | [C declaration]: @macro SDL_PROP_TEXTINPUT_TYPE_NUMBER@, literal @\"SDL.textinput.type\"@, defined at @SDL3\/SDL_keyboard.h 475:9@
+sDL_PROP_TEXTINPUT_TYPE_NUMBER :: BG.ByteString
+sDL_PROP_TEXTINPUT_TYPE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x69
+    , 0x6E
+    , 0x70
+    , 0x75
+    , 0x74
+    , 0x2E
+    , 0x74
+    , 0x79
+    , 0x70
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER@, literal @\"SDL.textinput.capitalization\"@, defined at @SDL3\/SDL_keyboard.h 476:9@
+sDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER :: BG.ByteString
+sDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x69
+    , 0x6E
+    , 0x70
+    , 0x75
+    , 0x74
+    , 0x2E
+    , 0x63
+    , 0x61
+    , 0x70
+    , 0x69
+    , 0x74
+    , 0x61
+    , 0x6C
+    , 0x69
+    , 0x7A
+    , 0x61
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN@, literal @\"SDL.textinput.autocorrect\"@, defined at @SDL3\/SDL_keyboard.h 477:9@
+sDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN :: BG.ByteString
+sDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x69
+    , 0x6E
+    , 0x70
+    , 0x75
+    , 0x74
+    , 0x2E
+    , 0x61
+    , 0x75
+    , 0x74
+    , 0x6F
+    , 0x63
+    , 0x6F
+    , 0x72
+    , 0x72
+    , 0x65
+    , 0x63
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN@, literal @\"SDL.textinput.multiline\"@, defined at @SDL3\/SDL_keyboard.h 478:9@
+sDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN :: BG.ByteString
+sDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x69
+    , 0x6E
+    , 0x70
+    , 0x75
+    , 0x74
+    , 0x2E
+    , 0x6D
+    , 0x75
+    , 0x6C
+    , 0x74
+    , 0x69
+    , 0x6C
+    , 0x69
+    , 0x6E
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER@, literal @\"SDL.textinput.android.inputtype\"@, defined at @SDL3\/SDL_keyboard.h 479:9@
+sDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER :: BG.ByteString
+sDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x69
+    , 0x6E
+    , 0x70
+    , 0x75
+    , 0x74
+    , 0x2E
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x72
+    , 0x6F
+    , 0x69
+    , 0x64
+    , 0x2E
+    , 0x69
+    , 0x6E
+    , 0x70
+    , 0x75
+    , 0x74
+    , 0x74
+    , 0x79
+    , 0x70
+    , 0x65
+    ]
diff --git a/src/SDL3/Sys/Bindgen/Keyboard/FunPtr.hs b/src/SDL3/Sys/Bindgen/Keyboard/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Keyboard/FunPtr.hs
@@ -0,0 +1,1080 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Keyboard.FunPtr (
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_HasKeyboard,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetKeyboards,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetKeyboardNameForID,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetKeyboardFocus,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetKeyboardState,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_ResetKeyboard,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetModState,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_SetModState,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetKeyFromScancode,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetScancodeFromKey,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_SetScancodeName,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetScancodeName,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetScancodeFromName,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetKeyName,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetKeyFromName,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_StartTextInput,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_StartTextInputWithProperties,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_TextInputActive,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_StopTextInput,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_ClearComposition,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_SetTextInputArea,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_GetTextInputArea,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_HasScreenKeyboardSupport,
+  SDL3.Sys.Bindgen.Keyboard.FunPtr.sDL_ScreenKeyboardShown,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Keyboard
+import SDL3.Sys.Bindgen.Keycode qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Scancode qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_keyboard.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_HasKeyboard */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f2d4cba2f0ac16c1 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasKeyboard;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboards */"
+         , "__attribute__ ((const))"
+         , "SDL_KeyboardID *(*hs_bindgen_07570de4c113f860 (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetKeyboards;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboardNameForID */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_83b903949cfcfe63 (void)) ("
+         , "  SDL_KeyboardID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetKeyboardNameForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboardFocus */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_8df2b4d534724c71 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetKeyboardFocus;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboardState */"
+         , "__attribute__ ((const))"
+         , "_Bool const *(*hs_bindgen_d62d5a74819a4670 (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetKeyboardState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_ResetKeyboard */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_d91e3b4a0a33939a (void)) (void)"
+         , "{"
+         , "  return &SDL_ResetKeyboard;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetModState */"
+         , "__attribute__ ((const))"
+         , "SDL_Keymod (*hs_bindgen_cc0f02de8bc450f1 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetModState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_SetModState */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_6bbf695b3fa0e177 (void)) ("
+         , "  SDL_Keymod arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SetModState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyFromScancode */"
+         , "__attribute__ ((const))"
+         , "SDL_Keycode (*hs_bindgen_c9f6615acff7b796 (void)) ("
+         , "  SDL_Scancode arg1,"
+         , "  SDL_Keymod arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetKeyFromScancode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetScancodeFromKey */"
+         , "__attribute__ ((const))"
+         , "SDL_Scancode (*hs_bindgen_435c07f787a65684 (void)) ("
+         , "  SDL_Keycode arg1,"
+         , "  SDL_Keymod *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetScancodeFromKey;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_SetScancodeName */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_087c95eefbd6f76f (void)) ("
+         , "  SDL_Scancode arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetScancodeName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetScancodeName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_8a2bf360adc31889 (void)) ("
+         , "  SDL_Scancode arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetScancodeName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetScancodeFromName */"
+         , "__attribute__ ((const))"
+         , "SDL_Scancode (*hs_bindgen_b93acbb95d9d0d72 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetScancodeFromName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_f93a8976e79ac924 (void)) ("
+         , "  SDL_Keycode arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetKeyName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyFromName */"
+         , "__attribute__ ((const))"
+         , "SDL_Keycode (*hs_bindgen_b72924cf51764a24 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetKeyFromName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_StartTextInput */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4b6d937c5c094fac (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_StartTextInput;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_StartTextInputWithProperties */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_cef63a814fd09fce (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_StartTextInputWithProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_TextInputActive */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1f67969c2fa5317a (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_TextInputActive;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_StopTextInput */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9b542f1ba0dfe34d (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_StopTextInput;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_ClearComposition */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_60c12ad8dda93779 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ClearComposition;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_SetTextInputArea */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a46b72607b603a3c (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTextInputArea;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetTextInputArea */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b5c6f5df66854547 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTextInputArea;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_HasScreenKeyboardSupport */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e8fffc349e61bb9c (void)) (void)"
+         , "{"
+         , "  return &SDL_HasScreenKeyboardSupport;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_ScreenKeyboardShown */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f094fa8f75a49f31 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ScreenKeyboardShown;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_HasKeyboard@
+foreign import ccall unsafe "hs_bindgen_f2d4cba2f0ac16c1"
+  hs_bindgen_f2d4cba2f0ac16c1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_HasKeyboard@
+hs_bindgen_f2d4cba2f0ac16c1 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_f2d4cba2f0ac16c1 =
+  BG.fromFFIType hs_bindgen_f2d4cba2f0ac16c1_base
+
+{-# NOINLINE sDL_HasKeyboard #-}
+
+-- | Return whether a keyboard is currently connected.
+--
+--     [Returns]: true if a keyboard is connected, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboards'
+--
+--     [C declaration]: @SDL_HasKeyboard@, defined at @SDL3\/SDL_keyboard.h 75:34@
+sDL_HasKeyboard :: BG.FunPtr (IO BG.CBool)
+sDL_HasKeyboard =
+  BG.unsafePerformIO hs_bindgen_f2d4cba2f0ac16c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboards@
+foreign import ccall unsafe "hs_bindgen_07570de4c113f860"
+  hs_bindgen_07570de4c113f860_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboards@
+hs_bindgen_07570de4c113f860 :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_KeyboardID)))
+hs_bindgen_07570de4c113f860 =
+  BG.fromFFIType hs_bindgen_07570de4c113f860_base
+
+{-# NOINLINE sDL_GetKeyboards #-}
+
+-- | Get a list of currently connected keyboards.
+--
+--     Note that this will include any device or virtual driver that includes keyboard functionality, including some mice, KVM switches, motherboard power buttons, etc. You should wait for input from a device before you consider it actively in use.
+--
+--     [@count@]: a pointer filled in with the number of keyboards returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of keyboards instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboardNameForID', 'sDL_HasKeyboard'
+--
+--     [C declaration]: @SDL_GetKeyboards@, defined at @SDL3\/SDL_keyboard.h 98:46@
+sDL_GetKeyboards :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_KeyboardID))
+sDL_GetKeyboards =
+  BG.unsafePerformIO hs_bindgen_07570de4c113f860
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboardNameForID@
+foreign import ccall unsafe "hs_bindgen_83b903949cfcfe63"
+  hs_bindgen_83b903949cfcfe63_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboardNameForID@
+hs_bindgen_83b903949cfcfe63 :: IO (BG.FunPtr (SDL_KeyboardID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_83b903949cfcfe63 =
+  BG.fromFFIType hs_bindgen_83b903949cfcfe63_base
+
+{-# NOINLINE sDL_GetKeyboardNameForID #-}
+
+-- | Get the name of a keyboard.
+--
+--     This function returns \"\" if the keyboard doesn\'t have a name.
+--
+--     [@instance_id@]: the keyboard instance ID.
+--
+--     [Returns]: the name of the selected keyboard or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboards'
+--
+--     [C declaration]: @SDL_GetKeyboardNameForID@, defined at @SDL3\/SDL_keyboard.h 115:42@
+sDL_GetKeyboardNameForID :: BG.FunPtr (SDL_KeyboardID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetKeyboardNameForID =
+  BG.unsafePerformIO hs_bindgen_83b903949cfcfe63
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboardFocus@
+foreign import ccall unsafe "hs_bindgen_8df2b4d534724c71"
+  hs_bindgen_8df2b4d534724c71_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboardFocus@
+hs_bindgen_8df2b4d534724c71 :: IO (BG.FunPtr (IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)))
+hs_bindgen_8df2b4d534724c71 =
+  BG.fromFFIType hs_bindgen_8df2b4d534724c71_base
+
+{-# NOINLINE sDL_GetKeyboardFocus #-}
+
+-- | Query the window which currently has keyboard focus.
+--
+--     [Returns]: the window with keyboard focus.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetKeyboardFocus@, defined at @SDL3\/SDL_keyboard.h 126:42@
+sDL_GetKeyboardFocus :: BG.FunPtr (IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window))
+sDL_GetKeyboardFocus =
+  BG.unsafePerformIO hs_bindgen_8df2b4d534724c71
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboardState@
+foreign import ccall unsafe "hs_bindgen_d62d5a74819a4670"
+  hs_bindgen_d62d5a74819a4670_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyboardState@
+hs_bindgen_d62d5a74819a4670 :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (PtrConst.PtrConst BG.CBool)))
+hs_bindgen_d62d5a74819a4670 =
+  BG.fromFFIType hs_bindgen_d62d5a74819a4670_base
+
+{-# NOINLINE sDL_GetKeyboardState #-}
+
+-- | Get a snapshot of the current state of the keyboard.
+--
+--     The pointer returned is a pointer to an internal SDL array. It will be valid for the whole lifetime of the application and should not be freed by the caller.
+--
+--     A array element with a value of true means that the key is pressed and a value of false means that it is not. Indexes into this array are obtained by using SDL_Scancode values.
+--
+--     Use SDL_PumpEvents() to update the state array.
+--
+--     This function gives you the current state after all events have been processed, so if a key or button has been pressed and released before you process events, then the pressed state will never show up in the @SDL_GetKeyboardState()@ calls.
+--
+--     Note: This function doesn\'t take into account whether shift has been pressed or not.
+--
+--     [@numkeys@]: if non-NULL, receives the length of the returned array.
+--
+--     [Returns]: a pointer to an array of key states.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_PumpEvents, 'sDL_ResetKeyboard'
+--
+--     [C declaration]: @SDL_GetKeyboardState@, defined at @SDL3\/SDL_keyboard.h 159:42@
+sDL_GetKeyboardState :: BG.FunPtr (BG.Ptr BG.CInt -> IO (PtrConst.PtrConst BG.CBool))
+sDL_GetKeyboardState =
+  BG.unsafePerformIO hs_bindgen_d62d5a74819a4670
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_ResetKeyboard@
+foreign import ccall unsafe "hs_bindgen_d91e3b4a0a33939a"
+  hs_bindgen_d91e3b4a0a33939a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_ResetKeyboard@
+hs_bindgen_d91e3b4a0a33939a :: IO (BG.FunPtr (IO ()))
+hs_bindgen_d91e3b4a0a33939a =
+  BG.fromFFIType hs_bindgen_d91e3b4a0a33939a_base
+
+{-# NOINLINE sDL_ResetKeyboard #-}
+
+-- | Clear the state of the keyboard.
+--
+--     This function will generate key up events for all pressed keys.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboardState'
+--
+--     [C declaration]: @SDL_ResetKeyboard@, defined at @SDL3\/SDL_keyboard.h 172:34@
+sDL_ResetKeyboard :: BG.FunPtr (IO ())
+sDL_ResetKeyboard =
+  BG.unsafePerformIO hs_bindgen_d91e3b4a0a33939a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetModState@
+foreign import ccall unsafe "hs_bindgen_cc0f02de8bc450f1"
+  hs_bindgen_cc0f02de8bc450f1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetModState@
+hs_bindgen_cc0f02de8bc450f1 :: IO (BG.FunPtr (IO SDL3.Sys.Bindgen.Keycode.SDL_Keymod))
+hs_bindgen_cc0f02de8bc450f1 =
+  BG.fromFFIType hs_bindgen_cc0f02de8bc450f1_base
+
+{-# NOINLINE sDL_GetModState #-}
+
+-- | Get the current key modifier state for the keyboard.
+--
+--     [Returns]: an OR\'d combination of the modifier keys for the keyboard.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboardState', 'sDL_SetModState'
+--
+--     [C declaration]: @SDL_GetModState@, defined at @SDL3\/SDL_keyboard.h 186:40@
+sDL_GetModState :: BG.FunPtr (IO SDL3.Sys.Bindgen.Keycode.SDL_Keymod)
+sDL_GetModState =
+  BG.unsafePerformIO hs_bindgen_cc0f02de8bc450f1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_SetModState@
+foreign import ccall unsafe "hs_bindgen_6bbf695b3fa0e177"
+  hs_bindgen_6bbf695b3fa0e177_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_SetModState@
+hs_bindgen_6bbf695b3fa0e177 :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Keycode.SDL_Keymod -> IO ()))
+hs_bindgen_6bbf695b3fa0e177 =
+  BG.fromFFIType hs_bindgen_6bbf695b3fa0e177_base
+
+{-# NOINLINE sDL_SetModState #-}
+
+-- | Set the current key modifier state for the keyboard.
+--
+--     The inverse of @SDL_GetModState()@, @SDL_SetModState()@ allows you to impose modifier key states on your application. Simply pass your desired modifier states into @modstate@. This value may be a bitwise, OR\'d combination of SDL_Keymod values.
+--
+--     This does not change the keyboard state, only the key modifier flags that SDL reports.
+--
+--     [@modstate@]: the desired SDL_Keymod for the keyboard.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetModState'
+--
+--     [C declaration]: @SDL_SetModState@, defined at @SDL3\/SDL_keyboard.h 207:34@
+sDL_SetModState :: BG.FunPtr (SDL3.Sys.Bindgen.Keycode.SDL_Keymod -> IO ())
+sDL_SetModState =
+  BG.unsafePerformIO hs_bindgen_6bbf695b3fa0e177
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyFromScancode@
+foreign import ccall unsafe "hs_bindgen_c9f6615acff7b796"
+  hs_bindgen_c9f6615acff7b796_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyFromScancode@
+hs_bindgen_c9f6615acff7b796
+  :: IO
+       ( BG.FunPtr
+           ( SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+             -> SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+             -> BG.CBool
+             -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+           )
+       )
+hs_bindgen_c9f6615acff7b796 =
+  BG.fromFFIType hs_bindgen_c9f6615acff7b796_base
+
+{-# NOINLINE sDL_GetKeyFromScancode #-}
+
+-- | Get the key code corresponding to the given scancode according to the current keyboard layout.
+--
+--     If you want to get the keycode as it would be delivered in key events, including options specified in SDL_HINT_KEYCODE_OPTIONS, then you should pass @key_event@ as true. Otherwise this function simply translates the scancode based on the given modifier state.
+--
+--     [@scancode@]: the desired SDL_Scancode to query.
+--
+--     [@modstate@]: the modifier state to use when translating the scancode to a keycode.
+--
+--     [@key_event@]: true if the keycode will be used in key events.
+--
+--     [Returns]: the SDL_Keycode that corresponds to the given SDL_Scancode.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyName', 'sDL_GetScancodeFromKey'
+--
+--     [C declaration]: @SDL_GetKeyFromScancode@, defined at @SDL3\/SDL_keyboard.h 231:41@
+sDL_GetKeyFromScancode
+  :: BG.FunPtr
+       ( SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+         -> SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+         -> BG.CBool
+         -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+       )
+sDL_GetKeyFromScancode =
+  BG.unsafePerformIO hs_bindgen_c9f6615acff7b796
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetScancodeFromKey@
+foreign import ccall unsafe "hs_bindgen_435c07f787a65684"
+  hs_bindgen_435c07f787a65684_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetScancodeFromKey@
+hs_bindgen_435c07f787a65684
+  :: IO
+       ( BG.FunPtr
+           ( SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+             -> BG.Ptr SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+             -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+           )
+       )
+hs_bindgen_435c07f787a65684 =
+  BG.fromFFIType hs_bindgen_435c07f787a65684_base
+
+{-# NOINLINE sDL_GetScancodeFromKey #-}
+
+-- | Get the scancode corresponding to the given key code according to the current keyboard layout.
+--
+--     Note that there may be multiple scancode+modifier states that can generate this keycode, this will just return the first one found.
+--
+--     [@key@]: the desired SDL_Keycode to query.
+--
+--     [@modstate@]: a pointer to the modifier state that would be used when the scancode generates this key, may be NULL.
+--
+--     [Returns]: the SDL_Scancode that corresponds to the given SDL_Keycode.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromScancode', 'sDL_GetScancodeName'
+--
+--     [C declaration]: @SDL_GetScancodeFromKey@, defined at @SDL3\/SDL_keyboard.h 252:42@
+sDL_GetScancodeFromKey
+  :: BG.FunPtr
+       ( SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+         -> BG.Ptr SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+         -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+       )
+sDL_GetScancodeFromKey =
+  BG.unsafePerformIO hs_bindgen_435c07f787a65684
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_SetScancodeName@
+foreign import ccall unsafe "hs_bindgen_087c95eefbd6f76f"
+  hs_bindgen_087c95eefbd6f76f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_SetScancodeName@
+hs_bindgen_087c95eefbd6f76f
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Scancode.SDL_Scancode -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_087c95eefbd6f76f =
+  BG.fromFFIType hs_bindgen_087c95eefbd6f76f_base
+
+{-# NOINLINE sDL_SetScancodeName #-}
+
+-- | Set a human-readable name for a scancode.
+--
+--     [@scancode@]: the desired SDL_Scancode.
+--
+--     [@name@]: the name to use for the scancode, encoded as UTF-8. The string is not copied, so the pointer given to this function must stay valid while SDL is being used.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetScancodeName'
+--
+--     [C declaration]: @SDL_SetScancodeName@, defined at @SDL3\/SDL_keyboard.h 270:34@
+sDL_SetScancodeName
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Scancode.SDL_Scancode -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SetScancodeName =
+  BG.unsafePerformIO hs_bindgen_087c95eefbd6f76f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetScancodeName@
+foreign import ccall unsafe "hs_bindgen_8a2bf360adc31889"
+  hs_bindgen_8a2bf360adc31889_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetScancodeName@
+hs_bindgen_8a2bf360adc31889
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Scancode.SDL_Scancode -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_8a2bf360adc31889 =
+  BG.fromFFIType hs_bindgen_8a2bf360adc31889_base
+
+{-# NOINLINE sDL_GetScancodeName #-}
+
+-- | Get a human-readable name for a scancode.
+--
+--     __Warning__: The returned name is by design not stable across platforms, e.g. the name for @SDL_SCANCODE_LGUI@ is \"Left GUI\" under Linux but \"Left Windows\" under Microsoft Windows, and some scancodes like @SDL_SCANCODE_NONUSBACKSLASH@ don\'t have any name at all. There are even scancodes that share names, e.g. @SDL_SCANCODE_RETURN@ and @SDL_SCANCODE_RETURN2@ (both called \"Return\"). This function is therefore unsuitable for creating a stable cross-platform two-way mapping between strings and scancodes.
+--
+--     [@scancode@]: the desired SDL_Scancode to query.
+--
+--     [Returns]: a pointer to the name for the scancode. If the scancode doesn\'t have a name this function returns an empty string (\"\").
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetScancodeFromKey', 'sDL_GetScancodeFromName', 'sDL_SetScancodeName'
+--
+--     [C declaration]: @SDL_GetScancodeName@, defined at @SDL3\/SDL_keyboard.h 296:42@
+sDL_GetScancodeName
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Scancode.SDL_Scancode -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetScancodeName =
+  BG.unsafePerformIO hs_bindgen_8a2bf360adc31889
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetScancodeFromName@
+foreign import ccall unsafe "hs_bindgen_b93acbb95d9d0d72"
+  hs_bindgen_b93acbb95d9d0d72_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetScancodeFromName@
+hs_bindgen_b93acbb95d9d0d72
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode))
+hs_bindgen_b93acbb95d9d0d72 =
+  BG.fromFFIType hs_bindgen_b93acbb95d9d0d72_base
+
+{-# NOINLINE sDL_GetScancodeFromName #-}
+
+-- | Get a scancode from a human-readable name.
+--
+--     [@name@]: the human-readable scancode name.
+--
+--     [Returns]: the SDL_Scancode, or @SDL_SCANCODE_UNKNOWN@ if the name wasn\'t recognized; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromName', 'sDL_GetScancodeFromKey', 'sDL_GetScancodeName'
+--
+--     [C declaration]: @SDL_GetScancodeFromName@, defined at @SDL3\/SDL_keyboard.h 313:42@
+sDL_GetScancodeFromName
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode)
+sDL_GetScancodeFromName =
+  BG.unsafePerformIO hs_bindgen_b93acbb95d9d0d72
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyName@
+foreign import ccall unsafe "hs_bindgen_f93a8976e79ac924"
+  hs_bindgen_f93a8976e79ac924_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyName@
+hs_bindgen_f93a8976e79ac924
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Keycode.SDL_Keycode -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_f93a8976e79ac924 =
+  BG.fromFFIType hs_bindgen_f93a8976e79ac924_base
+
+{-# NOINLINE sDL_GetKeyName #-}
+
+-- | Get a human-readable name for a key.
+--
+--     If the key doesn\'t have a name, this function returns an empty string (\"\").
+--
+--     Letters will be presented in their uppercase form, if applicable.
+--
+--     [@key@]: the desired SDL_Keycode to query.
+--
+--     [Returns]: a UTF-8 encoded string of the key name.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromName', 'sDL_GetKeyFromScancode', 'sDL_GetScancodeFromKey'
+--
+--     [C declaration]: @SDL_GetKeyName@, defined at @SDL3\/SDL_keyboard.h 333:42@
+sDL_GetKeyName
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Keycode.SDL_Keycode -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetKeyName =
+  BG.unsafePerformIO hs_bindgen_f93a8976e79ac924
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyFromName@
+foreign import ccall unsafe "hs_bindgen_b72924cf51764a24"
+  hs_bindgen_b72924cf51764a24_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetKeyFromName@
+hs_bindgen_b72924cf51764a24
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode))
+hs_bindgen_b72924cf51764a24 =
+  BG.fromFFIType hs_bindgen_b72924cf51764a24_base
+
+{-# NOINLINE sDL_GetKeyFromName #-}
+
+-- | Get a key code from a human-readable name.
+--
+--     [@name@]: the human-readable key name.
+--
+--     [Returns]: key code, or @SDLK_UNKNOWN@ if the name wasn\'t recognized; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromScancode', 'sDL_GetKeyName', 'sDL_GetScancodeFromName'
+--
+--     [C declaration]: @SDL_GetKeyFromName@, defined at @SDL3\/SDL_keyboard.h 350:41@
+sDL_GetKeyFromName
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode)
+sDL_GetKeyFromName =
+  BG.unsafePerformIO hs_bindgen_b72924cf51764a24
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_StartTextInput@
+foreign import ccall unsafe "hs_bindgen_4b6d937c5c094fac"
+  hs_bindgen_4b6d937c5c094fac_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_StartTextInput@
+hs_bindgen_4b6d937c5c094fac
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool))
+hs_bindgen_4b6d937c5c094fac =
+  BG.fromFFIType hs_bindgen_4b6d937c5c094fac_base
+
+{-# NOINLINE sDL_StartTextInput #-}
+
+-- | Start accepting Unicode text input events in a window.
+--
+--     This function will enable text input (SDL_EVENT_TEXT_INPUT and SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this function paired with @SDL_StopTextInput()@.
+--
+--     Text input events are not received by default.
+--
+--     On some platforms using this function shows the screen keyboard and\/or activates an IME, which can prevent some key press events from being passed through.
+--
+--     [@window@]: the window to enable text input.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextInputArea', 'sDL_StartTextInputWithProperties', 'sDL_StopTextInput', 'sDL_TextInputActive'
+--
+--     [C declaration]: @SDL_StartTextInput@, defined at @SDL3\/SDL_keyboard.h 378:34@
+sDL_StartTextInput :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool)
+sDL_StartTextInput =
+  BG.unsafePerformIO hs_bindgen_4b6d937c5c094fac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_StartTextInputWithProperties@
+foreign import ccall unsafe "hs_bindgen_cef63a814fd09fce"
+  hs_bindgen_cef63a814fd09fce_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_StartTextInputWithProperties@
+hs_bindgen_cef63a814fd09fce
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_cef63a814fd09fce =
+  BG.fromFFIType hs_bindgen_cef63a814fd09fce_base
+
+{-# NOINLINE sDL_StartTextInputWithProperties #-}
+
+-- | Start accepting Unicode text input events in a window, with properties describing the input.
+--
+--     This function will enable text input (SDL_EVENT_TEXT_INPUT and SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this function paired with @SDL_StopTextInput()@.
+--
+--     Text input events are not received by default.
+--
+--     On some platforms using this function shows the screen keyboard and\/or activates an IME, which can prevent some key press events from being passed through.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_TEXTINPUT_TYPE_NUMBER'@ - an 'SDL_TextInputType' value that describes text being input, defaults to SDL_TEXTINPUT_TYPE_TEXT.
+--
+--     * @'sDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER'@ - an 'SDL_Capitalization' value that describes how text should be capitalized, defaults to SDL_CAPITALIZE_SENTENCES for normal text entry, SDL_CAPITALIZE_WORDS for SDL_TEXTINPUT_TYPE_TEXT_NAME, and SDL_CAPITALIZE_NONE for e-mail addresses, usernames, and passwords.
+--
+--     * @'sDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN'@ - true to enable auto completion and auto correction, defaults to true.
+--
+--     * @'sDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN'@ - true if multiple lines of text are allowed. This defaults to true if SDL_HINT_RETURN_KEY_HIDES_IME is \"0\" or is not set, and defaults to false if SDL_HINT_RETURN_KEY_HIDES_IME is \"1\".
+--
+--     On Android you can directly specify the input type:
+--
+--     * @'sDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER'@ - the text input type to use, overriding other properties. This is documented at [https:\/\/developer.android.com\/reference\/android\/text\/InputType](https://developer.android.com/reference/android/text/InputType)
+--
+--     [@window@]: the window to enable text input.
+--
+--     [@props@]: the properties to use.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextInputArea', 'sDL_StartTextInput', 'sDL_StopTextInput', 'sDL_TextInputActive'
+--
+--     [C declaration]: @SDL_StartTextInputWithProperties@, defined at @SDL3\/SDL_keyboard.h 473:34@
+sDL_StartTextInputWithProperties
+  :: BG.FunPtr
+       ( BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+         -> IO BG.CBool
+       )
+sDL_StartTextInputWithProperties =
+  BG.unsafePerformIO hs_bindgen_cef63a814fd09fce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_TextInputActive@
+foreign import ccall unsafe "hs_bindgen_1f67969c2fa5317a"
+  hs_bindgen_1f67969c2fa5317a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_TextInputActive@
+hs_bindgen_1f67969c2fa5317a
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool))
+hs_bindgen_1f67969c2fa5317a =
+  BG.fromFFIType hs_bindgen_1f67969c2fa5317a_base
+
+{-# NOINLINE sDL_TextInputActive #-}
+
+-- | Check whether or not Unicode text input events are enabled for a window.
+--
+--     [@window@]: the window to check.
+--
+--     [Returns]: true if text input events are enabled else false.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput'
+--
+--     [C declaration]: @SDL_TextInputActive@, defined at @SDL3\/SDL_keyboard.h 493:34@
+sDL_TextInputActive :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool)
+sDL_TextInputActive =
+  BG.unsafePerformIO hs_bindgen_1f67969c2fa5317a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_StopTextInput@
+foreign import ccall unsafe "hs_bindgen_9b542f1ba0dfe34d"
+  hs_bindgen_9b542f1ba0dfe34d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_StopTextInput@
+hs_bindgen_9b542f1ba0dfe34d
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool))
+hs_bindgen_9b542f1ba0dfe34d =
+  BG.fromFFIType hs_bindgen_9b542f1ba0dfe34d_base
+
+{-# NOINLINE sDL_StopTextInput #-}
+
+-- | Stop receiving any text input events in a window.
+--
+--     If @SDL_StartTextInput()@ showed the screen keyboard, this function will hide it.
+--
+--     [@window@]: the window to disable text input.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput'
+--
+--     [C declaration]: @SDL_StopTextInput@, defined at @SDL3\/SDL_keyboard.h 511:34@
+sDL_StopTextInput :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool)
+sDL_StopTextInput =
+  BG.unsafePerformIO hs_bindgen_9b542f1ba0dfe34d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_ClearComposition@
+foreign import ccall unsafe "hs_bindgen_60c12ad8dda93779"
+  hs_bindgen_60c12ad8dda93779_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_ClearComposition@
+hs_bindgen_60c12ad8dda93779
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool))
+hs_bindgen_60c12ad8dda93779 =
+  BG.fromFFIType hs_bindgen_60c12ad8dda93779_base
+
+{-# NOINLINE sDL_ClearComposition #-}
+
+-- | Dismiss the composition window\/IME without disabling the subsystem.
+--
+--     [@window@]: the window to affect.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput', 'sDL_StopTextInput'
+--
+--     [C declaration]: @SDL_ClearComposition@, defined at @SDL3\/SDL_keyboard.h 527:34@
+sDL_ClearComposition :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool)
+sDL_ClearComposition =
+  BG.unsafePerformIO hs_bindgen_60c12ad8dda93779
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_SetTextInputArea@
+foreign import ccall unsafe "hs_bindgen_a46b72607b603a3c"
+  hs_bindgen_a46b72607b603a3c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_SetTextInputArea@
+hs_bindgen_a46b72607b603a3c
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_a46b72607b603a3c =
+  BG.fromFFIType hs_bindgen_a46b72607b603a3c_base
+
+{-# NOINLINE sDL_SetTextInputArea #-}
+
+-- | Set the area used to type Unicode text input.
+--
+--     Native input methods may place a window with word suggestions near the cursor, without covering the text being entered.
+--
+--     [@window@]: the window for which to set the text input area.
+--
+--     [@rect@]: the SDL_Rect representing the text input area, in window coordinates, or NULL to clear it.
+--
+--     [@cursor@]: the offset of the current cursor location relative to @rect->x@, in window coordinates.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextInputArea', 'sDL_StartTextInput'
+--
+--     [C declaration]: @SDL_SetTextInputArea@, defined at @SDL3\/SDL_keyboard.h 550:34@
+sDL_SetTextInputArea
+  :: BG.FunPtr
+       ( BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_SetTextInputArea =
+  BG.unsafePerformIO hs_bindgen_a46b72607b603a3c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetTextInputArea@
+foreign import ccall unsafe "hs_bindgen_b5c6f5df66854547"
+  hs_bindgen_b5c6f5df66854547_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_GetTextInputArea@
+hs_bindgen_b5c6f5df66854547
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.Ptr BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_b5c6f5df66854547 =
+  BG.fromFFIType hs_bindgen_b5c6f5df66854547_base
+
+{-# NOINLINE sDL_GetTextInputArea #-}
+
+-- | Get the area used to type Unicode text input.
+--
+--     This returns the values previously set by @SDL_SetTextInputArea()@.
+--
+--     [@window@]: the window for which to query the text input area.
+--
+--     [@rect@]: a pointer to an SDL_Rect filled in with the text input area, may be NULL.
+--
+--     [@cursor@]: a pointer to the offset of the current cursor location relative to @rect->x@, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextInputArea'
+--
+--     [C declaration]: @SDL_GetTextInputArea@, defined at @SDL3\/SDL_keyboard.h 571:34@
+sDL_GetTextInputArea
+  :: BG.FunPtr
+       ( BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.Ptr BG.CInt
+         -> IO BG.CBool
+       )
+sDL_GetTextInputArea =
+  BG.unsafePerformIO hs_bindgen_b5c6f5df66854547
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_HasScreenKeyboardSupport@
+foreign import ccall unsafe "hs_bindgen_e8fffc349e61bb9c"
+  hs_bindgen_e8fffc349e61bb9c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_HasScreenKeyboardSupport@
+hs_bindgen_e8fffc349e61bb9c :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_e8fffc349e61bb9c =
+  BG.fromFFIType hs_bindgen_e8fffc349e61bb9c_base
+
+{-# NOINLINE sDL_HasScreenKeyboardSupport #-}
+
+-- | Check whether the platform has screen keyboard support.
+--
+--     [Returns]: true if the platform has some screen keyboard support or false if not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput', 'sDL_ScreenKeyboardShown'
+--
+--     [C declaration]: @SDL_HasScreenKeyboardSupport@, defined at @SDL3\/SDL_keyboard.h 586:34@
+sDL_HasScreenKeyboardSupport :: BG.FunPtr (IO BG.CBool)
+sDL_HasScreenKeyboardSupport =
+  BG.unsafePerformIO hs_bindgen_e8fffc349e61bb9c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_ScreenKeyboardShown@
+foreign import ccall unsafe "hs_bindgen_f094fa8f75a49f31"
+  hs_bindgen_f094fa8f75a49f31_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_get_SDL_ScreenKeyboardShown@
+hs_bindgen_f094fa8f75a49f31
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool))
+hs_bindgen_f094fa8f75a49f31 =
+  BG.fromFFIType hs_bindgen_f094fa8f75a49f31_base
+
+{-# NOINLINE sDL_ScreenKeyboardShown #-}
+
+-- | Check whether the screen keyboard is shown for given window.
+--
+--     [@window@]: the window for which screen keyboard should be queried.
+--
+--     [Returns]: true if screen keyboard is shown or false if not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasScreenKeyboardSupport'
+--
+--     [C declaration]: @SDL_ScreenKeyboardShown@, defined at @SDL3\/SDL_keyboard.h 600:34@
+sDL_ScreenKeyboardShown :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool)
+sDL_ScreenKeyboardShown =
+  BG.unsafePerformIO hs_bindgen_f094fa8f75a49f31
diff --git a/src/SDL3/Sys/Bindgen/Keyboard/Safe.hs b/src/SDL3/Sys/Bindgen/Keyboard/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Keyboard/Safe.hs
@@ -0,0 +1,1032 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Keyboard.Safe (
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_HasKeyboard,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetKeyboards,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetKeyboardNameForID,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetKeyboardFocus,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetKeyboardState,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_ResetKeyboard,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetModState,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_SetModState,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetKeyFromScancode,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetScancodeFromKey,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_SetScancodeName,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetScancodeName,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetScancodeFromName,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetKeyName,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetKeyFromName,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_StartTextInput,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_StartTextInputWithProperties,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_TextInputActive,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_StopTextInput,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_ClearComposition,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_SetTextInputArea,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_GetTextInputArea,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_HasScreenKeyboardSupport,
+  SDL3.Sys.Bindgen.Keyboard.Safe.sDL_ScreenKeyboardShown,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Keyboard
+import SDL3.Sys.Bindgen.Keycode qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Scancode qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_keyboard.h>"
+         , "_Bool hs_bindgen_1ef4ce9325e1d7c1 (void)"
+         , "{"
+         , "  return (SDL_HasKeyboard)();"
+         , "}"
+         , "SDL_KeyboardID *hs_bindgen_b59c0860157b89a3 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyboards)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_cbd6c7684c35aab5 ("
+         , "  SDL_KeyboardID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyboardNameForID)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_4466a0bcf920ec34 (void)"
+         , "{"
+         , "  return (SDL_GetKeyboardFocus)();"
+         , "}"
+         , "_Bool const *hs_bindgen_28f41d367bc840d8 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyboardState)(arg1);"
+         , "}"
+         , "void hs_bindgen_e5be3af904377165 (void)"
+         , "{"
+         , "  (SDL_ResetKeyboard)();"
+         , "}"
+         , "SDL_Keymod hs_bindgen_2b74759b43835352 (void)"
+         , "{"
+         , "  return (SDL_GetModState)();"
+         , "}"
+         , "void hs_bindgen_12c8d03624bdd31a ("
+         , "  SDL_Keymod arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SetModState)(arg1);"
+         , "}"
+         , "SDL_Keycode hs_bindgen_2ed37c1ae220bcdc ("
+         , "  SDL_Scancode arg1,"
+         , "  SDL_Keymod arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyFromScancode)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_Scancode hs_bindgen_fc2da5865c26d1eb ("
+         , "  SDL_Keycode arg1,"
+         , "  SDL_Keymod *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetScancodeFromKey)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d3d1490d83b9909e ("
+         , "  SDL_Scancode arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetScancodeName)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_7fa9ebec253c00ba ("
+         , "  SDL_Scancode arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetScancodeName)(arg1);"
+         , "}"
+         , "SDL_Scancode hs_bindgen_93b32ce48be9ecca ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetScancodeFromName)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_1808b5592239c8c9 ("
+         , "  SDL_Keycode arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyName)(arg1);"
+         , "}"
+         , "SDL_Keycode hs_bindgen_cc4e614de70c9201 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyFromName)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ee1b6ad2d89317cd ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_StartTextInput)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_9f9c608b064a8e66 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_StartTextInputWithProperties)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_459a3903a479c503 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TextInputActive)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_2b5c6adc62fd6b03 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_StopTextInput)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_6b1d107b71fa60e9 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ClearComposition)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_03f0bc714d10f56b ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextInputArea)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_20c88b6d3256a2c4 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextInputArea)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_052de17a6a7b51b1 (void)"
+         , "{"
+         , "  return (SDL_HasScreenKeyboardSupport)();"
+         , "}"
+         , "_Bool hs_bindgen_166e1a8b6522af56 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ScreenKeyboardShown)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_HasKeyboard@
+foreign import ccall safe "hs_bindgen_1ef4ce9325e1d7c1"
+  hs_bindgen_1ef4ce9325e1d7c1_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_HasKeyboard@
+hs_bindgen_1ef4ce9325e1d7c1 :: IO BG.CBool
+hs_bindgen_1ef4ce9325e1d7c1 =
+  BG.fromFFIType hs_bindgen_1ef4ce9325e1d7c1_base
+
+-- | Return whether a keyboard is currently connected.
+--
+--     [Returns]: true if a keyboard is connected, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboards'
+--
+--     [C declaration]: @SDL_HasKeyboard@, defined at @SDL3\/SDL_keyboard.h 75:34@
+sDL_HasKeyboard :: IO BG.CBool
+sDL_HasKeyboard = hs_bindgen_1ef4ce9325e1d7c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyboards@
+foreign import ccall safe "hs_bindgen_b59c0860157b89a3"
+  hs_bindgen_b59c0860157b89a3_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyboards@
+hs_bindgen_b59c0860157b89a3
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_KeyboardID)
+hs_bindgen_b59c0860157b89a3 =
+  BG.fromFFIType hs_bindgen_b59c0860157b89a3_base
+
+-- | Get a list of currently connected keyboards.
+--
+--     Note that this will include any device or virtual driver that includes keyboard functionality, including some mice, KVM switches, motherboard power buttons, etc. You should wait for input from a device before you consider it actively in use.
+--
+--     [Returns]: a 0 terminated array of keyboards instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboardNameForID', 'sDL_HasKeyboard'
+--
+--     [C declaration]: @SDL_GetKeyboards@, defined at @SDL3\/SDL_keyboard.h 98:46@
+sDL_GetKeyboards
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of keyboards returned, may be NULL.
+  -> IO (BG.Ptr SDL_KeyboardID)
+sDL_GetKeyboards = hs_bindgen_b59c0860157b89a3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyboardNameForID@
+foreign import ccall safe "hs_bindgen_cbd6c7684c35aab5"
+  hs_bindgen_cbd6c7684c35aab5_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyboardNameForID@
+hs_bindgen_cbd6c7684c35aab5
+  :: SDL_KeyboardID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_cbd6c7684c35aab5 =
+  BG.fromFFIType hs_bindgen_cbd6c7684c35aab5_base
+
+-- | Get the name of a keyboard.
+--
+--     This function returns \"\" if the keyboard doesn\'t have a name.
+--
+--     [Returns]: the name of the selected keyboard or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboards'
+--
+--     [C declaration]: @SDL_GetKeyboardNameForID@, defined at @SDL3\/SDL_keyboard.h 115:42@
+sDL_GetKeyboardNameForID
+  :: SDL_KeyboardID
+  -- ^
+  --
+  --           [@instance_id@]: the keyboard instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetKeyboardNameForID =
+  hs_bindgen_cbd6c7684c35aab5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyboardFocus@
+foreign import ccall safe "hs_bindgen_4466a0bcf920ec34"
+  hs_bindgen_4466a0bcf920ec34_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyboardFocus@
+hs_bindgen_4466a0bcf920ec34 :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+hs_bindgen_4466a0bcf920ec34 =
+  BG.fromFFIType hs_bindgen_4466a0bcf920ec34_base
+
+-- | Query the window which currently has keyboard focus.
+--
+--     [Returns]: the window with keyboard focus.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetKeyboardFocus@, defined at @SDL3\/SDL_keyboard.h 126:42@
+sDL_GetKeyboardFocus :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+sDL_GetKeyboardFocus = hs_bindgen_4466a0bcf920ec34
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyboardState@
+foreign import ccall safe "hs_bindgen_28f41d367bc840d8"
+  hs_bindgen_28f41d367bc840d8_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyboardState@
+hs_bindgen_28f41d367bc840d8
+  :: BG.Ptr BG.CInt
+  -> IO (PtrConst.PtrConst BG.CBool)
+hs_bindgen_28f41d367bc840d8 =
+  BG.fromFFIType hs_bindgen_28f41d367bc840d8_base
+
+-- | Get a snapshot of the current state of the keyboard.
+--
+--     The pointer returned is a pointer to an internal SDL array. It will be valid for the whole lifetime of the application and should not be freed by the caller.
+--
+--     A array element with a value of true means that the key is pressed and a value of false means that it is not. Indexes into this array are obtained by using SDL_Scancode values.
+--
+--     Use SDL_PumpEvents() to update the state array.
+--
+--     This function gives you the current state after all events have been processed, so if a key or button has been pressed and released before you process events, then the pressed state will never show up in the @SDL_GetKeyboardState()@ calls.
+--
+--     Note: This function doesn\'t take into account whether shift has been pressed or not.
+--
+--     [Returns]: a pointer to an array of key states.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_PumpEvents, 'sDL_ResetKeyboard'
+--
+--     [C declaration]: @SDL_GetKeyboardState@, defined at @SDL3\/SDL_keyboard.h 159:42@
+sDL_GetKeyboardState
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@numkeys@]: if non-NULL, receives the length of the returned array.
+  -> IO (PtrConst.PtrConst BG.CBool)
+sDL_GetKeyboardState = hs_bindgen_28f41d367bc840d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_ResetKeyboard@
+foreign import ccall safe "hs_bindgen_e5be3af904377165"
+  hs_bindgen_e5be3af904377165_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_ResetKeyboard@
+hs_bindgen_e5be3af904377165 :: IO ()
+hs_bindgen_e5be3af904377165 =
+  BG.fromFFIType hs_bindgen_e5be3af904377165_base
+
+-- | Clear the state of the keyboard.
+--
+--     This function will generate key up events for all pressed keys.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboardState'
+--
+--     [C declaration]: @SDL_ResetKeyboard@, defined at @SDL3\/SDL_keyboard.h 172:34@
+sDL_ResetKeyboard :: IO ()
+sDL_ResetKeyboard = hs_bindgen_e5be3af904377165
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetModState@
+foreign import ccall safe "hs_bindgen_2b74759b43835352"
+  hs_bindgen_2b74759b43835352_base
+    :: IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetModState@
+hs_bindgen_2b74759b43835352 :: IO SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+hs_bindgen_2b74759b43835352 =
+  BG.fromFFIType hs_bindgen_2b74759b43835352_base
+
+-- | Get the current key modifier state for the keyboard.
+--
+--     [Returns]: an OR\'d combination of the modifier keys for the keyboard.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboardState', 'sDL_SetModState'
+--
+--     [C declaration]: @SDL_GetModState@, defined at @SDL3\/SDL_keyboard.h 186:40@
+sDL_GetModState :: IO SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+sDL_GetModState = hs_bindgen_2b74759b43835352
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_SetModState@
+foreign import ccall safe "hs_bindgen_12c8d03624bdd31a"
+  hs_bindgen_12c8d03624bdd31a_base
+    :: BG.Word16
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_SetModState@
+hs_bindgen_12c8d03624bdd31a
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -> IO ()
+hs_bindgen_12c8d03624bdd31a =
+  BG.fromFFIType hs_bindgen_12c8d03624bdd31a_base
+
+-- | Set the current key modifier state for the keyboard.
+--
+--     The inverse of @SDL_GetModState()@, @SDL_SetModState()@ allows you to impose modifier key states on your application. Simply pass your desired modifier states into @modstate@. This value may be a bitwise, OR\'d combination of SDL_Keymod values.
+--
+--     This does not change the keyboard state, only the key modifier flags that SDL reports.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetModState'
+--
+--     [C declaration]: @SDL_SetModState@, defined at @SDL3\/SDL_keyboard.h 207:34@
+sDL_SetModState
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: the desired SDL_Keymod for the keyboard.
+  -> IO ()
+sDL_SetModState = hs_bindgen_12c8d03624bdd31a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyFromScancode@
+foreign import ccall safe "hs_bindgen_2ed37c1ae220bcdc"
+  hs_bindgen_2ed37c1ae220bcdc_base
+    :: BG.Word32
+    -> BG.Word16
+    -> BG.Word8
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyFromScancode@
+hs_bindgen_2ed37c1ae220bcdc
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -> SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -> BG.CBool
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+hs_bindgen_2ed37c1ae220bcdc =
+  BG.fromFFIType hs_bindgen_2ed37c1ae220bcdc_base
+
+-- | Get the key code corresponding to the given scancode according to the current keyboard layout.
+--
+--     If you want to get the keycode as it would be delivered in key events, including options specified in SDL_HINT_KEYCODE_OPTIONS, then you should pass @key_event@ as true. Otherwise this function simply translates the scancode based on the given modifier state.
+--
+--     [Returns]: the SDL_Keycode that corresponds to the given SDL_Scancode.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyName', 'sDL_GetScancodeFromKey'
+--
+--     [C declaration]: @SDL_GetKeyFromScancode@, defined at @SDL3\/SDL_keyboard.h 231:41@
+sDL_GetKeyFromScancode
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode to query.
+  -> SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: the modifier state to use when translating the scancode to a keycode.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@key_event@]: true if the keycode will be used in key events.
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+sDL_GetKeyFromScancode = hs_bindgen_2ed37c1ae220bcdc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetScancodeFromKey@
+foreign import ccall safe "hs_bindgen_fc2da5865c26d1eb"
+  hs_bindgen_fc2da5865c26d1eb_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetScancodeFromKey@
+hs_bindgen_fc2da5865c26d1eb
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -> BG.Ptr SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+hs_bindgen_fc2da5865c26d1eb =
+  BG.fromFFIType hs_bindgen_fc2da5865c26d1eb_base
+
+-- | Get the scancode corresponding to the given key code according to the current keyboard layout.
+--
+--     Note that there may be multiple scancode+modifier states that can generate this keycode, this will just return the first one found.
+--
+--     [Returns]: the SDL_Scancode that corresponds to the given SDL_Keycode.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromScancode', 'sDL_GetScancodeName'
+--
+--     [C declaration]: @SDL_GetScancodeFromKey@, defined at @SDL3\/SDL_keyboard.h 252:42@
+sDL_GetScancodeFromKey
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -- ^
+  --
+  --           [@key@]: the desired SDL_Keycode to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: a pointer to the modifier state that would be used when the scancode generates this key, may be NULL.
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+sDL_GetScancodeFromKey = hs_bindgen_fc2da5865c26d1eb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_SetScancodeName@
+foreign import ccall safe "hs_bindgen_d3d1490d83b9909e"
+  hs_bindgen_d3d1490d83b9909e_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_SetScancodeName@
+hs_bindgen_d3d1490d83b9909e
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_d3d1490d83b9909e =
+  BG.fromFFIType hs_bindgen_d3d1490d83b9909e_base
+
+-- | Set a human-readable name for a scancode.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetScancodeName'
+--
+--     [C declaration]: @SDL_SetScancodeName@, defined at @SDL3\/SDL_keyboard.h 270:34@
+sDL_SetScancodeName
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name to use for the scancode, encoded as UTF-8. The string is not copied, so the pointer given to this function must stay valid while SDL is being used.
+  -> IO BG.CBool
+sDL_SetScancodeName = hs_bindgen_d3d1490d83b9909e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetScancodeName@
+foreign import ccall safe "hs_bindgen_7fa9ebec253c00ba"
+  hs_bindgen_7fa9ebec253c00ba_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetScancodeName@
+hs_bindgen_7fa9ebec253c00ba
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_7fa9ebec253c00ba =
+  BG.fromFFIType hs_bindgen_7fa9ebec253c00ba_base
+
+-- | Get a human-readable name for a scancode.
+--
+--     __Warning__: The returned name is by design not stable across platforms, e.g. the name for @SDL_SCANCODE_LGUI@ is \"Left GUI\" under Linux but \"Left Windows\" under Microsoft Windows, and some scancodes like @SDL_SCANCODE_NONUSBACKSLASH@ don\'t have any name at all. There are even scancodes that share names, e.g. @SDL_SCANCODE_RETURN@ and @SDL_SCANCODE_RETURN2@ (both called \"Return\"). This function is therefore unsuitable for creating a stable cross-platform two-way mapping between strings and scancodes.
+--
+--     [Returns]: a pointer to the name for the scancode. If the scancode doesn\'t have a name this function returns an empty string (\"\").
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetScancodeFromKey', 'sDL_GetScancodeFromName', 'sDL_SetScancodeName'
+--
+--     [C declaration]: @SDL_GetScancodeName@, defined at @SDL3\/SDL_keyboard.h 296:42@
+sDL_GetScancodeName
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetScancodeName = hs_bindgen_7fa9ebec253c00ba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetScancodeFromName@
+foreign import ccall safe "hs_bindgen_93b32ce48be9ecca"
+  hs_bindgen_93b32ce48be9ecca_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetScancodeFromName@
+hs_bindgen_93b32ce48be9ecca
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+hs_bindgen_93b32ce48be9ecca =
+  BG.fromFFIType hs_bindgen_93b32ce48be9ecca_base
+
+-- | Get a scancode from a human-readable name.
+--
+--     [Returns]: the SDL_Scancode, or @SDL_SCANCODE_UNKNOWN@ if the name wasn\'t recognized; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromName', 'sDL_GetScancodeFromKey', 'sDL_GetScancodeName'
+--
+--     [C declaration]: @SDL_GetScancodeFromName@, defined at @SDL3\/SDL_keyboard.h 313:42@
+sDL_GetScancodeFromName
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the human-readable scancode name.
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+sDL_GetScancodeFromName = hs_bindgen_93b32ce48be9ecca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyName@
+foreign import ccall safe "hs_bindgen_1808b5592239c8c9"
+  hs_bindgen_1808b5592239c8c9_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyName@
+hs_bindgen_1808b5592239c8c9
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_1808b5592239c8c9 =
+  BG.fromFFIType hs_bindgen_1808b5592239c8c9_base
+
+-- | Get a human-readable name for a key.
+--
+--     If the key doesn\'t have a name, this function returns an empty string (\"\").
+--
+--     Letters will be presented in their uppercase form, if applicable.
+--
+--     [Returns]: a UTF-8 encoded string of the key name.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromName', 'sDL_GetKeyFromScancode', 'sDL_GetScancodeFromKey'
+--
+--     [C declaration]: @SDL_GetKeyName@, defined at @SDL3\/SDL_keyboard.h 333:42@
+sDL_GetKeyName
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -- ^
+  --
+  --           [@key@]: the desired SDL_Keycode to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetKeyName = hs_bindgen_1808b5592239c8c9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyFromName@
+foreign import ccall safe "hs_bindgen_cc4e614de70c9201"
+  hs_bindgen_cc4e614de70c9201_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetKeyFromName@
+hs_bindgen_cc4e614de70c9201
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+hs_bindgen_cc4e614de70c9201 =
+  BG.fromFFIType hs_bindgen_cc4e614de70c9201_base
+
+-- | Get a key code from a human-readable name.
+--
+--     [Returns]: key code, or @SDLK_UNKNOWN@ if the name wasn\'t recognized; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromScancode', 'sDL_GetKeyName', 'sDL_GetScancodeFromName'
+--
+--     [C declaration]: @SDL_GetKeyFromName@, defined at @SDL3\/SDL_keyboard.h 350:41@
+sDL_GetKeyFromName
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the human-readable key name.
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+sDL_GetKeyFromName = hs_bindgen_cc4e614de70c9201
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_StartTextInput@
+foreign import ccall safe "hs_bindgen_ee1b6ad2d89317cd"
+  hs_bindgen_ee1b6ad2d89317cd_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_StartTextInput@
+hs_bindgen_ee1b6ad2d89317cd
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_ee1b6ad2d89317cd =
+  BG.fromFFIType hs_bindgen_ee1b6ad2d89317cd_base
+
+-- | Start accepting Unicode text input events in a window.
+--
+--     This function will enable text input (SDL_EVENT_TEXT_INPUT and SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this function paired with @SDL_StopTextInput()@.
+--
+--     Text input events are not received by default.
+--
+--     On some platforms using this function shows the screen keyboard and\/or activates an IME, which can prevent some key press events from being passed through.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextInputArea', 'sDL_StartTextInputWithProperties', 'sDL_StopTextInput', 'sDL_TextInputActive'
+--
+--     [C declaration]: @SDL_StartTextInput@, defined at @SDL3\/SDL_keyboard.h 378:34@
+sDL_StartTextInput
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to enable text input.
+  -> IO BG.CBool
+sDL_StartTextInput = hs_bindgen_ee1b6ad2d89317cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_StartTextInputWithProperties@
+foreign import ccall safe "hs_bindgen_9f9c608b064a8e66"
+  hs_bindgen_9f9c608b064a8e66_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_StartTextInputWithProperties@
+hs_bindgen_9f9c608b064a8e66
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO BG.CBool
+hs_bindgen_9f9c608b064a8e66 =
+  BG.fromFFIType hs_bindgen_9f9c608b064a8e66_base
+
+-- | Start accepting Unicode text input events in a window, with properties describing the input.
+--
+--     This function will enable text input (SDL_EVENT_TEXT_INPUT and SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this function paired with @SDL_StopTextInput()@.
+--
+--     Text input events are not received by default.
+--
+--     On some platforms using this function shows the screen keyboard and\/or activates an IME, which can prevent some key press events from being passed through.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_TEXTINPUT_TYPE_NUMBER'@ - an 'SDL_TextInputType' value that describes text being input, defaults to SDL_TEXTINPUT_TYPE_TEXT.
+--
+--     * @'sDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER'@ - an 'SDL_Capitalization' value that describes how text should be capitalized, defaults to SDL_CAPITALIZE_SENTENCES for normal text entry, SDL_CAPITALIZE_WORDS for SDL_TEXTINPUT_TYPE_TEXT_NAME, and SDL_CAPITALIZE_NONE for e-mail addresses, usernames, and passwords.
+--
+--     * @'sDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN'@ - true to enable auto completion and auto correction, defaults to true.
+--
+--     * @'sDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN'@ - true if multiple lines of text are allowed. This defaults to true if SDL_HINT_RETURN_KEY_HIDES_IME is \"0\" or is not set, and defaults to false if SDL_HINT_RETURN_KEY_HIDES_IME is \"1\".
+--
+--     On Android you can directly specify the input type:
+--
+--     * @'sDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER'@ - the text input type to use, overriding other properties. This is documented at [https:\/\/developer.android.com\/reference\/android\/text\/InputType](https://developer.android.com/reference/android/text/InputType)
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextInputArea', 'sDL_StartTextInput', 'sDL_StopTextInput', 'sDL_TextInputActive'
+--
+--     [C declaration]: @SDL_StartTextInputWithProperties@, defined at @SDL3\/SDL_keyboard.h 473:34@
+sDL_StartTextInputWithProperties
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to enable text input.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO BG.CBool
+sDL_StartTextInputWithProperties =
+  hs_bindgen_9f9c608b064a8e66
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_TextInputActive@
+foreign import ccall safe "hs_bindgen_459a3903a479c503"
+  hs_bindgen_459a3903a479c503_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_TextInputActive@
+hs_bindgen_459a3903a479c503
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_459a3903a479c503 =
+  BG.fromFFIType hs_bindgen_459a3903a479c503_base
+
+-- | Check whether or not Unicode text input events are enabled for a window.
+--
+--     [Returns]: true if text input events are enabled else false.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput'
+--
+--     [C declaration]: @SDL_TextInputActive@, defined at @SDL3\/SDL_keyboard.h 493:34@
+sDL_TextInputActive
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to check.
+  -> IO BG.CBool
+sDL_TextInputActive = hs_bindgen_459a3903a479c503
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_StopTextInput@
+foreign import ccall safe "hs_bindgen_2b5c6adc62fd6b03"
+  hs_bindgen_2b5c6adc62fd6b03_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_StopTextInput@
+hs_bindgen_2b5c6adc62fd6b03
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_2b5c6adc62fd6b03 =
+  BG.fromFFIType hs_bindgen_2b5c6adc62fd6b03_base
+
+-- | Stop receiving any text input events in a window.
+--
+--     If @SDL_StartTextInput()@ showed the screen keyboard, this function will hide it.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput'
+--
+--     [C declaration]: @SDL_StopTextInput@, defined at @SDL3\/SDL_keyboard.h 511:34@
+sDL_StopTextInput
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to disable text input.
+  -> IO BG.CBool
+sDL_StopTextInput = hs_bindgen_2b5c6adc62fd6b03
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_ClearComposition@
+foreign import ccall safe "hs_bindgen_6b1d107b71fa60e9"
+  hs_bindgen_6b1d107b71fa60e9_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_ClearComposition@
+hs_bindgen_6b1d107b71fa60e9
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_6b1d107b71fa60e9 =
+  BG.fromFFIType hs_bindgen_6b1d107b71fa60e9_base
+
+-- | Dismiss the composition window\/IME without disabling the subsystem.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput', 'sDL_StopTextInput'
+--
+--     [C declaration]: @SDL_ClearComposition@, defined at @SDL3\/SDL_keyboard.h 527:34@
+sDL_ClearComposition
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to affect.
+  -> IO BG.CBool
+sDL_ClearComposition = hs_bindgen_6b1d107b71fa60e9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_SetTextInputArea@
+foreign import ccall safe "hs_bindgen_03f0bc714d10f56b"
+  hs_bindgen_03f0bc714d10f56b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_SetTextInputArea@
+hs_bindgen_03f0bc714d10f56b
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_03f0bc714d10f56b =
+  BG.fromFFIType hs_bindgen_03f0bc714d10f56b_base
+
+-- | Set the area used to type Unicode text input.
+--
+--     Native input methods may place a window with word suggestions near the cursor, without covering the text being entered.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextInputArea', 'sDL_StartTextInput'
+--
+--     [C declaration]: @SDL_SetTextInputArea@, defined at @SDL3\/SDL_keyboard.h 550:34@
+sDL_SetTextInputArea
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to set the text input area.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect representing the text input area, in window coordinates, or NULL to clear it.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@cursor@]: the offset of the current cursor location relative to @rect->x@, in window coordinates.
+  -> IO BG.CBool
+sDL_SetTextInputArea = hs_bindgen_03f0bc714d10f56b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetTextInputArea@
+foreign import ccall safe "hs_bindgen_20c88b6d3256a2c4"
+  hs_bindgen_20c88b6d3256a2c4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_GetTextInputArea@
+hs_bindgen_20c88b6d3256a2c4
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_20c88b6d3256a2c4 =
+  BG.fromFFIType hs_bindgen_20c88b6d3256a2c4_base
+
+-- | Get the area used to type Unicode text input.
+--
+--     This returns the values previously set by @SDL_SetTextInputArea()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextInputArea'
+--
+--     [C declaration]: @SDL_GetTextInputArea@, defined at @SDL3\/SDL_keyboard.h 571:34@
+sDL_GetTextInputArea
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to query the text input area.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to an SDL_Rect filled in with the text input area, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@cursor@]: a pointer to the offset of the current cursor location relative to @rect->x@, may be NULL.
+  -> IO BG.CBool
+sDL_GetTextInputArea = hs_bindgen_20c88b6d3256a2c4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_HasScreenKeyboardSupport@
+foreign import ccall safe "hs_bindgen_052de17a6a7b51b1"
+  hs_bindgen_052de17a6a7b51b1_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_HasScreenKeyboardSupport@
+hs_bindgen_052de17a6a7b51b1 :: IO BG.CBool
+hs_bindgen_052de17a6a7b51b1 =
+  BG.fromFFIType hs_bindgen_052de17a6a7b51b1_base
+
+-- | Check whether the platform has screen keyboard support.
+--
+--     [Returns]: true if the platform has some screen keyboard support or false if not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput', 'sDL_ScreenKeyboardShown'
+--
+--     [C declaration]: @SDL_HasScreenKeyboardSupport@, defined at @SDL3\/SDL_keyboard.h 586:34@
+sDL_HasScreenKeyboardSupport :: IO BG.CBool
+sDL_HasScreenKeyboardSupport =
+  hs_bindgen_052de17a6a7b51b1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_ScreenKeyboardShown@
+foreign import ccall safe "hs_bindgen_166e1a8b6522af56"
+  hs_bindgen_166e1a8b6522af56_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Safe_SDL_ScreenKeyboardShown@
+hs_bindgen_166e1a8b6522af56
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_166e1a8b6522af56 =
+  BG.fromFFIType hs_bindgen_166e1a8b6522af56_base
+
+-- | Check whether the screen keyboard is shown for given window.
+--
+--     [Returns]: true if screen keyboard is shown or false if not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasScreenKeyboardSupport'
+--
+--     [C declaration]: @SDL_ScreenKeyboardShown@, defined at @SDL3\/SDL_keyboard.h 600:34@
+sDL_ScreenKeyboardShown
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which screen keyboard should be queried.
+  -> IO BG.CBool
+sDL_ScreenKeyboardShown = hs_bindgen_166e1a8b6522af56
diff --git a/src/SDL3/Sys/Bindgen/Keyboard/Unsafe.hs b/src/SDL3/Sys/Bindgen/Keyboard/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Keyboard/Unsafe.hs
@@ -0,0 +1,1032 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Keyboard.Unsafe (
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_HasKeyboard,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetKeyboards,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetKeyboardNameForID,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetKeyboardFocus,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetKeyboardState,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_ResetKeyboard,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetModState,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_SetModState,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetKeyFromScancode,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetScancodeFromKey,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_SetScancodeName,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetScancodeName,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetScancodeFromName,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetKeyName,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetKeyFromName,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_StartTextInput,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_StartTextInputWithProperties,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_TextInputActive,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_StopTextInput,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_ClearComposition,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_SetTextInputArea,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_GetTextInputArea,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_HasScreenKeyboardSupport,
+  SDL3.Sys.Bindgen.Keyboard.Unsafe.sDL_ScreenKeyboardShown,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Keyboard
+import SDL3.Sys.Bindgen.Keycode qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Scancode qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_keyboard.h>"
+         , "_Bool hs_bindgen_d64e7e9c8eac060b (void)"
+         , "{"
+         , "  return (SDL_HasKeyboard)();"
+         , "}"
+         , "SDL_KeyboardID *hs_bindgen_5cbd85637f312ec5 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyboards)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_ddca0041795d5b05 ("
+         , "  SDL_KeyboardID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyboardNameForID)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_c75176be07ddf456 (void)"
+         , "{"
+         , "  return (SDL_GetKeyboardFocus)();"
+         , "}"
+         , "_Bool const *hs_bindgen_a0b91f25692e960c ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyboardState)(arg1);"
+         , "}"
+         , "void hs_bindgen_61b9fb1b26a3505c (void)"
+         , "{"
+         , "  (SDL_ResetKeyboard)();"
+         , "}"
+         , "SDL_Keymod hs_bindgen_d1acc028a58a01f0 (void)"
+         , "{"
+         , "  return (SDL_GetModState)();"
+         , "}"
+         , "void hs_bindgen_b05ffb360c052d7c ("
+         , "  SDL_Keymod arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SetModState)(arg1);"
+         , "}"
+         , "SDL_Keycode hs_bindgen_ff76f1254f8fdac9 ("
+         , "  SDL_Scancode arg1,"
+         , "  SDL_Keymod arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyFromScancode)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_Scancode hs_bindgen_3ca1dc40673f0b86 ("
+         , "  SDL_Keycode arg1,"
+         , "  SDL_Keymod *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetScancodeFromKey)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8dafd77961e1a111 ("
+         , "  SDL_Scancode arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetScancodeName)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_b685af9e0919d14c ("
+         , "  SDL_Scancode arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetScancodeName)(arg1);"
+         , "}"
+         , "SDL_Scancode hs_bindgen_7e17fd8d9faf99b2 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetScancodeFromName)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_bc806af89a4922a7 ("
+         , "  SDL_Keycode arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyName)(arg1);"
+         , "}"
+         , "SDL_Keycode hs_bindgen_427d0617876df1a1 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetKeyFromName)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_5a9261502fa2575b ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_StartTextInput)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0c7cd0ff2864a5c4 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_StartTextInputWithProperties)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5c76ed8d45b8c50f ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TextInputActive)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_3ae77c9248468f14 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_StopTextInput)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_2d81775a3f86e350 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ClearComposition)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_6de1e1b47fbde959 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextInputArea)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_e48f604580fa9c58 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextInputArea)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_94887f48a4a41d37 (void)"
+         , "{"
+         , "  return (SDL_HasScreenKeyboardSupport)();"
+         , "}"
+         , "_Bool hs_bindgen_6ec8a3c2431361bd ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ScreenKeyboardShown)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_HasKeyboard@
+foreign import ccall unsafe "hs_bindgen_d64e7e9c8eac060b"
+  hs_bindgen_d64e7e9c8eac060b_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_HasKeyboard@
+hs_bindgen_d64e7e9c8eac060b :: IO BG.CBool
+hs_bindgen_d64e7e9c8eac060b =
+  BG.fromFFIType hs_bindgen_d64e7e9c8eac060b_base
+
+-- | Return whether a keyboard is currently connected.
+--
+--     [Returns]: true if a keyboard is connected, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboards'
+--
+--     [C declaration]: @SDL_HasKeyboard@, defined at @SDL3\/SDL_keyboard.h 75:34@
+sDL_HasKeyboard :: IO BG.CBool
+sDL_HasKeyboard = hs_bindgen_d64e7e9c8eac060b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyboards@
+foreign import ccall unsafe "hs_bindgen_5cbd85637f312ec5"
+  hs_bindgen_5cbd85637f312ec5_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyboards@
+hs_bindgen_5cbd85637f312ec5
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_KeyboardID)
+hs_bindgen_5cbd85637f312ec5 =
+  BG.fromFFIType hs_bindgen_5cbd85637f312ec5_base
+
+-- | Get a list of currently connected keyboards.
+--
+--     Note that this will include any device or virtual driver that includes keyboard functionality, including some mice, KVM switches, motherboard power buttons, etc. You should wait for input from a device before you consider it actively in use.
+--
+--     [Returns]: a 0 terminated array of keyboards instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboardNameForID', 'sDL_HasKeyboard'
+--
+--     [C declaration]: @SDL_GetKeyboards@, defined at @SDL3\/SDL_keyboard.h 98:46@
+sDL_GetKeyboards
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of keyboards returned, may be NULL.
+  -> IO (BG.Ptr SDL_KeyboardID)
+sDL_GetKeyboards = hs_bindgen_5cbd85637f312ec5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyboardNameForID@
+foreign import ccall unsafe "hs_bindgen_ddca0041795d5b05"
+  hs_bindgen_ddca0041795d5b05_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyboardNameForID@
+hs_bindgen_ddca0041795d5b05
+  :: SDL_KeyboardID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_ddca0041795d5b05 =
+  BG.fromFFIType hs_bindgen_ddca0041795d5b05_base
+
+-- | Get the name of a keyboard.
+--
+--     This function returns \"\" if the keyboard doesn\'t have a name.
+--
+--     [Returns]: the name of the selected keyboard or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboards'
+--
+--     [C declaration]: @SDL_GetKeyboardNameForID@, defined at @SDL3\/SDL_keyboard.h 115:42@
+sDL_GetKeyboardNameForID
+  :: SDL_KeyboardID
+  -- ^
+  --
+  --           [@instance_id@]: the keyboard instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetKeyboardNameForID =
+  hs_bindgen_ddca0041795d5b05
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyboardFocus@
+foreign import ccall unsafe "hs_bindgen_c75176be07ddf456"
+  hs_bindgen_c75176be07ddf456_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyboardFocus@
+hs_bindgen_c75176be07ddf456 :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+hs_bindgen_c75176be07ddf456 =
+  BG.fromFFIType hs_bindgen_c75176be07ddf456_base
+
+-- | Query the window which currently has keyboard focus.
+--
+--     [Returns]: the window with keyboard focus.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetKeyboardFocus@, defined at @SDL3\/SDL_keyboard.h 126:42@
+sDL_GetKeyboardFocus :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+sDL_GetKeyboardFocus = hs_bindgen_c75176be07ddf456
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyboardState@
+foreign import ccall unsafe "hs_bindgen_a0b91f25692e960c"
+  hs_bindgen_a0b91f25692e960c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyboardState@
+hs_bindgen_a0b91f25692e960c
+  :: BG.Ptr BG.CInt
+  -> IO (PtrConst.PtrConst BG.CBool)
+hs_bindgen_a0b91f25692e960c =
+  BG.fromFFIType hs_bindgen_a0b91f25692e960c_base
+
+-- | Get a snapshot of the current state of the keyboard.
+--
+--     The pointer returned is a pointer to an internal SDL array. It will be valid for the whole lifetime of the application and should not be freed by the caller.
+--
+--     A array element with a value of true means that the key is pressed and a value of false means that it is not. Indexes into this array are obtained by using SDL_Scancode values.
+--
+--     Use SDL_PumpEvents() to update the state array.
+--
+--     This function gives you the current state after all events have been processed, so if a key or button has been pressed and released before you process events, then the pressed state will never show up in the @SDL_GetKeyboardState()@ calls.
+--
+--     Note: This function doesn\'t take into account whether shift has been pressed or not.
+--
+--     [Returns]: a pointer to an array of key states.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_PumpEvents, 'sDL_ResetKeyboard'
+--
+--     [C declaration]: @SDL_GetKeyboardState@, defined at @SDL3\/SDL_keyboard.h 159:42@
+sDL_GetKeyboardState
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@numkeys@]: if non-NULL, receives the length of the returned array.
+  -> IO (PtrConst.PtrConst BG.CBool)
+sDL_GetKeyboardState = hs_bindgen_a0b91f25692e960c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_ResetKeyboard@
+foreign import ccall unsafe "hs_bindgen_61b9fb1b26a3505c"
+  hs_bindgen_61b9fb1b26a3505c_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_ResetKeyboard@
+hs_bindgen_61b9fb1b26a3505c :: IO ()
+hs_bindgen_61b9fb1b26a3505c =
+  BG.fromFFIType hs_bindgen_61b9fb1b26a3505c_base
+
+-- | Clear the state of the keyboard.
+--
+--     This function will generate key up events for all pressed keys.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboardState'
+--
+--     [C declaration]: @SDL_ResetKeyboard@, defined at @SDL3\/SDL_keyboard.h 172:34@
+sDL_ResetKeyboard :: IO ()
+sDL_ResetKeyboard = hs_bindgen_61b9fb1b26a3505c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetModState@
+foreign import ccall unsafe "hs_bindgen_d1acc028a58a01f0"
+  hs_bindgen_d1acc028a58a01f0_base
+    :: IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetModState@
+hs_bindgen_d1acc028a58a01f0 :: IO SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+hs_bindgen_d1acc028a58a01f0 =
+  BG.fromFFIType hs_bindgen_d1acc028a58a01f0_base
+
+-- | Get the current key modifier state for the keyboard.
+--
+--     [Returns]: an OR\'d combination of the modifier keys for the keyboard.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyboardState', 'sDL_SetModState'
+--
+--     [C declaration]: @SDL_GetModState@, defined at @SDL3\/SDL_keyboard.h 186:40@
+sDL_GetModState :: IO SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+sDL_GetModState = hs_bindgen_d1acc028a58a01f0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_SetModState@
+foreign import ccall unsafe "hs_bindgen_b05ffb360c052d7c"
+  hs_bindgen_b05ffb360c052d7c_base
+    :: BG.Word16
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_SetModState@
+hs_bindgen_b05ffb360c052d7c
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -> IO ()
+hs_bindgen_b05ffb360c052d7c =
+  BG.fromFFIType hs_bindgen_b05ffb360c052d7c_base
+
+-- | Set the current key modifier state for the keyboard.
+--
+--     The inverse of @SDL_GetModState()@, @SDL_SetModState()@ allows you to impose modifier key states on your application. Simply pass your desired modifier states into @modstate@. This value may be a bitwise, OR\'d combination of SDL_Keymod values.
+--
+--     This does not change the keyboard state, only the key modifier flags that SDL reports.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetModState'
+--
+--     [C declaration]: @SDL_SetModState@, defined at @SDL3\/SDL_keyboard.h 207:34@
+sDL_SetModState
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: the desired SDL_Keymod for the keyboard.
+  -> IO ()
+sDL_SetModState = hs_bindgen_b05ffb360c052d7c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyFromScancode@
+foreign import ccall unsafe "hs_bindgen_ff76f1254f8fdac9"
+  hs_bindgen_ff76f1254f8fdac9_base
+    :: BG.Word32
+    -> BG.Word16
+    -> BG.Word8
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyFromScancode@
+hs_bindgen_ff76f1254f8fdac9
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -> SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -> BG.CBool
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+hs_bindgen_ff76f1254f8fdac9 =
+  BG.fromFFIType hs_bindgen_ff76f1254f8fdac9_base
+
+-- | Get the key code corresponding to the given scancode according to the current keyboard layout.
+--
+--     If you want to get the keycode as it would be delivered in key events, including options specified in SDL_HINT_KEYCODE_OPTIONS, then you should pass @key_event@ as true. Otherwise this function simply translates the scancode based on the given modifier state.
+--
+--     [Returns]: the SDL_Keycode that corresponds to the given SDL_Scancode.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyName', 'sDL_GetScancodeFromKey'
+--
+--     [C declaration]: @SDL_GetKeyFromScancode@, defined at @SDL3\/SDL_keyboard.h 231:41@
+sDL_GetKeyFromScancode
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode to query.
+  -> SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: the modifier state to use when translating the scancode to a keycode.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@key_event@]: true if the keycode will be used in key events.
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+sDL_GetKeyFromScancode = hs_bindgen_ff76f1254f8fdac9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetScancodeFromKey@
+foreign import ccall unsafe "hs_bindgen_3ca1dc40673f0b86"
+  hs_bindgen_3ca1dc40673f0b86_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetScancodeFromKey@
+hs_bindgen_3ca1dc40673f0b86
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -> BG.Ptr SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+hs_bindgen_3ca1dc40673f0b86 =
+  BG.fromFFIType hs_bindgen_3ca1dc40673f0b86_base
+
+-- | Get the scancode corresponding to the given key code according to the current keyboard layout.
+--
+--     Note that there may be multiple scancode+modifier states that can generate this keycode, this will just return the first one found.
+--
+--     [Returns]: the SDL_Scancode that corresponds to the given SDL_Keycode.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromScancode', 'sDL_GetScancodeName'
+--
+--     [C declaration]: @SDL_GetScancodeFromKey@, defined at @SDL3\/SDL_keyboard.h 252:42@
+sDL_GetScancodeFromKey
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -- ^
+  --
+  --           [@key@]: the desired SDL_Keycode to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: a pointer to the modifier state that would be used when the scancode generates this key, may be NULL.
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+sDL_GetScancodeFromKey = hs_bindgen_3ca1dc40673f0b86
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_SetScancodeName@
+foreign import ccall unsafe "hs_bindgen_8dafd77961e1a111"
+  hs_bindgen_8dafd77961e1a111_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_SetScancodeName@
+hs_bindgen_8dafd77961e1a111
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_8dafd77961e1a111 =
+  BG.fromFFIType hs_bindgen_8dafd77961e1a111_base
+
+-- | Set a human-readable name for a scancode.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetScancodeName'
+--
+--     [C declaration]: @SDL_SetScancodeName@, defined at @SDL3\/SDL_keyboard.h 270:34@
+sDL_SetScancodeName
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name to use for the scancode, encoded as UTF-8. The string is not copied, so the pointer given to this function must stay valid while SDL is being used.
+  -> IO BG.CBool
+sDL_SetScancodeName = hs_bindgen_8dafd77961e1a111
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetScancodeName@
+foreign import ccall unsafe "hs_bindgen_b685af9e0919d14c"
+  hs_bindgen_b685af9e0919d14c_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetScancodeName@
+hs_bindgen_b685af9e0919d14c
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_b685af9e0919d14c =
+  BG.fromFFIType hs_bindgen_b685af9e0919d14c_base
+
+-- | Get a human-readable name for a scancode.
+--
+--     __Warning__: The returned name is by design not stable across platforms, e.g. the name for @SDL_SCANCODE_LGUI@ is \"Left GUI\" under Linux but \"Left Windows\" under Microsoft Windows, and some scancodes like @SDL_SCANCODE_NONUSBACKSLASH@ don\'t have any name at all. There are even scancodes that share names, e.g. @SDL_SCANCODE_RETURN@ and @SDL_SCANCODE_RETURN2@ (both called \"Return\"). This function is therefore unsuitable for creating a stable cross-platform two-way mapping between strings and scancodes.
+--
+--     [Returns]: a pointer to the name for the scancode. If the scancode doesn\'t have a name this function returns an empty string (\"\").
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetScancodeFromKey', 'sDL_GetScancodeFromName', 'sDL_SetScancodeName'
+--
+--     [C declaration]: @SDL_GetScancodeName@, defined at @SDL3\/SDL_keyboard.h 296:42@
+sDL_GetScancodeName
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetScancodeName = hs_bindgen_b685af9e0919d14c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetScancodeFromName@
+foreign import ccall unsafe "hs_bindgen_7e17fd8d9faf99b2"
+  hs_bindgen_7e17fd8d9faf99b2_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetScancodeFromName@
+hs_bindgen_7e17fd8d9faf99b2
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+hs_bindgen_7e17fd8d9faf99b2 =
+  BG.fromFFIType hs_bindgen_7e17fd8d9faf99b2_base
+
+-- | Get a scancode from a human-readable name.
+--
+--     [Returns]: the SDL_Scancode, or @SDL_SCANCODE_UNKNOWN@ if the name wasn\'t recognized; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromName', 'sDL_GetScancodeFromKey', 'sDL_GetScancodeName'
+--
+--     [C declaration]: @SDL_GetScancodeFromName@, defined at @SDL3\/SDL_keyboard.h 313:42@
+sDL_GetScancodeFromName
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the human-readable scancode name.
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+sDL_GetScancodeFromName = hs_bindgen_7e17fd8d9faf99b2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyName@
+foreign import ccall unsafe "hs_bindgen_bc806af89a4922a7"
+  hs_bindgen_bc806af89a4922a7_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyName@
+hs_bindgen_bc806af89a4922a7
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_bc806af89a4922a7 =
+  BG.fromFFIType hs_bindgen_bc806af89a4922a7_base
+
+-- | Get a human-readable name for a key.
+--
+--     If the key doesn\'t have a name, this function returns an empty string (\"\").
+--
+--     Letters will be presented in their uppercase form, if applicable.
+--
+--     [Returns]: a UTF-8 encoded string of the key name.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromName', 'sDL_GetKeyFromScancode', 'sDL_GetScancodeFromKey'
+--
+--     [C declaration]: @SDL_GetKeyName@, defined at @SDL3\/SDL_keyboard.h 333:42@
+sDL_GetKeyName
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -- ^
+  --
+  --           [@key@]: the desired SDL_Keycode to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetKeyName = hs_bindgen_bc806af89a4922a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyFromName@
+foreign import ccall unsafe "hs_bindgen_427d0617876df1a1"
+  hs_bindgen_427d0617876df1a1_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetKeyFromName@
+hs_bindgen_427d0617876df1a1
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+hs_bindgen_427d0617876df1a1 =
+  BG.fromFFIType hs_bindgen_427d0617876df1a1_base
+
+-- | Get a key code from a human-readable name.
+--
+--     [Returns]: key code, or @SDLK_UNKNOWN@ if the name wasn\'t recognized; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetKeyFromScancode', 'sDL_GetKeyName', 'sDL_GetScancodeFromName'
+--
+--     [C declaration]: @SDL_GetKeyFromName@, defined at @SDL3\/SDL_keyboard.h 350:41@
+sDL_GetKeyFromName
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the human-readable key name.
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+sDL_GetKeyFromName = hs_bindgen_427d0617876df1a1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_StartTextInput@
+foreign import ccall unsafe "hs_bindgen_5a9261502fa2575b"
+  hs_bindgen_5a9261502fa2575b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_StartTextInput@
+hs_bindgen_5a9261502fa2575b
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_5a9261502fa2575b =
+  BG.fromFFIType hs_bindgen_5a9261502fa2575b_base
+
+-- | Start accepting Unicode text input events in a window.
+--
+--     This function will enable text input (SDL_EVENT_TEXT_INPUT and SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this function paired with @SDL_StopTextInput()@.
+--
+--     Text input events are not received by default.
+--
+--     On some platforms using this function shows the screen keyboard and\/or activates an IME, which can prevent some key press events from being passed through.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextInputArea', 'sDL_StartTextInputWithProperties', 'sDL_StopTextInput', 'sDL_TextInputActive'
+--
+--     [C declaration]: @SDL_StartTextInput@, defined at @SDL3\/SDL_keyboard.h 378:34@
+sDL_StartTextInput
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to enable text input.
+  -> IO BG.CBool
+sDL_StartTextInput = hs_bindgen_5a9261502fa2575b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_StartTextInputWithProperties@
+foreign import ccall unsafe "hs_bindgen_0c7cd0ff2864a5c4"
+  hs_bindgen_0c7cd0ff2864a5c4_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_StartTextInputWithProperties@
+hs_bindgen_0c7cd0ff2864a5c4
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO BG.CBool
+hs_bindgen_0c7cd0ff2864a5c4 =
+  BG.fromFFIType hs_bindgen_0c7cd0ff2864a5c4_base
+
+-- | Start accepting Unicode text input events in a window, with properties describing the input.
+--
+--     This function will enable text input (SDL_EVENT_TEXT_INPUT and SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this function paired with @SDL_StopTextInput()@.
+--
+--     Text input events are not received by default.
+--
+--     On some platforms using this function shows the screen keyboard and\/or activates an IME, which can prevent some key press events from being passed through.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_TEXTINPUT_TYPE_NUMBER'@ - an 'SDL_TextInputType' value that describes text being input, defaults to SDL_TEXTINPUT_TYPE_TEXT.
+--
+--     * @'sDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER'@ - an 'SDL_Capitalization' value that describes how text should be capitalized, defaults to SDL_CAPITALIZE_SENTENCES for normal text entry, SDL_CAPITALIZE_WORDS for SDL_TEXTINPUT_TYPE_TEXT_NAME, and SDL_CAPITALIZE_NONE for e-mail addresses, usernames, and passwords.
+--
+--     * @'sDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN'@ - true to enable auto completion and auto correction, defaults to true.
+--
+--     * @'sDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN'@ - true if multiple lines of text are allowed. This defaults to true if SDL_HINT_RETURN_KEY_HIDES_IME is \"0\" or is not set, and defaults to false if SDL_HINT_RETURN_KEY_HIDES_IME is \"1\".
+--
+--     On Android you can directly specify the input type:
+--
+--     * @'sDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER'@ - the text input type to use, overriding other properties. This is documented at [https:\/\/developer.android.com\/reference\/android\/text\/InputType](https://developer.android.com/reference/android/text/InputType)
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextInputArea', 'sDL_StartTextInput', 'sDL_StopTextInput', 'sDL_TextInputActive'
+--
+--     [C declaration]: @SDL_StartTextInputWithProperties@, defined at @SDL3\/SDL_keyboard.h 473:34@
+sDL_StartTextInputWithProperties
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to enable text input.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO BG.CBool
+sDL_StartTextInputWithProperties =
+  hs_bindgen_0c7cd0ff2864a5c4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_TextInputActive@
+foreign import ccall unsafe "hs_bindgen_5c76ed8d45b8c50f"
+  hs_bindgen_5c76ed8d45b8c50f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_TextInputActive@
+hs_bindgen_5c76ed8d45b8c50f
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_5c76ed8d45b8c50f =
+  BG.fromFFIType hs_bindgen_5c76ed8d45b8c50f_base
+
+-- | Check whether or not Unicode text input events are enabled for a window.
+--
+--     [Returns]: true if text input events are enabled else false.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput'
+--
+--     [C declaration]: @SDL_TextInputActive@, defined at @SDL3\/SDL_keyboard.h 493:34@
+sDL_TextInputActive
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to check.
+  -> IO BG.CBool
+sDL_TextInputActive = hs_bindgen_5c76ed8d45b8c50f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_StopTextInput@
+foreign import ccall unsafe "hs_bindgen_3ae77c9248468f14"
+  hs_bindgen_3ae77c9248468f14_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_StopTextInput@
+hs_bindgen_3ae77c9248468f14
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_3ae77c9248468f14 =
+  BG.fromFFIType hs_bindgen_3ae77c9248468f14_base
+
+-- | Stop receiving any text input events in a window.
+--
+--     If @SDL_StartTextInput()@ showed the screen keyboard, this function will hide it.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput'
+--
+--     [C declaration]: @SDL_StopTextInput@, defined at @SDL3\/SDL_keyboard.h 511:34@
+sDL_StopTextInput
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to disable text input.
+  -> IO BG.CBool
+sDL_StopTextInput = hs_bindgen_3ae77c9248468f14
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_ClearComposition@
+foreign import ccall unsafe "hs_bindgen_2d81775a3f86e350"
+  hs_bindgen_2d81775a3f86e350_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_ClearComposition@
+hs_bindgen_2d81775a3f86e350
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_2d81775a3f86e350 =
+  BG.fromFFIType hs_bindgen_2d81775a3f86e350_base
+
+-- | Dismiss the composition window\/IME without disabling the subsystem.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput', 'sDL_StopTextInput'
+--
+--     [C declaration]: @SDL_ClearComposition@, defined at @SDL3\/SDL_keyboard.h 527:34@
+sDL_ClearComposition
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to affect.
+  -> IO BG.CBool
+sDL_ClearComposition = hs_bindgen_2d81775a3f86e350
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_SetTextInputArea@
+foreign import ccall unsafe "hs_bindgen_6de1e1b47fbde959"
+  hs_bindgen_6de1e1b47fbde959_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_SetTextInputArea@
+hs_bindgen_6de1e1b47fbde959
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_6de1e1b47fbde959 =
+  BG.fromFFIType hs_bindgen_6de1e1b47fbde959_base
+
+-- | Set the area used to type Unicode text input.
+--
+--     Native input methods may place a window with word suggestions near the cursor, without covering the text being entered.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextInputArea', 'sDL_StartTextInput'
+--
+--     [C declaration]: @SDL_SetTextInputArea@, defined at @SDL3\/SDL_keyboard.h 550:34@
+sDL_SetTextInputArea
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to set the text input area.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect representing the text input area, in window coordinates, or NULL to clear it.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@cursor@]: the offset of the current cursor location relative to @rect->x@, in window coordinates.
+  -> IO BG.CBool
+sDL_SetTextInputArea = hs_bindgen_6de1e1b47fbde959
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetTextInputArea@
+foreign import ccall unsafe "hs_bindgen_e48f604580fa9c58"
+  hs_bindgen_e48f604580fa9c58_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_GetTextInputArea@
+hs_bindgen_e48f604580fa9c58
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_e48f604580fa9c58 =
+  BG.fromFFIType hs_bindgen_e48f604580fa9c58_base
+
+-- | Get the area used to type Unicode text input.
+--
+--     This returns the values previously set by @SDL_SetTextInputArea()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextInputArea'
+--
+--     [C declaration]: @SDL_GetTextInputArea@, defined at @SDL3\/SDL_keyboard.h 571:34@
+sDL_GetTextInputArea
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to query the text input area.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to an SDL_Rect filled in with the text input area, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@cursor@]: a pointer to the offset of the current cursor location relative to @rect->x@, may be NULL.
+  -> IO BG.CBool
+sDL_GetTextInputArea = hs_bindgen_e48f604580fa9c58
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_HasScreenKeyboardSupport@
+foreign import ccall unsafe "hs_bindgen_94887f48a4a41d37"
+  hs_bindgen_94887f48a4a41d37_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_HasScreenKeyboardSupport@
+hs_bindgen_94887f48a4a41d37 :: IO BG.CBool
+hs_bindgen_94887f48a4a41d37 =
+  BG.fromFFIType hs_bindgen_94887f48a4a41d37_base
+
+-- | Check whether the platform has screen keyboard support.
+--
+--     [Returns]: true if the platform has some screen keyboard support or false if not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StartTextInput', 'sDL_ScreenKeyboardShown'
+--
+--     [C declaration]: @SDL_HasScreenKeyboardSupport@, defined at @SDL3\/SDL_keyboard.h 586:34@
+sDL_HasScreenKeyboardSupport :: IO BG.CBool
+sDL_HasScreenKeyboardSupport =
+  hs_bindgen_94887f48a4a41d37
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_ScreenKeyboardShown@
+foreign import ccall unsafe "hs_bindgen_6ec8a3c2431361bd"
+  hs_bindgen_6ec8a3c2431361bd_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Keyboard_Unsafe_SDL_ScreenKeyboardShown@
+hs_bindgen_6ec8a3c2431361bd
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_6ec8a3c2431361bd =
+  BG.fromFFIType hs_bindgen_6ec8a3c2431361bd_base
+
+-- | Check whether the screen keyboard is shown for given window.
+--
+--     [Returns]: true if screen keyboard is shown or false if not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasScreenKeyboardSupport'
+--
+--     [C declaration]: @SDL_ScreenKeyboardShown@, defined at @SDL3\/SDL_keyboard.h 600:34@
+sDL_ScreenKeyboardShown
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which screen keyboard should be queried.
+  -> IO BG.CBool
+sDL_ScreenKeyboardShown = hs_bindgen_6ec8a3c2431361bd
diff --git a/src/SDL3/Sys/Bindgen/Keycode.hs b/src/SDL3/Sys/Bindgen/Keycode.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Keycode.hs
@@ -0,0 +1,2084 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Defines constants which identify keyboard keys and modifiers.
+--
+--     Please refer to the Best Keyboard Practices document for details on what this information means and how best to use it.
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/BestKeyboardPractices](https://wiki.libsdl.org/SDL3/BestKeyboardPractices) The SDL virtual key representation.
+--
+--     Values of this type are used to represent keyboard keys using the current layout of the keyboard. These values include Unicode values representing the unmodified character that would be generated by pressing the key, or an @SDLK_*@ constant for those keys that do not generate characters.
+--
+--     A special exception is the number keys at the top of the keyboard which map by default to SDLK_0...SDLK_9 on AZERTY layouts.
+--
+--     Keys with the @'sDLK_EXTENDED_MASK'@ bit set do not map to a scancode or Unicode code point.
+--
+--     Many common keycodes are listed below, but this list is not exhaustive.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_HINT_KEYCODE_OPTIONS
+module SDL3.Sys.Bindgen.Keycode (
+  SDL3.Sys.Bindgen.Keycode.SDL_Keycode (..),
+  SDL3.Sys.Bindgen.Keycode.sDLK_EXTENDED_MASK,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SCANCODE_MASK,
+  SDL3.Sys.Bindgen.Keycode.sDL_SCANCODE_TO_KEYCODE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_UNKNOWN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RETURN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_ESCAPE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_BACKSPACE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_TAB,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SPACE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_EXCLAIM,
+  SDL3.Sys.Bindgen.Keycode.sDLK_DBLAPOSTROPHE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_HASH,
+  SDL3.Sys.Bindgen.Keycode.sDLK_DOLLAR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PERCENT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AMPERSAND,
+  SDL3.Sys.Bindgen.Keycode.sDLK_APOSTROPHE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LEFTPAREN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RIGHTPAREN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_ASTERISK,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PLUS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_COMMA,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MINUS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PERIOD,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SLASH,
+  SDL3.Sys.Bindgen.Keycode.sDLK_0,
+  SDL3.Sys.Bindgen.Keycode.sDLK_1,
+  SDL3.Sys.Bindgen.Keycode.sDLK_2,
+  SDL3.Sys.Bindgen.Keycode.sDLK_3,
+  SDL3.Sys.Bindgen.Keycode.sDLK_4,
+  SDL3.Sys.Bindgen.Keycode.sDLK_5,
+  SDL3.Sys.Bindgen.Keycode.sDLK_6,
+  SDL3.Sys.Bindgen.Keycode.sDLK_7,
+  SDL3.Sys.Bindgen.Keycode.sDLK_8,
+  SDL3.Sys.Bindgen.Keycode.sDLK_9,
+  SDL3.Sys.Bindgen.Keycode.sDLK_COLON,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SEMICOLON,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LESS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_EQUALS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_GREATER,
+  SDL3.Sys.Bindgen.Keycode.sDLK_QUESTION,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LEFTBRACKET,
+  SDL3.Sys.Bindgen.Keycode.sDLK_BACKSLASH,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RIGHTBRACKET,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CARET,
+  SDL3.Sys.Bindgen.Keycode.sDLK_UNDERSCORE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_GRAVE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_A,
+  SDL3.Sys.Bindgen.Keycode.sDLK_B,
+  SDL3.Sys.Bindgen.Keycode.sDLK_C,
+  SDL3.Sys.Bindgen.Keycode.sDLK_D,
+  SDL3.Sys.Bindgen.Keycode.sDLK_E,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F,
+  SDL3.Sys.Bindgen.Keycode.sDLK_G,
+  SDL3.Sys.Bindgen.Keycode.sDLK_H,
+  SDL3.Sys.Bindgen.Keycode.sDLK_I,
+  SDL3.Sys.Bindgen.Keycode.sDLK_J,
+  SDL3.Sys.Bindgen.Keycode.sDLK_K,
+  SDL3.Sys.Bindgen.Keycode.sDLK_L,
+  SDL3.Sys.Bindgen.Keycode.sDLK_M,
+  SDL3.Sys.Bindgen.Keycode.sDLK_N,
+  SDL3.Sys.Bindgen.Keycode.sDLK_O,
+  SDL3.Sys.Bindgen.Keycode.sDLK_P,
+  SDL3.Sys.Bindgen.Keycode.sDLK_Q,
+  SDL3.Sys.Bindgen.Keycode.sDLK_R,
+  SDL3.Sys.Bindgen.Keycode.sDLK_S,
+  SDL3.Sys.Bindgen.Keycode.sDLK_T,
+  SDL3.Sys.Bindgen.Keycode.sDLK_U,
+  SDL3.Sys.Bindgen.Keycode.sDLK_V,
+  SDL3.Sys.Bindgen.Keycode.sDLK_W,
+  SDL3.Sys.Bindgen.Keycode.sDLK_X,
+  SDL3.Sys.Bindgen.Keycode.sDLK_Y,
+  SDL3.Sys.Bindgen.Keycode.sDLK_Z,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LEFTBRACE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PIPE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RIGHTBRACE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_TILDE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_DELETE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PLUSMINUS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CAPSLOCK,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F1,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F2,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F3,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F4,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F5,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F6,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F7,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F8,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F9,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F10,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F11,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F12,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PRINTSCREEN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SCROLLLOCK,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PAUSE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_INSERT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_HOME,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PAGEUP,
+  SDL3.Sys.Bindgen.Keycode.sDLK_END,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PAGEDOWN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RIGHT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LEFT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_DOWN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_UP,
+  SDL3.Sys.Bindgen.Keycode.sDLK_NUMLOCKCLEAR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_DIVIDE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_MULTIPLY,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_MINUS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_PLUS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_ENTER,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_1,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_2,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_3,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_4,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_5,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_6,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_7,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_8,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_9,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_0,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_PERIOD,
+  SDL3.Sys.Bindgen.Keycode.sDLK_APPLICATION,
+  SDL3.Sys.Bindgen.Keycode.sDLK_POWER,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_EQUALS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F13,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F14,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F15,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F16,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F17,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F18,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F19,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F20,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F21,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F22,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F23,
+  SDL3.Sys.Bindgen.Keycode.sDLK_F24,
+  SDL3.Sys.Bindgen.Keycode.sDLK_EXECUTE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_HELP,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MENU,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SELECT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_STOP,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AGAIN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_UNDO,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CUT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_COPY,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PASTE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_FIND,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MUTE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_VOLUMEUP,
+  SDL3.Sys.Bindgen.Keycode.sDLK_VOLUMEDOWN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_COMMA,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_EQUALSAS400,
+  SDL3.Sys.Bindgen.Keycode.sDLK_ALTERASE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SYSREQ,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CANCEL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CLEAR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_PRIOR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RETURN2,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SEPARATOR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_OUT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_OPER,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CLEARAGAIN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CRSEL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_EXSEL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_00,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_000,
+  SDL3.Sys.Bindgen.Keycode.sDLK_THOUSANDSSEPARATOR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_DECIMALSEPARATOR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CURRENCYUNIT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CURRENCYSUBUNIT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_LEFTPAREN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_RIGHTPAREN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_LEFTBRACE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_RIGHTBRACE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_TAB,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_BACKSPACE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_A,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_B,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_C,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_D,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_E,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_F,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_XOR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_POWER,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_PERCENT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_LESS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_GREATER,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_AMPERSAND,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_DBLAMPERSAND,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_VERTICALBAR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_DBLVERTICALBAR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_COLON,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_HASH,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_SPACE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_AT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_EXCLAM,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_MEMSTORE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_MEMRECALL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_MEMCLEAR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_MEMADD,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_MEMSUBTRACT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_MEMMULTIPLY,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_MEMDIVIDE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_PLUSMINUS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_CLEAR,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_CLEARENTRY,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_BINARY,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_OCTAL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_DECIMAL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_KP_HEXADECIMAL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LCTRL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LSHIFT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LALT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LGUI,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RCTRL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RSHIFT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RALT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RGUI,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MODE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SLEEP,
+  SDL3.Sys.Bindgen.Keycode.sDLK_WAKE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CHANNEL_INCREMENT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CHANNEL_DECREMENT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_PLAY,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_PAUSE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_RECORD,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_FAST_FORWARD,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_REWIND,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_NEXT_TRACK,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_PREVIOUS_TRACK,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_STOP,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_EJECT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_PLAY_PAUSE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MEDIA_SELECT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_NEW,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_OPEN,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_CLOSE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_EXIT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_SAVE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_PRINT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_PROPERTIES,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_SEARCH,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_HOME,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_BACK,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_FORWARD,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_STOP,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_REFRESH,
+  SDL3.Sys.Bindgen.Keycode.sDLK_AC_BOOKMARKS,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SOFTLEFT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_SOFTRIGHT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_CALL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_ENDCALL,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LEFT_TAB,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LEVEL5_SHIFT,
+  SDL3.Sys.Bindgen.Keycode.sDLK_MULTI_KEY_COMPOSE,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LMETA,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RMETA,
+  SDL3.Sys.Bindgen.Keycode.sDLK_LHYPER,
+  SDL3.Sys.Bindgen.Keycode.sDLK_RHYPER,
+  SDL3.Sys.Bindgen.Keycode.SDL_Keymod (..),
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_NONE,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_LSHIFT,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_RSHIFT,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_LEVEL5,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_LCTRL,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_RCTRL,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_LALT,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_RALT,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_LGUI,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_RGUI,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_NUM,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_CAPS,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_MODE,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_SCROLL,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_CTRL,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_SHIFT,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_ALT,
+  SDL3.Sys.Bindgen.Keycode.sDL_KMOD_GUI,
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_Keycode@, defined at @SDL3\/SDL_keycode.h 59:16@
+newtype SDL_Keycode = SDL_Keycode
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_Keycode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Keycode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_Keycode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_Keycode "unwrap" where
+  type
+    CFieldType SDL_Keycode "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @macro SDLK_EXTENDED_MASK@, defined at @SDL3\/SDL_keycode.h 61:9@
+sDLK_EXTENDED_MASK :: BG.CUInt
+sDLK_EXTENDED_MASK =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (29 :: BG.CInt)
+
+-- | [C declaration]: @macro SDLK_SCANCODE_MASK@, defined at @SDL3\/SDL_keycode.h 62:9@
+sDLK_SCANCODE_MASK :: BG.CUInt
+sDLK_SCANCODE_MASK =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (30 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_SCANCODE_TO_KEYCODE@, defined at @SDL3\/SDL_keycode.h 63:9@
+sDL_SCANCODE_TO_KEYCODE
+  :: forall a0. (C.Expr.HostPlatform.Bitwise a0 BG.CUInt) => a0 -> C.Expr.HostPlatform.BitsRes a0 BG.CUInt
+sDL_SCANCODE_TO_KEYCODE =
+  \x0 ->
+    (C.Expr.HostPlatform..|.) x0 sDLK_SCANCODE_MASK
+
+-- | 0
+--
+--     [C declaration]: @macro SDLK_UNKNOWN@, defined at @SDL3\/SDL_keycode.h 64:9@
+sDLK_UNKNOWN :: BG.CUInt
+sDLK_UNKNOWN = (0 :: BG.CUInt)
+
+-- | \'\\r\'
+--
+--     [C declaration]: @macro SDLK_RETURN@, defined at @SDL3\/SDL_keycode.h 65:9@
+sDLK_RETURN :: BG.CUInt
+sDLK_RETURN = (13 :: BG.CUInt)
+
+-- | \'\\x1B\'
+--
+--     [C declaration]: @macro SDLK_ESCAPE@, defined at @SDL3\/SDL_keycode.h 66:9@
+sDLK_ESCAPE :: BG.CUInt
+sDLK_ESCAPE = (27 :: BG.CUInt)
+
+-- | \' ____ \'
+--
+--     [C declaration]: @macro SDLK_BACKSPACE@, defined at @SDL3\/SDL_keycode.h 67:9@
+sDLK_BACKSPACE :: BG.CUInt
+sDLK_BACKSPACE = (8 :: BG.CUInt)
+
+-- | \'\\t\'
+--
+--     [C declaration]: @macro SDLK_TAB@, defined at @SDL3\/SDL_keycode.h 68:9@
+sDLK_TAB :: BG.CUInt
+sDLK_TAB = (9 :: BG.CUInt)
+
+-- | \' \'
+--
+--     [C declaration]: @macro SDLK_SPACE@, defined at @SDL3\/SDL_keycode.h 69:9@
+sDLK_SPACE :: BG.CUInt
+sDLK_SPACE = (32 :: BG.CUInt)
+
+-- | \'!\'
+--
+--     [C declaration]: @macro SDLK_EXCLAIM@, defined at @SDL3\/SDL_keycode.h 70:9@
+sDLK_EXCLAIM :: BG.CUInt
+sDLK_EXCLAIM = (33 :: BG.CUInt)
+
+-- | \'\"\'
+--
+--     [C declaration]: @macro SDLK_DBLAPOSTROPHE@, defined at @SDL3\/SDL_keycode.h 71:9@
+sDLK_DBLAPOSTROPHE :: BG.CUInt
+sDLK_DBLAPOSTROPHE = (34 :: BG.CUInt)
+
+-- | \'\#\'
+--
+--     [C declaration]: @macro SDLK_HASH@, defined at @SDL3\/SDL_keycode.h 72:9@
+sDLK_HASH :: BG.CUInt
+sDLK_HASH = (35 :: BG.CUInt)
+
+-- | \'\$\'
+--
+--     [C declaration]: @macro SDLK_DOLLAR@, defined at @SDL3\/SDL_keycode.h 73:9@
+sDLK_DOLLAR :: BG.CUInt
+sDLK_DOLLAR = (36 :: BG.CUInt)
+
+-- | \'\'
+--
+--     [C declaration]: @macro SDLK_PERCENT@, defined at @SDL3\/SDL_keycode.h 74:9@
+sDLK_PERCENT :: BG.CUInt
+sDLK_PERCENT = (37 :: BG.CUInt)
+
+-- | \'&\'
+--
+--     [C declaration]: @macro SDLK_AMPERSAND@, defined at @SDL3\/SDL_keycode.h 75:9@
+sDLK_AMPERSAND :: BG.CUInt
+sDLK_AMPERSAND = (38 :: BG.CUInt)
+
+-- | \'\\\'\'
+--
+--     [C declaration]: @macro SDLK_APOSTROPHE@, defined at @SDL3\/SDL_keycode.h 76:9@
+sDLK_APOSTROPHE :: BG.CUInt
+sDLK_APOSTROPHE = (39 :: BG.CUInt)
+
+-- | \'(\'
+--
+--     [C declaration]: @macro SDLK_LEFTPAREN@, defined at @SDL3\/SDL_keycode.h 77:9@
+sDLK_LEFTPAREN :: BG.CUInt
+sDLK_LEFTPAREN = (40 :: BG.CUInt)
+
+-- | \')\'
+--
+--     [C declaration]: @macro SDLK_RIGHTPAREN@, defined at @SDL3\/SDL_keycode.h 78:9@
+sDLK_RIGHTPAREN :: BG.CUInt
+sDLK_RIGHTPAREN = (41 :: BG.CUInt)
+
+-- | \'*\'
+--
+--     [C declaration]: @macro SDLK_ASTERISK@, defined at @SDL3\/SDL_keycode.h 79:9@
+sDLK_ASTERISK :: BG.CUInt
+sDLK_ASTERISK = (42 :: BG.CUInt)
+
+-- | \'+\'
+--
+--     [C declaration]: @macro SDLK_PLUS@, defined at @SDL3\/SDL_keycode.h 80:9@
+sDLK_PLUS :: BG.CUInt
+sDLK_PLUS = (43 :: BG.CUInt)
+
+-- | \',\'
+--
+--     [C declaration]: @macro SDLK_COMMA@, defined at @SDL3\/SDL_keycode.h 81:9@
+sDLK_COMMA :: BG.CUInt
+sDLK_COMMA = (44 :: BG.CUInt)
+
+-- | \'-\'
+--
+--     [C declaration]: @macro SDLK_MINUS@, defined at @SDL3\/SDL_keycode.h 82:9@
+sDLK_MINUS :: BG.CUInt
+sDLK_MINUS = (45 :: BG.CUInt)
+
+-- | \'.\'
+--
+--     [C declaration]: @macro SDLK_PERIOD@, defined at @SDL3\/SDL_keycode.h 83:9@
+sDLK_PERIOD :: BG.CUInt
+sDLK_PERIOD = (46 :: BG.CUInt)
+
+-- | \'\/\'
+--
+--     [C declaration]: @macro SDLK_SLASH@, defined at @SDL3\/SDL_keycode.h 84:9@
+sDLK_SLASH :: BG.CUInt
+sDLK_SLASH = (47 :: BG.CUInt)
+
+-- | \'0\'
+--
+--     [C declaration]: @macro SDLK_0@, defined at @SDL3\/SDL_keycode.h 85:9@
+sDLK_0 :: BG.CUInt
+sDLK_0 = (48 :: BG.CUInt)
+
+-- | \'1\'
+--
+--     [C declaration]: @macro SDLK_1@, defined at @SDL3\/SDL_keycode.h 86:9@
+sDLK_1 :: BG.CUInt
+sDLK_1 = (49 :: BG.CUInt)
+
+-- | \'2\'
+--
+--     [C declaration]: @macro SDLK_2@, defined at @SDL3\/SDL_keycode.h 87:9@
+sDLK_2 :: BG.CUInt
+sDLK_2 = (50 :: BG.CUInt)
+
+-- | \'3\'
+--
+--     [C declaration]: @macro SDLK_3@, defined at @SDL3\/SDL_keycode.h 88:9@
+sDLK_3 :: BG.CUInt
+sDLK_3 = (51 :: BG.CUInt)
+
+-- | \'4\'
+--
+--     [C declaration]: @macro SDLK_4@, defined at @SDL3\/SDL_keycode.h 89:9@
+sDLK_4 :: BG.CUInt
+sDLK_4 = (52 :: BG.CUInt)
+
+-- | \'5\'
+--
+--     [C declaration]: @macro SDLK_5@, defined at @SDL3\/SDL_keycode.h 90:9@
+sDLK_5 :: BG.CUInt
+sDLK_5 = (53 :: BG.CUInt)
+
+-- | \'6\'
+--
+--     [C declaration]: @macro SDLK_6@, defined at @SDL3\/SDL_keycode.h 91:9@
+sDLK_6 :: BG.CUInt
+sDLK_6 = (54 :: BG.CUInt)
+
+-- | \'7\'
+--
+--     [C declaration]: @macro SDLK_7@, defined at @SDL3\/SDL_keycode.h 92:9@
+sDLK_7 :: BG.CUInt
+sDLK_7 = (55 :: BG.CUInt)
+
+-- | \'8\'
+--
+--     [C declaration]: @macro SDLK_8@, defined at @SDL3\/SDL_keycode.h 93:9@
+sDLK_8 :: BG.CUInt
+sDLK_8 = (56 :: BG.CUInt)
+
+-- | \'9\'
+--
+--     [C declaration]: @macro SDLK_9@, defined at @SDL3\/SDL_keycode.h 94:9@
+sDLK_9 :: BG.CUInt
+sDLK_9 = (57 :: BG.CUInt)
+
+-- | \':\'
+--
+--     [C declaration]: @macro SDLK_COLON@, defined at @SDL3\/SDL_keycode.h 95:9@
+sDLK_COLON :: BG.CUInt
+sDLK_COLON = (58 :: BG.CUInt)
+
+-- | \';\'
+--
+--     [C declaration]: @macro SDLK_SEMICOLON@, defined at @SDL3\/SDL_keycode.h 96:9@
+sDLK_SEMICOLON :: BG.CUInt
+sDLK_SEMICOLON = (59 :: BG.CUInt)
+
+-- | \'\<\'
+--
+--     [C declaration]: @macro SDLK_LESS@, defined at @SDL3\/SDL_keycode.h 97:9@
+sDLK_LESS :: BG.CUInt
+sDLK_LESS = (60 :: BG.CUInt)
+
+-- | \'=\'
+--
+--     [C declaration]: @macro SDLK_EQUALS@, defined at @SDL3\/SDL_keycode.h 98:9@
+sDLK_EQUALS :: BG.CUInt
+sDLK_EQUALS = (61 :: BG.CUInt)
+
+-- | \'>\'
+--
+--     [C declaration]: @macro SDLK_GREATER@, defined at @SDL3\/SDL_keycode.h 99:9@
+sDLK_GREATER :: BG.CUInt
+sDLK_GREATER = (62 :: BG.CUInt)
+
+-- | \'?\'
+--
+--     [C declaration]: @macro SDLK_QUESTION@, defined at @SDL3\/SDL_keycode.h 100:9@
+sDLK_QUESTION :: BG.CUInt
+sDLK_QUESTION = (63 :: BG.CUInt)
+
+-- | \'\@\'
+--
+--     [C declaration]: @macro SDLK_AT@, defined at @SDL3\/SDL_keycode.h 101:9@
+sDLK_AT :: BG.CUInt
+sDLK_AT = (64 :: BG.CUInt)
+
+-- | \'[\'
+--
+--     [C declaration]: @macro SDLK_LEFTBRACKET@, defined at @SDL3\/SDL_keycode.h 102:9@
+sDLK_LEFTBRACKET :: BG.CUInt
+sDLK_LEFTBRACKET = (91 :: BG.CUInt)
+
+-- | \'\\\'
+--
+--     [C declaration]: @macro SDLK_BACKSLASH@, defined at @SDL3\/SDL_keycode.h 103:9@
+sDLK_BACKSLASH :: BG.CUInt
+sDLK_BACKSLASH = (92 :: BG.CUInt)
+
+-- | \']\'
+--
+--     [C declaration]: @macro SDLK_RIGHTBRACKET@, defined at @SDL3\/SDL_keycode.h 104:9@
+sDLK_RIGHTBRACKET :: BG.CUInt
+sDLK_RIGHTBRACKET = (93 :: BG.CUInt)
+
+-- | \'^\'
+--
+--     [C declaration]: @macro SDLK_CARET@, defined at @SDL3\/SDL_keycode.h 105:9@
+sDLK_CARET :: BG.CUInt
+sDLK_CARET = (94 :: BG.CUInt)
+
+-- | \'_\'
+--
+--     [C declaration]: @macro SDLK_UNDERSCORE@, defined at @SDL3\/SDL_keycode.h 106:9@
+sDLK_UNDERSCORE :: BG.CUInt
+sDLK_UNDERSCORE = (95 :: BG.CUInt)
+
+-- | \'\`\' *\/ \#define SDLK_A \/**\< \'a\'
+--
+--     [C declaration]: @macro SDLK_GRAVE@, defined at @SDL3\/SDL_keycode.h 107:9@
+sDLK_GRAVE :: BG.CUInt
+sDLK_GRAVE = (96 :: BG.CUInt)
+
+-- | [C declaration]: @macro SDLK_A@, defined at @SDL3\/SDL_keycode.h 108:9@
+sDLK_A :: BG.CUInt
+sDLK_A = (97 :: BG.CUInt)
+
+-- | \'b\'
+--
+--     [C declaration]: @macro SDLK_B@, defined at @SDL3\/SDL_keycode.h 109:9@
+sDLK_B :: BG.CUInt
+sDLK_B = (98 :: BG.CUInt)
+
+-- | \'c\'
+--
+--     [C declaration]: @macro SDLK_C@, defined at @SDL3\/SDL_keycode.h 110:9@
+sDLK_C :: BG.CUInt
+sDLK_C = (99 :: BG.CUInt)
+
+-- | \'d\'
+--
+--     [C declaration]: @macro SDLK_D@, defined at @SDL3\/SDL_keycode.h 111:9@
+sDLK_D :: BG.CUInt
+sDLK_D = (100 :: BG.CUInt)
+
+-- | \'e\'
+--
+--     [C declaration]: @macro SDLK_E@, defined at @SDL3\/SDL_keycode.h 112:9@
+sDLK_E :: BG.CUInt
+sDLK_E = (101 :: BG.CUInt)
+
+-- | \'f\'
+--
+--     [C declaration]: @macro SDLK_F@, defined at @SDL3\/SDL_keycode.h 113:9@
+sDLK_F :: BG.CUInt
+sDLK_F = (102 :: BG.CUInt)
+
+-- | \'g\'
+--
+--     [C declaration]: @macro SDLK_G@, defined at @SDL3\/SDL_keycode.h 114:9@
+sDLK_G :: BG.CUInt
+sDLK_G = (103 :: BG.CUInt)
+
+-- | \'h\'
+--
+--     [C declaration]: @macro SDLK_H@, defined at @SDL3\/SDL_keycode.h 115:9@
+sDLK_H :: BG.CUInt
+sDLK_H = (104 :: BG.CUInt)
+
+-- | \'i\'
+--
+--     [C declaration]: @macro SDLK_I@, defined at @SDL3\/SDL_keycode.h 116:9@
+sDLK_I :: BG.CUInt
+sDLK_I = (105 :: BG.CUInt)
+
+-- | \'j\'
+--
+--     [C declaration]: @macro SDLK_J@, defined at @SDL3\/SDL_keycode.h 117:9@
+sDLK_J :: BG.CUInt
+sDLK_J = (106 :: BG.CUInt)
+
+-- | \'k\'
+--
+--     [C declaration]: @macro SDLK_K@, defined at @SDL3\/SDL_keycode.h 118:9@
+sDLK_K :: BG.CUInt
+sDLK_K = (107 :: BG.CUInt)
+
+-- | \'l\'
+--
+--     [C declaration]: @macro SDLK_L@, defined at @SDL3\/SDL_keycode.h 119:9@
+sDLK_L :: BG.CUInt
+sDLK_L = (108 :: BG.CUInt)
+
+-- | \'m\'
+--
+--     [C declaration]: @macro SDLK_M@, defined at @SDL3\/SDL_keycode.h 120:9@
+sDLK_M :: BG.CUInt
+sDLK_M = (109 :: BG.CUInt)
+
+-- | \'n\'
+--
+--     [C declaration]: @macro SDLK_N@, defined at @SDL3\/SDL_keycode.h 121:9@
+sDLK_N :: BG.CUInt
+sDLK_N = (110 :: BG.CUInt)
+
+-- | \'o\'
+--
+--     [C declaration]: @macro SDLK_O@, defined at @SDL3\/SDL_keycode.h 122:9@
+sDLK_O :: BG.CUInt
+sDLK_O = (111 :: BG.CUInt)
+
+-- | \'p\'
+--
+--     [C declaration]: @macro SDLK_P@, defined at @SDL3\/SDL_keycode.h 123:9@
+sDLK_P :: BG.CUInt
+sDLK_P = (112 :: BG.CUInt)
+
+-- | \'q\'
+--
+--     [C declaration]: @macro SDLK_Q@, defined at @SDL3\/SDL_keycode.h 124:9@
+sDLK_Q :: BG.CUInt
+sDLK_Q = (113 :: BG.CUInt)
+
+-- | \'r\'
+--
+--     [C declaration]: @macro SDLK_R@, defined at @SDL3\/SDL_keycode.h 125:9@
+sDLK_R :: BG.CUInt
+sDLK_R = (114 :: BG.CUInt)
+
+-- | \'s\'
+--
+--     [C declaration]: @macro SDLK_S@, defined at @SDL3\/SDL_keycode.h 126:9@
+sDLK_S :: BG.CUInt
+sDLK_S = (115 :: BG.CUInt)
+
+-- | \'t\'
+--
+--     [C declaration]: @macro SDLK_T@, defined at @SDL3\/SDL_keycode.h 127:9@
+sDLK_T :: BG.CUInt
+sDLK_T = (116 :: BG.CUInt)
+
+-- | \'u\'
+--
+--     [C declaration]: @macro SDLK_U@, defined at @SDL3\/SDL_keycode.h 128:9@
+sDLK_U :: BG.CUInt
+sDLK_U = (117 :: BG.CUInt)
+
+-- | \'v\'
+--
+--     [C declaration]: @macro SDLK_V@, defined at @SDL3\/SDL_keycode.h 129:9@
+sDLK_V :: BG.CUInt
+sDLK_V = (118 :: BG.CUInt)
+
+-- | \'w\'
+--
+--     [C declaration]: @macro SDLK_W@, defined at @SDL3\/SDL_keycode.h 130:9@
+sDLK_W :: BG.CUInt
+sDLK_W = (119 :: BG.CUInt)
+
+-- | \'x\'
+--
+--     [C declaration]: @macro SDLK_X@, defined at @SDL3\/SDL_keycode.h 131:9@
+sDLK_X :: BG.CUInt
+sDLK_X = (120 :: BG.CUInt)
+
+-- | \'y\'
+--
+--     [C declaration]: @macro SDLK_Y@, defined at @SDL3\/SDL_keycode.h 132:9@
+sDLK_Y :: BG.CUInt
+sDLK_Y = (121 :: BG.CUInt)
+
+-- | \'z\'
+--
+--     [C declaration]: @macro SDLK_Z@, defined at @SDL3\/SDL_keycode.h 133:9@
+sDLK_Z :: BG.CUInt
+sDLK_Z = (122 :: BG.CUInt)
+
+-- | \'{\'
+--
+--     [C declaration]: @macro SDLK_LEFTBRACE@, defined at @SDL3\/SDL_keycode.h 134:9@
+sDLK_LEFTBRACE :: BG.CUInt
+sDLK_LEFTBRACE = (123 :: BG.CUInt)
+
+-- | \'|\'
+--
+--     [C declaration]: @macro SDLK_PIPE@, defined at @SDL3\/SDL_keycode.h 135:9@
+sDLK_PIPE :: BG.CUInt
+sDLK_PIPE = (124 :: BG.CUInt)
+
+-- | \'}\'
+--
+--     [C declaration]: @macro SDLK_RIGHTBRACE@, defined at @SDL3\/SDL_keycode.h 136:9@
+sDLK_RIGHTBRACE :: BG.CUInt
+sDLK_RIGHTBRACE = (125 :: BG.CUInt)
+
+-- | \'~\'
+--
+--     [C declaration]: @macro SDLK_TILDE@, defined at @SDL3\/SDL_keycode.h 137:9@
+sDLK_TILDE :: BG.CUInt
+sDLK_TILDE = (126 :: BG.CUInt)
+
+-- | \'\\x7F\'
+--
+--     [C declaration]: @macro SDLK_DELETE@, defined at @SDL3\/SDL_keycode.h 138:9@
+sDLK_DELETE :: BG.CUInt
+sDLK_DELETE = (127 :: BG.CUInt)
+
+-- | \'\\xB1\'
+--
+--     [C declaration]: @macro SDLK_PLUSMINUS@, defined at @SDL3\/SDL_keycode.h 139:9@
+sDLK_PLUSMINUS :: BG.CUInt
+sDLK_PLUSMINUS = (177 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CAPSLOCK)@
+--
+--     [C declaration]: @macro SDLK_CAPSLOCK@, defined at @SDL3\/SDL_keycode.h 140:9@
+sDLK_CAPSLOCK :: BG.CUInt
+sDLK_CAPSLOCK = (1073741881 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F1)@
+--
+--     [C declaration]: @macro SDLK_F1@, defined at @SDL3\/SDL_keycode.h 141:9@
+sDLK_F1 :: BG.CUInt
+sDLK_F1 = (1073741882 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F2)@
+--
+--     [C declaration]: @macro SDLK_F2@, defined at @SDL3\/SDL_keycode.h 142:9@
+sDLK_F2 :: BG.CUInt
+sDLK_F2 = (1073741883 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F3)@
+--
+--     [C declaration]: @macro SDLK_F3@, defined at @SDL3\/SDL_keycode.h 143:9@
+sDLK_F3 :: BG.CUInt
+sDLK_F3 = (1073741884 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F4)@
+--
+--     [C declaration]: @macro SDLK_F4@, defined at @SDL3\/SDL_keycode.h 144:9@
+sDLK_F4 :: BG.CUInt
+sDLK_F4 = (1073741885 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F5)@
+--
+--     [C declaration]: @macro SDLK_F5@, defined at @SDL3\/SDL_keycode.h 145:9@
+sDLK_F5 :: BG.CUInt
+sDLK_F5 = (1073741886 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F6)@
+--
+--     [C declaration]: @macro SDLK_F6@, defined at @SDL3\/SDL_keycode.h 146:9@
+sDLK_F6 :: BG.CUInt
+sDLK_F6 = (1073741887 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F7)@
+--
+--     [C declaration]: @macro SDLK_F7@, defined at @SDL3\/SDL_keycode.h 147:9@
+sDLK_F7 :: BG.CUInt
+sDLK_F7 = (1073741888 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F8)@
+--
+--     [C declaration]: @macro SDLK_F8@, defined at @SDL3\/SDL_keycode.h 148:9@
+sDLK_F8 :: BG.CUInt
+sDLK_F8 = (1073741889 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F9)@
+--
+--     [C declaration]: @macro SDLK_F9@, defined at @SDL3\/SDL_keycode.h 149:9@
+sDLK_F9 :: BG.CUInt
+sDLK_F9 = (1073741890 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F10)@
+--
+--     [C declaration]: @macro SDLK_F10@, defined at @SDL3\/SDL_keycode.h 150:9@
+sDLK_F10 :: BG.CUInt
+sDLK_F10 = (1073741891 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F11)@
+--
+--     [C declaration]: @macro SDLK_F11@, defined at @SDL3\/SDL_keycode.h 151:9@
+sDLK_F11 :: BG.CUInt
+sDLK_F11 = (1073741892 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F12)@
+--
+--     [C declaration]: @macro SDLK_F12@, defined at @SDL3\/SDL_keycode.h 152:9@
+sDLK_F12 :: BG.CUInt
+sDLK_F12 = (1073741893 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRINTSCREEN)@
+--
+--     [C declaration]: @macro SDLK_PRINTSCREEN@, defined at @SDL3\/SDL_keycode.h 153:9@
+sDLK_PRINTSCREEN :: BG.CUInt
+sDLK_PRINTSCREEN = (1073741894 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SCROLLLOCK)@
+--
+--     [C declaration]: @macro SDLK_SCROLLLOCK@, defined at @SDL3\/SDL_keycode.h 154:9@
+sDLK_SCROLLLOCK :: BG.CUInt
+sDLK_SCROLLLOCK = (1073741895 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAUSE)@
+--
+--     [C declaration]: @macro SDLK_PAUSE@, defined at @SDL3\/SDL_keycode.h 155:9@
+sDLK_PAUSE :: BG.CUInt
+sDLK_PAUSE = (1073741896 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_INSERT)@
+--
+--     [C declaration]: @macro SDLK_INSERT@, defined at @SDL3\/SDL_keycode.h 156:9@
+sDLK_INSERT :: BG.CUInt
+sDLK_INSERT = (1073741897 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HOME)@
+--
+--     [C declaration]: @macro SDLK_HOME@, defined at @SDL3\/SDL_keycode.h 157:9@
+sDLK_HOME :: BG.CUInt
+sDLK_HOME = (1073741898 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEUP)@
+--
+--     [C declaration]: @macro SDLK_PAGEUP@, defined at @SDL3\/SDL_keycode.h 158:9@
+sDLK_PAGEUP :: BG.CUInt
+sDLK_PAGEUP = (1073741899 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_END)@
+--
+--     [C declaration]: @macro SDLK_END@, defined at @SDL3\/SDL_keycode.h 159:9@
+sDLK_END :: BG.CUInt
+sDLK_END = (1073741901 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PAGEDOWN)@
+--
+--     [C declaration]: @macro SDLK_PAGEDOWN@, defined at @SDL3\/SDL_keycode.h 160:9@
+sDLK_PAGEDOWN :: BG.CUInt
+sDLK_PAGEDOWN = (1073741902 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RIGHT)@
+--
+--     [C declaration]: @macro SDLK_RIGHT@, defined at @SDL3\/SDL_keycode.h 161:9@
+sDLK_RIGHT :: BG.CUInt
+sDLK_RIGHT = (1073741903 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LEFT)@
+--
+--     [C declaration]: @macro SDLK_LEFT@, defined at @SDL3\/SDL_keycode.h 162:9@
+sDLK_LEFT :: BG.CUInt
+sDLK_LEFT = (1073741904 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DOWN)@
+--
+--     [C declaration]: @macro SDLK_DOWN@, defined at @SDL3\/SDL_keycode.h 163:9@
+sDLK_DOWN :: BG.CUInt
+sDLK_DOWN = (1073741905 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UP)@
+--
+--     [C declaration]: @macro SDLK_UP@, defined at @SDL3\/SDL_keycode.h 164:9@
+sDLK_UP :: BG.CUInt
+sDLK_UP = (1073741906 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_NUMLOCKCLEAR)@
+--
+--     [C declaration]: @macro SDLK_NUMLOCKCLEAR@, defined at @SDL3\/SDL_keycode.h 165:9@
+sDLK_NUMLOCKCLEAR :: BG.CUInt
+sDLK_NUMLOCKCLEAR = (1073741907 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DIVIDE)@
+--
+--     [C declaration]: @macro SDLK_KP_DIVIDE@, defined at @SDL3\/SDL_keycode.h 166:9@
+sDLK_KP_DIVIDE :: BG.CUInt
+sDLK_KP_DIVIDE = (1073741908 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MULTIPLY)@
+--
+--     [C declaration]: @macro SDLK_KP_MULTIPLY@, defined at @SDL3\/SDL_keycode.h 167:9@
+sDLK_KP_MULTIPLY :: BG.CUInt
+sDLK_KP_MULTIPLY = (1073741909 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MINUS)@
+--
+--     [C declaration]: @macro SDLK_KP_MINUS@, defined at @SDL3\/SDL_keycode.h 168:9@
+sDLK_KP_MINUS :: BG.CUInt
+sDLK_KP_MINUS = (1073741910 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUS)@
+--
+--     [C declaration]: @macro SDLK_KP_PLUS@, defined at @SDL3\/SDL_keycode.h 169:9@
+sDLK_KP_PLUS :: BG.CUInt
+sDLK_KP_PLUS = (1073741911 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_ENTER)@
+--
+--     [C declaration]: @macro SDLK_KP_ENTER@, defined at @SDL3\/SDL_keycode.h 170:9@
+sDLK_KP_ENTER :: BG.CUInt
+sDLK_KP_ENTER = (1073741912 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_1)@
+--
+--     [C declaration]: @macro SDLK_KP_1@, defined at @SDL3\/SDL_keycode.h 171:9@
+sDLK_KP_1 :: BG.CUInt
+sDLK_KP_1 = (1073741913 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_2)@
+--
+--     [C declaration]: @macro SDLK_KP_2@, defined at @SDL3\/SDL_keycode.h 172:9@
+sDLK_KP_2 :: BG.CUInt
+sDLK_KP_2 = (1073741914 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_3)@
+--
+--     [C declaration]: @macro SDLK_KP_3@, defined at @SDL3\/SDL_keycode.h 173:9@
+sDLK_KP_3 :: BG.CUInt
+sDLK_KP_3 = (1073741915 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_4)@
+--
+--     [C declaration]: @macro SDLK_KP_4@, defined at @SDL3\/SDL_keycode.h 174:9@
+sDLK_KP_4 :: BG.CUInt
+sDLK_KP_4 = (1073741916 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_5)@
+--
+--     [C declaration]: @macro SDLK_KP_5@, defined at @SDL3\/SDL_keycode.h 175:9@
+sDLK_KP_5 :: BG.CUInt
+sDLK_KP_5 = (1073741917 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_6)@
+--
+--     [C declaration]: @macro SDLK_KP_6@, defined at @SDL3\/SDL_keycode.h 176:9@
+sDLK_KP_6 :: BG.CUInt
+sDLK_KP_6 = (1073741918 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_7)@
+--
+--     [C declaration]: @macro SDLK_KP_7@, defined at @SDL3\/SDL_keycode.h 177:9@
+sDLK_KP_7 :: BG.CUInt
+sDLK_KP_7 = (1073741919 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_8)@
+--
+--     [C declaration]: @macro SDLK_KP_8@, defined at @SDL3\/SDL_keycode.h 178:9@
+sDLK_KP_8 :: BG.CUInt
+sDLK_KP_8 = (1073741920 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_9)@
+--
+--     [C declaration]: @macro SDLK_KP_9@, defined at @SDL3\/SDL_keycode.h 179:9@
+sDLK_KP_9 :: BG.CUInt
+sDLK_KP_9 = (1073741921 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_0)@
+--
+--     [C declaration]: @macro SDLK_KP_0@, defined at @SDL3\/SDL_keycode.h 180:9@
+sDLK_KP_0 :: BG.CUInt
+sDLK_KP_0 = (1073741922 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERIOD)@
+--
+--     [C declaration]: @macro SDLK_KP_PERIOD@, defined at @SDL3\/SDL_keycode.h 181:9@
+sDLK_KP_PERIOD :: BG.CUInt
+sDLK_KP_PERIOD = (1073741923 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_APPLICATION)@
+--
+--     [C declaration]: @macro SDLK_APPLICATION@, defined at @SDL3\/SDL_keycode.h 182:9@
+sDLK_APPLICATION :: BG.CUInt
+sDLK_APPLICATION = (1073741925 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_POWER)@
+--
+--     [C declaration]: @macro SDLK_POWER@, defined at @SDL3\/SDL_keycode.h 183:9@
+sDLK_POWER :: BG.CUInt
+sDLK_POWER = (1073741926 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALS)@
+--
+--     [C declaration]: @macro SDLK_KP_EQUALS@, defined at @SDL3\/SDL_keycode.h 184:9@
+sDLK_KP_EQUALS :: BG.CUInt
+sDLK_KP_EQUALS = (1073741927 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F13)@
+--
+--     [C declaration]: @macro SDLK_F13@, defined at @SDL3\/SDL_keycode.h 185:9@
+sDLK_F13 :: BG.CUInt
+sDLK_F13 = (1073741928 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F14)@
+--
+--     [C declaration]: @macro SDLK_F14@, defined at @SDL3\/SDL_keycode.h 186:9@
+sDLK_F14 :: BG.CUInt
+sDLK_F14 = (1073741929 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F15)@
+--
+--     [C declaration]: @macro SDLK_F15@, defined at @SDL3\/SDL_keycode.h 187:9@
+sDLK_F15 :: BG.CUInt
+sDLK_F15 = (1073741930 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F16)@
+--
+--     [C declaration]: @macro SDLK_F16@, defined at @SDL3\/SDL_keycode.h 188:9@
+sDLK_F16 :: BG.CUInt
+sDLK_F16 = (1073741931 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F17)@
+--
+--     [C declaration]: @macro SDLK_F17@, defined at @SDL3\/SDL_keycode.h 189:9@
+sDLK_F17 :: BG.CUInt
+sDLK_F17 = (1073741932 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F18)@
+--
+--     [C declaration]: @macro SDLK_F18@, defined at @SDL3\/SDL_keycode.h 190:9@
+sDLK_F18 :: BG.CUInt
+sDLK_F18 = (1073741933 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F19)@
+--
+--     [C declaration]: @macro SDLK_F19@, defined at @SDL3\/SDL_keycode.h 191:9@
+sDLK_F19 :: BG.CUInt
+sDLK_F19 = (1073741934 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F20)@
+--
+--     [C declaration]: @macro SDLK_F20@, defined at @SDL3\/SDL_keycode.h 192:9@
+sDLK_F20 :: BG.CUInt
+sDLK_F20 = (1073741935 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F21)@
+--
+--     [C declaration]: @macro SDLK_F21@, defined at @SDL3\/SDL_keycode.h 193:9@
+sDLK_F21 :: BG.CUInt
+sDLK_F21 = (1073741936 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F22)@
+--
+--     [C declaration]: @macro SDLK_F22@, defined at @SDL3\/SDL_keycode.h 194:9@
+sDLK_F22 :: BG.CUInt
+sDLK_F22 = (1073741937 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F23)@
+--
+--     [C declaration]: @macro SDLK_F23@, defined at @SDL3\/SDL_keycode.h 195:9@
+sDLK_F23 :: BG.CUInt
+sDLK_F23 = (1073741938 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_F24)@
+--
+--     [C declaration]: @macro SDLK_F24@, defined at @SDL3\/SDL_keycode.h 196:9@
+sDLK_F24 :: BG.CUInt
+sDLK_F24 = (1073741939 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXECUTE)@
+--
+--     [C declaration]: @macro SDLK_EXECUTE@, defined at @SDL3\/SDL_keycode.h 197:9@
+sDLK_EXECUTE :: BG.CUInt
+sDLK_EXECUTE = (1073741940 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_HELP)@
+--
+--     [C declaration]: @macro SDLK_HELP@, defined at @SDL3\/SDL_keycode.h 198:9@
+sDLK_HELP :: BG.CUInt
+sDLK_HELP = (1073741941 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MENU)@
+--
+--     [C declaration]: @macro SDLK_MENU@, defined at @SDL3\/SDL_keycode.h 199:9@
+sDLK_MENU :: BG.CUInt
+sDLK_MENU = (1073741942 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SELECT)@
+--
+--     [C declaration]: @macro SDLK_SELECT@, defined at @SDL3\/SDL_keycode.h 200:9@
+sDLK_SELECT :: BG.CUInt
+sDLK_SELECT = (1073741943 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_STOP)@
+--
+--     [C declaration]: @macro SDLK_STOP@, defined at @SDL3\/SDL_keycode.h 201:9@
+sDLK_STOP :: BG.CUInt
+sDLK_STOP = (1073741944 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AGAIN)@
+--
+--     [C declaration]: @macro SDLK_AGAIN@, defined at @SDL3\/SDL_keycode.h 202:9@
+sDLK_AGAIN :: BG.CUInt
+sDLK_AGAIN = (1073741945 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_UNDO)@
+--
+--     [C declaration]: @macro SDLK_UNDO@, defined at @SDL3\/SDL_keycode.h 203:9@
+sDLK_UNDO :: BG.CUInt
+sDLK_UNDO = (1073741946 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CUT)@
+--
+--     [C declaration]: @macro SDLK_CUT@, defined at @SDL3\/SDL_keycode.h 204:9@
+sDLK_CUT :: BG.CUInt
+sDLK_CUT = (1073741947 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_COPY)@
+--
+--     [C declaration]: @macro SDLK_COPY@, defined at @SDL3\/SDL_keycode.h 205:9@
+sDLK_COPY :: BG.CUInt
+sDLK_COPY = (1073741948 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PASTE)@
+--
+--     [C declaration]: @macro SDLK_PASTE@, defined at @SDL3\/SDL_keycode.h 206:9@
+sDLK_PASTE :: BG.CUInt
+sDLK_PASTE = (1073741949 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_FIND)@
+--
+--     [C declaration]: @macro SDLK_FIND@, defined at @SDL3\/SDL_keycode.h 207:9@
+sDLK_FIND :: BG.CUInt
+sDLK_FIND = (1073741950 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MUTE)@
+--
+--     [C declaration]: @macro SDLK_MUTE@, defined at @SDL3\/SDL_keycode.h 208:9@
+sDLK_MUTE :: BG.CUInt
+sDLK_MUTE = (1073741951 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEUP)@
+--
+--     [C declaration]: @macro SDLK_VOLUMEUP@, defined at @SDL3\/SDL_keycode.h 209:9@
+sDLK_VOLUMEUP :: BG.CUInt
+sDLK_VOLUMEUP = (1073741952 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_VOLUMEDOWN)@
+--
+--     [C declaration]: @macro SDLK_VOLUMEDOWN@, defined at @SDL3\/SDL_keycode.h 210:9@
+sDLK_VOLUMEDOWN :: BG.CUInt
+sDLK_VOLUMEDOWN = (1073741953 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COMMA)@
+--
+--     [C declaration]: @macro SDLK_KP_COMMA@, defined at @SDL3\/SDL_keycode.h 211:9@
+sDLK_KP_COMMA :: BG.CUInt
+sDLK_KP_COMMA = (1073741957 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EQUALSAS400)@
+--
+--     [C declaration]: @macro SDLK_KP_EQUALSAS400@, defined at @SDL3\/SDL_keycode.h 212:9@
+sDLK_KP_EQUALSAS400 :: BG.CUInt
+sDLK_KP_EQUALSAS400 = (1073741958 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ALTERASE)@
+--
+--     [C declaration]: @macro SDLK_ALTERASE@, defined at @SDL3\/SDL_keycode.h 213:9@
+sDLK_ALTERASE :: BG.CUInt
+sDLK_ALTERASE = (1073741977 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SYSREQ)@
+--
+--     [C declaration]: @macro SDLK_SYSREQ@, defined at @SDL3\/SDL_keycode.h 214:9@
+sDLK_SYSREQ :: BG.CUInt
+sDLK_SYSREQ = (1073741978 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CANCEL)@
+--
+--     [C declaration]: @macro SDLK_CANCEL@, defined at @SDL3\/SDL_keycode.h 215:9@
+sDLK_CANCEL :: BG.CUInt
+sDLK_CANCEL = (1073741979 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEAR)@
+--
+--     [C declaration]: @macro SDLK_CLEAR@, defined at @SDL3\/SDL_keycode.h 216:9@
+sDLK_CLEAR :: BG.CUInt
+sDLK_CLEAR = (1073741980 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_PRIOR)@
+--
+--     [C declaration]: @macro SDLK_PRIOR@, defined at @SDL3\/SDL_keycode.h 217:9@
+sDLK_PRIOR :: BG.CUInt
+sDLK_PRIOR = (1073741981 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RETURN2)@
+--
+--     [C declaration]: @macro SDLK_RETURN2@, defined at @SDL3\/SDL_keycode.h 218:9@
+sDLK_RETURN2 :: BG.CUInt
+sDLK_RETURN2 = (1073741982 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SEPARATOR)@
+--
+--     [C declaration]: @macro SDLK_SEPARATOR@, defined at @SDL3\/SDL_keycode.h 219:9@
+sDLK_SEPARATOR :: BG.CUInt
+sDLK_SEPARATOR = (1073741983 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OUT)@
+--
+--     [C declaration]: @macro SDLK_OUT@, defined at @SDL3\/SDL_keycode.h 220:9@
+sDLK_OUT :: BG.CUInt
+sDLK_OUT = (1073741984 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_OPER)@
+--
+--     [C declaration]: @macro SDLK_OPER@, defined at @SDL3\/SDL_keycode.h 221:9@
+sDLK_OPER :: BG.CUInt
+sDLK_OPER = (1073741985 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CLEARAGAIN)@
+--
+--     [C declaration]: @macro SDLK_CLEARAGAIN@, defined at @SDL3\/SDL_keycode.h 222:9@
+sDLK_CLEARAGAIN :: BG.CUInt
+sDLK_CLEARAGAIN = (1073741986 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CRSEL)@
+--
+--     [C declaration]: @macro SDLK_CRSEL@, defined at @SDL3\/SDL_keycode.h 223:9@
+sDLK_CRSEL :: BG.CUInt
+sDLK_CRSEL = (1073741987 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_EXSEL)@
+--
+--     [C declaration]: @macro SDLK_EXSEL@, defined at @SDL3\/SDL_keycode.h 224:9@
+sDLK_EXSEL :: BG.CUInt
+sDLK_EXSEL = (1073741988 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_00)@
+--
+--     [C declaration]: @macro SDLK_KP_00@, defined at @SDL3\/SDL_keycode.h 225:9@
+sDLK_KP_00 :: BG.CUInt
+sDLK_KP_00 = (1073742000 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_000)@
+--
+--     [C declaration]: @macro SDLK_KP_000@, defined at @SDL3\/SDL_keycode.h 226:9@
+sDLK_KP_000 :: BG.CUInt
+sDLK_KP_000 = (1073742001 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_THOUSANDSSEPARATOR)@
+--
+--     [C declaration]: @macro SDLK_THOUSANDSSEPARATOR@, defined at @SDL3\/SDL_keycode.h 227:9@
+sDLK_THOUSANDSSEPARATOR :: BG.CUInt
+sDLK_THOUSANDSSEPARATOR = (1073742002 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_DECIMALSEPARATOR)@
+--
+--     [C declaration]: @macro SDLK_DECIMALSEPARATOR@, defined at @SDL3\/SDL_keycode.h 228:9@
+sDLK_DECIMALSEPARATOR :: BG.CUInt
+sDLK_DECIMALSEPARATOR = (1073742003 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYUNIT)@
+--
+--     [C declaration]: @macro SDLK_CURRENCYUNIT@, defined at @SDL3\/SDL_keycode.h 229:9@
+sDLK_CURRENCYUNIT :: BG.CUInt
+sDLK_CURRENCYUNIT = (1073742004 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CURRENCYSUBUNIT)@
+--
+--     [C declaration]: @macro SDLK_CURRENCYSUBUNIT@, defined at @SDL3\/SDL_keycode.h 230:9@
+sDLK_CURRENCYSUBUNIT :: BG.CUInt
+sDLK_CURRENCYSUBUNIT = (1073742005 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTPAREN)@
+--
+--     [C declaration]: @macro SDLK_KP_LEFTPAREN@, defined at @SDL3\/SDL_keycode.h 231:9@
+sDLK_KP_LEFTPAREN :: BG.CUInt
+sDLK_KP_LEFTPAREN = (1073742006 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTPAREN)@
+--
+--     [C declaration]: @macro SDLK_KP_RIGHTPAREN@, defined at @SDL3\/SDL_keycode.h 232:9@
+sDLK_KP_RIGHTPAREN :: BG.CUInt
+sDLK_KP_RIGHTPAREN = (1073742007 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LEFTBRACE)@
+--
+--     [C declaration]: @macro SDLK_KP_LEFTBRACE@, defined at @SDL3\/SDL_keycode.h 233:9@
+sDLK_KP_LEFTBRACE :: BG.CUInt
+sDLK_KP_LEFTBRACE = (1073742008 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_RIGHTBRACE)@
+--
+--     [C declaration]: @macro SDLK_KP_RIGHTBRACE@, defined at @SDL3\/SDL_keycode.h 234:9@
+sDLK_KP_RIGHTBRACE :: BG.CUInt
+sDLK_KP_RIGHTBRACE = (1073742009 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_TAB)@
+--
+--     [C declaration]: @macro SDLK_KP_TAB@, defined at @SDL3\/SDL_keycode.h 235:9@
+sDLK_KP_TAB :: BG.CUInt
+sDLK_KP_TAB = (1073742010 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BACKSPACE)@
+--
+--     [C declaration]: @macro SDLK_KP_BACKSPACE@, defined at @SDL3\/SDL_keycode.h 236:9@
+sDLK_KP_BACKSPACE :: BG.CUInt
+sDLK_KP_BACKSPACE = (1073742011 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_A)@
+--
+--     [C declaration]: @macro SDLK_KP_A@, defined at @SDL3\/SDL_keycode.h 237:9@
+sDLK_KP_A :: BG.CUInt
+sDLK_KP_A = (1073742012 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_B)@
+--
+--     [C declaration]: @macro SDLK_KP_B@, defined at @SDL3\/SDL_keycode.h 238:9@
+sDLK_KP_B :: BG.CUInt
+sDLK_KP_B = (1073742013 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_C)@
+--
+--     [C declaration]: @macro SDLK_KP_C@, defined at @SDL3\/SDL_keycode.h 239:9@
+sDLK_KP_C :: BG.CUInt
+sDLK_KP_C = (1073742014 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_D)@
+--
+--     [C declaration]: @macro SDLK_KP_D@, defined at @SDL3\/SDL_keycode.h 240:9@
+sDLK_KP_D :: BG.CUInt
+sDLK_KP_D = (1073742015 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_E)@
+--
+--     [C declaration]: @macro SDLK_KP_E@, defined at @SDL3\/SDL_keycode.h 241:9@
+sDLK_KP_E :: BG.CUInt
+sDLK_KP_E = (1073742016 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_F)@
+--
+--     [C declaration]: @macro SDLK_KP_F@, defined at @SDL3\/SDL_keycode.h 242:9@
+sDLK_KP_F :: BG.CUInt
+sDLK_KP_F = (1073742017 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_XOR)@
+--
+--     [C declaration]: @macro SDLK_KP_XOR@, defined at @SDL3\/SDL_keycode.h 243:9@
+sDLK_KP_XOR :: BG.CUInt
+sDLK_KP_XOR = (1073742018 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_POWER)@
+--
+--     [C declaration]: @macro SDLK_KP_POWER@, defined at @SDL3\/SDL_keycode.h 244:9@
+sDLK_KP_POWER :: BG.CUInt
+sDLK_KP_POWER = (1073742019 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PERCENT)@
+--
+--     [C declaration]: @macro SDLK_KP_PERCENT@, defined at @SDL3\/SDL_keycode.h 245:9@
+sDLK_KP_PERCENT :: BG.CUInt
+sDLK_KP_PERCENT = (1073742020 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_LESS)@
+--
+--     [C declaration]: @macro SDLK_KP_LESS@, defined at @SDL3\/SDL_keycode.h 246:9@
+sDLK_KP_LESS :: BG.CUInt
+sDLK_KP_LESS = (1073742021 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_GREATER)@
+--
+--     [C declaration]: @macro SDLK_KP_GREATER@, defined at @SDL3\/SDL_keycode.h 247:9@
+sDLK_KP_GREATER :: BG.CUInt
+sDLK_KP_GREATER = (1073742022 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AMPERSAND)@
+--
+--     [C declaration]: @macro SDLK_KP_AMPERSAND@, defined at @SDL3\/SDL_keycode.h 248:9@
+sDLK_KP_AMPERSAND :: BG.CUInt
+sDLK_KP_AMPERSAND = (1073742023 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLAMPERSAND)@
+--
+--     [C declaration]: @macro SDLK_KP_DBLAMPERSAND@, defined at @SDL3\/SDL_keycode.h 249:9@
+sDLK_KP_DBLAMPERSAND :: BG.CUInt
+sDLK_KP_DBLAMPERSAND = (1073742024 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_VERTICALBAR)@
+--
+--     [C declaration]: @macro SDLK_KP_VERTICALBAR@, defined at @SDL3\/SDL_keycode.h 250:9@
+sDLK_KP_VERTICALBAR :: BG.CUInt
+sDLK_KP_VERTICALBAR = (1073742025 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DBLVERTICALBAR)@
+--
+--     [C declaration]: @macro SDLK_KP_DBLVERTICALBAR@, defined at @SDL3\/SDL_keycode.h 251:9@
+sDLK_KP_DBLVERTICALBAR :: BG.CUInt
+sDLK_KP_DBLVERTICALBAR = (1073742026 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_COLON)@
+--
+--     [C declaration]: @macro SDLK_KP_COLON@, defined at @SDL3\/SDL_keycode.h 252:9@
+sDLK_KP_COLON :: BG.CUInt
+sDLK_KP_COLON = (1073742027 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HASH)@
+--
+--     [C declaration]: @macro SDLK_KP_HASH@, defined at @SDL3\/SDL_keycode.h 253:9@
+sDLK_KP_HASH :: BG.CUInt
+sDLK_KP_HASH = (1073742028 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_SPACE)@
+--
+--     [C declaration]: @macro SDLK_KP_SPACE@, defined at @SDL3\/SDL_keycode.h 254:9@
+sDLK_KP_SPACE :: BG.CUInt
+sDLK_KP_SPACE = (1073742029 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_AT)@
+--
+--     [C declaration]: @macro SDLK_KP_AT@, defined at @SDL3\/SDL_keycode.h 255:9@
+sDLK_KP_AT :: BG.CUInt
+sDLK_KP_AT = (1073742030 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_EXCLAM)@
+--
+--     [C declaration]: @macro SDLK_KP_EXCLAM@, defined at @SDL3\/SDL_keycode.h 256:9@
+sDLK_KP_EXCLAM :: BG.CUInt
+sDLK_KP_EXCLAM = (1073742031 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSTORE)@
+--
+--     [C declaration]: @macro SDLK_KP_MEMSTORE@, defined at @SDL3\/SDL_keycode.h 257:9@
+sDLK_KP_MEMSTORE :: BG.CUInt
+sDLK_KP_MEMSTORE = (1073742032 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMRECALL)@
+--
+--     [C declaration]: @macro SDLK_KP_MEMRECALL@, defined at @SDL3\/SDL_keycode.h 258:9@
+sDLK_KP_MEMRECALL :: BG.CUInt
+sDLK_KP_MEMRECALL = (1073742033 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMCLEAR)@
+--
+--     [C declaration]: @macro SDLK_KP_MEMCLEAR@, defined at @SDL3\/SDL_keycode.h 259:9@
+sDLK_KP_MEMCLEAR :: BG.CUInt
+sDLK_KP_MEMCLEAR = (1073742034 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMADD)@
+--
+--     [C declaration]: @macro SDLK_KP_MEMADD@, defined at @SDL3\/SDL_keycode.h 260:9@
+sDLK_KP_MEMADD :: BG.CUInt
+sDLK_KP_MEMADD = (1073742035 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMSUBTRACT)@
+--
+--     [C declaration]: @macro SDLK_KP_MEMSUBTRACT@, defined at @SDL3\/SDL_keycode.h 261:9@
+sDLK_KP_MEMSUBTRACT :: BG.CUInt
+sDLK_KP_MEMSUBTRACT = (1073742036 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMMULTIPLY)@
+--
+--     [C declaration]: @macro SDLK_KP_MEMMULTIPLY@, defined at @SDL3\/SDL_keycode.h 262:9@
+sDLK_KP_MEMMULTIPLY :: BG.CUInt
+sDLK_KP_MEMMULTIPLY = (1073742037 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_MEMDIVIDE)@
+--
+--     [C declaration]: @macro SDLK_KP_MEMDIVIDE@, defined at @SDL3\/SDL_keycode.h 263:9@
+sDLK_KP_MEMDIVIDE :: BG.CUInt
+sDLK_KP_MEMDIVIDE = (1073742038 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_PLUSMINUS)@
+--
+--     [C declaration]: @macro SDLK_KP_PLUSMINUS@, defined at @SDL3\/SDL_keycode.h 264:9@
+sDLK_KP_PLUSMINUS :: BG.CUInt
+sDLK_KP_PLUSMINUS = (1073742039 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEAR)@
+--
+--     [C declaration]: @macro SDLK_KP_CLEAR@, defined at @SDL3\/SDL_keycode.h 265:9@
+sDLK_KP_CLEAR :: BG.CUInt
+sDLK_KP_CLEAR = (1073742040 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_CLEARENTRY)@
+--
+--     [C declaration]: @macro SDLK_KP_CLEARENTRY@, defined at @SDL3\/SDL_keycode.h 266:9@
+sDLK_KP_CLEARENTRY :: BG.CUInt
+sDLK_KP_CLEARENTRY = (1073742041 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_BINARY)@
+--
+--     [C declaration]: @macro SDLK_KP_BINARY@, defined at @SDL3\/SDL_keycode.h 267:9@
+sDLK_KP_BINARY :: BG.CUInt
+sDLK_KP_BINARY = (1073742042 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_OCTAL)@
+--
+--     [C declaration]: @macro SDLK_KP_OCTAL@, defined at @SDL3\/SDL_keycode.h 268:9@
+sDLK_KP_OCTAL :: BG.CUInt
+sDLK_KP_OCTAL = (1073742043 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_DECIMAL)@
+--
+--     [C declaration]: @macro SDLK_KP_DECIMAL@, defined at @SDL3\/SDL_keycode.h 269:9@
+sDLK_KP_DECIMAL :: BG.CUInt
+sDLK_KP_DECIMAL = (1073742044 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_KP_HEXADECIMAL)@
+--
+--     [C declaration]: @macro SDLK_KP_HEXADECIMAL@, defined at @SDL3\/SDL_keycode.h 270:9@
+sDLK_KP_HEXADECIMAL :: BG.CUInt
+sDLK_KP_HEXADECIMAL = (1073742045 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LCTRL)@
+--
+--     [C declaration]: @macro SDLK_LCTRL@, defined at @SDL3\/SDL_keycode.h 271:9@
+sDLK_LCTRL :: BG.CUInt
+sDLK_LCTRL = (1073742048 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LSHIFT)@
+--
+--     [C declaration]: @macro SDLK_LSHIFT@, defined at @SDL3\/SDL_keycode.h 272:9@
+sDLK_LSHIFT :: BG.CUInt
+sDLK_LSHIFT = (1073742049 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LALT)@
+--
+--     [C declaration]: @macro SDLK_LALT@, defined at @SDL3\/SDL_keycode.h 273:9@
+sDLK_LALT :: BG.CUInt
+sDLK_LALT = (1073742050 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_LGUI)@
+--
+--     [C declaration]: @macro SDLK_LGUI@, defined at @SDL3\/SDL_keycode.h 274:9@
+sDLK_LGUI :: BG.CUInt
+sDLK_LGUI = (1073742051 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RCTRL)@
+--
+--     [C declaration]: @macro SDLK_RCTRL@, defined at @SDL3\/SDL_keycode.h 275:9@
+sDLK_RCTRL :: BG.CUInt
+sDLK_RCTRL = (1073742052 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RSHIFT)@
+--
+--     [C declaration]: @macro SDLK_RSHIFT@, defined at @SDL3\/SDL_keycode.h 276:9@
+sDLK_RSHIFT :: BG.CUInt
+sDLK_RSHIFT = (1073742053 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RALT)@
+--
+--     [C declaration]: @macro SDLK_RALT@, defined at @SDL3\/SDL_keycode.h 277:9@
+sDLK_RALT :: BG.CUInt
+sDLK_RALT = (1073742054 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_RGUI)@
+--
+--     [C declaration]: @macro SDLK_RGUI@, defined at @SDL3\/SDL_keycode.h 278:9@
+sDLK_RGUI :: BG.CUInt
+sDLK_RGUI = (1073742055 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MODE)@
+--
+--     [C declaration]: @macro SDLK_MODE@, defined at @SDL3\/SDL_keycode.h 279:9@
+sDLK_MODE :: BG.CUInt
+sDLK_MODE = (1073742081 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SLEEP)@
+--
+--     [C declaration]: @macro SDLK_SLEEP@, defined at @SDL3\/SDL_keycode.h 280:9@
+sDLK_SLEEP :: BG.CUInt
+sDLK_SLEEP = (1073742082 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_WAKE)@
+--
+--     [C declaration]: @macro SDLK_WAKE@, defined at @SDL3\/SDL_keycode.h 281:9@
+sDLK_WAKE :: BG.CUInt
+sDLK_WAKE = (1073742083 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_INCREMENT)@
+--
+--     [C declaration]: @macro SDLK_CHANNEL_INCREMENT@, defined at @SDL3\/SDL_keycode.h 282:9@
+sDLK_CHANNEL_INCREMENT :: BG.CUInt
+sDLK_CHANNEL_INCREMENT = (1073742084 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CHANNEL_DECREMENT)@
+--
+--     [C declaration]: @macro SDLK_CHANNEL_DECREMENT@, defined at @SDL3\/SDL_keycode.h 283:9@
+sDLK_CHANNEL_DECREMENT :: BG.CUInt
+sDLK_CHANNEL_DECREMENT = (1073742085 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_PLAY@, defined at @SDL3\/SDL_keycode.h 284:9@
+sDLK_MEDIA_PLAY :: BG.CUInt
+sDLK_MEDIA_PLAY = (1073742086 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PAUSE)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_PAUSE@, defined at @SDL3\/SDL_keycode.h 285:9@
+sDLK_MEDIA_PAUSE :: BG.CUInt
+sDLK_MEDIA_PAUSE = (1073742087 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_RECORD)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_RECORD@, defined at @SDL3\/SDL_keycode.h 286:9@
+sDLK_MEDIA_RECORD :: BG.CUInt
+sDLK_MEDIA_RECORD = (1073742088 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_FAST_FORWARD)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_FAST_FORWARD@, defined at @SDL3\/SDL_keycode.h 287:9@
+sDLK_MEDIA_FAST_FORWARD :: BG.CUInt
+sDLK_MEDIA_FAST_FORWARD = (1073742089 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_REWIND)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_REWIND@, defined at @SDL3\/SDL_keycode.h 288:9@
+sDLK_MEDIA_REWIND :: BG.CUInt
+sDLK_MEDIA_REWIND = (1073742090 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_NEXT_TRACK)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_NEXT_TRACK@, defined at @SDL3\/SDL_keycode.h 289:9@
+sDLK_MEDIA_NEXT_TRACK :: BG.CUInt
+sDLK_MEDIA_NEXT_TRACK = (1073742091 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PREVIOUS_TRACK)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_PREVIOUS_TRACK@, defined at @SDL3\/SDL_keycode.h 290:9@
+sDLK_MEDIA_PREVIOUS_TRACK :: BG.CUInt
+sDLK_MEDIA_PREVIOUS_TRACK = (1073742092 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_STOP)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_STOP@, defined at @SDL3\/SDL_keycode.h 291:9@
+sDLK_MEDIA_STOP :: BG.CUInt
+sDLK_MEDIA_STOP = (1073742093 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_EJECT)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_EJECT@, defined at @SDL3\/SDL_keycode.h 292:9@
+sDLK_MEDIA_EJECT :: BG.CUInt
+sDLK_MEDIA_EJECT = (1073742094 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_PLAY_PAUSE)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_PLAY_PAUSE@, defined at @SDL3\/SDL_keycode.h 293:9@
+sDLK_MEDIA_PLAY_PAUSE :: BG.CUInt
+sDLK_MEDIA_PLAY_PAUSE = (1073742095 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_MEDIA_SELECT)@
+--
+--     [C declaration]: @macro SDLK_MEDIA_SELECT@, defined at @SDL3\/SDL_keycode.h 294:9@
+sDLK_MEDIA_SELECT :: BG.CUInt
+sDLK_MEDIA_SELECT = (1073742096 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_NEW)@
+--
+--     [C declaration]: @macro SDLK_AC_NEW@, defined at @SDL3\/SDL_keycode.h 295:9@
+sDLK_AC_NEW :: BG.CUInt
+sDLK_AC_NEW = (1073742097 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_OPEN)@
+--
+--     [C declaration]: @macro SDLK_AC_OPEN@, defined at @SDL3\/SDL_keycode.h 296:9@
+sDLK_AC_OPEN :: BG.CUInt
+sDLK_AC_OPEN = (1073742098 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_CLOSE)@
+--
+--     [C declaration]: @macro SDLK_AC_CLOSE@, defined at @SDL3\/SDL_keycode.h 297:9@
+sDLK_AC_CLOSE :: BG.CUInt
+sDLK_AC_CLOSE = (1073742099 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_EXIT)@
+--
+--     [C declaration]: @macro SDLK_AC_EXIT@, defined at @SDL3\/SDL_keycode.h 298:9@
+sDLK_AC_EXIT :: BG.CUInt
+sDLK_AC_EXIT = (1073742100 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SAVE)@
+--
+--     [C declaration]: @macro SDLK_AC_SAVE@, defined at @SDL3\/SDL_keycode.h 299:9@
+sDLK_AC_SAVE :: BG.CUInt
+sDLK_AC_SAVE = (1073742101 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PRINT)@
+--
+--     [C declaration]: @macro SDLK_AC_PRINT@, defined at @SDL3\/SDL_keycode.h 300:9@
+sDLK_AC_PRINT :: BG.CUInt
+sDLK_AC_PRINT = (1073742102 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_PROPERTIES)@
+--
+--     [C declaration]: @macro SDLK_AC_PROPERTIES@, defined at @SDL3\/SDL_keycode.h 301:9@
+sDLK_AC_PROPERTIES :: BG.CUInt
+sDLK_AC_PROPERTIES = (1073742103 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_SEARCH)@
+--
+--     [C declaration]: @macro SDLK_AC_SEARCH@, defined at @SDL3\/SDL_keycode.h 302:9@
+sDLK_AC_SEARCH :: BG.CUInt
+sDLK_AC_SEARCH = (1073742104 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_HOME)@
+--
+--     [C declaration]: @macro SDLK_AC_HOME@, defined at @SDL3\/SDL_keycode.h 303:9@
+sDLK_AC_HOME :: BG.CUInt
+sDLK_AC_HOME = (1073742105 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BACK)@
+--
+--     [C declaration]: @macro SDLK_AC_BACK@, defined at @SDL3\/SDL_keycode.h 304:9@
+sDLK_AC_BACK :: BG.CUInt
+sDLK_AC_BACK = (1073742106 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_FORWARD)@
+--
+--     [C declaration]: @macro SDLK_AC_FORWARD@, defined at @SDL3\/SDL_keycode.h 305:9@
+sDLK_AC_FORWARD :: BG.CUInt
+sDLK_AC_FORWARD = (1073742107 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_STOP)@
+--
+--     [C declaration]: @macro SDLK_AC_STOP@, defined at @SDL3\/SDL_keycode.h 306:9@
+sDLK_AC_STOP :: BG.CUInt
+sDLK_AC_STOP = (1073742108 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_REFRESH)@
+--
+--     [C declaration]: @macro SDLK_AC_REFRESH@, defined at @SDL3\/SDL_keycode.h 307:9@
+sDLK_AC_REFRESH :: BG.CUInt
+sDLK_AC_REFRESH = (1073742109 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_AC_BOOKMARKS)@
+--
+--     [C declaration]: @macro SDLK_AC_BOOKMARKS@, defined at @SDL3\/SDL_keycode.h 308:9@
+sDLK_AC_BOOKMARKS :: BG.CUInt
+sDLK_AC_BOOKMARKS = (1073742110 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTLEFT)@
+--
+--     [C declaration]: @macro SDLK_SOFTLEFT@, defined at @SDL3\/SDL_keycode.h 309:9@
+sDLK_SOFTLEFT :: BG.CUInt
+sDLK_SOFTLEFT = (1073742111 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_SOFTRIGHT)@
+--
+--     [C declaration]: @macro SDLK_SOFTRIGHT@, defined at @SDL3\/SDL_keycode.h 310:9@
+sDLK_SOFTRIGHT :: BG.CUInt
+sDLK_SOFTRIGHT = (1073742112 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_CALL)@
+--
+--     [C declaration]: @macro SDLK_CALL@, defined at @SDL3\/SDL_keycode.h 311:9@
+sDLK_CALL :: BG.CUInt
+sDLK_CALL = (1073742113 :: BG.CUInt)
+
+-- | @SDL_SCANCODE_TO_KEYCODE(SDL_SCANCODE_ENDCALL)@
+--
+--     [C declaration]: @macro SDLK_ENDCALL@, defined at @SDL3\/SDL_keycode.h 312:9@
+sDLK_ENDCALL :: BG.CUInt
+sDLK_ENDCALL = (1073742114 :: BG.CUInt)
+
+-- | Extended key Left Tab
+--
+--     [C declaration]: @macro SDLK_LEFT_TAB@, defined at @SDL3\/SDL_keycode.h 313:9@
+sDLK_LEFT_TAB :: BG.CUInt
+sDLK_LEFT_TAB = (536870913 :: BG.CUInt)
+
+-- | Extended key Level 5 Shift
+--
+--     [C declaration]: @macro SDLK_LEVEL5_SHIFT@, defined at @SDL3\/SDL_keycode.h 314:9@
+sDLK_LEVEL5_SHIFT :: BG.CUInt
+sDLK_LEVEL5_SHIFT = (536870914 :: BG.CUInt)
+
+-- | Extended key Multi-key Compose
+--
+--     [C declaration]: @macro SDLK_MULTI_KEY_COMPOSE@, defined at @SDL3\/SDL_keycode.h 315:9@
+sDLK_MULTI_KEY_COMPOSE :: BG.CUInt
+sDLK_MULTI_KEY_COMPOSE = (536870915 :: BG.CUInt)
+
+-- | Extended key Left Meta
+--
+--     [C declaration]: @macro SDLK_LMETA@, defined at @SDL3\/SDL_keycode.h 316:9@
+sDLK_LMETA :: BG.CUInt
+sDLK_LMETA = (536870916 :: BG.CUInt)
+
+-- | Extended key Right Meta
+--
+--     [C declaration]: @macro SDLK_RMETA@, defined at @SDL3\/SDL_keycode.h 317:9@
+sDLK_RMETA :: BG.CUInt
+sDLK_RMETA = (536870917 :: BG.CUInt)
+
+-- | Extended key Left Hyper
+--
+--     [C declaration]: @macro SDLK_LHYPER@, defined at @SDL3\/SDL_keycode.h 318:9@
+sDLK_LHYPER :: BG.CUInt
+sDLK_LHYPER = (536870918 :: BG.CUInt)
+
+-- | Extended key Right Hyper
+--
+--     [C declaration]: @macro SDLK_RHYPER@, defined at @SDL3\/SDL_keycode.h 319:9@
+sDLK_RHYPER :: BG.CUInt
+sDLK_RHYPER = (536870919 :: BG.CUInt)
+
+-- | Valid key modifiers (possibly OR\'d together).
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_Keymod@, defined at @SDL3\/SDL_keycode.h 326:16@
+newtype SDL_Keymod = SDL_Keymod
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint16
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.CompatHasField.HasField "unwrap" SDL_Keymod ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Keymod{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint16)
+  => BG.HasField "unwrap" (BG.Ptr SDL_Keymod) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_Keymod "unwrap" where
+  type
+    CFieldType SDL_Keymod "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint16
+
+  offset# = \_ -> \_ -> 0
+
+-- | no modifier is applicable.
+--
+--     [C declaration]: @macro SDL_KMOD_NONE@, defined at @SDL3\/SDL_keycode.h 328:9@
+sDL_KMOD_NONE :: BG.CUInt
+sDL_KMOD_NONE = (0 :: BG.CUInt)
+
+-- | the left Shift key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_LSHIFT@, defined at @SDL3\/SDL_keycode.h 329:9@
+sDL_KMOD_LSHIFT :: BG.CUInt
+sDL_KMOD_LSHIFT = (1 :: BG.CUInt)
+
+-- | the right Shift key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_RSHIFT@, defined at @SDL3\/SDL_keycode.h 330:9@
+sDL_KMOD_RSHIFT :: BG.CUInt
+sDL_KMOD_RSHIFT = (2 :: BG.CUInt)
+
+-- | the Level 5 Shift key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_LEVEL5@, defined at @SDL3\/SDL_keycode.h 331:9@
+sDL_KMOD_LEVEL5 :: BG.CUInt
+sDL_KMOD_LEVEL5 = (4 :: BG.CUInt)
+
+-- | the left Ctrl (Control) key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_LCTRL@, defined at @SDL3\/SDL_keycode.h 332:9@
+sDL_KMOD_LCTRL :: BG.CUInt
+sDL_KMOD_LCTRL = (64 :: BG.CUInt)
+
+-- | the right Ctrl (Control) key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_RCTRL@, defined at @SDL3\/SDL_keycode.h 333:9@
+sDL_KMOD_RCTRL :: BG.CUInt
+sDL_KMOD_RCTRL = (128 :: BG.CUInt)
+
+-- | the left Alt key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_LALT@, defined at @SDL3\/SDL_keycode.h 334:9@
+sDL_KMOD_LALT :: BG.CUInt
+sDL_KMOD_LALT = (256 :: BG.CUInt)
+
+-- | the right Alt key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_RALT@, defined at @SDL3\/SDL_keycode.h 335:9@
+sDL_KMOD_RALT :: BG.CUInt
+sDL_KMOD_RALT = (512 :: BG.CUInt)
+
+-- | the left GUI key (often the Windows key) is down.
+--
+--     [C declaration]: @macro SDL_KMOD_LGUI@, defined at @SDL3\/SDL_keycode.h 336:9@
+sDL_KMOD_LGUI :: BG.CUInt
+sDL_KMOD_LGUI = (1024 :: BG.CUInt)
+
+-- | the right GUI key (often the Windows key) is down.
+--
+--     [C declaration]: @macro SDL_KMOD_RGUI@, defined at @SDL3\/SDL_keycode.h 337:9@
+sDL_KMOD_RGUI :: BG.CUInt
+sDL_KMOD_RGUI = (2048 :: BG.CUInt)
+
+-- | the Num Lock key (may be located on an extended keypad) is down.
+--
+--     [C declaration]: @macro SDL_KMOD_NUM@, defined at @SDL3\/SDL_keycode.h 338:9@
+sDL_KMOD_NUM :: BG.CUInt
+sDL_KMOD_NUM = (4096 :: BG.CUInt)
+
+-- | the Caps Lock key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_CAPS@, defined at @SDL3\/SDL_keycode.h 339:9@
+sDL_KMOD_CAPS :: BG.CUInt
+sDL_KMOD_CAPS = (8192 :: BG.CUInt)
+
+-- | the !AltGr key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_MODE@, defined at @SDL3\/SDL_keycode.h 340:9@
+sDL_KMOD_MODE :: BG.CUInt
+sDL_KMOD_MODE = (16384 :: BG.CUInt)
+
+-- | the Scroll Lock key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_SCROLL@, defined at @SDL3\/SDL_keycode.h 341:9@
+sDL_KMOD_SCROLL :: BG.CUInt
+sDL_KMOD_SCROLL = (32768 :: BG.CUInt)
+
+-- | Any Ctrl key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_CTRL@, defined at @SDL3\/SDL_keycode.h 342:9@
+sDL_KMOD_CTRL :: BG.CUInt
+sDL_KMOD_CTRL =
+  (C.Expr.HostPlatform..|.) sDL_KMOD_LCTRL sDL_KMOD_RCTRL
+
+-- | Any Shift key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_SHIFT@, defined at @SDL3\/SDL_keycode.h 343:9@
+sDL_KMOD_SHIFT :: BG.CUInt
+sDL_KMOD_SHIFT =
+  (C.Expr.HostPlatform..|.) sDL_KMOD_LSHIFT sDL_KMOD_RSHIFT
+
+-- | Any Alt key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_ALT@, defined at @SDL3\/SDL_keycode.h 344:9@
+sDL_KMOD_ALT :: BG.CUInt
+sDL_KMOD_ALT =
+  (C.Expr.HostPlatform..|.) sDL_KMOD_LALT sDL_KMOD_RALT
+
+-- | Any GUI key is down.
+--
+--     [C declaration]: @macro SDL_KMOD_GUI@, defined at @SDL3\/SDL_keycode.h 345:9@
+sDL_KMOD_GUI :: BG.CUInt
+sDL_KMOD_GUI =
+  (C.Expr.HostPlatform..|.) sDL_KMOD_LGUI sDL_KMOD_RGUI
diff --git a/src/SDL3/Sys/Bindgen/Loadso.hs b/src/SDL3/Sys/Bindgen/Loadso.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Loadso.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | System-dependent library loading routines.
+--
+--     Shared objects are code that is programmatically loadable at runtime. Windows calls these \"DLLs\", Linux calls them \"shared libraries\", etc.
+--
+--     To use them, build such a library, then call @SDL_LoadObject()@ on it. Once loaded, you can use @SDL_LoadFunction()@ on that object to find the address of its exported symbols. When done with the object, call @SDL_UnloadObject()@ to dispose of it.
+--
+--     Some things to keep in mind:
+--
+--     * These functions only work on C function names. Other languages may have name mangling and intrinsic language support that varies from compiler to compiler.
+--
+--     * Make sure you declare your function pointers with the same calling convention as the actual library function. Your code will crash mysteriously if you do not do this.
+--
+--     * Avoid namespace collisions. If you load a symbol from the library, it is not defined whether or not it goes into the global symbol namespace for the application. If it does and it conflicts with symbols in your code or other shared libraries, you will not get the results you expect. :)
+--
+--     * Once a library is unloaded, all pointers into it obtained through @SDL_LoadFunction()@ become invalid, even if the library is later reloaded. Don\'t unload a library if you plan to use these pointers in the future. Notably: beware of giving one of these pointers to atexit(), since it may call that pointer after the library unloads. An opaque datatype that represents a loaded shared object.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadObject', 'sDL_LoadFunction', 'sDL_UnloadObject'
+module SDL3.Sys.Bindgen.Loadso (
+  SDL3.Sys.Bindgen.Loadso.SDL_SharedObject,
+)
+where
+
+-- | [C declaration]: @struct SDL_SharedObject@, defined at @SDL3\/SDL_loadso.h 77:16@
+data SDL_SharedObject
diff --git a/src/SDL3/Sys/Bindgen/Loadso/FunPtr.hs b/src/SDL3/Sys/Bindgen/Loadso/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Loadso/FunPtr.hs
@@ -0,0 +1,158 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Loadso.FunPtr (
+  SDL3.Sys.Bindgen.Loadso.FunPtr.sDL_LoadObject,
+  SDL3.Sys.Bindgen.Loadso.FunPtr.sDL_LoadFunction,
+  SDL3.Sys.Bindgen.Loadso.FunPtr.sDL_UnloadObject,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Loadso
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_loadso.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_get_SDL_LoadObject */"
+         , "__attribute__ ((const))"
+         , "SDL_SharedObject *(*hs_bindgen_06ede04ef7bebd95 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_LoadObject;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_get_SDL_LoadFunction */"
+         , "__attribute__ ((const))"
+         , "SDL_FunctionPointer (*hs_bindgen_c0b414522c89c9e2 (void)) ("
+         , "  SDL_SharedObject *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_LoadFunction;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_get_SDL_UnloadObject */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_a3520810bae0da07 (void)) ("
+         , "  SDL_SharedObject *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_UnloadObject;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_get_SDL_LoadObject@
+foreign import ccall unsafe "hs_bindgen_06ede04ef7bebd95"
+  hs_bindgen_06ede04ef7bebd95_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_get_SDL_LoadObject@
+hs_bindgen_06ede04ef7bebd95
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_SharedObject)))
+hs_bindgen_06ede04ef7bebd95 =
+  BG.fromFFIType hs_bindgen_06ede04ef7bebd95_base
+
+{-# NOINLINE sDL_LoadObject #-}
+
+-- | Dynamically load a shared object.
+--
+--     [@sofile@]: a system-dependent name of the object file.
+--
+--     [Returns]: an opaque pointer to the object handle or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadFunction', 'sDL_UnloadObject'
+--
+--     [C declaration]: @SDL_LoadObject@, defined at @SDL3\/SDL_loadso.h 93:48@
+sDL_LoadObject :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_SharedObject))
+sDL_LoadObject =
+  BG.unsafePerformIO hs_bindgen_06ede04ef7bebd95
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_get_SDL_LoadFunction@
+foreign import ccall unsafe "hs_bindgen_c0b414522c89c9e2"
+  hs_bindgen_c0b414522c89c9e2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_get_SDL_LoadFunction@
+hs_bindgen_c0b414522c89c9e2
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_SharedObject
+             -> PtrConst.PtrConst BG.CChar
+             -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+           )
+       )
+hs_bindgen_c0b414522c89c9e2 =
+  BG.fromFFIType hs_bindgen_c0b414522c89c9e2_base
+
+{-# NOINLINE sDL_LoadFunction #-}
+
+-- | Look up the address of the named function in a shared object.
+--
+--     This function pointer is no longer valid after calling @SDL_UnloadObject()@.
+--
+--     This function can only look up C function names. Other languages may have name mangling and intrinsic language support that varies from compiler to compiler.
+--
+--     Make sure you declare your function pointers with the same calling convention as the actual library function. Your code will crash mysteriously if you do not do this.
+--
+--     If the requested function doesn\'t exist, NULL is returned.
+--
+--     [@handle@]: a valid shared object handle returned by @SDL_LoadObject()@.
+--
+--     [@name@]: the name of the function to look up.
+--
+--     [Returns]: a pointer to the function or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadObject'
+--
+--     [C declaration]: @SDL_LoadFunction@, defined at @SDL3\/SDL_loadso.h 121:49@
+sDL_LoadFunction
+  :: BG.FunPtr
+       ( BG.Ptr SDL_SharedObject
+         -> PtrConst.PtrConst BG.CChar
+         -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+       )
+sDL_LoadFunction =
+  BG.unsafePerformIO hs_bindgen_c0b414522c89c9e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_get_SDL_UnloadObject@
+foreign import ccall unsafe "hs_bindgen_a3520810bae0da07"
+  hs_bindgen_a3520810bae0da07_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_get_SDL_UnloadObject@
+hs_bindgen_a3520810bae0da07 :: IO (BG.FunPtr (BG.Ptr SDL_SharedObject -> IO ()))
+hs_bindgen_a3520810bae0da07 =
+  BG.fromFFIType hs_bindgen_a3520810bae0da07_base
+
+{-# NOINLINE sDL_UnloadObject #-}
+
+-- | Unload a shared object from memory.
+--
+--     Note that any pointers from this object looked up through @SDL_LoadFunction()@ will no longer be valid.
+--
+--     [@handle@]: a valid shared object handle returned by @SDL_LoadObject()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadObject'
+--
+--     [C declaration]: @SDL_UnloadObject@, defined at @SDL3\/SDL_loadso.h 137:34@
+sDL_UnloadObject :: BG.FunPtr (BG.Ptr SDL_SharedObject -> IO ())
+sDL_UnloadObject =
+  BG.unsafePerformIO hs_bindgen_a3520810bae0da07
diff --git a/src/SDL3/Sys/Bindgen/Loadso/Safe.hs b/src/SDL3/Sys/Bindgen/Loadso/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Loadso/Safe.hs
@@ -0,0 +1,152 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Loadso.Safe (
+  SDL3.Sys.Bindgen.Loadso.Safe.sDL_LoadObject,
+  SDL3.Sys.Bindgen.Loadso.Safe.sDL_LoadFunction,
+  SDL3.Sys.Bindgen.Loadso.Safe.sDL_UnloadObject,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Loadso
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_loadso.h>"
+         , "SDL_SharedObject *hs_bindgen_db107edc1c41c909 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadObject)(arg1);"
+         , "}"
+         , "SDL_FunctionPointer hs_bindgen_47da86a71a34f8de ("
+         , "  SDL_SharedObject *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadFunction)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_e548a8de357a59b9 ("
+         , "  SDL_SharedObject *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnloadObject)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Safe_SDL_LoadObject@
+foreign import ccall safe "hs_bindgen_db107edc1c41c909"
+  hs_bindgen_db107edc1c41c909_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Safe_SDL_LoadObject@
+hs_bindgen_db107edc1c41c909
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_SharedObject)
+hs_bindgen_db107edc1c41c909 =
+  BG.fromFFIType hs_bindgen_db107edc1c41c909_base
+
+-- | Dynamically load a shared object.
+--
+--     [Returns]: an opaque pointer to the object handle or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadFunction', 'sDL_UnloadObject'
+--
+--     [C declaration]: @SDL_LoadObject@, defined at @SDL3\/SDL_loadso.h 93:48@
+sDL_LoadObject
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@sofile@]: a system-dependent name of the object file.
+  -> IO (BG.Ptr SDL_SharedObject)
+sDL_LoadObject = hs_bindgen_db107edc1c41c909
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Safe_SDL_LoadFunction@
+foreign import ccall safe "hs_bindgen_47da86a71a34f8de"
+  hs_bindgen_47da86a71a34f8de_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Safe_SDL_LoadFunction@
+hs_bindgen_47da86a71a34f8de
+  :: BG.Ptr SDL_SharedObject
+  -> PtrConst.PtrConst BG.CChar
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+hs_bindgen_47da86a71a34f8de =
+  BG.fromFFIType hs_bindgen_47da86a71a34f8de_base
+
+-- | Look up the address of the named function in a shared object.
+--
+--     This function pointer is no longer valid after calling @SDL_UnloadObject()@.
+--
+--     This function can only look up C function names. Other languages may have name mangling and intrinsic language support that varies from compiler to compiler.
+--
+--     Make sure you declare your function pointers with the same calling convention as the actual library function. Your code will crash mysteriously if you do not do this.
+--
+--     If the requested function doesn\'t exist, NULL is returned.
+--
+--     [Returns]: a pointer to the function or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadObject'
+--
+--     [C declaration]: @SDL_LoadFunction@, defined at @SDL3\/SDL_loadso.h 121:49@
+sDL_LoadFunction
+  :: BG.Ptr SDL_SharedObject
+  -- ^
+  --
+  --           [@handle@]: a valid shared object handle returned by @SDL_LoadObject()@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the function to look up.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+sDL_LoadFunction = hs_bindgen_47da86a71a34f8de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Safe_SDL_UnloadObject@
+foreign import ccall safe "hs_bindgen_e548a8de357a59b9"
+  hs_bindgen_e548a8de357a59b9_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Safe_SDL_UnloadObject@
+hs_bindgen_e548a8de357a59b9
+  :: BG.Ptr SDL_SharedObject
+  -> IO ()
+hs_bindgen_e548a8de357a59b9 =
+  BG.fromFFIType hs_bindgen_e548a8de357a59b9_base
+
+-- | Unload a shared object from memory.
+--
+--     Note that any pointers from this object looked up through @SDL_LoadFunction()@ will no longer be valid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadObject'
+--
+--     [C declaration]: @SDL_UnloadObject@, defined at @SDL3\/SDL_loadso.h 137:34@
+sDL_UnloadObject
+  :: BG.Ptr SDL_SharedObject
+  -- ^
+  --
+  --           [@handle@]: a valid shared object handle returned by @SDL_LoadObject()@.
+  -> IO ()
+sDL_UnloadObject = hs_bindgen_e548a8de357a59b9
diff --git a/src/SDL3/Sys/Bindgen/Loadso/Unsafe.hs b/src/SDL3/Sys/Bindgen/Loadso/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Loadso/Unsafe.hs
@@ -0,0 +1,152 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Loadso.Unsafe (
+  SDL3.Sys.Bindgen.Loadso.Unsafe.sDL_LoadObject,
+  SDL3.Sys.Bindgen.Loadso.Unsafe.sDL_LoadFunction,
+  SDL3.Sys.Bindgen.Loadso.Unsafe.sDL_UnloadObject,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Loadso
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_loadso.h>"
+         , "SDL_SharedObject *hs_bindgen_480ab0651497eddb ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadObject)(arg1);"
+         , "}"
+         , "SDL_FunctionPointer hs_bindgen_215b1c5734d854fe ("
+         , "  SDL_SharedObject *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadFunction)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_0898e457bf0f2807 ("
+         , "  SDL_SharedObject *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnloadObject)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Unsafe_SDL_LoadObject@
+foreign import ccall unsafe "hs_bindgen_480ab0651497eddb"
+  hs_bindgen_480ab0651497eddb_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Unsafe_SDL_LoadObject@
+hs_bindgen_480ab0651497eddb
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_SharedObject)
+hs_bindgen_480ab0651497eddb =
+  BG.fromFFIType hs_bindgen_480ab0651497eddb_base
+
+-- | Dynamically load a shared object.
+--
+--     [Returns]: an opaque pointer to the object handle or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadFunction', 'sDL_UnloadObject'
+--
+--     [C declaration]: @SDL_LoadObject@, defined at @SDL3\/SDL_loadso.h 93:48@
+sDL_LoadObject
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@sofile@]: a system-dependent name of the object file.
+  -> IO (BG.Ptr SDL_SharedObject)
+sDL_LoadObject = hs_bindgen_480ab0651497eddb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Unsafe_SDL_LoadFunction@
+foreign import ccall unsafe "hs_bindgen_215b1c5734d854fe"
+  hs_bindgen_215b1c5734d854fe_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Unsafe_SDL_LoadFunction@
+hs_bindgen_215b1c5734d854fe
+  :: BG.Ptr SDL_SharedObject
+  -> PtrConst.PtrConst BG.CChar
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+hs_bindgen_215b1c5734d854fe =
+  BG.fromFFIType hs_bindgen_215b1c5734d854fe_base
+
+-- | Look up the address of the named function in a shared object.
+--
+--     This function pointer is no longer valid after calling @SDL_UnloadObject()@.
+--
+--     This function can only look up C function names. Other languages may have name mangling and intrinsic language support that varies from compiler to compiler.
+--
+--     Make sure you declare your function pointers with the same calling convention as the actual library function. Your code will crash mysteriously if you do not do this.
+--
+--     If the requested function doesn\'t exist, NULL is returned.
+--
+--     [Returns]: a pointer to the function or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadObject'
+--
+--     [C declaration]: @SDL_LoadFunction@, defined at @SDL3\/SDL_loadso.h 121:49@
+sDL_LoadFunction
+  :: BG.Ptr SDL_SharedObject
+  -- ^
+  --
+  --           [@handle@]: a valid shared object handle returned by @SDL_LoadObject()@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the function to look up.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+sDL_LoadFunction = hs_bindgen_215b1c5734d854fe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Unsafe_SDL_UnloadObject@
+foreign import ccall unsafe "hs_bindgen_0898e457bf0f2807"
+  hs_bindgen_0898e457bf0f2807_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Loadso_Unsafe_SDL_UnloadObject@
+hs_bindgen_0898e457bf0f2807
+  :: BG.Ptr SDL_SharedObject
+  -> IO ()
+hs_bindgen_0898e457bf0f2807 =
+  BG.fromFFIType hs_bindgen_0898e457bf0f2807_base
+
+-- | Unload a shared object from memory.
+--
+--     Note that any pointers from this object looked up through @SDL_LoadFunction()@ will no longer be valid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadObject'
+--
+--     [C declaration]: @SDL_UnloadObject@, defined at @SDL3\/SDL_loadso.h 137:34@
+sDL_UnloadObject
+  :: BG.Ptr SDL_SharedObject
+  -- ^
+  --
+  --           [@handle@]: a valid shared object handle returned by @SDL_LoadObject()@.
+  -> IO ()
+sDL_UnloadObject = hs_bindgen_0898e457bf0f2807
diff --git a/src/SDL3/Sys/Bindgen/Locale.hs b/src/SDL3/Sys/Bindgen/Locale.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Locale.hs
@@ -0,0 +1,119 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL locale services.
+--
+--     This provides a way to get a list of preferred locales (language plus country) for the user. There is exactly one function: @SDL_GetPreferredLocales()@, which handles all the heavy lifting, and offers documentation on all the strange ways humans might have configured their language settings. A struct to provide locale data.
+--
+--     Locale data is split into a spoken language, like English, and an optional country, like Canada. The language will be in ISO-639 format (so English would be \"en\"), and the country, if not NULL, will be an ISO-3166 country code (so Canada would be \"CA\").
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPreferredLocales'
+module SDL3.Sys.Bindgen.Locale (
+  SDL3.Sys.Bindgen.Locale.SDL_Locale (..),
+)
+where
+
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @struct SDL_Locale@, defined at @SDL3\/SDL_locale.h 60:16@
+data SDL_Locale = SDL_Locale
+  { language :: PtrConst.PtrConst BG.CChar
+  -- ^ A language name, like \"en\" for English.
+  --
+  --          [C declaration]: @language@, defined at @SDL3\/SDL_locale.h 62:17@
+  , country :: PtrConst.PtrConst BG.CChar
+  -- ^ A country, like \"US\" for America. Can be NULL.
+  --
+  --          [C declaration]: @country@, defined at @SDL3\/SDL_locale.h 63:17@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_Locale where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_Locale where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Locale
+        <*> HasCField.readRaw (BG.Proxy @"language") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"country") ptr0
+
+instance Marshal.WriteRaw SDL_Locale where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Locale language2 country3 ->
+            HasCField.writeRaw (BG.Proxy @"language") ptr0 language2
+              >> HasCField.writeRaw (BG.Proxy @"country") ptr0 country3
+
+deriving via Marshal.EquivStorable SDL_Locale instance BG.Storable SDL_Locale
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "language" SDL_Locale ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Locale{language = y1, country = BG.getField @"country" x0}
+      , BG.getField @"language" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "language" (BG.Ptr SDL_Locale) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"language")
+
+instance HasCField.HasCField SDL_Locale "language" where
+  type
+    CFieldType SDL_Locale "language" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "country" SDL_Locale ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Locale{country = y1, language = BG.getField @"language" x0}
+      , BG.getField @"country" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "country" (BG.Ptr SDL_Locale) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"country")
+
+instance HasCField.HasCField SDL_Locale "country" where
+  type
+    CFieldType SDL_Locale "country" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 8
diff --git a/src/SDL3/Sys/Bindgen/Locale/FunPtr.hs b/src/SDL3/Sys/Bindgen/Locale/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Locale/FunPtr.hs
@@ -0,0 +1,64 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Locale.FunPtr (
+  SDL3.Sys.Bindgen.Locale.FunPtr.sDL_GetPreferredLocales,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Locale
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_locale.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Locale_get_SDL_GetPreferredLocales */"
+         , "__attribute__ ((const))"
+         , "SDL_Locale **(*hs_bindgen_85c70d4968252352 (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetPreferredLocales;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Locale_get_SDL_GetPreferredLocales@
+foreign import ccall unsafe "hs_bindgen_85c70d4968252352"
+  hs_bindgen_85c70d4968252352_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Locale_get_SDL_GetPreferredLocales@
+hs_bindgen_85c70d4968252352 :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_Locale))))
+hs_bindgen_85c70d4968252352 =
+  BG.fromFFIType hs_bindgen_85c70d4968252352_base
+
+{-# NOINLINE sDL_GetPreferredLocales #-}
+
+-- | Report the user\'s preferred locale.
+--
+--     Returned language strings are in the format xx, where \'xx\' is an ISO-639 language specifier (such as \"en\" for English, \"de\" for German, etc). Country strings are in the format YY, where \"YY\" is an ISO-3166 country code (such as \"US\" for the United States, \"CA\" for Canada, etc). Country might be NULL if there\'s no specific guidance on them (so you might get { \"en\", \"US\" } for American English, but { \"en\", NULL } means \"English language, generically\"). Language strings are never NULL, except to terminate the array.
+--
+--     Please note that not all of these strings are 2 characters; some are three or more.
+--
+--     The returned list of locales are in the order of the user\'s preference. For example, a German citizen that is fluent in US English and knows enough Japanese to navigate around Tokyo might have a list like: { \"de\", \"en_US\", \"jp\", NULL }. Someone from England might prefer British English (where \"color\" is spelled \"colour\", etc), but will settle for anything like it: { \"en_GB\", \"en\", NULL }.
+--
+--     This function returns NULL on error, including when the platform does not supply this information at all.
+--
+--     This might be a \"slow\" call that has to query the operating system. It\'s best to ask for this once and save the results. However, this list can change, usually because the user has changed a system preference outside of your program; SDL will send an SDL_EVENT_LOCALE_CHANGED event in this case, if possible, and you can call this function again to get an updated copy of preferred locales.
+--
+--     [@count@]: a pointer filled in with the number of locales returned, may be NULL.
+--
+--     [Returns]: a NULL terminated array of locale pointers, or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPreferredLocales@, defined at @SDL3\/SDL_locale.h 109:43@
+sDL_GetPreferredLocales :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_Locale)))
+sDL_GetPreferredLocales =
+  BG.unsafePerformIO hs_bindgen_85c70d4968252352
diff --git a/src/SDL3/Sys/Bindgen/Locale/Safe.hs b/src/SDL3/Sys/Bindgen/Locale/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Locale/Safe.hs
@@ -0,0 +1,65 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Locale.Safe (
+  SDL3.Sys.Bindgen.Locale.Safe.sDL_GetPreferredLocales,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Locale
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_locale.h>"
+         , "SDL_Locale **hs_bindgen_3153090c14b68521 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPreferredLocales)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Locale_Safe_SDL_GetPreferredLocales@
+foreign import ccall safe "hs_bindgen_3153090c14b68521"
+  hs_bindgen_3153090c14b68521_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Locale_Safe_SDL_GetPreferredLocales@
+hs_bindgen_3153090c14b68521
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_Locale))
+hs_bindgen_3153090c14b68521 =
+  BG.fromFFIType hs_bindgen_3153090c14b68521_base
+
+-- | Report the user\'s preferred locale.
+--
+--     Returned language strings are in the format xx, where \'xx\' is an ISO-639 language specifier (such as \"en\" for English, \"de\" for German, etc). Country strings are in the format YY, where \"YY\" is an ISO-3166 country code (such as \"US\" for the United States, \"CA\" for Canada, etc). Country might be NULL if there\'s no specific guidance on them (so you might get { \"en\", \"US\" } for American English, but { \"en\", NULL } means \"English language, generically\"). Language strings are never NULL, except to terminate the array.
+--
+--     Please note that not all of these strings are 2 characters; some are three or more.
+--
+--     The returned list of locales are in the order of the user\'s preference. For example, a German citizen that is fluent in US English and knows enough Japanese to navigate around Tokyo might have a list like: { \"de\", \"en_US\", \"jp\", NULL }. Someone from England might prefer British English (where \"color\" is spelled \"colour\", etc), but will settle for anything like it: { \"en_GB\", \"en\", NULL }.
+--
+--     This function returns NULL on error, including when the platform does not supply this information at all.
+--
+--     This might be a \"slow\" call that has to query the operating system. It\'s best to ask for this once and save the results. However, this list can change, usually because the user has changed a system preference outside of your program; SDL will send an SDL_EVENT_LOCALE_CHANGED event in this case, if possible, and you can call this function again to get an updated copy of preferred locales.
+--
+--     [Returns]: a NULL terminated array of locale pointers, or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPreferredLocales@, defined at @SDL3\/SDL_locale.h 109:43@
+sDL_GetPreferredLocales
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of locales returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Locale))
+sDL_GetPreferredLocales = hs_bindgen_3153090c14b68521
diff --git a/src/SDL3/Sys/Bindgen/Locale/Unsafe.hs b/src/SDL3/Sys/Bindgen/Locale/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Locale/Unsafe.hs
@@ -0,0 +1,65 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Locale.Unsafe (
+  SDL3.Sys.Bindgen.Locale.Unsafe.sDL_GetPreferredLocales,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Locale
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_locale.h>"
+         , "SDL_Locale **hs_bindgen_ae8e008e79421b8c ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPreferredLocales)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Locale_Unsafe_SDL_GetPreferredLocales@
+foreign import ccall unsafe "hs_bindgen_ae8e008e79421b8c"
+  hs_bindgen_ae8e008e79421b8c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Locale_Unsafe_SDL_GetPreferredLocales@
+hs_bindgen_ae8e008e79421b8c
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_Locale))
+hs_bindgen_ae8e008e79421b8c =
+  BG.fromFFIType hs_bindgen_ae8e008e79421b8c_base
+
+-- | Report the user\'s preferred locale.
+--
+--     Returned language strings are in the format xx, where \'xx\' is an ISO-639 language specifier (such as \"en\" for English, \"de\" for German, etc). Country strings are in the format YY, where \"YY\" is an ISO-3166 country code (such as \"US\" for the United States, \"CA\" for Canada, etc). Country might be NULL if there\'s no specific guidance on them (so you might get { \"en\", \"US\" } for American English, but { \"en\", NULL } means \"English language, generically\"). Language strings are never NULL, except to terminate the array.
+--
+--     Please note that not all of these strings are 2 characters; some are three or more.
+--
+--     The returned list of locales are in the order of the user\'s preference. For example, a German citizen that is fluent in US English and knows enough Japanese to navigate around Tokyo might have a list like: { \"de\", \"en_US\", \"jp\", NULL }. Someone from England might prefer British English (where \"color\" is spelled \"colour\", etc), but will settle for anything like it: { \"en_GB\", \"en\", NULL }.
+--
+--     This function returns NULL on error, including when the platform does not supply this information at all.
+--
+--     This might be a \"slow\" call that has to query the operating system. It\'s best to ask for this once and save the results. However, this list can change, usually because the user has changed a system preference outside of your program; SDL will send an SDL_EVENT_LOCALE_CHANGED event in this case, if possible, and you can call this function again to get an updated copy of preferred locales.
+--
+--     [Returns]: a NULL terminated array of locale pointers, or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPreferredLocales@, defined at @SDL3\/SDL_locale.h 109:43@
+sDL_GetPreferredLocales
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of locales returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Locale))
+sDL_GetPreferredLocales = hs_bindgen_ae8e008e79421b8c
diff --git a/src/SDL3/Sys/Bindgen/Log.hs b/src/SDL3/Sys/Bindgen/Log.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Log.hs
@@ -0,0 +1,542 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Simple log messages with priorities and categories. A message\'s 'SDL_LogPriority' signifies how important the message is. A message\'s 'SDL_LogCategory' signifies from what domain it belongs to. Every category has a minimum priority specified: when a message belongs to that category, it will only be sent out if it has that minimum priority or higher.
+--
+--     SDL\'s own logs are sent below the default priority threshold, so they are quiet by default.
+--
+--     You can change the log verbosity programmatically using @SDL_SetLogPriority()@ or with SDL_SetHint(SDL_HINT_LOGGING, ...), or with the \"SDL_LOGGING\" environment variable. This variable is a comma separated set of category=level tokens that define the default logging levels for SDL applications.
+--
+--     The category can be a numeric category, one of \"app\", \"error\", \"assert\", \"system\", \"audio\", \"video\", \"render\", \"input\", \"test\", or @*@ for any unspecified category.
+--
+--     The level can be a numeric level, one of \"trace\", \"verbose\", \"debug\", \"info\", \"warn\", \"error\", \"critical\", or \"quiet\" to disable that category.
+--
+--     You can omit the category if you want to set the logging level for all categories.
+--
+--     If this hint isn\'t set, the default log levels are equivalent to:
+--
+--     @app=info,assert=warn,test=verbose,*=error@
+--
+--     Here\'s where the messages go on different platforms:
+--
+--     * Windows: debug output stream
+--
+--     * Android: log output
+--
+--     * Others: standard error output (stderr)
+--
+--     You don\'t need to have a newline (@\\n@) on the end of messages, the functions will do that for you. For consistent behavior cross-platform, you shouldn\'t have any newlines in messages, such as to log multiple lines in one call; unusual platform-specific behavior can be observed in such usage. Do one log call per line instead, with no newlines in messages.
+--
+--     Each log call is atomic, so you won\'t see log messages cut off one another when logging from multiple threads. The predefined log categories
+--
+--     By default the application and gpu categories are enabled at the INFO level, the assert category is enabled at the WARN level, test is enabled at the VERBOSE level and all other categories are enabled at the ERROR level.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Log (
+  SDL3.Sys.Bindgen.Log.SDL_LogCategory (..),
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_APPLICATION,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_ERROR,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_ASSERT,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_SYSTEM,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_AUDIO,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_VIDEO,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_RENDER,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_INPUT,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_TEST,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_GPU,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_RESERVED2,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_RESERVED3,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_RESERVED4,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_RESERVED5,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_RESERVED6,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_RESERVED7,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_RESERVED8,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_RESERVED9,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_RESERVED10,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_CATEGORY_CUSTOM,
+  SDL3.Sys.Bindgen.Log.SDL_LogPriority (..),
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_PRIORITY_INVALID,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_PRIORITY_TRACE,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_PRIORITY_VERBOSE,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_PRIORITY_DEBUG,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_PRIORITY_INFO,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_PRIORITY_WARN,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_PRIORITY_ERROR,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_PRIORITY_CRITICAL,
+  pattern SDL3.Sys.Bindgen.Log.SDL_LOG_PRIORITY_COUNT,
+  SDL3.Sys.Bindgen.Log.SDL_LogOutputFunction_Aux (..),
+  SDL3.Sys.Bindgen.Log.SDL_LogOutputFunction (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @enum SDL_LogCategory@, defined at @SDL3\/SDL_log.h 90:14@
+newtype SDL_LogCategory = SDL_LogCategory
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_LogCategory where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_LogCategory where
+  readRaw =
+    \ptr0 ->
+      pure SDL_LogCategory
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_LogCategory where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_LogCategory unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_LogCategory instance BG.Storable SDL_LogCategory
+
+deriving via BG.CUInt instance BG.Prim SDL_LogCategory
+
+instance CEnum.CEnum SDL_LogCategory where
+  type CEnumZ SDL_LogCategory = BG.CUInt
+
+  toCEnum = SDL_LogCategory
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_LOG_CATEGORY_APPLICATION")
+        , (1, BG.singleton "SDL_LOG_CATEGORY_ERROR")
+        , (2, BG.singleton "SDL_LOG_CATEGORY_ASSERT")
+        , (3, BG.singleton "SDL_LOG_CATEGORY_SYSTEM")
+        , (4, BG.singleton "SDL_LOG_CATEGORY_AUDIO")
+        , (5, BG.singleton "SDL_LOG_CATEGORY_VIDEO")
+        , (6, BG.singleton "SDL_LOG_CATEGORY_RENDER")
+        , (7, BG.singleton "SDL_LOG_CATEGORY_INPUT")
+        , (8, BG.singleton "SDL_LOG_CATEGORY_TEST")
+        , (9, BG.singleton "SDL_LOG_CATEGORY_GPU")
+        , (10, BG.singleton "SDL_LOG_CATEGORY_RESERVED2")
+        , (11, BG.singleton "SDL_LOG_CATEGORY_RESERVED3")
+        , (12, BG.singleton "SDL_LOG_CATEGORY_RESERVED4")
+        , (13, BG.singleton "SDL_LOG_CATEGORY_RESERVED5")
+        , (14, BG.singleton "SDL_LOG_CATEGORY_RESERVED6")
+        , (15, BG.singleton "SDL_LOG_CATEGORY_RESERVED7")
+        , (16, BG.singleton "SDL_LOG_CATEGORY_RESERVED8")
+        , (17, BG.singleton "SDL_LOG_CATEGORY_RESERVED9")
+        , (18, BG.singleton "SDL_LOG_CATEGORY_RESERVED10")
+        , (19, BG.singleton "SDL_LOG_CATEGORY_CUSTOM")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_LogCategory"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_LogCategory"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_LogCategory where
+  minDeclaredValue = SDL_LOG_CATEGORY_APPLICATION
+
+  maxDeclaredValue = SDL_LOG_CATEGORY_CUSTOM
+
+instance Show SDL_LogCategory where
+  showsPrec = CEnum.shows
+
+instance Read SDL_LogCategory where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_LogCategory ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_LogCategory{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_LogCategory) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_LogCategory "unwrap" where
+  type CFieldType SDL_LogCategory "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_APPLICATION@, defined at @SDL3\/SDL_log.h 92:5@
+pattern SDL_LOG_CATEGORY_APPLICATION :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_APPLICATION = SDL_LogCategory 0
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_ERROR@, defined at @SDL3\/SDL_log.h 93:5@
+pattern SDL_LOG_CATEGORY_ERROR :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_ERROR = SDL_LogCategory 1
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_ASSERT@, defined at @SDL3\/SDL_log.h 94:5@
+pattern SDL_LOG_CATEGORY_ASSERT :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_ASSERT = SDL_LogCategory 2
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_SYSTEM@, defined at @SDL3\/SDL_log.h 95:5@
+pattern SDL_LOG_CATEGORY_SYSTEM :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_SYSTEM = SDL_LogCategory 3
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_AUDIO@, defined at @SDL3\/SDL_log.h 96:5@
+pattern SDL_LOG_CATEGORY_AUDIO :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_AUDIO = SDL_LogCategory 4
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_VIDEO@, defined at @SDL3\/SDL_log.h 97:5@
+pattern SDL_LOG_CATEGORY_VIDEO :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_VIDEO = SDL_LogCategory 5
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_RENDER@, defined at @SDL3\/SDL_log.h 98:5@
+pattern SDL_LOG_CATEGORY_RENDER :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_RENDER = SDL_LogCategory 6
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_INPUT@, defined at @SDL3\/SDL_log.h 99:5@
+pattern SDL_LOG_CATEGORY_INPUT :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_INPUT = SDL_LogCategory 7
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_TEST@, defined at @SDL3\/SDL_log.h 100:5@
+pattern SDL_LOG_CATEGORY_TEST :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_TEST = SDL_LogCategory 8
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_GPU@, defined at @SDL3\/SDL_log.h 101:5@
+pattern SDL_LOG_CATEGORY_GPU :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_GPU = SDL_LogCategory 9
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_RESERVED2@, defined at @SDL3\/SDL_log.h 104:5@
+pattern SDL_LOG_CATEGORY_RESERVED2 :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_RESERVED2 = SDL_LogCategory 10
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_RESERVED3@, defined at @SDL3\/SDL_log.h 105:5@
+pattern SDL_LOG_CATEGORY_RESERVED3 :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_RESERVED3 = SDL_LogCategory 11
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_RESERVED4@, defined at @SDL3\/SDL_log.h 106:5@
+pattern SDL_LOG_CATEGORY_RESERVED4 :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_RESERVED4 = SDL_LogCategory 12
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_RESERVED5@, defined at @SDL3\/SDL_log.h 107:5@
+pattern SDL_LOG_CATEGORY_RESERVED5 :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_RESERVED5 = SDL_LogCategory 13
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_RESERVED6@, defined at @SDL3\/SDL_log.h 108:5@
+pattern SDL_LOG_CATEGORY_RESERVED6 :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_RESERVED6 = SDL_LogCategory 14
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_RESERVED7@, defined at @SDL3\/SDL_log.h 109:5@
+pattern SDL_LOG_CATEGORY_RESERVED7 :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_RESERVED7 = SDL_LogCategory 15
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_RESERVED8@, defined at @SDL3\/SDL_log.h 110:5@
+pattern SDL_LOG_CATEGORY_RESERVED8 :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_RESERVED8 = SDL_LogCategory 16
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_RESERVED9@, defined at @SDL3\/SDL_log.h 111:5@
+pattern SDL_LOG_CATEGORY_RESERVED9 :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_RESERVED9 = SDL_LogCategory 17
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_RESERVED10@, defined at @SDL3\/SDL_log.h 112:5@
+pattern SDL_LOG_CATEGORY_RESERVED10 :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_RESERVED10 = SDL_LogCategory 18
+
+-- | [C declaration]: @SDL_LOG_CATEGORY_CUSTOM@, defined at @SDL3\/SDL_log.h 122:5@
+pattern SDL_LOG_CATEGORY_CUSTOM :: SDL_LogCategory
+pattern SDL_LOG_CATEGORY_CUSTOM = SDL_LogCategory 19
+
+-- | The predefined log priorities
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_LogPriority@, defined at @SDL3\/SDL_log.h 130:14@
+newtype SDL_LogPriority = SDL_LogPriority
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_LogPriority where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_LogPriority where
+  readRaw =
+    \ptr0 ->
+      pure SDL_LogPriority
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_LogPriority where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_LogPriority unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_LogPriority instance BG.Storable SDL_LogPriority
+
+deriving via BG.CUInt instance BG.Prim SDL_LogPriority
+
+instance CEnum.CEnum SDL_LogPriority where
+  type CEnumZ SDL_LogPriority = BG.CUInt
+
+  toCEnum = SDL_LogPriority
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_LOG_PRIORITY_INVALID")
+        , (1, BG.singleton "SDL_LOG_PRIORITY_TRACE")
+        , (2, BG.singleton "SDL_LOG_PRIORITY_VERBOSE")
+        , (3, BG.singleton "SDL_LOG_PRIORITY_DEBUG")
+        , (4, BG.singleton "SDL_LOG_PRIORITY_INFO")
+        , (5, BG.singleton "SDL_LOG_PRIORITY_WARN")
+        , (6, BG.singleton "SDL_LOG_PRIORITY_ERROR")
+        , (7, BG.singleton "SDL_LOG_PRIORITY_CRITICAL")
+        , (8, BG.singleton "SDL_LOG_PRIORITY_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_LogPriority"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_LogPriority"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_LogPriority where
+  minDeclaredValue = SDL_LOG_PRIORITY_INVALID
+
+  maxDeclaredValue = SDL_LOG_PRIORITY_COUNT
+
+instance Show SDL_LogPriority where
+  showsPrec = CEnum.shows
+
+instance Read SDL_LogPriority where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_LogPriority ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_LogPriority{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_LogPriority) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_LogPriority "unwrap" where
+  type CFieldType SDL_LogPriority "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_LOG_PRIORITY_INVALID@, defined at @SDL3\/SDL_log.h 132:5@
+pattern SDL_LOG_PRIORITY_INVALID :: SDL_LogPriority
+pattern SDL_LOG_PRIORITY_INVALID = SDL_LogPriority 0
+
+-- | [C declaration]: @SDL_LOG_PRIORITY_TRACE@, defined at @SDL3\/SDL_log.h 133:5@
+pattern SDL_LOG_PRIORITY_TRACE :: SDL_LogPriority
+pattern SDL_LOG_PRIORITY_TRACE = SDL_LogPriority 1
+
+-- | [C declaration]: @SDL_LOG_PRIORITY_VERBOSE@, defined at @SDL3\/SDL_log.h 134:5@
+pattern SDL_LOG_PRIORITY_VERBOSE :: SDL_LogPriority
+pattern SDL_LOG_PRIORITY_VERBOSE = SDL_LogPriority 2
+
+-- | [C declaration]: @SDL_LOG_PRIORITY_DEBUG@, defined at @SDL3\/SDL_log.h 135:5@
+pattern SDL_LOG_PRIORITY_DEBUG :: SDL_LogPriority
+pattern SDL_LOG_PRIORITY_DEBUG = SDL_LogPriority 3
+
+-- | [C declaration]: @SDL_LOG_PRIORITY_INFO@, defined at @SDL3\/SDL_log.h 136:5@
+pattern SDL_LOG_PRIORITY_INFO :: SDL_LogPriority
+pattern SDL_LOG_PRIORITY_INFO = SDL_LogPriority 4
+
+-- | [C declaration]: @SDL_LOG_PRIORITY_WARN@, defined at @SDL3\/SDL_log.h 137:5@
+pattern SDL_LOG_PRIORITY_WARN :: SDL_LogPriority
+pattern SDL_LOG_PRIORITY_WARN = SDL_LogPriority 5
+
+-- | [C declaration]: @SDL_LOG_PRIORITY_ERROR@, defined at @SDL3\/SDL_log.h 138:5@
+pattern SDL_LOG_PRIORITY_ERROR :: SDL_LogPriority
+pattern SDL_LOG_PRIORITY_ERROR = SDL_LogPriority 6
+
+-- | [C declaration]: @SDL_LOG_PRIORITY_CRITICAL@, defined at @SDL3\/SDL_log.h 139:5@
+pattern SDL_LOG_PRIORITY_CRITICAL :: SDL_LogPriority
+pattern SDL_LOG_PRIORITY_CRITICAL = SDL_LogPriority 7
+
+-- | [C declaration]: @SDL_LOG_PRIORITY_COUNT@, defined at @SDL3\/SDL_log.h 140:5@
+pattern SDL_LOG_PRIORITY_COUNT :: SDL_LogPriority
+pattern SDL_LOG_PRIORITY_COUNT = SDL_LogPriority 8
+
+-- | Auxiliary type used by 'SDL_LogOutputFunction'
+--
+--     [C declaration]: @SDL_LogOutputFunction@, defined at @SDL3\/SDL_log.h 485:24@
+newtype SDL_LogOutputFunction_Aux = SDL_LogOutputFunction_Aux
+  { unwrap :: BG.Ptr BG.Void -> BG.CInt -> SDL_LogPriority -> PtrConst.PtrConst BG.CChar -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_LogOutputFunction_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_e51284d24485bac7_base
+    :: (BG.Ptr BG.Void -> BG.Int32 -> BG.Word32 -> BG.Ptr BG.Void -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Int32 -> BG.Word32 -> BG.Ptr BG.Void -> IO ()))
+
+-- __unique:__ @toSDL_LogOutputFunction_Aux@
+hs_bindgen_e51284d24485bac7
+  :: SDL_LogOutputFunction_Aux
+  -> IO (BG.FunPtr SDL_LogOutputFunction_Aux)
+hs_bindgen_e51284d24485bac7 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_e51284d24485bac7_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_LogOutputFunction_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_0538751d36e72086_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Int32 -> BG.Word32 -> BG.Ptr BG.Void -> IO ())
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @fromSDL_LogOutputFunction_Aux@
+hs_bindgen_0538751d36e72086
+  :: BG.FunPtr SDL_LogOutputFunction_Aux
+  -> SDL_LogOutputFunction_Aux
+hs_bindgen_0538751d36e72086 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_0538751d36e72086_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_LogOutputFunction_Aux where
+  toFunPtr = hs_bindgen_e51284d24485bac7
+
+instance BG.FromFunPtr SDL_LogOutputFunction_Aux where
+  fromFunPtr = hs_bindgen_0538751d36e72086
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.CInt -> SDL_LogPriority -> PtrConst.PtrConst BG.CChar -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_LogOutputFunction_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_LogOutputFunction_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.CInt -> SDL_LogPriority -> PtrConst.PtrConst BG.CChar -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_LogOutputFunction_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_LogOutputFunction_Aux "unwrap" where
+  type
+    CFieldType SDL_LogOutputFunction_Aux "unwrap" =
+      BG.Ptr BG.Void -> BG.CInt -> SDL_LogPriority -> PtrConst.PtrConst BG.CChar -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | The prototype for the log output callback function.
+--
+--     This function is called by SDL when there is new text to be logged. A mutex is held so that this function is never called by more than one thread at once.
+--
+--     [@userdata@]: what was passed as @userdata@ to @SDL_SetLogOutputFunction()@.
+--
+--     [@category@]: the category of the message.
+--
+--     [@priority@]: the priority of the message.
+--
+--     [@message@]: the message being output.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_LogOutputFunction@, defined at @SDL3\/SDL_log.h 485:24@
+newtype SDL_LogOutputFunction = SDL_LogOutputFunction
+  { unwrap :: BG.FunPtr SDL_LogOutputFunction_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_LogOutputFunction_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_LogOutputFunction ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_LogOutputFunction{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_LogOutputFunction_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_LogOutputFunction) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_LogOutputFunction "unwrap" where
+  type
+    CFieldType SDL_LogOutputFunction "unwrap" =
+      BG.FunPtr SDL_LogOutputFunction_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Log/FunPtr.hs b/src/SDL3/Sys/Bindgen/Log/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Log/FunPtr.hs
@@ -0,0 +1,326 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Log.FunPtr (
+  SDL3.Sys.Bindgen.Log.FunPtr.sDL_SetLogPriorities,
+  SDL3.Sys.Bindgen.Log.FunPtr.sDL_SetLogPriority,
+  SDL3.Sys.Bindgen.Log.FunPtr.sDL_GetLogPriority,
+  SDL3.Sys.Bindgen.Log.FunPtr.sDL_ResetLogPriorities,
+  SDL3.Sys.Bindgen.Log.FunPtr.sDL_SetLogPriorityPrefix,
+  SDL3.Sys.Bindgen.Log.FunPtr.sDL_GetDefaultLogOutputFunction,
+  SDL3.Sys.Bindgen.Log.FunPtr.sDL_GetLogOutputFunction,
+  SDL3.Sys.Bindgen.Log.FunPtr.sDL_SetLogOutputFunction,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Log
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_log.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogPriorities */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_53f49172bb06fac5 (void)) ("
+         , "  SDL_LogPriority arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SetLogPriorities;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogPriority */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_efaec8fe88879163 (void)) ("
+         , "  signed int arg1,"
+         , "  SDL_LogPriority arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetLogPriority;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_GetLogPriority */"
+         , "__attribute__ ((const))"
+         , "SDL_LogPriority (*hs_bindgen_0a5edd280b63c817 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetLogPriority;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_ResetLogPriorities */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_a50e52f5fe769c57 (void)) (void)"
+         , "{"
+         , "  return &SDL_ResetLogPriorities;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogPriorityPrefix */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_69bb7de79ceb0d36 (void)) ("
+         , "  SDL_LogPriority arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetLogPriorityPrefix;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_GetDefaultLogOutputFunction */"
+         , "__attribute__ ((const))"
+         , "SDL_LogOutputFunction (*hs_bindgen_48e509121cb8d650 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetDefaultLogOutputFunction;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_GetLogOutputFunction */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_ae4995884c29f0d4 (void)) ("
+         , "  SDL_LogOutputFunction *arg1,"
+         , "  void **arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetLogOutputFunction;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogOutputFunction */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_b53e5cacb1899dae (void)) ("
+         , "  SDL_LogOutputFunction arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetLogOutputFunction;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogPriorities@
+foreign import ccall unsafe "hs_bindgen_53f49172bb06fac5"
+  hs_bindgen_53f49172bb06fac5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogPriorities@
+hs_bindgen_53f49172bb06fac5 :: IO (BG.FunPtr (SDL_LogPriority -> IO ()))
+hs_bindgen_53f49172bb06fac5 =
+  BG.fromFFIType hs_bindgen_53f49172bb06fac5_base
+
+{-# NOINLINE sDL_SetLogPriorities #-}
+
+-- | Set the priority of all log categories.
+--
+--     [@priority@]: the 'SDL_LogPriority' to assign.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResetLogPriorities', 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_SetLogPriorities@, defined at @SDL3\/SDL_log.h 156:34@
+sDL_SetLogPriorities :: BG.FunPtr (SDL_LogPriority -> IO ())
+sDL_SetLogPriorities =
+  BG.unsafePerformIO hs_bindgen_53f49172bb06fac5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogPriority@
+foreign import ccall unsafe "hs_bindgen_efaec8fe88879163"
+  hs_bindgen_efaec8fe88879163_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogPriority@
+hs_bindgen_efaec8fe88879163 :: IO (BG.FunPtr (BG.CInt -> SDL_LogPriority -> IO ()))
+hs_bindgen_efaec8fe88879163 =
+  BG.fromFFIType hs_bindgen_efaec8fe88879163_base
+
+{-# NOINLINE sDL_SetLogPriority #-}
+
+-- | Set the priority of a particular log category.
+--
+--     [@category@]: the category to assign a priority to.
+--
+--     [@priority@]: the 'SDL_LogPriority' to assign.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetLogPriority', 'sDL_ResetLogPriorities', 'sDL_SetLogPriorities'
+--
+--     [C declaration]: @SDL_SetLogPriority@, defined at @SDL3\/SDL_log.h 172:34@
+sDL_SetLogPriority :: BG.FunPtr (BG.CInt -> SDL_LogPriority -> IO ())
+sDL_SetLogPriority =
+  BG.unsafePerformIO hs_bindgen_efaec8fe88879163
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_GetLogPriority@
+foreign import ccall unsafe "hs_bindgen_0a5edd280b63c817"
+  hs_bindgen_0a5edd280b63c817_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_GetLogPriority@
+hs_bindgen_0a5edd280b63c817 :: IO (BG.FunPtr (BG.CInt -> IO SDL_LogPriority))
+hs_bindgen_0a5edd280b63c817 =
+  BG.fromFFIType hs_bindgen_0a5edd280b63c817_base
+
+{-# NOINLINE sDL_GetLogPriority #-}
+
+-- | Get the priority of a particular log category.
+--
+--     [@category@]: the category to query.
+--
+--     [Returns]: the 'SDL_LogPriority' for the requested category.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_GetLogPriority@, defined at @SDL3\/SDL_log.h 186:45@
+sDL_GetLogPriority :: BG.FunPtr (BG.CInt -> IO SDL_LogPriority)
+sDL_GetLogPriority =
+  BG.unsafePerformIO hs_bindgen_0a5edd280b63c817
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_ResetLogPriorities@
+foreign import ccall unsafe "hs_bindgen_a50e52f5fe769c57"
+  hs_bindgen_a50e52f5fe769c57_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_ResetLogPriorities@
+hs_bindgen_a50e52f5fe769c57 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_a50e52f5fe769c57 =
+  BG.fromFFIType hs_bindgen_a50e52f5fe769c57_base
+
+{-# NOINLINE sDL_ResetLogPriorities #-}
+
+-- | Reset all priorities to default.
+--
+--     This is called by SDL_Quit().
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogPriorities', 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_ResetLogPriorities@, defined at @SDL3\/SDL_log.h 200:34@
+sDL_ResetLogPriorities :: BG.FunPtr (IO ())
+sDL_ResetLogPriorities =
+  BG.unsafePerformIO hs_bindgen_a50e52f5fe769c57
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogPriorityPrefix@
+foreign import ccall unsafe "hs_bindgen_69bb7de79ceb0d36"
+  hs_bindgen_69bb7de79ceb0d36_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogPriorityPrefix@
+hs_bindgen_69bb7de79ceb0d36
+  :: IO (BG.FunPtr (SDL_LogPriority -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_69bb7de79ceb0d36 =
+  BG.fromFFIType hs_bindgen_69bb7de79ceb0d36_base
+
+{-# NOINLINE sDL_SetLogPriorityPrefix #-}
+
+-- | Set the text prepended to log messages of a given priority.
+--
+--     By default SDL_LOG_PRIORITY_INFO and below have no prefix, and SDL_LOG_PRIORITY_WARN and higher have a prefix showing their priority, e.g. \"WARNING: \".
+--
+--     This function makes a copy of its string argument, __prefix__, so it is not necessary to keep the value of __prefix__ alive after the call returns.
+--
+--     [@priority@]: the 'SDL_LogPriority' to modify.
+--
+--     [@prefix@]: the prefix to use for that log priority, or NULL to use no prefix.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogPriorities', 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_SetLogPriorityPrefix@, defined at @SDL3\/SDL_log.h 225:34@
+sDL_SetLogPriorityPrefix :: BG.FunPtr (SDL_LogPriority -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SetLogPriorityPrefix =
+  BG.unsafePerformIO hs_bindgen_69bb7de79ceb0d36
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_GetDefaultLogOutputFunction@
+foreign import ccall unsafe "hs_bindgen_48e509121cb8d650"
+  hs_bindgen_48e509121cb8d650_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_GetDefaultLogOutputFunction@
+hs_bindgen_48e509121cb8d650 :: IO (BG.FunPtr (IO SDL_LogOutputFunction))
+hs_bindgen_48e509121cb8d650 =
+  BG.fromFFIType hs_bindgen_48e509121cb8d650_base
+
+{-# NOINLINE sDL_GetDefaultLogOutputFunction #-}
+
+-- | Get the default log output function.
+--
+--     [Returns]: the default log output callback.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogOutputFunction', 'sDL_GetLogOutputFunction'
+--
+--     [C declaration]: @SDL_GetDefaultLogOutputFunction@, defined at @SDL3\/SDL_log.h 499:51@
+sDL_GetDefaultLogOutputFunction :: BG.FunPtr (IO SDL_LogOutputFunction)
+sDL_GetDefaultLogOutputFunction =
+  BG.unsafePerformIO hs_bindgen_48e509121cb8d650
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_GetLogOutputFunction@
+foreign import ccall unsafe "hs_bindgen_ae4995884c29f0d4"
+  hs_bindgen_ae4995884c29f0d4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_GetLogOutputFunction@
+hs_bindgen_ae4995884c29f0d4
+  :: IO (BG.FunPtr (BG.Ptr SDL_LogOutputFunction -> BG.Ptr (BG.Ptr BG.Void) -> IO ()))
+hs_bindgen_ae4995884c29f0d4 =
+  BG.fromFFIType hs_bindgen_ae4995884c29f0d4_base
+
+{-# NOINLINE sDL_GetLogOutputFunction #-}
+
+-- | Get the current log output function.
+--
+--     [@callback@]: an 'SDL_LogOutputFunction' filled in with the current log callback.
+--
+--     [@userdata@]: a pointer filled in with the pointer that is passed to @callback@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDefaultLogOutputFunction', 'sDL_SetLogOutputFunction'
+--
+--     [C declaration]: @SDL_GetLogOutputFunction@, defined at @SDL3\/SDL_log.h 516:34@
+sDL_GetLogOutputFunction
+  :: BG.FunPtr (BG.Ptr SDL_LogOutputFunction -> BG.Ptr (BG.Ptr BG.Void) -> IO ())
+sDL_GetLogOutputFunction =
+  BG.unsafePerformIO hs_bindgen_ae4995884c29f0d4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogOutputFunction@
+foreign import ccall unsafe "hs_bindgen_b53e5cacb1899dae"
+  hs_bindgen_b53e5cacb1899dae_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_get_SDL_SetLogOutputFunction@
+hs_bindgen_b53e5cacb1899dae :: IO (BG.FunPtr (SDL_LogOutputFunction -> BG.Ptr BG.Void -> IO ()))
+hs_bindgen_b53e5cacb1899dae =
+  BG.fromFFIType hs_bindgen_b53e5cacb1899dae_base
+
+{-# NOINLINE sDL_SetLogOutputFunction #-}
+
+-- | Replace the default log output function with one of your own.
+--
+--     [@callback@]: an 'SDL_LogOutputFunction' to call instead of the default.
+--
+--     [@userdata@]: a pointer that is passed to @callback@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDefaultLogOutputFunction', 'sDL_GetLogOutputFunction'
+--
+--     [C declaration]: @SDL_SetLogOutputFunction@, defined at @SDL3\/SDL_log.h 531:34@
+sDL_SetLogOutputFunction :: BG.FunPtr (SDL_LogOutputFunction -> BG.Ptr BG.Void -> IO ())
+sDL_SetLogOutputFunction =
+  BG.unsafePerformIO hs_bindgen_b53e5cacb1899dae
diff --git a/src/SDL3/Sys/Bindgen/Log/Safe.hs b/src/SDL3/Sys/Bindgen/Log/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Log/Safe.hs
@@ -0,0 +1,339 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Log.Safe (
+  SDL3.Sys.Bindgen.Log.Safe.sDL_SetLogPriorities,
+  SDL3.Sys.Bindgen.Log.Safe.sDL_SetLogPriority,
+  SDL3.Sys.Bindgen.Log.Safe.sDL_GetLogPriority,
+  SDL3.Sys.Bindgen.Log.Safe.sDL_ResetLogPriorities,
+  SDL3.Sys.Bindgen.Log.Safe.sDL_SetLogPriorityPrefix,
+  SDL3.Sys.Bindgen.Log.Safe.sDL_GetDefaultLogOutputFunction,
+  SDL3.Sys.Bindgen.Log.Safe.sDL_GetLogOutputFunction,
+  SDL3.Sys.Bindgen.Log.Safe.sDL_SetLogOutputFunction,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Log
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_log.h>"
+         , "void hs_bindgen_f2fe4ac03d85bd48 ("
+         , "  SDL_LogPriority arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SetLogPriorities)(arg1);"
+         , "}"
+         , "void hs_bindgen_3ebd8c186ab4d36e ("
+         , "  signed int arg1,"
+         , "  SDL_LogPriority arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetLogPriority)(arg1, arg2);"
+         , "}"
+         , "SDL_LogPriority hs_bindgen_ba1c5f57ea908831 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetLogPriority)(arg1);"
+         , "}"
+         , "void hs_bindgen_6d6b388f10a6a765 (void)"
+         , "{"
+         , "  (SDL_ResetLogPriorities)();"
+         , "}"
+         , "_Bool hs_bindgen_a2865e2847033be6 ("
+         , "  SDL_LogPriority arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetLogPriorityPrefix)(arg1, arg2);"
+         , "}"
+         , "SDL_LogOutputFunction hs_bindgen_29e148c925d2e14a (void)"
+         , "{"
+         , "  return (SDL_GetDefaultLogOutputFunction)();"
+         , "}"
+         , "void hs_bindgen_50b31a8317423d85 ("
+         , "  SDL_LogOutputFunction *arg1,"
+         , "  void **arg2"
+         , ")"
+         , "{"
+         , "  (SDL_GetLogOutputFunction)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_bef3e6ff73c88ce8 ("
+         , "  SDL_LogOutputFunction arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetLogOutputFunction)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_SetLogPriorities@
+foreign import ccall safe "hs_bindgen_f2fe4ac03d85bd48"
+  hs_bindgen_f2fe4ac03d85bd48_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_SetLogPriorities@
+hs_bindgen_f2fe4ac03d85bd48
+  :: SDL_LogPriority
+  -> IO ()
+hs_bindgen_f2fe4ac03d85bd48 =
+  BG.fromFFIType hs_bindgen_f2fe4ac03d85bd48_base
+
+-- | Set the priority of all log categories.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResetLogPriorities', 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_SetLogPriorities@, defined at @SDL3\/SDL_log.h 156:34@
+sDL_SetLogPriorities
+  :: SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to assign.
+  -> IO ()
+sDL_SetLogPriorities = hs_bindgen_f2fe4ac03d85bd48
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_SetLogPriority@
+foreign import ccall safe "hs_bindgen_3ebd8c186ab4d36e"
+  hs_bindgen_3ebd8c186ab4d36e_base
+    :: BG.Int32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_SetLogPriority@
+hs_bindgen_3ebd8c186ab4d36e
+  :: BG.CInt
+  -> SDL_LogPriority
+  -> IO ()
+hs_bindgen_3ebd8c186ab4d36e =
+  BG.fromFFIType hs_bindgen_3ebd8c186ab4d36e_base
+
+-- | Set the priority of a particular log category.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetLogPriority', 'sDL_ResetLogPriorities', 'sDL_SetLogPriorities'
+--
+--     [C declaration]: @SDL_SetLogPriority@, defined at @SDL3\/SDL_log.h 172:34@
+sDL_SetLogPriority
+  :: BG.CInt
+  -- ^
+  --
+  --           [@category@]: the category to assign a priority to.
+  -> SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to assign.
+  -> IO ()
+sDL_SetLogPriority = hs_bindgen_3ebd8c186ab4d36e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_GetLogPriority@
+foreign import ccall safe "hs_bindgen_ba1c5f57ea908831"
+  hs_bindgen_ba1c5f57ea908831_base
+    :: BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_GetLogPriority@
+hs_bindgen_ba1c5f57ea908831
+  :: BG.CInt
+  -> IO SDL_LogPriority
+hs_bindgen_ba1c5f57ea908831 =
+  BG.fromFFIType hs_bindgen_ba1c5f57ea908831_base
+
+-- | Get the priority of a particular log category.
+--
+--     [Returns]: the 'SDL_LogPriority' for the requested category.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_GetLogPriority@, defined at @SDL3\/SDL_log.h 186:45@
+sDL_GetLogPriority
+  :: BG.CInt
+  -- ^
+  --
+  --           [@category@]: the category to query.
+  -> IO SDL_LogPriority
+sDL_GetLogPriority = hs_bindgen_ba1c5f57ea908831
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_ResetLogPriorities@
+foreign import ccall safe "hs_bindgen_6d6b388f10a6a765"
+  hs_bindgen_6d6b388f10a6a765_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_ResetLogPriorities@
+hs_bindgen_6d6b388f10a6a765 :: IO ()
+hs_bindgen_6d6b388f10a6a765 =
+  BG.fromFFIType hs_bindgen_6d6b388f10a6a765_base
+
+-- | Reset all priorities to default.
+--
+--     This is called by SDL_Quit().
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogPriorities', 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_ResetLogPriorities@, defined at @SDL3\/SDL_log.h 200:34@
+sDL_ResetLogPriorities :: IO ()
+sDL_ResetLogPriorities = hs_bindgen_6d6b388f10a6a765
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_SetLogPriorityPrefix@
+foreign import ccall safe "hs_bindgen_a2865e2847033be6"
+  hs_bindgen_a2865e2847033be6_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_SetLogPriorityPrefix@
+hs_bindgen_a2865e2847033be6
+  :: SDL_LogPriority
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_a2865e2847033be6 =
+  BG.fromFFIType hs_bindgen_a2865e2847033be6_base
+
+-- | Set the text prepended to log messages of a given priority.
+--
+--     By default SDL_LOG_PRIORITY_INFO and below have no prefix, and SDL_LOG_PRIORITY_WARN and higher have a prefix showing their priority, e.g. \"WARNING: \".
+--
+--     This function makes a copy of its string argument, __prefix__, so it is not necessary to keep the value of __prefix__ alive after the call returns.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogPriorities', 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_SetLogPriorityPrefix@, defined at @SDL3\/SDL_log.h 225:34@
+sDL_SetLogPriorityPrefix
+  :: SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@prefix@]: the prefix to use for that log priority, or NULL to use no prefix.
+  -> IO BG.CBool
+sDL_SetLogPriorityPrefix =
+  hs_bindgen_a2865e2847033be6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_GetDefaultLogOutputFunction@
+foreign import ccall safe "hs_bindgen_29e148c925d2e14a"
+  hs_bindgen_29e148c925d2e14a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_GetDefaultLogOutputFunction@
+hs_bindgen_29e148c925d2e14a :: IO SDL_LogOutputFunction
+hs_bindgen_29e148c925d2e14a =
+  BG.fromFFIType hs_bindgen_29e148c925d2e14a_base
+
+-- | Get the default log output function.
+--
+--     [Returns]: the default log output callback.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogOutputFunction', 'sDL_GetLogOutputFunction'
+--
+--     [C declaration]: @SDL_GetDefaultLogOutputFunction@, defined at @SDL3\/SDL_log.h 499:51@
+sDL_GetDefaultLogOutputFunction :: IO SDL_LogOutputFunction
+sDL_GetDefaultLogOutputFunction =
+  hs_bindgen_29e148c925d2e14a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_GetLogOutputFunction@
+foreign import ccall safe "hs_bindgen_50b31a8317423d85"
+  hs_bindgen_50b31a8317423d85_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_GetLogOutputFunction@
+hs_bindgen_50b31a8317423d85
+  :: BG.Ptr SDL_LogOutputFunction
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -> IO ()
+hs_bindgen_50b31a8317423d85 =
+  BG.fromFFIType hs_bindgen_50b31a8317423d85_base
+
+-- | Get the current log output function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDefaultLogOutputFunction', 'sDL_SetLogOutputFunction'
+--
+--     [C declaration]: @SDL_GetLogOutputFunction@, defined at @SDL3\/SDL_log.h 516:34@
+sDL_GetLogOutputFunction
+  :: BG.Ptr SDL_LogOutputFunction
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_LogOutputFunction' filled in with the current log callback.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@userdata@]: a pointer filled in with the pointer that is passed to @callback@.
+  -> IO ()
+sDL_GetLogOutputFunction =
+  hs_bindgen_50b31a8317423d85
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_SetLogOutputFunction@
+foreign import ccall safe "hs_bindgen_bef3e6ff73c88ce8"
+  hs_bindgen_bef3e6ff73c88ce8_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Safe_SDL_SetLogOutputFunction@
+hs_bindgen_bef3e6ff73c88ce8
+  :: SDL_LogOutputFunction
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_bef3e6ff73c88ce8 =
+  BG.fromFFIType hs_bindgen_bef3e6ff73c88ce8_base
+
+-- | Replace the default log output function with one of your own.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDefaultLogOutputFunction', 'sDL_GetLogOutputFunction'
+--
+--     [C declaration]: @SDL_SetLogOutputFunction@, defined at @SDL3\/SDL_log.h 531:34@
+sDL_SetLogOutputFunction
+  :: SDL_LogOutputFunction
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_LogOutputFunction' to call instead of the default.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO ()
+sDL_SetLogOutputFunction =
+  hs_bindgen_bef3e6ff73c88ce8
diff --git a/src/SDL3/Sys/Bindgen/Log/Unsafe.hs b/src/SDL3/Sys/Bindgen/Log/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Log/Unsafe.hs
@@ -0,0 +1,339 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Log.Unsafe (
+  SDL3.Sys.Bindgen.Log.Unsafe.sDL_SetLogPriorities,
+  SDL3.Sys.Bindgen.Log.Unsafe.sDL_SetLogPriority,
+  SDL3.Sys.Bindgen.Log.Unsafe.sDL_GetLogPriority,
+  SDL3.Sys.Bindgen.Log.Unsafe.sDL_ResetLogPriorities,
+  SDL3.Sys.Bindgen.Log.Unsafe.sDL_SetLogPriorityPrefix,
+  SDL3.Sys.Bindgen.Log.Unsafe.sDL_GetDefaultLogOutputFunction,
+  SDL3.Sys.Bindgen.Log.Unsafe.sDL_GetLogOutputFunction,
+  SDL3.Sys.Bindgen.Log.Unsafe.sDL_SetLogOutputFunction,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Log
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_log.h>"
+         , "void hs_bindgen_f026d42937d04ed8 ("
+         , "  SDL_LogPriority arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SetLogPriorities)(arg1);"
+         , "}"
+         , "void hs_bindgen_e0acc30fc32ccc59 ("
+         , "  signed int arg1,"
+         , "  SDL_LogPriority arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetLogPriority)(arg1, arg2);"
+         , "}"
+         , "SDL_LogPriority hs_bindgen_7b5c14a42af4d447 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetLogPriority)(arg1);"
+         , "}"
+         , "void hs_bindgen_dea89eef989102db (void)"
+         , "{"
+         , "  (SDL_ResetLogPriorities)();"
+         , "}"
+         , "_Bool hs_bindgen_27cf84b222a7e17b ("
+         , "  SDL_LogPriority arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetLogPriorityPrefix)(arg1, arg2);"
+         , "}"
+         , "SDL_LogOutputFunction hs_bindgen_513e0ffa6c24153a (void)"
+         , "{"
+         , "  return (SDL_GetDefaultLogOutputFunction)();"
+         , "}"
+         , "void hs_bindgen_acd55da6463a4da5 ("
+         , "  SDL_LogOutputFunction *arg1,"
+         , "  void **arg2"
+         , ")"
+         , "{"
+         , "  (SDL_GetLogOutputFunction)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_70ca4187e3666373 ("
+         , "  SDL_LogOutputFunction arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetLogOutputFunction)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_SetLogPriorities@
+foreign import ccall unsafe "hs_bindgen_f026d42937d04ed8"
+  hs_bindgen_f026d42937d04ed8_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_SetLogPriorities@
+hs_bindgen_f026d42937d04ed8
+  :: SDL_LogPriority
+  -> IO ()
+hs_bindgen_f026d42937d04ed8 =
+  BG.fromFFIType hs_bindgen_f026d42937d04ed8_base
+
+-- | Set the priority of all log categories.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ResetLogPriorities', 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_SetLogPriorities@, defined at @SDL3\/SDL_log.h 156:34@
+sDL_SetLogPriorities
+  :: SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to assign.
+  -> IO ()
+sDL_SetLogPriorities = hs_bindgen_f026d42937d04ed8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_SetLogPriority@
+foreign import ccall unsafe "hs_bindgen_e0acc30fc32ccc59"
+  hs_bindgen_e0acc30fc32ccc59_base
+    :: BG.Int32
+    -> BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_SetLogPriority@
+hs_bindgen_e0acc30fc32ccc59
+  :: BG.CInt
+  -> SDL_LogPriority
+  -> IO ()
+hs_bindgen_e0acc30fc32ccc59 =
+  BG.fromFFIType hs_bindgen_e0acc30fc32ccc59_base
+
+-- | Set the priority of a particular log category.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetLogPriority', 'sDL_ResetLogPriorities', 'sDL_SetLogPriorities'
+--
+--     [C declaration]: @SDL_SetLogPriority@, defined at @SDL3\/SDL_log.h 172:34@
+sDL_SetLogPriority
+  :: BG.CInt
+  -- ^
+  --
+  --           [@category@]: the category to assign a priority to.
+  -> SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to assign.
+  -> IO ()
+sDL_SetLogPriority = hs_bindgen_e0acc30fc32ccc59
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_GetLogPriority@
+foreign import ccall unsafe "hs_bindgen_7b5c14a42af4d447"
+  hs_bindgen_7b5c14a42af4d447_base
+    :: BG.Int32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_GetLogPriority@
+hs_bindgen_7b5c14a42af4d447
+  :: BG.CInt
+  -> IO SDL_LogPriority
+hs_bindgen_7b5c14a42af4d447 =
+  BG.fromFFIType hs_bindgen_7b5c14a42af4d447_base
+
+-- | Get the priority of a particular log category.
+--
+--     [Returns]: the 'SDL_LogPriority' for the requested category.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_GetLogPriority@, defined at @SDL3\/SDL_log.h 186:45@
+sDL_GetLogPriority
+  :: BG.CInt
+  -- ^
+  --
+  --           [@category@]: the category to query.
+  -> IO SDL_LogPriority
+sDL_GetLogPriority = hs_bindgen_7b5c14a42af4d447
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_ResetLogPriorities@
+foreign import ccall unsafe "hs_bindgen_dea89eef989102db"
+  hs_bindgen_dea89eef989102db_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_ResetLogPriorities@
+hs_bindgen_dea89eef989102db :: IO ()
+hs_bindgen_dea89eef989102db =
+  BG.fromFFIType hs_bindgen_dea89eef989102db_base
+
+-- | Reset all priorities to default.
+--
+--     This is called by SDL_Quit().
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogPriorities', 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_ResetLogPriorities@, defined at @SDL3\/SDL_log.h 200:34@
+sDL_ResetLogPriorities :: IO ()
+sDL_ResetLogPriorities = hs_bindgen_dea89eef989102db
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_SetLogPriorityPrefix@
+foreign import ccall unsafe "hs_bindgen_27cf84b222a7e17b"
+  hs_bindgen_27cf84b222a7e17b_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_SetLogPriorityPrefix@
+hs_bindgen_27cf84b222a7e17b
+  :: SDL_LogPriority
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_27cf84b222a7e17b =
+  BG.fromFFIType hs_bindgen_27cf84b222a7e17b_base
+
+-- | Set the text prepended to log messages of a given priority.
+--
+--     By default SDL_LOG_PRIORITY_INFO and below have no prefix, and SDL_LOG_PRIORITY_WARN and higher have a prefix showing their priority, e.g. \"WARNING: \".
+--
+--     This function makes a copy of its string argument, __prefix__, so it is not necessary to keep the value of __prefix__ alive after the call returns.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogPriorities', 'sDL_SetLogPriority'
+--
+--     [C declaration]: @SDL_SetLogPriorityPrefix@, defined at @SDL3\/SDL_log.h 225:34@
+sDL_SetLogPriorityPrefix
+  :: SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@prefix@]: the prefix to use for that log priority, or NULL to use no prefix.
+  -> IO BG.CBool
+sDL_SetLogPriorityPrefix =
+  hs_bindgen_27cf84b222a7e17b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_GetDefaultLogOutputFunction@
+foreign import ccall unsafe "hs_bindgen_513e0ffa6c24153a"
+  hs_bindgen_513e0ffa6c24153a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_GetDefaultLogOutputFunction@
+hs_bindgen_513e0ffa6c24153a :: IO SDL_LogOutputFunction
+hs_bindgen_513e0ffa6c24153a =
+  BG.fromFFIType hs_bindgen_513e0ffa6c24153a_base
+
+-- | Get the default log output function.
+--
+--     [Returns]: the default log output callback.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetLogOutputFunction', 'sDL_GetLogOutputFunction'
+--
+--     [C declaration]: @SDL_GetDefaultLogOutputFunction@, defined at @SDL3\/SDL_log.h 499:51@
+sDL_GetDefaultLogOutputFunction :: IO SDL_LogOutputFunction
+sDL_GetDefaultLogOutputFunction =
+  hs_bindgen_513e0ffa6c24153a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_GetLogOutputFunction@
+foreign import ccall unsafe "hs_bindgen_acd55da6463a4da5"
+  hs_bindgen_acd55da6463a4da5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_GetLogOutputFunction@
+hs_bindgen_acd55da6463a4da5
+  :: BG.Ptr SDL_LogOutputFunction
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -> IO ()
+hs_bindgen_acd55da6463a4da5 =
+  BG.fromFFIType hs_bindgen_acd55da6463a4da5_base
+
+-- | Get the current log output function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDefaultLogOutputFunction', 'sDL_SetLogOutputFunction'
+--
+--     [C declaration]: @SDL_GetLogOutputFunction@, defined at @SDL3\/SDL_log.h 516:34@
+sDL_GetLogOutputFunction
+  :: BG.Ptr SDL_LogOutputFunction
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_LogOutputFunction' filled in with the current log callback.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@userdata@]: a pointer filled in with the pointer that is passed to @callback@.
+  -> IO ()
+sDL_GetLogOutputFunction =
+  hs_bindgen_acd55da6463a4da5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_SetLogOutputFunction@
+foreign import ccall unsafe "hs_bindgen_70ca4187e3666373"
+  hs_bindgen_70ca4187e3666373_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Log_Unsafe_SDL_SetLogOutputFunction@
+hs_bindgen_70ca4187e3666373
+  :: SDL_LogOutputFunction
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_70ca4187e3666373 =
+  BG.fromFFIType hs_bindgen_70ca4187e3666373_base
+
+-- | Replace the default log output function with one of your own.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDefaultLogOutputFunction', 'sDL_GetLogOutputFunction'
+--
+--     [C declaration]: @SDL_SetLogOutputFunction@, defined at @SDL3\/SDL_log.h 531:34@
+sDL_SetLogOutputFunction
+  :: SDL_LogOutputFunction
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_LogOutputFunction' to call instead of the default.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO ()
+sDL_SetLogOutputFunction =
+  hs_bindgen_70ca4187e3666373
diff --git a/src/SDL3/Sys/Bindgen/Main.hs b/src/SDL3/Sys/Bindgen/Main.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Main.hs
@@ -0,0 +1,143 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+module SDL3.Sys.Bindgen.Main (
+  SDL3.Sys.Bindgen.Main.SDL_main_func_Aux (..),
+  SDL3.Sys.Bindgen.Main.SDL_main_func (..),
+)
+where
+
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.IncompleteArray qualified as IA
+import HsBindgen.Runtime.IsArray qualified as IsA
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | Auxiliary type used by 'SDL_main_func'
+--
+--     [C declaration]: @SDL_main_func@, defined at @SDL3\/SDL_main.h 498:23@
+newtype SDL_main_func_Aux = SDL_main_func_Aux
+  { unwrap :: BG.CInt -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar))) -> IO BG.CInt
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_main_func_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_637d4c26522acb68_base
+    :: (BG.Int32 -> BG.Ptr BG.Void -> IO BG.Int32)
+    -> IO (BG.FunPtr (BG.Int32 -> BG.Ptr BG.Void -> IO BG.Int32))
+
+-- __unique:__ @toSDL_main_func_Aux@
+hs_bindgen_637d4c26522acb68
+  :: SDL_main_func_Aux
+  -> IO (BG.FunPtr SDL_main_func_Aux)
+hs_bindgen_637d4c26522acb68 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_637d4c26522acb68_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_main_func_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_7875a01662c70189_base
+    :: BG.FunPtr (BG.Int32 -> BG.Ptr BG.Void -> IO BG.Int32)
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @fromSDL_main_func_Aux@
+hs_bindgen_7875a01662c70189
+  :: BG.FunPtr SDL_main_func_Aux
+  -> SDL_main_func_Aux
+hs_bindgen_7875a01662c70189 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_7875a01662c70189_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_main_func_Aux where
+  toFunPtr = hs_bindgen_637d4c26522acb68
+
+instance BG.FromFunPtr SDL_main_func_Aux where
+  fromFunPtr = hs_bindgen_7875a01662c70189
+
+instance
+  (ty ~ (BG.CInt -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar))) -> IO BG.CInt))
+  => BG.CompatHasField.HasField "unwrap" SDL_main_func_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_main_func_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.CInt -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar))) -> IO BG.CInt))
+  => BG.HasField "unwrap" (BG.Ptr SDL_main_func_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_main_func_Aux "unwrap" where
+  type
+    CFieldType SDL_main_func_Aux "unwrap" =
+      BG.CInt -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar))) -> IO BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The prototype for the application\'s main() function
+--
+--     [@argc@]: an ANSI-C style main function\'s argc.
+--
+--     [@argv@]: an ANSI-C style main function\'s argv.
+--
+--     [Returns]: an ANSI-C main return code; generally 0 is considered successful program completion, and small non-zero values are considered errors.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_main_func@, defined at @SDL3\/SDL_main.h 498:23@
+newtype SDL_main_func = SDL_main_func
+  { unwrap :: BG.FunPtr SDL_main_func_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_main_func_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_main_func ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_main_func{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_main_func_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_main_func) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_main_func "unwrap" where
+  type
+    CFieldType SDL_main_func "unwrap" =
+      BG.FunPtr SDL_main_func_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Main/FunPtr.hs b/src/SDL3/Sys/Bindgen/Main/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Main/FunPtr.hs
@@ -0,0 +1,228 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Main.FunPtr (
+  SDL3.Sys.Bindgen.Main.FunPtr.sDL_SetMainReady,
+  SDL3.Sys.Bindgen.Main.FunPtr.sDL_RunApp,
+  SDL3.Sys.Bindgen.Main.FunPtr.sDL_EnterAppMainCallbacks,
+  SDL3.Sys.Bindgen.Main.FunPtr.sDL_GDKSuspendComplete,
+)
+where
+
+import HsBindgen.Runtime.IncompleteArray qualified as IA
+import HsBindgen.Runtime.IsArray qualified as IsA
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Init qualified
+import SDL3.Sys.Bindgen.Main
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#define SDL_MAIN_HANDLED"
+         , "#include <SDL3/SDL_main.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_SetMainReady */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_a748be6c08507093 (void)) (void)"
+         , "{"
+         , "  return &SDL_SetMainReady;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_RunApp */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_9ddd66f3bccdd116 (void)) ("
+         , "  signed int arg1,"
+         , "  char **arg2,"
+         , "  SDL_main_func arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_RunApp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_EnterAppMainCallbacks */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_50b435e689e12498 (void)) ("
+         , "  signed int arg1,"
+         , "  char **arg2,"
+         , "  SDL_AppInit_func arg3,"
+         , "  SDL_AppIterate_func arg4,"
+         , "  SDL_AppEvent_func arg5,"
+         , "  SDL_AppQuit_func arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_EnterAppMainCallbacks;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_GDKSuspendComplete */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_07ea6ee797596218 (void)) (void)"
+         , "{"
+         , "  return &SDL_GDKSuspendComplete;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_SetMainReady@
+foreign import ccall unsafe "hs_bindgen_a748be6c08507093"
+  hs_bindgen_a748be6c08507093_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_SetMainReady@
+hs_bindgen_a748be6c08507093 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_a748be6c08507093 =
+  BG.fromFFIType hs_bindgen_a748be6c08507093_base
+
+{-# NOINLINE sDL_SetMainReady #-}
+
+-- | Circumvent failure of SDL_Init() when not using @SDL_main()@ as an entry point.
+--
+--     This function is defined in @SDL_main.h@, along with the preprocessor rule to redefine main() as @SDL_main()@. Thus to ensure that your main() function will not be changed it is necessary to define SDL_MAIN_HANDLED before including SDL.h.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_Init
+--
+--     [C declaration]: @SDL_SetMainReady@, defined at @SDL3\/SDL_main.h 548:34@
+sDL_SetMainReady :: BG.FunPtr (IO ())
+sDL_SetMainReady =
+  BG.unsafePerformIO hs_bindgen_a748be6c08507093
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_RunApp@
+foreign import ccall unsafe "hs_bindgen_9ddd66f3bccdd116"
+  hs_bindgen_9ddd66f3bccdd116_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_RunApp@
+hs_bindgen_9ddd66f3bccdd116
+  :: IO
+       ( BG.FunPtr
+           ( BG.CInt
+             -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+             -> SDL_main_func
+             -> BG.Ptr BG.Void
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_9ddd66f3bccdd116 =
+  BG.fromFFIType hs_bindgen_9ddd66f3bccdd116_base
+
+{-# NOINLINE sDL_RunApp #-}
+
+-- | Initializes and launches an SDL application, by doing platform-specific initialization before calling your mainFunction and cleanups after it returns, if that is needed for a specific platform, otherwise it just calls mainFunction.
+--
+--     You can use this if you want to use your own main() implementation without using SDL_main (like when using SDL_MAIN_HANDLED). When using this, you do /not/ need @SDL_SetMainReady()@.
+--
+--     If @argv@ is NULL, SDL will provide command line arguments, either by querying the OS for them if possible, or supplying a filler array if not.
+--
+--     [@argc@]: the argc parameter from the application\'s main() function, or 0 if the platform\'s main-equivalent has no argc.
+--
+--     [@argv@]: the argv parameter from the application\'s main() function, or NULL if the platform\'s main-equivalent has no argv.
+--
+--     [@mainFunction@]: your SDL app\'s C-style main(). NOT the function you\'re calling this from! Its name doesn\'t matter; it doesn\'t literally have to be @main@.
+--
+--     [@reserved@]: should be NULL (reserved for future use, will probably be platform-specific then).
+--
+--     [Returns]: the return value from mainFunction: 0 on success, otherwise failure; SDL_GetError() might have more information on the failure.
+--
+--     [Thread safety]: Generally this is called once, near startup, from the process\'s initial thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RunApp@, defined at @SDL3\/SDL_main.h 581:33@
+sDL_RunApp
+  :: BG.FunPtr
+       ( BG.CInt
+         -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+         -> SDL_main_func
+         -> BG.Ptr BG.Void
+         -> IO BG.CInt
+       )
+sDL_RunApp =
+  BG.unsafePerformIO hs_bindgen_9ddd66f3bccdd116
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_EnterAppMainCallbacks@
+foreign import ccall unsafe "hs_bindgen_50b435e689e12498"
+  hs_bindgen_50b435e689e12498_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_EnterAppMainCallbacks@
+hs_bindgen_50b435e689e12498
+  :: IO
+       ( BG.FunPtr
+           ( BG.CInt
+             -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+             -> SDL3.Sys.Bindgen.Init.SDL_AppInit_func
+             -> SDL3.Sys.Bindgen.Init.SDL_AppIterate_func
+             -> SDL3.Sys.Bindgen.Init.SDL_AppEvent_func
+             -> SDL3.Sys.Bindgen.Init.SDL_AppQuit_func
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_50b435e689e12498 =
+  BG.fromFFIType hs_bindgen_50b435e689e12498_base
+
+{-# NOINLINE sDL_EnterAppMainCallbacks #-}
+
+-- | An entry point for SDL\'s use in SDL_MAIN_USE_CALLBACKS.
+--
+--     Generally, you should not call this function directly. This only exists to hand off work into SDL as soon as possible, where it has a lot more control and functionality available, and make the inline code in @SDL_main.h@ as small as possible.
+--
+--     Not all platforms use this, it\'s actual use is hidden in a magic header-only library, and you should not call this directly unless you /really/ know what you\'re doing.
+--
+--     [@argc@]: standard Unix main argc.
+--
+--     [@argv@]: standard Unix main argv.
+--
+--     [@appinit@]: the application\'s SDL_AppInit function.
+--
+--     [@appiter@]: the application\'s SDL_AppIterate function.
+--
+--     [@appevent@]: the application\'s SDL_AppEvent function.
+--
+--     [@appquit@]: the application\'s SDL_AppQuit function.
+--
+--     [Returns]: standard Unix main return value.
+--
+--     [Thread safety]: It is not safe to call this anywhere except as the only function call in SDL_main.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EnterAppMainCallbacks@, defined at @SDL3\/SDL_main.h 608:33@
+sDL_EnterAppMainCallbacks
+  :: BG.FunPtr
+       ( BG.CInt
+         -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+         -> SDL3.Sys.Bindgen.Init.SDL_AppInit_func
+         -> SDL3.Sys.Bindgen.Init.SDL_AppIterate_func
+         -> SDL3.Sys.Bindgen.Init.SDL_AppEvent_func
+         -> SDL3.Sys.Bindgen.Init.SDL_AppQuit_func
+         -> IO BG.CInt
+       )
+sDL_EnterAppMainCallbacks =
+  BG.unsafePerformIO hs_bindgen_50b435e689e12498
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_GDKSuspendComplete@
+foreign import ccall unsafe "hs_bindgen_07ea6ee797596218"
+  hs_bindgen_07ea6ee797596218_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_get_SDL_GDKSuspendComplete@
+hs_bindgen_07ea6ee797596218 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_07ea6ee797596218 =
+  BG.fromFFIType hs_bindgen_07ea6ee797596218_base
+
+{-# NOINLINE sDL_GDKSuspendComplete #-}
+
+-- | Callback from the application to let the suspend continue.
+--
+--     This function is only needed for Xbox GDK support; all other platforms will do nothing and set an \"unsupported\" error message.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GDKSuspendComplete@, defined at @SDL3\/SDL_main.h 673:34@
+sDL_GDKSuspendComplete :: BG.FunPtr (IO ())
+sDL_GDKSuspendComplete =
+  BG.unsafePerformIO hs_bindgen_07ea6ee797596218
diff --git a/src/SDL3/Sys/Bindgen/Main/Safe.hs b/src/SDL3/Sys/Bindgen/Main/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Main/Safe.hs
@@ -0,0 +1,217 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Main.Safe (
+  SDL3.Sys.Bindgen.Main.Safe.sDL_SetMainReady,
+  SDL3.Sys.Bindgen.Main.Safe.sDL_RunApp,
+  SDL3.Sys.Bindgen.Main.Safe.sDL_EnterAppMainCallbacks,
+  SDL3.Sys.Bindgen.Main.Safe.sDL_GDKSuspendComplete,
+)
+where
+
+import HsBindgen.Runtime.IncompleteArray qualified as IA
+import HsBindgen.Runtime.IsArray qualified as IsA
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Init qualified
+import SDL3.Sys.Bindgen.Main
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#define SDL_MAIN_HANDLED"
+         , "#include <SDL3/SDL_main.h>"
+         , "void hs_bindgen_1c56a59892e2463e (void)"
+         , "{"
+         , "  (SDL_SetMainReady)();"
+         , "}"
+         , "signed int hs_bindgen_1b6974d956741083 ("
+         , "  signed int arg1,"
+         , "  char **arg2,"
+         , "  SDL_main_func arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RunApp)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "signed int hs_bindgen_656ed4ab2c6b8347 ("
+         , "  signed int arg1,"
+         , "  char **arg2,"
+         , "  SDL_AppInit_func arg3,"
+         , "  SDL_AppIterate_func arg4,"
+         , "  SDL_AppEvent_func arg5,"
+         , "  SDL_AppQuit_func arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_EnterAppMainCallbacks)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "void hs_bindgen_265bcc9d378e1bc4 (void)"
+         , "{"
+         , "  (SDL_GDKSuspendComplete)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Safe_SDL_SetMainReady@
+foreign import ccall safe "hs_bindgen_1c56a59892e2463e"
+  hs_bindgen_1c56a59892e2463e_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Safe_SDL_SetMainReady@
+hs_bindgen_1c56a59892e2463e :: IO ()
+hs_bindgen_1c56a59892e2463e =
+  BG.fromFFIType hs_bindgen_1c56a59892e2463e_base
+
+-- | Circumvent failure of SDL_Init() when not using @SDL_main()@ as an entry point.
+--
+--     This function is defined in @SDL_main.h@, along with the preprocessor rule to redefine main() as @SDL_main()@. Thus to ensure that your main() function will not be changed it is necessary to define SDL_MAIN_HANDLED before including SDL.h.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_Init
+--
+--     [C declaration]: @SDL_SetMainReady@, defined at @SDL3\/SDL_main.h 548:34@
+sDL_SetMainReady :: IO ()
+sDL_SetMainReady = hs_bindgen_1c56a59892e2463e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Safe_SDL_RunApp@
+foreign import ccall safe "hs_bindgen_1b6974d956741083"
+  hs_bindgen_1b6974d956741083_base
+    :: BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Safe_SDL_RunApp@
+hs_bindgen_1b6974d956741083
+  :: BG.CInt
+  -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+  -> SDL_main_func
+  -> BG.Ptr BG.Void
+  -> IO BG.CInt
+hs_bindgen_1b6974d956741083 =
+  BG.fromFFIType hs_bindgen_1b6974d956741083_base
+
+-- | Initializes and launches an SDL application, by doing platform-specific initialization before calling your mainFunction and cleanups after it returns, if that is needed for a specific platform, otherwise it just calls mainFunction.
+--
+--     You can use this if you want to use your own main() implementation without using SDL_main (like when using SDL_MAIN_HANDLED). When using this, you do /not/ need @SDL_SetMainReady()@.
+--
+--     If @argv@ is NULL, SDL will provide command line arguments, either by querying the OS for them if possible, or supplying a filler array if not.
+--
+--     [Returns]: the return value from mainFunction: 0 on success, otherwise failure; SDL_GetError() might have more information on the failure.
+--
+--     [Thread safety]: Generally this is called once, near startup, from the process\'s initial thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RunApp@, defined at @SDL3\/SDL_main.h 581:33@
+sDL_RunApp
+  :: BG.CInt
+  -- ^
+  --
+  --           [@argc@]: the argc parameter from the application\'s main() function, or 0 if the platform\'s main-equivalent has no argc.
+  -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+  -- ^
+  --
+  --           [@argv@]: the argv parameter from the application\'s main() function, or NULL if the platform\'s main-equivalent has no argv.
+  -> SDL_main_func
+  -- ^
+  --
+  --           [@mainFunction@]: your SDL app\'s C-style main(). NOT the function you\'re calling this from! Its name doesn\'t matter; it doesn\'t literally have to be @main@.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@reserved@]: should be NULL (reserved for future use, will probably be platform-specific then).
+  -> IO BG.CInt
+sDL_RunApp = hs_bindgen_1b6974d956741083
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Safe_SDL_EnterAppMainCallbacks@
+foreign import ccall safe "hs_bindgen_656ed4ab2c6b8347"
+  hs_bindgen_656ed4ab2c6b8347_base
+    :: BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Safe_SDL_EnterAppMainCallbacks@
+hs_bindgen_656ed4ab2c6b8347
+  :: BG.CInt
+  -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+  -> SDL3.Sys.Bindgen.Init.SDL_AppInit_func
+  -> SDL3.Sys.Bindgen.Init.SDL_AppIterate_func
+  -> SDL3.Sys.Bindgen.Init.SDL_AppEvent_func
+  -> SDL3.Sys.Bindgen.Init.SDL_AppQuit_func
+  -> IO BG.CInt
+hs_bindgen_656ed4ab2c6b8347 =
+  BG.fromFFIType hs_bindgen_656ed4ab2c6b8347_base
+
+-- | An entry point for SDL\'s use in SDL_MAIN_USE_CALLBACKS.
+--
+--     Generally, you should not call this function directly. This only exists to hand off work into SDL as soon as possible, where it has a lot more control and functionality available, and make the inline code in @SDL_main.h@ as small as possible.
+--
+--     Not all platforms use this, it\'s actual use is hidden in a magic header-only library, and you should not call this directly unless you /really/ know what you\'re doing.
+--
+--     [Returns]: standard Unix main return value.
+--
+--     [Thread safety]: It is not safe to call this anywhere except as the only function call in SDL_main.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EnterAppMainCallbacks@, defined at @SDL3\/SDL_main.h 608:33@
+sDL_EnterAppMainCallbacks
+  :: BG.CInt
+  -- ^
+  --
+  --           [@argc@]: standard Unix main argc.
+  -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+  -- ^
+  --
+  --           [@argv@]: standard Unix main argv.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppInit_func
+  -- ^
+  --
+  --           [@appinit@]: the application\'s SDL_AppInit function.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppIterate_func
+  -- ^
+  --
+  --           [@appiter@]: the application\'s SDL_AppIterate function.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppEvent_func
+  -- ^
+  --
+  --           [@appevent@]: the application\'s SDL_AppEvent function.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppQuit_func
+  -- ^
+  --
+  --           [@appquit@]: the application\'s SDL_AppQuit function.
+  -> IO BG.CInt
+sDL_EnterAppMainCallbacks =
+  hs_bindgen_656ed4ab2c6b8347
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Safe_SDL_GDKSuspendComplete@
+foreign import ccall safe "hs_bindgen_265bcc9d378e1bc4"
+  hs_bindgen_265bcc9d378e1bc4_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Safe_SDL_GDKSuspendComplete@
+hs_bindgen_265bcc9d378e1bc4 :: IO ()
+hs_bindgen_265bcc9d378e1bc4 =
+  BG.fromFFIType hs_bindgen_265bcc9d378e1bc4_base
+
+-- | Callback from the application to let the suspend continue.
+--
+--     This function is only needed for Xbox GDK support; all other platforms will do nothing and set an \"unsupported\" error message.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GDKSuspendComplete@, defined at @SDL3\/SDL_main.h 673:34@
+sDL_GDKSuspendComplete :: IO ()
+sDL_GDKSuspendComplete = hs_bindgen_265bcc9d378e1bc4
diff --git a/src/SDL3/Sys/Bindgen/Main/Unsafe.hs b/src/SDL3/Sys/Bindgen/Main/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Main/Unsafe.hs
@@ -0,0 +1,217 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Main.Unsafe (
+  SDL3.Sys.Bindgen.Main.Unsafe.sDL_SetMainReady,
+  SDL3.Sys.Bindgen.Main.Unsafe.sDL_RunApp,
+  SDL3.Sys.Bindgen.Main.Unsafe.sDL_EnterAppMainCallbacks,
+  SDL3.Sys.Bindgen.Main.Unsafe.sDL_GDKSuspendComplete,
+)
+where
+
+import HsBindgen.Runtime.IncompleteArray qualified as IA
+import HsBindgen.Runtime.IsArray qualified as IsA
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Init qualified
+import SDL3.Sys.Bindgen.Main
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#define SDL_MAIN_HANDLED"
+         , "#include <SDL3/SDL_main.h>"
+         , "void hs_bindgen_330c7ba17652a449 (void)"
+         , "{"
+         , "  (SDL_SetMainReady)();"
+         , "}"
+         , "signed int hs_bindgen_76e1bdcf20b82e65 ("
+         , "  signed int arg1,"
+         , "  char **arg2,"
+         , "  SDL_main_func arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RunApp)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "signed int hs_bindgen_471713b022799202 ("
+         , "  signed int arg1,"
+         , "  char **arg2,"
+         , "  SDL_AppInit_func arg3,"
+         , "  SDL_AppIterate_func arg4,"
+         , "  SDL_AppEvent_func arg5,"
+         , "  SDL_AppQuit_func arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_EnterAppMainCallbacks)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "void hs_bindgen_9f3d69665a0be341 (void)"
+         , "{"
+         , "  (SDL_GDKSuspendComplete)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Unsafe_SDL_SetMainReady@
+foreign import ccall unsafe "hs_bindgen_330c7ba17652a449"
+  hs_bindgen_330c7ba17652a449_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Unsafe_SDL_SetMainReady@
+hs_bindgen_330c7ba17652a449 :: IO ()
+hs_bindgen_330c7ba17652a449 =
+  BG.fromFFIType hs_bindgen_330c7ba17652a449_base
+
+-- | Circumvent failure of SDL_Init() when not using @SDL_main()@ as an entry point.
+--
+--     This function is defined in @SDL_main.h@, along with the preprocessor rule to redefine main() as @SDL_main()@. Thus to ensure that your main() function will not be changed it is necessary to define SDL_MAIN_HANDLED before including SDL.h.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_Init
+--
+--     [C declaration]: @SDL_SetMainReady@, defined at @SDL3\/SDL_main.h 548:34@
+sDL_SetMainReady :: IO ()
+sDL_SetMainReady = hs_bindgen_330c7ba17652a449
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Unsafe_SDL_RunApp@
+foreign import ccall unsafe "hs_bindgen_76e1bdcf20b82e65"
+  hs_bindgen_76e1bdcf20b82e65_base
+    :: BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Unsafe_SDL_RunApp@
+hs_bindgen_76e1bdcf20b82e65
+  :: BG.CInt
+  -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+  -> SDL_main_func
+  -> BG.Ptr BG.Void
+  -> IO BG.CInt
+hs_bindgen_76e1bdcf20b82e65 =
+  BG.fromFFIType hs_bindgen_76e1bdcf20b82e65_base
+
+-- | Initializes and launches an SDL application, by doing platform-specific initialization before calling your mainFunction and cleanups after it returns, if that is needed for a specific platform, otherwise it just calls mainFunction.
+--
+--     You can use this if you want to use your own main() implementation without using SDL_main (like when using SDL_MAIN_HANDLED). When using this, you do /not/ need @SDL_SetMainReady()@.
+--
+--     If @argv@ is NULL, SDL will provide command line arguments, either by querying the OS for them if possible, or supplying a filler array if not.
+--
+--     [Returns]: the return value from mainFunction: 0 on success, otherwise failure; SDL_GetError() might have more information on the failure.
+--
+--     [Thread safety]: Generally this is called once, near startup, from the process\'s initial thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RunApp@, defined at @SDL3\/SDL_main.h 581:33@
+sDL_RunApp
+  :: BG.CInt
+  -- ^
+  --
+  --           [@argc@]: the argc parameter from the application\'s main() function, or 0 if the platform\'s main-equivalent has no argc.
+  -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+  -- ^
+  --
+  --           [@argv@]: the argv parameter from the application\'s main() function, or NULL if the platform\'s main-equivalent has no argv.
+  -> SDL_main_func
+  -- ^
+  --
+  --           [@mainFunction@]: your SDL app\'s C-style main(). NOT the function you\'re calling this from! Its name doesn\'t matter; it doesn\'t literally have to be @main@.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@reserved@]: should be NULL (reserved for future use, will probably be platform-specific then).
+  -> IO BG.CInt
+sDL_RunApp = hs_bindgen_76e1bdcf20b82e65
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Unsafe_SDL_EnterAppMainCallbacks@
+foreign import ccall unsafe "hs_bindgen_471713b022799202"
+  hs_bindgen_471713b022799202_base
+    :: BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Unsafe_SDL_EnterAppMainCallbacks@
+hs_bindgen_471713b022799202
+  :: BG.CInt
+  -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+  -> SDL3.Sys.Bindgen.Init.SDL_AppInit_func
+  -> SDL3.Sys.Bindgen.Init.SDL_AppIterate_func
+  -> SDL3.Sys.Bindgen.Init.SDL_AppEvent_func
+  -> SDL3.Sys.Bindgen.Init.SDL_AppQuit_func
+  -> IO BG.CInt
+hs_bindgen_471713b022799202 =
+  BG.fromFFIType hs_bindgen_471713b022799202_base
+
+-- | An entry point for SDL\'s use in SDL_MAIN_USE_CALLBACKS.
+--
+--     Generally, you should not call this function directly. This only exists to hand off work into SDL as soon as possible, where it has a lot more control and functionality available, and make the inline code in @SDL_main.h@ as small as possible.
+--
+--     Not all platforms use this, it\'s actual use is hidden in a magic header-only library, and you should not call this directly unless you /really/ know what you\'re doing.
+--
+--     [Returns]: standard Unix main return value.
+--
+--     [Thread safety]: It is not safe to call this anywhere except as the only function call in SDL_main.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EnterAppMainCallbacks@, defined at @SDL3\/SDL_main.h 608:33@
+sDL_EnterAppMainCallbacks
+  :: BG.CInt
+  -- ^
+  --
+  --           [@argc@]: standard Unix main argc.
+  -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+  -- ^
+  --
+  --           [@argv@]: standard Unix main argv.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppInit_func
+  -- ^
+  --
+  --           [@appinit@]: the application\'s SDL_AppInit function.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppIterate_func
+  -- ^
+  --
+  --           [@appiter@]: the application\'s SDL_AppIterate function.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppEvent_func
+  -- ^
+  --
+  --           [@appevent@]: the application\'s SDL_AppEvent function.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppQuit_func
+  -- ^
+  --
+  --           [@appquit@]: the application\'s SDL_AppQuit function.
+  -> IO BG.CInt
+sDL_EnterAppMainCallbacks =
+  hs_bindgen_471713b022799202
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Unsafe_SDL_GDKSuspendComplete@
+foreign import ccall unsafe "hs_bindgen_9f3d69665a0be341"
+  hs_bindgen_9f3d69665a0be341_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Main_Unsafe_SDL_GDKSuspendComplete@
+hs_bindgen_9f3d69665a0be341 :: IO ()
+hs_bindgen_9f3d69665a0be341 =
+  BG.fromFFIType hs_bindgen_9f3d69665a0be341_base
+
+-- | Callback from the application to let the suspend continue.
+--
+--     This function is only needed for Xbox GDK support; all other platforms will do nothing and set an \"unsupported\" error message.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GDKSuspendComplete@, defined at @SDL3\/SDL_main.h 673:34@
+sDL_GDKSuspendComplete :: IO ()
+sDL_GDKSuspendComplete = hs_bindgen_9f3d69665a0be341
diff --git a/src/SDL3/Sys/Bindgen/Messagebox.hs b/src/SDL3/Sys/Bindgen/Messagebox.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Messagebox.hs
@@ -0,0 +1,932 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL offers a simple message box API, which is useful for simple alerts, such as informing the user when something fatal happens at startup without the need to build a UI for it (or informing the user /before/ your UI is ready).
+--
+--     These message boxes are native system dialogs where possible.
+--
+--     There is both a customizable function (@SDL_ShowMessageBox()@) that offers lots of options for what to display and reports on what choice the user made, and also a much-simplified version (@SDL_ShowSimpleMessageBox()@), merely takes a text message and title, and waits until the user presses a single \"OK\" UI button. Often, this is all that is necessary. Message box flags.
+--
+--     If supported will display warning icon, etc.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Messagebox (
+  SDL3.Sys.Bindgen.Messagebox.SDL_MessageBoxFlags (..),
+  SDL3.Sys.Bindgen.Messagebox.sDL_MESSAGEBOX_ERROR,
+  SDL3.Sys.Bindgen.Messagebox.sDL_MESSAGEBOX_WARNING,
+  SDL3.Sys.Bindgen.Messagebox.sDL_MESSAGEBOX_INFORMATION,
+  SDL3.Sys.Bindgen.Messagebox.sDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT,
+  SDL3.Sys.Bindgen.Messagebox.sDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT,
+  SDL3.Sys.Bindgen.Messagebox.SDL_MessageBoxButtonFlags (..),
+  SDL3.Sys.Bindgen.Messagebox.sDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT,
+  SDL3.Sys.Bindgen.Messagebox.sDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT,
+  SDL3.Sys.Bindgen.Messagebox.SDL_MessageBoxButtonData (..),
+  SDL3.Sys.Bindgen.Messagebox.SDL_MessageBoxColor (..),
+  SDL3.Sys.Bindgen.Messagebox.SDL_MessageBoxColorType (..),
+  pattern SDL3.Sys.Bindgen.Messagebox.SDL_MESSAGEBOX_COLOR_BACKGROUND,
+  pattern SDL3.Sys.Bindgen.Messagebox.SDL_MESSAGEBOX_COLOR_TEXT,
+  pattern SDL3.Sys.Bindgen.Messagebox.SDL_MESSAGEBOX_COLOR_BUTTON_BORDER,
+  pattern SDL3.Sys.Bindgen.Messagebox.SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND,
+  pattern SDL3.Sys.Bindgen.Messagebox.SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED,
+  pattern SDL3.Sys.Bindgen.Messagebox.SDL_MESSAGEBOX_COLOR_COUNT,
+  SDL3.Sys.Bindgen.Messagebox.SDL_MessageBoxColorScheme (..),
+  SDL3.Sys.Bindgen.Messagebox.SDL_MessageBoxData (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.ConstantArray qualified as CA
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | [C declaration]: @SDL_MessageBoxFlags@, defined at @SDL3\/SDL_messagebox.h 59:16@
+newtype SDL_MessageBoxFlags = SDL_MessageBoxFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_MessageBoxFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_MessageBoxFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MessageBoxFlags "unwrap" where
+  type
+    CFieldType SDL_MessageBoxFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | error dialog
+--
+--     [C declaration]: @macro SDL_MESSAGEBOX_ERROR@, defined at @SDL3\/SDL_messagebox.h 61:9@
+sDL_MESSAGEBOX_ERROR :: BG.CUInt
+sDL_MESSAGEBOX_ERROR = (16 :: BG.CUInt)
+
+-- | warning dialog
+--
+--     [C declaration]: @macro SDL_MESSAGEBOX_WARNING@, defined at @SDL3\/SDL_messagebox.h 62:9@
+sDL_MESSAGEBOX_WARNING :: BG.CUInt
+sDL_MESSAGEBOX_WARNING = (32 :: BG.CUInt)
+
+-- | informational dialog
+--
+--     [C declaration]: @macro SDL_MESSAGEBOX_INFORMATION@, defined at @SDL3\/SDL_messagebox.h 63:9@
+sDL_MESSAGEBOX_INFORMATION :: BG.CUInt
+sDL_MESSAGEBOX_INFORMATION = (64 :: BG.CUInt)
+
+-- | buttons placed left to right
+--
+--     [C declaration]: @macro SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT@, defined at @SDL3\/SDL_messagebox.h 64:9@
+sDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT :: BG.CUInt
+sDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT =
+  (128 :: BG.CUInt)
+
+-- | buttons placed right to left
+--
+--     [C declaration]: @macro SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT@, defined at @SDL3\/SDL_messagebox.h 65:9@
+sDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT :: BG.CUInt
+sDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT =
+  (256 :: BG.CUInt)
+
+-- | 'SDL_MessageBoxButtonData' flags.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_MessageBoxButtonFlags@, defined at @SDL3\/SDL_messagebox.h 72:16@
+newtype SDL_MessageBoxButtonFlags = SDL_MessageBoxButtonFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_MessageBoxButtonFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxButtonFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_MessageBoxButtonFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MessageBoxButtonFlags "unwrap" where
+  type
+    CFieldType SDL_MessageBoxButtonFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Marks the default button when return is hit
+--
+--     [C declaration]: @macro SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT@, defined at @SDL3\/SDL_messagebox.h 74:9@
+sDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT :: BG.CUInt
+sDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT =
+  (1 :: BG.CUInt)
+
+-- | Marks the default button when escape is hit
+--
+--     [C declaration]: @macro SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT@, defined at @SDL3\/SDL_messagebox.h 75:9@
+sDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT :: BG.CUInt
+sDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT =
+  (2 :: BG.CUInt)
+
+-- | Individual button data.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_MessageBoxButtonData@, defined at @SDL3\/SDL_messagebox.h 82:16@
+data SDL_MessageBoxButtonData = SDL_MessageBoxButtonData
+  { flags :: SDL_MessageBoxButtonFlags
+  -- ^ [C declaration]: @flags@, defined at @SDL3\/SDL_messagebox.h 84:31@
+  , buttonID :: BG.CInt
+  -- ^ User defined button id (value returned via SDL_ShowMessageBox)
+  --
+  --          [C declaration]: @buttonID@, defined at @SDL3\/SDL_messagebox.h 85:9@
+  , text :: PtrConst.PtrConst BG.CChar
+  -- ^ The UTF-8 button text
+  --
+  --          [C declaration]: @text@, defined at @SDL3\/SDL_messagebox.h 86:17@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_MessageBoxButtonData where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_MessageBoxButtonData where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MessageBoxButtonData
+        <*> HasCField.readRaw (BG.Proxy @"flags") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"buttonID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"text") ptr0
+
+instance Marshal.WriteRaw SDL_MessageBoxButtonData where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MessageBoxButtonData flags2 buttonID3 text4 ->
+            HasCField.writeRaw (BG.Proxy @"flags") ptr0 flags2
+              >> HasCField.writeRaw (BG.Proxy @"buttonID") ptr0 buttonID3
+              >> HasCField.writeRaw (BG.Proxy @"text") ptr0 text4
+
+deriving via
+  Marshal.EquivStorable SDL_MessageBoxButtonData
+  instance
+    BG.Storable SDL_MessageBoxButtonData
+
+instance
+  (ty ~ SDL_MessageBoxButtonFlags)
+  => BG.CompatHasField.HasField "flags" SDL_MessageBoxButtonData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxButtonData
+            { flags = y1
+            , buttonID = BG.getField @"buttonID" x0
+            , text = BG.getField @"text" x0
+            }
+      , BG.getField @"flags" x0
+      )
+
+instance
+  (ty ~ SDL_MessageBoxButtonFlags)
+  => BG.HasField "flags" (BG.Ptr SDL_MessageBoxButtonData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"flags")
+
+instance HasCField.HasCField SDL_MessageBoxButtonData "flags" where
+  type
+    CFieldType SDL_MessageBoxButtonData "flags" =
+      SDL_MessageBoxButtonFlags
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "buttonID" SDL_MessageBoxButtonData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxButtonData
+            { buttonID = y1
+            , flags = BG.getField @"flags" x0
+            , text = BG.getField @"text" x0
+            }
+      , BG.getField @"buttonID" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "buttonID" (BG.Ptr SDL_MessageBoxButtonData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"buttonID")
+
+instance HasCField.HasCField SDL_MessageBoxButtonData "buttonID" where
+  type
+    CFieldType SDL_MessageBoxButtonData "buttonID" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "text" SDL_MessageBoxButtonData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxButtonData
+            { text = y1
+            , flags = BG.getField @"flags" x0
+            , buttonID = BG.getField @"buttonID" x0
+            }
+      , BG.getField @"text" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "text" (BG.Ptr SDL_MessageBoxButtonData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"text")
+
+instance HasCField.HasCField SDL_MessageBoxButtonData "text" where
+  type
+    CFieldType SDL_MessageBoxButtonData "text" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 8
+
+-- | RGB value used in a message box color scheme
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_MessageBoxColor@, defined at @SDL3\/SDL_messagebox.h 94:16@
+data SDL_MessageBoxColor = SDL_MessageBoxColor
+  { r :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @r@, defined at @SDL3\/SDL_messagebox.h 96:11@
+  , g :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @g@, defined at @SDL3\/SDL_messagebox.h 96:14@
+  , b :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @b@, defined at @SDL3\/SDL_messagebox.h 96:17@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_MessageBoxColor where
+  staticSizeOf = \_ -> (3 :: Int)
+
+  staticAlignment = \_ -> (1 :: Int)
+
+instance Marshal.ReadRaw SDL_MessageBoxColor where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MessageBoxColor
+        <*> HasCField.readRaw (BG.Proxy @"r") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"g") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"b") ptr0
+
+instance Marshal.WriteRaw SDL_MessageBoxColor where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MessageBoxColor r2 g3 b4 ->
+            HasCField.writeRaw (BG.Proxy @"r") ptr0 r2
+              >> HasCField.writeRaw (BG.Proxy @"g") ptr0 g3
+              >> HasCField.writeRaw (BG.Proxy @"b") ptr0 b4
+
+deriving via Marshal.EquivStorable SDL_MessageBoxColor instance BG.Storable SDL_MessageBoxColor
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "r" SDL_MessageBoxColor ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxColor{r = y1, g = BG.getField @"g" x0, b = BG.getField @"b" x0}
+      , BG.getField @"r" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "r" (BG.Ptr SDL_MessageBoxColor) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"r")
+
+instance HasCField.HasCField SDL_MessageBoxColor "r" where
+  type
+    CFieldType SDL_MessageBoxColor "r" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "g" SDL_MessageBoxColor ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxColor{g = y1, r = BG.getField @"r" x0, b = BG.getField @"b" x0}
+      , BG.getField @"g" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "g" (BG.Ptr SDL_MessageBoxColor) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"g")
+
+instance HasCField.HasCField SDL_MessageBoxColor "g" where
+  type
+    CFieldType SDL_MessageBoxColor "g" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 1
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "b" SDL_MessageBoxColor ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxColor{b = y1, r = BG.getField @"r" x0, g = BG.getField @"g" x0}
+      , BG.getField @"b" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "b" (BG.Ptr SDL_MessageBoxColor) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"b")
+
+instance HasCField.HasCField SDL_MessageBoxColor "b" where
+  type
+    CFieldType SDL_MessageBoxColor "b" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 2
+
+-- | An enumeration of indices inside the colors array of 'SDL_MessageBoxColorScheme'.
+--
+--     [C declaration]: @enum SDL_MessageBoxColorType@, defined at @SDL3\/SDL_messagebox.h 103:14@
+newtype SDL_MessageBoxColorType = SDL_MessageBoxColorType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_MessageBoxColorType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_MessageBoxColorType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MessageBoxColorType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_MessageBoxColorType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MessageBoxColorType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_MessageBoxColorType
+  instance
+    BG.Storable SDL_MessageBoxColorType
+
+deriving via BG.CUInt instance BG.Prim SDL_MessageBoxColorType
+
+instance CEnum.CEnum SDL_MessageBoxColorType where
+  type CEnumZ SDL_MessageBoxColorType = BG.CUInt
+
+  toCEnum = SDL_MessageBoxColorType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_MESSAGEBOX_COLOR_BACKGROUND")
+        , (1, BG.singleton "SDL_MESSAGEBOX_COLOR_TEXT")
+        , (2, BG.singleton "SDL_MESSAGEBOX_COLOR_BUTTON_BORDER")
+        , (3, BG.singleton "SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND")
+        , (4, BG.singleton "SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED")
+        , (5, BG.singleton "SDL_MESSAGEBOX_COLOR_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_MessageBoxColorType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_MessageBoxColorType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_MessageBoxColorType where
+  minDeclaredValue = SDL_MESSAGEBOX_COLOR_BACKGROUND
+
+  maxDeclaredValue = SDL_MESSAGEBOX_COLOR_COUNT
+
+instance Show SDL_MessageBoxColorType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_MessageBoxColorType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_MessageBoxColorType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxColorType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_MessageBoxColorType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MessageBoxColorType "unwrap" where
+  type
+    CFieldType SDL_MessageBoxColorType "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_MESSAGEBOX_COLOR_BACKGROUND@, defined at @SDL3\/SDL_messagebox.h 105:5@
+pattern SDL_MESSAGEBOX_COLOR_BACKGROUND :: SDL_MessageBoxColorType
+pattern SDL_MESSAGEBOX_COLOR_BACKGROUND = SDL_MessageBoxColorType 0
+
+-- | [C declaration]: @SDL_MESSAGEBOX_COLOR_TEXT@, defined at @SDL3\/SDL_messagebox.h 106:5@
+pattern SDL_MESSAGEBOX_COLOR_TEXT :: SDL_MessageBoxColorType
+pattern SDL_MESSAGEBOX_COLOR_TEXT = SDL_MessageBoxColorType 1
+
+-- | [C declaration]: @SDL_MESSAGEBOX_COLOR_BUTTON_BORDER@, defined at @SDL3\/SDL_messagebox.h 107:5@
+pattern SDL_MESSAGEBOX_COLOR_BUTTON_BORDER :: SDL_MessageBoxColorType
+pattern SDL_MESSAGEBOX_COLOR_BUTTON_BORDER = SDL_MessageBoxColorType 2
+
+-- | [C declaration]: @SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND@, defined at @SDL3\/SDL_messagebox.h 108:5@
+pattern SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND :: SDL_MessageBoxColorType
+pattern SDL_MESSAGEBOX_COLOR_BUTTON_BACKGROUND = SDL_MessageBoxColorType 3
+
+-- | [C declaration]: @SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED@, defined at @SDL3\/SDL_messagebox.h 109:5@
+pattern SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED :: SDL_MessageBoxColorType
+pattern SDL_MESSAGEBOX_COLOR_BUTTON_SELECTED = SDL_MessageBoxColorType 4
+
+-- | Size of the colors array of 'SDL_MessageBoxColorScheme'.
+--
+--     [C declaration]: @SDL_MESSAGEBOX_COLOR_COUNT@, defined at @SDL3\/SDL_messagebox.h 110:5@
+pattern SDL_MESSAGEBOX_COLOR_COUNT :: SDL_MessageBoxColorType
+pattern SDL_MESSAGEBOX_COLOR_COUNT = SDL_MessageBoxColorType 5
+
+-- | A set of colors to use for message box dialogs
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_MessageBoxColorScheme@, defined at @SDL3\/SDL_messagebox.h 118:16@
+data SDL_MessageBoxColorScheme = SDL_MessageBoxColorScheme
+  { colors :: CA.ConstantArray 5 SDL_MessageBoxColor
+  -- ^ [C declaration]: @colors@, defined at @SDL3\/SDL_messagebox.h 120:25@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_MessageBoxColorScheme where
+  staticSizeOf = \_ -> (15 :: Int)
+
+  staticAlignment = \_ -> (1 :: Int)
+
+instance Marshal.ReadRaw SDL_MessageBoxColorScheme where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MessageBoxColorScheme
+        <*> HasCField.readRaw (BG.Proxy @"colors") ptr0
+
+instance Marshal.WriteRaw SDL_MessageBoxColorScheme where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MessageBoxColorScheme colors2 ->
+            HasCField.writeRaw (BG.Proxy @"colors") ptr0 colors2
+
+deriving via
+  Marshal.EquivStorable SDL_MessageBoxColorScheme
+  instance
+    BG.Storable SDL_MessageBoxColorScheme
+
+instance
+  (ty ~ CA.ConstantArray 5 SDL_MessageBoxColor)
+  => BG.CompatHasField.HasField "colors" SDL_MessageBoxColorScheme ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxColorScheme{colors = y1}
+      , BG.getField @"colors" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 5 SDL_MessageBoxColor)
+  => BG.HasField "colors" (BG.Ptr SDL_MessageBoxColorScheme) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"colors")
+
+instance HasCField.HasCField SDL_MessageBoxColorScheme "colors" where
+  type
+    CFieldType SDL_MessageBoxColorScheme "colors" =
+      CA.ConstantArray 5 SDL_MessageBoxColor
+
+  offset# = \_ -> \_ -> 0
+
+-- | MessageBox structure containing title, text, window, etc.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_MessageBoxData@, defined at @SDL3\/SDL_messagebox.h 128:16@
+data SDL_MessageBoxData = SDL_MessageBoxData
+  { flags :: SDL_MessageBoxFlags
+  -- ^ [C declaration]: @flags@, defined at @SDL3\/SDL_messagebox.h 130:25@
+  , window :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^ Parent window, can be NULL
+  --
+  --          [C declaration]: @window@, defined at @SDL3\/SDL_messagebox.h 131:17@
+  , title :: PtrConst.PtrConst BG.CChar
+  -- ^ UTF-8 title
+  --
+  --          [C declaration]: @title@, defined at @SDL3\/SDL_messagebox.h 132:17@
+  , message :: PtrConst.PtrConst BG.CChar
+  -- ^ UTF-8 message text
+  --
+  --          [C declaration]: @message@, defined at @SDL3\/SDL_messagebox.h 133:17@
+  , numbuttons :: BG.CInt
+  -- ^ [C declaration]: @numbuttons@, defined at @SDL3\/SDL_messagebox.h 135:9@
+  , buttons :: PtrConst.PtrConst SDL_MessageBoxButtonData
+  -- ^ [C declaration]: @buttons@, defined at @SDL3\/SDL_messagebox.h 136:37@
+  , colorScheme :: PtrConst.PtrConst SDL_MessageBoxColorScheme
+  -- ^ 'SDL_MessageBoxColorScheme', can be NULL to use system settings
+  --
+  --          [C declaration]: @colorScheme@, defined at @SDL3\/SDL_messagebox.h 138:38@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_MessageBoxData where
+  staticSizeOf = \_ -> (56 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_MessageBoxData where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MessageBoxData
+        <*> HasCField.readRaw (BG.Proxy @"flags") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"window") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"title") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"message") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"numbuttons") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"buttons") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"colorScheme") ptr0
+
+instance Marshal.WriteRaw SDL_MessageBoxData where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MessageBoxData
+            flags2
+            window3
+            title4
+            message5
+            numbuttons6
+            buttons7
+            colorScheme8 ->
+              HasCField.writeRaw (BG.Proxy @"flags") ptr0 flags2
+                >> HasCField.writeRaw (BG.Proxy @"window") ptr0 window3
+                >> HasCField.writeRaw (BG.Proxy @"title") ptr0 title4
+                >> HasCField.writeRaw (BG.Proxy @"message") ptr0 message5
+                >> HasCField.writeRaw (BG.Proxy @"numbuttons") ptr0 numbuttons6
+                >> HasCField.writeRaw (BG.Proxy @"buttons") ptr0 buttons7
+                >> HasCField.writeRaw (BG.Proxy @"colorScheme") ptr0 colorScheme8
+
+deriving via Marshal.EquivStorable SDL_MessageBoxData instance BG.Storable SDL_MessageBoxData
+
+instance
+  (ty ~ SDL_MessageBoxFlags)
+  => BG.CompatHasField.HasField "flags" SDL_MessageBoxData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxData
+            { flags = y1
+            , window = BG.getField @"window" x0
+            , title = BG.getField @"title" x0
+            , message = BG.getField @"message" x0
+            , numbuttons = BG.getField @"numbuttons" x0
+            , buttons = BG.getField @"buttons" x0
+            , colorScheme = BG.getField @"colorScheme" x0
+            }
+      , BG.getField @"flags" x0
+      )
+
+instance
+  (ty ~ SDL_MessageBoxFlags)
+  => BG.HasField "flags" (BG.Ptr SDL_MessageBoxData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"flags")
+
+instance HasCField.HasCField SDL_MessageBoxData "flags" where
+  type
+    CFieldType SDL_MessageBoxData "flags" =
+      SDL_MessageBoxFlags
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+  => BG.CompatHasField.HasField "window" SDL_MessageBoxData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxData
+            { window = y1
+            , flags = BG.getField @"flags" x0
+            , title = BG.getField @"title" x0
+            , message = BG.getField @"message" x0
+            , numbuttons = BG.getField @"numbuttons" x0
+            , buttons = BG.getField @"buttons" x0
+            , colorScheme = BG.getField @"colorScheme" x0
+            }
+      , BG.getField @"window" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+  => BG.HasField "window" (BG.Ptr SDL_MessageBoxData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"window")
+
+instance HasCField.HasCField SDL_MessageBoxData "window" where
+  type
+    CFieldType SDL_MessageBoxData "window" =
+      BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "title" SDL_MessageBoxData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxData
+            { title = y1
+            , flags = BG.getField @"flags" x0
+            , window = BG.getField @"window" x0
+            , message = BG.getField @"message" x0
+            , numbuttons = BG.getField @"numbuttons" x0
+            , buttons = BG.getField @"buttons" x0
+            , colorScheme = BG.getField @"colorScheme" x0
+            }
+      , BG.getField @"title" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "title" (BG.Ptr SDL_MessageBoxData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"title")
+
+instance HasCField.HasCField SDL_MessageBoxData "title" where
+  type
+    CFieldType SDL_MessageBoxData "title" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.CompatHasField.HasField "message" SDL_MessageBoxData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxData
+            { message = y1
+            , flags = BG.getField @"flags" x0
+            , window = BG.getField @"window" x0
+            , title = BG.getField @"title" x0
+            , numbuttons = BG.getField @"numbuttons" x0
+            , buttons = BG.getField @"buttons" x0
+            , colorScheme = BG.getField @"colorScheme" x0
+            }
+      , BG.getField @"message" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst BG.CChar)
+  => BG.HasField "message" (BG.Ptr SDL_MessageBoxData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"message")
+
+instance HasCField.HasCField SDL_MessageBoxData "message" where
+  type
+    CFieldType SDL_MessageBoxData "message" =
+      PtrConst.PtrConst BG.CChar
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "numbuttons" SDL_MessageBoxData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxData
+            { numbuttons = y1
+            , flags = BG.getField @"flags" x0
+            , window = BG.getField @"window" x0
+            , title = BG.getField @"title" x0
+            , message = BG.getField @"message" x0
+            , buttons = BG.getField @"buttons" x0
+            , colorScheme = BG.getField @"colorScheme" x0
+            }
+      , BG.getField @"numbuttons" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "numbuttons" (BG.Ptr SDL_MessageBoxData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"numbuttons")
+
+instance HasCField.HasCField SDL_MessageBoxData "numbuttons" where
+  type
+    CFieldType SDL_MessageBoxData "numbuttons" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_MessageBoxButtonData)
+  => BG.CompatHasField.HasField "buttons" SDL_MessageBoxData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxData
+            { buttons = y1
+            , flags = BG.getField @"flags" x0
+            , window = BG.getField @"window" x0
+            , title = BG.getField @"title" x0
+            , message = BG.getField @"message" x0
+            , numbuttons = BG.getField @"numbuttons" x0
+            , colorScheme = BG.getField @"colorScheme" x0
+            }
+      , BG.getField @"buttons" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_MessageBoxButtonData)
+  => BG.HasField "buttons" (BG.Ptr SDL_MessageBoxData) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"buttons")
+
+instance HasCField.HasCField SDL_MessageBoxData "buttons" where
+  type
+    CFieldType SDL_MessageBoxData "buttons" =
+      PtrConst.PtrConst SDL_MessageBoxButtonData
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_MessageBoxColorScheme)
+  => BG.CompatHasField.HasField "colorScheme" SDL_MessageBoxData ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MessageBoxData
+            { colorScheme = y1
+            , flags = BG.getField @"flags" x0
+            , window = BG.getField @"window" x0
+            , title = BG.getField @"title" x0
+            , message = BG.getField @"message" x0
+            , numbuttons = BG.getField @"numbuttons" x0
+            , buttons = BG.getField @"buttons" x0
+            }
+      , BG.getField @"colorScheme" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL_MessageBoxColorScheme)
+  => BG.HasField "colorScheme" (BG.Ptr SDL_MessageBoxData) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"colorScheme")
+
+instance HasCField.HasCField SDL_MessageBoxData "colorScheme" where
+  type
+    CFieldType SDL_MessageBoxData "colorScheme" =
+      PtrConst.PtrConst SDL_MessageBoxColorScheme
+
+  offset# = \_ -> \_ -> 48
diff --git a/src/SDL3/Sys/Bindgen/Messagebox/FunPtr.hs b/src/SDL3/Sys/Bindgen/Messagebox/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Messagebox/FunPtr.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Messagebox.FunPtr (
+  SDL3.Sys.Bindgen.Messagebox.FunPtr.sDL_ShowMessageBox,
+  SDL3.Sys.Bindgen.Messagebox.FunPtr.sDL_ShowSimpleMessageBox,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Messagebox
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_messagebox.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_get_SDL_ShowMessageBox */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fdad2a984a763ae0 (void)) ("
+         , "  SDL_MessageBoxData const *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ShowMessageBox;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_get_SDL_ShowSimpleMessageBox */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_059be268606e6ea4 (void)) ("
+         , "  SDL_MessageBoxFlags arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  SDL_Window *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_ShowSimpleMessageBox;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_get_SDL_ShowMessageBox@
+foreign import ccall unsafe "hs_bindgen_fdad2a984a763ae0"
+  hs_bindgen_fdad2a984a763ae0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_get_SDL_ShowMessageBox@
+hs_bindgen_fdad2a984a763ae0
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_MessageBoxData -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_fdad2a984a763ae0 =
+  BG.fromFFIType hs_bindgen_fdad2a984a763ae0_base
+
+{-# NOINLINE sDL_ShowMessageBox #-}
+
+-- | Create a modal message box.
+--
+--     If your needs aren\'t complex, it might be easier to use SDL_ShowSimpleMessageBox.
+--
+--     This function should be called on the thread that created the parent window, or on the main thread if the messagebox has no parent. It will block execution of that thread until the user clicks a button or closes the messagebox.
+--
+--     This function may be called at any time, even before SDL_Init(). This makes it useful for reporting errors like a failure to create a renderer or OpenGL context.
+--
+--     On X11, SDL rolls its own dialog box with X11 primitives instead of a formal toolkit like GTK+ or Qt.
+--
+--     Note that if SDL_Init() would fail because there isn\'t any available video target, this function is likely to fail for the same reasons. If this is a concern, check the return value from this function and fall back to writing to stderr if you can.
+--
+--     [@messageboxdata@]: the 'SDL_MessageBoxData' structure with title, text and other options.
+--
+--     [@buttonid@]: the pointer to which user id of hit button should be copied.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShowSimpleMessageBox'
+--
+--     [C declaration]: @SDL_ShowMessageBox@, defined at @SDL3\/SDL_messagebox.h 177:34@
+sDL_ShowMessageBox
+  :: BG.FunPtr (PtrConst.PtrConst SDL_MessageBoxData -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_ShowMessageBox =
+  BG.unsafePerformIO hs_bindgen_fdad2a984a763ae0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_get_SDL_ShowSimpleMessageBox@
+foreign import ccall unsafe "hs_bindgen_059be268606e6ea4"
+  hs_bindgen_059be268606e6ea4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_get_SDL_ShowSimpleMessageBox@
+hs_bindgen_059be268606e6ea4
+  :: IO
+       ( BG.FunPtr
+           ( SDL_MessageBoxFlags
+             -> PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_059be268606e6ea4 =
+  BG.fromFFIType hs_bindgen_059be268606e6ea4_base
+
+{-# NOINLINE sDL_ShowSimpleMessageBox #-}
+
+-- | Display a simple modal message box.
+--
+--     If your needs aren\'t complex, this function is preferred over SDL_ShowMessageBox.
+--
+--     @flags@ may be any of the following:
+--
+--     * @'sDL_MESSAGEBOX_ERROR'@: error dialog
+--
+--     * @'sDL_MESSAGEBOX_WARNING'@: warning dialog
+--
+--     * @'sDL_MESSAGEBOX_INFORMATION'@: informational dialog
+--
+--     This function should be called on the thread that created the parent window, or on the main thread if the messagebox has no parent. It will block execution of that thread until the user clicks a button or closes the messagebox.
+--
+--     This function may be called at any time, even before SDL_Init(). This makes it useful for reporting errors like a failure to create a renderer or OpenGL context.
+--
+--     On X11, SDL rolls its own dialog box with X11 primitives instead of a formal toolkit like GTK+ or Qt.
+--
+--     Note that if SDL_Init() would fail because there isn\'t any available video target, this function is likely to fail for the same reasons. If this is a concern, check the return value from this function and fall back to writing to stderr if you can.
+--
+--     [@flags@]: an 'SDL_MessageBoxFlags' value.
+--
+--     [@title@]: UTF-8 title text.
+--
+--     [@message@]: UTF-8 message text.
+--
+--     [@window@]: the parent window, or NULL for no parent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShowMessageBox'
+--
+--     [C declaration]: @SDL_ShowSimpleMessageBox@, defined at @SDL3\/SDL_messagebox.h 221:34@
+sDL_ShowSimpleMessageBox
+  :: BG.FunPtr
+       ( SDL_MessageBoxFlags
+         -> PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> IO BG.CBool
+       )
+sDL_ShowSimpleMessageBox =
+  BG.unsafePerformIO hs_bindgen_059be268606e6ea4
diff --git a/src/SDL3/Sys/Bindgen/Messagebox/Safe.hs b/src/SDL3/Sys/Bindgen/Messagebox/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Messagebox/Safe.hs
@@ -0,0 +1,155 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Messagebox.Safe (
+  SDL3.Sys.Bindgen.Messagebox.Safe.sDL_ShowMessageBox,
+  SDL3.Sys.Bindgen.Messagebox.Safe.sDL_ShowSimpleMessageBox,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Messagebox
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_messagebox.h>"
+         , "_Bool hs_bindgen_5fad9b7ef25350c1 ("
+         , "  SDL_MessageBoxData const *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ShowMessageBox)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_3ea30834607f7eea ("
+         , "  SDL_MessageBoxFlags arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  SDL_Window *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_ShowSimpleMessageBox)(arg1, arg2, arg3, arg4);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_Safe_SDL_ShowMessageBox@
+foreign import ccall safe "hs_bindgen_5fad9b7ef25350c1"
+  hs_bindgen_5fad9b7ef25350c1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_Safe_SDL_ShowMessageBox@
+hs_bindgen_5fad9b7ef25350c1
+  :: PtrConst.PtrConst SDL_MessageBoxData
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_5fad9b7ef25350c1 =
+  BG.fromFFIType hs_bindgen_5fad9b7ef25350c1_base
+
+-- | Create a modal message box.
+--
+--     If your needs aren\'t complex, it might be easier to use SDL_ShowSimpleMessageBox.
+--
+--     This function should be called on the thread that created the parent window, or on the main thread if the messagebox has no parent. It will block execution of that thread until the user clicks a button or closes the messagebox.
+--
+--     This function may be called at any time, even before SDL_Init(). This makes it useful for reporting errors like a failure to create a renderer or OpenGL context.
+--
+--     On X11, SDL rolls its own dialog box with X11 primitives instead of a formal toolkit like GTK+ or Qt.
+--
+--     Note that if SDL_Init() would fail because there isn\'t any available video target, this function is likely to fail for the same reasons. If this is a concern, check the return value from this function and fall back to writing to stderr if you can.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShowSimpleMessageBox'
+--
+--     [C declaration]: @SDL_ShowMessageBox@, defined at @SDL3\/SDL_messagebox.h 177:34@
+sDL_ShowMessageBox
+  :: PtrConst.PtrConst SDL_MessageBoxData
+  -- ^
+  --
+  --           [@messageboxdata@]: the 'SDL_MessageBoxData' structure with title, text and other options.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@buttonid@]: the pointer to which user id of hit button should be copied.
+  -> IO BG.CBool
+sDL_ShowMessageBox = hs_bindgen_5fad9b7ef25350c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_Safe_SDL_ShowSimpleMessageBox@
+foreign import ccall safe "hs_bindgen_3ea30834607f7eea"
+  hs_bindgen_3ea30834607f7eea_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_Safe_SDL_ShowSimpleMessageBox@
+hs_bindgen_3ea30834607f7eea
+  :: SDL_MessageBoxFlags
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_3ea30834607f7eea =
+  BG.fromFFIType hs_bindgen_3ea30834607f7eea_base
+
+-- | Display a simple modal message box.
+--
+--     If your needs aren\'t complex, this function is preferred over SDL_ShowMessageBox.
+--
+--     @flags@ may be any of the following:
+--
+--     * @'sDL_MESSAGEBOX_ERROR'@: error dialog
+--
+--     * @'sDL_MESSAGEBOX_WARNING'@: warning dialog
+--
+--     * @'sDL_MESSAGEBOX_INFORMATION'@: informational dialog
+--
+--     This function should be called on the thread that created the parent window, or on the main thread if the messagebox has no parent. It will block execution of that thread until the user clicks a button or closes the messagebox.
+--
+--     This function may be called at any time, even before SDL_Init(). This makes it useful for reporting errors like a failure to create a renderer or OpenGL context.
+--
+--     On X11, SDL rolls its own dialog box with X11 primitives instead of a formal toolkit like GTK+ or Qt.
+--
+--     Note that if SDL_Init() would fail because there isn\'t any available video target, this function is likely to fail for the same reasons. If this is a concern, check the return value from this function and fall back to writing to stderr if you can.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShowMessageBox'
+--
+--     [C declaration]: @SDL_ShowSimpleMessageBox@, defined at @SDL3\/SDL_messagebox.h 221:34@
+sDL_ShowSimpleMessageBox
+  :: SDL_MessageBoxFlags
+  -- ^
+  --
+  --           [@flags@]: an 'SDL_MessageBoxFlags' value.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: UTF-8 title text.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@message@]: UTF-8 message text.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the parent window, or NULL for no parent.
+  -> IO BG.CBool
+sDL_ShowSimpleMessageBox =
+  hs_bindgen_3ea30834607f7eea
diff --git a/src/SDL3/Sys/Bindgen/Messagebox/Unsafe.hs b/src/SDL3/Sys/Bindgen/Messagebox/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Messagebox/Unsafe.hs
@@ -0,0 +1,155 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Messagebox.Unsafe (
+  SDL3.Sys.Bindgen.Messagebox.Unsafe.sDL_ShowMessageBox,
+  SDL3.Sys.Bindgen.Messagebox.Unsafe.sDL_ShowSimpleMessageBox,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Messagebox
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_messagebox.h>"
+         , "_Bool hs_bindgen_6ca41526aad99745 ("
+         , "  SDL_MessageBoxData const *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ShowMessageBox)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_e2947f00c756e1c7 ("
+         , "  SDL_MessageBoxFlags arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  SDL_Window *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_ShowSimpleMessageBox)(arg1, arg2, arg3, arg4);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_Unsafe_SDL_ShowMessageBox@
+foreign import ccall unsafe "hs_bindgen_6ca41526aad99745"
+  hs_bindgen_6ca41526aad99745_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_Unsafe_SDL_ShowMessageBox@
+hs_bindgen_6ca41526aad99745
+  :: PtrConst.PtrConst SDL_MessageBoxData
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_6ca41526aad99745 =
+  BG.fromFFIType hs_bindgen_6ca41526aad99745_base
+
+-- | Create a modal message box.
+--
+--     If your needs aren\'t complex, it might be easier to use SDL_ShowSimpleMessageBox.
+--
+--     This function should be called on the thread that created the parent window, or on the main thread if the messagebox has no parent. It will block execution of that thread until the user clicks a button or closes the messagebox.
+--
+--     This function may be called at any time, even before SDL_Init(). This makes it useful for reporting errors like a failure to create a renderer or OpenGL context.
+--
+--     On X11, SDL rolls its own dialog box with X11 primitives instead of a formal toolkit like GTK+ or Qt.
+--
+--     Note that if SDL_Init() would fail because there isn\'t any available video target, this function is likely to fail for the same reasons. If this is a concern, check the return value from this function and fall back to writing to stderr if you can.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShowSimpleMessageBox'
+--
+--     [C declaration]: @SDL_ShowMessageBox@, defined at @SDL3\/SDL_messagebox.h 177:34@
+sDL_ShowMessageBox
+  :: PtrConst.PtrConst SDL_MessageBoxData
+  -- ^
+  --
+  --           [@messageboxdata@]: the 'SDL_MessageBoxData' structure with title, text and other options.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@buttonid@]: the pointer to which user id of hit button should be copied.
+  -> IO BG.CBool
+sDL_ShowMessageBox = hs_bindgen_6ca41526aad99745
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_Unsafe_SDL_ShowSimpleMessageBox@
+foreign import ccall unsafe "hs_bindgen_e2947f00c756e1c7"
+  hs_bindgen_e2947f00c756e1c7_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Messagebox_Unsafe_SDL_ShowSimpleMessageBox@
+hs_bindgen_e2947f00c756e1c7
+  :: SDL_MessageBoxFlags
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_e2947f00c756e1c7 =
+  BG.fromFFIType hs_bindgen_e2947f00c756e1c7_base
+
+-- | Display a simple modal message box.
+--
+--     If your needs aren\'t complex, this function is preferred over SDL_ShowMessageBox.
+--
+--     @flags@ may be any of the following:
+--
+--     * @'sDL_MESSAGEBOX_ERROR'@: error dialog
+--
+--     * @'sDL_MESSAGEBOX_WARNING'@: warning dialog
+--
+--     * @'sDL_MESSAGEBOX_INFORMATION'@: informational dialog
+--
+--     This function should be called on the thread that created the parent window, or on the main thread if the messagebox has no parent. It will block execution of that thread until the user clicks a button or closes the messagebox.
+--
+--     This function may be called at any time, even before SDL_Init(). This makes it useful for reporting errors like a failure to create a renderer or OpenGL context.
+--
+--     On X11, SDL rolls its own dialog box with X11 primitives instead of a formal toolkit like GTK+ or Qt.
+--
+--     Note that if SDL_Init() would fail because there isn\'t any available video target, this function is likely to fail for the same reasons. If this is a concern, check the return value from this function and fall back to writing to stderr if you can.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShowMessageBox'
+--
+--     [C declaration]: @SDL_ShowSimpleMessageBox@, defined at @SDL3\/SDL_messagebox.h 221:34@
+sDL_ShowSimpleMessageBox
+  :: SDL_MessageBoxFlags
+  -- ^
+  --
+  --           [@flags@]: an 'SDL_MessageBoxFlags' value.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: UTF-8 title text.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@message@]: UTF-8 message text.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the parent window, or NULL for no parent.
+  -> IO BG.CBool
+sDL_ShowSimpleMessageBox =
+  hs_bindgen_e2947f00c756e1c7
diff --git a/src/SDL3/Sys/Bindgen/Metal.hs b/src/SDL3/Sys/Bindgen/Metal.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Metal.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Functions to creating Metal layers and views on SDL windows.
+--
+--     This provides some platform-specific glue for Apple platforms. Most macOS and iOS apps can use SDL without these functions, but this API they can be useful for specific OS-level integration tasks. A handle to a CAMetalLayer-backed NSView (macOS) or UIView (iOS\/tvOS).
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Metal (
+  SDL3.Sys.Bindgen.Metal.SDL_MetalView (..),
+)
+where
+
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @SDL_MetalView@, defined at @SDL3\/SDL_metal.h 48:15@
+newtype SDL_MetalView = SDL_MetalView
+  { unwrap :: BG.Ptr BG.Void
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "unwrap" SDL_MetalView ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MetalView{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "unwrap" (BG.Ptr SDL_MetalView) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MetalView "unwrap" where
+  type
+    CFieldType SDL_MetalView "unwrap" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Metal/FunPtr.hs b/src/SDL3/Sys/Bindgen/Metal/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Metal/FunPtr.hs
@@ -0,0 +1,136 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Metal.FunPtr (
+  SDL3.Sys.Bindgen.Metal.FunPtr.sDL_Metal_CreateView,
+  SDL3.Sys.Bindgen.Metal.FunPtr.sDL_Metal_DestroyView,
+  SDL3.Sys.Bindgen.Metal.FunPtr.sDL_Metal_GetLayer,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Metal
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_metal.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Metal_get_SDL_Metal_CreateView */"
+         , "__attribute__ ((const))"
+         , "SDL_MetalView (*hs_bindgen_05e876f492f6e504 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_Metal_CreateView;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Metal_get_SDL_Metal_DestroyView */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_459e45a952bb1737 (void)) ("
+         , "  SDL_MetalView arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_Metal_DestroyView;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Metal_get_SDL_Metal_GetLayer */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_7141fdaf243ea8b9 (void)) ("
+         , "  SDL_MetalView arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_Metal_GetLayer;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_get_SDL_Metal_CreateView@
+foreign import ccall unsafe "hs_bindgen_05e876f492f6e504"
+  hs_bindgen_05e876f492f6e504_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_get_SDL_Metal_CreateView@
+hs_bindgen_05e876f492f6e504
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO SDL_MetalView))
+hs_bindgen_05e876f492f6e504 =
+  BG.fromFFIType hs_bindgen_05e876f492f6e504_base
+
+{-# NOINLINE sDL_Metal_CreateView #-}
+
+-- | Create a CAMetalLayer-backed NSView\/UIView and attach it to the specified window.
+--
+--     On macOS, this does /not/ associate a MTLDevice with the CAMetalLayer on its own. It is up to user code to do that.
+--
+--     The returned handle can be casted directly to a NSView or UIView. To access the backing CAMetalLayer, call @SDL_Metal_GetLayer()@.
+--
+--     [@window@]: the window.
+--
+--     [Returns]: handle NSView or UIView.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Metal_DestroyView', 'sDL_Metal_GetLayer'
+--
+--     [C declaration]: @SDL_Metal_CreateView@, defined at @SDL3\/SDL_metal.h 75:43@
+sDL_Metal_CreateView :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO SDL_MetalView)
+sDL_Metal_CreateView =
+  BG.unsafePerformIO hs_bindgen_05e876f492f6e504
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_get_SDL_Metal_DestroyView@
+foreign import ccall unsafe "hs_bindgen_459e45a952bb1737"
+  hs_bindgen_459e45a952bb1737_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_get_SDL_Metal_DestroyView@
+hs_bindgen_459e45a952bb1737 :: IO (BG.FunPtr (SDL_MetalView -> IO ()))
+hs_bindgen_459e45a952bb1737 =
+  BG.fromFFIType hs_bindgen_459e45a952bb1737_base
+
+{-# NOINLINE sDL_Metal_DestroyView #-}
+
+-- | Destroy an existing 'SDL_MetalView' object.
+--
+--     This should be called before SDL_DestroyWindow, if SDL_Metal_CreateView was called after SDL_CreateWindow.
+--
+--     [@view@]: the 'SDL_MetalView' object.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Metal_CreateView'
+--
+--     [C declaration]: @SDL_Metal_DestroyView@, defined at @SDL3\/SDL_metal.h 91:34@
+sDL_Metal_DestroyView :: BG.FunPtr (SDL_MetalView -> IO ())
+sDL_Metal_DestroyView =
+  BG.unsafePerformIO hs_bindgen_459e45a952bb1737
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_get_SDL_Metal_GetLayer@
+foreign import ccall unsafe "hs_bindgen_7141fdaf243ea8b9"
+  hs_bindgen_7141fdaf243ea8b9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_get_SDL_Metal_GetLayer@
+hs_bindgen_7141fdaf243ea8b9 :: IO (BG.FunPtr (SDL_MetalView -> IO (BG.Ptr BG.Void)))
+hs_bindgen_7141fdaf243ea8b9 =
+  BG.fromFFIType hs_bindgen_7141fdaf243ea8b9_base
+
+{-# NOINLINE sDL_Metal_GetLayer #-}
+
+-- | Get a pointer to the backing CAMetalLayer for the given view.
+--
+--     [@view@]: the 'SDL_MetalView' object.
+--
+--     [Returns]: a pointer.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_Metal_GetLayer@, defined at @SDL3\/SDL_metal.h 103:36@
+sDL_Metal_GetLayer :: BG.FunPtr (SDL_MetalView -> IO (BG.Ptr BG.Void))
+sDL_Metal_GetLayer =
+  BG.unsafePerformIO hs_bindgen_7141fdaf243ea8b9
diff --git a/src/SDL3/Sys/Bindgen/Metal/Safe.hs b/src/SDL3/Sys/Bindgen/Metal/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Metal/Safe.hs
@@ -0,0 +1,138 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Metal.Safe (
+  SDL3.Sys.Bindgen.Metal.Safe.sDL_Metal_CreateView,
+  SDL3.Sys.Bindgen.Metal.Safe.sDL_Metal_DestroyView,
+  SDL3.Sys.Bindgen.Metal.Safe.sDL_Metal_GetLayer,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Metal
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_metal.h>"
+         , "SDL_MetalView hs_bindgen_04ce5ab1408c911d ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_Metal_CreateView)(arg1);"
+         , "}"
+         , "void hs_bindgen_b00215ead799e6c0 ("
+         , "  SDL_MetalView arg1"
+         , ")"
+         , "{"
+         , "  (SDL_Metal_DestroyView)(arg1);"
+         , "}"
+         , "void *hs_bindgen_4ce54bd94800c4e9 ("
+         , "  SDL_MetalView arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_Metal_GetLayer)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Safe_SDL_Metal_CreateView@
+foreign import ccall safe "hs_bindgen_04ce5ab1408c911d"
+  hs_bindgen_04ce5ab1408c911d_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Safe_SDL_Metal_CreateView@
+hs_bindgen_04ce5ab1408c911d
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO SDL_MetalView
+hs_bindgen_04ce5ab1408c911d =
+  BG.fromFFIType hs_bindgen_04ce5ab1408c911d_base
+
+-- | Create a CAMetalLayer-backed NSView\/UIView and attach it to the specified window.
+--
+--     On macOS, this does /not/ associate a MTLDevice with the CAMetalLayer on its own. It is up to user code to do that.
+--
+--     The returned handle can be casted directly to a NSView or UIView. To access the backing CAMetalLayer, call @SDL_Metal_GetLayer()@.
+--
+--     [Returns]: handle NSView or UIView.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Metal_DestroyView', 'sDL_Metal_GetLayer'
+--
+--     [C declaration]: @SDL_Metal_CreateView@, defined at @SDL3\/SDL_metal.h 75:43@
+sDL_Metal_CreateView
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> IO SDL_MetalView
+sDL_Metal_CreateView = hs_bindgen_04ce5ab1408c911d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Safe_SDL_Metal_DestroyView@
+foreign import ccall safe "hs_bindgen_b00215ead799e6c0"
+  hs_bindgen_b00215ead799e6c0_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Safe_SDL_Metal_DestroyView@
+hs_bindgen_b00215ead799e6c0
+  :: SDL_MetalView
+  -> IO ()
+hs_bindgen_b00215ead799e6c0 =
+  BG.fromFFIType hs_bindgen_b00215ead799e6c0_base
+
+-- | Destroy an existing 'SDL_MetalView' object.
+--
+--     This should be called before SDL_DestroyWindow, if SDL_Metal_CreateView was called after SDL_CreateWindow.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Metal_CreateView'
+--
+--     [C declaration]: @SDL_Metal_DestroyView@, defined at @SDL3\/SDL_metal.h 91:34@
+sDL_Metal_DestroyView
+  :: SDL_MetalView
+  -- ^
+  --
+  --           [@view@]: the 'SDL_MetalView' object.
+  -> IO ()
+sDL_Metal_DestroyView = hs_bindgen_b00215ead799e6c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Safe_SDL_Metal_GetLayer@
+foreign import ccall safe "hs_bindgen_4ce54bd94800c4e9"
+  hs_bindgen_4ce54bd94800c4e9_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Safe_SDL_Metal_GetLayer@
+hs_bindgen_4ce54bd94800c4e9
+  :: SDL_MetalView
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_4ce54bd94800c4e9 =
+  BG.fromFFIType hs_bindgen_4ce54bd94800c4e9_base
+
+-- | Get a pointer to the backing CAMetalLayer for the given view.
+--
+--     [Returns]: a pointer.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_Metal_GetLayer@, defined at @SDL3\/SDL_metal.h 103:36@
+sDL_Metal_GetLayer
+  :: SDL_MetalView
+  -- ^
+  --
+  --           [@view@]: the 'SDL_MetalView' object.
+  -> IO (BG.Ptr BG.Void)
+sDL_Metal_GetLayer = hs_bindgen_4ce54bd94800c4e9
diff --git a/src/SDL3/Sys/Bindgen/Metal/Unsafe.hs b/src/SDL3/Sys/Bindgen/Metal/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Metal/Unsafe.hs
@@ -0,0 +1,138 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Metal.Unsafe (
+  SDL3.Sys.Bindgen.Metal.Unsafe.sDL_Metal_CreateView,
+  SDL3.Sys.Bindgen.Metal.Unsafe.sDL_Metal_DestroyView,
+  SDL3.Sys.Bindgen.Metal.Unsafe.sDL_Metal_GetLayer,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Metal
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_metal.h>"
+         , "SDL_MetalView hs_bindgen_8451a59271a15560 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_Metal_CreateView)(arg1);"
+         , "}"
+         , "void hs_bindgen_f80d8baf242eee62 ("
+         , "  SDL_MetalView arg1"
+         , ")"
+         , "{"
+         , "  (SDL_Metal_DestroyView)(arg1);"
+         , "}"
+         , "void *hs_bindgen_d6bd9b15880590e0 ("
+         , "  SDL_MetalView arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_Metal_GetLayer)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Unsafe_SDL_Metal_CreateView@
+foreign import ccall unsafe "hs_bindgen_8451a59271a15560"
+  hs_bindgen_8451a59271a15560_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Unsafe_SDL_Metal_CreateView@
+hs_bindgen_8451a59271a15560
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO SDL_MetalView
+hs_bindgen_8451a59271a15560 =
+  BG.fromFFIType hs_bindgen_8451a59271a15560_base
+
+-- | Create a CAMetalLayer-backed NSView\/UIView and attach it to the specified window.
+--
+--     On macOS, this does /not/ associate a MTLDevice with the CAMetalLayer on its own. It is up to user code to do that.
+--
+--     The returned handle can be casted directly to a NSView or UIView. To access the backing CAMetalLayer, call @SDL_Metal_GetLayer()@.
+--
+--     [Returns]: handle NSView or UIView.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Metal_DestroyView', 'sDL_Metal_GetLayer'
+--
+--     [C declaration]: @SDL_Metal_CreateView@, defined at @SDL3\/SDL_metal.h 75:43@
+sDL_Metal_CreateView
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> IO SDL_MetalView
+sDL_Metal_CreateView = hs_bindgen_8451a59271a15560
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Unsafe_SDL_Metal_DestroyView@
+foreign import ccall unsafe "hs_bindgen_f80d8baf242eee62"
+  hs_bindgen_f80d8baf242eee62_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Unsafe_SDL_Metal_DestroyView@
+hs_bindgen_f80d8baf242eee62
+  :: SDL_MetalView
+  -> IO ()
+hs_bindgen_f80d8baf242eee62 =
+  BG.fromFFIType hs_bindgen_f80d8baf242eee62_base
+
+-- | Destroy an existing 'SDL_MetalView' object.
+--
+--     This should be called before SDL_DestroyWindow, if SDL_Metal_CreateView was called after SDL_CreateWindow.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Metal_CreateView'
+--
+--     [C declaration]: @SDL_Metal_DestroyView@, defined at @SDL3\/SDL_metal.h 91:34@
+sDL_Metal_DestroyView
+  :: SDL_MetalView
+  -- ^
+  --
+  --           [@view@]: the 'SDL_MetalView' object.
+  -> IO ()
+sDL_Metal_DestroyView = hs_bindgen_f80d8baf242eee62
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Unsafe_SDL_Metal_GetLayer@
+foreign import ccall unsafe "hs_bindgen_d6bd9b15880590e0"
+  hs_bindgen_d6bd9b15880590e0_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Metal_Unsafe_SDL_Metal_GetLayer@
+hs_bindgen_d6bd9b15880590e0
+  :: SDL_MetalView
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_d6bd9b15880590e0 =
+  BG.fromFFIType hs_bindgen_d6bd9b15880590e0_base
+
+-- | Get a pointer to the backing CAMetalLayer for the given view.
+--
+--     [Returns]: a pointer.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_Metal_GetLayer@, defined at @SDL3\/SDL_metal.h 103:36@
+sDL_Metal_GetLayer
+  :: SDL_MetalView
+  -- ^
+  --
+  --           [@view@]: the 'SDL_MetalView' object.
+  -> IO (BG.Ptr BG.Void)
+sDL_Metal_GetLayer = hs_bindgen_d6bd9b15880590e0
diff --git a/src/SDL3/Sys/Bindgen/Misc/FunPtr.hs b/src/SDL3/Sys/Bindgen/Misc/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Misc/FunPtr.hs
@@ -0,0 +1,44 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Misc.FunPtr (
+  SDL3.Sys.Bindgen.Misc.FunPtr.sDL_OpenURL,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_misc.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Misc_get_SDL_OpenURL */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4c967d8f61448acb (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenURL;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Misc_get_SDL_OpenURL@
+foreign import ccall unsafe "hs_bindgen_4c967d8f61448acb"
+  hs_bindgen_4c967d8f61448acb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Misc_get_SDL_OpenURL@
+hs_bindgen_4c967d8f61448acb :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_4c967d8f61448acb =
+  BG.fromFFIType hs_bindgen_4c967d8f61448acb_base
+
+{-# NOINLINE sDL_OpenURL #-}
+
+-- | [C declaration]: @SDL_OpenURL@, defined at @SDL3\/SDL_misc.h 72:34@
+sDL_OpenURL :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_OpenURL =
+  BG.unsafePerformIO hs_bindgen_4c967d8f61448acb
diff --git a/src/SDL3/Sys/Bindgen/Misc/Safe.hs b/src/SDL3/Sys/Bindgen/Misc/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Misc/Safe.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Misc.Safe (
+  SDL3.Sys.Bindgen.Misc.Safe.sDL_OpenURL,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_misc.h>"
+         , "_Bool hs_bindgen_b3f3010b7eba15e0 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenURL)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Misc_Safe_SDL_OpenURL@
+foreign import ccall safe "hs_bindgen_b3f3010b7eba15e0"
+  hs_bindgen_b3f3010b7eba15e0_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Misc_Safe_SDL_OpenURL@
+hs_bindgen_b3f3010b7eba15e0
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_b3f3010b7eba15e0 =
+  BG.fromFFIType hs_bindgen_b3f3010b7eba15e0_base
+
+-- | [C declaration]: @SDL_OpenURL@, defined at @SDL3\/SDL_misc.h 72:34@
+sDL_OpenURL
+  :: PtrConst.PtrConst BG.CChar
+  -- ^ [C declaration]: @url@
+  -> IO BG.CBool
+sDL_OpenURL = hs_bindgen_b3f3010b7eba15e0
diff --git a/src/SDL3/Sys/Bindgen/Misc/Unsafe.hs b/src/SDL3/Sys/Bindgen/Misc/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Misc/Unsafe.hs
@@ -0,0 +1,45 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Misc.Unsafe (
+  SDL3.Sys.Bindgen.Misc.Unsafe.sDL_OpenURL,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_misc.h>"
+         , "_Bool hs_bindgen_25f6c968529203db ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenURL)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Misc_Unsafe_SDL_OpenURL@
+foreign import ccall unsafe "hs_bindgen_25f6c968529203db"
+  hs_bindgen_25f6c968529203db_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Misc_Unsafe_SDL_OpenURL@
+hs_bindgen_25f6c968529203db
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_25f6c968529203db =
+  BG.fromFFIType hs_bindgen_25f6c968529203db_base
+
+-- | [C declaration]: @SDL_OpenURL@, defined at @SDL3\/SDL_misc.h 72:34@
+sDL_OpenURL
+  :: PtrConst.PtrConst BG.CChar
+  -- ^ [C declaration]: @url@
+  -> IO BG.CBool
+sDL_OpenURL = hs_bindgen_25f6c968529203db
diff --git a/src/SDL3/Sys/Bindgen/Mouse.hs b/src/SDL3/Sys/Bindgen/Mouse.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Mouse.hs
@@ -0,0 +1,888 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Any GUI application has to deal with the mouse, and SDL provides functions to manage mouse input and the displayed cursor.
+--
+--     Most interactions with the mouse will come through the event subsystem. Moving a mouse generates an SDL_EVENT_MOUSE_MOTION event, pushing a button generates SDL_EVENT_MOUSE_BUTTON_DOWN, etc, but one can also query the current state of the mouse at any time with @SDL_GetMouseState()@.
+--
+--     For certain games, it\'s useful to disassociate the mouse cursor from mouse input. An FPS, for example, would not want the player\'s motion to stop as the mouse hits the edge of the window. For these scenarios, use @SDL_SetWindowRelativeMouseMode()@, which hides the cursor, grabs mouse input to the window, and reads mouse input no matter how far it moves.
+--
+--     Games that want the system to track the mouse but want to draw their own cursor can use @SDL_HideCursor()@ and @SDL_ShowCursor()@. It might be more efficient to let the system manage the cursor, if possible, using @SDL_SetCursor()@ with a custom image made through @SDL_CreateColorCursor()@, or perhaps just a specific system cursor from @SDL_CreateSystemCursor()@.
+--
+--     SDL can, on many platforms, differentiate between multiple connected mice, allowing for interesting input scenarios and multiplayer games. They can be enumerated with @SDL_GetMice()@, and SDL will send SDL_EVENT_MOUSE_ADDED and SDL_EVENT_MOUSE_REMOVED events as they are connected and unplugged.
+--
+--     Since many apps only care about basic mouse input, SDL offers a virtual mouse device for touch and pen input, which often can make a desktop application work on a touchscreen phone without any code changes. Apps that care about touch\/pen separately from mouse input should filter out events with a @which@ field of SDL_TOUCH_MOUSEID\/SDL_PEN_MOUSEID. This is a unique ID for a mouse for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     If the mouse is disconnected and reconnected, it will get a new ID.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Mouse (
+  SDL3.Sys.Bindgen.Mouse.SDL_MouseID (..),
+  SDL3.Sys.Bindgen.Mouse.SDL_Cursor,
+  SDL3.Sys.Bindgen.Mouse.SDL_SystemCursor (..),
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_DEFAULT,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_TEXT,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_WAIT,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_CROSSHAIR,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_PROGRESS,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_NWSE_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_NESW_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_EW_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_NS_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_MOVE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_NOT_ALLOWED,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_POINTER,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_NW_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_N_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_NE_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_E_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_SE_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_S_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_SW_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_W_RESIZE,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_SYSTEM_CURSOR_COUNT,
+  SDL3.Sys.Bindgen.Mouse.SDL_MouseWheelDirection (..),
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_MOUSEWHEEL_NORMAL,
+  pattern SDL3.Sys.Bindgen.Mouse.SDL_MOUSEWHEEL_FLIPPED,
+  SDL3.Sys.Bindgen.Mouse.SDL_CursorFrameInfo (..),
+  SDL3.Sys.Bindgen.Mouse.SDL_MouseButtonFlags (..),
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_LEFT,
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_MIDDLE,
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_RIGHT,
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_X1,
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_X2,
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_MASK,
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_LMASK,
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_MMASK,
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_RMASK,
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_X1MASK,
+  SDL3.Sys.Bindgen.Mouse.sDL_BUTTON_X2MASK,
+  SDL3.Sys.Bindgen.Mouse.SDL_MouseMotionTransformCallback_Aux (..),
+  SDL3.Sys.Bindgen.Mouse.SDL_MouseMotionTransformCallback (..),
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | [C declaration]: @SDL_MouseID@, defined at @SDL3\/SDL_mouse.h 81:16@
+newtype SDL_MouseID = SDL_MouseID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_MouseID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_MouseID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MouseID "unwrap" where
+  type
+    CFieldType SDL_MouseID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | The structure used to identify an SDL cursor.
+--
+--     This is opaque data.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_Cursor@, defined at @SDL3\/SDL_mouse.h 90:16@
+data SDL_Cursor
+
+-- | Cursor types for @SDL_CreateSystemCursor()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_SystemCursor@, defined at @SDL3\/SDL_mouse.h 97:14@
+newtype SDL_SystemCursor = SDL_SystemCursor
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_SystemCursor where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_SystemCursor where
+  readRaw =
+    \ptr0 ->
+      pure SDL_SystemCursor
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_SystemCursor where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_SystemCursor unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_SystemCursor instance BG.Storable SDL_SystemCursor
+
+deriving via BG.CUInt instance BG.Prim SDL_SystemCursor
+
+instance CEnum.CEnum SDL_SystemCursor where
+  type CEnumZ SDL_SystemCursor = BG.CUInt
+
+  toCEnum = SDL_SystemCursor
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_SYSTEM_CURSOR_DEFAULT")
+        , (1, BG.singleton "SDL_SYSTEM_CURSOR_TEXT")
+        , (2, BG.singleton "SDL_SYSTEM_CURSOR_WAIT")
+        , (3, BG.singleton "SDL_SYSTEM_CURSOR_CROSSHAIR")
+        , (4, BG.singleton "SDL_SYSTEM_CURSOR_PROGRESS")
+        , (5, BG.singleton "SDL_SYSTEM_CURSOR_NWSE_RESIZE")
+        , (6, BG.singleton "SDL_SYSTEM_CURSOR_NESW_RESIZE")
+        , (7, BG.singleton "SDL_SYSTEM_CURSOR_EW_RESIZE")
+        , (8, BG.singleton "SDL_SYSTEM_CURSOR_NS_RESIZE")
+        , (9, BG.singleton "SDL_SYSTEM_CURSOR_MOVE")
+        , (10, BG.singleton "SDL_SYSTEM_CURSOR_NOT_ALLOWED")
+        , (11, BG.singleton "SDL_SYSTEM_CURSOR_POINTER")
+        , (12, BG.singleton "SDL_SYSTEM_CURSOR_NW_RESIZE")
+        , (13, BG.singleton "SDL_SYSTEM_CURSOR_N_RESIZE")
+        , (14, BG.singleton "SDL_SYSTEM_CURSOR_NE_RESIZE")
+        , (15, BG.singleton "SDL_SYSTEM_CURSOR_E_RESIZE")
+        , (16, BG.singleton "SDL_SYSTEM_CURSOR_SE_RESIZE")
+        , (17, BG.singleton "SDL_SYSTEM_CURSOR_S_RESIZE")
+        , (18, BG.singleton "SDL_SYSTEM_CURSOR_SW_RESIZE")
+        , (19, BG.singleton "SDL_SYSTEM_CURSOR_W_RESIZE")
+        , (20, BG.singleton "SDL_SYSTEM_CURSOR_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_SystemCursor"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_SystemCursor"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_SystemCursor where
+  minDeclaredValue = SDL_SYSTEM_CURSOR_DEFAULT
+
+  maxDeclaredValue = SDL_SYSTEM_CURSOR_COUNT
+
+instance Show SDL_SystemCursor where
+  showsPrec = CEnum.shows
+
+instance Read SDL_SystemCursor where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_SystemCursor ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SystemCursor{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_SystemCursor) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_SystemCursor "unwrap" where
+  type CFieldType SDL_SystemCursor "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Default cursor. Usually an arrow.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_DEFAULT@, defined at @SDL3\/SDL_mouse.h 99:5@
+pattern SDL_SYSTEM_CURSOR_DEFAULT :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_DEFAULT = SDL_SystemCursor 0
+
+-- | Text selection. Usually an I-beam.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_TEXT@, defined at @SDL3\/SDL_mouse.h 100:5@
+pattern SDL_SYSTEM_CURSOR_TEXT :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_TEXT = SDL_SystemCursor 1
+
+-- | Wait. Usually an hourglass or watch or spinning ball.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_WAIT@, defined at @SDL3\/SDL_mouse.h 101:5@
+pattern SDL_SYSTEM_CURSOR_WAIT :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_WAIT = SDL_SystemCursor 2
+
+-- | Crosshair.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_CROSSHAIR@, defined at @SDL3\/SDL_mouse.h 102:5@
+pattern SDL_SYSTEM_CURSOR_CROSSHAIR :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_CROSSHAIR = SDL_SystemCursor 3
+
+-- | Program is busy but still interactive. Usually it\'s WAIT with an arrow.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_PROGRESS@, defined at @SDL3\/SDL_mouse.h 103:5@
+pattern SDL_SYSTEM_CURSOR_PROGRESS :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_PROGRESS = SDL_SystemCursor 4
+
+-- | Double arrow pointing northwest and southeast.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_NWSE_RESIZE@, defined at @SDL3\/SDL_mouse.h 104:5@
+pattern SDL_SYSTEM_CURSOR_NWSE_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_NWSE_RESIZE = SDL_SystemCursor 5
+
+-- | Double arrow pointing northeast and southwest.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_NESW_RESIZE@, defined at @SDL3\/SDL_mouse.h 105:5@
+pattern SDL_SYSTEM_CURSOR_NESW_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_NESW_RESIZE = SDL_SystemCursor 6
+
+-- | Double arrow pointing west and east.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_EW_RESIZE@, defined at @SDL3\/SDL_mouse.h 106:5@
+pattern SDL_SYSTEM_CURSOR_EW_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_EW_RESIZE = SDL_SystemCursor 7
+
+-- | Double arrow pointing north and south.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_NS_RESIZE@, defined at @SDL3\/SDL_mouse.h 107:5@
+pattern SDL_SYSTEM_CURSOR_NS_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_NS_RESIZE = SDL_SystemCursor 8
+
+-- | Four pointed arrow pointing north, south, east, and west.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_MOVE@, defined at @SDL3\/SDL_mouse.h 108:5@
+pattern SDL_SYSTEM_CURSOR_MOVE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_MOVE = SDL_SystemCursor 9
+
+-- | Not permitted. Usually a slashed circle or crossbones.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_NOT_ALLOWED@, defined at @SDL3\/SDL_mouse.h 109:5@
+pattern SDL_SYSTEM_CURSOR_NOT_ALLOWED :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_NOT_ALLOWED = SDL_SystemCursor 10
+
+-- | Pointer that indicates a link. Usually a pointing hand.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_POINTER@, defined at @SDL3\/SDL_mouse.h 110:5@
+pattern SDL_SYSTEM_CURSOR_POINTER :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_POINTER = SDL_SystemCursor 11
+
+-- | Window resize top-left. This may be a single arrow or a double arrow like NWSE_RESIZE.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_NW_RESIZE@, defined at @SDL3\/SDL_mouse.h 111:5@
+pattern SDL_SYSTEM_CURSOR_NW_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_NW_RESIZE = SDL_SystemCursor 12
+
+-- | Window resize top. May be NS_RESIZE.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_N_RESIZE@, defined at @SDL3\/SDL_mouse.h 112:5@
+pattern SDL_SYSTEM_CURSOR_N_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_N_RESIZE = SDL_SystemCursor 13
+
+-- | Window resize top-right. May be NESW_RESIZE.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_NE_RESIZE@, defined at @SDL3\/SDL_mouse.h 113:5@
+pattern SDL_SYSTEM_CURSOR_NE_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_NE_RESIZE = SDL_SystemCursor 14
+
+-- | Window resize right. May be EW_RESIZE.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_E_RESIZE@, defined at @SDL3\/SDL_mouse.h 114:5@
+pattern SDL_SYSTEM_CURSOR_E_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_E_RESIZE = SDL_SystemCursor 15
+
+-- | Window resize bottom-right. May be NWSE_RESIZE.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_SE_RESIZE@, defined at @SDL3\/SDL_mouse.h 115:5@
+pattern SDL_SYSTEM_CURSOR_SE_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_SE_RESIZE = SDL_SystemCursor 16
+
+-- | Window resize bottom. May be NS_RESIZE.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_S_RESIZE@, defined at @SDL3\/SDL_mouse.h 116:5@
+pattern SDL_SYSTEM_CURSOR_S_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_S_RESIZE = SDL_SystemCursor 17
+
+-- | Window resize bottom-left. May be NESW_RESIZE.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_SW_RESIZE@, defined at @SDL3\/SDL_mouse.h 117:5@
+pattern SDL_SYSTEM_CURSOR_SW_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_SW_RESIZE = SDL_SystemCursor 18
+
+-- | Window resize left. May be EW_RESIZE.
+--
+--     [C declaration]: @SDL_SYSTEM_CURSOR_W_RESIZE@, defined at @SDL3\/SDL_mouse.h 118:5@
+pattern SDL_SYSTEM_CURSOR_W_RESIZE :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_W_RESIZE = SDL_SystemCursor 19
+
+-- | [C declaration]: @SDL_SYSTEM_CURSOR_COUNT@, defined at @SDL3\/SDL_mouse.h 119:5@
+pattern SDL_SYSTEM_CURSOR_COUNT :: SDL_SystemCursor
+pattern SDL_SYSTEM_CURSOR_COUNT = SDL_SystemCursor 20
+
+-- | Scroll direction types for the Scroll event
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_MouseWheelDirection@, defined at @SDL3\/SDL_mouse.h 127:14@
+newtype SDL_MouseWheelDirection = SDL_MouseWheelDirection
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_MouseWheelDirection where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_MouseWheelDirection where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MouseWheelDirection
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_MouseWheelDirection where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MouseWheelDirection unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_MouseWheelDirection
+  instance
+    BG.Storable SDL_MouseWheelDirection
+
+deriving via BG.CUInt instance BG.Prim SDL_MouseWheelDirection
+
+instance CEnum.CEnum SDL_MouseWheelDirection where
+  type CEnumZ SDL_MouseWheelDirection = BG.CUInt
+
+  toCEnum = SDL_MouseWheelDirection
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_MOUSEWHEEL_NORMAL")
+        , (1, BG.singleton "SDL_MOUSEWHEEL_FLIPPED")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_MouseWheelDirection"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_MouseWheelDirection"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_MouseWheelDirection where
+  minDeclaredValue = SDL_MOUSEWHEEL_NORMAL
+
+  maxDeclaredValue = SDL_MOUSEWHEEL_FLIPPED
+
+instance Show SDL_MouseWheelDirection where
+  showsPrec = CEnum.shows
+
+instance Read SDL_MouseWheelDirection where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_MouseWheelDirection ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseWheelDirection{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_MouseWheelDirection) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MouseWheelDirection "unwrap" where
+  type
+    CFieldType SDL_MouseWheelDirection "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The scroll direction is normal
+--
+--     [C declaration]: @SDL_MOUSEWHEEL_NORMAL@, defined at @SDL3\/SDL_mouse.h 129:5@
+pattern SDL_MOUSEWHEEL_NORMAL :: SDL_MouseWheelDirection
+pattern SDL_MOUSEWHEEL_NORMAL = SDL_MouseWheelDirection 0
+
+-- | The scroll direction is flipped \/ natural
+--
+--     [C declaration]: @SDL_MOUSEWHEEL_FLIPPED@, defined at @SDL3\/SDL_mouse.h 130:5@
+pattern SDL_MOUSEWHEEL_FLIPPED :: SDL_MouseWheelDirection
+pattern SDL_MOUSEWHEEL_FLIPPED = SDL_MouseWheelDirection 1
+
+-- | Animated cursor frame info.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @struct SDL_CursorFrameInfo@, defined at @SDL3\/SDL_mouse.h 138:16@
+data SDL_CursorFrameInfo = SDL_CursorFrameInfo
+  { surface :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^ The surface data for this frame
+  --
+  --          [C declaration]: @surface@, defined at @SDL3\/SDL_mouse.h 140:18@
+  , duration :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ The frame duration in milliseconds (a duration of 0 is infinite)
+  --
+  --          [C declaration]: @duration@, defined at @SDL3\/SDL_mouse.h 141:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_CursorFrameInfo where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_CursorFrameInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_CursorFrameInfo
+        <*> HasCField.readRaw (BG.Proxy @"surface") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"duration") ptr0
+
+instance Marshal.WriteRaw SDL_CursorFrameInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_CursorFrameInfo surface2 duration3 ->
+            HasCField.writeRaw (BG.Proxy @"surface") ptr0 surface2
+              >> HasCField.writeRaw (BG.Proxy @"duration") ptr0 duration3
+
+deriving via Marshal.EquivStorable SDL_CursorFrameInfo instance BG.Storable SDL_CursorFrameInfo
+
+instance
+  (ty ~ BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+  => BG.CompatHasField.HasField "surface" SDL_CursorFrameInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CursorFrameInfo{surface = y1, duration = BG.getField @"duration" x0}
+      , BG.getField @"surface" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+  => BG.HasField "surface" (BG.Ptr SDL_CursorFrameInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"surface")
+
+instance HasCField.HasCField SDL_CursorFrameInfo "surface" where
+  type
+    CFieldType SDL_CursorFrameInfo "surface" =
+      BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "duration" SDL_CursorFrameInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CursorFrameInfo{duration = y1, surface = BG.getField @"surface" x0}
+      , BG.getField @"duration" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "duration" (BG.Ptr SDL_CursorFrameInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"duration")
+
+instance HasCField.HasCField SDL_CursorFrameInfo "duration" where
+  type
+    CFieldType SDL_CursorFrameInfo "duration" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+-- | A bitmask of pressed mouse buttons, as reported by SDL_GetMouseState, etc.
+--
+--     * Button 1: Left mouse button
+--
+--     * Button 2: Middle mouse button
+--
+--     * Button 3: Right mouse button
+--
+--     * Button 4: Side mouse button 1
+--
+--     * Button 5: Side mouse button 2
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMouseState', 'sDL_GetGlobalMouseState', 'sDL_GetRelativeMouseState'
+--
+--     [C declaration]: @SDL_MouseButtonFlags@, defined at @SDL3\/SDL_mouse.h 159:16@
+newtype SDL_MouseButtonFlags = SDL_MouseButtonFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_MouseButtonFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseButtonFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_MouseButtonFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MouseButtonFlags "unwrap" where
+  type
+    CFieldType SDL_MouseButtonFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @macro SDL_BUTTON_LEFT@, defined at @SDL3\/SDL_mouse.h 161:9@
+sDL_BUTTON_LEFT :: BG.CInt
+sDL_BUTTON_LEFT = (1 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_BUTTON_MIDDLE@, defined at @SDL3\/SDL_mouse.h 162:9@
+sDL_BUTTON_MIDDLE :: BG.CInt
+sDL_BUTTON_MIDDLE = (2 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_BUTTON_RIGHT@, defined at @SDL3\/SDL_mouse.h 163:9@
+sDL_BUTTON_RIGHT :: BG.CInt
+sDL_BUTTON_RIGHT = (3 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_BUTTON_X1@, defined at @SDL3\/SDL_mouse.h 164:9@
+sDL_BUTTON_X1 :: BG.CInt
+sDL_BUTTON_X1 = (4 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_BUTTON_X2@, defined at @SDL3\/SDL_mouse.h 165:9@
+sDL_BUTTON_X2 :: BG.CInt
+sDL_BUTTON_X2 = (5 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_BUTTON_MASK@, defined at @SDL3\/SDL_mouse.h 167:9@
+sDL_BUTTON_MASK
+  :: forall a0
+   . (C.Expr.HostPlatform.Sub a0 BG.CInt)
+  => (C.Expr.HostPlatform.Shift BG.CUInt (C.Expr.HostPlatform.SubRes a0 BG.CInt))
+  => a0 -> BG.CUInt
+sDL_BUTTON_MASK =
+  \x0 ->
+    (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) ((C.Expr.HostPlatform.-) x0 (1 :: BG.CInt))
+
+-- | [C declaration]: @macro SDL_BUTTON_LMASK@, defined at @SDL3\/SDL_mouse.h 168:9@
+sDL_BUTTON_LMASK :: BG.CUInt
+sDL_BUTTON_LMASK = sDL_BUTTON_MASK sDL_BUTTON_LEFT
+
+-- | [C declaration]: @macro SDL_BUTTON_MMASK@, defined at @SDL3\/SDL_mouse.h 169:9@
+sDL_BUTTON_MMASK :: BG.CUInt
+sDL_BUTTON_MMASK = sDL_BUTTON_MASK sDL_BUTTON_MIDDLE
+
+-- | [C declaration]: @macro SDL_BUTTON_RMASK@, defined at @SDL3\/SDL_mouse.h 170:9@
+sDL_BUTTON_RMASK :: BG.CUInt
+sDL_BUTTON_RMASK = sDL_BUTTON_MASK sDL_BUTTON_RIGHT
+
+-- | [C declaration]: @macro SDL_BUTTON_X1MASK@, defined at @SDL3\/SDL_mouse.h 171:9@
+sDL_BUTTON_X1MASK :: BG.CUInt
+sDL_BUTTON_X1MASK = sDL_BUTTON_MASK sDL_BUTTON_X1
+
+-- | [C declaration]: @macro SDL_BUTTON_X2MASK@, defined at @SDL3\/SDL_mouse.h 172:9@
+sDL_BUTTON_X2MASK :: BG.CUInt
+sDL_BUTTON_X2MASK = sDL_BUTTON_MASK sDL_BUTTON_X2
+
+-- | Auxiliary type used by 'SDL_MouseMotionTransformCallback'
+--
+--     [C declaration]: @SDL_MouseMotionTransformCallback@, defined at @SDL3\/SDL_mouse.h 205:24@
+newtype SDL_MouseMotionTransformCallback_Aux = SDL_MouseMotionTransformCallback_Aux
+  { unwrap
+      :: BG.Ptr BG.Void
+      -> SDL3.Sys.Bindgen.Stdinc.Uint64
+      -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+      -> SDL_MouseID
+      -> BG.Ptr BG.CFloat
+      -> BG.Ptr BG.CFloat
+      -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_MouseMotionTransformCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_3e4a2d15fbbe81d6_base
+    :: ( BG.Ptr BG.Void
+         -> BG.Word64
+         -> BG.Ptr BG.Void
+         -> BG.Word32
+         -> BG.Ptr BG.Void
+         -> BG.Ptr BG.Void
+         -> IO ()
+       )
+    -> IO
+         ( BG.FunPtr
+             ( BG.Ptr BG.Void
+               -> BG.Word64
+               -> BG.Ptr BG.Void
+               -> BG.Word32
+               -> BG.Ptr BG.Void
+               -> BG.Ptr BG.Void
+               -> IO ()
+             )
+         )
+
+-- __unique:__ @toSDL_MouseMotionTransformCallback_Aux@
+hs_bindgen_3e4a2d15fbbe81d6
+  :: SDL_MouseMotionTransformCallback_Aux
+  -> IO (BG.FunPtr SDL_MouseMotionTransformCallback_Aux)
+hs_bindgen_3e4a2d15fbbe81d6 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_3e4a2d15fbbe81d6_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_MouseMotionTransformCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_97a29d76d0ffd06f_base
+    :: BG.FunPtr
+         ( BG.Ptr BG.Void
+           -> BG.Word64
+           -> BG.Ptr BG.Void
+           -> BG.Word32
+           -> BG.Ptr BG.Void
+           -> BG.Ptr BG.Void
+           -> IO ()
+         )
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @fromSDL_MouseMotionTransformCallback_Aux@
+hs_bindgen_97a29d76d0ffd06f
+  :: BG.FunPtr SDL_MouseMotionTransformCallback_Aux
+  -> SDL_MouseMotionTransformCallback_Aux
+hs_bindgen_97a29d76d0ffd06f =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_97a29d76d0ffd06f_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_MouseMotionTransformCallback_Aux where
+  toFunPtr = hs_bindgen_3e4a2d15fbbe81d6
+
+instance BG.FromFunPtr SDL_MouseMotionTransformCallback_Aux where
+  fromFunPtr = hs_bindgen_97a29d76d0ffd06f
+
+instance
+  ( ty
+      ~ ( BG.Ptr BG.Void
+          -> SDL3.Sys.Bindgen.Stdinc.Uint64
+          -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+          -> SDL_MouseID
+          -> BG.Ptr BG.CFloat
+          -> BG.Ptr BG.CFloat
+          -> IO ()
+        )
+  )
+  => BG.CompatHasField.HasField "unwrap" SDL_MouseMotionTransformCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionTransformCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  ( ty
+      ~ ( BG.Ptr BG.Void
+          -> SDL3.Sys.Bindgen.Stdinc.Uint64
+          -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+          -> SDL_MouseID
+          -> BG.Ptr BG.CFloat
+          -> BG.Ptr BG.CFloat
+          -> IO ()
+        )
+  )
+  => BG.HasField "unwrap" (BG.Ptr SDL_MouseMotionTransformCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MouseMotionTransformCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_MouseMotionTransformCallback_Aux "unwrap" =
+      BG.Ptr BG.Void
+      -> SDL3.Sys.Bindgen.Stdinc.Uint64
+      -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+      -> SDL_MouseID
+      -> BG.Ptr BG.CFloat
+      -> BG.Ptr BG.CFloat
+      -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback used to transform mouse motion delta from raw values.
+--
+--     This is called during SDL\'s handling of platform mouse events to scale the values of the resulting motion delta.
+--
+--     [@userdata@]: what was passed as @userdata@ to @SDL_SetRelativeMouseTransform()@.
+--
+--     [@timestamp@]: the associated time at which this mouse motion event was received.
+--
+--     [@window@]: the associated window to which this mouse motion event was addressed.
+--
+--     [@mouseID@]: the associated mouse from which this mouse motion event was emitted.
+--
+--     [@x@]: pointer to a variable that will be treated as the resulting x-axis motion.
+--
+--     [@y@]: pointer to a variable that will be treated as the resulting y-axis motion.
+--
+--     [Thread safety]: This callback is called by SDL\'s internal mouse input processing procedure, which may be a thread separate from the main event loop that is run at realtime priority. Stalling this thread with too much work in the callback can therefore potentially freeze the entire system. Care should be taken with proper synchronization practices when adding other side effects beyond mutation of the x and y values.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetRelativeMouseTransform'
+--
+--     [C declaration]: @SDL_MouseMotionTransformCallback@, defined at @SDL3\/SDL_mouse.h 205:24@
+newtype SDL_MouseMotionTransformCallback = SDL_MouseMotionTransformCallback
+  { unwrap :: BG.FunPtr SDL_MouseMotionTransformCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_MouseMotionTransformCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_MouseMotionTransformCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MouseMotionTransformCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_MouseMotionTransformCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_MouseMotionTransformCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MouseMotionTransformCallback "unwrap" where
+  type
+    CFieldType SDL_MouseMotionTransformCallback "unwrap" =
+      BG.FunPtr SDL_MouseMotionTransformCallback_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Mouse/FunPtr.hs b/src/SDL3/Sys/Bindgen/Mouse/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Mouse/FunPtr.hs
@@ -0,0 +1,1108 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Mouse.FunPtr (
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_HasMouse,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_GetMice,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_GetMouseNameForID,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_GetMouseFocus,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_GetMouseState,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_GetGlobalMouseState,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_GetRelativeMouseState,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_WarpMouseInWindow,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_WarpMouseGlobal,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_SetRelativeMouseTransform,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_SetWindowRelativeMouseMode,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_GetWindowRelativeMouseMode,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_CaptureMouse,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_CreateCursor,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_CreateColorCursor,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_CreateAnimatedCursor,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_CreateSystemCursor,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_SetCursor,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_GetCursor,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_GetDefaultCursor,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_DestroyCursor,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_ShowCursor,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_HideCursor,
+  SDL3.Sys.Bindgen.Mouse.FunPtr.sDL_CursorVisible,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Mouse
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_mouse.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_HasMouse */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_808ad945705f4e48 (void)) (void)"
+         , "{"
+         , "  return &SDL_HasMouse;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMice */"
+         , "__attribute__ ((const))"
+         , "SDL_MouseID *(*hs_bindgen_ebefa78305745bc0 (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetMice;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMouseNameForID */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_cd3906ba4b6319e7 (void)) ("
+         , "  SDL_MouseID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetMouseNameForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMouseFocus */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_b1cca0ecf584dbce (void)) (void)"
+         , "{"
+         , "  return &SDL_GetMouseFocus;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMouseState */"
+         , "__attribute__ ((const))"
+         , "SDL_MouseButtonFlags (*hs_bindgen_cd78db7ca1b4380a (void)) ("
+         , "  float *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetMouseState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetGlobalMouseState */"
+         , "__attribute__ ((const))"
+         , "SDL_MouseButtonFlags (*hs_bindgen_8ad222945a494193 (void)) ("
+         , "  float *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetGlobalMouseState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetRelativeMouseState */"
+         , "__attribute__ ((const))"
+         , "SDL_MouseButtonFlags (*hs_bindgen_c09b770b28617678 (void)) ("
+         , "  float *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRelativeMouseState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_WarpMouseInWindow */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_e0aa89262c23f11d (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_WarpMouseInWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_WarpMouseGlobal */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a6c8da14823bf99f (void)) ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WarpMouseGlobal;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_CursorFrameInfo SDL_CursorFrameInfo;"
+         , "typedef void *SDL_MouseMotionTransformCallback;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_SetRelativeMouseTransform */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e75ba6290fb7b58a (void)) ("
+         , "  SDL_MouseMotionTransformCallback arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SetRelativeMouseTransform;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetRelativeMouseTransform requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_SetWindowRelativeMouseMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_5b077ae9a298496b (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowRelativeMouseMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetWindowRelativeMouseMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_46446683507069cd (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowRelativeMouseMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CaptureMouse */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a6ebcff1379c54e6 (void)) ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CaptureMouse;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateCursor */"
+         , "__attribute__ ((const))"
+         , "SDL_Cursor *(*hs_bindgen_3f017d38c4a98259 (void)) ("
+         , "  Uint8 const *arg1,"
+         , "  Uint8 const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5,"
+         , "  signed int arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateCursor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateColorCursor */"
+         , "__attribute__ ((const))"
+         , "SDL_Cursor *(*hs_bindgen_9741ddd9d73dea35 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateColorCursor;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_CursorFrameInfo SDL_CursorFrameInfo;"
+         , "typedef void *SDL_MouseMotionTransformCallback;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateAnimatedCursor */"
+         , "__attribute__ ((const))"
+         , "SDL_Cursor *(*hs_bindgen_5a53bab7f1d0dd41 (void)) ("
+         , "  SDL_CursorFrameInfo *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_CreateAnimatedCursor;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_CreateAnimatedCursor requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateSystemCursor */"
+         , "__attribute__ ((const))"
+         , "SDL_Cursor *(*hs_bindgen_98115455fed12c20 (void)) ("
+         , "  SDL_SystemCursor arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateSystemCursor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_SetCursor */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7f9d9e943410eac0 (void)) ("
+         , "  SDL_Cursor *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SetCursor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetCursor */"
+         , "__attribute__ ((const))"
+         , "SDL_Cursor *(*hs_bindgen_ddffa3c703f2160c (void)) (void)"
+         , "{"
+         , "  return &SDL_GetCursor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetDefaultCursor */"
+         , "__attribute__ ((const))"
+         , "SDL_Cursor *(*hs_bindgen_3cea96283579f3f7 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetDefaultCursor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_DestroyCursor */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_cccc019b7e8bc17b (void)) ("
+         , "  SDL_Cursor *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyCursor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_ShowCursor */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fa1d352535cdb7a2 (void)) (void)"
+         , "{"
+         , "  return &SDL_ShowCursor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_HideCursor */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d90c7f4cd007f484 (void)) (void)"
+         , "{"
+         , "  return &SDL_HideCursor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CursorVisible */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7ae5464b38889e15 (void)) (void)"
+         , "{"
+         , "  return &SDL_CursorVisible;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_HasMouse@
+foreign import ccall unsafe "hs_bindgen_808ad945705f4e48"
+  hs_bindgen_808ad945705f4e48_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_HasMouse@
+hs_bindgen_808ad945705f4e48 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_808ad945705f4e48 =
+  BG.fromFFIType hs_bindgen_808ad945705f4e48_base
+
+{-# NOINLINE sDL_HasMouse #-}
+
+-- | Return whether a mouse is currently connected.
+--
+--     [Returns]: true if a mouse is connected, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMice'
+--
+--     [C declaration]: @SDL_HasMouse@, defined at @SDL3\/SDL_mouse.h 226:34@
+sDL_HasMouse :: BG.FunPtr (IO BG.CBool)
+sDL_HasMouse =
+  BG.unsafePerformIO hs_bindgen_808ad945705f4e48
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMice@
+foreign import ccall unsafe "hs_bindgen_ebefa78305745bc0"
+  hs_bindgen_ebefa78305745bc0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMice@
+hs_bindgen_ebefa78305745bc0 :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_MouseID)))
+hs_bindgen_ebefa78305745bc0 =
+  BG.fromFFIType hs_bindgen_ebefa78305745bc0_base
+
+{-# NOINLINE sDL_GetMice #-}
+
+-- | Get a list of currently connected mice.
+--
+--     Note that this will include any device or virtual driver that includes mouse functionality, including some game controllers, KVM switches, etc. You should wait for input from a device before you consider it actively in use.
+--
+--     [@count@]: a pointer filled in with the number of mice returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of mouse instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMouseNameForID', 'sDL_HasMouse'
+--
+--     [C declaration]: @SDL_GetMice@, defined at @SDL3\/SDL_mouse.h 249:43@
+sDL_GetMice :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_MouseID))
+sDL_GetMice =
+  BG.unsafePerformIO hs_bindgen_ebefa78305745bc0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMouseNameForID@
+foreign import ccall unsafe "hs_bindgen_cd3906ba4b6319e7"
+  hs_bindgen_cd3906ba4b6319e7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMouseNameForID@
+hs_bindgen_cd3906ba4b6319e7 :: IO (BG.FunPtr (SDL_MouseID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_cd3906ba4b6319e7 =
+  BG.fromFFIType hs_bindgen_cd3906ba4b6319e7_base
+
+{-# NOINLINE sDL_GetMouseNameForID #-}
+
+-- | Get the name of a mouse.
+--
+--     This function returns \"\" if the mouse doesn\'t have a name.
+--
+--     [@instance_id@]: the mouse instance ID.
+--
+--     [Returns]: the name of the selected mouse, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMice'
+--
+--     [C declaration]: @SDL_GetMouseNameForID@, defined at @SDL3\/SDL_mouse.h 266:42@
+sDL_GetMouseNameForID :: BG.FunPtr (SDL_MouseID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetMouseNameForID =
+  BG.unsafePerformIO hs_bindgen_cd3906ba4b6319e7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMouseFocus@
+foreign import ccall unsafe "hs_bindgen_b1cca0ecf584dbce"
+  hs_bindgen_b1cca0ecf584dbce_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMouseFocus@
+hs_bindgen_b1cca0ecf584dbce :: IO (BG.FunPtr (IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)))
+hs_bindgen_b1cca0ecf584dbce =
+  BG.fromFFIType hs_bindgen_b1cca0ecf584dbce_base
+
+{-# NOINLINE sDL_GetMouseFocus #-}
+
+-- | Get the window which currently has mouse focus.
+--
+--     [Returns]: the window with mouse focus.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetMouseFocus@, defined at @SDL3\/SDL_mouse.h 277:42@
+sDL_GetMouseFocus :: BG.FunPtr (IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window))
+sDL_GetMouseFocus =
+  BG.unsafePerformIO hs_bindgen_b1cca0ecf584dbce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMouseState@
+foreign import ccall unsafe "hs_bindgen_cd78db7ca1b4380a"
+  hs_bindgen_cd78db7ca1b4380a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetMouseState@
+hs_bindgen_cd78db7ca1b4380a
+  :: IO (BG.FunPtr (BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO SDL_MouseButtonFlags))
+hs_bindgen_cd78db7ca1b4380a =
+  BG.fromFFIType hs_bindgen_cd78db7ca1b4380a_base
+
+{-# NOINLINE sDL_GetMouseState #-}
+
+-- | Query SDL\'s cache for the synchronous mouse button state and the window-relative SDL-cursor position.
+--
+--     This function returns the cached synchronous state as SDL understands it from the last pump of the event queue.
+--
+--     To query the platform for immediate asynchronous state, use SDL_GetGlobalMouseState.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y coordinates relative to the focused window.
+--
+--     In Relative Mode, the SDL-cursor\'s position usually contradicts the platform-cursor\'s position as manually calculated from @SDL_GetGlobalMouseState()@ and SDL_GetWindowPosition.
+--
+--     [@x@]: a pointer to receive the SDL-cursor\'s x-position from the focused window\'s top left corner, can be NULL if unused.
+--
+--     [@y@]: a pointer to receive the SDL-cursor\'s y-position from the focused window\'s top left corner, can be NULL if unused.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGlobalMouseState', 'sDL_GetRelativeMouseState'
+--
+--     [C declaration]: @SDL_GetMouseState@, defined at @SDL3\/SDL_mouse.h 310:50@
+sDL_GetMouseState :: BG.FunPtr (BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO SDL_MouseButtonFlags)
+sDL_GetMouseState =
+  BG.unsafePerformIO hs_bindgen_cd78db7ca1b4380a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetGlobalMouseState@
+foreign import ccall unsafe "hs_bindgen_8ad222945a494193"
+  hs_bindgen_8ad222945a494193_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetGlobalMouseState@
+hs_bindgen_8ad222945a494193
+  :: IO (BG.FunPtr (BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO SDL_MouseButtonFlags))
+hs_bindgen_8ad222945a494193 =
+  BG.fromFFIType hs_bindgen_8ad222945a494193_base
+
+{-# NOINLINE sDL_GetGlobalMouseState #-}
+
+-- | Query the platform for the asynchronous mouse button state and the desktop-relative platform-cursor position.
+--
+--     This function immediately queries the platform for the most recent asynchronous state, more costly than retrieving SDL\'s cached state in @SDL_GetMouseState()@.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y coordinates relative to the desktop.
+--
+--     In Relative Mode, the platform-cursor\'s position usually contradicts the SDL-cursor\'s position as manually calculated from @SDL_GetMouseState()@ and SDL_GetWindowPosition.
+--
+--     This function can be useful if you need to track the mouse outside of a specific window and @SDL_CaptureMouse()@ doesn\'t fit your needs. For example, it could be useful if you need to track the mouse while dragging a window, where coordinates relative to a window might not be in sync at all times.
+--
+--     [@x@]: a pointer to receive the platform-cursor\'s x-position from the desktop\'s top left corner, can be NULL if unused.
+--
+--     [@y@]: a pointer to receive the platform-cursor\'s y-position from the desktop\'s top left corner, can be NULL if unused.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CaptureMouse', 'sDL_GetMouseState', 'sDL_GetGlobalMouseState'
+--
+--     [C declaration]: @SDL_GetGlobalMouseState@, defined at @SDL3\/SDL_mouse.h 347:50@
+sDL_GetGlobalMouseState
+  :: BG.FunPtr (BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO SDL_MouseButtonFlags)
+sDL_GetGlobalMouseState =
+  BG.unsafePerformIO hs_bindgen_8ad222945a494193
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetRelativeMouseState@
+foreign import ccall unsafe "hs_bindgen_c09b770b28617678"
+  hs_bindgen_c09b770b28617678_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetRelativeMouseState@
+hs_bindgen_c09b770b28617678
+  :: IO (BG.FunPtr (BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO SDL_MouseButtonFlags))
+hs_bindgen_c09b770b28617678 =
+  BG.fromFFIType hs_bindgen_c09b770b28617678_base
+
+{-# NOINLINE sDL_GetRelativeMouseState #-}
+
+-- | Query SDL\'s cache for the synchronous mouse button state and accumulated mouse delta since last call.
+--
+--     This function returns the cached synchronous state as SDL understands it from the last pump of the event queue.
+--
+--     To query the platform for immediate asynchronous state, use SDL_GetGlobalMouseState.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y deltas accumulated since the last call to this function (or since event initialization).
+--
+--     This function is useful for reducing overhead by processing relative mouse inputs in one go per-frame instead of individually per-event, at the expense of losing the order between events within the frame (e.g. quickly pressing and releasing a button within the same frame).
+--
+--     [@x@]: a pointer to receive the x mouse delta accumulated since last call, can be NULL if unused.
+--
+--     [@y@]: a pointer to receive the y mouse delta accumulated since last call, can be NULL if unused.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMouseState', 'sDL_GetGlobalMouseState'
+--
+--     [C declaration]: @SDL_GetRelativeMouseState@, defined at @SDL3\/SDL_mouse.h 382:50@
+sDL_GetRelativeMouseState
+  :: BG.FunPtr (BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO SDL_MouseButtonFlags)
+sDL_GetRelativeMouseState =
+  BG.unsafePerformIO hs_bindgen_c09b770b28617678
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_WarpMouseInWindow@
+foreign import ccall unsafe "hs_bindgen_e0aa89262c23f11d"
+  hs_bindgen_e0aa89262c23f11d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_WarpMouseInWindow@
+hs_bindgen_e0aa89262c23f11d
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> BG.CFloat -> BG.CFloat -> IO ()))
+hs_bindgen_e0aa89262c23f11d =
+  BG.fromFFIType hs_bindgen_e0aa89262c23f11d_base
+
+{-# NOINLINE sDL_WarpMouseInWindow #-}
+
+-- | Move the mouse cursor to the given position within the window.
+--
+--     This function generates a mouse motion event if relative mode is not enabled. If relative mode is enabled, you can force mouse events for the warp by setting the SDL_HINT_MOUSE_RELATIVE_WARP_MOTION hint.
+--
+--     Note that this function will appear to succeed, but not actually move the mouse when used over Microsoft Remote Desktop.
+--
+--     [@window@]: the window to move the mouse into, or NULL for the current mouse focus.
+--
+--     [@x@]: the x coordinate within the window.
+--
+--     [@y@]: the y coordinate within the window.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WarpMouseGlobal'
+--
+--     [C declaration]: @SDL_WarpMouseInWindow@, defined at @SDL3\/SDL_mouse.h 405:34@
+sDL_WarpMouseInWindow
+  :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> BG.CFloat -> BG.CFloat -> IO ())
+sDL_WarpMouseInWindow =
+  BG.unsafePerformIO hs_bindgen_e0aa89262c23f11d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_WarpMouseGlobal@
+foreign import ccall unsafe "hs_bindgen_a6c8da14823bf99f"
+  hs_bindgen_a6c8da14823bf99f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_WarpMouseGlobal@
+hs_bindgen_a6c8da14823bf99f :: IO (BG.FunPtr (BG.CFloat -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_a6c8da14823bf99f =
+  BG.fromFFIType hs_bindgen_a6c8da14823bf99f_base
+
+{-# NOINLINE sDL_WarpMouseGlobal #-}
+
+-- | Move the mouse to the given position in global screen space.
+--
+--     This function generates a mouse motion event.
+--
+--     A failure of this function usually means that it is unsupported by a platform.
+--
+--     Note that this function will appear to succeed, but not actually move the mouse when used over Microsoft Remote Desktop.
+--
+--     [@x@]: the x coordinate.
+--
+--     [@y@]: the y coordinate.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WarpMouseInWindow'
+--
+--     [C declaration]: @SDL_WarpMouseGlobal@, defined at @SDL3\/SDL_mouse.h 430:34@
+sDL_WarpMouseGlobal :: BG.FunPtr (BG.CFloat -> BG.CFloat -> IO BG.CBool)
+sDL_WarpMouseGlobal =
+  BG.unsafePerformIO hs_bindgen_a6c8da14823bf99f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_SetRelativeMouseTransform@
+foreign import ccall unsafe "hs_bindgen_e75ba6290fb7b58a"
+  hs_bindgen_e75ba6290fb7b58a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_SetRelativeMouseTransform@
+hs_bindgen_e75ba6290fb7b58a
+  :: IO (BG.FunPtr (SDL_MouseMotionTransformCallback -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_e75ba6290fb7b58a =
+  BG.fromFFIType hs_bindgen_e75ba6290fb7b58a_base
+
+{-# NOINLINE sDL_SetRelativeMouseTransform #-}
+
+-- | Set a user-defined function by which to transform relative mouse inputs.
+--
+--     This overrides the relative system scale and relative speed scale hints. Should be called prior to enabling relative mouse mode, fails otherwise.
+--
+--     [@callback@]: a callback used to transform relative mouse motion, or NULL for default behavior.
+--
+--     [@userdata@]: a pointer that will be passed to @callback@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetRelativeMouseTransform@, defined at @SDL3\/SDL_mouse.h 448:34@
+sDL_SetRelativeMouseTransform
+  :: BG.FunPtr (SDL_MouseMotionTransformCallback -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_SetRelativeMouseTransform =
+  BG.unsafePerformIO hs_bindgen_e75ba6290fb7b58a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_SetWindowRelativeMouseMode@
+foreign import ccall unsafe "hs_bindgen_5b077ae9a298496b"
+  hs_bindgen_5b077ae9a298496b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_SetWindowRelativeMouseMode@
+hs_bindgen_5b077ae9a298496b
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> BG.CBool -> IO BG.CBool))
+hs_bindgen_5b077ae9a298496b =
+  BG.fromFFIType hs_bindgen_5b077ae9a298496b_base
+
+{-# NOINLINE sDL_SetWindowRelativeMouseMode #-}
+
+-- | Set relative mouse mode for a window.
+--
+--     While the window has focus and relative mouse mode is enabled, the cursor is hidden, the mouse position is constrained to the window, and SDL will report continuous relative mouse motion even if the mouse is at the edge of the window.
+--
+--     If you\'d like to keep the mouse position fixed while in relative mode you can use SDL_SetWindowMouseRect(). If you\'d like the cursor to be at a specific location when relative mode ends, you should use @SDL_WarpMouseInWindow()@ before disabling relative mode.
+--
+--     This function will flush any pending mouse motion for this window.
+--
+--     [@window@]: the window to change.
+--
+--     [@enabled@]: true to enable relative mode, false to disable.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowRelativeMouseMode'
+--
+--     [C declaration]: @SDL_SetWindowRelativeMouseMode@, defined at @SDL3\/SDL_mouse.h 476:34@
+sDL_SetWindowRelativeMouseMode
+  :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> BG.CBool -> IO BG.CBool)
+sDL_SetWindowRelativeMouseMode =
+  BG.unsafePerformIO hs_bindgen_5b077ae9a298496b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetWindowRelativeMouseMode@
+foreign import ccall unsafe "hs_bindgen_46446683507069cd"
+  hs_bindgen_46446683507069cd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetWindowRelativeMouseMode@
+hs_bindgen_46446683507069cd
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool))
+hs_bindgen_46446683507069cd =
+  BG.fromFFIType hs_bindgen_46446683507069cd_base
+
+{-# NOINLINE sDL_GetWindowRelativeMouseMode #-}
+
+-- | Query whether relative mouse mode is enabled for a window.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: true if relative mode is enabled for a window or false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowRelativeMouseMode'
+--
+--     [C declaration]: @SDL_GetWindowRelativeMouseMode@, defined at @SDL3\/SDL_mouse.h 490:34@
+sDL_GetWindowRelativeMouseMode
+  :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO BG.CBool)
+sDL_GetWindowRelativeMouseMode =
+  BG.unsafePerformIO hs_bindgen_46446683507069cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CaptureMouse@
+foreign import ccall unsafe "hs_bindgen_a6ebcff1379c54e6"
+  hs_bindgen_a6ebcff1379c54e6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CaptureMouse@
+hs_bindgen_a6ebcff1379c54e6 :: IO (BG.FunPtr (BG.CBool -> IO BG.CBool))
+hs_bindgen_a6ebcff1379c54e6 =
+  BG.fromFFIType hs_bindgen_a6ebcff1379c54e6_base
+
+{-# NOINLINE sDL_CaptureMouse #-}
+
+-- | Capture the mouse and to track input outside an SDL window.
+--
+--     Capturing enables your app to obtain mouse events globally, instead of just within your window. Not all video targets support this function. When capturing is enabled, the current window will get all mouse events, but unlike relative mode, no change is made to the cursor and it is not restrained to your window.
+--
+--     This function may also deny mouse input to other windows both those in your application and others on the system so you should use this function sparingly, and in small bursts. For example, you might want to track the mouse while the user is dragging something, until the user releases a mouse button. It is not recommended that you capture the mouse for long periods of time, such as the entire time your app is running. For that, you should probably use @SDL_SetWindowRelativeMouseMode()@ or SDL_SetWindowMouseGrab(), depending on your goals.
+--
+--     While captured, mouse events still report coordinates relative to the current (foreground) window, but those coordinates may be outside the bounds of the window (including negative values). Capturing is only allowed for the foreground window. If the window loses focus while capturing, the capture will be disabled automatically.
+--
+--     While capturing is enabled, the current window will have the @SDL_WINDOW_MOUSE_CAPTURE@ flag set.
+--
+--     Please note that SDL will attempt to \"auto capture\" the mouse while the user is pressing a button; this is to try and make mouse behavior more consistent between platforms, and deal with the common case of a user dragging the mouse outside of the window. This means that if you are calling @SDL_CaptureMouse()@ only to deal with this situation, you do not have to (although it is safe to do so). If this causes problems for your app, you can disable auto capture by setting the @SDL_HINT_MOUSE_AUTO_CAPTURE@ hint to zero.
+--
+--     [@enabled@]: true to enable capturing, false to disable.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGlobalMouseState'
+--
+--     [C declaration]: @SDL_CaptureMouse@, defined at @SDL3\/SDL_mouse.h 538:34@
+sDL_CaptureMouse :: BG.FunPtr (BG.CBool -> IO BG.CBool)
+sDL_CaptureMouse =
+  BG.unsafePerformIO hs_bindgen_a6ebcff1379c54e6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateCursor@
+foreign import ccall unsafe "hs_bindgen_3f017d38c4a98259"
+  hs_bindgen_3f017d38c4a98259_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateCursor@
+hs_bindgen_3f017d38c4a98259
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.CInt
+             -> IO (BG.Ptr SDL_Cursor)
+           )
+       )
+hs_bindgen_3f017d38c4a98259 =
+  BG.fromFFIType hs_bindgen_3f017d38c4a98259_base
+
+{-# NOINLINE sDL_CreateCursor #-}
+
+-- | Create a cursor using the specified bitmap data and mask (in MSB format).
+--
+--     @mask@ has to be in MSB (Most Significant Bit) format.
+--
+--     The cursor width (@w@) must be a multiple of 8 bits.
+--
+--     The cursor is created in black and white according to the following:
+--
+--     * data=0, mask=1: white
+--
+--     * data=1, mask=1: black
+--
+--     * data=0, mask=0: transparent
+--
+--     * data=1, mask=0: inverted color if possible, black if not.
+--
+--     Cursors created with this function must be freed with @SDL_DestroyCursor()@.
+--
+--     If you want to have a color cursor, or create your cursor from an SDL_Surface, you should use @SDL_CreateColorCursor()@. Alternately, you can hide the cursor and draw your own as part of your game\'s rendering, but it will be bound to the framerate.
+--
+--     Also, @SDL_CreateSystemCursor()@ is available, which provides several readily-available system cursors to pick from.
+--
+--     [@data@]: the color value for each pixel of the cursor.
+--
+--     [@mask@]: the mask value for each pixel of the cursor.
+--
+--     [@w@]: the width of the cursor.
+--
+--     [@h@]: the height of the cursor.
+--
+--     [@hot_x@]: the x-axis offset from the left of the cursor image to the mouse x position, in the range of 0 to @w@ - 1.
+--
+--     [@hot_y@]: the y-axis offset from the top of the cursor image to the mouse y position, in the range of 0 to @h@ - 1.
+--
+--     [Returns]: a new cursor with the specified parameters on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAnimatedCursor', 'sDL_CreateColorCursor', 'sDL_CreateSystemCursor', 'sDL_DestroyCursor', 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_CreateCursor@, defined at @SDL3\/SDL_mouse.h 585:42@
+sDL_CreateCursor
+  :: BG.FunPtr
+       ( PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.CInt
+         -> IO (BG.Ptr SDL_Cursor)
+       )
+sDL_CreateCursor =
+  BG.unsafePerformIO hs_bindgen_3f017d38c4a98259
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateColorCursor@
+foreign import ccall unsafe "hs_bindgen_9741ddd9d73dea35"
+  hs_bindgen_9741ddd9d73dea35_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateColorCursor@
+hs_bindgen_9741ddd9d73dea35
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> BG.CInt -> BG.CInt -> IO (BG.Ptr SDL_Cursor))
+       )
+hs_bindgen_9741ddd9d73dea35 =
+  BG.fromFFIType hs_bindgen_9741ddd9d73dea35_base
+
+{-# NOINLINE sDL_CreateColorCursor #-}
+
+-- | Create a color cursor.
+--
+--     If this function is passed a surface with alternate representations added with SDL_AddSurfaceAlternateImage(), the surface will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations if SDL_HINT_MOUSE_DPI_SCALE_CURSORS is enabled. For example, if the original surface is 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     [@surface@]: an SDL_Surface structure representing the cursor image.
+--
+--     [@hot_x@]: the x position of the cursor hot spot.
+--
+--     [@hot_y@]: the y position of the cursor hot spot.
+--
+--     [Returns]: the new cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_AddSurfaceAlternateImage, 'sDL_CreateAnimatedCursor', 'sDL_CreateCursor', 'sDL_CreateSystemCursor', 'sDL_DestroyCursor', 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_CreateColorCursor@, defined at @SDL3\/SDL_mouse.h 622:42@
+sDL_CreateColorCursor
+  :: BG.FunPtr
+       (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> BG.CInt -> BG.CInt -> IO (BG.Ptr SDL_Cursor))
+sDL_CreateColorCursor =
+  BG.unsafePerformIO hs_bindgen_9741ddd9d73dea35
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateAnimatedCursor@
+foreign import ccall unsafe "hs_bindgen_5a53bab7f1d0dd41"
+  hs_bindgen_5a53bab7f1d0dd41_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateAnimatedCursor@
+hs_bindgen_5a53bab7f1d0dd41
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_CursorFrameInfo -> BG.CInt -> BG.CInt -> BG.CInt -> IO (BG.Ptr SDL_Cursor)))
+hs_bindgen_5a53bab7f1d0dd41 =
+  BG.fromFFIType hs_bindgen_5a53bab7f1d0dd41_base
+
+{-# NOINLINE sDL_CreateAnimatedCursor #-}
+
+-- | Create an animated color cursor.
+--
+--     Animated cursors are composed of a sequential array of frames, specified as surfaces and durations in an array of 'SDL_CursorFrameInfo' structs. The hot spot coordinates are universal to all frames, and all frames must have the same dimensions.
+--
+--     Frame durations are specified in milliseconds. A duration of 0 implies an infinite frame time, and the animation will stop on that frame. To create a one-shot animation, set the duration of the last frame in the sequence to 0.
+--
+--     If this function is passed surfaces with alternate representations added with SDL_AddSurfaceAlternateImage(), the surfaces will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations. For example, if the original surfaces are 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     If the underlying platform does not support animated cursors, this function will fall back to creating a static color cursor using the first frame in the sequence.
+--
+--     [@frames@]: an array of cursor images composing the animation.
+--
+--     [@frame_count@]: the number of frames in the sequence.
+--
+--     [@hot_x@]: the x position of the cursor hot spot.
+--
+--     [@hot_y@]: the y position of the cursor hot spot.
+--
+--     [Returns]: the new cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: SDL_AddSurfaceAlternateImage, 'sDL_CreateCursor', 'sDL_CreateColorCursor', 'sDL_CreateSystemCursor', 'sDL_DestroyCursor', 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_CreateAnimatedCursor@, defined at @SDL3\/SDL_mouse.h 672:41@
+sDL_CreateAnimatedCursor
+  :: BG.FunPtr (BG.Ptr SDL_CursorFrameInfo -> BG.CInt -> BG.CInt -> BG.CInt -> IO (BG.Ptr SDL_Cursor))
+sDL_CreateAnimatedCursor =
+  BG.unsafePerformIO hs_bindgen_5a53bab7f1d0dd41
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateSystemCursor@
+foreign import ccall unsafe "hs_bindgen_98115455fed12c20"
+  hs_bindgen_98115455fed12c20_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CreateSystemCursor@
+hs_bindgen_98115455fed12c20 :: IO (BG.FunPtr (SDL_SystemCursor -> IO (BG.Ptr SDL_Cursor)))
+hs_bindgen_98115455fed12c20 =
+  BG.fromFFIType hs_bindgen_98115455fed12c20_base
+
+{-# NOINLINE sDL_CreateSystemCursor #-}
+
+-- | Create a system cursor.
+--
+--     [@id@]: an 'SDL_SystemCursor' enum value.
+--
+--     [Returns]: a cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyCursor'
+--
+--     [C declaration]: @SDL_CreateSystemCursor@, defined at @SDL3\/SDL_mouse.h 690:42@
+sDL_CreateSystemCursor :: BG.FunPtr (SDL_SystemCursor -> IO (BG.Ptr SDL_Cursor))
+sDL_CreateSystemCursor =
+  BG.unsafePerformIO hs_bindgen_98115455fed12c20
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_SetCursor@
+foreign import ccall unsafe "hs_bindgen_7f9d9e943410eac0"
+  hs_bindgen_7f9d9e943410eac0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_SetCursor@
+hs_bindgen_7f9d9e943410eac0 :: IO (BG.FunPtr (BG.Ptr SDL_Cursor -> IO BG.CBool))
+hs_bindgen_7f9d9e943410eac0 =
+  BG.fromFFIType hs_bindgen_7f9d9e943410eac0_base
+
+{-# NOINLINE sDL_SetCursor #-}
+
+-- | Set the active cursor.
+--
+--     This function sets the currently active cursor to the specified one. If the cursor is currently visible, the change will be immediately represented on the display. SDL_SetCursor(NULL) can be used to force cursor redraw, if this is desired for any reason.
+--
+--     [@cursor@]: a cursor to make active.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCursor'
+--
+--     [C declaration]: @SDL_SetCursor@, defined at @SDL3\/SDL_mouse.h 710:34@
+sDL_SetCursor :: BG.FunPtr (BG.Ptr SDL_Cursor -> IO BG.CBool)
+sDL_SetCursor =
+  BG.unsafePerformIO hs_bindgen_7f9d9e943410eac0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetCursor@
+foreign import ccall unsafe "hs_bindgen_ddffa3c703f2160c"
+  hs_bindgen_ddffa3c703f2160c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetCursor@
+hs_bindgen_ddffa3c703f2160c :: IO (BG.FunPtr (IO (BG.Ptr SDL_Cursor)))
+hs_bindgen_ddffa3c703f2160c =
+  BG.fromFFIType hs_bindgen_ddffa3c703f2160c_base
+
+{-# NOINLINE sDL_GetCursor #-}
+
+-- | Get the active cursor.
+--
+--     This function returns a pointer to the current cursor which is owned by the library. It is not necessary to free the cursor with @SDL_DestroyCursor()@.
+--
+--     [Returns]: the active cursor or NULL if there is no mouse.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_GetCursor@, defined at @SDL3\/SDL_mouse.h 726:42@
+sDL_GetCursor :: BG.FunPtr (IO (BG.Ptr SDL_Cursor))
+sDL_GetCursor =
+  BG.unsafePerformIO hs_bindgen_ddffa3c703f2160c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetDefaultCursor@
+foreign import ccall unsafe "hs_bindgen_3cea96283579f3f7"
+  hs_bindgen_3cea96283579f3f7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_GetDefaultCursor@
+hs_bindgen_3cea96283579f3f7 :: IO (BG.FunPtr (IO (BG.Ptr SDL_Cursor)))
+hs_bindgen_3cea96283579f3f7 =
+  BG.fromFFIType hs_bindgen_3cea96283579f3f7_base
+
+{-# NOINLINE sDL_GetDefaultCursor #-}
+
+-- | Get the default cursor.
+--
+--     You do not have to call @SDL_DestroyCursor()@ on the return value, but it is safe to do so.
+--
+--     [Returns]: the default cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDefaultCursor@, defined at @SDL3\/SDL_mouse.h 741:42@
+sDL_GetDefaultCursor :: BG.FunPtr (IO (BG.Ptr SDL_Cursor))
+sDL_GetDefaultCursor =
+  BG.unsafePerformIO hs_bindgen_3cea96283579f3f7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_DestroyCursor@
+foreign import ccall unsafe "hs_bindgen_cccc019b7e8bc17b"
+  hs_bindgen_cccc019b7e8bc17b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_DestroyCursor@
+hs_bindgen_cccc019b7e8bc17b :: IO (BG.FunPtr (BG.Ptr SDL_Cursor -> IO ()))
+hs_bindgen_cccc019b7e8bc17b =
+  BG.fromFFIType hs_bindgen_cccc019b7e8bc17b_base
+
+{-# NOINLINE sDL_DestroyCursor #-}
+
+-- | Free a previously-created cursor.
+--
+--     Use this function to free cursor resources created with @SDL_CreateCursor()@, @SDL_CreateColorCursor()@ or @SDL_CreateSystemCursor()@.
+--
+--     [@cursor@]: the cursor to free.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAnimatedCursor', 'sDL_CreateColorCursor', 'sDL_CreateCursor', 'sDL_CreateSystemCursor'
+--
+--     [C declaration]: @SDL_DestroyCursor@, defined at @SDL3\/SDL_mouse.h 760:34@
+sDL_DestroyCursor :: BG.FunPtr (BG.Ptr SDL_Cursor -> IO ())
+sDL_DestroyCursor =
+  BG.unsafePerformIO hs_bindgen_cccc019b7e8bc17b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_ShowCursor@
+foreign import ccall unsafe "hs_bindgen_fa1d352535cdb7a2"
+  hs_bindgen_fa1d352535cdb7a2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_ShowCursor@
+hs_bindgen_fa1d352535cdb7a2 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_fa1d352535cdb7a2 =
+  BG.fromFFIType hs_bindgen_fa1d352535cdb7a2_base
+
+{-# NOINLINE sDL_ShowCursor #-}
+
+-- | Show the cursor.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CursorVisible', 'sDL_HideCursor'
+--
+--     [C declaration]: @SDL_ShowCursor@, defined at @SDL3\/SDL_mouse.h 775:34@
+sDL_ShowCursor :: BG.FunPtr (IO BG.CBool)
+sDL_ShowCursor =
+  BG.unsafePerformIO hs_bindgen_fa1d352535cdb7a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_HideCursor@
+foreign import ccall unsafe "hs_bindgen_d90c7f4cd007f484"
+  hs_bindgen_d90c7f4cd007f484_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_HideCursor@
+hs_bindgen_d90c7f4cd007f484 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_d90c7f4cd007f484 =
+  BG.fromFFIType hs_bindgen_d90c7f4cd007f484_base
+
+{-# NOINLINE sDL_HideCursor #-}
+
+-- | Hide the cursor.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CursorVisible', 'sDL_ShowCursor'
+--
+--     [C declaration]: @SDL_HideCursor@, defined at @SDL3\/SDL_mouse.h 790:34@
+sDL_HideCursor :: BG.FunPtr (IO BG.CBool)
+sDL_HideCursor =
+  BG.unsafePerformIO hs_bindgen_d90c7f4cd007f484
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CursorVisible@
+foreign import ccall unsafe "hs_bindgen_7ae5464b38889e15"
+  hs_bindgen_7ae5464b38889e15_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_get_SDL_CursorVisible@
+hs_bindgen_7ae5464b38889e15 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_7ae5464b38889e15 =
+  BG.fromFFIType hs_bindgen_7ae5464b38889e15_base
+
+{-# NOINLINE sDL_CursorVisible #-}
+
+-- | Return whether the cursor is currently being shown.
+--
+--     [Returns]: @true@ if the cursor is being shown, or @false@ if the cursor is hidden.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HideCursor', 'sDL_ShowCursor'
+--
+--     [C declaration]: @SDL_CursorVisible@, defined at @SDL3\/SDL_mouse.h 805:34@
+sDL_CursorVisible :: BG.FunPtr (IO BG.CBool)
+sDL_CursorVisible =
+  BG.unsafePerformIO hs_bindgen_7ae5464b38889e15
diff --git a/src/SDL3/Sys/Bindgen/Mouse/Safe.hs b/src/SDL3/Sys/Bindgen/Mouse/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Mouse/Safe.hs
@@ -0,0 +1,1125 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Mouse.Safe (
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_HasMouse,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_GetMice,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_GetMouseNameForID,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_GetMouseFocus,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_GetMouseState,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_GetGlobalMouseState,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_GetRelativeMouseState,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_WarpMouseInWindow,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_WarpMouseGlobal,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_SetRelativeMouseTransform,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_SetWindowRelativeMouseMode,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_GetWindowRelativeMouseMode,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_CaptureMouse,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_CreateCursor,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_CreateColorCursor,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_CreateAnimatedCursor,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_CreateSystemCursor,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_SetCursor,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_GetCursor,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_GetDefaultCursor,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_DestroyCursor,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_ShowCursor,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_HideCursor,
+  SDL3.Sys.Bindgen.Mouse.Safe.sDL_CursorVisible,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Mouse
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_mouse.h>"
+         , "_Bool hs_bindgen_c5f87eb6a615a43b (void)"
+         , "{"
+         , "  return (SDL_HasMouse)();"
+         , "}"
+         , "SDL_MouseID *hs_bindgen_b5ddc524dd09ed59 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMice)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_5f9df08d34babce6 ("
+         , "  SDL_MouseID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMouseNameForID)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_d663c2bc45028535 (void)"
+         , "{"
+         , "  return (SDL_GetMouseFocus)();"
+         , "}"
+         , "SDL_MouseButtonFlags hs_bindgen_ea9a965df89a99a0 ("
+         , "  float *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMouseState)(arg1, arg2);"
+         , "}"
+         , "SDL_MouseButtonFlags hs_bindgen_10d90c46febd8700 ("
+         , "  float *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGlobalMouseState)(arg1, arg2);"
+         , "}"
+         , "SDL_MouseButtonFlags hs_bindgen_b0dfdde07e2521d8 ("
+         , "  float *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRelativeMouseState)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_0eb4d6e5e240c8df ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  (SDL_WarpMouseInWindow)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_f03dc8593d130e68 ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WarpMouseGlobal)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_CursorFrameInfo SDL_CursorFrameInfo;"
+         , "typedef void *SDL_MouseMotionTransformCallback;"
+         , "#endif"
+         , "_Bool hs_bindgen_c18f7adda4cf4b0b ("
+         , "  SDL_MouseMotionTransformCallback arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetRelativeMouseTransform)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetRelativeMouseTransform requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_ebfc8396f7c8dfc1 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowRelativeMouseMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c122318f49f37c28 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowRelativeMouseMode)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ba2a652c2d22d4f9 ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CaptureMouse)(arg1);"
+         , "}"
+         , "SDL_Cursor *hs_bindgen_8aa3978a09ad477f ("
+         , "  Uint8 const *arg1,"
+         , "  Uint8 const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5,"
+         , "  signed int arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateCursor)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "SDL_Cursor *hs_bindgen_1af9c26d315c2409 ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateColorCursor)(arg1, arg2, arg3);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_CursorFrameInfo SDL_CursorFrameInfo;"
+         , "typedef void *SDL_MouseMotionTransformCallback;"
+         , "#endif"
+         , "SDL_Cursor *hs_bindgen_9a5f9b18f58c86ff ("
+         , "  SDL_CursorFrameInfo *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_CreateAnimatedCursor)(arg1, arg2, arg3, arg4);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; SDL_SetError(\"SDL_CreateAnimatedCursor requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_Cursor *hs_bindgen_9c5496f4b40d0ce6 ("
+         , "  SDL_SystemCursor arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSystemCursor)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_3b39298a9bf3a79f ("
+         , "  SDL_Cursor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SetCursor)(arg1);"
+         , "}"
+         , "SDL_Cursor *hs_bindgen_0ad270dac1fad234 (void)"
+         , "{"
+         , "  return (SDL_GetCursor)();"
+         , "}"
+         , "SDL_Cursor *hs_bindgen_eba07747bd0a11f2 (void)"
+         , "{"
+         , "  return (SDL_GetDefaultCursor)();"
+         , "}"
+         , "void hs_bindgen_c88c0b977a69ed2a ("
+         , "  SDL_Cursor *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyCursor)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_2dbfefec61405524 (void)"
+         , "{"
+         , "  return (SDL_ShowCursor)();"
+         , "}"
+         , "_Bool hs_bindgen_40414e63ec7f7a75 (void)"
+         , "{"
+         , "  return (SDL_HideCursor)();"
+         , "}"
+         , "_Bool hs_bindgen_3414c4fe925fe000 (void)"
+         , "{"
+         , "  return (SDL_CursorVisible)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_HasMouse@
+foreign import ccall safe "hs_bindgen_c5f87eb6a615a43b"
+  hs_bindgen_c5f87eb6a615a43b_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_HasMouse@
+hs_bindgen_c5f87eb6a615a43b :: IO BG.CBool
+hs_bindgen_c5f87eb6a615a43b =
+  BG.fromFFIType hs_bindgen_c5f87eb6a615a43b_base
+
+-- | Return whether a mouse is currently connected.
+--
+--     [Returns]: true if a mouse is connected, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMice'
+--
+--     [C declaration]: @SDL_HasMouse@, defined at @SDL3\/SDL_mouse.h 226:34@
+sDL_HasMouse :: IO BG.CBool
+sDL_HasMouse = hs_bindgen_c5f87eb6a615a43b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetMice@
+foreign import ccall safe "hs_bindgen_b5ddc524dd09ed59"
+  hs_bindgen_b5ddc524dd09ed59_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetMice@
+hs_bindgen_b5ddc524dd09ed59
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_MouseID)
+hs_bindgen_b5ddc524dd09ed59 =
+  BG.fromFFIType hs_bindgen_b5ddc524dd09ed59_base
+
+-- | Get a list of currently connected mice.
+--
+--     Note that this will include any device or virtual driver that includes mouse functionality, including some game controllers, KVM switches, etc. You should wait for input from a device before you consider it actively in use.
+--
+--     [Returns]: a 0 terminated array of mouse instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMouseNameForID', 'sDL_HasMouse'
+--
+--     [C declaration]: @SDL_GetMice@, defined at @SDL3\/SDL_mouse.h 249:43@
+sDL_GetMice
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of mice returned, may be NULL.
+  -> IO (BG.Ptr SDL_MouseID)
+sDL_GetMice = hs_bindgen_b5ddc524dd09ed59
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetMouseNameForID@
+foreign import ccall safe "hs_bindgen_5f9df08d34babce6"
+  hs_bindgen_5f9df08d34babce6_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetMouseNameForID@
+hs_bindgen_5f9df08d34babce6
+  :: SDL_MouseID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_5f9df08d34babce6 =
+  BG.fromFFIType hs_bindgen_5f9df08d34babce6_base
+
+-- | Get the name of a mouse.
+--
+--     This function returns \"\" if the mouse doesn\'t have a name.
+--
+--     [Returns]: the name of the selected mouse, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMice'
+--
+--     [C declaration]: @SDL_GetMouseNameForID@, defined at @SDL3\/SDL_mouse.h 266:42@
+sDL_GetMouseNameForID
+  :: SDL_MouseID
+  -- ^
+  --
+  --           [@instance_id@]: the mouse instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetMouseNameForID = hs_bindgen_5f9df08d34babce6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetMouseFocus@
+foreign import ccall safe "hs_bindgen_d663c2bc45028535"
+  hs_bindgen_d663c2bc45028535_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetMouseFocus@
+hs_bindgen_d663c2bc45028535 :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+hs_bindgen_d663c2bc45028535 =
+  BG.fromFFIType hs_bindgen_d663c2bc45028535_base
+
+-- | Get the window which currently has mouse focus.
+--
+--     [Returns]: the window with mouse focus.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetMouseFocus@, defined at @SDL3\/SDL_mouse.h 277:42@
+sDL_GetMouseFocus :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+sDL_GetMouseFocus = hs_bindgen_d663c2bc45028535
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetMouseState@
+foreign import ccall safe "hs_bindgen_ea9a965df89a99a0"
+  hs_bindgen_ea9a965df89a99a0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetMouseState@
+hs_bindgen_ea9a965df89a99a0
+  :: BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO SDL_MouseButtonFlags
+hs_bindgen_ea9a965df89a99a0 =
+  BG.fromFFIType hs_bindgen_ea9a965df89a99a0_base
+
+-- | Query SDL\'s cache for the synchronous mouse button state and the window-relative SDL-cursor position.
+--
+--     This function returns the cached synchronous state as SDL understands it from the last pump of the event queue.
+--
+--     To query the platform for immediate asynchronous state, use SDL_GetGlobalMouseState.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y coordinates relative to the focused window.
+--
+--     In Relative Mode, the SDL-cursor\'s position usually contradicts the platform-cursor\'s position as manually calculated from @SDL_GetGlobalMouseState()@ and SDL_GetWindowPosition.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGlobalMouseState', 'sDL_GetRelativeMouseState'
+--
+--     [C declaration]: @SDL_GetMouseState@, defined at @SDL3\/SDL_mouse.h 310:50@
+sDL_GetMouseState
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the SDL-cursor\'s x-position from the focused window\'s top left corner, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the SDL-cursor\'s y-position from the focused window\'s top left corner, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+sDL_GetMouseState = hs_bindgen_ea9a965df89a99a0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetGlobalMouseState@
+foreign import ccall safe "hs_bindgen_10d90c46febd8700"
+  hs_bindgen_10d90c46febd8700_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetGlobalMouseState@
+hs_bindgen_10d90c46febd8700
+  :: BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO SDL_MouseButtonFlags
+hs_bindgen_10d90c46febd8700 =
+  BG.fromFFIType hs_bindgen_10d90c46febd8700_base
+
+-- | Query the platform for the asynchronous mouse button state and the desktop-relative platform-cursor position.
+--
+--     This function immediately queries the platform for the most recent asynchronous state, more costly than retrieving SDL\'s cached state in @SDL_GetMouseState()@.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y coordinates relative to the desktop.
+--
+--     In Relative Mode, the platform-cursor\'s position usually contradicts the SDL-cursor\'s position as manually calculated from @SDL_GetMouseState()@ and SDL_GetWindowPosition.
+--
+--     This function can be useful if you need to track the mouse outside of a specific window and @SDL_CaptureMouse()@ doesn\'t fit your needs. For example, it could be useful if you need to track the mouse while dragging a window, where coordinates relative to a window might not be in sync at all times.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CaptureMouse', 'sDL_GetMouseState', 'sDL_GetGlobalMouseState'
+--
+--     [C declaration]: @SDL_GetGlobalMouseState@, defined at @SDL3\/SDL_mouse.h 347:50@
+sDL_GetGlobalMouseState
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the platform-cursor\'s x-position from the desktop\'s top left corner, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the platform-cursor\'s y-position from the desktop\'s top left corner, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+sDL_GetGlobalMouseState = hs_bindgen_10d90c46febd8700
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetRelativeMouseState@
+foreign import ccall safe "hs_bindgen_b0dfdde07e2521d8"
+  hs_bindgen_b0dfdde07e2521d8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetRelativeMouseState@
+hs_bindgen_b0dfdde07e2521d8
+  :: BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO SDL_MouseButtonFlags
+hs_bindgen_b0dfdde07e2521d8 =
+  BG.fromFFIType hs_bindgen_b0dfdde07e2521d8_base
+
+-- | Query SDL\'s cache for the synchronous mouse button state and accumulated mouse delta since last call.
+--
+--     This function returns the cached synchronous state as SDL understands it from the last pump of the event queue.
+--
+--     To query the platform for immediate asynchronous state, use SDL_GetGlobalMouseState.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y deltas accumulated since the last call to this function (or since event initialization).
+--
+--     This function is useful for reducing overhead by processing relative mouse inputs in one go per-frame instead of individually per-event, at the expense of losing the order between events within the frame (e.g. quickly pressing and releasing a button within the same frame).
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMouseState', 'sDL_GetGlobalMouseState'
+--
+--     [C declaration]: @SDL_GetRelativeMouseState@, defined at @SDL3\/SDL_mouse.h 382:50@
+sDL_GetRelativeMouseState
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the x mouse delta accumulated since last call, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the y mouse delta accumulated since last call, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+sDL_GetRelativeMouseState =
+  hs_bindgen_b0dfdde07e2521d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_WarpMouseInWindow@
+foreign import ccall safe "hs_bindgen_0eb4d6e5e240c8df"
+  hs_bindgen_0eb4d6e5e240c8df_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_WarpMouseInWindow@
+hs_bindgen_0eb4d6e5e240c8df
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO ()
+hs_bindgen_0eb4d6e5e240c8df =
+  BG.fromFFIType hs_bindgen_0eb4d6e5e240c8df_base
+
+-- | Move the mouse cursor to the given position within the window.
+--
+--     This function generates a mouse motion event if relative mode is not enabled. If relative mode is enabled, you can force mouse events for the warp by setting the SDL_HINT_MOUSE_RELATIVE_WARP_MOTION hint.
+--
+--     Note that this function will appear to succeed, but not actually move the mouse when used over Microsoft Remote Desktop.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WarpMouseGlobal'
+--
+--     [C declaration]: @SDL_WarpMouseInWindow@, defined at @SDL3\/SDL_mouse.h 405:34@
+sDL_WarpMouseInWindow
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to move the mouse into, or NULL for the current mouse focus.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate within the window.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate within the window.
+  -> IO ()
+sDL_WarpMouseInWindow = hs_bindgen_0eb4d6e5e240c8df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_WarpMouseGlobal@
+foreign import ccall safe "hs_bindgen_f03dc8593d130e68"
+  hs_bindgen_f03dc8593d130e68_base
+    :: Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_WarpMouseGlobal@
+hs_bindgen_f03dc8593d130e68
+  :: BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_f03dc8593d130e68 =
+  BG.fromFFIType hs_bindgen_f03dc8593d130e68_base
+
+-- | Move the mouse to the given position in global screen space.
+--
+--     This function generates a mouse motion event.
+--
+--     A failure of this function usually means that it is unsupported by a platform.
+--
+--     Note that this function will appear to succeed, but not actually move the mouse when used over Microsoft Remote Desktop.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WarpMouseInWindow'
+--
+--     [C declaration]: @SDL_WarpMouseGlobal@, defined at @SDL3\/SDL_mouse.h 430:34@
+sDL_WarpMouseGlobal
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate.
+  -> IO BG.CBool
+sDL_WarpMouseGlobal = hs_bindgen_f03dc8593d130e68
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_SetRelativeMouseTransform@
+foreign import ccall safe "hs_bindgen_c18f7adda4cf4b0b"
+  hs_bindgen_c18f7adda4cf4b0b_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_SetRelativeMouseTransform@
+hs_bindgen_c18f7adda4cf4b0b
+  :: SDL_MouseMotionTransformCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_c18f7adda4cf4b0b =
+  BG.fromFFIType hs_bindgen_c18f7adda4cf4b0b_base
+
+-- | Set a user-defined function by which to transform relative mouse inputs.
+--
+--     This overrides the relative system scale and relative speed scale hints. Should be called prior to enabling relative mouse mode, fails otherwise.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetRelativeMouseTransform@, defined at @SDL3\/SDL_mouse.h 448:34@
+sDL_SetRelativeMouseTransform
+  :: SDL_MouseMotionTransformCallback
+  -- ^
+  --
+  --           [@callback@]: a callback used to transform relative mouse motion, or NULL for default behavior.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that will be passed to @callback@.
+  -> IO BG.CBool
+sDL_SetRelativeMouseTransform =
+  hs_bindgen_c18f7adda4cf4b0b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_SetWindowRelativeMouseMode@
+foreign import ccall safe "hs_bindgen_ebfc8396f7c8dfc1"
+  hs_bindgen_ebfc8396f7c8dfc1_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_SetWindowRelativeMouseMode@
+hs_bindgen_ebfc8396f7c8dfc1
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_ebfc8396f7c8dfc1 =
+  BG.fromFFIType hs_bindgen_ebfc8396f7c8dfc1_base
+
+-- | Set relative mouse mode for a window.
+--
+--     While the window has focus and relative mouse mode is enabled, the cursor is hidden, the mouse position is constrained to the window, and SDL will report continuous relative mouse motion even if the mouse is at the edge of the window.
+--
+--     If you\'d like to keep the mouse position fixed while in relative mode you can use SDL_SetWindowMouseRect(). If you\'d like the cursor to be at a specific location when relative mode ends, you should use @SDL_WarpMouseInWindow()@ before disabling relative mode.
+--
+--     This function will flush any pending mouse motion for this window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowRelativeMouseMode'
+--
+--     [C declaration]: @SDL_SetWindowRelativeMouseMode@, defined at @SDL3\/SDL_mouse.h 476:34@
+sDL_SetWindowRelativeMouseMode
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: true to enable relative mode, false to disable.
+  -> IO BG.CBool
+sDL_SetWindowRelativeMouseMode =
+  hs_bindgen_ebfc8396f7c8dfc1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetWindowRelativeMouseMode@
+foreign import ccall safe "hs_bindgen_c122318f49f37c28"
+  hs_bindgen_c122318f49f37c28_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetWindowRelativeMouseMode@
+hs_bindgen_c122318f49f37c28
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_c122318f49f37c28 =
+  BG.fromFFIType hs_bindgen_c122318f49f37c28_base
+
+-- | Query whether relative mouse mode is enabled for a window.
+--
+--     [Returns]: true if relative mode is enabled for a window or false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowRelativeMouseMode'
+--
+--     [C declaration]: @SDL_GetWindowRelativeMouseMode@, defined at @SDL3\/SDL_mouse.h 490:34@
+sDL_GetWindowRelativeMouseMode
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CBool
+sDL_GetWindowRelativeMouseMode =
+  hs_bindgen_c122318f49f37c28
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CaptureMouse@
+foreign import ccall safe "hs_bindgen_ba2a652c2d22d4f9"
+  hs_bindgen_ba2a652c2d22d4f9_base
+    :: BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CaptureMouse@
+hs_bindgen_ba2a652c2d22d4f9
+  :: BG.CBool
+  -> IO BG.CBool
+hs_bindgen_ba2a652c2d22d4f9 =
+  BG.fromFFIType hs_bindgen_ba2a652c2d22d4f9_base
+
+-- | Capture the mouse and to track input outside an SDL window.
+--
+--     Capturing enables your app to obtain mouse events globally, instead of just within your window. Not all video targets support this function. When capturing is enabled, the current window will get all mouse events, but unlike relative mode, no change is made to the cursor and it is not restrained to your window.
+--
+--     This function may also deny mouse input to other windows both those in your application and others on the system so you should use this function sparingly, and in small bursts. For example, you might want to track the mouse while the user is dragging something, until the user releases a mouse button. It is not recommended that you capture the mouse for long periods of time, such as the entire time your app is running. For that, you should probably use @SDL_SetWindowRelativeMouseMode()@ or SDL_SetWindowMouseGrab(), depending on your goals.
+--
+--     While captured, mouse events still report coordinates relative to the current (foreground) window, but those coordinates may be outside the bounds of the window (including negative values). Capturing is only allowed for the foreground window. If the window loses focus while capturing, the capture will be disabled automatically.
+--
+--     While capturing is enabled, the current window will have the @SDL_WINDOW_MOUSE_CAPTURE@ flag set.
+--
+--     Please note that SDL will attempt to \"auto capture\" the mouse while the user is pressing a button; this is to try and make mouse behavior more consistent between platforms, and deal with the common case of a user dragging the mouse outside of the window. This means that if you are calling @SDL_CaptureMouse()@ only to deal with this situation, you do not have to (although it is safe to do so). If this causes problems for your app, you can disable auto capture by setting the @SDL_HINT_MOUSE_AUTO_CAPTURE@ hint to zero.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGlobalMouseState'
+--
+--     [C declaration]: @SDL_CaptureMouse@, defined at @SDL3\/SDL_mouse.h 538:34@
+sDL_CaptureMouse
+  :: BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: true to enable capturing, false to disable.
+  -> IO BG.CBool
+sDL_CaptureMouse = hs_bindgen_ba2a652c2d22d4f9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CreateCursor@
+foreign import ccall safe "hs_bindgen_8aa3978a09ad477f"
+  hs_bindgen_8aa3978a09ad477f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CreateCursor@
+hs_bindgen_8aa3978a09ad477f
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> IO (BG.Ptr SDL_Cursor)
+hs_bindgen_8aa3978a09ad477f =
+  BG.fromFFIType hs_bindgen_8aa3978a09ad477f_base
+
+-- | Create a cursor using the specified bitmap data and mask (in MSB format).
+--
+--     @mask@ has to be in MSB (Most Significant Bit) format.
+--
+--     The cursor width (@w@) must be a multiple of 8 bits.
+--
+--     The cursor is created in black and white according to the following:
+--
+--     * data=0, mask=1: white
+--
+--     * data=1, mask=1: black
+--
+--     * data=0, mask=0: transparent
+--
+--     * data=1, mask=0: inverted color if possible, black if not.
+--
+--     Cursors created with this function must be freed with @SDL_DestroyCursor()@.
+--
+--     If you want to have a color cursor, or create your cursor from an SDL_Surface, you should use @SDL_CreateColorCursor()@. Alternately, you can hide the cursor and draw your own as part of your game\'s rendering, but it will be bound to the framerate.
+--
+--     Also, @SDL_CreateSystemCursor()@ is available, which provides several readily-available system cursors to pick from.
+--
+--     [Returns]: a new cursor with the specified parameters on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAnimatedCursor', 'sDL_CreateColorCursor', 'sDL_CreateSystemCursor', 'sDL_DestroyCursor', 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_CreateCursor@, defined at @SDL3\/SDL_mouse.h 585:42@
+sDL_CreateCursor
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@data@]: the color value for each pixel of the cursor.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@mask@]: the mask value for each pixel of the cursor.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the cursor.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the cursor.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_x@]: the x-axis offset from the left of the cursor image to the mouse x position, in the range of 0 to @w@ - 1.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_y@]: the y-axis offset from the top of the cursor image to the mouse y position, in the range of 0 to @h@ - 1.
+  -> IO (BG.Ptr SDL_Cursor)
+sDL_CreateCursor = hs_bindgen_8aa3978a09ad477f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CreateColorCursor@
+foreign import ccall safe "hs_bindgen_1af9c26d315c2409"
+  hs_bindgen_1af9c26d315c2409_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CreateColorCursor@
+hs_bindgen_1af9c26d315c2409
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> IO (BG.Ptr SDL_Cursor)
+hs_bindgen_1af9c26d315c2409 =
+  BG.fromFFIType hs_bindgen_1af9c26d315c2409_base
+
+-- | Create a color cursor.
+--
+--     If this function is passed a surface with alternate representations added with SDL_AddSurfaceAlternateImage(), the surface will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations if SDL_HINT_MOUSE_DPI_SCALE_CURSORS is enabled. For example, if the original surface is 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     [Returns]: the new cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_AddSurfaceAlternateImage, 'sDL_CreateAnimatedCursor', 'sDL_CreateCursor', 'sDL_CreateSystemCursor', 'sDL_DestroyCursor', 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_CreateColorCursor@, defined at @SDL3\/SDL_mouse.h 622:42@
+sDL_CreateColorCursor
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: an SDL_Surface structure representing the cursor image.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_x@]: the x position of the cursor hot spot.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_y@]: the y position of the cursor hot spot.
+  -> IO (BG.Ptr SDL_Cursor)
+sDL_CreateColorCursor = hs_bindgen_1af9c26d315c2409
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CreateAnimatedCursor@
+foreign import ccall safe "hs_bindgen_9a5f9b18f58c86ff"
+  hs_bindgen_9a5f9b18f58c86ff_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CreateAnimatedCursor@
+hs_bindgen_9a5f9b18f58c86ff
+  :: BG.Ptr SDL_CursorFrameInfo
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> IO (BG.Ptr SDL_Cursor)
+hs_bindgen_9a5f9b18f58c86ff =
+  BG.fromFFIType hs_bindgen_9a5f9b18f58c86ff_base
+
+-- | Create an animated color cursor.
+--
+--     Animated cursors are composed of a sequential array of frames, specified as surfaces and durations in an array of 'SDL_CursorFrameInfo' structs. The hot spot coordinates are universal to all frames, and all frames must have the same dimensions.
+--
+--     Frame durations are specified in milliseconds. A duration of 0 implies an infinite frame time, and the animation will stop on that frame. To create a one-shot animation, set the duration of the last frame in the sequence to 0.
+--
+--     If this function is passed surfaces with alternate representations added with SDL_AddSurfaceAlternateImage(), the surfaces will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations. For example, if the original surfaces are 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     If the underlying platform does not support animated cursors, this function will fall back to creating a static color cursor using the first frame in the sequence.
+--
+--     [Returns]: the new cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: SDL_AddSurfaceAlternateImage, 'sDL_CreateCursor', 'sDL_CreateColorCursor', 'sDL_CreateSystemCursor', 'sDL_DestroyCursor', 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_CreateAnimatedCursor@, defined at @SDL3\/SDL_mouse.h 672:41@
+sDL_CreateAnimatedCursor
+  :: BG.Ptr SDL_CursorFrameInfo
+  -- ^
+  --
+  --           [@frames@]: an array of cursor images composing the animation.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@frame_count@]: the number of frames in the sequence.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_x@]: the x position of the cursor hot spot.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_y@]: the y position of the cursor hot spot.
+  -> IO (BG.Ptr SDL_Cursor)
+sDL_CreateAnimatedCursor =
+  hs_bindgen_9a5f9b18f58c86ff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CreateSystemCursor@
+foreign import ccall safe "hs_bindgen_9c5496f4b40d0ce6"
+  hs_bindgen_9c5496f4b40d0ce6_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CreateSystemCursor@
+hs_bindgen_9c5496f4b40d0ce6
+  :: SDL_SystemCursor
+  -> IO (BG.Ptr SDL_Cursor)
+hs_bindgen_9c5496f4b40d0ce6 =
+  BG.fromFFIType hs_bindgen_9c5496f4b40d0ce6_base
+
+-- | Create a system cursor.
+--
+--     [Returns]: a cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyCursor'
+--
+--     [C declaration]: @SDL_CreateSystemCursor@, defined at @SDL3\/SDL_mouse.h 690:42@
+sDL_CreateSystemCursor
+  :: SDL_SystemCursor
+  -- ^
+  --
+  --           [@id@]: an 'SDL_SystemCursor' enum value.
+  -> IO (BG.Ptr SDL_Cursor)
+sDL_CreateSystemCursor = hs_bindgen_9c5496f4b40d0ce6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_SetCursor@
+foreign import ccall safe "hs_bindgen_3b39298a9bf3a79f"
+  hs_bindgen_3b39298a9bf3a79f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_SetCursor@
+hs_bindgen_3b39298a9bf3a79f
+  :: BG.Ptr SDL_Cursor
+  -> IO BG.CBool
+hs_bindgen_3b39298a9bf3a79f =
+  BG.fromFFIType hs_bindgen_3b39298a9bf3a79f_base
+
+-- | Set the active cursor.
+--
+--     This function sets the currently active cursor to the specified one. If the cursor is currently visible, the change will be immediately represented on the display. SDL_SetCursor(NULL) can be used to force cursor redraw, if this is desired for any reason.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCursor'
+--
+--     [C declaration]: @SDL_SetCursor@, defined at @SDL3\/SDL_mouse.h 710:34@
+sDL_SetCursor
+  :: BG.Ptr SDL_Cursor
+  -- ^
+  --
+  --           [@cursor@]: a cursor to make active.
+  -> IO BG.CBool
+sDL_SetCursor = hs_bindgen_3b39298a9bf3a79f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetCursor@
+foreign import ccall safe "hs_bindgen_0ad270dac1fad234"
+  hs_bindgen_0ad270dac1fad234_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetCursor@
+hs_bindgen_0ad270dac1fad234 :: IO (BG.Ptr SDL_Cursor)
+hs_bindgen_0ad270dac1fad234 =
+  BG.fromFFIType hs_bindgen_0ad270dac1fad234_base
+
+-- | Get the active cursor.
+--
+--     This function returns a pointer to the current cursor which is owned by the library. It is not necessary to free the cursor with @SDL_DestroyCursor()@.
+--
+--     [Returns]: the active cursor or NULL if there is no mouse.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_GetCursor@, defined at @SDL3\/SDL_mouse.h 726:42@
+sDL_GetCursor :: IO (BG.Ptr SDL_Cursor)
+sDL_GetCursor = hs_bindgen_0ad270dac1fad234
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetDefaultCursor@
+foreign import ccall safe "hs_bindgen_eba07747bd0a11f2"
+  hs_bindgen_eba07747bd0a11f2_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_GetDefaultCursor@
+hs_bindgen_eba07747bd0a11f2 :: IO (BG.Ptr SDL_Cursor)
+hs_bindgen_eba07747bd0a11f2 =
+  BG.fromFFIType hs_bindgen_eba07747bd0a11f2_base
+
+-- | Get the default cursor.
+--
+--     You do not have to call @SDL_DestroyCursor()@ on the return value, but it is safe to do so.
+--
+--     [Returns]: the default cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDefaultCursor@, defined at @SDL3\/SDL_mouse.h 741:42@
+sDL_GetDefaultCursor :: IO (BG.Ptr SDL_Cursor)
+sDL_GetDefaultCursor = hs_bindgen_eba07747bd0a11f2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_DestroyCursor@
+foreign import ccall safe "hs_bindgen_c88c0b977a69ed2a"
+  hs_bindgen_c88c0b977a69ed2a_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_DestroyCursor@
+hs_bindgen_c88c0b977a69ed2a
+  :: BG.Ptr SDL_Cursor
+  -> IO ()
+hs_bindgen_c88c0b977a69ed2a =
+  BG.fromFFIType hs_bindgen_c88c0b977a69ed2a_base
+
+-- | Free a previously-created cursor.
+--
+--     Use this function to free cursor resources created with @SDL_CreateCursor()@, @SDL_CreateColorCursor()@ or @SDL_CreateSystemCursor()@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAnimatedCursor', 'sDL_CreateColorCursor', 'sDL_CreateCursor', 'sDL_CreateSystemCursor'
+--
+--     [C declaration]: @SDL_DestroyCursor@, defined at @SDL3\/SDL_mouse.h 760:34@
+sDL_DestroyCursor
+  :: BG.Ptr SDL_Cursor
+  -- ^
+  --
+  --           [@cursor@]: the cursor to free.
+  -> IO ()
+sDL_DestroyCursor = hs_bindgen_c88c0b977a69ed2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_ShowCursor@
+foreign import ccall safe "hs_bindgen_2dbfefec61405524"
+  hs_bindgen_2dbfefec61405524_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_ShowCursor@
+hs_bindgen_2dbfefec61405524 :: IO BG.CBool
+hs_bindgen_2dbfefec61405524 =
+  BG.fromFFIType hs_bindgen_2dbfefec61405524_base
+
+-- | Show the cursor.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CursorVisible', 'sDL_HideCursor'
+--
+--     [C declaration]: @SDL_ShowCursor@, defined at @SDL3\/SDL_mouse.h 775:34@
+sDL_ShowCursor :: IO BG.CBool
+sDL_ShowCursor = hs_bindgen_2dbfefec61405524
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_HideCursor@
+foreign import ccall safe "hs_bindgen_40414e63ec7f7a75"
+  hs_bindgen_40414e63ec7f7a75_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_HideCursor@
+hs_bindgen_40414e63ec7f7a75 :: IO BG.CBool
+hs_bindgen_40414e63ec7f7a75 =
+  BG.fromFFIType hs_bindgen_40414e63ec7f7a75_base
+
+-- | Hide the cursor.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CursorVisible', 'sDL_ShowCursor'
+--
+--     [C declaration]: @SDL_HideCursor@, defined at @SDL3\/SDL_mouse.h 790:34@
+sDL_HideCursor :: IO BG.CBool
+sDL_HideCursor = hs_bindgen_40414e63ec7f7a75
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CursorVisible@
+foreign import ccall safe "hs_bindgen_3414c4fe925fe000"
+  hs_bindgen_3414c4fe925fe000_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Safe_SDL_CursorVisible@
+hs_bindgen_3414c4fe925fe000 :: IO BG.CBool
+hs_bindgen_3414c4fe925fe000 =
+  BG.fromFFIType hs_bindgen_3414c4fe925fe000_base
+
+-- | Return whether the cursor is currently being shown.
+--
+--     [Returns]: @true@ if the cursor is being shown, or @false@ if the cursor is hidden.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HideCursor', 'sDL_ShowCursor'
+--
+--     [C declaration]: @SDL_CursorVisible@, defined at @SDL3\/SDL_mouse.h 805:34@
+sDL_CursorVisible :: IO BG.CBool
+sDL_CursorVisible = hs_bindgen_3414c4fe925fe000
diff --git a/src/SDL3/Sys/Bindgen/Mouse/Unsafe.hs b/src/SDL3/Sys/Bindgen/Mouse/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Mouse/Unsafe.hs
@@ -0,0 +1,1125 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Mouse.Unsafe (
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_HasMouse,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_GetMice,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_GetMouseNameForID,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_GetMouseFocus,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_GetMouseState,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_GetGlobalMouseState,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_GetRelativeMouseState,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_WarpMouseInWindow,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_WarpMouseGlobal,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_SetRelativeMouseTransform,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_SetWindowRelativeMouseMode,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_GetWindowRelativeMouseMode,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_CaptureMouse,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_CreateCursor,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_CreateColorCursor,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_CreateAnimatedCursor,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_CreateSystemCursor,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_SetCursor,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_GetCursor,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_GetDefaultCursor,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_DestroyCursor,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_ShowCursor,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_HideCursor,
+  SDL3.Sys.Bindgen.Mouse.Unsafe.sDL_CursorVisible,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Mouse
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_mouse.h>"
+         , "_Bool hs_bindgen_769b74d7836fe340 (void)"
+         , "{"
+         , "  return (SDL_HasMouse)();"
+         , "}"
+         , "SDL_MouseID *hs_bindgen_a1009b511ca2df84 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMice)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_47cea9780ae3c106 ("
+         , "  SDL_MouseID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMouseNameForID)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_053bab05e16f443e (void)"
+         , "{"
+         , "  return (SDL_GetMouseFocus)();"
+         , "}"
+         , "SDL_MouseButtonFlags hs_bindgen_f18a766f4a177029 ("
+         , "  float *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMouseState)(arg1, arg2);"
+         , "}"
+         , "SDL_MouseButtonFlags hs_bindgen_4b743c0e1b7fc8fc ("
+         , "  float *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetGlobalMouseState)(arg1, arg2);"
+         , "}"
+         , "SDL_MouseButtonFlags hs_bindgen_d841c68d1482079a ("
+         , "  float *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRelativeMouseState)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_0b73aa8f6d98f018 ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  (SDL_WarpMouseInWindow)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_42c0ada5af2a75a6 ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WarpMouseGlobal)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_CursorFrameInfo SDL_CursorFrameInfo;"
+         , "typedef void *SDL_MouseMotionTransformCallback;"
+         , "#endif"
+         , "_Bool hs_bindgen_3431374e48384d8c ("
+         , "  SDL_MouseMotionTransformCallback arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetRelativeMouseTransform)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetRelativeMouseTransform requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_df14f3a2272073d3 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowRelativeMouseMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_60e1427dc7059277 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowRelativeMouseMode)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_61b615e5f17d45b5 ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CaptureMouse)(arg1);"
+         , "}"
+         , "SDL_Cursor *hs_bindgen_14364d58f2a5fb7e ("
+         , "  Uint8 const *arg1,"
+         , "  Uint8 const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5,"
+         , "  signed int arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateCursor)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "SDL_Cursor *hs_bindgen_fa20cf5972b0b3ea ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateColorCursor)(arg1, arg2, arg3);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_CursorFrameInfo SDL_CursorFrameInfo;"
+         , "typedef void *SDL_MouseMotionTransformCallback;"
+         , "#endif"
+         , "SDL_Cursor *hs_bindgen_d361ef168725ef94 ("
+         , "  SDL_CursorFrameInfo *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_CreateAnimatedCursor)(arg1, arg2, arg3, arg4);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; SDL_SetError(\"SDL_CreateAnimatedCursor requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_Cursor *hs_bindgen_c34ca154a7bf13af ("
+         , "  SDL_SystemCursor arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSystemCursor)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_c79cfea2c2a40f90 ("
+         , "  SDL_Cursor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SetCursor)(arg1);"
+         , "}"
+         , "SDL_Cursor *hs_bindgen_9e2eefba89a09501 (void)"
+         , "{"
+         , "  return (SDL_GetCursor)();"
+         , "}"
+         , "SDL_Cursor *hs_bindgen_b81cd185a7b75943 (void)"
+         , "{"
+         , "  return (SDL_GetDefaultCursor)();"
+         , "}"
+         , "void hs_bindgen_fd4d057091dc9dcc ("
+         , "  SDL_Cursor *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyCursor)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_79db044ed9d49e1d (void)"
+         , "{"
+         , "  return (SDL_ShowCursor)();"
+         , "}"
+         , "_Bool hs_bindgen_f07aff8d3a047b77 (void)"
+         , "{"
+         , "  return (SDL_HideCursor)();"
+         , "}"
+         , "_Bool hs_bindgen_1d7b9f91212450ba (void)"
+         , "{"
+         , "  return (SDL_CursorVisible)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_HasMouse@
+foreign import ccall unsafe "hs_bindgen_769b74d7836fe340"
+  hs_bindgen_769b74d7836fe340_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_HasMouse@
+hs_bindgen_769b74d7836fe340 :: IO BG.CBool
+hs_bindgen_769b74d7836fe340 =
+  BG.fromFFIType hs_bindgen_769b74d7836fe340_base
+
+-- | Return whether a mouse is currently connected.
+--
+--     [Returns]: true if a mouse is connected, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMice'
+--
+--     [C declaration]: @SDL_HasMouse@, defined at @SDL3\/SDL_mouse.h 226:34@
+sDL_HasMouse :: IO BG.CBool
+sDL_HasMouse = hs_bindgen_769b74d7836fe340
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetMice@
+foreign import ccall unsafe "hs_bindgen_a1009b511ca2df84"
+  hs_bindgen_a1009b511ca2df84_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetMice@
+hs_bindgen_a1009b511ca2df84
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_MouseID)
+hs_bindgen_a1009b511ca2df84 =
+  BG.fromFFIType hs_bindgen_a1009b511ca2df84_base
+
+-- | Get a list of currently connected mice.
+--
+--     Note that this will include any device or virtual driver that includes mouse functionality, including some game controllers, KVM switches, etc. You should wait for input from a device before you consider it actively in use.
+--
+--     [Returns]: a 0 terminated array of mouse instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMouseNameForID', 'sDL_HasMouse'
+--
+--     [C declaration]: @SDL_GetMice@, defined at @SDL3\/SDL_mouse.h 249:43@
+sDL_GetMice
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of mice returned, may be NULL.
+  -> IO (BG.Ptr SDL_MouseID)
+sDL_GetMice = hs_bindgen_a1009b511ca2df84
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetMouseNameForID@
+foreign import ccall unsafe "hs_bindgen_47cea9780ae3c106"
+  hs_bindgen_47cea9780ae3c106_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetMouseNameForID@
+hs_bindgen_47cea9780ae3c106
+  :: SDL_MouseID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_47cea9780ae3c106 =
+  BG.fromFFIType hs_bindgen_47cea9780ae3c106_base
+
+-- | Get the name of a mouse.
+--
+--     This function returns \"\" if the mouse doesn\'t have a name.
+--
+--     [Returns]: the name of the selected mouse, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMice'
+--
+--     [C declaration]: @SDL_GetMouseNameForID@, defined at @SDL3\/SDL_mouse.h 266:42@
+sDL_GetMouseNameForID
+  :: SDL_MouseID
+  -- ^
+  --
+  --           [@instance_id@]: the mouse instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetMouseNameForID = hs_bindgen_47cea9780ae3c106
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetMouseFocus@
+foreign import ccall unsafe "hs_bindgen_053bab05e16f443e"
+  hs_bindgen_053bab05e16f443e_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetMouseFocus@
+hs_bindgen_053bab05e16f443e :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+hs_bindgen_053bab05e16f443e =
+  BG.fromFFIType hs_bindgen_053bab05e16f443e_base
+
+-- | Get the window which currently has mouse focus.
+--
+--     [Returns]: the window with mouse focus.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetMouseFocus@, defined at @SDL3\/SDL_mouse.h 277:42@
+sDL_GetMouseFocus :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+sDL_GetMouseFocus = hs_bindgen_053bab05e16f443e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetMouseState@
+foreign import ccall unsafe "hs_bindgen_f18a766f4a177029"
+  hs_bindgen_f18a766f4a177029_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetMouseState@
+hs_bindgen_f18a766f4a177029
+  :: BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO SDL_MouseButtonFlags
+hs_bindgen_f18a766f4a177029 =
+  BG.fromFFIType hs_bindgen_f18a766f4a177029_base
+
+-- | Query SDL\'s cache for the synchronous mouse button state and the window-relative SDL-cursor position.
+--
+--     This function returns the cached synchronous state as SDL understands it from the last pump of the event queue.
+--
+--     To query the platform for immediate asynchronous state, use SDL_GetGlobalMouseState.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y coordinates relative to the focused window.
+--
+--     In Relative Mode, the SDL-cursor\'s position usually contradicts the platform-cursor\'s position as manually calculated from @SDL_GetGlobalMouseState()@ and SDL_GetWindowPosition.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGlobalMouseState', 'sDL_GetRelativeMouseState'
+--
+--     [C declaration]: @SDL_GetMouseState@, defined at @SDL3\/SDL_mouse.h 310:50@
+sDL_GetMouseState
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the SDL-cursor\'s x-position from the focused window\'s top left corner, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the SDL-cursor\'s y-position from the focused window\'s top left corner, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+sDL_GetMouseState = hs_bindgen_f18a766f4a177029
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetGlobalMouseState@
+foreign import ccall unsafe "hs_bindgen_4b743c0e1b7fc8fc"
+  hs_bindgen_4b743c0e1b7fc8fc_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetGlobalMouseState@
+hs_bindgen_4b743c0e1b7fc8fc
+  :: BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO SDL_MouseButtonFlags
+hs_bindgen_4b743c0e1b7fc8fc =
+  BG.fromFFIType hs_bindgen_4b743c0e1b7fc8fc_base
+
+-- | Query the platform for the asynchronous mouse button state and the desktop-relative platform-cursor position.
+--
+--     This function immediately queries the platform for the most recent asynchronous state, more costly than retrieving SDL\'s cached state in @SDL_GetMouseState()@.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y coordinates relative to the desktop.
+--
+--     In Relative Mode, the platform-cursor\'s position usually contradicts the SDL-cursor\'s position as manually calculated from @SDL_GetMouseState()@ and SDL_GetWindowPosition.
+--
+--     This function can be useful if you need to track the mouse outside of a specific window and @SDL_CaptureMouse()@ doesn\'t fit your needs. For example, it could be useful if you need to track the mouse while dragging a window, where coordinates relative to a window might not be in sync at all times.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CaptureMouse', 'sDL_GetMouseState', 'sDL_GetGlobalMouseState'
+--
+--     [C declaration]: @SDL_GetGlobalMouseState@, defined at @SDL3\/SDL_mouse.h 347:50@
+sDL_GetGlobalMouseState
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the platform-cursor\'s x-position from the desktop\'s top left corner, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the platform-cursor\'s y-position from the desktop\'s top left corner, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+sDL_GetGlobalMouseState = hs_bindgen_4b743c0e1b7fc8fc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetRelativeMouseState@
+foreign import ccall unsafe "hs_bindgen_d841c68d1482079a"
+  hs_bindgen_d841c68d1482079a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetRelativeMouseState@
+hs_bindgen_d841c68d1482079a
+  :: BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO SDL_MouseButtonFlags
+hs_bindgen_d841c68d1482079a =
+  BG.fromFFIType hs_bindgen_d841c68d1482079a_base
+
+-- | Query SDL\'s cache for the synchronous mouse button state and accumulated mouse delta since last call.
+--
+--     This function returns the cached synchronous state as SDL understands it from the last pump of the event queue.
+--
+--     To query the platform for immediate asynchronous state, use SDL_GetGlobalMouseState.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y deltas accumulated since the last call to this function (or since event initialization).
+--
+--     This function is useful for reducing overhead by processing relative mouse inputs in one go per-frame instead of individually per-event, at the expense of losing the order between events within the frame (e.g. quickly pressing and releasing a button within the same frame).
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMouseState', 'sDL_GetGlobalMouseState'
+--
+--     [C declaration]: @SDL_GetRelativeMouseState@, defined at @SDL3\/SDL_mouse.h 382:50@
+sDL_GetRelativeMouseState
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the x mouse delta accumulated since last call, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the y mouse delta accumulated since last call, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+sDL_GetRelativeMouseState =
+  hs_bindgen_d841c68d1482079a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_WarpMouseInWindow@
+foreign import ccall unsafe "hs_bindgen_0b73aa8f6d98f018"
+  hs_bindgen_0b73aa8f6d98f018_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_WarpMouseInWindow@
+hs_bindgen_0b73aa8f6d98f018
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO ()
+hs_bindgen_0b73aa8f6d98f018 =
+  BG.fromFFIType hs_bindgen_0b73aa8f6d98f018_base
+
+-- | Move the mouse cursor to the given position within the window.
+--
+--     This function generates a mouse motion event if relative mode is not enabled. If relative mode is enabled, you can force mouse events for the warp by setting the SDL_HINT_MOUSE_RELATIVE_WARP_MOTION hint.
+--
+--     Note that this function will appear to succeed, but not actually move the mouse when used over Microsoft Remote Desktop.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WarpMouseGlobal'
+--
+--     [C declaration]: @SDL_WarpMouseInWindow@, defined at @SDL3\/SDL_mouse.h 405:34@
+sDL_WarpMouseInWindow
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to move the mouse into, or NULL for the current mouse focus.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate within the window.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate within the window.
+  -> IO ()
+sDL_WarpMouseInWindow = hs_bindgen_0b73aa8f6d98f018
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_WarpMouseGlobal@
+foreign import ccall unsafe "hs_bindgen_42c0ada5af2a75a6"
+  hs_bindgen_42c0ada5af2a75a6_base
+    :: Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_WarpMouseGlobal@
+hs_bindgen_42c0ada5af2a75a6
+  :: BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_42c0ada5af2a75a6 =
+  BG.fromFFIType hs_bindgen_42c0ada5af2a75a6_base
+
+-- | Move the mouse to the given position in global screen space.
+--
+--     This function generates a mouse motion event.
+--
+--     A failure of this function usually means that it is unsupported by a platform.
+--
+--     Note that this function will appear to succeed, but not actually move the mouse when used over Microsoft Remote Desktop.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_WarpMouseInWindow'
+--
+--     [C declaration]: @SDL_WarpMouseGlobal@, defined at @SDL3\/SDL_mouse.h 430:34@
+sDL_WarpMouseGlobal
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate.
+  -> IO BG.CBool
+sDL_WarpMouseGlobal = hs_bindgen_42c0ada5af2a75a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_SetRelativeMouseTransform@
+foreign import ccall unsafe "hs_bindgen_3431374e48384d8c"
+  hs_bindgen_3431374e48384d8c_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_SetRelativeMouseTransform@
+hs_bindgen_3431374e48384d8c
+  :: SDL_MouseMotionTransformCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_3431374e48384d8c =
+  BG.fromFFIType hs_bindgen_3431374e48384d8c_base
+
+-- | Set a user-defined function by which to transform relative mouse inputs.
+--
+--     This overrides the relative system scale and relative speed scale hints. Should be called prior to enabling relative mouse mode, fails otherwise.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetRelativeMouseTransform@, defined at @SDL3\/SDL_mouse.h 448:34@
+sDL_SetRelativeMouseTransform
+  :: SDL_MouseMotionTransformCallback
+  -- ^
+  --
+  --           [@callback@]: a callback used to transform relative mouse motion, or NULL for default behavior.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that will be passed to @callback@.
+  -> IO BG.CBool
+sDL_SetRelativeMouseTransform =
+  hs_bindgen_3431374e48384d8c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_SetWindowRelativeMouseMode@
+foreign import ccall unsafe "hs_bindgen_df14f3a2272073d3"
+  hs_bindgen_df14f3a2272073d3_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_SetWindowRelativeMouseMode@
+hs_bindgen_df14f3a2272073d3
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_df14f3a2272073d3 =
+  BG.fromFFIType hs_bindgen_df14f3a2272073d3_base
+
+-- | Set relative mouse mode for a window.
+--
+--     While the window has focus and relative mouse mode is enabled, the cursor is hidden, the mouse position is constrained to the window, and SDL will report continuous relative mouse motion even if the mouse is at the edge of the window.
+--
+--     If you\'d like to keep the mouse position fixed while in relative mode you can use SDL_SetWindowMouseRect(). If you\'d like the cursor to be at a specific location when relative mode ends, you should use @SDL_WarpMouseInWindow()@ before disabling relative mode.
+--
+--     This function will flush any pending mouse motion for this window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowRelativeMouseMode'
+--
+--     [C declaration]: @SDL_SetWindowRelativeMouseMode@, defined at @SDL3\/SDL_mouse.h 476:34@
+sDL_SetWindowRelativeMouseMode
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: true to enable relative mode, false to disable.
+  -> IO BG.CBool
+sDL_SetWindowRelativeMouseMode =
+  hs_bindgen_df14f3a2272073d3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetWindowRelativeMouseMode@
+foreign import ccall unsafe "hs_bindgen_60e1427dc7059277"
+  hs_bindgen_60e1427dc7059277_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetWindowRelativeMouseMode@
+hs_bindgen_60e1427dc7059277
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO BG.CBool
+hs_bindgen_60e1427dc7059277 =
+  BG.fromFFIType hs_bindgen_60e1427dc7059277_base
+
+-- | Query whether relative mouse mode is enabled for a window.
+--
+--     [Returns]: true if relative mode is enabled for a window or false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowRelativeMouseMode'
+--
+--     [C declaration]: @SDL_GetWindowRelativeMouseMode@, defined at @SDL3\/SDL_mouse.h 490:34@
+sDL_GetWindowRelativeMouseMode
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CBool
+sDL_GetWindowRelativeMouseMode =
+  hs_bindgen_60e1427dc7059277
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CaptureMouse@
+foreign import ccall unsafe "hs_bindgen_61b615e5f17d45b5"
+  hs_bindgen_61b615e5f17d45b5_base
+    :: BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CaptureMouse@
+hs_bindgen_61b615e5f17d45b5
+  :: BG.CBool
+  -> IO BG.CBool
+hs_bindgen_61b615e5f17d45b5 =
+  BG.fromFFIType hs_bindgen_61b615e5f17d45b5_base
+
+-- | Capture the mouse and to track input outside an SDL window.
+--
+--     Capturing enables your app to obtain mouse events globally, instead of just within your window. Not all video targets support this function. When capturing is enabled, the current window will get all mouse events, but unlike relative mode, no change is made to the cursor and it is not restrained to your window.
+--
+--     This function may also deny mouse input to other windows both those in your application and others on the system so you should use this function sparingly, and in small bursts. For example, you might want to track the mouse while the user is dragging something, until the user releases a mouse button. It is not recommended that you capture the mouse for long periods of time, such as the entire time your app is running. For that, you should probably use @SDL_SetWindowRelativeMouseMode()@ or SDL_SetWindowMouseGrab(), depending on your goals.
+--
+--     While captured, mouse events still report coordinates relative to the current (foreground) window, but those coordinates may be outside the bounds of the window (including negative values). Capturing is only allowed for the foreground window. If the window loses focus while capturing, the capture will be disabled automatically.
+--
+--     While capturing is enabled, the current window will have the @SDL_WINDOW_MOUSE_CAPTURE@ flag set.
+--
+--     Please note that SDL will attempt to \"auto capture\" the mouse while the user is pressing a button; this is to try and make mouse behavior more consistent between platforms, and deal with the common case of a user dragging the mouse outside of the window. This means that if you are calling @SDL_CaptureMouse()@ only to deal with this situation, you do not have to (although it is safe to do so). If this causes problems for your app, you can disable auto capture by setting the @SDL_HINT_MOUSE_AUTO_CAPTURE@ hint to zero.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetGlobalMouseState'
+--
+--     [C declaration]: @SDL_CaptureMouse@, defined at @SDL3\/SDL_mouse.h 538:34@
+sDL_CaptureMouse
+  :: BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: true to enable capturing, false to disable.
+  -> IO BG.CBool
+sDL_CaptureMouse = hs_bindgen_61b615e5f17d45b5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CreateCursor@
+foreign import ccall unsafe "hs_bindgen_14364d58f2a5fb7e"
+  hs_bindgen_14364d58f2a5fb7e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CreateCursor@
+hs_bindgen_14364d58f2a5fb7e
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> IO (BG.Ptr SDL_Cursor)
+hs_bindgen_14364d58f2a5fb7e =
+  BG.fromFFIType hs_bindgen_14364d58f2a5fb7e_base
+
+-- | Create a cursor using the specified bitmap data and mask (in MSB format).
+--
+--     @mask@ has to be in MSB (Most Significant Bit) format.
+--
+--     The cursor width (@w@) must be a multiple of 8 bits.
+--
+--     The cursor is created in black and white according to the following:
+--
+--     * data=0, mask=1: white
+--
+--     * data=1, mask=1: black
+--
+--     * data=0, mask=0: transparent
+--
+--     * data=1, mask=0: inverted color if possible, black if not.
+--
+--     Cursors created with this function must be freed with @SDL_DestroyCursor()@.
+--
+--     If you want to have a color cursor, or create your cursor from an SDL_Surface, you should use @SDL_CreateColorCursor()@. Alternately, you can hide the cursor and draw your own as part of your game\'s rendering, but it will be bound to the framerate.
+--
+--     Also, @SDL_CreateSystemCursor()@ is available, which provides several readily-available system cursors to pick from.
+--
+--     [Returns]: a new cursor with the specified parameters on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAnimatedCursor', 'sDL_CreateColorCursor', 'sDL_CreateSystemCursor', 'sDL_DestroyCursor', 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_CreateCursor@, defined at @SDL3\/SDL_mouse.h 585:42@
+sDL_CreateCursor
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@data@]: the color value for each pixel of the cursor.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@mask@]: the mask value for each pixel of the cursor.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the cursor.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the cursor.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_x@]: the x-axis offset from the left of the cursor image to the mouse x position, in the range of 0 to @w@ - 1.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_y@]: the y-axis offset from the top of the cursor image to the mouse y position, in the range of 0 to @h@ - 1.
+  -> IO (BG.Ptr SDL_Cursor)
+sDL_CreateCursor = hs_bindgen_14364d58f2a5fb7e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CreateColorCursor@
+foreign import ccall unsafe "hs_bindgen_fa20cf5972b0b3ea"
+  hs_bindgen_fa20cf5972b0b3ea_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CreateColorCursor@
+hs_bindgen_fa20cf5972b0b3ea
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> IO (BG.Ptr SDL_Cursor)
+hs_bindgen_fa20cf5972b0b3ea =
+  BG.fromFFIType hs_bindgen_fa20cf5972b0b3ea_base
+
+-- | Create a color cursor.
+--
+--     If this function is passed a surface with alternate representations added with SDL_AddSurfaceAlternateImage(), the surface will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations if SDL_HINT_MOUSE_DPI_SCALE_CURSORS is enabled. For example, if the original surface is 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     [Returns]: the new cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_AddSurfaceAlternateImage, 'sDL_CreateAnimatedCursor', 'sDL_CreateCursor', 'sDL_CreateSystemCursor', 'sDL_DestroyCursor', 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_CreateColorCursor@, defined at @SDL3\/SDL_mouse.h 622:42@
+sDL_CreateColorCursor
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: an SDL_Surface structure representing the cursor image.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_x@]: the x position of the cursor hot spot.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_y@]: the y position of the cursor hot spot.
+  -> IO (BG.Ptr SDL_Cursor)
+sDL_CreateColorCursor = hs_bindgen_fa20cf5972b0b3ea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CreateAnimatedCursor@
+foreign import ccall unsafe "hs_bindgen_d361ef168725ef94"
+  hs_bindgen_d361ef168725ef94_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CreateAnimatedCursor@
+hs_bindgen_d361ef168725ef94
+  :: BG.Ptr SDL_CursorFrameInfo
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> IO (BG.Ptr SDL_Cursor)
+hs_bindgen_d361ef168725ef94 =
+  BG.fromFFIType hs_bindgen_d361ef168725ef94_base
+
+-- | Create an animated color cursor.
+--
+--     Animated cursors are composed of a sequential array of frames, specified as surfaces and durations in an array of 'SDL_CursorFrameInfo' structs. The hot spot coordinates are universal to all frames, and all frames must have the same dimensions.
+--
+--     Frame durations are specified in milliseconds. A duration of 0 implies an infinite frame time, and the animation will stop on that frame. To create a one-shot animation, set the duration of the last frame in the sequence to 0.
+--
+--     If this function is passed surfaces with alternate representations added with SDL_AddSurfaceAlternateImage(), the surfaces will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations. For example, if the original surfaces are 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     If the underlying platform does not support animated cursors, this function will fall back to creating a static color cursor using the first frame in the sequence.
+--
+--     [Returns]: the new cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: SDL_AddSurfaceAlternateImage, 'sDL_CreateCursor', 'sDL_CreateColorCursor', 'sDL_CreateSystemCursor', 'sDL_DestroyCursor', 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_CreateAnimatedCursor@, defined at @SDL3\/SDL_mouse.h 672:41@
+sDL_CreateAnimatedCursor
+  :: BG.Ptr SDL_CursorFrameInfo
+  -- ^
+  --
+  --           [@frames@]: an array of cursor images composing the animation.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@frame_count@]: the number of frames in the sequence.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_x@]: the x position of the cursor hot spot.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@hot_y@]: the y position of the cursor hot spot.
+  -> IO (BG.Ptr SDL_Cursor)
+sDL_CreateAnimatedCursor =
+  hs_bindgen_d361ef168725ef94
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CreateSystemCursor@
+foreign import ccall unsafe "hs_bindgen_c34ca154a7bf13af"
+  hs_bindgen_c34ca154a7bf13af_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CreateSystemCursor@
+hs_bindgen_c34ca154a7bf13af
+  :: SDL_SystemCursor
+  -> IO (BG.Ptr SDL_Cursor)
+hs_bindgen_c34ca154a7bf13af =
+  BG.fromFFIType hs_bindgen_c34ca154a7bf13af_base
+
+-- | Create a system cursor.
+--
+--     [Returns]: a cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyCursor'
+--
+--     [C declaration]: @SDL_CreateSystemCursor@, defined at @SDL3\/SDL_mouse.h 690:42@
+sDL_CreateSystemCursor
+  :: SDL_SystemCursor
+  -- ^
+  --
+  --           [@id@]: an 'SDL_SystemCursor' enum value.
+  -> IO (BG.Ptr SDL_Cursor)
+sDL_CreateSystemCursor = hs_bindgen_c34ca154a7bf13af
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_SetCursor@
+foreign import ccall unsafe "hs_bindgen_c79cfea2c2a40f90"
+  hs_bindgen_c79cfea2c2a40f90_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_SetCursor@
+hs_bindgen_c79cfea2c2a40f90
+  :: BG.Ptr SDL_Cursor
+  -> IO BG.CBool
+hs_bindgen_c79cfea2c2a40f90 =
+  BG.fromFFIType hs_bindgen_c79cfea2c2a40f90_base
+
+-- | Set the active cursor.
+--
+--     This function sets the currently active cursor to the specified one. If the cursor is currently visible, the change will be immediately represented on the display. SDL_SetCursor(NULL) can be used to force cursor redraw, if this is desired for any reason.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCursor'
+--
+--     [C declaration]: @SDL_SetCursor@, defined at @SDL3\/SDL_mouse.h 710:34@
+sDL_SetCursor
+  :: BG.Ptr SDL_Cursor
+  -- ^
+  --
+  --           [@cursor@]: a cursor to make active.
+  -> IO BG.CBool
+sDL_SetCursor = hs_bindgen_c79cfea2c2a40f90
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetCursor@
+foreign import ccall unsafe "hs_bindgen_9e2eefba89a09501"
+  hs_bindgen_9e2eefba89a09501_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetCursor@
+hs_bindgen_9e2eefba89a09501 :: IO (BG.Ptr SDL_Cursor)
+hs_bindgen_9e2eefba89a09501 =
+  BG.fromFFIType hs_bindgen_9e2eefba89a09501_base
+
+-- | Get the active cursor.
+--
+--     This function returns a pointer to the current cursor which is owned by the library. It is not necessary to free the cursor with @SDL_DestroyCursor()@.
+--
+--     [Returns]: the active cursor or NULL if there is no mouse.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetCursor'
+--
+--     [C declaration]: @SDL_GetCursor@, defined at @SDL3\/SDL_mouse.h 726:42@
+sDL_GetCursor :: IO (BG.Ptr SDL_Cursor)
+sDL_GetCursor = hs_bindgen_9e2eefba89a09501
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetDefaultCursor@
+foreign import ccall unsafe "hs_bindgen_b81cd185a7b75943"
+  hs_bindgen_b81cd185a7b75943_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_GetDefaultCursor@
+hs_bindgen_b81cd185a7b75943 :: IO (BG.Ptr SDL_Cursor)
+hs_bindgen_b81cd185a7b75943 =
+  BG.fromFFIType hs_bindgen_b81cd185a7b75943_base
+
+-- | Get the default cursor.
+--
+--     You do not have to call @SDL_DestroyCursor()@ on the return value, but it is safe to do so.
+--
+--     [Returns]: the default cursor on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDefaultCursor@, defined at @SDL3\/SDL_mouse.h 741:42@
+sDL_GetDefaultCursor :: IO (BG.Ptr SDL_Cursor)
+sDL_GetDefaultCursor = hs_bindgen_b81cd185a7b75943
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_DestroyCursor@
+foreign import ccall unsafe "hs_bindgen_fd4d057091dc9dcc"
+  hs_bindgen_fd4d057091dc9dcc_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_DestroyCursor@
+hs_bindgen_fd4d057091dc9dcc
+  :: BG.Ptr SDL_Cursor
+  -> IO ()
+hs_bindgen_fd4d057091dc9dcc =
+  BG.fromFFIType hs_bindgen_fd4d057091dc9dcc_base
+
+-- | Free a previously-created cursor.
+--
+--     Use this function to free cursor resources created with @SDL_CreateCursor()@, @SDL_CreateColorCursor()@ or @SDL_CreateSystemCursor()@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateAnimatedCursor', 'sDL_CreateColorCursor', 'sDL_CreateCursor', 'sDL_CreateSystemCursor'
+--
+--     [C declaration]: @SDL_DestroyCursor@, defined at @SDL3\/SDL_mouse.h 760:34@
+sDL_DestroyCursor
+  :: BG.Ptr SDL_Cursor
+  -- ^
+  --
+  --           [@cursor@]: the cursor to free.
+  -> IO ()
+sDL_DestroyCursor = hs_bindgen_fd4d057091dc9dcc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_ShowCursor@
+foreign import ccall unsafe "hs_bindgen_79db044ed9d49e1d"
+  hs_bindgen_79db044ed9d49e1d_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_ShowCursor@
+hs_bindgen_79db044ed9d49e1d :: IO BG.CBool
+hs_bindgen_79db044ed9d49e1d =
+  BG.fromFFIType hs_bindgen_79db044ed9d49e1d_base
+
+-- | Show the cursor.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CursorVisible', 'sDL_HideCursor'
+--
+--     [C declaration]: @SDL_ShowCursor@, defined at @SDL3\/SDL_mouse.h 775:34@
+sDL_ShowCursor :: IO BG.CBool
+sDL_ShowCursor = hs_bindgen_79db044ed9d49e1d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_HideCursor@
+foreign import ccall unsafe "hs_bindgen_f07aff8d3a047b77"
+  hs_bindgen_f07aff8d3a047b77_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_HideCursor@
+hs_bindgen_f07aff8d3a047b77 :: IO BG.CBool
+hs_bindgen_f07aff8d3a047b77 =
+  BG.fromFFIType hs_bindgen_f07aff8d3a047b77_base
+
+-- | Hide the cursor.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CursorVisible', 'sDL_ShowCursor'
+--
+--     [C declaration]: @SDL_HideCursor@, defined at @SDL3\/SDL_mouse.h 790:34@
+sDL_HideCursor :: IO BG.CBool
+sDL_HideCursor = hs_bindgen_f07aff8d3a047b77
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CursorVisible@
+foreign import ccall unsafe "hs_bindgen_1d7b9f91212450ba"
+  hs_bindgen_1d7b9f91212450ba_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mouse_Unsafe_SDL_CursorVisible@
+hs_bindgen_1d7b9f91212450ba :: IO BG.CBool
+hs_bindgen_1d7b9f91212450ba =
+  BG.fromFFIType hs_bindgen_1d7b9f91212450ba_base
+
+-- | Return whether the cursor is currently being shown.
+--
+--     [Returns]: @true@ if the cursor is being shown, or @false@ if the cursor is hidden.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HideCursor', 'sDL_ShowCursor'
+--
+--     [C declaration]: @SDL_CursorVisible@, defined at @SDL3\/SDL_mouse.h 805:34@
+sDL_CursorVisible :: IO BG.CBool
+sDL_CursorVisible = hs_bindgen_1d7b9f91212450ba
diff --git a/src/SDL3/Sys/Bindgen/Mutex.hs b/src/SDL3/Sys/Bindgen/Mutex.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Mutex.hs
@@ -0,0 +1,378 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+module SDL3.Sys.Bindgen.Mutex (
+  SDL3.Sys.Bindgen.Mutex.SDL_Mutex,
+  SDL3.Sys.Bindgen.Mutex.SDL_RWLock,
+  SDL3.Sys.Bindgen.Mutex.SDL_Semaphore,
+  SDL3.Sys.Bindgen.Mutex.SDL_Condition,
+  SDL3.Sys.Bindgen.Mutex.SDL_InitStatus (..),
+  pattern SDL3.Sys.Bindgen.Mutex.SDL_INIT_STATUS_UNINITIALIZED,
+  pattern SDL3.Sys.Bindgen.Mutex.SDL_INIT_STATUS_INITIALIZING,
+  pattern SDL3.Sys.Bindgen.Mutex.SDL_INIT_STATUS_INITIALIZED,
+  pattern SDL3.Sys.Bindgen.Mutex.SDL_INIT_STATUS_UNINITIALIZING,
+  SDL3.Sys.Bindgen.Mutex.SDL_InitState (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Atomic qualified
+import SDL3.Sys.Bindgen.Thread qualified
+
+-- | A means to serialize access to a resource between threads.
+--
+--     Mutexes (short for \"mutual exclusion\") are a synchronization primitive that allows exactly one thread to proceed at a time.
+--
+--     Wikipedia has a thorough explanation of the concept:
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Mutex](https://en.wikipedia.org/wiki/Mutex)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_Mutex@, defined at @SDL3\/SDL_mutex.h 296:16@
+data SDL_Mutex
+
+-- | A mutex that allows read-only threads to run in parallel.
+--
+--     A rwlock is roughly the same concept as 'SDL_Mutex', but allows threads that request read-only access to all hold the lock at the same time. If a thread requests write access, it will block until all read-only threads have released the lock, and no one else can hold the thread (for reading or writing) at the same time as the writing thread.
+--
+--     This can be more efficient in cases where several threads need to access data frequently, but changes to that data are rare.
+--
+--     There are other rules that apply to rwlocks that don\'t apply to mutexes, about how threads are scheduled and when they can be recursively locked. These are documented in the other rwlock functions.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_RWLock@, defined at @SDL3\/SDL_mutex.h 437:16@
+data SDL_RWLock
+
+-- | A means to manage access to a resource, by count, between threads.
+--
+--     Semaphores (specifically, \"counting semaphores\"), let X number of threads request access at the same time, each thread granted access decrementing a counter. When the counter reaches zero, future requests block until a prior thread releases their request, incrementing the counter again.
+--
+--     Wikipedia has a thorough explanation of the concept:
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Semaphore_(programming)](https://en.wikipedia.org/wiki/Semaphore_(programming))
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_Semaphore@, defined at @SDL3\/SDL_mutex.h 682:16@
+data SDL_Semaphore
+
+-- | A means to block multiple threads until a condition is satisfied.
+--
+--     Condition variables, paired with an 'SDL_Mutex', let an app halt multiple threads until a condition has occurred, at which time the app can release one or all waiting threads.
+--
+--     Wikipedia has a thorough explanation of the concept:
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Condition_variable](https://en.wikipedia.org/wiki/Condition_variable)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_Condition@, defined at @SDL3\/SDL_mutex.h 839:16@
+data SDL_Condition
+
+-- | The current status of an 'SDL_InitState' structure.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_InitStatus@, defined at @SDL3\/SDL_mutex.h 973:14@
+newtype SDL_InitStatus = SDL_InitStatus
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_InitStatus where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_InitStatus where
+  readRaw =
+    \ptr0 ->
+      pure SDL_InitStatus
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_InitStatus where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_InitStatus unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_InitStatus instance BG.Storable SDL_InitStatus
+
+deriving via BG.CUInt instance BG.Prim SDL_InitStatus
+
+instance CEnum.CEnum SDL_InitStatus where
+  type CEnumZ SDL_InitStatus = BG.CUInt
+
+  toCEnum = SDL_InitStatus
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_INIT_STATUS_UNINITIALIZED")
+        , (1, BG.singleton "SDL_INIT_STATUS_INITIALIZING")
+        , (2, BG.singleton "SDL_INIT_STATUS_INITIALIZED")
+        , (3, BG.singleton "SDL_INIT_STATUS_UNINITIALIZING")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_InitStatus"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_InitStatus"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_InitStatus where
+  minDeclaredValue = SDL_INIT_STATUS_UNINITIALIZED
+
+  maxDeclaredValue = SDL_INIT_STATUS_UNINITIALIZING
+
+instance Show SDL_InitStatus where
+  showsPrec = CEnum.shows
+
+instance Read SDL_InitStatus where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_InitStatus ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_InitStatus{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_InitStatus) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_InitStatus "unwrap" where
+  type CFieldType SDL_InitStatus "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_INIT_STATUS_UNINITIALIZED@, defined at @SDL3\/SDL_mutex.h 975:5@
+pattern SDL_INIT_STATUS_UNINITIALIZED :: SDL_InitStatus
+pattern SDL_INIT_STATUS_UNINITIALIZED = SDL_InitStatus 0
+
+-- | [C declaration]: @SDL_INIT_STATUS_INITIALIZING@, defined at @SDL3\/SDL_mutex.h 976:5@
+pattern SDL_INIT_STATUS_INITIALIZING :: SDL_InitStatus
+pattern SDL_INIT_STATUS_INITIALIZING = SDL_InitStatus 1
+
+-- | [C declaration]: @SDL_INIT_STATUS_INITIALIZED@, defined at @SDL3\/SDL_mutex.h 977:5@
+pattern SDL_INIT_STATUS_INITIALIZED :: SDL_InitStatus
+pattern SDL_INIT_STATUS_INITIALIZED = SDL_InitStatus 2
+
+-- | [C declaration]: @SDL_INIT_STATUS_UNINITIALIZING@, defined at @SDL3\/SDL_mutex.h 978:5@
+pattern SDL_INIT_STATUS_UNINITIALIZING :: SDL_InitStatus
+pattern SDL_INIT_STATUS_UNINITIALIZING = SDL_InitStatus 3
+
+-- | A structure used for thread-safe initialization and shutdown.
+--
+--     Here is an example of using this:
+--
+--     @
+--     static SDL_InitState init;
+--
+--     bool InitSystem(void)
+--     {
+--         if (!SDL_ShouldInit(&init)) {
+--             \/\/ The system is initialized
+--             return true;
+--         }
+--
+--         \/\/ At this point, you should not leave this function without calling SDL_SetInitialized()
+--
+--         bool initialized = DoInitTasks();
+--         SDL_SetInitialized(&init, initialized);
+--         return initialized;
+--     }
+--
+--     bool UseSubsystem(void)
+--     {
+--         if (SDL_ShouldInit(&init)) {
+--             \/\/ Error, the subsystem isn\'t initialized
+--             SDL_SetInitialized(&init, false);
+--             return false;
+--         }
+--
+--         \/\/ Do work using the initialized subsystem
+--
+--         return true;
+--     }
+--
+--     void QuitSystem(void)
+--     {
+--         if (!SDL_ShouldQuit(&init)) {
+--             \/\/ The system is not initialized
+--             return;
+--         }
+--
+--         \/\/ At this point, you should not leave this function without calling SDL_SetInitialized()
+--
+--         DoQuitTasks();
+--         SDL_SetInitialized(&init, false);
+--     }
+--     @
+--
+--     Note that this doesn\'t protect any resources created during initialization, or guarantee that nobody is using those resources during cleanup. You should use other mechanisms to protect those, if that\'s a concern for your code.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_InitState@, defined at @SDL3\/SDL_mutex.h 1037:16@
+data SDL_InitState = SDL_InitState
+  { status :: SDL3.Sys.Bindgen.Atomic.SDL_AtomicInt
+  -- ^ [C declaration]: @status@, defined at @SDL3\/SDL_mutex.h 1039:19@
+  , thread :: SDL3.Sys.Bindgen.Thread.SDL_ThreadID
+  -- ^ [C declaration]: @thread@, defined at @SDL3\/SDL_mutex.h 1040:18@
+  , reserved :: BG.Ptr BG.Void
+  -- ^ [C declaration]: @reserved@, defined at @SDL3\/SDL_mutex.h 1041:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_InitState where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_InitState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_InitState
+        <*> HasCField.readRaw (BG.Proxy @"status") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"thread") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+
+instance Marshal.WriteRaw SDL_InitState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_InitState status2 thread3 reserved4 ->
+            HasCField.writeRaw (BG.Proxy @"status") ptr0 status2
+              >> HasCField.writeRaw (BG.Proxy @"thread") ptr0 thread3
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved4
+
+deriving via Marshal.EquivStorable SDL_InitState instance BG.Storable SDL_InitState
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Atomic.SDL_AtomicInt)
+  => BG.CompatHasField.HasField "status" SDL_InitState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_InitState
+            { status = y1
+            , thread = BG.getField @"thread" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"status" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Atomic.SDL_AtomicInt)
+  => BG.HasField "status" (BG.Ptr SDL_InitState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"status")
+
+instance HasCField.HasCField SDL_InitState "status" where
+  type
+    CFieldType SDL_InitState "status" =
+      SDL3.Sys.Bindgen.Atomic.SDL_AtomicInt
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Thread.SDL_ThreadID)
+  => BG.CompatHasField.HasField "thread" SDL_InitState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_InitState
+            { thread = y1
+            , status = BG.getField @"status" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"thread" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Thread.SDL_ThreadID)
+  => BG.HasField "thread" (BG.Ptr SDL_InitState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"thread")
+
+instance HasCField.HasCField SDL_InitState "thread" where
+  type
+    CFieldType SDL_InitState "thread" =
+      SDL3.Sys.Bindgen.Thread.SDL_ThreadID
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "reserved" SDL_InitState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_InitState
+            { reserved = y1
+            , status = BG.getField @"status" x0
+            , thread = BG.getField @"thread" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "reserved" (BG.Ptr SDL_InitState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_InitState "reserved" where
+  type
+    CFieldType SDL_InitState "reserved" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 16
diff --git a/src/SDL3/Sys/Bindgen/Mutex/FunPtr.hs b/src/SDL3/Sys/Bindgen/Mutex/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Mutex/FunPtr.hs
@@ -0,0 +1,1174 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Mutex.FunPtr (
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_CreateMutex,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_LockMutex,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_TryLockMutex,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_UnlockMutex,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_DestroyMutex,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_CreateRWLock,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_LockRWLockForReading,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_LockRWLockForWriting,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_TryLockRWLockForReading,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_TryLockRWLockForWriting,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_UnlockRWLock,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_DestroyRWLock,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_CreateSemaphore,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_DestroySemaphore,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_WaitSemaphore,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_TryWaitSemaphore,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_WaitSemaphoreTimeout,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_SignalSemaphore,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_GetSemaphoreValue,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_CreateCondition,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_DestroyCondition,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_SignalCondition,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_BroadcastCondition,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_WaitCondition,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_WaitConditionTimeout,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_ShouldInit,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_ShouldQuit,
+  SDL3.Sys.Bindgen.Mutex.FunPtr.sDL_SetInitialized,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Mutex
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_mutex.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateMutex */"
+         , "__attribute__ ((const))"
+         , "SDL_Mutex *(*hs_bindgen_95a099535000d13d (void)) (void)"
+         , "{"
+         , "  return &SDL_CreateMutex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_LockMutex */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_df61bce804eff3b2 (void)) ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_LockMutex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryLockMutex */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_45c6ae563e57d83e (void)) ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_TryLockMutex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_UnlockMutex */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_279301ff47dc6a1f (void)) ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_UnlockMutex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroyMutex */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_41ed6e14b48302a3 (void)) ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyMutex;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateRWLock */"
+         , "__attribute__ ((const))"
+         , "SDL_RWLock *(*hs_bindgen_3eb0c1367593e404 (void)) (void)"
+         , "{"
+         , "  return &SDL_CreateRWLock;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_LockRWLockForReading */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_1d6189a38a9e5f28 (void)) ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_LockRWLockForReading;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_LockRWLockForWriting */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_badbac25bb2ac3e5 (void)) ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_LockRWLockForWriting;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryLockRWLockForReading */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1e5ea8850474c50f (void)) ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_TryLockRWLockForReading;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryLockRWLockForWriting */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a11f0d78039b31a7 (void)) ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_TryLockRWLockForWriting;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_UnlockRWLock */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_769c3da328a63de5 (void)) ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_UnlockRWLock;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroyRWLock */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_7a7492595f34e502 (void)) ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyRWLock;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateSemaphore */"
+         , "__attribute__ ((const))"
+         , "SDL_Semaphore *(*hs_bindgen_22509b0bb44ec2c1 (void)) ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateSemaphore;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroySemaphore */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_1f077a5303df061a (void)) ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroySemaphore;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitSemaphore */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_91a2349e7496eeae (void)) ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitSemaphore;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryWaitSemaphore */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_81872972bd3486d3 (void)) ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_TryWaitSemaphore;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitSemaphoreTimeout */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_0a26128dc146ea69 (void)) ("
+         , "  SDL_Semaphore *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitSemaphoreTimeout;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_SignalSemaphore */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_9af09ce180d458b9 (void)) ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SignalSemaphore;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_GetSemaphoreValue */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_5ee888052e9adc81 (void)) ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSemaphoreValue;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateCondition */"
+         , "__attribute__ ((const))"
+         , "SDL_Condition *(*hs_bindgen_07cf0a76ca2c83d0 (void)) (void)"
+         , "{"
+         , "  return &SDL_CreateCondition;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroyCondition */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_99bba06553492457 (void)) ("
+         , "  SDL_Condition *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyCondition;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_SignalCondition */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_a9b4bfe1c85d2caa (void)) ("
+         , "  SDL_Condition *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SignalCondition;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_BroadcastCondition */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_26d1393d70aa1e21 (void)) ("
+         , "  SDL_Condition *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_BroadcastCondition;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitCondition */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_5c1581c6a748ae80 (void)) ("
+         , "  SDL_Condition *arg1,"
+         , "  SDL_Mutex *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitCondition;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitConditionTimeout */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_0498ed88d8c2daca (void)) ("
+         , "  SDL_Condition *arg1,"
+         , "  SDL_Mutex *arg2,"
+         , "  Sint32 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitConditionTimeout;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_ShouldInit */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4da27525ce560809 (void)) ("
+         , "  SDL_InitState *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ShouldInit;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_ShouldQuit */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6877992dc5bc2120 (void)) ("
+         , "  SDL_InitState *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ShouldQuit;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_SetInitialized */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_d08e1c271251d0d2 (void)) ("
+         , "  SDL_InitState *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetInitialized;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateMutex@
+foreign import ccall unsafe "hs_bindgen_95a099535000d13d"
+  hs_bindgen_95a099535000d13d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateMutex@
+hs_bindgen_95a099535000d13d :: IO (BG.FunPtr (IO (BG.Ptr SDL_Mutex)))
+hs_bindgen_95a099535000d13d =
+  BG.fromFFIType hs_bindgen_95a099535000d13d_base
+
+{-# NOINLINE sDL_CreateMutex #-}
+
+-- | Create a new mutex.
+--
+--     All newly-created mutexes begin in the /unlocked/ state.
+--
+--     Calls to @SDL_LockMutex()@ will not return while the mutex is locked by another thread. See @SDL_TryLockMutex()@ to attempt to lock without blocking.
+--
+--     SDL mutexes are reentrant.
+--
+--     [Returns]: the initialized and unlocked mutex or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyMutex', 'sDL_LockMutex', 'sDL_TryLockMutex', 'sDL_UnlockMutex'
+--
+--     [C declaration]: @SDL_CreateMutex@, defined at @SDL3\/SDL_mutex.h 320:41@
+sDL_CreateMutex :: BG.FunPtr (IO (BG.Ptr SDL_Mutex))
+sDL_CreateMutex =
+  BG.unsafePerformIO hs_bindgen_95a099535000d13d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_LockMutex@
+foreign import ccall unsafe "hs_bindgen_df61bce804eff3b2"
+  hs_bindgen_df61bce804eff3b2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_LockMutex@
+hs_bindgen_df61bce804eff3b2 :: IO (BG.FunPtr (BG.Ptr SDL_Mutex -> IO ()))
+hs_bindgen_df61bce804eff3b2 =
+  BG.fromFFIType hs_bindgen_df61bce804eff3b2_base
+
+{-# NOINLINE sDL_LockMutex #-}
+
+-- | Lock the mutex.
+--
+--     This will block until the mutex is available, which is to say it is in the unlocked state and the OS has chosen the caller as the next thread to lock it. Of all threads waiting to lock the mutex, only one may do so at a time.
+--
+--     It is legal for the owning thread to lock an already-locked mutex. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive mutex\").
+--
+--     This function does not fail; if mutex is NULL, it will return immediately having locked nothing. If the mutex is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [@mutex@]: the mutex to lock.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TryLockMutex', 'sDL_UnlockMutex'
+--
+--     [C declaration]: @SDL_LockMutex@, defined at @SDL3\/SDL_mutex.h 346:34@
+sDL_LockMutex :: BG.FunPtr (BG.Ptr SDL_Mutex -> IO ())
+sDL_LockMutex =
+  BG.unsafePerformIO hs_bindgen_df61bce804eff3b2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryLockMutex@
+foreign import ccall unsafe "hs_bindgen_45c6ae563e57d83e"
+  hs_bindgen_45c6ae563e57d83e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryLockMutex@
+hs_bindgen_45c6ae563e57d83e :: IO (BG.FunPtr (BG.Ptr SDL_Mutex -> IO BG.CBool))
+hs_bindgen_45c6ae563e57d83e =
+  BG.fromFFIType hs_bindgen_45c6ae563e57d83e_base
+
+{-# NOINLINE sDL_TryLockMutex #-}
+
+-- | Try to lock a mutex without blocking.
+--
+--     This works just like @SDL_LockMutex()@, but if the mutex is not available, this function returns false immediately.
+--
+--     This technique is useful if you need exclusive access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     This function returns true if passed a NULL mutex.
+--
+--     [@mutex@]: the mutex to try to lock.
+--
+--     [Returns]: true on success, false if the mutex would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockMutex', 'sDL_UnlockMutex'
+--
+--     [C declaration]: @SDL_TryLockMutex@, defined at @SDL3\/SDL_mutex.h 369:34@
+sDL_TryLockMutex :: BG.FunPtr (BG.Ptr SDL_Mutex -> IO BG.CBool)
+sDL_TryLockMutex =
+  BG.unsafePerformIO hs_bindgen_45c6ae563e57d83e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_UnlockMutex@
+foreign import ccall unsafe "hs_bindgen_279301ff47dc6a1f"
+  hs_bindgen_279301ff47dc6a1f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_UnlockMutex@
+hs_bindgen_279301ff47dc6a1f :: IO (BG.FunPtr (BG.Ptr SDL_Mutex -> IO ()))
+hs_bindgen_279301ff47dc6a1f =
+  BG.fromFFIType hs_bindgen_279301ff47dc6a1f_base
+
+{-# NOINLINE sDL_UnlockMutex #-}
+
+-- | Unlock the mutex.
+--
+--     It is legal for the owning thread to lock an already-locked mutex. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive mutex\").
+--
+--     It is illegal to unlock a mutex that has not been locked by the current thread, and doing so results in undefined behavior.
+--
+--     [@mutex@]: the mutex to unlock.
+--
+--     [Thread safety]: This call must be paired with a previous locking call on the same thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockMutex', 'sDL_TryLockMutex'
+--
+--     [C declaration]: @SDL_UnlockMutex@, defined at @SDL3\/SDL_mutex.h 390:34@
+sDL_UnlockMutex :: BG.FunPtr (BG.Ptr SDL_Mutex -> IO ())
+sDL_UnlockMutex =
+  BG.unsafePerformIO hs_bindgen_279301ff47dc6a1f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroyMutex@
+foreign import ccall unsafe "hs_bindgen_41ed6e14b48302a3"
+  hs_bindgen_41ed6e14b48302a3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroyMutex@
+hs_bindgen_41ed6e14b48302a3 :: IO (BG.FunPtr (BG.Ptr SDL_Mutex -> IO ()))
+hs_bindgen_41ed6e14b48302a3 =
+  BG.fromFFIType hs_bindgen_41ed6e14b48302a3_base
+
+{-# NOINLINE sDL_DestroyMutex #-}
+
+-- | Destroy a mutex created with @SDL_CreateMutex()@.
+--
+--     This function must be called on any mutex that is no longer needed. Failure to destroy a mutex will result in a system memory or resource leak. While it is safe to destroy a mutex that is /unlocked/, it is not safe to attempt to destroy a locked mutex, and may result in undefined behavior depending on the platform.
+--
+--     [@mutex@]: the mutex to destroy.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateMutex'
+--
+--     [C declaration]: @SDL_DestroyMutex@, defined at @SDL3\/SDL_mutex.h 409:34@
+sDL_DestroyMutex :: BG.FunPtr (BG.Ptr SDL_Mutex -> IO ())
+sDL_DestroyMutex =
+  BG.unsafePerformIO hs_bindgen_41ed6e14b48302a3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateRWLock@
+foreign import ccall unsafe "hs_bindgen_3eb0c1367593e404"
+  hs_bindgen_3eb0c1367593e404_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateRWLock@
+hs_bindgen_3eb0c1367593e404 :: IO (BG.FunPtr (IO (BG.Ptr SDL_RWLock)))
+hs_bindgen_3eb0c1367593e404 =
+  BG.fromFFIType hs_bindgen_3eb0c1367593e404_base
+
+{-# NOINLINE sDL_CreateRWLock #-}
+
+-- | Create a new read\/write lock.
+--
+--     A read\/write lock is useful for situations where you have multiple threads trying to access a resource that is rarely updated. All threads requesting a read-only lock will be allowed to run in parallel; if a thread requests a write lock, it will be provided exclusive access. This makes it safe for multiple threads to use a resource at the same time if they promise not to change it, and when it has to be changed, the rwlock will serve as a gateway to make sure those changes can be made safely.
+--
+--     In the right situation, a rwlock can be more efficient than a mutex, which only lets a single thread proceed at a time, even if it won\'t be modifying the data.
+--
+--     All newly-created read\/write locks begin in the /unlocked/ state.
+--
+--     Calls to @SDL_LockRWLockForReading()@ and SDL_LockRWLockForWriting will not return while the rwlock is locked /for writing/ by another thread. See @SDL_TryLockRWLockForReading()@ and @SDL_TryLockRWLockForWriting()@ to attempt to lock without blocking.
+--
+--     SDL read\/write locks are only recursive for read-only locks! They are not guaranteed to be fair, or provide access in a FIFO manner! They are not guaranteed to favor writers. You may not lock a rwlock for both read-only and write access at the same time from the same thread (so you can\'t promote your read-only lock to a write lock without unlocking first).
+--
+--     [Returns]: the initialized and unlocked read\/write lock or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyRWLock', 'sDL_LockRWLockForReading', 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_TryLockRWLockForWriting', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_CreateRWLock@, defined at @SDL3\/SDL_mutex.h 481:42@
+sDL_CreateRWLock :: BG.FunPtr (IO (BG.Ptr SDL_RWLock))
+sDL_CreateRWLock =
+  BG.unsafePerformIO hs_bindgen_3eb0c1367593e404
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_LockRWLockForReading@
+foreign import ccall unsafe "hs_bindgen_1d6189a38a9e5f28"
+  hs_bindgen_1d6189a38a9e5f28_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_LockRWLockForReading@
+hs_bindgen_1d6189a38a9e5f28 :: IO (BG.FunPtr (BG.Ptr SDL_RWLock -> IO ()))
+hs_bindgen_1d6189a38a9e5f28 =
+  BG.fromFFIType hs_bindgen_1d6189a38a9e5f28_base
+
+{-# NOINLINE sDL_LockRWLockForReading #-}
+
+-- | Lock the read\/write lock for /read only/ operations.
+--
+--     This will block until the rwlock is available, which is to say it is not locked for writing by any other thread. Of all threads waiting to lock the rwlock, all may do so at the same time as long as they are requesting read-only access; if a thread wants to lock for writing, only one may do so at a time, and no other threads, read-only or not, may hold the lock at the same time.
+--
+--     It is legal for the owning thread to lock an already-locked rwlock for reading. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive rwlock\").
+--
+--     Note that locking for writing is not recursive (this is only available to read-only locks).
+--
+--     It is illegal to request a read-only lock from a thread that already holds the write lock. Doing so results in undefined behavior. Unlock the write lock before requesting a read-only lock. (But, of course, if you have the write lock, you don\'t need further locks to read in any case.)
+--
+--     This function does not fail; if rwlock is NULL, it will return immediately having locked nothing. If the rwlock is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [@rwlock@]: the read\/write lock to lock.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_LockRWLockForReading@, defined at @SDL3\/SDL_mutex.h 520:34@
+sDL_LockRWLockForReading :: BG.FunPtr (BG.Ptr SDL_RWLock -> IO ())
+sDL_LockRWLockForReading =
+  BG.unsafePerformIO hs_bindgen_1d6189a38a9e5f28
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_LockRWLockForWriting@
+foreign import ccall unsafe "hs_bindgen_badbac25bb2ac3e5"
+  hs_bindgen_badbac25bb2ac3e5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_LockRWLockForWriting@
+hs_bindgen_badbac25bb2ac3e5 :: IO (BG.FunPtr (BG.Ptr SDL_RWLock -> IO ()))
+hs_bindgen_badbac25bb2ac3e5 =
+  BG.fromFFIType hs_bindgen_badbac25bb2ac3e5_base
+
+{-# NOINLINE sDL_LockRWLockForWriting #-}
+
+-- | Lock the read\/write lock for /write/ operations.
+--
+--     This will block until the rwlock is available, which is to say it is not locked for reading or writing by any other thread. Only one thread may hold the lock when it requests write access; all other threads, whether they also want to write or only want read-only access, must wait until the writer thread has released the lock.
+--
+--     It is illegal for the owning thread to lock an already-locked rwlock for writing (read-only may be locked recursively, writing can not). Doing so results in undefined behavior.
+--
+--     It is illegal to request a write lock from a thread that already holds a read-only lock. Doing so results in undefined behavior. Unlock the read-only lock before requesting a write lock.
+--
+--     This function does not fail; if rwlock is NULL, it will return immediately having locked nothing. If the rwlock is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [@rwlock@]: the read\/write lock to lock.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForReading', 'sDL_TryLockRWLockForWriting', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_LockRWLockForWriting@, defined at @SDL3\/SDL_mutex.h 553:34@
+sDL_LockRWLockForWriting :: BG.FunPtr (BG.Ptr SDL_RWLock -> IO ())
+sDL_LockRWLockForWriting =
+  BG.unsafePerformIO hs_bindgen_badbac25bb2ac3e5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryLockRWLockForReading@
+foreign import ccall unsafe "hs_bindgen_1e5ea8850474c50f"
+  hs_bindgen_1e5ea8850474c50f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryLockRWLockForReading@
+hs_bindgen_1e5ea8850474c50f :: IO (BG.FunPtr (BG.Ptr SDL_RWLock -> IO BG.CBool))
+hs_bindgen_1e5ea8850474c50f =
+  BG.fromFFIType hs_bindgen_1e5ea8850474c50f_base
+
+{-# NOINLINE sDL_TryLockRWLockForReading #-}
+
+-- | Try to lock a read\/write lock /for reading/ without blocking.
+--
+--     This works just like @SDL_LockRWLockForReading()@, but if the rwlock is not available, then this function returns false immediately.
+--
+--     This technique is useful if you need access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     Trying to lock for read-only access can succeed if other threads are holding read-only locks, as this won\'t prevent access.
+--
+--     This function returns true if passed a NULL rwlock.
+--
+--     [@rwlock@]: the rwlock to try to lock.
+--
+--     [Returns]: true on success, false if the lock would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForReading', 'sDL_TryLockRWLockForWriting', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_TryLockRWLockForReading@, defined at @SDL3\/SDL_mutex.h 580:34@
+sDL_TryLockRWLockForReading :: BG.FunPtr (BG.Ptr SDL_RWLock -> IO BG.CBool)
+sDL_TryLockRWLockForReading =
+  BG.unsafePerformIO hs_bindgen_1e5ea8850474c50f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryLockRWLockForWriting@
+foreign import ccall unsafe "hs_bindgen_a11f0d78039b31a7"
+  hs_bindgen_a11f0d78039b31a7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryLockRWLockForWriting@
+hs_bindgen_a11f0d78039b31a7 :: IO (BG.FunPtr (BG.Ptr SDL_RWLock -> IO BG.CBool))
+hs_bindgen_a11f0d78039b31a7 =
+  BG.fromFFIType hs_bindgen_a11f0d78039b31a7_base
+
+{-# NOINLINE sDL_TryLockRWLockForWriting #-}
+
+-- | Try to lock a read\/write lock /for writing/ without blocking.
+--
+--     This works just like @SDL_LockRWLockForWriting()@, but if the rwlock is not available, then this function returns false immediately.
+--
+--     This technique is useful if you need exclusive access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     It is illegal for the owning thread to lock an already-locked rwlock for writing (read-only may be locked recursively, writing can not). Doing so results in undefined behavior.
+--
+--     It is illegal to request a write lock from a thread that already holds a read-only lock. Doing so results in undefined behavior. Unlock the read-only lock before requesting a write lock.
+--
+--     This function returns true if passed a NULL rwlock.
+--
+--     [@rwlock@]: the rwlock to try to lock.
+--
+--     [Returns]: true on success, false if the lock would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_TryLockRWLockForWriting@, defined at @SDL3\/SDL_mutex.h 612:34@
+sDL_TryLockRWLockForWriting :: BG.FunPtr (BG.Ptr SDL_RWLock -> IO BG.CBool)
+sDL_TryLockRWLockForWriting =
+  BG.unsafePerformIO hs_bindgen_a11f0d78039b31a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_UnlockRWLock@
+foreign import ccall unsafe "hs_bindgen_769c3da328a63de5"
+  hs_bindgen_769c3da328a63de5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_UnlockRWLock@
+hs_bindgen_769c3da328a63de5 :: IO (BG.FunPtr (BG.Ptr SDL_RWLock -> IO ()))
+hs_bindgen_769c3da328a63de5 =
+  BG.fromFFIType hs_bindgen_769c3da328a63de5_base
+
+{-# NOINLINE sDL_UnlockRWLock #-}
+
+-- | Unlock the read\/write lock.
+--
+--     Use this function to unlock the rwlock, whether it was locked for read-only or write operations.
+--
+--     It is legal for the owning thread to lock an already-locked read-only lock. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive rwlock\").
+--
+--     It is illegal to unlock a rwlock that has not been locked by the current thread, and doing so results in undefined behavior.
+--
+--     [@rwlock@]: the rwlock to unlock.
+--
+--     [Thread safety]: This call must be paired with a previous locking call on the same thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForReading', 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_TryLockRWLockForWriting'
+--
+--     [C declaration]: @SDL_UnlockRWLock@, defined at @SDL3\/SDL_mutex.h 639:34@
+sDL_UnlockRWLock :: BG.FunPtr (BG.Ptr SDL_RWLock -> IO ())
+sDL_UnlockRWLock =
+  BG.unsafePerformIO hs_bindgen_769c3da328a63de5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroyRWLock@
+foreign import ccall unsafe "hs_bindgen_7a7492595f34e502"
+  hs_bindgen_7a7492595f34e502_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroyRWLock@
+hs_bindgen_7a7492595f34e502 :: IO (BG.FunPtr (BG.Ptr SDL_RWLock -> IO ()))
+hs_bindgen_7a7492595f34e502 =
+  BG.fromFFIType hs_bindgen_7a7492595f34e502_base
+
+{-# NOINLINE sDL_DestroyRWLock #-}
+
+-- | Destroy a read\/write lock created with @SDL_CreateRWLock()@.
+--
+--     This function must be called on any read\/write lock that is no longer needed. Failure to destroy a rwlock will result in a system memory or resource leak. While it is safe to destroy a rwlock that is /unlocked/, it is not safe to attempt to destroy a locked rwlock, and may result in undefined behavior depending on the platform.
+--
+--     [@rwlock@]: the rwlock to destroy.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRWLock'
+--
+--     [C declaration]: @SDL_DestroyRWLock@, defined at @SDL3\/SDL_mutex.h 658:34@
+sDL_DestroyRWLock :: BG.FunPtr (BG.Ptr SDL_RWLock -> IO ())
+sDL_DestroyRWLock =
+  BG.unsafePerformIO hs_bindgen_7a7492595f34e502
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateSemaphore@
+foreign import ccall unsafe "hs_bindgen_22509b0bb44ec2c1"
+  hs_bindgen_22509b0bb44ec2c1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateSemaphore@
+hs_bindgen_22509b0bb44ec2c1
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO (BG.Ptr SDL_Semaphore)))
+hs_bindgen_22509b0bb44ec2c1 =
+  BG.fromFFIType hs_bindgen_22509b0bb44ec2c1_base
+
+{-# NOINLINE sDL_CreateSemaphore #-}
+
+-- | Create a semaphore.
+--
+--     This function creates a new semaphore and initializes it with the value @initial_value@. Each wait operation on the semaphore will atomically decrement the semaphore value and potentially block if the semaphore value is 0. Each post operation will atomically increment the semaphore value and wake waiting threads and allow them to retry the wait operation.
+--
+--     [@initial_value@]: the starting value of the semaphore.
+--
+--     [Returns]: a new semaphore or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySemaphore', 'sDL_SignalSemaphore', 'sDL_TryWaitSemaphore', 'sDL_GetSemaphoreValue', 'sDL_WaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_CreateSemaphore@, defined at @SDL3\/SDL_mutex.h 708:45@
+sDL_CreateSemaphore :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO (BG.Ptr SDL_Semaphore))
+sDL_CreateSemaphore =
+  BG.unsafePerformIO hs_bindgen_22509b0bb44ec2c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroySemaphore@
+foreign import ccall unsafe "hs_bindgen_1f077a5303df061a"
+  hs_bindgen_1f077a5303df061a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroySemaphore@
+hs_bindgen_1f077a5303df061a :: IO (BG.FunPtr (BG.Ptr SDL_Semaphore -> IO ()))
+hs_bindgen_1f077a5303df061a =
+  BG.fromFFIType hs_bindgen_1f077a5303df061a_base
+
+{-# NOINLINE sDL_DestroySemaphore #-}
+
+-- | Destroy a semaphore.
+--
+--     It is not safe to destroy a semaphore if there are threads currently waiting on it.
+--
+--     [@sem@]: the semaphore to destroy.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSemaphore'
+--
+--     [C declaration]: @SDL_DestroySemaphore@, defined at @SDL3\/SDL_mutex.h 724:34@
+sDL_DestroySemaphore :: BG.FunPtr (BG.Ptr SDL_Semaphore -> IO ())
+sDL_DestroySemaphore =
+  BG.unsafePerformIO hs_bindgen_1f077a5303df061a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitSemaphore@
+foreign import ccall unsafe "hs_bindgen_91a2349e7496eeae"
+  hs_bindgen_91a2349e7496eeae_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitSemaphore@
+hs_bindgen_91a2349e7496eeae :: IO (BG.FunPtr (BG.Ptr SDL_Semaphore -> IO ()))
+hs_bindgen_91a2349e7496eeae =
+  BG.fromFFIType hs_bindgen_91a2349e7496eeae_base
+
+{-# NOINLINE sDL_WaitSemaphore #-}
+
+-- | Wait until a semaphore has a positive value and then decrements it.
+--
+--     This function suspends the calling thread until the semaphore pointed to by @sem@ has a positive value, and then atomically decrement the semaphore value.
+--
+--     This function is the equivalent of calling @SDL_WaitSemaphoreTimeout()@ with a time length of -1.
+--
+--     [@sem@]: the semaphore wait on.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalSemaphore', 'sDL_TryWaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_WaitSemaphore@, defined at @SDL3\/SDL_mutex.h 746:34@
+sDL_WaitSemaphore :: BG.FunPtr (BG.Ptr SDL_Semaphore -> IO ())
+sDL_WaitSemaphore =
+  BG.unsafePerformIO hs_bindgen_91a2349e7496eeae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryWaitSemaphore@
+foreign import ccall unsafe "hs_bindgen_81872972bd3486d3"
+  hs_bindgen_81872972bd3486d3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_TryWaitSemaphore@
+hs_bindgen_81872972bd3486d3 :: IO (BG.FunPtr (BG.Ptr SDL_Semaphore -> IO BG.CBool))
+hs_bindgen_81872972bd3486d3 =
+  BG.fromFFIType hs_bindgen_81872972bd3486d3_base
+
+{-# NOINLINE sDL_TryWaitSemaphore #-}
+
+-- | See if a semaphore has a positive value and decrement it if it does.
+--
+--     This function checks to see if the semaphore pointed to by @sem@ has a positive value and atomically decrements the semaphore value if it does. If the semaphore doesn\'t have a positive value, the function immediately returns false.
+--
+--     [@sem@]: the semaphore to wait on.
+--
+--     [Returns]: true if the wait succeeds, false if the wait would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalSemaphore', 'sDL_WaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_TryWaitSemaphore@, defined at @SDL3\/SDL_mutex.h 767:34@
+sDL_TryWaitSemaphore :: BG.FunPtr (BG.Ptr SDL_Semaphore -> IO BG.CBool)
+sDL_TryWaitSemaphore =
+  BG.unsafePerformIO hs_bindgen_81872972bd3486d3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitSemaphoreTimeout@
+foreign import ccall unsafe "hs_bindgen_0a26128dc146ea69"
+  hs_bindgen_0a26128dc146ea69_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitSemaphoreTimeout@
+hs_bindgen_0a26128dc146ea69
+  :: IO (BG.FunPtr (BG.Ptr SDL_Semaphore -> SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool))
+hs_bindgen_0a26128dc146ea69 =
+  BG.fromFFIType hs_bindgen_0a26128dc146ea69_base
+
+{-# NOINLINE sDL_WaitSemaphoreTimeout #-}
+
+-- | Wait until a semaphore has a positive value and then decrements it.
+--
+--     This function suspends the calling thread until either the semaphore pointed to by @sem@ has a positive value or the specified time has elapsed. If the call is successful it will atomically decrement the semaphore value.
+--
+--     [@sem@]: the semaphore to wait on.
+--
+--     [@timeoutMS@]: the length of the timeout, in milliseconds, or -1 to wait indefinitely.
+--
+--     [Returns]: true if the wait succeeds or false if the wait times out.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalSemaphore', 'sDL_TryWaitSemaphore', 'sDL_WaitSemaphore'
+--
+--     [C declaration]: @SDL_WaitSemaphoreTimeout@, defined at @SDL3\/SDL_mutex.h 789:34@
+sDL_WaitSemaphoreTimeout
+  :: BG.FunPtr (BG.Ptr SDL_Semaphore -> SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool)
+sDL_WaitSemaphoreTimeout =
+  BG.unsafePerformIO hs_bindgen_0a26128dc146ea69
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_SignalSemaphore@
+foreign import ccall unsafe "hs_bindgen_9af09ce180d458b9"
+  hs_bindgen_9af09ce180d458b9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_SignalSemaphore@
+hs_bindgen_9af09ce180d458b9 :: IO (BG.FunPtr (BG.Ptr SDL_Semaphore -> IO ()))
+hs_bindgen_9af09ce180d458b9 =
+  BG.fromFFIType hs_bindgen_9af09ce180d458b9_base
+
+{-# NOINLINE sDL_SignalSemaphore #-}
+
+-- | Atomically increment a semaphore\'s value and wake waiting threads.
+--
+--     [@sem@]: the semaphore to increment.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TryWaitSemaphore', 'sDL_WaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_SignalSemaphore@, defined at @SDL3\/SDL_mutex.h 804:34@
+sDL_SignalSemaphore :: BG.FunPtr (BG.Ptr SDL_Semaphore -> IO ())
+sDL_SignalSemaphore =
+  BG.unsafePerformIO hs_bindgen_9af09ce180d458b9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_GetSemaphoreValue@
+foreign import ccall unsafe "hs_bindgen_5ee888052e9adc81"
+  hs_bindgen_5ee888052e9adc81_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_GetSemaphoreValue@
+hs_bindgen_5ee888052e9adc81
+  :: IO (BG.FunPtr (BG.Ptr SDL_Semaphore -> IO SDL3.Sys.Bindgen.Stdinc.Uint32))
+hs_bindgen_5ee888052e9adc81 =
+  BG.fromFFIType hs_bindgen_5ee888052e9adc81_base
+
+{-# NOINLINE sDL_GetSemaphoreValue #-}
+
+-- | Get the current value of a semaphore.
+--
+--     [@sem@]: the semaphore to query.
+--
+--     [Returns]: the current value of the semaphore.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSemaphoreValue@, defined at @SDL3\/SDL_mutex.h 816:36@
+sDL_GetSemaphoreValue :: BG.FunPtr (BG.Ptr SDL_Semaphore -> IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+sDL_GetSemaphoreValue =
+  BG.unsafePerformIO hs_bindgen_5ee888052e9adc81
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateCondition@
+foreign import ccall unsafe "hs_bindgen_07cf0a76ca2c83d0"
+  hs_bindgen_07cf0a76ca2c83d0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_CreateCondition@
+hs_bindgen_07cf0a76ca2c83d0 :: IO (BG.FunPtr (IO (BG.Ptr SDL_Condition)))
+hs_bindgen_07cf0a76ca2c83d0 =
+  BG.fromFFIType hs_bindgen_07cf0a76ca2c83d0_base
+
+{-# NOINLINE sDL_CreateCondition #-}
+
+-- | Create a condition variable.
+--
+--     [Returns]: a new condition variable or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_SignalCondition', 'sDL_WaitCondition', 'sDL_WaitConditionTimeout', 'sDL_DestroyCondition'
+--
+--     [C declaration]: @SDL_CreateCondition@, defined at @SDL3\/SDL_mutex.h 857:45@
+sDL_CreateCondition :: BG.FunPtr (IO (BG.Ptr SDL_Condition))
+sDL_CreateCondition =
+  BG.unsafePerformIO hs_bindgen_07cf0a76ca2c83d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroyCondition@
+foreign import ccall unsafe "hs_bindgen_99bba06553492457"
+  hs_bindgen_99bba06553492457_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_DestroyCondition@
+hs_bindgen_99bba06553492457 :: IO (BG.FunPtr (BG.Ptr SDL_Condition -> IO ()))
+hs_bindgen_99bba06553492457 =
+  BG.fromFFIType hs_bindgen_99bba06553492457_base
+
+{-# NOINLINE sDL_DestroyCondition #-}
+
+-- | Destroy a condition variable.
+--
+--     [@cond@]: the condition variable to destroy.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateCondition'
+--
+--     [C declaration]: @SDL_DestroyCondition@, defined at @SDL3\/SDL_mutex.h 870:34@
+sDL_DestroyCondition :: BG.FunPtr (BG.Ptr SDL_Condition -> IO ())
+sDL_DestroyCondition =
+  BG.unsafePerformIO hs_bindgen_99bba06553492457
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_SignalCondition@
+foreign import ccall unsafe "hs_bindgen_a9b4bfe1c85d2caa"
+  hs_bindgen_a9b4bfe1c85d2caa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_SignalCondition@
+hs_bindgen_a9b4bfe1c85d2caa :: IO (BG.FunPtr (BG.Ptr SDL_Condition -> IO ()))
+hs_bindgen_a9b4bfe1c85d2caa =
+  BG.fromFFIType hs_bindgen_a9b4bfe1c85d2caa_base
+
+{-# NOINLINE sDL_SignalCondition #-}
+
+-- | Restart one of the threads that are waiting on the condition variable.
+--
+--     [@cond@]: the condition variable to signal.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_WaitCondition', 'sDL_WaitConditionTimeout'
+--
+--     [C declaration]: @SDL_SignalCondition@, defined at @SDL3\/SDL_mutex.h 885:34@
+sDL_SignalCondition :: BG.FunPtr (BG.Ptr SDL_Condition -> IO ())
+sDL_SignalCondition =
+  BG.unsafePerformIO hs_bindgen_a9b4bfe1c85d2caa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_BroadcastCondition@
+foreign import ccall unsafe "hs_bindgen_26d1393d70aa1e21"
+  hs_bindgen_26d1393d70aa1e21_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_BroadcastCondition@
+hs_bindgen_26d1393d70aa1e21 :: IO (BG.FunPtr (BG.Ptr SDL_Condition -> IO ()))
+hs_bindgen_26d1393d70aa1e21 =
+  BG.fromFFIType hs_bindgen_26d1393d70aa1e21_base
+
+{-# NOINLINE sDL_BroadcastCondition #-}
+
+-- | Restart all threads that are waiting on the condition variable.
+--
+--     [@cond@]: the condition variable to signal.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalCondition', 'sDL_WaitCondition', 'sDL_WaitConditionTimeout'
+--
+--     [C declaration]: @SDL_BroadcastCondition@, defined at @SDL3\/SDL_mutex.h 900:34@
+sDL_BroadcastCondition :: BG.FunPtr (BG.Ptr SDL_Condition -> IO ())
+sDL_BroadcastCondition =
+  BG.unsafePerformIO hs_bindgen_26d1393d70aa1e21
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitCondition@
+foreign import ccall unsafe "hs_bindgen_5c1581c6a748ae80"
+  hs_bindgen_5c1581c6a748ae80_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitCondition@
+hs_bindgen_5c1581c6a748ae80 :: IO (BG.FunPtr (BG.Ptr SDL_Condition -> BG.Ptr SDL_Mutex -> IO ()))
+hs_bindgen_5c1581c6a748ae80 =
+  BG.fromFFIType hs_bindgen_5c1581c6a748ae80_base
+
+{-# NOINLINE sDL_WaitCondition #-}
+
+-- | Wait until a condition variable is signaled.
+--
+--     This function unlocks the specified @mutex@ and waits for another thread to call @SDL_SignalCondition()@ or @SDL_BroadcastCondition()@ on the condition variable @cond@. Once the condition variable is signaled, the mutex is re-locked and the function returns.
+--
+--     The mutex must be locked before calling this function. Locking the mutex recursively (more than once) is not supported and leads to undefined behavior.
+--
+--     This function is the equivalent of calling @SDL_WaitConditionTimeout()@ with a time length of -1.
+--
+--     [@cond@]: the condition variable to wait on.
+--
+--     [@mutex@]: the mutex used to coordinate thread access.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_SignalCondition', 'sDL_WaitConditionTimeout'
+--
+--     [C declaration]: @SDL_WaitCondition@, defined at @SDL3\/SDL_mutex.h 928:34@
+sDL_WaitCondition :: BG.FunPtr (BG.Ptr SDL_Condition -> BG.Ptr SDL_Mutex -> IO ())
+sDL_WaitCondition =
+  BG.unsafePerformIO hs_bindgen_5c1581c6a748ae80
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitConditionTimeout@
+foreign import ccall unsafe "hs_bindgen_0498ed88d8c2daca"
+  hs_bindgen_0498ed88d8c2daca_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_WaitConditionTimeout@
+hs_bindgen_0498ed88d8c2daca
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Condition -> BG.Ptr SDL_Mutex -> SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool)
+       )
+hs_bindgen_0498ed88d8c2daca =
+  BG.fromFFIType hs_bindgen_0498ed88d8c2daca_base
+
+{-# NOINLINE sDL_WaitConditionTimeout #-}
+
+-- | Wait until a condition variable is signaled or a certain time has passed.
+--
+--     This function unlocks the specified @mutex@ and waits for another thread to call @SDL_SignalCondition()@ or @SDL_BroadcastCondition()@ on the condition variable @cond@, or for the specified time to elapse. Once the condition variable is signaled or the time elapsed, the mutex is re-locked and the function returns.
+--
+--     The mutex must be locked before calling this function. Locking the mutex recursively (more than once) is not supported and leads to undefined behavior.
+--
+--     [@cond@]: the condition variable to wait on.
+--
+--     [@mutex@]: the mutex used to coordinate thread access.
+--
+--     [@timeoutMS@]: the maximum time to wait, in milliseconds, or -1 to wait indefinitely.
+--
+--     [Returns]: true if the condition variable is signaled, false if the condition is not signaled in the allotted time.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_SignalCondition', 'sDL_WaitCondition'
+--
+--     [C declaration]: @SDL_WaitConditionTimeout@, defined at @SDL3\/SDL_mutex.h 958:34@
+sDL_WaitConditionTimeout
+  :: BG.FunPtr
+       (BG.Ptr SDL_Condition -> BG.Ptr SDL_Mutex -> SDL3.Sys.Bindgen.Stdinc.Sint32 -> IO BG.CBool)
+sDL_WaitConditionTimeout =
+  BG.unsafePerformIO hs_bindgen_0498ed88d8c2daca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_ShouldInit@
+foreign import ccall unsafe "hs_bindgen_4da27525ce560809"
+  hs_bindgen_4da27525ce560809_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_ShouldInit@
+hs_bindgen_4da27525ce560809 :: IO (BG.FunPtr (BG.Ptr SDL_InitState -> IO BG.CBool))
+hs_bindgen_4da27525ce560809 =
+  BG.fromFFIType hs_bindgen_4da27525ce560809_base
+
+{-# NOINLINE sDL_ShouldInit #-}
+
+-- | Return whether initialization should be done.
+--
+--     This function checks the passed in state and if initialization should be done, sets the status to @SDL_INIT_STATUS_INITIALIZING@ and returns true. If another thread is already modifying this state, it will wait until that\'s done before returning.
+--
+--     If this function returns true, the calling code must call @SDL_SetInitialized()@ to complete the initialization.
+--
+--     [@state@]: the initialization state to check.
+--
+--     [Returns]: true if initialization needs to be done, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetInitialized', 'sDL_ShouldQuit'
+--
+--     [C declaration]: @SDL_ShouldInit@, defined at @SDL3\/SDL_mutex.h 1065:34@
+sDL_ShouldInit :: BG.FunPtr (BG.Ptr SDL_InitState -> IO BG.CBool)
+sDL_ShouldInit =
+  BG.unsafePerformIO hs_bindgen_4da27525ce560809
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_ShouldQuit@
+foreign import ccall unsafe "hs_bindgen_6877992dc5bc2120"
+  hs_bindgen_6877992dc5bc2120_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_ShouldQuit@
+hs_bindgen_6877992dc5bc2120 :: IO (BG.FunPtr (BG.Ptr SDL_InitState -> IO BG.CBool))
+hs_bindgen_6877992dc5bc2120 =
+  BG.fromFFIType hs_bindgen_6877992dc5bc2120_base
+
+{-# NOINLINE sDL_ShouldQuit #-}
+
+-- | Return whether cleanup should be done.
+--
+--     This function checks the passed in state and if cleanup should be done, sets the status to @SDL_INIT_STATUS_UNINITIALIZING@ and returns true.
+--
+--     If this function returns true, the calling code must call @SDL_SetInitialized()@ to complete the cleanup.
+--
+--     [@state@]: the initialization state to check.
+--
+--     [Returns]: true if cleanup needs to be done, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetInitialized', 'sDL_ShouldInit'
+--
+--     [C declaration]: @SDL_ShouldQuit@, defined at @SDL3\/SDL_mutex.h 1086:34@
+sDL_ShouldQuit :: BG.FunPtr (BG.Ptr SDL_InitState -> IO BG.CBool)
+sDL_ShouldQuit =
+  BG.unsafePerformIO hs_bindgen_6877992dc5bc2120
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_SetInitialized@
+foreign import ccall unsafe "hs_bindgen_d08e1c271251d0d2"
+  hs_bindgen_d08e1c271251d0d2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_get_SDL_SetInitialized@
+hs_bindgen_d08e1c271251d0d2 :: IO (BG.FunPtr (BG.Ptr SDL_InitState -> BG.CBool -> IO ()))
+hs_bindgen_d08e1c271251d0d2 =
+  BG.fromFFIType hs_bindgen_d08e1c271251d0d2_base
+
+{-# NOINLINE sDL_SetInitialized #-}
+
+-- | Finish an initialization state transition.
+--
+--     This function sets the status of the passed in state to @SDL_INIT_STATUS_INITIALIZED@ or @SDL_INIT_STATUS_UNINITIALIZED@ and allows any threads waiting for the status to proceed.
+--
+--     [@state@]: the initialization state to check.
+--
+--     [@initialized@]: the new initialization state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShouldInit', 'sDL_ShouldQuit'
+--
+--     [C declaration]: @SDL_SetInitialized@, defined at @SDL3\/SDL_mutex.h 1105:34@
+sDL_SetInitialized :: BG.FunPtr (BG.Ptr SDL_InitState -> BG.CBool -> IO ())
+sDL_SetInitialized =
+  BG.unsafePerformIO hs_bindgen_d08e1c271251d0d2
diff --git a/src/SDL3/Sys/Bindgen/Mutex/Safe.hs b/src/SDL3/Sys/Bindgen/Mutex/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Mutex/Safe.hs
@@ -0,0 +1,1200 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Mutex.Safe (
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_CreateMutex,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_LockMutex,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_TryLockMutex,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_UnlockMutex,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_DestroyMutex,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_CreateRWLock,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_LockRWLockForReading,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_LockRWLockForWriting,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_TryLockRWLockForReading,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_TryLockRWLockForWriting,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_UnlockRWLock,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_DestroyRWLock,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_CreateSemaphore,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_DestroySemaphore,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_WaitSemaphore,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_TryWaitSemaphore,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_WaitSemaphoreTimeout,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_SignalSemaphore,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_GetSemaphoreValue,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_CreateCondition,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_DestroyCondition,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_SignalCondition,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_BroadcastCondition,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_WaitCondition,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_WaitConditionTimeout,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_ShouldInit,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_ShouldQuit,
+  SDL3.Sys.Bindgen.Mutex.Safe.sDL_SetInitialized,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Mutex
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_mutex.h>"
+         , "SDL_Mutex *hs_bindgen_8e29ae5aabbda111 (void)"
+         , "{"
+         , "  return (SDL_CreateMutex)();"
+         , "}"
+         , "void hs_bindgen_ee717c25894777dd ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_LockMutex)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_08c66a65371e794c ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TryLockMutex)(arg1);"
+         , "}"
+         , "void hs_bindgen_0080eb2473efd4c0 ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockMutex)(arg1);"
+         , "}"
+         , "void hs_bindgen_0848f2dbc2ab9299 ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyMutex)(arg1);"
+         , "}"
+         , "SDL_RWLock *hs_bindgen_305069c9512cb61a (void)"
+         , "{"
+         , "  return (SDL_CreateRWLock)();"
+         , "}"
+         , "void hs_bindgen_88156cb9c069d7ae ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_LockRWLockForReading)(arg1);"
+         , "}"
+         , "void hs_bindgen_65b1a554927b8f99 ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_LockRWLockForWriting)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_287956a25f4fabba ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TryLockRWLockForReading)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_99a3ed9a28ed75f7 ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TryLockRWLockForWriting)(arg1);"
+         , "}"
+         , "void hs_bindgen_c9284c30c938f332 ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockRWLock)(arg1);"
+         , "}"
+         , "void hs_bindgen_743dbdcc7c185970 ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyRWLock)(arg1);"
+         , "}"
+         , "SDL_Semaphore *hs_bindgen_d1200eed8ae4acf8 ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSemaphore)(arg1);"
+         , "}"
+         , "void hs_bindgen_d167c0d86f5bfae4 ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroySemaphore)(arg1);"
+         , "}"
+         , "void hs_bindgen_0c536dc844c53556 ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_WaitSemaphore)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8460788ee6bb642a ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TryWaitSemaphore)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_73158966e18c69df ("
+         , "  SDL_Semaphore *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitSemaphoreTimeout)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_ad3ea5b998b9b02a ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SignalSemaphore)(arg1);"
+         , "}"
+         , "Uint32 hs_bindgen_d7d8abceae459dc4 ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSemaphoreValue)(arg1);"
+         , "}"
+         , "SDL_Condition *hs_bindgen_f051c9d83065c51e (void)"
+         , "{"
+         , "  return (SDL_CreateCondition)();"
+         , "}"
+         , "void hs_bindgen_284001adc7a8e944 ("
+         , "  SDL_Condition *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyCondition)(arg1);"
+         , "}"
+         , "void hs_bindgen_8e6408554c791aa2 ("
+         , "  SDL_Condition *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SignalCondition)(arg1);"
+         , "}"
+         , "void hs_bindgen_1377f08bc73a7c85 ("
+         , "  SDL_Condition *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_BroadcastCondition)(arg1);"
+         , "}"
+         , "void hs_bindgen_2c9c00769b6253d6 ("
+         , "  SDL_Condition *arg1,"
+         , "  SDL_Mutex *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_WaitCondition)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_158c5dc74b7f6a6d ("
+         , "  SDL_Condition *arg1,"
+         , "  SDL_Mutex *arg2,"
+         , "  Sint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitConditionTimeout)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_c32bbe3119c28451 ("
+         , "  SDL_InitState *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ShouldInit)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_edbe1140979f28da ("
+         , "  SDL_InitState *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ShouldQuit)(arg1);"
+         , "}"
+         , "void hs_bindgen_5708550ac643317a ("
+         , "  SDL_InitState *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetInitialized)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_CreateMutex@
+foreign import ccall safe "hs_bindgen_8e29ae5aabbda111"
+  hs_bindgen_8e29ae5aabbda111_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_CreateMutex@
+hs_bindgen_8e29ae5aabbda111 :: IO (BG.Ptr SDL_Mutex)
+hs_bindgen_8e29ae5aabbda111 =
+  BG.fromFFIType hs_bindgen_8e29ae5aabbda111_base
+
+-- | Create a new mutex.
+--
+--     All newly-created mutexes begin in the /unlocked/ state.
+--
+--     Calls to @SDL_LockMutex()@ will not return while the mutex is locked by another thread. See @SDL_TryLockMutex()@ to attempt to lock without blocking.
+--
+--     SDL mutexes are reentrant.
+--
+--     [Returns]: the initialized and unlocked mutex or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyMutex', 'sDL_LockMutex', 'sDL_TryLockMutex', 'sDL_UnlockMutex'
+--
+--     [C declaration]: @SDL_CreateMutex@, defined at @SDL3\/SDL_mutex.h 320:41@
+sDL_CreateMutex :: IO (BG.Ptr SDL_Mutex)
+sDL_CreateMutex = hs_bindgen_8e29ae5aabbda111
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_LockMutex@
+foreign import ccall safe "hs_bindgen_ee717c25894777dd"
+  hs_bindgen_ee717c25894777dd_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_LockMutex@
+hs_bindgen_ee717c25894777dd
+  :: BG.Ptr SDL_Mutex
+  -> IO ()
+hs_bindgen_ee717c25894777dd =
+  BG.fromFFIType hs_bindgen_ee717c25894777dd_base
+
+-- | Lock the mutex.
+--
+--     This will block until the mutex is available, which is to say it is in the unlocked state and the OS has chosen the caller as the next thread to lock it. Of all threads waiting to lock the mutex, only one may do so at a time.
+--
+--     It is legal for the owning thread to lock an already-locked mutex. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive mutex\").
+--
+--     This function does not fail; if mutex is NULL, it will return immediately having locked nothing. If the mutex is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TryLockMutex', 'sDL_UnlockMutex'
+--
+--     [C declaration]: @SDL_LockMutex@, defined at @SDL3\/SDL_mutex.h 346:34@
+sDL_LockMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to lock.
+  -> IO ()
+sDL_LockMutex = hs_bindgen_ee717c25894777dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_TryLockMutex@
+foreign import ccall safe "hs_bindgen_08c66a65371e794c"
+  hs_bindgen_08c66a65371e794c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_TryLockMutex@
+hs_bindgen_08c66a65371e794c
+  :: BG.Ptr SDL_Mutex
+  -> IO BG.CBool
+hs_bindgen_08c66a65371e794c =
+  BG.fromFFIType hs_bindgen_08c66a65371e794c_base
+
+-- | Try to lock a mutex without blocking.
+--
+--     This works just like @SDL_LockMutex()@, but if the mutex is not available, this function returns false immediately.
+--
+--     This technique is useful if you need exclusive access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     This function returns true if passed a NULL mutex.
+--
+--     [Returns]: true on success, false if the mutex would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockMutex', 'sDL_UnlockMutex'
+--
+--     [C declaration]: @SDL_TryLockMutex@, defined at @SDL3\/SDL_mutex.h 369:34@
+sDL_TryLockMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to try to lock.
+  -> IO BG.CBool
+sDL_TryLockMutex = hs_bindgen_08c66a65371e794c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_UnlockMutex@
+foreign import ccall safe "hs_bindgen_0080eb2473efd4c0"
+  hs_bindgen_0080eb2473efd4c0_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_UnlockMutex@
+hs_bindgen_0080eb2473efd4c0
+  :: BG.Ptr SDL_Mutex
+  -> IO ()
+hs_bindgen_0080eb2473efd4c0 =
+  BG.fromFFIType hs_bindgen_0080eb2473efd4c0_base
+
+-- | Unlock the mutex.
+--
+--     It is legal for the owning thread to lock an already-locked mutex. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive mutex\").
+--
+--     It is illegal to unlock a mutex that has not been locked by the current thread, and doing so results in undefined behavior.
+--
+--     [Thread safety]: This call must be paired with a previous locking call on the same thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockMutex', 'sDL_TryLockMutex'
+--
+--     [C declaration]: @SDL_UnlockMutex@, defined at @SDL3\/SDL_mutex.h 390:34@
+sDL_UnlockMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to unlock.
+  -> IO ()
+sDL_UnlockMutex = hs_bindgen_0080eb2473efd4c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_DestroyMutex@
+foreign import ccall safe "hs_bindgen_0848f2dbc2ab9299"
+  hs_bindgen_0848f2dbc2ab9299_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_DestroyMutex@
+hs_bindgen_0848f2dbc2ab9299
+  :: BG.Ptr SDL_Mutex
+  -> IO ()
+hs_bindgen_0848f2dbc2ab9299 =
+  BG.fromFFIType hs_bindgen_0848f2dbc2ab9299_base
+
+-- | Destroy a mutex created with @SDL_CreateMutex()@.
+--
+--     This function must be called on any mutex that is no longer needed. Failure to destroy a mutex will result in a system memory or resource leak. While it is safe to destroy a mutex that is /unlocked/, it is not safe to attempt to destroy a locked mutex, and may result in undefined behavior depending on the platform.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateMutex'
+--
+--     [C declaration]: @SDL_DestroyMutex@, defined at @SDL3\/SDL_mutex.h 409:34@
+sDL_DestroyMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to destroy.
+  -> IO ()
+sDL_DestroyMutex = hs_bindgen_0848f2dbc2ab9299
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_CreateRWLock@
+foreign import ccall safe "hs_bindgen_305069c9512cb61a"
+  hs_bindgen_305069c9512cb61a_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_CreateRWLock@
+hs_bindgen_305069c9512cb61a :: IO (BG.Ptr SDL_RWLock)
+hs_bindgen_305069c9512cb61a =
+  BG.fromFFIType hs_bindgen_305069c9512cb61a_base
+
+-- | Create a new read\/write lock.
+--
+--     A read\/write lock is useful for situations where you have multiple threads trying to access a resource that is rarely updated. All threads requesting a read-only lock will be allowed to run in parallel; if a thread requests a write lock, it will be provided exclusive access. This makes it safe for multiple threads to use a resource at the same time if they promise not to change it, and when it has to be changed, the rwlock will serve as a gateway to make sure those changes can be made safely.
+--
+--     In the right situation, a rwlock can be more efficient than a mutex, which only lets a single thread proceed at a time, even if it won\'t be modifying the data.
+--
+--     All newly-created read\/write locks begin in the /unlocked/ state.
+--
+--     Calls to @SDL_LockRWLockForReading()@ and SDL_LockRWLockForWriting will not return while the rwlock is locked /for writing/ by another thread. See @SDL_TryLockRWLockForReading()@ and @SDL_TryLockRWLockForWriting()@ to attempt to lock without blocking.
+--
+--     SDL read\/write locks are only recursive for read-only locks! They are not guaranteed to be fair, or provide access in a FIFO manner! They are not guaranteed to favor writers. You may not lock a rwlock for both read-only and write access at the same time from the same thread (so you can\'t promote your read-only lock to a write lock without unlocking first).
+--
+--     [Returns]: the initialized and unlocked read\/write lock or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyRWLock', 'sDL_LockRWLockForReading', 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_TryLockRWLockForWriting', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_CreateRWLock@, defined at @SDL3\/SDL_mutex.h 481:42@
+sDL_CreateRWLock :: IO (BG.Ptr SDL_RWLock)
+sDL_CreateRWLock = hs_bindgen_305069c9512cb61a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_LockRWLockForReading@
+foreign import ccall safe "hs_bindgen_88156cb9c069d7ae"
+  hs_bindgen_88156cb9c069d7ae_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_LockRWLockForReading@
+hs_bindgen_88156cb9c069d7ae
+  :: BG.Ptr SDL_RWLock
+  -> IO ()
+hs_bindgen_88156cb9c069d7ae =
+  BG.fromFFIType hs_bindgen_88156cb9c069d7ae_base
+
+-- | Lock the read\/write lock for /read only/ operations.
+--
+--     This will block until the rwlock is available, which is to say it is not locked for writing by any other thread. Of all threads waiting to lock the rwlock, all may do so at the same time as long as they are requesting read-only access; if a thread wants to lock for writing, only one may do so at a time, and no other threads, read-only or not, may hold the lock at the same time.
+--
+--     It is legal for the owning thread to lock an already-locked rwlock for reading. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive rwlock\").
+--
+--     Note that locking for writing is not recursive (this is only available to read-only locks).
+--
+--     It is illegal to request a read-only lock from a thread that already holds the write lock. Doing so results in undefined behavior. Unlock the write lock before requesting a read-only lock. (But, of course, if you have the write lock, you don\'t need further locks to read in any case.)
+--
+--     This function does not fail; if rwlock is NULL, it will return immediately having locked nothing. If the rwlock is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_LockRWLockForReading@, defined at @SDL3\/SDL_mutex.h 520:34@
+sDL_LockRWLockForReading
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the read\/write lock to lock.
+  -> IO ()
+sDL_LockRWLockForReading =
+  hs_bindgen_88156cb9c069d7ae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_LockRWLockForWriting@
+foreign import ccall safe "hs_bindgen_65b1a554927b8f99"
+  hs_bindgen_65b1a554927b8f99_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_LockRWLockForWriting@
+hs_bindgen_65b1a554927b8f99
+  :: BG.Ptr SDL_RWLock
+  -> IO ()
+hs_bindgen_65b1a554927b8f99 =
+  BG.fromFFIType hs_bindgen_65b1a554927b8f99_base
+
+-- | Lock the read\/write lock for /write/ operations.
+--
+--     This will block until the rwlock is available, which is to say it is not locked for reading or writing by any other thread. Only one thread may hold the lock when it requests write access; all other threads, whether they also want to write or only want read-only access, must wait until the writer thread has released the lock.
+--
+--     It is illegal for the owning thread to lock an already-locked rwlock for writing (read-only may be locked recursively, writing can not). Doing so results in undefined behavior.
+--
+--     It is illegal to request a write lock from a thread that already holds a read-only lock. Doing so results in undefined behavior. Unlock the read-only lock before requesting a write lock.
+--
+--     This function does not fail; if rwlock is NULL, it will return immediately having locked nothing. If the rwlock is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForReading', 'sDL_TryLockRWLockForWriting', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_LockRWLockForWriting@, defined at @SDL3\/SDL_mutex.h 553:34@
+sDL_LockRWLockForWriting
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the read\/write lock to lock.
+  -> IO ()
+sDL_LockRWLockForWriting =
+  hs_bindgen_65b1a554927b8f99
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_TryLockRWLockForReading@
+foreign import ccall safe "hs_bindgen_287956a25f4fabba"
+  hs_bindgen_287956a25f4fabba_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_TryLockRWLockForReading@
+hs_bindgen_287956a25f4fabba
+  :: BG.Ptr SDL_RWLock
+  -> IO BG.CBool
+hs_bindgen_287956a25f4fabba =
+  BG.fromFFIType hs_bindgen_287956a25f4fabba_base
+
+-- | Try to lock a read\/write lock /for reading/ without blocking.
+--
+--     This works just like @SDL_LockRWLockForReading()@, but if the rwlock is not available, then this function returns false immediately.
+--
+--     This technique is useful if you need access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     Trying to lock for read-only access can succeed if other threads are holding read-only locks, as this won\'t prevent access.
+--
+--     This function returns true if passed a NULL rwlock.
+--
+--     [Returns]: true on success, false if the lock would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForReading', 'sDL_TryLockRWLockForWriting', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_TryLockRWLockForReading@, defined at @SDL3\/SDL_mutex.h 580:34@
+sDL_TryLockRWLockForReading
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to try to lock.
+  -> IO BG.CBool
+sDL_TryLockRWLockForReading =
+  hs_bindgen_287956a25f4fabba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_TryLockRWLockForWriting@
+foreign import ccall safe "hs_bindgen_99a3ed9a28ed75f7"
+  hs_bindgen_99a3ed9a28ed75f7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_TryLockRWLockForWriting@
+hs_bindgen_99a3ed9a28ed75f7
+  :: BG.Ptr SDL_RWLock
+  -> IO BG.CBool
+hs_bindgen_99a3ed9a28ed75f7 =
+  BG.fromFFIType hs_bindgen_99a3ed9a28ed75f7_base
+
+-- | Try to lock a read\/write lock /for writing/ without blocking.
+--
+--     This works just like @SDL_LockRWLockForWriting()@, but if the rwlock is not available, then this function returns false immediately.
+--
+--     This technique is useful if you need exclusive access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     It is illegal for the owning thread to lock an already-locked rwlock for writing (read-only may be locked recursively, writing can not). Doing so results in undefined behavior.
+--
+--     It is illegal to request a write lock from a thread that already holds a read-only lock. Doing so results in undefined behavior. Unlock the read-only lock before requesting a write lock.
+--
+--     This function returns true if passed a NULL rwlock.
+--
+--     [Returns]: true on success, false if the lock would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_TryLockRWLockForWriting@, defined at @SDL3\/SDL_mutex.h 612:34@
+sDL_TryLockRWLockForWriting
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to try to lock.
+  -> IO BG.CBool
+sDL_TryLockRWLockForWriting =
+  hs_bindgen_99a3ed9a28ed75f7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_UnlockRWLock@
+foreign import ccall safe "hs_bindgen_c9284c30c938f332"
+  hs_bindgen_c9284c30c938f332_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_UnlockRWLock@
+hs_bindgen_c9284c30c938f332
+  :: BG.Ptr SDL_RWLock
+  -> IO ()
+hs_bindgen_c9284c30c938f332 =
+  BG.fromFFIType hs_bindgen_c9284c30c938f332_base
+
+-- | Unlock the read\/write lock.
+--
+--     Use this function to unlock the rwlock, whether it was locked for read-only or write operations.
+--
+--     It is legal for the owning thread to lock an already-locked read-only lock. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive rwlock\").
+--
+--     It is illegal to unlock a rwlock that has not been locked by the current thread, and doing so results in undefined behavior.
+--
+--     [Thread safety]: This call must be paired with a previous locking call on the same thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForReading', 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_TryLockRWLockForWriting'
+--
+--     [C declaration]: @SDL_UnlockRWLock@, defined at @SDL3\/SDL_mutex.h 639:34@
+sDL_UnlockRWLock
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to unlock.
+  -> IO ()
+sDL_UnlockRWLock = hs_bindgen_c9284c30c938f332
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_DestroyRWLock@
+foreign import ccall safe "hs_bindgen_743dbdcc7c185970"
+  hs_bindgen_743dbdcc7c185970_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_DestroyRWLock@
+hs_bindgen_743dbdcc7c185970
+  :: BG.Ptr SDL_RWLock
+  -> IO ()
+hs_bindgen_743dbdcc7c185970 =
+  BG.fromFFIType hs_bindgen_743dbdcc7c185970_base
+
+-- | Destroy a read\/write lock created with @SDL_CreateRWLock()@.
+--
+--     This function must be called on any read\/write lock that is no longer needed. Failure to destroy a rwlock will result in a system memory or resource leak. While it is safe to destroy a rwlock that is /unlocked/, it is not safe to attempt to destroy a locked rwlock, and may result in undefined behavior depending on the platform.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRWLock'
+--
+--     [C declaration]: @SDL_DestroyRWLock@, defined at @SDL3\/SDL_mutex.h 658:34@
+sDL_DestroyRWLock
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to destroy.
+  -> IO ()
+sDL_DestroyRWLock = hs_bindgen_743dbdcc7c185970
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_CreateSemaphore@
+foreign import ccall safe "hs_bindgen_d1200eed8ae4acf8"
+  hs_bindgen_d1200eed8ae4acf8_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_CreateSemaphore@
+hs_bindgen_d1200eed8ae4acf8
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO (BG.Ptr SDL_Semaphore)
+hs_bindgen_d1200eed8ae4acf8 =
+  BG.fromFFIType hs_bindgen_d1200eed8ae4acf8_base
+
+-- | Create a semaphore.
+--
+--     This function creates a new semaphore and initializes it with the value @initial_value@. Each wait operation on the semaphore will atomically decrement the semaphore value and potentially block if the semaphore value is 0. Each post operation will atomically increment the semaphore value and wake waiting threads and allow them to retry the wait operation.
+--
+--     [Returns]: a new semaphore or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySemaphore', 'sDL_SignalSemaphore', 'sDL_TryWaitSemaphore', 'sDL_GetSemaphoreValue', 'sDL_WaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_CreateSemaphore@, defined at @SDL3\/SDL_mutex.h 708:45@
+sDL_CreateSemaphore
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@initial_value@]: the starting value of the semaphore.
+  -> IO (BG.Ptr SDL_Semaphore)
+sDL_CreateSemaphore = hs_bindgen_d1200eed8ae4acf8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_DestroySemaphore@
+foreign import ccall safe "hs_bindgen_d167c0d86f5bfae4"
+  hs_bindgen_d167c0d86f5bfae4_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_DestroySemaphore@
+hs_bindgen_d167c0d86f5bfae4
+  :: BG.Ptr SDL_Semaphore
+  -> IO ()
+hs_bindgen_d167c0d86f5bfae4 =
+  BG.fromFFIType hs_bindgen_d167c0d86f5bfae4_base
+
+-- | Destroy a semaphore.
+--
+--     It is not safe to destroy a semaphore if there are threads currently waiting on it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSemaphore'
+--
+--     [C declaration]: @SDL_DestroySemaphore@, defined at @SDL3\/SDL_mutex.h 724:34@
+sDL_DestroySemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to destroy.
+  -> IO ()
+sDL_DestroySemaphore = hs_bindgen_d167c0d86f5bfae4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_WaitSemaphore@
+foreign import ccall safe "hs_bindgen_0c536dc844c53556"
+  hs_bindgen_0c536dc844c53556_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_WaitSemaphore@
+hs_bindgen_0c536dc844c53556
+  :: BG.Ptr SDL_Semaphore
+  -> IO ()
+hs_bindgen_0c536dc844c53556 =
+  BG.fromFFIType hs_bindgen_0c536dc844c53556_base
+
+-- | Wait until a semaphore has a positive value and then decrements it.
+--
+--     This function suspends the calling thread until the semaphore pointed to by @sem@ has a positive value, and then atomically decrement the semaphore value.
+--
+--     This function is the equivalent of calling @SDL_WaitSemaphoreTimeout()@ with a time length of -1.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalSemaphore', 'sDL_TryWaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_WaitSemaphore@, defined at @SDL3\/SDL_mutex.h 746:34@
+sDL_WaitSemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore wait on.
+  -> IO ()
+sDL_WaitSemaphore = hs_bindgen_0c536dc844c53556
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_TryWaitSemaphore@
+foreign import ccall safe "hs_bindgen_8460788ee6bb642a"
+  hs_bindgen_8460788ee6bb642a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_TryWaitSemaphore@
+hs_bindgen_8460788ee6bb642a
+  :: BG.Ptr SDL_Semaphore
+  -> IO BG.CBool
+hs_bindgen_8460788ee6bb642a =
+  BG.fromFFIType hs_bindgen_8460788ee6bb642a_base
+
+-- | See if a semaphore has a positive value and decrement it if it does.
+--
+--     This function checks to see if the semaphore pointed to by @sem@ has a positive value and atomically decrements the semaphore value if it does. If the semaphore doesn\'t have a positive value, the function immediately returns false.
+--
+--     [Returns]: true if the wait succeeds, false if the wait would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalSemaphore', 'sDL_WaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_TryWaitSemaphore@, defined at @SDL3\/SDL_mutex.h 767:34@
+sDL_TryWaitSemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to wait on.
+  -> IO BG.CBool
+sDL_TryWaitSemaphore = hs_bindgen_8460788ee6bb642a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_WaitSemaphoreTimeout@
+foreign import ccall safe "hs_bindgen_73158966e18c69df"
+  hs_bindgen_73158966e18c69df_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_WaitSemaphoreTimeout@
+hs_bindgen_73158966e18c69df
+  :: BG.Ptr SDL_Semaphore
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_73158966e18c69df =
+  BG.fromFFIType hs_bindgen_73158966e18c69df_base
+
+-- | Wait until a semaphore has a positive value and then decrements it.
+--
+--     This function suspends the calling thread until either the semaphore pointed to by @sem@ has a positive value or the specified time has elapsed. If the call is successful it will atomically decrement the semaphore value.
+--
+--     [Returns]: true if the wait succeeds or false if the wait times out.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalSemaphore', 'sDL_TryWaitSemaphore', 'sDL_WaitSemaphore'
+--
+--     [C declaration]: @SDL_WaitSemaphoreTimeout@, defined at @SDL3\/SDL_mutex.h 789:34@
+sDL_WaitSemaphoreTimeout
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to wait on.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@timeoutMS@]: the length of the timeout, in milliseconds, or -1 to wait indefinitely.
+  -> IO BG.CBool
+sDL_WaitSemaphoreTimeout =
+  hs_bindgen_73158966e18c69df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_SignalSemaphore@
+foreign import ccall safe "hs_bindgen_ad3ea5b998b9b02a"
+  hs_bindgen_ad3ea5b998b9b02a_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_SignalSemaphore@
+hs_bindgen_ad3ea5b998b9b02a
+  :: BG.Ptr SDL_Semaphore
+  -> IO ()
+hs_bindgen_ad3ea5b998b9b02a =
+  BG.fromFFIType hs_bindgen_ad3ea5b998b9b02a_base
+
+-- | Atomically increment a semaphore\'s value and wake waiting threads.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TryWaitSemaphore', 'sDL_WaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_SignalSemaphore@, defined at @SDL3\/SDL_mutex.h 804:34@
+sDL_SignalSemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to increment.
+  -> IO ()
+sDL_SignalSemaphore = hs_bindgen_ad3ea5b998b9b02a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_GetSemaphoreValue@
+foreign import ccall safe "hs_bindgen_d7d8abceae459dc4"
+  hs_bindgen_d7d8abceae459dc4_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_GetSemaphoreValue@
+hs_bindgen_d7d8abceae459dc4
+  :: BG.Ptr SDL_Semaphore
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_d7d8abceae459dc4 =
+  BG.fromFFIType hs_bindgen_d7d8abceae459dc4_base
+
+-- | Get the current value of a semaphore.
+--
+--     [Returns]: the current value of the semaphore.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSemaphoreValue@, defined at @SDL3\/SDL_mutex.h 816:36@
+sDL_GetSemaphoreValue
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_GetSemaphoreValue = hs_bindgen_d7d8abceae459dc4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_CreateCondition@
+foreign import ccall safe "hs_bindgen_f051c9d83065c51e"
+  hs_bindgen_f051c9d83065c51e_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_CreateCondition@
+hs_bindgen_f051c9d83065c51e :: IO (BG.Ptr SDL_Condition)
+hs_bindgen_f051c9d83065c51e =
+  BG.fromFFIType hs_bindgen_f051c9d83065c51e_base
+
+-- | Create a condition variable.
+--
+--     [Returns]: a new condition variable or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_SignalCondition', 'sDL_WaitCondition', 'sDL_WaitConditionTimeout', 'sDL_DestroyCondition'
+--
+--     [C declaration]: @SDL_CreateCondition@, defined at @SDL3\/SDL_mutex.h 857:45@
+sDL_CreateCondition :: IO (BG.Ptr SDL_Condition)
+sDL_CreateCondition = hs_bindgen_f051c9d83065c51e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_DestroyCondition@
+foreign import ccall safe "hs_bindgen_284001adc7a8e944"
+  hs_bindgen_284001adc7a8e944_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_DestroyCondition@
+hs_bindgen_284001adc7a8e944
+  :: BG.Ptr SDL_Condition
+  -> IO ()
+hs_bindgen_284001adc7a8e944 =
+  BG.fromFFIType hs_bindgen_284001adc7a8e944_base
+
+-- | Destroy a condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateCondition'
+--
+--     [C declaration]: @SDL_DestroyCondition@, defined at @SDL3\/SDL_mutex.h 870:34@
+sDL_DestroyCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to destroy.
+  -> IO ()
+sDL_DestroyCondition = hs_bindgen_284001adc7a8e944
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_SignalCondition@
+foreign import ccall safe "hs_bindgen_8e6408554c791aa2"
+  hs_bindgen_8e6408554c791aa2_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_SignalCondition@
+hs_bindgen_8e6408554c791aa2
+  :: BG.Ptr SDL_Condition
+  -> IO ()
+hs_bindgen_8e6408554c791aa2 =
+  BG.fromFFIType hs_bindgen_8e6408554c791aa2_base
+
+-- | Restart one of the threads that are waiting on the condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_WaitCondition', 'sDL_WaitConditionTimeout'
+--
+--     [C declaration]: @SDL_SignalCondition@, defined at @SDL3\/SDL_mutex.h 885:34@
+sDL_SignalCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to signal.
+  -> IO ()
+sDL_SignalCondition = hs_bindgen_8e6408554c791aa2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_BroadcastCondition@
+foreign import ccall safe "hs_bindgen_1377f08bc73a7c85"
+  hs_bindgen_1377f08bc73a7c85_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_BroadcastCondition@
+hs_bindgen_1377f08bc73a7c85
+  :: BG.Ptr SDL_Condition
+  -> IO ()
+hs_bindgen_1377f08bc73a7c85 =
+  BG.fromFFIType hs_bindgen_1377f08bc73a7c85_base
+
+-- | Restart all threads that are waiting on the condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalCondition', 'sDL_WaitCondition', 'sDL_WaitConditionTimeout'
+--
+--     [C declaration]: @SDL_BroadcastCondition@, defined at @SDL3\/SDL_mutex.h 900:34@
+sDL_BroadcastCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to signal.
+  -> IO ()
+sDL_BroadcastCondition = hs_bindgen_1377f08bc73a7c85
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_WaitCondition@
+foreign import ccall safe "hs_bindgen_2c9c00769b6253d6"
+  hs_bindgen_2c9c00769b6253d6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_WaitCondition@
+hs_bindgen_2c9c00769b6253d6
+  :: BG.Ptr SDL_Condition
+  -> BG.Ptr SDL_Mutex
+  -> IO ()
+hs_bindgen_2c9c00769b6253d6 =
+  BG.fromFFIType hs_bindgen_2c9c00769b6253d6_base
+
+-- | Wait until a condition variable is signaled.
+--
+--     This function unlocks the specified @mutex@ and waits for another thread to call @SDL_SignalCondition()@ or @SDL_BroadcastCondition()@ on the condition variable @cond@. Once the condition variable is signaled, the mutex is re-locked and the function returns.
+--
+--     The mutex must be locked before calling this function. Locking the mutex recursively (more than once) is not supported and leads to undefined behavior.
+--
+--     This function is the equivalent of calling @SDL_WaitConditionTimeout()@ with a time length of -1.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_SignalCondition', 'sDL_WaitConditionTimeout'
+--
+--     [C declaration]: @SDL_WaitCondition@, defined at @SDL3\/SDL_mutex.h 928:34@
+sDL_WaitCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to wait on.
+  -> BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex used to coordinate thread access.
+  -> IO ()
+sDL_WaitCondition = hs_bindgen_2c9c00769b6253d6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_WaitConditionTimeout@
+foreign import ccall safe "hs_bindgen_158c5dc74b7f6a6d"
+  hs_bindgen_158c5dc74b7f6a6d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_WaitConditionTimeout@
+hs_bindgen_158c5dc74b7f6a6d
+  :: BG.Ptr SDL_Condition
+  -> BG.Ptr SDL_Mutex
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_158c5dc74b7f6a6d =
+  BG.fromFFIType hs_bindgen_158c5dc74b7f6a6d_base
+
+-- | Wait until a condition variable is signaled or a certain time has passed.
+--
+--     This function unlocks the specified @mutex@ and waits for another thread to call @SDL_SignalCondition()@ or @SDL_BroadcastCondition()@ on the condition variable @cond@, or for the specified time to elapse. Once the condition variable is signaled or the time elapsed, the mutex is re-locked and the function returns.
+--
+--     The mutex must be locked before calling this function. Locking the mutex recursively (more than once) is not supported and leads to undefined behavior.
+--
+--     [Returns]: true if the condition variable is signaled, false if the condition is not signaled in the allotted time.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_SignalCondition', 'sDL_WaitCondition'
+--
+--     [C declaration]: @SDL_WaitConditionTimeout@, defined at @SDL3\/SDL_mutex.h 958:34@
+sDL_WaitConditionTimeout
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to wait on.
+  -> BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex used to coordinate thread access.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum time to wait, in milliseconds, or -1 to wait indefinitely.
+  -> IO BG.CBool
+sDL_WaitConditionTimeout =
+  hs_bindgen_158c5dc74b7f6a6d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_ShouldInit@
+foreign import ccall safe "hs_bindgen_c32bbe3119c28451"
+  hs_bindgen_c32bbe3119c28451_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_ShouldInit@
+hs_bindgen_c32bbe3119c28451
+  :: BG.Ptr SDL_InitState
+  -> IO BG.CBool
+hs_bindgen_c32bbe3119c28451 =
+  BG.fromFFIType hs_bindgen_c32bbe3119c28451_base
+
+-- | Return whether initialization should be done.
+--
+--     This function checks the passed in state and if initialization should be done, sets the status to @SDL_INIT_STATUS_INITIALIZING@ and returns true. If another thread is already modifying this state, it will wait until that\'s done before returning.
+--
+--     If this function returns true, the calling code must call @SDL_SetInitialized()@ to complete the initialization.
+--
+--     [Returns]: true if initialization needs to be done, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetInitialized', 'sDL_ShouldQuit'
+--
+--     [C declaration]: @SDL_ShouldInit@, defined at @SDL3\/SDL_mutex.h 1065:34@
+sDL_ShouldInit
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> IO BG.CBool
+sDL_ShouldInit = hs_bindgen_c32bbe3119c28451
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_ShouldQuit@
+foreign import ccall safe "hs_bindgen_edbe1140979f28da"
+  hs_bindgen_edbe1140979f28da_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_ShouldQuit@
+hs_bindgen_edbe1140979f28da
+  :: BG.Ptr SDL_InitState
+  -> IO BG.CBool
+hs_bindgen_edbe1140979f28da =
+  BG.fromFFIType hs_bindgen_edbe1140979f28da_base
+
+-- | Return whether cleanup should be done.
+--
+--     This function checks the passed in state and if cleanup should be done, sets the status to @SDL_INIT_STATUS_UNINITIALIZING@ and returns true.
+--
+--     If this function returns true, the calling code must call @SDL_SetInitialized()@ to complete the cleanup.
+--
+--     [Returns]: true if cleanup needs to be done, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetInitialized', 'sDL_ShouldInit'
+--
+--     [C declaration]: @SDL_ShouldQuit@, defined at @SDL3\/SDL_mutex.h 1086:34@
+sDL_ShouldQuit
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> IO BG.CBool
+sDL_ShouldQuit = hs_bindgen_edbe1140979f28da
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_SetInitialized@
+foreign import ccall safe "hs_bindgen_5708550ac643317a"
+  hs_bindgen_5708550ac643317a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Safe_SDL_SetInitialized@
+hs_bindgen_5708550ac643317a
+  :: BG.Ptr SDL_InitState
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_5708550ac643317a =
+  BG.fromFFIType hs_bindgen_5708550ac643317a_base
+
+-- | Finish an initialization state transition.
+--
+--     This function sets the status of the passed in state to @SDL_INIT_STATUS_INITIALIZED@ or @SDL_INIT_STATUS_UNINITIALIZED@ and allows any threads waiting for the status to proceed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShouldInit', 'sDL_ShouldQuit'
+--
+--     [C declaration]: @SDL_SetInitialized@, defined at @SDL3\/SDL_mutex.h 1105:34@
+sDL_SetInitialized
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@initialized@]: the new initialization state.
+  -> IO ()
+sDL_SetInitialized = hs_bindgen_5708550ac643317a
diff --git a/src/SDL3/Sys/Bindgen/Mutex/Unsafe.hs b/src/SDL3/Sys/Bindgen/Mutex/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Mutex/Unsafe.hs
@@ -0,0 +1,1200 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Mutex.Unsafe (
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_CreateMutex,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_LockMutex,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_TryLockMutex,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_UnlockMutex,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_DestroyMutex,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_CreateRWLock,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_LockRWLockForReading,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_LockRWLockForWriting,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_TryLockRWLockForReading,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_TryLockRWLockForWriting,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_UnlockRWLock,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_DestroyRWLock,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_CreateSemaphore,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_DestroySemaphore,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_WaitSemaphore,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_TryWaitSemaphore,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_WaitSemaphoreTimeout,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_SignalSemaphore,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_GetSemaphoreValue,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_CreateCondition,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_DestroyCondition,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_SignalCondition,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_BroadcastCondition,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_WaitCondition,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_WaitConditionTimeout,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_ShouldInit,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_ShouldQuit,
+  SDL3.Sys.Bindgen.Mutex.Unsafe.sDL_SetInitialized,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Mutex
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_mutex.h>"
+         , "SDL_Mutex *hs_bindgen_c526869dd474f9d4 (void)"
+         , "{"
+         , "  return (SDL_CreateMutex)();"
+         , "}"
+         , "void hs_bindgen_3700147c7f8f729d ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_LockMutex)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_46125d4a3eea4802 ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TryLockMutex)(arg1);"
+         , "}"
+         , "void hs_bindgen_0947f4d603ee7345 ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockMutex)(arg1);"
+         , "}"
+         , "void hs_bindgen_f4951f4ff69bde3a ("
+         , "  SDL_Mutex *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyMutex)(arg1);"
+         , "}"
+         , "SDL_RWLock *hs_bindgen_7a80d9026c567dd4 (void)"
+         , "{"
+         , "  return (SDL_CreateRWLock)();"
+         , "}"
+         , "void hs_bindgen_6a42779577fc290d ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_LockRWLockForReading)(arg1);"
+         , "}"
+         , "void hs_bindgen_df143e5de220a8d0 ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_LockRWLockForWriting)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_fcc7e529a0e7c238 ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TryLockRWLockForReading)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_b8810b0a6bd09cc6 ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TryLockRWLockForWriting)(arg1);"
+         , "}"
+         , "void hs_bindgen_3379d27c22a5ec46 ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockRWLock)(arg1);"
+         , "}"
+         , "void hs_bindgen_c72e9a81eddb5a8a ("
+         , "  SDL_RWLock *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyRWLock)(arg1);"
+         , "}"
+         , "SDL_Semaphore *hs_bindgen_17068e34f72e4ea1 ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSemaphore)(arg1);"
+         , "}"
+         , "void hs_bindgen_b5060ff95a24fd36 ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroySemaphore)(arg1);"
+         , "}"
+         , "void hs_bindgen_28840d65574eb2f8 ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_WaitSemaphore)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_3fa09279680cdc12 ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_TryWaitSemaphore)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_c5019385fbe72f83 ("
+         , "  SDL_Semaphore *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitSemaphoreTimeout)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_03c7b146c352e907 ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SignalSemaphore)(arg1);"
+         , "}"
+         , "Uint32 hs_bindgen_94229d10afd1d48d ("
+         , "  SDL_Semaphore *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSemaphoreValue)(arg1);"
+         , "}"
+         , "SDL_Condition *hs_bindgen_ddf6e8ed9edaee07 (void)"
+         , "{"
+         , "  return (SDL_CreateCondition)();"
+         , "}"
+         , "void hs_bindgen_6951d0b3aefa0348 ("
+         , "  SDL_Condition *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyCondition)(arg1);"
+         , "}"
+         , "void hs_bindgen_0e1403265e307285 ("
+         , "  SDL_Condition *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_SignalCondition)(arg1);"
+         , "}"
+         , "void hs_bindgen_5a23b56ab9c6eb57 ("
+         , "  SDL_Condition *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_BroadcastCondition)(arg1);"
+         , "}"
+         , "void hs_bindgen_eb793a971cc6840d ("
+         , "  SDL_Condition *arg1,"
+         , "  SDL_Mutex *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_WaitCondition)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_77c7f6d44aa07f68 ("
+         , "  SDL_Condition *arg1,"
+         , "  SDL_Mutex *arg2,"
+         , "  Sint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitConditionTimeout)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_75dd9a6c786ad592 ("
+         , "  SDL_InitState *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ShouldInit)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8bafd17a9cf1a409 ("
+         , "  SDL_InitState *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ShouldQuit)(arg1);"
+         , "}"
+         , "void hs_bindgen_5586c698b54b7f33 ("
+         , "  SDL_InitState *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetInitialized)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_CreateMutex@
+foreign import ccall unsafe "hs_bindgen_c526869dd474f9d4"
+  hs_bindgen_c526869dd474f9d4_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_CreateMutex@
+hs_bindgen_c526869dd474f9d4 :: IO (BG.Ptr SDL_Mutex)
+hs_bindgen_c526869dd474f9d4 =
+  BG.fromFFIType hs_bindgen_c526869dd474f9d4_base
+
+-- | Create a new mutex.
+--
+--     All newly-created mutexes begin in the /unlocked/ state.
+--
+--     Calls to @SDL_LockMutex()@ will not return while the mutex is locked by another thread. See @SDL_TryLockMutex()@ to attempt to lock without blocking.
+--
+--     SDL mutexes are reentrant.
+--
+--     [Returns]: the initialized and unlocked mutex or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyMutex', 'sDL_LockMutex', 'sDL_TryLockMutex', 'sDL_UnlockMutex'
+--
+--     [C declaration]: @SDL_CreateMutex@, defined at @SDL3\/SDL_mutex.h 320:41@
+sDL_CreateMutex :: IO (BG.Ptr SDL_Mutex)
+sDL_CreateMutex = hs_bindgen_c526869dd474f9d4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_LockMutex@
+foreign import ccall unsafe "hs_bindgen_3700147c7f8f729d"
+  hs_bindgen_3700147c7f8f729d_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_LockMutex@
+hs_bindgen_3700147c7f8f729d
+  :: BG.Ptr SDL_Mutex
+  -> IO ()
+hs_bindgen_3700147c7f8f729d =
+  BG.fromFFIType hs_bindgen_3700147c7f8f729d_base
+
+-- | Lock the mutex.
+--
+--     This will block until the mutex is available, which is to say it is in the unlocked state and the OS has chosen the caller as the next thread to lock it. Of all threads waiting to lock the mutex, only one may do so at a time.
+--
+--     It is legal for the owning thread to lock an already-locked mutex. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive mutex\").
+--
+--     This function does not fail; if mutex is NULL, it will return immediately having locked nothing. If the mutex is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TryLockMutex', 'sDL_UnlockMutex'
+--
+--     [C declaration]: @SDL_LockMutex@, defined at @SDL3\/SDL_mutex.h 346:34@
+sDL_LockMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to lock.
+  -> IO ()
+sDL_LockMutex = hs_bindgen_3700147c7f8f729d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_TryLockMutex@
+foreign import ccall unsafe "hs_bindgen_46125d4a3eea4802"
+  hs_bindgen_46125d4a3eea4802_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_TryLockMutex@
+hs_bindgen_46125d4a3eea4802
+  :: BG.Ptr SDL_Mutex
+  -> IO BG.CBool
+hs_bindgen_46125d4a3eea4802 =
+  BG.fromFFIType hs_bindgen_46125d4a3eea4802_base
+
+-- | Try to lock a mutex without blocking.
+--
+--     This works just like @SDL_LockMutex()@, but if the mutex is not available, this function returns false immediately.
+--
+--     This technique is useful if you need exclusive access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     This function returns true if passed a NULL mutex.
+--
+--     [Returns]: true on success, false if the mutex would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockMutex', 'sDL_UnlockMutex'
+--
+--     [C declaration]: @SDL_TryLockMutex@, defined at @SDL3\/SDL_mutex.h 369:34@
+sDL_TryLockMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to try to lock.
+  -> IO BG.CBool
+sDL_TryLockMutex = hs_bindgen_46125d4a3eea4802
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_UnlockMutex@
+foreign import ccall unsafe "hs_bindgen_0947f4d603ee7345"
+  hs_bindgen_0947f4d603ee7345_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_UnlockMutex@
+hs_bindgen_0947f4d603ee7345
+  :: BG.Ptr SDL_Mutex
+  -> IO ()
+hs_bindgen_0947f4d603ee7345 =
+  BG.fromFFIType hs_bindgen_0947f4d603ee7345_base
+
+-- | Unlock the mutex.
+--
+--     It is legal for the owning thread to lock an already-locked mutex. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive mutex\").
+--
+--     It is illegal to unlock a mutex that has not been locked by the current thread, and doing so results in undefined behavior.
+--
+--     [Thread safety]: This call must be paired with a previous locking call on the same thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockMutex', 'sDL_TryLockMutex'
+--
+--     [C declaration]: @SDL_UnlockMutex@, defined at @SDL3\/SDL_mutex.h 390:34@
+sDL_UnlockMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to unlock.
+  -> IO ()
+sDL_UnlockMutex = hs_bindgen_0947f4d603ee7345
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_DestroyMutex@
+foreign import ccall unsafe "hs_bindgen_f4951f4ff69bde3a"
+  hs_bindgen_f4951f4ff69bde3a_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_DestroyMutex@
+hs_bindgen_f4951f4ff69bde3a
+  :: BG.Ptr SDL_Mutex
+  -> IO ()
+hs_bindgen_f4951f4ff69bde3a =
+  BG.fromFFIType hs_bindgen_f4951f4ff69bde3a_base
+
+-- | Destroy a mutex created with @SDL_CreateMutex()@.
+--
+--     This function must be called on any mutex that is no longer needed. Failure to destroy a mutex will result in a system memory or resource leak. While it is safe to destroy a mutex that is /unlocked/, it is not safe to attempt to destroy a locked mutex, and may result in undefined behavior depending on the platform.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateMutex'
+--
+--     [C declaration]: @SDL_DestroyMutex@, defined at @SDL3\/SDL_mutex.h 409:34@
+sDL_DestroyMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to destroy.
+  -> IO ()
+sDL_DestroyMutex = hs_bindgen_f4951f4ff69bde3a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_CreateRWLock@
+foreign import ccall unsafe "hs_bindgen_7a80d9026c567dd4"
+  hs_bindgen_7a80d9026c567dd4_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_CreateRWLock@
+hs_bindgen_7a80d9026c567dd4 :: IO (BG.Ptr SDL_RWLock)
+hs_bindgen_7a80d9026c567dd4 =
+  BG.fromFFIType hs_bindgen_7a80d9026c567dd4_base
+
+-- | Create a new read\/write lock.
+--
+--     A read\/write lock is useful for situations where you have multiple threads trying to access a resource that is rarely updated. All threads requesting a read-only lock will be allowed to run in parallel; if a thread requests a write lock, it will be provided exclusive access. This makes it safe for multiple threads to use a resource at the same time if they promise not to change it, and when it has to be changed, the rwlock will serve as a gateway to make sure those changes can be made safely.
+--
+--     In the right situation, a rwlock can be more efficient than a mutex, which only lets a single thread proceed at a time, even if it won\'t be modifying the data.
+--
+--     All newly-created read\/write locks begin in the /unlocked/ state.
+--
+--     Calls to @SDL_LockRWLockForReading()@ and SDL_LockRWLockForWriting will not return while the rwlock is locked /for writing/ by another thread. See @SDL_TryLockRWLockForReading()@ and @SDL_TryLockRWLockForWriting()@ to attempt to lock without blocking.
+--
+--     SDL read\/write locks are only recursive for read-only locks! They are not guaranteed to be fair, or provide access in a FIFO manner! They are not guaranteed to favor writers. You may not lock a rwlock for both read-only and write access at the same time from the same thread (so you can\'t promote your read-only lock to a write lock without unlocking first).
+--
+--     [Returns]: the initialized and unlocked read\/write lock or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyRWLock', 'sDL_LockRWLockForReading', 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_TryLockRWLockForWriting', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_CreateRWLock@, defined at @SDL3\/SDL_mutex.h 481:42@
+sDL_CreateRWLock :: IO (BG.Ptr SDL_RWLock)
+sDL_CreateRWLock = hs_bindgen_7a80d9026c567dd4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_LockRWLockForReading@
+foreign import ccall unsafe "hs_bindgen_6a42779577fc290d"
+  hs_bindgen_6a42779577fc290d_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_LockRWLockForReading@
+hs_bindgen_6a42779577fc290d
+  :: BG.Ptr SDL_RWLock
+  -> IO ()
+hs_bindgen_6a42779577fc290d =
+  BG.fromFFIType hs_bindgen_6a42779577fc290d_base
+
+-- | Lock the read\/write lock for /read only/ operations.
+--
+--     This will block until the rwlock is available, which is to say it is not locked for writing by any other thread. Of all threads waiting to lock the rwlock, all may do so at the same time as long as they are requesting read-only access; if a thread wants to lock for writing, only one may do so at a time, and no other threads, read-only or not, may hold the lock at the same time.
+--
+--     It is legal for the owning thread to lock an already-locked rwlock for reading. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive rwlock\").
+--
+--     Note that locking for writing is not recursive (this is only available to read-only locks).
+--
+--     It is illegal to request a read-only lock from a thread that already holds the write lock. Doing so results in undefined behavior. Unlock the write lock before requesting a read-only lock. (But, of course, if you have the write lock, you don\'t need further locks to read in any case.)
+--
+--     This function does not fail; if rwlock is NULL, it will return immediately having locked nothing. If the rwlock is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_LockRWLockForReading@, defined at @SDL3\/SDL_mutex.h 520:34@
+sDL_LockRWLockForReading
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the read\/write lock to lock.
+  -> IO ()
+sDL_LockRWLockForReading =
+  hs_bindgen_6a42779577fc290d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_LockRWLockForWriting@
+foreign import ccall unsafe "hs_bindgen_df143e5de220a8d0"
+  hs_bindgen_df143e5de220a8d0_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_LockRWLockForWriting@
+hs_bindgen_df143e5de220a8d0
+  :: BG.Ptr SDL_RWLock
+  -> IO ()
+hs_bindgen_df143e5de220a8d0 =
+  BG.fromFFIType hs_bindgen_df143e5de220a8d0_base
+
+-- | Lock the read\/write lock for /write/ operations.
+--
+--     This will block until the rwlock is available, which is to say it is not locked for reading or writing by any other thread. Only one thread may hold the lock when it requests write access; all other threads, whether they also want to write or only want read-only access, must wait until the writer thread has released the lock.
+--
+--     It is illegal for the owning thread to lock an already-locked rwlock for writing (read-only may be locked recursively, writing can not). Doing so results in undefined behavior.
+--
+--     It is illegal to request a write lock from a thread that already holds a read-only lock. Doing so results in undefined behavior. Unlock the read-only lock before requesting a write lock.
+--
+--     This function does not fail; if rwlock is NULL, it will return immediately having locked nothing. If the rwlock is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForReading', 'sDL_TryLockRWLockForWriting', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_LockRWLockForWriting@, defined at @SDL3\/SDL_mutex.h 553:34@
+sDL_LockRWLockForWriting
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the read\/write lock to lock.
+  -> IO ()
+sDL_LockRWLockForWriting =
+  hs_bindgen_df143e5de220a8d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_TryLockRWLockForReading@
+foreign import ccall unsafe "hs_bindgen_fcc7e529a0e7c238"
+  hs_bindgen_fcc7e529a0e7c238_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_TryLockRWLockForReading@
+hs_bindgen_fcc7e529a0e7c238
+  :: BG.Ptr SDL_RWLock
+  -> IO BG.CBool
+hs_bindgen_fcc7e529a0e7c238 =
+  BG.fromFFIType hs_bindgen_fcc7e529a0e7c238_base
+
+-- | Try to lock a read\/write lock /for reading/ without blocking.
+--
+--     This works just like @SDL_LockRWLockForReading()@, but if the rwlock is not available, then this function returns false immediately.
+--
+--     This technique is useful if you need access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     Trying to lock for read-only access can succeed if other threads are holding read-only locks, as this won\'t prevent access.
+--
+--     This function returns true if passed a NULL rwlock.
+--
+--     [Returns]: true on success, false if the lock would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForReading', 'sDL_TryLockRWLockForWriting', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_TryLockRWLockForReading@, defined at @SDL3\/SDL_mutex.h 580:34@
+sDL_TryLockRWLockForReading
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to try to lock.
+  -> IO BG.CBool
+sDL_TryLockRWLockForReading =
+  hs_bindgen_fcc7e529a0e7c238
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_TryLockRWLockForWriting@
+foreign import ccall unsafe "hs_bindgen_b8810b0a6bd09cc6"
+  hs_bindgen_b8810b0a6bd09cc6_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_TryLockRWLockForWriting@
+hs_bindgen_b8810b0a6bd09cc6
+  :: BG.Ptr SDL_RWLock
+  -> IO BG.CBool
+hs_bindgen_b8810b0a6bd09cc6 =
+  BG.fromFFIType hs_bindgen_b8810b0a6bd09cc6_base
+
+-- | Try to lock a read\/write lock /for writing/ without blocking.
+--
+--     This works just like @SDL_LockRWLockForWriting()@, but if the rwlock is not available, then this function returns false immediately.
+--
+--     This technique is useful if you need exclusive access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     It is illegal for the owning thread to lock an already-locked rwlock for writing (read-only may be locked recursively, writing can not). Doing so results in undefined behavior.
+--
+--     It is illegal to request a write lock from a thread that already holds a read-only lock. Doing so results in undefined behavior. Unlock the read-only lock before requesting a write lock.
+--
+--     This function returns true if passed a NULL rwlock.
+--
+--     [Returns]: true on success, false if the lock would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_UnlockRWLock'
+--
+--     [C declaration]: @SDL_TryLockRWLockForWriting@, defined at @SDL3\/SDL_mutex.h 612:34@
+sDL_TryLockRWLockForWriting
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to try to lock.
+  -> IO BG.CBool
+sDL_TryLockRWLockForWriting =
+  hs_bindgen_b8810b0a6bd09cc6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_UnlockRWLock@
+foreign import ccall unsafe "hs_bindgen_3379d27c22a5ec46"
+  hs_bindgen_3379d27c22a5ec46_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_UnlockRWLock@
+hs_bindgen_3379d27c22a5ec46
+  :: BG.Ptr SDL_RWLock
+  -> IO ()
+hs_bindgen_3379d27c22a5ec46 =
+  BG.fromFFIType hs_bindgen_3379d27c22a5ec46_base
+
+-- | Unlock the read\/write lock.
+--
+--     Use this function to unlock the rwlock, whether it was locked for read-only or write operations.
+--
+--     It is legal for the owning thread to lock an already-locked read-only lock. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive rwlock\").
+--
+--     It is illegal to unlock a rwlock that has not been locked by the current thread, and doing so results in undefined behavior.
+--
+--     [Thread safety]: This call must be paired with a previous locking call on the same thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockRWLockForReading', 'sDL_LockRWLockForWriting', 'sDL_TryLockRWLockForReading', 'sDL_TryLockRWLockForWriting'
+--
+--     [C declaration]: @SDL_UnlockRWLock@, defined at @SDL3\/SDL_mutex.h 639:34@
+sDL_UnlockRWLock
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to unlock.
+  -> IO ()
+sDL_UnlockRWLock = hs_bindgen_3379d27c22a5ec46
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_DestroyRWLock@
+foreign import ccall unsafe "hs_bindgen_c72e9a81eddb5a8a"
+  hs_bindgen_c72e9a81eddb5a8a_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_DestroyRWLock@
+hs_bindgen_c72e9a81eddb5a8a
+  :: BG.Ptr SDL_RWLock
+  -> IO ()
+hs_bindgen_c72e9a81eddb5a8a =
+  BG.fromFFIType hs_bindgen_c72e9a81eddb5a8a_base
+
+-- | Destroy a read\/write lock created with @SDL_CreateRWLock()@.
+--
+--     This function must be called on any read\/write lock that is no longer needed. Failure to destroy a rwlock will result in a system memory or resource leak. While it is safe to destroy a rwlock that is /unlocked/, it is not safe to attempt to destroy a locked rwlock, and may result in undefined behavior depending on the platform.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRWLock'
+--
+--     [C declaration]: @SDL_DestroyRWLock@, defined at @SDL3\/SDL_mutex.h 658:34@
+sDL_DestroyRWLock
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to destroy.
+  -> IO ()
+sDL_DestroyRWLock = hs_bindgen_c72e9a81eddb5a8a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_CreateSemaphore@
+foreign import ccall unsafe "hs_bindgen_17068e34f72e4ea1"
+  hs_bindgen_17068e34f72e4ea1_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_CreateSemaphore@
+hs_bindgen_17068e34f72e4ea1
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO (BG.Ptr SDL_Semaphore)
+hs_bindgen_17068e34f72e4ea1 =
+  BG.fromFFIType hs_bindgen_17068e34f72e4ea1_base
+
+-- | Create a semaphore.
+--
+--     This function creates a new semaphore and initializes it with the value @initial_value@. Each wait operation on the semaphore will atomically decrement the semaphore value and potentially block if the semaphore value is 0. Each post operation will atomically increment the semaphore value and wake waiting threads and allow them to retry the wait operation.
+--
+--     [Returns]: a new semaphore or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySemaphore', 'sDL_SignalSemaphore', 'sDL_TryWaitSemaphore', 'sDL_GetSemaphoreValue', 'sDL_WaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_CreateSemaphore@, defined at @SDL3\/SDL_mutex.h 708:45@
+sDL_CreateSemaphore
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@initial_value@]: the starting value of the semaphore.
+  -> IO (BG.Ptr SDL_Semaphore)
+sDL_CreateSemaphore = hs_bindgen_17068e34f72e4ea1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_DestroySemaphore@
+foreign import ccall unsafe "hs_bindgen_b5060ff95a24fd36"
+  hs_bindgen_b5060ff95a24fd36_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_DestroySemaphore@
+hs_bindgen_b5060ff95a24fd36
+  :: BG.Ptr SDL_Semaphore
+  -> IO ()
+hs_bindgen_b5060ff95a24fd36 =
+  BG.fromFFIType hs_bindgen_b5060ff95a24fd36_base
+
+-- | Destroy a semaphore.
+--
+--     It is not safe to destroy a semaphore if there are threads currently waiting on it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSemaphore'
+--
+--     [C declaration]: @SDL_DestroySemaphore@, defined at @SDL3\/SDL_mutex.h 724:34@
+sDL_DestroySemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to destroy.
+  -> IO ()
+sDL_DestroySemaphore = hs_bindgen_b5060ff95a24fd36
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_WaitSemaphore@
+foreign import ccall unsafe "hs_bindgen_28840d65574eb2f8"
+  hs_bindgen_28840d65574eb2f8_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_WaitSemaphore@
+hs_bindgen_28840d65574eb2f8
+  :: BG.Ptr SDL_Semaphore
+  -> IO ()
+hs_bindgen_28840d65574eb2f8 =
+  BG.fromFFIType hs_bindgen_28840d65574eb2f8_base
+
+-- | Wait until a semaphore has a positive value and then decrements it.
+--
+--     This function suspends the calling thread until the semaphore pointed to by @sem@ has a positive value, and then atomically decrement the semaphore value.
+--
+--     This function is the equivalent of calling @SDL_WaitSemaphoreTimeout()@ with a time length of -1.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalSemaphore', 'sDL_TryWaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_WaitSemaphore@, defined at @SDL3\/SDL_mutex.h 746:34@
+sDL_WaitSemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore wait on.
+  -> IO ()
+sDL_WaitSemaphore = hs_bindgen_28840d65574eb2f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_TryWaitSemaphore@
+foreign import ccall unsafe "hs_bindgen_3fa09279680cdc12"
+  hs_bindgen_3fa09279680cdc12_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_TryWaitSemaphore@
+hs_bindgen_3fa09279680cdc12
+  :: BG.Ptr SDL_Semaphore
+  -> IO BG.CBool
+hs_bindgen_3fa09279680cdc12 =
+  BG.fromFFIType hs_bindgen_3fa09279680cdc12_base
+
+-- | See if a semaphore has a positive value and decrement it if it does.
+--
+--     This function checks to see if the semaphore pointed to by @sem@ has a positive value and atomically decrements the semaphore value if it does. If the semaphore doesn\'t have a positive value, the function immediately returns false.
+--
+--     [Returns]: true if the wait succeeds, false if the wait would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalSemaphore', 'sDL_WaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_TryWaitSemaphore@, defined at @SDL3\/SDL_mutex.h 767:34@
+sDL_TryWaitSemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to wait on.
+  -> IO BG.CBool
+sDL_TryWaitSemaphore = hs_bindgen_3fa09279680cdc12
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_WaitSemaphoreTimeout@
+foreign import ccall unsafe "hs_bindgen_c5019385fbe72f83"
+  hs_bindgen_c5019385fbe72f83_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_WaitSemaphoreTimeout@
+hs_bindgen_c5019385fbe72f83
+  :: BG.Ptr SDL_Semaphore
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_c5019385fbe72f83 =
+  BG.fromFFIType hs_bindgen_c5019385fbe72f83_base
+
+-- | Wait until a semaphore has a positive value and then decrements it.
+--
+--     This function suspends the calling thread until either the semaphore pointed to by @sem@ has a positive value or the specified time has elapsed. If the call is successful it will atomically decrement the semaphore value.
+--
+--     [Returns]: true if the wait succeeds or false if the wait times out.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalSemaphore', 'sDL_TryWaitSemaphore', 'sDL_WaitSemaphore'
+--
+--     [C declaration]: @SDL_WaitSemaphoreTimeout@, defined at @SDL3\/SDL_mutex.h 789:34@
+sDL_WaitSemaphoreTimeout
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to wait on.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@timeoutMS@]: the length of the timeout, in milliseconds, or -1 to wait indefinitely.
+  -> IO BG.CBool
+sDL_WaitSemaphoreTimeout =
+  hs_bindgen_c5019385fbe72f83
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_SignalSemaphore@
+foreign import ccall unsafe "hs_bindgen_03c7b146c352e907"
+  hs_bindgen_03c7b146c352e907_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_SignalSemaphore@
+hs_bindgen_03c7b146c352e907
+  :: BG.Ptr SDL_Semaphore
+  -> IO ()
+hs_bindgen_03c7b146c352e907 =
+  BG.fromFFIType hs_bindgen_03c7b146c352e907_base
+
+-- | Atomically increment a semaphore\'s value and wake waiting threads.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_TryWaitSemaphore', 'sDL_WaitSemaphore', 'sDL_WaitSemaphoreTimeout'
+--
+--     [C declaration]: @SDL_SignalSemaphore@, defined at @SDL3\/SDL_mutex.h 804:34@
+sDL_SignalSemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to increment.
+  -> IO ()
+sDL_SignalSemaphore = hs_bindgen_03c7b146c352e907
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_GetSemaphoreValue@
+foreign import ccall unsafe "hs_bindgen_94229d10afd1d48d"
+  hs_bindgen_94229d10afd1d48d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_GetSemaphoreValue@
+hs_bindgen_94229d10afd1d48d
+  :: BG.Ptr SDL_Semaphore
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_94229d10afd1d48d =
+  BG.fromFFIType hs_bindgen_94229d10afd1d48d_base
+
+-- | Get the current value of a semaphore.
+--
+--     [Returns]: the current value of the semaphore.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSemaphoreValue@, defined at @SDL3\/SDL_mutex.h 816:36@
+sDL_GetSemaphoreValue
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_GetSemaphoreValue = hs_bindgen_94229d10afd1d48d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_CreateCondition@
+foreign import ccall unsafe "hs_bindgen_ddf6e8ed9edaee07"
+  hs_bindgen_ddf6e8ed9edaee07_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_CreateCondition@
+hs_bindgen_ddf6e8ed9edaee07 :: IO (BG.Ptr SDL_Condition)
+hs_bindgen_ddf6e8ed9edaee07 =
+  BG.fromFFIType hs_bindgen_ddf6e8ed9edaee07_base
+
+-- | Create a condition variable.
+--
+--     [Returns]: a new condition variable or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_SignalCondition', 'sDL_WaitCondition', 'sDL_WaitConditionTimeout', 'sDL_DestroyCondition'
+--
+--     [C declaration]: @SDL_CreateCondition@, defined at @SDL3\/SDL_mutex.h 857:45@
+sDL_CreateCondition :: IO (BG.Ptr SDL_Condition)
+sDL_CreateCondition = hs_bindgen_ddf6e8ed9edaee07
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_DestroyCondition@
+foreign import ccall unsafe "hs_bindgen_6951d0b3aefa0348"
+  hs_bindgen_6951d0b3aefa0348_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_DestroyCondition@
+hs_bindgen_6951d0b3aefa0348
+  :: BG.Ptr SDL_Condition
+  -> IO ()
+hs_bindgen_6951d0b3aefa0348 =
+  BG.fromFFIType hs_bindgen_6951d0b3aefa0348_base
+
+-- | Destroy a condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateCondition'
+--
+--     [C declaration]: @SDL_DestroyCondition@, defined at @SDL3\/SDL_mutex.h 870:34@
+sDL_DestroyCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to destroy.
+  -> IO ()
+sDL_DestroyCondition = hs_bindgen_6951d0b3aefa0348
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_SignalCondition@
+foreign import ccall unsafe "hs_bindgen_0e1403265e307285"
+  hs_bindgen_0e1403265e307285_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_SignalCondition@
+hs_bindgen_0e1403265e307285
+  :: BG.Ptr SDL_Condition
+  -> IO ()
+hs_bindgen_0e1403265e307285 =
+  BG.fromFFIType hs_bindgen_0e1403265e307285_base
+
+-- | Restart one of the threads that are waiting on the condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_WaitCondition', 'sDL_WaitConditionTimeout'
+--
+--     [C declaration]: @SDL_SignalCondition@, defined at @SDL3\/SDL_mutex.h 885:34@
+sDL_SignalCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to signal.
+  -> IO ()
+sDL_SignalCondition = hs_bindgen_0e1403265e307285
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_BroadcastCondition@
+foreign import ccall unsafe "hs_bindgen_5a23b56ab9c6eb57"
+  hs_bindgen_5a23b56ab9c6eb57_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_BroadcastCondition@
+hs_bindgen_5a23b56ab9c6eb57
+  :: BG.Ptr SDL_Condition
+  -> IO ()
+hs_bindgen_5a23b56ab9c6eb57 =
+  BG.fromFFIType hs_bindgen_5a23b56ab9c6eb57_base
+
+-- | Restart all threads that are waiting on the condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SignalCondition', 'sDL_WaitCondition', 'sDL_WaitConditionTimeout'
+--
+--     [C declaration]: @SDL_BroadcastCondition@, defined at @SDL3\/SDL_mutex.h 900:34@
+sDL_BroadcastCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to signal.
+  -> IO ()
+sDL_BroadcastCondition = hs_bindgen_5a23b56ab9c6eb57
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_WaitCondition@
+foreign import ccall unsafe "hs_bindgen_eb793a971cc6840d"
+  hs_bindgen_eb793a971cc6840d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_WaitCondition@
+hs_bindgen_eb793a971cc6840d
+  :: BG.Ptr SDL_Condition
+  -> BG.Ptr SDL_Mutex
+  -> IO ()
+hs_bindgen_eb793a971cc6840d =
+  BG.fromFFIType hs_bindgen_eb793a971cc6840d_base
+
+-- | Wait until a condition variable is signaled.
+--
+--     This function unlocks the specified @mutex@ and waits for another thread to call @SDL_SignalCondition()@ or @SDL_BroadcastCondition()@ on the condition variable @cond@. Once the condition variable is signaled, the mutex is re-locked and the function returns.
+--
+--     The mutex must be locked before calling this function. Locking the mutex recursively (more than once) is not supported and leads to undefined behavior.
+--
+--     This function is the equivalent of calling @SDL_WaitConditionTimeout()@ with a time length of -1.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_SignalCondition', 'sDL_WaitConditionTimeout'
+--
+--     [C declaration]: @SDL_WaitCondition@, defined at @SDL3\/SDL_mutex.h 928:34@
+sDL_WaitCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to wait on.
+  -> BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex used to coordinate thread access.
+  -> IO ()
+sDL_WaitCondition = hs_bindgen_eb793a971cc6840d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_WaitConditionTimeout@
+foreign import ccall unsafe "hs_bindgen_77c7f6d44aa07f68"
+  hs_bindgen_77c7f6d44aa07f68_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_WaitConditionTimeout@
+hs_bindgen_77c7f6d44aa07f68
+  :: BG.Ptr SDL_Condition
+  -> BG.Ptr SDL_Mutex
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -> IO BG.CBool
+hs_bindgen_77c7f6d44aa07f68 =
+  BG.fromFFIType hs_bindgen_77c7f6d44aa07f68_base
+
+-- | Wait until a condition variable is signaled or a certain time has passed.
+--
+--     This function unlocks the specified @mutex@ and waits for another thread to call @SDL_SignalCondition()@ or @SDL_BroadcastCondition()@ on the condition variable @cond@, or for the specified time to elapse. Once the condition variable is signaled or the time elapsed, the mutex is re-locked and the function returns.
+--
+--     The mutex must be locked before calling this function. Locking the mutex recursively (more than once) is not supported and leads to undefined behavior.
+--
+--     [Returns]: true if the condition variable is signaled, false if the condition is not signaled in the allotted time.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BroadcastCondition', 'sDL_SignalCondition', 'sDL_WaitCondition'
+--
+--     [C declaration]: @SDL_WaitConditionTimeout@, defined at @SDL3\/SDL_mutex.h 958:34@
+sDL_WaitConditionTimeout
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to wait on.
+  -> BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex used to coordinate thread access.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum time to wait, in milliseconds, or -1 to wait indefinitely.
+  -> IO BG.CBool
+sDL_WaitConditionTimeout =
+  hs_bindgen_77c7f6d44aa07f68
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_ShouldInit@
+foreign import ccall unsafe "hs_bindgen_75dd9a6c786ad592"
+  hs_bindgen_75dd9a6c786ad592_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_ShouldInit@
+hs_bindgen_75dd9a6c786ad592
+  :: BG.Ptr SDL_InitState
+  -> IO BG.CBool
+hs_bindgen_75dd9a6c786ad592 =
+  BG.fromFFIType hs_bindgen_75dd9a6c786ad592_base
+
+-- | Return whether initialization should be done.
+--
+--     This function checks the passed in state and if initialization should be done, sets the status to @SDL_INIT_STATUS_INITIALIZING@ and returns true. If another thread is already modifying this state, it will wait until that\'s done before returning.
+--
+--     If this function returns true, the calling code must call @SDL_SetInitialized()@ to complete the initialization.
+--
+--     [Returns]: true if initialization needs to be done, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetInitialized', 'sDL_ShouldQuit'
+--
+--     [C declaration]: @SDL_ShouldInit@, defined at @SDL3\/SDL_mutex.h 1065:34@
+sDL_ShouldInit
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> IO BG.CBool
+sDL_ShouldInit = hs_bindgen_75dd9a6c786ad592
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_ShouldQuit@
+foreign import ccall unsafe "hs_bindgen_8bafd17a9cf1a409"
+  hs_bindgen_8bafd17a9cf1a409_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_ShouldQuit@
+hs_bindgen_8bafd17a9cf1a409
+  :: BG.Ptr SDL_InitState
+  -> IO BG.CBool
+hs_bindgen_8bafd17a9cf1a409 =
+  BG.fromFFIType hs_bindgen_8bafd17a9cf1a409_base
+
+-- | Return whether cleanup should be done.
+--
+--     This function checks the passed in state and if cleanup should be done, sets the status to @SDL_INIT_STATUS_UNINITIALIZING@ and returns true.
+--
+--     If this function returns true, the calling code must call @SDL_SetInitialized()@ to complete the cleanup.
+--
+--     [Returns]: true if cleanup needs to be done, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetInitialized', 'sDL_ShouldInit'
+--
+--     [C declaration]: @SDL_ShouldQuit@, defined at @SDL3\/SDL_mutex.h 1086:34@
+sDL_ShouldQuit
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> IO BG.CBool
+sDL_ShouldQuit = hs_bindgen_8bafd17a9cf1a409
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_SetInitialized@
+foreign import ccall unsafe "hs_bindgen_5586c698b54b7f33"
+  hs_bindgen_5586c698b54b7f33_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Mutex_Unsafe_SDL_SetInitialized@
+hs_bindgen_5586c698b54b7f33
+  :: BG.Ptr SDL_InitState
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_5586c698b54b7f33 =
+  BG.fromFFIType hs_bindgen_5586c698b54b7f33_base
+
+-- | Finish an initialization state transition.
+--
+--     This function sets the status of the passed in state to @SDL_INIT_STATUS_INITIALIZED@ or @SDL_INIT_STATUS_UNINITIALIZED@ and allows any threads waiting for the status to proceed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShouldInit', 'sDL_ShouldQuit'
+--
+--     [C declaration]: @SDL_SetInitialized@, defined at @SDL3\/SDL_mutex.h 1105:34@
+sDL_SetInitialized
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@initialized@]: the new initialization state.
+  -> IO ()
+sDL_SetInitialized = hs_bindgen_5586c698b54b7f33
diff --git a/src/SDL3/Sys/Bindgen/Pen.hs b/src/SDL3/Sys/Bindgen/Pen.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Pen.hs
@@ -0,0 +1,518 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL pen event handling.
+--
+--     SDL provides an API for pressure-sensitive pen (stylus and\/or eraser) handling, e.g., for input and drawing tablets or suitably equipped mobile \/ tablet devices.
+--
+--     To get started with pens, simply handle pen events:
+--
+--     * SDL_EVENT_PEN_PROXIMITY_IN, SDL_EVENT_PEN_PROXIMITY_OUT (SDL_PenProximityEvent)
+--
+--     * SDL_EVENT_PEN_DOWN, SDL_EVENT_PEN_UP (SDL_PenTouchEvent)
+--
+--     * SDL_EVENT_PEN_MOTION (SDL_PenMotionEvent)
+--
+--     * SDL_EVENT_PEN_BUTTON_DOWN, SDL_EVENT_PEN_BUTTON_UP (SDL_PenButtonEvent)
+--
+--     * SDL_EVENT_PEN_AXIS (SDL_PenAxisEvent)
+--
+--     Pens may provide more than simple touch input; they might have other axes, such as pressure, tilt, rotation, etc.
+--
+--     When a pen starts providing input, SDL will assign it a unique 'SDL_PenID', which will remain for the life of the process, as long as the pen stays connected. A pen leaving proximity (being taken far enough away from the digitizer tablet that it no longer reponds) and then coming back should fire proximity events, but the 'SDL_PenID' should remain consistent. Unplugging the digitizer and reconnecting may cause future input to have a new 'SDL_PenID', as SDL may not know that this is the same hardware.
+--
+--     Please note that various platforms vary wildly in how (and how well) they support pen input. If your pen supports some piece of functionality but SDL doesn\'t seem to, it might actually be the operating system\'s fault. For example, some platforms can manage multiple devices at the same time, but others will make any connected pens look like a single logical device, much how all USB mice connected to a computer will move the same system cursor. cursor. Other platforms might not support pen buttons, or the distance axis, etc. Very few platforms can even report /what/ functionality the pen supports in the first place, so best practices is to either build UI to let the user configure their pens, or be prepared to handle new functionality for a pen the first time an event is reported. SDL pen instance IDs.
+--
+--     Zero is used to signify an invalid\/null device.
+--
+--     These show up in pen events when SDL sees input from them. They remain consistent as long as SDL can recognize a tool to be the same pen; but if a pen\'s digitizer table is physically detached from the computer, it might get a new ID when reconnected, as SDL won\'t know it\'s the same device.
+--
+--     These IDs are only stable within a single run of a program; the next time a program is run, the pen\'s ID will likely be different, even if the hardware hasn\'t been disconnected, etc.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Pen (
+  SDL3.Sys.Bindgen.Pen.SDL_PenID (..),
+  SDL3.Sys.Bindgen.Pen.SDL_PenInputFlags (..),
+  SDL3.Sys.Bindgen.Pen.sDL_PEN_INPUT_DOWN,
+  SDL3.Sys.Bindgen.Pen.sDL_PEN_INPUT_BUTTON_1,
+  SDL3.Sys.Bindgen.Pen.sDL_PEN_INPUT_BUTTON_2,
+  SDL3.Sys.Bindgen.Pen.sDL_PEN_INPUT_BUTTON_3,
+  SDL3.Sys.Bindgen.Pen.sDL_PEN_INPUT_BUTTON_4,
+  SDL3.Sys.Bindgen.Pen.sDL_PEN_INPUT_BUTTON_5,
+  SDL3.Sys.Bindgen.Pen.sDL_PEN_INPUT_ERASER_TIP,
+  SDL3.Sys.Bindgen.Pen.sDL_PEN_INPUT_IN_PROXIMITY,
+  SDL3.Sys.Bindgen.Pen.SDL_PenAxis (..),
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_AXIS_PRESSURE,
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_AXIS_XTILT,
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_AXIS_YTILT,
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_AXIS_DISTANCE,
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_AXIS_ROTATION,
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_AXIS_SLIDER,
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_AXIS_TANGENTIAL_PRESSURE,
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_AXIS_COUNT,
+  SDL3.Sys.Bindgen.Pen.SDL_PenDeviceType (..),
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_DEVICE_TYPE_INVALID,
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_DEVICE_TYPE_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_DEVICE_TYPE_DIRECT,
+  pattern SDL3.Sys.Bindgen.Pen.SDL_PEN_DEVICE_TYPE_INDIRECT,
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_PenID@, defined at @SDL3\/SDL_pen.h 93:16@
+newtype SDL_PenID = SDL_PenID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_PenID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PenID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PenID "unwrap" where
+  type
+    CFieldType SDL_PenID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Pen input flags, as reported by various pen events\' @pen_state@ field.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PenInputFlags@, defined at @SDL3\/SDL_pen.h 114:16@
+newtype SDL_PenInputFlags = SDL_PenInputFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_PenInputFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenInputFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PenInputFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PenInputFlags "unwrap" where
+  type
+    CFieldType SDL_PenInputFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | pen is pressed down
+--
+--     [C declaration]: @macro SDL_PEN_INPUT_DOWN@, defined at @SDL3\/SDL_pen.h 116:9@
+sDL_PEN_INPUT_DOWN :: BG.CUInt
+sDL_PEN_INPUT_DOWN =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (0 :: BG.CInt)
+
+-- | button 1 is pressed
+--
+--     [C declaration]: @macro SDL_PEN_INPUT_BUTTON_1@, defined at @SDL3\/SDL_pen.h 117:9@
+sDL_PEN_INPUT_BUTTON_1 :: BG.CUInt
+sDL_PEN_INPUT_BUTTON_1 =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (1 :: BG.CInt)
+
+-- | button 2 is pressed
+--
+--     [C declaration]: @macro SDL_PEN_INPUT_BUTTON_2@, defined at @SDL3\/SDL_pen.h 118:9@
+sDL_PEN_INPUT_BUTTON_2 :: BG.CUInt
+sDL_PEN_INPUT_BUTTON_2 =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (2 :: BG.CInt)
+
+-- | button 3 is pressed
+--
+--     [C declaration]: @macro SDL_PEN_INPUT_BUTTON_3@, defined at @SDL3\/SDL_pen.h 119:9@
+sDL_PEN_INPUT_BUTTON_3 :: BG.CUInt
+sDL_PEN_INPUT_BUTTON_3 =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (3 :: BG.CInt)
+
+-- | button 4 is pressed
+--
+--     [C declaration]: @macro SDL_PEN_INPUT_BUTTON_4@, defined at @SDL3\/SDL_pen.h 120:9@
+sDL_PEN_INPUT_BUTTON_4 :: BG.CUInt
+sDL_PEN_INPUT_BUTTON_4 =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (4 :: BG.CInt)
+
+-- | button 5 is pressed
+--
+--     [C declaration]: @macro SDL_PEN_INPUT_BUTTON_5@, defined at @SDL3\/SDL_pen.h 121:9@
+sDL_PEN_INPUT_BUTTON_5 :: BG.CUInt
+sDL_PEN_INPUT_BUTTON_5 =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (5 :: BG.CInt)
+
+-- | eraser tip is used
+--
+--     [C declaration]: @macro SDL_PEN_INPUT_ERASER_TIP@, defined at @SDL3\/SDL_pen.h 122:9@
+sDL_PEN_INPUT_ERASER_TIP :: BG.CUInt
+sDL_PEN_INPUT_ERASER_TIP =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (30 :: BG.CInt)
+
+-- | pen is in proximity (since SDL 3.4.0)
+--
+--     [C declaration]: @macro SDL_PEN_INPUT_IN_PROXIMITY@, defined at @SDL3\/SDL_pen.h 123:9@
+sDL_PEN_INPUT_IN_PROXIMITY :: BG.CUInt
+sDL_PEN_INPUT_IN_PROXIMITY =
+  (C.Expr.HostPlatform.<<) (1 :: BG.CUInt) (31 :: BG.CInt)
+
+-- | Pen axis indices.
+--
+--     These are the valid values for the @axis@ field in SDL_PenAxisEvent. All axes are either normalised to 0..1 or report a (positive or negative) angle in degrees, with 0.0 representing the centre. Not all pens\/backends support all axes: unsupported axes are always zero.
+--
+--     To convert angles for tilt and rotation into vector representation, use SDL_sinf on the XTILT, YTILT, or ROTATION component, for example:
+--
+--     @SDL_sinf(xtilt * SDL_PI_F \/ 180.0)@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_PenAxis@, defined at @SDL3\/SDL_pen.h 140:14@
+newtype SDL_PenAxis = SDL_PenAxis
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_PenAxis where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_PenAxis where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PenAxis
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_PenAxis where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PenAxis unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_PenAxis instance BG.Storable SDL_PenAxis
+
+deriving via BG.CUInt instance BG.Prim SDL_PenAxis
+
+instance CEnum.CEnum SDL_PenAxis where
+  type CEnumZ SDL_PenAxis = BG.CUInt
+
+  toCEnum = SDL_PenAxis
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_PEN_AXIS_PRESSURE")
+        , (1, BG.singleton "SDL_PEN_AXIS_XTILT")
+        , (2, BG.singleton "SDL_PEN_AXIS_YTILT")
+        , (3, BG.singleton "SDL_PEN_AXIS_DISTANCE")
+        , (4, BG.singleton "SDL_PEN_AXIS_ROTATION")
+        , (5, BG.singleton "SDL_PEN_AXIS_SLIDER")
+        , (6, BG.singleton "SDL_PEN_AXIS_TANGENTIAL_PRESSURE")
+        , (7, BG.singleton "SDL_PEN_AXIS_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_PenAxis"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_PenAxis"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_PenAxis where
+  minDeclaredValue = SDL_PEN_AXIS_PRESSURE
+
+  maxDeclaredValue = SDL_PEN_AXIS_COUNT
+
+instance Show SDL_PenAxis where
+  showsPrec = CEnum.shows
+
+instance Read SDL_PenAxis where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_PenAxis ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenAxis{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PenAxis) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PenAxis "unwrap" where
+  type CFieldType SDL_PenAxis "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Pen pressure. Unidirectional: 0 to 1.0
+--
+--     [C declaration]: @SDL_PEN_AXIS_PRESSURE@, defined at @SDL3\/SDL_pen.h 142:5@
+pattern SDL_PEN_AXIS_PRESSURE :: SDL_PenAxis
+pattern SDL_PEN_AXIS_PRESSURE = SDL_PenAxis 0
+
+-- | Pen horizontal tilt angle. Bidirectional: -90.0 to 90.0 (left-to-right).
+--
+--     [C declaration]: @SDL_PEN_AXIS_XTILT@, defined at @SDL3\/SDL_pen.h 143:5@
+pattern SDL_PEN_AXIS_XTILT :: SDL_PenAxis
+pattern SDL_PEN_AXIS_XTILT = SDL_PenAxis 1
+
+-- | Pen vertical tilt angle. Bidirectional: -90.0 to 90.0 (top-to-down).
+--
+--     [C declaration]: @SDL_PEN_AXIS_YTILT@, defined at @SDL3\/SDL_pen.h 144:5@
+pattern SDL_PEN_AXIS_YTILT :: SDL_PenAxis
+pattern SDL_PEN_AXIS_YTILT = SDL_PenAxis 2
+
+-- | Pen distance to drawing surface. Unidirectional: 0.0 to 1.0
+--
+--     [C declaration]: @SDL_PEN_AXIS_DISTANCE@, defined at @SDL3\/SDL_pen.h 145:5@
+pattern SDL_PEN_AXIS_DISTANCE :: SDL_PenAxis
+pattern SDL_PEN_AXIS_DISTANCE = SDL_PenAxis 3
+
+-- | Pen barrel rotation. Bidirectional: -180 to 179.9 (clockwise, 0 is facing up, -180.0 is facing down).
+--
+--     [C declaration]: @SDL_PEN_AXIS_ROTATION@, defined at @SDL3\/SDL_pen.h 146:5@
+pattern SDL_PEN_AXIS_ROTATION :: SDL_PenAxis
+pattern SDL_PEN_AXIS_ROTATION = SDL_PenAxis 4
+
+-- | Pen finger wheel or slider (e.g., Airbrush Pen). Unidirectional: 0 to 1.0
+--
+--     [C declaration]: @SDL_PEN_AXIS_SLIDER@, defined at @SDL3\/SDL_pen.h 147:5@
+pattern SDL_PEN_AXIS_SLIDER :: SDL_PenAxis
+pattern SDL_PEN_AXIS_SLIDER = SDL_PenAxis 5
+
+-- | Pressure from squeezing the pen (\"barrel pressure\").
+--
+--     [C declaration]: @SDL_PEN_AXIS_TANGENTIAL_PRESSURE@, defined at @SDL3\/SDL_pen.h 148:5@
+pattern SDL_PEN_AXIS_TANGENTIAL_PRESSURE :: SDL_PenAxis
+pattern SDL_PEN_AXIS_TANGENTIAL_PRESSURE = SDL_PenAxis 6
+
+-- | Total known pen axis types in this version of SDL. This number may grow in future releases!
+--
+--     [C declaration]: @SDL_PEN_AXIS_COUNT@, defined at @SDL3\/SDL_pen.h 149:5@
+pattern SDL_PEN_AXIS_COUNT :: SDL_PenAxis
+pattern SDL_PEN_AXIS_COUNT = SDL_PenAxis 7
+
+-- | An enum that describes the type of a pen device.
+--
+--     A \"direct\" device is a pen that touches a graphic display (like an Apple Pencil on an iPad\'s screen). \"Indirect\" devices touch an external tablet surface that is connected to the machine but is not a display (like a lower-end Wacom tablet connected over USB).
+--
+--     Apps may use this information to decide if they should draw a cursor; if the pen is touching the screen directly, a cursor doesn\'t make sense and can be in the way, but becomes necessary for indirect devices to know where on the display they are interacting.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @enum SDL_PenDeviceType@, defined at @SDL3\/SDL_pen.h 167:14@
+newtype SDL_PenDeviceType = SDL_PenDeviceType
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_PenDeviceType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_PenDeviceType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PenDeviceType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_PenDeviceType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PenDeviceType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_PenDeviceType instance BG.Storable SDL_PenDeviceType
+
+deriving via BG.CInt instance BG.Prim SDL_PenDeviceType
+
+instance CEnum.CEnum SDL_PenDeviceType where
+  type CEnumZ SDL_PenDeviceType = BG.CInt
+
+  toCEnum = SDL_PenDeviceType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_PEN_DEVICE_TYPE_INVALID")
+        , (0, BG.singleton "SDL_PEN_DEVICE_TYPE_UNKNOWN")
+        , (1, BG.singleton "SDL_PEN_DEVICE_TYPE_DIRECT")
+        , (2, BG.singleton "SDL_PEN_DEVICE_TYPE_INDIRECT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_PenDeviceType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_PenDeviceType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_PenDeviceType where
+  minDeclaredValue = SDL_PEN_DEVICE_TYPE_INVALID
+
+  maxDeclaredValue = SDL_PEN_DEVICE_TYPE_INDIRECT
+
+instance Show SDL_PenDeviceType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_PenDeviceType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_PenDeviceType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PenDeviceType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PenDeviceType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PenDeviceType "unwrap" where
+  type CFieldType SDL_PenDeviceType "unwrap" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Not a valid pen device.
+--
+--     [C declaration]: @SDL_PEN_DEVICE_TYPE_INVALID@, defined at @SDL3\/SDL_pen.h 169:5@
+pattern SDL_PEN_DEVICE_TYPE_INVALID :: SDL_PenDeviceType
+pattern SDL_PEN_DEVICE_TYPE_INVALID = SDL_PenDeviceType (-1)
+
+-- | Don\'t know specifics of this pen.
+--
+--     [C declaration]: @SDL_PEN_DEVICE_TYPE_UNKNOWN@, defined at @SDL3\/SDL_pen.h 170:5@
+pattern SDL_PEN_DEVICE_TYPE_UNKNOWN :: SDL_PenDeviceType
+pattern SDL_PEN_DEVICE_TYPE_UNKNOWN = SDL_PenDeviceType 0
+
+-- | Pen touches display.
+--
+--     [C declaration]: @SDL_PEN_DEVICE_TYPE_DIRECT@, defined at @SDL3\/SDL_pen.h 171:5@
+pattern SDL_PEN_DEVICE_TYPE_DIRECT :: SDL_PenDeviceType
+pattern SDL_PEN_DEVICE_TYPE_DIRECT = SDL_PenDeviceType 1
+
+-- | Pen touches something that isn\'t the display.
+--
+--     [C declaration]: @SDL_PEN_DEVICE_TYPE_INDIRECT@, defined at @SDL3\/SDL_pen.h 172:5@
+pattern SDL_PEN_DEVICE_TYPE_INDIRECT :: SDL_PenDeviceType
+pattern SDL_PEN_DEVICE_TYPE_INDIRECT = SDL_PenDeviceType 2
diff --git a/src/SDL3/Sys/Bindgen/Pen/FunPtr.hs b/src/SDL3/Sys/Bindgen/Pen/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Pen/FunPtr.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Pen.FunPtr (
+  SDL3.Sys.Bindgen.Pen.FunPtr.sDL_GetPenDeviceType,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Pen
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_pen.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_PenDeviceType;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pen_get_SDL_GetPenDeviceType */"
+         , "__attribute__ ((const))"
+         , "SDL_PenDeviceType (*hs_bindgen_bcd57304ca37ccf0 (void)) ("
+         , "  SDL_PenID arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetPenDeviceType;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetPenDeviceType requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pen_get_SDL_GetPenDeviceType@
+foreign import ccall unsafe "hs_bindgen_bcd57304ca37ccf0"
+  hs_bindgen_bcd57304ca37ccf0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pen_get_SDL_GetPenDeviceType@
+hs_bindgen_bcd57304ca37ccf0 :: IO (BG.FunPtr (SDL_PenID -> IO SDL_PenDeviceType))
+hs_bindgen_bcd57304ca37ccf0 =
+  BG.fromFFIType hs_bindgen_bcd57304ca37ccf0_base
+
+{-# NOINLINE sDL_GetPenDeviceType #-}
+
+-- | Get the device type of the given pen.
+--
+--     Many platforms do not supply this information, so an app must always be prepared to get an SDL_PEN_DEVICE_TYPE_UNKNOWN result.
+--
+--     [@instance_id@]: the pen instance ID.
+--
+--     [Returns]: the device type of the given pen, or SDL_PEN_DEVICE_TYPE_INVALID on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetPenDeviceType@, defined at @SDL3\/SDL_pen.h 189:47@
+sDL_GetPenDeviceType :: BG.FunPtr (SDL_PenID -> IO SDL_PenDeviceType)
+sDL_GetPenDeviceType =
+  BG.unsafePerformIO hs_bindgen_bcd57304ca37ccf0
diff --git a/src/SDL3/Sys/Bindgen/Pen/Safe.hs b/src/SDL3/Sys/Bindgen/Pen/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Pen/Safe.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Pen.Safe (
+  SDL3.Sys.Bindgen.Pen.Safe.sDL_GetPenDeviceType,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Pen
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_pen.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_PenDeviceType;"
+         , "#endif"
+         , "SDL_PenDeviceType hs_bindgen_051a74548d70e8b1 ("
+         , "  SDL_PenID arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetPenDeviceType)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetPenDeviceType requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pen_Safe_SDL_GetPenDeviceType@
+foreign import ccall safe "hs_bindgen_051a74548d70e8b1"
+  hs_bindgen_051a74548d70e8b1_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pen_Safe_SDL_GetPenDeviceType@
+hs_bindgen_051a74548d70e8b1
+  :: SDL_PenID
+  -> IO SDL_PenDeviceType
+hs_bindgen_051a74548d70e8b1 =
+  BG.fromFFIType hs_bindgen_051a74548d70e8b1_base
+
+-- | Get the device type of the given pen.
+--
+--     Many platforms do not supply this information, so an app must always be prepared to get an SDL_PEN_DEVICE_TYPE_UNKNOWN result.
+--
+--     [Returns]: the device type of the given pen, or SDL_PEN_DEVICE_TYPE_INVALID on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetPenDeviceType@, defined at @SDL3\/SDL_pen.h 189:47@
+sDL_GetPenDeviceType
+  :: SDL_PenID
+  -- ^
+  --
+  --           [@instance_id@]: the pen instance ID.
+  -> IO SDL_PenDeviceType
+sDL_GetPenDeviceType = hs_bindgen_051a74548d70e8b1
diff --git a/src/SDL3/Sys/Bindgen/Pen/Unsafe.hs b/src/SDL3/Sys/Bindgen/Pen/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Pen/Unsafe.hs
@@ -0,0 +1,67 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Pen.Unsafe (
+  SDL3.Sys.Bindgen.Pen.Unsafe.sDL_GetPenDeviceType,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Pen
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_pen.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_PenDeviceType;"
+         , "#endif"
+         , "SDL_PenDeviceType hs_bindgen_c3c39a594724cad9 ("
+         , "  SDL_PenID arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetPenDeviceType)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetPenDeviceType requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pen_Unsafe_SDL_GetPenDeviceType@
+foreign import ccall unsafe "hs_bindgen_c3c39a594724cad9"
+  hs_bindgen_c3c39a594724cad9_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pen_Unsafe_SDL_GetPenDeviceType@
+hs_bindgen_c3c39a594724cad9
+  :: SDL_PenID
+  -> IO SDL_PenDeviceType
+hs_bindgen_c3c39a594724cad9 =
+  BG.fromFFIType hs_bindgen_c3c39a594724cad9_base
+
+-- | Get the device type of the given pen.
+--
+--     Many platforms do not supply this information, so an app must always be prepared to get an SDL_PEN_DEVICE_TYPE_UNKNOWN result.
+--
+--     [Returns]: the device type of the given pen, or SDL_PEN_DEVICE_TYPE_INVALID on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetPenDeviceType@, defined at @SDL3\/SDL_pen.h 189:47@
+sDL_GetPenDeviceType
+  :: SDL_PenID
+  -- ^
+  --
+  --           [@instance_id@]: the pen instance ID.
+  -> IO SDL_PenDeviceType
+sDL_GetPenDeviceType = hs_bindgen_c3c39a594724cad9
diff --git a/src/SDL3/Sys/Bindgen/Pixels.hs b/src/SDL3/Sys/Bindgen/Pixels.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Pixels.hs
@@ -0,0 +1,3981 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL offers facilities for pixel management.
+--
+--     Largely these facilities deal with pixel /format/: what does this set of bits represent?
+--
+--     If you mostly want to think of a pixel as some combination of red, green, blue, and maybe alpha intensities, this is all pretty straightforward, and in many cases, is enough information to build a perfectly fine game.
+--
+--     However, the actual definition of a pixel is more complex than that:
+--
+--     Pixels are a representation of a color in a particular color space.
+--
+--     The first characteristic of a color space is the color type. SDL understands two different color types, RGB and YCbCr, or in SDL also referred to as YUV.
+--
+--     RGB colors consist of red, green, and blue channels of color that are added together to represent the colors we see on the screen.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/RGB_color_model](https://en.wikipedia.org/wiki/RGB_color_model)
+--
+--     YCbCr colors represent colors as a Y luma brightness component and red and blue chroma color offsets. This color representation takes advantage of the fact that the human eye is more sensitive to brightness than the color in an image. The Cb and Cr components are often compressed and have lower resolution than the luma component.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/YCbCr](https://en.wikipedia.org/wiki/YCbCr)
+--
+--     When the color information in YCbCr is compressed, the Y pixels are left at full resolution and each Cr and Cb pixel represents an average of the color information in a block of Y pixels. The chroma location determines where in that block of pixels the color information is coming from.
+--
+--     The color range defines how much of the pixel to use when converting a pixel into a color on the display. When the full color range is used, the entire numeric range of the pixel bits is significant. When narrow color range is used, for historical reasons, the pixel uses only a portion of the numeric range to represent colors.
+--
+--     The color primaries and white point are a definition of the colors in the color space relative to the standard XYZ color space.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/CIE_1931_color_space](https://en.wikipedia.org/wiki/CIE_1931_color_space)
+--
+--     The transfer characteristic, or opto-electrical transfer function (OETF), is the way a color is converted from mathematically linear space into a non-linear output signals.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Rec._709\#Transfer_characteristics](https://en.wikipedia.org/wiki/Rec._709#Transfer_characteristics)
+--
+--     The matrix coefficients are used to convert between YCbCr and RGB colors. A fully opaque 8-bit alpha value.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ALPHA_TRANSPARENT'
+module SDL3.Sys.Bindgen.Pixels (
+  SDL3.Sys.Bindgen.Pixels.sDL_ALPHA_OPAQUE,
+  SDL3.Sys.Bindgen.Pixels.sDL_ALPHA_OPAQUE_FLOAT,
+  SDL3.Sys.Bindgen.Pixels.sDL_ALPHA_TRANSPARENT,
+  SDL3.Sys.Bindgen.Pixels.sDL_ALPHA_TRANSPARENT_FLOAT,
+  SDL3.Sys.Bindgen.Pixels.SDL_PixelType (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_INDEX1,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_INDEX4,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_INDEX8,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_PACKED8,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_PACKED16,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_PACKED32,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_ARRAYU8,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_ARRAYU16,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_ARRAYU32,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_ARRAYF16,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_ARRAYF32,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELTYPE_INDEX2,
+  SDL3.Sys.Bindgen.Pixels.SDL_BitmapOrder (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_BITMAPORDER_NONE,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_BITMAPORDER_4321,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_BITMAPORDER_1234,
+  SDL3.Sys.Bindgen.Pixels.SDL_PackedOrder (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDORDER_NONE,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDORDER_XRGB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDORDER_RGBX,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDORDER_ARGB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDORDER_RGBA,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDORDER_XBGR,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDORDER_BGRX,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDORDER_ABGR,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDORDER_BGRA,
+  SDL3.Sys.Bindgen.Pixels.SDL_ArrayOrder (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_ARRAYORDER_NONE,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_ARRAYORDER_RGB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_ARRAYORDER_RGBA,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_ARRAYORDER_ARGB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_ARRAYORDER_BGR,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_ARRAYORDER_BGRA,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_ARRAYORDER_ABGR,
+  SDL3.Sys.Bindgen.Pixels.SDL_PackedLayout (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDLAYOUT_NONE,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDLAYOUT_332,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDLAYOUT_4444,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDLAYOUT_1555,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDLAYOUT_5551,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDLAYOUT_565,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDLAYOUT_8888,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDLAYOUT_2101010,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PACKEDLAYOUT_1010102,
+  SDL3.Sys.Bindgen.Pixels.sDL_DEFINE_PIXELFORMAT,
+  SDL3.Sys.Bindgen.Pixels.sDL_PIXELFLAG,
+  SDL3.Sys.Bindgen.Pixels.sDL_PIXELTYPE,
+  SDL3.Sys.Bindgen.Pixels.sDL_PIXELORDER,
+  SDL3.Sys.Bindgen.Pixels.sDL_PIXELLAYOUT,
+  SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_INDEX1LSB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_INDEX1MSB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_INDEX2LSB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_INDEX2MSB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_INDEX4LSB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_INDEX4MSB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_INDEX8,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGB332,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_XRGB4444,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_XBGR4444,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_XRGB1555,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_XBGR1555,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ARGB4444,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGBA4444,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ABGR4444,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGRA4444,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ARGB1555,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGBA5551,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ABGR1555,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGRA5551,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGB565,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGR565,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGB24,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGR24,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_XRGB8888,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGBX8888,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_XBGR8888,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGRX8888,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ARGB8888,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGBA8888,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ABGR8888,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGRA8888,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_XRGB2101010,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_XBGR2101010,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ARGB2101010,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ABGR2101010,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGB48,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGR48,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGBA64,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ARGB64,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGRA64,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ABGR64,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGB48_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGR48_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGBA64_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ARGB64_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGRA64_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ABGR64_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGB96_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGR96_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGBA128_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ARGB128_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGRA128_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ABGR128_FLOAT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_YV12,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_IYUV,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_YUY2,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_UYVY,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_YVYU,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_NV12,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_NV21,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_P010,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_EXTERNAL_OES,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_MJPG,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGBA32,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ARGB32,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGRA32,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_ABGR32,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_RGBX32,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_XRGB32,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_BGRX32,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_PIXELFORMAT_XBGR32,
+  SDL3.Sys.Bindgen.Pixels.SDL_ColorType (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_TYPE_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_TYPE_RGB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_TYPE_YCBCR,
+  SDL3.Sys.Bindgen.Pixels.SDL_ColorRange (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_RANGE_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_RANGE_LIMITED,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_RANGE_FULL,
+  SDL3.Sys.Bindgen.Pixels.SDL_ColorPrimaries (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_BT709,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_UNSPECIFIED,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_BT470M,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_BT470BG,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_BT601,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_SMPTE240,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_GENERIC_FILM,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_BT2020,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_XYZ,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_SMPTE431,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_SMPTE432,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_EBU3213,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLOR_PRIMARIES_CUSTOM,
+  SDL3.Sys.Bindgen.Pixels.SDL_TransferCharacteristics (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_BT709,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_UNSPECIFIED,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_GAMMA22,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_GAMMA28,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_BT601,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_SMPTE240,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_LINEAR,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_LOG100,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_LOG100_SQRT10,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_IEC61966,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_BT1361,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_SRGB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_BT2020_10BIT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_BT2020_12BIT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_PQ,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_SMPTE428,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_HLG,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_TRANSFER_CHARACTERISTICS_CUSTOM,
+  SDL3.Sys.Bindgen.Pixels.SDL_MatrixCoefficients (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_IDENTITY,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_BT709,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_UNSPECIFIED,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_FCC,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_BT470BG,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_BT601,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_SMPTE240,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_YCGCO,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_BT2020_NCL,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_BT2020_CL,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_SMPTE2085,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_NCL,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_CL,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_ICTCP,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_MATRIX_COEFFICIENTS_CUSTOM,
+  SDL3.Sys.Bindgen.Pixels.SDL_ChromaLocation (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_CHROMA_LOCATION_NONE,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_CHROMA_LOCATION_LEFT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_CHROMA_LOCATION_CENTER,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_CHROMA_LOCATION_TOPLEFT,
+  SDL3.Sys.Bindgen.Pixels.SDL_Colorspace (..),
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_SRGB,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_SRGB_LINEAR,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_HDR10,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_JPEG,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_BT601_LIMITED,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_BT601_FULL,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_BT709_LIMITED,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_BT709_FULL,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_BT2020_LIMITED,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_BT2020_FULL,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_RGB_DEFAULT,
+  pattern SDL3.Sys.Bindgen.Pixels.SDL_COLORSPACE_YUV_DEFAULT,
+  SDL3.Sys.Bindgen.Pixels.SDL_Color (..),
+  SDL3.Sys.Bindgen.Pixels.SDL_FColor (..),
+  SDL3.Sys.Bindgen.Pixels.SDL_Palette (..),
+  SDL3.Sys.Bindgen.Pixels.SDL_PixelFormatDetails (..),
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.ConstantArray qualified as CA
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @macro SDL_ALPHA_OPAQUE@, defined at @SDL3\/SDL_pixels.h 100:9@
+sDL_ALPHA_OPAQUE :: BG.CInt
+sDL_ALPHA_OPAQUE = (255 :: BG.CInt)
+
+-- | A fully opaque floating point alpha value.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ALPHA_TRANSPARENT_FLOAT'
+--
+--     [C declaration]: @macro SDL_ALPHA_OPAQUE_FLOAT@, defined at @SDL3\/SDL_pixels.h 109:9@
+sDL_ALPHA_OPAQUE_FLOAT :: BG.CFloat
+sDL_ALPHA_OPAQUE_FLOAT = (1.0 :: BG.CFloat)
+
+-- | A fully transparent 8-bit alpha value.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ALPHA_OPAQUE'
+--
+--     [C declaration]: @macro SDL_ALPHA_TRANSPARENT@, defined at @SDL3\/SDL_pixels.h 118:9@
+sDL_ALPHA_TRANSPARENT :: BG.CInt
+sDL_ALPHA_TRANSPARENT = (0 :: BG.CInt)
+
+-- | A fully transparent floating point alpha value.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ALPHA_OPAQUE_FLOAT'
+--
+--     [C declaration]: @macro SDL_ALPHA_TRANSPARENT_FLOAT@, defined at @SDL3\/SDL_pixels.h 127:9@
+sDL_ALPHA_TRANSPARENT_FLOAT :: BG.CFloat
+sDL_ALPHA_TRANSPARENT_FLOAT = (0.0 :: BG.CFloat)
+
+-- | Pixel type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_PixelType@, defined at @SDL3\/SDL_pixels.h 134:14@
+newtype SDL_PixelType = SDL_PixelType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_PixelType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_PixelType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PixelType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_PixelType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PixelType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_PixelType instance BG.Storable SDL_PixelType
+
+deriving via BG.CUInt instance BG.Prim SDL_PixelType
+
+instance CEnum.CEnum SDL_PixelType where
+  type CEnumZ SDL_PixelType = BG.CUInt
+
+  toCEnum = SDL_PixelType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_PIXELTYPE_UNKNOWN")
+        , (1, BG.singleton "SDL_PIXELTYPE_INDEX1")
+        , (2, BG.singleton "SDL_PIXELTYPE_INDEX4")
+        , (3, BG.singleton "SDL_PIXELTYPE_INDEX8")
+        , (4, BG.singleton "SDL_PIXELTYPE_PACKED8")
+        , (5, BG.singleton "SDL_PIXELTYPE_PACKED16")
+        , (6, BG.singleton "SDL_PIXELTYPE_PACKED32")
+        , (7, BG.singleton "SDL_PIXELTYPE_ARRAYU8")
+        , (8, BG.singleton "SDL_PIXELTYPE_ARRAYU16")
+        , (9, BG.singleton "SDL_PIXELTYPE_ARRAYU32")
+        , (10, BG.singleton "SDL_PIXELTYPE_ARRAYF16")
+        , (11, BG.singleton "SDL_PIXELTYPE_ARRAYF32")
+        , (12, BG.singleton "SDL_PIXELTYPE_INDEX2")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_PixelType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_PixelType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_PixelType where
+  minDeclaredValue = SDL_PIXELTYPE_UNKNOWN
+
+  maxDeclaredValue = SDL_PIXELTYPE_INDEX2
+
+instance Show SDL_PixelType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_PixelType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_PixelType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PixelType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PixelType "unwrap" where
+  type CFieldType SDL_PixelType "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_PIXELTYPE_UNKNOWN@, defined at @SDL3\/SDL_pixels.h 136:5@
+pattern SDL_PIXELTYPE_UNKNOWN :: SDL_PixelType
+pattern SDL_PIXELTYPE_UNKNOWN = SDL_PixelType 0
+
+-- | [C declaration]: @SDL_PIXELTYPE_INDEX1@, defined at @SDL3\/SDL_pixels.h 137:5@
+pattern SDL_PIXELTYPE_INDEX1 :: SDL_PixelType
+pattern SDL_PIXELTYPE_INDEX1 = SDL_PixelType 1
+
+-- | [C declaration]: @SDL_PIXELTYPE_INDEX4@, defined at @SDL3\/SDL_pixels.h 138:5@
+pattern SDL_PIXELTYPE_INDEX4 :: SDL_PixelType
+pattern SDL_PIXELTYPE_INDEX4 = SDL_PixelType 2
+
+-- | [C declaration]: @SDL_PIXELTYPE_INDEX8@, defined at @SDL3\/SDL_pixels.h 139:5@
+pattern SDL_PIXELTYPE_INDEX8 :: SDL_PixelType
+pattern SDL_PIXELTYPE_INDEX8 = SDL_PixelType 3
+
+-- | [C declaration]: @SDL_PIXELTYPE_PACKED8@, defined at @SDL3\/SDL_pixels.h 140:5@
+pattern SDL_PIXELTYPE_PACKED8 :: SDL_PixelType
+pattern SDL_PIXELTYPE_PACKED8 = SDL_PixelType 4
+
+-- | [C declaration]: @SDL_PIXELTYPE_PACKED16@, defined at @SDL3\/SDL_pixels.h 141:5@
+pattern SDL_PIXELTYPE_PACKED16 :: SDL_PixelType
+pattern SDL_PIXELTYPE_PACKED16 = SDL_PixelType 5
+
+-- | [C declaration]: @SDL_PIXELTYPE_PACKED32@, defined at @SDL3\/SDL_pixels.h 142:5@
+pattern SDL_PIXELTYPE_PACKED32 :: SDL_PixelType
+pattern SDL_PIXELTYPE_PACKED32 = SDL_PixelType 6
+
+-- | [C declaration]: @SDL_PIXELTYPE_ARRAYU8@, defined at @SDL3\/SDL_pixels.h 143:5@
+pattern SDL_PIXELTYPE_ARRAYU8 :: SDL_PixelType
+pattern SDL_PIXELTYPE_ARRAYU8 = SDL_PixelType 7
+
+-- | [C declaration]: @SDL_PIXELTYPE_ARRAYU16@, defined at @SDL3\/SDL_pixels.h 144:5@
+pattern SDL_PIXELTYPE_ARRAYU16 :: SDL_PixelType
+pattern SDL_PIXELTYPE_ARRAYU16 = SDL_PixelType 8
+
+-- | [C declaration]: @SDL_PIXELTYPE_ARRAYU32@, defined at @SDL3\/SDL_pixels.h 145:5@
+pattern SDL_PIXELTYPE_ARRAYU32 :: SDL_PixelType
+pattern SDL_PIXELTYPE_ARRAYU32 = SDL_PixelType 9
+
+-- | [C declaration]: @SDL_PIXELTYPE_ARRAYF16@, defined at @SDL3\/SDL_pixels.h 146:5@
+pattern SDL_PIXELTYPE_ARRAYF16 :: SDL_PixelType
+pattern SDL_PIXELTYPE_ARRAYF16 = SDL_PixelType 10
+
+-- | [C declaration]: @SDL_PIXELTYPE_ARRAYF32@, defined at @SDL3\/SDL_pixels.h 147:5@
+pattern SDL_PIXELTYPE_ARRAYF32 :: SDL_PixelType
+pattern SDL_PIXELTYPE_ARRAYF32 = SDL_PixelType 11
+
+-- | [C declaration]: @SDL_PIXELTYPE_INDEX2@, defined at @SDL3\/SDL_pixels.h 149:5@
+pattern SDL_PIXELTYPE_INDEX2 :: SDL_PixelType
+pattern SDL_PIXELTYPE_INDEX2 = SDL_PixelType 12
+
+-- | Bitmap pixel order, high bit -> low bit.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_BitmapOrder@, defined at @SDL3\/SDL_pixels.h 157:14@
+newtype SDL_BitmapOrder = SDL_BitmapOrder
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_BitmapOrder where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_BitmapOrder where
+  readRaw =
+    \ptr0 ->
+      pure SDL_BitmapOrder
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_BitmapOrder where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_BitmapOrder unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_BitmapOrder instance BG.Storable SDL_BitmapOrder
+
+deriving via BG.CUInt instance BG.Prim SDL_BitmapOrder
+
+instance CEnum.CEnum SDL_BitmapOrder where
+  type CEnumZ SDL_BitmapOrder = BG.CUInt
+
+  toCEnum = SDL_BitmapOrder
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_BITMAPORDER_NONE")
+        , (1, BG.singleton "SDL_BITMAPORDER_4321")
+        , (2, BG.singleton "SDL_BITMAPORDER_1234")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_BitmapOrder"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_BitmapOrder"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_BitmapOrder where
+  minDeclaredValue = SDL_BITMAPORDER_NONE
+
+  maxDeclaredValue = SDL_BITMAPORDER_1234
+
+instance Show SDL_BitmapOrder where
+  showsPrec = CEnum.shows
+
+instance Read SDL_BitmapOrder where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_BitmapOrder ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_BitmapOrder{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_BitmapOrder) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_BitmapOrder "unwrap" where
+  type CFieldType SDL_BitmapOrder "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_BITMAPORDER_NONE@, defined at @SDL3\/SDL_pixels.h 159:5@
+pattern SDL_BITMAPORDER_NONE :: SDL_BitmapOrder
+pattern SDL_BITMAPORDER_NONE = SDL_BitmapOrder 0
+
+-- | [C declaration]: @SDL_BITMAPORDER_4321@, defined at @SDL3\/SDL_pixels.h 160:5@
+pattern SDL_BITMAPORDER_4321 :: SDL_BitmapOrder
+pattern SDL_BITMAPORDER_4321 = SDL_BitmapOrder 1
+
+-- | [C declaration]: @SDL_BITMAPORDER_1234@, defined at @SDL3\/SDL_pixels.h 161:5@
+pattern SDL_BITMAPORDER_1234 :: SDL_BitmapOrder
+pattern SDL_BITMAPORDER_1234 = SDL_BitmapOrder 2
+
+-- | Packed component order, high bit -> low bit.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_PackedOrder@, defined at @SDL3\/SDL_pixels.h 169:14@
+newtype SDL_PackedOrder = SDL_PackedOrder
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_PackedOrder where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_PackedOrder where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PackedOrder
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_PackedOrder where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PackedOrder unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_PackedOrder instance BG.Storable SDL_PackedOrder
+
+deriving via BG.CUInt instance BG.Prim SDL_PackedOrder
+
+instance CEnum.CEnum SDL_PackedOrder where
+  type CEnumZ SDL_PackedOrder = BG.CUInt
+
+  toCEnum = SDL_PackedOrder
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_PACKEDORDER_NONE")
+        , (1, BG.singleton "SDL_PACKEDORDER_XRGB")
+        , (2, BG.singleton "SDL_PACKEDORDER_RGBX")
+        , (3, BG.singleton "SDL_PACKEDORDER_ARGB")
+        , (4, BG.singleton "SDL_PACKEDORDER_RGBA")
+        , (5, BG.singleton "SDL_PACKEDORDER_XBGR")
+        , (6, BG.singleton "SDL_PACKEDORDER_BGRX")
+        , (7, BG.singleton "SDL_PACKEDORDER_ABGR")
+        , (8, BG.singleton "SDL_PACKEDORDER_BGRA")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_PackedOrder"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_PackedOrder"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_PackedOrder where
+  minDeclaredValue = SDL_PACKEDORDER_NONE
+
+  maxDeclaredValue = SDL_PACKEDORDER_BGRA
+
+instance Show SDL_PackedOrder where
+  showsPrec = CEnum.shows
+
+instance Read SDL_PackedOrder where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_PackedOrder ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PackedOrder{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PackedOrder) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PackedOrder "unwrap" where
+  type CFieldType SDL_PackedOrder "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_PACKEDORDER_NONE@, defined at @SDL3\/SDL_pixels.h 171:5@
+pattern SDL_PACKEDORDER_NONE :: SDL_PackedOrder
+pattern SDL_PACKEDORDER_NONE = SDL_PackedOrder 0
+
+-- | [C declaration]: @SDL_PACKEDORDER_XRGB@, defined at @SDL3\/SDL_pixels.h 172:5@
+pattern SDL_PACKEDORDER_XRGB :: SDL_PackedOrder
+pattern SDL_PACKEDORDER_XRGB = SDL_PackedOrder 1
+
+-- | [C declaration]: @SDL_PACKEDORDER_RGBX@, defined at @SDL3\/SDL_pixels.h 173:5@
+pattern SDL_PACKEDORDER_RGBX :: SDL_PackedOrder
+pattern SDL_PACKEDORDER_RGBX = SDL_PackedOrder 2
+
+-- | [C declaration]: @SDL_PACKEDORDER_ARGB@, defined at @SDL3\/SDL_pixels.h 174:5@
+pattern SDL_PACKEDORDER_ARGB :: SDL_PackedOrder
+pattern SDL_PACKEDORDER_ARGB = SDL_PackedOrder 3
+
+-- | [C declaration]: @SDL_PACKEDORDER_RGBA@, defined at @SDL3\/SDL_pixels.h 175:5@
+pattern SDL_PACKEDORDER_RGBA :: SDL_PackedOrder
+pattern SDL_PACKEDORDER_RGBA = SDL_PackedOrder 4
+
+-- | [C declaration]: @SDL_PACKEDORDER_XBGR@, defined at @SDL3\/SDL_pixels.h 176:5@
+pattern SDL_PACKEDORDER_XBGR :: SDL_PackedOrder
+pattern SDL_PACKEDORDER_XBGR = SDL_PackedOrder 5
+
+-- | [C declaration]: @SDL_PACKEDORDER_BGRX@, defined at @SDL3\/SDL_pixels.h 177:5@
+pattern SDL_PACKEDORDER_BGRX :: SDL_PackedOrder
+pattern SDL_PACKEDORDER_BGRX = SDL_PackedOrder 6
+
+-- | [C declaration]: @SDL_PACKEDORDER_ABGR@, defined at @SDL3\/SDL_pixels.h 178:5@
+pattern SDL_PACKEDORDER_ABGR :: SDL_PackedOrder
+pattern SDL_PACKEDORDER_ABGR = SDL_PackedOrder 7
+
+-- | [C declaration]: @SDL_PACKEDORDER_BGRA@, defined at @SDL3\/SDL_pixels.h 179:5@
+pattern SDL_PACKEDORDER_BGRA :: SDL_PackedOrder
+pattern SDL_PACKEDORDER_BGRA = SDL_PackedOrder 8
+
+-- | Array component order, low byte -> high byte.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_ArrayOrder@, defined at @SDL3\/SDL_pixels.h 187:14@
+newtype SDL_ArrayOrder = SDL_ArrayOrder
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_ArrayOrder where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_ArrayOrder where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ArrayOrder
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_ArrayOrder where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ArrayOrder unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_ArrayOrder instance BG.Storable SDL_ArrayOrder
+
+deriving via BG.CUInt instance BG.Prim SDL_ArrayOrder
+
+instance CEnum.CEnum SDL_ArrayOrder where
+  type CEnumZ SDL_ArrayOrder = BG.CUInt
+
+  toCEnum = SDL_ArrayOrder
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_ARRAYORDER_NONE")
+        , (1, BG.singleton "SDL_ARRAYORDER_RGB")
+        , (2, BG.singleton "SDL_ARRAYORDER_RGBA")
+        , (3, BG.singleton "SDL_ARRAYORDER_ARGB")
+        , (4, BG.singleton "SDL_ARRAYORDER_BGR")
+        , (5, BG.singleton "SDL_ARRAYORDER_BGRA")
+        , (6, BG.singleton "SDL_ARRAYORDER_ABGR")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_ArrayOrder"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_ArrayOrder"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_ArrayOrder where
+  minDeclaredValue = SDL_ARRAYORDER_NONE
+
+  maxDeclaredValue = SDL_ARRAYORDER_ABGR
+
+instance Show SDL_ArrayOrder where
+  showsPrec = CEnum.shows
+
+instance Read SDL_ArrayOrder where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_ArrayOrder ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ArrayOrder{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ArrayOrder) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ArrayOrder "unwrap" where
+  type CFieldType SDL_ArrayOrder "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_ARRAYORDER_NONE@, defined at @SDL3\/SDL_pixels.h 189:5@
+pattern SDL_ARRAYORDER_NONE :: SDL_ArrayOrder
+pattern SDL_ARRAYORDER_NONE = SDL_ArrayOrder 0
+
+-- | [C declaration]: @SDL_ARRAYORDER_RGB@, defined at @SDL3\/SDL_pixels.h 190:5@
+pattern SDL_ARRAYORDER_RGB :: SDL_ArrayOrder
+pattern SDL_ARRAYORDER_RGB = SDL_ArrayOrder 1
+
+-- | [C declaration]: @SDL_ARRAYORDER_RGBA@, defined at @SDL3\/SDL_pixels.h 191:5@
+pattern SDL_ARRAYORDER_RGBA :: SDL_ArrayOrder
+pattern SDL_ARRAYORDER_RGBA = SDL_ArrayOrder 2
+
+-- | [C declaration]: @SDL_ARRAYORDER_ARGB@, defined at @SDL3\/SDL_pixels.h 192:5@
+pattern SDL_ARRAYORDER_ARGB :: SDL_ArrayOrder
+pattern SDL_ARRAYORDER_ARGB = SDL_ArrayOrder 3
+
+-- | [C declaration]: @SDL_ARRAYORDER_BGR@, defined at @SDL3\/SDL_pixels.h 193:5@
+pattern SDL_ARRAYORDER_BGR :: SDL_ArrayOrder
+pattern SDL_ARRAYORDER_BGR = SDL_ArrayOrder 4
+
+-- | [C declaration]: @SDL_ARRAYORDER_BGRA@, defined at @SDL3\/SDL_pixels.h 194:5@
+pattern SDL_ARRAYORDER_BGRA :: SDL_ArrayOrder
+pattern SDL_ARRAYORDER_BGRA = SDL_ArrayOrder 5
+
+-- | [C declaration]: @SDL_ARRAYORDER_ABGR@, defined at @SDL3\/SDL_pixels.h 195:5@
+pattern SDL_ARRAYORDER_ABGR :: SDL_ArrayOrder
+pattern SDL_ARRAYORDER_ABGR = SDL_ArrayOrder 6
+
+-- | Packed component layout.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_PackedLayout@, defined at @SDL3\/SDL_pixels.h 203:14@
+newtype SDL_PackedLayout = SDL_PackedLayout
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_PackedLayout where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_PackedLayout where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PackedLayout
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_PackedLayout where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PackedLayout unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_PackedLayout instance BG.Storable SDL_PackedLayout
+
+deriving via BG.CUInt instance BG.Prim SDL_PackedLayout
+
+instance CEnum.CEnum SDL_PackedLayout where
+  type CEnumZ SDL_PackedLayout = BG.CUInt
+
+  toCEnum = SDL_PackedLayout
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_PACKEDLAYOUT_NONE")
+        , (1, BG.singleton "SDL_PACKEDLAYOUT_332")
+        , (2, BG.singleton "SDL_PACKEDLAYOUT_4444")
+        , (3, BG.singleton "SDL_PACKEDLAYOUT_1555")
+        , (4, BG.singleton "SDL_PACKEDLAYOUT_5551")
+        , (5, BG.singleton "SDL_PACKEDLAYOUT_565")
+        , (6, BG.singleton "SDL_PACKEDLAYOUT_8888")
+        , (7, BG.singleton "SDL_PACKEDLAYOUT_2101010")
+        , (8, BG.singleton "SDL_PACKEDLAYOUT_1010102")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_PackedLayout"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_PackedLayout"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_PackedLayout where
+  minDeclaredValue = SDL_PACKEDLAYOUT_NONE
+
+  maxDeclaredValue = SDL_PACKEDLAYOUT_1010102
+
+instance Show SDL_PackedLayout where
+  showsPrec = CEnum.shows
+
+instance Read SDL_PackedLayout where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_PackedLayout ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PackedLayout{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PackedLayout) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PackedLayout "unwrap" where
+  type CFieldType SDL_PackedLayout "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_PACKEDLAYOUT_NONE@, defined at @SDL3\/SDL_pixels.h 205:5@
+pattern SDL_PACKEDLAYOUT_NONE :: SDL_PackedLayout
+pattern SDL_PACKEDLAYOUT_NONE = SDL_PackedLayout 0
+
+-- | [C declaration]: @SDL_PACKEDLAYOUT_332@, defined at @SDL3\/SDL_pixels.h 206:5@
+pattern SDL_PACKEDLAYOUT_332 :: SDL_PackedLayout
+pattern SDL_PACKEDLAYOUT_332 = SDL_PackedLayout 1
+
+-- | [C declaration]: @SDL_PACKEDLAYOUT_4444@, defined at @SDL3\/SDL_pixels.h 207:5@
+pattern SDL_PACKEDLAYOUT_4444 :: SDL_PackedLayout
+pattern SDL_PACKEDLAYOUT_4444 = SDL_PackedLayout 2
+
+-- | [C declaration]: @SDL_PACKEDLAYOUT_1555@, defined at @SDL3\/SDL_pixels.h 208:5@
+pattern SDL_PACKEDLAYOUT_1555 :: SDL_PackedLayout
+pattern SDL_PACKEDLAYOUT_1555 = SDL_PackedLayout 3
+
+-- | [C declaration]: @SDL_PACKEDLAYOUT_5551@, defined at @SDL3\/SDL_pixels.h 209:5@
+pattern SDL_PACKEDLAYOUT_5551 :: SDL_PackedLayout
+pattern SDL_PACKEDLAYOUT_5551 = SDL_PackedLayout 4
+
+-- | [C declaration]: @SDL_PACKEDLAYOUT_565@, defined at @SDL3\/SDL_pixels.h 210:5@
+pattern SDL_PACKEDLAYOUT_565 :: SDL_PackedLayout
+pattern SDL_PACKEDLAYOUT_565 = SDL_PackedLayout 5
+
+-- | [C declaration]: @SDL_PACKEDLAYOUT_8888@, defined at @SDL3\/SDL_pixels.h 211:5@
+pattern SDL_PACKEDLAYOUT_8888 :: SDL_PackedLayout
+pattern SDL_PACKEDLAYOUT_8888 = SDL_PackedLayout 6
+
+-- | [C declaration]: @SDL_PACKEDLAYOUT_2101010@, defined at @SDL3\/SDL_pixels.h 212:5@
+pattern SDL_PACKEDLAYOUT_2101010 :: SDL_PackedLayout
+pattern SDL_PACKEDLAYOUT_2101010 = SDL_PackedLayout 7
+
+-- | [C declaration]: @SDL_PACKEDLAYOUT_1010102@, defined at @SDL3\/SDL_pixels.h 213:5@
+pattern SDL_PACKEDLAYOUT_1010102 :: SDL_PackedLayout
+pattern SDL_PACKEDLAYOUT_1010102 = SDL_PackedLayout 8
+
+-- | A macro for defining custom non-FourCC pixel formats.
+--
+--     For example, defining SDL_PIXELFORMAT_RGBA8888 looks like this:
+--
+--     @
+--     SDL_DEFINE_PIXELFORMAT(SDL_PIXELTYPE_PACKED32, SDL_PACKEDORDER_RGBA, SDL_PACKEDLAYOUT_8888, 32, 4)
+--     @
+--
+--     [@type@]: the type of the new format, probably a 'SDL_PixelType' value.
+--
+--     [@order@]: the order of the new format, probably a 'SDL_BitmapOrder', 'SDL_PackedOrder', or 'SDL_ArrayOrder' value.
+--
+--     [@layout@]: the layout of the new format, probably an 'SDL_PackedLayout' value or zero.
+--
+--     [@bits@]: the number of bits per pixel of the new format.
+--
+--     [@bytes@]: the number of bytes per pixel of the new format.
+--
+--     [Returns]: a format value in the style of 'SDL_PixelFormat'.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_DEFINE_PIXELFORMAT@, defined at @SDL3\/SDL_pixels.h 259:9@
+sDL_DEFINE_PIXELFORMAT
+  :: forall a10 a21 a32 a43 a54
+   . ( C.Expr.HostPlatform.Bitwise
+         (C.Expr.HostPlatform.BitsRes BG.CInt (C.Expr.HostPlatform.ShiftRes a10))
+         (C.Expr.HostPlatform.ShiftRes a21)
+     )
+  => ( C.Expr.HostPlatform.Bitwise
+         ( C.Expr.HostPlatform.BitsRes
+             (C.Expr.HostPlatform.BitsRes BG.CInt (C.Expr.HostPlatform.ShiftRes a10))
+             (C.Expr.HostPlatform.ShiftRes a21)
+         )
+         (C.Expr.HostPlatform.ShiftRes a32)
+     )
+  => ( C.Expr.HostPlatform.Bitwise
+         ( C.Expr.HostPlatform.BitsRes
+             ( C.Expr.HostPlatform.BitsRes
+                 (C.Expr.HostPlatform.BitsRes BG.CInt (C.Expr.HostPlatform.ShiftRes a10))
+                 (C.Expr.HostPlatform.ShiftRes a21)
+             )
+             (C.Expr.HostPlatform.ShiftRes a32)
+         )
+         (C.Expr.HostPlatform.ShiftRes a43)
+     )
+  => ( C.Expr.HostPlatform.Bitwise
+         ( C.Expr.HostPlatform.BitsRes
+             ( C.Expr.HostPlatform.BitsRes
+                 ( C.Expr.HostPlatform.BitsRes
+                     (C.Expr.HostPlatform.BitsRes BG.CInt (C.Expr.HostPlatform.ShiftRes a10))
+                     (C.Expr.HostPlatform.ShiftRes a21)
+                 )
+                 (C.Expr.HostPlatform.ShiftRes a32)
+             )
+             (C.Expr.HostPlatform.ShiftRes a43)
+         )
+         (C.Expr.HostPlatform.ShiftRes a54)
+     )
+  => (C.Expr.HostPlatform.Bitwise BG.CInt (C.Expr.HostPlatform.ShiftRes a10))
+  => (C.Expr.HostPlatform.Shift a54 BG.CInt)
+  => (C.Expr.HostPlatform.Shift a43 BG.CInt)
+  => (C.Expr.HostPlatform.Shift a32 BG.CInt)
+  => (C.Expr.HostPlatform.Shift a21 BG.CInt)
+  => (C.Expr.HostPlatform.Shift a10 BG.CInt)
+  => a10
+  -> a21
+  -> a32
+  -> a43
+  -> a54
+  -> C.Expr.HostPlatform.BitsRes
+       ( C.Expr.HostPlatform.BitsRes
+           ( C.Expr.HostPlatform.BitsRes
+               ( C.Expr.HostPlatform.BitsRes
+                   (C.Expr.HostPlatform.BitsRes BG.CInt (C.Expr.HostPlatform.ShiftRes a10))
+                   (C.Expr.HostPlatform.ShiftRes a21)
+               )
+               (C.Expr.HostPlatform.ShiftRes a32)
+           )
+           (C.Expr.HostPlatform.ShiftRes a43)
+       )
+       (C.Expr.HostPlatform.ShiftRes a54)
+sDL_DEFINE_PIXELFORMAT =
+  \type'0 ->
+    \order1 ->
+      \layout2 ->
+        \bits3 ->
+          \bytes4 ->
+            (C.Expr.HostPlatform..|.)
+              ( (C.Expr.HostPlatform..|.)
+                  ( (C.Expr.HostPlatform..|.)
+                      ( (C.Expr.HostPlatform..|.)
+                          ( (C.Expr.HostPlatform..|.)
+                              ((C.Expr.HostPlatform.<<) (1 :: BG.CInt) (28 :: BG.CInt))
+                              ((C.Expr.HostPlatform.<<) type'0 (24 :: BG.CInt))
+                          )
+                          ((C.Expr.HostPlatform.<<) order1 (20 :: BG.CInt))
+                      )
+                      ((C.Expr.HostPlatform.<<) layout2 (16 :: BG.CInt))
+                  )
+                  ((C.Expr.HostPlatform.<<) bits3 (8 :: BG.CInt))
+              )
+              ((C.Expr.HostPlatform.<<) bytes4 (0 :: BG.CInt))
+
+-- | A macro to retrieve the flags of an 'SDL_PixelFormat'.
+--
+--     This macro is generally not needed directly by an app, which should use specific tests, like SDL_ISPIXELFORMAT_FOURCC, instead.
+--
+--     [@format@]: an 'SDL_PixelFormat' to check.
+--
+--     [Returns]: the flags of @format@.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_PIXELFLAG@, defined at @SDL3\/SDL_pixels.h 276:9@
+sDL_PIXELFLAG
+  :: forall a0
+   . (C.Expr.HostPlatform.Bitwise (C.Expr.HostPlatform.ShiftRes a0) BG.CInt)
+  => (C.Expr.HostPlatform.Shift a0 BG.CInt)
+  => a0 -> C.Expr.HostPlatform.BitsRes (C.Expr.HostPlatform.ShiftRes a0) BG.CInt
+sDL_PIXELFLAG =
+  \format0 ->
+    (C.Expr.HostPlatform..&.) ((C.Expr.HostPlatform.>>) format0 (28 :: BG.CInt)) (15 :: BG.CInt)
+
+-- | A macro to retrieve the type of an 'SDL_PixelFormat'.
+--
+--     This is usually a value from the 'SDL_PixelType' enumeration.
+--
+--     [@format@]: an 'SDL_PixelFormat' to check.
+--
+--     [Returns]: the type of @format@.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_PIXELTYPE@, defined at @SDL3\/SDL_pixels.h 290:9@
+sDL_PIXELTYPE
+  :: forall a0
+   . (C.Expr.HostPlatform.Bitwise (C.Expr.HostPlatform.ShiftRes a0) BG.CInt)
+  => (C.Expr.HostPlatform.Shift a0 BG.CInt)
+  => a0 -> C.Expr.HostPlatform.BitsRes (C.Expr.HostPlatform.ShiftRes a0) BG.CInt
+sDL_PIXELTYPE =
+  \format0 ->
+    (C.Expr.HostPlatform..&.) ((C.Expr.HostPlatform.>>) format0 (24 :: BG.CInt)) (15 :: BG.CInt)
+
+-- | A macro to retrieve the order of an 'SDL_PixelFormat'.
+--
+--     This is usually a value from the 'SDL_BitmapOrder', 'SDL_PackedOrder', or 'SDL_ArrayOrder' enumerations, depending on the format type.
+--
+--     [@format@]: an 'SDL_PixelFormat' to check.
+--
+--     [Returns]: the order of @format@.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_PIXELORDER@, defined at @SDL3\/SDL_pixels.h 305:9@
+sDL_PIXELORDER
+  :: forall a0
+   . (C.Expr.HostPlatform.Bitwise (C.Expr.HostPlatform.ShiftRes a0) BG.CInt)
+  => (C.Expr.HostPlatform.Shift a0 BG.CInt)
+  => a0 -> C.Expr.HostPlatform.BitsRes (C.Expr.HostPlatform.ShiftRes a0) BG.CInt
+sDL_PIXELORDER =
+  \format0 ->
+    (C.Expr.HostPlatform..&.) ((C.Expr.HostPlatform.>>) format0 (20 :: BG.CInt)) (15 :: BG.CInt)
+
+-- | A macro to retrieve the layout of an 'SDL_PixelFormat'.
+--
+--     This is usually a value from the 'SDL_PackedLayout' enumeration, or zero if a layout doesn\'t make sense for the format type.
+--
+--     [@format@]: an 'SDL_PixelFormat' to check.
+--
+--     [Returns]: the layout of @format@.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_PIXELLAYOUT@, defined at @SDL3\/SDL_pixels.h 320:9@
+sDL_PIXELLAYOUT
+  :: forall a0
+   . (C.Expr.HostPlatform.Bitwise (C.Expr.HostPlatform.ShiftRes a0) BG.CInt)
+  => (C.Expr.HostPlatform.Shift a0 BG.CInt)
+  => a0 -> C.Expr.HostPlatform.BitsRes (C.Expr.HostPlatform.ShiftRes a0) BG.CInt
+sDL_PIXELLAYOUT =
+  \format0 ->
+    (C.Expr.HostPlatform..&.) ((C.Expr.HostPlatform.>>) format0 (16 :: BG.CInt)) (15 :: BG.CInt)
+
+-- | Pixel format.
+--
+--     SDL\'s pixel formats have the following naming convention:
+--
+--     * Names with a list of components and a single bit count, such as RGB24 and ABGR32, define a platform-independent encoding into bytes in the order specified. For example, in RGB24 data, each pixel is encoded in 3 bytes (red, green, blue) in that order, and in ABGR32 data, each pixel is encoded in 4 bytes (alpha, blue, green, red) in that order. Use these names if the property of a format that is important to you is the order of the bytes in memory or on disk.
+--
+--     * Names with a bit count per component, such as ARGB8888 and XRGB1555, are \"packed\" into an appropriately-sized integer in the platform\'s native endianness. For example, ARGB8888 is a sequence of 32-bit integers; in each integer, the most significant bits are alpha, and the least significant bits are blue. On a little-endian CPU such as x86, the least significant bits of each integer are arranged first in memory, but on a big-endian CPU such as s390x, the most significant bits are arranged first. Use these names if the property of a format that is important to you is the meaning of each bit position within a native-endianness integer.
+--
+--     * In indexed formats such as INDEX4LSB, each pixel is represented by encoding an index into the palette into the indicated number of bits, with multiple pixels packed into each byte if appropriate. In LSB formats, the first (leftmost) pixel is stored in the least-significant bits of the byte; in MSB formats, it\'s stored in the most-significant bits. INDEX8 does not need LSB\/MSB variants, because each pixel exactly fills one byte.
+--
+--     The 32-bit byte-array encodings such as RGBA32 are aliases for the appropriate 8888 encoding for the current platform. For example, RGBA32 is an alias for ABGR8888 on little-endian CPUs like x86, or an alias for RGBA8888 on big-endian CPUs.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_PixelFormat@, defined at @SDL3\/SDL_pixels.h 548:14@
+newtype SDL_PixelFormat = SDL_PixelFormat
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_PixelFormat where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_PixelFormat where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PixelFormat
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_PixelFormat where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PixelFormat unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_PixelFormat instance BG.Storable SDL_PixelFormat
+
+deriving via BG.CUInt instance BG.Prim SDL_PixelFormat
+
+instance CEnum.CEnum SDL_PixelFormat where
+  type CEnumZ SDL_PixelFormat = BG.CUInt
+
+  toCEnum = SDL_PixelFormat
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_PIXELFORMAT_UNKNOWN")
+        , (286261504, BG.singleton "SDL_PIXELFORMAT_INDEX1LSB")
+        , (287310080, BG.singleton "SDL_PIXELFORMAT_INDEX1MSB")
+        , (303039488, BG.singleton "SDL_PIXELFORMAT_INDEX4LSB")
+        , (304088064, BG.singleton "SDL_PIXELFORMAT_INDEX4MSB")
+        , (318769153, BG.singleton "SDL_PIXELFORMAT_INDEX8")
+        , (336660481, BG.singleton "SDL_PIXELFORMAT_RGB332")
+        , (353504258, BG.singleton "SDL_PIXELFORMAT_XRGB4444")
+        , (353570562, BG.singleton "SDL_PIXELFORMAT_XRGB1555")
+        , (353701890, BG.singleton "SDL_PIXELFORMAT_RGB565")
+        , (355602434, BG.singleton "SDL_PIXELFORMAT_ARGB4444")
+        , (355667970, BG.singleton "SDL_PIXELFORMAT_ARGB1555")
+        , (356651010, BG.singleton "SDL_PIXELFORMAT_RGBA4444")
+        , (356782082, BG.singleton "SDL_PIXELFORMAT_RGBA5551")
+        , (357698562, BG.singleton "SDL_PIXELFORMAT_XBGR4444")
+        , (357764866, BG.singleton "SDL_PIXELFORMAT_XBGR1555")
+        , (357896194, BG.singleton "SDL_PIXELFORMAT_BGR565")
+        , (359796738, BG.singleton "SDL_PIXELFORMAT_ABGR4444")
+        , (359862274, BG.singleton "SDL_PIXELFORMAT_ABGR1555")
+        , (360845314, BG.singleton "SDL_PIXELFORMAT_BGRA4444")
+        , (360976386, BG.singleton "SDL_PIXELFORMAT_BGRA5551")
+        , (370546692, ("SDL_PIXELFORMAT_XRGB8888" BG.:| ["SDL_PIXELFORMAT_BGRX32"]))
+        , (370614276, BG.singleton "SDL_PIXELFORMAT_XRGB2101010")
+        , (371595268, ("SDL_PIXELFORMAT_RGBX8888" BG.:| ["SDL_PIXELFORMAT_XBGR32"]))
+        , (372645892, ("SDL_PIXELFORMAT_ARGB8888" BG.:| ["SDL_PIXELFORMAT_BGRA32"]))
+        , (372711428, BG.singleton "SDL_PIXELFORMAT_ARGB2101010")
+        , (373694468, ("SDL_PIXELFORMAT_RGBA8888" BG.:| ["SDL_PIXELFORMAT_ABGR32"]))
+        , (374740996, ("SDL_PIXELFORMAT_XBGR8888" BG.:| ["SDL_PIXELFORMAT_RGBX32"]))
+        , (374808580, BG.singleton "SDL_PIXELFORMAT_XBGR2101010")
+        , (375789572, ("SDL_PIXELFORMAT_BGRX8888" BG.:| ["SDL_PIXELFORMAT_XRGB32"]))
+        , (376840196, ("SDL_PIXELFORMAT_ABGR8888" BG.:| ["SDL_PIXELFORMAT_RGBA32"]))
+        , (376905732, BG.singleton "SDL_PIXELFORMAT_ABGR2101010")
+        , (377888772, ("SDL_PIXELFORMAT_BGRA8888" BG.:| ["SDL_PIXELFORMAT_ARGB32"]))
+        , (386930691, BG.singleton "SDL_PIXELFORMAT_RGB24")
+        , (390076419, BG.singleton "SDL_PIXELFORMAT_BGR24")
+        , (403714054, BG.singleton "SDL_PIXELFORMAT_RGB48")
+        , (404766728, BG.singleton "SDL_PIXELFORMAT_RGBA64")
+        , (405815304, BG.singleton "SDL_PIXELFORMAT_ARGB64")
+        , (406859782, BG.singleton "SDL_PIXELFORMAT_BGR48")
+        , (407912456, BG.singleton "SDL_PIXELFORMAT_BGRA64")
+        , (408961032, BG.singleton "SDL_PIXELFORMAT_ABGR64")
+        , (437268486, BG.singleton "SDL_PIXELFORMAT_RGB48_FLOAT")
+        , (438321160, BG.singleton "SDL_PIXELFORMAT_RGBA64_FLOAT")
+        , (439369736, BG.singleton "SDL_PIXELFORMAT_ARGB64_FLOAT")
+        , (440414214, BG.singleton "SDL_PIXELFORMAT_BGR48_FLOAT")
+        , (441466888, BG.singleton "SDL_PIXELFORMAT_BGRA64_FLOAT")
+        , (442515464, BG.singleton "SDL_PIXELFORMAT_ABGR64_FLOAT")
+        , (454057996, BG.singleton "SDL_PIXELFORMAT_RGB96_FLOAT")
+        , (455114768, BG.singleton "SDL_PIXELFORMAT_RGBA128_FLOAT")
+        , (456163344, BG.singleton "SDL_PIXELFORMAT_ARGB128_FLOAT")
+        , (457203724, BG.singleton "SDL_PIXELFORMAT_BGR96_FLOAT")
+        , (458260496, BG.singleton "SDL_PIXELFORMAT_BGRA128_FLOAT")
+        , (459309072, BG.singleton "SDL_PIXELFORMAT_ABGR128_FLOAT")
+        , (470811136, BG.singleton "SDL_PIXELFORMAT_INDEX2LSB")
+        , (471859712, BG.singleton "SDL_PIXELFORMAT_INDEX2MSB")
+        , (542328143, BG.singleton "SDL_PIXELFORMAT_EXTERNAL_OES")
+        , (808530000, BG.singleton "SDL_PIXELFORMAT_P010")
+        , (825382478, BG.singleton "SDL_PIXELFORMAT_NV21")
+        , (842094158, BG.singleton "SDL_PIXELFORMAT_NV12")
+        , (842094169, BG.singleton "SDL_PIXELFORMAT_YV12")
+        , (844715353, BG.singleton "SDL_PIXELFORMAT_YUY2")
+        , (1196444237, BG.singleton "SDL_PIXELFORMAT_MJPG")
+        , (1431918169, BG.singleton "SDL_PIXELFORMAT_YVYU")
+        , (1448433993, BG.singleton "SDL_PIXELFORMAT_IYUV")
+        , (1498831189, BG.singleton "SDL_PIXELFORMAT_UYVY")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_PixelFormat"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_PixelFormat"
+
+instance Show SDL_PixelFormat where
+  showsPrec = CEnum.shows
+
+instance Read SDL_PixelFormat where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_PixelFormat ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormat{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PixelFormat) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PixelFormat "unwrap" where
+  type CFieldType SDL_PixelFormat "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_PIXELFORMAT_UNKNOWN@, defined at @SDL3\/SDL_pixels.h 550:5@
+pattern SDL_PIXELFORMAT_UNKNOWN :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_UNKNOWN = SDL_PixelFormat 0
+
+-- | [C declaration]: @SDL_PIXELFORMAT_INDEX1LSB@, defined at @SDL3\/SDL_pixels.h 551:5@
+pattern SDL_PIXELFORMAT_INDEX1LSB :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_INDEX1LSB = SDL_PixelFormat 286261504
+
+-- | [C declaration]: @SDL_PIXELFORMAT_INDEX1MSB@, defined at @SDL3\/SDL_pixels.h 553:5@
+pattern SDL_PIXELFORMAT_INDEX1MSB :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_INDEX1MSB = SDL_PixelFormat 287310080
+
+-- | [C declaration]: @SDL_PIXELFORMAT_INDEX2LSB@, defined at @SDL3\/SDL_pixels.h 555:5@
+pattern SDL_PIXELFORMAT_INDEX2LSB :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_INDEX2LSB = SDL_PixelFormat 470811136
+
+-- | [C declaration]: @SDL_PIXELFORMAT_INDEX2MSB@, defined at @SDL3\/SDL_pixels.h 557:5@
+pattern SDL_PIXELFORMAT_INDEX2MSB :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_INDEX2MSB = SDL_PixelFormat 471859712
+
+-- | [C declaration]: @SDL_PIXELFORMAT_INDEX4LSB@, defined at @SDL3\/SDL_pixels.h 559:5@
+pattern SDL_PIXELFORMAT_INDEX4LSB :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_INDEX4LSB = SDL_PixelFormat 303039488
+
+-- | [C declaration]: @SDL_PIXELFORMAT_INDEX4MSB@, defined at @SDL3\/SDL_pixels.h 561:5@
+pattern SDL_PIXELFORMAT_INDEX4MSB :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_INDEX4MSB = SDL_PixelFormat 304088064
+
+-- | [C declaration]: @SDL_PIXELFORMAT_INDEX8@, defined at @SDL3\/SDL_pixels.h 563:5@
+pattern SDL_PIXELFORMAT_INDEX8 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_INDEX8 = SDL_PixelFormat 318769153
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGB332@, defined at @SDL3\/SDL_pixels.h 565:5@
+pattern SDL_PIXELFORMAT_RGB332 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGB332 = SDL_PixelFormat 336660481
+
+-- | [C declaration]: @SDL_PIXELFORMAT_XRGB4444@, defined at @SDL3\/SDL_pixels.h 567:5@
+pattern SDL_PIXELFORMAT_XRGB4444 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_XRGB4444 = SDL_PixelFormat 353504258
+
+-- | [C declaration]: @SDL_PIXELFORMAT_XBGR4444@, defined at @SDL3\/SDL_pixels.h 569:5@
+pattern SDL_PIXELFORMAT_XBGR4444 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_XBGR4444 = SDL_PixelFormat 357698562
+
+-- | [C declaration]: @SDL_PIXELFORMAT_XRGB1555@, defined at @SDL3\/SDL_pixels.h 571:5@
+pattern SDL_PIXELFORMAT_XRGB1555 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_XRGB1555 = SDL_PixelFormat 353570562
+
+-- | [C declaration]: @SDL_PIXELFORMAT_XBGR1555@, defined at @SDL3\/SDL_pixels.h 573:5@
+pattern SDL_PIXELFORMAT_XBGR1555 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_XBGR1555 = SDL_PixelFormat 357764866
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ARGB4444@, defined at @SDL3\/SDL_pixels.h 575:5@
+pattern SDL_PIXELFORMAT_ARGB4444 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ARGB4444 = SDL_PixelFormat 355602434
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGBA4444@, defined at @SDL3\/SDL_pixels.h 577:5@
+pattern SDL_PIXELFORMAT_RGBA4444 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGBA4444 = SDL_PixelFormat 356651010
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ABGR4444@, defined at @SDL3\/SDL_pixels.h 579:5@
+pattern SDL_PIXELFORMAT_ABGR4444 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ABGR4444 = SDL_PixelFormat 359796738
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGRA4444@, defined at @SDL3\/SDL_pixels.h 581:5@
+pattern SDL_PIXELFORMAT_BGRA4444 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGRA4444 = SDL_PixelFormat 360845314
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ARGB1555@, defined at @SDL3\/SDL_pixels.h 583:5@
+pattern SDL_PIXELFORMAT_ARGB1555 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ARGB1555 = SDL_PixelFormat 355667970
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGBA5551@, defined at @SDL3\/SDL_pixels.h 585:5@
+pattern SDL_PIXELFORMAT_RGBA5551 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGBA5551 = SDL_PixelFormat 356782082
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ABGR1555@, defined at @SDL3\/SDL_pixels.h 587:5@
+pattern SDL_PIXELFORMAT_ABGR1555 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ABGR1555 = SDL_PixelFormat 359862274
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGRA5551@, defined at @SDL3\/SDL_pixels.h 589:5@
+pattern SDL_PIXELFORMAT_BGRA5551 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGRA5551 = SDL_PixelFormat 360976386
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGB565@, defined at @SDL3\/SDL_pixels.h 591:5@
+pattern SDL_PIXELFORMAT_RGB565 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGB565 = SDL_PixelFormat 353701890
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGR565@, defined at @SDL3\/SDL_pixels.h 593:5@
+pattern SDL_PIXELFORMAT_BGR565 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGR565 = SDL_PixelFormat 357896194
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGB24@, defined at @SDL3\/SDL_pixels.h 595:5@
+pattern SDL_PIXELFORMAT_RGB24 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGB24 = SDL_PixelFormat 386930691
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGR24@, defined at @SDL3\/SDL_pixels.h 597:5@
+pattern SDL_PIXELFORMAT_BGR24 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGR24 = SDL_PixelFormat 390076419
+
+-- | [C declaration]: @SDL_PIXELFORMAT_XRGB8888@, defined at @SDL3\/SDL_pixels.h 599:5@
+pattern SDL_PIXELFORMAT_XRGB8888 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_XRGB8888 = SDL_PixelFormat 370546692
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGBX8888@, defined at @SDL3\/SDL_pixels.h 601:5@
+pattern SDL_PIXELFORMAT_RGBX8888 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGBX8888 = SDL_PixelFormat 371595268
+
+-- | [C declaration]: @SDL_PIXELFORMAT_XBGR8888@, defined at @SDL3\/SDL_pixels.h 603:5@
+pattern SDL_PIXELFORMAT_XBGR8888 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_XBGR8888 = SDL_PixelFormat 374740996
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGRX8888@, defined at @SDL3\/SDL_pixels.h 605:5@
+pattern SDL_PIXELFORMAT_BGRX8888 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGRX8888 = SDL_PixelFormat 375789572
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ARGB8888@, defined at @SDL3\/SDL_pixels.h 607:5@
+pattern SDL_PIXELFORMAT_ARGB8888 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ARGB8888 = SDL_PixelFormat 372645892
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGBA8888@, defined at @SDL3\/SDL_pixels.h 609:5@
+pattern SDL_PIXELFORMAT_RGBA8888 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGBA8888 = SDL_PixelFormat 373694468
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ABGR8888@, defined at @SDL3\/SDL_pixels.h 611:5@
+pattern SDL_PIXELFORMAT_ABGR8888 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ABGR8888 = SDL_PixelFormat 376840196
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGRA8888@, defined at @SDL3\/SDL_pixels.h 613:5@
+pattern SDL_PIXELFORMAT_BGRA8888 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGRA8888 = SDL_PixelFormat 377888772
+
+-- | [C declaration]: @SDL_PIXELFORMAT_XRGB2101010@, defined at @SDL3\/SDL_pixels.h 615:5@
+pattern SDL_PIXELFORMAT_XRGB2101010 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_XRGB2101010 = SDL_PixelFormat 370614276
+
+-- | [C declaration]: @SDL_PIXELFORMAT_XBGR2101010@, defined at @SDL3\/SDL_pixels.h 617:5@
+pattern SDL_PIXELFORMAT_XBGR2101010 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_XBGR2101010 = SDL_PixelFormat 374808580
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ARGB2101010@, defined at @SDL3\/SDL_pixels.h 619:5@
+pattern SDL_PIXELFORMAT_ARGB2101010 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ARGB2101010 = SDL_PixelFormat 372711428
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ABGR2101010@, defined at @SDL3\/SDL_pixels.h 621:5@
+pattern SDL_PIXELFORMAT_ABGR2101010 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ABGR2101010 = SDL_PixelFormat 376905732
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGB48@, defined at @SDL3\/SDL_pixels.h 623:5@
+pattern SDL_PIXELFORMAT_RGB48 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGB48 = SDL_PixelFormat 403714054
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGR48@, defined at @SDL3\/SDL_pixels.h 625:5@
+pattern SDL_PIXELFORMAT_BGR48 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGR48 = SDL_PixelFormat 406859782
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGBA64@, defined at @SDL3\/SDL_pixels.h 627:5@
+pattern SDL_PIXELFORMAT_RGBA64 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGBA64 = SDL_PixelFormat 404766728
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ARGB64@, defined at @SDL3\/SDL_pixels.h 629:5@
+pattern SDL_PIXELFORMAT_ARGB64 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ARGB64 = SDL_PixelFormat 405815304
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGRA64@, defined at @SDL3\/SDL_pixels.h 631:5@
+pattern SDL_PIXELFORMAT_BGRA64 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGRA64 = SDL_PixelFormat 407912456
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ABGR64@, defined at @SDL3\/SDL_pixels.h 633:5@
+pattern SDL_PIXELFORMAT_ABGR64 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ABGR64 = SDL_PixelFormat 408961032
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGB48_FLOAT@, defined at @SDL3\/SDL_pixels.h 635:5@
+pattern SDL_PIXELFORMAT_RGB48_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGB48_FLOAT = SDL_PixelFormat 437268486
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGR48_FLOAT@, defined at @SDL3\/SDL_pixels.h 637:5@
+pattern SDL_PIXELFORMAT_BGR48_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGR48_FLOAT = SDL_PixelFormat 440414214
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGBA64_FLOAT@, defined at @SDL3\/SDL_pixels.h 639:5@
+pattern SDL_PIXELFORMAT_RGBA64_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGBA64_FLOAT = SDL_PixelFormat 438321160
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ARGB64_FLOAT@, defined at @SDL3\/SDL_pixels.h 641:5@
+pattern SDL_PIXELFORMAT_ARGB64_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ARGB64_FLOAT = SDL_PixelFormat 439369736
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGRA64_FLOAT@, defined at @SDL3\/SDL_pixels.h 643:5@
+pattern SDL_PIXELFORMAT_BGRA64_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGRA64_FLOAT = SDL_PixelFormat 441466888
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ABGR64_FLOAT@, defined at @SDL3\/SDL_pixels.h 645:5@
+pattern SDL_PIXELFORMAT_ABGR64_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ABGR64_FLOAT = SDL_PixelFormat 442515464
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGB96_FLOAT@, defined at @SDL3\/SDL_pixels.h 647:5@
+pattern SDL_PIXELFORMAT_RGB96_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGB96_FLOAT = SDL_PixelFormat 454057996
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGR96_FLOAT@, defined at @SDL3\/SDL_pixels.h 649:5@
+pattern SDL_PIXELFORMAT_BGR96_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGR96_FLOAT = SDL_PixelFormat 457203724
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGBA128_FLOAT@, defined at @SDL3\/SDL_pixels.h 651:5@
+pattern SDL_PIXELFORMAT_RGBA128_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGBA128_FLOAT = SDL_PixelFormat 455114768
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ARGB128_FLOAT@, defined at @SDL3\/SDL_pixels.h 653:5@
+pattern SDL_PIXELFORMAT_ARGB128_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ARGB128_FLOAT = SDL_PixelFormat 456163344
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGRA128_FLOAT@, defined at @SDL3\/SDL_pixels.h 655:5@
+pattern SDL_PIXELFORMAT_BGRA128_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGRA128_FLOAT = SDL_PixelFormat 458260496
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ABGR128_FLOAT@, defined at @SDL3\/SDL_pixels.h 657:5@
+pattern SDL_PIXELFORMAT_ABGR128_FLOAT :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ABGR128_FLOAT = SDL_PixelFormat 459309072
+
+-- | Planar mode: Y + V + U (3 planes)
+--
+--     [C declaration]: @SDL_PIXELFORMAT_YV12@, defined at @SDL3\/SDL_pixels.h 660:5@
+pattern SDL_PIXELFORMAT_YV12 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_YV12 = SDL_PixelFormat 842094169
+
+-- | Planar mode: Y + U + V (3 planes)
+--
+--     [C declaration]: @SDL_PIXELFORMAT_IYUV@, defined at @SDL3\/SDL_pixels.h 662:5@
+pattern SDL_PIXELFORMAT_IYUV :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_IYUV = SDL_PixelFormat 1448433993
+
+-- | Packed mode: Y0+U0+Y1+V0 (1 plane)
+--
+--     [C declaration]: @SDL_PIXELFORMAT_YUY2@, defined at @SDL3\/SDL_pixels.h 664:5@
+pattern SDL_PIXELFORMAT_YUY2 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_YUY2 = SDL_PixelFormat 844715353
+
+-- | Packed mode: U0+Y0+V0+Y1 (1 plane)
+--
+--     [C declaration]: @SDL_PIXELFORMAT_UYVY@, defined at @SDL3\/SDL_pixels.h 666:5@
+pattern SDL_PIXELFORMAT_UYVY :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_UYVY = SDL_PixelFormat 1498831189
+
+-- | Packed mode: Y0+V0+Y1+U0 (1 plane)
+--
+--     [C declaration]: @SDL_PIXELFORMAT_YVYU@, defined at @SDL3\/SDL_pixels.h 668:5@
+pattern SDL_PIXELFORMAT_YVYU :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_YVYU = SDL_PixelFormat 1431918169
+
+-- | Planar mode: Y + U\/V interleaved (2 planes)
+--
+--     [C declaration]: @SDL_PIXELFORMAT_NV12@, defined at @SDL3\/SDL_pixels.h 670:5@
+pattern SDL_PIXELFORMAT_NV12 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_NV12 = SDL_PixelFormat 842094158
+
+-- | Planar mode: Y + V\/U interleaved (2 planes)
+--
+--     [C declaration]: @SDL_PIXELFORMAT_NV21@, defined at @SDL3\/SDL_pixels.h 672:5@
+pattern SDL_PIXELFORMAT_NV21 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_NV21 = SDL_PixelFormat 825382478
+
+-- | Planar mode: Y + U\/V interleaved (2 planes)
+--
+--     [C declaration]: @SDL_PIXELFORMAT_P010@, defined at @SDL3\/SDL_pixels.h 674:5@
+pattern SDL_PIXELFORMAT_P010 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_P010 = SDL_PixelFormat 808530000
+
+-- | Android video texture format
+--
+--     [C declaration]: @SDL_PIXELFORMAT_EXTERNAL_OES@, defined at @SDL3\/SDL_pixels.h 676:5@
+pattern SDL_PIXELFORMAT_EXTERNAL_OES :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_EXTERNAL_OES = SDL_PixelFormat 542328143
+
+-- | Motion JPEG
+--
+--     [C declaration]: @SDL_PIXELFORMAT_MJPG@, defined at @SDL3\/SDL_pixels.h 679:5@
+pattern SDL_PIXELFORMAT_MJPG :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_MJPG = SDL_PixelFormat 1196444237
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGBA32@, defined at @SDL3\/SDL_pixels.h 693:5@
+pattern SDL_PIXELFORMAT_RGBA32 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGBA32 = SDL_PixelFormat 376840196
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ARGB32@, defined at @SDL3\/SDL_pixels.h 694:5@
+pattern SDL_PIXELFORMAT_ARGB32 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ARGB32 = SDL_PixelFormat 377888772
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGRA32@, defined at @SDL3\/SDL_pixels.h 695:5@
+pattern SDL_PIXELFORMAT_BGRA32 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGRA32 = SDL_PixelFormat 372645892
+
+-- | [C declaration]: @SDL_PIXELFORMAT_ABGR32@, defined at @SDL3\/SDL_pixels.h 696:5@
+pattern SDL_PIXELFORMAT_ABGR32 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_ABGR32 = SDL_PixelFormat 373694468
+
+-- | [C declaration]: @SDL_PIXELFORMAT_RGBX32@, defined at @SDL3\/SDL_pixels.h 697:5@
+pattern SDL_PIXELFORMAT_RGBX32 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_RGBX32 = SDL_PixelFormat 374740996
+
+-- | [C declaration]: @SDL_PIXELFORMAT_XRGB32@, defined at @SDL3\/SDL_pixels.h 698:5@
+pattern SDL_PIXELFORMAT_XRGB32 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_XRGB32 = SDL_PixelFormat 375789572
+
+-- | [C declaration]: @SDL_PIXELFORMAT_BGRX32@, defined at @SDL3\/SDL_pixels.h 699:5@
+pattern SDL_PIXELFORMAT_BGRX32 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_BGRX32 = SDL_PixelFormat 370546692
+
+-- | [C declaration]: @SDL_PIXELFORMAT_XBGR32@, defined at @SDL3\/SDL_pixels.h 700:5@
+pattern SDL_PIXELFORMAT_XBGR32 :: SDL_PixelFormat
+pattern SDL_PIXELFORMAT_XBGR32 = SDL_PixelFormat 371595268
+
+-- | Colorspace color type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_ColorType@, defined at @SDL3\/SDL_pixels.h 709:14@
+newtype SDL_ColorType = SDL_ColorType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_ColorType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_ColorType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ColorType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_ColorType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ColorType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_ColorType instance BG.Storable SDL_ColorType
+
+deriving via BG.CUInt instance BG.Prim SDL_ColorType
+
+instance CEnum.CEnum SDL_ColorType where
+  type CEnumZ SDL_ColorType = BG.CUInt
+
+  toCEnum = SDL_ColorType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_COLOR_TYPE_UNKNOWN")
+        , (1, BG.singleton "SDL_COLOR_TYPE_RGB")
+        , (2, BG.singleton "SDL_COLOR_TYPE_YCBCR")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_ColorType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_ColorType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_ColorType where
+  minDeclaredValue = SDL_COLOR_TYPE_UNKNOWN
+
+  maxDeclaredValue = SDL_COLOR_TYPE_YCBCR
+
+instance Show SDL_ColorType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_ColorType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_ColorType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ColorType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ColorType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ColorType "unwrap" where
+  type CFieldType SDL_ColorType "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_COLOR_TYPE_UNKNOWN@, defined at @SDL3\/SDL_pixels.h 711:5@
+pattern SDL_COLOR_TYPE_UNKNOWN :: SDL_ColorType
+pattern SDL_COLOR_TYPE_UNKNOWN = SDL_ColorType 0
+
+-- | [C declaration]: @SDL_COLOR_TYPE_RGB@, defined at @SDL3\/SDL_pixels.h 712:5@
+pattern SDL_COLOR_TYPE_RGB :: SDL_ColorType
+pattern SDL_COLOR_TYPE_RGB = SDL_ColorType 1
+
+-- | [C declaration]: @SDL_COLOR_TYPE_YCBCR@, defined at @SDL3\/SDL_pixels.h 713:5@
+pattern SDL_COLOR_TYPE_YCBCR :: SDL_ColorType
+pattern SDL_COLOR_TYPE_YCBCR = SDL_ColorType 2
+
+-- | Colorspace color range, as described by [https:\/\/www.itu.int\/rec\/R-REC-BT.2100-2-201807-I\/en](https://www.itu.int/rec/R-REC-BT.2100-2-201807-I/en)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_ColorRange@, defined at @SDL3\/SDL_pixels.h 722:14@
+newtype SDL_ColorRange = SDL_ColorRange
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_ColorRange where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_ColorRange where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ColorRange
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_ColorRange where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ColorRange unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_ColorRange instance BG.Storable SDL_ColorRange
+
+deriving via BG.CUInt instance BG.Prim SDL_ColorRange
+
+instance CEnum.CEnum SDL_ColorRange where
+  type CEnumZ SDL_ColorRange = BG.CUInt
+
+  toCEnum = SDL_ColorRange
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_COLOR_RANGE_UNKNOWN")
+        , (1, BG.singleton "SDL_COLOR_RANGE_LIMITED")
+        , (2, BG.singleton "SDL_COLOR_RANGE_FULL")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_ColorRange"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_ColorRange"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_ColorRange where
+  minDeclaredValue = SDL_COLOR_RANGE_UNKNOWN
+
+  maxDeclaredValue = SDL_COLOR_RANGE_FULL
+
+instance Show SDL_ColorRange where
+  showsPrec = CEnum.shows
+
+instance Read SDL_ColorRange where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_ColorRange ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ColorRange{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ColorRange) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ColorRange "unwrap" where
+  type CFieldType SDL_ColorRange "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_COLOR_RANGE_UNKNOWN@, defined at @SDL3\/SDL_pixels.h 724:5@
+pattern SDL_COLOR_RANGE_UNKNOWN :: SDL_ColorRange
+pattern SDL_COLOR_RANGE_UNKNOWN = SDL_ColorRange 0
+
+-- | Narrow range, e.g. 16-235 for 8-bit RGB and luma, and 16-240 for 8-bit chroma
+--
+--     [C declaration]: @SDL_COLOR_RANGE_LIMITED@, defined at @SDL3\/SDL_pixels.h 725:5@
+pattern SDL_COLOR_RANGE_LIMITED :: SDL_ColorRange
+pattern SDL_COLOR_RANGE_LIMITED = SDL_ColorRange 1
+
+-- | Full range, e.g. 0-255 for 8-bit RGB and luma, and 1-255 for 8-bit chroma
+--
+--     [C declaration]: @SDL_COLOR_RANGE_FULL@, defined at @SDL3\/SDL_pixels.h 726:5@
+pattern SDL_COLOR_RANGE_FULL :: SDL_ColorRange
+pattern SDL_COLOR_RANGE_FULL = SDL_ColorRange 2
+
+-- | Colorspace color primaries, as described by [https:\/\/www.itu.int\/rec\/T-REC-H.273-201612-S\/en](https://www.itu.int/rec/T-REC-H.273-201612-S/en)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_ColorPrimaries@, defined at @SDL3\/SDL_pixels.h 735:14@
+newtype SDL_ColorPrimaries = SDL_ColorPrimaries
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_ColorPrimaries where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_ColorPrimaries where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ColorPrimaries
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_ColorPrimaries where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ColorPrimaries unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_ColorPrimaries instance BG.Storable SDL_ColorPrimaries
+
+deriving via BG.CUInt instance BG.Prim SDL_ColorPrimaries
+
+instance CEnum.CEnum SDL_ColorPrimaries where
+  type CEnumZ SDL_ColorPrimaries = BG.CUInt
+
+  toCEnum = SDL_ColorPrimaries
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_COLOR_PRIMARIES_UNKNOWN")
+        , (1, BG.singleton "SDL_COLOR_PRIMARIES_BT709")
+        , (2, BG.singleton "SDL_COLOR_PRIMARIES_UNSPECIFIED")
+        , (4, BG.singleton "SDL_COLOR_PRIMARIES_BT470M")
+        , (5, BG.singleton "SDL_COLOR_PRIMARIES_BT470BG")
+        , (6, BG.singleton "SDL_COLOR_PRIMARIES_BT601")
+        , (7, BG.singleton "SDL_COLOR_PRIMARIES_SMPTE240")
+        , (8, BG.singleton "SDL_COLOR_PRIMARIES_GENERIC_FILM")
+        , (9, BG.singleton "SDL_COLOR_PRIMARIES_BT2020")
+        , (10, BG.singleton "SDL_COLOR_PRIMARIES_XYZ")
+        , (11, BG.singleton "SDL_COLOR_PRIMARIES_SMPTE431")
+        , (12, BG.singleton "SDL_COLOR_PRIMARIES_SMPTE432")
+        , (22, BG.singleton "SDL_COLOR_PRIMARIES_EBU3213")
+        , (31, BG.singleton "SDL_COLOR_PRIMARIES_CUSTOM")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_ColorPrimaries"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_ColorPrimaries"
+
+instance Show SDL_ColorPrimaries where
+  showsPrec = CEnum.shows
+
+instance Read SDL_ColorPrimaries where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_ColorPrimaries ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ColorPrimaries{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ColorPrimaries) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ColorPrimaries "unwrap" where
+  type
+    CFieldType SDL_ColorPrimaries "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_COLOR_PRIMARIES_UNKNOWN@, defined at @SDL3\/SDL_pixels.h 737:5@
+pattern SDL_COLOR_PRIMARIES_UNKNOWN :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_UNKNOWN = SDL_ColorPrimaries 0
+
+-- | ITU-R BT.709-6
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_BT709@, defined at @SDL3\/SDL_pixels.h 738:5@
+pattern SDL_COLOR_PRIMARIES_BT709 :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_BT709 = SDL_ColorPrimaries 1
+
+-- | [C declaration]: @SDL_COLOR_PRIMARIES_UNSPECIFIED@, defined at @SDL3\/SDL_pixels.h 739:5@
+pattern SDL_COLOR_PRIMARIES_UNSPECIFIED :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_UNSPECIFIED = SDL_ColorPrimaries 2
+
+-- | ITU-R BT.470-6 System M
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_BT470M@, defined at @SDL3\/SDL_pixels.h 740:5@
+pattern SDL_COLOR_PRIMARIES_BT470M :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_BT470M = SDL_ColorPrimaries 4
+
+-- | ITU-R BT.470-6 System B, G \/ ITU-R BT.601-7 625
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_BT470BG@, defined at @SDL3\/SDL_pixels.h 741:5@
+pattern SDL_COLOR_PRIMARIES_BT470BG :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_BT470BG = SDL_ColorPrimaries 5
+
+-- | ITU-R BT.601-7 525, SMPTE 170M
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_BT601@, defined at @SDL3\/SDL_pixels.h 742:5@
+pattern SDL_COLOR_PRIMARIES_BT601 :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_BT601 = SDL_ColorPrimaries 6
+
+-- | SMPTE 240M, functionally the same as SDL_COLOR_PRIMARIES_BT601
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_SMPTE240@, defined at @SDL3\/SDL_pixels.h 743:5@
+pattern SDL_COLOR_PRIMARIES_SMPTE240 :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_SMPTE240 = SDL_ColorPrimaries 7
+
+-- | Generic film (color filters using Illuminant C)
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_GENERIC_FILM@, defined at @SDL3\/SDL_pixels.h 744:5@
+pattern SDL_COLOR_PRIMARIES_GENERIC_FILM :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_GENERIC_FILM = SDL_ColorPrimaries 8
+
+-- | ITU-R BT.2020-2 \/ ITU-R BT.2100-0
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_BT2020@, defined at @SDL3\/SDL_pixels.h 745:5@
+pattern SDL_COLOR_PRIMARIES_BT2020 :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_BT2020 = SDL_ColorPrimaries 9
+
+-- | SMPTE ST 428-1
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_XYZ@, defined at @SDL3\/SDL_pixels.h 746:5@
+pattern SDL_COLOR_PRIMARIES_XYZ :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_XYZ = SDL_ColorPrimaries 10
+
+-- | SMPTE RP 431-2
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_SMPTE431@, defined at @SDL3\/SDL_pixels.h 747:5@
+pattern SDL_COLOR_PRIMARIES_SMPTE431 :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_SMPTE431 = SDL_ColorPrimaries 11
+
+-- | SMPTE EG 432-1 \/ DCI P3
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_SMPTE432@, defined at @SDL3\/SDL_pixels.h 748:5@
+pattern SDL_COLOR_PRIMARIES_SMPTE432 :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_SMPTE432 = SDL_ColorPrimaries 12
+
+-- | EBU Tech. 3213-E
+--
+--     [C declaration]: @SDL_COLOR_PRIMARIES_EBU3213@, defined at @SDL3\/SDL_pixels.h 749:5@
+pattern SDL_COLOR_PRIMARIES_EBU3213 :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_EBU3213 = SDL_ColorPrimaries 22
+
+-- | [C declaration]: @SDL_COLOR_PRIMARIES_CUSTOM@, defined at @SDL3\/SDL_pixels.h 750:5@
+pattern SDL_COLOR_PRIMARIES_CUSTOM :: SDL_ColorPrimaries
+pattern SDL_COLOR_PRIMARIES_CUSTOM = SDL_ColorPrimaries 31
+
+-- | Colorspace transfer characteristics.
+--
+--     These are as described by [https:\/\/www.itu.int\/rec\/T-REC-H.273-201612-S\/en](https://www.itu.int/rec/T-REC-H.273-201612-S/en)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_TransferCharacteristics@, defined at @SDL3\/SDL_pixels.h 760:14@
+newtype SDL_TransferCharacteristics = SDL_TransferCharacteristics
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_TransferCharacteristics where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_TransferCharacteristics where
+  readRaw =
+    \ptr0 ->
+      pure SDL_TransferCharacteristics
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_TransferCharacteristics where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_TransferCharacteristics unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_TransferCharacteristics
+  instance
+    BG.Storable SDL_TransferCharacteristics
+
+deriving via BG.CUInt instance BG.Prim SDL_TransferCharacteristics
+
+instance CEnum.CEnum SDL_TransferCharacteristics where
+  type CEnumZ SDL_TransferCharacteristics = BG.CUInt
+
+  toCEnum = SDL_TransferCharacteristics
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_UNKNOWN")
+        , (1, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_BT709")
+        , (2, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_UNSPECIFIED")
+        , (4, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_GAMMA22")
+        , (5, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_GAMMA28")
+        , (6, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_BT601")
+        , (7, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_SMPTE240")
+        , (8, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_LINEAR")
+        , (9, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_LOG100")
+        , (10, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_LOG100_SQRT10")
+        , (11, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_IEC61966")
+        , (12, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_BT1361")
+        , (13, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_SRGB")
+        , (14, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_BT2020_10BIT")
+        , (15, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_BT2020_12BIT")
+        , (16, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_PQ")
+        , (17, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_SMPTE428")
+        , (18, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_HLG")
+        , (31, BG.singleton "SDL_TRANSFER_CHARACTERISTICS_CUSTOM")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_TransferCharacteristics"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_TransferCharacteristics"
+
+instance Show SDL_TransferCharacteristics where
+  showsPrec = CEnum.shows
+
+instance Read SDL_TransferCharacteristics where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_TransferCharacteristics ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TransferCharacteristics{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TransferCharacteristics) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TransferCharacteristics "unwrap" where
+  type
+    CFieldType SDL_TransferCharacteristics "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_UNKNOWN@, defined at @SDL3\/SDL_pixels.h 762:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_UNKNOWN :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_UNKNOWN = SDL_TransferCharacteristics 0
+
+-- | Rec. ITU-R BT.709-6 \/ ITU-R BT1361
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_BT709@, defined at @SDL3\/SDL_pixels.h 763:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_BT709 :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_BT709 = SDL_TransferCharacteristics 1
+
+-- | [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_UNSPECIFIED@, defined at @SDL3\/SDL_pixels.h 764:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_UNSPECIFIED :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_UNSPECIFIED = SDL_TransferCharacteristics 2
+
+-- | ITU-R BT.470-6 System M \/ ITU-R BT1700 625 PAL & SECAM
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_GAMMA22@, defined at @SDL3\/SDL_pixels.h 765:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_GAMMA22 :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_GAMMA22 = SDL_TransferCharacteristics 4
+
+-- | ITU-R BT.470-6 System B, G
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_GAMMA28@, defined at @SDL3\/SDL_pixels.h 766:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_GAMMA28 :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_GAMMA28 = SDL_TransferCharacteristics 5
+
+-- | SMPTE ST 170M \/ ITU-R BT.601-7 525 or 625
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_BT601@, defined at @SDL3\/SDL_pixels.h 767:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_BT601 :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_BT601 = SDL_TransferCharacteristics 6
+
+-- | SMPTE ST 240M
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_SMPTE240@, defined at @SDL3\/SDL_pixels.h 768:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_SMPTE240 :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_SMPTE240 = SDL_TransferCharacteristics 7
+
+-- | [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_LINEAR@, defined at @SDL3\/SDL_pixels.h 769:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_LINEAR :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_LINEAR = SDL_TransferCharacteristics 8
+
+-- | [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_LOG100@, defined at @SDL3\/SDL_pixels.h 770:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_LOG100 :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_LOG100 = SDL_TransferCharacteristics 9
+
+-- | [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_LOG100_SQRT10@, defined at @SDL3\/SDL_pixels.h 771:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_LOG100_SQRT10 :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_LOG100_SQRT10 = SDL_TransferCharacteristics 10
+
+-- | IEC 61966-2-4
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_IEC61966@, defined at @SDL3\/SDL_pixels.h 772:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_IEC61966 :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_IEC61966 = SDL_TransferCharacteristics 11
+
+-- | ITU-R BT1361 Extended Colour Gamut
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_BT1361@, defined at @SDL3\/SDL_pixels.h 773:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_BT1361 :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_BT1361 = SDL_TransferCharacteristics 12
+
+-- | IEC 61966-2-1 (sRGB or sYCC)
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_SRGB@, defined at @SDL3\/SDL_pixels.h 774:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_SRGB :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_SRGB = SDL_TransferCharacteristics 13
+
+-- | ITU-R BT2020 for 10-bit system
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_BT2020_10BIT@, defined at @SDL3\/SDL_pixels.h 775:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_BT2020_10BIT :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_BT2020_10BIT = SDL_TransferCharacteristics 14
+
+-- | ITU-R BT2020 for 12-bit system
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_BT2020_12BIT@, defined at @SDL3\/SDL_pixels.h 776:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_BT2020_12BIT :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_BT2020_12BIT = SDL_TransferCharacteristics 15
+
+-- | SMPTE ST 2084 for 10-, 12-, 14- and 16-bit systems
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_PQ@, defined at @SDL3\/SDL_pixels.h 777:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_PQ :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_PQ = SDL_TransferCharacteristics 16
+
+-- | SMPTE ST 428-1
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_SMPTE428@, defined at @SDL3\/SDL_pixels.h 778:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_SMPTE428 :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_SMPTE428 = SDL_TransferCharacteristics 17
+
+-- | ARIB STD-B67, known as \"hybrid log-gamma\" (HLG)
+--
+--     [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_HLG@, defined at @SDL3\/SDL_pixels.h 779:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_HLG :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_HLG = SDL_TransferCharacteristics 18
+
+-- | [C declaration]: @SDL_TRANSFER_CHARACTERISTICS_CUSTOM@, defined at @SDL3\/SDL_pixels.h 780:5@
+pattern SDL_TRANSFER_CHARACTERISTICS_CUSTOM :: SDL_TransferCharacteristics
+pattern SDL_TRANSFER_CHARACTERISTICS_CUSTOM = SDL_TransferCharacteristics 31
+
+-- | Colorspace matrix coefficients.
+--
+--     These are as described by [https:\/\/www.itu.int\/rec\/T-REC-H.273-201612-S\/en](https://www.itu.int/rec/T-REC-H.273-201612-S/en)
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_MatrixCoefficients@, defined at @SDL3\/SDL_pixels.h 790:14@
+newtype SDL_MatrixCoefficients = SDL_MatrixCoefficients
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_MatrixCoefficients where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_MatrixCoefficients where
+  readRaw =
+    \ptr0 ->
+      pure SDL_MatrixCoefficients
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_MatrixCoefficients where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_MatrixCoefficients unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_MatrixCoefficients
+  instance
+    BG.Storable SDL_MatrixCoefficients
+
+deriving via BG.CUInt instance BG.Prim SDL_MatrixCoefficients
+
+instance CEnum.CEnum SDL_MatrixCoefficients where
+  type CEnumZ SDL_MatrixCoefficients = BG.CUInt
+
+  toCEnum = SDL_MatrixCoefficients
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_MATRIX_COEFFICIENTS_IDENTITY")
+        , (1, BG.singleton "SDL_MATRIX_COEFFICIENTS_BT709")
+        , (2, BG.singleton "SDL_MATRIX_COEFFICIENTS_UNSPECIFIED")
+        , (4, BG.singleton "SDL_MATRIX_COEFFICIENTS_FCC")
+        , (5, BG.singleton "SDL_MATRIX_COEFFICIENTS_BT470BG")
+        , (6, BG.singleton "SDL_MATRIX_COEFFICIENTS_BT601")
+        , (7, BG.singleton "SDL_MATRIX_COEFFICIENTS_SMPTE240")
+        , (8, BG.singleton "SDL_MATRIX_COEFFICIENTS_YCGCO")
+        , (9, BG.singleton "SDL_MATRIX_COEFFICIENTS_BT2020_NCL")
+        , (10, BG.singleton "SDL_MATRIX_COEFFICIENTS_BT2020_CL")
+        , (11, BG.singleton "SDL_MATRIX_COEFFICIENTS_SMPTE2085")
+        , (12, BG.singleton "SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_NCL")
+        , (13, BG.singleton "SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_CL")
+        , (14, BG.singleton "SDL_MATRIX_COEFFICIENTS_ICTCP")
+        , (31, BG.singleton "SDL_MATRIX_COEFFICIENTS_CUSTOM")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_MatrixCoefficients"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_MatrixCoefficients"
+
+instance Show SDL_MatrixCoefficients where
+  showsPrec = CEnum.shows
+
+instance Read SDL_MatrixCoefficients where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_MatrixCoefficients ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_MatrixCoefficients{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_MatrixCoefficients) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_MatrixCoefficients "unwrap" where
+  type
+    CFieldType SDL_MatrixCoefficients "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_MATRIX_COEFFICIENTS_IDENTITY@, defined at @SDL3\/SDL_pixels.h 792:5@
+pattern SDL_MATRIX_COEFFICIENTS_IDENTITY :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_IDENTITY = SDL_MatrixCoefficients 0
+
+-- | ITU-R BT.709-6
+--
+--     [C declaration]: @SDL_MATRIX_COEFFICIENTS_BT709@, defined at @SDL3\/SDL_pixels.h 793:5@
+pattern SDL_MATRIX_COEFFICIENTS_BT709 :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_BT709 = SDL_MatrixCoefficients 1
+
+-- | [C declaration]: @SDL_MATRIX_COEFFICIENTS_UNSPECIFIED@, defined at @SDL3\/SDL_pixels.h 794:5@
+pattern SDL_MATRIX_COEFFICIENTS_UNSPECIFIED :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_UNSPECIFIED = SDL_MatrixCoefficients 2
+
+-- | US FCC Title 47
+--
+--     [C declaration]: @SDL_MATRIX_COEFFICIENTS_FCC@, defined at @SDL3\/SDL_pixels.h 795:5@
+pattern SDL_MATRIX_COEFFICIENTS_FCC :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_FCC = SDL_MatrixCoefficients 4
+
+-- | ITU-R BT.470-6 System B, G \/ ITU-R BT.601-7 625, functionally the same as SDL_MATRIX_COEFFICIENTS_BT601
+--
+--     [C declaration]: @SDL_MATRIX_COEFFICIENTS_BT470BG@, defined at @SDL3\/SDL_pixels.h 796:5@
+pattern SDL_MATRIX_COEFFICIENTS_BT470BG :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_BT470BG = SDL_MatrixCoefficients 5
+
+-- | ITU-R BT.601-7 525
+--
+--     [C declaration]: @SDL_MATRIX_COEFFICIENTS_BT601@, defined at @SDL3\/SDL_pixels.h 797:5@
+pattern SDL_MATRIX_COEFFICIENTS_BT601 :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_BT601 = SDL_MatrixCoefficients 6
+
+-- | SMPTE 240M
+--
+--     [C declaration]: @SDL_MATRIX_COEFFICIENTS_SMPTE240@, defined at @SDL3\/SDL_pixels.h 798:5@
+pattern SDL_MATRIX_COEFFICIENTS_SMPTE240 :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_SMPTE240 = SDL_MatrixCoefficients 7
+
+-- | [C declaration]: @SDL_MATRIX_COEFFICIENTS_YCGCO@, defined at @SDL3\/SDL_pixels.h 799:5@
+pattern SDL_MATRIX_COEFFICIENTS_YCGCO :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_YCGCO = SDL_MatrixCoefficients 8
+
+-- | ITU-R BT.2020-2 non-constant luminance
+--
+--     [C declaration]: @SDL_MATRIX_COEFFICIENTS_BT2020_NCL@, defined at @SDL3\/SDL_pixels.h 800:5@
+pattern SDL_MATRIX_COEFFICIENTS_BT2020_NCL :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_BT2020_NCL = SDL_MatrixCoefficients 9
+
+-- | ITU-R BT.2020-2 constant luminance
+--
+--     [C declaration]: @SDL_MATRIX_COEFFICIENTS_BT2020_CL@, defined at @SDL3\/SDL_pixels.h 801:5@
+pattern SDL_MATRIX_COEFFICIENTS_BT2020_CL :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_BT2020_CL = SDL_MatrixCoefficients 10
+
+-- | SMPTE ST 2085
+--
+--     [C declaration]: @SDL_MATRIX_COEFFICIENTS_SMPTE2085@, defined at @SDL3\/SDL_pixels.h 802:5@
+pattern SDL_MATRIX_COEFFICIENTS_SMPTE2085 :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_SMPTE2085 = SDL_MatrixCoefficients 11
+
+-- | [C declaration]: @SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_NCL@, defined at @SDL3\/SDL_pixels.h 803:5@
+pattern SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_NCL :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_NCL = SDL_MatrixCoefficients 12
+
+-- | [C declaration]: @SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_CL@, defined at @SDL3\/SDL_pixels.h 804:5@
+pattern SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_CL :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_CHROMA_DERIVED_CL = SDL_MatrixCoefficients 13
+
+-- | ITU-R BT.2100-0 ICTCP
+--
+--     [C declaration]: @SDL_MATRIX_COEFFICIENTS_ICTCP@, defined at @SDL3\/SDL_pixels.h 805:5@
+pattern SDL_MATRIX_COEFFICIENTS_ICTCP :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_ICTCP = SDL_MatrixCoefficients 14
+
+-- | [C declaration]: @SDL_MATRIX_COEFFICIENTS_CUSTOM@, defined at @SDL3\/SDL_pixels.h 806:5@
+pattern SDL_MATRIX_COEFFICIENTS_CUSTOM :: SDL_MatrixCoefficients
+pattern SDL_MATRIX_COEFFICIENTS_CUSTOM = SDL_MatrixCoefficients 31
+
+-- | Colorspace chroma sample location.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_ChromaLocation@, defined at @SDL3\/SDL_pixels.h 814:14@
+newtype SDL_ChromaLocation = SDL_ChromaLocation
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_ChromaLocation where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_ChromaLocation where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ChromaLocation
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_ChromaLocation where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ChromaLocation unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_ChromaLocation instance BG.Storable SDL_ChromaLocation
+
+deriving via BG.CUInt instance BG.Prim SDL_ChromaLocation
+
+instance CEnum.CEnum SDL_ChromaLocation where
+  type CEnumZ SDL_ChromaLocation = BG.CUInt
+
+  toCEnum = SDL_ChromaLocation
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_CHROMA_LOCATION_NONE")
+        , (1, BG.singleton "SDL_CHROMA_LOCATION_LEFT")
+        , (2, BG.singleton "SDL_CHROMA_LOCATION_CENTER")
+        , (3, BG.singleton "SDL_CHROMA_LOCATION_TOPLEFT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_ChromaLocation"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_ChromaLocation"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_ChromaLocation where
+  minDeclaredValue = SDL_CHROMA_LOCATION_NONE
+
+  maxDeclaredValue = SDL_CHROMA_LOCATION_TOPLEFT
+
+instance Show SDL_ChromaLocation where
+  showsPrec = CEnum.shows
+
+instance Read SDL_ChromaLocation where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_ChromaLocation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ChromaLocation{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ChromaLocation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ChromaLocation "unwrap" where
+  type
+    CFieldType SDL_ChromaLocation "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | RGB, no chroma sampling
+--
+--     [C declaration]: @SDL_CHROMA_LOCATION_NONE@, defined at @SDL3\/SDL_pixels.h 816:5@
+pattern SDL_CHROMA_LOCATION_NONE :: SDL_ChromaLocation
+pattern SDL_CHROMA_LOCATION_NONE = SDL_ChromaLocation 0
+
+-- | In MPEG-2, MPEG-4, and AVC, Cb and Cr are taken on midpoint of the left-edge of the 2x2 square. In other words, they have the same horizontal location as the top-left pixel, but is shifted one-half pixel down vertically.
+--
+--     [C declaration]: @SDL_CHROMA_LOCATION_LEFT@, defined at @SDL3\/SDL_pixels.h 817:5@
+pattern SDL_CHROMA_LOCATION_LEFT :: SDL_ChromaLocation
+pattern SDL_CHROMA_LOCATION_LEFT = SDL_ChromaLocation 1
+
+-- | In JPEG\/JFIF, H.261, and MPEG-1, Cb and Cr are taken at the center of the 2x2 square. In other words, they are offset one-half pixel to the right and one-half pixel down compared to the top-left pixel.
+--
+--     [C declaration]: @SDL_CHROMA_LOCATION_CENTER@, defined at @SDL3\/SDL_pixels.h 818:5@
+pattern SDL_CHROMA_LOCATION_CENTER :: SDL_ChromaLocation
+pattern SDL_CHROMA_LOCATION_CENTER = SDL_ChromaLocation 2
+
+-- | In HEVC for BT.2020 and BT.2100 content (in particular on Blu-rays), Cb and Cr are sampled at the same location as the group\'s top-left Y pixel (\"co-sited\", \"co-located\").
+--
+--     [C declaration]: @SDL_CHROMA_LOCATION_TOPLEFT@, defined at @SDL3\/SDL_pixels.h 819:5@
+pattern SDL_CHROMA_LOCATION_TOPLEFT :: SDL_ChromaLocation
+pattern SDL_CHROMA_LOCATION_TOPLEFT = SDL_ChromaLocation 3
+
+-- | Colorspace definitions.
+--
+--     Since similar colorspaces may vary in their details (matrix, transfer function, etc.), this is not an exhaustive list, but rather a representative sample of the kinds of colorspaces supported in SDL.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_ColorPrimaries', 'SDL_ColorRange', 'SDL_ColorType', 'SDL_MatrixCoefficients', 'SDL_TransferCharacteristics'
+--
+--     [C declaration]: @enum SDL_Colorspace@, defined at @SDL3\/SDL_pixels.h 1011:14@
+newtype SDL_Colorspace = SDL_Colorspace
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_Colorspace where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_Colorspace where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Colorspace
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_Colorspace where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Colorspace unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_Colorspace instance BG.Storable SDL_Colorspace
+
+deriving via BG.CUInt instance BG.Prim SDL_Colorspace
+
+instance CEnum.CEnum SDL_Colorspace where
+  type CEnumZ SDL_Colorspace = BG.CUInt
+
+  toCEnum = SDL_Colorspace
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_COLORSPACE_UNKNOWN")
+        , (301991168, BG.singleton "SDL_COLORSPACE_SRGB_LINEAR")
+        , (301991328, ("SDL_COLORSPACE_SRGB" BG.:| ["SDL_COLORSPACE_RGB_DEFAULT"]))
+        , (301999616, BG.singleton "SDL_COLORSPACE_HDR10")
+        , (554697761, BG.singleton "SDL_COLORSPACE_BT709_LIMITED")
+        ,
+          ( 554703046
+          , ("SDL_COLORSPACE_BT601_LIMITED" BG.:| ["SDL_COLORSPACE_YUV_DEFAULT"])
+          )
+        , (554706441, BG.singleton "SDL_COLORSPACE_BT2020_LIMITED")
+        , (570426566, BG.singleton "SDL_COLORSPACE_JPEG")
+        , (571474977, BG.singleton "SDL_COLORSPACE_BT709_FULL")
+        , (571480262, BG.singleton "SDL_COLORSPACE_BT601_FULL")
+        , (571483657, BG.singleton "SDL_COLORSPACE_BT2020_FULL")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_Colorspace"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_Colorspace"
+
+instance Show SDL_Colorspace where
+  showsPrec = CEnum.shows
+
+instance Read SDL_Colorspace where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_Colorspace ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Colorspace{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_Colorspace) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_Colorspace "unwrap" where
+  type CFieldType SDL_Colorspace "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_COLORSPACE_UNKNOWN@, defined at @SDL3\/SDL_pixels.h 1013:5@
+pattern SDL_COLORSPACE_UNKNOWN :: SDL_Colorspace
+pattern SDL_COLORSPACE_UNKNOWN = SDL_Colorspace 0
+
+-- | Equivalent to DXGI_COLOR_SPACE_RGB_FULL_G22_NONE_P709
+--
+--     [C declaration]: @SDL_COLORSPACE_SRGB@, defined at @SDL3\/SDL_pixels.h 1016:5@
+pattern SDL_COLORSPACE_SRGB :: SDL_Colorspace
+pattern SDL_COLORSPACE_SRGB = SDL_Colorspace 301991328
+
+-- | Equivalent to DXGI_COLOR_SPACE_RGB_FULL_G10_NONE_P709
+--
+--     [C declaration]: @SDL_COLORSPACE_SRGB_LINEAR@, defined at @SDL3\/SDL_pixels.h 1025:5@
+pattern SDL_COLORSPACE_SRGB_LINEAR :: SDL_Colorspace
+pattern SDL_COLORSPACE_SRGB_LINEAR = SDL_Colorspace 301991168
+
+-- | Equivalent to DXGI_COLOR_SPACE_RGB_FULL_G2084_NONE_P2020
+--
+--     [C declaration]: @SDL_COLORSPACE_HDR10@, defined at @SDL3\/SDL_pixels.h 1034:5@
+pattern SDL_COLORSPACE_HDR10 :: SDL_Colorspace
+pattern SDL_COLORSPACE_HDR10 = SDL_Colorspace 301999616
+
+-- | Equivalent to DXGI_COLOR_SPACE_YCBCR_FULL_G22_NONE_P709_X601
+--
+--     [C declaration]: @SDL_COLORSPACE_JPEG@, defined at @SDL3\/SDL_pixels.h 1042:5@
+pattern SDL_COLORSPACE_JPEG :: SDL_Colorspace
+pattern SDL_COLORSPACE_JPEG = SDL_Colorspace 570426566
+
+-- | Equivalent to DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601
+--
+--     [C declaration]: @SDL_COLORSPACE_BT601_LIMITED@, defined at @SDL3\/SDL_pixels.h 1050:5@
+pattern SDL_COLORSPACE_BT601_LIMITED :: SDL_Colorspace
+pattern SDL_COLORSPACE_BT601_LIMITED = SDL_Colorspace 554703046
+
+-- | Equivalent to DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P601
+--
+--     [C declaration]: @SDL_COLORSPACE_BT601_FULL@, defined at @SDL3\/SDL_pixels.h 1058:5@
+pattern SDL_COLORSPACE_BT601_FULL :: SDL_Colorspace
+pattern SDL_COLORSPACE_BT601_FULL = SDL_Colorspace 571480262
+
+-- | Equivalent to DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709
+--
+--     [C declaration]: @SDL_COLORSPACE_BT709_LIMITED@, defined at @SDL3\/SDL_pixels.h 1066:5@
+pattern SDL_COLORSPACE_BT709_LIMITED :: SDL_Colorspace
+pattern SDL_COLORSPACE_BT709_LIMITED = SDL_Colorspace 554697761
+
+-- | Equivalent to DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P709
+--
+--     [C declaration]: @SDL_COLORSPACE_BT709_FULL@, defined at @SDL3\/SDL_pixels.h 1074:5@
+pattern SDL_COLORSPACE_BT709_FULL :: SDL_Colorspace
+pattern SDL_COLORSPACE_BT709_FULL = SDL_Colorspace 571474977
+
+-- | Equivalent to DXGI_COLOR_SPACE_YCBCR_STUDIO_G22_LEFT_P2020
+--
+--     [C declaration]: @SDL_COLORSPACE_BT2020_LIMITED@, defined at @SDL3\/SDL_pixels.h 1082:5@
+pattern SDL_COLORSPACE_BT2020_LIMITED :: SDL_Colorspace
+pattern SDL_COLORSPACE_BT2020_LIMITED = SDL_Colorspace 554706441
+
+-- | Equivalent to DXGI_COLOR_SPACE_YCBCR_FULL_G22_LEFT_P2020
+--
+--     [C declaration]: @SDL_COLORSPACE_BT2020_FULL@, defined at @SDL3\/SDL_pixels.h 1090:5@
+pattern SDL_COLORSPACE_BT2020_FULL :: SDL_Colorspace
+pattern SDL_COLORSPACE_BT2020_FULL = SDL_Colorspace 571483657
+
+-- | The default colorspace for RGB surfaces if no colorspace is specified
+--
+--     [C declaration]: @SDL_COLORSPACE_RGB_DEFAULT@, defined at @SDL3\/SDL_pixels.h 1098:5@
+pattern SDL_COLORSPACE_RGB_DEFAULT :: SDL_Colorspace
+pattern SDL_COLORSPACE_RGB_DEFAULT = SDL_Colorspace 301991328
+
+-- | The default colorspace for YUV surfaces if no colorspace is specified
+--
+--     [C declaration]: @SDL_COLORSPACE_YUV_DEFAULT@, defined at @SDL3\/SDL_pixels.h 1099:5@
+pattern SDL_COLORSPACE_YUV_DEFAULT :: SDL_Colorspace
+pattern SDL_COLORSPACE_YUV_DEFAULT = SDL_Colorspace 554703046
+
+-- | A structure that represents a color as RGBA components.
+--
+--     The bits of this structure can be directly reinterpreted as an integer-packed color which uses the SDL_PIXELFORMAT_RGBA32 format (SDL_PIXELFORMAT_ABGR8888 on little-endian systems and SDL_PIXELFORMAT_RGBA8888 on big-endian systems).
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_Color@, defined at @SDL3\/SDL_pixels.h 1112:16@
+data SDL_Color = SDL_Color
+  { r :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @r@, defined at @SDL3\/SDL_pixels.h 1114:11@
+  , g :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @g@, defined at @SDL3\/SDL_pixels.h 1115:11@
+  , b :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @b@, defined at @SDL3\/SDL_pixels.h 1116:11@
+  , a :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @a@, defined at @SDL3\/SDL_pixels.h 1117:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_Color where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (1 :: Int)
+
+instance Marshal.ReadRaw SDL_Color where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Color
+        <*> HasCField.readRaw (BG.Proxy @"r") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"g") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"b") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"a") ptr0
+
+instance Marshal.WriteRaw SDL_Color where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Color r2 g3 b4 a5 ->
+            HasCField.writeRaw (BG.Proxy @"r") ptr0 r2
+              >> HasCField.writeRaw (BG.Proxy @"g") ptr0 g3
+              >> HasCField.writeRaw (BG.Proxy @"b") ptr0 b4
+              >> HasCField.writeRaw (BG.Proxy @"a") ptr0 a5
+
+deriving via Marshal.EquivStorable SDL_Color instance BG.Storable SDL_Color
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "r" SDL_Color ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Color
+            { r = y1
+            , g = BG.getField @"g" x0
+            , b = BG.getField @"b" x0
+            , a = BG.getField @"a" x0
+            }
+      , BG.getField @"r" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "r" (BG.Ptr SDL_Color) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"r")
+
+instance HasCField.HasCField SDL_Color "r" where
+  type
+    CFieldType SDL_Color "r" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "g" SDL_Color ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Color
+            { g = y1
+            , r = BG.getField @"r" x0
+            , b = BG.getField @"b" x0
+            , a = BG.getField @"a" x0
+            }
+      , BG.getField @"g" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "g" (BG.Ptr SDL_Color) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"g")
+
+instance HasCField.HasCField SDL_Color "g" where
+  type
+    CFieldType SDL_Color "g" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 1
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "b" SDL_Color ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Color
+            { b = y1
+            , r = BG.getField @"r" x0
+            , g = BG.getField @"g" x0
+            , a = BG.getField @"a" x0
+            }
+      , BG.getField @"b" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "b" (BG.Ptr SDL_Color) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"b")
+
+instance HasCField.HasCField SDL_Color "b" where
+  type
+    CFieldType SDL_Color "b" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 2
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "a" SDL_Color ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Color
+            { a = y1
+            , r = BG.getField @"r" x0
+            , g = BG.getField @"g" x0
+            , b = BG.getField @"b" x0
+            }
+      , BG.getField @"a" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "a" (BG.Ptr SDL_Color) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"a")
+
+instance HasCField.HasCField SDL_Color "a" where
+  type
+    CFieldType SDL_Color "a" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 3
+
+-- | The bits of this structure can be directly reinterpreted as a float-packed color which uses the SDL_PIXELFORMAT_RGBA128_FLOAT format
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_FColor@, defined at @SDL3\/SDL_pixels.h 1126:16@
+data SDL_FColor = SDL_FColor
+  { r :: BG.CFloat
+  -- ^ [C declaration]: @r@, defined at @SDL3\/SDL_pixels.h 1128:11@
+  , g :: BG.CFloat
+  -- ^ [C declaration]: @g@, defined at @SDL3\/SDL_pixels.h 1129:11@
+  , b :: BG.CFloat
+  -- ^ [C declaration]: @b@, defined at @SDL3\/SDL_pixels.h 1130:11@
+  , a :: BG.CFloat
+  -- ^ [C declaration]: @a@, defined at @SDL3\/SDL_pixels.h 1131:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_FColor where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_FColor where
+  readRaw =
+    \ptr0 ->
+      pure SDL_FColor
+        <*> HasCField.readRaw (BG.Proxy @"r") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"g") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"b") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"a") ptr0
+
+instance Marshal.WriteRaw SDL_FColor where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_FColor r2 g3 b4 a5 ->
+            HasCField.writeRaw (BG.Proxy @"r") ptr0 r2
+              >> HasCField.writeRaw (BG.Proxy @"g") ptr0 g3
+              >> HasCField.writeRaw (BG.Proxy @"b") ptr0 b4
+              >> HasCField.writeRaw (BG.Proxy @"a") ptr0 a5
+
+deriving via Marshal.EquivStorable SDL_FColor instance BG.Storable SDL_FColor
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "r" SDL_FColor ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FColor
+            { r = y1
+            , g = BG.getField @"g" x0
+            , b = BG.getField @"b" x0
+            , a = BG.getField @"a" x0
+            }
+      , BG.getField @"r" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "r" (BG.Ptr SDL_FColor) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"r")
+
+instance HasCField.HasCField SDL_FColor "r" where
+  type CFieldType SDL_FColor "r" = BG.CFloat
+
+  offset# = \_ -> \_ -> 0
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "g" SDL_FColor ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FColor
+            { g = y1
+            , r = BG.getField @"r" x0
+            , b = BG.getField @"b" x0
+            , a = BG.getField @"a" x0
+            }
+      , BG.getField @"g" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "g" (BG.Ptr SDL_FColor) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"g")
+
+instance HasCField.HasCField SDL_FColor "g" where
+  type CFieldType SDL_FColor "g" = BG.CFloat
+
+  offset# = \_ -> \_ -> 4
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "b" SDL_FColor ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FColor
+            { b = y1
+            , r = BG.getField @"r" x0
+            , g = BG.getField @"g" x0
+            , a = BG.getField @"a" x0
+            }
+      , BG.getField @"b" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "b" (BG.Ptr SDL_FColor) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"b")
+
+instance HasCField.HasCField SDL_FColor "b" where
+  type CFieldType SDL_FColor "b" = BG.CFloat
+
+  offset# = \_ -> \_ -> 8
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "a" SDL_FColor ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FColor
+            { a = y1
+            , r = BG.getField @"r" x0
+            , g = BG.getField @"g" x0
+            , b = BG.getField @"b" x0
+            }
+      , BG.getField @"a" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "a" (BG.Ptr SDL_FColor) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"a")
+
+instance HasCField.HasCField SDL_FColor "a" where
+  type CFieldType SDL_FColor "a" = BG.CFloat
+
+  offset# = \_ -> \_ -> 12
+
+-- | A set of indexed colors representing a palette.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetPaletteColors'
+--
+--     [C declaration]: @struct SDL_Palette@, defined at @SDL3\/SDL_pixels.h 1141:16@
+data SDL_Palette = SDL_Palette
+  { ncolors :: BG.CInt
+  -- ^ number of elements in @colors@.
+  --
+  --          [C declaration]: @ncolors@, defined at @SDL3\/SDL_pixels.h 1143:9@
+  , colors :: BG.Ptr SDL_Color
+  -- ^ an array of colors, @ncolors@ long.
+  --
+  --          [C declaration]: @colors@, defined at @SDL3\/SDL_pixels.h 1144:16@
+  , version :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ internal use only, do not touch.
+  --
+  --          [C declaration]: @version@, defined at @SDL3\/SDL_pixels.h 1145:12@
+  , refcount :: BG.CInt
+  -- ^ internal use only, do not touch.
+  --
+  --          [C declaration]: @refcount@, defined at @SDL3\/SDL_pixels.h 1146:9@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_Palette where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_Palette where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Palette
+        <*> HasCField.readRaw (BG.Proxy @"ncolors") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"colors") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"version") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"refcount") ptr0
+
+instance Marshal.WriteRaw SDL_Palette where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Palette ncolors2 colors3 version4 refcount5 ->
+            HasCField.writeRaw (BG.Proxy @"ncolors") ptr0 ncolors2
+              >> HasCField.writeRaw (BG.Proxy @"colors") ptr0 colors3
+              >> HasCField.writeRaw (BG.Proxy @"version") ptr0 version4
+              >> HasCField.writeRaw (BG.Proxy @"refcount") ptr0 refcount5
+
+deriving via Marshal.EquivStorable SDL_Palette instance BG.Storable SDL_Palette
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "ncolors" SDL_Palette ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Palette
+            { ncolors = y1
+            , colors = BG.getField @"colors" x0
+            , version = BG.getField @"version" x0
+            , refcount = BG.getField @"refcount" x0
+            }
+      , BG.getField @"ncolors" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "ncolors" (BG.Ptr SDL_Palette) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"ncolors")
+
+instance HasCField.HasCField SDL_Palette "ncolors" where
+  type CFieldType SDL_Palette "ncolors" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.Ptr SDL_Color)
+  => BG.CompatHasField.HasField "colors" SDL_Palette ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Palette
+            { colors = y1
+            , ncolors = BG.getField @"ncolors" x0
+            , version = BG.getField @"version" x0
+            , refcount = BG.getField @"refcount" x0
+            }
+      , BG.getField @"colors" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_Color)
+  => BG.HasField "colors" (BG.Ptr SDL_Palette) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"colors")
+
+instance HasCField.HasCField SDL_Palette "colors" where
+  type
+    CFieldType SDL_Palette "colors" =
+      BG.Ptr SDL_Color
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "version" SDL_Palette ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Palette
+            { version = y1
+            , ncolors = BG.getField @"ncolors" x0
+            , colors = BG.getField @"colors" x0
+            , refcount = BG.getField @"refcount" x0
+            }
+      , BG.getField @"version" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "version" (BG.Ptr SDL_Palette) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"version")
+
+instance HasCField.HasCField SDL_Palette "version" where
+  type
+    CFieldType SDL_Palette "version" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "refcount" SDL_Palette ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Palette
+            { refcount = y1
+            , ncolors = BG.getField @"ncolors" x0
+            , colors = BG.getField @"colors" x0
+            , version = BG.getField @"version" x0
+            }
+      , BG.getField @"refcount" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "refcount" (BG.Ptr SDL_Palette) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"refcount")
+
+instance HasCField.HasCField SDL_Palette "refcount" where
+  type CFieldType SDL_Palette "refcount" = BG.CInt
+
+  offset# = \_ -> \_ -> 20
+
+-- | Details about the format of a pixel.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_PixelFormatDetails@, defined at @SDL3\/SDL_pixels.h 1154:16@
+data SDL_PixelFormatDetails = SDL_PixelFormatDetails
+  { format :: SDL_PixelFormat
+  -- ^ [C declaration]: @format@, defined at @SDL3\/SDL_pixels.h 1156:21@
+  , bits_per_pixel :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @bits_per_pixel@, defined at @SDL3\/SDL_pixels.h 1157:11@
+  , bytes_per_pixel :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @bytes_per_pixel@, defined at @SDL3\/SDL_pixels.h 1158:11@
+  , padding :: CA.ConstantArray 2 SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @padding@, defined at @SDL3\/SDL_pixels.h 1159:11@
+  , rmask :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @Rmask@, defined at @SDL3\/SDL_pixels.h 1160:12@
+  , gmask :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @Gmask@, defined at @SDL3\/SDL_pixels.h 1161:12@
+  , bmask :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @Bmask@, defined at @SDL3\/SDL_pixels.h 1162:12@
+  , amask :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @Amask@, defined at @SDL3\/SDL_pixels.h 1163:12@
+  , rbits :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @Rbits@, defined at @SDL3\/SDL_pixels.h 1164:11@
+  , gbits :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @Gbits@, defined at @SDL3\/SDL_pixels.h 1165:11@
+  , bbits :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @Bbits@, defined at @SDL3\/SDL_pixels.h 1166:11@
+  , abits :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @Abits@, defined at @SDL3\/SDL_pixels.h 1167:11@
+  , rshift :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @Rshift@, defined at @SDL3\/SDL_pixels.h 1168:11@
+  , gshift :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @Gshift@, defined at @SDL3\/SDL_pixels.h 1169:11@
+  , bshift :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @Bshift@, defined at @SDL3\/SDL_pixels.h 1170:11@
+  , ashift :: SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^ [C declaration]: @Ashift@, defined at @SDL3\/SDL_pixels.h 1171:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_PixelFormatDetails where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_PixelFormatDetails where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PixelFormatDetails
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"bits_per_pixel") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"bytes_per_pixel") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"padding") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"rmask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"gmask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"bmask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"amask") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"rbits") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"gbits") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"bbits") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"abits") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"rshift") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"gshift") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"bshift") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"ashift") ptr0
+
+instance Marshal.WriteRaw SDL_PixelFormatDetails where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PixelFormatDetails
+            format2
+            bits_per_pixel3
+            bytes_per_pixel4
+            padding5
+            rmask6
+            gmask7
+            bmask8
+            amask9
+            rbits10
+            gbits11
+            bbits12
+            abits13
+            rshift14
+            gshift15
+            bshift16
+            ashift17 ->
+              HasCField.writeRaw (BG.Proxy @"format") ptr0 format2
+                >> HasCField.writeRaw (BG.Proxy @"bits_per_pixel") ptr0 bits_per_pixel3
+                >> HasCField.writeRaw (BG.Proxy @"bytes_per_pixel") ptr0 bytes_per_pixel4
+                >> HasCField.writeRaw (BG.Proxy @"padding") ptr0 padding5
+                >> HasCField.writeRaw (BG.Proxy @"rmask") ptr0 rmask6
+                >> HasCField.writeRaw (BG.Proxy @"gmask") ptr0 gmask7
+                >> HasCField.writeRaw (BG.Proxy @"bmask") ptr0 bmask8
+                >> HasCField.writeRaw (BG.Proxy @"amask") ptr0 amask9
+                >> HasCField.writeRaw (BG.Proxy @"rbits") ptr0 rbits10
+                >> HasCField.writeRaw (BG.Proxy @"gbits") ptr0 gbits11
+                >> HasCField.writeRaw (BG.Proxy @"bbits") ptr0 bbits12
+                >> HasCField.writeRaw (BG.Proxy @"abits") ptr0 abits13
+                >> HasCField.writeRaw (BG.Proxy @"rshift") ptr0 rshift14
+                >> HasCField.writeRaw (BG.Proxy @"gshift") ptr0 gshift15
+                >> HasCField.writeRaw (BG.Proxy @"bshift") ptr0 bshift16
+                >> HasCField.writeRaw (BG.Proxy @"ashift") ptr0 ashift17
+
+deriving via
+  Marshal.EquivStorable SDL_PixelFormatDetails
+  instance
+    BG.Storable SDL_PixelFormatDetails
+
+instance
+  (ty ~ SDL_PixelFormat)
+  => BG.CompatHasField.HasField "format" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { format = y1
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL_PixelFormat)
+  => BG.HasField "format" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "format" where
+  type
+    CFieldType SDL_PixelFormatDetails "format" =
+      SDL_PixelFormat
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "bits_per_pixel" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { bits_per_pixel = y1
+            , format = BG.getField @"format" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"bits_per_pixel" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "bits_per_pixel" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"bits_per_pixel")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "bits_per_pixel" where
+  type
+    CFieldType SDL_PixelFormatDetails "bits_per_pixel" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "bytes_per_pixel" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { bytes_per_pixel = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"bytes_per_pixel" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "bytes_per_pixel" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"bytes_per_pixel")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "bytes_per_pixel" where
+  type
+    CFieldType SDL_PixelFormatDetails "bytes_per_pixel" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 5
+
+instance
+  (ty ~ CA.ConstantArray 2 SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "padding" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { padding = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"padding" x0
+      )
+
+instance
+  (ty ~ CA.ConstantArray 2 SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "padding" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"padding")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "padding" where
+  type
+    CFieldType SDL_PixelFormatDetails "padding" =
+      CA.ConstantArray 2 SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 6
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "rmask" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { rmask = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"rmask" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "rmask" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"rmask")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "rmask" where
+  type
+    CFieldType SDL_PixelFormatDetails "rmask" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "gmask" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { gmask = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"gmask" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "gmask" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"gmask")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "gmask" where
+  type
+    CFieldType SDL_PixelFormatDetails "gmask" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "bmask" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { bmask = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"bmask" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "bmask" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"bmask")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "bmask" where
+  type
+    CFieldType SDL_PixelFormatDetails "bmask" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "amask" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { amask = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"amask" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "amask" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"amask")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "amask" where
+  type
+    CFieldType SDL_PixelFormatDetails "amask" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "rbits" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { rbits = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"rbits" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "rbits" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"rbits")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "rbits" where
+  type
+    CFieldType SDL_PixelFormatDetails "rbits" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "gbits" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { gbits = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"gbits" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "gbits" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"gbits")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "gbits" where
+  type
+    CFieldType SDL_PixelFormatDetails "gbits" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 25
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "bbits" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { bbits = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"bbits" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "bbits" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"bbits")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "bbits" where
+  type
+    CFieldType SDL_PixelFormatDetails "bbits" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 26
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "abits" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { abits = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"abits" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "abits" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"abits")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "abits" where
+  type
+    CFieldType SDL_PixelFormatDetails "abits" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 27
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "rshift" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { rshift = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"rshift" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "rshift" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"rshift")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "rshift" where
+  type
+    CFieldType SDL_PixelFormatDetails "rshift" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "gshift" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { gshift = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , bshift = BG.getField @"bshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"gshift" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "gshift" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"gshift")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "gshift" where
+  type
+    CFieldType SDL_PixelFormatDetails "gshift" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 29
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "bshift" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { bshift = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , ashift = BG.getField @"ashift" x0
+            }
+      , BG.getField @"bshift" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "bshift" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"bshift")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "bshift" where
+  type
+    CFieldType SDL_PixelFormatDetails "bshift" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 30
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.CompatHasField.HasField "ashift" SDL_PixelFormatDetails ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PixelFormatDetails
+            { ashift = y1
+            , format = BG.getField @"format" x0
+            , bits_per_pixel = BG.getField @"bits_per_pixel" x0
+            , bytes_per_pixel = BG.getField @"bytes_per_pixel" x0
+            , padding = BG.getField @"padding" x0
+            , rmask = BG.getField @"rmask" x0
+            , gmask = BG.getField @"gmask" x0
+            , bmask = BG.getField @"bmask" x0
+            , amask = BG.getField @"amask" x0
+            , rbits = BG.getField @"rbits" x0
+            , gbits = BG.getField @"gbits" x0
+            , bbits = BG.getField @"bbits" x0
+            , abits = BG.getField @"abits" x0
+            , rshift = BG.getField @"rshift" x0
+            , gshift = BG.getField @"gshift" x0
+            , bshift = BG.getField @"bshift" x0
+            }
+      , BG.getField @"ashift" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint8)
+  => BG.HasField "ashift" (BG.Ptr SDL_PixelFormatDetails) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"ashift")
+
+instance HasCField.HasCField SDL_PixelFormatDetails "ashift" where
+  type
+    CFieldType SDL_PixelFormatDetails "ashift" =
+      SDL3.Sys.Bindgen.Stdinc.Uint8
+
+  offset# = \_ -> \_ -> 31
diff --git a/src/SDL3/Sys/Bindgen/Pixels/FunPtr.hs b/src/SDL3/Sys/Bindgen/Pixels/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Pixels/FunPtr.hs
@@ -0,0 +1,673 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Pixels.FunPtr (
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_GetPixelFormatName,
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_GetMasksForPixelFormat,
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_GetPixelFormatForMasks,
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_GetPixelFormatDetails,
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_CreatePalette,
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_SetPaletteColors,
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_DestroyPalette,
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_MapRGB,
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_MapRGBA,
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_GetRGB,
+  SDL3.Sys.Bindgen.Pixels.FunPtr.sDL_GetRGBA,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Pixels
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_pixels.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetPixelFormatName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_eb0ec2b0946d454a (void)) ("
+         , "  SDL_PixelFormat arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetPixelFormatName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetMasksForPixelFormat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f958323c6387c975 (void)) ("
+         , "  SDL_PixelFormat arg1,"
+         , "  signed int *arg2,"
+         , "  Uint32 *arg3,"
+         , "  Uint32 *arg4,"
+         , "  Uint32 *arg5,"
+         , "  Uint32 *arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_GetMasksForPixelFormat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetPixelFormatForMasks */"
+         , "__attribute__ ((const))"
+         , "SDL_PixelFormat (*hs_bindgen_e5bd7b32ad9023dc (void)) ("
+         , "  signed int arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_GetPixelFormatForMasks;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetPixelFormatDetails */"
+         , "__attribute__ ((const))"
+         , "SDL_PixelFormatDetails const *(*hs_bindgen_b5dfc5cc5c17c070 (void)) ("
+         , "  SDL_PixelFormat arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetPixelFormatDetails;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_CreatePalette */"
+         , "__attribute__ ((const))"
+         , "SDL_Palette *(*hs_bindgen_27546d5c6729ae26 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreatePalette;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_SetPaletteColors */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_34f70d79b2ac1637 (void)) ("
+         , "  SDL_Palette *arg1,"
+         , "  SDL_Color const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetPaletteColors;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_DestroyPalette */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_51f2b11ef08b8f0d (void)) ("
+         , "  SDL_Palette *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyPalette;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_MapRGB */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_71913f7d8c1eefe0 (void)) ("
+         , "  SDL_PixelFormatDetails const *arg1,"
+         , "  SDL_Palette const *arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_MapRGB;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_MapRGBA */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_357ad77f90e40db5 (void)) ("
+         , "  SDL_PixelFormatDetails const *arg1,"
+         , "  SDL_Palette const *arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5,"
+         , "  Uint8 arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_MapRGBA;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetRGB */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_b718a2f4b5ae6cf0 (void)) ("
+         , "  Uint32 arg1,"
+         , "  SDL_PixelFormatDetails const *arg2,"
+         , "  SDL_Palette const *arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5,"
+         , "  Uint8 *arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRGB;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetRGBA */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_9f1939763a4ba969 (void)) ("
+         , "  Uint32 arg1,"
+         , "  SDL_PixelFormatDetails const *arg2,"
+         , "  SDL_Palette const *arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5,"
+         , "  Uint8 *arg6,"
+         , "  Uint8 *arg7"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRGBA;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetPixelFormatName@
+foreign import ccall unsafe "hs_bindgen_eb0ec2b0946d454a"
+  hs_bindgen_eb0ec2b0946d454a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetPixelFormatName@
+hs_bindgen_eb0ec2b0946d454a :: IO (BG.FunPtr (SDL_PixelFormat -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_eb0ec2b0946d454a =
+  BG.fromFFIType hs_bindgen_eb0ec2b0946d454a_base
+
+{-# NOINLINE sDL_GetPixelFormatName #-}
+
+-- | Get the human readable name of a pixel format.
+--
+--     [@format@]: the pixel format to query.
+--
+--     [Returns]: the human readable name of the specified pixel format or \"SDL_PIXELFORMAT_UNKNOWN\" if the format isn\'t recognized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPixelFormatName@, defined at @SDL3\/SDL_pixels.h 1185:42@
+sDL_GetPixelFormatName :: BG.FunPtr (SDL_PixelFormat -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetPixelFormatName =
+  BG.unsafePerformIO hs_bindgen_eb0ec2b0946d454a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetMasksForPixelFormat@
+foreign import ccall unsafe "hs_bindgen_f958323c6387c975"
+  hs_bindgen_f958323c6387c975_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetMasksForPixelFormat@
+hs_bindgen_f958323c6387c975
+  :: IO
+       ( BG.FunPtr
+           ( SDL_PixelFormat
+             -> BG.Ptr BG.CInt
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_f958323c6387c975 =
+  BG.fromFFIType hs_bindgen_f958323c6387c975_base
+
+{-# NOINLINE sDL_GetMasksForPixelFormat #-}
+
+-- | Convert one of the enumerated pixel formats to a bpp value and RGBA masks.
+--
+--     [@format@]: one of the 'SDL_PixelFormat' values.
+--
+--     [@bpp@]: a bits per pixel value; usually 15, 16, or 32.
+--
+--     [@Rmask@]: a pointer filled in with the red mask for the format.
+--
+--     [@Gmask@]: a pointer filled in with the green mask for the format.
+--
+--     [@Bmask@]: a pointer filled in with the blue mask for the format.
+--
+--     [@Amask@]: a pointer filled in with the alpha mask for the format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatForMasks'
+--
+--     [C declaration]: @SDL_GetMasksForPixelFormat@, defined at @SDL3\/SDL_pixels.h 1205:34@
+sDL_GetMasksForPixelFormat
+  :: BG.FunPtr
+       ( SDL_PixelFormat
+         -> BG.Ptr BG.CInt
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_GetMasksForPixelFormat =
+  BG.unsafePerformIO hs_bindgen_f958323c6387c975
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetPixelFormatForMasks@
+foreign import ccall unsafe "hs_bindgen_e5bd7b32ad9023dc"
+  hs_bindgen_e5bd7b32ad9023dc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetPixelFormatForMasks@
+hs_bindgen_e5bd7b32ad9023dc
+  :: IO
+       ( BG.FunPtr
+           ( BG.CInt
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO SDL_PixelFormat
+           )
+       )
+hs_bindgen_e5bd7b32ad9023dc =
+  BG.fromFFIType hs_bindgen_e5bd7b32ad9023dc_base
+
+{-# NOINLINE sDL_GetPixelFormatForMasks #-}
+
+-- | Convert a bpp value and RGBA masks to an enumerated pixel format.
+--
+--     This will return @SDL_PIXELFORMAT_UNKNOWN@ if the conversion wasn\'t possible.
+--
+--     [@bpp@]: a bits per pixel value; usually 15, 16, or 32.
+--
+--     [@Rmask@]: the red mask for the format.
+--
+--     [@Gmask@]: the green mask for the format.
+--
+--     [@Bmask@]: the blue mask for the format.
+--
+--     [@Amask@]: the alpha mask for the format.
+--
+--     [Returns]: the 'SDL_PixelFormat' value corresponding to the format masks, or SDL_PIXELFORMAT_UNKNOWN if there isn\'t a match.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMasksForPixelFormat'
+--
+--     [C declaration]: @SDL_GetPixelFormatForMasks@, defined at @SDL3\/SDL_pixels.h 1227:45@
+sDL_GetPixelFormatForMasks
+  :: BG.FunPtr
+       ( BG.CInt
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO SDL_PixelFormat
+       )
+sDL_GetPixelFormatForMasks =
+  BG.unsafePerformIO hs_bindgen_e5bd7b32ad9023dc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetPixelFormatDetails@
+foreign import ccall unsafe "hs_bindgen_b5dfc5cc5c17c070"
+  hs_bindgen_b5dfc5cc5c17c070_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetPixelFormatDetails@
+hs_bindgen_b5dfc5cc5c17c070
+  :: IO (BG.FunPtr (SDL_PixelFormat -> IO (PtrConst.PtrConst SDL_PixelFormatDetails)))
+hs_bindgen_b5dfc5cc5c17c070 =
+  BG.fromFFIType hs_bindgen_b5dfc5cc5c17c070_base
+
+{-# NOINLINE sDL_GetPixelFormatDetails #-}
+
+-- | Create an 'SDL_PixelFormatDetails' structure corresponding to a pixel format.
+--
+--     Returned structure may come from a shared global cache (i.e. not newly allocated), and hence should not be modified, especially the palette. Weird errors such as @Blit combination not supported@ may occur.
+--
+--     [@format@]: one of the 'SDL_PixelFormat' values.
+--
+--     [Returns]: a pointer to a 'SDL_PixelFormatDetails' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPixelFormatDetails@, defined at @SDL3\/SDL_pixels.h 1244:60@
+sDL_GetPixelFormatDetails
+  :: BG.FunPtr (SDL_PixelFormat -> IO (PtrConst.PtrConst SDL_PixelFormatDetails))
+sDL_GetPixelFormatDetails =
+  BG.unsafePerformIO hs_bindgen_b5dfc5cc5c17c070
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_CreatePalette@
+foreign import ccall unsafe "hs_bindgen_27546d5c6729ae26"
+  hs_bindgen_27546d5c6729ae26_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_CreatePalette@
+hs_bindgen_27546d5c6729ae26 :: IO (BG.FunPtr (BG.CInt -> IO (BG.Ptr SDL_Palette)))
+hs_bindgen_27546d5c6729ae26 =
+  BG.fromFFIType hs_bindgen_27546d5c6729ae26_base
+
+{-# NOINLINE sDL_CreatePalette #-}
+
+-- | Create a palette structure with the specified number of color entries.
+--
+--     The palette entries are initialized to white.
+--
+--     [@ncolors@]: represents the number of color entries in the color palette.
+--
+--     [Returns]: a new 'SDL_Palette' structure on success or NULL on failure (e.g. if there wasn\'t enough memory); call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyPalette', 'sDL_SetPaletteColors', SDL_SetSurfacePalette
+--
+--     [C declaration]: @SDL_CreatePalette@, defined at @SDL3\/SDL_pixels.h 1264:43@
+sDL_CreatePalette :: BG.FunPtr (BG.CInt -> IO (BG.Ptr SDL_Palette))
+sDL_CreatePalette =
+  BG.unsafePerformIO hs_bindgen_27546d5c6729ae26
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_SetPaletteColors@
+foreign import ccall unsafe "hs_bindgen_34f70d79b2ac1637"
+  hs_bindgen_34f70d79b2ac1637_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_SetPaletteColors@
+hs_bindgen_34f70d79b2ac1637
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Palette -> PtrConst.PtrConst SDL_Color -> BG.CInt -> BG.CInt -> IO BG.CBool))
+hs_bindgen_34f70d79b2ac1637 =
+  BG.fromFFIType hs_bindgen_34f70d79b2ac1637_base
+
+{-# NOINLINE sDL_SetPaletteColors #-}
+
+-- | Set a range of colors in a palette.
+--
+--     [@palette@]: the 'SDL_Palette' structure to modify.
+--
+--     [@colors@]: an array of 'SDL_Color' structures to copy into the palette.
+--
+--     [@firstcolor@]: the index of the first palette entry to modify.
+--
+--     [@ncolors@]: the number of entries to modify.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified or destroyed in another thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetPaletteColors@, defined at @SDL3\/SDL_pixels.h 1281:34@
+sDL_SetPaletteColors
+  :: BG.FunPtr (BG.Ptr SDL_Palette -> PtrConst.PtrConst SDL_Color -> BG.CInt -> BG.CInt -> IO BG.CBool)
+sDL_SetPaletteColors =
+  BG.unsafePerformIO hs_bindgen_34f70d79b2ac1637
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_DestroyPalette@
+foreign import ccall unsafe "hs_bindgen_51f2b11ef08b8f0d"
+  hs_bindgen_51f2b11ef08b8f0d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_DestroyPalette@
+hs_bindgen_51f2b11ef08b8f0d :: IO (BG.FunPtr (BG.Ptr SDL_Palette -> IO ()))
+hs_bindgen_51f2b11ef08b8f0d =
+  BG.fromFFIType hs_bindgen_51f2b11ef08b8f0d_base
+
+{-# NOINLINE sDL_DestroyPalette #-}
+
+-- | Free a palette created with @SDL_CreatePalette()@.
+--
+--     [@palette@]: the 'SDL_Palette' structure to be freed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified or destroyed in another thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreatePalette'
+--
+--     [C declaration]: @SDL_DestroyPalette@, defined at @SDL3\/SDL_pixels.h 1295:34@
+sDL_DestroyPalette :: BG.FunPtr (BG.Ptr SDL_Palette -> IO ())
+sDL_DestroyPalette =
+  BG.unsafePerformIO hs_bindgen_51f2b11ef08b8f0d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_MapRGB@
+foreign import ccall unsafe "hs_bindgen_71913f7d8c1eefe0"
+  hs_bindgen_71913f7d8c1eefe0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_MapRGB@
+hs_bindgen_71913f7d8c1eefe0
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst SDL_PixelFormatDetails
+             -> PtrConst.PtrConst SDL_Palette
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+           )
+       )
+hs_bindgen_71913f7d8c1eefe0 =
+  BG.fromFFIType hs_bindgen_71913f7d8c1eefe0_base
+
+{-# NOINLINE sDL_MapRGB #-}
+
+-- | Map an RGB triple to an opaque pixel value for a given pixel format.
+--
+--     This function maps the RGB color value to the specified pixel format and returns the pixel value best approximating the given RGB color value for the given pixel format.
+--
+--     If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.
+--
+--     If the specified pixel format has an alpha component it will be returned as all 1 bits (fully opaque).
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+--
+--     [@palette@]: an optional palette for indexed formats, may be NULL.
+--
+--     [@r@]: the red component of the pixel in the range 0-255.
+--
+--     [@g@]: the green component of the pixel in the range 0-255.
+--
+--     [@b@]: the blue component of the pixel in the range 0-255.
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGB', 'sDL_MapRGBA', SDL_MapSurfaceRGB
+--
+--     [C declaration]: @SDL_MapRGB@, defined at @SDL3\/SDL_pixels.h 1333:36@
+sDL_MapRGB
+  :: BG.FunPtr
+       ( PtrConst.PtrConst SDL_PixelFormatDetails
+         -> PtrConst.PtrConst SDL_Palette
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+       )
+sDL_MapRGB =
+  BG.unsafePerformIO hs_bindgen_71913f7d8c1eefe0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_MapRGBA@
+foreign import ccall unsafe "hs_bindgen_357ad77f90e40db5"
+  hs_bindgen_357ad77f90e40db5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_MapRGBA@
+hs_bindgen_357ad77f90e40db5
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst SDL_PixelFormatDetails
+             -> PtrConst.PtrConst SDL_Palette
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+           )
+       )
+hs_bindgen_357ad77f90e40db5 =
+  BG.fromFFIType hs_bindgen_357ad77f90e40db5_base
+
+{-# NOINLINE sDL_MapRGBA #-}
+
+-- | Map an RGBA quadruple to a pixel value for a given pixel format.
+--
+--     This function maps the RGBA color value to the specified pixel format and returns the pixel value best approximating the given RGBA color value for the given pixel format.
+--
+--     If the specified pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).
+--
+--     If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+--
+--     [@palette@]: an optional palette for indexed formats, may be NULL.
+--
+--     [@r@]: the red component of the pixel in the range 0-255.
+--
+--     [@g@]: the green component of the pixel in the range 0-255.
+--
+--     [@b@]: the blue component of the pixel in the range 0-255.
+--
+--     [@a@]: the alpha component of the pixel in the range 0-255.
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGBA', 'sDL_MapRGB', SDL_MapSurfaceRGBA
+--
+--     [C declaration]: @SDL_MapRGBA@, defined at @SDL3\/SDL_pixels.h 1372:36@
+sDL_MapRGBA
+  :: BG.FunPtr
+       ( PtrConst.PtrConst SDL_PixelFormatDetails
+         -> PtrConst.PtrConst SDL_Palette
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+       )
+sDL_MapRGBA =
+  BG.unsafePerformIO hs_bindgen_357ad77f90e40db5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetRGB@
+foreign import ccall unsafe "hs_bindgen_b718a2f4b5ae6cf0"
+  hs_bindgen_b718a2f4b5ae6cf0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetRGB@
+hs_bindgen_b718a2f4b5ae6cf0
+  :: IO
+       ( BG.FunPtr
+           ( SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst SDL_PixelFormatDetails
+             -> PtrConst.PtrConst SDL_Palette
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO ()
+           )
+       )
+hs_bindgen_b718a2f4b5ae6cf0 =
+  BG.fromFFIType hs_bindgen_b718a2f4b5ae6cf0_base
+
+{-# NOINLINE sDL_GetRGB #-}
+
+-- | Get RGB values from a pixel in the specified format.
+--
+--     This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).
+--
+--     [@pixelvalue@]: a pixel value.
+--
+--     [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+--
+--     [@palette@]: an optional palette for indexed formats, may be NULL.
+--
+--     [@r@]: a pointer filled in with the red component, may be NULL.
+--
+--     [@g@]: a pointer filled in with the green component, may be NULL.
+--
+--     [@b@]: a pointer filled in with the blue component, may be NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGBA', 'sDL_MapRGB', 'sDL_MapRGBA'
+--
+--     [C declaration]: @SDL_GetRGB@, defined at @SDL3\/SDL_pixels.h 1400:34@
+sDL_GetRGB
+  :: BG.FunPtr
+       ( SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst SDL_PixelFormatDetails
+         -> PtrConst.PtrConst SDL_Palette
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO ()
+       )
+sDL_GetRGB =
+  BG.unsafePerformIO hs_bindgen_b718a2f4b5ae6cf0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetRGBA@
+foreign import ccall unsafe "hs_bindgen_9f1939763a4ba969"
+  hs_bindgen_9f1939763a4ba969_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_get_SDL_GetRGBA@
+hs_bindgen_9f1939763a4ba969
+  :: IO
+       ( BG.FunPtr
+           ( SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst SDL_PixelFormatDetails
+             -> PtrConst.PtrConst SDL_Palette
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO ()
+           )
+       )
+hs_bindgen_9f1939763a4ba969 =
+  BG.fromFFIType hs_bindgen_9f1939763a4ba969_base
+
+{-# NOINLINE sDL_GetRGBA #-}
+
+-- | Get RGBA values from a pixel in the specified format.
+--
+--     This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).
+--
+--     If the surface has no alpha component, the alpha will be returned as 0xff (100% opaque).
+--
+--     [@pixelvalue@]: a pixel value.
+--
+--     [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+--
+--     [@palette@]: an optional palette for indexed formats, may be NULL.
+--
+--     [@r@]: a pointer filled in with the red component, may be NULL.
+--
+--     [@g@]: a pointer filled in with the green component, may be NULL.
+--
+--     [@b@]: a pointer filled in with the blue component, may be NULL.
+--
+--     [@a@]: a pointer filled in with the alpha component, may be NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGB', 'sDL_MapRGB', 'sDL_MapRGBA'
+--
+--     [C declaration]: @SDL_GetRGBA@, defined at @SDL3\/SDL_pixels.h 1432:34@
+sDL_GetRGBA
+  :: BG.FunPtr
+       ( SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst SDL_PixelFormatDetails
+         -> PtrConst.PtrConst SDL_Palette
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO ()
+       )
+sDL_GetRGBA =
+  BG.unsafePerformIO hs_bindgen_9f1939763a4ba969
diff --git a/src/SDL3/Sys/Bindgen/Pixels/Safe.hs b/src/SDL3/Sys/Bindgen/Pixels/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Pixels/Safe.hs
@@ -0,0 +1,692 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Pixels.Safe (
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_GetPixelFormatName,
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_GetMasksForPixelFormat,
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_GetPixelFormatForMasks,
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_GetPixelFormatDetails,
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_CreatePalette,
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_SetPaletteColors,
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_DestroyPalette,
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_MapRGB,
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_MapRGBA,
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_GetRGB,
+  SDL3.Sys.Bindgen.Pixels.Safe.sDL_GetRGBA,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Pixels
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_pixels.h>"
+         , "char const *hs_bindgen_2b62d5600ae602f5 ("
+         , "  SDL_PixelFormat arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPixelFormatName)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_29ba238b8cb85c9d ("
+         , "  SDL_PixelFormat arg1,"
+         , "  signed int *arg2,"
+         , "  Uint32 *arg3,"
+         , "  Uint32 *arg4,"
+         , "  Uint32 *arg5,"
+         , "  Uint32 *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMasksForPixelFormat)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "SDL_PixelFormat hs_bindgen_34711b04d6421f67 ("
+         , "  signed int arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPixelFormatForMasks)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "SDL_PixelFormatDetails const *hs_bindgen_4112185e47f9577f ("
+         , "  SDL_PixelFormat arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPixelFormatDetails)(arg1);"
+         , "}"
+         , "SDL_Palette *hs_bindgen_4619b4a327b9cf94 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreatePalette)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_e629f58dcd1a6db5 ("
+         , "  SDL_Palette *arg1,"
+         , "  SDL_Color const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetPaletteColors)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_e593348e8aff0b78 ("
+         , "  SDL_Palette *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyPalette)(arg1);"
+         , "}"
+         , "Uint32 hs_bindgen_37bc20a6b313ac41 ("
+         , "  SDL_PixelFormatDetails const *arg1,"
+         , "  SDL_Palette const *arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_MapRGB)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "Uint32 hs_bindgen_3fecde9ee209df97 ("
+         , "  SDL_PixelFormatDetails const *arg1,"
+         , "  SDL_Palette const *arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5,"
+         , "  Uint8 arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_MapRGBA)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "void hs_bindgen_da0c576777e026d9 ("
+         , "  Uint32 arg1,"
+         , "  SDL_PixelFormatDetails const *arg2,"
+         , "  SDL_Palette const *arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5,"
+         , "  Uint8 *arg6"
+         , ")"
+         , "{"
+         , "  (SDL_GetRGB)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "void hs_bindgen_9ace50541bcd4e41 ("
+         , "  Uint32 arg1,"
+         , "  SDL_PixelFormatDetails const *arg2,"
+         , "  SDL_Palette const *arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5,"
+         , "  Uint8 *arg6,"
+         , "  Uint8 *arg7"
+         , ")"
+         , "{"
+         , "  (SDL_GetRGBA)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetPixelFormatName@
+foreign import ccall safe "hs_bindgen_2b62d5600ae602f5"
+  hs_bindgen_2b62d5600ae602f5_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetPixelFormatName@
+hs_bindgen_2b62d5600ae602f5
+  :: SDL_PixelFormat
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_2b62d5600ae602f5 =
+  BG.fromFFIType hs_bindgen_2b62d5600ae602f5_base
+
+-- | Get the human readable name of a pixel format.
+--
+--     [Returns]: the human readable name of the specified pixel format or \"SDL_PIXELFORMAT_UNKNOWN\" if the format isn\'t recognized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPixelFormatName@, defined at @SDL3\/SDL_pixels.h 1185:42@
+sDL_GetPixelFormatName
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the pixel format to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetPixelFormatName = hs_bindgen_2b62d5600ae602f5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetMasksForPixelFormat@
+foreign import ccall safe "hs_bindgen_29ba238b8cb85c9d"
+  hs_bindgen_29ba238b8cb85c9d_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetMasksForPixelFormat@
+hs_bindgen_29ba238b8cb85c9d
+  :: SDL_PixelFormat
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_29ba238b8cb85c9d =
+  BG.fromFFIType hs_bindgen_29ba238b8cb85c9d_base
+
+-- | Convert one of the enumerated pixel formats to a bpp value and RGBA masks.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatForMasks'
+--
+--     [C declaration]: @SDL_GetMasksForPixelFormat@, defined at @SDL3\/SDL_pixels.h 1205:34@
+sDL_GetMasksForPixelFormat
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the 'SDL_PixelFormat' values.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@bpp@]: a bits per pixel value; usually 15, 16, or 32.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Rmask@]: a pointer filled in with the red mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Gmask@]: a pointer filled in with the green mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Bmask@]: a pointer filled in with the blue mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Amask@]: a pointer filled in with the alpha mask for the format.
+  -> IO BG.CBool
+sDL_GetMasksForPixelFormat =
+  hs_bindgen_29ba238b8cb85c9d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetPixelFormatForMasks@
+foreign import ccall safe "hs_bindgen_34711b04d6421f67"
+  hs_bindgen_34711b04d6421f67_base
+    :: BG.Int32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetPixelFormatForMasks@
+hs_bindgen_34711b04d6421f67
+  :: BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO SDL_PixelFormat
+hs_bindgen_34711b04d6421f67 =
+  BG.fromFFIType hs_bindgen_34711b04d6421f67_base
+
+-- | Convert a bpp value and RGBA masks to an enumerated pixel format.
+--
+--     This will return @SDL_PIXELFORMAT_UNKNOWN@ if the conversion wasn\'t possible.
+--
+--     [Returns]: the 'SDL_PixelFormat' value corresponding to the format masks, or SDL_PIXELFORMAT_UNKNOWN if there isn\'t a match.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMasksForPixelFormat'
+--
+--     [C declaration]: @SDL_GetPixelFormatForMasks@, defined at @SDL3\/SDL_pixels.h 1227:45@
+sDL_GetPixelFormatForMasks
+  :: BG.CInt
+  -- ^
+  --
+  --           [@bpp@]: a bits per pixel value; usually 15, 16, or 32.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Rmask@]: the red mask for the format.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Gmask@]: the green mask for the format.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Bmask@]: the blue mask for the format.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Amask@]: the alpha mask for the format.
+  -> IO SDL_PixelFormat
+sDL_GetPixelFormatForMasks =
+  hs_bindgen_34711b04d6421f67
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetPixelFormatDetails@
+foreign import ccall safe "hs_bindgen_4112185e47f9577f"
+  hs_bindgen_4112185e47f9577f_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetPixelFormatDetails@
+hs_bindgen_4112185e47f9577f
+  :: SDL_PixelFormat
+  -> IO (PtrConst.PtrConst SDL_PixelFormatDetails)
+hs_bindgen_4112185e47f9577f =
+  BG.fromFFIType hs_bindgen_4112185e47f9577f_base
+
+-- | Create an 'SDL_PixelFormatDetails' structure corresponding to a pixel format.
+--
+--     Returned structure may come from a shared global cache (i.e. not newly allocated), and hence should not be modified, especially the palette. Weird errors such as @Blit combination not supported@ may occur.
+--
+--     [Returns]: a pointer to a 'SDL_PixelFormatDetails' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPixelFormatDetails@, defined at @SDL3\/SDL_pixels.h 1244:60@
+sDL_GetPixelFormatDetails
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the 'SDL_PixelFormat' values.
+  -> IO (PtrConst.PtrConst SDL_PixelFormatDetails)
+sDL_GetPixelFormatDetails =
+  hs_bindgen_4112185e47f9577f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_CreatePalette@
+foreign import ccall safe "hs_bindgen_4619b4a327b9cf94"
+  hs_bindgen_4619b4a327b9cf94_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_CreatePalette@
+hs_bindgen_4619b4a327b9cf94
+  :: BG.CInt
+  -> IO (BG.Ptr SDL_Palette)
+hs_bindgen_4619b4a327b9cf94 =
+  BG.fromFFIType hs_bindgen_4619b4a327b9cf94_base
+
+-- | Create a palette structure with the specified number of color entries.
+--
+--     The palette entries are initialized to white.
+--
+--     [Returns]: a new 'SDL_Palette' structure on success or NULL on failure (e.g. if there wasn\'t enough memory); call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyPalette', 'sDL_SetPaletteColors', SDL_SetSurfacePalette
+--
+--     [C declaration]: @SDL_CreatePalette@, defined at @SDL3\/SDL_pixels.h 1264:43@
+sDL_CreatePalette
+  :: BG.CInt
+  -- ^
+  --
+  --           [@ncolors@]: represents the number of color entries in the color palette.
+  -> IO (BG.Ptr SDL_Palette)
+sDL_CreatePalette = hs_bindgen_4619b4a327b9cf94
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_SetPaletteColors@
+foreign import ccall safe "hs_bindgen_e629f58dcd1a6db5"
+  hs_bindgen_e629f58dcd1a6db5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_SetPaletteColors@
+hs_bindgen_e629f58dcd1a6db5
+  :: BG.Ptr SDL_Palette
+  -> PtrConst.PtrConst SDL_Color
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_e629f58dcd1a6db5 =
+  BG.fromFFIType hs_bindgen_e629f58dcd1a6db5_base
+
+-- | Set a range of colors in a palette.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified or destroyed in another thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetPaletteColors@, defined at @SDL3\/SDL_pixels.h 1281:34@
+sDL_SetPaletteColors
+  :: BG.Ptr SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the 'SDL_Palette' structure to modify.
+  -> PtrConst.PtrConst SDL_Color
+  -- ^
+  --
+  --           [@colors@]: an array of 'SDL_Color' structures to copy into the palette.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@firstcolor@]: the index of the first palette entry to modify.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@ncolors@]: the number of entries to modify.
+  -> IO BG.CBool
+sDL_SetPaletteColors = hs_bindgen_e629f58dcd1a6db5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_DestroyPalette@
+foreign import ccall safe "hs_bindgen_e593348e8aff0b78"
+  hs_bindgen_e593348e8aff0b78_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_DestroyPalette@
+hs_bindgen_e593348e8aff0b78
+  :: BG.Ptr SDL_Palette
+  -> IO ()
+hs_bindgen_e593348e8aff0b78 =
+  BG.fromFFIType hs_bindgen_e593348e8aff0b78_base
+
+-- | Free a palette created with @SDL_CreatePalette()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified or destroyed in another thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreatePalette'
+--
+--     [C declaration]: @SDL_DestroyPalette@, defined at @SDL3\/SDL_pixels.h 1295:34@
+sDL_DestroyPalette
+  :: BG.Ptr SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the 'SDL_Palette' structure to be freed.
+  -> IO ()
+sDL_DestroyPalette = hs_bindgen_e593348e8aff0b78
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_MapRGB@
+foreign import ccall safe "hs_bindgen_37bc20a6b313ac41"
+  hs_bindgen_37bc20a6b313ac41_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_MapRGB@
+hs_bindgen_37bc20a6b313ac41
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -> PtrConst.PtrConst SDL_Palette
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_37bc20a6b313ac41 =
+  BG.fromFFIType hs_bindgen_37bc20a6b313ac41_base
+
+-- | Map an RGB triple to an opaque pixel value for a given pixel format.
+--
+--     This function maps the RGB color value to the specified pixel format and returns the pixel value best approximating the given RGB color value for the given pixel format.
+--
+--     If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.
+--
+--     If the specified pixel format has an alpha component it will be returned as all 1 bits (fully opaque).
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGB', 'sDL_MapRGBA', SDL_MapSurfaceRGB
+--
+--     [C declaration]: @SDL_MapRGB@, defined at @SDL3\/SDL_pixels.h 1333:36@
+sDL_MapRGB
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_MapRGB = hs_bindgen_37bc20a6b313ac41
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_MapRGBA@
+foreign import ccall safe "hs_bindgen_3fecde9ee209df97"
+  hs_bindgen_3fecde9ee209df97_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_MapRGBA@
+hs_bindgen_3fecde9ee209df97
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -> PtrConst.PtrConst SDL_Palette
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_3fecde9ee209df97 =
+  BG.fromFFIType hs_bindgen_3fecde9ee209df97_base
+
+-- | Map an RGBA quadruple to a pixel value for a given pixel format.
+--
+--     This function maps the RGBA color value to the specified pixel format and returns the pixel value best approximating the given RGBA color value for the given pixel format.
+--
+--     If the specified pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).
+--
+--     If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGBA', 'sDL_MapRGB', SDL_MapSurfaceRGBA
+--
+--     [C declaration]: @SDL_MapRGBA@, defined at @SDL3\/SDL_pixels.h 1372:36@
+sDL_MapRGBA
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel in the range 0-255.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_MapRGBA = hs_bindgen_3fecde9ee209df97
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetRGB@
+foreign import ccall safe "hs_bindgen_da0c576777e026d9"
+  hs_bindgen_da0c576777e026d9_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetRGB@
+hs_bindgen_da0c576777e026d9
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -> PtrConst.PtrConst SDL_Palette
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO ()
+hs_bindgen_da0c576777e026d9 =
+  BG.fromFFIType hs_bindgen_da0c576777e026d9_base
+
+-- | Get RGB values from a pixel in the specified format.
+--
+--     This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGBA', 'sDL_MapRGB', 'sDL_MapRGBA'
+--
+--     [C declaration]: @SDL_GetRGB@, defined at @SDL3\/SDL_pixels.h 1400:34@
+sDL_GetRGB
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@pixelvalue@]: a pixel value.
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue component, may be NULL.
+  -> IO ()
+sDL_GetRGB = hs_bindgen_da0c576777e026d9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetRGBA@
+foreign import ccall safe "hs_bindgen_9ace50541bcd4e41"
+  hs_bindgen_9ace50541bcd4e41_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Safe_SDL_GetRGBA@
+hs_bindgen_9ace50541bcd4e41
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -> PtrConst.PtrConst SDL_Palette
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO ()
+hs_bindgen_9ace50541bcd4e41 =
+  BG.fromFFIType hs_bindgen_9ace50541bcd4e41_base
+
+-- | Get RGBA values from a pixel in the specified format.
+--
+--     This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).
+--
+--     If the surface has no alpha component, the alpha will be returned as 0xff (100% opaque).
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGB', 'sDL_MapRGB', 'sDL_MapRGBA'
+--
+--     [C declaration]: @SDL_GetRGBA@, defined at @SDL3\/SDL_pixels.h 1432:34@
+sDL_GetRGBA
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@pixelvalue@]: a pixel value.
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha component, may be NULL.
+  -> IO ()
+sDL_GetRGBA = hs_bindgen_9ace50541bcd4e41
diff --git a/src/SDL3/Sys/Bindgen/Pixels/Unsafe.hs b/src/SDL3/Sys/Bindgen/Pixels/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Pixels/Unsafe.hs
@@ -0,0 +1,692 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Pixels.Unsafe (
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_GetPixelFormatName,
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_GetMasksForPixelFormat,
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_GetPixelFormatForMasks,
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_GetPixelFormatDetails,
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_CreatePalette,
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_SetPaletteColors,
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_DestroyPalette,
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_MapRGB,
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_MapRGBA,
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_GetRGB,
+  SDL3.Sys.Bindgen.Pixels.Unsafe.sDL_GetRGBA,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Pixels
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_pixels.h>"
+         , "char const *hs_bindgen_8fbe065b3c4d8879 ("
+         , "  SDL_PixelFormat arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPixelFormatName)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8f634ab31e40ca98 ("
+         , "  SDL_PixelFormat arg1,"
+         , "  signed int *arg2,"
+         , "  Uint32 *arg3,"
+         , "  Uint32 *arg4,"
+         , "  Uint32 *arg5,"
+         , "  Uint32 *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_GetMasksForPixelFormat)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "SDL_PixelFormat hs_bindgen_e7620db26f444473 ("
+         , "  signed int arg1,"
+         , "  Uint32 arg2,"
+         , "  Uint32 arg3,"
+         , "  Uint32 arg4,"
+         , "  Uint32 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPixelFormatForMasks)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "SDL_PixelFormatDetails const *hs_bindgen_d5b09ce14a5ee6cb ("
+         , "  SDL_PixelFormat arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPixelFormatDetails)(arg1);"
+         , "}"
+         , "SDL_Palette *hs_bindgen_b247627517d074a6 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreatePalette)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_1db50350d55a3029 ("
+         , "  SDL_Palette *arg1,"
+         , "  SDL_Color const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetPaletteColors)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_0c5b20ec2209c5f8 ("
+         , "  SDL_Palette *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyPalette)(arg1);"
+         , "}"
+         , "Uint32 hs_bindgen_69237948f17500f6 ("
+         , "  SDL_PixelFormatDetails const *arg1,"
+         , "  SDL_Palette const *arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_MapRGB)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "Uint32 hs_bindgen_b496c5a642029802 ("
+         , "  SDL_PixelFormatDetails const *arg1,"
+         , "  SDL_Palette const *arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5,"
+         , "  Uint8 arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_MapRGBA)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "void hs_bindgen_39f53a47a31a2bfc ("
+         , "  Uint32 arg1,"
+         , "  SDL_PixelFormatDetails const *arg2,"
+         , "  SDL_Palette const *arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5,"
+         , "  Uint8 *arg6"
+         , ")"
+         , "{"
+         , "  (SDL_GetRGB)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "void hs_bindgen_5ce2e49df4845c32 ("
+         , "  Uint32 arg1,"
+         , "  SDL_PixelFormatDetails const *arg2,"
+         , "  SDL_Palette const *arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5,"
+         , "  Uint8 *arg6,"
+         , "  Uint8 *arg7"
+         , ")"
+         , "{"
+         , "  (SDL_GetRGBA)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetPixelFormatName@
+foreign import ccall unsafe "hs_bindgen_8fbe065b3c4d8879"
+  hs_bindgen_8fbe065b3c4d8879_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetPixelFormatName@
+hs_bindgen_8fbe065b3c4d8879
+  :: SDL_PixelFormat
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_8fbe065b3c4d8879 =
+  BG.fromFFIType hs_bindgen_8fbe065b3c4d8879_base
+
+-- | Get the human readable name of a pixel format.
+--
+--     [Returns]: the human readable name of the specified pixel format or \"SDL_PIXELFORMAT_UNKNOWN\" if the format isn\'t recognized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPixelFormatName@, defined at @SDL3\/SDL_pixels.h 1185:42@
+sDL_GetPixelFormatName
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the pixel format to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetPixelFormatName = hs_bindgen_8fbe065b3c4d8879
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetMasksForPixelFormat@
+foreign import ccall unsafe "hs_bindgen_8f634ab31e40ca98"
+  hs_bindgen_8f634ab31e40ca98_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetMasksForPixelFormat@
+hs_bindgen_8f634ab31e40ca98
+  :: SDL_PixelFormat
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_8f634ab31e40ca98 =
+  BG.fromFFIType hs_bindgen_8f634ab31e40ca98_base
+
+-- | Convert one of the enumerated pixel formats to a bpp value and RGBA masks.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatForMasks'
+--
+--     [C declaration]: @SDL_GetMasksForPixelFormat@, defined at @SDL3\/SDL_pixels.h 1205:34@
+sDL_GetMasksForPixelFormat
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the 'SDL_PixelFormat' values.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@bpp@]: a bits per pixel value; usually 15, 16, or 32.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Rmask@]: a pointer filled in with the red mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Gmask@]: a pointer filled in with the green mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Bmask@]: a pointer filled in with the blue mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Amask@]: a pointer filled in with the alpha mask for the format.
+  -> IO BG.CBool
+sDL_GetMasksForPixelFormat =
+  hs_bindgen_8f634ab31e40ca98
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetPixelFormatForMasks@
+foreign import ccall unsafe "hs_bindgen_e7620db26f444473"
+  hs_bindgen_e7620db26f444473_base
+    :: BG.Int32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetPixelFormatForMasks@
+hs_bindgen_e7620db26f444473
+  :: BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO SDL_PixelFormat
+hs_bindgen_e7620db26f444473 =
+  BG.fromFFIType hs_bindgen_e7620db26f444473_base
+
+-- | Convert a bpp value and RGBA masks to an enumerated pixel format.
+--
+--     This will return @SDL_PIXELFORMAT_UNKNOWN@ if the conversion wasn\'t possible.
+--
+--     [Returns]: the 'SDL_PixelFormat' value corresponding to the format masks, or SDL_PIXELFORMAT_UNKNOWN if there isn\'t a match.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMasksForPixelFormat'
+--
+--     [C declaration]: @SDL_GetPixelFormatForMasks@, defined at @SDL3\/SDL_pixels.h 1227:45@
+sDL_GetPixelFormatForMasks
+  :: BG.CInt
+  -- ^
+  --
+  --           [@bpp@]: a bits per pixel value; usually 15, 16, or 32.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Rmask@]: the red mask for the format.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Gmask@]: the green mask for the format.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Bmask@]: the blue mask for the format.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Amask@]: the alpha mask for the format.
+  -> IO SDL_PixelFormat
+sDL_GetPixelFormatForMasks =
+  hs_bindgen_e7620db26f444473
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetPixelFormatDetails@
+foreign import ccall unsafe "hs_bindgen_d5b09ce14a5ee6cb"
+  hs_bindgen_d5b09ce14a5ee6cb_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetPixelFormatDetails@
+hs_bindgen_d5b09ce14a5ee6cb
+  :: SDL_PixelFormat
+  -> IO (PtrConst.PtrConst SDL_PixelFormatDetails)
+hs_bindgen_d5b09ce14a5ee6cb =
+  BG.fromFFIType hs_bindgen_d5b09ce14a5ee6cb_base
+
+-- | Create an 'SDL_PixelFormatDetails' structure corresponding to a pixel format.
+--
+--     Returned structure may come from a shared global cache (i.e. not newly allocated), and hence should not be modified, especially the palette. Weird errors such as @Blit combination not supported@ may occur.
+--
+--     [Returns]: a pointer to a 'SDL_PixelFormatDetails' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPixelFormatDetails@, defined at @SDL3\/SDL_pixels.h 1244:60@
+sDL_GetPixelFormatDetails
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the 'SDL_PixelFormat' values.
+  -> IO (PtrConst.PtrConst SDL_PixelFormatDetails)
+sDL_GetPixelFormatDetails =
+  hs_bindgen_d5b09ce14a5ee6cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_CreatePalette@
+foreign import ccall unsafe "hs_bindgen_b247627517d074a6"
+  hs_bindgen_b247627517d074a6_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_CreatePalette@
+hs_bindgen_b247627517d074a6
+  :: BG.CInt
+  -> IO (BG.Ptr SDL_Palette)
+hs_bindgen_b247627517d074a6 =
+  BG.fromFFIType hs_bindgen_b247627517d074a6_base
+
+-- | Create a palette structure with the specified number of color entries.
+--
+--     The palette entries are initialized to white.
+--
+--     [Returns]: a new 'SDL_Palette' structure on success or NULL on failure (e.g. if there wasn\'t enough memory); call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyPalette', 'sDL_SetPaletteColors', SDL_SetSurfacePalette
+--
+--     [C declaration]: @SDL_CreatePalette@, defined at @SDL3\/SDL_pixels.h 1264:43@
+sDL_CreatePalette
+  :: BG.CInt
+  -- ^
+  --
+  --           [@ncolors@]: represents the number of color entries in the color palette.
+  -> IO (BG.Ptr SDL_Palette)
+sDL_CreatePalette = hs_bindgen_b247627517d074a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_SetPaletteColors@
+foreign import ccall unsafe "hs_bindgen_1db50350d55a3029"
+  hs_bindgen_1db50350d55a3029_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_SetPaletteColors@
+hs_bindgen_1db50350d55a3029
+  :: BG.Ptr SDL_Palette
+  -> PtrConst.PtrConst SDL_Color
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_1db50350d55a3029 =
+  BG.fromFFIType hs_bindgen_1db50350d55a3029_base
+
+-- | Set a range of colors in a palette.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified or destroyed in another thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetPaletteColors@, defined at @SDL3\/SDL_pixels.h 1281:34@
+sDL_SetPaletteColors
+  :: BG.Ptr SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the 'SDL_Palette' structure to modify.
+  -> PtrConst.PtrConst SDL_Color
+  -- ^
+  --
+  --           [@colors@]: an array of 'SDL_Color' structures to copy into the palette.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@firstcolor@]: the index of the first palette entry to modify.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@ncolors@]: the number of entries to modify.
+  -> IO BG.CBool
+sDL_SetPaletteColors = hs_bindgen_1db50350d55a3029
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_DestroyPalette@
+foreign import ccall unsafe "hs_bindgen_0c5b20ec2209c5f8"
+  hs_bindgen_0c5b20ec2209c5f8_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_DestroyPalette@
+hs_bindgen_0c5b20ec2209c5f8
+  :: BG.Ptr SDL_Palette
+  -> IO ()
+hs_bindgen_0c5b20ec2209c5f8 =
+  BG.fromFFIType hs_bindgen_0c5b20ec2209c5f8_base
+
+-- | Free a palette created with @SDL_CreatePalette()@.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified or destroyed in another thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreatePalette'
+--
+--     [C declaration]: @SDL_DestroyPalette@, defined at @SDL3\/SDL_pixels.h 1295:34@
+sDL_DestroyPalette
+  :: BG.Ptr SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the 'SDL_Palette' structure to be freed.
+  -> IO ()
+sDL_DestroyPalette = hs_bindgen_0c5b20ec2209c5f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_MapRGB@
+foreign import ccall unsafe "hs_bindgen_69237948f17500f6"
+  hs_bindgen_69237948f17500f6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_MapRGB@
+hs_bindgen_69237948f17500f6
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -> PtrConst.PtrConst SDL_Palette
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_69237948f17500f6 =
+  BG.fromFFIType hs_bindgen_69237948f17500f6_base
+
+-- | Map an RGB triple to an opaque pixel value for a given pixel format.
+--
+--     This function maps the RGB color value to the specified pixel format and returns the pixel value best approximating the given RGB color value for the given pixel format.
+--
+--     If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.
+--
+--     If the specified pixel format has an alpha component it will be returned as all 1 bits (fully opaque).
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGB', 'sDL_MapRGBA', SDL_MapSurfaceRGB
+--
+--     [C declaration]: @SDL_MapRGB@, defined at @SDL3\/SDL_pixels.h 1333:36@
+sDL_MapRGB
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_MapRGB = hs_bindgen_69237948f17500f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_MapRGBA@
+foreign import ccall unsafe "hs_bindgen_b496c5a642029802"
+  hs_bindgen_b496c5a642029802_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_MapRGBA@
+hs_bindgen_b496c5a642029802
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -> PtrConst.PtrConst SDL_Palette
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_b496c5a642029802 =
+  BG.fromFFIType hs_bindgen_b496c5a642029802_base
+
+-- | Map an RGBA quadruple to a pixel value for a given pixel format.
+--
+--     This function maps the RGBA color value to the specified pixel format and returns the pixel value best approximating the given RGBA color value for the given pixel format.
+--
+--     If the specified pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).
+--
+--     If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGBA', 'sDL_MapRGB', SDL_MapSurfaceRGBA
+--
+--     [C declaration]: @SDL_MapRGBA@, defined at @SDL3\/SDL_pixels.h 1372:36@
+sDL_MapRGBA
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel in the range 0-255.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_MapRGBA = hs_bindgen_b496c5a642029802
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetRGB@
+foreign import ccall unsafe "hs_bindgen_39f53a47a31a2bfc"
+  hs_bindgen_39f53a47a31a2bfc_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetRGB@
+hs_bindgen_39f53a47a31a2bfc
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -> PtrConst.PtrConst SDL_Palette
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO ()
+hs_bindgen_39f53a47a31a2bfc =
+  BG.fromFFIType hs_bindgen_39f53a47a31a2bfc_base
+
+-- | Get RGB values from a pixel in the specified format.
+--
+--     This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGBA', 'sDL_MapRGB', 'sDL_MapRGBA'
+--
+--     [C declaration]: @SDL_GetRGB@, defined at @SDL3\/SDL_pixels.h 1400:34@
+sDL_GetRGB
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@pixelvalue@]: a pixel value.
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue component, may be NULL.
+  -> IO ()
+sDL_GetRGB = hs_bindgen_39f53a47a31a2bfc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetRGBA@
+foreign import ccall unsafe "hs_bindgen_5ce2e49df4845c32"
+  hs_bindgen_5ce2e49df4845c32_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Pixels_Unsafe_SDL_GetRGBA@
+hs_bindgen_5ce2e49df4845c32
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -> PtrConst.PtrConst SDL_Palette
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO ()
+hs_bindgen_5ce2e49df4845c32 =
+  BG.fromFFIType hs_bindgen_5ce2e49df4845c32_base
+
+-- | Get RGBA values from a pixel in the specified format.
+--
+--     This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).
+--
+--     If the surface has no alpha component, the alpha will be returned as 0xff (100% opaque).
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPixelFormatDetails', 'sDL_GetRGB', 'sDL_MapRGB', 'sDL_MapRGBA'
+--
+--     [C declaration]: @SDL_GetRGBA@, defined at @SDL3\/SDL_pixels.h 1432:34@
+sDL_GetRGBA
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@pixelvalue@]: a pixel value.
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha component, may be NULL.
+  -> IO ()
+sDL_GetRGBA = hs_bindgen_5ce2e49df4845c32
diff --git a/src/SDL3/Sys/Bindgen/Platform/FunPtr.hs b/src/SDL3/Sys/Bindgen/Platform/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Platform/FunPtr.hs
@@ -0,0 +1,42 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Platform.FunPtr (
+  SDL3.Sys.Bindgen.Platform.FunPtr.sDL_GetPlatform,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_platform.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Platform_get_SDL_GetPlatform */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_77c6464e30daf2fd (void)) (void)"
+         , "{"
+         , "  return &SDL_GetPlatform;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Platform_get_SDL_GetPlatform@
+foreign import ccall unsafe "hs_bindgen_77c6464e30daf2fd"
+  hs_bindgen_77c6464e30daf2fd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Platform_get_SDL_GetPlatform@
+hs_bindgen_77c6464e30daf2fd :: IO (BG.FunPtr (IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_77c6464e30daf2fd =
+  BG.fromFFIType hs_bindgen_77c6464e30daf2fd_base
+
+{-# NOINLINE sDL_GetPlatform #-}
+
+-- | [C declaration]: @SDL_GetPlatform@, defined at @SDL3\/SDL_platform.h 58:42@
+sDL_GetPlatform :: BG.FunPtr (IO (PtrConst.PtrConst BG.CChar))
+sDL_GetPlatform =
+  BG.unsafePerformIO hs_bindgen_77c6464e30daf2fd
diff --git a/src/SDL3/Sys/Bindgen/Platform/Safe.hs b/src/SDL3/Sys/Bindgen/Platform/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Platform/Safe.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Platform.Safe (
+  SDL3.Sys.Bindgen.Platform.Safe.sDL_GetPlatform,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_platform.h>"
+         , "char const *hs_bindgen_837ad9031649e009 (void)"
+         , "{"
+         , "  return (SDL_GetPlatform)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Platform_Safe_SDL_GetPlatform@
+foreign import ccall safe "hs_bindgen_837ad9031649e009"
+  hs_bindgen_837ad9031649e009_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Platform_Safe_SDL_GetPlatform@
+hs_bindgen_837ad9031649e009 :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_837ad9031649e009 =
+  BG.fromFFIType hs_bindgen_837ad9031649e009_base
+
+-- | [C declaration]: @SDL_GetPlatform@, defined at @SDL3\/SDL_platform.h 58:42@
+sDL_GetPlatform :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetPlatform = hs_bindgen_837ad9031649e009
diff --git a/src/SDL3/Sys/Bindgen/Platform/Unsafe.hs b/src/SDL3/Sys/Bindgen/Platform/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Platform/Unsafe.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Platform.Unsafe (
+  SDL3.Sys.Bindgen.Platform.Unsafe.sDL_GetPlatform,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_platform.h>"
+         , "char const *hs_bindgen_6a11aa5547a2bc81 (void)"
+         , "{"
+         , "  return (SDL_GetPlatform)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Platform_Unsafe_SDL_GetPlatform@
+foreign import ccall unsafe "hs_bindgen_6a11aa5547a2bc81"
+  hs_bindgen_6a11aa5547a2bc81_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Platform_Unsafe_SDL_GetPlatform@
+hs_bindgen_6a11aa5547a2bc81 :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_6a11aa5547a2bc81 =
+  BG.fromFFIType hs_bindgen_6a11aa5547a2bc81_base
+
+-- | [C declaration]: @SDL_GetPlatform@, defined at @SDL3\/SDL_platform.h 58:42@
+sDL_GetPlatform :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetPlatform = hs_bindgen_6a11aa5547a2bc81
diff --git a/src/SDL3/Sys/Bindgen/PlatformDefines.hs b/src/SDL3/Sys/Bindgen/PlatformDefines.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/PlatformDefines.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+module SDL3.Sys.Bindgen.PlatformDefines (
+  SDL3.Sys.Bindgen.PlatformDefines.sDL_PLATFORM_LINUX,
+  SDL3.Sys.Bindgen.PlatformDefines.sDL_PLATFORM_UNIX,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+
+-- | [C declaration]: @macro SDL_PLATFORM_LINUX@, defined at @SDL3\/SDL_platform_defines.h 101:9@
+sDL_PLATFORM_LINUX :: BG.CInt
+sDL_PLATFORM_LINUX = (1 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_PLATFORM_UNIX@, defined at @SDL3\/SDL_platform_defines.h 126:9@
+sDL_PLATFORM_UNIX :: BG.CInt
+sDL_PLATFORM_UNIX = (1 :: BG.CInt)
diff --git a/src/SDL3/Sys/Bindgen/Power.hs b/src/SDL3/Sys/Bindgen/Power.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Power.hs
@@ -0,0 +1,175 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL power management routines.
+--
+--     There is a single function in this category: @SDL_GetPowerInfo()@.
+--
+--     This function is useful for games on the go. This allows an app to know if it\'s running on a draining battery, which can be useful if the app wants to reduce processing, or perhaps framerate, to extend the duration of the battery\'s charge. Perhaps the app just wants to show a battery meter when fullscreen, or alert the user when the power is getting extremely low, so they can save their game. The basic state for the system\'s power supply.
+--
+--     These are results returned by @SDL_GetPowerInfo()@.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Power (
+  SDL3.Sys.Bindgen.Power.SDL_PowerState (..),
+  pattern SDL3.Sys.Bindgen.Power.SDL_POWERSTATE_ERROR,
+  pattern SDL3.Sys.Bindgen.Power.SDL_POWERSTATE_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Power.SDL_POWERSTATE_ON_BATTERY,
+  pattern SDL3.Sys.Bindgen.Power.SDL_POWERSTATE_NO_BATTERY,
+  pattern SDL3.Sys.Bindgen.Power.SDL_POWERSTATE_CHARGING,
+  pattern SDL3.Sys.Bindgen.Power.SDL_POWERSTATE_CHARGED,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @enum SDL_PowerState@, defined at @SDL3\/SDL_power.h 56:14@
+newtype SDL_PowerState = SDL_PowerState
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_PowerState where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_PowerState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PowerState
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_PowerState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PowerState unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_PowerState instance BG.Storable SDL_PowerState
+
+deriving via BG.CInt instance BG.Prim SDL_PowerState
+
+instance CEnum.CEnum SDL_PowerState where
+  type CEnumZ SDL_PowerState = BG.CInt
+
+  toCEnum = SDL_PowerState
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_POWERSTATE_ERROR")
+        , (0, BG.singleton "SDL_POWERSTATE_UNKNOWN")
+        , (1, BG.singleton "SDL_POWERSTATE_ON_BATTERY")
+        , (2, BG.singleton "SDL_POWERSTATE_NO_BATTERY")
+        , (3, BG.singleton "SDL_POWERSTATE_CHARGING")
+        , (4, BG.singleton "SDL_POWERSTATE_CHARGED")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_PowerState"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_PowerState"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_PowerState where
+  minDeclaredValue = SDL_POWERSTATE_ERROR
+
+  maxDeclaredValue = SDL_POWERSTATE_CHARGED
+
+instance Show SDL_PowerState where
+  showsPrec = CEnum.shows
+
+instance Read SDL_PowerState where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_PowerState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PowerState{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PowerState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PowerState "unwrap" where
+  type CFieldType SDL_PowerState "unwrap" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | error determining power status
+--
+--     [C declaration]: @SDL_POWERSTATE_ERROR@, defined at @SDL3\/SDL_power.h 58:5@
+pattern SDL_POWERSTATE_ERROR :: SDL_PowerState
+pattern SDL_POWERSTATE_ERROR = SDL_PowerState (-1)
+
+-- | cannot determine power status
+--
+--     [C declaration]: @SDL_POWERSTATE_UNKNOWN@, defined at @SDL3\/SDL_power.h 59:5@
+pattern SDL_POWERSTATE_UNKNOWN :: SDL_PowerState
+pattern SDL_POWERSTATE_UNKNOWN = SDL_PowerState 0
+
+-- | Not plugged in, running on the battery
+--
+--     [C declaration]: @SDL_POWERSTATE_ON_BATTERY@, defined at @SDL3\/SDL_power.h 60:5@
+pattern SDL_POWERSTATE_ON_BATTERY :: SDL_PowerState
+pattern SDL_POWERSTATE_ON_BATTERY = SDL_PowerState 1
+
+-- | Plugged in, no battery available
+--
+--     [C declaration]: @SDL_POWERSTATE_NO_BATTERY@, defined at @SDL3\/SDL_power.h 61:5@
+pattern SDL_POWERSTATE_NO_BATTERY :: SDL_PowerState
+pattern SDL_POWERSTATE_NO_BATTERY = SDL_PowerState 2
+
+-- | Plugged in, charging battery
+--
+--     [C declaration]: @SDL_POWERSTATE_CHARGING@, defined at @SDL3\/SDL_power.h 62:5@
+pattern SDL_POWERSTATE_CHARGING :: SDL_PowerState
+pattern SDL_POWERSTATE_CHARGING = SDL_PowerState 3
+
+-- | Plugged in, battery charged
+--
+--     [C declaration]: @SDL_POWERSTATE_CHARGED@, defined at @SDL3\/SDL_power.h 63:5@
+pattern SDL_POWERSTATE_CHARGED :: SDL_PowerState
+pattern SDL_POWERSTATE_CHARGED = SDL_PowerState 4
diff --git a/src/SDL3/Sys/Bindgen/Power/FunPtr.hs b/src/SDL3/Sys/Bindgen/Power/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Power/FunPtr.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Power.FunPtr (
+  SDL3.Sys.Bindgen.Power.FunPtr.sDL_GetPowerInfo,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Power
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_power.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Power_get_SDL_GetPowerInfo */"
+         , "__attribute__ ((const))"
+         , "SDL_PowerState (*hs_bindgen_ccc542a5396280c2 (void)) ("
+         , "  signed int *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetPowerInfo;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Power_get_SDL_GetPowerInfo@
+foreign import ccall unsafe "hs_bindgen_ccc542a5396280c2"
+  hs_bindgen_ccc542a5396280c2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Power_get_SDL_GetPowerInfo@
+hs_bindgen_ccc542a5396280c2
+  :: IO (BG.FunPtr (BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO SDL_PowerState))
+hs_bindgen_ccc542a5396280c2 =
+  BG.fromFFIType hs_bindgen_ccc542a5396280c2_base
+
+{-# NOINLINE sDL_GetPowerInfo #-}
+
+-- | Get the current power supply details.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     Battery status can change at any time; if you are concerned with power state, you should call this function frequently, and perhaps ignore changes until they seem to be stable for a few seconds.
+--
+--     It\'s possible a platform can only report battery percentage or time left but not both.
+--
+--     On some platforms, retrieving power supply details might be expensive. If you want to display continuous status you could call this function every minute or so.
+--
+--     [@seconds@]: a pointer filled in with the seconds of battery life left, or NULL to ignore. This will be filled in with -1 if we can\'t determine a value or there is no battery.
+--
+--     [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 when we can\'t determine a value or there is no battery.
+--
+--     [Returns]: the current battery state or @SDL_POWERSTATE_ERROR@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPowerInfo@, defined at @SDL3\/SDL_power.h 100:44@
+sDL_GetPowerInfo :: BG.FunPtr (BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO SDL_PowerState)
+sDL_GetPowerInfo =
+  BG.unsafePerformIO hs_bindgen_ccc542a5396280c2
diff --git a/src/SDL3/Sys/Bindgen/Power/Safe.hs b/src/SDL3/Sys/Bindgen/Power/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Power/Safe.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Power.Safe (
+  SDL3.Sys.Bindgen.Power.Safe.sDL_GetPowerInfo,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Power
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_power.h>"
+         , "SDL_PowerState hs_bindgen_d43ded70ea4a92e6 ("
+         , "  signed int *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPowerInfo)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Power_Safe_SDL_GetPowerInfo@
+foreign import ccall safe "hs_bindgen_d43ded70ea4a92e6"
+  hs_bindgen_d43ded70ea4a92e6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Power_Safe_SDL_GetPowerInfo@
+hs_bindgen_d43ded70ea4a92e6
+  :: BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO SDL_PowerState
+hs_bindgen_d43ded70ea4a92e6 =
+  BG.fromFFIType hs_bindgen_d43ded70ea4a92e6_base
+
+-- | Get the current power supply details.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     Battery status can change at any time; if you are concerned with power state, you should call this function frequently, and perhaps ignore changes until they seem to be stable for a few seconds.
+--
+--     It\'s possible a platform can only report battery percentage or time left but not both.
+--
+--     On some platforms, retrieving power supply details might be expensive. If you want to display continuous status you could call this function every minute or so.
+--
+--     [Returns]: the current battery state or @SDL_POWERSTATE_ERROR@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPowerInfo@, defined at @SDL3\/SDL_power.h 100:44@
+sDL_GetPowerInfo
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@seconds@]: a pointer filled in with the seconds of battery life left, or NULL to ignore. This will be filled in with -1 if we can\'t determine a value or there is no battery.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 when we can\'t determine a value or there is no battery.
+  -> IO SDL_PowerState
+sDL_GetPowerInfo = hs_bindgen_d43ded70ea4a92e6
diff --git a/src/SDL3/Sys/Bindgen/Power/Unsafe.hs b/src/SDL3/Sys/Bindgen/Power/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Power/Unsafe.hs
@@ -0,0 +1,70 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Power.Unsafe (
+  SDL3.Sys.Bindgen.Power.Unsafe.sDL_GetPowerInfo,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Power
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_power.h>"
+         , "SDL_PowerState hs_bindgen_abe28022c5038f4a ("
+         , "  signed int *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPowerInfo)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Power_Unsafe_SDL_GetPowerInfo@
+foreign import ccall unsafe "hs_bindgen_abe28022c5038f4a"
+  hs_bindgen_abe28022c5038f4a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Power_Unsafe_SDL_GetPowerInfo@
+hs_bindgen_abe28022c5038f4a
+  :: BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO SDL_PowerState
+hs_bindgen_abe28022c5038f4a =
+  BG.fromFFIType hs_bindgen_abe28022c5038f4a_base
+
+-- | Get the current power supply details.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     Battery status can change at any time; if you are concerned with power state, you should call this function frequently, and perhaps ignore changes until they seem to be stable for a few seconds.
+--
+--     It\'s possible a platform can only report battery percentage or time left but not both.
+--
+--     On some platforms, retrieving power supply details might be expensive. If you want to display continuous status you could call this function every minute or so.
+--
+--     [Returns]: the current battery state or @SDL_POWERSTATE_ERROR@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetPowerInfo@, defined at @SDL3\/SDL_power.h 100:44@
+sDL_GetPowerInfo
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@seconds@]: a pointer filled in with the seconds of battery life left, or NULL to ignore. This will be filled in with -1 if we can\'t determine a value or there is no battery.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 when we can\'t determine a value or there is no battery.
+  -> IO SDL_PowerState
+sDL_GetPowerInfo = hs_bindgen_abe28022c5038f4a
diff --git a/src/SDL3/Sys/Bindgen/Process.hs b/src/SDL3/Sys/Bindgen/Process.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Process.hs
@@ -0,0 +1,747 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Process control support.
+--
+--     These functions provide a cross-platform way to spawn and manage OS-level processes.
+--
+--     You can create a new subprocess with @SDL_CreateProcess()@ and optionally read and write to it using @SDL_ReadProcess()@ or @SDL_GetProcessInput()@ and @SDL_GetProcessOutput()@. If more advanced functionality like chaining input between processes is necessary, you can use @SDL_CreateProcessWithProperties()@.
+--
+--     You can get the status of a created process with @SDL_WaitProcess()@, or terminate the process with @SDL_KillProcess()@.
+--
+--     Don\'t forget to call @SDL_DestroyProcess()@ to clean up, whether the process process was killed, terminated on its own, or is still running! An opaque handle representing a system process.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess'
+module SDL3.Sys.Bindgen.Process (
+  SDL3.Sys.Bindgen.Process.SDL_Process,
+  SDL3.Sys.Bindgen.Process.SDL_ProcessIO (..),
+  pattern SDL3.Sys.Bindgen.Process.SDL_PROCESS_STDIO_INHERITED,
+  pattern SDL3.Sys.Bindgen.Process.SDL_PROCESS_STDIO_NULL,
+  pattern SDL3.Sys.Bindgen.Process.SDL_PROCESS_STDIO_APP,
+  pattern SDL3.Sys.Bindgen.Process.SDL_PROCESS_STDIO_REDIRECT,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_ARGS_POINTER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_STDIN_NUMBER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_STDIN_POINTER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_STDOUT_POINTER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_STDERR_NUMBER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_STDERR_POINTER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_CREATE_CMDLINE_STRING,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_PID_NUMBER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_STDIN_POINTER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_STDOUT_POINTER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_STDERR_POINTER,
+  SDL3.Sys.Bindgen.Process.sDL_PROP_PROCESS_BACKGROUND_BOOLEAN,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @struct SDL_Process@, defined at @SDL3\/SDL_process.h 64:16@
+data SDL_Process
+
+-- | Description of where standard I\/O should be directed when creating a process.
+--
+--     If a standard I\/O stream is set to SDL_PROCESS_STDIO_INHERITED, it will go to the same place as the application\'s I\/O stream. This is the default for standard output and standard error.
+--
+--     If a standard I\/O stream is set to SDL_PROCESS_STDIO_NULL, it is connected to @NUL:@ on Windows and @\/dev\/null@ on POSIX systems. This is the default for standard input.
+--
+--     If a standard I\/O stream is set to SDL_PROCESS_STDIO_APP, it is connected to a new SDL_IOStream that is available to the application. Standard input will be available as @'sDL_PROP_PROCESS_STDIN_POINTER'@ and allows @SDL_GetProcessInput()@, standard output will be available as @'sDL_PROP_PROCESS_STDOUT_POINTER'@ and allows @SDL_ReadProcess()@ and @SDL_GetProcessOutput()@, and standard error will be available as @'sDL_PROP_PROCESS_STDERR_POINTER'@ in the properties for the created process.
+--
+--     If a standard I\/O stream is set to SDL_PROCESS_STDIO_REDIRECT, it is connected to an existing SDL_IOStream provided by the application. Standard input is provided using @'sDL_PROP_PROCESS_CREATE_STDIN_POINTER'@, standard output is provided using @'sDL_PROP_PROCESS_CREATE_STDOUT_POINTER'@, and standard error is provided using @'sDL_PROP_PROCESS_CREATE_STDERR_POINTER'@ in the creation properties. These existing streams should be closed by the application once the new process is created.
+--
+--     In order to use an SDL_IOStream with SDL_PROCESS_STDIO_REDIRECT, it must have @SDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER@ or @SDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER@ set. This is true for streams representing files and process I\/O.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcessWithProperties', 'sDL_GetProcessProperties', 'sDL_ReadProcess', 'sDL_GetProcessInput', 'sDL_GetProcessOutput'
+--
+--     [C declaration]: @enum SDL_ProcessIO@, defined at @SDL3\/SDL_process.h 150:14@
+newtype SDL_ProcessIO = SDL_ProcessIO
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_ProcessIO where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_ProcessIO where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ProcessIO
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_ProcessIO where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ProcessIO unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_ProcessIO instance BG.Storable SDL_ProcessIO
+
+deriving via BG.CUInt instance BG.Prim SDL_ProcessIO
+
+instance CEnum.CEnum SDL_ProcessIO where
+  type CEnumZ SDL_ProcessIO = BG.CUInt
+
+  toCEnum = SDL_ProcessIO
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_PROCESS_STDIO_INHERITED")
+        , (1, BG.singleton "SDL_PROCESS_STDIO_NULL")
+        , (2, BG.singleton "SDL_PROCESS_STDIO_APP")
+        , (3, BG.singleton "SDL_PROCESS_STDIO_REDIRECT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_ProcessIO"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_ProcessIO"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_ProcessIO where
+  minDeclaredValue = SDL_PROCESS_STDIO_INHERITED
+
+  maxDeclaredValue = SDL_PROCESS_STDIO_REDIRECT
+
+instance Show SDL_ProcessIO where
+  showsPrec = CEnum.shows
+
+instance Read SDL_ProcessIO where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_ProcessIO ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ProcessIO{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ProcessIO) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ProcessIO "unwrap" where
+  type CFieldType SDL_ProcessIO "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The I\/O stream is inherited from the application.
+--
+--     [C declaration]: @SDL_PROCESS_STDIO_INHERITED@, defined at @SDL3\/SDL_process.h 152:5@
+pattern SDL_PROCESS_STDIO_INHERITED :: SDL_ProcessIO
+pattern SDL_PROCESS_STDIO_INHERITED = SDL_ProcessIO 0
+
+-- | The I\/O stream is ignored.
+--
+--     [C declaration]: @SDL_PROCESS_STDIO_NULL@, defined at @SDL3\/SDL_process.h 153:5@
+pattern SDL_PROCESS_STDIO_NULL :: SDL_ProcessIO
+pattern SDL_PROCESS_STDIO_NULL = SDL_ProcessIO 1
+
+-- | The I\/O stream is connected to a new SDL_IOStream that the application can read or write
+--
+--     [C declaration]: @SDL_PROCESS_STDIO_APP@, defined at @SDL3\/SDL_process.h 154:5@
+pattern SDL_PROCESS_STDIO_APP :: SDL_ProcessIO
+pattern SDL_PROCESS_STDIO_APP = SDL_ProcessIO 2
+
+-- | The I\/O stream is redirected to an existing SDL_IOStream.
+--
+--     [C declaration]: @SDL_PROCESS_STDIO_REDIRECT@, defined at @SDL3\/SDL_process.h 155:5@
+pattern SDL_PROCESS_STDIO_REDIRECT :: SDL_ProcessIO
+pattern SDL_PROCESS_STDIO_REDIRECT = SDL_ProcessIO 3
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_ARGS_POINTER@, literal @\"SDL.process.create.args\"@, defined at @SDL3\/SDL_process.h 229:9@
+sDL_PROP_PROCESS_CREATE_ARGS_POINTER :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_ARGS_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x61
+    , 0x72
+    , 0x67
+    , 0x73
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER@, literal @\"SDL.process.create.environment\"@, defined at @SDL3\/SDL_process.h 230:9@
+sDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x65
+    , 0x6E
+    , 0x76
+    , 0x69
+    , 0x72
+    , 0x6F
+    , 0x6E
+    , 0x6D
+    , 0x65
+    , 0x6E
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING@, literal @\"SDL.process.create.working_directory\"@, defined at @SDL3\/SDL_process.h 231:9@
+sDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x6F
+    , 0x72
+    , 0x6B
+    , 0x69
+    , 0x6E
+    , 0x67
+    , 0x5F
+    , 0x64
+    , 0x69
+    , 0x72
+    , 0x65
+    , 0x63
+    , 0x74
+    , 0x6F
+    , 0x72
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_STDIN_NUMBER@, literal @\"SDL.process.create.stdin_option\"@, defined at @SDL3\/SDL_process.h 232:9@
+sDL_PROP_PROCESS_CREATE_STDIN_NUMBER :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_STDIN_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x69
+    , 0x6E
+    , 0x5F
+    , 0x6F
+    , 0x70
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_STDIN_POINTER@, literal @\"SDL.process.create.stdin_source\"@, defined at @SDL3\/SDL_process.h 233:9@
+sDL_PROP_PROCESS_CREATE_STDIN_POINTER :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_STDIN_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x69
+    , 0x6E
+    , 0x5F
+    , 0x73
+    , 0x6F
+    , 0x75
+    , 0x72
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_STDOUT_NUMBER@, literal @\"SDL.process.create.stdout_option\"@, defined at @SDL3\/SDL_process.h 234:9@
+sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x6F
+    , 0x75
+    , 0x74
+    , 0x5F
+    , 0x6F
+    , 0x70
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_STDOUT_POINTER@, literal @\"SDL.process.create.stdout_source\"@, defined at @SDL3\/SDL_process.h 235:9@
+sDL_PROP_PROCESS_CREATE_STDOUT_POINTER :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_STDOUT_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x6F
+    , 0x75
+    , 0x74
+    , 0x5F
+    , 0x73
+    , 0x6F
+    , 0x75
+    , 0x72
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_STDERR_NUMBER@, literal @\"SDL.process.create.stderr_option\"@, defined at @SDL3\/SDL_process.h 236:9@
+sDL_PROP_PROCESS_CREATE_STDERR_NUMBER :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_STDERR_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x72
+    , 0x5F
+    , 0x6F
+    , 0x70
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_STDERR_POINTER@, literal @\"SDL.process.create.stderr_source\"@, defined at @SDL3\/SDL_process.h 237:9@
+sDL_PROP_PROCESS_CREATE_STDERR_POINTER :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_STDERR_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x72
+    , 0x5F
+    , 0x73
+    , 0x6F
+    , 0x75
+    , 0x72
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN@, literal @\"SDL.process.create.stderr_to_stdout\"@, defined at @SDL3\/SDL_process.h 238:9@
+sDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x72
+    , 0x5F
+    , 0x74
+    , 0x6F
+    , 0x5F
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x6F
+    , 0x75
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN@, literal @\"SDL.process.create.background\"@, defined at @SDL3\/SDL_process.h 239:9@
+sDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x62
+    , 0x61
+    , 0x63
+    , 0x6B
+    , 0x67
+    , 0x72
+    , 0x6F
+    , 0x75
+    , 0x6E
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_CREATE_CMDLINE_STRING@, literal @\"SDL.process.create.cmdline\"@, defined at @SDL3\/SDL_process.h 240:9@
+sDL_PROP_PROCESS_CREATE_CMDLINE_STRING :: BG.ByteString
+sDL_PROP_PROCESS_CREATE_CMDLINE_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x6D
+    , 0x64
+    , 0x6C
+    , 0x69
+    , 0x6E
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_PID_NUMBER@, literal @\"SDL.process.pid\"@, defined at @SDL3\/SDL_process.h 273:9@
+sDL_PROP_PROCESS_PID_NUMBER :: BG.ByteString
+sDL_PROP_PROCESS_PID_NUMBER =
+  BG.pack [0x53, 0x44, 0x4C, 0x2E, 0x70, 0x72, 0x6F, 0x63, 0x65, 0x73, 0x73, 0x2E, 0x70, 0x69, 0x64]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_STDIN_POINTER@, literal @\"SDL.process.stdin\"@, defined at @SDL3\/SDL_process.h 274:9@
+sDL_PROP_PROCESS_STDIN_POINTER :: BG.ByteString
+sDL_PROP_PROCESS_STDIN_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x69
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_STDOUT_POINTER@, literal @\"SDL.process.stdout\"@, defined at @SDL3\/SDL_process.h 275:9@
+sDL_PROP_PROCESS_STDOUT_POINTER :: BG.ByteString
+sDL_PROP_PROCESS_STDOUT_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x6F
+    , 0x75
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_STDERR_POINTER@, literal @\"SDL.process.stderr\"@, defined at @SDL3\/SDL_process.h 276:9@
+sDL_PROP_PROCESS_STDERR_POINTER :: BG.ByteString
+sDL_PROP_PROCESS_STDERR_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_PROCESS_BACKGROUND_BOOLEAN@, literal @\"SDL.process.background\"@, defined at @SDL3\/SDL_process.h 277:9@
+sDL_PROP_PROCESS_BACKGROUND_BOOLEAN :: BG.ByteString
+sDL_PROP_PROCESS_BACKGROUND_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x6F
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    , 0x2E
+    , 0x62
+    , 0x61
+    , 0x63
+    , 0x6B
+    , 0x67
+    , 0x72
+    , 0x6F
+    , 0x75
+    , 0x6E
+    , 0x64
+    ]
diff --git a/src/SDL3/Sys/Bindgen/Process/FunPtr.hs b/src/SDL3/Sys/Bindgen/Process/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Process/FunPtr.hs
@@ -0,0 +1,470 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Process.FunPtr (
+  SDL3.Sys.Bindgen.Process.FunPtr.sDL_CreateProcess,
+  SDL3.Sys.Bindgen.Process.FunPtr.sDL_CreateProcessWithProperties,
+  SDL3.Sys.Bindgen.Process.FunPtr.sDL_GetProcessProperties,
+  SDL3.Sys.Bindgen.Process.FunPtr.sDL_ReadProcess,
+  SDL3.Sys.Bindgen.Process.FunPtr.sDL_GetProcessInput,
+  SDL3.Sys.Bindgen.Process.FunPtr.sDL_GetProcessOutput,
+  SDL3.Sys.Bindgen.Process.FunPtr.sDL_KillProcess,
+  SDL3.Sys.Bindgen.Process.FunPtr.sDL_WaitProcess,
+  SDL3.Sys.Bindgen.Process.FunPtr.sDL_DestroyProcess,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Process
+import SDL3.Sys.Bindgen.Properties qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_process.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_CreateProcess */"
+         , "__attribute__ ((const))"
+         , "SDL_Process *(*hs_bindgen_da17b0b856594376 (void)) ("
+         , "  char const *const *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateProcess;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_CreateProcessWithProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_Process *(*hs_bindgen_ca2af0d478f65779 (void)) ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateProcessWithProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_GetProcessProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_122575617d2f970a (void)) ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetProcessProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_ReadProcess */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_366550f8901941a0 (void)) ("
+         , "  SDL_Process *arg1,"
+         , "  size_t *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadProcess;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_GetProcessInput */"
+         , "__attribute__ ((const))"
+         , "SDL_IOStream *(*hs_bindgen_6503613b26c58999 (void)) ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetProcessInput;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_GetProcessOutput */"
+         , "__attribute__ ((const))"
+         , "SDL_IOStream *(*hs_bindgen_d9e2688fce87583b (void)) ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetProcessOutput;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_KillProcess */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_66935b63f947a265 (void)) ("
+         , "  SDL_Process *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_KillProcess;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_WaitProcess */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7ea62b336c3f5c4c (void)) ("
+         , "  SDL_Process *arg1,"
+         , "  _Bool arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitProcess;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_DestroyProcess */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_c5cffc00b0da9028 (void)) ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyProcess;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_CreateProcess@
+foreign import ccall unsafe "hs_bindgen_da17b0b856594376"
+  hs_bindgen_da17b0b856594376_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_CreateProcess@
+hs_bindgen_da17b0b856594376
+  :: IO
+       (BG.FunPtr (PtrConst.PtrConst (PtrConst.PtrConst BG.CChar) -> BG.CBool -> IO (BG.Ptr SDL_Process)))
+hs_bindgen_da17b0b856594376 =
+  BG.fromFFIType hs_bindgen_da17b0b856594376_base
+
+{-# NOINLINE sDL_CreateProcess #-}
+
+-- | Create a new process.
+--
+--     The path to the executable is supplied in args[0]. args[1..N] are additional arguments passed on the command line of the new process, and the argument list should be terminated with a NULL, e.g.:
+--
+--     @
+--     const char *args[] = { \"myprogram\", \"argument\", NULL };
+--     @
+--
+--     Setting pipe_stdio to true is equivalent to setting @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ and @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ to @SDL_PROCESS_STDIO_APP@, and will allow the use of @SDL_ReadProcess()@ or @SDL_GetProcessInput()@ and @SDL_GetProcessOutput()@.
+--
+--     See @SDL_CreateProcessWithProperties()@ for more details.
+--
+--     [@args@]: the path and arguments for the new process.
+--
+--     [@pipe_stdio@]: true to create pipes to the process\'s standard input and from the process\'s standard output, false for the process to have no input and inherit the application\'s standard output.
+--
+--     [Returns]: the newly created and running process, or NULL if the process couldn\'t be created.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcessWithProperties', 'sDL_GetProcessProperties', 'sDL_ReadProcess', 'sDL_GetProcessInput', 'sDL_GetProcessOutput', 'sDL_KillProcess', 'sDL_WaitProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_CreateProcess@, defined at @SDL3\/SDL_process.h 106:43@
+sDL_CreateProcess
+  :: BG.FunPtr (PtrConst.PtrConst (PtrConst.PtrConst BG.CChar) -> BG.CBool -> IO (BG.Ptr SDL_Process))
+sDL_CreateProcess =
+  BG.unsafePerformIO hs_bindgen_da17b0b856594376
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_CreateProcessWithProperties@
+foreign import ccall unsafe "hs_bindgen_ca2af0d478f65779"
+  hs_bindgen_ca2af0d478f65779_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_CreateProcessWithProperties@
+hs_bindgen_ca2af0d478f65779
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO (BG.Ptr SDL_Process)))
+hs_bindgen_ca2af0d478f65779 =
+  BG.fromFFIType hs_bindgen_ca2af0d478f65779_base
+
+{-# NOINLINE sDL_CreateProcessWithProperties #-}
+
+-- | Create a new process with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_PROCESS_CREATE_ARGS_POINTER'@: an array of strings containing the program to run, any arguments, and a NULL pointer, e.g. const char *args[] = { \"myprogram\", \"argument\", NULL }. This is a required property.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER'@: an SDL_Environment pointer. If this property is set, it will be the entire environment for the process, otherwise the current environment is used.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING'@: a UTF-8 encoded string representing the working directory for the process, defaults to the current working directory.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@: an 'SDL_ProcessIO' value describing where standard input for the process comes from, defaults to @SDL_PROCESS_STDIO_NULL@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDIN_POINTER'@: an SDL_IOStream pointer used for standard input when @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@: an 'SDL_ProcessIO' value describing where standard output for the process goes to, defaults to @SDL_PROCESS_STDIO_INHERITED@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDOUT_POINTER'@: an SDL_IOStream pointer used for standard output when @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@: an 'SDL_ProcessIO' value describing where standard error for the process goes to, defaults to @SDL_PROCESS_STDIO_INHERITED@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_POINTER'@: an SDL_IOStream pointer used for standard error when @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN'@: true if the error output of the process should be redirected into the standard output of the process. This property has no effect if @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ is set.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN'@: true if the process should run in the background. In this case the default input and output is @SDL_PROCESS_STDIO_NULL@ and the exitcode of the process is not available, and will always be 0.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_CMDLINE_STRING'@: a string containing the program to run and any parameters. This string is passed directly to @CreateProcess@ on Windows, and does nothing on other platforms. This property is only important if you want to start programs that does non-standard command-line processing, and in most cases using @'sDL_PROP_PROCESS_CREATE_ARGS_POINTER'@ is sufficient.
+--
+--     On POSIX platforms, wait() and waitpid(-1, ...) should not be called, and SIGCHLD should not be ignored or handled because those would prevent SDL from properly tracking the lifetime of the underlying process. You should use @SDL_WaitProcess()@ instead.
+--
+--     [@props@]: the properties to use.
+--
+--     [Returns]: the newly created and running process, or NULL if the process couldn\'t be created.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_GetProcessProperties', 'sDL_ReadProcess', 'sDL_GetProcessInput', 'sDL_GetProcessOutput', 'sDL_KillProcess', 'sDL_WaitProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_CreateProcessWithProperties@, defined at @SDL3\/SDL_process.h 227:43@
+sDL_CreateProcessWithProperties
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO (BG.Ptr SDL_Process))
+sDL_CreateProcessWithProperties =
+  BG.unsafePerformIO hs_bindgen_ca2af0d478f65779
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_GetProcessProperties@
+foreign import ccall unsafe "hs_bindgen_122575617d2f970a"
+  hs_bindgen_122575617d2f970a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_GetProcessProperties@
+hs_bindgen_122575617d2f970a
+  :: IO (BG.FunPtr (BG.Ptr SDL_Process -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_122575617d2f970a =
+  BG.fromFFIType hs_bindgen_122575617d2f970a_base
+
+{-# NOINLINE sDL_GetProcessProperties #-}
+
+-- | Get the properties associated with a process.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_PROCESS_PID_NUMBER'@: the process ID of the process.
+--
+--     * @'sDL_PROP_PROCESS_STDIN_POINTER'@: an SDL_IOStream that can be used to write input to the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_STDOUT_POINTER'@: a non-blocking SDL_IOStream that can be used to read output from the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_STDERR_POINTER'@: a non-blocking SDL_IOStream that can be used to read error output from the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_BACKGROUND_BOOLEAN'@: true if the process is running in the background.
+--
+--     [@process@]: the process to query.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties'
+--
+--     [C declaration]: @SDL_GetProcessProperties@, defined at @SDL3\/SDL_process.h 271:46@
+sDL_GetProcessProperties
+  :: BG.FunPtr (BG.Ptr SDL_Process -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetProcessProperties =
+  BG.unsafePerformIO hs_bindgen_122575617d2f970a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_ReadProcess@
+foreign import ccall unsafe "hs_bindgen_366550f8901941a0"
+  hs_bindgen_366550f8901941a0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_ReadProcess@
+hs_bindgen_366550f8901941a0
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Process -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> BG.Ptr BG.CInt -> IO (BG.Ptr BG.Void))
+       )
+hs_bindgen_366550f8901941a0 =
+  BG.fromFFIType hs_bindgen_366550f8901941a0_base
+
+{-# NOINLINE sDL_ReadProcess #-}
+
+-- | Read all the output from a process.
+--
+--     If a process was created with I\/O enabled, you can use this function to read the output. This function blocks until the process is complete, capturing all output, and providing the process exit code.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with SDL_free().
+--
+--     [@process@]: The process to read.
+--
+--     [@datasize@]: a pointer filled in with the number of bytes read, may be NULL.
+--
+--     [@exitcode@]: a pointer filled in with the process exit code if the process has exited, may be NULL.
+--
+--     [Returns]: the data or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_ReadProcess@, defined at @SDL3\/SDL_process.h 308:36@
+sDL_ReadProcess
+  :: BG.FunPtr
+       (BG.Ptr SDL_Process -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> BG.Ptr BG.CInt -> IO (BG.Ptr BG.Void))
+sDL_ReadProcess =
+  BG.unsafePerformIO hs_bindgen_366550f8901941a0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_GetProcessInput@
+foreign import ccall unsafe "hs_bindgen_6503613b26c58999"
+  hs_bindgen_6503613b26c58999_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_GetProcessInput@
+hs_bindgen_6503613b26c58999
+  :: IO (BG.FunPtr (BG.Ptr SDL_Process -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)))
+hs_bindgen_6503613b26c58999 =
+  BG.fromFFIType hs_bindgen_6503613b26c58999_base
+
+{-# NOINLINE sDL_GetProcessInput #-}
+
+-- | Get the SDL_IOStream associated with process standard input.
+--
+--     The process must have been created with @SDL_CreateProcess()@ and pipe_stdio set to true, or with @SDL_CreateProcessWithProperties()@ and @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     Writing to this stream can return less data than expected if the process hasn\'t read its input. It may be blocked waiting for its output to be read, if so you may need to call @SDL_GetProcessOutput()@ and read the output in parallel with writing input.
+--
+--     [@process@]: The process to get the input stream for.
+--
+--     [Returns]: the input stream or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_GetProcessOutput'
+--
+--     [C declaration]: @SDL_GetProcessInput@, defined at @SDL3\/SDL_process.h 334:44@
+sDL_GetProcessInput
+  :: BG.FunPtr (BG.Ptr SDL_Process -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream))
+sDL_GetProcessInput =
+  BG.unsafePerformIO hs_bindgen_6503613b26c58999
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_GetProcessOutput@
+foreign import ccall unsafe "hs_bindgen_d9e2688fce87583b"
+  hs_bindgen_d9e2688fce87583b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_GetProcessOutput@
+hs_bindgen_d9e2688fce87583b
+  :: IO (BG.FunPtr (BG.Ptr SDL_Process -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)))
+hs_bindgen_d9e2688fce87583b =
+  BG.fromFFIType hs_bindgen_d9e2688fce87583b_base
+
+{-# NOINLINE sDL_GetProcessOutput #-}
+
+-- | Get the SDL_IOStream associated with process standard output.
+--
+--     The process must have been created with @SDL_CreateProcess()@ and pipe_stdio set to true, or with @SDL_CreateProcessWithProperties()@ and @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     Reading from this stream can return 0 with SDL_GetIOStatus() returning SDL_IO_STATUS_NOT_READY if no output is available yet.
+--
+--     [@process@]: The process to get the output stream for.
+--
+--     [Returns]: the output stream or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_GetProcessInput'
+--
+--     [C declaration]: @SDL_GetProcessOutput@, defined at @SDL3\/SDL_process.h 358:44@
+sDL_GetProcessOutput
+  :: BG.FunPtr (BG.Ptr SDL_Process -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream))
+sDL_GetProcessOutput =
+  BG.unsafePerformIO hs_bindgen_d9e2688fce87583b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_KillProcess@
+foreign import ccall unsafe "hs_bindgen_66935b63f947a265"
+  hs_bindgen_66935b63f947a265_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_KillProcess@
+hs_bindgen_66935b63f947a265 :: IO (BG.FunPtr (BG.Ptr SDL_Process -> BG.CBool -> IO BG.CBool))
+hs_bindgen_66935b63f947a265 =
+  BG.fromFFIType hs_bindgen_66935b63f947a265_base
+
+{-# NOINLINE sDL_KillProcess #-}
+
+-- | Stop a process.
+--
+--     [@process@]: The process to stop.
+--
+--     [@force@]: true to terminate the process immediately, false to try to stop the process gracefully. In general you should try to stop the process gracefully first as terminating a process may leave it with half-written data or in some other unstable state.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_WaitProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_KillProcess@, defined at @SDL3\/SDL_process.h 381:34@
+sDL_KillProcess :: BG.FunPtr (BG.Ptr SDL_Process -> BG.CBool -> IO BG.CBool)
+sDL_KillProcess =
+  BG.unsafePerformIO hs_bindgen_66935b63f947a265
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_WaitProcess@
+foreign import ccall unsafe "hs_bindgen_7ea62b336c3f5c4c"
+  hs_bindgen_7ea62b336c3f5c4c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_WaitProcess@
+hs_bindgen_7ea62b336c3f5c4c
+  :: IO (BG.FunPtr (BG.Ptr SDL_Process -> BG.CBool -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_7ea62b336c3f5c4c =
+  BG.fromFFIType hs_bindgen_7ea62b336c3f5c4c_base
+
+{-# NOINLINE sDL_WaitProcess #-}
+
+-- | Wait for a process to finish.
+--
+--     This can be called multiple times to get the status of a process.
+--
+--     The exit code will be the exit code of the process if it terminates normally, a negative signal if it terminated due to a signal, or -255 otherwise. It will not be changed if the process is still running.
+--
+--     If you create a process with standard output piped to the application (@pipe_stdio@ being true) then you should read all of the process output before calling @SDL_WaitProcess()@. If you don\'t do this the process might be blocked indefinitely waiting for output to be read and @SDL_WaitProcess()@ will never return true;
+--
+--     [@process@]: The process to wait for.
+--
+--     [@block@]: If true, block until the process finishes; otherwise, report on the process\' status.
+--
+--     [@exitcode@]: a pointer filled in with the process exit code if the process has exited, may be NULL.
+--
+--     [Returns]: true if the process exited, false otherwise.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_KillProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_WaitProcess@, defined at @SDL3\/SDL_process.h 414:34@
+sDL_WaitProcess :: BG.FunPtr (BG.Ptr SDL_Process -> BG.CBool -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_WaitProcess =
+  BG.unsafePerformIO hs_bindgen_7ea62b336c3f5c4c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_DestroyProcess@
+foreign import ccall unsafe "hs_bindgen_c5cffc00b0da9028"
+  hs_bindgen_c5cffc00b0da9028_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_get_SDL_DestroyProcess@
+hs_bindgen_c5cffc00b0da9028 :: IO (BG.FunPtr (BG.Ptr SDL_Process -> IO ()))
+hs_bindgen_c5cffc00b0da9028 =
+  BG.fromFFIType hs_bindgen_c5cffc00b0da9028_base
+
+{-# NOINLINE sDL_DestroyProcess #-}
+
+-- | Destroy a previously created process object.
+--
+--     Note that this does not stop the process, just destroys the SDL object used to track it. If you want to stop the process you should use @SDL_KillProcess()@.
+--
+--     [@process@]: The process object to destroy.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_KillProcess'
+--
+--     [C declaration]: @SDL_DestroyProcess@, defined at @SDL3\/SDL_process.h 433:34@
+sDL_DestroyProcess :: BG.FunPtr (BG.Ptr SDL_Process -> IO ())
+sDL_DestroyProcess =
+  BG.unsafePerformIO hs_bindgen_c5cffc00b0da9028
diff --git a/src/SDL3/Sys/Bindgen/Process/Safe.hs b/src/SDL3/Sys/Bindgen/Process/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Process/Safe.hs
@@ -0,0 +1,487 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Process.Safe (
+  SDL3.Sys.Bindgen.Process.Safe.sDL_CreateProcess,
+  SDL3.Sys.Bindgen.Process.Safe.sDL_CreateProcessWithProperties,
+  SDL3.Sys.Bindgen.Process.Safe.sDL_GetProcessProperties,
+  SDL3.Sys.Bindgen.Process.Safe.sDL_ReadProcess,
+  SDL3.Sys.Bindgen.Process.Safe.sDL_GetProcessInput,
+  SDL3.Sys.Bindgen.Process.Safe.sDL_GetProcessOutput,
+  SDL3.Sys.Bindgen.Process.Safe.sDL_KillProcess,
+  SDL3.Sys.Bindgen.Process.Safe.sDL_WaitProcess,
+  SDL3.Sys.Bindgen.Process.Safe.sDL_DestroyProcess,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Process
+import SDL3.Sys.Bindgen.Properties qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_process.h>"
+         , "SDL_Process *hs_bindgen_e9112645fd8bb3e7 ("
+         , "  char const *const *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateProcess)(arg1, arg2);"
+         , "}"
+         , "SDL_Process *hs_bindgen_4f99e30fc1a0d086 ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateProcessWithProperties)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_761eafcfd938f5f3 ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetProcessProperties)(arg1);"
+         , "}"
+         , "void *hs_bindgen_2cc49ec5272098a4 ("
+         , "  SDL_Process *arg1,"
+         , "  size_t *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadProcess)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_0f1c12a4756fb56e ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetProcessInput)(arg1);"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_3e1d1e2fdc78eb7a ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetProcessOutput)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_b1711a43b4568e6a ("
+         , "  SDL_Process *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_KillProcess)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_35fc3739c88d9909 ("
+         , "  SDL_Process *arg1,"
+         , "  _Bool arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitProcess)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_6754e69c7206382f ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyProcess)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_CreateProcess@
+foreign import ccall safe "hs_bindgen_e9112645fd8bb3e7"
+  hs_bindgen_e9112645fd8bb3e7_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_CreateProcess@
+hs_bindgen_e9112645fd8bb3e7
+  :: PtrConst.PtrConst (PtrConst.PtrConst BG.CChar)
+  -> BG.CBool
+  -> IO (BG.Ptr SDL_Process)
+hs_bindgen_e9112645fd8bb3e7 =
+  BG.fromFFIType hs_bindgen_e9112645fd8bb3e7_base
+
+-- | Create a new process.
+--
+--     The path to the executable is supplied in args[0]. args[1..N] are additional arguments passed on the command line of the new process, and the argument list should be terminated with a NULL, e.g.:
+--
+--     @
+--     const char *args[] = { \"myprogram\", \"argument\", NULL };
+--     @
+--
+--     Setting pipe_stdio to true is equivalent to setting @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ and @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ to @SDL_PROCESS_STDIO_APP@, and will allow the use of @SDL_ReadProcess()@ or @SDL_GetProcessInput()@ and @SDL_GetProcessOutput()@.
+--
+--     See @SDL_CreateProcessWithProperties()@ for more details.
+--
+--     [Returns]: the newly created and running process, or NULL if the process couldn\'t be created.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcessWithProperties', 'sDL_GetProcessProperties', 'sDL_ReadProcess', 'sDL_GetProcessInput', 'sDL_GetProcessOutput', 'sDL_KillProcess', 'sDL_WaitProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_CreateProcess@, defined at @SDL3\/SDL_process.h 106:43@
+sDL_CreateProcess
+  :: PtrConst.PtrConst (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@args@]: the path and arguments for the new process.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@pipe_stdio@]: true to create pipes to the process\'s standard input and from the process\'s standard output, false for the process to have no input and inherit the application\'s standard output.
+  -> IO (BG.Ptr SDL_Process)
+sDL_CreateProcess = hs_bindgen_e9112645fd8bb3e7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_CreateProcessWithProperties@
+foreign import ccall safe "hs_bindgen_4f99e30fc1a0d086"
+  hs_bindgen_4f99e30fc1a0d086_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_CreateProcessWithProperties@
+hs_bindgen_4f99e30fc1a0d086
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Process)
+hs_bindgen_4f99e30fc1a0d086 =
+  BG.fromFFIType hs_bindgen_4f99e30fc1a0d086_base
+
+-- | Create a new process with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_PROCESS_CREATE_ARGS_POINTER'@: an array of strings containing the program to run, any arguments, and a NULL pointer, e.g. const char *args[] = { \"myprogram\", \"argument\", NULL }. This is a required property.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER'@: an SDL_Environment pointer. If this property is set, it will be the entire environment for the process, otherwise the current environment is used.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING'@: a UTF-8 encoded string representing the working directory for the process, defaults to the current working directory.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@: an 'SDL_ProcessIO' value describing where standard input for the process comes from, defaults to @SDL_PROCESS_STDIO_NULL@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDIN_POINTER'@: an SDL_IOStream pointer used for standard input when @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@: an 'SDL_ProcessIO' value describing where standard output for the process goes to, defaults to @SDL_PROCESS_STDIO_INHERITED@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDOUT_POINTER'@: an SDL_IOStream pointer used for standard output when @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@: an 'SDL_ProcessIO' value describing where standard error for the process goes to, defaults to @SDL_PROCESS_STDIO_INHERITED@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_POINTER'@: an SDL_IOStream pointer used for standard error when @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN'@: true if the error output of the process should be redirected into the standard output of the process. This property has no effect if @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ is set.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN'@: true if the process should run in the background. In this case the default input and output is @SDL_PROCESS_STDIO_NULL@ and the exitcode of the process is not available, and will always be 0.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_CMDLINE_STRING'@: a string containing the program to run and any parameters. This string is passed directly to @CreateProcess@ on Windows, and does nothing on other platforms. This property is only important if you want to start programs that does non-standard command-line processing, and in most cases using @'sDL_PROP_PROCESS_CREATE_ARGS_POINTER'@ is sufficient.
+--
+--     On POSIX platforms, wait() and waitpid(-1, ...) should not be called, and SIGCHLD should not be ignored or handled because those would prevent SDL from properly tracking the lifetime of the underlying process. You should use @SDL_WaitProcess()@ instead.
+--
+--     [Returns]: the newly created and running process, or NULL if the process couldn\'t be created.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_GetProcessProperties', 'sDL_ReadProcess', 'sDL_GetProcessInput', 'sDL_GetProcessOutput', 'sDL_KillProcess', 'sDL_WaitProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_CreateProcessWithProperties@, defined at @SDL3\/SDL_process.h 227:43@
+sDL_CreateProcessWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Process)
+sDL_CreateProcessWithProperties =
+  hs_bindgen_4f99e30fc1a0d086
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_GetProcessProperties@
+foreign import ccall safe "hs_bindgen_761eafcfd938f5f3"
+  hs_bindgen_761eafcfd938f5f3_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_GetProcessProperties@
+hs_bindgen_761eafcfd938f5f3
+  :: BG.Ptr SDL_Process
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_761eafcfd938f5f3 =
+  BG.fromFFIType hs_bindgen_761eafcfd938f5f3_base
+
+-- | Get the properties associated with a process.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_PROCESS_PID_NUMBER'@: the process ID of the process.
+--
+--     * @'sDL_PROP_PROCESS_STDIN_POINTER'@: an SDL_IOStream that can be used to write input to the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_STDOUT_POINTER'@: a non-blocking SDL_IOStream that can be used to read output from the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_STDERR_POINTER'@: a non-blocking SDL_IOStream that can be used to read error output from the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_BACKGROUND_BOOLEAN'@: true if the process is running in the background.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties'
+--
+--     [C declaration]: @SDL_GetProcessProperties@, defined at @SDL3\/SDL_process.h 271:46@
+sDL_GetProcessProperties
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: the process to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetProcessProperties =
+  hs_bindgen_761eafcfd938f5f3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_ReadProcess@
+foreign import ccall safe "hs_bindgen_2cc49ec5272098a4"
+  hs_bindgen_2cc49ec5272098a4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_ReadProcess@
+hs_bindgen_2cc49ec5272098a4
+  :: BG.Ptr SDL_Process
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_2cc49ec5272098a4 =
+  BG.fromFFIType hs_bindgen_2cc49ec5272098a4_base
+
+-- | Read all the output from a process.
+--
+--     If a process was created with I\/O enabled, you can use this function to read the output. This function blocks until the process is complete, capturing all output, and providing the process exit code.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with SDL_free().
+--
+--     [Returns]: the data or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_ReadProcess@, defined at @SDL3\/SDL_process.h 308:36@
+sDL_ReadProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to read.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: a pointer filled in with the number of bytes read, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@exitcode@]: a pointer filled in with the process exit code if the process has exited, may be NULL.
+  -> IO (BG.Ptr BG.Void)
+sDL_ReadProcess = hs_bindgen_2cc49ec5272098a4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_GetProcessInput@
+foreign import ccall safe "hs_bindgen_0f1c12a4756fb56e"
+  hs_bindgen_0f1c12a4756fb56e_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_GetProcessInput@
+hs_bindgen_0f1c12a4756fb56e
+  :: BG.Ptr SDL_Process
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+hs_bindgen_0f1c12a4756fb56e =
+  BG.fromFFIType hs_bindgen_0f1c12a4756fb56e_base
+
+-- | Get the SDL_IOStream associated with process standard input.
+--
+--     The process must have been created with @SDL_CreateProcess()@ and pipe_stdio set to true, or with @SDL_CreateProcessWithProperties()@ and @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     Writing to this stream can return less data than expected if the process hasn\'t read its input. It may be blocked waiting for its output to be read, if so you may need to call @SDL_GetProcessOutput()@ and read the output in parallel with writing input.
+--
+--     [Returns]: the input stream or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_GetProcessOutput'
+--
+--     [C declaration]: @SDL_GetProcessInput@, defined at @SDL3\/SDL_process.h 334:44@
+sDL_GetProcessInput
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to get the input stream for.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+sDL_GetProcessInput = hs_bindgen_0f1c12a4756fb56e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_GetProcessOutput@
+foreign import ccall safe "hs_bindgen_3e1d1e2fdc78eb7a"
+  hs_bindgen_3e1d1e2fdc78eb7a_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_GetProcessOutput@
+hs_bindgen_3e1d1e2fdc78eb7a
+  :: BG.Ptr SDL_Process
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+hs_bindgen_3e1d1e2fdc78eb7a =
+  BG.fromFFIType hs_bindgen_3e1d1e2fdc78eb7a_base
+
+-- | Get the SDL_IOStream associated with process standard output.
+--
+--     The process must have been created with @SDL_CreateProcess()@ and pipe_stdio set to true, or with @SDL_CreateProcessWithProperties()@ and @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     Reading from this stream can return 0 with SDL_GetIOStatus() returning SDL_IO_STATUS_NOT_READY if no output is available yet.
+--
+--     [Returns]: the output stream or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_GetProcessInput'
+--
+--     [C declaration]: @SDL_GetProcessOutput@, defined at @SDL3\/SDL_process.h 358:44@
+sDL_GetProcessOutput
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to get the output stream for.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+sDL_GetProcessOutput = hs_bindgen_3e1d1e2fdc78eb7a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_KillProcess@
+foreign import ccall safe "hs_bindgen_b1711a43b4568e6a"
+  hs_bindgen_b1711a43b4568e6a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_KillProcess@
+hs_bindgen_b1711a43b4568e6a
+  :: BG.Ptr SDL_Process
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_b1711a43b4568e6a =
+  BG.fromFFIType hs_bindgen_b1711a43b4568e6a_base
+
+-- | Stop a process.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_WaitProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_KillProcess@, defined at @SDL3\/SDL_process.h 381:34@
+sDL_KillProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to stop.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@force@]: true to terminate the process immediately, false to try to stop the process gracefully. In general you should try to stop the process gracefully first as terminating a process may leave it with half-written data or in some other unstable state.
+  -> IO BG.CBool
+sDL_KillProcess = hs_bindgen_b1711a43b4568e6a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_WaitProcess@
+foreign import ccall safe "hs_bindgen_35fc3739c88d9909"
+  hs_bindgen_35fc3739c88d9909_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_WaitProcess@
+hs_bindgen_35fc3739c88d9909
+  :: BG.Ptr SDL_Process
+  -> BG.CBool
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_35fc3739c88d9909 =
+  BG.fromFFIType hs_bindgen_35fc3739c88d9909_base
+
+-- | Wait for a process to finish.
+--
+--     This can be called multiple times to get the status of a process.
+--
+--     The exit code will be the exit code of the process if it terminates normally, a negative signal if it terminated due to a signal, or -255 otherwise. It will not be changed if the process is still running.
+--
+--     If you create a process with standard output piped to the application (@pipe_stdio@ being true) then you should read all of the process output before calling @SDL_WaitProcess()@. If you don\'t do this the process might be blocked indefinitely waiting for output to be read and @SDL_WaitProcess()@ will never return true;
+--
+--     [Returns]: true if the process exited, false otherwise.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_KillProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_WaitProcess@, defined at @SDL3\/SDL_process.h 414:34@
+sDL_WaitProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to wait for.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@block@]: If true, block until the process finishes; otherwise, report on the process\' status.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@exitcode@]: a pointer filled in with the process exit code if the process has exited, may be NULL.
+  -> IO BG.CBool
+sDL_WaitProcess = hs_bindgen_35fc3739c88d9909
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_DestroyProcess@
+foreign import ccall safe "hs_bindgen_6754e69c7206382f"
+  hs_bindgen_6754e69c7206382f_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Safe_SDL_DestroyProcess@
+hs_bindgen_6754e69c7206382f
+  :: BG.Ptr SDL_Process
+  -> IO ()
+hs_bindgen_6754e69c7206382f =
+  BG.fromFFIType hs_bindgen_6754e69c7206382f_base
+
+-- | Destroy a previously created process object.
+--
+--     Note that this does not stop the process, just destroys the SDL object used to track it. If you want to stop the process you should use @SDL_KillProcess()@.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_KillProcess'
+--
+--     [C declaration]: @SDL_DestroyProcess@, defined at @SDL3\/SDL_process.h 433:34@
+sDL_DestroyProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process object to destroy.
+  -> IO ()
+sDL_DestroyProcess = hs_bindgen_6754e69c7206382f
diff --git a/src/SDL3/Sys/Bindgen/Process/Unsafe.hs b/src/SDL3/Sys/Bindgen/Process/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Process/Unsafe.hs
@@ -0,0 +1,487 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Process.Unsafe (
+  SDL3.Sys.Bindgen.Process.Unsafe.sDL_CreateProcess,
+  SDL3.Sys.Bindgen.Process.Unsafe.sDL_CreateProcessWithProperties,
+  SDL3.Sys.Bindgen.Process.Unsafe.sDL_GetProcessProperties,
+  SDL3.Sys.Bindgen.Process.Unsafe.sDL_ReadProcess,
+  SDL3.Sys.Bindgen.Process.Unsafe.sDL_GetProcessInput,
+  SDL3.Sys.Bindgen.Process.Unsafe.sDL_GetProcessOutput,
+  SDL3.Sys.Bindgen.Process.Unsafe.sDL_KillProcess,
+  SDL3.Sys.Bindgen.Process.Unsafe.sDL_WaitProcess,
+  SDL3.Sys.Bindgen.Process.Unsafe.sDL_DestroyProcess,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Process
+import SDL3.Sys.Bindgen.Properties qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_process.h>"
+         , "SDL_Process *hs_bindgen_78513fa7f22d15d7 ("
+         , "  char const *const *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateProcess)(arg1, arg2);"
+         , "}"
+         , "SDL_Process *hs_bindgen_7c44340d0c8ec6ad ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateProcessWithProperties)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_9c4ff433837a24fa ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetProcessProperties)(arg1);"
+         , "}"
+         , "void *hs_bindgen_b8bb7b72f4eb9fbf ("
+         , "  SDL_Process *arg1,"
+         , "  size_t *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadProcess)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_dd51a7420ce5a7f0 ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetProcessInput)(arg1);"
+         , "}"
+         , "SDL_IOStream *hs_bindgen_79cd69dab2697ccc ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetProcessOutput)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_780e671175a9ada0 ("
+         , "  SDL_Process *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_KillProcess)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_3fee90eaf94f6b13 ("
+         , "  SDL_Process *arg1,"
+         , "  _Bool arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_WaitProcess)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_c1509b01ba86c9c4 ("
+         , "  SDL_Process *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyProcess)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_CreateProcess@
+foreign import ccall unsafe "hs_bindgen_78513fa7f22d15d7"
+  hs_bindgen_78513fa7f22d15d7_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_CreateProcess@
+hs_bindgen_78513fa7f22d15d7
+  :: PtrConst.PtrConst (PtrConst.PtrConst BG.CChar)
+  -> BG.CBool
+  -> IO (BG.Ptr SDL_Process)
+hs_bindgen_78513fa7f22d15d7 =
+  BG.fromFFIType hs_bindgen_78513fa7f22d15d7_base
+
+-- | Create a new process.
+--
+--     The path to the executable is supplied in args[0]. args[1..N] are additional arguments passed on the command line of the new process, and the argument list should be terminated with a NULL, e.g.:
+--
+--     @
+--     const char *args[] = { \"myprogram\", \"argument\", NULL };
+--     @
+--
+--     Setting pipe_stdio to true is equivalent to setting @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ and @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ to @SDL_PROCESS_STDIO_APP@, and will allow the use of @SDL_ReadProcess()@ or @SDL_GetProcessInput()@ and @SDL_GetProcessOutput()@.
+--
+--     See @SDL_CreateProcessWithProperties()@ for more details.
+--
+--     [Returns]: the newly created and running process, or NULL if the process couldn\'t be created.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcessWithProperties', 'sDL_GetProcessProperties', 'sDL_ReadProcess', 'sDL_GetProcessInput', 'sDL_GetProcessOutput', 'sDL_KillProcess', 'sDL_WaitProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_CreateProcess@, defined at @SDL3\/SDL_process.h 106:43@
+sDL_CreateProcess
+  :: PtrConst.PtrConst (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@args@]: the path and arguments for the new process.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@pipe_stdio@]: true to create pipes to the process\'s standard input and from the process\'s standard output, false for the process to have no input and inherit the application\'s standard output.
+  -> IO (BG.Ptr SDL_Process)
+sDL_CreateProcess = hs_bindgen_78513fa7f22d15d7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_CreateProcessWithProperties@
+foreign import ccall unsafe "hs_bindgen_7c44340d0c8ec6ad"
+  hs_bindgen_7c44340d0c8ec6ad_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_CreateProcessWithProperties@
+hs_bindgen_7c44340d0c8ec6ad
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Process)
+hs_bindgen_7c44340d0c8ec6ad =
+  BG.fromFFIType hs_bindgen_7c44340d0c8ec6ad_base
+
+-- | Create a new process with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_PROCESS_CREATE_ARGS_POINTER'@: an array of strings containing the program to run, any arguments, and a NULL pointer, e.g. const char *args[] = { \"myprogram\", \"argument\", NULL }. This is a required property.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER'@: an SDL_Environment pointer. If this property is set, it will be the entire environment for the process, otherwise the current environment is used.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING'@: a UTF-8 encoded string representing the working directory for the process, defaults to the current working directory.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@: an 'SDL_ProcessIO' value describing where standard input for the process comes from, defaults to @SDL_PROCESS_STDIO_NULL@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDIN_POINTER'@: an SDL_IOStream pointer used for standard input when @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@: an 'SDL_ProcessIO' value describing where standard output for the process goes to, defaults to @SDL_PROCESS_STDIO_INHERITED@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDOUT_POINTER'@: an SDL_IOStream pointer used for standard output when @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@: an 'SDL_ProcessIO' value describing where standard error for the process goes to, defaults to @SDL_PROCESS_STDIO_INHERITED@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_POINTER'@: an SDL_IOStream pointer used for standard error when @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN'@: true if the error output of the process should be redirected into the standard output of the process. This property has no effect if @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ is set.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN'@: true if the process should run in the background. In this case the default input and output is @SDL_PROCESS_STDIO_NULL@ and the exitcode of the process is not available, and will always be 0.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_CMDLINE_STRING'@: a string containing the program to run and any parameters. This string is passed directly to @CreateProcess@ on Windows, and does nothing on other platforms. This property is only important if you want to start programs that does non-standard command-line processing, and in most cases using @'sDL_PROP_PROCESS_CREATE_ARGS_POINTER'@ is sufficient.
+--
+--     On POSIX platforms, wait() and waitpid(-1, ...) should not be called, and SIGCHLD should not be ignored or handled because those would prevent SDL from properly tracking the lifetime of the underlying process. You should use @SDL_WaitProcess()@ instead.
+--
+--     [Returns]: the newly created and running process, or NULL if the process couldn\'t be created.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_GetProcessProperties', 'sDL_ReadProcess', 'sDL_GetProcessInput', 'sDL_GetProcessOutput', 'sDL_KillProcess', 'sDL_WaitProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_CreateProcessWithProperties@, defined at @SDL3\/SDL_process.h 227:43@
+sDL_CreateProcessWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Process)
+sDL_CreateProcessWithProperties =
+  hs_bindgen_7c44340d0c8ec6ad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_GetProcessProperties@
+foreign import ccall unsafe "hs_bindgen_9c4ff433837a24fa"
+  hs_bindgen_9c4ff433837a24fa_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_GetProcessProperties@
+hs_bindgen_9c4ff433837a24fa
+  :: BG.Ptr SDL_Process
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_9c4ff433837a24fa =
+  BG.fromFFIType hs_bindgen_9c4ff433837a24fa_base
+
+-- | Get the properties associated with a process.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_PROCESS_PID_NUMBER'@: the process ID of the process.
+--
+--     * @'sDL_PROP_PROCESS_STDIN_POINTER'@: an SDL_IOStream that can be used to write input to the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_STDOUT_POINTER'@: a non-blocking SDL_IOStream that can be used to read output from the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_STDERR_POINTER'@: a non-blocking SDL_IOStream that can be used to read error output from the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_BACKGROUND_BOOLEAN'@: true if the process is running in the background.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties'
+--
+--     [C declaration]: @SDL_GetProcessProperties@, defined at @SDL3\/SDL_process.h 271:46@
+sDL_GetProcessProperties
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: the process to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetProcessProperties =
+  hs_bindgen_9c4ff433837a24fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_ReadProcess@
+foreign import ccall unsafe "hs_bindgen_b8bb7b72f4eb9fbf"
+  hs_bindgen_b8bb7b72f4eb9fbf_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_ReadProcess@
+hs_bindgen_b8bb7b72f4eb9fbf
+  :: BG.Ptr SDL_Process
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_b8bb7b72f4eb9fbf =
+  BG.fromFFIType hs_bindgen_b8bb7b72f4eb9fbf_base
+
+-- | Read all the output from a process.
+--
+--     If a process was created with I\/O enabled, you can use this function to read the output. This function blocks until the process is complete, capturing all output, and providing the process exit code.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with SDL_free().
+--
+--     [Returns]: the data or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_ReadProcess@, defined at @SDL3\/SDL_process.h 308:36@
+sDL_ReadProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to read.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: a pointer filled in with the number of bytes read, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@exitcode@]: a pointer filled in with the process exit code if the process has exited, may be NULL.
+  -> IO (BG.Ptr BG.Void)
+sDL_ReadProcess = hs_bindgen_b8bb7b72f4eb9fbf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_GetProcessInput@
+foreign import ccall unsafe "hs_bindgen_dd51a7420ce5a7f0"
+  hs_bindgen_dd51a7420ce5a7f0_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_GetProcessInput@
+hs_bindgen_dd51a7420ce5a7f0
+  :: BG.Ptr SDL_Process
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+hs_bindgen_dd51a7420ce5a7f0 =
+  BG.fromFFIType hs_bindgen_dd51a7420ce5a7f0_base
+
+-- | Get the SDL_IOStream associated with process standard input.
+--
+--     The process must have been created with @SDL_CreateProcess()@ and pipe_stdio set to true, or with @SDL_CreateProcessWithProperties()@ and @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     Writing to this stream can return less data than expected if the process hasn\'t read its input. It may be blocked waiting for its output to be read, if so you may need to call @SDL_GetProcessOutput()@ and read the output in parallel with writing input.
+--
+--     [Returns]: the input stream or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_GetProcessOutput'
+--
+--     [C declaration]: @SDL_GetProcessInput@, defined at @SDL3\/SDL_process.h 334:44@
+sDL_GetProcessInput
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to get the input stream for.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+sDL_GetProcessInput = hs_bindgen_dd51a7420ce5a7f0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_GetProcessOutput@
+foreign import ccall unsafe "hs_bindgen_79cd69dab2697ccc"
+  hs_bindgen_79cd69dab2697ccc_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_GetProcessOutput@
+hs_bindgen_79cd69dab2697ccc
+  :: BG.Ptr SDL_Process
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+hs_bindgen_79cd69dab2697ccc =
+  BG.fromFFIType hs_bindgen_79cd69dab2697ccc_base
+
+-- | Get the SDL_IOStream associated with process standard output.
+--
+--     The process must have been created with @SDL_CreateProcess()@ and pipe_stdio set to true, or with @SDL_CreateProcessWithProperties()@ and @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     Reading from this stream can return 0 with SDL_GetIOStatus() returning SDL_IO_STATUS_NOT_READY if no output is available yet.
+--
+--     [Returns]: the output stream or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_GetProcessInput'
+--
+--     [C declaration]: @SDL_GetProcessOutput@, defined at @SDL3\/SDL_process.h 358:44@
+sDL_GetProcessOutput
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to get the output stream for.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+sDL_GetProcessOutput = hs_bindgen_79cd69dab2697ccc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_KillProcess@
+foreign import ccall unsafe "hs_bindgen_780e671175a9ada0"
+  hs_bindgen_780e671175a9ada0_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_KillProcess@
+hs_bindgen_780e671175a9ada0
+  :: BG.Ptr SDL_Process
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_780e671175a9ada0 =
+  BG.fromFFIType hs_bindgen_780e671175a9ada0_base
+
+-- | Stop a process.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_WaitProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_KillProcess@, defined at @SDL3\/SDL_process.h 381:34@
+sDL_KillProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to stop.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@force@]: true to terminate the process immediately, false to try to stop the process gracefully. In general you should try to stop the process gracefully first as terminating a process may leave it with half-written data or in some other unstable state.
+  -> IO BG.CBool
+sDL_KillProcess = hs_bindgen_780e671175a9ada0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_WaitProcess@
+foreign import ccall unsafe "hs_bindgen_3fee90eaf94f6b13"
+  hs_bindgen_3fee90eaf94f6b13_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_WaitProcess@
+hs_bindgen_3fee90eaf94f6b13
+  :: BG.Ptr SDL_Process
+  -> BG.CBool
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_3fee90eaf94f6b13 =
+  BG.fromFFIType hs_bindgen_3fee90eaf94f6b13_base
+
+-- | Wait for a process to finish.
+--
+--     This can be called multiple times to get the status of a process.
+--
+--     The exit code will be the exit code of the process if it terminates normally, a negative signal if it terminated due to a signal, or -255 otherwise. It will not be changed if the process is still running.
+--
+--     If you create a process with standard output piped to the application (@pipe_stdio@ being true) then you should read all of the process output before calling @SDL_WaitProcess()@. If you don\'t do this the process might be blocked indefinitely waiting for output to be read and @SDL_WaitProcess()@ will never return true;
+--
+--     [Returns]: true if the process exited, false otherwise.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_KillProcess', 'sDL_DestroyProcess'
+--
+--     [C declaration]: @SDL_WaitProcess@, defined at @SDL3\/SDL_process.h 414:34@
+sDL_WaitProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to wait for.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@block@]: If true, block until the process finishes; otherwise, report on the process\' status.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@exitcode@]: a pointer filled in with the process exit code if the process has exited, may be NULL.
+  -> IO BG.CBool
+sDL_WaitProcess = hs_bindgen_3fee90eaf94f6b13
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_DestroyProcess@
+foreign import ccall unsafe "hs_bindgen_c1509b01ba86c9c4"
+  hs_bindgen_c1509b01ba86c9c4_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Process_Unsafe_SDL_DestroyProcess@
+hs_bindgen_c1509b01ba86c9c4
+  :: BG.Ptr SDL_Process
+  -> IO ()
+hs_bindgen_c1509b01ba86c9c4 =
+  BG.fromFFIType hs_bindgen_c1509b01ba86c9c4_base
+
+-- | Destroy a previously created process object.
+--
+--     Note that this does not stop the process, just destroys the SDL object used to track it. If you want to stop the process you should use @SDL_KillProcess()@.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProcess', 'sDL_CreateProcessWithProperties', 'sDL_KillProcess'
+--
+--     [C declaration]: @SDL_DestroyProcess@, defined at @SDL3\/SDL_process.h 433:34@
+sDL_DestroyProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process object to destroy.
+  -> IO ()
+sDL_DestroyProcess = hs_bindgen_c1509b01ba86c9c4
diff --git a/src/SDL3/Sys/Bindgen/Properties.hs b/src/SDL3/Sys/Bindgen/Properties.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Properties.hs
@@ -0,0 +1,497 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | A property is a variable that can be created and retrieved by name at runtime.
+--
+--     All properties are part of a property group ('SDL_PropertiesID'). A property group can be created with the SDL_CreateProperties function and destroyed with the SDL_DestroyProperties function.
+--
+--     Properties can be added to and retrieved from a property group through the following functions:
+--
+--     * SDL_SetPointerProperty and SDL_GetPointerProperty operate on @void*@ pointer types.
+--
+--     * SDL_SetStringProperty and SDL_GetStringProperty operate on string types.
+--
+--     * SDL_SetNumberProperty and SDL_GetNumberProperty operate on signed 64-bit integer types.
+--
+--     * SDL_SetFloatProperty and SDL_GetFloatProperty operate on floating point types.
+--
+--     * SDL_SetBooleanProperty and SDL_GetBooleanProperty operate on boolean types.
+--
+--     Properties can be removed from a group by using SDL_ClearProperty. An ID that represents a properties set.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Properties (
+  SDL3.Sys.Bindgen.Properties.SDL_PropertiesID (..),
+  SDL3.Sys.Bindgen.Properties.SDL_PropertyType (..),
+  pattern SDL3.Sys.Bindgen.Properties.SDL_PROPERTY_TYPE_INVALID,
+  pattern SDL3.Sys.Bindgen.Properties.SDL_PROPERTY_TYPE_POINTER,
+  pattern SDL3.Sys.Bindgen.Properties.SDL_PROPERTY_TYPE_STRING,
+  pattern SDL3.Sys.Bindgen.Properties.SDL_PROPERTY_TYPE_NUMBER,
+  pattern SDL3.Sys.Bindgen.Properties.SDL_PROPERTY_TYPE_FLOAT,
+  pattern SDL3.Sys.Bindgen.Properties.SDL_PROPERTY_TYPE_BOOLEAN,
+  SDL3.Sys.Bindgen.Properties.sDL_PROP_NAME_STRING,
+  SDL3.Sys.Bindgen.Properties.SDL_CleanupPropertyCallback_Aux (..),
+  SDL3.Sys.Bindgen.Properties.SDL_CleanupPropertyCallback (..),
+  SDL3.Sys.Bindgen.Properties.SDL_EnumeratePropertiesCallback_Aux (..),
+  SDL3.Sys.Bindgen.Properties.SDL_EnumeratePropertiesCallback (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_PropertiesID@, defined at @SDL3\/SDL_properties.h 66:16@
+newtype SDL_PropertiesID = SDL_PropertiesID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_PropertiesID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PropertiesID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PropertiesID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PropertiesID "unwrap" where
+  type
+    CFieldType SDL_PropertiesID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | SDL property type
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_PropertyType@, defined at @SDL3\/SDL_properties.h 73:14@
+newtype SDL_PropertyType = SDL_PropertyType
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_PropertyType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_PropertyType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_PropertyType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_PropertyType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_PropertyType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_PropertyType instance BG.Storable SDL_PropertyType
+
+deriving via BG.CUInt instance BG.Prim SDL_PropertyType
+
+instance CEnum.CEnum SDL_PropertyType where
+  type CEnumZ SDL_PropertyType = BG.CUInt
+
+  toCEnum = SDL_PropertyType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_PROPERTY_TYPE_INVALID")
+        , (1, BG.singleton "SDL_PROPERTY_TYPE_POINTER")
+        , (2, BG.singleton "SDL_PROPERTY_TYPE_STRING")
+        , (3, BG.singleton "SDL_PROPERTY_TYPE_NUMBER")
+        , (4, BG.singleton "SDL_PROPERTY_TYPE_FLOAT")
+        , (5, BG.singleton "SDL_PROPERTY_TYPE_BOOLEAN")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_PropertyType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_PropertyType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_PropertyType where
+  minDeclaredValue = SDL_PROPERTY_TYPE_INVALID
+
+  maxDeclaredValue = SDL_PROPERTY_TYPE_BOOLEAN
+
+instance Show SDL_PropertyType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_PropertyType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_PropertyType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_PropertyType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_PropertyType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_PropertyType "unwrap" where
+  type CFieldType SDL_PropertyType "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_PROPERTY_TYPE_INVALID@, defined at @SDL3\/SDL_properties.h 75:5@
+pattern SDL_PROPERTY_TYPE_INVALID :: SDL_PropertyType
+pattern SDL_PROPERTY_TYPE_INVALID = SDL_PropertyType 0
+
+-- | [C declaration]: @SDL_PROPERTY_TYPE_POINTER@, defined at @SDL3\/SDL_properties.h 76:5@
+pattern SDL_PROPERTY_TYPE_POINTER :: SDL_PropertyType
+pattern SDL_PROPERTY_TYPE_POINTER = SDL_PropertyType 1
+
+-- | [C declaration]: @SDL_PROPERTY_TYPE_STRING@, defined at @SDL3\/SDL_properties.h 77:5@
+pattern SDL_PROPERTY_TYPE_STRING :: SDL_PropertyType
+pattern SDL_PROPERTY_TYPE_STRING = SDL_PropertyType 2
+
+-- | [C declaration]: @SDL_PROPERTY_TYPE_NUMBER@, defined at @SDL3\/SDL_properties.h 78:5@
+pattern SDL_PROPERTY_TYPE_NUMBER :: SDL_PropertyType
+pattern SDL_PROPERTY_TYPE_NUMBER = SDL_PropertyType 3
+
+-- | [C declaration]: @SDL_PROPERTY_TYPE_FLOAT@, defined at @SDL3\/SDL_properties.h 79:5@
+pattern SDL_PROPERTY_TYPE_FLOAT :: SDL_PropertyType
+pattern SDL_PROPERTY_TYPE_FLOAT = SDL_PropertyType 4
+
+-- | [C declaration]: @SDL_PROPERTY_TYPE_BOOLEAN@, defined at @SDL3\/SDL_properties.h 80:5@
+pattern SDL_PROPERTY_TYPE_BOOLEAN :: SDL_PropertyType
+pattern SDL_PROPERTY_TYPE_BOOLEAN = SDL_PropertyType 5
+
+-- | A generic property for naming things.
+--
+--     This property is intended to be added to any 'SDL_PropertiesID' that needs a generic name associated with the property set. It is not guaranteed that any property set will include this key, but it is convenient to have a standard key that any piece of code could reasonably agree to use.
+--
+--     For example, the properties associated with an SDL_Texture might have a name string of \"player sprites\", or an SDL_AudioStream might have \"background music\", etc. This might also be useful for an SDL_IOStream to list the path to its asset.
+--
+--     There is no format for the value set with this key; it is expected to be human-readable and informational in nature, possibly for logging or debugging purposes.
+--
+--     SDL does not currently set this property on any objects it creates, but this may change in later versions; it is currently expected that apps and external libraries will take advantage of it, when appropriate.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_PROP_NAME_STRING@, literal @\"SDL.name\"@, defined at @SDL3\/SDL_properties.h 106:9@
+sDL_PROP_NAME_STRING :: BG.ByteString
+sDL_PROP_NAME_STRING =
+  BG.pack [0x53, 0x44, 0x4C, 0x2E, 0x6E, 0x61, 0x6D, 0x65]
+
+-- | Auxiliary type used by 'SDL_CleanupPropertyCallback'
+--
+--     [C declaration]: @SDL_CleanupPropertyCallback@, defined at @SDL3\/SDL_properties.h 216:24@
+newtype SDL_CleanupPropertyCallback_Aux = SDL_CleanupPropertyCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_CleanupPropertyCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_8958b9cfa7a05766_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ()))
+
+-- __unique:__ @toSDL_CleanupPropertyCallback_Aux@
+hs_bindgen_8958b9cfa7a05766
+  :: SDL_CleanupPropertyCallback_Aux
+  -> IO (BG.FunPtr SDL_CleanupPropertyCallback_Aux)
+hs_bindgen_8958b9cfa7a05766 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_8958b9cfa7a05766_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_CleanupPropertyCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_c4ac4678b65d3d15_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ())
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @fromSDL_CleanupPropertyCallback_Aux@
+hs_bindgen_c4ac4678b65d3d15
+  :: BG.FunPtr SDL_CleanupPropertyCallback_Aux
+  -> SDL_CleanupPropertyCallback_Aux
+hs_bindgen_c4ac4678b65d3d15 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_c4ac4678b65d3d15_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_CleanupPropertyCallback_Aux where
+  toFunPtr = hs_bindgen_8958b9cfa7a05766
+
+instance BG.FromFunPtr SDL_CleanupPropertyCallback_Aux where
+  fromFunPtr = hs_bindgen_c4ac4678b65d3d15
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_CleanupPropertyCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CleanupPropertyCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_CleanupPropertyCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_CleanupPropertyCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_CleanupPropertyCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback used to free resources when a property is deleted.
+--
+--     This should release any resources associated with @value@ that are no longer needed.
+--
+--     This callback is set per-property. Different properties in the same group can have different cleanup callbacks.
+--
+--     This callback will be called /during/ SDL_SetPointerPropertyWithCleanup if the function fails for any reason.
+--
+--     [@userdata@]: an app-defined pointer passed to the callback.
+--
+--     [@value@]: the pointer assigned to the property to clean up.
+--
+--     [Thread safety]: This callback may fire without any locks held; if this is a concern, the app should provide its own locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetPointerPropertyWithCleanup'
+--
+--     [C declaration]: @SDL_CleanupPropertyCallback@, defined at @SDL3\/SDL_properties.h 216:24@
+newtype SDL_CleanupPropertyCallback = SDL_CleanupPropertyCallback
+  { unwrap :: BG.FunPtr SDL_CleanupPropertyCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_CleanupPropertyCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_CleanupPropertyCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CleanupPropertyCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_CleanupPropertyCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_CleanupPropertyCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_CleanupPropertyCallback "unwrap" where
+  type
+    CFieldType SDL_CleanupPropertyCallback "unwrap" =
+      BG.FunPtr SDL_CleanupPropertyCallback_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_EnumeratePropertiesCallback'
+--
+--     [C declaration]: @SDL_EnumeratePropertiesCallback@, defined at @SDL3\/SDL_properties.h 528:24@
+newtype SDL_EnumeratePropertiesCallback_Aux = SDL_EnumeratePropertiesCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_EnumeratePropertiesCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_b271d6d6058a1326_base
+    :: (BG.Ptr BG.Void -> BG.Word32 -> BG.Ptr BG.Void -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Word32 -> BG.Ptr BG.Void -> IO ()))
+
+-- __unique:__ @toSDL_EnumeratePropertiesCallback_Aux@
+hs_bindgen_b271d6d6058a1326
+  :: SDL_EnumeratePropertiesCallback_Aux
+  -> IO (BG.FunPtr SDL_EnumeratePropertiesCallback_Aux)
+hs_bindgen_b271d6d6058a1326 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_b271d6d6058a1326_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_EnumeratePropertiesCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_89dc6b6814ba4336_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Word32 -> BG.Ptr BG.Void -> IO ())
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @fromSDL_EnumeratePropertiesCallback_Aux@
+hs_bindgen_89dc6b6814ba4336
+  :: BG.FunPtr SDL_EnumeratePropertiesCallback_Aux
+  -> SDL_EnumeratePropertiesCallback_Aux
+hs_bindgen_89dc6b6814ba4336 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_89dc6b6814ba4336_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_EnumeratePropertiesCallback_Aux where
+  toFunPtr = hs_bindgen_b271d6d6058a1326
+
+instance BG.FromFunPtr SDL_EnumeratePropertiesCallback_Aux where
+  fromFunPtr = hs_bindgen_89dc6b6814ba4336
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_EnumeratePropertiesCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EnumeratePropertiesCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_EnumeratePropertiesCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EnumeratePropertiesCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_EnumeratePropertiesCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback used to enumerate all the properties in a group of properties.
+--
+--     This callback is called from @SDL_EnumerateProperties()@, and is called once per property in the set.
+--
+--     [@userdata@]: an app-defined pointer passed to the callback.
+--
+--     [@props@]: the 'SDL_PropertiesID' that is being enumerated.
+--
+--     [@name@]: the next property name in the enumeration.
+--
+--     [Thread safety]: SDL_EnumerateProperties holds a lock on @props@ during this callback.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EnumerateProperties'
+--
+--     [C declaration]: @SDL_EnumeratePropertiesCallback@, defined at @SDL3\/SDL_properties.h 528:24@
+newtype SDL_EnumeratePropertiesCallback = SDL_EnumeratePropertiesCallback
+  { unwrap :: BG.FunPtr SDL_EnumeratePropertiesCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_EnumeratePropertiesCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_EnumeratePropertiesCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EnumeratePropertiesCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_EnumeratePropertiesCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EnumeratePropertiesCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EnumeratePropertiesCallback "unwrap" where
+  type
+    CFieldType SDL_EnumeratePropertiesCallback "unwrap" =
+      BG.FunPtr SDL_EnumeratePropertiesCallback_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Properties/FunPtr.hs b/src/SDL3/Sys/Bindgen/Properties/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Properties/FunPtr.hs
@@ -0,0 +1,992 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Properties.FunPtr (
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_GetGlobalProperties,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_CreateProperties,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_CopyProperties,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_LockProperties,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_UnlockProperties,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_SetPointerPropertyWithCleanup,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_SetPointerProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_SetStringProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_SetNumberProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_SetFloatProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_SetBooleanProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_HasProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_GetPropertyType,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_GetPointerProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_GetStringProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_GetNumberProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_GetFloatProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_GetBooleanProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_ClearProperty,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_EnumerateProperties,
+  SDL3.Sys.Bindgen.Properties.FunPtr.sDL_DestroyProperties,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Properties
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_properties.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetGlobalProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_4541df72a2cb85f8 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetGlobalProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_CreateProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_92049f9b61449963 (void)) (void)"
+         , "{"
+         , "  return &SDL_CreateProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_CopyProperties */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_38190d3cf84485c4 (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CopyProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_LockProperties */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6ec499eda3697959 (void)) ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_LockProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_UnlockProperties */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_9ae8d54eb30e84b4 (void)) ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_UnlockProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetPointerPropertyWithCleanup */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_94c8b4d65016ddab (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3,"
+         , "  SDL_CleanupPropertyCallback arg4,"
+         , "  void *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_SetPointerPropertyWithCleanup;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetPointerProperty */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_30ddc8c86a006598 (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetPointerProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetStringProperty */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_88fe6ad057838726 (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetStringProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetNumberProperty */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_00c22270473dd8bf (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  Sint64 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetNumberProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetFloatProperty */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b49813020974606a (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetFloatProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetBooleanProperty */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3d0623558bc4ff3f (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetBooleanProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_HasProperty */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_260dc721ec409d1a (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_HasProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetPropertyType */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertyType (*hs_bindgen_3191a0bffc4788d9 (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetPropertyType;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetPointerProperty */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_daed4139b3c79d17 (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetPointerProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetStringProperty */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_adc8eafafff23d41 (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetStringProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetNumberProperty */"
+         , "__attribute__ ((const))"
+         , "Sint64 (*hs_bindgen_16bb2facf7635001 (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  Sint64 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetNumberProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetFloatProperty */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_661775cfc76e4f5c (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetFloatProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetBooleanProperty */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9161fc8f2af4a306 (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetBooleanProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_ClearProperty */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_89fcf415f7fa8ee4 (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ClearProperty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_EnumerateProperties */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_816e33716bb87f04 (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  SDL_EnumeratePropertiesCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_EnumerateProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_DestroyProperties */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_2034830c5f638bf5 (void)) ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyProperties;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetGlobalProperties@
+foreign import ccall unsafe "hs_bindgen_4541df72a2cb85f8"
+  hs_bindgen_4541df72a2cb85f8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetGlobalProperties@
+hs_bindgen_4541df72a2cb85f8 :: IO (BG.FunPtr (IO SDL_PropertiesID))
+hs_bindgen_4541df72a2cb85f8 =
+  BG.fromFFIType hs_bindgen_4541df72a2cb85f8_base
+
+{-# NOINLINE sDL_GetGlobalProperties #-}
+
+-- | Get the global SDL properties.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGlobalProperties@, defined at @SDL3\/SDL_properties.h 118:46@
+sDL_GetGlobalProperties :: BG.FunPtr (IO SDL_PropertiesID)
+sDL_GetGlobalProperties =
+  BG.unsafePerformIO hs_bindgen_4541df72a2cb85f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_CreateProperties@
+foreign import ccall unsafe "hs_bindgen_92049f9b61449963"
+  hs_bindgen_92049f9b61449963_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_CreateProperties@
+hs_bindgen_92049f9b61449963 :: IO (BG.FunPtr (IO SDL_PropertiesID))
+hs_bindgen_92049f9b61449963 =
+  BG.fromFFIType hs_bindgen_92049f9b61449963_base
+
+{-# NOINLINE sDL_CreateProperties #-}
+
+-- | Create a group of properties.
+--
+--     All properties are automatically destroyed when SDL_Quit() is called.
+--
+--     [Returns]: an ID for a new group of properties, or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyProperties'
+--
+--     [C declaration]: @SDL_CreateProperties@, defined at @SDL3\/SDL_properties.h 134:46@
+sDL_CreateProperties :: BG.FunPtr (IO SDL_PropertiesID)
+sDL_CreateProperties =
+  BG.unsafePerformIO hs_bindgen_92049f9b61449963
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_CopyProperties@
+foreign import ccall unsafe "hs_bindgen_38190d3cf84485c4"
+  hs_bindgen_38190d3cf84485c4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_CopyProperties@
+hs_bindgen_38190d3cf84485c4 :: IO (BG.FunPtr (SDL_PropertiesID -> SDL_PropertiesID -> IO BG.CBool))
+hs_bindgen_38190d3cf84485c4 =
+  BG.fromFFIType hs_bindgen_38190d3cf84485c4_base
+
+{-# NOINLINE sDL_CopyProperties #-}
+
+-- | Copy a group of properties.
+--
+--     Copy all the properties from one group of properties to another, with the exception of properties requiring cleanup (set using @SDL_SetPointerPropertyWithCleanup()@), which will not be copied. Any property that already exists on @dst@ will be overwritten.
+--
+--     [@src@]: the properties to copy.
+--
+--     [@dst@]: the destination properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread. This function acquires simultaneous mutex locks on both the source and destination property sets.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyProperties@, defined at @SDL3\/SDL_properties.h 155:34@
+sDL_CopyProperties :: BG.FunPtr (SDL_PropertiesID -> SDL_PropertiesID -> IO BG.CBool)
+sDL_CopyProperties =
+  BG.unsafePerformIO hs_bindgen_38190d3cf84485c4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_LockProperties@
+foreign import ccall unsafe "hs_bindgen_6ec499eda3697959"
+  hs_bindgen_6ec499eda3697959_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_LockProperties@
+hs_bindgen_6ec499eda3697959 :: IO (BG.FunPtr (SDL_PropertiesID -> IO BG.CBool))
+hs_bindgen_6ec499eda3697959 =
+  BG.fromFFIType hs_bindgen_6ec499eda3697959_base
+
+{-# NOINLINE sDL_LockProperties #-}
+
+-- | Lock a group of properties.
+--
+--     Obtain a multi-threaded lock for these properties. Other threads will wait while trying to lock these properties until they are unlocked. Properties must be unlocked before they are destroyed.
+--
+--     The lock is automatically taken when setting individual properties, this function is only needed when you want to set several properties atomically or want to guarantee that properties being queried aren\'t freed in another thread.
+--
+--     [@props@]: the properties to lock.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UnlockProperties'
+--
+--     [C declaration]: @SDL_LockProperties@, defined at @SDL3\/SDL_properties.h 179:34@
+sDL_LockProperties :: BG.FunPtr (SDL_PropertiesID -> IO BG.CBool)
+sDL_LockProperties =
+  BG.unsafePerformIO hs_bindgen_6ec499eda3697959
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_UnlockProperties@
+foreign import ccall unsafe "hs_bindgen_9ae8d54eb30e84b4"
+  hs_bindgen_9ae8d54eb30e84b4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_UnlockProperties@
+hs_bindgen_9ae8d54eb30e84b4 :: IO (BG.FunPtr (SDL_PropertiesID -> IO ()))
+hs_bindgen_9ae8d54eb30e84b4 =
+  BG.fromFFIType hs_bindgen_9ae8d54eb30e84b4_base
+
+{-# NOINLINE sDL_UnlockProperties #-}
+
+-- | Unlock a group of properties.
+--
+--     [@props@]: the properties to unlock.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockProperties'
+--
+--     [C declaration]: @SDL_UnlockProperties@, defined at @SDL3\/SDL_properties.h 192:34@
+sDL_UnlockProperties :: BG.FunPtr (SDL_PropertiesID -> IO ())
+sDL_UnlockProperties =
+  BG.unsafePerformIO hs_bindgen_9ae8d54eb30e84b4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetPointerPropertyWithCleanup@
+foreign import ccall unsafe "hs_bindgen_94c8b4d65016ddab"
+  hs_bindgen_94c8b4d65016ddab_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetPointerPropertyWithCleanup@
+hs_bindgen_94c8b4d65016ddab
+  :: IO
+       ( BG.FunPtr
+           ( SDL_PropertiesID
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.Ptr BG.Void
+             -> SDL_CleanupPropertyCallback
+             -> BG.Ptr BG.Void
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_94c8b4d65016ddab =
+  BG.fromFFIType hs_bindgen_94c8b4d65016ddab_base
+
+{-# NOINLINE sDL_SetPointerPropertyWithCleanup #-}
+
+-- | Set a pointer property in a group of properties with a cleanup function that is called when the property is deleted.
+--
+--     The cleanup function is also called if setting the property fails for any reason.
+--
+--     For simply setting basic data types, like numbers, bools, or strings, use SDL_SetNumberProperty, SDL_SetBooleanProperty, or SDL_SetStringProperty instead, as those functions will handle cleanup on your behalf. This function is only for more complex, custom data.
+--
+--     [@props@]: the properties to modify.
+--
+--     [@name@]: the name of the property to modify.
+--
+--     [@value@]: the new value of the property, or NULL to delete the property.
+--
+--     [@cleanup@]: the function to call when this property is deleted, or NULL if no cleanup is necessary.
+--
+--     [@userdata@]: a pointer that is passed to the cleanup function.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPointerProperty', 'sDL_SetPointerProperty', 'SDL_CleanupPropertyCallback'
+--
+--     [C declaration]: @SDL_SetPointerPropertyWithCleanup@, defined at @SDL3\/SDL_properties.h 247:34@
+sDL_SetPointerPropertyWithCleanup
+  :: BG.FunPtr
+       ( SDL_PropertiesID
+         -> PtrConst.PtrConst BG.CChar
+         -> BG.Ptr BG.Void
+         -> SDL_CleanupPropertyCallback
+         -> BG.Ptr BG.Void
+         -> IO BG.CBool
+       )
+sDL_SetPointerPropertyWithCleanup =
+  BG.unsafePerformIO hs_bindgen_94c8b4d65016ddab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetPointerProperty@
+foreign import ccall unsafe "hs_bindgen_30ddc8c86a006598"
+  hs_bindgen_30ddc8c86a006598_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetPointerProperty@
+hs_bindgen_30ddc8c86a006598
+  :: IO (BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_30ddc8c86a006598 =
+  BG.fromFFIType hs_bindgen_30ddc8c86a006598_base
+
+{-# NOINLINE sDL_SetPointerProperty #-}
+
+-- | Set a pointer property in a group of properties.
+--
+--     [@props@]: the properties to modify.
+--
+--     [@name@]: the name of the property to modify.
+--
+--     [@value@]: the new value of the property, or NULL to delete the property.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPointerProperty', 'sDL_HasProperty', 'sDL_SetBooleanProperty', 'sDL_SetFloatProperty', 'sDL_SetNumberProperty', 'sDL_SetPointerPropertyWithCleanup', 'sDL_SetStringProperty'
+--
+--     [C declaration]: @SDL_SetPointerProperty@, defined at @SDL3\/SDL_properties.h 270:34@
+sDL_SetPointerProperty
+  :: BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_SetPointerProperty =
+  BG.unsafePerformIO hs_bindgen_30ddc8c86a006598
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetStringProperty@
+foreign import ccall unsafe "hs_bindgen_88fe6ad057838726"
+  hs_bindgen_88fe6ad057838726_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetStringProperty@
+hs_bindgen_88fe6ad057838726
+  :: IO
+       ( BG.FunPtr
+           (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+       )
+hs_bindgen_88fe6ad057838726 =
+  BG.fromFFIType hs_bindgen_88fe6ad057838726_base
+
+{-# NOINLINE sDL_SetStringProperty #-}
+
+-- | Set a string property in a group of properties.
+--
+--     This function makes a copy of the string; the caller does not have to preserve the data after this call completes.
+--
+--     [@props@]: the properties to modify.
+--
+--     [@name@]: the name of the property to modify.
+--
+--     [@value@]: the new value of the property, or NULL to delete the property.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetStringProperty'
+--
+--     [C declaration]: @SDL_SetStringProperty@, defined at @SDL3\/SDL_properties.h 290:34@
+sDL_SetStringProperty
+  :: BG.FunPtr
+       (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SetStringProperty =
+  BG.unsafePerformIO hs_bindgen_88fe6ad057838726
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetNumberProperty@
+foreign import ccall unsafe "hs_bindgen_00c22270473dd8bf"
+  hs_bindgen_00c22270473dd8bf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetNumberProperty@
+hs_bindgen_00c22270473dd8bf
+  :: IO
+       ( BG.FunPtr
+           (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> SDL3.Sys.Bindgen.Stdinc.Sint64 -> IO BG.CBool)
+       )
+hs_bindgen_00c22270473dd8bf =
+  BG.fromFFIType hs_bindgen_00c22270473dd8bf_base
+
+{-# NOINLINE sDL_SetNumberProperty #-}
+
+-- | Set an integer property in a group of properties.
+--
+--     [@props@]: the properties to modify.
+--
+--     [@name@]: the name of the property to modify.
+--
+--     [@value@]: the new value of the property.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumberProperty'
+--
+--     [C declaration]: @SDL_SetNumberProperty@, defined at @SDL3\/SDL_properties.h 307:34@
+sDL_SetNumberProperty
+  :: BG.FunPtr
+       (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> SDL3.Sys.Bindgen.Stdinc.Sint64 -> IO BG.CBool)
+sDL_SetNumberProperty =
+  BG.unsafePerformIO hs_bindgen_00c22270473dd8bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetFloatProperty@
+foreign import ccall unsafe "hs_bindgen_b49813020974606a"
+  hs_bindgen_b49813020974606a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetFloatProperty@
+hs_bindgen_b49813020974606a
+  :: IO (BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_b49813020974606a =
+  BG.fromFFIType hs_bindgen_b49813020974606a_base
+
+{-# NOINLINE sDL_SetFloatProperty #-}
+
+-- | Set a floating point property in a group of properties.
+--
+--     [@props@]: the properties to modify.
+--
+--     [@name@]: the name of the property to modify.
+--
+--     [@value@]: the new value of the property.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetFloatProperty'
+--
+--     [C declaration]: @SDL_SetFloatProperty@, defined at @SDL3\/SDL_properties.h 324:34@
+sDL_SetFloatProperty
+  :: BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.CFloat -> IO BG.CBool)
+sDL_SetFloatProperty =
+  BG.unsafePerformIO hs_bindgen_b49813020974606a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetBooleanProperty@
+foreign import ccall unsafe "hs_bindgen_3d0623558bc4ff3f"
+  hs_bindgen_3d0623558bc4ff3f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_SetBooleanProperty@
+hs_bindgen_3d0623558bc4ff3f
+  :: IO (BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.CBool -> IO BG.CBool))
+hs_bindgen_3d0623558bc4ff3f =
+  BG.fromFFIType hs_bindgen_3d0623558bc4ff3f_base
+
+{-# NOINLINE sDL_SetBooleanProperty #-}
+
+-- | Set a boolean property in a group of properties.
+--
+--     [@props@]: the properties to modify.
+--
+--     [@name@]: the name of the property to modify.
+--
+--     [@value@]: the new value of the property.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetBooleanProperty'
+--
+--     [C declaration]: @SDL_SetBooleanProperty@, defined at @SDL3\/SDL_properties.h 341:34@
+sDL_SetBooleanProperty
+  :: BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.CBool -> IO BG.CBool)
+sDL_SetBooleanProperty =
+  BG.unsafePerformIO hs_bindgen_3d0623558bc4ff3f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_HasProperty@
+foreign import ccall unsafe "hs_bindgen_260dc721ec409d1a"
+  hs_bindgen_260dc721ec409d1a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_HasProperty@
+hs_bindgen_260dc721ec409d1a
+  :: IO (BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_260dc721ec409d1a =
+  BG.fromFFIType hs_bindgen_260dc721ec409d1a_base
+
+{-# NOINLINE sDL_HasProperty #-}
+
+-- | Return whether a property exists in a group of properties.
+--
+--     [@props@]: the properties to query.
+--
+--     [@name@]: the name of the property to query.
+--
+--     [Returns]: true if the property exists, or false if it doesn\'t.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType'
+--
+--     [C declaration]: @SDL_HasProperty@, defined at @SDL3\/SDL_properties.h 356:34@
+sDL_HasProperty :: BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_HasProperty =
+  BG.unsafePerformIO hs_bindgen_260dc721ec409d1a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetPropertyType@
+foreign import ccall unsafe "hs_bindgen_3191a0bffc4788d9"
+  hs_bindgen_3191a0bffc4788d9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetPropertyType@
+hs_bindgen_3191a0bffc4788d9
+  :: IO (BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> IO SDL_PropertyType))
+hs_bindgen_3191a0bffc4788d9 =
+  BG.fromFFIType hs_bindgen_3191a0bffc4788d9_base
+
+{-# NOINLINE sDL_GetPropertyType #-}
+
+-- | Get the type of a property in a group of properties.
+--
+--     [@props@]: the properties to query.
+--
+--     [@name@]: the name of the property to query.
+--
+--     [Returns]: the type of the property, or SDL_PROPERTY_TYPE_INVALID if it is not set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasProperty'
+--
+--     [C declaration]: @SDL_GetPropertyType@, defined at @SDL3\/SDL_properties.h 372:46@
+sDL_GetPropertyType
+  :: BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> IO SDL_PropertyType)
+sDL_GetPropertyType =
+  BG.unsafePerformIO hs_bindgen_3191a0bffc4788d9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetPointerProperty@
+foreign import ccall unsafe "hs_bindgen_daed4139b3c79d17"
+  hs_bindgen_daed4139b3c79d17_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetPointerProperty@
+hs_bindgen_daed4139b3c79d17
+  :: IO
+       (BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.Ptr BG.Void -> IO (BG.Ptr BG.Void)))
+hs_bindgen_daed4139b3c79d17 =
+  BG.fromFFIType hs_bindgen_daed4139b3c79d17_base
+
+{-# NOINLINE sDL_GetPointerProperty #-}
+
+-- | Get a pointer property from a group of properties.
+--
+--     By convention, the names of properties that SDL exposes on objects will start with \"SDL.\", and properties that SDL uses internally will start with \"SDL.internal.\". These should be considered read-only and should not be modified by applications.
+--
+--     [@props@]: the properties to query.
+--
+--     [@name@]: the name of the property to query.
+--
+--     [@default_value@]: the default value of the property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a pointer property.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the data returned is not protected and could potentially be freed if you call @SDL_SetPointerProperty()@ or @SDL_ClearProperty()@ on these properties from another thread. If you need to avoid this, use @SDL_LockProperties()@ and @SDL_UnlockProperties()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetBooleanProperty', 'sDL_GetFloatProperty', 'sDL_GetNumberProperty', 'sDL_GetPropertyType', 'sDL_GetStringProperty', 'sDL_HasProperty', 'sDL_SetPointerProperty'
+--
+--     [C declaration]: @SDL_GetPointerProperty@, defined at @SDL3\/SDL_properties.h 405:36@
+sDL_GetPointerProperty
+  :: BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.Ptr BG.Void -> IO (BG.Ptr BG.Void))
+sDL_GetPointerProperty =
+  BG.unsafePerformIO hs_bindgen_daed4139b3c79d17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetStringProperty@
+foreign import ccall unsafe "hs_bindgen_adc8eafafff23d41"
+  hs_bindgen_adc8eafafff23d41_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetStringProperty@
+hs_bindgen_adc8eafafff23d41
+  :: IO
+       ( BG.FunPtr
+           ( SDL_PropertiesID
+             -> PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> IO (PtrConst.PtrConst BG.CChar)
+           )
+       )
+hs_bindgen_adc8eafafff23d41 =
+  BG.fromFFIType hs_bindgen_adc8eafafff23d41_base
+
+{-# NOINLINE sDL_GetStringProperty #-}
+
+-- | Get a string property from a group of properties.
+--
+--     [@props@]: the properties to query.
+--
+--     [@name@]: the name of the property to query.
+--
+--     [@default_value@]: the default value of the property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a string property.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the data returned is not protected and could potentially be freed if you call @SDL_SetStringProperty()@ or @SDL_ClearProperty()@ on these properties from another thread. If you need to avoid this, use @SDL_LockProperties()@ and @SDL_UnlockProperties()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetStringProperty'
+--
+--     [C declaration]: @SDL_GetStringProperty@, defined at @SDL3\/SDL_properties.h 429:42@
+sDL_GetStringProperty
+  :: BG.FunPtr
+       ( SDL_PropertiesID
+         -> PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> IO (PtrConst.PtrConst BG.CChar)
+       )
+sDL_GetStringProperty =
+  BG.unsafePerformIO hs_bindgen_adc8eafafff23d41
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetNumberProperty@
+foreign import ccall unsafe "hs_bindgen_16bb2facf7635001"
+  hs_bindgen_16bb2facf7635001_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetNumberProperty@
+hs_bindgen_16bb2facf7635001
+  :: IO
+       ( BG.FunPtr
+           ( SDL_PropertiesID
+             -> PtrConst.PtrConst BG.CChar
+             -> SDL3.Sys.Bindgen.Stdinc.Sint64
+             -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+           )
+       )
+hs_bindgen_16bb2facf7635001 =
+  BG.fromFFIType hs_bindgen_16bb2facf7635001_base
+
+{-# NOINLINE sDL_GetNumberProperty #-}
+
+-- | Get a number property from a group of properties.
+--
+--     You can use @SDL_GetPropertyType()@ to query whether the property exists and is a number property.
+--
+--     [@props@]: the properties to query.
+--
+--     [@name@]: the name of the property to query.
+--
+--     [@default_value@]: the default value of the property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a number property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetNumberProperty'
+--
+--     [C declaration]: @SDL_GetNumberProperty@, defined at @SDL3\/SDL_properties.h 451:36@
+sDL_GetNumberProperty
+  :: BG.FunPtr
+       ( SDL_PropertiesID
+         -> PtrConst.PtrConst BG.CChar
+         -> SDL3.Sys.Bindgen.Stdinc.Sint64
+         -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+       )
+sDL_GetNumberProperty =
+  BG.unsafePerformIO hs_bindgen_16bb2facf7635001
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetFloatProperty@
+foreign import ccall unsafe "hs_bindgen_661775cfc76e4f5c"
+  hs_bindgen_661775cfc76e4f5c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetFloatProperty@
+hs_bindgen_661775cfc76e4f5c
+  :: IO (BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.CFloat -> IO BG.CFloat))
+hs_bindgen_661775cfc76e4f5c =
+  BG.fromFFIType hs_bindgen_661775cfc76e4f5c_base
+
+{-# NOINLINE sDL_GetFloatProperty #-}
+
+-- | Get a floating point property from a group of properties.
+--
+--     You can use @SDL_GetPropertyType()@ to query whether the property exists and is a floating point property.
+--
+--     [@props@]: the properties to query.
+--
+--     [@name@]: the name of the property to query.
+--
+--     [@default_value@]: the default value of the property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a float property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetFloatProperty'
+--
+--     [C declaration]: @SDL_GetFloatProperty@, defined at @SDL3\/SDL_properties.h 473:35@
+sDL_GetFloatProperty
+  :: BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.CFloat -> IO BG.CFloat)
+sDL_GetFloatProperty =
+  BG.unsafePerformIO hs_bindgen_661775cfc76e4f5c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetBooleanProperty@
+foreign import ccall unsafe "hs_bindgen_9161fc8f2af4a306"
+  hs_bindgen_9161fc8f2af4a306_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_GetBooleanProperty@
+hs_bindgen_9161fc8f2af4a306
+  :: IO (BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.CBool -> IO BG.CBool))
+hs_bindgen_9161fc8f2af4a306 =
+  BG.fromFFIType hs_bindgen_9161fc8f2af4a306_base
+
+{-# NOINLINE sDL_GetBooleanProperty #-}
+
+-- | Get a boolean property from a group of properties.
+--
+--     You can use @SDL_GetPropertyType()@ to query whether the property exists and is a boolean property.
+--
+--     [@props@]: the properties to query.
+--
+--     [@name@]: the name of the property to query.
+--
+--     [@default_value@]: the default value of the property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a boolean property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetBooleanProperty'
+--
+--     [C declaration]: @SDL_GetBooleanProperty@, defined at @SDL3\/SDL_properties.h 495:34@
+sDL_GetBooleanProperty
+  :: BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> BG.CBool -> IO BG.CBool)
+sDL_GetBooleanProperty =
+  BG.unsafePerformIO hs_bindgen_9161fc8f2af4a306
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_ClearProperty@
+foreign import ccall unsafe "hs_bindgen_89fcf415f7fa8ee4"
+  hs_bindgen_89fcf415f7fa8ee4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_ClearProperty@
+hs_bindgen_89fcf415f7fa8ee4
+  :: IO (BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_89fcf415f7fa8ee4 =
+  BG.fromFFIType hs_bindgen_89fcf415f7fa8ee4_base
+
+{-# NOINLINE sDL_ClearProperty #-}
+
+-- | Clear a property from a group of properties.
+--
+--     [@props@]: the properties to modify.
+--
+--     [@name@]: the name of the property to clear.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ClearProperty@, defined at @SDL3\/SDL_properties.h 509:34@
+sDL_ClearProperty :: BG.FunPtr (SDL_PropertiesID -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_ClearProperty =
+  BG.unsafePerformIO hs_bindgen_89fcf415f7fa8ee4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_EnumerateProperties@
+foreign import ccall unsafe "hs_bindgen_816e33716bb87f04"
+  hs_bindgen_816e33716bb87f04_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_EnumerateProperties@
+hs_bindgen_816e33716bb87f04
+  :: IO
+       (BG.FunPtr (SDL_PropertiesID -> SDL_EnumeratePropertiesCallback -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_816e33716bb87f04 =
+  BG.fromFFIType hs_bindgen_816e33716bb87f04_base
+
+{-# NOINLINE sDL_EnumerateProperties #-}
+
+-- | Enumerate the properties contained in a group of properties.
+--
+--     The callback function is called for each property in the group of properties. The properties are locked during enumeration.
+--
+--     [@props@]: the properties to query.
+--
+--     [@callback@]: the function to call for each property.
+--
+--     [@userdata@]: a pointer that is passed to @callback@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EnumerateProperties@, defined at @SDL3\/SDL_properties.h 546:34@
+sDL_EnumerateProperties
+  :: BG.FunPtr (SDL_PropertiesID -> SDL_EnumeratePropertiesCallback -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_EnumerateProperties =
+  BG.unsafePerformIO hs_bindgen_816e33716bb87f04
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_DestroyProperties@
+foreign import ccall unsafe "hs_bindgen_2034830c5f638bf5"
+  hs_bindgen_2034830c5f638bf5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_get_SDL_DestroyProperties@
+hs_bindgen_2034830c5f638bf5 :: IO (BG.FunPtr (SDL_PropertiesID -> IO ()))
+hs_bindgen_2034830c5f638bf5 =
+  BG.fromFFIType hs_bindgen_2034830c5f638bf5_base
+
+{-# NOINLINE sDL_DestroyProperties #-}
+
+-- | Destroy a group of properties.
+--
+--     All properties are deleted and their cleanup functions will be called, if any.
+--
+--     [@props@]: the properties to destroy.
+--
+--     [Thread safety]: This function should not be called while these properties are locked or other threads might be setting or getting values from these properties.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProperties'
+--
+--     [C declaration]: @SDL_DestroyProperties@, defined at @SDL3\/SDL_properties.h 564:34@
+sDL_DestroyProperties :: BG.FunPtr (SDL_PropertiesID -> IO ())
+sDL_DestroyProperties =
+  BG.unsafePerformIO hs_bindgen_2034830c5f638bf5
diff --git a/src/SDL3/Sys/Bindgen/Properties/Safe.hs b/src/SDL3/Sys/Bindgen/Properties/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Properties/Safe.hs
@@ -0,0 +1,1044 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Properties.Safe (
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_GetGlobalProperties,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_CreateProperties,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_CopyProperties,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_LockProperties,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_UnlockProperties,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_SetPointerPropertyWithCleanup,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_SetPointerProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_SetStringProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_SetNumberProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_SetFloatProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_SetBooleanProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_HasProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_GetPropertyType,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_GetPointerProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_GetStringProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_GetNumberProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_GetFloatProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_GetBooleanProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_ClearProperty,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_EnumerateProperties,
+  SDL3.Sys.Bindgen.Properties.Safe.sDL_DestroyProperties,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Properties
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_properties.h>"
+         , "SDL_PropertiesID hs_bindgen_8fc668a59a40a958 (void)"
+         , "{"
+         , "  return (SDL_GetGlobalProperties)();"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_3ef762138ffcfdfb (void)"
+         , "{"
+         , "  return (SDL_CreateProperties)();"
+         , "}"
+         , "_Bool hs_bindgen_084a47db7cd509f5 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CopyProperties)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_f9f9de53028c2227 ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_LockProperties)(arg1);"
+         , "}"
+         , "void hs_bindgen_97fc1b206325cb6d ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockProperties)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_5b5795d237d14c15 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3,"
+         , "  SDL_CleanupPropertyCallback arg4,"
+         , "  void *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_SetPointerPropertyWithCleanup)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_b380a660dcae4e4a ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetPointerProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_817765f9d735ba5b ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetStringProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_d9526335adcfe092 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  Sint64 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetNumberProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_1d60c12e8fc10844 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetFloatProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_7fa7d5edc08019af ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetBooleanProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_066c9eebf0adf032 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_HasProperty)(arg1, arg2);"
+         , "}"
+         , "SDL_PropertyType hs_bindgen_2d83b2660daf1e6b ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPropertyType)(arg1, arg2);"
+         , "}"
+         , "void *hs_bindgen_65efe810372a76d0 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPointerProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "char const *hs_bindgen_4d53ef22e0b50452 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetStringProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "Sint64 hs_bindgen_d53619e1d560068d ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  Sint64 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumberProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "float hs_bindgen_6e11191bf6b2bbe6 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetFloatProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_1ad958c6807eba6d ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetBooleanProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_5c29c62c039edbb3 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ClearProperty)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_395a072881de9c1b ("
+         , "  SDL_PropertiesID arg1,"
+         , "  SDL_EnumeratePropertiesCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_EnumerateProperties)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_fea2c8b90ca0d148 ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyProperties)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetGlobalProperties@
+foreign import ccall safe "hs_bindgen_8fc668a59a40a958"
+  hs_bindgen_8fc668a59a40a958_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetGlobalProperties@
+hs_bindgen_8fc668a59a40a958 :: IO SDL_PropertiesID
+hs_bindgen_8fc668a59a40a958 =
+  BG.fromFFIType hs_bindgen_8fc668a59a40a958_base
+
+-- | Get the global SDL properties.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGlobalProperties@, defined at @SDL3\/SDL_properties.h 118:46@
+sDL_GetGlobalProperties :: IO SDL_PropertiesID
+sDL_GetGlobalProperties = hs_bindgen_8fc668a59a40a958
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_CreateProperties@
+foreign import ccall safe "hs_bindgen_3ef762138ffcfdfb"
+  hs_bindgen_3ef762138ffcfdfb_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_CreateProperties@
+hs_bindgen_3ef762138ffcfdfb :: IO SDL_PropertiesID
+hs_bindgen_3ef762138ffcfdfb =
+  BG.fromFFIType hs_bindgen_3ef762138ffcfdfb_base
+
+-- | Create a group of properties.
+--
+--     All properties are automatically destroyed when SDL_Quit() is called.
+--
+--     [Returns]: an ID for a new group of properties, or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyProperties'
+--
+--     [C declaration]: @SDL_CreateProperties@, defined at @SDL3\/SDL_properties.h 134:46@
+sDL_CreateProperties :: IO SDL_PropertiesID
+sDL_CreateProperties = hs_bindgen_3ef762138ffcfdfb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_CopyProperties@
+foreign import ccall safe "hs_bindgen_084a47db7cd509f5"
+  hs_bindgen_084a47db7cd509f5_base
+    :: BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_CopyProperties@
+hs_bindgen_084a47db7cd509f5
+  :: SDL_PropertiesID
+  -> SDL_PropertiesID
+  -> IO BG.CBool
+hs_bindgen_084a47db7cd509f5 =
+  BG.fromFFIType hs_bindgen_084a47db7cd509f5_base
+
+-- | Copy a group of properties.
+--
+--     Copy all the properties from one group of properties to another, with the exception of properties requiring cleanup (set using @SDL_SetPointerPropertyWithCleanup()@), which will not be copied. Any property that already exists on @dst@ will be overwritten.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread. This function acquires simultaneous mutex locks on both the source and destination property sets.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyProperties@, defined at @SDL3\/SDL_properties.h 155:34@
+sDL_CopyProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@src@]: the properties to copy.
+  -> SDL_PropertiesID
+  -- ^
+  --
+  --           [@dst@]: the destination properties.
+  -> IO BG.CBool
+sDL_CopyProperties = hs_bindgen_084a47db7cd509f5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_LockProperties@
+foreign import ccall safe "hs_bindgen_f9f9de53028c2227"
+  hs_bindgen_f9f9de53028c2227_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_LockProperties@
+hs_bindgen_f9f9de53028c2227
+  :: SDL_PropertiesID
+  -> IO BG.CBool
+hs_bindgen_f9f9de53028c2227 =
+  BG.fromFFIType hs_bindgen_f9f9de53028c2227_base
+
+-- | Lock a group of properties.
+--
+--     Obtain a multi-threaded lock for these properties. Other threads will wait while trying to lock these properties until they are unlocked. Properties must be unlocked before they are destroyed.
+--
+--     The lock is automatically taken when setting individual properties, this function is only needed when you want to set several properties atomically or want to guarantee that properties being queried aren\'t freed in another thread.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UnlockProperties'
+--
+--     [C declaration]: @SDL_LockProperties@, defined at @SDL3\/SDL_properties.h 179:34@
+sDL_LockProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to lock.
+  -> IO BG.CBool
+sDL_LockProperties = hs_bindgen_f9f9de53028c2227
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_UnlockProperties@
+foreign import ccall safe "hs_bindgen_97fc1b206325cb6d"
+  hs_bindgen_97fc1b206325cb6d_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_UnlockProperties@
+hs_bindgen_97fc1b206325cb6d
+  :: SDL_PropertiesID
+  -> IO ()
+hs_bindgen_97fc1b206325cb6d =
+  BG.fromFFIType hs_bindgen_97fc1b206325cb6d_base
+
+-- | Unlock a group of properties.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockProperties'
+--
+--     [C declaration]: @SDL_UnlockProperties@, defined at @SDL3\/SDL_properties.h 192:34@
+sDL_UnlockProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to unlock.
+  -> IO ()
+sDL_UnlockProperties = hs_bindgen_97fc1b206325cb6d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetPointerPropertyWithCleanup@
+foreign import ccall safe "hs_bindgen_5b5795d237d14c15"
+  hs_bindgen_5b5795d237d14c15_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetPointerPropertyWithCleanup@
+hs_bindgen_5b5795d237d14c15
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr BG.Void
+  -> SDL_CleanupPropertyCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_5b5795d237d14c15 =
+  BG.fromFFIType hs_bindgen_5b5795d237d14c15_base
+
+-- | Set a pointer property in a group of properties with a cleanup function that is called when the property is deleted.
+--
+--     The cleanup function is also called if setting the property fails for any reason.
+--
+--     For simply setting basic data types, like numbers, bools, or strings, use SDL_SetNumberProperty, SDL_SetBooleanProperty, or SDL_SetStringProperty instead, as those functions will handle cleanup on your behalf. This function is only for more complex, custom data.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPointerProperty', 'sDL_SetPointerProperty', 'SDL_CleanupPropertyCallback'
+--
+--     [C declaration]: @SDL_SetPointerPropertyWithCleanup@, defined at @SDL3\/SDL_properties.h 247:34@
+sDL_SetPointerPropertyWithCleanup
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> SDL_CleanupPropertyCallback
+  -- ^
+  --
+  --           [@cleanup@]: the function to call when this property is deleted, or NULL if no cleanup is necessary.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to the cleanup function.
+  -> IO BG.CBool
+sDL_SetPointerPropertyWithCleanup =
+  hs_bindgen_5b5795d237d14c15
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetPointerProperty@
+foreign import ccall safe "hs_bindgen_b380a660dcae4e4a"
+  hs_bindgen_b380a660dcae4e4a_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetPointerProperty@
+hs_bindgen_b380a660dcae4e4a
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_b380a660dcae4e4a =
+  BG.fromFFIType hs_bindgen_b380a660dcae4e4a_base
+
+-- | Set a pointer property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPointerProperty', 'sDL_HasProperty', 'sDL_SetBooleanProperty', 'sDL_SetFloatProperty', 'sDL_SetNumberProperty', 'sDL_SetPointerPropertyWithCleanup', 'sDL_SetStringProperty'
+--
+--     [C declaration]: @SDL_SetPointerProperty@, defined at @SDL3\/SDL_properties.h 270:34@
+sDL_SetPointerProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> IO BG.CBool
+sDL_SetPointerProperty = hs_bindgen_b380a660dcae4e4a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetStringProperty@
+foreign import ccall safe "hs_bindgen_817765f9d735ba5b"
+  hs_bindgen_817765f9d735ba5b_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetStringProperty@
+hs_bindgen_817765f9d735ba5b
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_817765f9d735ba5b =
+  BG.fromFFIType hs_bindgen_817765f9d735ba5b_base
+
+-- | Set a string property in a group of properties.
+--
+--     This function makes a copy of the string; the caller does not have to preserve the data after this call completes.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetStringProperty'
+--
+--     [C declaration]: @SDL_SetStringProperty@, defined at @SDL3\/SDL_properties.h 290:34@
+sDL_SetStringProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> IO BG.CBool
+sDL_SetStringProperty = hs_bindgen_817765f9d735ba5b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetNumberProperty@
+foreign import ccall safe "hs_bindgen_d9526335adcfe092"
+  hs_bindgen_d9526335adcfe092_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetNumberProperty@
+hs_bindgen_d9526335adcfe092
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_d9526335adcfe092 =
+  BG.fromFFIType hs_bindgen_d9526335adcfe092_base
+
+-- | Set an integer property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumberProperty'
+--
+--     [C declaration]: @SDL_SetNumberProperty@, defined at @SDL3\/SDL_properties.h 307:34@
+sDL_SetNumberProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO BG.CBool
+sDL_SetNumberProperty = hs_bindgen_d9526335adcfe092
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetFloatProperty@
+foreign import ccall safe "hs_bindgen_1d60c12e8fc10844"
+  hs_bindgen_1d60c12e8fc10844_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetFloatProperty@
+hs_bindgen_1d60c12e8fc10844
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_1d60c12e8fc10844 =
+  BG.fromFFIType hs_bindgen_1d60c12e8fc10844_base
+
+-- | Set a floating point property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetFloatProperty'
+--
+--     [C declaration]: @SDL_SetFloatProperty@, defined at @SDL3\/SDL_properties.h 324:34@
+sDL_SetFloatProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO BG.CBool
+sDL_SetFloatProperty = hs_bindgen_1d60c12e8fc10844
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetBooleanProperty@
+foreign import ccall safe "hs_bindgen_7fa7d5edc08019af"
+  hs_bindgen_7fa7d5edc08019af_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_SetBooleanProperty@
+hs_bindgen_7fa7d5edc08019af
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_7fa7d5edc08019af =
+  BG.fromFFIType hs_bindgen_7fa7d5edc08019af_base
+
+-- | Set a boolean property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetBooleanProperty'
+--
+--     [C declaration]: @SDL_SetBooleanProperty@, defined at @SDL3\/SDL_properties.h 341:34@
+sDL_SetBooleanProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO BG.CBool
+sDL_SetBooleanProperty = hs_bindgen_7fa7d5edc08019af
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_HasProperty@
+foreign import ccall safe "hs_bindgen_066c9eebf0adf032"
+  hs_bindgen_066c9eebf0adf032_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_HasProperty@
+hs_bindgen_066c9eebf0adf032
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_066c9eebf0adf032 =
+  BG.fromFFIType hs_bindgen_066c9eebf0adf032_base
+
+-- | Return whether a property exists in a group of properties.
+--
+--     [Returns]: true if the property exists, or false if it doesn\'t.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType'
+--
+--     [C declaration]: @SDL_HasProperty@, defined at @SDL3\/SDL_properties.h 356:34@
+sDL_HasProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> IO BG.CBool
+sDL_HasProperty = hs_bindgen_066c9eebf0adf032
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetPropertyType@
+foreign import ccall safe "hs_bindgen_2d83b2660daf1e6b"
+  hs_bindgen_2d83b2660daf1e6b_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetPropertyType@
+hs_bindgen_2d83b2660daf1e6b
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> IO SDL_PropertyType
+hs_bindgen_2d83b2660daf1e6b =
+  BG.fromFFIType hs_bindgen_2d83b2660daf1e6b_base
+
+-- | Get the type of a property in a group of properties.
+--
+--     [Returns]: the type of the property, or SDL_PROPERTY_TYPE_INVALID if it is not set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasProperty'
+--
+--     [C declaration]: @SDL_GetPropertyType@, defined at @SDL3\/SDL_properties.h 372:46@
+sDL_GetPropertyType
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> IO SDL_PropertyType
+sDL_GetPropertyType = hs_bindgen_2d83b2660daf1e6b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetPointerProperty@
+foreign import ccall safe "hs_bindgen_65efe810372a76d0"
+  hs_bindgen_65efe810372a76d0_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetPointerProperty@
+hs_bindgen_65efe810372a76d0
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_65efe810372a76d0 =
+  BG.fromFFIType hs_bindgen_65efe810372a76d0_base
+
+-- | Get a pointer property from a group of properties.
+--
+--     By convention, the names of properties that SDL exposes on objects will start with \"SDL.\", and properties that SDL uses internally will start with \"SDL.internal.\". These should be considered read-only and should not be modified by applications.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a pointer property.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the data returned is not protected and could potentially be freed if you call @SDL_SetPointerProperty()@ or @SDL_ClearProperty()@ on these properties from another thread. If you need to avoid this, use @SDL_LockProperties()@ and @SDL_UnlockProperties()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetBooleanProperty', 'sDL_GetFloatProperty', 'sDL_GetNumberProperty', 'sDL_GetPropertyType', 'sDL_GetStringProperty', 'sDL_HasProperty', 'sDL_SetPointerProperty'
+--
+--     [C declaration]: @SDL_GetPointerProperty@, defined at @SDL3\/SDL_properties.h 405:36@
+sDL_GetPointerProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetPointerProperty = hs_bindgen_65efe810372a76d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetStringProperty@
+foreign import ccall safe "hs_bindgen_4d53ef22e0b50452"
+  hs_bindgen_4d53ef22e0b50452_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetStringProperty@
+hs_bindgen_4d53ef22e0b50452
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_4d53ef22e0b50452 =
+  BG.fromFFIType hs_bindgen_4d53ef22e0b50452_base
+
+-- | Get a string property from a group of properties.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a string property.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the data returned is not protected and could potentially be freed if you call @SDL_SetStringProperty()@ or @SDL_ClearProperty()@ on these properties from another thread. If you need to avoid this, use @SDL_LockProperties()@ and @SDL_UnlockProperties()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetStringProperty'
+--
+--     [C declaration]: @SDL_GetStringProperty@, defined at @SDL3\/SDL_properties.h 429:42@
+sDL_GetStringProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetStringProperty = hs_bindgen_4d53ef22e0b50452
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetNumberProperty@
+foreign import ccall safe "hs_bindgen_d53619e1d560068d"
+  hs_bindgen_d53619e1d560068d_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int64
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetNumberProperty@
+hs_bindgen_d53619e1d560068d
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+hs_bindgen_d53619e1d560068d =
+  BG.fromFFIType hs_bindgen_d53619e1d560068d_base
+
+-- | Get a number property from a group of properties.
+--
+--     You can use @SDL_GetPropertyType()@ to query whether the property exists and is a number property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a number property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetNumberProperty'
+--
+--     [C declaration]: @SDL_GetNumberProperty@, defined at @SDL3\/SDL_properties.h 451:36@
+sDL_GetNumberProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+sDL_GetNumberProperty = hs_bindgen_d53619e1d560068d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetFloatProperty@
+foreign import ccall safe "hs_bindgen_6e11191bf6b2bbe6"
+  hs_bindgen_6e11191bf6b2bbe6_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetFloatProperty@
+hs_bindgen_6e11191bf6b2bbe6
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_6e11191bf6b2bbe6 =
+  BG.fromFFIType hs_bindgen_6e11191bf6b2bbe6_base
+
+-- | Get a floating point property from a group of properties.
+--
+--     You can use @SDL_GetPropertyType()@ to query whether the property exists and is a floating point property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a float property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetFloatProperty'
+--
+--     [C declaration]: @SDL_GetFloatProperty@, defined at @SDL3\/SDL_properties.h 473:35@
+sDL_GetFloatProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO BG.CFloat
+sDL_GetFloatProperty = hs_bindgen_6e11191bf6b2bbe6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetBooleanProperty@
+foreign import ccall safe "hs_bindgen_1ad958c6807eba6d"
+  hs_bindgen_1ad958c6807eba6d_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_GetBooleanProperty@
+hs_bindgen_1ad958c6807eba6d
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_1ad958c6807eba6d =
+  BG.fromFFIType hs_bindgen_1ad958c6807eba6d_base
+
+-- | Get a boolean property from a group of properties.
+--
+--     You can use @SDL_GetPropertyType()@ to query whether the property exists and is a boolean property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a boolean property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetBooleanProperty'
+--
+--     [C declaration]: @SDL_GetBooleanProperty@, defined at @SDL3\/SDL_properties.h 495:34@
+sDL_GetBooleanProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO BG.CBool
+sDL_GetBooleanProperty = hs_bindgen_1ad958c6807eba6d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_ClearProperty@
+foreign import ccall safe "hs_bindgen_5c29c62c039edbb3"
+  hs_bindgen_5c29c62c039edbb3_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_ClearProperty@
+hs_bindgen_5c29c62c039edbb3
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_5c29c62c039edbb3 =
+  BG.fromFFIType hs_bindgen_5c29c62c039edbb3_base
+
+-- | Clear a property from a group of properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ClearProperty@, defined at @SDL3\/SDL_properties.h 509:34@
+sDL_ClearProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to clear.
+  -> IO BG.CBool
+sDL_ClearProperty = hs_bindgen_5c29c62c039edbb3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_EnumerateProperties@
+foreign import ccall safe "hs_bindgen_395a072881de9c1b"
+  hs_bindgen_395a072881de9c1b_base
+    :: BG.Word32
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_EnumerateProperties@
+hs_bindgen_395a072881de9c1b
+  :: SDL_PropertiesID
+  -> SDL_EnumeratePropertiesCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_395a072881de9c1b =
+  BG.fromFFIType hs_bindgen_395a072881de9c1b_base
+
+-- | Enumerate the properties contained in a group of properties.
+--
+--     The callback function is called for each property in the group of properties. The properties are locked during enumeration.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EnumerateProperties@, defined at @SDL3\/SDL_properties.h 546:34@
+sDL_EnumerateProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> SDL_EnumeratePropertiesCallback
+  -- ^
+  --
+  --           [@callback@]: the function to call for each property.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO BG.CBool
+sDL_EnumerateProperties = hs_bindgen_395a072881de9c1b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_DestroyProperties@
+foreign import ccall safe "hs_bindgen_fea2c8b90ca0d148"
+  hs_bindgen_fea2c8b90ca0d148_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Safe_SDL_DestroyProperties@
+hs_bindgen_fea2c8b90ca0d148
+  :: SDL_PropertiesID
+  -> IO ()
+hs_bindgen_fea2c8b90ca0d148 =
+  BG.fromFFIType hs_bindgen_fea2c8b90ca0d148_base
+
+-- | Destroy a group of properties.
+--
+--     All properties are deleted and their cleanup functions will be called, if any.
+--
+--     [Thread safety]: This function should not be called while these properties are locked or other threads might be setting or getting values from these properties.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProperties'
+--
+--     [C declaration]: @SDL_DestroyProperties@, defined at @SDL3\/SDL_properties.h 564:34@
+sDL_DestroyProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to destroy.
+  -> IO ()
+sDL_DestroyProperties = hs_bindgen_fea2c8b90ca0d148
diff --git a/src/SDL3/Sys/Bindgen/Properties/Unsafe.hs b/src/SDL3/Sys/Bindgen/Properties/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Properties/Unsafe.hs
@@ -0,0 +1,1044 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Properties.Unsafe (
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_GetGlobalProperties,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_CreateProperties,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_CopyProperties,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_LockProperties,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_UnlockProperties,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_SetPointerPropertyWithCleanup,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_SetPointerProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_SetStringProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_SetNumberProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_SetFloatProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_SetBooleanProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_HasProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_GetPropertyType,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_GetPointerProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_GetStringProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_GetNumberProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_GetFloatProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_GetBooleanProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_ClearProperty,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_EnumerateProperties,
+  SDL3.Sys.Bindgen.Properties.Unsafe.sDL_DestroyProperties,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Properties
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_properties.h>"
+         , "SDL_PropertiesID hs_bindgen_c42d6db8a32f055e (void)"
+         , "{"
+         , "  return (SDL_GetGlobalProperties)();"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_3df6eaf391028f3a (void)"
+         , "{"
+         , "  return (SDL_CreateProperties)();"
+         , "}"
+         , "_Bool hs_bindgen_ec7346bf04c8fb1f ("
+         , "  SDL_PropertiesID arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CopyProperties)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_9d2b19ecdcff5a9a ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_LockProperties)(arg1);"
+         , "}"
+         , "void hs_bindgen_36fc1538f3f888d4 ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockProperties)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ac9cc1ad6b8fd333 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3,"
+         , "  SDL_CleanupPropertyCallback arg4,"
+         , "  void *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_SetPointerPropertyWithCleanup)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_7470d8d3e33299dd ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetPointerProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_8c4e2fe0b0c344fa ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetStringProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_adbe15832a85614f ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  Sint64 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetNumberProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_cd3f1858894a3c1a ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetFloatProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_54a909439447714a ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetBooleanProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_668d738b4f14a372 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_HasProperty)(arg1, arg2);"
+         , "}"
+         , "SDL_PropertyType hs_bindgen_0dc114a9b956e6b4 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPropertyType)(arg1, arg2);"
+         , "}"
+         , "void *hs_bindgen_137a3bf658fca01b ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetPointerProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "char const *hs_bindgen_13dfafaed8ef603e ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetStringProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "Sint64 hs_bindgen_047e09cd4176f3ce ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  Sint64 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNumberProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "float hs_bindgen_54dfc33f97564e4d ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetFloatProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_ff205e1f9b9cb233 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetBooleanProperty)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_2b64b35dcac92b2c ("
+         , "  SDL_PropertiesID arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ClearProperty)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_568e06654af8bf56 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  SDL_EnumeratePropertiesCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_EnumerateProperties)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_eeb9d2ee08b0f608 ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyProperties)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetGlobalProperties@
+foreign import ccall unsafe "hs_bindgen_c42d6db8a32f055e"
+  hs_bindgen_c42d6db8a32f055e_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetGlobalProperties@
+hs_bindgen_c42d6db8a32f055e :: IO SDL_PropertiesID
+hs_bindgen_c42d6db8a32f055e =
+  BG.fromFFIType hs_bindgen_c42d6db8a32f055e_base
+
+-- | Get the global SDL properties.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetGlobalProperties@, defined at @SDL3\/SDL_properties.h 118:46@
+sDL_GetGlobalProperties :: IO SDL_PropertiesID
+sDL_GetGlobalProperties = hs_bindgen_c42d6db8a32f055e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_CreateProperties@
+foreign import ccall unsafe "hs_bindgen_3df6eaf391028f3a"
+  hs_bindgen_3df6eaf391028f3a_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_CreateProperties@
+hs_bindgen_3df6eaf391028f3a :: IO SDL_PropertiesID
+hs_bindgen_3df6eaf391028f3a =
+  BG.fromFFIType hs_bindgen_3df6eaf391028f3a_base
+
+-- | Create a group of properties.
+--
+--     All properties are automatically destroyed when SDL_Quit() is called.
+--
+--     [Returns]: an ID for a new group of properties, or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyProperties'
+--
+--     [C declaration]: @SDL_CreateProperties@, defined at @SDL3\/SDL_properties.h 134:46@
+sDL_CreateProperties :: IO SDL_PropertiesID
+sDL_CreateProperties = hs_bindgen_3df6eaf391028f3a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_CopyProperties@
+foreign import ccall unsafe "hs_bindgen_ec7346bf04c8fb1f"
+  hs_bindgen_ec7346bf04c8fb1f_base
+    :: BG.Word32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_CopyProperties@
+hs_bindgen_ec7346bf04c8fb1f
+  :: SDL_PropertiesID
+  -> SDL_PropertiesID
+  -> IO BG.CBool
+hs_bindgen_ec7346bf04c8fb1f =
+  BG.fromFFIType hs_bindgen_ec7346bf04c8fb1f_base
+
+-- | Copy a group of properties.
+--
+--     Copy all the properties from one group of properties to another, with the exception of properties requiring cleanup (set using @SDL_SetPointerPropertyWithCleanup()@), which will not be copied. Any property that already exists on @dst@ will be overwritten.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread. This function acquires simultaneous mutex locks on both the source and destination property sets.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CopyProperties@, defined at @SDL3\/SDL_properties.h 155:34@
+sDL_CopyProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@src@]: the properties to copy.
+  -> SDL_PropertiesID
+  -- ^
+  --
+  --           [@dst@]: the destination properties.
+  -> IO BG.CBool
+sDL_CopyProperties = hs_bindgen_ec7346bf04c8fb1f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_LockProperties@
+foreign import ccall unsafe "hs_bindgen_9d2b19ecdcff5a9a"
+  hs_bindgen_9d2b19ecdcff5a9a_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_LockProperties@
+hs_bindgen_9d2b19ecdcff5a9a
+  :: SDL_PropertiesID
+  -> IO BG.CBool
+hs_bindgen_9d2b19ecdcff5a9a =
+  BG.fromFFIType hs_bindgen_9d2b19ecdcff5a9a_base
+
+-- | Lock a group of properties.
+--
+--     Obtain a multi-threaded lock for these properties. Other threads will wait while trying to lock these properties until they are unlocked. Properties must be unlocked before they are destroyed.
+--
+--     The lock is automatically taken when setting individual properties, this function is only needed when you want to set several properties atomically or want to guarantee that properties being queried aren\'t freed in another thread.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UnlockProperties'
+--
+--     [C declaration]: @SDL_LockProperties@, defined at @SDL3\/SDL_properties.h 179:34@
+sDL_LockProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to lock.
+  -> IO BG.CBool
+sDL_LockProperties = hs_bindgen_9d2b19ecdcff5a9a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_UnlockProperties@
+foreign import ccall unsafe "hs_bindgen_36fc1538f3f888d4"
+  hs_bindgen_36fc1538f3f888d4_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_UnlockProperties@
+hs_bindgen_36fc1538f3f888d4
+  :: SDL_PropertiesID
+  -> IO ()
+hs_bindgen_36fc1538f3f888d4 =
+  BG.fromFFIType hs_bindgen_36fc1538f3f888d4_base
+
+-- | Unlock a group of properties.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockProperties'
+--
+--     [C declaration]: @SDL_UnlockProperties@, defined at @SDL3\/SDL_properties.h 192:34@
+sDL_UnlockProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to unlock.
+  -> IO ()
+sDL_UnlockProperties = hs_bindgen_36fc1538f3f888d4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetPointerPropertyWithCleanup@
+foreign import ccall unsafe "hs_bindgen_ac9cc1ad6b8fd333"
+  hs_bindgen_ac9cc1ad6b8fd333_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetPointerPropertyWithCleanup@
+hs_bindgen_ac9cc1ad6b8fd333
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr BG.Void
+  -> SDL_CleanupPropertyCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_ac9cc1ad6b8fd333 =
+  BG.fromFFIType hs_bindgen_ac9cc1ad6b8fd333_base
+
+-- | Set a pointer property in a group of properties with a cleanup function that is called when the property is deleted.
+--
+--     The cleanup function is also called if setting the property fails for any reason.
+--
+--     For simply setting basic data types, like numbers, bools, or strings, use SDL_SetNumberProperty, SDL_SetBooleanProperty, or SDL_SetStringProperty instead, as those functions will handle cleanup on your behalf. This function is only for more complex, custom data.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPointerProperty', 'sDL_SetPointerProperty', 'SDL_CleanupPropertyCallback'
+--
+--     [C declaration]: @SDL_SetPointerPropertyWithCleanup@, defined at @SDL3\/SDL_properties.h 247:34@
+sDL_SetPointerPropertyWithCleanup
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> SDL_CleanupPropertyCallback
+  -- ^
+  --
+  --           [@cleanup@]: the function to call when this property is deleted, or NULL if no cleanup is necessary.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to the cleanup function.
+  -> IO BG.CBool
+sDL_SetPointerPropertyWithCleanup =
+  hs_bindgen_ac9cc1ad6b8fd333
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetPointerProperty@
+foreign import ccall unsafe "hs_bindgen_7470d8d3e33299dd"
+  hs_bindgen_7470d8d3e33299dd_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetPointerProperty@
+hs_bindgen_7470d8d3e33299dd
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_7470d8d3e33299dd =
+  BG.fromFFIType hs_bindgen_7470d8d3e33299dd_base
+
+-- | Set a pointer property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPointerProperty', 'sDL_HasProperty', 'sDL_SetBooleanProperty', 'sDL_SetFloatProperty', 'sDL_SetNumberProperty', 'sDL_SetPointerPropertyWithCleanup', 'sDL_SetStringProperty'
+--
+--     [C declaration]: @SDL_SetPointerProperty@, defined at @SDL3\/SDL_properties.h 270:34@
+sDL_SetPointerProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> IO BG.CBool
+sDL_SetPointerProperty = hs_bindgen_7470d8d3e33299dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetStringProperty@
+foreign import ccall unsafe "hs_bindgen_8c4e2fe0b0c344fa"
+  hs_bindgen_8c4e2fe0b0c344fa_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetStringProperty@
+hs_bindgen_8c4e2fe0b0c344fa
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_8c4e2fe0b0c344fa =
+  BG.fromFFIType hs_bindgen_8c4e2fe0b0c344fa_base
+
+-- | Set a string property in a group of properties.
+--
+--     This function makes a copy of the string; the caller does not have to preserve the data after this call completes.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetStringProperty'
+--
+--     [C declaration]: @SDL_SetStringProperty@, defined at @SDL3\/SDL_properties.h 290:34@
+sDL_SetStringProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> IO BG.CBool
+sDL_SetStringProperty = hs_bindgen_8c4e2fe0b0c344fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetNumberProperty@
+foreign import ccall unsafe "hs_bindgen_adbe15832a85614f"
+  hs_bindgen_adbe15832a85614f_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetNumberProperty@
+hs_bindgen_adbe15832a85614f
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_adbe15832a85614f =
+  BG.fromFFIType hs_bindgen_adbe15832a85614f_base
+
+-- | Set an integer property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumberProperty'
+--
+--     [C declaration]: @SDL_SetNumberProperty@, defined at @SDL3\/SDL_properties.h 307:34@
+sDL_SetNumberProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO BG.CBool
+sDL_SetNumberProperty = hs_bindgen_adbe15832a85614f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetFloatProperty@
+foreign import ccall unsafe "hs_bindgen_cd3f1858894a3c1a"
+  hs_bindgen_cd3f1858894a3c1a_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetFloatProperty@
+hs_bindgen_cd3f1858894a3c1a
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_cd3f1858894a3c1a =
+  BG.fromFFIType hs_bindgen_cd3f1858894a3c1a_base
+
+-- | Set a floating point property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetFloatProperty'
+--
+--     [C declaration]: @SDL_SetFloatProperty@, defined at @SDL3\/SDL_properties.h 324:34@
+sDL_SetFloatProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO BG.CBool
+sDL_SetFloatProperty = hs_bindgen_cd3f1858894a3c1a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetBooleanProperty@
+foreign import ccall unsafe "hs_bindgen_54a909439447714a"
+  hs_bindgen_54a909439447714a_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_SetBooleanProperty@
+hs_bindgen_54a909439447714a
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_54a909439447714a =
+  BG.fromFFIType hs_bindgen_54a909439447714a_base
+
+-- | Set a boolean property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetBooleanProperty'
+--
+--     [C declaration]: @SDL_SetBooleanProperty@, defined at @SDL3\/SDL_properties.h 341:34@
+sDL_SetBooleanProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO BG.CBool
+sDL_SetBooleanProperty = hs_bindgen_54a909439447714a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_HasProperty@
+foreign import ccall unsafe "hs_bindgen_668d738b4f14a372"
+  hs_bindgen_668d738b4f14a372_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_HasProperty@
+hs_bindgen_668d738b4f14a372
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_668d738b4f14a372 =
+  BG.fromFFIType hs_bindgen_668d738b4f14a372_base
+
+-- | Return whether a property exists in a group of properties.
+--
+--     [Returns]: true if the property exists, or false if it doesn\'t.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType'
+--
+--     [C declaration]: @SDL_HasProperty@, defined at @SDL3\/SDL_properties.h 356:34@
+sDL_HasProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> IO BG.CBool
+sDL_HasProperty = hs_bindgen_668d738b4f14a372
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetPropertyType@
+foreign import ccall unsafe "hs_bindgen_0dc114a9b956e6b4"
+  hs_bindgen_0dc114a9b956e6b4_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetPropertyType@
+hs_bindgen_0dc114a9b956e6b4
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> IO SDL_PropertyType
+hs_bindgen_0dc114a9b956e6b4 =
+  BG.fromFFIType hs_bindgen_0dc114a9b956e6b4_base
+
+-- | Get the type of a property in a group of properties.
+--
+--     [Returns]: the type of the property, or SDL_PROPERTY_TYPE_INVALID if it is not set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasProperty'
+--
+--     [C declaration]: @SDL_GetPropertyType@, defined at @SDL3\/SDL_properties.h 372:46@
+sDL_GetPropertyType
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> IO SDL_PropertyType
+sDL_GetPropertyType = hs_bindgen_0dc114a9b956e6b4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetPointerProperty@
+foreign import ccall unsafe "hs_bindgen_137a3bf658fca01b"
+  hs_bindgen_137a3bf658fca01b_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetPointerProperty@
+hs_bindgen_137a3bf658fca01b
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_137a3bf658fca01b =
+  BG.fromFFIType hs_bindgen_137a3bf658fca01b_base
+
+-- | Get a pointer property from a group of properties.
+--
+--     By convention, the names of properties that SDL exposes on objects will start with \"SDL.\", and properties that SDL uses internally will start with \"SDL.internal.\". These should be considered read-only and should not be modified by applications.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a pointer property.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the data returned is not protected and could potentially be freed if you call @SDL_SetPointerProperty()@ or @SDL_ClearProperty()@ on these properties from another thread. If you need to avoid this, use @SDL_LockProperties()@ and @SDL_UnlockProperties()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetBooleanProperty', 'sDL_GetFloatProperty', 'sDL_GetNumberProperty', 'sDL_GetPropertyType', 'sDL_GetStringProperty', 'sDL_HasProperty', 'sDL_SetPointerProperty'
+--
+--     [C declaration]: @SDL_GetPointerProperty@, defined at @SDL3\/SDL_properties.h 405:36@
+sDL_GetPointerProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetPointerProperty = hs_bindgen_137a3bf658fca01b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetStringProperty@
+foreign import ccall unsafe "hs_bindgen_13dfafaed8ef603e"
+  hs_bindgen_13dfafaed8ef603e_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetStringProperty@
+hs_bindgen_13dfafaed8ef603e
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_13dfafaed8ef603e =
+  BG.fromFFIType hs_bindgen_13dfafaed8ef603e_base
+
+-- | Get a string property from a group of properties.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a string property.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the data returned is not protected and could potentially be freed if you call @SDL_SetStringProperty()@ or @SDL_ClearProperty()@ on these properties from another thread. If you need to avoid this, use @SDL_LockProperties()@ and @SDL_UnlockProperties()@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetStringProperty'
+--
+--     [C declaration]: @SDL_GetStringProperty@, defined at @SDL3\/SDL_properties.h 429:42@
+sDL_GetStringProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetStringProperty = hs_bindgen_13dfafaed8ef603e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetNumberProperty@
+foreign import ccall unsafe "hs_bindgen_047e09cd4176f3ce"
+  hs_bindgen_047e09cd4176f3ce_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int64
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetNumberProperty@
+hs_bindgen_047e09cd4176f3ce
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+hs_bindgen_047e09cd4176f3ce =
+  BG.fromFFIType hs_bindgen_047e09cd4176f3ce_base
+
+-- | Get a number property from a group of properties.
+--
+--     You can use @SDL_GetPropertyType()@ to query whether the property exists and is a number property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a number property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetNumberProperty'
+--
+--     [C declaration]: @SDL_GetNumberProperty@, defined at @SDL3\/SDL_properties.h 451:36@
+sDL_GetNumberProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Sint64
+sDL_GetNumberProperty = hs_bindgen_047e09cd4176f3ce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetFloatProperty@
+foreign import ccall unsafe "hs_bindgen_54dfc33f97564e4d"
+  hs_bindgen_54dfc33f97564e4d_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetFloatProperty@
+hs_bindgen_54dfc33f97564e4d
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_54dfc33f97564e4d =
+  BG.fromFFIType hs_bindgen_54dfc33f97564e4d_base
+
+-- | Get a floating point property from a group of properties.
+--
+--     You can use @SDL_GetPropertyType()@ to query whether the property exists and is a floating point property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a float property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetFloatProperty'
+--
+--     [C declaration]: @SDL_GetFloatProperty@, defined at @SDL3\/SDL_properties.h 473:35@
+sDL_GetFloatProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO BG.CFloat
+sDL_GetFloatProperty = hs_bindgen_54dfc33f97564e4d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetBooleanProperty@
+foreign import ccall unsafe "hs_bindgen_ff205e1f9b9cb233"
+  hs_bindgen_ff205e1f9b9cb233_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_GetBooleanProperty@
+hs_bindgen_ff205e1f9b9cb233
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_ff205e1f9b9cb233 =
+  BG.fromFFIType hs_bindgen_ff205e1f9b9cb233_base
+
+-- | Get a boolean property from a group of properties.
+--
+--     You can use @SDL_GetPropertyType()@ to query whether the property exists and is a boolean property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a boolean property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPropertyType', 'sDL_HasProperty', 'sDL_SetBooleanProperty'
+--
+--     [C declaration]: @SDL_GetBooleanProperty@, defined at @SDL3\/SDL_properties.h 495:34@
+sDL_GetBooleanProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO BG.CBool
+sDL_GetBooleanProperty = hs_bindgen_ff205e1f9b9cb233
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_ClearProperty@
+foreign import ccall unsafe "hs_bindgen_2b64b35dcac92b2c"
+  hs_bindgen_2b64b35dcac92b2c_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_ClearProperty@
+hs_bindgen_2b64b35dcac92b2c
+  :: SDL_PropertiesID
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_2b64b35dcac92b2c =
+  BG.fromFFIType hs_bindgen_2b64b35dcac92b2c_base
+
+-- | Clear a property from a group of properties.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ClearProperty@, defined at @SDL3\/SDL_properties.h 509:34@
+sDL_ClearProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to clear.
+  -> IO BG.CBool
+sDL_ClearProperty = hs_bindgen_2b64b35dcac92b2c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_EnumerateProperties@
+foreign import ccall unsafe "hs_bindgen_568e06654af8bf56"
+  hs_bindgen_568e06654af8bf56_base
+    :: BG.Word32
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_EnumerateProperties@
+hs_bindgen_568e06654af8bf56
+  :: SDL_PropertiesID
+  -> SDL_EnumeratePropertiesCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_568e06654af8bf56 =
+  BG.fromFFIType hs_bindgen_568e06654af8bf56_base
+
+-- | Enumerate the properties contained in a group of properties.
+--
+--     The callback function is called for each property in the group of properties. The properties are locked during enumeration.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EnumerateProperties@, defined at @SDL3\/SDL_properties.h 546:34@
+sDL_EnumerateProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> SDL_EnumeratePropertiesCallback
+  -- ^
+  --
+  --           [@callback@]: the function to call for each property.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO BG.CBool
+sDL_EnumerateProperties = hs_bindgen_568e06654af8bf56
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_DestroyProperties@
+foreign import ccall unsafe "hs_bindgen_eeb9d2ee08b0f608"
+  hs_bindgen_eeb9d2ee08b0f608_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Properties_Unsafe_SDL_DestroyProperties@
+hs_bindgen_eeb9d2ee08b0f608
+  :: SDL_PropertiesID
+  -> IO ()
+hs_bindgen_eeb9d2ee08b0f608 =
+  BG.fromFFIType hs_bindgen_eeb9d2ee08b0f608_base
+
+-- | Destroy a group of properties.
+--
+--     All properties are deleted and their cleanup functions will be called, if any.
+--
+--     [Thread safety]: This function should not be called while these properties are locked or other threads might be setting or getting values from these properties.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateProperties'
+--
+--     [C declaration]: @SDL_DestroyProperties@, defined at @SDL3\/SDL_properties.h 564:34@
+sDL_DestroyProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to destroy.
+  -> IO ()
+sDL_DestroyProperties = hs_bindgen_eeb9d2ee08b0f608
diff --git a/src/SDL3/Sys/Bindgen/Rect.hs b/src/SDL3/Sys/Bindgen/Rect.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Rect.hs
@@ -0,0 +1,447 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Some helper functions for managing rectangles and 2D points, in both integer and floating point versions. The structure that defines a point (using integers).
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRectEnclosingPoints', 'sDL_PointInRect'
+module SDL3.Sys.Bindgen.Rect (
+  SDL3.Sys.Bindgen.Rect.SDL_Point (..),
+  SDL3.Sys.Bindgen.Rect.SDL_FPoint (..),
+  SDL3.Sys.Bindgen.Rect.SDL_Rect (..),
+  SDL3.Sys.Bindgen.Rect.SDL_FRect (..),
+)
+where
+
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @struct SDL_Point@, defined at @SDL3\/SDL_rect.h 49:16@
+data SDL_Point = SDL_Point
+  { x :: BG.CInt
+  -- ^ [C declaration]: @x@, defined at @SDL3\/SDL_rect.h 51:9@
+  , y :: BG.CInt
+  -- ^ [C declaration]: @y@, defined at @SDL3\/SDL_rect.h 52:9@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_Point where
+  staticSizeOf = \_ -> (8 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_Point where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Point
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+
+instance Marshal.WriteRaw SDL_Point where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Point x2 y3 ->
+            HasCField.writeRaw (BG.Proxy @"x") ptr0 x2
+              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y3
+
+deriving via Marshal.EquivStorable SDL_Point instance BG.Storable SDL_Point
+
+instance (ty ~ BG.CInt) => BG.CompatHasField.HasField "x" SDL_Point ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Point{x = y1, y = BG.getField @"y" x0}
+      , BG.getField @"x" x0
+      )
+
+instance (ty ~ BG.CInt) => BG.HasField "x" (BG.Ptr SDL_Point) (BG.Ptr ty) where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_Point "x" where
+  type CFieldType SDL_Point "x" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+instance (ty ~ BG.CInt) => BG.CompatHasField.HasField "y" SDL_Point ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Point{y = y1, x = BG.getField @"x" x0}
+      , BG.getField @"y" x0
+      )
+
+instance (ty ~ BG.CInt) => BG.HasField "y" (BG.Ptr SDL_Point) (BG.Ptr ty) where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_Point "y" where
+  type CFieldType SDL_Point "y" = BG.CInt
+
+  offset# = \_ -> \_ -> 4
+
+-- | The structure that defines a point (using floating point values).
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRectEnclosingPointsFloat', 'sDL_PointInRectFloat'
+--
+--     [C declaration]: @struct SDL_FPoint@, defined at @SDL3\/SDL_rect.h 63:16@
+data SDL_FPoint = SDL_FPoint
+  { x :: BG.CFloat
+  -- ^ [C declaration]: @x@, defined at @SDL3\/SDL_rect.h 65:11@
+  , y :: BG.CFloat
+  -- ^ [C declaration]: @y@, defined at @SDL3\/SDL_rect.h 66:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_FPoint where
+  staticSizeOf = \_ -> (8 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_FPoint where
+  readRaw =
+    \ptr0 ->
+      pure SDL_FPoint
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+
+instance Marshal.WriteRaw SDL_FPoint where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_FPoint x2 y3 ->
+            HasCField.writeRaw (BG.Proxy @"x") ptr0 x2
+              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y3
+
+deriving via Marshal.EquivStorable SDL_FPoint instance BG.Storable SDL_FPoint
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "x" SDL_FPoint ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FPoint{x = y1, y = BG.getField @"y" x0}
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_FPoint) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_FPoint "x" where
+  type CFieldType SDL_FPoint "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 0
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "y" SDL_FPoint ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FPoint{y = y1, x = BG.getField @"x" x0}
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_FPoint) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_FPoint "y" where
+  type CFieldType SDL_FPoint "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 4
+
+-- | A rectangle, with the origin at the upper left (using integers).
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RectEmpty', 'sDL_RectsEqual', 'sDL_HasRectIntersection', 'sDL_GetRectIntersection', 'sDL_GetRectAndLineIntersection', 'sDL_GetRectUnion', 'sDL_GetRectEnclosingPoints'
+--
+--     [C declaration]: @struct SDL_Rect@, defined at @SDL3\/SDL_rect.h 83:16@
+data SDL_Rect = SDL_Rect
+  { x :: BG.CInt
+  -- ^ [C declaration]: @x@, defined at @SDL3\/SDL_rect.h 85:9@
+  , y :: BG.CInt
+  -- ^ [C declaration]: @y@, defined at @SDL3\/SDL_rect.h 85:12@
+  , w :: BG.CInt
+  -- ^ [C declaration]: @w@, defined at @SDL3\/SDL_rect.h 86:9@
+  , h :: BG.CInt
+  -- ^ [C declaration]: @h@, defined at @SDL3\/SDL_rect.h 86:12@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_Rect where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_Rect where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Rect
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"w") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"h") ptr0
+
+instance Marshal.WriteRaw SDL_Rect where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Rect x2 y3 w4 h5 ->
+            HasCField.writeRaw (BG.Proxy @"x") ptr0 x2
+              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y3
+              >> HasCField.writeRaw (BG.Proxy @"w") ptr0 w4
+              >> HasCField.writeRaw (BG.Proxy @"h") ptr0 h5
+
+deriving via Marshal.EquivStorable SDL_Rect instance BG.Storable SDL_Rect
+
+instance (ty ~ BG.CInt) => BG.CompatHasField.HasField "x" SDL_Rect ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Rect
+            { x = y1
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance (ty ~ BG.CInt) => BG.HasField "x" (BG.Ptr SDL_Rect) (BG.Ptr ty) where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_Rect "x" where
+  type CFieldType SDL_Rect "x" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+instance (ty ~ BG.CInt) => BG.CompatHasField.HasField "y" SDL_Rect ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Rect
+            { y = y1
+            , x = BG.getField @"x" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance (ty ~ BG.CInt) => BG.HasField "y" (BG.Ptr SDL_Rect) (BG.Ptr ty) where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_Rect "y" where
+  type CFieldType SDL_Rect "y" = BG.CInt
+
+  offset# = \_ -> \_ -> 4
+
+instance (ty ~ BG.CInt) => BG.CompatHasField.HasField "w" SDL_Rect ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Rect
+            { w = y1
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"w" x0
+      )
+
+instance (ty ~ BG.CInt) => BG.HasField "w" (BG.Ptr SDL_Rect) (BG.Ptr ty) where
+  getField = HasCField.fromPtr (BG.Proxy @"w")
+
+instance HasCField.HasCField SDL_Rect "w" where
+  type CFieldType SDL_Rect "w" = BG.CInt
+
+  offset# = \_ -> \_ -> 8
+
+instance (ty ~ BG.CInt) => BG.CompatHasField.HasField "h" SDL_Rect ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Rect
+            { h = y1
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            }
+      , BG.getField @"h" x0
+      )
+
+instance (ty ~ BG.CInt) => BG.HasField "h" (BG.Ptr SDL_Rect) (BG.Ptr ty) where
+  getField = HasCField.fromPtr (BG.Proxy @"h")
+
+instance HasCField.HasCField SDL_Rect "h" where
+  type CFieldType SDL_Rect "h" = BG.CInt
+
+  offset# = \_ -> \_ -> 12
+
+-- | A rectangle stored using floating point values.
+--
+--     The origin of the coordinate space is in the top-left, with increasing values moving down and right. The properties @x@ and @y@ represent the coordinates of the top-left corner of the rectangle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RectEmptyFloat', 'sDL_RectsEqualFloat', 'sDL_RectsEqualEpsilon', 'sDL_HasRectIntersectionFloat', 'sDL_GetRectIntersectionFloat', 'sDL_GetRectAndLineIntersectionFloat', 'sDL_GetRectUnionFloat', 'sDL_GetRectEnclosingPointsFloat', 'sDL_PointInRectFloat'
+--
+--     [C declaration]: @struct SDL_FRect@, defined at @SDL3\/SDL_rect.h 109:16@
+data SDL_FRect = SDL_FRect
+  { x :: BG.CFloat
+  -- ^ [C declaration]: @x@, defined at @SDL3\/SDL_rect.h 111:11@
+  , y :: BG.CFloat
+  -- ^ [C declaration]: @y@, defined at @SDL3\/SDL_rect.h 112:11@
+  , w :: BG.CFloat
+  -- ^ [C declaration]: @w@, defined at @SDL3\/SDL_rect.h 113:11@
+  , h :: BG.CFloat
+  -- ^ [C declaration]: @h@, defined at @SDL3\/SDL_rect.h 114:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_FRect where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_FRect where
+  readRaw =
+    \ptr0 ->
+      pure SDL_FRect
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"w") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"h") ptr0
+
+instance Marshal.WriteRaw SDL_FRect where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_FRect x2 y3 w4 h5 ->
+            HasCField.writeRaw (BG.Proxy @"x") ptr0 x2
+              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y3
+              >> HasCField.writeRaw (BG.Proxy @"w") ptr0 w4
+              >> HasCField.writeRaw (BG.Proxy @"h") ptr0 h5
+
+deriving via Marshal.EquivStorable SDL_FRect instance BG.Storable SDL_FRect
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "x" SDL_FRect ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FRect
+            { x = y1
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_FRect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_FRect "x" where
+  type CFieldType SDL_FRect "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 0
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "y" SDL_FRect ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FRect
+            { y = y1
+            , x = BG.getField @"x" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_FRect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_FRect "y" where
+  type CFieldType SDL_FRect "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 4
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "w" SDL_FRect ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FRect
+            { w = y1
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"w" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "w" (BG.Ptr SDL_FRect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"w")
+
+instance HasCField.HasCField SDL_FRect "w" where
+  type CFieldType SDL_FRect "w" = BG.CFloat
+
+  offset# = \_ -> \_ -> 8
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "h" SDL_FRect ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FRect
+            { h = y1
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , w = BG.getField @"w" x0
+            }
+      , BG.getField @"h" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "h" (BG.Ptr SDL_FRect) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"h")
+
+instance HasCField.HasCField SDL_FRect "h" where
+  type CFieldType SDL_FRect "h" = BG.CFloat
+
+  offset# = \_ -> \_ -> 12
diff --git a/src/SDL3/Sys/Bindgen/Rect/FunPtr.hs b/src/SDL3/Sys/Bindgen/Rect/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Rect/FunPtr.hs
@@ -0,0 +1,922 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Rect.FunPtr (
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_RectToFRect,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_PointInRect,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_RectEmpty,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_RectsEqual,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_HasRectIntersection,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_GetRectIntersection,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_GetRectUnion,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_GetRectEnclosingPoints,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_GetRectAndLineIntersection,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_PointInRectFloat,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_RectEmptyFloat,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_RectsEqualEpsilon,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_RectsEqualFloat,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_HasRectIntersectionFloat,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_GetRectIntersectionFloat,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_GetRectUnionFloat,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_GetRectEnclosingPointsFloat,
+  SDL3.Sys.Bindgen.Rect.FunPtr.sDL_GetRectAndLineIntersectionFloat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Rect
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_rect.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectToFRect */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_81396927af8995d0 (void)) ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_FRect *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_RectToFRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_PointInRect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8ad7f125172b6954 (void)) ("
+         , "  SDL_Point const *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_PointInRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectEmpty */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_423b3dd0cd8e3bd3 (void)) ("
+         , "  SDL_Rect const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RectEmpty;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectsEqual */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8e6916371c8ddba4 (void)) ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_RectsEqual;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_HasRectIntersection */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e6e10beddc2428e4 (void)) ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_HasRectIntersection;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectIntersection */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b27ebfc7301ab58a (void)) ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Rect *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRectIntersection;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectUnion */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f2cca914398431e6 (void)) ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Rect *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRectUnion;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectEnclosingPoints */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9e30de5a15e6eb56 (void)) ("
+         , "  SDL_Point const *arg1,"
+         , "  signed int arg2,"
+         , "  SDL_Rect const *arg3,"
+         , "  SDL_Rect *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRectEnclosingPoints;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectAndLineIntersection */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8fb4c89870de38a5 (void)) ("
+         , "  SDL_Rect const *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3,"
+         , "  signed int *arg4,"
+         , "  signed int *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRectAndLineIntersection;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_PointInRectFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_092906727716778c (void)) ("
+         , "  SDL_FPoint const *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_PointInRectFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectEmptyFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_31feb0e1be2327c4 (void)) ("
+         , "  SDL_FRect const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RectEmptyFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectsEqualEpsilon */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3b833d6a0ec61a00 (void)) ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_RectsEqualEpsilon;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectsEqualFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6182b7c77941f68d (void)) ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_RectsEqualFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_HasRectIntersectionFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3add038abafa0b81 (void)) ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_HasRectIntersectionFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectIntersectionFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_5458db9427cb15c2 (void)) ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  SDL_FRect *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRectIntersectionFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectUnionFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_937c1757d8b5c9a9 (void)) ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  SDL_FRect *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRectUnionFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectEnclosingPointsFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_09f44777a8ae2968 (void)) ("
+         , "  SDL_FPoint const *arg1,"
+         , "  signed int arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FRect *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRectEnclosingPointsFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectAndLineIntersectionFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_0a7c277ad6063b14 (void)) ("
+         , "  SDL_FRect const *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRectAndLineIntersectionFloat;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectToFRect@
+foreign import ccall unsafe "hs_bindgen_81396927af8995d0"
+  hs_bindgen_81396927af8995d0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectToFRect@
+hs_bindgen_81396927af8995d0
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_Rect -> BG.Ptr SDL_FRect -> IO ()))
+hs_bindgen_81396927af8995d0 =
+  BG.fromFFIType hs_bindgen_81396927af8995d0_base
+
+{-# NOINLINE sDL_RectToFRect #-}
+
+-- | Convert an 'SDL_Rect' to 'SDL_FRect'
+--
+--     [@rect@]: a pointer to an 'SDL_Rect'.
+--
+--     [@frect@]: a pointer filled in with the floating point representation of @rect@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectToFRect@, defined at @SDL3\/SDL_rect.h 129:23@
+sDL_RectToFRect :: BG.FunPtr (PtrConst.PtrConst SDL_Rect -> BG.Ptr SDL_FRect -> IO ())
+sDL_RectToFRect =
+  BG.unsafePerformIO hs_bindgen_81396927af8995d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_PointInRect@
+foreign import ccall unsafe "hs_bindgen_8ad7f125172b6954"
+  hs_bindgen_8ad7f125172b6954_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_PointInRect@
+hs_bindgen_8ad7f125172b6954
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_Point -> PtrConst.PtrConst SDL_Rect -> IO BG.CBool))
+hs_bindgen_8ad7f125172b6954 =
+  BG.fromFFIType hs_bindgen_8ad7f125172b6954_base
+
+{-# NOINLINE sDL_PointInRect #-}
+
+-- | Determine whether a point resides inside a rectangle.
+--
+--     A point is considered part of a rectangle if both @p@ and @r@ are not NULL, and @p@ \'s x and y coordinates are >= to the rectangle\'s top left corner, and \< the rectangle\'s x+w and y+h. So a 1x1 rectangle considers point (0,0) as \"inside\" and (0,1) as not.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [@p@]: the point to test.
+--
+--     [@r@]: the rectangle to test.
+--
+--     [Returns]: true if @p@ is contained by @r@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PointInRect@, defined at @SDL3\/SDL_rect.h 158:23@
+sDL_PointInRect
+  :: BG.FunPtr (PtrConst.PtrConst SDL_Point -> PtrConst.PtrConst SDL_Rect -> IO BG.CBool)
+sDL_PointInRect =
+  BG.unsafePerformIO hs_bindgen_8ad7f125172b6954
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectEmpty@
+foreign import ccall unsafe "hs_bindgen_423b3dd0cd8e3bd3"
+  hs_bindgen_423b3dd0cd8e3bd3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectEmpty@
+hs_bindgen_423b3dd0cd8e3bd3 :: IO (BG.FunPtr (PtrConst.PtrConst SDL_Rect -> IO BG.CBool))
+hs_bindgen_423b3dd0cd8e3bd3 =
+  BG.fromFFIType hs_bindgen_423b3dd0cd8e3bd3_base
+
+{-# NOINLINE sDL_RectEmpty #-}
+
+-- | Determine whether a rectangle has no area.
+--
+--     A rectangle is considered \"empty\" for this function if @r@ is NULL, or if @r@ \'s width and\/or height are \<= 0.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [@r@]: the rectangle to test.
+--
+--     [Returns]: true if the rectangle is \"empty\", false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectEmpty@, defined at @SDL3\/SDL_rect.h 182:23@
+sDL_RectEmpty :: BG.FunPtr (PtrConst.PtrConst SDL_Rect -> IO BG.CBool)
+sDL_RectEmpty =
+  BG.unsafePerformIO hs_bindgen_423b3dd0cd8e3bd3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectsEqual@
+foreign import ccall unsafe "hs_bindgen_8e6916371c8ddba4"
+  hs_bindgen_8e6916371c8ddba4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectsEqual@
+hs_bindgen_8e6916371c8ddba4
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_Rect -> PtrConst.PtrConst SDL_Rect -> IO BG.CBool))
+hs_bindgen_8e6916371c8ddba4 =
+  BG.fromFFIType hs_bindgen_8e6916371c8ddba4_base
+
+{-# NOINLINE sDL_RectsEqual #-}
+
+-- | Determine whether two rectangles are equal.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height match.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [@a@]: the first rectangle to test.
+--
+--     [@b@]: the second rectangle to test.
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectsEqual@, defined at @SDL3\/SDL_rect.h 206:23@
+sDL_RectsEqual
+  :: BG.FunPtr (PtrConst.PtrConst SDL_Rect -> PtrConst.PtrConst SDL_Rect -> IO BG.CBool)
+sDL_RectsEqual =
+  BG.unsafePerformIO hs_bindgen_8e6916371c8ddba4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_HasRectIntersection@
+foreign import ccall unsafe "hs_bindgen_e6e10beddc2428e4"
+  hs_bindgen_e6e10beddc2428e4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_HasRectIntersection@
+hs_bindgen_e6e10beddc2428e4
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_Rect -> PtrConst.PtrConst SDL_Rect -> IO BG.CBool))
+hs_bindgen_e6e10beddc2428e4 =
+  BG.fromFFIType hs_bindgen_e6e10beddc2428e4_base
+
+{-# NOINLINE sDL_HasRectIntersection #-}
+
+-- | Determine whether two rectangles intersect.
+--
+--     If either pointer is NULL the function will return false.
+--
+--     [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+--
+--     [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRectIntersection'
+--
+--     [C declaration]: @SDL_HasRectIntersection@, defined at @SDL3\/SDL_rect.h 227:34@
+sDL_HasRectIntersection
+  :: BG.FunPtr (PtrConst.PtrConst SDL_Rect -> PtrConst.PtrConst SDL_Rect -> IO BG.CBool)
+sDL_HasRectIntersection =
+  BG.unsafePerformIO hs_bindgen_e6e10beddc2428e4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectIntersection@
+foreign import ccall unsafe "hs_bindgen_b27ebfc7301ab58a"
+  hs_bindgen_b27ebfc7301ab58a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectIntersection@
+hs_bindgen_b27ebfc7301ab58a
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst SDL_Rect -> PtrConst.PtrConst SDL_Rect -> BG.Ptr SDL_Rect -> IO BG.CBool)
+       )
+hs_bindgen_b27ebfc7301ab58a =
+  BG.fromFFIType hs_bindgen_b27ebfc7301ab58a_base
+
+{-# NOINLINE sDL_GetRectIntersection #-}
+
+-- | Calculate the intersection of two rectangles.
+--
+--     If @result@ is NULL then this function will return false.
+--
+--     [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+--
+--     [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+--
+--     [@result@]: an 'SDL_Rect' structure filled in with the intersection of rectangles @A@ and @B@.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasRectIntersection'
+--
+--     [C declaration]: @SDL_GetRectIntersection@, defined at @SDL3\/SDL_rect.h 246:34@
+sDL_GetRectIntersection
+  :: BG.FunPtr
+       (PtrConst.PtrConst SDL_Rect -> PtrConst.PtrConst SDL_Rect -> BG.Ptr SDL_Rect -> IO BG.CBool)
+sDL_GetRectIntersection =
+  BG.unsafePerformIO hs_bindgen_b27ebfc7301ab58a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectUnion@
+foreign import ccall unsafe "hs_bindgen_f2cca914398431e6"
+  hs_bindgen_f2cca914398431e6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectUnion@
+hs_bindgen_f2cca914398431e6
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst SDL_Rect -> PtrConst.PtrConst SDL_Rect -> BG.Ptr SDL_Rect -> IO BG.CBool)
+       )
+hs_bindgen_f2cca914398431e6 =
+  BG.fromFFIType hs_bindgen_f2cca914398431e6_base
+
+{-# NOINLINE sDL_GetRectUnion #-}
+
+-- | Calculate the union of two rectangles.
+--
+--     [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+--
+--     [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+--
+--     [@result@]: an 'SDL_Rect' structure filled in with the union of rectangles @A@ and @B@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectUnion@, defined at @SDL3\/SDL_rect.h 262:34@
+sDL_GetRectUnion
+  :: BG.FunPtr
+       (PtrConst.PtrConst SDL_Rect -> PtrConst.PtrConst SDL_Rect -> BG.Ptr SDL_Rect -> IO BG.CBool)
+sDL_GetRectUnion =
+  BG.unsafePerformIO hs_bindgen_f2cca914398431e6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectEnclosingPoints@
+foreign import ccall unsafe "hs_bindgen_9e30de5a15e6eb56"
+  hs_bindgen_9e30de5a15e6eb56_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectEnclosingPoints@
+hs_bindgen_9e30de5a15e6eb56
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst SDL_Point
+             -> BG.CInt
+             -> PtrConst.PtrConst SDL_Rect
+             -> BG.Ptr SDL_Rect
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_9e30de5a15e6eb56 =
+  BG.fromFFIType hs_bindgen_9e30de5a15e6eb56_base
+
+{-# NOINLINE sDL_GetRectEnclosingPoints #-}
+
+-- | Calculate a minimal rectangle enclosing a set of points.
+--
+--     If @clip@ is not NULL then only points inside of the clipping rectangle are considered.
+--
+--     [@points@]: an array of 'SDL_Point' structures representing points to be enclosed.
+--
+--     [@count@]: the number of structures in the @points@ array.
+--
+--     [@clip@]: an 'SDL_Rect' used for clipping or NULL to enclose all points.
+--
+--     [@result@]: an 'SDL_Rect' structure filled in with the minimal enclosing rectangle.
+--
+--     [Returns]: true if any points were enclosed or false if all the points were outside of the clipping rectangle.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectEnclosingPoints@, defined at @SDL3\/SDL_rect.h 283:34@
+sDL_GetRectEnclosingPoints
+  :: BG.FunPtr
+       ( PtrConst.PtrConst SDL_Point
+         -> BG.CInt
+         -> PtrConst.PtrConst SDL_Rect
+         -> BG.Ptr SDL_Rect
+         -> IO BG.CBool
+       )
+sDL_GetRectEnclosingPoints =
+  BG.unsafePerformIO hs_bindgen_9e30de5a15e6eb56
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectAndLineIntersection@
+foreign import ccall unsafe "hs_bindgen_8fb4c89870de38a5"
+  hs_bindgen_8fb4c89870de38a5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectAndLineIntersection@
+hs_bindgen_8fb4c89870de38a5
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst SDL_Rect
+             -> BG.Ptr BG.CInt
+             -> BG.Ptr BG.CInt
+             -> BG.Ptr BG.CInt
+             -> BG.Ptr BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_8fb4c89870de38a5 =
+  BG.fromFFIType hs_bindgen_8fb4c89870de38a5_base
+
+{-# NOINLINE sDL_GetRectAndLineIntersection #-}
+
+-- | Calculate the intersection of a rectangle and line segment.
+--
+--     This function is used to clip a line segment to a rectangle. A line segment contained entirely within the rectangle or that does not intersect will remain unchanged. A line segment that crosses the rectangle at either or both ends will be clipped to the boundary of the rectangle and the new coordinates saved in @X1@, @Y1@, @X2@, and\/or @Y2@ as necessary.
+--
+--     [@rect@]: an 'SDL_Rect' structure representing the rectangle to intersect.
+--
+--     [@X1@]: a pointer to the starting X-coordinate of the line.
+--
+--     [@Y1@]: a pointer to the starting Y-coordinate of the line.
+--
+--     [@X2@]: a pointer to the ending X-coordinate of the line.
+--
+--     [@Y2@]: a pointer to the ending Y-coordinate of the line.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectAndLineIntersection@, defined at @SDL3\/SDL_rect.h 305:34@
+sDL_GetRectAndLineIntersection
+  :: BG.FunPtr
+       ( PtrConst.PtrConst SDL_Rect
+         -> BG.Ptr BG.CInt
+         -> BG.Ptr BG.CInt
+         -> BG.Ptr BG.CInt
+         -> BG.Ptr BG.CInt
+         -> IO BG.CBool
+       )
+sDL_GetRectAndLineIntersection =
+  BG.unsafePerformIO hs_bindgen_8fb4c89870de38a5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_PointInRectFloat@
+foreign import ccall unsafe "hs_bindgen_092906727716778c"
+  hs_bindgen_092906727716778c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_PointInRectFloat@
+hs_bindgen_092906727716778c
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_FPoint -> PtrConst.PtrConst SDL_FRect -> IO BG.CBool))
+hs_bindgen_092906727716778c =
+  BG.fromFFIType hs_bindgen_092906727716778c_base
+
+{-# NOINLINE sDL_PointInRectFloat #-}
+
+-- | Determine whether a point resides inside a floating point rectangle.
+--
+--     A point is considered part of a rectangle if both @p@ and @r@ are not NULL, and @p@ \'s x and y coordinates are >= to the rectangle\'s top left corner, and \<= the rectangle\'s x+w and y+h. So a 1x1 rectangle considers point (0,0) and (0,1) as \"inside\" and (0,2) as not.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [@p@]: the point to test.
+--
+--     [@r@]: the rectangle to test.
+--
+--     [Returns]: true if @p@ is contained by @r@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PointInRectFloat@, defined at @SDL3\/SDL_rect.h 331:23@
+sDL_PointInRectFloat
+  :: BG.FunPtr (PtrConst.PtrConst SDL_FPoint -> PtrConst.PtrConst SDL_FRect -> IO BG.CBool)
+sDL_PointInRectFloat =
+  BG.unsafePerformIO hs_bindgen_092906727716778c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectEmptyFloat@
+foreign import ccall unsafe "hs_bindgen_31feb0e1be2327c4"
+  hs_bindgen_31feb0e1be2327c4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectEmptyFloat@
+hs_bindgen_31feb0e1be2327c4 :: IO (BG.FunPtr (PtrConst.PtrConst SDL_FRect -> IO BG.CBool))
+hs_bindgen_31feb0e1be2327c4 =
+  BG.fromFFIType hs_bindgen_31feb0e1be2327c4_base
+
+{-# NOINLINE sDL_RectEmptyFloat #-}
+
+-- | Determine whether a floating point rectangle takes no space.
+--
+--     A rectangle is considered \"empty\" for this function if @r@ is NULL, or if @r@ \'s width and\/or height are \< 0.0f.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [@r@]: the rectangle to test.
+--
+--     [Returns]: true if the rectangle is \"empty\", false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectEmptyFloat@, defined at @SDL3\/SDL_rect.h 355:23@
+sDL_RectEmptyFloat :: BG.FunPtr (PtrConst.PtrConst SDL_FRect -> IO BG.CBool)
+sDL_RectEmptyFloat =
+  BG.unsafePerformIO hs_bindgen_31feb0e1be2327c4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectsEqualEpsilon@
+foreign import ccall unsafe "hs_bindgen_3b833d6a0ec61a00"
+  hs_bindgen_3b833d6a0ec61a00_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectsEqualEpsilon@
+hs_bindgen_3b833d6a0ec61a00
+  :: IO
+       (BG.FunPtr (PtrConst.PtrConst SDL_FRect -> PtrConst.PtrConst SDL_FRect -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_3b833d6a0ec61a00 =
+  BG.fromFFIType hs_bindgen_3b833d6a0ec61a00_base
+
+{-# NOINLINE sDL_RectsEqualEpsilon #-}
+
+-- | Determine whether two floating point rectangles are equal, within some given epsilon.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height are within @epsilon@ of each other. If you don\'t know what value to use for @epsilon@, you should call the SDL_RectsEqualFloat function instead.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [@a@]: the first rectangle to test.
+--
+--     [@b@]: the second rectangle to test.
+--
+--     [@epsilon@]: the epsilon value for comparison.
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RectsEqualFloat'
+--
+--     [C declaration]: @SDL_RectsEqualEpsilon@, defined at @SDL3\/SDL_rect.h 385:23@
+sDL_RectsEqualEpsilon
+  :: BG.FunPtr (PtrConst.PtrConst SDL_FRect -> PtrConst.PtrConst SDL_FRect -> BG.CFloat -> IO BG.CBool)
+sDL_RectsEqualEpsilon =
+  BG.unsafePerformIO hs_bindgen_3b833d6a0ec61a00
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectsEqualFloat@
+foreign import ccall unsafe "hs_bindgen_6182b7c77941f68d"
+  hs_bindgen_6182b7c77941f68d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_RectsEqualFloat@
+hs_bindgen_6182b7c77941f68d
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_FRect -> PtrConst.PtrConst SDL_FRect -> IO BG.CBool))
+hs_bindgen_6182b7c77941f68d =
+  BG.fromFFIType hs_bindgen_6182b7c77941f68d_base
+
+{-# NOINLINE sDL_RectsEqualFloat #-}
+
+-- | Determine whether two floating point rectangles are equal, within a default epsilon.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height are within SDL_FLT_EPSILON of each other. This is often a reasonable way to compare two floating point rectangles and deal with the slight precision variations in floating point calculations that tend to pop up.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [@a@]: the first rectangle to test.
+--
+--     [@b@]: the second rectangle to test.
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RectsEqualEpsilon'
+--
+--     [C declaration]: @SDL_RectsEqualFloat@, defined at @SDL3\/SDL_rect.h 420:23@
+sDL_RectsEqualFloat
+  :: BG.FunPtr (PtrConst.PtrConst SDL_FRect -> PtrConst.PtrConst SDL_FRect -> IO BG.CBool)
+sDL_RectsEqualFloat =
+  BG.unsafePerformIO hs_bindgen_6182b7c77941f68d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_HasRectIntersectionFloat@
+foreign import ccall unsafe "hs_bindgen_3add038abafa0b81"
+  hs_bindgen_3add038abafa0b81_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_HasRectIntersectionFloat@
+hs_bindgen_3add038abafa0b81
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_FRect -> PtrConst.PtrConst SDL_FRect -> IO BG.CBool))
+hs_bindgen_3add038abafa0b81 =
+  BG.fromFFIType hs_bindgen_3add038abafa0b81_base
+
+{-# NOINLINE sDL_HasRectIntersectionFloat #-}
+
+-- | Determine whether two rectangles intersect with float precision.
+--
+--     If either pointer is NULL the function will return false.
+--
+--     [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+--
+--     [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRectIntersection'
+--
+--     [C declaration]: @SDL_HasRectIntersectionFloat@, defined at @SDL3\/SDL_rect.h 440:34@
+sDL_HasRectIntersectionFloat
+  :: BG.FunPtr (PtrConst.PtrConst SDL_FRect -> PtrConst.PtrConst SDL_FRect -> IO BG.CBool)
+sDL_HasRectIntersectionFloat =
+  BG.unsafePerformIO hs_bindgen_3add038abafa0b81
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectIntersectionFloat@
+foreign import ccall unsafe "hs_bindgen_5458db9427cb15c2"
+  hs_bindgen_5458db9427cb15c2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectIntersectionFloat@
+hs_bindgen_5458db9427cb15c2
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst SDL_FRect -> PtrConst.PtrConst SDL_FRect -> BG.Ptr SDL_FRect -> IO BG.CBool)
+       )
+hs_bindgen_5458db9427cb15c2 =
+  BG.fromFFIType hs_bindgen_5458db9427cb15c2_base
+
+{-# NOINLINE sDL_GetRectIntersectionFloat #-}
+
+-- | Calculate the intersection of two rectangles with float precision.
+--
+--     If @result@ is NULL then this function will return false.
+--
+--     [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+--
+--     [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+--
+--     [@result@]: an 'SDL_FRect' structure filled in with the intersection of rectangles @A@ and @B@.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasRectIntersectionFloat'
+--
+--     [C declaration]: @SDL_GetRectIntersectionFloat@, defined at @SDL3\/SDL_rect.h 459:34@
+sDL_GetRectIntersectionFloat
+  :: BG.FunPtr
+       (PtrConst.PtrConst SDL_FRect -> PtrConst.PtrConst SDL_FRect -> BG.Ptr SDL_FRect -> IO BG.CBool)
+sDL_GetRectIntersectionFloat =
+  BG.unsafePerformIO hs_bindgen_5458db9427cb15c2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectUnionFloat@
+foreign import ccall unsafe "hs_bindgen_937c1757d8b5c9a9"
+  hs_bindgen_937c1757d8b5c9a9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectUnionFloat@
+hs_bindgen_937c1757d8b5c9a9
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst SDL_FRect -> PtrConst.PtrConst SDL_FRect -> BG.Ptr SDL_FRect -> IO BG.CBool)
+       )
+hs_bindgen_937c1757d8b5c9a9 =
+  BG.fromFFIType hs_bindgen_937c1757d8b5c9a9_base
+
+{-# NOINLINE sDL_GetRectUnionFloat #-}
+
+-- | Calculate the union of two rectangles with float precision.
+--
+--     [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+--
+--     [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+--
+--     [@result@]: an 'SDL_FRect' structure filled in with the union of rectangles @A@ and @B@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectUnionFloat@, defined at @SDL3\/SDL_rect.h 475:34@
+sDL_GetRectUnionFloat
+  :: BG.FunPtr
+       (PtrConst.PtrConst SDL_FRect -> PtrConst.PtrConst SDL_FRect -> BG.Ptr SDL_FRect -> IO BG.CBool)
+sDL_GetRectUnionFloat =
+  BG.unsafePerformIO hs_bindgen_937c1757d8b5c9a9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectEnclosingPointsFloat@
+foreign import ccall unsafe "hs_bindgen_09f44777a8ae2968"
+  hs_bindgen_09f44777a8ae2968_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectEnclosingPointsFloat@
+hs_bindgen_09f44777a8ae2968
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst SDL_FPoint
+             -> BG.CInt
+             -> PtrConst.PtrConst SDL_FRect
+             -> BG.Ptr SDL_FRect
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_09f44777a8ae2968 =
+  BG.fromFFIType hs_bindgen_09f44777a8ae2968_base
+
+{-# NOINLINE sDL_GetRectEnclosingPointsFloat #-}
+
+-- | Calculate a minimal rectangle enclosing a set of points with float precision.
+--
+--     If @clip@ is not NULL then only points inside of the clipping rectangle are considered.
+--
+--     [@points@]: an array of 'SDL_FPoint' structures representing points to be enclosed.
+--
+--     [@count@]: the number of structures in the @points@ array.
+--
+--     [@clip@]: an 'SDL_FRect' used for clipping or NULL to enclose all points.
+--
+--     [@result@]: an 'SDL_FRect' structure filled in with the minimal enclosing rectangle.
+--
+--     [Returns]: true if any points were enclosed or false if all the points were outside of the clipping rectangle.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectEnclosingPointsFloat@, defined at @SDL3\/SDL_rect.h 497:34@
+sDL_GetRectEnclosingPointsFloat
+  :: BG.FunPtr
+       ( PtrConst.PtrConst SDL_FPoint
+         -> BG.CInt
+         -> PtrConst.PtrConst SDL_FRect
+         -> BG.Ptr SDL_FRect
+         -> IO BG.CBool
+       )
+sDL_GetRectEnclosingPointsFloat =
+  BG.unsafePerformIO hs_bindgen_09f44777a8ae2968
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectAndLineIntersectionFloat@
+foreign import ccall unsafe "hs_bindgen_0a7c277ad6063b14"
+  hs_bindgen_0a7c277ad6063b14_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_get_SDL_GetRectAndLineIntersectionFloat@
+hs_bindgen_0a7c277ad6063b14
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst SDL_FRect
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_0a7c277ad6063b14 =
+  BG.fromFFIType hs_bindgen_0a7c277ad6063b14_base
+
+{-# NOINLINE sDL_GetRectAndLineIntersectionFloat #-}
+
+-- | Calculate the intersection of a rectangle and line segment with float precision.
+--
+--     This function is used to clip a line segment to a rectangle. A line segment contained entirely within the rectangle or that does not intersect will remain unchanged. A line segment that crosses the rectangle at either or both ends will be clipped to the boundary of the rectangle and the new coordinates saved in @X1@, @Y1@, @X2@, and\/or @Y2@ as necessary.
+--
+--     [@rect@]: an 'SDL_FRect' structure representing the rectangle to intersect.
+--
+--     [@X1@]: a pointer to the starting X-coordinate of the line.
+--
+--     [@Y1@]: a pointer to the starting Y-coordinate of the line.
+--
+--     [@X2@]: a pointer to the ending X-coordinate of the line.
+--
+--     [@Y2@]: a pointer to the ending Y-coordinate of the line.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectAndLineIntersectionFloat@, defined at @SDL3\/SDL_rect.h 520:34@
+sDL_GetRectAndLineIntersectionFloat
+  :: BG.FunPtr
+       ( PtrConst.PtrConst SDL_FRect
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> IO BG.CBool
+       )
+sDL_GetRectAndLineIntersectionFloat =
+  BG.unsafePerformIO hs_bindgen_0a7c277ad6063b14
diff --git a/src/SDL3/Sys/Bindgen/Rect/Safe.hs b/src/SDL3/Sys/Bindgen/Rect/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Rect/Safe.hs
@@ -0,0 +1,962 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Rect.Safe (
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_RectToFRect,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_PointInRect,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_RectEmpty,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_RectsEqual,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_HasRectIntersection,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_GetRectIntersection,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_GetRectUnion,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_GetRectEnclosingPoints,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_GetRectAndLineIntersection,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_PointInRectFloat,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_RectEmptyFloat,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_RectsEqualEpsilon,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_RectsEqualFloat,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_HasRectIntersectionFloat,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_GetRectIntersectionFloat,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_GetRectUnionFloat,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_GetRectEnclosingPointsFloat,
+  SDL3.Sys.Bindgen.Rect.Safe.sDL_GetRectAndLineIntersectionFloat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Rect
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_rect.h>"
+         , "void hs_bindgen_a9f520f11e166938 ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_FRect *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_RectToFRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7c0acf8d07c0c1dd ("
+         , "  SDL_Point const *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_PointInRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7298326168509737 ("
+         , "  SDL_Rect const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RectEmpty)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_d40e366324ea8c2f ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RectsEqual)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b2eda76752d2c711 ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_HasRectIntersection)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_808b8181f3c8f0c7 ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Rect *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectIntersection)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_44114d292c0406e2 ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Rect *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectUnion)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_b02c8a352859e75c ("
+         , "  SDL_Point const *arg1,"
+         , "  signed int arg2,"
+         , "  SDL_Rect const *arg3,"
+         , "  SDL_Rect *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectEnclosingPoints)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_1319bb78d8d2e643 ("
+         , "  SDL_Rect const *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3,"
+         , "  signed int *arg4,"
+         , "  signed int *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectAndLineIntersection)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_db89e1c0a4060064 ("
+         , "  SDL_FPoint const *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_PointInRectFloat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_cf687f22e3772d43 ("
+         , "  SDL_FRect const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RectEmptyFloat)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ffb7b7aa2884662e ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RectsEqualEpsilon)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_16841c4903715a15 ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RectsEqualFloat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_4ccee9871e6b2122 ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_HasRectIntersectionFloat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_73c245953e392b8b ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  SDL_FRect *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectIntersectionFloat)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_26df11f6f3486748 ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  SDL_FRect *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectUnionFloat)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_c543abfe8b881179 ("
+         , "  SDL_FPoint const *arg1,"
+         , "  signed int arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FRect *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectEnclosingPointsFloat)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_274c31df17fcabf9 ("
+         , "  SDL_FRect const *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectAndLineIntersectionFloat)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectToFRect@
+foreign import ccall safe "hs_bindgen_a9f520f11e166938"
+  hs_bindgen_a9f520f11e166938_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectToFRect@
+hs_bindgen_a9f520f11e166938
+  :: PtrConst.PtrConst SDL_Rect
+  -> BG.Ptr SDL_FRect
+  -> IO ()
+hs_bindgen_a9f520f11e166938 =
+  BG.fromFFIType hs_bindgen_a9f520f11e166938_base
+
+-- | Convert an 'SDL_Rect' to 'SDL_FRect'
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectToFRect@, defined at @SDL3\/SDL_rect.h 129:23@
+sDL_RectToFRect
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to an 'SDL_Rect'.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@frect@]: a pointer filled in with the floating point representation of @rect@.
+  -> IO ()
+sDL_RectToFRect = hs_bindgen_a9f520f11e166938
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_PointInRect@
+foreign import ccall safe "hs_bindgen_7c0acf8d07c0c1dd"
+  hs_bindgen_7c0acf8d07c0c1dd_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_PointInRect@
+hs_bindgen_7c0acf8d07c0c1dd
+  :: PtrConst.PtrConst SDL_Point
+  -> PtrConst.PtrConst SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_7c0acf8d07c0c1dd =
+  BG.fromFFIType hs_bindgen_7c0acf8d07c0c1dd_base
+
+-- | Determine whether a point resides inside a rectangle.
+--
+--     A point is considered part of a rectangle if both @p@ and @r@ are not NULL, and @p@ \'s x and y coordinates are >= to the rectangle\'s top left corner, and \< the rectangle\'s x+w and y+h. So a 1x1 rectangle considers point (0,0) as \"inside\" and (0,1) as not.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if @p@ is contained by @r@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PointInRect@, defined at @SDL3\/SDL_rect.h 158:23@
+sDL_PointInRect
+  :: PtrConst.PtrConst SDL_Point
+  -- ^
+  --
+  --           [@p@]: the point to test.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO BG.CBool
+sDL_PointInRect = hs_bindgen_7c0acf8d07c0c1dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectEmpty@
+foreign import ccall safe "hs_bindgen_7298326168509737"
+  hs_bindgen_7298326168509737_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectEmpty@
+hs_bindgen_7298326168509737
+  :: PtrConst.PtrConst SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_7298326168509737 =
+  BG.fromFFIType hs_bindgen_7298326168509737_base
+
+-- | Determine whether a rectangle has no area.
+--
+--     A rectangle is considered \"empty\" for this function if @r@ is NULL, or if @r@ \'s width and\/or height are \<= 0.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangle is \"empty\", false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectEmpty@, defined at @SDL3\/SDL_rect.h 182:23@
+sDL_RectEmpty
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO BG.CBool
+sDL_RectEmpty = hs_bindgen_7298326168509737
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectsEqual@
+foreign import ccall safe "hs_bindgen_d40e366324ea8c2f"
+  hs_bindgen_d40e366324ea8c2f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectsEqual@
+hs_bindgen_d40e366324ea8c2f
+  :: PtrConst.PtrConst SDL_Rect
+  -> PtrConst.PtrConst SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_d40e366324ea8c2f =
+  BG.fromFFIType hs_bindgen_d40e366324ea8c2f_base
+
+-- | Determine whether two rectangles are equal.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height match.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectsEqual@, defined at @SDL3\/SDL_rect.h 206:23@
+sDL_RectsEqual
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@a@]: the first rectangle to test.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@b@]: the second rectangle to test.
+  -> IO BG.CBool
+sDL_RectsEqual = hs_bindgen_d40e366324ea8c2f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_HasRectIntersection@
+foreign import ccall safe "hs_bindgen_b2eda76752d2c711"
+  hs_bindgen_b2eda76752d2c711_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_HasRectIntersection@
+hs_bindgen_b2eda76752d2c711
+  :: PtrConst.PtrConst SDL_Rect
+  -> PtrConst.PtrConst SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_b2eda76752d2c711 =
+  BG.fromFFIType hs_bindgen_b2eda76752d2c711_base
+
+-- | Determine whether two rectangles intersect.
+--
+--     If either pointer is NULL the function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRectIntersection'
+--
+--     [C declaration]: @SDL_HasRectIntersection@, defined at @SDL3\/SDL_rect.h 227:34@
+sDL_HasRectIntersection
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+  -> IO BG.CBool
+sDL_HasRectIntersection = hs_bindgen_b2eda76752d2c711
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectIntersection@
+foreign import ccall safe "hs_bindgen_808b8181f3c8f0c7"
+  hs_bindgen_808b8181f3c8f0c7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectIntersection@
+hs_bindgen_808b8181f3c8f0c7
+  :: PtrConst.PtrConst SDL_Rect
+  -> PtrConst.PtrConst SDL_Rect
+  -> BG.Ptr SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_808b8181f3c8f0c7 =
+  BG.fromFFIType hs_bindgen_808b8181f3c8f0c7_base
+
+-- | Calculate the intersection of two rectangles.
+--
+--     If @result@ is NULL then this function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasRectIntersection'
+--
+--     [C declaration]: @SDL_GetRectIntersection@, defined at @SDL3\/SDL_rect.h 246:34@
+sDL_GetRectIntersection
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+  -> BG.Ptr SDL_Rect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_Rect' structure filled in with the intersection of rectangles @A@ and @B@.
+  -> IO BG.CBool
+sDL_GetRectIntersection = hs_bindgen_808b8181f3c8f0c7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectUnion@
+foreign import ccall safe "hs_bindgen_44114d292c0406e2"
+  hs_bindgen_44114d292c0406e2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectUnion@
+hs_bindgen_44114d292c0406e2
+  :: PtrConst.PtrConst SDL_Rect
+  -> PtrConst.PtrConst SDL_Rect
+  -> BG.Ptr SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_44114d292c0406e2 =
+  BG.fromFFIType hs_bindgen_44114d292c0406e2_base
+
+-- | Calculate the union of two rectangles.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectUnion@, defined at @SDL3\/SDL_rect.h 262:34@
+sDL_GetRectUnion
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+  -> BG.Ptr SDL_Rect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_Rect' structure filled in with the union of rectangles @A@ and @B@.
+  -> IO BG.CBool
+sDL_GetRectUnion = hs_bindgen_44114d292c0406e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectEnclosingPoints@
+foreign import ccall safe "hs_bindgen_b02c8a352859e75c"
+  hs_bindgen_b02c8a352859e75c_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectEnclosingPoints@
+hs_bindgen_b02c8a352859e75c
+  :: PtrConst.PtrConst SDL_Point
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL_Rect
+  -> BG.Ptr SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_b02c8a352859e75c =
+  BG.fromFFIType hs_bindgen_b02c8a352859e75c_base
+
+-- | Calculate a minimal rectangle enclosing a set of points.
+--
+--     If @clip@ is not NULL then only points inside of the clipping rectangle are considered.
+--
+--     [Returns]: true if any points were enclosed or false if all the points were outside of the clipping rectangle.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectEnclosingPoints@, defined at @SDL3\/SDL_rect.h 283:34@
+sDL_GetRectEnclosingPoints
+  :: PtrConst.PtrConst SDL_Point
+  -- ^
+  --
+  --           [@points@]: an array of 'SDL_Point' structures representing points to be enclosed.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of structures in the @points@ array.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@clip@]: an 'SDL_Rect' used for clipping or NULL to enclose all points.
+  -> BG.Ptr SDL_Rect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_Rect' structure filled in with the minimal enclosing rectangle.
+  -> IO BG.CBool
+sDL_GetRectEnclosingPoints =
+  hs_bindgen_b02c8a352859e75c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectAndLineIntersection@
+foreign import ccall safe "hs_bindgen_1319bb78d8d2e643"
+  hs_bindgen_1319bb78d8d2e643_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectAndLineIntersection@
+hs_bindgen_1319bb78d8d2e643
+  :: PtrConst.PtrConst SDL_Rect
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_1319bb78d8d2e643 =
+  BG.fromFFIType hs_bindgen_1319bb78d8d2e643_base
+
+-- | Calculate the intersection of a rectangle and line segment.
+--
+--     This function is used to clip a line segment to a rectangle. A line segment contained entirely within the rectangle or that does not intersect will remain unchanged. A line segment that crosses the rectangle at either or both ends will be clipped to the boundary of the rectangle and the new coordinates saved in @X1@, @Y1@, @X2@, and\/or @Y2@ as necessary.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectAndLineIntersection@, defined at @SDL3\/SDL_rect.h 305:34@
+sDL_GetRectAndLineIntersection
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an 'SDL_Rect' structure representing the rectangle to intersect.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@X1@]: a pointer to the starting X-coordinate of the line.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@Y1@]: a pointer to the starting Y-coordinate of the line.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@X2@]: a pointer to the ending X-coordinate of the line.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@Y2@]: a pointer to the ending Y-coordinate of the line.
+  -> IO BG.CBool
+sDL_GetRectAndLineIntersection =
+  hs_bindgen_1319bb78d8d2e643
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_PointInRectFloat@
+foreign import ccall safe "hs_bindgen_db89e1c0a4060064"
+  hs_bindgen_db89e1c0a4060064_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_PointInRectFloat@
+hs_bindgen_db89e1c0a4060064
+  :: PtrConst.PtrConst SDL_FPoint
+  -> PtrConst.PtrConst SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_db89e1c0a4060064 =
+  BG.fromFFIType hs_bindgen_db89e1c0a4060064_base
+
+-- | Determine whether a point resides inside a floating point rectangle.
+--
+--     A point is considered part of a rectangle if both @p@ and @r@ are not NULL, and @p@ \'s x and y coordinates are >= to the rectangle\'s top left corner, and \<= the rectangle\'s x+w and y+h. So a 1x1 rectangle considers point (0,0) and (0,1) as \"inside\" and (0,2) as not.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if @p@ is contained by @r@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PointInRectFloat@, defined at @SDL3\/SDL_rect.h 331:23@
+sDL_PointInRectFloat
+  :: PtrConst.PtrConst SDL_FPoint
+  -- ^
+  --
+  --           [@p@]: the point to test.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO BG.CBool
+sDL_PointInRectFloat = hs_bindgen_db89e1c0a4060064
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectEmptyFloat@
+foreign import ccall safe "hs_bindgen_cf687f22e3772d43"
+  hs_bindgen_cf687f22e3772d43_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectEmptyFloat@
+hs_bindgen_cf687f22e3772d43
+  :: PtrConst.PtrConst SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_cf687f22e3772d43 =
+  BG.fromFFIType hs_bindgen_cf687f22e3772d43_base
+
+-- | Determine whether a floating point rectangle takes no space.
+--
+--     A rectangle is considered \"empty\" for this function if @r@ is NULL, or if @r@ \'s width and\/or height are \< 0.0f.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangle is \"empty\", false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectEmptyFloat@, defined at @SDL3\/SDL_rect.h 355:23@
+sDL_RectEmptyFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO BG.CBool
+sDL_RectEmptyFloat = hs_bindgen_cf687f22e3772d43
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectsEqualEpsilon@
+foreign import ccall safe "hs_bindgen_ffb7b7aa2884662e"
+  hs_bindgen_ffb7b7aa2884662e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectsEqualEpsilon@
+hs_bindgen_ffb7b7aa2884662e
+  :: PtrConst.PtrConst SDL_FRect
+  -> PtrConst.PtrConst SDL_FRect
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_ffb7b7aa2884662e =
+  BG.fromFFIType hs_bindgen_ffb7b7aa2884662e_base
+
+-- | Determine whether two floating point rectangles are equal, within some given epsilon.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height are within @epsilon@ of each other. If you don\'t know what value to use for @epsilon@, you should call the SDL_RectsEqualFloat function instead.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RectsEqualFloat'
+--
+--     [C declaration]: @SDL_RectsEqualEpsilon@, defined at @SDL3\/SDL_rect.h 385:23@
+sDL_RectsEqualEpsilon
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@a@]: the first rectangle to test.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@b@]: the second rectangle to test.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@epsilon@]: the epsilon value for comparison.
+  -> IO BG.CBool
+sDL_RectsEqualEpsilon = hs_bindgen_ffb7b7aa2884662e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectsEqualFloat@
+foreign import ccall safe "hs_bindgen_16841c4903715a15"
+  hs_bindgen_16841c4903715a15_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_RectsEqualFloat@
+hs_bindgen_16841c4903715a15
+  :: PtrConst.PtrConst SDL_FRect
+  -> PtrConst.PtrConst SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_16841c4903715a15 =
+  BG.fromFFIType hs_bindgen_16841c4903715a15_base
+
+-- | Determine whether two floating point rectangles are equal, within a default epsilon.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height are within SDL_FLT_EPSILON of each other. This is often a reasonable way to compare two floating point rectangles and deal with the slight precision variations in floating point calculations that tend to pop up.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RectsEqualEpsilon'
+--
+--     [C declaration]: @SDL_RectsEqualFloat@, defined at @SDL3\/SDL_rect.h 420:23@
+sDL_RectsEqualFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@a@]: the first rectangle to test.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@b@]: the second rectangle to test.
+  -> IO BG.CBool
+sDL_RectsEqualFloat = hs_bindgen_16841c4903715a15
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_HasRectIntersectionFloat@
+foreign import ccall safe "hs_bindgen_4ccee9871e6b2122"
+  hs_bindgen_4ccee9871e6b2122_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_HasRectIntersectionFloat@
+hs_bindgen_4ccee9871e6b2122
+  :: PtrConst.PtrConst SDL_FRect
+  -> PtrConst.PtrConst SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_4ccee9871e6b2122 =
+  BG.fromFFIType hs_bindgen_4ccee9871e6b2122_base
+
+-- | Determine whether two rectangles intersect with float precision.
+--
+--     If either pointer is NULL the function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRectIntersection'
+--
+--     [C declaration]: @SDL_HasRectIntersectionFloat@, defined at @SDL3\/SDL_rect.h 440:34@
+sDL_HasRectIntersectionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+  -> IO BG.CBool
+sDL_HasRectIntersectionFloat =
+  hs_bindgen_4ccee9871e6b2122
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectIntersectionFloat@
+foreign import ccall safe "hs_bindgen_73c245953e392b8b"
+  hs_bindgen_73c245953e392b8b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectIntersectionFloat@
+hs_bindgen_73c245953e392b8b
+  :: PtrConst.PtrConst SDL_FRect
+  -> PtrConst.PtrConst SDL_FRect
+  -> BG.Ptr SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_73c245953e392b8b =
+  BG.fromFFIType hs_bindgen_73c245953e392b8b_base
+
+-- | Calculate the intersection of two rectangles with float precision.
+--
+--     If @result@ is NULL then this function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasRectIntersectionFloat'
+--
+--     [C declaration]: @SDL_GetRectIntersectionFloat@, defined at @SDL3\/SDL_rect.h 459:34@
+sDL_GetRectIntersectionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_FRect' structure filled in with the intersection of rectangles @A@ and @B@.
+  -> IO BG.CBool
+sDL_GetRectIntersectionFloat =
+  hs_bindgen_73c245953e392b8b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectUnionFloat@
+foreign import ccall safe "hs_bindgen_26df11f6f3486748"
+  hs_bindgen_26df11f6f3486748_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectUnionFloat@
+hs_bindgen_26df11f6f3486748
+  :: PtrConst.PtrConst SDL_FRect
+  -> PtrConst.PtrConst SDL_FRect
+  -> BG.Ptr SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_26df11f6f3486748 =
+  BG.fromFFIType hs_bindgen_26df11f6f3486748_base
+
+-- | Calculate the union of two rectangles with float precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectUnionFloat@, defined at @SDL3\/SDL_rect.h 475:34@
+sDL_GetRectUnionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_FRect' structure filled in with the union of rectangles @A@ and @B@.
+  -> IO BG.CBool
+sDL_GetRectUnionFloat = hs_bindgen_26df11f6f3486748
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectEnclosingPointsFloat@
+foreign import ccall safe "hs_bindgen_c543abfe8b881179"
+  hs_bindgen_c543abfe8b881179_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectEnclosingPointsFloat@
+hs_bindgen_c543abfe8b881179
+  :: PtrConst.PtrConst SDL_FPoint
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL_FRect
+  -> BG.Ptr SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_c543abfe8b881179 =
+  BG.fromFFIType hs_bindgen_c543abfe8b881179_base
+
+-- | Calculate a minimal rectangle enclosing a set of points with float precision.
+--
+--     If @clip@ is not NULL then only points inside of the clipping rectangle are considered.
+--
+--     [Returns]: true if any points were enclosed or false if all the points were outside of the clipping rectangle.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectEnclosingPointsFloat@, defined at @SDL3\/SDL_rect.h 497:34@
+sDL_GetRectEnclosingPointsFloat
+  :: PtrConst.PtrConst SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: an array of 'SDL_FPoint' structures representing points to be enclosed.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of structures in the @points@ array.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@clip@]: an 'SDL_FRect' used for clipping or NULL to enclose all points.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_FRect' structure filled in with the minimal enclosing rectangle.
+  -> IO BG.CBool
+sDL_GetRectEnclosingPointsFloat =
+  hs_bindgen_c543abfe8b881179
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectAndLineIntersectionFloat@
+foreign import ccall safe "hs_bindgen_274c31df17fcabf9"
+  hs_bindgen_274c31df17fcabf9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Safe_SDL_GetRectAndLineIntersectionFloat@
+hs_bindgen_274c31df17fcabf9
+  :: PtrConst.PtrConst SDL_FRect
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_274c31df17fcabf9 =
+  BG.fromFFIType hs_bindgen_274c31df17fcabf9_base
+
+-- | Calculate the intersection of a rectangle and line segment with float precision.
+--
+--     This function is used to clip a line segment to a rectangle. A line segment contained entirely within the rectangle or that does not intersect will remain unchanged. A line segment that crosses the rectangle at either or both ends will be clipped to the boundary of the rectangle and the new coordinates saved in @X1@, @Y1@, @X2@, and\/or @Y2@ as necessary.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectAndLineIntersectionFloat@, defined at @SDL3\/SDL_rect.h 520:34@
+sDL_GetRectAndLineIntersectionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: an 'SDL_FRect' structure representing the rectangle to intersect.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@X1@]: a pointer to the starting X-coordinate of the line.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@Y1@]: a pointer to the starting Y-coordinate of the line.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@X2@]: a pointer to the ending X-coordinate of the line.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@Y2@]: a pointer to the ending Y-coordinate of the line.
+  -> IO BG.CBool
+sDL_GetRectAndLineIntersectionFloat =
+  hs_bindgen_274c31df17fcabf9
diff --git a/src/SDL3/Sys/Bindgen/Rect/Unsafe.hs b/src/SDL3/Sys/Bindgen/Rect/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Rect/Unsafe.hs
@@ -0,0 +1,962 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Rect.Unsafe (
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_RectToFRect,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_PointInRect,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_RectEmpty,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_RectsEqual,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_HasRectIntersection,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_GetRectIntersection,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_GetRectUnion,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_GetRectEnclosingPoints,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_GetRectAndLineIntersection,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_PointInRectFloat,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_RectEmptyFloat,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_RectsEqualEpsilon,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_RectsEqualFloat,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_HasRectIntersectionFloat,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_GetRectIntersectionFloat,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_GetRectUnionFloat,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_GetRectEnclosingPointsFloat,
+  SDL3.Sys.Bindgen.Rect.Unsafe.sDL_GetRectAndLineIntersectionFloat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Rect
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_rect.h>"
+         , "void hs_bindgen_8e106b8f8a5cc9ba ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_FRect *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_RectToFRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a98cca13647f2c65 ("
+         , "  SDL_Point const *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_PointInRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d87d44547ed7b9c1 ("
+         , "  SDL_Rect const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RectEmpty)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_27b455f8a1132dc3 ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RectsEqual)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c41afd18a3fb5214 ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_HasRectIntersection)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a35618c178c541bb ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Rect *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectIntersection)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_fb794a6b5c1e9203 ("
+         , "  SDL_Rect const *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Rect *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectUnion)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_055ba0fc6b09318a ("
+         , "  SDL_Point const *arg1,"
+         , "  signed int arg2,"
+         , "  SDL_Rect const *arg3,"
+         , "  SDL_Rect *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectEnclosingPoints)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_959a5cb13535d34f ("
+         , "  SDL_Rect const *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3,"
+         , "  signed int *arg4,"
+         , "  signed int *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectAndLineIntersection)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_d0a7b5fa03d29582 ("
+         , "  SDL_FPoint const *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_PointInRectFloat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_9c321e237166b364 ("
+         , "  SDL_FRect const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RectEmptyFloat)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_f80b1d55f3fd3ff0 ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RectsEqualEpsilon)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_ae8860672929d976 ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RectsEqualFloat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7789d3ed056d9e69 ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_HasRectIntersectionFloat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b201a8ca90bb5827 ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  SDL_FRect *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectIntersectionFloat)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_acf40b03660f89c9 ("
+         , "  SDL_FRect const *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  SDL_FRect *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectUnionFloat)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_7e56e880d6fe6038 ("
+         , "  SDL_FPoint const *arg1,"
+         , "  signed int arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FRect *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectEnclosingPointsFloat)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_eea028e78b1eead0 ("
+         , "  SDL_FRect const *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRectAndLineIntersectionFloat)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectToFRect@
+foreign import ccall unsafe "hs_bindgen_8e106b8f8a5cc9ba"
+  hs_bindgen_8e106b8f8a5cc9ba_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectToFRect@
+hs_bindgen_8e106b8f8a5cc9ba
+  :: PtrConst.PtrConst SDL_Rect
+  -> BG.Ptr SDL_FRect
+  -> IO ()
+hs_bindgen_8e106b8f8a5cc9ba =
+  BG.fromFFIType hs_bindgen_8e106b8f8a5cc9ba_base
+
+-- | Convert an 'SDL_Rect' to 'SDL_FRect'
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectToFRect@, defined at @SDL3\/SDL_rect.h 129:23@
+sDL_RectToFRect
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to an 'SDL_Rect'.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@frect@]: a pointer filled in with the floating point representation of @rect@.
+  -> IO ()
+sDL_RectToFRect = hs_bindgen_8e106b8f8a5cc9ba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_PointInRect@
+foreign import ccall unsafe "hs_bindgen_a98cca13647f2c65"
+  hs_bindgen_a98cca13647f2c65_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_PointInRect@
+hs_bindgen_a98cca13647f2c65
+  :: PtrConst.PtrConst SDL_Point
+  -> PtrConst.PtrConst SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_a98cca13647f2c65 =
+  BG.fromFFIType hs_bindgen_a98cca13647f2c65_base
+
+-- | Determine whether a point resides inside a rectangle.
+--
+--     A point is considered part of a rectangle if both @p@ and @r@ are not NULL, and @p@ \'s x and y coordinates are >= to the rectangle\'s top left corner, and \< the rectangle\'s x+w and y+h. So a 1x1 rectangle considers point (0,0) as \"inside\" and (0,1) as not.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if @p@ is contained by @r@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PointInRect@, defined at @SDL3\/SDL_rect.h 158:23@
+sDL_PointInRect
+  :: PtrConst.PtrConst SDL_Point
+  -- ^
+  --
+  --           [@p@]: the point to test.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO BG.CBool
+sDL_PointInRect = hs_bindgen_a98cca13647f2c65
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectEmpty@
+foreign import ccall unsafe "hs_bindgen_d87d44547ed7b9c1"
+  hs_bindgen_d87d44547ed7b9c1_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectEmpty@
+hs_bindgen_d87d44547ed7b9c1
+  :: PtrConst.PtrConst SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_d87d44547ed7b9c1 =
+  BG.fromFFIType hs_bindgen_d87d44547ed7b9c1_base
+
+-- | Determine whether a rectangle has no area.
+--
+--     A rectangle is considered \"empty\" for this function if @r@ is NULL, or if @r@ \'s width and\/or height are \<= 0.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangle is \"empty\", false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectEmpty@, defined at @SDL3\/SDL_rect.h 182:23@
+sDL_RectEmpty
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO BG.CBool
+sDL_RectEmpty = hs_bindgen_d87d44547ed7b9c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectsEqual@
+foreign import ccall unsafe "hs_bindgen_27b455f8a1132dc3"
+  hs_bindgen_27b455f8a1132dc3_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectsEqual@
+hs_bindgen_27b455f8a1132dc3
+  :: PtrConst.PtrConst SDL_Rect
+  -> PtrConst.PtrConst SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_27b455f8a1132dc3 =
+  BG.fromFFIType hs_bindgen_27b455f8a1132dc3_base
+
+-- | Determine whether two rectangles are equal.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height match.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectsEqual@, defined at @SDL3\/SDL_rect.h 206:23@
+sDL_RectsEqual
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@a@]: the first rectangle to test.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@b@]: the second rectangle to test.
+  -> IO BG.CBool
+sDL_RectsEqual = hs_bindgen_27b455f8a1132dc3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_HasRectIntersection@
+foreign import ccall unsafe "hs_bindgen_c41afd18a3fb5214"
+  hs_bindgen_c41afd18a3fb5214_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_HasRectIntersection@
+hs_bindgen_c41afd18a3fb5214
+  :: PtrConst.PtrConst SDL_Rect
+  -> PtrConst.PtrConst SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_c41afd18a3fb5214 =
+  BG.fromFFIType hs_bindgen_c41afd18a3fb5214_base
+
+-- | Determine whether two rectangles intersect.
+--
+--     If either pointer is NULL the function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRectIntersection'
+--
+--     [C declaration]: @SDL_HasRectIntersection@, defined at @SDL3\/SDL_rect.h 227:34@
+sDL_HasRectIntersection
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+  -> IO BG.CBool
+sDL_HasRectIntersection = hs_bindgen_c41afd18a3fb5214
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectIntersection@
+foreign import ccall unsafe "hs_bindgen_a35618c178c541bb"
+  hs_bindgen_a35618c178c541bb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectIntersection@
+hs_bindgen_a35618c178c541bb
+  :: PtrConst.PtrConst SDL_Rect
+  -> PtrConst.PtrConst SDL_Rect
+  -> BG.Ptr SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_a35618c178c541bb =
+  BG.fromFFIType hs_bindgen_a35618c178c541bb_base
+
+-- | Calculate the intersection of two rectangles.
+--
+--     If @result@ is NULL then this function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasRectIntersection'
+--
+--     [C declaration]: @SDL_GetRectIntersection@, defined at @SDL3\/SDL_rect.h 246:34@
+sDL_GetRectIntersection
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+  -> BG.Ptr SDL_Rect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_Rect' structure filled in with the intersection of rectangles @A@ and @B@.
+  -> IO BG.CBool
+sDL_GetRectIntersection = hs_bindgen_a35618c178c541bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectUnion@
+foreign import ccall unsafe "hs_bindgen_fb794a6b5c1e9203"
+  hs_bindgen_fb794a6b5c1e9203_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectUnion@
+hs_bindgen_fb794a6b5c1e9203
+  :: PtrConst.PtrConst SDL_Rect
+  -> PtrConst.PtrConst SDL_Rect
+  -> BG.Ptr SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_fb794a6b5c1e9203 =
+  BG.fromFFIType hs_bindgen_fb794a6b5c1e9203_base
+
+-- | Calculate the union of two rectangles.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectUnion@, defined at @SDL3\/SDL_rect.h 262:34@
+sDL_GetRectUnion
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+  -> BG.Ptr SDL_Rect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_Rect' structure filled in with the union of rectangles @A@ and @B@.
+  -> IO BG.CBool
+sDL_GetRectUnion = hs_bindgen_fb794a6b5c1e9203
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectEnclosingPoints@
+foreign import ccall unsafe "hs_bindgen_055ba0fc6b09318a"
+  hs_bindgen_055ba0fc6b09318a_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectEnclosingPoints@
+hs_bindgen_055ba0fc6b09318a
+  :: PtrConst.PtrConst SDL_Point
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL_Rect
+  -> BG.Ptr SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_055ba0fc6b09318a =
+  BG.fromFFIType hs_bindgen_055ba0fc6b09318a_base
+
+-- | Calculate a minimal rectangle enclosing a set of points.
+--
+--     If @clip@ is not NULL then only points inside of the clipping rectangle are considered.
+--
+--     [Returns]: true if any points were enclosed or false if all the points were outside of the clipping rectangle.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectEnclosingPoints@, defined at @SDL3\/SDL_rect.h 283:34@
+sDL_GetRectEnclosingPoints
+  :: PtrConst.PtrConst SDL_Point
+  -- ^
+  --
+  --           [@points@]: an array of 'SDL_Point' structures representing points to be enclosed.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of structures in the @points@ array.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@clip@]: an 'SDL_Rect' used for clipping or NULL to enclose all points.
+  -> BG.Ptr SDL_Rect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_Rect' structure filled in with the minimal enclosing rectangle.
+  -> IO BG.CBool
+sDL_GetRectEnclosingPoints =
+  hs_bindgen_055ba0fc6b09318a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectAndLineIntersection@
+foreign import ccall unsafe "hs_bindgen_959a5cb13535d34f"
+  hs_bindgen_959a5cb13535d34f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectAndLineIntersection@
+hs_bindgen_959a5cb13535d34f
+  :: PtrConst.PtrConst SDL_Rect
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_959a5cb13535d34f =
+  BG.fromFFIType hs_bindgen_959a5cb13535d34f_base
+
+-- | Calculate the intersection of a rectangle and line segment.
+--
+--     This function is used to clip a line segment to a rectangle. A line segment contained entirely within the rectangle or that does not intersect will remain unchanged. A line segment that crosses the rectangle at either or both ends will be clipped to the boundary of the rectangle and the new coordinates saved in @X1@, @Y1@, @X2@, and\/or @Y2@ as necessary.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectAndLineIntersection@, defined at @SDL3\/SDL_rect.h 305:34@
+sDL_GetRectAndLineIntersection
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an 'SDL_Rect' structure representing the rectangle to intersect.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@X1@]: a pointer to the starting X-coordinate of the line.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@Y1@]: a pointer to the starting Y-coordinate of the line.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@X2@]: a pointer to the ending X-coordinate of the line.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@Y2@]: a pointer to the ending Y-coordinate of the line.
+  -> IO BG.CBool
+sDL_GetRectAndLineIntersection =
+  hs_bindgen_959a5cb13535d34f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_PointInRectFloat@
+foreign import ccall unsafe "hs_bindgen_d0a7b5fa03d29582"
+  hs_bindgen_d0a7b5fa03d29582_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_PointInRectFloat@
+hs_bindgen_d0a7b5fa03d29582
+  :: PtrConst.PtrConst SDL_FPoint
+  -> PtrConst.PtrConst SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_d0a7b5fa03d29582 =
+  BG.fromFFIType hs_bindgen_d0a7b5fa03d29582_base
+
+-- | Determine whether a point resides inside a floating point rectangle.
+--
+--     A point is considered part of a rectangle if both @p@ and @r@ are not NULL, and @p@ \'s x and y coordinates are >= to the rectangle\'s top left corner, and \<= the rectangle\'s x+w and y+h. So a 1x1 rectangle considers point (0,0) and (0,1) as \"inside\" and (0,2) as not.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if @p@ is contained by @r@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PointInRectFloat@, defined at @SDL3\/SDL_rect.h 331:23@
+sDL_PointInRectFloat
+  :: PtrConst.PtrConst SDL_FPoint
+  -- ^
+  --
+  --           [@p@]: the point to test.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO BG.CBool
+sDL_PointInRectFloat = hs_bindgen_d0a7b5fa03d29582
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectEmptyFloat@
+foreign import ccall unsafe "hs_bindgen_9c321e237166b364"
+  hs_bindgen_9c321e237166b364_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectEmptyFloat@
+hs_bindgen_9c321e237166b364
+  :: PtrConst.PtrConst SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_9c321e237166b364 =
+  BG.fromFFIType hs_bindgen_9c321e237166b364_base
+
+-- | Determine whether a floating point rectangle takes no space.
+--
+--     A rectangle is considered \"empty\" for this function if @r@ is NULL, or if @r@ \'s width and\/or height are \< 0.0f.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangle is \"empty\", false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RectEmptyFloat@, defined at @SDL3\/SDL_rect.h 355:23@
+sDL_RectEmptyFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO BG.CBool
+sDL_RectEmptyFloat = hs_bindgen_9c321e237166b364
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectsEqualEpsilon@
+foreign import ccall unsafe "hs_bindgen_f80b1d55f3fd3ff0"
+  hs_bindgen_f80b1d55f3fd3ff0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectsEqualEpsilon@
+hs_bindgen_f80b1d55f3fd3ff0
+  :: PtrConst.PtrConst SDL_FRect
+  -> PtrConst.PtrConst SDL_FRect
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_f80b1d55f3fd3ff0 =
+  BG.fromFFIType hs_bindgen_f80b1d55f3fd3ff0_base
+
+-- | Determine whether two floating point rectangles are equal, within some given epsilon.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height are within @epsilon@ of each other. If you don\'t know what value to use for @epsilon@, you should call the SDL_RectsEqualFloat function instead.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RectsEqualFloat'
+--
+--     [C declaration]: @SDL_RectsEqualEpsilon@, defined at @SDL3\/SDL_rect.h 385:23@
+sDL_RectsEqualEpsilon
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@a@]: the first rectangle to test.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@b@]: the second rectangle to test.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@epsilon@]: the epsilon value for comparison.
+  -> IO BG.CBool
+sDL_RectsEqualEpsilon = hs_bindgen_f80b1d55f3fd3ff0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectsEqualFloat@
+foreign import ccall unsafe "hs_bindgen_ae8860672929d976"
+  hs_bindgen_ae8860672929d976_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_RectsEqualFloat@
+hs_bindgen_ae8860672929d976
+  :: PtrConst.PtrConst SDL_FRect
+  -> PtrConst.PtrConst SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_ae8860672929d976 =
+  BG.fromFFIType hs_bindgen_ae8860672929d976_base
+
+-- | Determine whether two floating point rectangles are equal, within a default epsilon.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height are within SDL_FLT_EPSILON of each other. This is often a reasonable way to compare two floating point rectangles and deal with the slight precision variations in floating point calculations that tend to pop up.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RectsEqualEpsilon'
+--
+--     [C declaration]: @SDL_RectsEqualFloat@, defined at @SDL3\/SDL_rect.h 420:23@
+sDL_RectsEqualFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@a@]: the first rectangle to test.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@b@]: the second rectangle to test.
+  -> IO BG.CBool
+sDL_RectsEqualFloat = hs_bindgen_ae8860672929d976
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_HasRectIntersectionFloat@
+foreign import ccall unsafe "hs_bindgen_7789d3ed056d9e69"
+  hs_bindgen_7789d3ed056d9e69_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_HasRectIntersectionFloat@
+hs_bindgen_7789d3ed056d9e69
+  :: PtrConst.PtrConst SDL_FRect
+  -> PtrConst.PtrConst SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_7789d3ed056d9e69 =
+  BG.fromFFIType hs_bindgen_7789d3ed056d9e69_base
+
+-- | Determine whether two rectangles intersect with float precision.
+--
+--     If either pointer is NULL the function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRectIntersection'
+--
+--     [C declaration]: @SDL_HasRectIntersectionFloat@, defined at @SDL3\/SDL_rect.h 440:34@
+sDL_HasRectIntersectionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+  -> IO BG.CBool
+sDL_HasRectIntersectionFloat =
+  hs_bindgen_7789d3ed056d9e69
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectIntersectionFloat@
+foreign import ccall unsafe "hs_bindgen_b201a8ca90bb5827"
+  hs_bindgen_b201a8ca90bb5827_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectIntersectionFloat@
+hs_bindgen_b201a8ca90bb5827
+  :: PtrConst.PtrConst SDL_FRect
+  -> PtrConst.PtrConst SDL_FRect
+  -> BG.Ptr SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_b201a8ca90bb5827 =
+  BG.fromFFIType hs_bindgen_b201a8ca90bb5827_base
+
+-- | Calculate the intersection of two rectangles with float precision.
+--
+--     If @result@ is NULL then this function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HasRectIntersectionFloat'
+--
+--     [C declaration]: @SDL_GetRectIntersectionFloat@, defined at @SDL3\/SDL_rect.h 459:34@
+sDL_GetRectIntersectionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_FRect' structure filled in with the intersection of rectangles @A@ and @B@.
+  -> IO BG.CBool
+sDL_GetRectIntersectionFloat =
+  hs_bindgen_b201a8ca90bb5827
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectUnionFloat@
+foreign import ccall unsafe "hs_bindgen_acf40b03660f89c9"
+  hs_bindgen_acf40b03660f89c9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectUnionFloat@
+hs_bindgen_acf40b03660f89c9
+  :: PtrConst.PtrConst SDL_FRect
+  -> PtrConst.PtrConst SDL_FRect
+  -> BG.Ptr SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_acf40b03660f89c9 =
+  BG.fromFFIType hs_bindgen_acf40b03660f89c9_base
+
+-- | Calculate the union of two rectangles with float precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectUnionFloat@, defined at @SDL3\/SDL_rect.h 475:34@
+sDL_GetRectUnionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_FRect' structure filled in with the union of rectangles @A@ and @B@.
+  -> IO BG.CBool
+sDL_GetRectUnionFloat = hs_bindgen_acf40b03660f89c9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectEnclosingPointsFloat@
+foreign import ccall unsafe "hs_bindgen_7e56e880d6fe6038"
+  hs_bindgen_7e56e880d6fe6038_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectEnclosingPointsFloat@
+hs_bindgen_7e56e880d6fe6038
+  :: PtrConst.PtrConst SDL_FPoint
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL_FRect
+  -> BG.Ptr SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_7e56e880d6fe6038 =
+  BG.fromFFIType hs_bindgen_7e56e880d6fe6038_base
+
+-- | Calculate a minimal rectangle enclosing a set of points with float precision.
+--
+--     If @clip@ is not NULL then only points inside of the clipping rectangle are considered.
+--
+--     [Returns]: true if any points were enclosed or false if all the points were outside of the clipping rectangle.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectEnclosingPointsFloat@, defined at @SDL3\/SDL_rect.h 497:34@
+sDL_GetRectEnclosingPointsFloat
+  :: PtrConst.PtrConst SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: an array of 'SDL_FPoint' structures representing points to be enclosed.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of structures in the @points@ array.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@clip@]: an 'SDL_FRect' used for clipping or NULL to enclose all points.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_FRect' structure filled in with the minimal enclosing rectangle.
+  -> IO BG.CBool
+sDL_GetRectEnclosingPointsFloat =
+  hs_bindgen_7e56e880d6fe6038
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectAndLineIntersectionFloat@
+foreign import ccall unsafe "hs_bindgen_eea028e78b1eead0"
+  hs_bindgen_eea028e78b1eead0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Rect_Unsafe_SDL_GetRectAndLineIntersectionFloat@
+hs_bindgen_eea028e78b1eead0
+  :: PtrConst.PtrConst SDL_FRect
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_eea028e78b1eead0 =
+  BG.fromFFIType hs_bindgen_eea028e78b1eead0_base
+
+-- | Calculate the intersection of a rectangle and line segment with float precision.
+--
+--     This function is used to clip a line segment to a rectangle. A line segment contained entirely within the rectangle or that does not intersect will remain unchanged. A line segment that crosses the rectangle at either or both ends will be clipped to the boundary of the rectangle and the new coordinates saved in @X1@, @Y1@, @X2@, and\/or @Y2@ as necessary.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRectAndLineIntersectionFloat@, defined at @SDL3\/SDL_rect.h 520:34@
+sDL_GetRectAndLineIntersectionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: an 'SDL_FRect' structure representing the rectangle to intersect.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@X1@]: a pointer to the starting X-coordinate of the line.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@Y1@]: a pointer to the starting Y-coordinate of the line.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@X2@]: a pointer to the ending X-coordinate of the line.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@Y2@]: a pointer to the ending Y-coordinate of the line.
+  -> IO BG.CBool
+sDL_GetRectAndLineIntersectionFloat =
+  hs_bindgen_eea028e78b1eead0
diff --git a/src/SDL3/Sys/Bindgen/Render.hs b/src/SDL3/Sys/Bindgen/Render.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Render.hs
@@ -0,0 +1,4793 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Header file for SDL 2D rendering functions.
+--
+--     This API supports the following features:
+--
+--     * single pixel points
+--
+--     * single pixel lines
+--
+--     * filled rectangles
+--
+--     * texture images
+--
+--     * 2D polygons
+--
+--     The primitives may be drawn in opaque, blended, or additive modes.
+--
+--     The texture images may be drawn in opaque, blended, or additive modes. They can have an additional color tint or alpha modulation applied to them, and may also be stretched with linear interpolation.
+--
+--     This API is designed to accelerate simple 2D operations. You may want more functionality such as 3D polygons and particle effects, and in that case you should use SDL\'s OpenGL\/Direct3D support, the SDL3 GPU API, or one of the many good 3D engines.
+--
+--     These functions must be called from the main thread. See this bug for details: [https:\/\/github.com\/libsdl-org\/SDL\/issues\/986](https://github.com/libsdl-org/SDL/issues/986) The name of the software renderer.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Render (
+  SDL3.Sys.Bindgen.Render.sDL_SOFTWARE_RENDERER,
+  SDL3.Sys.Bindgen.Render.sDL_GPU_RENDERER,
+  SDL3.Sys.Bindgen.Render.SDL_Vertex (..),
+  SDL3.Sys.Bindgen.Render.SDL_TextureAccess (..),
+  pattern SDL3.Sys.Bindgen.Render.SDL_TEXTUREACCESS_STATIC,
+  pattern SDL3.Sys.Bindgen.Render.SDL_TEXTUREACCESS_STREAMING,
+  pattern SDL3.Sys.Bindgen.Render.SDL_TEXTUREACCESS_TARGET,
+  SDL3.Sys.Bindgen.Render.SDL_TextureAddressMode (..),
+  pattern SDL3.Sys.Bindgen.Render.SDL_TEXTURE_ADDRESS_INVALID,
+  pattern SDL3.Sys.Bindgen.Render.SDL_TEXTURE_ADDRESS_AUTO,
+  pattern SDL3.Sys.Bindgen.Render.SDL_TEXTURE_ADDRESS_CLAMP,
+  pattern SDL3.Sys.Bindgen.Render.SDL_TEXTURE_ADDRESS_WRAP,
+  SDL3.Sys.Bindgen.Render.SDL_RendererLogicalPresentation (..),
+  pattern SDL3.Sys.Bindgen.Render.SDL_LOGICAL_PRESENTATION_DISABLED,
+  pattern SDL3.Sys.Bindgen.Render.SDL_LOGICAL_PRESENTATION_STRETCH,
+  pattern SDL3.Sys.Bindgen.Render.SDL_LOGICAL_PRESENTATION_LETTERBOX,
+  pattern SDL3.Sys.Bindgen.Render.SDL_LOGICAL_PRESENTATION_OVERSCAN,
+  pattern SDL3.Sys.Bindgen.Render.SDL_LOGICAL_PRESENTATION_INTEGER_SCALE,
+  SDL3.Sys.Bindgen.Render.SDL_Renderer,
+  SDL3.Sys.Bindgen.Render.SDL_Texture (..),
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_NAME_STRING,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_WINDOW_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_SURFACE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_VULKAN_DEVICE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_NAME_STRING,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_WINDOW_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_SURFACE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_VSYNC_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_HDR_HEADROOM_FLOAT,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_D3D9_DEVICE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_D3D11_DEVICE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_D3D11_SWAPCHAIN_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_D3D12_DEVICE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_D3D12_SWAPCHAIN_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_VULKAN_INSTANCE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_VULKAN_SURFACE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_VULKAN_PHYSICAL_DEVICE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_VULKAN_DEVICE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_RENDERER_GPU_DEVICE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_PALETTE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_COLORSPACE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_FORMAT_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_ACCESS_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_WIDTH_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_HEIGHT_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_SDR_WHITE_POINT_FLOAT,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_HDR_HEADROOM_FLOAT,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_D3D11_TEXTURE_U_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_D3D11_TEXTURE_V_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_D3D12_TEXTURE_U_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_D3D12_TEXTURE_V_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGL_TEXTURE_TARGET_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGL_TEX_W_FLOAT,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGL_TEX_H_FLOAT,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_GPU_TEXTURE_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER,
+  SDL3.Sys.Bindgen.Render.sDL_RENDERER_VSYNC_DISABLED,
+  SDL3.Sys.Bindgen.Render.sDL_RENDERER_VSYNC_ADAPTIVE,
+  SDL3.Sys.Bindgen.Render.sDL_DEBUG_TEXT_FONT_CHARACTER_SIZE,
+  SDL3.Sys.Bindgen.Render.SDL_GPURenderStateCreateInfo (..),
+  SDL3.Sys.Bindgen.Render.SDL_GPURenderState,
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Gpu qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @macro SDL_SOFTWARE_RENDERER@, literal @\"software\"@, defined at @SDL3\/SDL_render.h 75:9@
+sDL_SOFTWARE_RENDERER :: BG.ByteString
+sDL_SOFTWARE_RENDERER =
+  BG.pack [0x73, 0x6F, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65]
+
+-- | The name of the GPU renderer.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @macro SDL_GPU_RENDERER@, literal @\"gpu\"@, defined at @SDL3\/SDL_render.h 82:9@
+sDL_GPU_RENDERER :: BG.ByteString
+sDL_GPU_RENDERER = BG.pack [0x67, 0x70, 0x75]
+
+-- | Vertex structure.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_Vertex@, defined at @SDL3\/SDL_render.h 89:16@
+data SDL_Vertex = SDL_Vertex
+  { position :: SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^ Vertex position, in 'SDL_Renderer' coordinates
+  --
+  --          [C declaration]: @position@, defined at @SDL3\/SDL_render.h 91:16@
+  , color :: SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^ Vertex color
+  --
+  --          [C declaration]: @color@, defined at @SDL3\/SDL_render.h 92:16@
+  , tex_coord :: SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^ Normalized texture coordinates, if needed
+  --
+  --          [C declaration]: @tex_coord@, defined at @SDL3\/SDL_render.h 93:16@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_Vertex where
+  staticSizeOf = \_ -> (32 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_Vertex where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Vertex
+        <*> HasCField.readRaw (BG.Proxy @"position") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"color") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"tex_coord") ptr0
+
+instance Marshal.WriteRaw SDL_Vertex where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Vertex position2 color3 tex_coord4 ->
+            HasCField.writeRaw (BG.Proxy @"position") ptr0 position2
+              >> HasCField.writeRaw (BG.Proxy @"color") ptr0 color3
+              >> HasCField.writeRaw (BG.Proxy @"tex_coord") ptr0 tex_coord4
+
+deriving via Marshal.EquivStorable SDL_Vertex instance BG.Storable SDL_Vertex
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Rect.SDL_FPoint)
+  => BG.CompatHasField.HasField "position" SDL_Vertex ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Vertex
+            { position = y1
+            , color = BG.getField @"color" x0
+            , tex_coord = BG.getField @"tex_coord" x0
+            }
+      , BG.getField @"position" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Rect.SDL_FPoint)
+  => BG.HasField "position" (BG.Ptr SDL_Vertex) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"position")
+
+instance HasCField.HasCField SDL_Vertex "position" where
+  type
+    CFieldType SDL_Vertex "position" =
+      SDL3.Sys.Bindgen.Rect.SDL_FPoint
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_FColor)
+  => BG.CompatHasField.HasField "color" SDL_Vertex ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Vertex
+            { color = y1
+            , position = BG.getField @"position" x0
+            , tex_coord = BG.getField @"tex_coord" x0
+            }
+      , BG.getField @"color" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_FColor)
+  => BG.HasField "color" (BG.Ptr SDL_Vertex) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"color")
+
+instance HasCField.HasCField SDL_Vertex "color" where
+  type
+    CFieldType SDL_Vertex "color" =
+      SDL3.Sys.Bindgen.Pixels.SDL_FColor
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Rect.SDL_FPoint)
+  => BG.CompatHasField.HasField "tex_coord" SDL_Vertex ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Vertex
+            { tex_coord = y1
+            , position = BG.getField @"position" x0
+            , color = BG.getField @"color" x0
+            }
+      , BG.getField @"tex_coord" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Rect.SDL_FPoint)
+  => BG.HasField "tex_coord" (BG.Ptr SDL_Vertex) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"tex_coord")
+
+instance HasCField.HasCField SDL_Vertex "tex_coord" where
+  type
+    CFieldType SDL_Vertex "tex_coord" =
+      SDL3.Sys.Bindgen.Rect.SDL_FPoint
+
+  offset# = \_ -> \_ -> 24
+
+-- | The access pattern allowed for a texture.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_TextureAccess@, defined at @SDL3\/SDL_render.h 101:14@
+newtype SDL_TextureAccess = SDL_TextureAccess
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_TextureAccess where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_TextureAccess where
+  readRaw =
+    \ptr0 ->
+      pure SDL_TextureAccess
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_TextureAccess where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_TextureAccess unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_TextureAccess instance BG.Storable SDL_TextureAccess
+
+deriving via BG.CUInt instance BG.Prim SDL_TextureAccess
+
+instance CEnum.CEnum SDL_TextureAccess where
+  type CEnumZ SDL_TextureAccess = BG.CUInt
+
+  toCEnum = SDL_TextureAccess
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_TEXTUREACCESS_STATIC")
+        , (1, BG.singleton "SDL_TEXTUREACCESS_STREAMING")
+        , (2, BG.singleton "SDL_TEXTUREACCESS_TARGET")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_TextureAccess"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_TextureAccess"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_TextureAccess where
+  minDeclaredValue = SDL_TEXTUREACCESS_STATIC
+
+  maxDeclaredValue = SDL_TEXTUREACCESS_TARGET
+
+instance Show SDL_TextureAccess where
+  showsPrec = CEnum.shows
+
+instance Read SDL_TextureAccess where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_TextureAccess ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextureAccess{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TextureAccess) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TextureAccess "unwrap" where
+  type CFieldType SDL_TextureAccess "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Changes rarely, not lockable
+--
+--     [C declaration]: @SDL_TEXTUREACCESS_STATIC@, defined at @SDL3\/SDL_render.h 103:5@
+pattern SDL_TEXTUREACCESS_STATIC :: SDL_TextureAccess
+pattern SDL_TEXTUREACCESS_STATIC = SDL_TextureAccess 0
+
+-- | Changes frequently, lockable
+--
+--     [C declaration]: @SDL_TEXTUREACCESS_STREAMING@, defined at @SDL3\/SDL_render.h 104:5@
+pattern SDL_TEXTUREACCESS_STREAMING :: SDL_TextureAccess
+pattern SDL_TEXTUREACCESS_STREAMING = SDL_TextureAccess 1
+
+-- | Texture can be used as a render target
+--
+--     [C declaration]: @SDL_TEXTUREACCESS_TARGET@, defined at @SDL3\/SDL_render.h 105:5@
+pattern SDL_TEXTUREACCESS_TARGET :: SDL_TextureAccess
+pattern SDL_TEXTUREACCESS_TARGET = SDL_TextureAccess 2
+
+-- | The addressing mode for a texture when used in @SDL_RenderGeometry()@.
+--
+--     This affects how texture coordinates are interpreted outside of [0, 1]
+--
+--     Texture wrapping is always supported for power of two texture sizes, and is supported for other texture sizes if SDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN is set to true.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @enum SDL_TextureAddressMode@, defined at @SDL3\/SDL_render.h 119:14@
+newtype SDL_TextureAddressMode = SDL_TextureAddressMode
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_TextureAddressMode where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_TextureAddressMode where
+  readRaw =
+    \ptr0 ->
+      pure SDL_TextureAddressMode
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_TextureAddressMode where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_TextureAddressMode unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_TextureAddressMode
+  instance
+    BG.Storable SDL_TextureAddressMode
+
+deriving via BG.CInt instance BG.Prim SDL_TextureAddressMode
+
+instance CEnum.CEnum SDL_TextureAddressMode where
+  type CEnumZ SDL_TextureAddressMode = BG.CInt
+
+  toCEnum = SDL_TextureAddressMode
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_TEXTURE_ADDRESS_INVALID")
+        , (0, BG.singleton "SDL_TEXTURE_ADDRESS_AUTO")
+        , (1, BG.singleton "SDL_TEXTURE_ADDRESS_CLAMP")
+        , (2, BG.singleton "SDL_TEXTURE_ADDRESS_WRAP")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_TextureAddressMode"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_TextureAddressMode"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_TextureAddressMode where
+  minDeclaredValue = SDL_TEXTURE_ADDRESS_INVALID
+
+  maxDeclaredValue = SDL_TEXTURE_ADDRESS_WRAP
+
+instance Show SDL_TextureAddressMode where
+  showsPrec = CEnum.shows
+
+instance Read SDL_TextureAddressMode where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_TextureAddressMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TextureAddressMode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TextureAddressMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TextureAddressMode "unwrap" where
+  type
+    CFieldType SDL_TextureAddressMode "unwrap" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_TEXTURE_ADDRESS_INVALID@, defined at @SDL3\/SDL_render.h 121:5@
+pattern SDL_TEXTURE_ADDRESS_INVALID :: SDL_TextureAddressMode
+pattern SDL_TEXTURE_ADDRESS_INVALID = SDL_TextureAddressMode (-1)
+
+-- | Wrapping is enabled if texture coordinates are outside [0, 1], this is the default
+--
+--     [C declaration]: @SDL_TEXTURE_ADDRESS_AUTO@, defined at @SDL3\/SDL_render.h 122:5@
+pattern SDL_TEXTURE_ADDRESS_AUTO :: SDL_TextureAddressMode
+pattern SDL_TEXTURE_ADDRESS_AUTO = SDL_TextureAddressMode 0
+
+-- | Texture coordinates are clamped to the [0, 1] range
+--
+--     [C declaration]: @SDL_TEXTURE_ADDRESS_CLAMP@, defined at @SDL3\/SDL_render.h 123:5@
+pattern SDL_TEXTURE_ADDRESS_CLAMP :: SDL_TextureAddressMode
+pattern SDL_TEXTURE_ADDRESS_CLAMP = SDL_TextureAddressMode 1
+
+-- | The texture is repeated (tiled)
+--
+--     [C declaration]: @SDL_TEXTURE_ADDRESS_WRAP@, defined at @SDL3\/SDL_render.h 124:5@
+pattern SDL_TEXTURE_ADDRESS_WRAP :: SDL_TextureAddressMode
+pattern SDL_TEXTURE_ADDRESS_WRAP = SDL_TextureAddressMode 2
+
+-- | How the logical size is mapped to the output.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_RendererLogicalPresentation@, defined at @SDL3\/SDL_render.h 132:14@
+newtype SDL_RendererLogicalPresentation = SDL_RendererLogicalPresentation
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_RendererLogicalPresentation where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_RendererLogicalPresentation where
+  readRaw =
+    \ptr0 ->
+      pure SDL_RendererLogicalPresentation
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_RendererLogicalPresentation where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_RendererLogicalPresentation unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_RendererLogicalPresentation
+  instance
+    BG.Storable SDL_RendererLogicalPresentation
+
+deriving via BG.CUInt instance BG.Prim SDL_RendererLogicalPresentation
+
+instance CEnum.CEnum SDL_RendererLogicalPresentation where
+  type
+    CEnumZ SDL_RendererLogicalPresentation =
+      BG.CUInt
+
+  toCEnum = SDL_RendererLogicalPresentation
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_LOGICAL_PRESENTATION_DISABLED")
+        , (1, BG.singleton "SDL_LOGICAL_PRESENTATION_STRETCH")
+        , (2, BG.singleton "SDL_LOGICAL_PRESENTATION_LETTERBOX")
+        , (3, BG.singleton "SDL_LOGICAL_PRESENTATION_OVERSCAN")
+        , (4, BG.singleton "SDL_LOGICAL_PRESENTATION_INTEGER_SCALE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_RendererLogicalPresentation"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_RendererLogicalPresentation"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_RendererLogicalPresentation where
+  minDeclaredValue = SDL_LOGICAL_PRESENTATION_DISABLED
+
+  maxDeclaredValue =
+    SDL_LOGICAL_PRESENTATION_INTEGER_SCALE
+
+instance Show SDL_RendererLogicalPresentation where
+  showsPrec = CEnum.shows
+
+instance Read SDL_RendererLogicalPresentation where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_RendererLogicalPresentation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_RendererLogicalPresentation{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_RendererLogicalPresentation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_RendererLogicalPresentation "unwrap" where
+  type
+    CFieldType SDL_RendererLogicalPresentation "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | There is no logical size in effect
+--
+--     [C declaration]: @SDL_LOGICAL_PRESENTATION_DISABLED@, defined at @SDL3\/SDL_render.h 134:5@
+pattern SDL_LOGICAL_PRESENTATION_DISABLED :: SDL_RendererLogicalPresentation
+pattern SDL_LOGICAL_PRESENTATION_DISABLED = SDL_RendererLogicalPresentation 0
+
+-- | The rendered content is stretched to the output resolution
+--
+--     [C declaration]: @SDL_LOGICAL_PRESENTATION_STRETCH@, defined at @SDL3\/SDL_render.h 135:5@
+pattern SDL_LOGICAL_PRESENTATION_STRETCH :: SDL_RendererLogicalPresentation
+pattern SDL_LOGICAL_PRESENTATION_STRETCH = SDL_RendererLogicalPresentation 1
+
+-- | The rendered content is fit to the largest dimension and the other dimension is letterboxed with the clear color
+--
+--     [C declaration]: @SDL_LOGICAL_PRESENTATION_LETTERBOX@, defined at @SDL3\/SDL_render.h 136:5@
+pattern SDL_LOGICAL_PRESENTATION_LETTERBOX :: SDL_RendererLogicalPresentation
+pattern SDL_LOGICAL_PRESENTATION_LETTERBOX = SDL_RendererLogicalPresentation 2
+
+-- | The rendered content is fit to the smallest dimension and the other dimension extends beyond the output bounds
+--
+--     [C declaration]: @SDL_LOGICAL_PRESENTATION_OVERSCAN@, defined at @SDL3\/SDL_render.h 137:5@
+pattern SDL_LOGICAL_PRESENTATION_OVERSCAN :: SDL_RendererLogicalPresentation
+pattern SDL_LOGICAL_PRESENTATION_OVERSCAN = SDL_RendererLogicalPresentation 3
+
+-- | The rendered content is scaled up by integer multiples to fit the output resolution
+--
+--     [C declaration]: @SDL_LOGICAL_PRESENTATION_INTEGER_SCALE@, defined at @SDL3\/SDL_render.h 138:5@
+pattern SDL_LOGICAL_PRESENTATION_INTEGER_SCALE :: SDL_RendererLogicalPresentation
+pattern SDL_LOGICAL_PRESENTATION_INTEGER_SCALE = SDL_RendererLogicalPresentation 4
+
+-- | A structure representing rendering state
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_Renderer@, defined at @SDL3\/SDL_render.h 146:16@
+data SDL_Renderer
+
+-- | An efficient driver-specific representation of pixel data
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTexture', 'sDL_CreateTextureFromSurface', 'sDL_CreateTextureWithProperties', 'sDL_DestroyTexture'
+--
+--     [C declaration]: @struct SDL_Texture@, defined at @SDL3\/SDL_render.h 160:8@
+data SDL_Texture = SDL_Texture
+  { format :: SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^ The format of the texture, read-only
+  --
+  --          [C declaration]: @format@, defined at @SDL3\/SDL_render.h 162:21@
+  , w :: BG.CInt
+  -- ^ The width of the texture, read-only.
+  --
+  --          [C declaration]: @w@, defined at @SDL3\/SDL_render.h 163:9@
+  , h :: BG.CInt
+  -- ^ The height of the texture, read-only.
+  --
+  --          [C declaration]: @h@, defined at @SDL3\/SDL_render.h 164:9@
+  , refcount :: BG.CInt
+  -- ^ Application reference count, used when freeing texture
+  --
+  --          [C declaration]: @refcount@, defined at @SDL3\/SDL_render.h 166:9@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_Texture where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_Texture where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Texture
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"w") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"h") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"refcount") ptr0
+
+instance Marshal.WriteRaw SDL_Texture where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Texture format2 w3 h4 refcount5 ->
+            HasCField.writeRaw (BG.Proxy @"format") ptr0 format2
+              >> HasCField.writeRaw (BG.Proxy @"w") ptr0 w3
+              >> HasCField.writeRaw (BG.Proxy @"h") ptr0 h4
+              >> HasCField.writeRaw (BG.Proxy @"refcount") ptr0 refcount5
+
+deriving via Marshal.EquivStorable SDL_Texture instance BG.Storable SDL_Texture
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat)
+  => BG.CompatHasField.HasField "format" SDL_Texture ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Texture
+            { format = y1
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , refcount = BG.getField @"refcount" x0
+            }
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat)
+  => BG.HasField "format" (BG.Ptr SDL_Texture) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_Texture "format" where
+  type
+    CFieldType SDL_Texture "format" =
+      SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+
+  offset# = \_ -> \_ -> 0
+
+instance (ty ~ BG.CInt) => BG.CompatHasField.HasField "w" SDL_Texture ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Texture
+            { w = y1
+            , format = BG.getField @"format" x0
+            , h = BG.getField @"h" x0
+            , refcount = BG.getField @"refcount" x0
+            }
+      , BG.getField @"w" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "w" (BG.Ptr SDL_Texture) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"w")
+
+instance HasCField.HasCField SDL_Texture "w" where
+  type CFieldType SDL_Texture "w" = BG.CInt
+
+  offset# = \_ -> \_ -> 4
+
+instance (ty ~ BG.CInt) => BG.CompatHasField.HasField "h" SDL_Texture ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Texture
+            { h = y1
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , refcount = BG.getField @"refcount" x0
+            }
+      , BG.getField @"h" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "h" (BG.Ptr SDL_Texture) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"h")
+
+instance HasCField.HasCField SDL_Texture "h" where
+  type CFieldType SDL_Texture "h" = BG.CInt
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "refcount" SDL_Texture ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Texture
+            { refcount = y1
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            }
+      , BG.getField @"refcount" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "refcount" (BG.Ptr SDL_Texture) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"refcount")
+
+instance HasCField.HasCField SDL_Texture "refcount" where
+  type CFieldType SDL_Texture "refcount" = BG.CInt
+
+  offset# = \_ -> \_ -> 12
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_NAME_STRING@, literal @\"SDL.renderer.create.name\"@, defined at @SDL3\/SDL_render.h 339:9@
+sDL_PROP_RENDERER_CREATE_NAME_STRING :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_WINDOW_POINTER@, literal @\"SDL.renderer.create.window\"@, defined at @SDL3\/SDL_render.h 340:9@
+sDL_PROP_RENDERER_CREATE_WINDOW_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_WINDOW_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_SURFACE_POINTER@, literal @\"SDL.renderer.create.surface\"@, defined at @SDL3\/SDL_render.h 341:9@
+sDL_PROP_RENDERER_CREATE_SURFACE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_SURFACE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER@, literal @\"SDL.renderer.create.output_colorspace\"@, defined at @SDL3\/SDL_render.h 342:9@
+sDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x75
+    , 0x74
+    , 0x70
+    , 0x75
+    , 0x74
+    , 0x5F
+    , 0x63
+    , 0x6F
+    , 0x6C
+    , 0x6F
+    , 0x72
+    , 0x73
+    , 0x70
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER@, literal @\"SDL.renderer.create.present_vsync\"@, defined at @SDL3\/SDL_render.h 343:9@
+sDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x65
+    , 0x73
+    , 0x65
+    , 0x6E
+    , 0x74
+    , 0x5F
+    , 0x76
+    , 0x73
+    , 0x79
+    , 0x6E
+    , 0x63
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER@, literal @\"SDL.renderer.create.gpu.device\"@, defined at @SDL3\/SDL_render.h 344:9@
+sDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN@, literal @\"SDL.renderer.create.gpu.shaders_spirv\"@, defined at @SDL3\/SDL_render.h 345:9@
+sDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x73
+    , 0x68
+    , 0x61
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x5F
+    , 0x73
+    , 0x70
+    , 0x69
+    , 0x72
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN@, literal @\"SDL.renderer.create.gpu.shaders_dxil\"@, defined at @SDL3\/SDL_render.h 346:9@
+sDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x73
+    , 0x68
+    , 0x61
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x5F
+    , 0x64
+    , 0x78
+    , 0x69
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN@, literal @\"SDL.renderer.create.gpu.shaders_msl\"@, defined at @SDL3\/SDL_render.h 347:9@
+sDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x73
+    , 0x68
+    , 0x61
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x73
+    , 0x5F
+    , 0x6D
+    , 0x73
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER@, literal @\"SDL.renderer.create.vulkan.instance\"@, defined at @SDL3\/SDL_render.h 348:9@
+sDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x69
+    , 0x6E
+    , 0x73
+    , 0x74
+    , 0x61
+    , 0x6E
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER@, literal @\"SDL.renderer.create.vulkan.surface\"@, defined at @SDL3\/SDL_render.h 349:9@
+sDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER@, literal @\"SDL.renderer.create.vulkan.physical_device\"@, defined at @SDL3\/SDL_render.h 350:9@
+sDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x70
+    , 0x68
+    , 0x79
+    , 0x73
+    , 0x69
+    , 0x63
+    , 0x61
+    , 0x6C
+    , 0x5F
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_VULKAN_DEVICE_POINTER@, literal @\"SDL.renderer.create.vulkan.device\"@, defined at @SDL3\/SDL_render.h 351:9@
+sDL_PROP_RENDERER_CREATE_VULKAN_DEVICE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_VULKAN_DEVICE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER@, literal @\"SDL.renderer.create.vulkan.graphics_queue_family_index\"@, defined at @SDL3\/SDL_render.h 352:9@
+sDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x67
+    , 0x72
+    , 0x61
+    , 0x70
+    , 0x68
+    , 0x69
+    , 0x63
+    , 0x73
+    , 0x5F
+    , 0x71
+    , 0x75
+    , 0x65
+    , 0x75
+    , 0x65
+    , 0x5F
+    , 0x66
+    , 0x61
+    , 0x6D
+    , 0x69
+    , 0x6C
+    , 0x79
+    , 0x5F
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x78
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER@, literal @\"SDL.renderer.create.vulkan.present_queue_family_index\"@, defined at @SDL3\/SDL_render.h 353:9@
+sDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x65
+    , 0x73
+    , 0x65
+    , 0x6E
+    , 0x74
+    , 0x5F
+    , 0x71
+    , 0x75
+    , 0x65
+    , 0x75
+    , 0x65
+    , 0x5F
+    , 0x66
+    , 0x61
+    , 0x6D
+    , 0x69
+    , 0x6C
+    , 0x79
+    , 0x5F
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x78
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_NAME_STRING@, literal @\"SDL.renderer.name\"@, defined at @SDL3\/SDL_render.h 553:9@
+sDL_PROP_RENDERER_NAME_STRING :: BG.ByteString
+sDL_PROP_RENDERER_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_WINDOW_POINTER@, literal @\"SDL.renderer.window\"@, defined at @SDL3\/SDL_render.h 554:9@
+sDL_PROP_RENDERER_WINDOW_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_WINDOW_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_SURFACE_POINTER@, literal @\"SDL.renderer.surface\"@, defined at @SDL3\/SDL_render.h 555:9@
+sDL_PROP_RENDERER_SURFACE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_SURFACE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_VSYNC_NUMBER@, literal @\"SDL.renderer.vsync\"@, defined at @SDL3\/SDL_render.h 556:9@
+sDL_PROP_RENDERER_VSYNC_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_VSYNC_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x76
+    , 0x73
+    , 0x79
+    , 0x6E
+    , 0x63
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER@, literal @\"SDL.renderer.max_texture_size\"@, defined at @SDL3\/SDL_render.h 557:9@
+sDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x6D
+    , 0x61
+    , 0x78
+    , 0x5F
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x73
+    , 0x69
+    , 0x7A
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER@, literal @\"SDL.renderer.texture_formats\"@, defined at @SDL3\/SDL_render.h 558:9@
+sDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x66
+    , 0x6F
+    , 0x72
+    , 0x6D
+    , 0x61
+    , 0x74
+    , 0x73
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN@, literal @\"SDL.renderer.texture_wrapping\"@, defined at @SDL3\/SDL_render.h 559:9@
+sDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN :: BG.ByteString
+sDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x77
+    , 0x72
+    , 0x61
+    , 0x70
+    , 0x70
+    , 0x69
+    , 0x6E
+    , 0x67
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER@, literal @\"SDL.renderer.output_colorspace\"@, defined at @SDL3\/SDL_render.h 560:9@
+sDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x6F
+    , 0x75
+    , 0x74
+    , 0x70
+    , 0x75
+    , 0x74
+    , 0x5F
+    , 0x63
+    , 0x6F
+    , 0x6C
+    , 0x6F
+    , 0x72
+    , 0x73
+    , 0x70
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN@, literal @\"SDL.renderer.HDR_enabled\"@, defined at @SDL3\/SDL_render.h 561:9@
+sDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN :: BG.ByteString
+sDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x48
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x65
+    , 0x6E
+    , 0x61
+    , 0x62
+    , 0x6C
+    , 0x65
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT@, literal @\"SDL.renderer.SDR_white_point\"@, defined at @SDL3\/SDL_render.h 562:9@
+sDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT :: BG.ByteString
+sDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x53
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x77
+    , 0x68
+    , 0x69
+    , 0x74
+    , 0x65
+    , 0x5F
+    , 0x70
+    , 0x6F
+    , 0x69
+    , 0x6E
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_HDR_HEADROOM_FLOAT@, literal @\"SDL.renderer.HDR_headroom\"@, defined at @SDL3\/SDL_render.h 563:9@
+sDL_PROP_RENDERER_HDR_HEADROOM_FLOAT :: BG.ByteString
+sDL_PROP_RENDERER_HDR_HEADROOM_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x48
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x68
+    , 0x65
+    , 0x61
+    , 0x64
+    , 0x72
+    , 0x6F
+    , 0x6F
+    , 0x6D
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_D3D9_DEVICE_POINTER@, literal @\"SDL.renderer.d3d9.device\"@, defined at @SDL3\/SDL_render.h 564:9@
+sDL_PROP_RENDERER_D3D9_DEVICE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_D3D9_DEVICE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x39
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_D3D11_DEVICE_POINTER@, literal @\"SDL.renderer.d3d11.device\"@, defined at @SDL3\/SDL_render.h 565:9@
+sDL_PROP_RENDERER_D3D11_DEVICE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_D3D11_DEVICE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_D3D11_SWAPCHAIN_POINTER@, literal @\"SDL.renderer.d3d11.swap_chain\"@, defined at @SDL3\/SDL_render.h 566:9@
+sDL_PROP_RENDERER_D3D11_SWAPCHAIN_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_D3D11_SWAPCHAIN_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x73
+    , 0x77
+    , 0x61
+    , 0x70
+    , 0x5F
+    , 0x63
+    , 0x68
+    , 0x61
+    , 0x69
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_D3D12_DEVICE_POINTER@, literal @\"SDL.renderer.d3d12.device\"@, defined at @SDL3\/SDL_render.h 567:9@
+sDL_PROP_RENDERER_D3D12_DEVICE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_D3D12_DEVICE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_D3D12_SWAPCHAIN_POINTER@, literal @\"SDL.renderer.d3d12.swap_chain\"@, defined at @SDL3\/SDL_render.h 568:9@
+sDL_PROP_RENDERER_D3D12_SWAPCHAIN_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_D3D12_SWAPCHAIN_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x73
+    , 0x77
+    , 0x61
+    , 0x70
+    , 0x5F
+    , 0x63
+    , 0x68
+    , 0x61
+    , 0x69
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER@, literal @\"SDL.renderer.d3d12.command_queue\"@, defined at @SDL3\/SDL_render.h 569:9@
+sDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x63
+    , 0x6F
+    , 0x6D
+    , 0x6D
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x5F
+    , 0x71
+    , 0x75
+    , 0x65
+    , 0x75
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_VULKAN_INSTANCE_POINTER@, literal @\"SDL.renderer.vulkan.instance\"@, defined at @SDL3\/SDL_render.h 570:9@
+sDL_PROP_RENDERER_VULKAN_INSTANCE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_VULKAN_INSTANCE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x69
+    , 0x6E
+    , 0x73
+    , 0x74
+    , 0x61
+    , 0x6E
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_VULKAN_SURFACE_NUMBER@, literal @\"SDL.renderer.vulkan.surface\"@, defined at @SDL3\/SDL_render.h 571:9@
+sDL_PROP_RENDERER_VULKAN_SURFACE_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_VULKAN_SURFACE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_VULKAN_PHYSICAL_DEVICE_POINTER@, literal @\"SDL.renderer.vulkan.physical_device\"@, defined at @SDL3\/SDL_render.h 572:9@
+sDL_PROP_RENDERER_VULKAN_PHYSICAL_DEVICE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_VULKAN_PHYSICAL_DEVICE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x70
+    , 0x68
+    , 0x79
+    , 0x73
+    , 0x69
+    , 0x63
+    , 0x61
+    , 0x6C
+    , 0x5F
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_VULKAN_DEVICE_POINTER@, literal @\"SDL.renderer.vulkan.device\"@, defined at @SDL3\/SDL_render.h 573:9@
+sDL_PROP_RENDERER_VULKAN_DEVICE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_VULKAN_DEVICE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER@, literal @\"SDL.renderer.vulkan.graphics_queue_family_index\"@, defined at @SDL3\/SDL_render.h 574:9@
+sDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x67
+    , 0x72
+    , 0x61
+    , 0x70
+    , 0x68
+    , 0x69
+    , 0x63
+    , 0x73
+    , 0x5F
+    , 0x71
+    , 0x75
+    , 0x65
+    , 0x75
+    , 0x65
+    , 0x5F
+    , 0x66
+    , 0x61
+    , 0x6D
+    , 0x69
+    , 0x6C
+    , 0x79
+    , 0x5F
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x78
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER@, literal @\"SDL.renderer.vulkan.present_queue_family_index\"@, defined at @SDL3\/SDL_render.h 575:9@
+sDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x70
+    , 0x72
+    , 0x65
+    , 0x73
+    , 0x65
+    , 0x6E
+    , 0x74
+    , 0x5F
+    , 0x71
+    , 0x75
+    , 0x65
+    , 0x75
+    , 0x65
+    , 0x5F
+    , 0x66
+    , 0x61
+    , 0x6D
+    , 0x69
+    , 0x6C
+    , 0x79
+    , 0x5F
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x78
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER@, literal @\"SDL.renderer.vulkan.swapchain_image_count\"@, defined at @SDL3\/SDL_render.h 576:9@
+sDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER :: BG.ByteString
+sDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x73
+    , 0x77
+    , 0x61
+    , 0x70
+    , 0x63
+    , 0x68
+    , 0x61
+    , 0x69
+    , 0x6E
+    , 0x5F
+    , 0x69
+    , 0x6D
+    , 0x61
+    , 0x67
+    , 0x65
+    , 0x5F
+    , 0x63
+    , 0x6F
+    , 0x75
+    , 0x6E
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_RENDERER_GPU_DEVICE_POINTER@, literal @\"SDL.renderer.gpu.device\"@, defined at @SDL3\/SDL_render.h 577:9@
+sDL_PROP_RENDERER_GPU_DEVICE_POINTER :: BG.ByteString
+sDL_PROP_RENDERER_GPU_DEVICE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x65
+    , 0x72
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x69
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER@, literal @\"SDL.texture.create.colorspace\"@, defined at @SDL3\/SDL_render.h 808:9@
+sDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x6F
+    , 0x6C
+    , 0x6F
+    , 0x72
+    , 0x73
+    , 0x70
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER@, literal @\"SDL.texture.create.format\"@, defined at @SDL3\/SDL_render.h 809:9@
+sDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x66
+    , 0x6F
+    , 0x72
+    , 0x6D
+    , 0x61
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER@, literal @\"SDL.texture.create.access\"@, defined at @SDL3\/SDL_render.h 810:9@
+sDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x61
+    , 0x63
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER@, literal @\"SDL.texture.create.width\"@, defined at @SDL3\/SDL_render.h 811:9@
+sDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x64
+    , 0x74
+    , 0x68
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER@, literal @\"SDL.texture.create.height\"@, defined at @SDL3\/SDL_render.h 812:9@
+sDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x68
+    , 0x65
+    , 0x69
+    , 0x67
+    , 0x68
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_PALETTE_POINTER@, literal @\"SDL.texture.create.palette\"@, defined at @SDL3\/SDL_render.h 813:9@
+sDL_PROP_TEXTURE_CREATE_PALETTE_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_PALETTE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x70
+    , 0x61
+    , 0x6C
+    , 0x65
+    , 0x74
+    , 0x74
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT@, literal @\"SDL.texture.create.SDR_white_point\"@, defined at @SDL3\/SDL_render.h 814:9@
+sDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x53
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x77
+    , 0x68
+    , 0x69
+    , 0x74
+    , 0x65
+    , 0x5F
+    , 0x70
+    , 0x6F
+    , 0x69
+    , 0x6E
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT@, literal @\"SDL.texture.create.HDR_headroom\"@, defined at @SDL3\/SDL_render.h 815:9@
+sDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x48
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x68
+    , 0x65
+    , 0x61
+    , 0x64
+    , 0x72
+    , 0x6F
+    , 0x6F
+    , 0x6D
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER@, literal @\"SDL.texture.create.d3d11.texture\"@, defined at @SDL3\/SDL_render.h 816:9@
+sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER@, literal @\"SDL.texture.create.d3d11.texture_u\"@, defined at @SDL3\/SDL_render.h 817:9@
+sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER@, literal @\"SDL.texture.create.d3d11.texture_v\"@, defined at @SDL3\/SDL_render.h 818:9@
+sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER@, literal @\"SDL.texture.create.d3d12.texture\"@, defined at @SDL3\/SDL_render.h 819:9@
+sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER@, literal @\"SDL.texture.create.d3d12.texture_u\"@, defined at @SDL3\/SDL_render.h 820:9@
+sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER@, literal @\"SDL.texture.create.d3d12.texture_v\"@, defined at @SDL3\/SDL_render.h 821:9@
+sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER@, literal @\"SDL.texture.create.metal.pixelbuffer\"@, defined at @SDL3\/SDL_render.h 822:9@
+sDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x6C
+    , 0x2E
+    , 0x70
+    , 0x69
+    , 0x78
+    , 0x65
+    , 0x6C
+    , 0x62
+    , 0x75
+    , 0x66
+    , 0x66
+    , 0x65
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER@, literal @\"SDL.texture.create.opengl.texture\"@, defined at @SDL3\/SDL_render.h 823:9@
+sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER@, literal @\"SDL.texture.create.opengl.texture_uv\"@, defined at @SDL3\/SDL_render.h 824:9@
+sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER@, literal @\"SDL.texture.create.opengl.texture_u\"@, defined at @SDL3\/SDL_render.h 825:9@
+sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER@, literal @\"SDL.texture.create.opengl.texture_v\"@, defined at @SDL3\/SDL_render.h 826:9@
+sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER@, literal @\"SDL.texture.create.opengles2.texture\"@, defined at @SDL3\/SDL_render.h 827:9@
+sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x65
+    , 0x73
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER@, literal @\"SDL.texture.create.opengles2.texture_uv\"@, defined at @SDL3\/SDL_render.h 828:9@
+sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x65
+    , 0x73
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER@, literal @\"SDL.texture.create.opengles2.texture_u\"@, defined at @SDL3\/SDL_render.h 829:9@
+sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x65
+    , 0x73
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER@, literal @\"SDL.texture.create.opengles2.texture_v\"@, defined at @SDL3\/SDL_render.h 830:9@
+sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x65
+    , 0x73
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER@, literal @\"SDL.texture.create.vulkan.texture\"@, defined at @SDL3\/SDL_render.h 831:9@
+sDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER@, literal @\"SDL.texture.create.vulkan.layout\"@, defined at @SDL3\/SDL_render.h 832:9@
+sDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x6C
+    , 0x61
+    , 0x79
+    , 0x6F
+    , 0x75
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER@, literal @\"SDL.texture.create.gpu.texture\"@, defined at @SDL3\/SDL_render.h 833:9@
+sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_POINTER@, literal @\"SDL.texture.create.gpu.texture_uv\"@, defined at @SDL3\/SDL_render.h 834:9@
+sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_POINTER@, literal @\"SDL.texture.create.gpu.texture_u\"@, defined at @SDL3\/SDL_render.h 835:9@
+sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_POINTER@, literal @\"SDL.texture.create.gpu.texture_v\"@, defined at @SDL3\/SDL_render.h 836:9@
+sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_COLORSPACE_NUMBER@, literal @\"SDL.texture.colorspace\"@, defined at @SDL3\/SDL_render.h 937:9@
+sDL_PROP_TEXTURE_COLORSPACE_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_COLORSPACE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x6F
+    , 0x6C
+    , 0x6F
+    , 0x72
+    , 0x73
+    , 0x70
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_FORMAT_NUMBER@, literal @\"SDL.texture.format\"@, defined at @SDL3\/SDL_render.h 938:9@
+sDL_PROP_TEXTURE_FORMAT_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_FORMAT_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x66
+    , 0x6F
+    , 0x72
+    , 0x6D
+    , 0x61
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_ACCESS_NUMBER@, literal @\"SDL.texture.access\"@, defined at @SDL3\/SDL_render.h 939:9@
+sDL_PROP_TEXTURE_ACCESS_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_ACCESS_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x61
+    , 0x63
+    , 0x63
+    , 0x65
+    , 0x73
+    , 0x73
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_WIDTH_NUMBER@, literal @\"SDL.texture.width\"@, defined at @SDL3\/SDL_render.h 940:9@
+sDL_PROP_TEXTURE_WIDTH_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_WIDTH_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x64
+    , 0x74
+    , 0x68
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_HEIGHT_NUMBER@, literal @\"SDL.texture.height\"@, defined at @SDL3\/SDL_render.h 941:9@
+sDL_PROP_TEXTURE_HEIGHT_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_HEIGHT_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x68
+    , 0x65
+    , 0x69
+    , 0x67
+    , 0x68
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_SDR_WHITE_POINT_FLOAT@, literal @\"SDL.texture.SDR_white_point\"@, defined at @SDL3\/SDL_render.h 942:9@
+sDL_PROP_TEXTURE_SDR_WHITE_POINT_FLOAT :: BG.ByteString
+sDL_PROP_TEXTURE_SDR_WHITE_POINT_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x53
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x77
+    , 0x68
+    , 0x69
+    , 0x74
+    , 0x65
+    , 0x5F
+    , 0x70
+    , 0x6F
+    , 0x69
+    , 0x6E
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_HDR_HEADROOM_FLOAT@, literal @\"SDL.texture.HDR_headroom\"@, defined at @SDL3\/SDL_render.h 943:9@
+sDL_PROP_TEXTURE_HDR_HEADROOM_FLOAT :: BG.ByteString
+sDL_PROP_TEXTURE_HDR_HEADROOM_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x48
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x68
+    , 0x65
+    , 0x61
+    , 0x64
+    , 0x72
+    , 0x6F
+    , 0x6F
+    , 0x6D
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER@, literal @\"SDL.texture.d3d11.texture\"@, defined at @SDL3\/SDL_render.h 944:9@
+sDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_D3D11_TEXTURE_U_POINTER@, literal @\"SDL.texture.d3d11.texture_u\"@, defined at @SDL3\/SDL_render.h 945:9@
+sDL_PROP_TEXTURE_D3D11_TEXTURE_U_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_D3D11_TEXTURE_U_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_D3D11_TEXTURE_V_POINTER@, literal @\"SDL.texture.d3d11.texture_v\"@, defined at @SDL3\/SDL_render.h 946:9@
+sDL_PROP_TEXTURE_D3D11_TEXTURE_V_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_D3D11_TEXTURE_V_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER@, literal @\"SDL.texture.d3d12.texture\"@, defined at @SDL3\/SDL_render.h 947:9@
+sDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_D3D12_TEXTURE_U_POINTER@, literal @\"SDL.texture.d3d12.texture_u\"@, defined at @SDL3\/SDL_render.h 948:9@
+sDL_PROP_TEXTURE_D3D12_TEXTURE_U_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_D3D12_TEXTURE_U_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_D3D12_TEXTURE_V_POINTER@, literal @\"SDL.texture.d3d12.texture_v\"@, defined at @SDL3\/SDL_render.h 949:9@
+sDL_PROP_TEXTURE_D3D12_TEXTURE_V_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_D3D12_TEXTURE_V_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x33
+    , 0x64
+    , 0x31
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER@, literal @\"SDL.texture.opengl.texture\"@, defined at @SDL3\/SDL_render.h 950:9@
+sDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER@, literal @\"SDL.texture.opengl.texture_uv\"@, defined at @SDL3\/SDL_render.h 951:9@
+sDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER@, literal @\"SDL.texture.opengl.texture_u\"@, defined at @SDL3\/SDL_render.h 952:9@
+sDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER@, literal @\"SDL.texture.opengl.texture_v\"@, defined at @SDL3\/SDL_render.h 953:9@
+sDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGL_TEXTURE_TARGET_NUMBER@, literal @\"SDL.texture.opengl.target\"@, defined at @SDL3\/SDL_render.h 954:9@
+sDL_PROP_TEXTURE_OPENGL_TEXTURE_TARGET_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGL_TEXTURE_TARGET_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x61
+    , 0x72
+    , 0x67
+    , 0x65
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGL_TEX_W_FLOAT@, literal @\"SDL.texture.opengl.tex_w\"@, defined at @SDL3\/SDL_render.h 955:9@
+sDL_PROP_TEXTURE_OPENGL_TEX_W_FLOAT :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGL_TEX_W_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x5F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGL_TEX_H_FLOAT@, literal @\"SDL.texture.opengl.tex_h\"@, defined at @SDL3\/SDL_render.h 956:9@
+sDL_PROP_TEXTURE_OPENGL_TEX_H_FLOAT :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGL_TEX_H_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x5F
+    , 0x68
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER@, literal @\"SDL.texture.opengles2.texture\"@, defined at @SDL3\/SDL_render.h 957:9@
+sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x65
+    , 0x73
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER@, literal @\"SDL.texture.opengles2.texture_uv\"@, defined at @SDL3\/SDL_render.h 958:9@
+sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x65
+    , 0x73
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER@, literal @\"SDL.texture.opengles2.texture_u\"@, defined at @SDL3\/SDL_render.h 959:9@
+sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x65
+    , 0x73
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER@, literal @\"SDL.texture.opengles2.texture_v\"@, defined at @SDL3\/SDL_render.h 960:9@
+sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x65
+    , 0x73
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER@, literal @\"SDL.texture.opengles2.target\"@, defined at @SDL3\/SDL_render.h 961:9@
+sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x65
+    , 0x73
+    , 0x32
+    , 0x2E
+    , 0x74
+    , 0x61
+    , 0x72
+    , 0x67
+    , 0x65
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER@, literal @\"SDL.texture.vulkan.texture\"@, defined at @SDL3\/SDL_render.h 962:9@
+sDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER :: BG.ByteString
+sDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_GPU_TEXTURE_POINTER@, literal @\"SDL.texture.gpu.texture\"@, defined at @SDL3\/SDL_render.h 963:9@
+sDL_PROP_TEXTURE_GPU_TEXTURE_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_GPU_TEXTURE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER@, literal @\"SDL.texture.gpu.texture_uv\"@, defined at @SDL3\/SDL_render.h 964:9@
+sDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER@, literal @\"SDL.texture.gpu.texture_u\"@, defined at @SDL3\/SDL_render.h 965:9@
+sDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER@, literal @\"SDL.texture.gpu.texture_v\"@, defined at @SDL3\/SDL_render.h 966:9@
+sDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER :: BG.ByteString
+sDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x2E
+    , 0x67
+    , 0x70
+    , 0x75
+    , 0x2E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x75
+    , 0x72
+    , 0x65
+    , 0x5F
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_RENDERER_VSYNC_DISABLED@, defined at @SDL3\/SDL_render.h 2782:9@
+sDL_RENDERER_VSYNC_DISABLED :: BG.CInt
+sDL_RENDERER_VSYNC_DISABLED = (0 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_RENDERER_VSYNC_ADAPTIVE@, defined at @SDL3\/SDL_render.h 2783:9@
+sDL_RENDERER_VSYNC_ADAPTIVE :: BG.CInt
+sDL_RENDERER_VSYNC_ADAPTIVE =
+  C.Expr.HostPlatform.negate (1 :: BG.CInt)
+
+-- | The size, in pixels, of a single @SDL_RenderDebugText()@ character.
+--
+--     The font is monospaced and square, so this applies to all characters.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderDebugText'
+--
+--     [C declaration]: @macro SDL_DEBUG_TEXT_FONT_CHARACTER_SIZE@, defined at @SDL3\/SDL_render.h 2811:9@
+sDL_DEBUG_TEXT_FONT_CHARACTER_SIZE :: BG.CInt
+sDL_DEBUG_TEXT_FONT_CHARACTER_SIZE = (8 :: BG.CInt)
+
+-- | A structure specifying the parameters of a GPU render state.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_CreateGPURenderState'
+--
+--     [C declaration]: @struct SDL_GPURenderStateCreateInfo@, defined at @SDL3\/SDL_render.h 2925:16@
+data SDL_GPURenderStateCreateInfo = SDL_GPURenderStateCreateInfo
+  { fragment_shader :: BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUShader
+  -- ^ The fragment shader to use when this render state is active
+  --
+  --          [C declaration]: @fragment_shader@, defined at @SDL3\/SDL_render.h 2927:20@
+  , num_sampler_bindings :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The number of additional fragment samplers to bind when this render state is active
+  --
+  --          [C declaration]: @num_sampler_bindings@, defined at @SDL3\/SDL_render.h 2929:12@
+  , sampler_bindings :: PtrConst.PtrConst SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureSamplerBinding
+  -- ^ Additional fragment samplers to bind when this render state is active
+  --
+  --          [C declaration]: @sampler_bindings@, defined at @SDL3\/SDL_render.h 2930:41@
+  , num_storage_textures :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The number of storage textures to bind when this render state is active
+  --
+  --          [C declaration]: @num_storage_textures@, defined at @SDL3\/SDL_render.h 2932:12@
+  , storage_textures :: PtrConst.PtrConst (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUTexture)
+  -- ^ Storage textures to bind when this render state is active
+  --
+  --          [C declaration]: @storage_textures@, defined at @SDL3\/SDL_render.h 2933:28@
+  , num_storage_buffers :: SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^ The number of storage buffers to bind when this render state is active
+  --
+  --          [C declaration]: @num_storage_buffers@, defined at @SDL3\/SDL_render.h 2935:12@
+  , storage_buffers :: PtrConst.PtrConst (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUBuffer)
+  -- ^ Storage buffers to bind when this render state is active
+  --
+  --          [C declaration]: @storage_buffers@, defined at @SDL3\/SDL_render.h 2936:27@
+  , props :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^ A properties ID for extensions. Should be 0 if no extensions are needed.
+  --
+  --          [C declaration]: @props@, defined at @SDL3\/SDL_render.h 2938:22@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_GPURenderStateCreateInfo where
+  staticSizeOf = \_ -> (64 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_GPURenderStateCreateInfo where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GPURenderStateCreateInfo
+        <*> HasCField.readRaw (BG.Proxy @"fragment_shader") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_sampler_bindings") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"sampler_bindings") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_storage_textures") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"storage_textures") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"num_storage_buffers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"storage_buffers") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"props") ptr0
+
+instance Marshal.WriteRaw SDL_GPURenderStateCreateInfo where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GPURenderStateCreateInfo
+            fragment_shader2
+            num_sampler_bindings3
+            sampler_bindings4
+            num_storage_textures5
+            storage_textures6
+            num_storage_buffers7
+            storage_buffers8
+            props9 ->
+              HasCField.writeRaw (BG.Proxy @"fragment_shader") ptr0 fragment_shader2
+                >> HasCField.writeRaw (BG.Proxy @"num_sampler_bindings") ptr0 num_sampler_bindings3
+                >> HasCField.writeRaw (BG.Proxy @"sampler_bindings") ptr0 sampler_bindings4
+                >> HasCField.writeRaw (BG.Proxy @"num_storage_textures") ptr0 num_storage_textures5
+                >> HasCField.writeRaw (BG.Proxy @"storage_textures") ptr0 storage_textures6
+                >> HasCField.writeRaw (BG.Proxy @"num_storage_buffers") ptr0 num_storage_buffers7
+                >> HasCField.writeRaw (BG.Proxy @"storage_buffers") ptr0 storage_buffers8
+                >> HasCField.writeRaw (BG.Proxy @"props") ptr0 props9
+
+deriving via
+  Marshal.EquivStorable SDL_GPURenderStateCreateInfo
+  instance
+    BG.Storable SDL_GPURenderStateCreateInfo
+
+instance
+  (ty ~ BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUShader)
+  => BG.CompatHasField.HasField "fragment_shader" SDL_GPURenderStateCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURenderStateCreateInfo
+            { fragment_shader = y1
+            , num_sampler_bindings = BG.getField @"num_sampler_bindings" x0
+            , sampler_bindings = BG.getField @"sampler_bindings" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , storage_textures = BG.getField @"storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , storage_buffers = BG.getField @"storage_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"fragment_shader" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUShader)
+  => BG.HasField "fragment_shader" (BG.Ptr SDL_GPURenderStateCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"fragment_shader")
+
+instance HasCField.HasCField SDL_GPURenderStateCreateInfo "fragment_shader" where
+  type
+    CFieldType SDL_GPURenderStateCreateInfo "fragment_shader" =
+      BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUShader
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "num_sampler_bindings" SDL_GPURenderStateCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURenderStateCreateInfo
+            { num_sampler_bindings = y1
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , sampler_bindings = BG.getField @"sampler_bindings" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , storage_textures = BG.getField @"storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , storage_buffers = BG.getField @"storage_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_sampler_bindings" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "num_sampler_bindings" (BG.Ptr SDL_GPURenderStateCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_sampler_bindings")
+
+instance HasCField.HasCField SDL_GPURenderStateCreateInfo "num_sampler_bindings" where
+  type
+    CFieldType SDL_GPURenderStateCreateInfo "num_sampler_bindings" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ PtrConst.PtrConst SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureSamplerBinding)
+  => BG.CompatHasField.HasField "sampler_bindings" SDL_GPURenderStateCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURenderStateCreateInfo
+            { sampler_bindings = y1
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , num_sampler_bindings = BG.getField @"num_sampler_bindings" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , storage_textures = BG.getField @"storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , storage_buffers = BG.getField @"storage_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"sampler_bindings" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureSamplerBinding)
+  => BG.HasField "sampler_bindings" (BG.Ptr SDL_GPURenderStateCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"sampler_bindings")
+
+instance HasCField.HasCField SDL_GPURenderStateCreateInfo "sampler_bindings" where
+  type
+    CFieldType SDL_GPURenderStateCreateInfo "sampler_bindings" =
+      PtrConst.PtrConst SDL3.Sys.Bindgen.Gpu.SDL_GPUTextureSamplerBinding
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "num_storage_textures" SDL_GPURenderStateCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURenderStateCreateInfo
+            { num_storage_textures = y1
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , num_sampler_bindings = BG.getField @"num_sampler_bindings" x0
+            , sampler_bindings = BG.getField @"sampler_bindings" x0
+            , storage_textures = BG.getField @"storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , storage_buffers = BG.getField @"storage_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_storage_textures" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "num_storage_textures" (BG.Ptr SDL_GPURenderStateCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_storage_textures")
+
+instance HasCField.HasCField SDL_GPURenderStateCreateInfo "num_storage_textures" where
+  type
+    CFieldType SDL_GPURenderStateCreateInfo "num_storage_textures" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ PtrConst.PtrConst (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUTexture))
+  => BG.CompatHasField.HasField "storage_textures" SDL_GPURenderStateCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURenderStateCreateInfo
+            { storage_textures = y1
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , num_sampler_bindings = BG.getField @"num_sampler_bindings" x0
+            , sampler_bindings = BG.getField @"sampler_bindings" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , storage_buffers = BG.getField @"storage_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"storage_textures" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUTexture))
+  => BG.HasField "storage_textures" (BG.Ptr SDL_GPURenderStateCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"storage_textures")
+
+instance HasCField.HasCField SDL_GPURenderStateCreateInfo "storage_textures" where
+  type
+    CFieldType SDL_GPURenderStateCreateInfo "storage_textures" =
+      PtrConst.PtrConst (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUTexture)
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.CompatHasField.HasField "num_storage_buffers" SDL_GPURenderStateCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURenderStateCreateInfo
+            { num_storage_buffers = y1
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , num_sampler_bindings = BG.getField @"num_sampler_bindings" x0
+            , sampler_bindings = BG.getField @"sampler_bindings" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , storage_textures = BG.getField @"storage_textures" x0
+            , storage_buffers = BG.getField @"storage_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"num_storage_buffers" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Sint32)
+  => BG.HasField "num_storage_buffers" (BG.Ptr SDL_GPURenderStateCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"num_storage_buffers")
+
+instance HasCField.HasCField SDL_GPURenderStateCreateInfo "num_storage_buffers" where
+  type
+    CFieldType SDL_GPURenderStateCreateInfo "num_storage_buffers" =
+      SDL3.Sys.Bindgen.Stdinc.Sint32
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  (ty ~ PtrConst.PtrConst (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUBuffer))
+  => BG.CompatHasField.HasField "storage_buffers" SDL_GPURenderStateCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURenderStateCreateInfo
+            { storage_buffers = y1
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , num_sampler_bindings = BG.getField @"num_sampler_bindings" x0
+            , sampler_bindings = BG.getField @"sampler_bindings" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , storage_textures = BG.getField @"storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , props = BG.getField @"props" x0
+            }
+      , BG.getField @"storage_buffers" x0
+      )
+
+instance
+  (ty ~ PtrConst.PtrConst (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUBuffer))
+  => BG.HasField "storage_buffers" (BG.Ptr SDL_GPURenderStateCreateInfo) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"storage_buffers")
+
+instance HasCField.HasCField SDL_GPURenderStateCreateInfo "storage_buffers" where
+  type
+    CFieldType SDL_GPURenderStateCreateInfo "storage_buffers" =
+      PtrConst.PtrConst (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUBuffer)
+
+  offset# = \_ -> \_ -> 48
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.CompatHasField.HasField "props" SDL_GPURenderStateCreateInfo ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GPURenderStateCreateInfo
+            { props = y1
+            , fragment_shader = BG.getField @"fragment_shader" x0
+            , num_sampler_bindings = BG.getField @"num_sampler_bindings" x0
+            , sampler_bindings = BG.getField @"sampler_bindings" x0
+            , num_storage_textures = BG.getField @"num_storage_textures" x0
+            , storage_textures = BG.getField @"storage_textures" x0
+            , num_storage_buffers = BG.getField @"num_storage_buffers" x0
+            , storage_buffers = BG.getField @"storage_buffers" x0
+            }
+      , BG.getField @"props" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+  => BG.HasField "props" (BG.Ptr SDL_GPURenderStateCreateInfo) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"props")
+
+instance HasCField.HasCField SDL_GPURenderStateCreateInfo "props" where
+  type
+    CFieldType SDL_GPURenderStateCreateInfo "props" =
+      SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+
+  offset# = \_ -> \_ -> 56
+
+-- | A custom GPU render state.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_CreateGPURenderState', 'sDL_SetGPURenderStateFragmentUniforms', 'sDL_SetGPURenderState', 'sDL_DestroyGPURenderState'
+--
+--     [C declaration]: @struct SDL_GPURenderState@, defined at @SDL3\/SDL_render.h 2951:16@
+data SDL_GPURenderState
diff --git a/src/SDL3/Sys/Bindgen/Render/FunPtr.hs b/src/SDL3/Sys/Bindgen/Render/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Render/FunPtr.hs
@@ -0,0 +1,5704 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Render.FunPtr (
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetNumRenderDrivers,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderDriver,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_CreateWindowAndRenderer,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_CreateRenderer,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_CreateRendererWithProperties,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_CreateGPURenderer,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetGPURendererDevice,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_CreateSoftwareRenderer,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderer,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderWindow,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRendererName,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRendererProperties,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderOutputSize,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetCurrentRenderOutputSize,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_CreateTexture,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_CreateTextureFromSurface,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_CreateTextureWithProperties,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetTextureProperties,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRendererFromTexture,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetTextureSize,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetTexturePalette,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetTexturePalette,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetTextureColorMod,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetTextureColorModFloat,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetTextureColorMod,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetTextureColorModFloat,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetTextureAlphaMod,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetTextureAlphaModFloat,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetTextureAlphaMod,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetTextureAlphaModFloat,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetTextureBlendMode,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetTextureBlendMode,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_UpdateTexture,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_UpdateYUVTexture,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_UpdateNVTexture,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_LockTexture,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_LockTextureToSurface,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_UnlockTexture,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderTarget,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderTarget,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderLogicalPresentation,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderLogicalPresentation,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderLogicalPresentationRect,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderCoordinatesFromWindow,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderCoordinatesToWindow,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_ConvertEventToRenderCoordinates,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderViewport,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderViewport,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderViewportSet,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderSafeArea,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderClipRect,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderClipRect,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderClipEnabled,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderScale,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderScale,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderDrawColor,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderDrawColorFloat,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderDrawColor,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderDrawColorFloat,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderColorScale,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderColorScale,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderDrawBlendMode,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderDrawBlendMode,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderClear,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderPoint,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderPoints,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderLine,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderLines,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderRect,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderRects,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderFillRect,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderFillRects,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderTexture,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderTextureRotated,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderTextureAffine,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderTextureTiled,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderTexture9Grid,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderTexture9GridTiled,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderGeometry,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderGeometryRaw,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderTextureAddressMode,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderTextureAddressMode,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderReadPixels,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderPresent,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_DestroyTexture,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_DestroyRenderer,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_FlushRenderer,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderMetalLayer,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderMetalCommandEncoder,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_AddVulkanRenderSemaphores,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetRenderVSync,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetRenderVSync,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_RenderDebugText,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetDefaultTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_GetDefaultTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_CreateGPURenderState,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetGPURenderStateFragmentUniforms,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_SetGPURenderState,
+  SDL3.Sys.Bindgen.Render.FunPtr.sDL_DestroyGPURenderState,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Blendmode qualified
+import SDL3.Sys.Bindgen.Events qualified
+import SDL3.Sys.Bindgen.Gpu qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Render
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_render.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetNumRenderDrivers */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_39ae05adee57681c (void)) (void)"
+         , "{"
+         , "  return &SDL_GetNumRenderDrivers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDriver */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_5a6cb27af6f3e59c (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderDriver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateWindowAndRenderer */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a1e969ca8147cb88 (void)) ("
+         , "  char const *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_WindowFlags arg4,"
+         , "  SDL_Window **arg5,"
+         , "  SDL_Renderer **arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateWindowAndRenderer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateRenderer */"
+         , "__attribute__ ((const))"
+         , "SDL_Renderer *(*hs_bindgen_4f8c6f9ab79b5444 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateRenderer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateRendererWithProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_Renderer *(*hs_bindgen_2136cfcab6da3c79 (void)) ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateRendererWithProperties;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateGPURenderer */"
+         , "__attribute__ ((const))"
+         , "SDL_Renderer *(*hs_bindgen_90489326b8919b3c (void)) ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_CreateGPURenderer;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_CreateGPURenderer requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetGPURendererDevice */"
+         , "__attribute__ ((const))"
+         , "SDL_GPUDevice *(*hs_bindgen_63bae05a63e0c033 (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetGPURendererDevice;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetGPURendererDevice requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateSoftwareRenderer */"
+         , "__attribute__ ((const))"
+         , "SDL_Renderer *(*hs_bindgen_89305e9fc1bdb81a (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateSoftwareRenderer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderer */"
+         , "__attribute__ ((const))"
+         , "SDL_Renderer *(*hs_bindgen_8899be36c3b2acbb (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderWindow */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_d23f46fa0cff05e9 (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRendererName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_c60e6d89b68b688d (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRendererName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRendererProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_e8064380d0ff11a4 (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRendererProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderOutputSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d78ee833847e3e9c (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderOutputSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetCurrentRenderOutputSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_99478979fa574c65 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCurrentRenderOutputSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateTexture */"
+         , "__attribute__ ((const))"
+         , "SDL_Texture *(*hs_bindgen_4f8be95c455bb5f0 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_PixelFormat arg2,"
+         , "  SDL_TextureAccess arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateTextureFromSurface */"
+         , "__attribute__ ((const))"
+         , "SDL_Texture *(*hs_bindgen_d3a341064bd4c6fd (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateTextureFromSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateTextureWithProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_Texture *(*hs_bindgen_36ee6a46f451b373 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateTextureWithProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_becfaa2a4bff800b (void)) ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTextureProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRendererFromTexture */"
+         , "__attribute__ ((const))"
+         , "SDL_Renderer *(*hs_bindgen_49dcd52c4c1d2b81 (void)) ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRendererFromTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_41cc657b23107c65 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTextureSize;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTexturePalette */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2681f128241fbe43 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Palette *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SetTexturePalette;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetTexturePalette requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTexturePalette */"
+         , "__attribute__ ((const))"
+         , "SDL_Palette *(*hs_bindgen_5b5998bf3bb63e26 (void)) ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetTexturePalette;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetTexturePalette requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureColorMod */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_12df54216376e2f6 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTextureColorMod;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureColorModFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c199819113902151 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTextureColorModFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureColorMod */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_42ffa79ca220e7c4 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 *arg2,"
+         , "  Uint8 *arg3,"
+         , "  Uint8 *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTextureColorMod;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureColorModFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c18cd7bc6e616874 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3,"
+         , "  float *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTextureColorModFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureAlphaMod */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_206ed15266a6abc6 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTextureAlphaMod;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureAlphaModFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_497b70cfcdb285b3 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTextureAlphaModFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureAlphaMod */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_328f278f9cc361c9 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTextureAlphaMod;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureAlphaModFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_00ee88c364b7b54b (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTextureAlphaModFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureBlendMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8b3403b14f9cc34f (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_BlendMode arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTextureBlendMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureBlendMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e63bcb75e534a9b1 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_BlendMode *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTextureBlendMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureScaleMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b562cc4d76d8ed23 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_ScaleMode arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTextureScaleMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureScaleMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_01d80174738edcf8 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_ScaleMode *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTextureScaleMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UpdateTexture */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ed82660a3a2952a3 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  void const *arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_UpdateTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UpdateYUVTexture */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ccf06645aeb6e433 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  Uint8 const *arg3,"
+         , "  signed int arg4,"
+         , "  Uint8 const *arg5,"
+         , "  signed int arg6,"
+         , "  Uint8 const *arg7,"
+         , "  signed int arg8"
+         , ")"
+         , "{"
+         , "  return &SDL_UpdateYUVTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UpdateNVTexture */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_25fc8b2ffc040564 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  Uint8 const *arg3,"
+         , "  signed int arg4,"
+         , "  Uint8 const *arg5,"
+         , "  signed int arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_UpdateNVTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_LockTexture */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b2515cb3b400f701 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  void **arg3,"
+         , "  signed int *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_LockTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_LockTextureToSurface */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_232feaed95772158 (void)) ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface **arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_LockTextureToSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UnlockTexture */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_13908e9a60424294 (void)) ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_UnlockTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderTarget */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_bf0b26dd5575e7f4 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetRenderTarget;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderTarget */"
+         , "__attribute__ ((const))"
+         , "SDL_Texture *(*hs_bindgen_1e8b9f67ad2f60e0 (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderTarget;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderLogicalPresentation */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1034cb11879afccd (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_RendererLogicalPresentation arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetRenderLogicalPresentation;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderLogicalPresentation */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d91c953c563a7c79 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3,"
+         , "  SDL_RendererLogicalPresentation *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderLogicalPresentation;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderLogicalPresentationRect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_79882ebc0cf55c2f (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderLogicalPresentationRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderCoordinatesFromWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fb7241e246ca7baf (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderCoordinatesFromWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderCoordinatesToWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c7cc17f4dc614c4c (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderCoordinatesToWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_ConvertEventToRenderCoordinates */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e37a0e30c32b51de (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Event *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ConvertEventToRenderCoordinates;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderViewport */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_787c931cd9718282 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetRenderViewport;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderViewport */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6aa5d786da4df5f2 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderViewport;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderViewportSet */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9ea268631b7b5e5b (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderViewportSet;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderSafeArea */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_892008c6b673220b (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderSafeArea;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderClipRect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3aa3a1e497542ee8 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetRenderClipRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderClipRect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_bec026baef17d1f2 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderClipRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderClipEnabled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b0a5efaab13d3303 (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderClipEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderScale */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_938869c5ff233e71 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetRenderScale;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderScale */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fa6a48d0e427bd48 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderScale;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderDrawColor */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_cfcf753e753a9e88 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_SetRenderDrawColor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderDrawColorFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_99e499f38f3c9dc7 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_SetRenderDrawColorFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDrawColor */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c88d83e47700901b (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  Uint8 *arg2,"
+         , "  Uint8 *arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderDrawColor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDrawColorFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d1473916ef27e20f (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderDrawColorFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderColorScale */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_35d6252a1c594c7c (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetRenderColorScale;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderColorScale */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_77d1cf7afcbd4164 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderColorScale;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderDrawBlendMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_820f982c1cc61a34 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_BlendMode arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetRenderDrawBlendMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDrawBlendMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1409781aca259b0a (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_BlendMode *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderDrawBlendMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderClear */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9a11c0e709a2af5e (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderClear;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderPoint */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_429122691f4ce0fc (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderPoint;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderPoints */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b884f579966e5db6 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FPoint const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderPoints;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderLine */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ce6fb863b8b65fe2 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderLine;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderLines */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f3578aa8a36fe364 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FPoint const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderLines;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderRect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_dc6b0741f1d79bee (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderRects */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d697f94bacf56e0d (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderRects;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderFillRect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a730fe81c75d4472 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderFillRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderFillRects */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4cd330b36839141b (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderFillRects;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTexture */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1f27c13075574257 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FRect const *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTextureRotated */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3424943af047de83 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FRect const *arg4,"
+         , "  double arg5,"
+         , "  SDL_FPoint const *arg6,"
+         , "  SDL_FlipMode arg7"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderTextureRotated;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTextureAffine */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_dd59e212bf7d116f (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FPoint const *arg4,"
+         , "  SDL_FPoint const *arg5,"
+         , "  SDL_FPoint const *arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderTextureAffine;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTextureTiled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6cf4fce9a372af75 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  float arg4,"
+         , "  SDL_FRect const *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderTextureTiled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTexture9Grid */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_78cecf599cdec7c5 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  float arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7,"
+         , "  float arg8,"
+         , "  SDL_FRect const *arg9"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderTexture9Grid;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTexture9GridTiled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1b23a5c925e888fb (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  float arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7,"
+         , "  float arg8,"
+         , "  SDL_FRect const *arg9,"
+         , "  float arg10"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_RenderTexture9GridTiled;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_RenderTexture9GridTiled requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderGeometry */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_dc26aec86b6b43fe (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_Vertex const *arg3,"
+         , "  signed int arg4,"
+         , "  signed int const *arg5,"
+         , "  signed int arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderGeometry;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderGeometryRaw */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1e06910d8288533e (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  float const *arg3,"
+         , "  signed int arg4,"
+         , "  SDL_FColor const *arg5,"
+         , "  signed int arg6,"
+         , "  float const *arg7,"
+         , "  signed int arg8,"
+         , "  signed int arg9,"
+         , "  void const *arg10,"
+         , "  signed int arg11,"
+         , "  signed int arg12"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderGeometryRaw;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderTextureAddressMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_35802c1bb0921c28 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_TextureAddressMode arg2,"
+         , "  SDL_TextureAddressMode arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SetRenderTextureAddressMode;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetRenderTextureAddressMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderTextureAddressMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_649128c959cdb236 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_TextureAddressMode *arg2,"
+         , "  SDL_TextureAddressMode *arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetRenderTextureAddressMode;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetRenderTextureAddressMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderReadPixels */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_b087b184be493118 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderReadPixels;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderPresent */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2bafff2cb8bebc00 (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderPresent;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_DestroyTexture */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_4497bf4e9bdd42b9 (void)) ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyTexture;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_DestroyRenderer */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_011b10f177cafc47 (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyRenderer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_FlushRenderer */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_0ee776d39090d2fd (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_FlushRenderer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderMetalLayer */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_f52f9cb5238155f3 (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderMetalLayer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderMetalCommandEncoder */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_0e330f87af225f8b (void)) ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderMetalCommandEncoder;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_AddVulkanRenderSemaphores */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3aaeda31b2a532b0 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  Uint32 arg2,"
+         , "  Sint64 arg3,"
+         , "  Sint64 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_AddVulkanRenderSemaphores;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderVSync */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_964c717567cbb3b7 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetRenderVSync;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderVSync */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ea48e8e1fe227495 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetRenderVSync;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderDebugText */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_30bc1d75e73ca06a (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  char const *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_RenderDebugText;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetDefaultTextureScaleMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7118410bfe83a316 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_ScaleMode arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SetDefaultTextureScaleMode;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetDefaultTextureScaleMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetDefaultTextureScaleMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_51156f5e8dd42d03 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_ScaleMode *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetDefaultTextureScaleMode;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetDefaultTextureScaleMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateGPURenderState */"
+         , "__attribute__ ((const))"
+         , "SDL_GPURenderState *(*hs_bindgen_c77515a1f877dab2 (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_GPURenderStateCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_CreateGPURenderState;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_CreateGPURenderState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetGPURenderStateFragmentUniforms */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_65c1c07e7c4876a6 (void)) ("
+         , "  SDL_GPURenderState *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SetGPURenderStateFragmentUniforms;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetGPURenderStateFragmentUniforms requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetGPURenderState */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_440f7dac948d9e3d (void)) ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_GPURenderState *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SetGPURenderState;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetGPURenderState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_DestroyGPURenderState */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_dc4da5de025a8ba9 (void)) ("
+         , "  SDL_GPURenderState *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_DestroyGPURenderState;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_DestroyGPURenderState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetNumRenderDrivers@
+foreign import ccall unsafe "hs_bindgen_39ae05adee57681c"
+  hs_bindgen_39ae05adee57681c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetNumRenderDrivers@
+hs_bindgen_39ae05adee57681c :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_39ae05adee57681c =
+  BG.fromFFIType hs_bindgen_39ae05adee57681c_base
+
+{-# NOINLINE sDL_GetNumRenderDrivers #-}
+
+-- | Get the number of 2D rendering drivers available for the current display.
+--
+--     A render driver is a set of code that handles rendering and texture management on a particular display. Normally there is only one, but some drivers may have several available with different capabilities.
+--
+--     There may be none if SDL was compiled without render support.
+--
+--     [Returns]: the number of built in render drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', 'sDL_GetRenderDriver'
+--
+--     [C declaration]: @SDL_GetNumRenderDrivers@, defined at @SDL3\/SDL_render.h 192:33@
+sDL_GetNumRenderDrivers :: BG.FunPtr (IO BG.CInt)
+sDL_GetNumRenderDrivers =
+  BG.unsafePerformIO hs_bindgen_39ae05adee57681c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDriver@
+foreign import ccall unsafe "hs_bindgen_5a6cb27af6f3e59c"
+  hs_bindgen_5a6cb27af6f3e59c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDriver@
+hs_bindgen_5a6cb27af6f3e59c :: IO (BG.FunPtr (BG.CInt -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_5a6cb27af6f3e59c =
+  BG.fromFFIType hs_bindgen_5a6cb27af6f3e59c_base
+
+{-# NOINLINE sDL_GetRenderDriver #-}
+
+-- | Use this function to get the name of a built in 2D rendering driver.
+--
+--     The list of rendering drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"opengl\", \"direct3d12\" or \"metal\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [@index@]: the index of the rendering driver; the value ranges from 0 to @SDL_GetNumRenderDrivers()@ - 1.
+--
+--     [Returns]: the name of the rendering driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumRenderDrivers'
+--
+--     [C declaration]: @SDL_GetRenderDriver@, defined at @SDL3\/SDL_render.h 216:42@
+sDL_GetRenderDriver :: BG.FunPtr (BG.CInt -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetRenderDriver =
+  BG.unsafePerformIO hs_bindgen_5a6cb27af6f3e59c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateWindowAndRenderer@
+foreign import ccall unsafe "hs_bindgen_a1e969ca8147cb88"
+  hs_bindgen_a1e969ca8147cb88_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateWindowAndRenderer@
+hs_bindgen_a1e969ca8147cb88
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> BG.CInt
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Video.SDL_WindowFlags
+             -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+             -> BG.Ptr (BG.Ptr SDL_Renderer)
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_a1e969ca8147cb88 =
+  BG.fromFFIType hs_bindgen_a1e969ca8147cb88_base
+
+{-# NOINLINE sDL_CreateWindowAndRenderer #-}
+
+-- | Create a window and default renderer.
+--
+--     [@title@]: the title of the window, in UTF-8 encoding.
+--
+--     [@width@]: the width of the window.
+--
+--     [@height@]: the height of the window.
+--
+--     [@window_flags@]: the flags used to create the window (see SDL_CreateWindow()).
+--
+--     [@window@]: a pointer filled with the window, or NULL on error.
+--
+--     [@renderer@]: a pointer filled with the renderer, or NULL on error.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', SDL_CreateWindow
+--
+--     [C declaration]: @SDL_CreateWindowAndRenderer@, defined at @SDL3\/SDL_render.h 238:34@
+sDL_CreateWindowAndRenderer
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> BG.CInt
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Video.SDL_WindowFlags
+         -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+         -> BG.Ptr (BG.Ptr SDL_Renderer)
+         -> IO BG.CBool
+       )
+sDL_CreateWindowAndRenderer =
+  BG.unsafePerformIO hs_bindgen_a1e969ca8147cb88
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateRenderer@
+foreign import ccall unsafe "hs_bindgen_4f8c6f9ab79b5444"
+  hs_bindgen_4f8c6f9ab79b5444_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateRenderer@
+hs_bindgen_4f8c6f9ab79b5444
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Renderer))
+       )
+hs_bindgen_4f8c6f9ab79b5444 =
+  BG.fromFFIType hs_bindgen_4f8c6f9ab79b5444_base
+
+{-# NOINLINE sDL_CreateRenderer #-}
+
+-- | Create a 2D rendering context for a window.
+--
+--     If you want a specific renderer, you can specify its name here. A list of available renderers can be obtained by calling @SDL_GetRenderDriver()@ multiple times, with indices from 0 to @SDL_GetNumRenderDrivers()@ -1. If you don\'t need a specific renderer, specify NULL and SDL will attempt to choose the best option for you, based on what is available on the user\'s system.
+--
+--     If @name@ is a comma-separated list, SDL will try each name, in the order listed, until one succeeds or all of them fail.
+--
+--     By default the rendering size matches the window size in pixels, but you can call @SDL_SetRenderLogicalPresentation()@ to change the content size and scaling options.
+--
+--     [@window@]: the window where rendering is displayed.
+--
+--     [@name@]: the name of the rendering driver to initialize, or NULL to let SDL choose one.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRendererWithProperties', 'sDL_CreateSoftwareRenderer', 'sDL_DestroyRenderer', 'sDL_GetNumRenderDrivers', 'sDL_GetRenderDriver', 'sDL_GetRendererName'
+--
+--     [C declaration]: @SDL_CreateRenderer@, defined at @SDL3\/SDL_render.h 273:44@
+sDL_CreateRenderer
+  :: BG.FunPtr
+       (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Renderer))
+sDL_CreateRenderer =
+  BG.unsafePerformIO hs_bindgen_4f8c6f9ab79b5444
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateRendererWithProperties@
+foreign import ccall unsafe "hs_bindgen_2136cfcab6da3c79"
+  hs_bindgen_2136cfcab6da3c79_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateRendererWithProperties@
+hs_bindgen_2136cfcab6da3c79
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO (BG.Ptr SDL_Renderer)))
+hs_bindgen_2136cfcab6da3c79 =
+  BG.fromFFIType hs_bindgen_2136cfcab6da3c79_base
+
+{-# NOINLINE sDL_CreateRendererWithProperties #-}
+
+-- | Create a 2D rendering context for a window, with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_RENDERER_CREATE_NAME_STRING'@: the name of the rendering driver to use, if a specific one is desired
+--
+--     * @'sDL_PROP_RENDERER_CREATE_WINDOW_POINTER'@: the window where rendering is displayed, required if this isn\'t a software renderer using a surface
+--
+--     * @'sDL_PROP_RENDERER_CREATE_SURFACE_POINTER'@: the surface where rendering is displayed, if you want a software renderer without a window
+--
+--     * @'sDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the colorspace for output to the display, defaults to SDL_COLORSPACE_SRGB. The direct3d11, direct3d12, and metal renderers support SDL_COLORSPACE_SRGB_LINEAR, which is a linear color space and supports HDR output. If you select SDL_COLORSPACE_SRGB_LINEAR, drawing still uses the sRGB colorspace, but values can go beyond 1.0 and float (linear) format textures can be used for HDR content.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER'@: non-zero if you want present synchronized with the refresh rate. This property can take any value that is supported by @SDL_SetRenderVSync()@ for the renderer.
+--
+--     With the SDL GPU renderer (since SDL 3.4.0):
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER'@: the device to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN'@: the app is able to provide SPIR-V shaders to 'SDL_GPURenderState', optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN'@: the app is able to provide DXIL shaders to 'SDL_GPURenderState', optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN'@: the app is able to provide MSL shaders to 'SDL_GPURenderState', optional.
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER'@: the VkInstance to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER'@: the VkSurfaceKHR to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER'@: the VkPhysicalDevice to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_DEVICE_POINTER'@: the VkDevice to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for rendering.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for presentation.
+--
+--     [@props@]: the properties to use.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateProperties, 'sDL_CreateRenderer', 'sDL_CreateSoftwareRenderer', 'sDL_DestroyRenderer', 'sDL_GetRendererName'
+--
+--     [C declaration]: @SDL_CreateRendererWithProperties@, defined at @SDL3\/SDL_render.h 337:44@
+sDL_CreateRendererWithProperties
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO (BG.Ptr SDL_Renderer))
+sDL_CreateRendererWithProperties =
+  BG.unsafePerformIO hs_bindgen_2136cfcab6da3c79
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateGPURenderer@
+foreign import ccall unsafe "hs_bindgen_90489326b8919b3c"
+  hs_bindgen_90489326b8919b3c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateGPURenderer@
+hs_bindgen_90489326b8919b3c
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice
+             -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> IO (BG.Ptr SDL_Renderer)
+           )
+       )
+hs_bindgen_90489326b8919b3c =
+  BG.fromFFIType hs_bindgen_90489326b8919b3c_base
+
+{-# NOINLINE sDL_CreateGPURenderer #-}
+
+-- | Create a 2D GPU rendering context.
+--
+--     The GPU device to use is passed in as a parameter. If this is NULL, then a device will be created normally and can be retrieved using @SDL_GetGPURendererDevice()@.
+--
+--     The window to use is passed in as a parameter. If this is NULL, then this will become an offscreen renderer. In that case, you should call @SDL_SetRenderTarget()@ to setup rendering to a texture, and then call @SDL_RenderPresent()@ normally to complete drawing a frame.
+--
+--     [@device@]: the GPU device to use with the renderer, or NULL to create a device.
+--
+--     [@window@]: the window where rendering is displayed, or NULL to create an offscreen renderer.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: If this function is called with a valid GPU device, it should be called on the thread that created the device. If this function is called with a valid window, it should be called on the thread that created the window.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_CreateRendererWithProperties', 'sDL_GetGPURendererDevice', SDL_CreateGPUShader, 'sDL_CreateGPURenderState', 'sDL_SetGPURenderState'
+--
+--     [C declaration]: @SDL_CreateGPURenderer@, defined at @SDL3\/SDL_render.h 387:44@
+sDL_CreateGPURenderer
+  :: BG.FunPtr
+       ( BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice
+         -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> IO (BG.Ptr SDL_Renderer)
+       )
+sDL_CreateGPURenderer =
+  BG.unsafePerformIO hs_bindgen_90489326b8919b3c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetGPURendererDevice@
+foreign import ccall unsafe "hs_bindgen_63bae05a63e0c033"
+  hs_bindgen_63bae05a63e0c033_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetGPURendererDevice@
+hs_bindgen_63bae05a63e0c033
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice)))
+hs_bindgen_63bae05a63e0c033 =
+  BG.fromFFIType hs_bindgen_63bae05a63e0c033_base
+
+{-# NOINLINE sDL_GetGPURendererDevice #-}
+
+-- | Return the GPU device used by a renderer.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [Returns]: the GPU device used by the renderer, or NULL if the renderer is not a GPU renderer; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetGPURendererDevice@, defined at @SDL3\/SDL_render.h 400:45@
+sDL_GetGPURendererDevice
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice))
+sDL_GetGPURendererDevice =
+  BG.unsafePerformIO hs_bindgen_63bae05a63e0c033
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateSoftwareRenderer@
+foreign import ccall unsafe "hs_bindgen_89305e9fc1bdb81a"
+  hs_bindgen_89305e9fc1bdb81a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateSoftwareRenderer@
+hs_bindgen_89305e9fc1bdb81a
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO (BG.Ptr SDL_Renderer)))
+hs_bindgen_89305e9fc1bdb81a =
+  BG.fromFFIType hs_bindgen_89305e9fc1bdb81a_base
+
+{-# NOINLINE sDL_CreateSoftwareRenderer #-}
+
+-- | Create a 2D software rendering context for a surface.
+--
+--     Two other API which can be used to create 'SDL_Renderer': @SDL_CreateRenderer()@ and @SDL_CreateWindowAndRenderer()@. These can /also/ create a software renderer, but they are intended to be used with an SDL_Window as the final destination and not an SDL_Surface.
+--
+--     [@surface@]: the SDL_Surface structure representing the surface where rendering is done.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyRenderer'
+--
+--     [C declaration]: @SDL_CreateSoftwareRenderer@, defined at @SDL3\/SDL_render.h 421:44@
+sDL_CreateSoftwareRenderer
+  :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO (BG.Ptr SDL_Renderer))
+sDL_CreateSoftwareRenderer =
+  BG.unsafePerformIO hs_bindgen_89305e9fc1bdb81a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderer@
+foreign import ccall unsafe "hs_bindgen_8899be36c3b2acbb"
+  hs_bindgen_8899be36c3b2acbb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderer@
+hs_bindgen_8899be36c3b2acbb
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO (BG.Ptr SDL_Renderer)))
+hs_bindgen_8899be36c3b2acbb =
+  BG.fromFFIType hs_bindgen_8899be36c3b2acbb_base
+
+{-# NOINLINE sDL_GetRenderer #-}
+
+-- | Get the renderer associated with a window.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: the rendering context on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRenderer@, defined at @SDL3\/SDL_render.h 434:44@
+sDL_GetRenderer :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window -> IO (BG.Ptr SDL_Renderer))
+sDL_GetRenderer =
+  BG.unsafePerformIO hs_bindgen_8899be36c3b2acbb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderWindow@
+foreign import ccall unsafe "hs_bindgen_d23f46fa0cff05e9"
+  hs_bindgen_d23f46fa0cff05e9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderWindow@
+hs_bindgen_d23f46fa0cff05e9
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)))
+hs_bindgen_d23f46fa0cff05e9 =
+  BG.fromFFIType hs_bindgen_d23f46fa0cff05e9_base
+
+{-# NOINLINE sDL_GetRenderWindow #-}
+
+-- | Get the window associated with a renderer.
+--
+--     [@renderer@]: the renderer to query.
+--
+--     [Returns]: the window on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRenderWindow@, defined at @SDL3\/SDL_render.h 447:42@
+sDL_GetRenderWindow
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window))
+sDL_GetRenderWindow =
+  BG.unsafePerformIO hs_bindgen_d23f46fa0cff05e9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRendererName@
+foreign import ccall unsafe "hs_bindgen_c60e6d89b68b688d"
+  hs_bindgen_c60e6d89b68b688d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRendererName@
+hs_bindgen_c60e6d89b68b688d
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_c60e6d89b68b688d =
+  BG.fromFFIType hs_bindgen_c60e6d89b68b688d_base
+
+{-# NOINLINE sDL_GetRendererName #-}
+
+-- | Get the name of a renderer.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [Returns]: the name of the selected renderer, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', 'sDL_CreateRendererWithProperties'
+--
+--     [C declaration]: @SDL_GetRendererName@, defined at @SDL3\/SDL_render.h 463:42@
+sDL_GetRendererName :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetRendererName =
+  BG.unsafePerformIO hs_bindgen_c60e6d89b68b688d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRendererProperties@
+foreign import ccall unsafe "hs_bindgen_e8064380d0ff11a4"
+  hs_bindgen_e8064380d0ff11a4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRendererProperties@
+hs_bindgen_e8064380d0ff11a4
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_e8064380d0ff11a4 =
+  BG.fromFFIType hs_bindgen_e8064380d0ff11a4_base
+
+{-# NOINLINE sDL_GetRendererProperties #-}
+
+-- | Get the properties associated with a renderer.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_RENDERER_NAME_STRING'@: the name of the rendering driver
+--
+--     * @'sDL_PROP_RENDERER_WINDOW_POINTER'@: the window where rendering is displayed, if any
+--
+--     * @'sDL_PROP_RENDERER_SURFACE_POINTER'@: the surface where rendering is displayed, if this is a software renderer without a window
+--
+--     * @'sDL_PROP_RENDERER_VSYNC_NUMBER'@: the current vsync setting
+--
+--     * @'sDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER'@: the maximum texture width and height
+--
+--     * @'sDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER'@: a (const SDL_PixelFormat *) array of pixel formats, terminated with SDL_PIXELFORMAT_UNKNOWN, representing the available texture formats for this renderer.
+--
+--     * @'sDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN'@: true if the renderer supports SDL_TEXTURE_ADDRESS_WRAP on non-power-of-two textures.
+--
+--     * @'sDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the colorspace for output to the display, defaults to SDL_COLORSPACE_SRGB.
+--
+--     * @'sDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN'@: true if the output colorspace is SDL_COLORSPACE_SRGB_LINEAR and the renderer is showing on a display with HDR enabled. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT'@: the value of SDR white in the SDL_COLORSPACE_SRGB_LINEAR colorspace. When HDR is enabled, this value is automatically multiplied into the color scale. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_RENDERER_HDR_HEADROOM_FLOAT'@: the additional high dynamic range that can be displayed, in terms of the SDR white point. When HDR is not enabled, this will be 1.0. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     With the direct3d renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D9_DEVICE_POINTER'@: the IDirect3DDevice9 associated with the renderer
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D11_DEVICE_POINTER'@: the ID3D11Device associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_D3D11_SWAPCHAIN_POINTER'@: the IDXGISwapChain1 associated with the renderer. This may change when the window is resized.
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D12_DEVICE_POINTER'@: the ID3D12Device associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_D3D12_SWAPCHAIN_POINTER'@: the IDXGISwapChain4 associated with the renderer.
+--
+--     * @'sDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER'@: the ID3D12CommandQueue associated with the renderer
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_INSTANCE_POINTER'@: the VkInstance associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_SURFACE_NUMBER'@: the VkSurfaceKHR associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_PHYSICAL_DEVICE_POINTER'@: the VkPhysicalDevice associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_DEVICE_POINTER'@: the VkDevice associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for rendering
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for presentation
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER'@: the number of swapchain images, or potential frames in flight, used by the Vulkan renderer
+--
+--     With the gpu renderer:
+--
+--     * @'sDL_PROP_RENDERER_GPU_DEVICE_POINTER'@: the SDL_GPUDevice associated with the renderer
+--
+--     [@renderer@]: the rendering context.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRendererProperties@, defined at @SDL3\/SDL_render.h 551:46@
+sDL_GetRendererProperties
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetRendererProperties =
+  BG.unsafePerformIO hs_bindgen_e8064380d0ff11a4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderOutputSize@
+foreign import ccall unsafe "hs_bindgen_d78ee833847e3e9c"
+  hs_bindgen_d78ee833847e3e9c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderOutputSize@
+hs_bindgen_d78ee833847e3e9c
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_d78ee833847e3e9c =
+  BG.fromFFIType hs_bindgen_d78ee833847e3e9c_base
+
+{-# NOINLINE sDL_GetRenderOutputSize #-}
+
+-- | Get the output size in pixels of a rendering context.
+--
+--     This returns the true output size in pixels, ignoring any render targets or logical size and presentation.
+--
+--     For the output size of the current rendering target, with logical size adjustments, use @SDL_GetCurrentRenderOutputSize()@ instead.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@w@]: a pointer filled in with the width in pixels.
+--
+--     [@h@]: a pointer filled in with the height in pixels.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCurrentRenderOutputSize'
+--
+--     [C declaration]: @SDL_GetRenderOutputSize@, defined at @SDL3\/SDL_render.h 600:34@
+sDL_GetRenderOutputSize
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetRenderOutputSize =
+  BG.unsafePerformIO hs_bindgen_d78ee833847e3e9c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetCurrentRenderOutputSize@
+foreign import ccall unsafe "hs_bindgen_99478979fa574c65"
+  hs_bindgen_99478979fa574c65_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetCurrentRenderOutputSize@
+hs_bindgen_99478979fa574c65
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_99478979fa574c65 =
+  BG.fromFFIType hs_bindgen_99478979fa574c65_base
+
+{-# NOINLINE sDL_GetCurrentRenderOutputSize #-}
+
+-- | Get the current output size in pixels of a rendering context.
+--
+--     If a rendering target is active, this will return the size of the rendering target in pixels, otherwise return the value of @SDL_GetRenderOutputSize()@.
+--
+--     Rendering target or not, the output will be adjusted by the current logical presentation state, dictated by @SDL_SetRenderLogicalPresentation()@.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@w@]: a pointer filled in with the current width.
+--
+--     [@h@]: a pointer filled in with the current height.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderOutputSize'
+--
+--     [C declaration]: @SDL_GetCurrentRenderOutputSize@, defined at @SDL3\/SDL_render.h 623:34@
+sDL_GetCurrentRenderOutputSize
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetCurrentRenderOutputSize =
+  BG.unsafePerformIO hs_bindgen_99478979fa574c65
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateTexture@
+foreign import ccall unsafe "hs_bindgen_4f8be95c455bb5f0"
+  hs_bindgen_4f8be95c455bb5f0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateTexture@
+hs_bindgen_4f8be95c455bb5f0
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+             -> SDL_TextureAccess
+             -> BG.CInt
+             -> BG.CInt
+             -> IO (BG.Ptr SDL_Texture)
+           )
+       )
+hs_bindgen_4f8be95c455bb5f0 =
+  BG.fromFFIType hs_bindgen_4f8be95c455bb5f0_base
+
+{-# NOINLINE sDL_CreateTexture #-}
+
+-- | Create a texture for a rendering context.
+--
+--     The contents of a texture when first created are not defined.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@format@]: one of the enumerated values in SDL_PixelFormat.
+--
+--     [@access@]: one of the enumerated values in 'SDL_TextureAccess'.
+--
+--     [@w@]: the width of the texture in pixels.
+--
+--     [@h@]: the height of the texture in pixels.
+--
+--     [Returns]: the created texture or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTextureFromSurface', 'sDL_CreateTextureWithProperties', 'sDL_DestroyTexture', 'sDL_GetTextureSize', 'sDL_UpdateTexture'
+--
+--     [C declaration]: @SDL_CreateTexture@, defined at @SDL3\/SDL_render.h 648:43@
+sDL_CreateTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+         -> SDL_TextureAccess
+         -> BG.CInt
+         -> BG.CInt
+         -> IO (BG.Ptr SDL_Texture)
+       )
+sDL_CreateTexture =
+  BG.unsafePerformIO hs_bindgen_4f8be95c455bb5f0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateTextureFromSurface@
+foreign import ccall unsafe "hs_bindgen_d3a341064bd4c6fd"
+  hs_bindgen_d3a341064bd4c6fd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateTextureFromSurface@
+hs_bindgen_d3a341064bd4c6fd
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO (BG.Ptr SDL_Texture))
+       )
+hs_bindgen_d3a341064bd4c6fd =
+  BG.fromFFIType hs_bindgen_d3a341064bd4c6fd_base
+
+{-# NOINLINE sDL_CreateTextureFromSurface #-}
+
+-- | Create a texture from an existing surface.
+--
+--     The surface is not modified or freed by this function.
+--
+--     The 'SDL_TextureAccess' hint for the created texture is @SDL_TEXTUREACCESS_STATIC@.
+--
+--     The pixel format of the created texture may be different from the pixel format of the surface, and can be queried using the SDL_PROP_TEXTURE_FORMAT_NUMBER property.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@surface@]: the SDL_Surface structure containing pixel data used to fill the texture.
+--
+--     [Returns]: the created texture or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTexture', 'sDL_CreateTextureWithProperties', 'sDL_DestroyTexture'
+--
+--     [C declaration]: @SDL_CreateTextureFromSurface@, defined at @SDL3\/SDL_render.h 676:43@
+sDL_CreateTextureFromSurface
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO (BG.Ptr SDL_Texture))
+sDL_CreateTextureFromSurface =
+  BG.unsafePerformIO hs_bindgen_d3a341064bd4c6fd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateTextureWithProperties@
+foreign import ccall unsafe "hs_bindgen_36ee6a46f451b373"
+  hs_bindgen_36ee6a46f451b373_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateTextureWithProperties@
+hs_bindgen_36ee6a46f451b373
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO (BG.Ptr SDL_Texture))
+       )
+hs_bindgen_36ee6a46f451b373 =
+  BG.fromFFIType hs_bindgen_36ee6a46f451b373_base
+
+{-# NOINLINE sDL_CreateTextureWithProperties #-}
+
+-- | Create a texture for a rendering context with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the texture colorspace, defaults to SDL_COLORSPACE_SRGB_LINEAR for floating point textures, SDL_COLORSPACE_HDR10 for 10-bit textures, SDL_COLORSPACE_SRGB for other RGB textures and SDL_COLORSPACE_JPEG for YUV textures.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER'@: one of the enumerated values in SDL_PixelFormat, defaults to the best RGBA format for the renderer
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER'@: one of the enumerated values in 'SDL_TextureAccess', defaults to SDL_TEXTUREACCESS_STATIC
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER'@: the width of the texture in pixels, required
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER'@: the height of the texture in pixels, required
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_PALETTE_POINTER'@: an SDL_Palette to use with palettized texture formats. This can be set later with @SDL_SetTexturePalette()@
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point textures, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 100 for HDR10 textures and 1.0 for floating point textures.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point textures, this defines the maximum dynamic range used by the content, in terms of the SDR white point. This would be equivalent to maxCLL \/ SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT for HDR10 content. If this is defined, any values outside the range supported by the display will be scaled into the available HDR headroom, otherwise they are clipped.
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER'@: the ID3D11Texture2D associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER'@: the ID3D11Texture2D associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER'@: the ID3D11Texture2D associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER'@: the ID3D12Resource associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER'@: the ID3D12Resource associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER'@: the ID3D12Resource associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the metal renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER'@: the CVPixelBufferRef associated with the texture, if you want to create a texture from an existing pixel buffer.
+--
+--     With the opengl renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the opengles2 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER'@: the VkImage associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER'@: the VkImageLayout for the VkImage, defaults to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
+--
+--     With the GPU renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER'@: the SDL_GPUTexture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_NUMBER@: the SDL_GPUTexture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_NUMBER@: the SDL_GPUTexture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_NUMBER@: the SDL_GPUTexture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@props@]: the properties to use.
+--
+--     [Returns]: the created texture or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateProperties, 'sDL_CreateTexture', 'sDL_CreateTextureFromSurface', 'sDL_DestroyTexture', 'sDL_GetTextureSize', 'sDL_UpdateTexture'
+--
+--     [C declaration]: @SDL_CreateTextureWithProperties@, defined at @SDL3\/SDL_render.h 806:43@
+sDL_CreateTextureWithProperties
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO (BG.Ptr SDL_Texture))
+sDL_CreateTextureWithProperties =
+  BG.unsafePerformIO hs_bindgen_36ee6a46f451b373
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureProperties@
+foreign import ccall unsafe "hs_bindgen_becfaa2a4bff800b"
+  hs_bindgen_becfaa2a4bff800b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureProperties@
+hs_bindgen_becfaa2a4bff800b
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_becfaa2a4bff800b =
+  BG.fromFFIType hs_bindgen_becfaa2a4bff800b_base
+
+{-# NOINLINE sDL_GetTextureProperties #-}
+
+-- | Get the properties associated with a texture.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_TEXTURE_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the texture colorspace.
+--
+--     * @'sDL_PROP_TEXTURE_FORMAT_NUMBER'@: one of the enumerated values in SDL_PixelFormat.
+--
+--     * @'sDL_PROP_TEXTURE_ACCESS_NUMBER'@: one of the enumerated values in 'SDL_TextureAccess'.
+--
+--     * @'sDL_PROP_TEXTURE_WIDTH_NUMBER'@: the width of the texture in pixels.
+--
+--     * @'sDL_PROP_TEXTURE_HEIGHT_NUMBER'@: the height of the texture in pixels.
+--
+--     * @'sDL_PROP_TEXTURE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point textures, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 100 for HDR10 textures and 1.0 for other textures.
+--
+--     * @'sDL_PROP_TEXTURE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point textures, this defines the maximum dynamic range used by the content, in terms of the SDR white point. If this is defined, any values outside the range supported by the display will be scaled into the available HDR headroom, otherwise they are clipped. This defaults to 1.0 for SDR textures, 4.0 for HDR10 textures, and no default for floating point textures.
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER'@: the ID3D11Texture2D associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_U_POINTER'@: the ID3D11Texture2D associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_V_POINTER'@: the ID3D11Texture2D associated with the V plane of a YUV texture
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER'@: the ID3D12Resource associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_U_POINTER'@: the ID3D12Resource associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_V_POINTER'@: the ID3D12Resource associated with the V plane of a YUV texture
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER'@: the VkImage associated with the texture
+--
+--     With the opengl renderer:
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER'@: the GLuint texture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_TARGET_NUMBER'@: the GLenum for the texture target (@GL_TEXTURE_2D@, @GL_TEXTURE_RECTANGLE_ARB@, etc)
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEX_W_FLOAT'@: the texture coordinate width of the texture (0.0 - 1.0)
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEX_H_FLOAT'@: the texture coordinate height of the texture (0.0 - 1.0)
+--
+--     With the opengles2 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER'@: the GLenum for the texture target (@GL_TEXTURE_2D@, @GL_TEXTURE_EXTERNAL_OES@, etc)
+--
+--     With the gpu renderer:
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_POINTER'@: the SDL_GPUTexture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER'@: the SDL_GPUTexture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER'@: the SDL_GPUTexture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER'@: the SDL_GPUTexture associated with the V plane of a YUV texture
+--
+--     [@texture@]: the texture to query.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTextureProperties@, defined at @SDL3\/SDL_render.h 935:46@
+sDL_GetTextureProperties
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetTextureProperties =
+  BG.unsafePerformIO hs_bindgen_becfaa2a4bff800b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRendererFromTexture@
+foreign import ccall unsafe "hs_bindgen_49dcd52c4c1d2b81"
+  hs_bindgen_49dcd52c4c1d2b81_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRendererFromTexture@
+hs_bindgen_49dcd52c4c1d2b81 :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> IO (BG.Ptr SDL_Renderer)))
+hs_bindgen_49dcd52c4c1d2b81 =
+  BG.fromFFIType hs_bindgen_49dcd52c4c1d2b81_base
+
+{-# NOINLINE sDL_GetRendererFromTexture #-}
+
+-- | Get the renderer that created an 'SDL_Texture'.
+--
+--     [@texture@]: the texture to query.
+--
+--     [Returns]: a pointer to the 'SDL_Renderer' that created the texture, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRendererFromTexture@, defined at @SDL3\/SDL_render.h 979:44@
+sDL_GetRendererFromTexture :: BG.FunPtr (BG.Ptr SDL_Texture -> IO (BG.Ptr SDL_Renderer))
+sDL_GetRendererFromTexture =
+  BG.unsafePerformIO hs_bindgen_49dcd52c4c1d2b81
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureSize@
+foreign import ccall unsafe "hs_bindgen_41cc657b23107c65"
+  hs_bindgen_41cc657b23107c65_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureSize@
+hs_bindgen_41cc657b23107c65
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool))
+hs_bindgen_41cc657b23107c65 =
+  BG.fromFFIType hs_bindgen_41cc657b23107c65_base
+
+{-# NOINLINE sDL_GetTextureSize #-}
+
+-- | Get the size of a texture, as floating point values.
+--
+--     [@texture@]: the texture to query.
+--
+--     [@w@]: a pointer filled in with the width of the texture in pixels. This argument can be NULL if you don\'t need this information.
+--
+--     [@h@]: a pointer filled in with the height of the texture in pixels. This argument can be NULL if you don\'t need this information.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTextureSize@, defined at @SDL3\/SDL_render.h 996:34@
+sDL_GetTextureSize
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool)
+sDL_GetTextureSize =
+  BG.unsafePerformIO hs_bindgen_41cc657b23107c65
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTexturePalette@
+foreign import ccall unsafe "hs_bindgen_2681f128241fbe43"
+  hs_bindgen_2681f128241fbe43_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTexturePalette@
+hs_bindgen_2681f128241fbe43
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette -> IO BG.CBool))
+hs_bindgen_2681f128241fbe43 =
+  BG.fromFFIType hs_bindgen_2681f128241fbe43_base
+
+{-# NOINLINE sDL_SetTexturePalette #-}
+
+-- | Set the palette used by a texture.
+--
+--     Setting the palette keeps an internal reference to the palette, which can be safely destroyed afterwards.
+--
+--     A single palette can be shared with many textures.
+--
+--     [@texture@]: the texture to update.
+--
+--     [@palette@]: the SDL_Palette structure to use.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: SDL_CreatePalette, 'sDL_GetTexturePalette'
+--
+--     [C declaration]: @SDL_SetTexturePalette@, defined at @SDL3\/SDL_render.h 1018:34@
+sDL_SetTexturePalette
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette -> IO BG.CBool)
+sDL_SetTexturePalette =
+  BG.unsafePerformIO hs_bindgen_2681f128241fbe43
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTexturePalette@
+foreign import ccall unsafe "hs_bindgen_5b5998bf3bb63e26"
+  hs_bindgen_5b5998bf3bb63e26_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTexturePalette@
+hs_bindgen_5b5998bf3bb63e26
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)))
+hs_bindgen_5b5998bf3bb63e26 =
+  BG.fromFFIType hs_bindgen_5b5998bf3bb63e26_base
+
+{-# NOINLINE sDL_GetTexturePalette #-}
+
+-- | Get the palette used by a texture.
+--
+--     [@texture@]: the texture to query.
+--
+--     [Returns]: a pointer to the palette used by the texture, or NULL if there is no palette used.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetTexturePalette'
+--
+--     [C declaration]: @SDL_GetTexturePalette@, defined at @SDL3\/SDL_render.h 1033:43@
+sDL_GetTexturePalette
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette))
+sDL_GetTexturePalette =
+  BG.unsafePerformIO hs_bindgen_5b5998bf3bb63e26
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureColorMod@
+foreign import ccall unsafe "hs_bindgen_12df54216376e2f6"
+  hs_bindgen_12df54216376e2f6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureColorMod@
+hs_bindgen_12df54216376e2f6
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Texture
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_12df54216376e2f6 =
+  BG.fromFFIType hs_bindgen_12df54216376e2f6_base
+
+{-# NOINLINE sDL_SetTextureColorMod #-}
+
+-- | Set an additional color value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * (color \/ 255)@
+--
+--     Color modulation is not always supported by the renderer; it will return false if color modulation is not supported.
+--
+--     [@texture@]: the texture to update.
+--
+--     [@r@]: the red color value multiplied into copy operations.
+--
+--     [@g@]: the green color value multiplied into copy operations.
+--
+--     [@b@]: the blue color value multiplied into copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureColorMod', 'sDL_SetTextureAlphaMod', 'sDL_SetTextureColorModFloat'
+--
+--     [C declaration]: @SDL_SetTextureColorMod@, defined at @SDL3\/SDL_render.h 1062:34@
+sDL_SetTextureColorMod
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Texture
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO BG.CBool
+       )
+sDL_SetTextureColorMod =
+  BG.unsafePerformIO hs_bindgen_12df54216376e2f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureColorModFloat@
+foreign import ccall unsafe "hs_bindgen_c199819113902151"
+  hs_bindgen_c199819113902151_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureColorModFloat@
+hs_bindgen_c199819113902151
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> BG.CFloat -> BG.CFloat -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_c199819113902151 =
+  BG.fromFFIType hs_bindgen_c199819113902151_base
+
+{-# NOINLINE sDL_SetTextureColorModFloat #-}
+
+-- | Set an additional color value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * color@
+--
+--     Color modulation is not always supported by the renderer; it will return false if color modulation is not supported.
+--
+--     [@texture@]: the texture to update.
+--
+--     [@r@]: the red color value multiplied into copy operations.
+--
+--     [@g@]: the green color value multiplied into copy operations.
+--
+--     [@b@]: the blue color value multiplied into copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureColorModFloat', 'sDL_SetTextureAlphaModFloat', 'sDL_SetTextureColorMod'
+--
+--     [C declaration]: @SDL_SetTextureColorModFloat@, defined at @SDL3\/SDL_render.h 1092:34@
+sDL_SetTextureColorModFloat
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> BG.CFloat -> BG.CFloat -> BG.CFloat -> IO BG.CBool)
+sDL_SetTextureColorModFloat =
+  BG.unsafePerformIO hs_bindgen_c199819113902151
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureColorMod@
+foreign import ccall unsafe "hs_bindgen_42ffa79ca220e7c4"
+  hs_bindgen_42ffa79ca220e7c4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureColorMod@
+hs_bindgen_42ffa79ca220e7c4
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Texture
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_42ffa79ca220e7c4 =
+  BG.fromFFIType hs_bindgen_42ffa79ca220e7c4_base
+
+{-# NOINLINE sDL_GetTextureColorMod #-}
+
+-- | Get the additional color value multiplied into render copy operations.
+--
+--     [@texture@]: the texture to query.
+--
+--     [@r@]: a pointer filled in with the current red color value.
+--
+--     [@g@]: a pointer filled in with the current green color value.
+--
+--     [@b@]: a pointer filled in with the current blue color value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaMod', 'sDL_GetTextureColorModFloat', 'sDL_SetTextureColorMod'
+--
+--     [C declaration]: @SDL_GetTextureColorMod@, defined at @SDL3\/SDL_render.h 1113:34@
+sDL_GetTextureColorMod
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Texture
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO BG.CBool
+       )
+sDL_GetTextureColorMod =
+  BG.unsafePerformIO hs_bindgen_42ffa79ca220e7c4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureColorModFloat@
+foreign import ccall unsafe "hs_bindgen_c18cd7bc6e616874"
+  hs_bindgen_c18cd7bc6e616874_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureColorModFloat@
+hs_bindgen_c18cd7bc6e616874
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Texture -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool)
+       )
+hs_bindgen_c18cd7bc6e616874 =
+  BG.fromFFIType hs_bindgen_c18cd7bc6e616874_base
+
+{-# NOINLINE sDL_GetTextureColorModFloat #-}
+
+-- | Get the additional color value multiplied into render copy operations.
+--
+--     [@texture@]: the texture to query.
+--
+--     [@r@]: a pointer filled in with the current red color value.
+--
+--     [@g@]: a pointer filled in with the current green color value.
+--
+--     [@b@]: a pointer filled in with the current blue color value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaModFloat', 'sDL_GetTextureColorMod', 'sDL_SetTextureColorModFloat'
+--
+--     [C declaration]: @SDL_GetTextureColorModFloat@, defined at @SDL3\/SDL_render.h 1133:34@
+sDL_GetTextureColorModFloat
+  :: BG.FunPtr
+       (BG.Ptr SDL_Texture -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool)
+sDL_GetTextureColorModFloat =
+  BG.unsafePerformIO hs_bindgen_c18cd7bc6e616874
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureAlphaMod@
+foreign import ccall unsafe "hs_bindgen_206ed15266a6abc6"
+  hs_bindgen_206ed15266a6abc6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureAlphaMod@
+hs_bindgen_206ed15266a6abc6
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool))
+hs_bindgen_206ed15266a6abc6 =
+  BG.fromFFIType hs_bindgen_206ed15266a6abc6_base
+
+{-# NOINLINE sDL_SetTextureAlphaMod #-}
+
+-- | Set an additional alpha value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * (alpha \/ 255)@
+--
+--     Alpha modulation is not always supported by the renderer; it will return false if alpha modulation is not supported.
+--
+--     [@texture@]: the texture to update.
+--
+--     [@alpha@]: the source alpha value multiplied into copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaMod', 'sDL_SetTextureAlphaModFloat', 'sDL_SetTextureColorMod'
+--
+--     [C declaration]: @SDL_SetTextureAlphaMod@, defined at @SDL3\/SDL_render.h 1159:34@
+sDL_SetTextureAlphaMod
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool)
+sDL_SetTextureAlphaMod =
+  BG.unsafePerformIO hs_bindgen_206ed15266a6abc6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureAlphaModFloat@
+foreign import ccall unsafe "hs_bindgen_497b70cfcdb285b3"
+  hs_bindgen_497b70cfcdb285b3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureAlphaModFloat@
+hs_bindgen_497b70cfcdb285b3 :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_497b70cfcdb285b3 =
+  BG.fromFFIType hs_bindgen_497b70cfcdb285b3_base
+
+{-# NOINLINE sDL_SetTextureAlphaModFloat #-}
+
+-- | Set an additional alpha value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * alpha@
+--
+--     Alpha modulation is not always supported by the renderer; it will return false if alpha modulation is not supported.
+--
+--     [@texture@]: the texture to update.
+--
+--     [@alpha@]: the source alpha value multiplied into copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaModFloat', 'sDL_SetTextureAlphaMod', 'sDL_SetTextureColorModFloat'
+--
+--     [C declaration]: @SDL_SetTextureAlphaModFloat@, defined at @SDL3\/SDL_render.h 1185:34@
+sDL_SetTextureAlphaModFloat :: BG.FunPtr (BG.Ptr SDL_Texture -> BG.CFloat -> IO BG.CBool)
+sDL_SetTextureAlphaModFloat =
+  BG.unsafePerformIO hs_bindgen_497b70cfcdb285b3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureAlphaMod@
+foreign import ccall unsafe "hs_bindgen_328f278f9cc361c9"
+  hs_bindgen_328f278f9cc361c9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureAlphaMod@
+hs_bindgen_328f278f9cc361c9
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool))
+hs_bindgen_328f278f9cc361c9 =
+  BG.fromFFIType hs_bindgen_328f278f9cc361c9_base
+
+{-# NOINLINE sDL_GetTextureAlphaMod #-}
+
+-- | Get the additional alpha value multiplied into render copy operations.
+--
+--     [@texture@]: the texture to query.
+--
+--     [@alpha@]: a pointer filled in with the current alpha value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaModFloat', 'sDL_GetTextureColorMod', 'sDL_SetTextureAlphaMod'
+--
+--     [C declaration]: @SDL_GetTextureAlphaMod@, defined at @SDL3\/SDL_render.h 1203:34@
+sDL_GetTextureAlphaMod
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool)
+sDL_GetTextureAlphaMod =
+  BG.unsafePerformIO hs_bindgen_328f278f9cc361c9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureAlphaModFloat@
+foreign import ccall unsafe "hs_bindgen_00ee88c364b7b54b"
+  hs_bindgen_00ee88c364b7b54b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureAlphaModFloat@
+hs_bindgen_00ee88c364b7b54b
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr BG.CFloat -> IO BG.CBool))
+hs_bindgen_00ee88c364b7b54b =
+  BG.fromFFIType hs_bindgen_00ee88c364b7b54b_base
+
+{-# NOINLINE sDL_GetTextureAlphaModFloat #-}
+
+-- | Get the additional alpha value multiplied into render copy operations.
+--
+--     [@texture@]: the texture to query.
+--
+--     [@alpha@]: a pointer filled in with the current alpha value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaMod', 'sDL_GetTextureColorModFloat', 'sDL_SetTextureAlphaModFloat'
+--
+--     [C declaration]: @SDL_GetTextureAlphaModFloat@, defined at @SDL3\/SDL_render.h 1221:34@
+sDL_GetTextureAlphaModFloat :: BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr BG.CFloat -> IO BG.CBool)
+sDL_GetTextureAlphaModFloat =
+  BG.unsafePerformIO hs_bindgen_00ee88c364b7b54b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureBlendMode@
+foreign import ccall unsafe "hs_bindgen_8b3403b14f9cc34f"
+  hs_bindgen_8b3403b14f9cc34f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureBlendMode@
+hs_bindgen_8b3403b14f9cc34f
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool))
+hs_bindgen_8b3403b14f9cc34f =
+  BG.fromFFIType hs_bindgen_8b3403b14f9cc34f_base
+
+{-# NOINLINE sDL_SetTextureBlendMode #-}
+
+-- | Set the blend mode for a texture, used by @SDL_RenderTexture()@.
+--
+--     If the blend mode is not supported, the closest supported mode is chosen and this function returns false.
+--
+--     [@texture@]: the texture to update.
+--
+--     [@blendMode@]: the SDL_BlendMode to use for texture blending.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureBlendMode'
+--
+--     [C declaration]: @SDL_SetTextureBlendMode@, defined at @SDL3\/SDL_render.h 1240:34@
+sDL_SetTextureBlendMode
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool)
+sDL_SetTextureBlendMode =
+  BG.unsafePerformIO hs_bindgen_8b3403b14f9cc34f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureBlendMode@
+foreign import ccall unsafe "hs_bindgen_e63bcb75e534a9b1"
+  hs_bindgen_e63bcb75e534a9b1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureBlendMode@
+hs_bindgen_e63bcb75e534a9b1
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool))
+hs_bindgen_e63bcb75e534a9b1 =
+  BG.fromFFIType hs_bindgen_e63bcb75e534a9b1_base
+
+{-# NOINLINE sDL_GetTextureBlendMode #-}
+
+-- | Get the blend mode used for texture copy operations.
+--
+--     [@texture@]: the texture to query.
+--
+--     [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextureBlendMode'
+--
+--     [C declaration]: @SDL_GetTextureBlendMode@, defined at @SDL3\/SDL_render.h 1256:34@
+sDL_GetTextureBlendMode
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool)
+sDL_GetTextureBlendMode =
+  BG.unsafePerformIO hs_bindgen_e63bcb75e534a9b1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureScaleMode@
+foreign import ccall unsafe "hs_bindgen_b562cc4d76d8ed23"
+  hs_bindgen_b562cc4d76d8ed23_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetTextureScaleMode@
+hs_bindgen_b562cc4d76d8ed23
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode -> IO BG.CBool))
+hs_bindgen_b562cc4d76d8ed23 =
+  BG.fromFFIType hs_bindgen_b562cc4d76d8ed23_base
+
+{-# NOINLINE sDL_SetTextureScaleMode #-}
+
+-- | Set the scale mode used for texture scale operations.
+--
+--     The default texture scale mode is SDL_SCALEMODE_LINEAR.
+--
+--     If the scale mode is not supported, the closest supported mode is chosen.
+--
+--     [@texture@]: the texture to update.
+--
+--     [@scaleMode@]: the SDL_ScaleMode to use for texture scaling.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureScaleMode'
+--
+--     [C declaration]: @SDL_SetTextureScaleMode@, defined at @SDL3\/SDL_render.h 1276:34@
+sDL_SetTextureScaleMode
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode -> IO BG.CBool)
+sDL_SetTextureScaleMode =
+  BG.unsafePerformIO hs_bindgen_b562cc4d76d8ed23
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureScaleMode@
+foreign import ccall unsafe "hs_bindgen_01d80174738edcf8"
+  hs_bindgen_01d80174738edcf8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetTextureScaleMode@
+hs_bindgen_01d80174738edcf8
+  :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode -> IO BG.CBool))
+hs_bindgen_01d80174738edcf8 =
+  BG.fromFFIType hs_bindgen_01d80174738edcf8_base
+
+{-# NOINLINE sDL_GetTextureScaleMode #-}
+
+-- | Get the scale mode used for texture scale operations.
+--
+--     [@texture@]: the texture to query.
+--
+--     [@scaleMode@]: a pointer filled in with the current scale mode.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextureScaleMode'
+--
+--     [C declaration]: @SDL_GetTextureScaleMode@, defined at @SDL3\/SDL_render.h 1292:34@
+sDL_GetTextureScaleMode
+  :: BG.FunPtr (BG.Ptr SDL_Texture -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode -> IO BG.CBool)
+sDL_GetTextureScaleMode =
+  BG.unsafePerformIO hs_bindgen_01d80174738edcf8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UpdateTexture@
+foreign import ccall unsafe "hs_bindgen_ed82660a3a2952a3"
+  hs_bindgen_ed82660a3a2952a3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UpdateTexture@
+hs_bindgen_ed82660a3a2952a3
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> PtrConst.PtrConst BG.Void
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_ed82660a3a2952a3 =
+  BG.fromFFIType hs_bindgen_ed82660a3a2952a3_base
+
+{-# NOINLINE sDL_UpdateTexture #-}
+
+-- | Update the given texture rectangle with new pixel data.
+--
+--     The pixel data must be in the pixel format of the texture, which can be queried using the SDL_PROP_TEXTURE_FORMAT_NUMBER property.
+--
+--     This is a fairly slow function, intended for use with static textures that do not change often.
+--
+--     If the texture is intended to be updated often, it is preferred to create the texture as streaming and use the locking functions referenced below. While this function will work with streaming textures, for optimization reasons you may not get the pixels back if you lock the texture afterward.
+--
+--     [@texture@]: the texture to update.
+--
+--     [@rect@]: an SDL_Rect structure representing the area to update, or NULL to update the entire texture.
+--
+--     [@pixels@]: the raw pixel data in the format of the texture.
+--
+--     [@pitch@]: the number of bytes in a row of pixel data, including padding between lines.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTexture', 'sDL_UnlockTexture', 'sDL_UpdateNVTexture', 'sDL_UpdateYUVTexture'
+--
+--     [C declaration]: @SDL_UpdateTexture@, defined at @SDL3\/SDL_render.h 1326:34@
+sDL_UpdateTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> PtrConst.PtrConst BG.Void
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_UpdateTexture =
+  BG.unsafePerformIO hs_bindgen_ed82660a3a2952a3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UpdateYUVTexture@
+foreign import ccall unsafe "hs_bindgen_ccf06645aeb6e433"
+  hs_bindgen_ccf06645aeb6e433_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UpdateYUVTexture@
+hs_bindgen_ccf06645aeb6e433
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.CInt
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.CInt
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_ccf06645aeb6e433 =
+  BG.fromFFIType hs_bindgen_ccf06645aeb6e433_base
+
+{-# NOINLINE sDL_UpdateYUVTexture #-}
+
+-- | Update a rectangle within a planar YV12 or IYUV texture with new pixel data.
+--
+--     You can use @SDL_UpdateTexture()@ as long as your pixel data is a contiguous block of Y and U\/V planes in the proper order, but this function is available if your pixel data is not contiguous.
+--
+--     [@texture@]: the texture to update.
+--
+--     [@rect@]: a pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+--
+--     [@Yplane@]: the raw pixel data for the Y plane.
+--
+--     [@Ypitch@]: the number of bytes between rows of pixel data for the Y plane.
+--
+--     [@Uplane@]: the raw pixel data for the U plane.
+--
+--     [@Upitch@]: the number of bytes between rows of pixel data for the U plane.
+--
+--     [@Vplane@]: the raw pixel data for the V plane.
+--
+--     [@Vpitch@]: the number of bytes between rows of pixel data for the V plane.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UpdateNVTexture', 'sDL_UpdateTexture'
+--
+--     [C declaration]: @SDL_UpdateYUVTexture@, defined at @SDL3\/SDL_render.h 1358:34@
+sDL_UpdateYUVTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.CInt
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.CInt
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_UpdateYUVTexture =
+  BG.unsafePerformIO hs_bindgen_ccf06645aeb6e433
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UpdateNVTexture@
+foreign import ccall unsafe "hs_bindgen_25fc8b2ffc040564"
+  hs_bindgen_25fc8b2ffc040564_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UpdateNVTexture@
+hs_bindgen_25fc8b2ffc040564
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.CInt
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_25fc8b2ffc040564 =
+  BG.fromFFIType hs_bindgen_25fc8b2ffc040564_base
+
+{-# NOINLINE sDL_UpdateNVTexture #-}
+
+-- | Update a rectangle within a planar NV12 or NV21 texture with new pixels.
+--
+--     You can use @SDL_UpdateTexture()@ as long as your pixel data is a contiguous block of NV12\/21 planes in the proper order, but this function is available if your pixel data is not contiguous.
+--
+--     [@texture@]: the texture to update.
+--
+--     [@rect@]: a pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+--
+--     [@Yplane@]: the raw pixel data for the Y plane.
+--
+--     [@Ypitch@]: the number of bytes between rows of pixel data for the Y plane.
+--
+--     [@UVplane@]: the raw pixel data for the UV plane.
+--
+--     [@UVpitch@]: the number of bytes between rows of pixel data for the UV plane.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UpdateTexture', 'sDL_UpdateYUVTexture'
+--
+--     [C declaration]: @SDL_UpdateNVTexture@, defined at @SDL3\/SDL_render.h 1390:34@
+sDL_UpdateNVTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.CInt
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_UpdateNVTexture =
+  BG.unsafePerformIO hs_bindgen_25fc8b2ffc040564
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_LockTexture@
+foreign import ccall unsafe "hs_bindgen_b2515cb3b400f701"
+  hs_bindgen_b2515cb3b400f701_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_LockTexture@
+hs_bindgen_b2515cb3b400f701
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.Ptr (BG.Ptr BG.Void)
+             -> BG.Ptr BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_b2515cb3b400f701 =
+  BG.fromFFIType hs_bindgen_b2515cb3b400f701_base
+
+{-# NOINLINE sDL_LockTexture #-}
+
+-- | Lock a portion of the texture for __write-only__ pixel access.
+--
+--     As an optimization, the pixels made available for editing don\'t necessarily contain the old texture data. This is a write-only operation, and if you need to keep a copy of the texture data you should do that at the application level.
+--
+--     You must use @SDL_UnlockTexture()@ to unlock the pixels and apply any changes.
+--
+--     [@texture@]: the texture to lock for access, which was created with @SDL_TEXTUREACCESS_STREAMING@.
+--
+--     [@rect@]: an SDL_Rect structure representing the area to lock for access; NULL to lock the entire texture.
+--
+--     [@pixels@]: this is filled in with a pointer to the locked pixels, appropriately offset by the locked area.
+--
+--     [@pitch@]: this is filled in with the pitch of the locked pixels; the pitch is the length of one row in bytes.
+--
+--     [Returns]: true on success or false if the texture is not valid or was not created with @SDL_TEXTUREACCESS_STREAMING@; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTextureToSurface', 'sDL_UnlockTexture'
+--
+--     [C declaration]: @SDL_LockTexture@, defined at @SDL3\/SDL_render.h 1425:34@
+sDL_LockTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.Ptr (BG.Ptr BG.Void)
+         -> BG.Ptr BG.CInt
+         -> IO BG.CBool
+       )
+sDL_LockTexture =
+  BG.unsafePerformIO hs_bindgen_b2515cb3b400f701
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_LockTextureToSurface@
+foreign import ccall unsafe "hs_bindgen_232feaed95772158"
+  hs_bindgen_232feaed95772158_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_LockTextureToSurface@
+hs_bindgen_232feaed95772158
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_232feaed95772158 =
+  BG.fromFFIType hs_bindgen_232feaed95772158_base
+
+{-# NOINLINE sDL_LockTextureToSurface #-}
+
+-- | Lock a portion of the texture for __write-only__ pixel access, and expose it as a SDL surface.
+--
+--     Besides providing an SDL_Surface instead of raw pixel data, this function operates like SDL_LockTexture.
+--
+--     As an optimization, the pixels made available for editing don\'t necessarily contain the old texture data. This is a write-only operation, and if you need to keep a copy of the texture data you should do that at the application level.
+--
+--     You must use @SDL_UnlockTexture()@ to unlock the pixels and apply any changes.
+--
+--     The returned surface is freed internally after calling @SDL_UnlockTexture()@ or @SDL_DestroyTexture()@. The caller should not free it.
+--
+--     [@texture@]: the texture to lock for access, which must be created with @SDL_TEXTUREACCESS_STREAMING@.
+--
+--     [@rect@]: a pointer to the rectangle to lock for access. If the rect is NULL, the entire texture will be locked.
+--
+--     [@surface@]: a pointer to an SDL surface of size __rect__. Don\'t assume any specific pixel content.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTexture', 'sDL_UnlockTexture'
+--
+--     [C declaration]: @SDL_LockTextureToSurface@, defined at @SDL3\/SDL_render.h 1463:34@
+sDL_LockTextureToSurface
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+         -> IO BG.CBool
+       )
+sDL_LockTextureToSurface =
+  BG.unsafePerformIO hs_bindgen_232feaed95772158
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UnlockTexture@
+foreign import ccall unsafe "hs_bindgen_13908e9a60424294"
+  hs_bindgen_13908e9a60424294_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_UnlockTexture@
+hs_bindgen_13908e9a60424294 :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> IO ()))
+hs_bindgen_13908e9a60424294 =
+  BG.fromFFIType hs_bindgen_13908e9a60424294_base
+
+{-# NOINLINE sDL_UnlockTexture #-}
+
+-- | Unlock a texture, uploading the changes to video memory, if needed.
+--
+--     __Warning__: Please note that @SDL_LockTexture()@ is intended to be write-only; it will not guarantee the previous contents of the texture will be provided. You must fully initialize any area of a texture that you lock before unlocking it, as the pixels might otherwise be uninitialized memory.
+--
+--     Which is to say: locking and immediately unlocking a texture can result in corrupted textures, depending on the renderer in use.
+--
+--     [@texture@]: a texture locked by @SDL_LockTexture()@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTexture'
+--
+--     [C declaration]: @SDL_UnlockTexture@, defined at @SDL3\/SDL_render.h 1484:34@
+sDL_UnlockTexture :: BG.FunPtr (BG.Ptr SDL_Texture -> IO ())
+sDL_UnlockTexture =
+  BG.unsafePerformIO hs_bindgen_13908e9a60424294
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderTarget@
+foreign import ccall unsafe "hs_bindgen_bf0b26dd5575e7f4"
+  hs_bindgen_bf0b26dd5575e7f4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderTarget@
+hs_bindgen_bf0b26dd5575e7f4
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL_Texture -> IO BG.CBool))
+hs_bindgen_bf0b26dd5575e7f4 =
+  BG.fromFFIType hs_bindgen_bf0b26dd5575e7f4_base
+
+{-# NOINLINE sDL_SetRenderTarget #-}
+
+-- | Set a texture as the current rendering target.
+--
+--     The default render target is the window for which the renderer was created. To stop rendering to a texture and render to the window again, call this function with a NULL @texture@.
+--
+--     Viewport, cliprect, scale, and logical presentation are unique to each render target. Get and set functions for these states apply to the current render target set by this function, and those states persist on each target when the current render target changes.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@texture@]: the targeted texture, which must be created with the @SDL_TEXTUREACCESS_TARGET@ flag, or NULL to render to the window instead of a texture.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderTarget'
+--
+--     [C declaration]: @SDL_SetRenderTarget@, defined at @SDL3\/SDL_render.h 1511:34@
+sDL_SetRenderTarget :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL_Texture -> IO BG.CBool)
+sDL_SetRenderTarget =
+  BG.unsafePerformIO hs_bindgen_bf0b26dd5575e7f4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderTarget@
+foreign import ccall unsafe "hs_bindgen_1e8b9f67ad2f60e0"
+  hs_bindgen_1e8b9f67ad2f60e0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderTarget@
+hs_bindgen_1e8b9f67ad2f60e0 :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO (BG.Ptr SDL_Texture)))
+hs_bindgen_1e8b9f67ad2f60e0 =
+  BG.fromFFIType hs_bindgen_1e8b9f67ad2f60e0_base
+
+{-# NOINLINE sDL_GetRenderTarget #-}
+
+-- | Get the current render target.
+--
+--     The default render target is the window for which the renderer was created, and is reported a NULL here.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [Returns]: the current render target or NULL for the default render target.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderTarget'
+--
+--     [C declaration]: @SDL_GetRenderTarget@, defined at @SDL3\/SDL_render.h 1528:43@
+sDL_GetRenderTarget :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO (BG.Ptr SDL_Texture))
+sDL_GetRenderTarget =
+  BG.unsafePerformIO hs_bindgen_1e8b9f67ad2f60e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderLogicalPresentation@
+foreign import ccall unsafe "hs_bindgen_1034cb11879afccd"
+  hs_bindgen_1034cb11879afccd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderLogicalPresentation@
+hs_bindgen_1034cb11879afccd
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> BG.CInt -> BG.CInt -> SDL_RendererLogicalPresentation -> IO BG.CBool)
+       )
+hs_bindgen_1034cb11879afccd =
+  BG.fromFFIType hs_bindgen_1034cb11879afccd_base
+
+{-# NOINLINE sDL_SetRenderLogicalPresentation #-}
+
+-- | Set a device-independent resolution and presentation mode for rendering.
+--
+--     This function sets the width and height of the logical rendering output. The renderer will act as if the current render target is always the requested dimensions, scaling to the actual resolution as necessary.
+--
+--     This can be useful for games that expect a fixed size, but would like to scale the output to whatever is available, regardless of how a user resizes a window, or if the display is high DPI.
+--
+--     Logical presentation can be used with both render target textures and the renderer\'s window; the state is unique to each render target, and this function sets the state for the current render target. It might be useful to draw to a texture that matches the window dimensions with logical presentation enabled, and then draw that texture across the entire window with logical presentation disabled. Be careful not to render both with logical presentation enabled, however, as this could produce double-letterboxing, etc.
+--
+--     You can disable logical coordinates by setting the mode to SDL_LOGICAL_PRESENTATION_DISABLED, and in that case you get the full pixel resolution of the render target; it is safe to toggle logical presentation during the rendering of a frame: perhaps most of the rendering is done to specific dimensions but to make fonts look sharp, the app turns off logical presentation while drawing text, for example.
+--
+--     You can convert coordinates in an event into rendering coordinates using @SDL_ConvertEventToRenderCoordinates()@.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@w@]: the width of the logical resolution.
+--
+--     [@h@]: the height of the logical resolution.
+--
+--     [@mode@]: the presentation mode used.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertEventToRenderCoordinates', 'sDL_GetRenderLogicalPresentation', 'sDL_GetRenderLogicalPresentationRect'
+--
+--     [C declaration]: @SDL_SetRenderLogicalPresentation@, defined at @SDL3\/SDL_render.h 1575:34@
+sDL_SetRenderLogicalPresentation
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> BG.CInt -> BG.CInt -> SDL_RendererLogicalPresentation -> IO BG.CBool)
+sDL_SetRenderLogicalPresentation =
+  BG.unsafePerformIO hs_bindgen_1034cb11879afccd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderLogicalPresentation@
+foreign import ccall unsafe "hs_bindgen_d91c953c563a7c79"
+  hs_bindgen_d91c953c563a7c79_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderLogicalPresentation@
+hs_bindgen_d91c953c563a7c79
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr BG.CInt
+             -> BG.Ptr BG.CInt
+             -> BG.Ptr SDL_RendererLogicalPresentation
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_d91c953c563a7c79 =
+  BG.fromFFIType hs_bindgen_d91c953c563a7c79_base
+
+{-# NOINLINE sDL_GetRenderLogicalPresentation #-}
+
+-- | Get device independent resolution and presentation mode for rendering.
+--
+--     This function gets the width and height of the logical rendering output, or 0 if a logical resolution is not enabled.
+--
+--     Each render target has its own logical presentation state. This function gets the state for the current render target.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@w@]: an int filled with the logical presentation width.
+--
+--     [@h@]: an int filled with the logical presentation height.
+--
+--     [@mode@]: a variable filled with the logical presentation mode being used.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation'
+--
+--     [C declaration]: @SDL_GetRenderLogicalPresentation@, defined at @SDL3\/SDL_render.h 1600:34@
+sDL_GetRenderLogicalPresentation
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr BG.CInt
+         -> BG.Ptr BG.CInt
+         -> BG.Ptr SDL_RendererLogicalPresentation
+         -> IO BG.CBool
+       )
+sDL_GetRenderLogicalPresentation =
+  BG.unsafePerformIO hs_bindgen_d91c953c563a7c79
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderLogicalPresentationRect@
+foreign import ccall unsafe "hs_bindgen_79882ebc0cf55c2f"
+  hs_bindgen_79882ebc0cf55c2f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderLogicalPresentationRect@
+hs_bindgen_79882ebc0cf55c2f
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_FRect -> IO BG.CBool))
+hs_bindgen_79882ebc0cf55c2f =
+  BG.fromFFIType hs_bindgen_79882ebc0cf55c2f_base
+
+{-# NOINLINE sDL_GetRenderLogicalPresentationRect #-}
+
+-- | Get the final presentation rectangle for rendering.
+--
+--     This function returns the calculated rectangle used for logical presentation, based on the presentation mode and output size. If logical presentation is disabled, it will fill the rectangle with the output size, in pixels.
+--
+--     Each render target has its own logical presentation state. This function gets the rectangle for the current render target.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@rect@]: a pointer filled in with the final presentation rectangle, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation'
+--
+--     [C declaration]: @SDL_GetRenderLogicalPresentationRect@, defined at @SDL3\/SDL_render.h 1625:34@
+sDL_GetRenderLogicalPresentationRect
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_FRect -> IO BG.CBool)
+sDL_GetRenderLogicalPresentationRect =
+  BG.unsafePerformIO hs_bindgen_79882ebc0cf55c2f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderCoordinatesFromWindow@
+foreign import ccall unsafe "hs_bindgen_fb7241e246ca7baf"
+  hs_bindgen_fb7241e246ca7baf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderCoordinatesFromWindow@
+hs_bindgen_fb7241e246ca7baf
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool)
+       )
+hs_bindgen_fb7241e246ca7baf =
+  BG.fromFFIType hs_bindgen_fb7241e246ca7baf_base
+
+{-# NOINLINE sDL_RenderCoordinatesFromWindow #-}
+
+-- | Get a point in render coordinates when given a point in window coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@window_x@]: the x coordinate in window coordinates.
+--
+--     [@window_y@]: the y coordinate in window coordinates.
+--
+--     [@x@]: a pointer filled with the x coordinate in render coordinates.
+--
+--     [@y@]: a pointer filled with the y coordinate in render coordinates.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation', 'sDL_SetRenderScale'
+--
+--     [C declaration]: @SDL_RenderCoordinatesFromWindow@, defined at @SDL3\/SDL_render.h 1652:34@
+sDL_RenderCoordinatesFromWindow
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool)
+sDL_RenderCoordinatesFromWindow =
+  BG.unsafePerformIO hs_bindgen_fb7241e246ca7baf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderCoordinatesToWindow@
+foreign import ccall unsafe "hs_bindgen_c7cc17f4dc614c4c"
+  hs_bindgen_c7cc17f4dc614c4c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderCoordinatesToWindow@
+hs_bindgen_c7cc17f4dc614c4c
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool)
+       )
+hs_bindgen_c7cc17f4dc614c4c =
+  BG.fromFFIType hs_bindgen_c7cc17f4dc614c4c_base
+
+{-# NOINLINE sDL_RenderCoordinatesToWindow #-}
+
+-- | Get a point in window coordinates when given a point in render coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@x@]: the x coordinate in render coordinates.
+--
+--     [@y@]: the y coordinate in render coordinates.
+--
+--     [@window_x@]: a pointer filled with the x coordinate in window coordinates.
+--
+--     [@window_y@]: a pointer filled with the y coordinate in window coordinates.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation', 'sDL_SetRenderScale', 'sDL_SetRenderViewport'
+--
+--     [C declaration]: @SDL_RenderCoordinatesToWindow@, defined at @SDL3\/SDL_render.h 1682:34@
+sDL_RenderCoordinatesToWindow
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool)
+sDL_RenderCoordinatesToWindow =
+  BG.unsafePerformIO hs_bindgen_c7cc17f4dc614c4c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_ConvertEventToRenderCoordinates@
+foreign import ccall unsafe "hs_bindgen_e37a0e30c32b51de"
+  hs_bindgen_e37a0e30c32b51de_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_ConvertEventToRenderCoordinates@
+hs_bindgen_e37a0e30c32b51de
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event -> IO BG.CBool))
+hs_bindgen_e37a0e30c32b51de =
+  BG.fromFFIType hs_bindgen_e37a0e30c32b51de_base
+
+{-# NOINLINE sDL_ConvertEventToRenderCoordinates #-}
+
+-- | Convert the coordinates in an event to render coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     Various event types are converted with this function: mouse, touch, pen, etc.
+--
+--     Touch coordinates are converted from normalized coordinates in the window to non-normalized rendering coordinates.
+--
+--     Relative mouse coordinates (xrel and yrel event fields) are /also/ converted. Applications that do not want these fields converted should use @SDL_RenderCoordinatesFromWindow()@ on the specific event fields instead of converting the entire event structure.
+--
+--     Once converted, coordinates may be outside the rendering area.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@event@]: the event to modify.
+--
+--     [Returns]: true if the event is converted or doesn\'t need conversion, or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderCoordinatesFromWindow'
+--
+--     [C declaration]: @SDL_ConvertEventToRenderCoordinates@, defined at @SDL3\/SDL_render.h 1718:34@
+sDL_ConvertEventToRenderCoordinates
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event -> IO BG.CBool)
+sDL_ConvertEventToRenderCoordinates =
+  BG.unsafePerformIO hs_bindgen_e37a0e30c32b51de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderViewport@
+foreign import ccall unsafe "hs_bindgen_787c931cd9718282"
+  hs_bindgen_787c931cd9718282_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderViewport@
+hs_bindgen_787c931cd9718282
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_787c931cd9718282 =
+  BG.fromFFIType hs_bindgen_787c931cd9718282_base
+
+{-# NOINLINE sDL_SetRenderViewport #-}
+
+-- | Set the drawing area for rendering on the current target.
+--
+--     Drawing will clip to this area (separately from any clipping done with SDL_SetRenderClipRect), and the top left of the area will become coordinate (0, 0) for future drawing commands.
+--
+--     The area\'s width and height must be >= 0.
+--
+--     Each render target has its own viewport. This function sets the viewport for the current render target.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@rect@]: the SDL_Rect structure representing the drawing area, or NULL to set the viewport to the entire target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderViewport', 'sDL_RenderViewportSet'
+--
+--     [C declaration]: @SDL_SetRenderViewport@, defined at @SDL3\/SDL_render.h 1745:34@
+sDL_SetRenderViewport
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_SetRenderViewport =
+  BG.unsafePerformIO hs_bindgen_787c931cd9718282
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderViewport@
+foreign import ccall unsafe "hs_bindgen_6aa5d786da4df5f2"
+  hs_bindgen_6aa5d786da4df5f2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderViewport@
+hs_bindgen_6aa5d786da4df5f2
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_6aa5d786da4df5f2 =
+  BG.fromFFIType hs_bindgen_6aa5d786da4df5f2_base
+
+{-# NOINLINE sDL_GetRenderViewport #-}
+
+-- | Get the drawing area for the current target.
+--
+--     Each render target has its own viewport. This function gets the viewport for the current render target.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@rect@]: an SDL_Rect structure filled in with the current drawing area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderViewportSet', 'sDL_SetRenderViewport'
+--
+--     [C declaration]: @SDL_GetRenderViewport@, defined at @SDL3\/SDL_render.h 1765:34@
+sDL_GetRenderViewport
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_GetRenderViewport =
+  BG.unsafePerformIO hs_bindgen_6aa5d786da4df5f2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderViewportSet@
+foreign import ccall unsafe "hs_bindgen_9ea268631b7b5e5b"
+  hs_bindgen_9ea268631b7b5e5b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderViewportSet@
+hs_bindgen_9ea268631b7b5e5b :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO BG.CBool))
+hs_bindgen_9ea268631b7b5e5b =
+  BG.fromFFIType hs_bindgen_9ea268631b7b5e5b_base
+
+{-# NOINLINE sDL_RenderViewportSet #-}
+
+-- | Return whether an explicit rectangle was set as the viewport.
+--
+--     This is useful if you\'re saving and restoring the viewport and want to know whether you should restore a specific rectangle or NULL.
+--
+--     Each render target has its own viewport. This function checks the viewport for the current render target.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [Returns]: true if the viewport was set to a specific rectangle, or false if it was set to NULL (the entire target).
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderViewport', 'sDL_SetRenderViewport'
+--
+--     [C declaration]: @SDL_RenderViewportSet@, defined at @SDL3\/SDL_render.h 1787:34@
+sDL_RenderViewportSet :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO BG.CBool)
+sDL_RenderViewportSet =
+  BG.unsafePerformIO hs_bindgen_9ea268631b7b5e5b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderSafeArea@
+foreign import ccall unsafe "hs_bindgen_892008c6b673220b"
+  hs_bindgen_892008c6b673220b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderSafeArea@
+hs_bindgen_892008c6b673220b
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_892008c6b673220b =
+  BG.fromFFIType hs_bindgen_892008c6b673220b_base
+
+{-# NOINLINE sDL_GetRenderSafeArea #-}
+
+-- | Get the safe area for rendering within the current viewport.
+--
+--     Some devices have portions of the screen which are partially obscured or not interactive, possibly due to on-screen controls, curved edges, camera notches, TV overscan, etc. This function provides the area of the current viewport which is safe to have interactible content. You should continue rendering into the rest of the render target, but it should not contain visually important or interactible content.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@rect@]: a pointer filled in with the area that is safe for interactive content.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRenderSafeArea@, defined at @SDL3\/SDL_render.h 1809:34@
+sDL_GetRenderSafeArea
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_GetRenderSafeArea =
+  BG.unsafePerformIO hs_bindgen_892008c6b673220b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderClipRect@
+foreign import ccall unsafe "hs_bindgen_3aa3a1e497542ee8"
+  hs_bindgen_3aa3a1e497542ee8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderClipRect@
+hs_bindgen_3aa3a1e497542ee8
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_3aa3a1e497542ee8 =
+  BG.fromFFIType hs_bindgen_3aa3a1e497542ee8_base
+
+{-# NOINLINE sDL_SetRenderClipRect #-}
+
+-- | Set the clip rectangle for rendering on the specified target.
+--
+--     Each render target has its own clip rectangle. This function sets the cliprect for the current render target.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@rect@]: an SDL_Rect structure representing the clip area, relative to the viewport, or NULL to disable clipping.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderClipRect', 'sDL_RenderClipEnabled'
+--
+--     [C declaration]: @SDL_SetRenderClipRect@, defined at @SDL3\/SDL_render.h 1830:34@
+sDL_SetRenderClipRect
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_SetRenderClipRect =
+  BG.unsafePerformIO hs_bindgen_3aa3a1e497542ee8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderClipRect@
+foreign import ccall unsafe "hs_bindgen_bec026baef17d1f2"
+  hs_bindgen_bec026baef17d1f2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderClipRect@
+hs_bindgen_bec026baef17d1f2
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_bec026baef17d1f2 =
+  BG.fromFFIType hs_bindgen_bec026baef17d1f2_base
+
+{-# NOINLINE sDL_GetRenderClipRect #-}
+
+-- | Get the clip rectangle for the current target.
+--
+--     Each render target has its own clip rectangle. This function gets the cliprect for the current render target.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@rect@]: an SDL_Rect structure filled in with the current clipping area or an empty rectangle if clipping is disabled.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderClipEnabled', 'sDL_SetRenderClipRect'
+--
+--     [C declaration]: @SDL_GetRenderClipRect@, defined at @SDL3\/SDL_render.h 1851:34@
+sDL_GetRenderClipRect
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_GetRenderClipRect =
+  BG.unsafePerformIO hs_bindgen_bec026baef17d1f2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderClipEnabled@
+foreign import ccall unsafe "hs_bindgen_b0a5efaab13d3303"
+  hs_bindgen_b0a5efaab13d3303_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderClipEnabled@
+hs_bindgen_b0a5efaab13d3303 :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO BG.CBool))
+hs_bindgen_b0a5efaab13d3303 =
+  BG.fromFFIType hs_bindgen_b0a5efaab13d3303_base
+
+{-# NOINLINE sDL_RenderClipEnabled #-}
+
+-- | Get whether clipping is enabled on the given render target.
+--
+--     Each render target has its own clip rectangle. This function checks the cliprect for the current render target.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [Returns]: true if clipping is enabled or false if not; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderClipRect', 'sDL_SetRenderClipRect'
+--
+--     [C declaration]: @SDL_RenderClipEnabled@, defined at @SDL3\/SDL_render.h 1870:34@
+sDL_RenderClipEnabled :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO BG.CBool)
+sDL_RenderClipEnabled =
+  BG.unsafePerformIO hs_bindgen_b0a5efaab13d3303
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderScale@
+foreign import ccall unsafe "hs_bindgen_938869c5ff233e71"
+  hs_bindgen_938869c5ff233e71_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderScale@
+hs_bindgen_938869c5ff233e71
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_938869c5ff233e71 =
+  BG.fromFFIType hs_bindgen_938869c5ff233e71_base
+
+{-# NOINLINE sDL_SetRenderScale #-}
+
+-- | Set the drawing scale for rendering on the current target.
+--
+--     The drawing coordinates are scaled by the x\/y scaling factors before they are used by the renderer. This allows resolution independent drawing with a single coordinate system.
+--
+--     If this results in scaling or subpixel drawing by the rendering backend, it will be handled using the appropriate quality hints. For best results use integer scaling factors.
+--
+--     Each render target has its own scale. This function sets the scale for the current render target.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@scaleX@]: the horizontal scaling factor.
+--
+--     [@scaleY@]: the vertical scaling factor.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderScale'
+--
+--     [C declaration]: @SDL_SetRenderScale@, defined at @SDL3\/SDL_render.h 1898:34@
+sDL_SetRenderScale :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> IO BG.CBool)
+sDL_SetRenderScale =
+  BG.unsafePerformIO hs_bindgen_938869c5ff233e71
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderScale@
+foreign import ccall unsafe "hs_bindgen_fa6a48d0e427bd48"
+  hs_bindgen_fa6a48d0e427bd48_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderScale@
+hs_bindgen_fa6a48d0e427bd48
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool))
+hs_bindgen_fa6a48d0e427bd48 =
+  BG.fromFFIType hs_bindgen_fa6a48d0e427bd48_base
+
+{-# NOINLINE sDL_GetRenderScale #-}
+
+-- | Get the drawing scale for the current target.
+--
+--     Each render target has its own scale. This function gets the scale for the current render target.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@scaleX@]: a pointer filled in with the horizontal scaling factor.
+--
+--     [@scaleY@]: a pointer filled in with the vertical scaling factor.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderScale'
+--
+--     [C declaration]: @SDL_GetRenderScale@, defined at @SDL3\/SDL_render.h 1918:34@
+sDL_GetRenderScale
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool)
+sDL_GetRenderScale =
+  BG.unsafePerformIO hs_bindgen_fa6a48d0e427bd48
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderDrawColor@
+foreign import ccall unsafe "hs_bindgen_cfcf753e753a9e88"
+  hs_bindgen_cfcf753e753a9e88_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderDrawColor@
+hs_bindgen_cfcf753e753a9e88
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_cfcf753e753a9e88 =
+  BG.fromFFIType hs_bindgen_cfcf753e753a9e88_base
+
+{-# NOINLINE sDL_SetRenderDrawColor #-}
+
+-- | Set the color used for drawing operations.
+--
+--     Set the color for drawing or filling rectangles, lines, and points, and for @SDL_RenderClear()@.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@r@]: the red value used to draw on the rendering target.
+--
+--     [@g@]: the green value used to draw on the rendering target.
+--
+--     [@b@]: the blue value used to draw on the rendering target.
+--
+--     [@a@]: the alpha value used to draw on the rendering target; usually @SDL_ALPHA_OPAQUE@ (255). Use SDL_SetRenderDrawBlendMode to specify how the alpha channel is used.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawColor', 'sDL_SetRenderDrawColorFloat'
+--
+--     [C declaration]: @SDL_SetRenderDrawColor@, defined at @SDL3\/SDL_render.h 1943:34@
+sDL_SetRenderDrawColor
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO BG.CBool
+       )
+sDL_SetRenderDrawColor =
+  BG.unsafePerformIO hs_bindgen_cfcf753e753a9e88
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderDrawColorFloat@
+foreign import ccall unsafe "hs_bindgen_99e499f38f3c9dc7"
+  hs_bindgen_99e499f38f3c9dc7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderDrawColorFloat@
+hs_bindgen_99e499f38f3c9dc7
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> BG.CFloat -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_99e499f38f3c9dc7 =
+  BG.fromFFIType hs_bindgen_99e499f38f3c9dc7_base
+
+{-# NOINLINE sDL_SetRenderDrawColorFloat #-}
+
+-- | Set the color used for drawing operations (Rect, Line and Clear).
+--
+--     Set the color for drawing or filling rectangles, lines, and points, and for @SDL_RenderClear()@.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@r@]: the red value used to draw on the rendering target.
+--
+--     [@g@]: the green value used to draw on the rendering target.
+--
+--     [@b@]: the blue value used to draw on the rendering target.
+--
+--     [@a@]: the alpha value used to draw on the rendering target. Use SDL_SetRenderDrawBlendMode to specify how the alpha channel is used.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawColorFloat', 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_SetRenderDrawColorFloat@, defined at @SDL3\/SDL_render.h 1968:34@
+sDL_SetRenderDrawColorFloat
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> BG.CFloat -> BG.CFloat -> IO BG.CBool)
+sDL_SetRenderDrawColorFloat =
+  BG.unsafePerformIO hs_bindgen_99e499f38f3c9dc7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDrawColor@
+foreign import ccall unsafe "hs_bindgen_c88d83e47700901b"
+  hs_bindgen_c88d83e47700901b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDrawColor@
+hs_bindgen_c88d83e47700901b
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_c88d83e47700901b =
+  BG.fromFFIType hs_bindgen_c88d83e47700901b_base
+
+{-# NOINLINE sDL_GetRenderDrawColor #-}
+
+-- | Get the color used for drawing operations (Rect, Line and Clear).
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@r@]: a pointer filled in with the red value used to draw on the rendering target.
+--
+--     [@g@]: a pointer filled in with the green value used to draw on the rendering target.
+--
+--     [@b@]: a pointer filled in with the blue value used to draw on the rendering target.
+--
+--     [@a@]: a pointer filled in with the alpha value used to draw on the rendering target; usually @SDL_ALPHA_OPAQUE@ (255).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawColorFloat', 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_GetRenderDrawColor@, defined at @SDL3\/SDL_render.h 1992:34@
+sDL_GetRenderDrawColor
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO BG.CBool
+       )
+sDL_GetRenderDrawColor =
+  BG.unsafePerformIO hs_bindgen_c88d83e47700901b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDrawColorFloat@
+foreign import ccall unsafe "hs_bindgen_d1473916ef27e20f"
+  hs_bindgen_d1473916ef27e20f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDrawColorFloat@
+hs_bindgen_d1473916ef27e20f
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_d1473916ef27e20f =
+  BG.fromFFIType hs_bindgen_d1473916ef27e20f_base
+
+{-# NOINLINE sDL_GetRenderDrawColorFloat #-}
+
+-- | Get the color used for drawing operations (Rect, Line and Clear).
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@r@]: a pointer filled in with the red value used to draw on the rendering target.
+--
+--     [@g@]: a pointer filled in with the green value used to draw on the rendering target.
+--
+--     [@b@]: a pointer filled in with the blue value used to draw on the rendering target.
+--
+--     [@a@]: a pointer filled in with the alpha value used to draw on the rendering target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderDrawColorFloat', 'sDL_GetRenderDrawColor'
+--
+--     [C declaration]: @SDL_GetRenderDrawColorFloat@, defined at @SDL3\/SDL_render.h 2016:34@
+sDL_GetRenderDrawColorFloat
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> IO BG.CBool
+       )
+sDL_GetRenderDrawColorFloat =
+  BG.unsafePerformIO hs_bindgen_d1473916ef27e20f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderColorScale@
+foreign import ccall unsafe "hs_bindgen_35d6252a1c594c7c"
+  hs_bindgen_35d6252a1c594c7c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderColorScale@
+hs_bindgen_35d6252a1c594c7c :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_35d6252a1c594c7c =
+  BG.fromFFIType hs_bindgen_35d6252a1c594c7c_base
+
+{-# NOINLINE sDL_SetRenderColorScale #-}
+
+-- | Set the color scale used for render operations.
+--
+--     The color scale is an additional scale multiplied into the pixel color value while rendering. This can be used to adjust the brightness of colors during HDR rendering, or changing HDR video brightness when playing on an SDR display.
+--
+--     The color scale does not affect the alpha channel, only the color brightness.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@scale@]: the color scale value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderColorScale'
+--
+--     [C declaration]: @SDL_SetRenderColorScale@, defined at @SDL3\/SDL_render.h 2040:34@
+sDL_SetRenderColorScale :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CFloat -> IO BG.CBool)
+sDL_SetRenderColorScale =
+  BG.unsafePerformIO hs_bindgen_35d6252a1c594c7c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderColorScale@
+foreign import ccall unsafe "hs_bindgen_77d1cf7afcbd4164"
+  hs_bindgen_77d1cf7afcbd4164_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderColorScale@
+hs_bindgen_77d1cf7afcbd4164
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr BG.CFloat -> IO BG.CBool))
+hs_bindgen_77d1cf7afcbd4164 =
+  BG.fromFFIType hs_bindgen_77d1cf7afcbd4164_base
+
+{-# NOINLINE sDL_GetRenderColorScale #-}
+
+-- | Get the color scale used for render operations.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@scale@]: a pointer filled in with the current color scale value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderColorScale'
+--
+--     [C declaration]: @SDL_GetRenderColorScale@, defined at @SDL3\/SDL_render.h 2056:34@
+sDL_GetRenderColorScale :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr BG.CFloat -> IO BG.CBool)
+sDL_GetRenderColorScale =
+  BG.unsafePerformIO hs_bindgen_77d1cf7afcbd4164
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderDrawBlendMode@
+foreign import ccall unsafe "hs_bindgen_820f982c1cc61a34"
+  hs_bindgen_820f982c1cc61a34_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderDrawBlendMode@
+hs_bindgen_820f982c1cc61a34
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool))
+hs_bindgen_820f982c1cc61a34 =
+  BG.fromFFIType hs_bindgen_820f982c1cc61a34_base
+
+{-# NOINLINE sDL_SetRenderDrawBlendMode #-}
+
+-- | Set the blend mode used for drawing operations (Fill and Line).
+--
+--     If the blend mode is not supported, the closest supported mode is chosen.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@blendMode@]: the SDL_BlendMode to use for blending.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawBlendMode'
+--
+--     [C declaration]: @SDL_SetRenderDrawBlendMode@, defined at @SDL3\/SDL_render.h 2074:34@
+sDL_SetRenderDrawBlendMode
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool)
+sDL_SetRenderDrawBlendMode =
+  BG.unsafePerformIO hs_bindgen_820f982c1cc61a34
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDrawBlendMode@
+foreign import ccall unsafe "hs_bindgen_1409781aca259b0a"
+  hs_bindgen_1409781aca259b0a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderDrawBlendMode@
+hs_bindgen_1409781aca259b0a
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool))
+hs_bindgen_1409781aca259b0a =
+  BG.fromFFIType hs_bindgen_1409781aca259b0a_base
+
+{-# NOINLINE sDL_GetRenderDrawBlendMode #-}
+
+-- | Get the blend mode used for drawing operations.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderDrawBlendMode'
+--
+--     [C declaration]: @SDL_GetRenderDrawBlendMode@, defined at @SDL3\/SDL_render.h 2090:34@
+sDL_GetRenderDrawBlendMode
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool)
+sDL_GetRenderDrawBlendMode =
+  BG.unsafePerformIO hs_bindgen_1409781aca259b0a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderClear@
+foreign import ccall unsafe "hs_bindgen_9a11c0e709a2af5e"
+  hs_bindgen_9a11c0e709a2af5e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderClear@
+hs_bindgen_9a11c0e709a2af5e :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO BG.CBool))
+hs_bindgen_9a11c0e709a2af5e =
+  BG.fromFFIType hs_bindgen_9a11c0e709a2af5e_base
+
+{-# NOINLINE sDL_RenderClear #-}
+
+-- | Clear the current rendering target with the drawing color.
+--
+--     This function clears the entire rendering target, ignoring the viewport and the clip rectangle. Note, that clearing will also set\/fill all pixels of the rendering target to current renderer draw color, so make sure to invoke @SDL_SetRenderDrawColor()@ when needed.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_RenderClear@, defined at @SDL3\/SDL_render.h 2110:34@
+sDL_RenderClear :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO BG.CBool)
+sDL_RenderClear =
+  BG.unsafePerformIO hs_bindgen_9a11c0e709a2af5e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderPoint@
+foreign import ccall unsafe "hs_bindgen_429122691f4ce0fc"
+  hs_bindgen_429122691f4ce0fc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderPoint@
+hs_bindgen_429122691f4ce0fc
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_429122691f4ce0fc =
+  BG.fromFFIType hs_bindgen_429122691f4ce0fc_base
+
+{-# NOINLINE sDL_RenderPoint #-}
+
+-- | Draw a point on the current rendering target at subpixel precision.
+--
+--     [@renderer@]: the renderer which should draw a point.
+--
+--     [@x@]: the x coordinate of the point.
+--
+--     [@y@]: the y coordinate of the point.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderPoints'
+--
+--     [C declaration]: @SDL_RenderPoint@, defined at @SDL3\/SDL_render.h 2127:34@
+sDL_RenderPoint :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> IO BG.CBool)
+sDL_RenderPoint =
+  BG.unsafePerformIO hs_bindgen_429122691f4ce0fc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderPoints@
+foreign import ccall unsafe "hs_bindgen_b884f579966e5db6"
+  hs_bindgen_b884f579966e5db6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderPoints@
+hs_bindgen_b884f579966e5db6
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint -> BG.CInt -> IO BG.CBool)
+       )
+hs_bindgen_b884f579966e5db6 =
+  BG.fromFFIType hs_bindgen_b884f579966e5db6_base
+
+{-# NOINLINE sDL_RenderPoints #-}
+
+-- | Draw multiple points on the current rendering target at subpixel precision.
+--
+--     [@renderer@]: the renderer which should draw multiple points.
+--
+--     [@points@]: the points to draw.
+--
+--     [@count@]: the number of points to draw.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderPoint'
+--
+--     [C declaration]: @SDL_RenderPoints@, defined at @SDL3\/SDL_render.h 2144:34@
+sDL_RenderPoints
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint -> BG.CInt -> IO BG.CBool)
+sDL_RenderPoints =
+  BG.unsafePerformIO hs_bindgen_b884f579966e5db6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderLine@
+foreign import ccall unsafe "hs_bindgen_ce6fb863b8b65fe2"
+  hs_bindgen_ce6fb863b8b65fe2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderLine@
+hs_bindgen_ce6fb863b8b65fe2
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> BG.CFloat -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_ce6fb863b8b65fe2 =
+  BG.fromFFIType hs_bindgen_ce6fb863b8b65fe2_base
+
+{-# NOINLINE sDL_RenderLine #-}
+
+-- | Draw a line on the current rendering target at subpixel precision.
+--
+--     [@renderer@]: the renderer which should draw a line.
+--
+--     [@x1@]: the x coordinate of the start point.
+--
+--     [@y1@]: the y coordinate of the start point.
+--
+--     [@x2@]: the x coordinate of the end point.
+--
+--     [@y2@]: the y coordinate of the end point.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderLines'
+--
+--     [C declaration]: @SDL_RenderLine@, defined at @SDL3\/SDL_render.h 2163:34@
+sDL_RenderLine
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> BG.CFloat -> BG.CFloat -> IO BG.CBool)
+sDL_RenderLine =
+  BG.unsafePerformIO hs_bindgen_ce6fb863b8b65fe2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderLines@
+foreign import ccall unsafe "hs_bindgen_f3578aa8a36fe364"
+  hs_bindgen_f3578aa8a36fe364_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderLines@
+hs_bindgen_f3578aa8a36fe364
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint -> BG.CInt -> IO BG.CBool)
+       )
+hs_bindgen_f3578aa8a36fe364 =
+  BG.fromFFIType hs_bindgen_f3578aa8a36fe364_base
+
+{-# NOINLINE sDL_RenderLines #-}
+
+-- | Draw a series of connected lines on the current rendering target at subpixel precision.
+--
+--     [@renderer@]: the renderer which should draw multiple lines.
+--
+--     [@points@]: the points along the lines.
+--
+--     [@count@]: the number of points, drawing count-1 lines.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderLine'
+--
+--     [C declaration]: @SDL_RenderLines@, defined at @SDL3\/SDL_render.h 2181:34@
+sDL_RenderLines
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint -> BG.CInt -> IO BG.CBool)
+sDL_RenderLines =
+  BG.unsafePerformIO hs_bindgen_f3578aa8a36fe364
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderRect@
+foreign import ccall unsafe "hs_bindgen_dc6b0741f1d79bee"
+  hs_bindgen_dc6b0741f1d79bee_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderRect@
+hs_bindgen_dc6b0741f1d79bee
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect -> IO BG.CBool))
+hs_bindgen_dc6b0741f1d79bee =
+  BG.fromFFIType hs_bindgen_dc6b0741f1d79bee_base
+
+{-# NOINLINE sDL_RenderRect #-}
+
+-- | Draw a rectangle on the current rendering target at subpixel precision.
+--
+--     [@renderer@]: the renderer which should draw a rectangle.
+--
+--     [@rect@]: a pointer to the destination rectangle, or NULL to outline the entire rendering target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderRects'
+--
+--     [C declaration]: @SDL_RenderRect@, defined at @SDL3\/SDL_render.h 2198:34@
+sDL_RenderRect
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect -> IO BG.CBool)
+sDL_RenderRect =
+  BG.unsafePerformIO hs_bindgen_dc6b0741f1d79bee
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderRects@
+foreign import ccall unsafe "hs_bindgen_d697f94bacf56e0d"
+  hs_bindgen_d697f94bacf56e0d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderRects@
+hs_bindgen_d697f94bacf56e0d
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect -> BG.CInt -> IO BG.CBool)
+       )
+hs_bindgen_d697f94bacf56e0d =
+  BG.fromFFIType hs_bindgen_d697f94bacf56e0d_base
+
+{-# NOINLINE sDL_RenderRects #-}
+
+-- | Draw some number of rectangles on the current rendering target at subpixel precision.
+--
+--     [@renderer@]: the renderer which should draw multiple rectangles.
+--
+--     [@rects@]: a pointer to an array of destination rectangles.
+--
+--     [@count@]: the number of rectangles.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderRect'
+--
+--     [C declaration]: @SDL_RenderRects@, defined at @SDL3\/SDL_render.h 2216:34@
+sDL_RenderRects
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect -> BG.CInt -> IO BG.CBool)
+sDL_RenderRects =
+  BG.unsafePerformIO hs_bindgen_d697f94bacf56e0d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderFillRect@
+foreign import ccall unsafe "hs_bindgen_a730fe81c75d4472"
+  hs_bindgen_a730fe81c75d4472_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderFillRect@
+hs_bindgen_a730fe81c75d4472
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect -> IO BG.CBool))
+hs_bindgen_a730fe81c75d4472 =
+  BG.fromFFIType hs_bindgen_a730fe81c75d4472_base
+
+{-# NOINLINE sDL_RenderFillRect #-}
+
+-- | Fill a rectangle on the current rendering target with the drawing color at subpixel precision.
+--
+--     [@renderer@]: the renderer which should fill a rectangle.
+--
+--     [@rect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderFillRects'
+--
+--     [C declaration]: @SDL_RenderFillRect@, defined at @SDL3\/SDL_render.h 2234:34@
+sDL_RenderFillRect
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect -> IO BG.CBool)
+sDL_RenderFillRect =
+  BG.unsafePerformIO hs_bindgen_a730fe81c75d4472
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderFillRects@
+foreign import ccall unsafe "hs_bindgen_4cd330b36839141b"
+  hs_bindgen_4cd330b36839141b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderFillRects@
+hs_bindgen_4cd330b36839141b
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect -> BG.CInt -> IO BG.CBool)
+       )
+hs_bindgen_4cd330b36839141b =
+  BG.fromFFIType hs_bindgen_4cd330b36839141b_base
+
+{-# NOINLINE sDL_RenderFillRects #-}
+
+-- | Fill some number of rectangles on the current rendering target with the drawing color at subpixel precision.
+--
+--     [@renderer@]: the renderer which should fill multiple rectangles.
+--
+--     [@rects@]: a pointer to an array of destination rectangles.
+--
+--     [@count@]: the number of rectangles.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderFillRect'
+--
+--     [C declaration]: @SDL_RenderFillRects@, defined at @SDL3\/SDL_render.h 2252:34@
+sDL_RenderFillRects
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect -> BG.CInt -> IO BG.CBool)
+sDL_RenderFillRects =
+  BG.unsafePerformIO hs_bindgen_4cd330b36839141b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTexture@
+foreign import ccall unsafe "hs_bindgen_1f27c13075574257"
+  hs_bindgen_1f27c13075574257_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTexture@
+hs_bindgen_1f27c13075574257
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_1f27c13075574257 =
+  BG.fromFFIType hs_bindgen_1f27c13075574257_base
+
+{-# NOINLINE sDL_RenderTexture #-}
+
+-- | Copy a portion of the texture to the current rendering target at subpixel precision.
+--
+--     [@renderer@]: the renderer which should copy parts of a texture.
+--
+--     [@texture@]: the source texture.
+--
+--     [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+--
+--     [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTextureRotated', 'sDL_RenderTextureTiled'
+--
+--     [C declaration]: @SDL_RenderTexture@, defined at @SDL3\/SDL_render.h 2274:34@
+sDL_RenderTexture
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> IO BG.CBool
+       )
+sDL_RenderTexture =
+  BG.unsafePerformIO hs_bindgen_1f27c13075574257
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTextureRotated@
+foreign import ccall unsafe "hs_bindgen_3424943af047de83"
+  hs_bindgen_3424943af047de83_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTextureRotated@
+hs_bindgen_3424943af047de83
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> BG.CDouble
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+             -> SDL3.Sys.Bindgen.Surface.SDL_FlipMode
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_3424943af047de83 =
+  BG.fromFFIType hs_bindgen_3424943af047de83_base
+
+{-# NOINLINE sDL_RenderTextureRotated #-}
+
+-- | Copy a portion of the source texture to the current rendering target, with rotation and flipping, at subpixel precision.
+--
+--     [@renderer@]: the renderer which should copy parts of a texture.
+--
+--     [@texture@]: the source texture.
+--
+--     [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+--
+--     [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+--
+--     [@angle@]: an angle in degrees that indicates the rotation that will be applied to dstrect, rotating it in a clockwise direction.
+--
+--     [@center@]: a pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done around dstrect.w\/2, dstrect.h\/2).
+--
+--     [@flip@]: an SDL_FlipMode value stating which flipping actions should be performed on the texture.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture'
+--
+--     [C declaration]: @SDL_RenderTextureRotated@, defined at @SDL3\/SDL_render.h 2302:34@
+sDL_RenderTextureRotated
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> BG.CDouble
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+         -> SDL3.Sys.Bindgen.Surface.SDL_FlipMode
+         -> IO BG.CBool
+       )
+sDL_RenderTextureRotated =
+  BG.unsafePerformIO hs_bindgen_3424943af047de83
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTextureAffine@
+foreign import ccall unsafe "hs_bindgen_dd59e212bf7d116f"
+  hs_bindgen_dd59e212bf7d116f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTextureAffine@
+hs_bindgen_dd59e212bf7d116f
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_dd59e212bf7d116f =
+  BG.fromFFIType hs_bindgen_dd59e212bf7d116f_base
+
+{-# NOINLINE sDL_RenderTextureAffine #-}
+
+-- | Copy a portion of the source texture to the current rendering target, with affine transform, at subpixel precision.
+--
+--     [@renderer@]: the renderer which should copy parts of a texture.
+--
+--     [@texture@]: the source texture.
+--
+--     [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+--
+--     [@origin@]: a pointer to a point indicating where the top-left corner of srcrect should be mapped to, or NULL for the rendering target\'s origin.
+--
+--     [@right@]: a pointer to a point indicating where the top-right corner of srcrect should be mapped to, or NULL for the rendering target\'s top-right corner.
+--
+--     [@down@]: a pointer to a point indicating where the bottom-left corner of srcrect should be mapped to, or NULL for the rendering target\'s bottom-left corner.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: You may only call this function from the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture'
+--
+--     [C declaration]: @SDL_RenderTextureAffine@, defined at @SDL3\/SDL_render.h 2333:34@
+sDL_RenderTextureAffine
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+         -> IO BG.CBool
+       )
+sDL_RenderTextureAffine =
+  BG.unsafePerformIO hs_bindgen_dd59e212bf7d116f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTextureTiled@
+foreign import ccall unsafe "hs_bindgen_6cf4fce9a372af75"
+  hs_bindgen_6cf4fce9a372af75_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTextureTiled@
+hs_bindgen_6cf4fce9a372af75
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> BG.CFloat
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_6cf4fce9a372af75 =
+  BG.fromFFIType hs_bindgen_6cf4fce9a372af75_base
+
+{-# NOINLINE sDL_RenderTextureTiled #-}
+
+-- | Tile a portion of the texture to the current rendering target at subpixel precision.
+--
+--     The pixels in @srcrect@ will be repeated as many times as needed to completely fill @dstrect@.
+--
+--     [@renderer@]: the renderer which should copy parts of a texture.
+--
+--     [@texture@]: the source texture.
+--
+--     [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+--
+--     [@scale@]: the scale used to transform srcrect into the destination rectangle, e.g. a 32x32 texture with a scale of 2 would fill 64x64 tiles.
+--
+--     [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture'
+--
+--     [C declaration]: @SDL_RenderTextureTiled@, defined at @SDL3\/SDL_render.h 2362:34@
+sDL_RenderTextureTiled
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> BG.CFloat
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> IO BG.CBool
+       )
+sDL_RenderTextureTiled =
+  BG.unsafePerformIO hs_bindgen_6cf4fce9a372af75
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTexture9Grid@
+foreign import ccall unsafe "hs_bindgen_78cecf599cdec7c5"
+  hs_bindgen_78cecf599cdec7c5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTexture9Grid@
+hs_bindgen_78cecf599cdec7c5
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> BG.CFloat
+             -> BG.CFloat
+             -> BG.CFloat
+             -> BG.CFloat
+             -> BG.CFloat
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_78cecf599cdec7c5 =
+  BG.fromFFIType hs_bindgen_78cecf599cdec7c5_base
+
+{-# NOINLINE sDL_RenderTexture9Grid #-}
+
+-- | Perform a scaled copy using the 9-grid algorithm to the current rendering target at subpixel precision.
+--
+--     The pixels in the texture are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then stretched into place to cover the remaining destination rectangle.
+--
+--     [@renderer@]: the renderer which should copy parts of a texture.
+--
+--     [@texture@]: the source texture.
+--
+--     [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire texture.
+--
+--     [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+--
+--     [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+--
+--     [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+--
+--     [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+--
+--     [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled copy.
+--
+--     [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture', 'sDL_RenderTexture9GridTiled'
+--
+--     [C declaration]: @SDL_RenderTexture9Grid@, defined at @SDL3\/SDL_render.h 2397:34@
+sDL_RenderTexture9Grid
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> BG.CFloat
+         -> BG.CFloat
+         -> BG.CFloat
+         -> BG.CFloat
+         -> BG.CFloat
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> IO BG.CBool
+       )
+sDL_RenderTexture9Grid =
+  BG.unsafePerformIO hs_bindgen_78cecf599cdec7c5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTexture9GridTiled@
+foreign import ccall unsafe "hs_bindgen_1b23a5c925e888fb"
+  hs_bindgen_1b23a5c925e888fb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderTexture9GridTiled@
+hs_bindgen_1b23a5c925e888fb
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> BG.CFloat
+             -> BG.CFloat
+             -> BG.CFloat
+             -> BG.CFloat
+             -> BG.CFloat
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+             -> BG.CFloat
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_1b23a5c925e888fb =
+  BG.fromFFIType hs_bindgen_1b23a5c925e888fb_base
+
+{-# NOINLINE sDL_RenderTexture9GridTiled #-}
+
+-- | Perform a scaled copy using the 9-grid algorithm to the current rendering target at subpixel precision.
+--
+--     The pixels in the texture are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then tiled into place to cover the remaining destination rectangle.
+--
+--     [@renderer@]: the renderer which should copy parts of a texture.
+--
+--     [@texture@]: the source texture.
+--
+--     [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire texture.
+--
+--     [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+--
+--     [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+--
+--     [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+--
+--     [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+--
+--     [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled copy.
+--
+--     [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+--
+--     [@tileScale@]: the scale used to transform the borders and center of @srcrect@ into the borders and middle of @dstrect@, or 1.0f for an unscaled copy.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_RenderTexture', 'sDL_RenderTexture9Grid'
+--
+--     [C declaration]: @SDL_RenderTexture9GridTiled@, defined at @SDL3\/SDL_render.h 2435:34@
+sDL_RenderTexture9GridTiled
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> BG.CFloat
+         -> BG.CFloat
+         -> BG.CFloat
+         -> BG.CFloat
+         -> BG.CFloat
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+         -> BG.CFloat
+         -> IO BG.CBool
+       )
+sDL_RenderTexture9GridTiled =
+  BG.unsafePerformIO hs_bindgen_1b23a5c925e888fb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderGeometry@
+foreign import ccall unsafe "hs_bindgen_dc26aec86b6b43fe"
+  hs_bindgen_dc26aec86b6b43fe_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderGeometry@
+hs_bindgen_dc26aec86b6b43fe
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst SDL_Vertex
+             -> BG.CInt
+             -> PtrConst.PtrConst BG.CInt
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_dc26aec86b6b43fe =
+  BG.fromFFIType hs_bindgen_dc26aec86b6b43fe_base
+
+{-# NOINLINE sDL_RenderGeometry #-}
+
+-- | Render a list of triangles, optionally using a texture and indices into the vertex array Color and alpha modulation is done per vertex (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored).
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@texture@]: (optional) The SDL texture to use.
+--
+--     [@vertices@]: vertices.
+--
+--     [@num_vertices@]: number of vertices.
+--
+--     [@indices@]: (optional) An array of integer indices into the \'vertices\' array, if NULL all vertices will be rendered in sequential order.
+--
+--     [@num_indices@]: number of indices.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderGeometryRaw', 'sDL_SetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_RenderGeometry@, defined at @SDL3\/SDL_render.h 2460:34@
+sDL_RenderGeometry
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst SDL_Vertex
+         -> BG.CInt
+         -> PtrConst.PtrConst BG.CInt
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_RenderGeometry =
+  BG.unsafePerformIO hs_bindgen_dc26aec86b6b43fe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderGeometryRaw@
+foreign import ccall unsafe "hs_bindgen_1e06910d8288533e"
+  hs_bindgen_1e06910d8288533e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderGeometryRaw@
+hs_bindgen_1e06910d8288533e
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> BG.Ptr SDL_Texture
+             -> PtrConst.PtrConst BG.CFloat
+             -> BG.CInt
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Pixels.SDL_FColor
+             -> BG.CInt
+             -> PtrConst.PtrConst BG.CFloat
+             -> BG.CInt
+             -> BG.CInt
+             -> PtrConst.PtrConst BG.Void
+             -> BG.CInt
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_1e06910d8288533e =
+  BG.fromFFIType hs_bindgen_1e06910d8288533e_base
+
+{-# NOINLINE sDL_RenderGeometryRaw #-}
+
+-- | Render a list of triangles, optionally using a texture and indices into the vertex arrays Color and alpha modulation is done per vertex (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored).
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@texture@]: (optional) The SDL texture to use.
+--
+--     [@xy@]: vertex positions.
+--
+--     [@xy_stride@]: byte size to move from one element to the next element.
+--
+--     [@color@]: vertex colors (as SDL_FColor).
+--
+--     [@color_stride@]: byte size to move from one element to the next element.
+--
+--     [@uv@]: vertex normalized texture coordinates.
+--
+--     [@uv_stride@]: byte size to move from one element to the next element.
+--
+--     [@num_vertices@]: number of vertices.
+--
+--     [@indices@]: (optional) An array of indices into the \'vertices\' arrays, if NULL all vertices will be rendered in sequential order.
+--
+--     [@num_indices@]: number of indices.
+--
+--     [@size_indices@]: index size: 1 (byte), 2 (short), 4 (int).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderGeometry', 'sDL_SetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_RenderGeometryRaw@, defined at @SDL3\/SDL_render.h 2493:34@
+sDL_RenderGeometryRaw
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> BG.Ptr SDL_Texture
+         -> PtrConst.PtrConst BG.CFloat
+         -> BG.CInt
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Pixels.SDL_FColor
+         -> BG.CInt
+         -> PtrConst.PtrConst BG.CFloat
+         -> BG.CInt
+         -> BG.CInt
+         -> PtrConst.PtrConst BG.Void
+         -> BG.CInt
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_RenderGeometryRaw =
+  BG.unsafePerformIO hs_bindgen_1e06910d8288533e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderTextureAddressMode@
+foreign import ccall unsafe "hs_bindgen_35802c1bb0921c28"
+  hs_bindgen_35802c1bb0921c28_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderTextureAddressMode@
+hs_bindgen_35802c1bb0921c28
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Renderer -> SDL_TextureAddressMode -> SDL_TextureAddressMode -> IO BG.CBool))
+hs_bindgen_35802c1bb0921c28 =
+  BG.fromFFIType hs_bindgen_35802c1bb0921c28_base
+
+{-# NOINLINE sDL_SetRenderTextureAddressMode #-}
+
+-- | Set the texture addressing mode used in @SDL_RenderGeometry()@.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@u_mode@]: the 'SDL_TextureAddressMode' to use for horizontal texture coordinates in @SDL_RenderGeometry()@.
+--
+--     [@v_mode@]: the 'SDL_TextureAddressMode' to use for vertical texture coordinates in @SDL_RenderGeometry()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_RenderGeometry', 'sDL_RenderGeometryRaw', 'sDL_GetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_SetRenderTextureAddressMode@, defined at @SDL3\/SDL_render.h 2520:34@
+sDL_SetRenderTextureAddressMode
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> SDL_TextureAddressMode -> SDL_TextureAddressMode -> IO BG.CBool)
+sDL_SetRenderTextureAddressMode =
+  BG.unsafePerformIO hs_bindgen_35802c1bb0921c28
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderTextureAddressMode@
+foreign import ccall unsafe "hs_bindgen_649128c959cdb236"
+  hs_bindgen_649128c959cdb236_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderTextureAddressMode@
+hs_bindgen_649128c959cdb236
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> BG.Ptr SDL_TextureAddressMode -> BG.Ptr SDL_TextureAddressMode -> IO BG.CBool)
+       )
+hs_bindgen_649128c959cdb236 =
+  BG.fromFFIType hs_bindgen_649128c959cdb236_base
+
+{-# NOINLINE sDL_GetRenderTextureAddressMode #-}
+
+-- | Get the texture addressing mode used in @SDL_RenderGeometry()@.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@u_mode@]: a pointer filled in with the 'SDL_TextureAddressMode' to use for horizontal texture coordinates in @SDL_RenderGeometry()@, may be NULL.
+--
+--     [@v_mode@]: a pointer filled in with the 'SDL_TextureAddressMode' to use for vertical texture coordinates in @SDL_RenderGeometry()@, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_GetRenderTextureAddressMode@, defined at @SDL3\/SDL_render.h 2541:34@
+sDL_GetRenderTextureAddressMode
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> BG.Ptr SDL_TextureAddressMode -> BG.Ptr SDL_TextureAddressMode -> IO BG.CBool)
+sDL_GetRenderTextureAddressMode =
+  BG.unsafePerformIO hs_bindgen_649128c959cdb236
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderReadPixels@
+foreign import ccall unsafe "hs_bindgen_b087b184be493118"
+  hs_bindgen_b087b184be493118_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderReadPixels@
+hs_bindgen_b087b184be493118
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+           )
+       )
+hs_bindgen_b087b184be493118 =
+  BG.fromFFIType hs_bindgen_b087b184be493118_base
+
+{-# NOINLINE sDL_RenderReadPixels #-}
+
+-- | Read pixels from the current rendering target.
+--
+--     The returned surface contains pixels inside the desired area clipped to the current viewport, and should be freed with SDL_DestroySurface().
+--
+--     Note that this returns the actual pixels on the screen, so if you are using logical presentation you should use @SDL_GetRenderLogicalPresentationRect()@ to get the area containing your content.
+--
+--     __WARNING__: This is a very slow operation, and should not be used frequently. If you\'re using this on the main rendering target, it should be called after rendering and before @SDL_RenderPresent()@.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@rect@]: an SDL_Rect structure representing the area to read, which will be clipped to the current viewport, or NULL for the entire viewport.
+--
+--     [Returns]: a new SDL_Surface on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RenderReadPixels@, defined at @SDL3\/SDL_render.h 2568:43@
+sDL_RenderReadPixels
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+       )
+sDL_RenderReadPixels =
+  BG.unsafePerformIO hs_bindgen_b087b184be493118
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderPresent@
+foreign import ccall unsafe "hs_bindgen_2bafff2cb8bebc00"
+  hs_bindgen_2bafff2cb8bebc00_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderPresent@
+hs_bindgen_2bafff2cb8bebc00 :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO BG.CBool))
+hs_bindgen_2bafff2cb8bebc00 =
+  BG.fromFFIType hs_bindgen_2bafff2cb8bebc00_base
+
+{-# NOINLINE sDL_RenderPresent #-}
+
+-- | Update the screen with any rendering performed since the previous call.
+--
+--     SDL\'s rendering functions operate on a backbuffer; that is, calling a rendering function such as @SDL_RenderLine()@ does not directly put a line on the screen, but rather updates the backbuffer. As such, you compose your entire scene and /present/ the composed backbuffer to the screen as a complete picture.
+--
+--     Therefore, when using SDL\'s rendering API, one does all drawing intended for the frame, and then calls this function once per frame to present the final drawing to the user.
+--
+--     The backbuffer should be considered invalidated after each present; do not assume that previous contents will exist between frames. You are strongly encouraged to call @SDL_RenderClear()@ to initialize the backbuffer before starting each new frame\'s drawing, even if you plan to overwrite every pixel.
+--
+--     Please note, that in case of rendering to a texture - there is __no need__ to call @'sDL_RenderPresent'@ after drawing needed objects to a texture, and should not be done; you are only required to change back the rendering target to default via @SDL_SetRenderTarget(renderer, NULL)@ afterwards, as textures by themselves do not have a concept of backbuffers. Calling SDL_RenderPresent while rendering to a texture will fail.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', 'sDL_RenderClear', 'sDL_RenderFillRect', 'sDL_RenderFillRects', 'sDL_RenderLine', 'sDL_RenderLines', 'sDL_RenderPoint', 'sDL_RenderPoints', 'sDL_RenderRect', 'sDL_RenderRects', 'sDL_SetRenderDrawBlendMode', 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_RenderPresent@, defined at @SDL3\/SDL_render.h 2617:34@
+sDL_RenderPresent :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO BG.CBool)
+sDL_RenderPresent =
+  BG.unsafePerformIO hs_bindgen_2bafff2cb8bebc00
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_DestroyTexture@
+foreign import ccall unsafe "hs_bindgen_4497bf4e9bdd42b9"
+  hs_bindgen_4497bf4e9bdd42b9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_DestroyTexture@
+hs_bindgen_4497bf4e9bdd42b9 :: IO (BG.FunPtr (BG.Ptr SDL_Texture -> IO ()))
+hs_bindgen_4497bf4e9bdd42b9 =
+  BG.fromFFIType hs_bindgen_4497bf4e9bdd42b9_base
+
+{-# NOINLINE sDL_DestroyTexture #-}
+
+-- | Destroy the specified texture.
+--
+--     Passing NULL or an otherwise invalid texture will set the SDL error message to \"Invalid texture\".
+--
+--     [@texture@]: the texture to destroy.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTexture', 'sDL_CreateTextureFromSurface'
+--
+--     [C declaration]: @SDL_DestroyTexture@, defined at @SDL3\/SDL_render.h 2634:34@
+sDL_DestroyTexture :: BG.FunPtr (BG.Ptr SDL_Texture -> IO ())
+sDL_DestroyTexture =
+  BG.unsafePerformIO hs_bindgen_4497bf4e9bdd42b9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_DestroyRenderer@
+foreign import ccall unsafe "hs_bindgen_011b10f177cafc47"
+  hs_bindgen_011b10f177cafc47_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_DestroyRenderer@
+hs_bindgen_011b10f177cafc47 :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO ()))
+hs_bindgen_011b10f177cafc47 =
+  BG.fromFFIType hs_bindgen_011b10f177cafc47_base
+
+{-# NOINLINE sDL_DestroyRenderer #-}
+
+-- | Destroy the rendering context for a window and free all associated textures.
+--
+--     This should be called before destroying the associated window.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer'
+--
+--     [C declaration]: @SDL_DestroyRenderer@, defined at @SDL3\/SDL_render.h 2650:34@
+sDL_DestroyRenderer :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO ())
+sDL_DestroyRenderer =
+  BG.unsafePerformIO hs_bindgen_011b10f177cafc47
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_FlushRenderer@
+foreign import ccall unsafe "hs_bindgen_0ee776d39090d2fd"
+  hs_bindgen_0ee776d39090d2fd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_FlushRenderer@
+hs_bindgen_0ee776d39090d2fd :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO BG.CBool))
+hs_bindgen_0ee776d39090d2fd =
+  BG.fromFFIType hs_bindgen_0ee776d39090d2fd_base
+
+{-# NOINLINE sDL_FlushRenderer #-}
+
+-- | Force the rendering context to flush any pending commands and state.
+--
+--     You do not need to (and in fact, shouldn\'t) call this function unless you are planning to call into OpenGL\/Direct3D\/Metal\/whatever directly, in addition to using an 'SDL_Renderer'.
+--
+--     This is for a very-specific case: if you are using SDL\'s render API, and you plan to make OpenGL\/D3D\/whatever calls in addition to SDL render API calls. If this applies, you should call this function between calls to SDL\'s render API and the low-level API you\'re using in cooperation.
+--
+--     In all other cases, you can ignore this function.
+--
+--     This call makes SDL flush any pending rendering work it was queueing up to do later in a single batch, and marks any internal cached state as invalid, so it\'ll prepare all its state again later, from scratch.
+--
+--     This means you do not need to save state in your rendering code to protect the SDL renderer. However, there lots of arbitrary pieces of Direct3D and OpenGL state that can confuse things; you should use your best judgment and be prepared to make changes if specific state needs to be protected.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_FlushRenderer@, defined at @SDL3\/SDL_render.h 2683:34@
+sDL_FlushRenderer :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO BG.CBool)
+sDL_FlushRenderer =
+  BG.unsafePerformIO hs_bindgen_0ee776d39090d2fd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderMetalLayer@
+foreign import ccall unsafe "hs_bindgen_f52f9cb5238155f3"
+  hs_bindgen_f52f9cb5238155f3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderMetalLayer@
+hs_bindgen_f52f9cb5238155f3 :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO (BG.Ptr BG.Void)))
+hs_bindgen_f52f9cb5238155f3 =
+  BG.fromFFIType hs_bindgen_f52f9cb5238155f3_base
+
+{-# NOINLINE sDL_GetRenderMetalLayer #-}
+
+-- | Get the CAMetalLayer associated with the given Metal renderer.
+--
+--     This function returns @void *@, so SDL doesn\'t have to include Metal\'s headers, but it can be safely cast to a @CAMetalLayer *@.
+--
+--     [@renderer@]: the renderer to query.
+--
+--     [Returns]: a @CAMetalLayer *@ on success, or NULL if the renderer isn\'t a Metal renderer.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderMetalCommandEncoder'
+--
+--     [C declaration]: @SDL_GetRenderMetalLayer@, defined at @SDL3\/SDL_render.h 2701:36@
+sDL_GetRenderMetalLayer :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO (BG.Ptr BG.Void))
+sDL_GetRenderMetalLayer =
+  BG.unsafePerformIO hs_bindgen_f52f9cb5238155f3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderMetalCommandEncoder@
+foreign import ccall unsafe "hs_bindgen_0e330f87af225f8b"
+  hs_bindgen_0e330f87af225f8b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderMetalCommandEncoder@
+hs_bindgen_0e330f87af225f8b :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> IO (BG.Ptr BG.Void)))
+hs_bindgen_0e330f87af225f8b =
+  BG.fromFFIType hs_bindgen_0e330f87af225f8b_base
+
+{-# NOINLINE sDL_GetRenderMetalCommandEncoder #-}
+
+-- | Get the Metal command encoder for the current frame.
+--
+--     This function returns @void *@, so SDL doesn\'t have to include Metal\'s headers, but it can be safely cast to an @id\<MTLRenderCommandEncoder>@.
+--
+--     This will return NULL if Metal refuses to give SDL a drawable to render to, which might happen if the window is hidden\/minimized\/offscreen. This doesn\'t apply to command encoders for render targets, just the window\'s backbuffer. Check your return values!
+--
+--     [@renderer@]: the renderer to query.
+--
+--     [Returns]: an @id\<MTLRenderCommandEncoder>@ on success, or NULL if the renderer isn\'t a Metal renderer or there was an error.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderMetalLayer'
+--
+--     [C declaration]: @SDL_GetRenderMetalCommandEncoder@, defined at @SDL3\/SDL_render.h 2724:36@
+sDL_GetRenderMetalCommandEncoder :: BG.FunPtr (BG.Ptr SDL_Renderer -> IO (BG.Ptr BG.Void))
+sDL_GetRenderMetalCommandEncoder =
+  BG.unsafePerformIO hs_bindgen_0e330f87af225f8b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_AddVulkanRenderSemaphores@
+foreign import ccall unsafe "hs_bindgen_3aaeda31b2a532b0"
+  hs_bindgen_3aaeda31b2a532b0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_AddVulkanRenderSemaphores@
+hs_bindgen_3aaeda31b2a532b0
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Sint64
+             -> SDL3.Sys.Bindgen.Stdinc.Sint64
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_3aaeda31b2a532b0 =
+  BG.fromFFIType hs_bindgen_3aaeda31b2a532b0_base
+
+{-# NOINLINE sDL_AddVulkanRenderSemaphores #-}
+
+-- | Add a set of synchronization semaphores for the current frame.
+--
+--     The Vulkan renderer will wait for @wait_semaphore@ before submitting rendering commands and signal @signal_semaphore@ after rendering commands are complete for this frame.
+--
+--     This should be called each frame that you want semaphore synchronization. The Vulkan renderer may have multiple frames in flight on the GPU, so you should have multiple semaphores that are used for synchronization. Querying SDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER will give you the maximum number of semaphores you\'ll need.
+--
+--     [@renderer@]: the rendering context.
+--
+--     [@wait_stage_mask@]: the VkPipelineStageFlags for the wait.
+--
+--     [@wait_semaphore@]: a VkSempahore to wait on before rendering the current frame, or 0 if not needed.
+--
+--     [@signal_semaphore@]: a VkSempahore that SDL will signal when rendering for the current frame is complete, or 0 if not needed.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is __NOT__ safe to call this function from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_AddVulkanRenderSemaphores@, defined at @SDL3\/SDL_render.h 2755:34@
+sDL_AddVulkanRenderSemaphores
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Sint64
+         -> SDL3.Sys.Bindgen.Stdinc.Sint64
+         -> IO BG.CBool
+       )
+sDL_AddVulkanRenderSemaphores =
+  BG.unsafePerformIO hs_bindgen_3aaeda31b2a532b0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderVSync@
+foreign import ccall unsafe "hs_bindgen_964c717567cbb3b7"
+  hs_bindgen_964c717567cbb3b7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetRenderVSync@
+hs_bindgen_964c717567cbb3b7 :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CInt -> IO BG.CBool))
+hs_bindgen_964c717567cbb3b7 =
+  BG.fromFFIType hs_bindgen_964c717567cbb3b7_base
+
+{-# NOINLINE sDL_SetRenderVSync #-}
+
+-- | Toggle VSync of the given renderer.
+--
+--     When a renderer is created, vsync defaults to SDL_RENDERER_VSYNC_DISABLED.
+--
+--     The @vsync@ parameter can be 1 to synchronize present with every vertical refresh, 2 to synchronize present with every second vertical refresh, etc., SDL_RENDERER_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or SDL_RENDERER_VSYNC_DISABLED to disable. Not every value is supported by every driver, so you should check the return value to see whether the requested setting is supported.
+--
+--     [@renderer@]: the renderer to toggle.
+--
+--     [@vsync@]: the vertical refresh sync interval.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderVSync'
+--
+--     [C declaration]: @SDL_SetRenderVSync@, defined at @SDL3\/SDL_render.h 2780:34@
+sDL_SetRenderVSync :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.CInt -> IO BG.CBool)
+sDL_SetRenderVSync =
+  BG.unsafePerformIO hs_bindgen_964c717567cbb3b7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderVSync@
+foreign import ccall unsafe "hs_bindgen_ea48e8e1fe227495"
+  hs_bindgen_ea48e8e1fe227495_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetRenderVSync@
+hs_bindgen_ea48e8e1fe227495 :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_ea48e8e1fe227495 =
+  BG.fromFFIType hs_bindgen_ea48e8e1fe227495_base
+
+{-# NOINLINE sDL_GetRenderVSync #-}
+
+-- | Get VSync of the given renderer.
+--
+--     [@renderer@]: the renderer to toggle.
+--
+--     [@vsync@]: an int filled with the current vertical refresh sync interval. See @SDL_SetRenderVSync()@ for the meaning of the value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderVSync'
+--
+--     [C declaration]: @SDL_GetRenderVSync@, defined at @SDL3\/SDL_render.h 2800:34@
+sDL_GetRenderVSync :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetRenderVSync =
+  BG.unsafePerformIO hs_bindgen_ea48e8e1fe227495
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderDebugText@
+foreign import ccall unsafe "hs_bindgen_30bc1d75e73ca06a"
+  hs_bindgen_30bc1d75e73ca06a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_RenderDebugText@
+hs_bindgen_30bc1d75e73ca06a
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+       )
+hs_bindgen_30bc1d75e73ca06a =
+  BG.fromFFIType hs_bindgen_30bc1d75e73ca06a_base
+
+{-# NOINLINE sDL_RenderDebugText #-}
+
+-- | Draw debug text to an 'SDL_Renderer'.
+--
+--     This function will render a string of text to an 'SDL_Renderer'. Note that this is a convenience function for debugging, with severe limitations, and not intended to be used for production apps and games.
+--
+--     Among these limitations:
+--
+--     * It accepts UTF-8 strings, but will only renders ASCII characters.
+--
+--     * It has a single, tiny size (8x8 pixels). You can use logical presentation or @SDL_SetRenderScale()@ to adjust it.
+--
+--     * It uses a simple, hardcoded bitmap font. It does not allow different font selections and it does not support truetype, for proper scaling.
+--
+--     * It does no word-wrapping and does not treat newline characters as a line break. If the text goes out of the window, it\'s gone.
+--
+--     For serious text rendering, there are several good options, such as SDL_ttf, stb_truetype, or other external libraries.
+--
+--     On first use, this will create an internal texture for rendering glyphs. This texture will live until the renderer is destroyed.
+--
+--     The text is drawn in the color specified by @SDL_SetRenderDrawColor()@.
+--
+--     [@renderer@]: the renderer which should draw a line of text.
+--
+--     [@x@]: the x coordinate where the top-left corner of the text will draw.
+--
+--     [@y@]: the y coordinate where the top-left corner of the text will draw.
+--
+--     [@str@]: the string to render.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_RenderDebugTextFormat@, 'sDL_DEBUG_TEXT_FONT_CHARACTER_SIZE'
+--
+--     [C declaration]: @SDL_RenderDebugText@, defined at @SDL3\/SDL_render.h 2852:34@
+sDL_RenderDebugText
+  :: BG.FunPtr
+       (BG.Ptr SDL_Renderer -> BG.CFloat -> BG.CFloat -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_RenderDebugText =
+  BG.unsafePerformIO hs_bindgen_30bc1d75e73ca06a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetDefaultTextureScaleMode@
+foreign import ccall unsafe "hs_bindgen_7118410bfe83a316"
+  hs_bindgen_7118410bfe83a316_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetDefaultTextureScaleMode@
+hs_bindgen_7118410bfe83a316
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode -> IO BG.CBool))
+hs_bindgen_7118410bfe83a316 =
+  BG.fromFFIType hs_bindgen_7118410bfe83a316_base
+
+{-# NOINLINE sDL_SetDefaultTextureScaleMode #-}
+
+-- | Set default scale mode for new textures for given renderer.
+--
+--     When a renderer is created, scale_mode defaults to SDL_SCALEMODE_LINEAR.
+--
+--     [@renderer@]: the renderer to update.
+--
+--     [@scale_mode@]: the scale mode to change to for new textures.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_GetDefaultTextureScaleMode'
+--
+--     [C declaration]: @SDL_SetDefaultTextureScaleMode@, defined at @SDL3\/SDL_render.h 2898:34@
+sDL_SetDefaultTextureScaleMode
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode -> IO BG.CBool)
+sDL_SetDefaultTextureScaleMode =
+  BG.unsafePerformIO hs_bindgen_7118410bfe83a316
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetDefaultTextureScaleMode@
+foreign import ccall unsafe "hs_bindgen_51156f5e8dd42d03"
+  hs_bindgen_51156f5e8dd42d03_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_GetDefaultTextureScaleMode@
+hs_bindgen_51156f5e8dd42d03
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode -> IO BG.CBool))
+hs_bindgen_51156f5e8dd42d03 =
+  BG.fromFFIType hs_bindgen_51156f5e8dd42d03_base
+
+{-# NOINLINE sDL_GetDefaultTextureScaleMode #-}
+
+-- | Get default texture scale mode of the given renderer.
+--
+--     [@renderer@]: the renderer to get data from.
+--
+--     [@scale_mode@]: a SDL_ScaleMode filled with current default scale mode. See @SDL_SetDefaultTextureScaleMode()@ for the meaning of the value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetDefaultTextureScaleMode'
+--
+--     [C declaration]: @SDL_GetDefaultTextureScaleMode@, defined at @SDL3\/SDL_render.h 2916:34@
+sDL_GetDefaultTextureScaleMode
+  :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode -> IO BG.CBool)
+sDL_GetDefaultTextureScaleMode =
+  BG.unsafePerformIO hs_bindgen_51156f5e8dd42d03
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateGPURenderState@
+foreign import ccall unsafe "hs_bindgen_c77515a1f877dab2"
+  hs_bindgen_c77515a1f877dab2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_CreateGPURenderState@
+hs_bindgen_c77515a1f877dab2
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Renderer
+             -> PtrConst.PtrConst SDL_GPURenderStateCreateInfo
+             -> IO (BG.Ptr SDL_GPURenderState)
+           )
+       )
+hs_bindgen_c77515a1f877dab2 =
+  BG.fromFFIType hs_bindgen_c77515a1f877dab2_base
+
+{-# NOINLINE sDL_CreateGPURenderState #-}
+
+-- | Create custom GPU render state.
+--
+--     [@renderer@]: the renderer to use.
+--
+--     [@createinfo@]: a struct describing the GPU render state to create.
+--
+--     [Returns]: a custom GPU render state or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetGPURenderStateFragmentUniforms', 'sDL_SetGPURenderState', 'sDL_DestroyGPURenderState'
+--
+--     [C declaration]: @SDL_CreateGPURenderState@, defined at @SDL3\/SDL_render.h 2970:50@
+sDL_CreateGPURenderState
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Renderer
+         -> PtrConst.PtrConst SDL_GPURenderStateCreateInfo
+         -> IO (BG.Ptr SDL_GPURenderState)
+       )
+sDL_CreateGPURenderState =
+  BG.unsafePerformIO hs_bindgen_c77515a1f877dab2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetGPURenderStateFragmentUniforms@
+foreign import ccall unsafe "hs_bindgen_65c1c07e7c4876a6"
+  hs_bindgen_65c1c07e7c4876a6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetGPURenderStateFragmentUniforms@
+hs_bindgen_65c1c07e7c4876a6
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_GPURenderState
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> PtrConst.PtrConst BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_65c1c07e7c4876a6 =
+  BG.fromFFIType hs_bindgen_65c1c07e7c4876a6_base
+
+{-# NOINLINE sDL_SetGPURenderStateFragmentUniforms #-}
+
+-- | Set fragment shader uniform variables in a custom GPU render state.
+--
+--     The data is copied and will be pushed using SDL_PushGPUFragmentUniformData() during draw call execution.
+--
+--     [@state@]: the state to modify.
+--
+--     [@slot_index@]: the fragment uniform slot to push data to.
+--
+--     [@data@]: client data to write.
+--
+--     [@length@]: the length of the data to write.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetGPURenderStateFragmentUniforms@, defined at @SDL3\/SDL_render.h 2990:34@
+sDL_SetGPURenderStateFragmentUniforms
+  :: BG.FunPtr
+       ( BG.Ptr SDL_GPURenderState
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> PtrConst.PtrConst BG.Void
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_SetGPURenderStateFragmentUniforms =
+  BG.unsafePerformIO hs_bindgen_65c1c07e7c4876a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetGPURenderState@
+foreign import ccall unsafe "hs_bindgen_440f7dac948d9e3d"
+  hs_bindgen_440f7dac948d9e3d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_SetGPURenderState@
+hs_bindgen_440f7dac948d9e3d
+  :: IO (BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL_GPURenderState -> IO BG.CBool))
+hs_bindgen_440f7dac948d9e3d =
+  BG.fromFFIType hs_bindgen_440f7dac948d9e3d_base
+
+{-# NOINLINE sDL_SetGPURenderState #-}
+
+-- | Set custom GPU render state.
+--
+--     This function sets custom GPU render state for subsequent draw calls. This allows using custom shaders with the GPU renderer.
+--
+--     [@renderer@]: the renderer to use.
+--
+--     [@state@]: the state to to use, or NULL to clear custom GPU render state.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetGPURenderState@, defined at @SDL3\/SDL_render.h 3008:34@
+sDL_SetGPURenderState :: BG.FunPtr (BG.Ptr SDL_Renderer -> BG.Ptr SDL_GPURenderState -> IO BG.CBool)
+sDL_SetGPURenderState =
+  BG.unsafePerformIO hs_bindgen_440f7dac948d9e3d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_DestroyGPURenderState@
+foreign import ccall unsafe "hs_bindgen_dc4da5de025a8ba9"
+  hs_bindgen_dc4da5de025a8ba9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_get_SDL_DestroyGPURenderState@
+hs_bindgen_dc4da5de025a8ba9 :: IO (BG.FunPtr (BG.Ptr SDL_GPURenderState -> IO ()))
+hs_bindgen_dc4da5de025a8ba9 =
+  BG.fromFFIType hs_bindgen_dc4da5de025a8ba9_base
+
+{-# NOINLINE sDL_DestroyGPURenderState #-}
+
+-- | Destroy custom GPU render state.
+--
+--     [@state@]: the state to destroy.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_CreateGPURenderState'
+--
+--     [C declaration]: @SDL_DestroyGPURenderState@, defined at @SDL3\/SDL_render.h 3022:34@
+sDL_DestroyGPURenderState :: BG.FunPtr (BG.Ptr SDL_GPURenderState -> IO ())
+sDL_DestroyGPURenderState =
+  BG.unsafePerformIO hs_bindgen_dc4da5de025a8ba9
diff --git a/src/SDL3/Sys/Bindgen/Render/Safe.hs b/src/SDL3/Sys/Bindgen/Render/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Render/Safe.hs
@@ -0,0 +1,5962 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Render.Safe (
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetNumRenderDrivers,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderDriver,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_CreateWindowAndRenderer,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_CreateRenderer,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_CreateRendererWithProperties,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_CreateGPURenderer,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetGPURendererDevice,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_CreateSoftwareRenderer,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderer,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderWindow,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRendererName,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRendererProperties,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderOutputSize,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetCurrentRenderOutputSize,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_CreateTexture,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_CreateTextureFromSurface,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_CreateTextureWithProperties,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetTextureProperties,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRendererFromTexture,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetTextureSize,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetTexturePalette,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetTexturePalette,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetTextureColorMod,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetTextureColorModFloat,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetTextureColorMod,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetTextureColorModFloat,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetTextureAlphaMod,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetTextureAlphaModFloat,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetTextureAlphaMod,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetTextureAlphaModFloat,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetTextureBlendMode,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetTextureBlendMode,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_UpdateTexture,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_UpdateYUVTexture,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_UpdateNVTexture,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_LockTexture,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_LockTextureToSurface,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_UnlockTexture,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderTarget,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderTarget,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderLogicalPresentation,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderLogicalPresentation,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderLogicalPresentationRect,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderCoordinatesFromWindow,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderCoordinatesToWindow,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_ConvertEventToRenderCoordinates,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderViewport,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderViewport,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderViewportSet,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderSafeArea,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderClipRect,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderClipRect,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderClipEnabled,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderScale,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderScale,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderDrawColor,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderDrawColorFloat,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderDrawColor,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderDrawColorFloat,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderColorScale,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderColorScale,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderDrawBlendMode,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderDrawBlendMode,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderClear,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderPoint,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderPoints,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderLine,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderLines,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderRect,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderRects,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderFillRect,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderFillRects,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderTexture,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderTextureRotated,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderTextureAffine,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderTextureTiled,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderTexture9Grid,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderTexture9GridTiled,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderGeometry,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderGeometryRaw,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderTextureAddressMode,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderTextureAddressMode,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderReadPixels,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderPresent,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_DestroyTexture,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_DestroyRenderer,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_FlushRenderer,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderMetalLayer,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderMetalCommandEncoder,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_AddVulkanRenderSemaphores,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetRenderVSync,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetRenderVSync,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_RenderDebugText,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetDefaultTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_GetDefaultTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_CreateGPURenderState,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetGPURenderStateFragmentUniforms,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_SetGPURenderState,
+  SDL3.Sys.Bindgen.Render.Safe.sDL_DestroyGPURenderState,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Blendmode qualified
+import SDL3.Sys.Bindgen.Events qualified
+import SDL3.Sys.Bindgen.Gpu qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Render
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_render.h>"
+         , "signed int hs_bindgen_73e69181c85cbe7b (void)"
+         , "{"
+         , "  return (SDL_GetNumRenderDrivers)();"
+         , "}"
+         , "char const *hs_bindgen_785e31d2ab303c36 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderDriver)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8b7a09bca8ba667b ("
+         , "  char const *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_WindowFlags arg4,"
+         , "  SDL_Window **arg5,"
+         , "  SDL_Renderer **arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateWindowAndRenderer)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "SDL_Renderer *hs_bindgen_4a9fac5ac8d291e9 ("
+         , "  SDL_Window *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateRenderer)(arg1, arg2);"
+         , "}"
+         , "SDL_Renderer *hs_bindgen_8b6efe6418cb34a2 ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateRendererWithProperties)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "SDL_Renderer *hs_bindgen_6efbbd05c80e02d0 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_CreateGPURenderer)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_CreateGPURenderer requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "SDL_GPUDevice *hs_bindgen_aa8cead59246ca07 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetGPURendererDevice)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetGPURendererDevice requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_Renderer *hs_bindgen_154eef5a69d9f0de ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSoftwareRenderer)(arg1);"
+         , "}"
+         , "SDL_Renderer *hs_bindgen_6b28e604d7d033f7 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderer)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_b22b3e4ae10bdb0d ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderWindow)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_599c50262188b811 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRendererName)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_4a11529b7951c637 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRendererProperties)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_1d433c9827126af7 ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderOutputSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_5d30db125155788b ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCurrentRenderOutputSize)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_Texture *hs_bindgen_052b6ffc7143143e ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_PixelFormat arg2,"
+         , "  SDL_TextureAccess arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTexture)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "SDL_Texture *hs_bindgen_4d23668000d5b53c ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTextureFromSurface)(arg1, arg2);"
+         , "}"
+         , "SDL_Texture *hs_bindgen_56364d1627b2f54e ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTextureWithProperties)(arg1, arg2);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_5a086b7bc8bee33d ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureProperties)(arg1);"
+         , "}"
+         , "SDL_Renderer *hs_bindgen_952d60b9be750f80 ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRendererFromTexture)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_593080867d87a9cb ("
+         , "  SDL_Texture *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureSize)(arg1, arg2, arg3);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_c0c58495bafd931b ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Palette *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetTexturePalette)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetTexturePalette requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Palette *hs_bindgen_23b273d543966d78 ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetTexturePalette)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetTexturePalette requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_823afe6398e7b8c5 ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureColorMod)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_7ad37bb707c0047a ("
+         , "  SDL_Texture *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureColorModFloat)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_7a0ccf77a4fdfc3e ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 *arg2,"
+         , "  Uint8 *arg3,"
+         , "  Uint8 *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureColorMod)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_842e59bbba82a5a3 ("
+         , "  SDL_Texture *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3,"
+         , "  float *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureColorModFloat)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_cd0da7f365c5d74f ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureAlphaMod)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_3c8a499336e4d5a3 ("
+         , "  SDL_Texture *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureAlphaModFloat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d0b8db7f236a27d6 ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureAlphaMod)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_10d5dcf405fda170 ("
+         , "  SDL_Texture *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureAlphaModFloat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_2881e5a760914ac5 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_BlendMode arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_816bbcb1b4c3283a ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_BlendMode *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_f9ee16ea95e7fdf6 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_ScaleMode arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureScaleMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_6de3c22a0ac3ed25 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_ScaleMode *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureScaleMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_34af457e8db29591 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  void const *arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateTexture)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_a7b149fabb767cd5 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  Uint8 const *arg3,"
+         , "  signed int arg4,"
+         , "  Uint8 const *arg5,"
+         , "  signed int arg6,"
+         , "  Uint8 const *arg7,"
+         , "  signed int arg8"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateYUVTexture)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);"
+         , "}"
+         , "_Bool hs_bindgen_2d94f5e4965716c8 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  Uint8 const *arg3,"
+         , "  signed int arg4,"
+         , "  Uint8 const *arg5,"
+         , "  signed int arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateNVTexture)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_b121055dd1158359 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  void **arg3,"
+         , "  signed int *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_LockTexture)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_1526f9100ed55b03 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface **arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_LockTextureToSurface)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_1159217b1f34f925 ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockTexture)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_4b272fad8dbaa9f4 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderTarget)(arg1, arg2);"
+         , "}"
+         , "SDL_Texture *hs_bindgen_0f2b08c2b3c8ddb1 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderTarget)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_c8bfb4ad8baf9874 ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_RendererLogicalPresentation arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderLogicalPresentation)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_88acfc55c8872d4d ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3,"
+         , "  SDL_RendererLogicalPresentation *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderLogicalPresentation)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_e6080eb5475f066e ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderLogicalPresentationRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_2ed6b3e16ff69faf ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderCoordinatesFromWindow)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_694297dc8b16c606 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderCoordinatesToWindow)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_4d63449cf75fd80c ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Event *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertEventToRenderCoordinates)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_6d15f83fef90049f ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderViewport)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b94438b981f1f14c ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderViewport)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a3207f3fc59e8dc9 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderViewportSet)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_4eb48f61abc48f1f ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderSafeArea)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8baf3dc3de980190 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderClipRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5b7acae61b400f09 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderClipRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_151563301b587559 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderClipEnabled)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_edd164833dbcbd86 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderScale)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_b47b8598441289bb ("
+         , "  SDL_Renderer *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderScale)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_2a1d5a5e6763970a ("
+         , "  SDL_Renderer *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderDrawColor)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_deb567c32a3b304a ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderDrawColorFloat)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_4b8538e6f2e6330e ("
+         , "  SDL_Renderer *arg1,"
+         , "  Uint8 *arg2,"
+         , "  Uint8 *arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderDrawColor)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_02be3e3dad551497 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderDrawColorFloat)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_4b5898833d8f7966 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderColorScale)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_107aa0fcfa767aa5 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderColorScale)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b9c067d52917b47d ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_BlendMode arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderDrawBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_167da6f1eb78062a ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_BlendMode *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderDrawBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_cde099ce5b1cfc9d ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderClear)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_9685ef9bec873fd9 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderPoint)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_a2f27901d75ff412 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FPoint const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderPoints)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_a22413e4506d153a ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderLine)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_139f9e9bbb114174 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FPoint const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderLines)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_c336b07d3c7c70e0 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_4402e93d7e0ba929 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderRects)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_2904f549c42ca454 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderFillRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8e1470eae177aaca ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderFillRects)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_25ce1a6520376b45 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FRect const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderTexture)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_7784d7195eaae275 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FRect const *arg4,"
+         , "  double arg5,"
+         , "  SDL_FPoint const *arg6,"
+         , "  SDL_FlipMode arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderTextureRotated)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_add42f94463f73c6 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FPoint const *arg4,"
+         , "  SDL_FPoint const *arg5,"
+         , "  SDL_FPoint const *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderTextureAffine)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_74aa5a13c76159fa ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  float arg4,"
+         , "  SDL_FRect const *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderTextureTiled)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_6b75253c3413f458 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  float arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7,"
+         , "  float arg8,"
+         , "  SDL_FRect const *arg9"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderTexture9Grid)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_2d9cf263c1277f5b ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  float arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7,"
+         , "  float arg8,"
+         , "  SDL_FRect const *arg9,"
+         , "  float arg10"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_RenderTexture9GridTiled)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; (void)arg5; (void)arg6; (void)arg7; (void)arg8; (void)arg9; (void)arg10; SDL_SetError(\"SDL_RenderTexture9GridTiled requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_778c782602e7d6de ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_Vertex const *arg3,"
+         , "  signed int arg4,"
+         , "  signed int const *arg5,"
+         , "  signed int arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderGeometry)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_32080687747fa83c ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  float const *arg3,"
+         , "  signed int arg4,"
+         , "  SDL_FColor const *arg5,"
+         , "  signed int arg6,"
+         , "  float const *arg7,"
+         , "  signed int arg8,"
+         , "  signed int arg9,"
+         , "  void const *arg10,"
+         , "  signed int arg11,"
+         , "  signed int arg12"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderGeometryRaw)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "_Bool hs_bindgen_56e605702d9776b5 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_TextureAddressMode arg2,"
+         , "  SDL_TextureAddressMode arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetRenderTextureAddressMode)(arg1, arg2, arg3);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; SDL_SetError(\"SDL_SetRenderTextureAddressMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "_Bool hs_bindgen_b63dbaffb6d53264 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_TextureAddressMode *arg2,"
+         , "  SDL_TextureAddressMode *arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetRenderTextureAddressMode)(arg1, arg2, arg3);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; SDL_SetError(\"SDL_GetRenderTextureAddressMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_Surface *hs_bindgen_8e39bba88c8b590b ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderReadPixels)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7c3d5531ae54aea4 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderPresent)(arg1);"
+         , "}"
+         , "void hs_bindgen_8bed4d77b35c687f ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyTexture)(arg1);"
+         , "}"
+         , "void hs_bindgen_1d20db71cb8b3442 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyRenderer)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_541ef4edd41b43f3 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_FlushRenderer)(arg1);"
+         , "}"
+         , "void *hs_bindgen_b665c5f20441fcd2 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderMetalLayer)(arg1);"
+         , "}"
+         , "void *hs_bindgen_4cc0199f9267bab8 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderMetalCommandEncoder)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_91025902db96959c ("
+         , "  SDL_Renderer *arg1,"
+         , "  Uint32 arg2,"
+         , "  Sint64 arg3,"
+         , "  Sint64 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_AddVulkanRenderSemaphores)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_6f4a42b49f0de954 ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderVSync)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_eb1ce0cdf3d11c86 ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderVSync)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_54ec6a89b17b55b6 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  char const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderDebugText)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_3e694d41804c455e ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_ScaleMode arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetDefaultTextureScaleMode)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetDefaultTextureScaleMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_3782129e34172c40 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_ScaleMode *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetDefaultTextureScaleMode)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_GetDefaultTextureScaleMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "SDL_GPURenderState *hs_bindgen_b6fd9bfda38a61c5 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_GPURenderStateCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_CreateGPURenderState)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_CreateGPURenderState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "_Bool hs_bindgen_18aafc7283600d91 ("
+         , "  SDL_GPURenderState *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetGPURenderStateFragmentUniforms)(arg1, arg2, arg3, arg4);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; SDL_SetError(\"SDL_SetGPURenderStateFragmentUniforms requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "_Bool hs_bindgen_707dc041c39c56ad ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_GPURenderState *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetGPURenderState)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetGPURenderState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "void hs_bindgen_ef5a4d7453634025 ("
+         , "  SDL_GPURenderState *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  (SDL_DestroyGPURenderState)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_DestroyGPURenderState requires SDL >= 3.4.0\");"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetNumRenderDrivers@
+foreign import ccall safe "hs_bindgen_73e69181c85cbe7b"
+  hs_bindgen_73e69181c85cbe7b_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetNumRenderDrivers@
+hs_bindgen_73e69181c85cbe7b :: IO BG.CInt
+hs_bindgen_73e69181c85cbe7b =
+  BG.fromFFIType hs_bindgen_73e69181c85cbe7b_base
+
+-- | Get the number of 2D rendering drivers available for the current display.
+--
+--     A render driver is a set of code that handles rendering and texture management on a particular display. Normally there is only one, but some drivers may have several available with different capabilities.
+--
+--     There may be none if SDL was compiled without render support.
+--
+--     [Returns]: the number of built in render drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', 'sDL_GetRenderDriver'
+--
+--     [C declaration]: @SDL_GetNumRenderDrivers@, defined at @SDL3\/SDL_render.h 192:33@
+sDL_GetNumRenderDrivers :: IO BG.CInt
+sDL_GetNumRenderDrivers = hs_bindgen_73e69181c85cbe7b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderDriver@
+foreign import ccall safe "hs_bindgen_785e31d2ab303c36"
+  hs_bindgen_785e31d2ab303c36_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderDriver@
+hs_bindgen_785e31d2ab303c36
+  :: BG.CInt
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_785e31d2ab303c36 =
+  BG.fromFFIType hs_bindgen_785e31d2ab303c36_base
+
+-- | Use this function to get the name of a built in 2D rendering driver.
+--
+--     The list of rendering drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"opengl\", \"direct3d12\" or \"metal\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the rendering driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumRenderDrivers'
+--
+--     [C declaration]: @SDL_GetRenderDriver@, defined at @SDL3\/SDL_render.h 216:42@
+sDL_GetRenderDriver
+  :: BG.CInt
+  -- ^
+  --
+  --           [@index@]: the index of the rendering driver; the value ranges from 0 to @SDL_GetNumRenderDrivers()@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetRenderDriver = hs_bindgen_785e31d2ab303c36
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateWindowAndRenderer@
+foreign import ccall safe "hs_bindgen_8b7a09bca8ba667b"
+  hs_bindgen_8b7a09bca8ba667b_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateWindowAndRenderer@
+hs_bindgen_8b7a09bca8ba667b
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Video.SDL_WindowFlags
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+  -> BG.Ptr (BG.Ptr SDL_Renderer)
+  -> IO BG.CBool
+hs_bindgen_8b7a09bca8ba667b =
+  BG.fromFFIType hs_bindgen_8b7a09bca8ba667b_base
+
+-- | Create a window and default renderer.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', SDL_CreateWindow
+--
+--     [C declaration]: @SDL_CreateWindowAndRenderer@, defined at @SDL3\/SDL_render.h 238:34@
+sDL_CreateWindowAndRenderer
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the title of the window, in UTF-8 encoding.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the window.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the window.
+  -> SDL3.Sys.Bindgen.Video.SDL_WindowFlags
+  -- ^
+  --
+  --           [@window_flags@]: the flags used to create the window (see SDL_CreateWindow()).
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+  -- ^
+  --
+  --           [@window@]: a pointer filled with the window, or NULL on error.
+  -> BG.Ptr (BG.Ptr SDL_Renderer)
+  -- ^
+  --
+  --           [@renderer@]: a pointer filled with the renderer, or NULL on error.
+  -> IO BG.CBool
+sDL_CreateWindowAndRenderer =
+  hs_bindgen_8b7a09bca8ba667b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateRenderer@
+foreign import ccall safe "hs_bindgen_4a9fac5ac8d291e9"
+  hs_bindgen_4a9fac5ac8d291e9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateRenderer@
+hs_bindgen_4a9fac5ac8d291e9
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_4a9fac5ac8d291e9 =
+  BG.fromFFIType hs_bindgen_4a9fac5ac8d291e9_base
+
+-- | Create a 2D rendering context for a window.
+--
+--     If you want a specific renderer, you can specify its name here. A list of available renderers can be obtained by calling @SDL_GetRenderDriver()@ multiple times, with indices from 0 to @SDL_GetNumRenderDrivers()@ -1. If you don\'t need a specific renderer, specify NULL and SDL will attempt to choose the best option for you, based on what is available on the user\'s system.
+--
+--     If @name@ is a comma-separated list, SDL will try each name, in the order listed, until one succeeds or all of them fail.
+--
+--     By default the rendering size matches the window size in pixels, but you can call @SDL_SetRenderLogicalPresentation()@ to change the content size and scaling options.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRendererWithProperties', 'sDL_CreateSoftwareRenderer', 'sDL_DestroyRenderer', 'sDL_GetNumRenderDrivers', 'sDL_GetRenderDriver', 'sDL_GetRendererName'
+--
+--     [C declaration]: @SDL_CreateRenderer@, defined at @SDL3\/SDL_render.h 273:44@
+sDL_CreateRenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window where rendering is displayed.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the rendering driver to initialize, or NULL to let SDL choose one.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_CreateRenderer = hs_bindgen_4a9fac5ac8d291e9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateRendererWithProperties@
+foreign import ccall safe "hs_bindgen_8b6efe6418cb34a2"
+  hs_bindgen_8b6efe6418cb34a2_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateRendererWithProperties@
+hs_bindgen_8b6efe6418cb34a2
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_8b6efe6418cb34a2 =
+  BG.fromFFIType hs_bindgen_8b6efe6418cb34a2_base
+
+-- | Create a 2D rendering context for a window, with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_RENDERER_CREATE_NAME_STRING'@: the name of the rendering driver to use, if a specific one is desired
+--
+--     * @'sDL_PROP_RENDERER_CREATE_WINDOW_POINTER'@: the window where rendering is displayed, required if this isn\'t a software renderer using a surface
+--
+--     * @'sDL_PROP_RENDERER_CREATE_SURFACE_POINTER'@: the surface where rendering is displayed, if you want a software renderer without a window
+--
+--     * @'sDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the colorspace for output to the display, defaults to SDL_COLORSPACE_SRGB. The direct3d11, direct3d12, and metal renderers support SDL_COLORSPACE_SRGB_LINEAR, which is a linear color space and supports HDR output. If you select SDL_COLORSPACE_SRGB_LINEAR, drawing still uses the sRGB colorspace, but values can go beyond 1.0 and float (linear) format textures can be used for HDR content.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER'@: non-zero if you want present synchronized with the refresh rate. This property can take any value that is supported by @SDL_SetRenderVSync()@ for the renderer.
+--
+--     With the SDL GPU renderer (since SDL 3.4.0):
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER'@: the device to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN'@: the app is able to provide SPIR-V shaders to 'SDL_GPURenderState', optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN'@: the app is able to provide DXIL shaders to 'SDL_GPURenderState', optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN'@: the app is able to provide MSL shaders to 'SDL_GPURenderState', optional.
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER'@: the VkInstance to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER'@: the VkSurfaceKHR to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER'@: the VkPhysicalDevice to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_DEVICE_POINTER'@: the VkDevice to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for rendering.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for presentation.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateProperties, 'sDL_CreateRenderer', 'sDL_CreateSoftwareRenderer', 'sDL_DestroyRenderer', 'sDL_GetRendererName'
+--
+--     [C declaration]: @SDL_CreateRendererWithProperties@, defined at @SDL3\/SDL_render.h 337:44@
+sDL_CreateRendererWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_CreateRendererWithProperties =
+  hs_bindgen_8b6efe6418cb34a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateGPURenderer@
+foreign import ccall safe "hs_bindgen_6efbbd05c80e02d0"
+  hs_bindgen_6efbbd05c80e02d0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateGPURenderer@
+hs_bindgen_6efbbd05c80e02d0
+  :: BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_6efbbd05c80e02d0 =
+  BG.fromFFIType hs_bindgen_6efbbd05c80e02d0_base
+
+-- | Create a 2D GPU rendering context.
+--
+--     The GPU device to use is passed in as a parameter. If this is NULL, then a device will be created normally and can be retrieved using @SDL_GetGPURendererDevice()@.
+--
+--     The window to use is passed in as a parameter. If this is NULL, then this will become an offscreen renderer. In that case, you should call @SDL_SetRenderTarget()@ to setup rendering to a texture, and then call @SDL_RenderPresent()@ normally to complete drawing a frame.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: If this function is called with a valid GPU device, it should be called on the thread that created the device. If this function is called with a valid window, it should be called on the thread that created the window.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_CreateRendererWithProperties', 'sDL_GetGPURendererDevice', SDL_CreateGPUShader, 'sDL_CreateGPURenderState', 'sDL_SetGPURenderState'
+--
+--     [C declaration]: @SDL_CreateGPURenderer@, defined at @SDL3\/SDL_render.h 387:44@
+sDL_CreateGPURenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: the GPU device to use with the renderer, or NULL to create a device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window where rendering is displayed, or NULL to create an offscreen renderer.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_CreateGPURenderer = hs_bindgen_6efbbd05c80e02d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetGPURendererDevice@
+foreign import ccall safe "hs_bindgen_aa8cead59246ca07"
+  hs_bindgen_aa8cead59246ca07_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetGPURendererDevice@
+hs_bindgen_aa8cead59246ca07
+  :: BG.Ptr SDL_Renderer
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice)
+hs_bindgen_aa8cead59246ca07 =
+  BG.fromFFIType hs_bindgen_aa8cead59246ca07_base
+
+-- | Return the GPU device used by a renderer.
+--
+--     [Returns]: the GPU device used by the renderer, or NULL if the renderer is not a GPU renderer; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetGPURendererDevice@, defined at @SDL3\/SDL_render.h 400:45@
+sDL_GetGPURendererDevice
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice)
+sDL_GetGPURendererDevice =
+  hs_bindgen_aa8cead59246ca07
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateSoftwareRenderer@
+foreign import ccall safe "hs_bindgen_154eef5a69d9f0de"
+  hs_bindgen_154eef5a69d9f0de_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateSoftwareRenderer@
+hs_bindgen_154eef5a69d9f0de
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_154eef5a69d9f0de =
+  BG.fromFFIType hs_bindgen_154eef5a69d9f0de_base
+
+-- | Create a 2D software rendering context for a surface.
+--
+--     Two other API which can be used to create 'SDL_Renderer': @SDL_CreateRenderer()@ and @SDL_CreateWindowAndRenderer()@. These can /also/ create a software renderer, but they are intended to be used with an SDL_Window as the final destination and not an SDL_Surface.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyRenderer'
+--
+--     [C declaration]: @SDL_CreateSoftwareRenderer@, defined at @SDL3\/SDL_render.h 421:44@
+sDL_CreateSoftwareRenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the SDL_Surface structure representing the surface where rendering is done.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_CreateSoftwareRenderer =
+  hs_bindgen_154eef5a69d9f0de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderer@
+foreign import ccall safe "hs_bindgen_6b28e604d7d033f7"
+  hs_bindgen_6b28e604d7d033f7_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderer@
+hs_bindgen_6b28e604d7d033f7
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_6b28e604d7d033f7 =
+  BG.fromFFIType hs_bindgen_6b28e604d7d033f7_base
+
+-- | Get the renderer associated with a window.
+--
+--     [Returns]: the rendering context on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRenderer@, defined at @SDL3\/SDL_render.h 434:44@
+sDL_GetRenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_GetRenderer = hs_bindgen_6b28e604d7d033f7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderWindow@
+foreign import ccall safe "hs_bindgen_b22b3e4ae10bdb0d"
+  hs_bindgen_b22b3e4ae10bdb0d_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderWindow@
+hs_bindgen_b22b3e4ae10bdb0d
+  :: BG.Ptr SDL_Renderer
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+hs_bindgen_b22b3e4ae10bdb0d =
+  BG.fromFFIType hs_bindgen_b22b3e4ae10bdb0d_base
+
+-- | Get the window associated with a renderer.
+--
+--     [Returns]: the window on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRenderWindow@, defined at @SDL3\/SDL_render.h 447:42@
+sDL_GetRenderWindow
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+sDL_GetRenderWindow = hs_bindgen_b22b3e4ae10bdb0d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRendererName@
+foreign import ccall safe "hs_bindgen_599c50262188b811"
+  hs_bindgen_599c50262188b811_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRendererName@
+hs_bindgen_599c50262188b811
+  :: BG.Ptr SDL_Renderer
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_599c50262188b811 =
+  BG.fromFFIType hs_bindgen_599c50262188b811_base
+
+-- | Get the name of a renderer.
+--
+--     [Returns]: the name of the selected renderer, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', 'sDL_CreateRendererWithProperties'
+--
+--     [C declaration]: @SDL_GetRendererName@, defined at @SDL3\/SDL_render.h 463:42@
+sDL_GetRendererName
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetRendererName = hs_bindgen_599c50262188b811
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRendererProperties@
+foreign import ccall safe "hs_bindgen_4a11529b7951c637"
+  hs_bindgen_4a11529b7951c637_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRendererProperties@
+hs_bindgen_4a11529b7951c637
+  :: BG.Ptr SDL_Renderer
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_4a11529b7951c637 =
+  BG.fromFFIType hs_bindgen_4a11529b7951c637_base
+
+-- | Get the properties associated with a renderer.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_RENDERER_NAME_STRING'@: the name of the rendering driver
+--
+--     * @'sDL_PROP_RENDERER_WINDOW_POINTER'@: the window where rendering is displayed, if any
+--
+--     * @'sDL_PROP_RENDERER_SURFACE_POINTER'@: the surface where rendering is displayed, if this is a software renderer without a window
+--
+--     * @'sDL_PROP_RENDERER_VSYNC_NUMBER'@: the current vsync setting
+--
+--     * @'sDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER'@: the maximum texture width and height
+--
+--     * @'sDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER'@: a (const SDL_PixelFormat *) array of pixel formats, terminated with SDL_PIXELFORMAT_UNKNOWN, representing the available texture formats for this renderer.
+--
+--     * @'sDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN'@: true if the renderer supports SDL_TEXTURE_ADDRESS_WRAP on non-power-of-two textures.
+--
+--     * @'sDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the colorspace for output to the display, defaults to SDL_COLORSPACE_SRGB.
+--
+--     * @'sDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN'@: true if the output colorspace is SDL_COLORSPACE_SRGB_LINEAR and the renderer is showing on a display with HDR enabled. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT'@: the value of SDR white in the SDL_COLORSPACE_SRGB_LINEAR colorspace. When HDR is enabled, this value is automatically multiplied into the color scale. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_RENDERER_HDR_HEADROOM_FLOAT'@: the additional high dynamic range that can be displayed, in terms of the SDR white point. When HDR is not enabled, this will be 1.0. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     With the direct3d renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D9_DEVICE_POINTER'@: the IDirect3DDevice9 associated with the renderer
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D11_DEVICE_POINTER'@: the ID3D11Device associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_D3D11_SWAPCHAIN_POINTER'@: the IDXGISwapChain1 associated with the renderer. This may change when the window is resized.
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D12_DEVICE_POINTER'@: the ID3D12Device associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_D3D12_SWAPCHAIN_POINTER'@: the IDXGISwapChain4 associated with the renderer.
+--
+--     * @'sDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER'@: the ID3D12CommandQueue associated with the renderer
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_INSTANCE_POINTER'@: the VkInstance associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_SURFACE_NUMBER'@: the VkSurfaceKHR associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_PHYSICAL_DEVICE_POINTER'@: the VkPhysicalDevice associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_DEVICE_POINTER'@: the VkDevice associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for rendering
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for presentation
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER'@: the number of swapchain images, or potential frames in flight, used by the Vulkan renderer
+--
+--     With the gpu renderer:
+--
+--     * @'sDL_PROP_RENDERER_GPU_DEVICE_POINTER'@: the SDL_GPUDevice associated with the renderer
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRendererProperties@, defined at @SDL3\/SDL_render.h 551:46@
+sDL_GetRendererProperties
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetRendererProperties =
+  hs_bindgen_4a11529b7951c637
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderOutputSize@
+foreign import ccall safe "hs_bindgen_1d433c9827126af7"
+  hs_bindgen_1d433c9827126af7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderOutputSize@
+hs_bindgen_1d433c9827126af7
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_1d433c9827126af7 =
+  BG.fromFFIType hs_bindgen_1d433c9827126af7_base
+
+-- | Get the output size in pixels of a rendering context.
+--
+--     This returns the true output size in pixels, ignoring any render targets or logical size and presentation.
+--
+--     For the output size of the current rendering target, with logical size adjustments, use @SDL_GetCurrentRenderOutputSize()@ instead.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCurrentRenderOutputSize'
+--
+--     [C declaration]: @SDL_GetRenderOutputSize@, defined at @SDL3\/SDL_render.h 600:34@
+sDL_GetRenderOutputSize
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width in pixels.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height in pixels.
+  -> IO BG.CBool
+sDL_GetRenderOutputSize = hs_bindgen_1d433c9827126af7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetCurrentRenderOutputSize@
+foreign import ccall safe "hs_bindgen_5d30db125155788b"
+  hs_bindgen_5d30db125155788b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetCurrentRenderOutputSize@
+hs_bindgen_5d30db125155788b
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_5d30db125155788b =
+  BG.fromFFIType hs_bindgen_5d30db125155788b_base
+
+-- | Get the current output size in pixels of a rendering context.
+--
+--     If a rendering target is active, this will return the size of the rendering target in pixels, otherwise return the value of @SDL_GetRenderOutputSize()@.
+--
+--     Rendering target or not, the output will be adjusted by the current logical presentation state, dictated by @SDL_SetRenderLogicalPresentation()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderOutputSize'
+--
+--     [C declaration]: @SDL_GetCurrentRenderOutputSize@, defined at @SDL3\/SDL_render.h 623:34@
+sDL_GetCurrentRenderOutputSize
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the current width.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the current height.
+  -> IO BG.CBool
+sDL_GetCurrentRenderOutputSize =
+  hs_bindgen_5d30db125155788b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateTexture@
+foreign import ccall safe "hs_bindgen_052b6ffc7143143e"
+  hs_bindgen_052b6ffc7143143e_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateTexture@
+hs_bindgen_052b6ffc7143143e
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> SDL_TextureAccess
+  -> BG.CInt
+  -> BG.CInt
+  -> IO (BG.Ptr SDL_Texture)
+hs_bindgen_052b6ffc7143143e =
+  BG.fromFFIType hs_bindgen_052b6ffc7143143e_base
+
+-- | Create a texture for a rendering context.
+--
+--     The contents of a texture when first created are not defined.
+--
+--     [Returns]: the created texture or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTextureFromSurface', 'sDL_CreateTextureWithProperties', 'sDL_DestroyTexture', 'sDL_GetTextureSize', 'sDL_UpdateTexture'
+--
+--     [C declaration]: @SDL_CreateTexture@, defined at @SDL3\/SDL_render.h 648:43@
+sDL_CreateTexture
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the enumerated values in SDL_PixelFormat.
+  -> SDL_TextureAccess
+  -- ^
+  --
+  --           [@access@]: one of the enumerated values in 'SDL_TextureAccess'.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the texture in pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the texture in pixels.
+  -> IO (BG.Ptr SDL_Texture)
+sDL_CreateTexture = hs_bindgen_052b6ffc7143143e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateTextureFromSurface@
+foreign import ccall safe "hs_bindgen_4d23668000d5b53c"
+  hs_bindgen_4d23668000d5b53c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateTextureFromSurface@
+hs_bindgen_4d23668000d5b53c
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO (BG.Ptr SDL_Texture)
+hs_bindgen_4d23668000d5b53c =
+  BG.fromFFIType hs_bindgen_4d23668000d5b53c_base
+
+-- | Create a texture from an existing surface.
+--
+--     The surface is not modified or freed by this function.
+--
+--     The 'SDL_TextureAccess' hint for the created texture is @SDL_TEXTUREACCESS_STATIC@.
+--
+--     The pixel format of the created texture may be different from the pixel format of the surface, and can be queried using the SDL_PROP_TEXTURE_FORMAT_NUMBER property.
+--
+--     [Returns]: the created texture or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTexture', 'sDL_CreateTextureWithProperties', 'sDL_DestroyTexture'
+--
+--     [C declaration]: @SDL_CreateTextureFromSurface@, defined at @SDL3\/SDL_render.h 676:43@
+sDL_CreateTextureFromSurface
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the SDL_Surface structure containing pixel data used to fill the texture.
+  -> IO (BG.Ptr SDL_Texture)
+sDL_CreateTextureFromSurface =
+  hs_bindgen_4d23668000d5b53c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateTextureWithProperties@
+foreign import ccall safe "hs_bindgen_56364d1627b2f54e"
+  hs_bindgen_56364d1627b2f54e_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateTextureWithProperties@
+hs_bindgen_56364d1627b2f54e
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Texture)
+hs_bindgen_56364d1627b2f54e =
+  BG.fromFFIType hs_bindgen_56364d1627b2f54e_base
+
+-- | Create a texture for a rendering context with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the texture colorspace, defaults to SDL_COLORSPACE_SRGB_LINEAR for floating point textures, SDL_COLORSPACE_HDR10 for 10-bit textures, SDL_COLORSPACE_SRGB for other RGB textures and SDL_COLORSPACE_JPEG for YUV textures.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER'@: one of the enumerated values in SDL_PixelFormat, defaults to the best RGBA format for the renderer
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER'@: one of the enumerated values in 'SDL_TextureAccess', defaults to SDL_TEXTUREACCESS_STATIC
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER'@: the width of the texture in pixels, required
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER'@: the height of the texture in pixels, required
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_PALETTE_POINTER'@: an SDL_Palette to use with palettized texture formats. This can be set later with @SDL_SetTexturePalette()@
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point textures, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 100 for HDR10 textures and 1.0 for floating point textures.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point textures, this defines the maximum dynamic range used by the content, in terms of the SDR white point. This would be equivalent to maxCLL \/ SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT for HDR10 content. If this is defined, any values outside the range supported by the display will be scaled into the available HDR headroom, otherwise they are clipped.
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER'@: the ID3D11Texture2D associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER'@: the ID3D11Texture2D associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER'@: the ID3D11Texture2D associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER'@: the ID3D12Resource associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER'@: the ID3D12Resource associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER'@: the ID3D12Resource associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the metal renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER'@: the CVPixelBufferRef associated with the texture, if you want to create a texture from an existing pixel buffer.
+--
+--     With the opengl renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the opengles2 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER'@: the VkImage associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER'@: the VkImageLayout for the VkImage, defaults to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
+--
+--     With the GPU renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER'@: the SDL_GPUTexture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_NUMBER@: the SDL_GPUTexture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_NUMBER@: the SDL_GPUTexture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_NUMBER@: the SDL_GPUTexture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     [Returns]: the created texture or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateProperties, 'sDL_CreateTexture', 'sDL_CreateTextureFromSurface', 'sDL_DestroyTexture', 'sDL_GetTextureSize', 'sDL_UpdateTexture'
+--
+--     [C declaration]: @SDL_CreateTextureWithProperties@, defined at @SDL3\/SDL_render.h 806:43@
+sDL_CreateTextureWithProperties
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Texture)
+sDL_CreateTextureWithProperties =
+  hs_bindgen_56364d1627b2f54e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureProperties@
+foreign import ccall safe "hs_bindgen_5a086b7bc8bee33d"
+  hs_bindgen_5a086b7bc8bee33d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureProperties@
+hs_bindgen_5a086b7bc8bee33d
+  :: BG.Ptr SDL_Texture
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_5a086b7bc8bee33d =
+  BG.fromFFIType hs_bindgen_5a086b7bc8bee33d_base
+
+-- | Get the properties associated with a texture.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_TEXTURE_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the texture colorspace.
+--
+--     * @'sDL_PROP_TEXTURE_FORMAT_NUMBER'@: one of the enumerated values in SDL_PixelFormat.
+--
+--     * @'sDL_PROP_TEXTURE_ACCESS_NUMBER'@: one of the enumerated values in 'SDL_TextureAccess'.
+--
+--     * @'sDL_PROP_TEXTURE_WIDTH_NUMBER'@: the width of the texture in pixels.
+--
+--     * @'sDL_PROP_TEXTURE_HEIGHT_NUMBER'@: the height of the texture in pixels.
+--
+--     * @'sDL_PROP_TEXTURE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point textures, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 100 for HDR10 textures and 1.0 for other textures.
+--
+--     * @'sDL_PROP_TEXTURE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point textures, this defines the maximum dynamic range used by the content, in terms of the SDR white point. If this is defined, any values outside the range supported by the display will be scaled into the available HDR headroom, otherwise they are clipped. This defaults to 1.0 for SDR textures, 4.0 for HDR10 textures, and no default for floating point textures.
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER'@: the ID3D11Texture2D associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_U_POINTER'@: the ID3D11Texture2D associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_V_POINTER'@: the ID3D11Texture2D associated with the V plane of a YUV texture
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER'@: the ID3D12Resource associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_U_POINTER'@: the ID3D12Resource associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_V_POINTER'@: the ID3D12Resource associated with the V plane of a YUV texture
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER'@: the VkImage associated with the texture
+--
+--     With the opengl renderer:
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER'@: the GLuint texture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_TARGET_NUMBER'@: the GLenum for the texture target (@GL_TEXTURE_2D@, @GL_TEXTURE_RECTANGLE_ARB@, etc)
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEX_W_FLOAT'@: the texture coordinate width of the texture (0.0 - 1.0)
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEX_H_FLOAT'@: the texture coordinate height of the texture (0.0 - 1.0)
+--
+--     With the opengles2 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER'@: the GLenum for the texture target (@GL_TEXTURE_2D@, @GL_TEXTURE_EXTERNAL_OES@, etc)
+--
+--     With the gpu renderer:
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_POINTER'@: the SDL_GPUTexture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER'@: the SDL_GPUTexture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER'@: the SDL_GPUTexture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER'@: the SDL_GPUTexture associated with the V plane of a YUV texture
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTextureProperties@, defined at @SDL3\/SDL_render.h 935:46@
+sDL_GetTextureProperties
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetTextureProperties =
+  hs_bindgen_5a086b7bc8bee33d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRendererFromTexture@
+foreign import ccall safe "hs_bindgen_952d60b9be750f80"
+  hs_bindgen_952d60b9be750f80_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRendererFromTexture@
+hs_bindgen_952d60b9be750f80
+  :: BG.Ptr SDL_Texture
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_952d60b9be750f80 =
+  BG.fromFFIType hs_bindgen_952d60b9be750f80_base
+
+-- | Get the renderer that created an 'SDL_Texture'.
+--
+--     [Returns]: a pointer to the 'SDL_Renderer' that created the texture, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRendererFromTexture@, defined at @SDL3\/SDL_render.h 979:44@
+sDL_GetRendererFromTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_GetRendererFromTexture =
+  hs_bindgen_952d60b9be750f80
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureSize@
+foreign import ccall safe "hs_bindgen_593080867d87a9cb"
+  hs_bindgen_593080867d87a9cb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureSize@
+hs_bindgen_593080867d87a9cb
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_593080867d87a9cb =
+  BG.fromFFIType hs_bindgen_593080867d87a9cb_base
+
+-- | Get the size of a texture, as floating point values.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTextureSize@, defined at @SDL3\/SDL_render.h 996:34@
+sDL_GetTextureSize
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width of the texture in pixels. This argument can be NULL if you don\'t need this information.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height of the texture in pixels. This argument can be NULL if you don\'t need this information.
+  -> IO BG.CBool
+sDL_GetTextureSize = hs_bindgen_593080867d87a9cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTexturePalette@
+foreign import ccall safe "hs_bindgen_c0c58495bafd931b"
+  hs_bindgen_c0c58495bafd931b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTexturePalette@
+hs_bindgen_c0c58495bafd931b
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -> IO BG.CBool
+hs_bindgen_c0c58495bafd931b =
+  BG.fromFFIType hs_bindgen_c0c58495bafd931b_base
+
+-- | Set the palette used by a texture.
+--
+--     Setting the palette keeps an internal reference to the palette, which can be safely destroyed afterwards.
+--
+--     A single palette can be shared with many textures.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: SDL_CreatePalette, 'sDL_GetTexturePalette'
+--
+--     [C declaration]: @SDL_SetTexturePalette@, defined at @SDL3\/SDL_render.h 1018:34@
+sDL_SetTexturePalette
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the SDL_Palette structure to use.
+  -> IO BG.CBool
+sDL_SetTexturePalette = hs_bindgen_c0c58495bafd931b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTexturePalette@
+foreign import ccall safe "hs_bindgen_23b273d543966d78"
+  hs_bindgen_23b273d543966d78_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTexturePalette@
+hs_bindgen_23b273d543966d78
+  :: BG.Ptr SDL_Texture
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+hs_bindgen_23b273d543966d78 =
+  BG.fromFFIType hs_bindgen_23b273d543966d78_base
+
+-- | Get the palette used by a texture.
+--
+--     [Returns]: a pointer to the palette used by the texture, or NULL if there is no palette used.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetTexturePalette'
+--
+--     [C declaration]: @SDL_GetTexturePalette@, defined at @SDL3\/SDL_render.h 1033:43@
+sDL_GetTexturePalette
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+sDL_GetTexturePalette = hs_bindgen_23b273d543966d78
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureColorMod@
+foreign import ccall safe "hs_bindgen_823afe6398e7b8c5"
+  hs_bindgen_823afe6398e7b8c5_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureColorMod@
+hs_bindgen_823afe6398e7b8c5
+  :: BG.Ptr SDL_Texture
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_823afe6398e7b8c5 =
+  BG.fromFFIType hs_bindgen_823afe6398e7b8c5_base
+
+-- | Set an additional color value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * (color \/ 255)@
+--
+--     Color modulation is not always supported by the renderer; it will return false if color modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureColorMod', 'sDL_SetTextureAlphaMod', 'sDL_SetTextureColorModFloat'
+--
+--     [C declaration]: @SDL_SetTextureColorMod@, defined at @SDL3\/SDL_render.h 1062:34@
+sDL_SetTextureColorMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into copy operations.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into copy operations.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into copy operations.
+  -> IO BG.CBool
+sDL_SetTextureColorMod = hs_bindgen_823afe6398e7b8c5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureColorModFloat@
+foreign import ccall safe "hs_bindgen_7ad37bb707c0047a"
+  hs_bindgen_7ad37bb707c0047a_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureColorModFloat@
+hs_bindgen_7ad37bb707c0047a
+  :: BG.Ptr SDL_Texture
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_7ad37bb707c0047a =
+  BG.fromFFIType hs_bindgen_7ad37bb707c0047a_base
+
+-- | Set an additional color value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * color@
+--
+--     Color modulation is not always supported by the renderer; it will return false if color modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureColorModFloat', 'sDL_SetTextureAlphaModFloat', 'sDL_SetTextureColorMod'
+--
+--     [C declaration]: @SDL_SetTextureColorModFloat@, defined at @SDL3\/SDL_render.h 1092:34@
+sDL_SetTextureColorModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into copy operations.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into copy operations.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into copy operations.
+  -> IO BG.CBool
+sDL_SetTextureColorModFloat =
+  hs_bindgen_7ad37bb707c0047a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureColorMod@
+foreign import ccall safe "hs_bindgen_7a0ccf77a4fdfc3e"
+  hs_bindgen_7a0ccf77a4fdfc3e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureColorMod@
+hs_bindgen_7a0ccf77a4fdfc3e
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_7a0ccf77a4fdfc3e =
+  BG.fromFFIType hs_bindgen_7a0ccf77a4fdfc3e_base
+
+-- | Get the additional color value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaMod', 'sDL_GetTextureColorModFloat', 'sDL_SetTextureColorMod'
+--
+--     [C declaration]: @SDL_GetTextureColorMod@, defined at @SDL3\/SDL_render.h 1113:34@
+sDL_GetTextureColorMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO BG.CBool
+sDL_GetTextureColorMod = hs_bindgen_7a0ccf77a4fdfc3e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureColorModFloat@
+foreign import ccall safe "hs_bindgen_842e59bbba82a5a3"
+  hs_bindgen_842e59bbba82a5a3_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureColorModFloat@
+hs_bindgen_842e59bbba82a5a3
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_842e59bbba82a5a3 =
+  BG.fromFFIType hs_bindgen_842e59bbba82a5a3_base
+
+-- | Get the additional color value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaModFloat', 'sDL_GetTextureColorMod', 'sDL_SetTextureColorModFloat'
+--
+--     [C declaration]: @SDL_GetTextureColorModFloat@, defined at @SDL3\/SDL_render.h 1133:34@
+sDL_GetTextureColorModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO BG.CBool
+sDL_GetTextureColorModFloat =
+  hs_bindgen_842e59bbba82a5a3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureAlphaMod@
+foreign import ccall safe "hs_bindgen_cd0da7f365c5d74f"
+  hs_bindgen_cd0da7f365c5d74f_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureAlphaMod@
+hs_bindgen_cd0da7f365c5d74f
+  :: BG.Ptr SDL_Texture
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_cd0da7f365c5d74f =
+  BG.fromFFIType hs_bindgen_cd0da7f365c5d74f_base
+
+-- | Set an additional alpha value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * (alpha \/ 255)@
+--
+--     Alpha modulation is not always supported by the renderer; it will return false if alpha modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaMod', 'sDL_SetTextureAlphaModFloat', 'sDL_SetTextureColorMod'
+--
+--     [C declaration]: @SDL_SetTextureAlphaMod@, defined at @SDL3\/SDL_render.h 1159:34@
+sDL_SetTextureAlphaMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: the source alpha value multiplied into copy operations.
+  -> IO BG.CBool
+sDL_SetTextureAlphaMod = hs_bindgen_cd0da7f365c5d74f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureAlphaModFloat@
+foreign import ccall safe "hs_bindgen_3c8a499336e4d5a3"
+  hs_bindgen_3c8a499336e4d5a3_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureAlphaModFloat@
+hs_bindgen_3c8a499336e4d5a3
+  :: BG.Ptr SDL_Texture
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_3c8a499336e4d5a3 =
+  BG.fromFFIType hs_bindgen_3c8a499336e4d5a3_base
+
+-- | Set an additional alpha value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * alpha@
+--
+--     Alpha modulation is not always supported by the renderer; it will return false if alpha modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaModFloat', 'sDL_SetTextureAlphaMod', 'sDL_SetTextureColorModFloat'
+--
+--     [C declaration]: @SDL_SetTextureAlphaModFloat@, defined at @SDL3\/SDL_render.h 1185:34@
+sDL_SetTextureAlphaModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@alpha@]: the source alpha value multiplied into copy operations.
+  -> IO BG.CBool
+sDL_SetTextureAlphaModFloat =
+  hs_bindgen_3c8a499336e4d5a3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureAlphaMod@
+foreign import ccall safe "hs_bindgen_d0b8db7f236a27d6"
+  hs_bindgen_d0b8db7f236a27d6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureAlphaMod@
+hs_bindgen_d0b8db7f236a27d6
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_d0b8db7f236a27d6 =
+  BG.fromFFIType hs_bindgen_d0b8db7f236a27d6_base
+
+-- | Get the additional alpha value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaModFloat', 'sDL_GetTextureColorMod', 'sDL_SetTextureAlphaMod'
+--
+--     [C declaration]: @SDL_GetTextureAlphaMod@, defined at @SDL3\/SDL_render.h 1203:34@
+sDL_GetTextureAlphaMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO BG.CBool
+sDL_GetTextureAlphaMod = hs_bindgen_d0b8db7f236a27d6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureAlphaModFloat@
+foreign import ccall safe "hs_bindgen_10d5dcf405fda170"
+  hs_bindgen_10d5dcf405fda170_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureAlphaModFloat@
+hs_bindgen_10d5dcf405fda170
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_10d5dcf405fda170 =
+  BG.fromFFIType hs_bindgen_10d5dcf405fda170_base
+
+-- | Get the additional alpha value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaMod', 'sDL_GetTextureColorModFloat', 'sDL_SetTextureAlphaModFloat'
+--
+--     [C declaration]: @SDL_GetTextureAlphaModFloat@, defined at @SDL3\/SDL_render.h 1221:34@
+sDL_GetTextureAlphaModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO BG.CBool
+sDL_GetTextureAlphaModFloat =
+  hs_bindgen_10d5dcf405fda170
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureBlendMode@
+foreign import ccall safe "hs_bindgen_2881e5a760914ac5"
+  hs_bindgen_2881e5a760914ac5_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureBlendMode@
+hs_bindgen_2881e5a760914ac5
+  :: BG.Ptr SDL_Texture
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_2881e5a760914ac5 =
+  BG.fromFFIType hs_bindgen_2881e5a760914ac5_base
+
+-- | Set the blend mode for a texture, used by @SDL_RenderTexture()@.
+--
+--     If the blend mode is not supported, the closest supported mode is chosen and this function returns false.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureBlendMode'
+--
+--     [C declaration]: @SDL_SetTextureBlendMode@, defined at @SDL3\/SDL_render.h 1240:34@
+sDL_SetTextureBlendMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for texture blending.
+  -> IO BG.CBool
+sDL_SetTextureBlendMode = hs_bindgen_2881e5a760914ac5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureBlendMode@
+foreign import ccall safe "hs_bindgen_816bbcb1b4c3283a"
+  hs_bindgen_816bbcb1b4c3283a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureBlendMode@
+hs_bindgen_816bbcb1b4c3283a
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_816bbcb1b4c3283a =
+  BG.fromFFIType hs_bindgen_816bbcb1b4c3283a_base
+
+-- | Get the blend mode used for texture copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextureBlendMode'
+--
+--     [C declaration]: @SDL_GetTextureBlendMode@, defined at @SDL3\/SDL_render.h 1256:34@
+sDL_GetTextureBlendMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO BG.CBool
+sDL_GetTextureBlendMode = hs_bindgen_816bbcb1b4c3283a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureScaleMode@
+foreign import ccall safe "hs_bindgen_f9ee16ea95e7fdf6"
+  hs_bindgen_f9ee16ea95e7fdf6_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetTextureScaleMode@
+hs_bindgen_f9ee16ea95e7fdf6
+  :: BG.Ptr SDL_Texture
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_f9ee16ea95e7fdf6 =
+  BG.fromFFIType hs_bindgen_f9ee16ea95e7fdf6_base
+
+-- | Set the scale mode used for texture scale operations.
+--
+--     The default texture scale mode is SDL_SCALEMODE_LINEAR.
+--
+--     If the scale mode is not supported, the closest supported mode is chosen.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureScaleMode'
+--
+--     [C declaration]: @SDL_SetTextureScaleMode@, defined at @SDL3\/SDL_render.h 1276:34@
+sDL_SetTextureScaleMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the SDL_ScaleMode to use for texture scaling.
+  -> IO BG.CBool
+sDL_SetTextureScaleMode = hs_bindgen_f9ee16ea95e7fdf6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureScaleMode@
+foreign import ccall safe "hs_bindgen_6de3c22a0ac3ed25"
+  hs_bindgen_6de3c22a0ac3ed25_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetTextureScaleMode@
+hs_bindgen_6de3c22a0ac3ed25
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_6de3c22a0ac3ed25 =
+  BG.fromFFIType hs_bindgen_6de3c22a0ac3ed25_base
+
+-- | Get the scale mode used for texture scale operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextureScaleMode'
+--
+--     [C declaration]: @SDL_GetTextureScaleMode@, defined at @SDL3\/SDL_render.h 1292:34@
+sDL_GetTextureScaleMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: a pointer filled in with the current scale mode.
+  -> IO BG.CBool
+sDL_GetTextureScaleMode = hs_bindgen_6de3c22a0ac3ed25
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_UpdateTexture@
+foreign import ccall safe "hs_bindgen_34af457e8db29591"
+  hs_bindgen_34af457e8db29591_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_UpdateTexture@
+hs_bindgen_34af457e8db29591
+  :: BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_34af457e8db29591 =
+  BG.fromFFIType hs_bindgen_34af457e8db29591_base
+
+-- | Update the given texture rectangle with new pixel data.
+--
+--     The pixel data must be in the pixel format of the texture, which can be queried using the SDL_PROP_TEXTURE_FORMAT_NUMBER property.
+--
+--     This is a fairly slow function, intended for use with static textures that do not change often.
+--
+--     If the texture is intended to be updated often, it is preferred to create the texture as streaming and use the locking functions referenced below. While this function will work with streaming textures, for optimization reasons you may not get the pixels back if you lock the texture afterward.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTexture', 'sDL_UnlockTexture', 'sDL_UpdateNVTexture', 'sDL_UpdateYUVTexture'
+--
+--     [C declaration]: @SDL_UpdateTexture@, defined at @SDL3\/SDL_render.h 1326:34@
+sDL_UpdateTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@pixels@]: the raw pixel data in the format of the texture.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@pitch@]: the number of bytes in a row of pixel data, including padding between lines.
+  -> IO BG.CBool
+sDL_UpdateTexture = hs_bindgen_34af457e8db29591
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_UpdateYUVTexture@
+foreign import ccall safe "hs_bindgen_a7b149fabb767cd5"
+  hs_bindgen_a7b149fabb767cd5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_UpdateYUVTexture@
+hs_bindgen_a7b149fabb767cd5
+  :: BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_a7b149fabb767cd5 =
+  BG.fromFFIType hs_bindgen_a7b149fabb767cd5_base
+
+-- | Update a rectangle within a planar YV12 or IYUV texture with new pixel data.
+--
+--     You can use @SDL_UpdateTexture()@ as long as your pixel data is a contiguous block of Y and U\/V planes in the proper order, but this function is available if your pixel data is not contiguous.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UpdateNVTexture', 'sDL_UpdateTexture'
+--
+--     [C declaration]: @SDL_UpdateYUVTexture@, defined at @SDL3\/SDL_render.h 1358:34@
+sDL_UpdateYUVTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Yplane@]: the raw pixel data for the Y plane.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@Ypitch@]: the number of bytes between rows of pixel data for the Y plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Uplane@]: the raw pixel data for the U plane.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@Upitch@]: the number of bytes between rows of pixel data for the U plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Vplane@]: the raw pixel data for the V plane.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@Vpitch@]: the number of bytes between rows of pixel data for the V plane.
+  -> IO BG.CBool
+sDL_UpdateYUVTexture = hs_bindgen_a7b149fabb767cd5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_UpdateNVTexture@
+foreign import ccall safe "hs_bindgen_2d94f5e4965716c8"
+  hs_bindgen_2d94f5e4965716c8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_UpdateNVTexture@
+hs_bindgen_2d94f5e4965716c8
+  :: BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_2d94f5e4965716c8 =
+  BG.fromFFIType hs_bindgen_2d94f5e4965716c8_base
+
+-- | Update a rectangle within a planar NV12 or NV21 texture with new pixels.
+--
+--     You can use @SDL_UpdateTexture()@ as long as your pixel data is a contiguous block of NV12\/21 planes in the proper order, but this function is available if your pixel data is not contiguous.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UpdateTexture', 'sDL_UpdateYUVTexture'
+--
+--     [C declaration]: @SDL_UpdateNVTexture@, defined at @SDL3\/SDL_render.h 1390:34@
+sDL_UpdateNVTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Yplane@]: the raw pixel data for the Y plane.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@Ypitch@]: the number of bytes between rows of pixel data for the Y plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@UVplane@]: the raw pixel data for the UV plane.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@UVpitch@]: the number of bytes between rows of pixel data for the UV plane.
+  -> IO BG.CBool
+sDL_UpdateNVTexture = hs_bindgen_2d94f5e4965716c8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_LockTexture@
+foreign import ccall safe "hs_bindgen_b121055dd1158359"
+  hs_bindgen_b121055dd1158359_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_LockTexture@
+hs_bindgen_b121055dd1158359
+  :: BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_b121055dd1158359 =
+  BG.fromFFIType hs_bindgen_b121055dd1158359_base
+
+-- | Lock a portion of the texture for __write-only__ pixel access.
+--
+--     As an optimization, the pixels made available for editing don\'t necessarily contain the old texture data. This is a write-only operation, and if you need to keep a copy of the texture data you should do that at the application level.
+--
+--     You must use @SDL_UnlockTexture()@ to unlock the pixels and apply any changes.
+--
+--     [Returns]: true on success or false if the texture is not valid or was not created with @SDL_TEXTUREACCESS_STREAMING@; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTextureToSurface', 'sDL_UnlockTexture'
+--
+--     [C declaration]: @SDL_LockTexture@, defined at @SDL3\/SDL_render.h 1425:34@
+sDL_LockTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to lock for access, which was created with @SDL_TEXTUREACCESS_STREAMING@.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to lock for access; NULL to lock the entire texture.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@pixels@]: this is filled in with a pointer to the locked pixels, appropriately offset by the locked area.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@pitch@]: this is filled in with the pitch of the locked pixels; the pitch is the length of one row in bytes.
+  -> IO BG.CBool
+sDL_LockTexture = hs_bindgen_b121055dd1158359
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_LockTextureToSurface@
+foreign import ccall safe "hs_bindgen_1526f9100ed55b03"
+  hs_bindgen_1526f9100ed55b03_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_LockTextureToSurface@
+hs_bindgen_1526f9100ed55b03
+  :: BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+  -> IO BG.CBool
+hs_bindgen_1526f9100ed55b03 =
+  BG.fromFFIType hs_bindgen_1526f9100ed55b03_base
+
+-- | Lock a portion of the texture for __write-only__ pixel access, and expose it as a SDL surface.
+--
+--     Besides providing an SDL_Surface instead of raw pixel data, this function operates like SDL_LockTexture.
+--
+--     As an optimization, the pixels made available for editing don\'t necessarily contain the old texture data. This is a write-only operation, and if you need to keep a copy of the texture data you should do that at the application level.
+--
+--     You must use @SDL_UnlockTexture()@ to unlock the pixels and apply any changes.
+--
+--     The returned surface is freed internally after calling @SDL_UnlockTexture()@ or @SDL_DestroyTexture()@. The caller should not free it.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTexture', 'sDL_UnlockTexture'
+--
+--     [C declaration]: @SDL_LockTextureToSurface@, defined at @SDL3\/SDL_render.h 1463:34@
+sDL_LockTextureToSurface
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to lock for access, which must be created with @SDL_TEXTUREACCESS_STREAMING@.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle to lock for access. If the rect is NULL, the entire texture will be locked.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+  -- ^
+  --
+  --           [@surface@]: a pointer to an SDL surface of size __rect__. Don\'t assume any specific pixel content.
+  -> IO BG.CBool
+sDL_LockTextureToSurface =
+  hs_bindgen_1526f9100ed55b03
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_UnlockTexture@
+foreign import ccall safe "hs_bindgen_1159217b1f34f925"
+  hs_bindgen_1159217b1f34f925_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_UnlockTexture@
+hs_bindgen_1159217b1f34f925
+  :: BG.Ptr SDL_Texture
+  -> IO ()
+hs_bindgen_1159217b1f34f925 =
+  BG.fromFFIType hs_bindgen_1159217b1f34f925_base
+
+-- | Unlock a texture, uploading the changes to video memory, if needed.
+--
+--     __Warning__: Please note that @SDL_LockTexture()@ is intended to be write-only; it will not guarantee the previous contents of the texture will be provided. You must fully initialize any area of a texture that you lock before unlocking it, as the pixels might otherwise be uninitialized memory.
+--
+--     Which is to say: locking and immediately unlocking a texture can result in corrupted textures, depending on the renderer in use.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTexture'
+--
+--     [C declaration]: @SDL_UnlockTexture@, defined at @SDL3\/SDL_render.h 1484:34@
+sDL_UnlockTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: a texture locked by @SDL_LockTexture()@.
+  -> IO ()
+sDL_UnlockTexture = hs_bindgen_1159217b1f34f925
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderTarget@
+foreign import ccall safe "hs_bindgen_4b272fad8dbaa9f4"
+  hs_bindgen_4b272fad8dbaa9f4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderTarget@
+hs_bindgen_4b272fad8dbaa9f4
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> IO BG.CBool
+hs_bindgen_4b272fad8dbaa9f4 =
+  BG.fromFFIType hs_bindgen_4b272fad8dbaa9f4_base
+
+-- | Set a texture as the current rendering target.
+--
+--     The default render target is the window for which the renderer was created. To stop rendering to a texture and render to the window again, call this function with a NULL @texture@.
+--
+--     Viewport, cliprect, scale, and logical presentation are unique to each render target. Get and set functions for these states apply to the current render target set by this function, and those states persist on each target when the current render target changes.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderTarget'
+--
+--     [C declaration]: @SDL_SetRenderTarget@, defined at @SDL3\/SDL_render.h 1511:34@
+sDL_SetRenderTarget
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the targeted texture, which must be created with the @SDL_TEXTUREACCESS_TARGET@ flag, or NULL to render to the window instead of a texture.
+  -> IO BG.CBool
+sDL_SetRenderTarget = hs_bindgen_4b272fad8dbaa9f4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderTarget@
+foreign import ccall safe "hs_bindgen_0f2b08c2b3c8ddb1"
+  hs_bindgen_0f2b08c2b3c8ddb1_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderTarget@
+hs_bindgen_0f2b08c2b3c8ddb1
+  :: BG.Ptr SDL_Renderer
+  -> IO (BG.Ptr SDL_Texture)
+hs_bindgen_0f2b08c2b3c8ddb1 =
+  BG.fromFFIType hs_bindgen_0f2b08c2b3c8ddb1_base
+
+-- | Get the current render target.
+--
+--     The default render target is the window for which the renderer was created, and is reported a NULL here.
+--
+--     [Returns]: the current render target or NULL for the default render target.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderTarget'
+--
+--     [C declaration]: @SDL_GetRenderTarget@, defined at @SDL3\/SDL_render.h 1528:43@
+sDL_GetRenderTarget
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (BG.Ptr SDL_Texture)
+sDL_GetRenderTarget = hs_bindgen_0f2b08c2b3c8ddb1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderLogicalPresentation@
+foreign import ccall safe "hs_bindgen_c8bfb4ad8baf9874"
+  hs_bindgen_c8bfb4ad8baf9874_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderLogicalPresentation@
+hs_bindgen_c8bfb4ad8baf9874
+  :: BG.Ptr SDL_Renderer
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL_RendererLogicalPresentation
+  -> IO BG.CBool
+hs_bindgen_c8bfb4ad8baf9874 =
+  BG.fromFFIType hs_bindgen_c8bfb4ad8baf9874_base
+
+-- | Set a device-independent resolution and presentation mode for rendering.
+--
+--     This function sets the width and height of the logical rendering output. The renderer will act as if the current render target is always the requested dimensions, scaling to the actual resolution as necessary.
+--
+--     This can be useful for games that expect a fixed size, but would like to scale the output to whatever is available, regardless of how a user resizes a window, or if the display is high DPI.
+--
+--     Logical presentation can be used with both render target textures and the renderer\'s window; the state is unique to each render target, and this function sets the state for the current render target. It might be useful to draw to a texture that matches the window dimensions with logical presentation enabled, and then draw that texture across the entire window with logical presentation disabled. Be careful not to render both with logical presentation enabled, however, as this could produce double-letterboxing, etc.
+--
+--     You can disable logical coordinates by setting the mode to SDL_LOGICAL_PRESENTATION_DISABLED, and in that case you get the full pixel resolution of the render target; it is safe to toggle logical presentation during the rendering of a frame: perhaps most of the rendering is done to specific dimensions but to make fonts look sharp, the app turns off logical presentation while drawing text, for example.
+--
+--     You can convert coordinates in an event into rendering coordinates using @SDL_ConvertEventToRenderCoordinates()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertEventToRenderCoordinates', 'sDL_GetRenderLogicalPresentation', 'sDL_GetRenderLogicalPresentationRect'
+--
+--     [C declaration]: @SDL_SetRenderLogicalPresentation@, defined at @SDL3\/SDL_render.h 1575:34@
+sDL_SetRenderLogicalPresentation
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the logical resolution.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the logical resolution.
+  -> SDL_RendererLogicalPresentation
+  -- ^
+  --
+  --           [@mode@]: the presentation mode used.
+  -> IO BG.CBool
+sDL_SetRenderLogicalPresentation =
+  hs_bindgen_c8bfb4ad8baf9874
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderLogicalPresentation@
+foreign import ccall safe "hs_bindgen_88acfc55c8872d4d"
+  hs_bindgen_88acfc55c8872d4d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderLogicalPresentation@
+hs_bindgen_88acfc55c8872d4d
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr SDL_RendererLogicalPresentation
+  -> IO BG.CBool
+hs_bindgen_88acfc55c8872d4d =
+  BG.fromFFIType hs_bindgen_88acfc55c8872d4d_base
+
+-- | Get device independent resolution and presentation mode for rendering.
+--
+--     This function gets the width and height of the logical rendering output, or 0 if a logical resolution is not enabled.
+--
+--     Each render target has its own logical presentation state. This function gets the state for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation'
+--
+--     [C declaration]: @SDL_GetRenderLogicalPresentation@, defined at @SDL3\/SDL_render.h 1600:34@
+sDL_GetRenderLogicalPresentation
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: an int filled with the logical presentation width.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: an int filled with the logical presentation height.
+  -> BG.Ptr SDL_RendererLogicalPresentation
+  -- ^
+  --
+  --           [@mode@]: a variable filled with the logical presentation mode being used.
+  -> IO BG.CBool
+sDL_GetRenderLogicalPresentation =
+  hs_bindgen_88acfc55c8872d4d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderLogicalPresentationRect@
+foreign import ccall safe "hs_bindgen_e6080eb5475f066e"
+  hs_bindgen_e6080eb5475f066e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderLogicalPresentationRect@
+hs_bindgen_e6080eb5475f066e
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_e6080eb5475f066e =
+  BG.fromFFIType hs_bindgen_e6080eb5475f066e_base
+
+-- | Get the final presentation rectangle for rendering.
+--
+--     This function returns the calculated rectangle used for logical presentation, based on the presentation mode and output size. If logical presentation is disabled, it will fill the rectangle with the output size, in pixels.
+--
+--     Each render target has its own logical presentation state. This function gets the rectangle for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation'
+--
+--     [C declaration]: @SDL_GetRenderLogicalPresentationRect@, defined at @SDL3\/SDL_render.h 1625:34@
+sDL_GetRenderLogicalPresentationRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the final presentation rectangle, may be NULL.
+  -> IO BG.CBool
+sDL_GetRenderLogicalPresentationRect =
+  hs_bindgen_e6080eb5475f066e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderCoordinatesFromWindow@
+foreign import ccall safe "hs_bindgen_2ed6b3e16ff69faf"
+  hs_bindgen_2ed6b3e16ff69faf_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderCoordinatesFromWindow@
+hs_bindgen_2ed6b3e16ff69faf
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_2ed6b3e16ff69faf =
+  BG.fromFFIType hs_bindgen_2ed6b3e16ff69faf_base
+
+-- | Get a point in render coordinates when given a point in window coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation', 'sDL_SetRenderScale'
+--
+--     [C declaration]: @SDL_RenderCoordinatesFromWindow@, defined at @SDL3\/SDL_render.h 1652:34@
+sDL_RenderCoordinatesFromWindow
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@window_x@]: the x coordinate in window coordinates.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@window_y@]: the y coordinate in window coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer filled with the x coordinate in render coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer filled with the y coordinate in render coordinates.
+  -> IO BG.CBool
+sDL_RenderCoordinatesFromWindow =
+  hs_bindgen_2ed6b3e16ff69faf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderCoordinatesToWindow@
+foreign import ccall safe "hs_bindgen_694297dc8b16c606"
+  hs_bindgen_694297dc8b16c606_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderCoordinatesToWindow@
+hs_bindgen_694297dc8b16c606
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_694297dc8b16c606 =
+  BG.fromFFIType hs_bindgen_694297dc8b16c606_base
+
+-- | Get a point in window coordinates when given a point in render coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation', 'sDL_SetRenderScale', 'sDL_SetRenderViewport'
+--
+--     [C declaration]: @SDL_RenderCoordinatesToWindow@, defined at @SDL3\/SDL_render.h 1682:34@
+sDL_RenderCoordinatesToWindow
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate in render coordinates.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate in render coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@window_x@]: a pointer filled with the x coordinate in window coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@window_y@]: a pointer filled with the y coordinate in window coordinates.
+  -> IO BG.CBool
+sDL_RenderCoordinatesToWindow =
+  hs_bindgen_694297dc8b16c606
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_ConvertEventToRenderCoordinates@
+foreign import ccall safe "hs_bindgen_4d63449cf75fd80c"
+  hs_bindgen_4d63449cf75fd80c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_ConvertEventToRenderCoordinates@
+hs_bindgen_4d63449cf75fd80c
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event
+  -> IO BG.CBool
+hs_bindgen_4d63449cf75fd80c =
+  BG.fromFFIType hs_bindgen_4d63449cf75fd80c_base
+
+-- | Convert the coordinates in an event to render coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     Various event types are converted with this function: mouse, touch, pen, etc.
+--
+--     Touch coordinates are converted from normalized coordinates in the window to non-normalized rendering coordinates.
+--
+--     Relative mouse coordinates (xrel and yrel event fields) are /also/ converted. Applications that do not want these fields converted should use @SDL_RenderCoordinatesFromWindow()@ on the specific event fields instead of converting the entire event structure.
+--
+--     Once converted, coordinates may be outside the rendering area.
+--
+--     [Returns]: true if the event is converted or doesn\'t need conversion, or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderCoordinatesFromWindow'
+--
+--     [C declaration]: @SDL_ConvertEventToRenderCoordinates@, defined at @SDL3\/SDL_render.h 1718:34@
+sDL_ConvertEventToRenderCoordinates
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event
+  -- ^
+  --
+  --           [@event@]: the event to modify.
+  -> IO BG.CBool
+sDL_ConvertEventToRenderCoordinates =
+  hs_bindgen_4d63449cf75fd80c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderViewport@
+foreign import ccall safe "hs_bindgen_6d15f83fef90049f"
+  hs_bindgen_6d15f83fef90049f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderViewport@
+hs_bindgen_6d15f83fef90049f
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_6d15f83fef90049f =
+  BG.fromFFIType hs_bindgen_6d15f83fef90049f_base
+
+-- | Set the drawing area for rendering on the current target.
+--
+--     Drawing will clip to this area (separately from any clipping done with SDL_SetRenderClipRect), and the top left of the area will become coordinate (0, 0) for future drawing commands.
+--
+--     The area\'s width and height must be >= 0.
+--
+--     Each render target has its own viewport. This function sets the viewport for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderViewport', 'sDL_RenderViewportSet'
+--
+--     [C declaration]: @SDL_SetRenderViewport@, defined at @SDL3\/SDL_render.h 1745:34@
+sDL_SetRenderViewport
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the drawing area, or NULL to set the viewport to the entire target.
+  -> IO BG.CBool
+sDL_SetRenderViewport = hs_bindgen_6d15f83fef90049f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderViewport@
+foreign import ccall safe "hs_bindgen_b94438b981f1f14c"
+  hs_bindgen_b94438b981f1f14c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderViewport@
+hs_bindgen_b94438b981f1f14c
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_b94438b981f1f14c =
+  BG.fromFFIType hs_bindgen_b94438b981f1f14c_base
+
+-- | Get the drawing area for the current target.
+--
+--     Each render target has its own viewport. This function gets the viewport for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderViewportSet', 'sDL_SetRenderViewport'
+--
+--     [C declaration]: @SDL_GetRenderViewport@, defined at @SDL3\/SDL_render.h 1765:34@
+sDL_GetRenderViewport
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the current drawing area.
+  -> IO BG.CBool
+sDL_GetRenderViewport = hs_bindgen_b94438b981f1f14c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderViewportSet@
+foreign import ccall safe "hs_bindgen_a3207f3fc59e8dc9"
+  hs_bindgen_a3207f3fc59e8dc9_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderViewportSet@
+hs_bindgen_a3207f3fc59e8dc9
+  :: BG.Ptr SDL_Renderer
+  -> IO BG.CBool
+hs_bindgen_a3207f3fc59e8dc9 =
+  BG.fromFFIType hs_bindgen_a3207f3fc59e8dc9_base
+
+-- | Return whether an explicit rectangle was set as the viewport.
+--
+--     This is useful if you\'re saving and restoring the viewport and want to know whether you should restore a specific rectangle or NULL.
+--
+--     Each render target has its own viewport. This function checks the viewport for the current render target.
+--
+--     [Returns]: true if the viewport was set to a specific rectangle, or false if it was set to NULL (the entire target).
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderViewport', 'sDL_SetRenderViewport'
+--
+--     [C declaration]: @SDL_RenderViewportSet@, defined at @SDL3\/SDL_render.h 1787:34@
+sDL_RenderViewportSet
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO BG.CBool
+sDL_RenderViewportSet = hs_bindgen_a3207f3fc59e8dc9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderSafeArea@
+foreign import ccall safe "hs_bindgen_4eb48f61abc48f1f"
+  hs_bindgen_4eb48f61abc48f1f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderSafeArea@
+hs_bindgen_4eb48f61abc48f1f
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_4eb48f61abc48f1f =
+  BG.fromFFIType hs_bindgen_4eb48f61abc48f1f_base
+
+-- | Get the safe area for rendering within the current viewport.
+--
+--     Some devices have portions of the screen which are partially obscured or not interactive, possibly due to on-screen controls, curved edges, camera notches, TV overscan, etc. This function provides the area of the current viewport which is safe to have interactible content. You should continue rendering into the rest of the render target, but it should not contain visually important or interactible content.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRenderSafeArea@, defined at @SDL3\/SDL_render.h 1809:34@
+sDL_GetRenderSafeArea
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the area that is safe for interactive content.
+  -> IO BG.CBool
+sDL_GetRenderSafeArea = hs_bindgen_4eb48f61abc48f1f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderClipRect@
+foreign import ccall safe "hs_bindgen_8baf3dc3de980190"
+  hs_bindgen_8baf3dc3de980190_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderClipRect@
+hs_bindgen_8baf3dc3de980190
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_8baf3dc3de980190 =
+  BG.fromFFIType hs_bindgen_8baf3dc3de980190_base
+
+-- | Set the clip rectangle for rendering on the specified target.
+--
+--     Each render target has its own clip rectangle. This function sets the cliprect for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderClipRect', 'sDL_RenderClipEnabled'
+--
+--     [C declaration]: @SDL_SetRenderClipRect@, defined at @SDL3\/SDL_render.h 1830:34@
+sDL_SetRenderClipRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the clip area, relative to the viewport, or NULL to disable clipping.
+  -> IO BG.CBool
+sDL_SetRenderClipRect = hs_bindgen_8baf3dc3de980190
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderClipRect@
+foreign import ccall safe "hs_bindgen_5b7acae61b400f09"
+  hs_bindgen_5b7acae61b400f09_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderClipRect@
+hs_bindgen_5b7acae61b400f09
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_5b7acae61b400f09 =
+  BG.fromFFIType hs_bindgen_5b7acae61b400f09_base
+
+-- | Get the clip rectangle for the current target.
+--
+--     Each render target has its own clip rectangle. This function gets the cliprect for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderClipEnabled', 'sDL_SetRenderClipRect'
+--
+--     [C declaration]: @SDL_GetRenderClipRect@, defined at @SDL3\/SDL_render.h 1851:34@
+sDL_GetRenderClipRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the current clipping area or an empty rectangle if clipping is disabled.
+  -> IO BG.CBool
+sDL_GetRenderClipRect = hs_bindgen_5b7acae61b400f09
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderClipEnabled@
+foreign import ccall safe "hs_bindgen_151563301b587559"
+  hs_bindgen_151563301b587559_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderClipEnabled@
+hs_bindgen_151563301b587559
+  :: BG.Ptr SDL_Renderer
+  -> IO BG.CBool
+hs_bindgen_151563301b587559 =
+  BG.fromFFIType hs_bindgen_151563301b587559_base
+
+-- | Get whether clipping is enabled on the given render target.
+--
+--     Each render target has its own clip rectangle. This function checks the cliprect for the current render target.
+--
+--     [Returns]: true if clipping is enabled or false if not; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderClipRect', 'sDL_SetRenderClipRect'
+--
+--     [C declaration]: @SDL_RenderClipEnabled@, defined at @SDL3\/SDL_render.h 1870:34@
+sDL_RenderClipEnabled
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO BG.CBool
+sDL_RenderClipEnabled = hs_bindgen_151563301b587559
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderScale@
+foreign import ccall safe "hs_bindgen_edd164833dbcbd86"
+  hs_bindgen_edd164833dbcbd86_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderScale@
+hs_bindgen_edd164833dbcbd86
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_edd164833dbcbd86 =
+  BG.fromFFIType hs_bindgen_edd164833dbcbd86_base
+
+-- | Set the drawing scale for rendering on the current target.
+--
+--     The drawing coordinates are scaled by the x\/y scaling factors before they are used by the renderer. This allows resolution independent drawing with a single coordinate system.
+--
+--     If this results in scaling or subpixel drawing by the rendering backend, it will be handled using the appropriate quality hints. For best results use integer scaling factors.
+--
+--     Each render target has its own scale. This function sets the scale for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderScale'
+--
+--     [C declaration]: @SDL_SetRenderScale@, defined at @SDL3\/SDL_render.h 1898:34@
+sDL_SetRenderScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scaleX@]: the horizontal scaling factor.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scaleY@]: the vertical scaling factor.
+  -> IO BG.CBool
+sDL_SetRenderScale = hs_bindgen_edd164833dbcbd86
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderScale@
+foreign import ccall safe "hs_bindgen_b47b8598441289bb"
+  hs_bindgen_b47b8598441289bb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderScale@
+hs_bindgen_b47b8598441289bb
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_b47b8598441289bb =
+  BG.fromFFIType hs_bindgen_b47b8598441289bb_base
+
+-- | Get the drawing scale for the current target.
+--
+--     Each render target has its own scale. This function gets the scale for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderScale'
+--
+--     [C declaration]: @SDL_GetRenderScale@, defined at @SDL3\/SDL_render.h 1918:34@
+sDL_GetRenderScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scaleX@]: a pointer filled in with the horizontal scaling factor.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scaleY@]: a pointer filled in with the vertical scaling factor.
+  -> IO BG.CBool
+sDL_GetRenderScale = hs_bindgen_b47b8598441289bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderDrawColor@
+foreign import ccall safe "hs_bindgen_2a1d5a5e6763970a"
+  hs_bindgen_2a1d5a5e6763970a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderDrawColor@
+hs_bindgen_2a1d5a5e6763970a
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_2a1d5a5e6763970a =
+  BG.fromFFIType hs_bindgen_2a1d5a5e6763970a_base
+
+-- | Set the color used for drawing operations.
+--
+--     Set the color for drawing or filling rectangles, lines, and points, and for @SDL_RenderClear()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawColor', 'sDL_SetRenderDrawColorFloat'
+--
+--     [C declaration]: @SDL_SetRenderDrawColor@, defined at @SDL3\/SDL_render.h 1943:34@
+sDL_SetRenderDrawColor
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red value used to draw on the rendering target.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green value used to draw on the rendering target.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue value used to draw on the rendering target.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: the alpha value used to draw on the rendering target; usually @SDL_ALPHA_OPAQUE@ (255). Use SDL_SetRenderDrawBlendMode to specify how the alpha channel is used.
+  -> IO BG.CBool
+sDL_SetRenderDrawColor = hs_bindgen_2a1d5a5e6763970a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderDrawColorFloat@
+foreign import ccall safe "hs_bindgen_deb567c32a3b304a"
+  hs_bindgen_deb567c32a3b304a_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderDrawColorFloat@
+hs_bindgen_deb567c32a3b304a
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_deb567c32a3b304a =
+  BG.fromFFIType hs_bindgen_deb567c32a3b304a_base
+
+-- | Set the color used for drawing operations (Rect, Line and Clear).
+--
+--     Set the color for drawing or filling rectangles, lines, and points, and for @SDL_RenderClear()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawColorFloat', 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_SetRenderDrawColorFloat@, defined at @SDL3\/SDL_render.h 1968:34@
+sDL_SetRenderDrawColorFloat
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@r@]: the red value used to draw on the rendering target.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@g@]: the green value used to draw on the rendering target.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@b@]: the blue value used to draw on the rendering target.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@a@]: the alpha value used to draw on the rendering target. Use SDL_SetRenderDrawBlendMode to specify how the alpha channel is used.
+  -> IO BG.CBool
+sDL_SetRenderDrawColorFloat =
+  hs_bindgen_deb567c32a3b304a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderDrawColor@
+foreign import ccall safe "hs_bindgen_4b8538e6f2e6330e"
+  hs_bindgen_4b8538e6f2e6330e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderDrawColor@
+hs_bindgen_4b8538e6f2e6330e
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_4b8538e6f2e6330e =
+  BG.fromFFIType hs_bindgen_4b8538e6f2e6330e_base
+
+-- | Get the color used for drawing operations (Rect, Line and Clear).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawColorFloat', 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_GetRenderDrawColor@, defined at @SDL3\/SDL_render.h 1992:34@
+sDL_GetRenderDrawColor
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha value used to draw on the rendering target; usually @SDL_ALPHA_OPAQUE@ (255).
+  -> IO BG.CBool
+sDL_GetRenderDrawColor = hs_bindgen_4b8538e6f2e6330e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderDrawColorFloat@
+foreign import ccall safe "hs_bindgen_02be3e3dad551497"
+  hs_bindgen_02be3e3dad551497_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderDrawColorFloat@
+hs_bindgen_02be3e3dad551497
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_02be3e3dad551497 =
+  BG.fromFFIType hs_bindgen_02be3e3dad551497_base
+
+-- | Get the color used for drawing operations (Rect, Line and Clear).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderDrawColorFloat', 'sDL_GetRenderDrawColor'
+--
+--     [C declaration]: @SDL_GetRenderDrawColorFloat@, defined at @SDL3\/SDL_render.h 2016:34@
+sDL_GetRenderDrawColorFloat
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha value used to draw on the rendering target.
+  -> IO BG.CBool
+sDL_GetRenderDrawColorFloat =
+  hs_bindgen_02be3e3dad551497
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderColorScale@
+foreign import ccall safe "hs_bindgen_4b5898833d8f7966"
+  hs_bindgen_4b5898833d8f7966_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderColorScale@
+hs_bindgen_4b5898833d8f7966
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_4b5898833d8f7966 =
+  BG.fromFFIType hs_bindgen_4b5898833d8f7966_base
+
+-- | Set the color scale used for render operations.
+--
+--     The color scale is an additional scale multiplied into the pixel color value while rendering. This can be used to adjust the brightness of colors during HDR rendering, or changing HDR video brightness when playing on an SDR display.
+--
+--     The color scale does not affect the alpha channel, only the color brightness.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderColorScale'
+--
+--     [C declaration]: @SDL_SetRenderColorScale@, defined at @SDL3\/SDL_render.h 2040:34@
+sDL_SetRenderColorScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the color scale value.
+  -> IO BG.CBool
+sDL_SetRenderColorScale = hs_bindgen_4b5898833d8f7966
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderColorScale@
+foreign import ccall safe "hs_bindgen_107aa0fcfa767aa5"
+  hs_bindgen_107aa0fcfa767aa5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderColorScale@
+hs_bindgen_107aa0fcfa767aa5
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_107aa0fcfa767aa5 =
+  BG.fromFFIType hs_bindgen_107aa0fcfa767aa5_base
+
+-- | Get the color scale used for render operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderColorScale'
+--
+--     [C declaration]: @SDL_GetRenderColorScale@, defined at @SDL3\/SDL_render.h 2056:34@
+sDL_GetRenderColorScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: a pointer filled in with the current color scale value.
+  -> IO BG.CBool
+sDL_GetRenderColorScale = hs_bindgen_107aa0fcfa767aa5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderDrawBlendMode@
+foreign import ccall safe "hs_bindgen_b9c067d52917b47d"
+  hs_bindgen_b9c067d52917b47d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderDrawBlendMode@
+hs_bindgen_b9c067d52917b47d
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_b9c067d52917b47d =
+  BG.fromFFIType hs_bindgen_b9c067d52917b47d_base
+
+-- | Set the blend mode used for drawing operations (Fill and Line).
+--
+--     If the blend mode is not supported, the closest supported mode is chosen.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawBlendMode'
+--
+--     [C declaration]: @SDL_SetRenderDrawBlendMode@, defined at @SDL3\/SDL_render.h 2074:34@
+sDL_SetRenderDrawBlendMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for blending.
+  -> IO BG.CBool
+sDL_SetRenderDrawBlendMode =
+  hs_bindgen_b9c067d52917b47d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderDrawBlendMode@
+foreign import ccall safe "hs_bindgen_167da6f1eb78062a"
+  hs_bindgen_167da6f1eb78062a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderDrawBlendMode@
+hs_bindgen_167da6f1eb78062a
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_167da6f1eb78062a =
+  BG.fromFFIType hs_bindgen_167da6f1eb78062a_base
+
+-- | Get the blend mode used for drawing operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderDrawBlendMode'
+--
+--     [C declaration]: @SDL_GetRenderDrawBlendMode@, defined at @SDL3\/SDL_render.h 2090:34@
+sDL_GetRenderDrawBlendMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO BG.CBool
+sDL_GetRenderDrawBlendMode =
+  hs_bindgen_167da6f1eb78062a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderClear@
+foreign import ccall safe "hs_bindgen_cde099ce5b1cfc9d"
+  hs_bindgen_cde099ce5b1cfc9d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderClear@
+hs_bindgen_cde099ce5b1cfc9d
+  :: BG.Ptr SDL_Renderer
+  -> IO BG.CBool
+hs_bindgen_cde099ce5b1cfc9d =
+  BG.fromFFIType hs_bindgen_cde099ce5b1cfc9d_base
+
+-- | Clear the current rendering target with the drawing color.
+--
+--     This function clears the entire rendering target, ignoring the viewport and the clip rectangle. Note, that clearing will also set\/fill all pixels of the rendering target to current renderer draw color, so make sure to invoke @SDL_SetRenderDrawColor()@ when needed.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_RenderClear@, defined at @SDL3\/SDL_render.h 2110:34@
+sDL_RenderClear
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO BG.CBool
+sDL_RenderClear = hs_bindgen_cde099ce5b1cfc9d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderPoint@
+foreign import ccall safe "hs_bindgen_9685ef9bec873fd9"
+  hs_bindgen_9685ef9bec873fd9_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderPoint@
+hs_bindgen_9685ef9bec873fd9
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_9685ef9bec873fd9 =
+  BG.fromFFIType hs_bindgen_9685ef9bec873fd9_base
+
+-- | Draw a point on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderPoints'
+--
+--     [C declaration]: @SDL_RenderPoint@, defined at @SDL3\/SDL_render.h 2127:34@
+sDL_RenderPoint
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a point.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the point.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the point.
+  -> IO BG.CBool
+sDL_RenderPoint = hs_bindgen_9685ef9bec873fd9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderPoints@
+foreign import ccall safe "hs_bindgen_a2f27901d75ff412"
+  hs_bindgen_a2f27901d75ff412_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderPoints@
+hs_bindgen_a2f27901d75ff412
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_a2f27901d75ff412 =
+  BG.fromFFIType hs_bindgen_a2f27901d75ff412_base
+
+-- | Draw multiple points on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderPoint'
+--
+--     [C declaration]: @SDL_RenderPoints@, defined at @SDL3\/SDL_render.h 2144:34@
+sDL_RenderPoints
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple points.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: the points to draw.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of points to draw.
+  -> IO BG.CBool
+sDL_RenderPoints = hs_bindgen_a2f27901d75ff412
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderLine@
+foreign import ccall safe "hs_bindgen_a22413e4506d153a"
+  hs_bindgen_a22413e4506d153a_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderLine@
+hs_bindgen_a22413e4506d153a
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_a22413e4506d153a =
+  BG.fromFFIType hs_bindgen_a22413e4506d153a_base
+
+-- | Draw a line on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderLines'
+--
+--     [C declaration]: @SDL_RenderLine@, defined at @SDL3\/SDL_render.h 2163:34@
+sDL_RenderLine
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a line.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x1@]: the x coordinate of the start point.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y1@]: the y coordinate of the start point.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x2@]: the x coordinate of the end point.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y2@]: the y coordinate of the end point.
+  -> IO BG.CBool
+sDL_RenderLine = hs_bindgen_a22413e4506d153a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderLines@
+foreign import ccall safe "hs_bindgen_139f9e9bbb114174"
+  hs_bindgen_139f9e9bbb114174_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderLines@
+hs_bindgen_139f9e9bbb114174
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_139f9e9bbb114174 =
+  BG.fromFFIType hs_bindgen_139f9e9bbb114174_base
+
+-- | Draw a series of connected lines on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderLine'
+--
+--     [C declaration]: @SDL_RenderLines@, defined at @SDL3\/SDL_render.h 2181:34@
+sDL_RenderLines
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple lines.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: the points along the lines.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of points, drawing count-1 lines.
+  -> IO BG.CBool
+sDL_RenderLines = hs_bindgen_139f9e9bbb114174
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderRect@
+foreign import ccall safe "hs_bindgen_c336b07d3c7c70e0"
+  hs_bindgen_c336b07d3c7c70e0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderRect@
+hs_bindgen_c336b07d3c7c70e0
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_c336b07d3c7c70e0 =
+  BG.fromFFIType hs_bindgen_c336b07d3c7c70e0_base
+
+-- | Draw a rectangle on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderRects'
+--
+--     [C declaration]: @SDL_RenderRect@, defined at @SDL3\/SDL_render.h 2198:34@
+sDL_RenderRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a rectangle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the destination rectangle, or NULL to outline the entire rendering target.
+  -> IO BG.CBool
+sDL_RenderRect = hs_bindgen_c336b07d3c7c70e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderRects@
+foreign import ccall safe "hs_bindgen_4402e93d7e0ba929"
+  hs_bindgen_4402e93d7e0ba929_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderRects@
+hs_bindgen_4402e93d7e0ba929
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_4402e93d7e0ba929 =
+  BG.fromFFIType hs_bindgen_4402e93d7e0ba929_base
+
+-- | Draw some number of rectangles on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderRect'
+--
+--     [C declaration]: @SDL_RenderRects@, defined at @SDL3\/SDL_render.h 2216:34@
+sDL_RenderRects
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple rectangles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rects@]: a pointer to an array of destination rectangles.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of rectangles.
+  -> IO BG.CBool
+sDL_RenderRects = hs_bindgen_4402e93d7e0ba929
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderFillRect@
+foreign import ccall safe "hs_bindgen_2904f549c42ca454"
+  hs_bindgen_2904f549c42ca454_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderFillRect@
+hs_bindgen_2904f549c42ca454
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_2904f549c42ca454 =
+  BG.fromFFIType hs_bindgen_2904f549c42ca454_base
+
+-- | Fill a rectangle on the current rendering target with the drawing color at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderFillRects'
+--
+--     [C declaration]: @SDL_RenderFillRect@, defined at @SDL3\/SDL_render.h 2234:34@
+sDL_RenderFillRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should fill a rectangle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO BG.CBool
+sDL_RenderFillRect = hs_bindgen_2904f549c42ca454
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderFillRects@
+foreign import ccall safe "hs_bindgen_8e1470eae177aaca"
+  hs_bindgen_8e1470eae177aaca_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderFillRects@
+hs_bindgen_8e1470eae177aaca
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_8e1470eae177aaca =
+  BG.fromFFIType hs_bindgen_8e1470eae177aaca_base
+
+-- | Fill some number of rectangles on the current rendering target with the drawing color at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderFillRect'
+--
+--     [C declaration]: @SDL_RenderFillRects@, defined at @SDL3\/SDL_render.h 2252:34@
+sDL_RenderFillRects
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should fill multiple rectangles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rects@]: a pointer to an array of destination rectangles.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of rectangles.
+  -> IO BG.CBool
+sDL_RenderFillRects = hs_bindgen_8e1470eae177aaca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTexture@
+foreign import ccall safe "hs_bindgen_25ce1a6520376b45"
+  hs_bindgen_25ce1a6520376b45_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTexture@
+hs_bindgen_25ce1a6520376b45
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_25ce1a6520376b45 =
+  BG.fromFFIType hs_bindgen_25ce1a6520376b45_base
+
+-- | Copy a portion of the texture to the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTextureRotated', 'sDL_RenderTextureTiled'
+--
+--     [C declaration]: @SDL_RenderTexture@, defined at @SDL3\/SDL_render.h 2274:34@
+sDL_RenderTexture
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO BG.CBool
+sDL_RenderTexture = hs_bindgen_25ce1a6520376b45
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTextureRotated@
+foreign import ccall safe "hs_bindgen_7784d7195eaae275"
+  hs_bindgen_7784d7195eaae275_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Double
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTextureRotated@
+hs_bindgen_7784d7195eaae275
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CDouble
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> SDL3.Sys.Bindgen.Surface.SDL_FlipMode
+  -> IO BG.CBool
+hs_bindgen_7784d7195eaae275 =
+  BG.fromFFIType hs_bindgen_7784d7195eaae275_base
+
+-- | Copy a portion of the source texture to the current rendering target, with rotation and flipping, at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture'
+--
+--     [C declaration]: @SDL_RenderTextureRotated@, defined at @SDL3\/SDL_render.h 2302:34@
+sDL_RenderTextureRotated
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> BG.CDouble
+  -- ^
+  --
+  --           [@angle@]: an angle in degrees that indicates the rotation that will be applied to dstrect, rotating it in a clockwise direction.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@center@]: a pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done around dstrect.w\/2, dstrect.h\/2).
+  -> SDL3.Sys.Bindgen.Surface.SDL_FlipMode
+  -- ^
+  --
+  --           [@flip@]: an SDL_FlipMode value stating which flipping actions should be performed on the texture.
+  -> IO BG.CBool
+sDL_RenderTextureRotated =
+  hs_bindgen_7784d7195eaae275
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTextureAffine@
+foreign import ccall safe "hs_bindgen_add42f94463f73c6"
+  hs_bindgen_add42f94463f73c6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTextureAffine@
+hs_bindgen_add42f94463f73c6
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> IO BG.CBool
+hs_bindgen_add42f94463f73c6 =
+  BG.fromFFIType hs_bindgen_add42f94463f73c6_base
+
+-- | Copy a portion of the source texture to the current rendering target, with affine transform, at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: You may only call this function from the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture'
+--
+--     [C declaration]: @SDL_RenderTextureAffine@, defined at @SDL3\/SDL_render.h 2333:34@
+sDL_RenderTextureAffine
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@origin@]: a pointer to a point indicating where the top-left corner of srcrect should be mapped to, or NULL for the rendering target\'s origin.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@right@]: a pointer to a point indicating where the top-right corner of srcrect should be mapped to, or NULL for the rendering target\'s top-right corner.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@down@]: a pointer to a point indicating where the bottom-left corner of srcrect should be mapped to, or NULL for the rendering target\'s bottom-left corner.
+  -> IO BG.CBool
+sDL_RenderTextureAffine = hs_bindgen_add42f94463f73c6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTextureTiled@
+foreign import ccall safe "hs_bindgen_74aa5a13c76159fa"
+  hs_bindgen_74aa5a13c76159fa_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Float
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTextureTiled@
+hs_bindgen_74aa5a13c76159fa
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CFloat
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_74aa5a13c76159fa =
+  BG.fromFFIType hs_bindgen_74aa5a13c76159fa_base
+
+-- | Tile a portion of the texture to the current rendering target at subpixel precision.
+--
+--     The pixels in @srcrect@ will be repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture'
+--
+--     [C declaration]: @SDL_RenderTextureTiled@, defined at @SDL3\/SDL_render.h 2362:34@
+sDL_RenderTextureTiled
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform srcrect into the destination rectangle, e.g. a 32x32 texture with a scale of 2 would fill 64x64 tiles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO BG.CBool
+sDL_RenderTextureTiled = hs_bindgen_74aa5a13c76159fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTexture9Grid@
+foreign import ccall safe "hs_bindgen_6b75253c3413f458"
+  hs_bindgen_6b75253c3413f458_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTexture9Grid@
+hs_bindgen_6b75253c3413f458
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_6b75253c3413f458 =
+  BG.fromFFIType hs_bindgen_6b75253c3413f458_base
+
+-- | Perform a scaled copy using the 9-grid algorithm to the current rendering target at subpixel precision.
+--
+--     The pixels in the texture are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then stretched into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture', 'sDL_RenderTexture9GridTiled'
+--
+--     [C declaration]: @SDL_RenderTexture9Grid@, defined at @SDL3\/SDL_render.h 2397:34@
+sDL_RenderTexture9Grid
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire texture.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled copy.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO BG.CBool
+sDL_RenderTexture9Grid = hs_bindgen_6b75253c3413f458
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTexture9GridTiled@
+foreign import ccall safe "hs_bindgen_2d9cf263c1277f5b"
+  hs_bindgen_2d9cf263c1277f5b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderTexture9GridTiled@
+hs_bindgen_2d9cf263c1277f5b
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_2d9cf263c1277f5b =
+  BG.fromFFIType hs_bindgen_2d9cf263c1277f5b_base
+
+-- | Perform a scaled copy using the 9-grid algorithm to the current rendering target at subpixel precision.
+--
+--     The pixels in the texture are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then tiled into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_RenderTexture', 'sDL_RenderTexture9Grid'
+--
+--     [C declaration]: @SDL_RenderTexture9GridTiled@, defined at @SDL3\/SDL_render.h 2435:34@
+sDL_RenderTexture9GridTiled
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire texture.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled copy.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@tileScale@]: the scale used to transform the borders and center of @srcrect@ into the borders and middle of @dstrect@, or 1.0f for an unscaled copy.
+  -> IO BG.CBool
+sDL_RenderTexture9GridTiled =
+  hs_bindgen_2d9cf263c1277f5b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderGeometry@
+foreign import ccall safe "hs_bindgen_778c782602e7d6de"
+  hs_bindgen_778c782602e7d6de_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderGeometry@
+hs_bindgen_778c782602e7d6de
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL_Vertex
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_778c782602e7d6de =
+  BG.fromFFIType hs_bindgen_778c782602e7d6de_base
+
+-- | Render a list of triangles, optionally using a texture and indices into the vertex array Color and alpha modulation is done per vertex (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderGeometryRaw', 'sDL_SetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_RenderGeometry@, defined at @SDL3\/SDL_render.h 2460:34@
+sDL_RenderGeometry
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: (optional) The SDL texture to use.
+  -> PtrConst.PtrConst SDL_Vertex
+  -- ^
+  --
+  --           [@vertices@]: vertices.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_vertices@]: number of vertices.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@indices@]: (optional) An array of integer indices into the \'vertices\' array, if NULL all vertices will be rendered in sequential order.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_indices@]: number of indices.
+  -> IO BG.CBool
+sDL_RenderGeometry = hs_bindgen_778c782602e7d6de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderGeometryRaw@
+foreign import ccall safe "hs_bindgen_32080687747fa83c"
+  hs_bindgen_32080687747fa83c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderGeometryRaw@
+hs_bindgen_32080687747fa83c
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst BG.CFloat
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.CFloat
+  -> BG.CInt
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_32080687747fa83c =
+  BG.fromFFIType hs_bindgen_32080687747fa83c_base
+
+-- | Render a list of triangles, optionally using a texture and indices into the vertex arrays Color and alpha modulation is done per vertex (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderGeometry', 'sDL_SetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_RenderGeometryRaw@, defined at @SDL3\/SDL_render.h 2493:34@
+sDL_RenderGeometryRaw
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: (optional) The SDL texture to use.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@xy@]: vertex positions.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@xy_stride@]: byte size to move from one element to the next element.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^
+  --
+  --           [@color@]: vertex colors (as SDL_FColor).
+  -> BG.CInt
+  -- ^
+  --
+  --           [@color_stride@]: byte size to move from one element to the next element.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@uv@]: vertex normalized texture coordinates.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@uv_stride@]: byte size to move from one element to the next element.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_vertices@]: number of vertices.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@indices@]: (optional) An array of indices into the \'vertices\' arrays, if NULL all vertices will be rendered in sequential order.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_indices@]: number of indices.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@size_indices@]: index size: 1 (byte), 2 (short), 4 (int).
+  -> IO BG.CBool
+sDL_RenderGeometryRaw = hs_bindgen_32080687747fa83c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderTextureAddressMode@
+foreign import ccall safe "hs_bindgen_56e605702d9776b5"
+  hs_bindgen_56e605702d9776b5_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderTextureAddressMode@
+hs_bindgen_56e605702d9776b5
+  :: BG.Ptr SDL_Renderer
+  -> SDL_TextureAddressMode
+  -> SDL_TextureAddressMode
+  -> IO BG.CBool
+hs_bindgen_56e605702d9776b5 =
+  BG.fromFFIType hs_bindgen_56e605702d9776b5_base
+
+-- | Set the texture addressing mode used in @SDL_RenderGeometry()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_RenderGeometry', 'sDL_RenderGeometryRaw', 'sDL_GetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_SetRenderTextureAddressMode@, defined at @SDL3\/SDL_render.h 2520:34@
+sDL_SetRenderTextureAddressMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@u_mode@]: the 'SDL_TextureAddressMode' to use for horizontal texture coordinates in @SDL_RenderGeometry()@.
+  -> SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@v_mode@]: the 'SDL_TextureAddressMode' to use for vertical texture coordinates in @SDL_RenderGeometry()@.
+  -> IO BG.CBool
+sDL_SetRenderTextureAddressMode =
+  hs_bindgen_56e605702d9776b5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderTextureAddressMode@
+foreign import ccall safe "hs_bindgen_b63dbaffb6d53264"
+  hs_bindgen_b63dbaffb6d53264_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderTextureAddressMode@
+hs_bindgen_b63dbaffb6d53264
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_TextureAddressMode
+  -> BG.Ptr SDL_TextureAddressMode
+  -> IO BG.CBool
+hs_bindgen_b63dbaffb6d53264 =
+  BG.fromFFIType hs_bindgen_b63dbaffb6d53264_base
+
+-- | Get the texture addressing mode used in @SDL_RenderGeometry()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_GetRenderTextureAddressMode@, defined at @SDL3\/SDL_render.h 2541:34@
+sDL_GetRenderTextureAddressMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@u_mode@]: a pointer filled in with the 'SDL_TextureAddressMode' to use for horizontal texture coordinates in @SDL_RenderGeometry()@, may be NULL.
+  -> BG.Ptr SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@v_mode@]: a pointer filled in with the 'SDL_TextureAddressMode' to use for vertical texture coordinates in @SDL_RenderGeometry()@, may be NULL.
+  -> IO BG.CBool
+sDL_GetRenderTextureAddressMode =
+  hs_bindgen_b63dbaffb6d53264
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderReadPixels@
+foreign import ccall safe "hs_bindgen_8e39bba88c8b590b"
+  hs_bindgen_8e39bba88c8b590b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderReadPixels@
+hs_bindgen_8e39bba88c8b590b
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+hs_bindgen_8e39bba88c8b590b =
+  BG.fromFFIType hs_bindgen_8e39bba88c8b590b_base
+
+-- | Read pixels from the current rendering target.
+--
+--     The returned surface contains pixels inside the desired area clipped to the current viewport, and should be freed with SDL_DestroySurface().
+--
+--     Note that this returns the actual pixels on the screen, so if you are using logical presentation you should use @SDL_GetRenderLogicalPresentationRect()@ to get the area containing your content.
+--
+--     __WARNING__: This is a very slow operation, and should not be used frequently. If you\'re using this on the main rendering target, it should be called after rendering and before @SDL_RenderPresent()@.
+--
+--     [Returns]: a new SDL_Surface on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RenderReadPixels@, defined at @SDL3\/SDL_render.h 2568:43@
+sDL_RenderReadPixels
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to read, which will be clipped to the current viewport, or NULL for the entire viewport.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+sDL_RenderReadPixels = hs_bindgen_8e39bba88c8b590b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderPresent@
+foreign import ccall safe "hs_bindgen_7c3d5531ae54aea4"
+  hs_bindgen_7c3d5531ae54aea4_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderPresent@
+hs_bindgen_7c3d5531ae54aea4
+  :: BG.Ptr SDL_Renderer
+  -> IO BG.CBool
+hs_bindgen_7c3d5531ae54aea4 =
+  BG.fromFFIType hs_bindgen_7c3d5531ae54aea4_base
+
+-- | Update the screen with any rendering performed since the previous call.
+--
+--     SDL\'s rendering functions operate on a backbuffer; that is, calling a rendering function such as @SDL_RenderLine()@ does not directly put a line on the screen, but rather updates the backbuffer. As such, you compose your entire scene and /present/ the composed backbuffer to the screen as a complete picture.
+--
+--     Therefore, when using SDL\'s rendering API, one does all drawing intended for the frame, and then calls this function once per frame to present the final drawing to the user.
+--
+--     The backbuffer should be considered invalidated after each present; do not assume that previous contents will exist between frames. You are strongly encouraged to call @SDL_RenderClear()@ to initialize the backbuffer before starting each new frame\'s drawing, even if you plan to overwrite every pixel.
+--
+--     Please note, that in case of rendering to a texture - there is __no need__ to call @'sDL_RenderPresent'@ after drawing needed objects to a texture, and should not be done; you are only required to change back the rendering target to default via @SDL_SetRenderTarget(renderer, NULL)@ afterwards, as textures by themselves do not have a concept of backbuffers. Calling SDL_RenderPresent while rendering to a texture will fail.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', 'sDL_RenderClear', 'sDL_RenderFillRect', 'sDL_RenderFillRects', 'sDL_RenderLine', 'sDL_RenderLines', 'sDL_RenderPoint', 'sDL_RenderPoints', 'sDL_RenderRect', 'sDL_RenderRects', 'sDL_SetRenderDrawBlendMode', 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_RenderPresent@, defined at @SDL3\/SDL_render.h 2617:34@
+sDL_RenderPresent
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO BG.CBool
+sDL_RenderPresent = hs_bindgen_7c3d5531ae54aea4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_DestroyTexture@
+foreign import ccall safe "hs_bindgen_8bed4d77b35c687f"
+  hs_bindgen_8bed4d77b35c687f_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_DestroyTexture@
+hs_bindgen_8bed4d77b35c687f
+  :: BG.Ptr SDL_Texture
+  -> IO ()
+hs_bindgen_8bed4d77b35c687f =
+  BG.fromFFIType hs_bindgen_8bed4d77b35c687f_base
+
+-- | Destroy the specified texture.
+--
+--     Passing NULL or an otherwise invalid texture will set the SDL error message to \"Invalid texture\".
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTexture', 'sDL_CreateTextureFromSurface'
+--
+--     [C declaration]: @SDL_DestroyTexture@, defined at @SDL3\/SDL_render.h 2634:34@
+sDL_DestroyTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to destroy.
+  -> IO ()
+sDL_DestroyTexture = hs_bindgen_8bed4d77b35c687f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_DestroyRenderer@
+foreign import ccall safe "hs_bindgen_1d20db71cb8b3442"
+  hs_bindgen_1d20db71cb8b3442_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_DestroyRenderer@
+hs_bindgen_1d20db71cb8b3442
+  :: BG.Ptr SDL_Renderer
+  -> IO ()
+hs_bindgen_1d20db71cb8b3442 =
+  BG.fromFFIType hs_bindgen_1d20db71cb8b3442_base
+
+-- | Destroy the rendering context for a window and free all associated textures.
+--
+--     This should be called before destroying the associated window.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer'
+--
+--     [C declaration]: @SDL_DestroyRenderer@, defined at @SDL3\/SDL_render.h 2650:34@
+sDL_DestroyRenderer
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO ()
+sDL_DestroyRenderer = hs_bindgen_1d20db71cb8b3442
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_FlushRenderer@
+foreign import ccall safe "hs_bindgen_541ef4edd41b43f3"
+  hs_bindgen_541ef4edd41b43f3_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_FlushRenderer@
+hs_bindgen_541ef4edd41b43f3
+  :: BG.Ptr SDL_Renderer
+  -> IO BG.CBool
+hs_bindgen_541ef4edd41b43f3 =
+  BG.fromFFIType hs_bindgen_541ef4edd41b43f3_base
+
+-- | Force the rendering context to flush any pending commands and state.
+--
+--     You do not need to (and in fact, shouldn\'t) call this function unless you are planning to call into OpenGL\/Direct3D\/Metal\/whatever directly, in addition to using an 'SDL_Renderer'.
+--
+--     This is for a very-specific case: if you are using SDL\'s render API, and you plan to make OpenGL\/D3D\/whatever calls in addition to SDL render API calls. If this applies, you should call this function between calls to SDL\'s render API and the low-level API you\'re using in cooperation.
+--
+--     In all other cases, you can ignore this function.
+--
+--     This call makes SDL flush any pending rendering work it was queueing up to do later in a single batch, and marks any internal cached state as invalid, so it\'ll prepare all its state again later, from scratch.
+--
+--     This means you do not need to save state in your rendering code to protect the SDL renderer. However, there lots of arbitrary pieces of Direct3D and OpenGL state that can confuse things; you should use your best judgment and be prepared to make changes if specific state needs to be protected.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_FlushRenderer@, defined at @SDL3\/SDL_render.h 2683:34@
+sDL_FlushRenderer
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO BG.CBool
+sDL_FlushRenderer = hs_bindgen_541ef4edd41b43f3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderMetalLayer@
+foreign import ccall safe "hs_bindgen_b665c5f20441fcd2"
+  hs_bindgen_b665c5f20441fcd2_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderMetalLayer@
+hs_bindgen_b665c5f20441fcd2
+  :: BG.Ptr SDL_Renderer
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_b665c5f20441fcd2 =
+  BG.fromFFIType hs_bindgen_b665c5f20441fcd2_base
+
+-- | Get the CAMetalLayer associated with the given Metal renderer.
+--
+--     This function returns @void *@, so SDL doesn\'t have to include Metal\'s headers, but it can be safely cast to a @CAMetalLayer *@.
+--
+--     [Returns]: a @CAMetalLayer *@ on success, or NULL if the renderer isn\'t a Metal renderer.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderMetalCommandEncoder'
+--
+--     [C declaration]: @SDL_GetRenderMetalLayer@, defined at @SDL3\/SDL_render.h 2701:36@
+sDL_GetRenderMetalLayer
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetRenderMetalLayer = hs_bindgen_b665c5f20441fcd2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderMetalCommandEncoder@
+foreign import ccall safe "hs_bindgen_4cc0199f9267bab8"
+  hs_bindgen_4cc0199f9267bab8_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderMetalCommandEncoder@
+hs_bindgen_4cc0199f9267bab8
+  :: BG.Ptr SDL_Renderer
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_4cc0199f9267bab8 =
+  BG.fromFFIType hs_bindgen_4cc0199f9267bab8_base
+
+-- | Get the Metal command encoder for the current frame.
+--
+--     This function returns @void *@, so SDL doesn\'t have to include Metal\'s headers, but it can be safely cast to an @id\<MTLRenderCommandEncoder>@.
+--
+--     This will return NULL if Metal refuses to give SDL a drawable to render to, which might happen if the window is hidden\/minimized\/offscreen. This doesn\'t apply to command encoders for render targets, just the window\'s backbuffer. Check your return values!
+--
+--     [Returns]: an @id\<MTLRenderCommandEncoder>@ on success, or NULL if the renderer isn\'t a Metal renderer or there was an error.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderMetalLayer'
+--
+--     [C declaration]: @SDL_GetRenderMetalCommandEncoder@, defined at @SDL3\/SDL_render.h 2724:36@
+sDL_GetRenderMetalCommandEncoder
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetRenderMetalCommandEncoder =
+  hs_bindgen_4cc0199f9267bab8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_AddVulkanRenderSemaphores@
+foreign import ccall safe "hs_bindgen_91025902db96959c"
+  hs_bindgen_91025902db96959c_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Int64
+    -> BG.Int64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_AddVulkanRenderSemaphores@
+hs_bindgen_91025902db96959c
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_91025902db96959c =
+  BG.fromFFIType hs_bindgen_91025902db96959c_base
+
+-- | Add a set of synchronization semaphores for the current frame.
+--
+--     The Vulkan renderer will wait for @wait_semaphore@ before submitting rendering commands and signal @signal_semaphore@ after rendering commands are complete for this frame.
+--
+--     This should be called each frame that you want semaphore synchronization. The Vulkan renderer may have multiple frames in flight on the GPU, so you should have multiple semaphores that are used for synchronization. Querying SDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER will give you the maximum number of semaphores you\'ll need.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is __NOT__ safe to call this function from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_AddVulkanRenderSemaphores@, defined at @SDL3\/SDL_render.h 2755:34@
+sDL_AddVulkanRenderSemaphores
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@wait_stage_mask@]: the VkPipelineStageFlags for the wait.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@wait_semaphore@]: a VkSempahore to wait on before rendering the current frame, or 0 if not needed.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@signal_semaphore@]: a VkSempahore that SDL will signal when rendering for the current frame is complete, or 0 if not needed.
+  -> IO BG.CBool
+sDL_AddVulkanRenderSemaphores =
+  hs_bindgen_91025902db96959c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderVSync@
+foreign import ccall safe "hs_bindgen_6f4a42b49f0de954"
+  hs_bindgen_6f4a42b49f0de954_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetRenderVSync@
+hs_bindgen_6f4a42b49f0de954
+  :: BG.Ptr SDL_Renderer
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_6f4a42b49f0de954 =
+  BG.fromFFIType hs_bindgen_6f4a42b49f0de954_base
+
+-- | Toggle VSync of the given renderer.
+--
+--     When a renderer is created, vsync defaults to SDL_RENDERER_VSYNC_DISABLED.
+--
+--     The @vsync@ parameter can be 1 to synchronize present with every vertical refresh, 2 to synchronize present with every second vertical refresh, etc., SDL_RENDERER_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or SDL_RENDERER_VSYNC_DISABLED to disable. Not every value is supported by every driver, so you should check the return value to see whether the requested setting is supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderVSync'
+--
+--     [C declaration]: @SDL_SetRenderVSync@, defined at @SDL3\/SDL_render.h 2780:34@
+sDL_SetRenderVSync
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to toggle.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: the vertical refresh sync interval.
+  -> IO BG.CBool
+sDL_SetRenderVSync = hs_bindgen_6f4a42b49f0de954
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderVSync@
+foreign import ccall safe "hs_bindgen_eb1ce0cdf3d11c86"
+  hs_bindgen_eb1ce0cdf3d11c86_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetRenderVSync@
+hs_bindgen_eb1ce0cdf3d11c86
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_eb1ce0cdf3d11c86 =
+  BG.fromFFIType hs_bindgen_eb1ce0cdf3d11c86_base
+
+-- | Get VSync of the given renderer.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderVSync'
+--
+--     [C declaration]: @SDL_GetRenderVSync@, defined at @SDL3\/SDL_render.h 2800:34@
+sDL_GetRenderVSync
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to toggle.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: an int filled with the current vertical refresh sync interval. See @SDL_SetRenderVSync()@ for the meaning of the value.
+  -> IO BG.CBool
+sDL_GetRenderVSync = hs_bindgen_eb1ce0cdf3d11c86
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderDebugText@
+foreign import ccall safe "hs_bindgen_54ec6a89b17b55b6"
+  hs_bindgen_54ec6a89b17b55b6_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_RenderDebugText@
+hs_bindgen_54ec6a89b17b55b6
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_54ec6a89b17b55b6 =
+  BG.fromFFIType hs_bindgen_54ec6a89b17b55b6_base
+
+-- | Draw debug text to an 'SDL_Renderer'.
+--
+--     This function will render a string of text to an 'SDL_Renderer'. Note that this is a convenience function for debugging, with severe limitations, and not intended to be used for production apps and games.
+--
+--     Among these limitations:
+--
+--     * It accepts UTF-8 strings, but will only renders ASCII characters.
+--
+--     * It has a single, tiny size (8x8 pixels). You can use logical presentation or @SDL_SetRenderScale()@ to adjust it.
+--
+--     * It uses a simple, hardcoded bitmap font. It does not allow different font selections and it does not support truetype, for proper scaling.
+--
+--     * It does no word-wrapping and does not treat newline characters as a line break. If the text goes out of the window, it\'s gone.
+--
+--     For serious text rendering, there are several good options, such as SDL_ttf, stb_truetype, or other external libraries.
+--
+--     On first use, this will create an internal texture for rendering glyphs. This texture will live until the renderer is destroyed.
+--
+--     The text is drawn in the color specified by @SDL_SetRenderDrawColor()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_RenderDebugTextFormat@, 'sDL_DEBUG_TEXT_FONT_CHARACTER_SIZE'
+--
+--     [C declaration]: @SDL_RenderDebugText@, defined at @SDL3\/SDL_render.h 2852:34@
+sDL_RenderDebugText
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a line of text.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate where the top-left corner of the text will draw.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate where the top-left corner of the text will draw.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to render.
+  -> IO BG.CBool
+sDL_RenderDebugText = hs_bindgen_54ec6a89b17b55b6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetDefaultTextureScaleMode@
+foreign import ccall safe "hs_bindgen_3e694d41804c455e"
+  hs_bindgen_3e694d41804c455e_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetDefaultTextureScaleMode@
+hs_bindgen_3e694d41804c455e
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_3e694d41804c455e =
+  BG.fromFFIType hs_bindgen_3e694d41804c455e_base
+
+-- | Set default scale mode for new textures for given renderer.
+--
+--     When a renderer is created, scale_mode defaults to SDL_SCALEMODE_LINEAR.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_GetDefaultTextureScaleMode'
+--
+--     [C declaration]: @SDL_SetDefaultTextureScaleMode@, defined at @SDL3\/SDL_render.h 2898:34@
+sDL_SetDefaultTextureScaleMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to update.
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scale_mode@]: the scale mode to change to for new textures.
+  -> IO BG.CBool
+sDL_SetDefaultTextureScaleMode =
+  hs_bindgen_3e694d41804c455e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetDefaultTextureScaleMode@
+foreign import ccall safe "hs_bindgen_3782129e34172c40"
+  hs_bindgen_3782129e34172c40_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_GetDefaultTextureScaleMode@
+hs_bindgen_3782129e34172c40
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_3782129e34172c40 =
+  BG.fromFFIType hs_bindgen_3782129e34172c40_base
+
+-- | Get default texture scale mode of the given renderer.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetDefaultTextureScaleMode'
+--
+--     [C declaration]: @SDL_GetDefaultTextureScaleMode@, defined at @SDL3\/SDL_render.h 2916:34@
+sDL_GetDefaultTextureScaleMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to get data from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scale_mode@]: a SDL_ScaleMode filled with current default scale mode. See @SDL_SetDefaultTextureScaleMode()@ for the meaning of the value.
+  -> IO BG.CBool
+sDL_GetDefaultTextureScaleMode =
+  hs_bindgen_3782129e34172c40
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateGPURenderState@
+foreign import ccall safe "hs_bindgen_b6fd9bfda38a61c5"
+  hs_bindgen_b6fd9bfda38a61c5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_CreateGPURenderState@
+hs_bindgen_b6fd9bfda38a61c5
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL_GPURenderStateCreateInfo
+  -> IO (BG.Ptr SDL_GPURenderState)
+hs_bindgen_b6fd9bfda38a61c5 =
+  BG.fromFFIType hs_bindgen_b6fd9bfda38a61c5_base
+
+-- | Create custom GPU render state.
+--
+--     [Returns]: a custom GPU render state or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetGPURenderStateFragmentUniforms', 'sDL_SetGPURenderState', 'sDL_DestroyGPURenderState'
+--
+--     [C declaration]: @SDL_CreateGPURenderState@, defined at @SDL3\/SDL_render.h 2970:50@
+sDL_CreateGPURenderState
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to use.
+  -> PtrConst.PtrConst SDL_GPURenderStateCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the GPU render state to create.
+  -> IO (BG.Ptr SDL_GPURenderState)
+sDL_CreateGPURenderState =
+  hs_bindgen_b6fd9bfda38a61c5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetGPURenderStateFragmentUniforms@
+foreign import ccall safe "hs_bindgen_18aafc7283600d91"
+  hs_bindgen_18aafc7283600d91_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetGPURenderStateFragmentUniforms@
+hs_bindgen_18aafc7283600d91
+  :: BG.Ptr SDL_GPURenderState
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_18aafc7283600d91 =
+  BG.fromFFIType hs_bindgen_18aafc7283600d91_base
+
+-- | Set fragment shader uniform variables in a custom GPU render state.
+--
+--     The data is copied and will be pushed using SDL_PushGPUFragmentUniformData() during draw call execution.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetGPURenderStateFragmentUniforms@, defined at @SDL3\/SDL_render.h 2990:34@
+sDL_SetGPURenderStateFragmentUniforms
+  :: BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to modify.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@slot_index@]: the fragment uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO BG.CBool
+sDL_SetGPURenderStateFragmentUniforms =
+  hs_bindgen_18aafc7283600d91
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetGPURenderState@
+foreign import ccall safe "hs_bindgen_707dc041c39c56ad"
+  hs_bindgen_707dc041c39c56ad_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_SetGPURenderState@
+hs_bindgen_707dc041c39c56ad
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_GPURenderState
+  -> IO BG.CBool
+hs_bindgen_707dc041c39c56ad =
+  BG.fromFFIType hs_bindgen_707dc041c39c56ad_base
+
+-- | Set custom GPU render state.
+--
+--     This function sets custom GPU render state for subsequent draw calls. This allows using custom shaders with the GPU renderer.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetGPURenderState@, defined at @SDL3\/SDL_render.h 3008:34@
+sDL_SetGPURenderState
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to use.
+  -> BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to to use, or NULL to clear custom GPU render state.
+  -> IO BG.CBool
+sDL_SetGPURenderState = hs_bindgen_707dc041c39c56ad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_DestroyGPURenderState@
+foreign import ccall safe "hs_bindgen_ef5a4d7453634025"
+  hs_bindgen_ef5a4d7453634025_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Safe_SDL_DestroyGPURenderState@
+hs_bindgen_ef5a4d7453634025
+  :: BG.Ptr SDL_GPURenderState
+  -> IO ()
+hs_bindgen_ef5a4d7453634025 =
+  BG.fromFFIType hs_bindgen_ef5a4d7453634025_base
+
+-- | Destroy custom GPU render state.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_CreateGPURenderState'
+--
+--     [C declaration]: @SDL_DestroyGPURenderState@, defined at @SDL3\/SDL_render.h 3022:34@
+sDL_DestroyGPURenderState
+  :: BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to destroy.
+  -> IO ()
+sDL_DestroyGPURenderState =
+  hs_bindgen_ef5a4d7453634025
diff --git a/src/SDL3/Sys/Bindgen/Render/Unsafe.hs b/src/SDL3/Sys/Bindgen/Render/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Render/Unsafe.hs
@@ -0,0 +1,5962 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Render.Unsafe (
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetNumRenderDrivers,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderDriver,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_CreateWindowAndRenderer,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_CreateRenderer,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_CreateRendererWithProperties,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_CreateGPURenderer,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetGPURendererDevice,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_CreateSoftwareRenderer,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderer,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderWindow,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRendererName,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRendererProperties,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderOutputSize,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetCurrentRenderOutputSize,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_CreateTexture,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_CreateTextureFromSurface,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_CreateTextureWithProperties,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetTextureProperties,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRendererFromTexture,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetTextureSize,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetTexturePalette,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetTexturePalette,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetTextureColorMod,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetTextureColorModFloat,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetTextureColorMod,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetTextureColorModFloat,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetTextureAlphaMod,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetTextureAlphaModFloat,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetTextureAlphaMod,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetTextureAlphaModFloat,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetTextureBlendMode,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetTextureBlendMode,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_UpdateTexture,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_UpdateYUVTexture,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_UpdateNVTexture,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_LockTexture,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_LockTextureToSurface,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_UnlockTexture,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderTarget,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderTarget,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderLogicalPresentation,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderLogicalPresentation,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderLogicalPresentationRect,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderCoordinatesFromWindow,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderCoordinatesToWindow,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_ConvertEventToRenderCoordinates,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderViewport,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderViewport,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderViewportSet,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderSafeArea,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderClipRect,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderClipRect,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderClipEnabled,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderScale,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderScale,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderDrawColor,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderDrawColorFloat,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderDrawColor,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderDrawColorFloat,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderColorScale,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderColorScale,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderDrawBlendMode,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderDrawBlendMode,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderClear,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderPoint,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderPoints,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderLine,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderLines,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderRect,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderRects,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderFillRect,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderFillRects,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderTexture,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderTextureRotated,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderTextureAffine,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderTextureTiled,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderTexture9Grid,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderTexture9GridTiled,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderGeometry,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderGeometryRaw,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderTextureAddressMode,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderTextureAddressMode,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderReadPixels,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderPresent,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_DestroyTexture,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_DestroyRenderer,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_FlushRenderer,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderMetalLayer,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderMetalCommandEncoder,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_AddVulkanRenderSemaphores,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetRenderVSync,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetRenderVSync,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_RenderDebugText,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetDefaultTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_GetDefaultTextureScaleMode,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_CreateGPURenderState,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetGPURenderStateFragmentUniforms,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_SetGPURenderState,
+  SDL3.Sys.Bindgen.Render.Unsafe.sDL_DestroyGPURenderState,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Blendmode qualified
+import SDL3.Sys.Bindgen.Events qualified
+import SDL3.Sys.Bindgen.Gpu qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Render
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_render.h>"
+         , "signed int hs_bindgen_b8d027f3d5602f48 (void)"
+         , "{"
+         , "  return (SDL_GetNumRenderDrivers)();"
+         , "}"
+         , "char const *hs_bindgen_dce79b5e75543204 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderDriver)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_fd4bb4119f707b2a ("
+         , "  char const *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_WindowFlags arg4,"
+         , "  SDL_Window **arg5,"
+         , "  SDL_Renderer **arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateWindowAndRenderer)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "SDL_Renderer *hs_bindgen_37b63ac6e8618d68 ("
+         , "  SDL_Window *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateRenderer)(arg1, arg2);"
+         , "}"
+         , "SDL_Renderer *hs_bindgen_fe8ca198b1b0c17d ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateRendererWithProperties)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "SDL_Renderer *hs_bindgen_40c46710682c09f1 ("
+         , "  SDL_GPUDevice *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_CreateGPURenderer)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_CreateGPURenderer requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "SDL_GPUDevice *hs_bindgen_76cee8398d82c692 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetGPURendererDevice)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetGPURendererDevice requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_Renderer *hs_bindgen_3a402a665e290fa3 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSoftwareRenderer)(arg1);"
+         , "}"
+         , "SDL_Renderer *hs_bindgen_30584ed4cc19ca5c ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderer)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_c043f286f3176cd8 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderWindow)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_b4d2799733c66a42 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRendererName)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_519d759f13b5a204 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRendererProperties)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_15b72b770c77a09c ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderOutputSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_09a49b8dd8196ac2 ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCurrentRenderOutputSize)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_Texture *hs_bindgen_3d4ff9d99a3fa98a ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_PixelFormat arg2,"
+         , "  SDL_TextureAccess arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTexture)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "SDL_Texture *hs_bindgen_46cceb118c5977b8 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTextureFromSurface)(arg1, arg2);"
+         , "}"
+         , "SDL_Texture *hs_bindgen_52cc37cb33c5a099 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTextureWithProperties)(arg1, arg2);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_7d1578a13c421f10 ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureProperties)(arg1);"
+         , "}"
+         , "SDL_Renderer *hs_bindgen_59ae54d4482ab0ef ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRendererFromTexture)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_132d974026c63235 ("
+         , "  SDL_Texture *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureSize)(arg1, arg2, arg3);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_b9b978978bcb3701 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Palette *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetTexturePalette)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetTexturePalette requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Palette *hs_bindgen_38dd0c6a7ed9af72 ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetTexturePalette)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetTexturePalette requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_328bc9103549865a ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureColorMod)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_f0f25fbdb4151d72 ("
+         , "  SDL_Texture *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureColorModFloat)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_23c41565e3ebaf20 ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 *arg2,"
+         , "  Uint8 *arg3,"
+         , "  Uint8 *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureColorMod)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_40f14359348d1377 ("
+         , "  SDL_Texture *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3,"
+         , "  float *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureColorModFloat)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_5ed240f184c27e2f ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureAlphaMod)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5ea85df5eef9526f ("
+         , "  SDL_Texture *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureAlphaModFloat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b3e62a9848e5067e ("
+         , "  SDL_Texture *arg1,"
+         , "  Uint8 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureAlphaMod)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_55b6c4f083626b7a ("
+         , "  SDL_Texture *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureAlphaModFloat)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_34ab5b9eb64f99e7 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_BlendMode arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_9e50ca0241b5eecf ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_BlendMode *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7ec0426bb117fde0 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_ScaleMode arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTextureScaleMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d153e754b011263b ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_ScaleMode *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTextureScaleMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_9d30d0aa8075c243 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  void const *arg3,"
+         , "  signed int arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateTexture)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_145fdda972278858 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  Uint8 const *arg3,"
+         , "  signed int arg4,"
+         , "  Uint8 const *arg5,"
+         , "  signed int arg6,"
+         , "  Uint8 const *arg7,"
+         , "  signed int arg8"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateYUVTexture)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);"
+         , "}"
+         , "_Bool hs_bindgen_8e87aea72679c0be ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  Uint8 const *arg3,"
+         , "  signed int arg4,"
+         , "  Uint8 const *arg5,"
+         , "  signed int arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateNVTexture)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_f81dacbd782960a7 ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  void **arg3,"
+         , "  signed int *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_LockTexture)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_0422047faea9296b ("
+         , "  SDL_Texture *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface **arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_LockTextureToSurface)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_9d1b4d7003c2d0ec ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockTexture)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_42456f91219d7d63 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderTarget)(arg1, arg2);"
+         , "}"
+         , "SDL_Texture *hs_bindgen_afd608e22c7b34c2 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderTarget)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_99a6a5d6611eb0ad ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_RendererLogicalPresentation arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderLogicalPresentation)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_cbe5162cf71da053 ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3,"
+         , "  SDL_RendererLogicalPresentation *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderLogicalPresentation)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_60fac3e135efff7b ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderLogicalPresentationRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_88c23a7a2bb3f897 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderCoordinatesFromWindow)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_30a19a6793a8a60a ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderCoordinatesToWindow)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_99e1877354dd4cdb ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Event *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertEventToRenderCoordinates)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_da47a291603fd568 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderViewport)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d36147bdfea02ae0 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderViewport)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b75de8ea63ffb717 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderViewportSet)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_143575ef07d5400f ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderSafeArea)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_db4ee8d700a535c8 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderClipRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_7bd39620f800ed67 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderClipRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_011ece38ae24698a ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderClipEnabled)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_a2ecfc86b7164248 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderScale)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_9b27eba43ce3989c ("
+         , "  SDL_Renderer *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderScale)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_122da056b531e869 ("
+         , "  SDL_Renderer *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderDrawColor)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_069391a3e71d464d ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderDrawColorFloat)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_7f0f910be4b2889e ("
+         , "  SDL_Renderer *arg1,"
+         , "  Uint8 *arg2,"
+         , "  Uint8 *arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderDrawColor)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_7679f2d13375bcd2 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3,"
+         , "  float *arg4,"
+         , "  float *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderDrawColorFloat)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_2d134fc6b089039f ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderColorScale)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_f9539095c565384c ("
+         , "  SDL_Renderer *arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderColorScale)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_1885ca90cb47d78c ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_BlendMode arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderDrawBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_80ecda0d3d8d870b ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_BlendMode *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderDrawBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_82119a8dbd03b3ca ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderClear)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_c73e2796ab7f90c1 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderPoint)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_cb752ddd9f3b53be ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FPoint const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderPoints)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_8fc8b7b71da27e92 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderLine)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_d68b0895520fbd3a ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FPoint const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderLines)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_74702b94b10a8a97 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_2ee379e179df5f3c ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderRects)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_c5b24d3e3930aa12 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderFillRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_afbd05ab4eae453e ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_FRect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderFillRects)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_9502ac14df729213 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FRect const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderTexture)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_bdd81c1a4d95fd9a ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FRect const *arg4,"
+         , "  double arg5,"
+         , "  SDL_FPoint const *arg6,"
+         , "  SDL_FlipMode arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderTextureRotated)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_18c2f3b6d0215153 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  SDL_FPoint const *arg4,"
+         , "  SDL_FPoint const *arg5,"
+         , "  SDL_FPoint const *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderTextureAffine)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_f46f867b1d2a5b99 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  float arg4,"
+         , "  SDL_FRect const *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderTextureTiled)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_7460ccca85327f67 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  float arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7,"
+         , "  float arg8,"
+         , "  SDL_FRect const *arg9"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderTexture9Grid)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_82ec92cefa73aeb4 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_FRect const *arg3,"
+         , "  float arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7,"
+         , "  float arg8,"
+         , "  SDL_FRect const *arg9,"
+         , "  float arg10"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_RenderTexture9GridTiled)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; (void)arg5; (void)arg6; (void)arg7; (void)arg8; (void)arg9; (void)arg10; SDL_SetError(\"SDL_RenderTexture9GridTiled requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_604c256c92b502f9 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  SDL_Vertex const *arg3,"
+         , "  signed int arg4,"
+         , "  signed int const *arg5,"
+         , "  signed int arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderGeometry)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_ae17af9f44d6d343 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Texture *arg2,"
+         , "  float const *arg3,"
+         , "  signed int arg4,"
+         , "  SDL_FColor const *arg5,"
+         , "  signed int arg6,"
+         , "  float const *arg7,"
+         , "  signed int arg8,"
+         , "  signed int arg9,"
+         , "  void const *arg10,"
+         , "  signed int arg11,"
+         , "  signed int arg12"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderGeometryRaw)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "_Bool hs_bindgen_f5de60362bf89a18 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_TextureAddressMode arg2,"
+         , "  SDL_TextureAddressMode arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetRenderTextureAddressMode)(arg1, arg2, arg3);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; SDL_SetError(\"SDL_SetRenderTextureAddressMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "_Bool hs_bindgen_727bb39b49c44f15 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_TextureAddressMode *arg2,"
+         , "  SDL_TextureAddressMode *arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetRenderTextureAddressMode)(arg1, arg2, arg3);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; SDL_SetError(\"SDL_GetRenderTextureAddressMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_Surface *hs_bindgen_7173be00862c48e8 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderReadPixels)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_e66060f4d8ba3f83 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderPresent)(arg1);"
+         , "}"
+         , "void hs_bindgen_daf903d539dab511 ("
+         , "  SDL_Texture *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyTexture)(arg1);"
+         , "}"
+         , "void hs_bindgen_1473f45c80ad6575 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyRenderer)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_78e89be71892a1e6 ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_FlushRenderer)(arg1);"
+         , "}"
+         , "void *hs_bindgen_47416f026ca1192f ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderMetalLayer)(arg1);"
+         , "}"
+         , "void *hs_bindgen_c2e3411ac19d746f ("
+         , "  SDL_Renderer *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderMetalCommandEncoder)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_98b03ff5afd62e07 ("
+         , "  SDL_Renderer *arg1,"
+         , "  Uint32 arg2,"
+         , "  Sint64 arg3,"
+         , "  Sint64 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_AddVulkanRenderSemaphores)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_529493ee355e9466 ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetRenderVSync)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ff41dba2a623c0ab ("
+         , "  SDL_Renderer *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetRenderVSync)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a60ea3ca32fd26a5 ("
+         , "  SDL_Renderer *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  char const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_RenderDebugText)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_e0aee38e1b73b64f ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_ScaleMode arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetDefaultTextureScaleMode)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetDefaultTextureScaleMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_51c8f91a397184cb ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_ScaleMode *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetDefaultTextureScaleMode)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_GetDefaultTextureScaleMode requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "SDL_GPURenderState *hs_bindgen_2d970ffb5a76b1e4 ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_GPURenderStateCreateInfo const *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_CreateGPURenderState)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_CreateGPURenderState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "_Bool hs_bindgen_312b275c9f55463c ("
+         , "  SDL_GPURenderState *arg1,"
+         , "  Uint32 arg2,"
+         , "  void const *arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetGPURenderStateFragmentUniforms)(arg1, arg2, arg3, arg4);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; SDL_SetError(\"SDL_SetGPURenderStateFragmentUniforms requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "_Bool hs_bindgen_0d6949c161acc59d ("
+         , "  SDL_Renderer *arg1,"
+         , "  SDL_GPURenderState *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetGPURenderState)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetGPURenderState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef struct SDL_GPUDevice SDL_GPUDevice;"
+         , "typedef struct SDL_GPURenderState SDL_GPURenderState;"
+         , "typedef struct SDL_GPURenderStateCreateInfo SDL_GPURenderStateCreateInfo;"
+         , "typedef int SDL_TextureAddressMode;"
+         , "#endif"
+         , "void hs_bindgen_eccc60d637069ae8 ("
+         , "  SDL_GPURenderState *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  (SDL_DestroyGPURenderState)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_DestroyGPURenderState requires SDL >= 3.4.0\");"
+         , "#endif"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetNumRenderDrivers@
+foreign import ccall unsafe "hs_bindgen_b8d027f3d5602f48"
+  hs_bindgen_b8d027f3d5602f48_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetNumRenderDrivers@
+hs_bindgen_b8d027f3d5602f48 :: IO BG.CInt
+hs_bindgen_b8d027f3d5602f48 =
+  BG.fromFFIType hs_bindgen_b8d027f3d5602f48_base
+
+-- | Get the number of 2D rendering drivers available for the current display.
+--
+--     A render driver is a set of code that handles rendering and texture management on a particular display. Normally there is only one, but some drivers may have several available with different capabilities.
+--
+--     There may be none if SDL was compiled without render support.
+--
+--     [Returns]: the number of built in render drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', 'sDL_GetRenderDriver'
+--
+--     [C declaration]: @SDL_GetNumRenderDrivers@, defined at @SDL3\/SDL_render.h 192:33@
+sDL_GetNumRenderDrivers :: IO BG.CInt
+sDL_GetNumRenderDrivers = hs_bindgen_b8d027f3d5602f48
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderDriver@
+foreign import ccall unsafe "hs_bindgen_dce79b5e75543204"
+  hs_bindgen_dce79b5e75543204_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderDriver@
+hs_bindgen_dce79b5e75543204
+  :: BG.CInt
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_dce79b5e75543204 =
+  BG.fromFFIType hs_bindgen_dce79b5e75543204_base
+
+-- | Use this function to get the name of a built in 2D rendering driver.
+--
+--     The list of rendering drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"opengl\", \"direct3d12\" or \"metal\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the rendering driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumRenderDrivers'
+--
+--     [C declaration]: @SDL_GetRenderDriver@, defined at @SDL3\/SDL_render.h 216:42@
+sDL_GetRenderDriver
+  :: BG.CInt
+  -- ^
+  --
+  --           [@index@]: the index of the rendering driver; the value ranges from 0 to @SDL_GetNumRenderDrivers()@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetRenderDriver = hs_bindgen_dce79b5e75543204
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateWindowAndRenderer@
+foreign import ccall unsafe "hs_bindgen_fd4bb4119f707b2a"
+  hs_bindgen_fd4bb4119f707b2a_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateWindowAndRenderer@
+hs_bindgen_fd4bb4119f707b2a
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Video.SDL_WindowFlags
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+  -> BG.Ptr (BG.Ptr SDL_Renderer)
+  -> IO BG.CBool
+hs_bindgen_fd4bb4119f707b2a =
+  BG.fromFFIType hs_bindgen_fd4bb4119f707b2a_base
+
+-- | Create a window and default renderer.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', SDL_CreateWindow
+--
+--     [C declaration]: @SDL_CreateWindowAndRenderer@, defined at @SDL3\/SDL_render.h 238:34@
+sDL_CreateWindowAndRenderer
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the title of the window, in UTF-8 encoding.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the window.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the window.
+  -> SDL3.Sys.Bindgen.Video.SDL_WindowFlags
+  -- ^
+  --
+  --           [@window_flags@]: the flags used to create the window (see SDL_CreateWindow()).
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+  -- ^
+  --
+  --           [@window@]: a pointer filled with the window, or NULL on error.
+  -> BG.Ptr (BG.Ptr SDL_Renderer)
+  -- ^
+  --
+  --           [@renderer@]: a pointer filled with the renderer, or NULL on error.
+  -> IO BG.CBool
+sDL_CreateWindowAndRenderer =
+  hs_bindgen_fd4bb4119f707b2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateRenderer@
+foreign import ccall unsafe "hs_bindgen_37b63ac6e8618d68"
+  hs_bindgen_37b63ac6e8618d68_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateRenderer@
+hs_bindgen_37b63ac6e8618d68
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_37b63ac6e8618d68 =
+  BG.fromFFIType hs_bindgen_37b63ac6e8618d68_base
+
+-- | Create a 2D rendering context for a window.
+--
+--     If you want a specific renderer, you can specify its name here. A list of available renderers can be obtained by calling @SDL_GetRenderDriver()@ multiple times, with indices from 0 to @SDL_GetNumRenderDrivers()@ -1. If you don\'t need a specific renderer, specify NULL and SDL will attempt to choose the best option for you, based on what is available on the user\'s system.
+--
+--     If @name@ is a comma-separated list, SDL will try each name, in the order listed, until one succeeds or all of them fail.
+--
+--     By default the rendering size matches the window size in pixels, but you can call @SDL_SetRenderLogicalPresentation()@ to change the content size and scaling options.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRendererWithProperties', 'sDL_CreateSoftwareRenderer', 'sDL_DestroyRenderer', 'sDL_GetNumRenderDrivers', 'sDL_GetRenderDriver', 'sDL_GetRendererName'
+--
+--     [C declaration]: @SDL_CreateRenderer@, defined at @SDL3\/SDL_render.h 273:44@
+sDL_CreateRenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window where rendering is displayed.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the rendering driver to initialize, or NULL to let SDL choose one.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_CreateRenderer = hs_bindgen_37b63ac6e8618d68
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateRendererWithProperties@
+foreign import ccall unsafe "hs_bindgen_fe8ca198b1b0c17d"
+  hs_bindgen_fe8ca198b1b0c17d_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateRendererWithProperties@
+hs_bindgen_fe8ca198b1b0c17d
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_fe8ca198b1b0c17d =
+  BG.fromFFIType hs_bindgen_fe8ca198b1b0c17d_base
+
+-- | Create a 2D rendering context for a window, with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_RENDERER_CREATE_NAME_STRING'@: the name of the rendering driver to use, if a specific one is desired
+--
+--     * @'sDL_PROP_RENDERER_CREATE_WINDOW_POINTER'@: the window where rendering is displayed, required if this isn\'t a software renderer using a surface
+--
+--     * @'sDL_PROP_RENDERER_CREATE_SURFACE_POINTER'@: the surface where rendering is displayed, if you want a software renderer without a window
+--
+--     * @'sDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the colorspace for output to the display, defaults to SDL_COLORSPACE_SRGB. The direct3d11, direct3d12, and metal renderers support SDL_COLORSPACE_SRGB_LINEAR, which is a linear color space and supports HDR output. If you select SDL_COLORSPACE_SRGB_LINEAR, drawing still uses the sRGB colorspace, but values can go beyond 1.0 and float (linear) format textures can be used for HDR content.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER'@: non-zero if you want present synchronized with the refresh rate. This property can take any value that is supported by @SDL_SetRenderVSync()@ for the renderer.
+--
+--     With the SDL GPU renderer (since SDL 3.4.0):
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER'@: the device to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN'@: the app is able to provide SPIR-V shaders to 'SDL_GPURenderState', optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN'@: the app is able to provide DXIL shaders to 'SDL_GPURenderState', optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN'@: the app is able to provide MSL shaders to 'SDL_GPURenderState', optional.
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER'@: the VkInstance to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER'@: the VkSurfaceKHR to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER'@: the VkPhysicalDevice to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_DEVICE_POINTER'@: the VkDevice to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for rendering.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for presentation.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateProperties, 'sDL_CreateRenderer', 'sDL_CreateSoftwareRenderer', 'sDL_DestroyRenderer', 'sDL_GetRendererName'
+--
+--     [C declaration]: @SDL_CreateRendererWithProperties@, defined at @SDL3\/SDL_render.h 337:44@
+sDL_CreateRendererWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_CreateRendererWithProperties =
+  hs_bindgen_fe8ca198b1b0c17d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateGPURenderer@
+foreign import ccall unsafe "hs_bindgen_40c46710682c09f1"
+  hs_bindgen_40c46710682c09f1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateGPURenderer@
+hs_bindgen_40c46710682c09f1
+  :: BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_40c46710682c09f1 =
+  BG.fromFFIType hs_bindgen_40c46710682c09f1_base
+
+-- | Create a 2D GPU rendering context.
+--
+--     The GPU device to use is passed in as a parameter. If this is NULL, then a device will be created normally and can be retrieved using @SDL_GetGPURendererDevice()@.
+--
+--     The window to use is passed in as a parameter. If this is NULL, then this will become an offscreen renderer. In that case, you should call @SDL_SetRenderTarget()@ to setup rendering to a texture, and then call @SDL_RenderPresent()@ normally to complete drawing a frame.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: If this function is called with a valid GPU device, it should be called on the thread that created the device. If this function is called with a valid window, it should be called on the thread that created the window.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_CreateRendererWithProperties', 'sDL_GetGPURendererDevice', SDL_CreateGPUShader, 'sDL_CreateGPURenderState', 'sDL_SetGPURenderState'
+--
+--     [C declaration]: @SDL_CreateGPURenderer@, defined at @SDL3\/SDL_render.h 387:44@
+sDL_CreateGPURenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: the GPU device to use with the renderer, or NULL to create a device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window where rendering is displayed, or NULL to create an offscreen renderer.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_CreateGPURenderer = hs_bindgen_40c46710682c09f1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetGPURendererDevice@
+foreign import ccall unsafe "hs_bindgen_76cee8398d82c692"
+  hs_bindgen_76cee8398d82c692_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetGPURendererDevice@
+hs_bindgen_76cee8398d82c692
+  :: BG.Ptr SDL_Renderer
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice)
+hs_bindgen_76cee8398d82c692 =
+  BG.fromFFIType hs_bindgen_76cee8398d82c692_base
+
+-- | Return the GPU device used by a renderer.
+--
+--     [Returns]: the GPU device used by the renderer, or NULL if the renderer is not a GPU renderer; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetGPURendererDevice@, defined at @SDL3\/SDL_render.h 400:45@
+sDL_GetGPURendererDevice
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice)
+sDL_GetGPURendererDevice =
+  hs_bindgen_76cee8398d82c692
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateSoftwareRenderer@
+foreign import ccall unsafe "hs_bindgen_3a402a665e290fa3"
+  hs_bindgen_3a402a665e290fa3_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateSoftwareRenderer@
+hs_bindgen_3a402a665e290fa3
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_3a402a665e290fa3 =
+  BG.fromFFIType hs_bindgen_3a402a665e290fa3_base
+
+-- | Create a 2D software rendering context for a surface.
+--
+--     Two other API which can be used to create 'SDL_Renderer': @SDL_CreateRenderer()@ and @SDL_CreateWindowAndRenderer()@. These can /also/ create a software renderer, but they are intended to be used with an SDL_Window as the final destination and not an SDL_Surface.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyRenderer'
+--
+--     [C declaration]: @SDL_CreateSoftwareRenderer@, defined at @SDL3\/SDL_render.h 421:44@
+sDL_CreateSoftwareRenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the SDL_Surface structure representing the surface where rendering is done.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_CreateSoftwareRenderer =
+  hs_bindgen_3a402a665e290fa3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderer@
+foreign import ccall unsafe "hs_bindgen_30584ed4cc19ca5c"
+  hs_bindgen_30584ed4cc19ca5c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderer@
+hs_bindgen_30584ed4cc19ca5c
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_30584ed4cc19ca5c =
+  BG.fromFFIType hs_bindgen_30584ed4cc19ca5c_base
+
+-- | Get the renderer associated with a window.
+--
+--     [Returns]: the rendering context on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRenderer@, defined at @SDL3\/SDL_render.h 434:44@
+sDL_GetRenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_GetRenderer = hs_bindgen_30584ed4cc19ca5c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderWindow@
+foreign import ccall unsafe "hs_bindgen_c043f286f3176cd8"
+  hs_bindgen_c043f286f3176cd8_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderWindow@
+hs_bindgen_c043f286f3176cd8
+  :: BG.Ptr SDL_Renderer
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+hs_bindgen_c043f286f3176cd8 =
+  BG.fromFFIType hs_bindgen_c043f286f3176cd8_base
+
+-- | Get the window associated with a renderer.
+--
+--     [Returns]: the window on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRenderWindow@, defined at @SDL3\/SDL_render.h 447:42@
+sDL_GetRenderWindow
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+sDL_GetRenderWindow = hs_bindgen_c043f286f3176cd8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRendererName@
+foreign import ccall unsafe "hs_bindgen_b4d2799733c66a42"
+  hs_bindgen_b4d2799733c66a42_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRendererName@
+hs_bindgen_b4d2799733c66a42
+  :: BG.Ptr SDL_Renderer
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_b4d2799733c66a42 =
+  BG.fromFFIType hs_bindgen_b4d2799733c66a42_base
+
+-- | Get the name of a renderer.
+--
+--     [Returns]: the name of the selected renderer, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', 'sDL_CreateRendererWithProperties'
+--
+--     [C declaration]: @SDL_GetRendererName@, defined at @SDL3\/SDL_render.h 463:42@
+sDL_GetRendererName
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetRendererName = hs_bindgen_b4d2799733c66a42
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRendererProperties@
+foreign import ccall unsafe "hs_bindgen_519d759f13b5a204"
+  hs_bindgen_519d759f13b5a204_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRendererProperties@
+hs_bindgen_519d759f13b5a204
+  :: BG.Ptr SDL_Renderer
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_519d759f13b5a204 =
+  BG.fromFFIType hs_bindgen_519d759f13b5a204_base
+
+-- | Get the properties associated with a renderer.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_RENDERER_NAME_STRING'@: the name of the rendering driver
+--
+--     * @'sDL_PROP_RENDERER_WINDOW_POINTER'@: the window where rendering is displayed, if any
+--
+--     * @'sDL_PROP_RENDERER_SURFACE_POINTER'@: the surface where rendering is displayed, if this is a software renderer without a window
+--
+--     * @'sDL_PROP_RENDERER_VSYNC_NUMBER'@: the current vsync setting
+--
+--     * @'sDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER'@: the maximum texture width and height
+--
+--     * @'sDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER'@: a (const SDL_PixelFormat *) array of pixel formats, terminated with SDL_PIXELFORMAT_UNKNOWN, representing the available texture formats for this renderer.
+--
+--     * @'sDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN'@: true if the renderer supports SDL_TEXTURE_ADDRESS_WRAP on non-power-of-two textures.
+--
+--     * @'sDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the colorspace for output to the display, defaults to SDL_COLORSPACE_SRGB.
+--
+--     * @'sDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN'@: true if the output colorspace is SDL_COLORSPACE_SRGB_LINEAR and the renderer is showing on a display with HDR enabled. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT'@: the value of SDR white in the SDL_COLORSPACE_SRGB_LINEAR colorspace. When HDR is enabled, this value is automatically multiplied into the color scale. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_RENDERER_HDR_HEADROOM_FLOAT'@: the additional high dynamic range that can be displayed, in terms of the SDR white point. When HDR is not enabled, this will be 1.0. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     With the direct3d renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D9_DEVICE_POINTER'@: the IDirect3DDevice9 associated with the renderer
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D11_DEVICE_POINTER'@: the ID3D11Device associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_D3D11_SWAPCHAIN_POINTER'@: the IDXGISwapChain1 associated with the renderer. This may change when the window is resized.
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D12_DEVICE_POINTER'@: the ID3D12Device associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_D3D12_SWAPCHAIN_POINTER'@: the IDXGISwapChain4 associated with the renderer.
+--
+--     * @'sDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER'@: the ID3D12CommandQueue associated with the renderer
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_INSTANCE_POINTER'@: the VkInstance associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_SURFACE_NUMBER'@: the VkSurfaceKHR associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_PHYSICAL_DEVICE_POINTER'@: the VkPhysicalDevice associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_DEVICE_POINTER'@: the VkDevice associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for rendering
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for presentation
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER'@: the number of swapchain images, or potential frames in flight, used by the Vulkan renderer
+--
+--     With the gpu renderer:
+--
+--     * @'sDL_PROP_RENDERER_GPU_DEVICE_POINTER'@: the SDL_GPUDevice associated with the renderer
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRendererProperties@, defined at @SDL3\/SDL_render.h 551:46@
+sDL_GetRendererProperties
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetRendererProperties =
+  hs_bindgen_519d759f13b5a204
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderOutputSize@
+foreign import ccall unsafe "hs_bindgen_15b72b770c77a09c"
+  hs_bindgen_15b72b770c77a09c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderOutputSize@
+hs_bindgen_15b72b770c77a09c
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_15b72b770c77a09c =
+  BG.fromFFIType hs_bindgen_15b72b770c77a09c_base
+
+-- | Get the output size in pixels of a rendering context.
+--
+--     This returns the true output size in pixels, ignoring any render targets or logical size and presentation.
+--
+--     For the output size of the current rendering target, with logical size adjustments, use @SDL_GetCurrentRenderOutputSize()@ instead.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCurrentRenderOutputSize'
+--
+--     [C declaration]: @SDL_GetRenderOutputSize@, defined at @SDL3\/SDL_render.h 600:34@
+sDL_GetRenderOutputSize
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width in pixels.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height in pixels.
+  -> IO BG.CBool
+sDL_GetRenderOutputSize = hs_bindgen_15b72b770c77a09c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetCurrentRenderOutputSize@
+foreign import ccall unsafe "hs_bindgen_09a49b8dd8196ac2"
+  hs_bindgen_09a49b8dd8196ac2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetCurrentRenderOutputSize@
+hs_bindgen_09a49b8dd8196ac2
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_09a49b8dd8196ac2 =
+  BG.fromFFIType hs_bindgen_09a49b8dd8196ac2_base
+
+-- | Get the current output size in pixels of a rendering context.
+--
+--     If a rendering target is active, this will return the size of the rendering target in pixels, otherwise return the value of @SDL_GetRenderOutputSize()@.
+--
+--     Rendering target or not, the output will be adjusted by the current logical presentation state, dictated by @SDL_SetRenderLogicalPresentation()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderOutputSize'
+--
+--     [C declaration]: @SDL_GetCurrentRenderOutputSize@, defined at @SDL3\/SDL_render.h 623:34@
+sDL_GetCurrentRenderOutputSize
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the current width.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the current height.
+  -> IO BG.CBool
+sDL_GetCurrentRenderOutputSize =
+  hs_bindgen_09a49b8dd8196ac2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateTexture@
+foreign import ccall unsafe "hs_bindgen_3d4ff9d99a3fa98a"
+  hs_bindgen_3d4ff9d99a3fa98a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateTexture@
+hs_bindgen_3d4ff9d99a3fa98a
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> SDL_TextureAccess
+  -> BG.CInt
+  -> BG.CInt
+  -> IO (BG.Ptr SDL_Texture)
+hs_bindgen_3d4ff9d99a3fa98a =
+  BG.fromFFIType hs_bindgen_3d4ff9d99a3fa98a_base
+
+-- | Create a texture for a rendering context.
+--
+--     The contents of a texture when first created are not defined.
+--
+--     [Returns]: the created texture or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTextureFromSurface', 'sDL_CreateTextureWithProperties', 'sDL_DestroyTexture', 'sDL_GetTextureSize', 'sDL_UpdateTexture'
+--
+--     [C declaration]: @SDL_CreateTexture@, defined at @SDL3\/SDL_render.h 648:43@
+sDL_CreateTexture
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the enumerated values in SDL_PixelFormat.
+  -> SDL_TextureAccess
+  -- ^
+  --
+  --           [@access@]: one of the enumerated values in 'SDL_TextureAccess'.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the texture in pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the texture in pixels.
+  -> IO (BG.Ptr SDL_Texture)
+sDL_CreateTexture = hs_bindgen_3d4ff9d99a3fa98a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateTextureFromSurface@
+foreign import ccall unsafe "hs_bindgen_46cceb118c5977b8"
+  hs_bindgen_46cceb118c5977b8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateTextureFromSurface@
+hs_bindgen_46cceb118c5977b8
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO (BG.Ptr SDL_Texture)
+hs_bindgen_46cceb118c5977b8 =
+  BG.fromFFIType hs_bindgen_46cceb118c5977b8_base
+
+-- | Create a texture from an existing surface.
+--
+--     The surface is not modified or freed by this function.
+--
+--     The 'SDL_TextureAccess' hint for the created texture is @SDL_TEXTUREACCESS_STATIC@.
+--
+--     The pixel format of the created texture may be different from the pixel format of the surface, and can be queried using the SDL_PROP_TEXTURE_FORMAT_NUMBER property.
+--
+--     [Returns]: the created texture or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTexture', 'sDL_CreateTextureWithProperties', 'sDL_DestroyTexture'
+--
+--     [C declaration]: @SDL_CreateTextureFromSurface@, defined at @SDL3\/SDL_render.h 676:43@
+sDL_CreateTextureFromSurface
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the SDL_Surface structure containing pixel data used to fill the texture.
+  -> IO (BG.Ptr SDL_Texture)
+sDL_CreateTextureFromSurface =
+  hs_bindgen_46cceb118c5977b8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateTextureWithProperties@
+foreign import ccall unsafe "hs_bindgen_52cc37cb33c5a099"
+  hs_bindgen_52cc37cb33c5a099_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateTextureWithProperties@
+hs_bindgen_52cc37cb33c5a099
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Texture)
+hs_bindgen_52cc37cb33c5a099 =
+  BG.fromFFIType hs_bindgen_52cc37cb33c5a099_base
+
+-- | Create a texture for a rendering context with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the texture colorspace, defaults to SDL_COLORSPACE_SRGB_LINEAR for floating point textures, SDL_COLORSPACE_HDR10 for 10-bit textures, SDL_COLORSPACE_SRGB for other RGB textures and SDL_COLORSPACE_JPEG for YUV textures.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER'@: one of the enumerated values in SDL_PixelFormat, defaults to the best RGBA format for the renderer
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER'@: one of the enumerated values in 'SDL_TextureAccess', defaults to SDL_TEXTUREACCESS_STATIC
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER'@: the width of the texture in pixels, required
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER'@: the height of the texture in pixels, required
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_PALETTE_POINTER'@: an SDL_Palette to use with palettized texture formats. This can be set later with @SDL_SetTexturePalette()@
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point textures, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 100 for HDR10 textures and 1.0 for floating point textures.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point textures, this defines the maximum dynamic range used by the content, in terms of the SDR white point. This would be equivalent to maxCLL \/ SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT for HDR10 content. If this is defined, any values outside the range supported by the display will be scaled into the available HDR headroom, otherwise they are clipped.
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER'@: the ID3D11Texture2D associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER'@: the ID3D11Texture2D associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER'@: the ID3D11Texture2D associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER'@: the ID3D12Resource associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER'@: the ID3D12Resource associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER'@: the ID3D12Resource associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the metal renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER'@: the CVPixelBufferRef associated with the texture, if you want to create a texture from an existing pixel buffer.
+--
+--     With the opengl renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the opengles2 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER'@: the VkImage associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER'@: the VkImageLayout for the VkImage, defaults to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
+--
+--     With the GPU renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER'@: the SDL_GPUTexture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_NUMBER@: the SDL_GPUTexture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_NUMBER@: the SDL_GPUTexture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_NUMBER@: the SDL_GPUTexture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     [Returns]: the created texture or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateProperties, 'sDL_CreateTexture', 'sDL_CreateTextureFromSurface', 'sDL_DestroyTexture', 'sDL_GetTextureSize', 'sDL_UpdateTexture'
+--
+--     [C declaration]: @SDL_CreateTextureWithProperties@, defined at @SDL3\/SDL_render.h 806:43@
+sDL_CreateTextureWithProperties
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Texture)
+sDL_CreateTextureWithProperties =
+  hs_bindgen_52cc37cb33c5a099
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureProperties@
+foreign import ccall unsafe "hs_bindgen_7d1578a13c421f10"
+  hs_bindgen_7d1578a13c421f10_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureProperties@
+hs_bindgen_7d1578a13c421f10
+  :: BG.Ptr SDL_Texture
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_7d1578a13c421f10 =
+  BG.fromFFIType hs_bindgen_7d1578a13c421f10_base
+
+-- | Get the properties associated with a texture.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_TEXTURE_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the texture colorspace.
+--
+--     * @'sDL_PROP_TEXTURE_FORMAT_NUMBER'@: one of the enumerated values in SDL_PixelFormat.
+--
+--     * @'sDL_PROP_TEXTURE_ACCESS_NUMBER'@: one of the enumerated values in 'SDL_TextureAccess'.
+--
+--     * @'sDL_PROP_TEXTURE_WIDTH_NUMBER'@: the width of the texture in pixels.
+--
+--     * @'sDL_PROP_TEXTURE_HEIGHT_NUMBER'@: the height of the texture in pixels.
+--
+--     * @'sDL_PROP_TEXTURE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point textures, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 100 for HDR10 textures and 1.0 for other textures.
+--
+--     * @'sDL_PROP_TEXTURE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point textures, this defines the maximum dynamic range used by the content, in terms of the SDR white point. If this is defined, any values outside the range supported by the display will be scaled into the available HDR headroom, otherwise they are clipped. This defaults to 1.0 for SDR textures, 4.0 for HDR10 textures, and no default for floating point textures.
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER'@: the ID3D11Texture2D associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_U_POINTER'@: the ID3D11Texture2D associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_V_POINTER'@: the ID3D11Texture2D associated with the V plane of a YUV texture
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER'@: the ID3D12Resource associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_U_POINTER'@: the ID3D12Resource associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_V_POINTER'@: the ID3D12Resource associated with the V plane of a YUV texture
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER'@: the VkImage associated with the texture
+--
+--     With the opengl renderer:
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER'@: the GLuint texture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_TARGET_NUMBER'@: the GLenum for the texture target (@GL_TEXTURE_2D@, @GL_TEXTURE_RECTANGLE_ARB@, etc)
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEX_W_FLOAT'@: the texture coordinate width of the texture (0.0 - 1.0)
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEX_H_FLOAT'@: the texture coordinate height of the texture (0.0 - 1.0)
+--
+--     With the opengles2 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER'@: the GLenum for the texture target (@GL_TEXTURE_2D@, @GL_TEXTURE_EXTERNAL_OES@, etc)
+--
+--     With the gpu renderer:
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_POINTER'@: the SDL_GPUTexture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER'@: the SDL_GPUTexture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER'@: the SDL_GPUTexture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER'@: the SDL_GPUTexture associated with the V plane of a YUV texture
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTextureProperties@, defined at @SDL3\/SDL_render.h 935:46@
+sDL_GetTextureProperties
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetTextureProperties =
+  hs_bindgen_7d1578a13c421f10
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRendererFromTexture@
+foreign import ccall unsafe "hs_bindgen_59ae54d4482ab0ef"
+  hs_bindgen_59ae54d4482ab0ef_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRendererFromTexture@
+hs_bindgen_59ae54d4482ab0ef
+  :: BG.Ptr SDL_Texture
+  -> IO (BG.Ptr SDL_Renderer)
+hs_bindgen_59ae54d4482ab0ef =
+  BG.fromFFIType hs_bindgen_59ae54d4482ab0ef_base
+
+-- | Get the renderer that created an 'SDL_Texture'.
+--
+--     [Returns]: a pointer to the 'SDL_Renderer' that created the texture, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRendererFromTexture@, defined at @SDL3\/SDL_render.h 979:44@
+sDL_GetRendererFromTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO (BG.Ptr SDL_Renderer)
+sDL_GetRendererFromTexture =
+  hs_bindgen_59ae54d4482ab0ef
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureSize@
+foreign import ccall unsafe "hs_bindgen_132d974026c63235"
+  hs_bindgen_132d974026c63235_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureSize@
+hs_bindgen_132d974026c63235
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_132d974026c63235 =
+  BG.fromFFIType hs_bindgen_132d974026c63235_base
+
+-- | Get the size of a texture, as floating point values.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTextureSize@, defined at @SDL3\/SDL_render.h 996:34@
+sDL_GetTextureSize
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width of the texture in pixels. This argument can be NULL if you don\'t need this information.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height of the texture in pixels. This argument can be NULL if you don\'t need this information.
+  -> IO BG.CBool
+sDL_GetTextureSize = hs_bindgen_132d974026c63235
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTexturePalette@
+foreign import ccall unsafe "hs_bindgen_b9b978978bcb3701"
+  hs_bindgen_b9b978978bcb3701_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTexturePalette@
+hs_bindgen_b9b978978bcb3701
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -> IO BG.CBool
+hs_bindgen_b9b978978bcb3701 =
+  BG.fromFFIType hs_bindgen_b9b978978bcb3701_base
+
+-- | Set the palette used by a texture.
+--
+--     Setting the palette keeps an internal reference to the palette, which can be safely destroyed afterwards.
+--
+--     A single palette can be shared with many textures.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: SDL_CreatePalette, 'sDL_GetTexturePalette'
+--
+--     [C declaration]: @SDL_SetTexturePalette@, defined at @SDL3\/SDL_render.h 1018:34@
+sDL_SetTexturePalette
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the SDL_Palette structure to use.
+  -> IO BG.CBool
+sDL_SetTexturePalette = hs_bindgen_b9b978978bcb3701
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTexturePalette@
+foreign import ccall unsafe "hs_bindgen_38dd0c6a7ed9af72"
+  hs_bindgen_38dd0c6a7ed9af72_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTexturePalette@
+hs_bindgen_38dd0c6a7ed9af72
+  :: BG.Ptr SDL_Texture
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+hs_bindgen_38dd0c6a7ed9af72 =
+  BG.fromFFIType hs_bindgen_38dd0c6a7ed9af72_base
+
+-- | Get the palette used by a texture.
+--
+--     [Returns]: a pointer to the palette used by the texture, or NULL if there is no palette used.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetTexturePalette'
+--
+--     [C declaration]: @SDL_GetTexturePalette@, defined at @SDL3\/SDL_render.h 1033:43@
+sDL_GetTexturePalette
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+sDL_GetTexturePalette = hs_bindgen_38dd0c6a7ed9af72
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureColorMod@
+foreign import ccall unsafe "hs_bindgen_328bc9103549865a"
+  hs_bindgen_328bc9103549865a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureColorMod@
+hs_bindgen_328bc9103549865a
+  :: BG.Ptr SDL_Texture
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_328bc9103549865a =
+  BG.fromFFIType hs_bindgen_328bc9103549865a_base
+
+-- | Set an additional color value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * (color \/ 255)@
+--
+--     Color modulation is not always supported by the renderer; it will return false if color modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureColorMod', 'sDL_SetTextureAlphaMod', 'sDL_SetTextureColorModFloat'
+--
+--     [C declaration]: @SDL_SetTextureColorMod@, defined at @SDL3\/SDL_render.h 1062:34@
+sDL_SetTextureColorMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into copy operations.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into copy operations.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into copy operations.
+  -> IO BG.CBool
+sDL_SetTextureColorMod = hs_bindgen_328bc9103549865a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureColorModFloat@
+foreign import ccall unsafe "hs_bindgen_f0f25fbdb4151d72"
+  hs_bindgen_f0f25fbdb4151d72_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureColorModFloat@
+hs_bindgen_f0f25fbdb4151d72
+  :: BG.Ptr SDL_Texture
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_f0f25fbdb4151d72 =
+  BG.fromFFIType hs_bindgen_f0f25fbdb4151d72_base
+
+-- | Set an additional color value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * color@
+--
+--     Color modulation is not always supported by the renderer; it will return false if color modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureColorModFloat', 'sDL_SetTextureAlphaModFloat', 'sDL_SetTextureColorMod'
+--
+--     [C declaration]: @SDL_SetTextureColorModFloat@, defined at @SDL3\/SDL_render.h 1092:34@
+sDL_SetTextureColorModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into copy operations.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into copy operations.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into copy operations.
+  -> IO BG.CBool
+sDL_SetTextureColorModFloat =
+  hs_bindgen_f0f25fbdb4151d72
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureColorMod@
+foreign import ccall unsafe "hs_bindgen_23c41565e3ebaf20"
+  hs_bindgen_23c41565e3ebaf20_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureColorMod@
+hs_bindgen_23c41565e3ebaf20
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_23c41565e3ebaf20 =
+  BG.fromFFIType hs_bindgen_23c41565e3ebaf20_base
+
+-- | Get the additional color value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaMod', 'sDL_GetTextureColorModFloat', 'sDL_SetTextureColorMod'
+--
+--     [C declaration]: @SDL_GetTextureColorMod@, defined at @SDL3\/SDL_render.h 1113:34@
+sDL_GetTextureColorMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO BG.CBool
+sDL_GetTextureColorMod = hs_bindgen_23c41565e3ebaf20
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureColorModFloat@
+foreign import ccall unsafe "hs_bindgen_40f14359348d1377"
+  hs_bindgen_40f14359348d1377_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureColorModFloat@
+hs_bindgen_40f14359348d1377
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_40f14359348d1377 =
+  BG.fromFFIType hs_bindgen_40f14359348d1377_base
+
+-- | Get the additional color value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaModFloat', 'sDL_GetTextureColorMod', 'sDL_SetTextureColorModFloat'
+--
+--     [C declaration]: @SDL_GetTextureColorModFloat@, defined at @SDL3\/SDL_render.h 1133:34@
+sDL_GetTextureColorModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO BG.CBool
+sDL_GetTextureColorModFloat =
+  hs_bindgen_40f14359348d1377
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureAlphaMod@
+foreign import ccall unsafe "hs_bindgen_5ed240f184c27e2f"
+  hs_bindgen_5ed240f184c27e2f_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureAlphaMod@
+hs_bindgen_5ed240f184c27e2f
+  :: BG.Ptr SDL_Texture
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_5ed240f184c27e2f =
+  BG.fromFFIType hs_bindgen_5ed240f184c27e2f_base
+
+-- | Set an additional alpha value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * (alpha \/ 255)@
+--
+--     Alpha modulation is not always supported by the renderer; it will return false if alpha modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaMod', 'sDL_SetTextureAlphaModFloat', 'sDL_SetTextureColorMod'
+--
+--     [C declaration]: @SDL_SetTextureAlphaMod@, defined at @SDL3\/SDL_render.h 1159:34@
+sDL_SetTextureAlphaMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: the source alpha value multiplied into copy operations.
+  -> IO BG.CBool
+sDL_SetTextureAlphaMod = hs_bindgen_5ed240f184c27e2f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureAlphaModFloat@
+foreign import ccall unsafe "hs_bindgen_5ea85df5eef9526f"
+  hs_bindgen_5ea85df5eef9526f_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureAlphaModFloat@
+hs_bindgen_5ea85df5eef9526f
+  :: BG.Ptr SDL_Texture
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_5ea85df5eef9526f =
+  BG.fromFFIType hs_bindgen_5ea85df5eef9526f_base
+
+-- | Set an additional alpha value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * alpha@
+--
+--     Alpha modulation is not always supported by the renderer; it will return false if alpha modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaModFloat', 'sDL_SetTextureAlphaMod', 'sDL_SetTextureColorModFloat'
+--
+--     [C declaration]: @SDL_SetTextureAlphaModFloat@, defined at @SDL3\/SDL_render.h 1185:34@
+sDL_SetTextureAlphaModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@alpha@]: the source alpha value multiplied into copy operations.
+  -> IO BG.CBool
+sDL_SetTextureAlphaModFloat =
+  hs_bindgen_5ea85df5eef9526f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureAlphaMod@
+foreign import ccall unsafe "hs_bindgen_b3e62a9848e5067e"
+  hs_bindgen_b3e62a9848e5067e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureAlphaMod@
+hs_bindgen_b3e62a9848e5067e
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_b3e62a9848e5067e =
+  BG.fromFFIType hs_bindgen_b3e62a9848e5067e_base
+
+-- | Get the additional alpha value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaModFloat', 'sDL_GetTextureColorMod', 'sDL_SetTextureAlphaMod'
+--
+--     [C declaration]: @SDL_GetTextureAlphaMod@, defined at @SDL3\/SDL_render.h 1203:34@
+sDL_GetTextureAlphaMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO BG.CBool
+sDL_GetTextureAlphaMod = hs_bindgen_b3e62a9848e5067e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureAlphaModFloat@
+foreign import ccall unsafe "hs_bindgen_55b6c4f083626b7a"
+  hs_bindgen_55b6c4f083626b7a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureAlphaModFloat@
+hs_bindgen_55b6c4f083626b7a
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_55b6c4f083626b7a =
+  BG.fromFFIType hs_bindgen_55b6c4f083626b7a_base
+
+-- | Get the additional alpha value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureAlphaMod', 'sDL_GetTextureColorModFloat', 'sDL_SetTextureAlphaModFloat'
+--
+--     [C declaration]: @SDL_GetTextureAlphaModFloat@, defined at @SDL3\/SDL_render.h 1221:34@
+sDL_GetTextureAlphaModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO BG.CBool
+sDL_GetTextureAlphaModFloat =
+  hs_bindgen_55b6c4f083626b7a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureBlendMode@
+foreign import ccall unsafe "hs_bindgen_34ab5b9eb64f99e7"
+  hs_bindgen_34ab5b9eb64f99e7_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureBlendMode@
+hs_bindgen_34ab5b9eb64f99e7
+  :: BG.Ptr SDL_Texture
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_34ab5b9eb64f99e7 =
+  BG.fromFFIType hs_bindgen_34ab5b9eb64f99e7_base
+
+-- | Set the blend mode for a texture, used by @SDL_RenderTexture()@.
+--
+--     If the blend mode is not supported, the closest supported mode is chosen and this function returns false.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureBlendMode'
+--
+--     [C declaration]: @SDL_SetTextureBlendMode@, defined at @SDL3\/SDL_render.h 1240:34@
+sDL_SetTextureBlendMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for texture blending.
+  -> IO BG.CBool
+sDL_SetTextureBlendMode = hs_bindgen_34ab5b9eb64f99e7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureBlendMode@
+foreign import ccall unsafe "hs_bindgen_9e50ca0241b5eecf"
+  hs_bindgen_9e50ca0241b5eecf_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureBlendMode@
+hs_bindgen_9e50ca0241b5eecf
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_9e50ca0241b5eecf =
+  BG.fromFFIType hs_bindgen_9e50ca0241b5eecf_base
+
+-- | Get the blend mode used for texture copy operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextureBlendMode'
+--
+--     [C declaration]: @SDL_GetTextureBlendMode@, defined at @SDL3\/SDL_render.h 1256:34@
+sDL_GetTextureBlendMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO BG.CBool
+sDL_GetTextureBlendMode = hs_bindgen_9e50ca0241b5eecf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureScaleMode@
+foreign import ccall unsafe "hs_bindgen_7ec0426bb117fde0"
+  hs_bindgen_7ec0426bb117fde0_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetTextureScaleMode@
+hs_bindgen_7ec0426bb117fde0
+  :: BG.Ptr SDL_Texture
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_7ec0426bb117fde0 =
+  BG.fromFFIType hs_bindgen_7ec0426bb117fde0_base
+
+-- | Set the scale mode used for texture scale operations.
+--
+--     The default texture scale mode is SDL_SCALEMODE_LINEAR.
+--
+--     If the scale mode is not supported, the closest supported mode is chosen.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTextureScaleMode'
+--
+--     [C declaration]: @SDL_SetTextureScaleMode@, defined at @SDL3\/SDL_render.h 1276:34@
+sDL_SetTextureScaleMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the SDL_ScaleMode to use for texture scaling.
+  -> IO BG.CBool
+sDL_SetTextureScaleMode = hs_bindgen_7ec0426bb117fde0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureScaleMode@
+foreign import ccall unsafe "hs_bindgen_d153e754b011263b"
+  hs_bindgen_d153e754b011263b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetTextureScaleMode@
+hs_bindgen_d153e754b011263b
+  :: BG.Ptr SDL_Texture
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_d153e754b011263b =
+  BG.fromFFIType hs_bindgen_d153e754b011263b_base
+
+-- | Get the scale mode used for texture scale operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTextureScaleMode'
+--
+--     [C declaration]: @SDL_GetTextureScaleMode@, defined at @SDL3\/SDL_render.h 1292:34@
+sDL_GetTextureScaleMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: a pointer filled in with the current scale mode.
+  -> IO BG.CBool
+sDL_GetTextureScaleMode = hs_bindgen_d153e754b011263b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_UpdateTexture@
+foreign import ccall unsafe "hs_bindgen_9d30d0aa8075c243"
+  hs_bindgen_9d30d0aa8075c243_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_UpdateTexture@
+hs_bindgen_9d30d0aa8075c243
+  :: BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_9d30d0aa8075c243 =
+  BG.fromFFIType hs_bindgen_9d30d0aa8075c243_base
+
+-- | Update the given texture rectangle with new pixel data.
+--
+--     The pixel data must be in the pixel format of the texture, which can be queried using the SDL_PROP_TEXTURE_FORMAT_NUMBER property.
+--
+--     This is a fairly slow function, intended for use with static textures that do not change often.
+--
+--     If the texture is intended to be updated often, it is preferred to create the texture as streaming and use the locking functions referenced below. While this function will work with streaming textures, for optimization reasons you may not get the pixels back if you lock the texture afterward.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTexture', 'sDL_UnlockTexture', 'sDL_UpdateNVTexture', 'sDL_UpdateYUVTexture'
+--
+--     [C declaration]: @SDL_UpdateTexture@, defined at @SDL3\/SDL_render.h 1326:34@
+sDL_UpdateTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@pixels@]: the raw pixel data in the format of the texture.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@pitch@]: the number of bytes in a row of pixel data, including padding between lines.
+  -> IO BG.CBool
+sDL_UpdateTexture = hs_bindgen_9d30d0aa8075c243
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_UpdateYUVTexture@
+foreign import ccall unsafe "hs_bindgen_145fdda972278858"
+  hs_bindgen_145fdda972278858_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_UpdateYUVTexture@
+hs_bindgen_145fdda972278858
+  :: BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_145fdda972278858 =
+  BG.fromFFIType hs_bindgen_145fdda972278858_base
+
+-- | Update a rectangle within a planar YV12 or IYUV texture with new pixel data.
+--
+--     You can use @SDL_UpdateTexture()@ as long as your pixel data is a contiguous block of Y and U\/V planes in the proper order, but this function is available if your pixel data is not contiguous.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UpdateNVTexture', 'sDL_UpdateTexture'
+--
+--     [C declaration]: @SDL_UpdateYUVTexture@, defined at @SDL3\/SDL_render.h 1358:34@
+sDL_UpdateYUVTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Yplane@]: the raw pixel data for the Y plane.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@Ypitch@]: the number of bytes between rows of pixel data for the Y plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Uplane@]: the raw pixel data for the U plane.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@Upitch@]: the number of bytes between rows of pixel data for the U plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Vplane@]: the raw pixel data for the V plane.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@Vpitch@]: the number of bytes between rows of pixel data for the V plane.
+  -> IO BG.CBool
+sDL_UpdateYUVTexture = hs_bindgen_145fdda972278858
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_UpdateNVTexture@
+foreign import ccall unsafe "hs_bindgen_8e87aea72679c0be"
+  hs_bindgen_8e87aea72679c0be_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_UpdateNVTexture@
+hs_bindgen_8e87aea72679c0be
+  :: BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_8e87aea72679c0be =
+  BG.fromFFIType hs_bindgen_8e87aea72679c0be_base
+
+-- | Update a rectangle within a planar NV12 or NV21 texture with new pixels.
+--
+--     You can use @SDL_UpdateTexture()@ as long as your pixel data is a contiguous block of NV12\/21 planes in the proper order, but this function is available if your pixel data is not contiguous.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UpdateTexture', 'sDL_UpdateYUVTexture'
+--
+--     [C declaration]: @SDL_UpdateNVTexture@, defined at @SDL3\/SDL_render.h 1390:34@
+sDL_UpdateNVTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Yplane@]: the raw pixel data for the Y plane.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@Ypitch@]: the number of bytes between rows of pixel data for the Y plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@UVplane@]: the raw pixel data for the UV plane.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@UVpitch@]: the number of bytes between rows of pixel data for the UV plane.
+  -> IO BG.CBool
+sDL_UpdateNVTexture = hs_bindgen_8e87aea72679c0be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_LockTexture@
+foreign import ccall unsafe "hs_bindgen_f81dacbd782960a7"
+  hs_bindgen_f81dacbd782960a7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_LockTexture@
+hs_bindgen_f81dacbd782960a7
+  :: BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_f81dacbd782960a7 =
+  BG.fromFFIType hs_bindgen_f81dacbd782960a7_base
+
+-- | Lock a portion of the texture for __write-only__ pixel access.
+--
+--     As an optimization, the pixels made available for editing don\'t necessarily contain the old texture data. This is a write-only operation, and if you need to keep a copy of the texture data you should do that at the application level.
+--
+--     You must use @SDL_UnlockTexture()@ to unlock the pixels and apply any changes.
+--
+--     [Returns]: true on success or false if the texture is not valid or was not created with @SDL_TEXTUREACCESS_STREAMING@; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTextureToSurface', 'sDL_UnlockTexture'
+--
+--     [C declaration]: @SDL_LockTexture@, defined at @SDL3\/SDL_render.h 1425:34@
+sDL_LockTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to lock for access, which was created with @SDL_TEXTUREACCESS_STREAMING@.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to lock for access; NULL to lock the entire texture.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@pixels@]: this is filled in with a pointer to the locked pixels, appropriately offset by the locked area.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@pitch@]: this is filled in with the pitch of the locked pixels; the pitch is the length of one row in bytes.
+  -> IO BG.CBool
+sDL_LockTexture = hs_bindgen_f81dacbd782960a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_LockTextureToSurface@
+foreign import ccall unsafe "hs_bindgen_0422047faea9296b"
+  hs_bindgen_0422047faea9296b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_LockTextureToSurface@
+hs_bindgen_0422047faea9296b
+  :: BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+  -> IO BG.CBool
+hs_bindgen_0422047faea9296b =
+  BG.fromFFIType hs_bindgen_0422047faea9296b_base
+
+-- | Lock a portion of the texture for __write-only__ pixel access, and expose it as a SDL surface.
+--
+--     Besides providing an SDL_Surface instead of raw pixel data, this function operates like SDL_LockTexture.
+--
+--     As an optimization, the pixels made available for editing don\'t necessarily contain the old texture data. This is a write-only operation, and if you need to keep a copy of the texture data you should do that at the application level.
+--
+--     You must use @SDL_UnlockTexture()@ to unlock the pixels and apply any changes.
+--
+--     The returned surface is freed internally after calling @SDL_UnlockTexture()@ or @SDL_DestroyTexture()@. The caller should not free it.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTexture', 'sDL_UnlockTexture'
+--
+--     [C declaration]: @SDL_LockTextureToSurface@, defined at @SDL3\/SDL_render.h 1463:34@
+sDL_LockTextureToSurface
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to lock for access, which must be created with @SDL_TEXTUREACCESS_STREAMING@.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle to lock for access. If the rect is NULL, the entire texture will be locked.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+  -- ^
+  --
+  --           [@surface@]: a pointer to an SDL surface of size __rect__. Don\'t assume any specific pixel content.
+  -> IO BG.CBool
+sDL_LockTextureToSurface =
+  hs_bindgen_0422047faea9296b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_UnlockTexture@
+foreign import ccall unsafe "hs_bindgen_9d1b4d7003c2d0ec"
+  hs_bindgen_9d1b4d7003c2d0ec_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_UnlockTexture@
+hs_bindgen_9d1b4d7003c2d0ec
+  :: BG.Ptr SDL_Texture
+  -> IO ()
+hs_bindgen_9d1b4d7003c2d0ec =
+  BG.fromFFIType hs_bindgen_9d1b4d7003c2d0ec_base
+
+-- | Unlock a texture, uploading the changes to video memory, if needed.
+--
+--     __Warning__: Please note that @SDL_LockTexture()@ is intended to be write-only; it will not guarantee the previous contents of the texture will be provided. You must fully initialize any area of a texture that you lock before unlocking it, as the pixels might otherwise be uninitialized memory.
+--
+--     Which is to say: locking and immediately unlocking a texture can result in corrupted textures, depending on the renderer in use.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockTexture'
+--
+--     [C declaration]: @SDL_UnlockTexture@, defined at @SDL3\/SDL_render.h 1484:34@
+sDL_UnlockTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: a texture locked by @SDL_LockTexture()@.
+  -> IO ()
+sDL_UnlockTexture = hs_bindgen_9d1b4d7003c2d0ec
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderTarget@
+foreign import ccall unsafe "hs_bindgen_42456f91219d7d63"
+  hs_bindgen_42456f91219d7d63_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderTarget@
+hs_bindgen_42456f91219d7d63
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> IO BG.CBool
+hs_bindgen_42456f91219d7d63 =
+  BG.fromFFIType hs_bindgen_42456f91219d7d63_base
+
+-- | Set a texture as the current rendering target.
+--
+--     The default render target is the window for which the renderer was created. To stop rendering to a texture and render to the window again, call this function with a NULL @texture@.
+--
+--     Viewport, cliprect, scale, and logical presentation are unique to each render target. Get and set functions for these states apply to the current render target set by this function, and those states persist on each target when the current render target changes.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderTarget'
+--
+--     [C declaration]: @SDL_SetRenderTarget@, defined at @SDL3\/SDL_render.h 1511:34@
+sDL_SetRenderTarget
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the targeted texture, which must be created with the @SDL_TEXTUREACCESS_TARGET@ flag, or NULL to render to the window instead of a texture.
+  -> IO BG.CBool
+sDL_SetRenderTarget = hs_bindgen_42456f91219d7d63
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderTarget@
+foreign import ccall unsafe "hs_bindgen_afd608e22c7b34c2"
+  hs_bindgen_afd608e22c7b34c2_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderTarget@
+hs_bindgen_afd608e22c7b34c2
+  :: BG.Ptr SDL_Renderer
+  -> IO (BG.Ptr SDL_Texture)
+hs_bindgen_afd608e22c7b34c2 =
+  BG.fromFFIType hs_bindgen_afd608e22c7b34c2_base
+
+-- | Get the current render target.
+--
+--     The default render target is the window for which the renderer was created, and is reported a NULL here.
+--
+--     [Returns]: the current render target or NULL for the default render target.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderTarget'
+--
+--     [C declaration]: @SDL_GetRenderTarget@, defined at @SDL3\/SDL_render.h 1528:43@
+sDL_GetRenderTarget
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (BG.Ptr SDL_Texture)
+sDL_GetRenderTarget = hs_bindgen_afd608e22c7b34c2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderLogicalPresentation@
+foreign import ccall unsafe "hs_bindgen_99a6a5d6611eb0ad"
+  hs_bindgen_99a6a5d6611eb0ad_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderLogicalPresentation@
+hs_bindgen_99a6a5d6611eb0ad
+  :: BG.Ptr SDL_Renderer
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL_RendererLogicalPresentation
+  -> IO BG.CBool
+hs_bindgen_99a6a5d6611eb0ad =
+  BG.fromFFIType hs_bindgen_99a6a5d6611eb0ad_base
+
+-- | Set a device-independent resolution and presentation mode for rendering.
+--
+--     This function sets the width and height of the logical rendering output. The renderer will act as if the current render target is always the requested dimensions, scaling to the actual resolution as necessary.
+--
+--     This can be useful for games that expect a fixed size, but would like to scale the output to whatever is available, regardless of how a user resizes a window, or if the display is high DPI.
+--
+--     Logical presentation can be used with both render target textures and the renderer\'s window; the state is unique to each render target, and this function sets the state for the current render target. It might be useful to draw to a texture that matches the window dimensions with logical presentation enabled, and then draw that texture across the entire window with logical presentation disabled. Be careful not to render both with logical presentation enabled, however, as this could produce double-letterboxing, etc.
+--
+--     You can disable logical coordinates by setting the mode to SDL_LOGICAL_PRESENTATION_DISABLED, and in that case you get the full pixel resolution of the render target; it is safe to toggle logical presentation during the rendering of a frame: perhaps most of the rendering is done to specific dimensions but to make fonts look sharp, the app turns off logical presentation while drawing text, for example.
+--
+--     You can convert coordinates in an event into rendering coordinates using @SDL_ConvertEventToRenderCoordinates()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertEventToRenderCoordinates', 'sDL_GetRenderLogicalPresentation', 'sDL_GetRenderLogicalPresentationRect'
+--
+--     [C declaration]: @SDL_SetRenderLogicalPresentation@, defined at @SDL3\/SDL_render.h 1575:34@
+sDL_SetRenderLogicalPresentation
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the logical resolution.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the logical resolution.
+  -> SDL_RendererLogicalPresentation
+  -- ^
+  --
+  --           [@mode@]: the presentation mode used.
+  -> IO BG.CBool
+sDL_SetRenderLogicalPresentation =
+  hs_bindgen_99a6a5d6611eb0ad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderLogicalPresentation@
+foreign import ccall unsafe "hs_bindgen_cbe5162cf71da053"
+  hs_bindgen_cbe5162cf71da053_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderLogicalPresentation@
+hs_bindgen_cbe5162cf71da053
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr SDL_RendererLogicalPresentation
+  -> IO BG.CBool
+hs_bindgen_cbe5162cf71da053 =
+  BG.fromFFIType hs_bindgen_cbe5162cf71da053_base
+
+-- | Get device independent resolution and presentation mode for rendering.
+--
+--     This function gets the width and height of the logical rendering output, or 0 if a logical resolution is not enabled.
+--
+--     Each render target has its own logical presentation state. This function gets the state for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation'
+--
+--     [C declaration]: @SDL_GetRenderLogicalPresentation@, defined at @SDL3\/SDL_render.h 1600:34@
+sDL_GetRenderLogicalPresentation
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: an int filled with the logical presentation width.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: an int filled with the logical presentation height.
+  -> BG.Ptr SDL_RendererLogicalPresentation
+  -- ^
+  --
+  --           [@mode@]: a variable filled with the logical presentation mode being used.
+  -> IO BG.CBool
+sDL_GetRenderLogicalPresentation =
+  hs_bindgen_cbe5162cf71da053
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderLogicalPresentationRect@
+foreign import ccall unsafe "hs_bindgen_60fac3e135efff7b"
+  hs_bindgen_60fac3e135efff7b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderLogicalPresentationRect@
+hs_bindgen_60fac3e135efff7b
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_60fac3e135efff7b =
+  BG.fromFFIType hs_bindgen_60fac3e135efff7b_base
+
+-- | Get the final presentation rectangle for rendering.
+--
+--     This function returns the calculated rectangle used for logical presentation, based on the presentation mode and output size. If logical presentation is disabled, it will fill the rectangle with the output size, in pixels.
+--
+--     Each render target has its own logical presentation state. This function gets the rectangle for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation'
+--
+--     [C declaration]: @SDL_GetRenderLogicalPresentationRect@, defined at @SDL3\/SDL_render.h 1625:34@
+sDL_GetRenderLogicalPresentationRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the final presentation rectangle, may be NULL.
+  -> IO BG.CBool
+sDL_GetRenderLogicalPresentationRect =
+  hs_bindgen_60fac3e135efff7b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderCoordinatesFromWindow@
+foreign import ccall unsafe "hs_bindgen_88c23a7a2bb3f897"
+  hs_bindgen_88c23a7a2bb3f897_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderCoordinatesFromWindow@
+hs_bindgen_88c23a7a2bb3f897
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_88c23a7a2bb3f897 =
+  BG.fromFFIType hs_bindgen_88c23a7a2bb3f897_base
+
+-- | Get a point in render coordinates when given a point in window coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation', 'sDL_SetRenderScale'
+--
+--     [C declaration]: @SDL_RenderCoordinatesFromWindow@, defined at @SDL3\/SDL_render.h 1652:34@
+sDL_RenderCoordinatesFromWindow
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@window_x@]: the x coordinate in window coordinates.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@window_y@]: the y coordinate in window coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer filled with the x coordinate in render coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer filled with the y coordinate in render coordinates.
+  -> IO BG.CBool
+sDL_RenderCoordinatesFromWindow =
+  hs_bindgen_88c23a7a2bb3f897
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderCoordinatesToWindow@
+foreign import ccall unsafe "hs_bindgen_30a19a6793a8a60a"
+  hs_bindgen_30a19a6793a8a60a_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderCoordinatesToWindow@
+hs_bindgen_30a19a6793a8a60a
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_30a19a6793a8a60a =
+  BG.fromFFIType hs_bindgen_30a19a6793a8a60a_base
+
+-- | Get a point in window coordinates when given a point in render coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderLogicalPresentation', 'sDL_SetRenderScale', 'sDL_SetRenderViewport'
+--
+--     [C declaration]: @SDL_RenderCoordinatesToWindow@, defined at @SDL3\/SDL_render.h 1682:34@
+sDL_RenderCoordinatesToWindow
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate in render coordinates.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate in render coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@window_x@]: a pointer filled with the x coordinate in window coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@window_y@]: a pointer filled with the y coordinate in window coordinates.
+  -> IO BG.CBool
+sDL_RenderCoordinatesToWindow =
+  hs_bindgen_30a19a6793a8a60a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_ConvertEventToRenderCoordinates@
+foreign import ccall unsafe "hs_bindgen_99e1877354dd4cdb"
+  hs_bindgen_99e1877354dd4cdb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_ConvertEventToRenderCoordinates@
+hs_bindgen_99e1877354dd4cdb
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event
+  -> IO BG.CBool
+hs_bindgen_99e1877354dd4cdb =
+  BG.fromFFIType hs_bindgen_99e1877354dd4cdb_base
+
+-- | Convert the coordinates in an event to render coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     Various event types are converted with this function: mouse, touch, pen, etc.
+--
+--     Touch coordinates are converted from normalized coordinates in the window to non-normalized rendering coordinates.
+--
+--     Relative mouse coordinates (xrel and yrel event fields) are /also/ converted. Applications that do not want these fields converted should use @SDL_RenderCoordinatesFromWindow()@ on the specific event fields instead of converting the entire event structure.
+--
+--     Once converted, coordinates may be outside the rendering area.
+--
+--     [Returns]: true if the event is converted or doesn\'t need conversion, or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderCoordinatesFromWindow'
+--
+--     [C declaration]: @SDL_ConvertEventToRenderCoordinates@, defined at @SDL3\/SDL_render.h 1718:34@
+sDL_ConvertEventToRenderCoordinates
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event
+  -- ^
+  --
+  --           [@event@]: the event to modify.
+  -> IO BG.CBool
+sDL_ConvertEventToRenderCoordinates =
+  hs_bindgen_99e1877354dd4cdb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderViewport@
+foreign import ccall unsafe "hs_bindgen_da47a291603fd568"
+  hs_bindgen_da47a291603fd568_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderViewport@
+hs_bindgen_da47a291603fd568
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_da47a291603fd568 =
+  BG.fromFFIType hs_bindgen_da47a291603fd568_base
+
+-- | Set the drawing area for rendering on the current target.
+--
+--     Drawing will clip to this area (separately from any clipping done with SDL_SetRenderClipRect), and the top left of the area will become coordinate (0, 0) for future drawing commands.
+--
+--     The area\'s width and height must be >= 0.
+--
+--     Each render target has its own viewport. This function sets the viewport for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderViewport', 'sDL_RenderViewportSet'
+--
+--     [C declaration]: @SDL_SetRenderViewport@, defined at @SDL3\/SDL_render.h 1745:34@
+sDL_SetRenderViewport
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the drawing area, or NULL to set the viewport to the entire target.
+  -> IO BG.CBool
+sDL_SetRenderViewport = hs_bindgen_da47a291603fd568
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderViewport@
+foreign import ccall unsafe "hs_bindgen_d36147bdfea02ae0"
+  hs_bindgen_d36147bdfea02ae0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderViewport@
+hs_bindgen_d36147bdfea02ae0
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_d36147bdfea02ae0 =
+  BG.fromFFIType hs_bindgen_d36147bdfea02ae0_base
+
+-- | Get the drawing area for the current target.
+--
+--     Each render target has its own viewport. This function gets the viewport for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderViewportSet', 'sDL_SetRenderViewport'
+--
+--     [C declaration]: @SDL_GetRenderViewport@, defined at @SDL3\/SDL_render.h 1765:34@
+sDL_GetRenderViewport
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the current drawing area.
+  -> IO BG.CBool
+sDL_GetRenderViewport = hs_bindgen_d36147bdfea02ae0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderViewportSet@
+foreign import ccall unsafe "hs_bindgen_b75de8ea63ffb717"
+  hs_bindgen_b75de8ea63ffb717_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderViewportSet@
+hs_bindgen_b75de8ea63ffb717
+  :: BG.Ptr SDL_Renderer
+  -> IO BG.CBool
+hs_bindgen_b75de8ea63ffb717 =
+  BG.fromFFIType hs_bindgen_b75de8ea63ffb717_base
+
+-- | Return whether an explicit rectangle was set as the viewport.
+--
+--     This is useful if you\'re saving and restoring the viewport and want to know whether you should restore a specific rectangle or NULL.
+--
+--     Each render target has its own viewport. This function checks the viewport for the current render target.
+--
+--     [Returns]: true if the viewport was set to a specific rectangle, or false if it was set to NULL (the entire target).
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderViewport', 'sDL_SetRenderViewport'
+--
+--     [C declaration]: @SDL_RenderViewportSet@, defined at @SDL3\/SDL_render.h 1787:34@
+sDL_RenderViewportSet
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO BG.CBool
+sDL_RenderViewportSet = hs_bindgen_b75de8ea63ffb717
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderSafeArea@
+foreign import ccall unsafe "hs_bindgen_143575ef07d5400f"
+  hs_bindgen_143575ef07d5400f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderSafeArea@
+hs_bindgen_143575ef07d5400f
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_143575ef07d5400f =
+  BG.fromFFIType hs_bindgen_143575ef07d5400f_base
+
+-- | Get the safe area for rendering within the current viewport.
+--
+--     Some devices have portions of the screen which are partially obscured or not interactive, possibly due to on-screen controls, curved edges, camera notches, TV overscan, etc. This function provides the area of the current viewport which is safe to have interactible content. You should continue rendering into the rest of the render target, but it should not contain visually important or interactible content.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetRenderSafeArea@, defined at @SDL3\/SDL_render.h 1809:34@
+sDL_GetRenderSafeArea
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the area that is safe for interactive content.
+  -> IO BG.CBool
+sDL_GetRenderSafeArea = hs_bindgen_143575ef07d5400f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderClipRect@
+foreign import ccall unsafe "hs_bindgen_db4ee8d700a535c8"
+  hs_bindgen_db4ee8d700a535c8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderClipRect@
+hs_bindgen_db4ee8d700a535c8
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_db4ee8d700a535c8 =
+  BG.fromFFIType hs_bindgen_db4ee8d700a535c8_base
+
+-- | Set the clip rectangle for rendering on the specified target.
+--
+--     Each render target has its own clip rectangle. This function sets the cliprect for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderClipRect', 'sDL_RenderClipEnabled'
+--
+--     [C declaration]: @SDL_SetRenderClipRect@, defined at @SDL3\/SDL_render.h 1830:34@
+sDL_SetRenderClipRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the clip area, relative to the viewport, or NULL to disable clipping.
+  -> IO BG.CBool
+sDL_SetRenderClipRect = hs_bindgen_db4ee8d700a535c8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderClipRect@
+foreign import ccall unsafe "hs_bindgen_7bd39620f800ed67"
+  hs_bindgen_7bd39620f800ed67_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderClipRect@
+hs_bindgen_7bd39620f800ed67
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_7bd39620f800ed67 =
+  BG.fromFFIType hs_bindgen_7bd39620f800ed67_base
+
+-- | Get the clip rectangle for the current target.
+--
+--     Each render target has its own clip rectangle. This function gets the cliprect for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderClipEnabled', 'sDL_SetRenderClipRect'
+--
+--     [C declaration]: @SDL_GetRenderClipRect@, defined at @SDL3\/SDL_render.h 1851:34@
+sDL_GetRenderClipRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the current clipping area or an empty rectangle if clipping is disabled.
+  -> IO BG.CBool
+sDL_GetRenderClipRect = hs_bindgen_7bd39620f800ed67
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderClipEnabled@
+foreign import ccall unsafe "hs_bindgen_011ece38ae24698a"
+  hs_bindgen_011ece38ae24698a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderClipEnabled@
+hs_bindgen_011ece38ae24698a
+  :: BG.Ptr SDL_Renderer
+  -> IO BG.CBool
+hs_bindgen_011ece38ae24698a =
+  BG.fromFFIType hs_bindgen_011ece38ae24698a_base
+
+-- | Get whether clipping is enabled on the given render target.
+--
+--     Each render target has its own clip rectangle. This function checks the cliprect for the current render target.
+--
+--     [Returns]: true if clipping is enabled or false if not; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderClipRect', 'sDL_SetRenderClipRect'
+--
+--     [C declaration]: @SDL_RenderClipEnabled@, defined at @SDL3\/SDL_render.h 1870:34@
+sDL_RenderClipEnabled
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO BG.CBool
+sDL_RenderClipEnabled = hs_bindgen_011ece38ae24698a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderScale@
+foreign import ccall unsafe "hs_bindgen_a2ecfc86b7164248"
+  hs_bindgen_a2ecfc86b7164248_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderScale@
+hs_bindgen_a2ecfc86b7164248
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_a2ecfc86b7164248 =
+  BG.fromFFIType hs_bindgen_a2ecfc86b7164248_base
+
+-- | Set the drawing scale for rendering on the current target.
+--
+--     The drawing coordinates are scaled by the x\/y scaling factors before they are used by the renderer. This allows resolution independent drawing with a single coordinate system.
+--
+--     If this results in scaling or subpixel drawing by the rendering backend, it will be handled using the appropriate quality hints. For best results use integer scaling factors.
+--
+--     Each render target has its own scale. This function sets the scale for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderScale'
+--
+--     [C declaration]: @SDL_SetRenderScale@, defined at @SDL3\/SDL_render.h 1898:34@
+sDL_SetRenderScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scaleX@]: the horizontal scaling factor.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scaleY@]: the vertical scaling factor.
+  -> IO BG.CBool
+sDL_SetRenderScale = hs_bindgen_a2ecfc86b7164248
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderScale@
+foreign import ccall unsafe "hs_bindgen_9b27eba43ce3989c"
+  hs_bindgen_9b27eba43ce3989c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderScale@
+hs_bindgen_9b27eba43ce3989c
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_9b27eba43ce3989c =
+  BG.fromFFIType hs_bindgen_9b27eba43ce3989c_base
+
+-- | Get the drawing scale for the current target.
+--
+--     Each render target has its own scale. This function gets the scale for the current render target.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderScale'
+--
+--     [C declaration]: @SDL_GetRenderScale@, defined at @SDL3\/SDL_render.h 1918:34@
+sDL_GetRenderScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scaleX@]: a pointer filled in with the horizontal scaling factor.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scaleY@]: a pointer filled in with the vertical scaling factor.
+  -> IO BG.CBool
+sDL_GetRenderScale = hs_bindgen_9b27eba43ce3989c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderDrawColor@
+foreign import ccall unsafe "hs_bindgen_122da056b531e869"
+  hs_bindgen_122da056b531e869_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderDrawColor@
+hs_bindgen_122da056b531e869
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_122da056b531e869 =
+  BG.fromFFIType hs_bindgen_122da056b531e869_base
+
+-- | Set the color used for drawing operations.
+--
+--     Set the color for drawing or filling rectangles, lines, and points, and for @SDL_RenderClear()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawColor', 'sDL_SetRenderDrawColorFloat'
+--
+--     [C declaration]: @SDL_SetRenderDrawColor@, defined at @SDL3\/SDL_render.h 1943:34@
+sDL_SetRenderDrawColor
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red value used to draw on the rendering target.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green value used to draw on the rendering target.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue value used to draw on the rendering target.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: the alpha value used to draw on the rendering target; usually @SDL_ALPHA_OPAQUE@ (255). Use SDL_SetRenderDrawBlendMode to specify how the alpha channel is used.
+  -> IO BG.CBool
+sDL_SetRenderDrawColor = hs_bindgen_122da056b531e869
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderDrawColorFloat@
+foreign import ccall unsafe "hs_bindgen_069391a3e71d464d"
+  hs_bindgen_069391a3e71d464d_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderDrawColorFloat@
+hs_bindgen_069391a3e71d464d
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_069391a3e71d464d =
+  BG.fromFFIType hs_bindgen_069391a3e71d464d_base
+
+-- | Set the color used for drawing operations (Rect, Line and Clear).
+--
+--     Set the color for drawing or filling rectangles, lines, and points, and for @SDL_RenderClear()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawColorFloat', 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_SetRenderDrawColorFloat@, defined at @SDL3\/SDL_render.h 1968:34@
+sDL_SetRenderDrawColorFloat
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@r@]: the red value used to draw on the rendering target.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@g@]: the green value used to draw on the rendering target.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@b@]: the blue value used to draw on the rendering target.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@a@]: the alpha value used to draw on the rendering target. Use SDL_SetRenderDrawBlendMode to specify how the alpha channel is used.
+  -> IO BG.CBool
+sDL_SetRenderDrawColorFloat =
+  hs_bindgen_069391a3e71d464d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderDrawColor@
+foreign import ccall unsafe "hs_bindgen_7f0f910be4b2889e"
+  hs_bindgen_7f0f910be4b2889e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderDrawColor@
+hs_bindgen_7f0f910be4b2889e
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_7f0f910be4b2889e =
+  BG.fromFFIType hs_bindgen_7f0f910be4b2889e_base
+
+-- | Get the color used for drawing operations (Rect, Line and Clear).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawColorFloat', 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_GetRenderDrawColor@, defined at @SDL3\/SDL_render.h 1992:34@
+sDL_GetRenderDrawColor
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha value used to draw on the rendering target; usually @SDL_ALPHA_OPAQUE@ (255).
+  -> IO BG.CBool
+sDL_GetRenderDrawColor = hs_bindgen_7f0f910be4b2889e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderDrawColorFloat@
+foreign import ccall unsafe "hs_bindgen_7679f2d13375bcd2"
+  hs_bindgen_7679f2d13375bcd2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderDrawColorFloat@
+hs_bindgen_7679f2d13375bcd2
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_7679f2d13375bcd2 =
+  BG.fromFFIType hs_bindgen_7679f2d13375bcd2_base
+
+-- | Get the color used for drawing operations (Rect, Line and Clear).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderDrawColorFloat', 'sDL_GetRenderDrawColor'
+--
+--     [C declaration]: @SDL_GetRenderDrawColorFloat@, defined at @SDL3\/SDL_render.h 2016:34@
+sDL_GetRenderDrawColorFloat
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha value used to draw on the rendering target.
+  -> IO BG.CBool
+sDL_GetRenderDrawColorFloat =
+  hs_bindgen_7679f2d13375bcd2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderColorScale@
+foreign import ccall unsafe "hs_bindgen_2d134fc6b089039f"
+  hs_bindgen_2d134fc6b089039f_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderColorScale@
+hs_bindgen_2d134fc6b089039f
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_2d134fc6b089039f =
+  BG.fromFFIType hs_bindgen_2d134fc6b089039f_base
+
+-- | Set the color scale used for render operations.
+--
+--     The color scale is an additional scale multiplied into the pixel color value while rendering. This can be used to adjust the brightness of colors during HDR rendering, or changing HDR video brightness when playing on an SDR display.
+--
+--     The color scale does not affect the alpha channel, only the color brightness.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderColorScale'
+--
+--     [C declaration]: @SDL_SetRenderColorScale@, defined at @SDL3\/SDL_render.h 2040:34@
+sDL_SetRenderColorScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the color scale value.
+  -> IO BG.CBool
+sDL_SetRenderColorScale = hs_bindgen_2d134fc6b089039f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderColorScale@
+foreign import ccall unsafe "hs_bindgen_f9539095c565384c"
+  hs_bindgen_f9539095c565384c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderColorScale@
+hs_bindgen_f9539095c565384c
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_f9539095c565384c =
+  BG.fromFFIType hs_bindgen_f9539095c565384c_base
+
+-- | Get the color scale used for render operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderColorScale'
+--
+--     [C declaration]: @SDL_GetRenderColorScale@, defined at @SDL3\/SDL_render.h 2056:34@
+sDL_GetRenderColorScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: a pointer filled in with the current color scale value.
+  -> IO BG.CBool
+sDL_GetRenderColorScale = hs_bindgen_f9539095c565384c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderDrawBlendMode@
+foreign import ccall unsafe "hs_bindgen_1885ca90cb47d78c"
+  hs_bindgen_1885ca90cb47d78c_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderDrawBlendMode@
+hs_bindgen_1885ca90cb47d78c
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_1885ca90cb47d78c =
+  BG.fromFFIType hs_bindgen_1885ca90cb47d78c_base
+
+-- | Set the blend mode used for drawing operations (Fill and Line).
+--
+--     If the blend mode is not supported, the closest supported mode is chosen.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderDrawBlendMode'
+--
+--     [C declaration]: @SDL_SetRenderDrawBlendMode@, defined at @SDL3\/SDL_render.h 2074:34@
+sDL_SetRenderDrawBlendMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for blending.
+  -> IO BG.CBool
+sDL_SetRenderDrawBlendMode =
+  hs_bindgen_1885ca90cb47d78c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderDrawBlendMode@
+foreign import ccall unsafe "hs_bindgen_80ecda0d3d8d870b"
+  hs_bindgen_80ecda0d3d8d870b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderDrawBlendMode@
+hs_bindgen_80ecda0d3d8d870b
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_80ecda0d3d8d870b =
+  BG.fromFFIType hs_bindgen_80ecda0d3d8d870b_base
+
+-- | Get the blend mode used for drawing operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderDrawBlendMode'
+--
+--     [C declaration]: @SDL_GetRenderDrawBlendMode@, defined at @SDL3\/SDL_render.h 2090:34@
+sDL_GetRenderDrawBlendMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO BG.CBool
+sDL_GetRenderDrawBlendMode =
+  hs_bindgen_80ecda0d3d8d870b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderClear@
+foreign import ccall unsafe "hs_bindgen_82119a8dbd03b3ca"
+  hs_bindgen_82119a8dbd03b3ca_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderClear@
+hs_bindgen_82119a8dbd03b3ca
+  :: BG.Ptr SDL_Renderer
+  -> IO BG.CBool
+hs_bindgen_82119a8dbd03b3ca =
+  BG.fromFFIType hs_bindgen_82119a8dbd03b3ca_base
+
+-- | Clear the current rendering target with the drawing color.
+--
+--     This function clears the entire rendering target, ignoring the viewport and the clip rectangle. Note, that clearing will also set\/fill all pixels of the rendering target to current renderer draw color, so make sure to invoke @SDL_SetRenderDrawColor()@ when needed.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_RenderClear@, defined at @SDL3\/SDL_render.h 2110:34@
+sDL_RenderClear
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO BG.CBool
+sDL_RenderClear = hs_bindgen_82119a8dbd03b3ca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderPoint@
+foreign import ccall unsafe "hs_bindgen_c73e2796ab7f90c1"
+  hs_bindgen_c73e2796ab7f90c1_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderPoint@
+hs_bindgen_c73e2796ab7f90c1
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_c73e2796ab7f90c1 =
+  BG.fromFFIType hs_bindgen_c73e2796ab7f90c1_base
+
+-- | Draw a point on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderPoints'
+--
+--     [C declaration]: @SDL_RenderPoint@, defined at @SDL3\/SDL_render.h 2127:34@
+sDL_RenderPoint
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a point.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the point.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the point.
+  -> IO BG.CBool
+sDL_RenderPoint = hs_bindgen_c73e2796ab7f90c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderPoints@
+foreign import ccall unsafe "hs_bindgen_cb752ddd9f3b53be"
+  hs_bindgen_cb752ddd9f3b53be_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderPoints@
+hs_bindgen_cb752ddd9f3b53be
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_cb752ddd9f3b53be =
+  BG.fromFFIType hs_bindgen_cb752ddd9f3b53be_base
+
+-- | Draw multiple points on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderPoint'
+--
+--     [C declaration]: @SDL_RenderPoints@, defined at @SDL3\/SDL_render.h 2144:34@
+sDL_RenderPoints
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple points.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: the points to draw.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of points to draw.
+  -> IO BG.CBool
+sDL_RenderPoints = hs_bindgen_cb752ddd9f3b53be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderLine@
+foreign import ccall unsafe "hs_bindgen_8fc8b7b71da27e92"
+  hs_bindgen_8fc8b7b71da27e92_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderLine@
+hs_bindgen_8fc8b7b71da27e92
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_8fc8b7b71da27e92 =
+  BG.fromFFIType hs_bindgen_8fc8b7b71da27e92_base
+
+-- | Draw a line on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderLines'
+--
+--     [C declaration]: @SDL_RenderLine@, defined at @SDL3\/SDL_render.h 2163:34@
+sDL_RenderLine
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a line.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x1@]: the x coordinate of the start point.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y1@]: the y coordinate of the start point.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x2@]: the x coordinate of the end point.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y2@]: the y coordinate of the end point.
+  -> IO BG.CBool
+sDL_RenderLine = hs_bindgen_8fc8b7b71da27e92
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderLines@
+foreign import ccall unsafe "hs_bindgen_d68b0895520fbd3a"
+  hs_bindgen_d68b0895520fbd3a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderLines@
+hs_bindgen_d68b0895520fbd3a
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_d68b0895520fbd3a =
+  BG.fromFFIType hs_bindgen_d68b0895520fbd3a_base
+
+-- | Draw a series of connected lines on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderLine'
+--
+--     [C declaration]: @SDL_RenderLines@, defined at @SDL3\/SDL_render.h 2181:34@
+sDL_RenderLines
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple lines.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: the points along the lines.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of points, drawing count-1 lines.
+  -> IO BG.CBool
+sDL_RenderLines = hs_bindgen_d68b0895520fbd3a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderRect@
+foreign import ccall unsafe "hs_bindgen_74702b94b10a8a97"
+  hs_bindgen_74702b94b10a8a97_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderRect@
+hs_bindgen_74702b94b10a8a97
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_74702b94b10a8a97 =
+  BG.fromFFIType hs_bindgen_74702b94b10a8a97_base
+
+-- | Draw a rectangle on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderRects'
+--
+--     [C declaration]: @SDL_RenderRect@, defined at @SDL3\/SDL_render.h 2198:34@
+sDL_RenderRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a rectangle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the destination rectangle, or NULL to outline the entire rendering target.
+  -> IO BG.CBool
+sDL_RenderRect = hs_bindgen_74702b94b10a8a97
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderRects@
+foreign import ccall unsafe "hs_bindgen_2ee379e179df5f3c"
+  hs_bindgen_2ee379e179df5f3c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderRects@
+hs_bindgen_2ee379e179df5f3c
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_2ee379e179df5f3c =
+  BG.fromFFIType hs_bindgen_2ee379e179df5f3c_base
+
+-- | Draw some number of rectangles on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderRect'
+--
+--     [C declaration]: @SDL_RenderRects@, defined at @SDL3\/SDL_render.h 2216:34@
+sDL_RenderRects
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple rectangles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rects@]: a pointer to an array of destination rectangles.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of rectangles.
+  -> IO BG.CBool
+sDL_RenderRects = hs_bindgen_2ee379e179df5f3c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderFillRect@
+foreign import ccall unsafe "hs_bindgen_c5b24d3e3930aa12"
+  hs_bindgen_c5b24d3e3930aa12_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderFillRect@
+hs_bindgen_c5b24d3e3930aa12
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_c5b24d3e3930aa12 =
+  BG.fromFFIType hs_bindgen_c5b24d3e3930aa12_base
+
+-- | Fill a rectangle on the current rendering target with the drawing color at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderFillRects'
+--
+--     [C declaration]: @SDL_RenderFillRect@, defined at @SDL3\/SDL_render.h 2234:34@
+sDL_RenderFillRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should fill a rectangle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO BG.CBool
+sDL_RenderFillRect = hs_bindgen_c5b24d3e3930aa12
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderFillRects@
+foreign import ccall unsafe "hs_bindgen_afbd05ab4eae453e"
+  hs_bindgen_afbd05ab4eae453e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderFillRects@
+hs_bindgen_afbd05ab4eae453e
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_afbd05ab4eae453e =
+  BG.fromFFIType hs_bindgen_afbd05ab4eae453e_base
+
+-- | Fill some number of rectangles on the current rendering target with the drawing color at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderFillRect'
+--
+--     [C declaration]: @SDL_RenderFillRects@, defined at @SDL3\/SDL_render.h 2252:34@
+sDL_RenderFillRects
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should fill multiple rectangles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rects@]: a pointer to an array of destination rectangles.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of rectangles.
+  -> IO BG.CBool
+sDL_RenderFillRects = hs_bindgen_afbd05ab4eae453e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTexture@
+foreign import ccall unsafe "hs_bindgen_9502ac14df729213"
+  hs_bindgen_9502ac14df729213_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTexture@
+hs_bindgen_9502ac14df729213
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_9502ac14df729213 =
+  BG.fromFFIType hs_bindgen_9502ac14df729213_base
+
+-- | Copy a portion of the texture to the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTextureRotated', 'sDL_RenderTextureTiled'
+--
+--     [C declaration]: @SDL_RenderTexture@, defined at @SDL3\/SDL_render.h 2274:34@
+sDL_RenderTexture
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO BG.CBool
+sDL_RenderTexture = hs_bindgen_9502ac14df729213
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTextureRotated@
+foreign import ccall unsafe "hs_bindgen_bdd81c1a4d95fd9a"
+  hs_bindgen_bdd81c1a4d95fd9a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Double
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTextureRotated@
+hs_bindgen_bdd81c1a4d95fd9a
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CDouble
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> SDL3.Sys.Bindgen.Surface.SDL_FlipMode
+  -> IO BG.CBool
+hs_bindgen_bdd81c1a4d95fd9a =
+  BG.fromFFIType hs_bindgen_bdd81c1a4d95fd9a_base
+
+-- | Copy a portion of the source texture to the current rendering target, with rotation and flipping, at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture'
+--
+--     [C declaration]: @SDL_RenderTextureRotated@, defined at @SDL3\/SDL_render.h 2302:34@
+sDL_RenderTextureRotated
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> BG.CDouble
+  -- ^
+  --
+  --           [@angle@]: an angle in degrees that indicates the rotation that will be applied to dstrect, rotating it in a clockwise direction.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@center@]: a pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done around dstrect.w\/2, dstrect.h\/2).
+  -> SDL3.Sys.Bindgen.Surface.SDL_FlipMode
+  -- ^
+  --
+  --           [@flip@]: an SDL_FlipMode value stating which flipping actions should be performed on the texture.
+  -> IO BG.CBool
+sDL_RenderTextureRotated =
+  hs_bindgen_bdd81c1a4d95fd9a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTextureAffine@
+foreign import ccall unsafe "hs_bindgen_18c2f3b6d0215153"
+  hs_bindgen_18c2f3b6d0215153_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTextureAffine@
+hs_bindgen_18c2f3b6d0215153
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -> IO BG.CBool
+hs_bindgen_18c2f3b6d0215153 =
+  BG.fromFFIType hs_bindgen_18c2f3b6d0215153_base
+
+-- | Copy a portion of the source texture to the current rendering target, with affine transform, at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: You may only call this function from the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture'
+--
+--     [C declaration]: @SDL_RenderTextureAffine@, defined at @SDL3\/SDL_render.h 2333:34@
+sDL_RenderTextureAffine
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@origin@]: a pointer to a point indicating where the top-left corner of srcrect should be mapped to, or NULL for the rendering target\'s origin.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@right@]: a pointer to a point indicating where the top-right corner of srcrect should be mapped to, or NULL for the rendering target\'s top-right corner.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@down@]: a pointer to a point indicating where the bottom-left corner of srcrect should be mapped to, or NULL for the rendering target\'s bottom-left corner.
+  -> IO BG.CBool
+sDL_RenderTextureAffine = hs_bindgen_18c2f3b6d0215153
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTextureTiled@
+foreign import ccall unsafe "hs_bindgen_f46f867b1d2a5b99"
+  hs_bindgen_f46f867b1d2a5b99_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Float
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTextureTiled@
+hs_bindgen_f46f867b1d2a5b99
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CFloat
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_f46f867b1d2a5b99 =
+  BG.fromFFIType hs_bindgen_f46f867b1d2a5b99_base
+
+-- | Tile a portion of the texture to the current rendering target at subpixel precision.
+--
+--     The pixels in @srcrect@ will be repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture'
+--
+--     [C declaration]: @SDL_RenderTextureTiled@, defined at @SDL3\/SDL_render.h 2362:34@
+sDL_RenderTextureTiled
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform srcrect into the destination rectangle, e.g. a 32x32 texture with a scale of 2 would fill 64x64 tiles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO BG.CBool
+sDL_RenderTextureTiled = hs_bindgen_f46f867b1d2a5b99
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTexture9Grid@
+foreign import ccall unsafe "hs_bindgen_7460ccca85327f67"
+  hs_bindgen_7460ccca85327f67_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTexture9Grid@
+hs_bindgen_7460ccca85327f67
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> IO BG.CBool
+hs_bindgen_7460ccca85327f67 =
+  BG.fromFFIType hs_bindgen_7460ccca85327f67_base
+
+-- | Perform a scaled copy using the 9-grid algorithm to the current rendering target at subpixel precision.
+--
+--     The pixels in the texture are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then stretched into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderTexture', 'sDL_RenderTexture9GridTiled'
+--
+--     [C declaration]: @SDL_RenderTexture9Grid@, defined at @SDL3\/SDL_render.h 2397:34@
+sDL_RenderTexture9Grid
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire texture.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled copy.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO BG.CBool
+sDL_RenderTexture9Grid = hs_bindgen_7460ccca85327f67
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTexture9GridTiled@
+foreign import ccall unsafe "hs_bindgen_82ec92cefa73aeb4"
+  hs_bindgen_82ec92cefa73aeb4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderTexture9GridTiled@
+hs_bindgen_82ec92cefa73aeb4
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_82ec92cefa73aeb4 =
+  BG.fromFFIType hs_bindgen_82ec92cefa73aeb4_base
+
+-- | Perform a scaled copy using the 9-grid algorithm to the current rendering target at subpixel precision.
+--
+--     The pixels in the texture are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then tiled into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_RenderTexture', 'sDL_RenderTexture9Grid'
+--
+--     [C declaration]: @SDL_RenderTexture9GridTiled@, defined at @SDL3\/SDL_render.h 2435:34@
+sDL_RenderTexture9GridTiled
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire texture.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled copy.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@tileScale@]: the scale used to transform the borders and center of @srcrect@ into the borders and middle of @dstrect@, or 1.0f for an unscaled copy.
+  -> IO BG.CBool
+sDL_RenderTexture9GridTiled =
+  hs_bindgen_82ec92cefa73aeb4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderGeometry@
+foreign import ccall unsafe "hs_bindgen_604c256c92b502f9"
+  hs_bindgen_604c256c92b502f9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderGeometry@
+hs_bindgen_604c256c92b502f9
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst SDL_Vertex
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_604c256c92b502f9 =
+  BG.fromFFIType hs_bindgen_604c256c92b502f9_base
+
+-- | Render a list of triangles, optionally using a texture and indices into the vertex array Color and alpha modulation is done per vertex (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderGeometryRaw', 'sDL_SetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_RenderGeometry@, defined at @SDL3\/SDL_render.h 2460:34@
+sDL_RenderGeometry
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: (optional) The SDL texture to use.
+  -> PtrConst.PtrConst SDL_Vertex
+  -- ^
+  --
+  --           [@vertices@]: vertices.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_vertices@]: number of vertices.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@indices@]: (optional) An array of integer indices into the \'vertices\' array, if NULL all vertices will be rendered in sequential order.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_indices@]: number of indices.
+  -> IO BG.CBool
+sDL_RenderGeometry = hs_bindgen_604c256c92b502f9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderGeometryRaw@
+foreign import ccall unsafe "hs_bindgen_ae17af9f44d6d343"
+  hs_bindgen_ae17af9f44d6d343_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderGeometryRaw@
+hs_bindgen_ae17af9f44d6d343
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_Texture
+  -> PtrConst.PtrConst BG.CFloat
+  -> BG.CInt
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.CFloat
+  -> BG.CInt
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_ae17af9f44d6d343 =
+  BG.fromFFIType hs_bindgen_ae17af9f44d6d343_base
+
+-- | Render a list of triangles, optionally using a texture and indices into the vertex arrays Color and alpha modulation is done per vertex (SDL_SetTextureColorMod and SDL_SetTextureAlphaMod are ignored).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RenderGeometry', 'sDL_SetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_RenderGeometryRaw@, defined at @SDL3\/SDL_render.h 2493:34@
+sDL_RenderGeometryRaw
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: (optional) The SDL texture to use.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@xy@]: vertex positions.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@xy_stride@]: byte size to move from one element to the next element.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^
+  --
+  --           [@color@]: vertex colors (as SDL_FColor).
+  -> BG.CInt
+  -- ^
+  --
+  --           [@color_stride@]: byte size to move from one element to the next element.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@uv@]: vertex normalized texture coordinates.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@uv_stride@]: byte size to move from one element to the next element.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_vertices@]: number of vertices.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@indices@]: (optional) An array of indices into the \'vertices\' arrays, if NULL all vertices will be rendered in sequential order.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_indices@]: number of indices.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@size_indices@]: index size: 1 (byte), 2 (short), 4 (int).
+  -> IO BG.CBool
+sDL_RenderGeometryRaw = hs_bindgen_ae17af9f44d6d343
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderTextureAddressMode@
+foreign import ccall unsafe "hs_bindgen_f5de60362bf89a18"
+  hs_bindgen_f5de60362bf89a18_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderTextureAddressMode@
+hs_bindgen_f5de60362bf89a18
+  :: BG.Ptr SDL_Renderer
+  -> SDL_TextureAddressMode
+  -> SDL_TextureAddressMode
+  -> IO BG.CBool
+hs_bindgen_f5de60362bf89a18 =
+  BG.fromFFIType hs_bindgen_f5de60362bf89a18_base
+
+-- | Set the texture addressing mode used in @SDL_RenderGeometry()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_RenderGeometry', 'sDL_RenderGeometryRaw', 'sDL_GetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_SetRenderTextureAddressMode@, defined at @SDL3\/SDL_render.h 2520:34@
+sDL_SetRenderTextureAddressMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@u_mode@]: the 'SDL_TextureAddressMode' to use for horizontal texture coordinates in @SDL_RenderGeometry()@.
+  -> SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@v_mode@]: the 'SDL_TextureAddressMode' to use for vertical texture coordinates in @SDL_RenderGeometry()@.
+  -> IO BG.CBool
+sDL_SetRenderTextureAddressMode =
+  hs_bindgen_f5de60362bf89a18
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderTextureAddressMode@
+foreign import ccall unsafe "hs_bindgen_727bb39b49c44f15"
+  hs_bindgen_727bb39b49c44f15_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderTextureAddressMode@
+hs_bindgen_727bb39b49c44f15
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_TextureAddressMode
+  -> BG.Ptr SDL_TextureAddressMode
+  -> IO BG.CBool
+hs_bindgen_727bb39b49c44f15 =
+  BG.fromFFIType hs_bindgen_727bb39b49c44f15_base
+
+-- | Get the texture addressing mode used in @SDL_RenderGeometry()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetRenderTextureAddressMode'
+--
+--     [C declaration]: @SDL_GetRenderTextureAddressMode@, defined at @SDL3\/SDL_render.h 2541:34@
+sDL_GetRenderTextureAddressMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@u_mode@]: a pointer filled in with the 'SDL_TextureAddressMode' to use for horizontal texture coordinates in @SDL_RenderGeometry()@, may be NULL.
+  -> BG.Ptr SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@v_mode@]: a pointer filled in with the 'SDL_TextureAddressMode' to use for vertical texture coordinates in @SDL_RenderGeometry()@, may be NULL.
+  -> IO BG.CBool
+sDL_GetRenderTextureAddressMode =
+  hs_bindgen_727bb39b49c44f15
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderReadPixels@
+foreign import ccall unsafe "hs_bindgen_7173be00862c48e8"
+  hs_bindgen_7173be00862c48e8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderReadPixels@
+hs_bindgen_7173be00862c48e8
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+hs_bindgen_7173be00862c48e8 =
+  BG.fromFFIType hs_bindgen_7173be00862c48e8_base
+
+-- | Read pixels from the current rendering target.
+--
+--     The returned surface contains pixels inside the desired area clipped to the current viewport, and should be freed with SDL_DestroySurface().
+--
+--     Note that this returns the actual pixels on the screen, so if you are using logical presentation you should use @SDL_GetRenderLogicalPresentationRect()@ to get the area containing your content.
+--
+--     __WARNING__: This is a very slow operation, and should not be used frequently. If you\'re using this on the main rendering target, it should be called after rendering and before @SDL_RenderPresent()@.
+--
+--     [Returns]: a new SDL_Surface on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RenderReadPixels@, defined at @SDL3\/SDL_render.h 2568:43@
+sDL_RenderReadPixels
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to read, which will be clipped to the current viewport, or NULL for the entire viewport.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+sDL_RenderReadPixels = hs_bindgen_7173be00862c48e8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderPresent@
+foreign import ccall unsafe "hs_bindgen_e66060f4d8ba3f83"
+  hs_bindgen_e66060f4d8ba3f83_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderPresent@
+hs_bindgen_e66060f4d8ba3f83
+  :: BG.Ptr SDL_Renderer
+  -> IO BG.CBool
+hs_bindgen_e66060f4d8ba3f83 =
+  BG.fromFFIType hs_bindgen_e66060f4d8ba3f83_base
+
+-- | Update the screen with any rendering performed since the previous call.
+--
+--     SDL\'s rendering functions operate on a backbuffer; that is, calling a rendering function such as @SDL_RenderLine()@ does not directly put a line on the screen, but rather updates the backbuffer. As such, you compose your entire scene and /present/ the composed backbuffer to the screen as a complete picture.
+--
+--     Therefore, when using SDL\'s rendering API, one does all drawing intended for the frame, and then calls this function once per frame to present the final drawing to the user.
+--
+--     The backbuffer should be considered invalidated after each present; do not assume that previous contents will exist between frames. You are strongly encouraged to call @SDL_RenderClear()@ to initialize the backbuffer before starting each new frame\'s drawing, even if you plan to overwrite every pixel.
+--
+--     Please note, that in case of rendering to a texture - there is __no need__ to call @'sDL_RenderPresent'@ after drawing needed objects to a texture, and should not be done; you are only required to change back the rendering target to default via @SDL_SetRenderTarget(renderer, NULL)@ afterwards, as textures by themselves do not have a concept of backbuffers. Calling SDL_RenderPresent while rendering to a texture will fail.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer', 'sDL_RenderClear', 'sDL_RenderFillRect', 'sDL_RenderFillRects', 'sDL_RenderLine', 'sDL_RenderLines', 'sDL_RenderPoint', 'sDL_RenderPoints', 'sDL_RenderRect', 'sDL_RenderRects', 'sDL_SetRenderDrawBlendMode', 'sDL_SetRenderDrawColor'
+--
+--     [C declaration]: @SDL_RenderPresent@, defined at @SDL3\/SDL_render.h 2617:34@
+sDL_RenderPresent
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO BG.CBool
+sDL_RenderPresent = hs_bindgen_e66060f4d8ba3f83
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_DestroyTexture@
+foreign import ccall unsafe "hs_bindgen_daf903d539dab511"
+  hs_bindgen_daf903d539dab511_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_DestroyTexture@
+hs_bindgen_daf903d539dab511
+  :: BG.Ptr SDL_Texture
+  -> IO ()
+hs_bindgen_daf903d539dab511 =
+  BG.fromFFIType hs_bindgen_daf903d539dab511_base
+
+-- | Destroy the specified texture.
+--
+--     Passing NULL or an otherwise invalid texture will set the SDL error message to \"Invalid texture\".
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTexture', 'sDL_CreateTextureFromSurface'
+--
+--     [C declaration]: @SDL_DestroyTexture@, defined at @SDL3\/SDL_render.h 2634:34@
+sDL_DestroyTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to destroy.
+  -> IO ()
+sDL_DestroyTexture = hs_bindgen_daf903d539dab511
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_DestroyRenderer@
+foreign import ccall unsafe "hs_bindgen_1473f45c80ad6575"
+  hs_bindgen_1473f45c80ad6575_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_DestroyRenderer@
+hs_bindgen_1473f45c80ad6575
+  :: BG.Ptr SDL_Renderer
+  -> IO ()
+hs_bindgen_1473f45c80ad6575 =
+  BG.fromFFIType hs_bindgen_1473f45c80ad6575_base
+
+-- | Destroy the rendering context for a window and free all associated textures.
+--
+--     This should be called before destroying the associated window.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateRenderer'
+--
+--     [C declaration]: @SDL_DestroyRenderer@, defined at @SDL3\/SDL_render.h 2650:34@
+sDL_DestroyRenderer
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO ()
+sDL_DestroyRenderer = hs_bindgen_1473f45c80ad6575
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_FlushRenderer@
+foreign import ccall unsafe "hs_bindgen_78e89be71892a1e6"
+  hs_bindgen_78e89be71892a1e6_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_FlushRenderer@
+hs_bindgen_78e89be71892a1e6
+  :: BG.Ptr SDL_Renderer
+  -> IO BG.CBool
+hs_bindgen_78e89be71892a1e6 =
+  BG.fromFFIType hs_bindgen_78e89be71892a1e6_base
+
+-- | Force the rendering context to flush any pending commands and state.
+--
+--     You do not need to (and in fact, shouldn\'t) call this function unless you are planning to call into OpenGL\/Direct3D\/Metal\/whatever directly, in addition to using an 'SDL_Renderer'.
+--
+--     This is for a very-specific case: if you are using SDL\'s render API, and you plan to make OpenGL\/D3D\/whatever calls in addition to SDL render API calls. If this applies, you should call this function between calls to SDL\'s render API and the low-level API you\'re using in cooperation.
+--
+--     In all other cases, you can ignore this function.
+--
+--     This call makes SDL flush any pending rendering work it was queueing up to do later in a single batch, and marks any internal cached state as invalid, so it\'ll prepare all its state again later, from scratch.
+--
+--     This means you do not need to save state in your rendering code to protect the SDL renderer. However, there lots of arbitrary pieces of Direct3D and OpenGL state that can confuse things; you should use your best judgment and be prepared to make changes if specific state needs to be protected.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_FlushRenderer@, defined at @SDL3\/SDL_render.h 2683:34@
+sDL_FlushRenderer
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO BG.CBool
+sDL_FlushRenderer = hs_bindgen_78e89be71892a1e6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderMetalLayer@
+foreign import ccall unsafe "hs_bindgen_47416f026ca1192f"
+  hs_bindgen_47416f026ca1192f_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderMetalLayer@
+hs_bindgen_47416f026ca1192f
+  :: BG.Ptr SDL_Renderer
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_47416f026ca1192f =
+  BG.fromFFIType hs_bindgen_47416f026ca1192f_base
+
+-- | Get the CAMetalLayer associated with the given Metal renderer.
+--
+--     This function returns @void *@, so SDL doesn\'t have to include Metal\'s headers, but it can be safely cast to a @CAMetalLayer *@.
+--
+--     [Returns]: a @CAMetalLayer *@ on success, or NULL if the renderer isn\'t a Metal renderer.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderMetalCommandEncoder'
+--
+--     [C declaration]: @SDL_GetRenderMetalLayer@, defined at @SDL3\/SDL_render.h 2701:36@
+sDL_GetRenderMetalLayer
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetRenderMetalLayer = hs_bindgen_47416f026ca1192f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderMetalCommandEncoder@
+foreign import ccall unsafe "hs_bindgen_c2e3411ac19d746f"
+  hs_bindgen_c2e3411ac19d746f_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderMetalCommandEncoder@
+hs_bindgen_c2e3411ac19d746f
+  :: BG.Ptr SDL_Renderer
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_c2e3411ac19d746f =
+  BG.fromFFIType hs_bindgen_c2e3411ac19d746f_base
+
+-- | Get the Metal command encoder for the current frame.
+--
+--     This function returns @void *@, so SDL doesn\'t have to include Metal\'s headers, but it can be safely cast to an @id\<MTLRenderCommandEncoder>@.
+--
+--     This will return NULL if Metal refuses to give SDL a drawable to render to, which might happen if the window is hidden\/minimized\/offscreen. This doesn\'t apply to command encoders for render targets, just the window\'s backbuffer. Check your return values!
+--
+--     [Returns]: an @id\<MTLRenderCommandEncoder>@ on success, or NULL if the renderer isn\'t a Metal renderer or there was an error.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderMetalLayer'
+--
+--     [C declaration]: @SDL_GetRenderMetalCommandEncoder@, defined at @SDL3\/SDL_render.h 2724:36@
+sDL_GetRenderMetalCommandEncoder
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetRenderMetalCommandEncoder =
+  hs_bindgen_c2e3411ac19d746f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_AddVulkanRenderSemaphores@
+foreign import ccall unsafe "hs_bindgen_98b03ff5afd62e07"
+  hs_bindgen_98b03ff5afd62e07_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Int64
+    -> BG.Int64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_AddVulkanRenderSemaphores@
+hs_bindgen_98b03ff5afd62e07
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> IO BG.CBool
+hs_bindgen_98b03ff5afd62e07 =
+  BG.fromFFIType hs_bindgen_98b03ff5afd62e07_base
+
+-- | Add a set of synchronization semaphores for the current frame.
+--
+--     The Vulkan renderer will wait for @wait_semaphore@ before submitting rendering commands and signal @signal_semaphore@ after rendering commands are complete for this frame.
+--
+--     This should be called each frame that you want semaphore synchronization. The Vulkan renderer may have multiple frames in flight on the GPU, so you should have multiple semaphores that are used for synchronization. Querying SDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER will give you the maximum number of semaphores you\'ll need.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is __NOT__ safe to call this function from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_AddVulkanRenderSemaphores@, defined at @SDL3\/SDL_render.h 2755:34@
+sDL_AddVulkanRenderSemaphores
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@wait_stage_mask@]: the VkPipelineStageFlags for the wait.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@wait_semaphore@]: a VkSempahore to wait on before rendering the current frame, or 0 if not needed.
+  -> SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@signal_semaphore@]: a VkSempahore that SDL will signal when rendering for the current frame is complete, or 0 if not needed.
+  -> IO BG.CBool
+sDL_AddVulkanRenderSemaphores =
+  hs_bindgen_98b03ff5afd62e07
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderVSync@
+foreign import ccall unsafe "hs_bindgen_529493ee355e9466"
+  hs_bindgen_529493ee355e9466_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetRenderVSync@
+hs_bindgen_529493ee355e9466
+  :: BG.Ptr SDL_Renderer
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_529493ee355e9466 =
+  BG.fromFFIType hs_bindgen_529493ee355e9466_base
+
+-- | Toggle VSync of the given renderer.
+--
+--     When a renderer is created, vsync defaults to SDL_RENDERER_VSYNC_DISABLED.
+--
+--     The @vsync@ parameter can be 1 to synchronize present with every vertical refresh, 2 to synchronize present with every second vertical refresh, etc., SDL_RENDERER_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or SDL_RENDERER_VSYNC_DISABLED to disable. Not every value is supported by every driver, so you should check the return value to see whether the requested setting is supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRenderVSync'
+--
+--     [C declaration]: @SDL_SetRenderVSync@, defined at @SDL3\/SDL_render.h 2780:34@
+sDL_SetRenderVSync
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to toggle.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: the vertical refresh sync interval.
+  -> IO BG.CBool
+sDL_SetRenderVSync = hs_bindgen_529493ee355e9466
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderVSync@
+foreign import ccall unsafe "hs_bindgen_ff41dba2a623c0ab"
+  hs_bindgen_ff41dba2a623c0ab_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetRenderVSync@
+hs_bindgen_ff41dba2a623c0ab
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_ff41dba2a623c0ab =
+  BG.fromFFIType hs_bindgen_ff41dba2a623c0ab_base
+
+-- | Get VSync of the given renderer.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetRenderVSync'
+--
+--     [C declaration]: @SDL_GetRenderVSync@, defined at @SDL3\/SDL_render.h 2800:34@
+sDL_GetRenderVSync
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to toggle.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: an int filled with the current vertical refresh sync interval. See @SDL_SetRenderVSync()@ for the meaning of the value.
+  -> IO BG.CBool
+sDL_GetRenderVSync = hs_bindgen_ff41dba2a623c0ab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderDebugText@
+foreign import ccall unsafe "hs_bindgen_a60ea3ca32fd26a5"
+  hs_bindgen_a60ea3ca32fd26a5_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_RenderDebugText@
+hs_bindgen_a60ea3ca32fd26a5
+  :: BG.Ptr SDL_Renderer
+  -> BG.CFloat
+  -> BG.CFloat
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_a60ea3ca32fd26a5 =
+  BG.fromFFIType hs_bindgen_a60ea3ca32fd26a5_base
+
+-- | Draw debug text to an 'SDL_Renderer'.
+--
+--     This function will render a string of text to an 'SDL_Renderer'. Note that this is a convenience function for debugging, with severe limitations, and not intended to be used for production apps and games.
+--
+--     Among these limitations:
+--
+--     * It accepts UTF-8 strings, but will only renders ASCII characters.
+--
+--     * It has a single, tiny size (8x8 pixels). You can use logical presentation or @SDL_SetRenderScale()@ to adjust it.
+--
+--     * It uses a simple, hardcoded bitmap font. It does not allow different font selections and it does not support truetype, for proper scaling.
+--
+--     * It does no word-wrapping and does not treat newline characters as a line break. If the text goes out of the window, it\'s gone.
+--
+--     For serious text rendering, there are several good options, such as SDL_ttf, stb_truetype, or other external libraries.
+--
+--     On first use, this will create an internal texture for rendering glyphs. This texture will live until the renderer is destroyed.
+--
+--     The text is drawn in the color specified by @SDL_SetRenderDrawColor()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_RenderDebugTextFormat@, 'sDL_DEBUG_TEXT_FONT_CHARACTER_SIZE'
+--
+--     [C declaration]: @SDL_RenderDebugText@, defined at @SDL3\/SDL_render.h 2852:34@
+sDL_RenderDebugText
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a line of text.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the x coordinate where the top-left corner of the text will draw.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the y coordinate where the top-left corner of the text will draw.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to render.
+  -> IO BG.CBool
+sDL_RenderDebugText = hs_bindgen_a60ea3ca32fd26a5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetDefaultTextureScaleMode@
+foreign import ccall unsafe "hs_bindgen_e0aee38e1b73b64f"
+  hs_bindgen_e0aee38e1b73b64f_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetDefaultTextureScaleMode@
+hs_bindgen_e0aee38e1b73b64f
+  :: BG.Ptr SDL_Renderer
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_e0aee38e1b73b64f =
+  BG.fromFFIType hs_bindgen_e0aee38e1b73b64f_base
+
+-- | Set default scale mode for new textures for given renderer.
+--
+--     When a renderer is created, scale_mode defaults to SDL_SCALEMODE_LINEAR.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_GetDefaultTextureScaleMode'
+--
+--     [C declaration]: @SDL_SetDefaultTextureScaleMode@, defined at @SDL3\/SDL_render.h 2898:34@
+sDL_SetDefaultTextureScaleMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to update.
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scale_mode@]: the scale mode to change to for new textures.
+  -> IO BG.CBool
+sDL_SetDefaultTextureScaleMode =
+  hs_bindgen_e0aee38e1b73b64f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetDefaultTextureScaleMode@
+foreign import ccall unsafe "hs_bindgen_51c8f91a397184cb"
+  hs_bindgen_51c8f91a397184cb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_GetDefaultTextureScaleMode@
+hs_bindgen_51c8f91a397184cb
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_51c8f91a397184cb =
+  BG.fromFFIType hs_bindgen_51c8f91a397184cb_base
+
+-- | Get default texture scale mode of the given renderer.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetDefaultTextureScaleMode'
+--
+--     [C declaration]: @SDL_GetDefaultTextureScaleMode@, defined at @SDL3\/SDL_render.h 2916:34@
+sDL_GetDefaultTextureScaleMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to get data from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scale_mode@]: a SDL_ScaleMode filled with current default scale mode. See @SDL_SetDefaultTextureScaleMode()@ for the meaning of the value.
+  -> IO BG.CBool
+sDL_GetDefaultTextureScaleMode =
+  hs_bindgen_51c8f91a397184cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateGPURenderState@
+foreign import ccall unsafe "hs_bindgen_2d970ffb5a76b1e4"
+  hs_bindgen_2d970ffb5a76b1e4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_CreateGPURenderState@
+hs_bindgen_2d970ffb5a76b1e4
+  :: BG.Ptr SDL_Renderer
+  -> PtrConst.PtrConst SDL_GPURenderStateCreateInfo
+  -> IO (BG.Ptr SDL_GPURenderState)
+hs_bindgen_2d970ffb5a76b1e4 =
+  BG.fromFFIType hs_bindgen_2d970ffb5a76b1e4_base
+
+-- | Create custom GPU render state.
+--
+--     [Returns]: a custom GPU render state or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_SetGPURenderStateFragmentUniforms', 'sDL_SetGPURenderState', 'sDL_DestroyGPURenderState'
+--
+--     [C declaration]: @SDL_CreateGPURenderState@, defined at @SDL3\/SDL_render.h 2970:50@
+sDL_CreateGPURenderState
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to use.
+  -> PtrConst.PtrConst SDL_GPURenderStateCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the GPU render state to create.
+  -> IO (BG.Ptr SDL_GPURenderState)
+sDL_CreateGPURenderState =
+  hs_bindgen_2d970ffb5a76b1e4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetGPURenderStateFragmentUniforms@
+foreign import ccall unsafe "hs_bindgen_312b275c9f55463c"
+  hs_bindgen_312b275c9f55463c_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetGPURenderStateFragmentUniforms@
+hs_bindgen_312b275c9f55463c
+  :: BG.Ptr SDL_GPURenderState
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> PtrConst.PtrConst BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_312b275c9f55463c =
+  BG.fromFFIType hs_bindgen_312b275c9f55463c_base
+
+-- | Set fragment shader uniform variables in a custom GPU render state.
+--
+--     The data is copied and will be pushed using SDL_PushGPUFragmentUniformData() during draw call execution.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetGPURenderStateFragmentUniforms@, defined at @SDL3\/SDL_render.h 2990:34@
+sDL_SetGPURenderStateFragmentUniforms
+  :: BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to modify.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@slot_index@]: the fragment uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO BG.CBool
+sDL_SetGPURenderStateFragmentUniforms =
+  hs_bindgen_312b275c9f55463c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetGPURenderState@
+foreign import ccall unsafe "hs_bindgen_0d6949c161acc59d"
+  hs_bindgen_0d6949c161acc59d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_SetGPURenderState@
+hs_bindgen_0d6949c161acc59d
+  :: BG.Ptr SDL_Renderer
+  -> BG.Ptr SDL_GPURenderState
+  -> IO BG.CBool
+hs_bindgen_0d6949c161acc59d =
+  BG.fromFFIType hs_bindgen_0d6949c161acc59d_base
+
+-- | Set custom GPU render state.
+--
+--     This function sets custom GPU render state for subsequent draw calls. This allows using custom shaders with the GPU renderer.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetGPURenderState@, defined at @SDL3\/SDL_render.h 3008:34@
+sDL_SetGPURenderState
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to use.
+  -> BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to to use, or NULL to clear custom GPU render state.
+  -> IO BG.CBool
+sDL_SetGPURenderState = hs_bindgen_0d6949c161acc59d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_DestroyGPURenderState@
+foreign import ccall unsafe "hs_bindgen_eccc60d637069ae8"
+  hs_bindgen_eccc60d637069ae8_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Render_Unsafe_SDL_DestroyGPURenderState@
+hs_bindgen_eccc60d637069ae8
+  :: BG.Ptr SDL_GPURenderState
+  -> IO ()
+hs_bindgen_eccc60d637069ae8 =
+  BG.fromFFIType hs_bindgen_eccc60d637069ae8_base
+
+-- | Destroy custom GPU render state.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_CreateGPURenderState'
+--
+--     [C declaration]: @SDL_DestroyGPURenderState@, defined at @SDL3\/SDL_render.h 3022:34@
+sDL_DestroyGPURenderState
+  :: BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to destroy.
+  -> IO ()
+sDL_DestroyGPURenderState =
+  hs_bindgen_eccc60d637069ae8
diff --git a/src/SDL3/Sys/Bindgen/Runtime.hs b/src/SDL3/Sys/Bindgen/Runtime.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime.hs
@@ -0,0 +1,15 @@
+-- | The runtime vocabulary used by the generated bindings.
+--
+-- Generated signatures mention runtime types (CEnum, constant and
+-- incomplete arrays, read-only pointers, …); this facade makes them
+-- nameable downstream. The runtime itself is a verbatim, PRIVATE copy
+-- of the pinned hs-bindgen runtime (see LICENSE_hs-bindgen-runtime);
+-- once hs-bindgen releases, it becomes a real dependency and this
+-- module keeps downstream code source-compatible.
+module SDL3.Sys.Bindgen.Runtime (
+  module HsBindgen.Runtime.Prelude,
+  module HsBindgen.Runtime.LibC,
+) where
+
+import HsBindgen.Runtime.LibC
+import HsBindgen.Runtime.Prelude
diff --git a/src/SDL3/Sys/Bindgen/Runtime/BitfieldPtr.hs b/src/SDL3/Sys/Bindgen/Runtime/BitfieldPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/BitfieldPtr.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.BitfieldPtr@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.BitfieldPtr as BitfieldPtr
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.BitfieldPtr (
+  module HsBindgen.Runtime.BitfieldPtr,
+) where
+
+import HsBindgen.Runtime.BitfieldPtr
diff --git a/src/SDL3/Sys/Bindgen/Runtime/Block.hs b/src/SDL3/Sys/Bindgen/Runtime/Block.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/Block.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.Block@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.Block as Block
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.Block (
+  module HsBindgen.Runtime.Block,
+) where
+
+import HsBindgen.Runtime.Block
diff --git a/src/SDL3/Sys/Bindgen/Runtime/CBool.hs b/src/SDL3/Sys/Bindgen/Runtime/CBool.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/CBool.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.CBool@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.CBool as CBool
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.CBool (
+  module HsBindgen.Runtime.CBool,
+) where
+
+import HsBindgen.Runtime.CBool
diff --git a/src/SDL3/Sys/Bindgen/Runtime/CEnum.hs b/src/SDL3/Sys/Bindgen/Runtime/CEnum.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/CEnum.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.CEnum@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.CEnum as CEnum
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.CEnum (
+  module HsBindgen.Runtime.CEnum,
+) where
+
+import HsBindgen.Runtime.CEnum
diff --git a/src/SDL3/Sys/Bindgen/Runtime/CExpr.hs b/src/SDL3/Sys/Bindgen/Runtime/CExpr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/CExpr.hs
@@ -0,0 +1,12 @@
+-- | The C-expression vocabulary used by translated macros.
+--
+-- Re-exports @C.Expr.HostPlatform@ from the vendored copy of c-expr-runtime
+--
+-- Import qualified. Exports are operator classes like @+@, @*@, ...
+--
+-- For licensing information, see LICENSE_c-expr-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.CExpr (
+  module C.Expr.HostPlatform,
+) where
+
+import C.Expr.HostPlatform
diff --git a/src/SDL3/Sys/Bindgen/Runtime/ConstantArray.hs b/src/SDL3/Sys/Bindgen/Runtime/ConstantArray.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/ConstantArray.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.ConstantArray@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.ConstantArray as ConstantArray
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.ConstantArray (
+  module HsBindgen.Runtime.ConstantArray,
+) where
+
+import HsBindgen.Runtime.ConstantArray
diff --git a/src/SDL3/Sys/Bindgen/Runtime/FLAM.hs b/src/SDL3/Sys/Bindgen/Runtime/FLAM.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/FLAM.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.FLAM@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.FLAM as FLAM
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.FLAM (
+  module HsBindgen.Runtime.FLAM,
+) where
+
+import HsBindgen.Runtime.FLAM
diff --git a/src/SDL3/Sys/Bindgen/Runtime/HasCBitfield.hs b/src/SDL3/Sys/Bindgen/Runtime/HasCBitfield.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/HasCBitfield.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.HasCBitfield@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.HasCBitfield as HasCBitfield
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.HasCBitfield (
+  module HsBindgen.Runtime.HasCBitfield,
+) where
+
+import HsBindgen.Runtime.HasCBitfield
diff --git a/src/SDL3/Sys/Bindgen/Runtime/HasCField.hs b/src/SDL3/Sys/Bindgen/Runtime/HasCField.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/HasCField.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.HasCField@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.HasCField as HasCField
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.HasCField (
+  module HsBindgen.Runtime.HasCField,
+) where
+
+import HsBindgen.Runtime.HasCField
diff --git a/src/SDL3/Sys/Bindgen/Runtime/IncompleteArray.hs b/src/SDL3/Sys/Bindgen/Runtime/IncompleteArray.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/IncompleteArray.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.IncompleteArray@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.IncompleteArray as IncompleteArray
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.IncompleteArray (
+  module HsBindgen.Runtime.IncompleteArray,
+) where
+
+import HsBindgen.Runtime.IncompleteArray
diff --git a/src/SDL3/Sys/Bindgen/Runtime/IsArray.hs b/src/SDL3/Sys/Bindgen/Runtime/IsArray.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/IsArray.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.IsArray@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.IsArray as IsArray
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.IsArray (
+  module HsBindgen.Runtime.IsArray,
+) where
+
+import HsBindgen.Runtime.IsArray
diff --git a/src/SDL3/Sys/Bindgen/Runtime/Marshal.hs b/src/SDL3/Sys/Bindgen/Runtime/Marshal.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/Marshal.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.Marshal@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.Marshal as Marshal
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.Marshal (
+  module HsBindgen.Runtime.Marshal,
+) where
+
+import HsBindgen.Runtime.Marshal
diff --git a/src/SDL3/Sys/Bindgen/Runtime/PtrConst.hs b/src/SDL3/Sys/Bindgen/Runtime/PtrConst.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/PtrConst.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.PtrConst@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.PtrConst as PtrConst
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.PtrConst (
+  module HsBindgen.Runtime.PtrConst,
+) where
+
+import HsBindgen.Runtime.PtrConst
diff --git a/src/SDL3/Sys/Bindgen/Runtime/Union.hs b/src/SDL3/Sys/Bindgen/Runtime/Union.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Runtime/Union.hs
@@ -0,0 +1,12 @@
+-- | Facade over @HsBindgen.Runtime.Union@ from the vendored hs-bindgen runtime.
+--
+-- Intended for qualified import:
+--
+-- > import qualified SDL3.Sys.Bindgen.Runtime.Union as Union
+--
+-- For licensing information, see LICENSE_hs-bindgen-runtime in this package's root.
+module SDL3.Sys.Bindgen.Runtime.Union (
+  module HsBindgen.Runtime.Union,
+) where
+
+import HsBindgen.Runtime.Union
diff --git a/src/SDL3/Sys/Bindgen/Scancode.hs b/src/SDL3/Sys/Bindgen/Scancode.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Scancode.hs
@@ -0,0 +1,1754 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Defines keyboard scancodes.
+--
+--     Please refer to the Best Keyboard Practices document for details on what this information means and how best to use it.
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/BestKeyboardPractices](https://wiki.libsdl.org/SDL3/BestKeyboardPractices) The SDL keyboard scancode representation.
+--
+--     An SDL scancode is the physical representation of a key on the keyboard, independent of language and keyboard mapping.
+--
+--     Values of this type are used to represent keyboard keys, among other places in the @scancode@ field of the SDL_KeyboardEvent structure.
+--
+--     The values in this enumeration are based on the USB usage page standard: [https:\/\/usb.org\/sites\/default\/files\/hut1_5.pdf](https://usb.org/sites/default/files/hut1_5.pdf)
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Scancode (
+  SDL3.Sys.Bindgen.Scancode.SDL_Scancode (..),
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_A,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_B,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_C,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_D,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_E,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_G,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_H,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_I,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_J,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_K,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_L,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_M,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_N,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_O,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_P,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_Q,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_R,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_S,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_T,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_U,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_V,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_W,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_X,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_Y,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_Z,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_1,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_2,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_3,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_4,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_5,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_6,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_7,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_8,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_9,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_0,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_RETURN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_ESCAPE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_BACKSPACE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_TAB,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_SPACE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MINUS,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_EQUALS,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LEFTBRACKET,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_RIGHTBRACKET,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_BACKSLASH,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_NONUSHASH,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_SEMICOLON,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_APOSTROPHE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_GRAVE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_COMMA,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_PERIOD,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_SLASH,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CAPSLOCK,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F1,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F2,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F3,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F4,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F5,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F6,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F7,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F8,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F9,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F10,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F11,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F12,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_PRINTSCREEN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_SCROLLLOCK,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_PAUSE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_INSERT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_HOME,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_PAGEUP,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_DELETE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_END,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_PAGEDOWN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_RIGHT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LEFT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_DOWN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_UP,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_NUMLOCKCLEAR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_DIVIDE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_MULTIPLY,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_MINUS,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_PLUS,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_ENTER,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_1,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_2,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_3,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_4,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_5,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_6,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_7,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_8,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_9,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_0,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_PERIOD,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_NONUSBACKSLASH,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_APPLICATION,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_POWER,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_EQUALS,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F13,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F14,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F15,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F16,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F17,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F18,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F19,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F20,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F21,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F22,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F23,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_F24,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_EXECUTE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_HELP,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MENU,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_SELECT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_STOP,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AGAIN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_UNDO,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CUT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_COPY,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_PASTE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_FIND,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MUTE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_VOLUMEUP,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_VOLUMEDOWN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_COMMA,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_EQUALSAS400,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_INTERNATIONAL1,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_INTERNATIONAL2,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_INTERNATIONAL3,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_INTERNATIONAL4,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_INTERNATIONAL5,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_INTERNATIONAL6,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_INTERNATIONAL7,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_INTERNATIONAL8,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_INTERNATIONAL9,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LANG1,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LANG2,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LANG3,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LANG4,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LANG5,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LANG6,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LANG7,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LANG8,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LANG9,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_ALTERASE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_SYSREQ,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CANCEL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CLEAR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_PRIOR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_RETURN2,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_SEPARATOR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_OUT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_OPER,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CLEARAGAIN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CRSEL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_EXSEL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_00,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_000,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_THOUSANDSSEPARATOR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_DECIMALSEPARATOR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CURRENCYUNIT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CURRENCYSUBUNIT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_LEFTPAREN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_RIGHTPAREN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_LEFTBRACE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_RIGHTBRACE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_TAB,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_BACKSPACE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_A,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_B,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_C,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_D,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_E,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_F,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_XOR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_POWER,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_PERCENT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_LESS,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_GREATER,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_AMPERSAND,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_DBLAMPERSAND,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_VERTICALBAR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_DBLVERTICALBAR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_COLON,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_HASH,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_SPACE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_AT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_EXCLAM,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_MEMSTORE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_MEMRECALL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_MEMCLEAR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_MEMADD,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_MEMSUBTRACT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_MEMMULTIPLY,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_MEMDIVIDE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_PLUSMINUS,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_CLEAR,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_CLEARENTRY,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_BINARY,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_OCTAL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_DECIMAL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_KP_HEXADECIMAL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LCTRL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LSHIFT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LALT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_LGUI,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_RCTRL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_RSHIFT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_RALT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_RGUI,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MODE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_SLEEP,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_WAKE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CHANNEL_INCREMENT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CHANNEL_DECREMENT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_PLAY,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_PAUSE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_RECORD,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_FAST_FORWARD,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_REWIND,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_NEXT_TRACK,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_PREVIOUS_TRACK,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_STOP,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_EJECT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_PLAY_PAUSE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_MEDIA_SELECT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_NEW,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_OPEN,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_CLOSE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_EXIT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_SAVE,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_PRINT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_PROPERTIES,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_SEARCH,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_HOME,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_BACK,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_FORWARD,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_STOP,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_REFRESH,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_AC_BOOKMARKS,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_SOFTLEFT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_SOFTRIGHT,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_CALL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_ENDCALL,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_RESERVED,
+  pattern SDL3.Sys.Bindgen.Scancode.SDL_SCANCODE_COUNT,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @enum SDL_Scancode@, defined at @SDL3\/SDL_scancode.h 52:14@
+newtype SDL_Scancode = SDL_Scancode
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_Scancode where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_Scancode where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Scancode
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_Scancode where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Scancode unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_Scancode instance BG.Storable SDL_Scancode
+
+deriving via BG.CUInt instance BG.Prim SDL_Scancode
+
+instance CEnum.CEnum SDL_Scancode where
+  type CEnumZ SDL_Scancode = BG.CUInt
+
+  toCEnum = SDL_Scancode
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_SCANCODE_UNKNOWN")
+        , (4, BG.singleton "SDL_SCANCODE_A")
+        , (5, BG.singleton "SDL_SCANCODE_B")
+        , (6, BG.singleton "SDL_SCANCODE_C")
+        , (7, BG.singleton "SDL_SCANCODE_D")
+        , (8, BG.singleton "SDL_SCANCODE_E")
+        , (9, BG.singleton "SDL_SCANCODE_F")
+        , (10, BG.singleton "SDL_SCANCODE_G")
+        , (11, BG.singleton "SDL_SCANCODE_H")
+        , (12, BG.singleton "SDL_SCANCODE_I")
+        , (13, BG.singleton "SDL_SCANCODE_J")
+        , (14, BG.singleton "SDL_SCANCODE_K")
+        , (15, BG.singleton "SDL_SCANCODE_L")
+        , (16, BG.singleton "SDL_SCANCODE_M")
+        , (17, BG.singleton "SDL_SCANCODE_N")
+        , (18, BG.singleton "SDL_SCANCODE_O")
+        , (19, BG.singleton "SDL_SCANCODE_P")
+        , (20, BG.singleton "SDL_SCANCODE_Q")
+        , (21, BG.singleton "SDL_SCANCODE_R")
+        , (22, BG.singleton "SDL_SCANCODE_S")
+        , (23, BG.singleton "SDL_SCANCODE_T")
+        , (24, BG.singleton "SDL_SCANCODE_U")
+        , (25, BG.singleton "SDL_SCANCODE_V")
+        , (26, BG.singleton "SDL_SCANCODE_W")
+        , (27, BG.singleton "SDL_SCANCODE_X")
+        , (28, BG.singleton "SDL_SCANCODE_Y")
+        , (29, BG.singleton "SDL_SCANCODE_Z")
+        , (30, BG.singleton "SDL_SCANCODE_1")
+        , (31, BG.singleton "SDL_SCANCODE_2")
+        , (32, BG.singleton "SDL_SCANCODE_3")
+        , (33, BG.singleton "SDL_SCANCODE_4")
+        , (34, BG.singleton "SDL_SCANCODE_5")
+        , (35, BG.singleton "SDL_SCANCODE_6")
+        , (36, BG.singleton "SDL_SCANCODE_7")
+        , (37, BG.singleton "SDL_SCANCODE_8")
+        , (38, BG.singleton "SDL_SCANCODE_9")
+        , (39, BG.singleton "SDL_SCANCODE_0")
+        , (40, BG.singleton "SDL_SCANCODE_RETURN")
+        , (41, BG.singleton "SDL_SCANCODE_ESCAPE")
+        , (42, BG.singleton "SDL_SCANCODE_BACKSPACE")
+        , (43, BG.singleton "SDL_SCANCODE_TAB")
+        , (44, BG.singleton "SDL_SCANCODE_SPACE")
+        , (45, BG.singleton "SDL_SCANCODE_MINUS")
+        , (46, BG.singleton "SDL_SCANCODE_EQUALS")
+        , (47, BG.singleton "SDL_SCANCODE_LEFTBRACKET")
+        , (48, BG.singleton "SDL_SCANCODE_RIGHTBRACKET")
+        , (49, BG.singleton "SDL_SCANCODE_BACKSLASH")
+        , (50, BG.singleton "SDL_SCANCODE_NONUSHASH")
+        , (51, BG.singleton "SDL_SCANCODE_SEMICOLON")
+        , (52, BG.singleton "SDL_SCANCODE_APOSTROPHE")
+        , (53, BG.singleton "SDL_SCANCODE_GRAVE")
+        , (54, BG.singleton "SDL_SCANCODE_COMMA")
+        , (55, BG.singleton "SDL_SCANCODE_PERIOD")
+        , (56, BG.singleton "SDL_SCANCODE_SLASH")
+        , (57, BG.singleton "SDL_SCANCODE_CAPSLOCK")
+        , (58, BG.singleton "SDL_SCANCODE_F1")
+        , (59, BG.singleton "SDL_SCANCODE_F2")
+        , (60, BG.singleton "SDL_SCANCODE_F3")
+        , (61, BG.singleton "SDL_SCANCODE_F4")
+        , (62, BG.singleton "SDL_SCANCODE_F5")
+        , (63, BG.singleton "SDL_SCANCODE_F6")
+        , (64, BG.singleton "SDL_SCANCODE_F7")
+        , (65, BG.singleton "SDL_SCANCODE_F8")
+        , (66, BG.singleton "SDL_SCANCODE_F9")
+        , (67, BG.singleton "SDL_SCANCODE_F10")
+        , (68, BG.singleton "SDL_SCANCODE_F11")
+        , (69, BG.singleton "SDL_SCANCODE_F12")
+        , (70, BG.singleton "SDL_SCANCODE_PRINTSCREEN")
+        , (71, BG.singleton "SDL_SCANCODE_SCROLLLOCK")
+        , (72, BG.singleton "SDL_SCANCODE_PAUSE")
+        , (73, BG.singleton "SDL_SCANCODE_INSERT")
+        , (74, BG.singleton "SDL_SCANCODE_HOME")
+        , (75, BG.singleton "SDL_SCANCODE_PAGEUP")
+        , (76, BG.singleton "SDL_SCANCODE_DELETE")
+        , (77, BG.singleton "SDL_SCANCODE_END")
+        , (78, BG.singleton "SDL_SCANCODE_PAGEDOWN")
+        , (79, BG.singleton "SDL_SCANCODE_RIGHT")
+        , (80, BG.singleton "SDL_SCANCODE_LEFT")
+        , (81, BG.singleton "SDL_SCANCODE_DOWN")
+        , (82, BG.singleton "SDL_SCANCODE_UP")
+        , (83, BG.singleton "SDL_SCANCODE_NUMLOCKCLEAR")
+        , (84, BG.singleton "SDL_SCANCODE_KP_DIVIDE")
+        , (85, BG.singleton "SDL_SCANCODE_KP_MULTIPLY")
+        , (86, BG.singleton "SDL_SCANCODE_KP_MINUS")
+        , (87, BG.singleton "SDL_SCANCODE_KP_PLUS")
+        , (88, BG.singleton "SDL_SCANCODE_KP_ENTER")
+        , (89, BG.singleton "SDL_SCANCODE_KP_1")
+        , (90, BG.singleton "SDL_SCANCODE_KP_2")
+        , (91, BG.singleton "SDL_SCANCODE_KP_3")
+        , (92, BG.singleton "SDL_SCANCODE_KP_4")
+        , (93, BG.singleton "SDL_SCANCODE_KP_5")
+        , (94, BG.singleton "SDL_SCANCODE_KP_6")
+        , (95, BG.singleton "SDL_SCANCODE_KP_7")
+        , (96, BG.singleton "SDL_SCANCODE_KP_8")
+        , (97, BG.singleton "SDL_SCANCODE_KP_9")
+        , (98, BG.singleton "SDL_SCANCODE_KP_0")
+        , (99, BG.singleton "SDL_SCANCODE_KP_PERIOD")
+        , (100, BG.singleton "SDL_SCANCODE_NONUSBACKSLASH")
+        , (101, BG.singleton "SDL_SCANCODE_APPLICATION")
+        , (102, BG.singleton "SDL_SCANCODE_POWER")
+        , (103, BG.singleton "SDL_SCANCODE_KP_EQUALS")
+        , (104, BG.singleton "SDL_SCANCODE_F13")
+        , (105, BG.singleton "SDL_SCANCODE_F14")
+        , (106, BG.singleton "SDL_SCANCODE_F15")
+        , (107, BG.singleton "SDL_SCANCODE_F16")
+        , (108, BG.singleton "SDL_SCANCODE_F17")
+        , (109, BG.singleton "SDL_SCANCODE_F18")
+        , (110, BG.singleton "SDL_SCANCODE_F19")
+        , (111, BG.singleton "SDL_SCANCODE_F20")
+        , (112, BG.singleton "SDL_SCANCODE_F21")
+        , (113, BG.singleton "SDL_SCANCODE_F22")
+        , (114, BG.singleton "SDL_SCANCODE_F23")
+        , (115, BG.singleton "SDL_SCANCODE_F24")
+        , (116, BG.singleton "SDL_SCANCODE_EXECUTE")
+        , (117, BG.singleton "SDL_SCANCODE_HELP")
+        , (118, BG.singleton "SDL_SCANCODE_MENU")
+        , (119, BG.singleton "SDL_SCANCODE_SELECT")
+        , (120, BG.singleton "SDL_SCANCODE_STOP")
+        , (121, BG.singleton "SDL_SCANCODE_AGAIN")
+        , (122, BG.singleton "SDL_SCANCODE_UNDO")
+        , (123, BG.singleton "SDL_SCANCODE_CUT")
+        , (124, BG.singleton "SDL_SCANCODE_COPY")
+        , (125, BG.singleton "SDL_SCANCODE_PASTE")
+        , (126, BG.singleton "SDL_SCANCODE_FIND")
+        , (127, BG.singleton "SDL_SCANCODE_MUTE")
+        , (128, BG.singleton "SDL_SCANCODE_VOLUMEUP")
+        , (129, BG.singleton "SDL_SCANCODE_VOLUMEDOWN")
+        , (133, BG.singleton "SDL_SCANCODE_KP_COMMA")
+        , (134, BG.singleton "SDL_SCANCODE_KP_EQUALSAS400")
+        , (135, BG.singleton "SDL_SCANCODE_INTERNATIONAL1")
+        , (136, BG.singleton "SDL_SCANCODE_INTERNATIONAL2")
+        , (137, BG.singleton "SDL_SCANCODE_INTERNATIONAL3")
+        , (138, BG.singleton "SDL_SCANCODE_INTERNATIONAL4")
+        , (139, BG.singleton "SDL_SCANCODE_INTERNATIONAL5")
+        , (140, BG.singleton "SDL_SCANCODE_INTERNATIONAL6")
+        , (141, BG.singleton "SDL_SCANCODE_INTERNATIONAL7")
+        , (142, BG.singleton "SDL_SCANCODE_INTERNATIONAL8")
+        , (143, BG.singleton "SDL_SCANCODE_INTERNATIONAL9")
+        , (144, BG.singleton "SDL_SCANCODE_LANG1")
+        , (145, BG.singleton "SDL_SCANCODE_LANG2")
+        , (146, BG.singleton "SDL_SCANCODE_LANG3")
+        , (147, BG.singleton "SDL_SCANCODE_LANG4")
+        , (148, BG.singleton "SDL_SCANCODE_LANG5")
+        , (149, BG.singleton "SDL_SCANCODE_LANG6")
+        , (150, BG.singleton "SDL_SCANCODE_LANG7")
+        , (151, BG.singleton "SDL_SCANCODE_LANG8")
+        , (152, BG.singleton "SDL_SCANCODE_LANG9")
+        , (153, BG.singleton "SDL_SCANCODE_ALTERASE")
+        , (154, BG.singleton "SDL_SCANCODE_SYSREQ")
+        , (155, BG.singleton "SDL_SCANCODE_CANCEL")
+        , (156, BG.singleton "SDL_SCANCODE_CLEAR")
+        , (157, BG.singleton "SDL_SCANCODE_PRIOR")
+        , (158, BG.singleton "SDL_SCANCODE_RETURN2")
+        , (159, BG.singleton "SDL_SCANCODE_SEPARATOR")
+        , (160, BG.singleton "SDL_SCANCODE_OUT")
+        , (161, BG.singleton "SDL_SCANCODE_OPER")
+        , (162, BG.singleton "SDL_SCANCODE_CLEARAGAIN")
+        , (163, BG.singleton "SDL_SCANCODE_CRSEL")
+        , (164, BG.singleton "SDL_SCANCODE_EXSEL")
+        , (176, BG.singleton "SDL_SCANCODE_KP_00")
+        , (177, BG.singleton "SDL_SCANCODE_KP_000")
+        , (178, BG.singleton "SDL_SCANCODE_THOUSANDSSEPARATOR")
+        , (179, BG.singleton "SDL_SCANCODE_DECIMALSEPARATOR")
+        , (180, BG.singleton "SDL_SCANCODE_CURRENCYUNIT")
+        , (181, BG.singleton "SDL_SCANCODE_CURRENCYSUBUNIT")
+        , (182, BG.singleton "SDL_SCANCODE_KP_LEFTPAREN")
+        , (183, BG.singleton "SDL_SCANCODE_KP_RIGHTPAREN")
+        , (184, BG.singleton "SDL_SCANCODE_KP_LEFTBRACE")
+        , (185, BG.singleton "SDL_SCANCODE_KP_RIGHTBRACE")
+        , (186, BG.singleton "SDL_SCANCODE_KP_TAB")
+        , (187, BG.singleton "SDL_SCANCODE_KP_BACKSPACE")
+        , (188, BG.singleton "SDL_SCANCODE_KP_A")
+        , (189, BG.singleton "SDL_SCANCODE_KP_B")
+        , (190, BG.singleton "SDL_SCANCODE_KP_C")
+        , (191, BG.singleton "SDL_SCANCODE_KP_D")
+        , (192, BG.singleton "SDL_SCANCODE_KP_E")
+        , (193, BG.singleton "SDL_SCANCODE_KP_F")
+        , (194, BG.singleton "SDL_SCANCODE_KP_XOR")
+        , (195, BG.singleton "SDL_SCANCODE_KP_POWER")
+        , (196, BG.singleton "SDL_SCANCODE_KP_PERCENT")
+        , (197, BG.singleton "SDL_SCANCODE_KP_LESS")
+        , (198, BG.singleton "SDL_SCANCODE_KP_GREATER")
+        , (199, BG.singleton "SDL_SCANCODE_KP_AMPERSAND")
+        , (200, BG.singleton "SDL_SCANCODE_KP_DBLAMPERSAND")
+        , (201, BG.singleton "SDL_SCANCODE_KP_VERTICALBAR")
+        , (202, BG.singleton "SDL_SCANCODE_KP_DBLVERTICALBAR")
+        , (203, BG.singleton "SDL_SCANCODE_KP_COLON")
+        , (204, BG.singleton "SDL_SCANCODE_KP_HASH")
+        , (205, BG.singleton "SDL_SCANCODE_KP_SPACE")
+        , (206, BG.singleton "SDL_SCANCODE_KP_AT")
+        , (207, BG.singleton "SDL_SCANCODE_KP_EXCLAM")
+        , (208, BG.singleton "SDL_SCANCODE_KP_MEMSTORE")
+        , (209, BG.singleton "SDL_SCANCODE_KP_MEMRECALL")
+        , (210, BG.singleton "SDL_SCANCODE_KP_MEMCLEAR")
+        , (211, BG.singleton "SDL_SCANCODE_KP_MEMADD")
+        , (212, BG.singleton "SDL_SCANCODE_KP_MEMSUBTRACT")
+        , (213, BG.singleton "SDL_SCANCODE_KP_MEMMULTIPLY")
+        , (214, BG.singleton "SDL_SCANCODE_KP_MEMDIVIDE")
+        , (215, BG.singleton "SDL_SCANCODE_KP_PLUSMINUS")
+        , (216, BG.singleton "SDL_SCANCODE_KP_CLEAR")
+        , (217, BG.singleton "SDL_SCANCODE_KP_CLEARENTRY")
+        , (218, BG.singleton "SDL_SCANCODE_KP_BINARY")
+        , (219, BG.singleton "SDL_SCANCODE_KP_OCTAL")
+        , (220, BG.singleton "SDL_SCANCODE_KP_DECIMAL")
+        , (221, BG.singleton "SDL_SCANCODE_KP_HEXADECIMAL")
+        , (224, BG.singleton "SDL_SCANCODE_LCTRL")
+        , (225, BG.singleton "SDL_SCANCODE_LSHIFT")
+        , (226, BG.singleton "SDL_SCANCODE_LALT")
+        , (227, BG.singleton "SDL_SCANCODE_LGUI")
+        , (228, BG.singleton "SDL_SCANCODE_RCTRL")
+        , (229, BG.singleton "SDL_SCANCODE_RSHIFT")
+        , (230, BG.singleton "SDL_SCANCODE_RALT")
+        , (231, BG.singleton "SDL_SCANCODE_RGUI")
+        , (257, BG.singleton "SDL_SCANCODE_MODE")
+        , (258, BG.singleton "SDL_SCANCODE_SLEEP")
+        , (259, BG.singleton "SDL_SCANCODE_WAKE")
+        , (260, BG.singleton "SDL_SCANCODE_CHANNEL_INCREMENT")
+        , (261, BG.singleton "SDL_SCANCODE_CHANNEL_DECREMENT")
+        , (262, BG.singleton "SDL_SCANCODE_MEDIA_PLAY")
+        , (263, BG.singleton "SDL_SCANCODE_MEDIA_PAUSE")
+        , (264, BG.singleton "SDL_SCANCODE_MEDIA_RECORD")
+        , (265, BG.singleton "SDL_SCANCODE_MEDIA_FAST_FORWARD")
+        , (266, BG.singleton "SDL_SCANCODE_MEDIA_REWIND")
+        , (267, BG.singleton "SDL_SCANCODE_MEDIA_NEXT_TRACK")
+        , (268, BG.singleton "SDL_SCANCODE_MEDIA_PREVIOUS_TRACK")
+        , (269, BG.singleton "SDL_SCANCODE_MEDIA_STOP")
+        , (270, BG.singleton "SDL_SCANCODE_MEDIA_EJECT")
+        , (271, BG.singleton "SDL_SCANCODE_MEDIA_PLAY_PAUSE")
+        , (272, BG.singleton "SDL_SCANCODE_MEDIA_SELECT")
+        , (273, BG.singleton "SDL_SCANCODE_AC_NEW")
+        , (274, BG.singleton "SDL_SCANCODE_AC_OPEN")
+        , (275, BG.singleton "SDL_SCANCODE_AC_CLOSE")
+        , (276, BG.singleton "SDL_SCANCODE_AC_EXIT")
+        , (277, BG.singleton "SDL_SCANCODE_AC_SAVE")
+        , (278, BG.singleton "SDL_SCANCODE_AC_PRINT")
+        , (279, BG.singleton "SDL_SCANCODE_AC_PROPERTIES")
+        , (280, BG.singleton "SDL_SCANCODE_AC_SEARCH")
+        , (281, BG.singleton "SDL_SCANCODE_AC_HOME")
+        , (282, BG.singleton "SDL_SCANCODE_AC_BACK")
+        , (283, BG.singleton "SDL_SCANCODE_AC_FORWARD")
+        , (284, BG.singleton "SDL_SCANCODE_AC_STOP")
+        , (285, BG.singleton "SDL_SCANCODE_AC_REFRESH")
+        , (286, BG.singleton "SDL_SCANCODE_AC_BOOKMARKS")
+        , (287, BG.singleton "SDL_SCANCODE_SOFTLEFT")
+        , (288, BG.singleton "SDL_SCANCODE_SOFTRIGHT")
+        , (289, BG.singleton "SDL_SCANCODE_CALL")
+        , (290, BG.singleton "SDL_SCANCODE_ENDCALL")
+        , (400, BG.singleton "SDL_SCANCODE_RESERVED")
+        , (512, BG.singleton "SDL_SCANCODE_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_Scancode"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_Scancode"
+
+instance Show SDL_Scancode where
+  showsPrec = CEnum.shows
+
+instance Read SDL_Scancode where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_Scancode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Scancode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_Scancode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_Scancode "unwrap" where
+  type CFieldType SDL_Scancode "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_SCANCODE_UNKNOWN@, defined at @SDL3\/SDL_scancode.h 54:5@
+pattern SDL_SCANCODE_UNKNOWN :: SDL_Scancode
+pattern SDL_SCANCODE_UNKNOWN = SDL_Scancode 0
+
+-- | [C declaration]: @SDL_SCANCODE_A@, defined at @SDL3\/SDL_scancode.h 63:5@
+pattern SDL_SCANCODE_A :: SDL_Scancode
+pattern SDL_SCANCODE_A = SDL_Scancode 4
+
+-- | [C declaration]: @SDL_SCANCODE_B@, defined at @SDL3\/SDL_scancode.h 64:5@
+pattern SDL_SCANCODE_B :: SDL_Scancode
+pattern SDL_SCANCODE_B = SDL_Scancode 5
+
+-- | [C declaration]: @SDL_SCANCODE_C@, defined at @SDL3\/SDL_scancode.h 65:5@
+pattern SDL_SCANCODE_C :: SDL_Scancode
+pattern SDL_SCANCODE_C = SDL_Scancode 6
+
+-- | [C declaration]: @SDL_SCANCODE_D@, defined at @SDL3\/SDL_scancode.h 66:5@
+pattern SDL_SCANCODE_D :: SDL_Scancode
+pattern SDL_SCANCODE_D = SDL_Scancode 7
+
+-- | [C declaration]: @SDL_SCANCODE_E@, defined at @SDL3\/SDL_scancode.h 67:5@
+pattern SDL_SCANCODE_E :: SDL_Scancode
+pattern SDL_SCANCODE_E = SDL_Scancode 8
+
+-- | [C declaration]: @SDL_SCANCODE_F@, defined at @SDL3\/SDL_scancode.h 68:5@
+pattern SDL_SCANCODE_F :: SDL_Scancode
+pattern SDL_SCANCODE_F = SDL_Scancode 9
+
+-- | [C declaration]: @SDL_SCANCODE_G@, defined at @SDL3\/SDL_scancode.h 69:5@
+pattern SDL_SCANCODE_G :: SDL_Scancode
+pattern SDL_SCANCODE_G = SDL_Scancode 10
+
+-- | [C declaration]: @SDL_SCANCODE_H@, defined at @SDL3\/SDL_scancode.h 70:5@
+pattern SDL_SCANCODE_H :: SDL_Scancode
+pattern SDL_SCANCODE_H = SDL_Scancode 11
+
+-- | [C declaration]: @SDL_SCANCODE_I@, defined at @SDL3\/SDL_scancode.h 71:5@
+pattern SDL_SCANCODE_I :: SDL_Scancode
+pattern SDL_SCANCODE_I = SDL_Scancode 12
+
+-- | [C declaration]: @SDL_SCANCODE_J@, defined at @SDL3\/SDL_scancode.h 72:5@
+pattern SDL_SCANCODE_J :: SDL_Scancode
+pattern SDL_SCANCODE_J = SDL_Scancode 13
+
+-- | [C declaration]: @SDL_SCANCODE_K@, defined at @SDL3\/SDL_scancode.h 73:5@
+pattern SDL_SCANCODE_K :: SDL_Scancode
+pattern SDL_SCANCODE_K = SDL_Scancode 14
+
+-- | [C declaration]: @SDL_SCANCODE_L@, defined at @SDL3\/SDL_scancode.h 74:5@
+pattern SDL_SCANCODE_L :: SDL_Scancode
+pattern SDL_SCANCODE_L = SDL_Scancode 15
+
+-- | [C declaration]: @SDL_SCANCODE_M@, defined at @SDL3\/SDL_scancode.h 75:5@
+pattern SDL_SCANCODE_M :: SDL_Scancode
+pattern SDL_SCANCODE_M = SDL_Scancode 16
+
+-- | [C declaration]: @SDL_SCANCODE_N@, defined at @SDL3\/SDL_scancode.h 76:5@
+pattern SDL_SCANCODE_N :: SDL_Scancode
+pattern SDL_SCANCODE_N = SDL_Scancode 17
+
+-- | [C declaration]: @SDL_SCANCODE_O@, defined at @SDL3\/SDL_scancode.h 77:5@
+pattern SDL_SCANCODE_O :: SDL_Scancode
+pattern SDL_SCANCODE_O = SDL_Scancode 18
+
+-- | [C declaration]: @SDL_SCANCODE_P@, defined at @SDL3\/SDL_scancode.h 78:5@
+pattern SDL_SCANCODE_P :: SDL_Scancode
+pattern SDL_SCANCODE_P = SDL_Scancode 19
+
+-- | [C declaration]: @SDL_SCANCODE_Q@, defined at @SDL3\/SDL_scancode.h 79:5@
+pattern SDL_SCANCODE_Q :: SDL_Scancode
+pattern SDL_SCANCODE_Q = SDL_Scancode 20
+
+-- | [C declaration]: @SDL_SCANCODE_R@, defined at @SDL3\/SDL_scancode.h 80:5@
+pattern SDL_SCANCODE_R :: SDL_Scancode
+pattern SDL_SCANCODE_R = SDL_Scancode 21
+
+-- | [C declaration]: @SDL_SCANCODE_S@, defined at @SDL3\/SDL_scancode.h 81:5@
+pattern SDL_SCANCODE_S :: SDL_Scancode
+pattern SDL_SCANCODE_S = SDL_Scancode 22
+
+-- | [C declaration]: @SDL_SCANCODE_T@, defined at @SDL3\/SDL_scancode.h 82:5@
+pattern SDL_SCANCODE_T :: SDL_Scancode
+pattern SDL_SCANCODE_T = SDL_Scancode 23
+
+-- | [C declaration]: @SDL_SCANCODE_U@, defined at @SDL3\/SDL_scancode.h 83:5@
+pattern SDL_SCANCODE_U :: SDL_Scancode
+pattern SDL_SCANCODE_U = SDL_Scancode 24
+
+-- | [C declaration]: @SDL_SCANCODE_V@, defined at @SDL3\/SDL_scancode.h 84:5@
+pattern SDL_SCANCODE_V :: SDL_Scancode
+pattern SDL_SCANCODE_V = SDL_Scancode 25
+
+-- | [C declaration]: @SDL_SCANCODE_W@, defined at @SDL3\/SDL_scancode.h 85:5@
+pattern SDL_SCANCODE_W :: SDL_Scancode
+pattern SDL_SCANCODE_W = SDL_Scancode 26
+
+-- | [C declaration]: @SDL_SCANCODE_X@, defined at @SDL3\/SDL_scancode.h 86:5@
+pattern SDL_SCANCODE_X :: SDL_Scancode
+pattern SDL_SCANCODE_X = SDL_Scancode 27
+
+-- | [C declaration]: @SDL_SCANCODE_Y@, defined at @SDL3\/SDL_scancode.h 87:5@
+pattern SDL_SCANCODE_Y :: SDL_Scancode
+pattern SDL_SCANCODE_Y = SDL_Scancode 28
+
+-- | [C declaration]: @SDL_SCANCODE_Z@, defined at @SDL3\/SDL_scancode.h 88:5@
+pattern SDL_SCANCODE_Z :: SDL_Scancode
+pattern SDL_SCANCODE_Z = SDL_Scancode 29
+
+-- | [C declaration]: @SDL_SCANCODE_1@, defined at @SDL3\/SDL_scancode.h 90:5@
+pattern SDL_SCANCODE_1 :: SDL_Scancode
+pattern SDL_SCANCODE_1 = SDL_Scancode 30
+
+-- | [C declaration]: @SDL_SCANCODE_2@, defined at @SDL3\/SDL_scancode.h 91:5@
+pattern SDL_SCANCODE_2 :: SDL_Scancode
+pattern SDL_SCANCODE_2 = SDL_Scancode 31
+
+-- | [C declaration]: @SDL_SCANCODE_3@, defined at @SDL3\/SDL_scancode.h 92:5@
+pattern SDL_SCANCODE_3 :: SDL_Scancode
+pattern SDL_SCANCODE_3 = SDL_Scancode 32
+
+-- | [C declaration]: @SDL_SCANCODE_4@, defined at @SDL3\/SDL_scancode.h 93:5@
+pattern SDL_SCANCODE_4 :: SDL_Scancode
+pattern SDL_SCANCODE_4 = SDL_Scancode 33
+
+-- | [C declaration]: @SDL_SCANCODE_5@, defined at @SDL3\/SDL_scancode.h 94:5@
+pattern SDL_SCANCODE_5 :: SDL_Scancode
+pattern SDL_SCANCODE_5 = SDL_Scancode 34
+
+-- | [C declaration]: @SDL_SCANCODE_6@, defined at @SDL3\/SDL_scancode.h 95:5@
+pattern SDL_SCANCODE_6 :: SDL_Scancode
+pattern SDL_SCANCODE_6 = SDL_Scancode 35
+
+-- | [C declaration]: @SDL_SCANCODE_7@, defined at @SDL3\/SDL_scancode.h 96:5@
+pattern SDL_SCANCODE_7 :: SDL_Scancode
+pattern SDL_SCANCODE_7 = SDL_Scancode 36
+
+-- | [C declaration]: @SDL_SCANCODE_8@, defined at @SDL3\/SDL_scancode.h 97:5@
+pattern SDL_SCANCODE_8 :: SDL_Scancode
+pattern SDL_SCANCODE_8 = SDL_Scancode 37
+
+-- | [C declaration]: @SDL_SCANCODE_9@, defined at @SDL3\/SDL_scancode.h 98:5@
+pattern SDL_SCANCODE_9 :: SDL_Scancode
+pattern SDL_SCANCODE_9 = SDL_Scancode 38
+
+-- | [C declaration]: @SDL_SCANCODE_0@, defined at @SDL3\/SDL_scancode.h 99:5@
+pattern SDL_SCANCODE_0 :: SDL_Scancode
+pattern SDL_SCANCODE_0 = SDL_Scancode 39
+
+-- | [C declaration]: @SDL_SCANCODE_RETURN@, defined at @SDL3\/SDL_scancode.h 101:5@
+pattern SDL_SCANCODE_RETURN :: SDL_Scancode
+pattern SDL_SCANCODE_RETURN = SDL_Scancode 40
+
+-- | [C declaration]: @SDL_SCANCODE_ESCAPE@, defined at @SDL3\/SDL_scancode.h 102:5@
+pattern SDL_SCANCODE_ESCAPE :: SDL_Scancode
+pattern SDL_SCANCODE_ESCAPE = SDL_Scancode 41
+
+-- | [C declaration]: @SDL_SCANCODE_BACKSPACE@, defined at @SDL3\/SDL_scancode.h 103:5@
+pattern SDL_SCANCODE_BACKSPACE :: SDL_Scancode
+pattern SDL_SCANCODE_BACKSPACE = SDL_Scancode 42
+
+-- | [C declaration]: @SDL_SCANCODE_TAB@, defined at @SDL3\/SDL_scancode.h 104:5@
+pattern SDL_SCANCODE_TAB :: SDL_Scancode
+pattern SDL_SCANCODE_TAB = SDL_Scancode 43
+
+-- | [C declaration]: @SDL_SCANCODE_SPACE@, defined at @SDL3\/SDL_scancode.h 105:5@
+pattern SDL_SCANCODE_SPACE :: SDL_Scancode
+pattern SDL_SCANCODE_SPACE = SDL_Scancode 44
+
+-- | [C declaration]: @SDL_SCANCODE_MINUS@, defined at @SDL3\/SDL_scancode.h 107:5@
+pattern SDL_SCANCODE_MINUS :: SDL_Scancode
+pattern SDL_SCANCODE_MINUS = SDL_Scancode 45
+
+-- | [C declaration]: @SDL_SCANCODE_EQUALS@, defined at @SDL3\/SDL_scancode.h 108:5@
+pattern SDL_SCANCODE_EQUALS :: SDL_Scancode
+pattern SDL_SCANCODE_EQUALS = SDL_Scancode 46
+
+-- | [C declaration]: @SDL_SCANCODE_LEFTBRACKET@, defined at @SDL3\/SDL_scancode.h 109:5@
+pattern SDL_SCANCODE_LEFTBRACKET :: SDL_Scancode
+pattern SDL_SCANCODE_LEFTBRACKET = SDL_Scancode 47
+
+-- | [C declaration]: @SDL_SCANCODE_RIGHTBRACKET@, defined at @SDL3\/SDL_scancode.h 110:5@
+pattern SDL_SCANCODE_RIGHTBRACKET :: SDL_Scancode
+pattern SDL_SCANCODE_RIGHTBRACKET = SDL_Scancode 48
+
+-- | Located at the lower left of the return key on ISO keyboards and at the right end of the QWERTY row on ANSI keyboards. Produces REVERSE SOLIDUS (backslash) and VERTICAL LINE in a US layout, REVERSE SOLIDUS and VERTICAL LINE in a UK Mac layout, NUMBER SIGN and TILDE in a UK Windows layout, DOLLAR SIGN and POUND SIGN in a Swiss German layout, NUMBER SIGN and APOSTROPHE in a German layout, GRAVE ACCENT and POUND SIGN in a French Mac layout, and ASTERISK and MICRO SIGN in a French Windows layout.
+--
+--     [C declaration]: @SDL_SCANCODE_BACKSLASH@, defined at @SDL3\/SDL_scancode.h 111:5@
+pattern SDL_SCANCODE_BACKSLASH :: SDL_Scancode
+pattern SDL_SCANCODE_BACKSLASH = SDL_Scancode 49
+
+-- | ISO USB keyboards actually use this code instead of 49 for the same key, but all OSes I\'ve seen treat the two codes identically. So, as an implementor, unless your keyboard generates both of those codes and your OS treats them differently, you should generate SDL_SCANCODE_BACKSLASH instead of this code. As a user, you should not rely on this code because SDL will never generate it with most (all?) keyboards.
+--
+--     [C declaration]: @SDL_SCANCODE_NONUSHASH@, defined at @SDL3\/SDL_scancode.h 125:5@
+pattern SDL_SCANCODE_NONUSHASH :: SDL_Scancode
+pattern SDL_SCANCODE_NONUSHASH = SDL_Scancode 50
+
+-- | [C declaration]: @SDL_SCANCODE_SEMICOLON@, defined at @SDL3\/SDL_scancode.h 137:5@
+pattern SDL_SCANCODE_SEMICOLON :: SDL_Scancode
+pattern SDL_SCANCODE_SEMICOLON = SDL_Scancode 51
+
+-- | [C declaration]: @SDL_SCANCODE_APOSTROPHE@, defined at @SDL3\/SDL_scancode.h 138:5@
+pattern SDL_SCANCODE_APOSTROPHE :: SDL_Scancode
+pattern SDL_SCANCODE_APOSTROPHE = SDL_Scancode 52
+
+-- | Located in the top left corner (on both ANSI and ISO keyboards). Produces GRAVE ACCENT and TILDE in a US Windows layout and in US and UK Mac layouts on ANSI keyboards, GRAVE ACCENT and NOT SIGN in a UK Windows layout, SECTION SIGN and PLUS-MINUS SIGN in US and UK Mac layouts on ISO keyboards, SECTION SIGN and DEGREE SIGN in a Swiss German layout (Mac: only on ISO keyboards), CIRCUMFLEX ACCENT and DEGREE SIGN in a German layout (Mac: only on ISO keyboards), SUPERSCRIPT TWO and TILDE in a French Windows layout, COMMERCIAL AT and NUMBER SIGN in a French Mac layout on ISO keyboards, and LESS-THAN SIGN and GREATER-THAN SIGN in a Swiss German, German, or French Mac layout on ANSI keyboards.
+--
+--     [C declaration]: @SDL_SCANCODE_GRAVE@, defined at @SDL3\/SDL_scancode.h 139:5@
+pattern SDL_SCANCODE_GRAVE :: SDL_Scancode
+pattern SDL_SCANCODE_GRAVE = SDL_Scancode 53
+
+-- | [C declaration]: @SDL_SCANCODE_COMMA@, defined at @SDL3\/SDL_scancode.h 156:5@
+pattern SDL_SCANCODE_COMMA :: SDL_Scancode
+pattern SDL_SCANCODE_COMMA = SDL_Scancode 54
+
+-- | [C declaration]: @SDL_SCANCODE_PERIOD@, defined at @SDL3\/SDL_scancode.h 157:5@
+pattern SDL_SCANCODE_PERIOD :: SDL_Scancode
+pattern SDL_SCANCODE_PERIOD = SDL_Scancode 55
+
+-- | [C declaration]: @SDL_SCANCODE_SLASH@, defined at @SDL3\/SDL_scancode.h 158:5@
+pattern SDL_SCANCODE_SLASH :: SDL_Scancode
+pattern SDL_SCANCODE_SLASH = SDL_Scancode 56
+
+-- | [C declaration]: @SDL_SCANCODE_CAPSLOCK@, defined at @SDL3\/SDL_scancode.h 160:5@
+pattern SDL_SCANCODE_CAPSLOCK :: SDL_Scancode
+pattern SDL_SCANCODE_CAPSLOCK = SDL_Scancode 57
+
+-- | [C declaration]: @SDL_SCANCODE_F1@, defined at @SDL3\/SDL_scancode.h 162:5@
+pattern SDL_SCANCODE_F1 :: SDL_Scancode
+pattern SDL_SCANCODE_F1 = SDL_Scancode 58
+
+-- | [C declaration]: @SDL_SCANCODE_F2@, defined at @SDL3\/SDL_scancode.h 163:5@
+pattern SDL_SCANCODE_F2 :: SDL_Scancode
+pattern SDL_SCANCODE_F2 = SDL_Scancode 59
+
+-- | [C declaration]: @SDL_SCANCODE_F3@, defined at @SDL3\/SDL_scancode.h 164:5@
+pattern SDL_SCANCODE_F3 :: SDL_Scancode
+pattern SDL_SCANCODE_F3 = SDL_Scancode 60
+
+-- | [C declaration]: @SDL_SCANCODE_F4@, defined at @SDL3\/SDL_scancode.h 165:5@
+pattern SDL_SCANCODE_F4 :: SDL_Scancode
+pattern SDL_SCANCODE_F4 = SDL_Scancode 61
+
+-- | [C declaration]: @SDL_SCANCODE_F5@, defined at @SDL3\/SDL_scancode.h 166:5@
+pattern SDL_SCANCODE_F5 :: SDL_Scancode
+pattern SDL_SCANCODE_F5 = SDL_Scancode 62
+
+-- | [C declaration]: @SDL_SCANCODE_F6@, defined at @SDL3\/SDL_scancode.h 167:5@
+pattern SDL_SCANCODE_F6 :: SDL_Scancode
+pattern SDL_SCANCODE_F6 = SDL_Scancode 63
+
+-- | [C declaration]: @SDL_SCANCODE_F7@, defined at @SDL3\/SDL_scancode.h 168:5@
+pattern SDL_SCANCODE_F7 :: SDL_Scancode
+pattern SDL_SCANCODE_F7 = SDL_Scancode 64
+
+-- | [C declaration]: @SDL_SCANCODE_F8@, defined at @SDL3\/SDL_scancode.h 169:5@
+pattern SDL_SCANCODE_F8 :: SDL_Scancode
+pattern SDL_SCANCODE_F8 = SDL_Scancode 65
+
+-- | [C declaration]: @SDL_SCANCODE_F9@, defined at @SDL3\/SDL_scancode.h 170:5@
+pattern SDL_SCANCODE_F9 :: SDL_Scancode
+pattern SDL_SCANCODE_F9 = SDL_Scancode 66
+
+-- | [C declaration]: @SDL_SCANCODE_F10@, defined at @SDL3\/SDL_scancode.h 171:5@
+pattern SDL_SCANCODE_F10 :: SDL_Scancode
+pattern SDL_SCANCODE_F10 = SDL_Scancode 67
+
+-- | [C declaration]: @SDL_SCANCODE_F11@, defined at @SDL3\/SDL_scancode.h 172:5@
+pattern SDL_SCANCODE_F11 :: SDL_Scancode
+pattern SDL_SCANCODE_F11 = SDL_Scancode 68
+
+-- | [C declaration]: @SDL_SCANCODE_F12@, defined at @SDL3\/SDL_scancode.h 173:5@
+pattern SDL_SCANCODE_F12 :: SDL_Scancode
+pattern SDL_SCANCODE_F12 = SDL_Scancode 69
+
+-- | [C declaration]: @SDL_SCANCODE_PRINTSCREEN@, defined at @SDL3\/SDL_scancode.h 175:5@
+pattern SDL_SCANCODE_PRINTSCREEN :: SDL_Scancode
+pattern SDL_SCANCODE_PRINTSCREEN = SDL_Scancode 70
+
+-- | [C declaration]: @SDL_SCANCODE_SCROLLLOCK@, defined at @SDL3\/SDL_scancode.h 176:5@
+pattern SDL_SCANCODE_SCROLLLOCK :: SDL_Scancode
+pattern SDL_SCANCODE_SCROLLLOCK = SDL_Scancode 71
+
+-- | [C declaration]: @SDL_SCANCODE_PAUSE@, defined at @SDL3\/SDL_scancode.h 177:5@
+pattern SDL_SCANCODE_PAUSE :: SDL_Scancode
+pattern SDL_SCANCODE_PAUSE = SDL_Scancode 72
+
+-- | insert on PC, help on some Mac keyboards (but does send code 73, not 117)
+--
+--     [C declaration]: @SDL_SCANCODE_INSERT@, defined at @SDL3\/SDL_scancode.h 178:5@
+pattern SDL_SCANCODE_INSERT :: SDL_Scancode
+pattern SDL_SCANCODE_INSERT = SDL_Scancode 73
+
+-- | [C declaration]: @SDL_SCANCODE_HOME@, defined at @SDL3\/SDL_scancode.h 180:5@
+pattern SDL_SCANCODE_HOME :: SDL_Scancode
+pattern SDL_SCANCODE_HOME = SDL_Scancode 74
+
+-- | [C declaration]: @SDL_SCANCODE_PAGEUP@, defined at @SDL3\/SDL_scancode.h 181:5@
+pattern SDL_SCANCODE_PAGEUP :: SDL_Scancode
+pattern SDL_SCANCODE_PAGEUP = SDL_Scancode 75
+
+-- | [C declaration]: @SDL_SCANCODE_DELETE@, defined at @SDL3\/SDL_scancode.h 182:5@
+pattern SDL_SCANCODE_DELETE :: SDL_Scancode
+pattern SDL_SCANCODE_DELETE = SDL_Scancode 76
+
+-- | [C declaration]: @SDL_SCANCODE_END@, defined at @SDL3\/SDL_scancode.h 183:5@
+pattern SDL_SCANCODE_END :: SDL_Scancode
+pattern SDL_SCANCODE_END = SDL_Scancode 77
+
+-- | [C declaration]: @SDL_SCANCODE_PAGEDOWN@, defined at @SDL3\/SDL_scancode.h 184:5@
+pattern SDL_SCANCODE_PAGEDOWN :: SDL_Scancode
+pattern SDL_SCANCODE_PAGEDOWN = SDL_Scancode 78
+
+-- | [C declaration]: @SDL_SCANCODE_RIGHT@, defined at @SDL3\/SDL_scancode.h 185:5@
+pattern SDL_SCANCODE_RIGHT :: SDL_Scancode
+pattern SDL_SCANCODE_RIGHT = SDL_Scancode 79
+
+-- | [C declaration]: @SDL_SCANCODE_LEFT@, defined at @SDL3\/SDL_scancode.h 186:5@
+pattern SDL_SCANCODE_LEFT :: SDL_Scancode
+pattern SDL_SCANCODE_LEFT = SDL_Scancode 80
+
+-- | [C declaration]: @SDL_SCANCODE_DOWN@, defined at @SDL3\/SDL_scancode.h 187:5@
+pattern SDL_SCANCODE_DOWN :: SDL_Scancode
+pattern SDL_SCANCODE_DOWN = SDL_Scancode 81
+
+-- | [C declaration]: @SDL_SCANCODE_UP@, defined at @SDL3\/SDL_scancode.h 188:5@
+pattern SDL_SCANCODE_UP :: SDL_Scancode
+pattern SDL_SCANCODE_UP = SDL_Scancode 82
+
+-- | num lock on PC, clear on Mac keyboards
+--
+--     [C declaration]: @SDL_SCANCODE_NUMLOCKCLEAR@, defined at @SDL3\/SDL_scancode.h 190:5@
+pattern SDL_SCANCODE_NUMLOCKCLEAR :: SDL_Scancode
+pattern SDL_SCANCODE_NUMLOCKCLEAR = SDL_Scancode 83
+
+-- | [C declaration]: @SDL_SCANCODE_KP_DIVIDE@, defined at @SDL3\/SDL_scancode.h 192:5@
+pattern SDL_SCANCODE_KP_DIVIDE :: SDL_Scancode
+pattern SDL_SCANCODE_KP_DIVIDE = SDL_Scancode 84
+
+-- | [C declaration]: @SDL_SCANCODE_KP_MULTIPLY@, defined at @SDL3\/SDL_scancode.h 193:5@
+pattern SDL_SCANCODE_KP_MULTIPLY :: SDL_Scancode
+pattern SDL_SCANCODE_KP_MULTIPLY = SDL_Scancode 85
+
+-- | [C declaration]: @SDL_SCANCODE_KP_MINUS@, defined at @SDL3\/SDL_scancode.h 194:5@
+pattern SDL_SCANCODE_KP_MINUS :: SDL_Scancode
+pattern SDL_SCANCODE_KP_MINUS = SDL_Scancode 86
+
+-- | [C declaration]: @SDL_SCANCODE_KP_PLUS@, defined at @SDL3\/SDL_scancode.h 195:5@
+pattern SDL_SCANCODE_KP_PLUS :: SDL_Scancode
+pattern SDL_SCANCODE_KP_PLUS = SDL_Scancode 87
+
+-- | [C declaration]: @SDL_SCANCODE_KP_ENTER@, defined at @SDL3\/SDL_scancode.h 196:5@
+pattern SDL_SCANCODE_KP_ENTER :: SDL_Scancode
+pattern SDL_SCANCODE_KP_ENTER = SDL_Scancode 88
+
+-- | [C declaration]: @SDL_SCANCODE_KP_1@, defined at @SDL3\/SDL_scancode.h 197:5@
+pattern SDL_SCANCODE_KP_1 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_1 = SDL_Scancode 89
+
+-- | [C declaration]: @SDL_SCANCODE_KP_2@, defined at @SDL3\/SDL_scancode.h 198:5@
+pattern SDL_SCANCODE_KP_2 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_2 = SDL_Scancode 90
+
+-- | [C declaration]: @SDL_SCANCODE_KP_3@, defined at @SDL3\/SDL_scancode.h 199:5@
+pattern SDL_SCANCODE_KP_3 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_3 = SDL_Scancode 91
+
+-- | [C declaration]: @SDL_SCANCODE_KP_4@, defined at @SDL3\/SDL_scancode.h 200:5@
+pattern SDL_SCANCODE_KP_4 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_4 = SDL_Scancode 92
+
+-- | [C declaration]: @SDL_SCANCODE_KP_5@, defined at @SDL3\/SDL_scancode.h 201:5@
+pattern SDL_SCANCODE_KP_5 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_5 = SDL_Scancode 93
+
+-- | [C declaration]: @SDL_SCANCODE_KP_6@, defined at @SDL3\/SDL_scancode.h 202:5@
+pattern SDL_SCANCODE_KP_6 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_6 = SDL_Scancode 94
+
+-- | [C declaration]: @SDL_SCANCODE_KP_7@, defined at @SDL3\/SDL_scancode.h 203:5@
+pattern SDL_SCANCODE_KP_7 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_7 = SDL_Scancode 95
+
+-- | [C declaration]: @SDL_SCANCODE_KP_8@, defined at @SDL3\/SDL_scancode.h 204:5@
+pattern SDL_SCANCODE_KP_8 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_8 = SDL_Scancode 96
+
+-- | [C declaration]: @SDL_SCANCODE_KP_9@, defined at @SDL3\/SDL_scancode.h 205:5@
+pattern SDL_SCANCODE_KP_9 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_9 = SDL_Scancode 97
+
+-- | [C declaration]: @SDL_SCANCODE_KP_0@, defined at @SDL3\/SDL_scancode.h 206:5@
+pattern SDL_SCANCODE_KP_0 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_0 = SDL_Scancode 98
+
+-- | [C declaration]: @SDL_SCANCODE_KP_PERIOD@, defined at @SDL3\/SDL_scancode.h 207:5@
+pattern SDL_SCANCODE_KP_PERIOD :: SDL_Scancode
+pattern SDL_SCANCODE_KP_PERIOD = SDL_Scancode 99
+
+-- | This is the additional key that ISO keyboards have over ANSI ones, located between left shift and Z. Produces GRAVE ACCENT and TILDE in a US or UK Mac layout, REVERSE SOLIDUS (backslash) and VERTICAL LINE in a US or UK Windows layout, and LESS-THAN SIGN and GREATER-THAN SIGN in a Swiss German, German, or French layout.
+--
+--     [C declaration]: @SDL_SCANCODE_NONUSBACKSLASH@, defined at @SDL3\/SDL_scancode.h 209:5@
+pattern SDL_SCANCODE_NONUSBACKSLASH :: SDL_Scancode
+pattern SDL_SCANCODE_NONUSBACKSLASH = SDL_Scancode 100
+
+-- | windows contextual menu, compose
+--
+--     [C declaration]: @SDL_SCANCODE_APPLICATION@, defined at @SDL3\/SDL_scancode.h 219:5@
+pattern SDL_SCANCODE_APPLICATION :: SDL_Scancode
+pattern SDL_SCANCODE_APPLICATION = SDL_Scancode 101
+
+-- | The USB document says this is a status flag, not a physical key - but some Mac keyboards do have a power key.
+--
+--     [C declaration]: @SDL_SCANCODE_POWER@, defined at @SDL3\/SDL_scancode.h 220:5@
+pattern SDL_SCANCODE_POWER :: SDL_Scancode
+pattern SDL_SCANCODE_POWER = SDL_Scancode 102
+
+-- | [C declaration]: @SDL_SCANCODE_KP_EQUALS@, defined at @SDL3\/SDL_scancode.h 223:5@
+pattern SDL_SCANCODE_KP_EQUALS :: SDL_Scancode
+pattern SDL_SCANCODE_KP_EQUALS = SDL_Scancode 103
+
+-- | [C declaration]: @SDL_SCANCODE_F13@, defined at @SDL3\/SDL_scancode.h 224:5@
+pattern SDL_SCANCODE_F13 :: SDL_Scancode
+pattern SDL_SCANCODE_F13 = SDL_Scancode 104
+
+-- | [C declaration]: @SDL_SCANCODE_F14@, defined at @SDL3\/SDL_scancode.h 225:5@
+pattern SDL_SCANCODE_F14 :: SDL_Scancode
+pattern SDL_SCANCODE_F14 = SDL_Scancode 105
+
+-- | [C declaration]: @SDL_SCANCODE_F15@, defined at @SDL3\/SDL_scancode.h 226:5@
+pattern SDL_SCANCODE_F15 :: SDL_Scancode
+pattern SDL_SCANCODE_F15 = SDL_Scancode 106
+
+-- | [C declaration]: @SDL_SCANCODE_F16@, defined at @SDL3\/SDL_scancode.h 227:5@
+pattern SDL_SCANCODE_F16 :: SDL_Scancode
+pattern SDL_SCANCODE_F16 = SDL_Scancode 107
+
+-- | [C declaration]: @SDL_SCANCODE_F17@, defined at @SDL3\/SDL_scancode.h 228:5@
+pattern SDL_SCANCODE_F17 :: SDL_Scancode
+pattern SDL_SCANCODE_F17 = SDL_Scancode 108
+
+-- | [C declaration]: @SDL_SCANCODE_F18@, defined at @SDL3\/SDL_scancode.h 229:5@
+pattern SDL_SCANCODE_F18 :: SDL_Scancode
+pattern SDL_SCANCODE_F18 = SDL_Scancode 109
+
+-- | [C declaration]: @SDL_SCANCODE_F19@, defined at @SDL3\/SDL_scancode.h 230:5@
+pattern SDL_SCANCODE_F19 :: SDL_Scancode
+pattern SDL_SCANCODE_F19 = SDL_Scancode 110
+
+-- | [C declaration]: @SDL_SCANCODE_F20@, defined at @SDL3\/SDL_scancode.h 231:5@
+pattern SDL_SCANCODE_F20 :: SDL_Scancode
+pattern SDL_SCANCODE_F20 = SDL_Scancode 111
+
+-- | [C declaration]: @SDL_SCANCODE_F21@, defined at @SDL3\/SDL_scancode.h 232:5@
+pattern SDL_SCANCODE_F21 :: SDL_Scancode
+pattern SDL_SCANCODE_F21 = SDL_Scancode 112
+
+-- | [C declaration]: @SDL_SCANCODE_F22@, defined at @SDL3\/SDL_scancode.h 233:5@
+pattern SDL_SCANCODE_F22 :: SDL_Scancode
+pattern SDL_SCANCODE_F22 = SDL_Scancode 113
+
+-- | [C declaration]: @SDL_SCANCODE_F23@, defined at @SDL3\/SDL_scancode.h 234:5@
+pattern SDL_SCANCODE_F23 :: SDL_Scancode
+pattern SDL_SCANCODE_F23 = SDL_Scancode 114
+
+-- | [C declaration]: @SDL_SCANCODE_F24@, defined at @SDL3\/SDL_scancode.h 235:5@
+pattern SDL_SCANCODE_F24 :: SDL_Scancode
+pattern SDL_SCANCODE_F24 = SDL_Scancode 115
+
+-- | [C declaration]: @SDL_SCANCODE_EXECUTE@, defined at @SDL3\/SDL_scancode.h 236:5@
+pattern SDL_SCANCODE_EXECUTE :: SDL_Scancode
+pattern SDL_SCANCODE_EXECUTE = SDL_Scancode 116
+
+-- | AL Integrated Help Center
+--
+--     [C declaration]: @SDL_SCANCODE_HELP@, defined at @SDL3\/SDL_scancode.h 237:5@
+pattern SDL_SCANCODE_HELP :: SDL_Scancode
+pattern SDL_SCANCODE_HELP = SDL_Scancode 117
+
+-- | Menu (show menu)
+--
+--     [C declaration]: @SDL_SCANCODE_MENU@, defined at @SDL3\/SDL_scancode.h 238:5@
+pattern SDL_SCANCODE_MENU :: SDL_Scancode
+pattern SDL_SCANCODE_MENU = SDL_Scancode 118
+
+-- | [C declaration]: @SDL_SCANCODE_SELECT@, defined at @SDL3\/SDL_scancode.h 239:5@
+pattern SDL_SCANCODE_SELECT :: SDL_Scancode
+pattern SDL_SCANCODE_SELECT = SDL_Scancode 119
+
+-- | AC Stop
+--
+--     [C declaration]: @SDL_SCANCODE_STOP@, defined at @SDL3\/SDL_scancode.h 240:5@
+pattern SDL_SCANCODE_STOP :: SDL_Scancode
+pattern SDL_SCANCODE_STOP = SDL_Scancode 120
+
+-- | AC Redo\/Repeat
+--
+--     [C declaration]: @SDL_SCANCODE_AGAIN@, defined at @SDL3\/SDL_scancode.h 241:5@
+pattern SDL_SCANCODE_AGAIN :: SDL_Scancode
+pattern SDL_SCANCODE_AGAIN = SDL_Scancode 121
+
+-- | AC Undo
+--
+--     [C declaration]: @SDL_SCANCODE_UNDO@, defined at @SDL3\/SDL_scancode.h 242:5@
+pattern SDL_SCANCODE_UNDO :: SDL_Scancode
+pattern SDL_SCANCODE_UNDO = SDL_Scancode 122
+
+-- | AC Cut
+--
+--     [C declaration]: @SDL_SCANCODE_CUT@, defined at @SDL3\/SDL_scancode.h 243:5@
+pattern SDL_SCANCODE_CUT :: SDL_Scancode
+pattern SDL_SCANCODE_CUT = SDL_Scancode 123
+
+-- | AC Copy
+--
+--     [C declaration]: @SDL_SCANCODE_COPY@, defined at @SDL3\/SDL_scancode.h 244:5@
+pattern SDL_SCANCODE_COPY :: SDL_Scancode
+pattern SDL_SCANCODE_COPY = SDL_Scancode 124
+
+-- | AC Paste
+--
+--     [C declaration]: @SDL_SCANCODE_PASTE@, defined at @SDL3\/SDL_scancode.h 245:5@
+pattern SDL_SCANCODE_PASTE :: SDL_Scancode
+pattern SDL_SCANCODE_PASTE = SDL_Scancode 125
+
+-- | AC Find
+--
+--     [C declaration]: @SDL_SCANCODE_FIND@, defined at @SDL3\/SDL_scancode.h 246:5@
+pattern SDL_SCANCODE_FIND :: SDL_Scancode
+pattern SDL_SCANCODE_FIND = SDL_Scancode 126
+
+-- | [C declaration]: @SDL_SCANCODE_MUTE@, defined at @SDL3\/SDL_scancode.h 247:5@
+pattern SDL_SCANCODE_MUTE :: SDL_Scancode
+pattern SDL_SCANCODE_MUTE = SDL_Scancode 127
+
+-- | [C declaration]: @SDL_SCANCODE_VOLUMEUP@, defined at @SDL3\/SDL_scancode.h 248:5@
+pattern SDL_SCANCODE_VOLUMEUP :: SDL_Scancode
+pattern SDL_SCANCODE_VOLUMEUP = SDL_Scancode 128
+
+-- | [C declaration]: @SDL_SCANCODE_VOLUMEDOWN@, defined at @SDL3\/SDL_scancode.h 249:5@
+pattern SDL_SCANCODE_VOLUMEDOWN :: SDL_Scancode
+pattern SDL_SCANCODE_VOLUMEDOWN = SDL_Scancode 129
+
+-- | [C declaration]: @SDL_SCANCODE_KP_COMMA@, defined at @SDL3\/SDL_scancode.h 254:5@
+pattern SDL_SCANCODE_KP_COMMA :: SDL_Scancode
+pattern SDL_SCANCODE_KP_COMMA = SDL_Scancode 133
+
+-- | [C declaration]: @SDL_SCANCODE_KP_EQUALSAS400@, defined at @SDL3\/SDL_scancode.h 255:5@
+pattern SDL_SCANCODE_KP_EQUALSAS400 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_EQUALSAS400 = SDL_Scancode 134
+
+-- | used on Asian keyboards, see footnotes in USB doc
+--
+--     [C declaration]: @SDL_SCANCODE_INTERNATIONAL1@, defined at @SDL3\/SDL_scancode.h 257:5@
+pattern SDL_SCANCODE_INTERNATIONAL1 :: SDL_Scancode
+pattern SDL_SCANCODE_INTERNATIONAL1 = SDL_Scancode 135
+
+-- | [C declaration]: @SDL_SCANCODE_INTERNATIONAL2@, defined at @SDL3\/SDL_scancode.h 259:5@
+pattern SDL_SCANCODE_INTERNATIONAL2 :: SDL_Scancode
+pattern SDL_SCANCODE_INTERNATIONAL2 = SDL_Scancode 136
+
+-- | Yen
+--
+--     [C declaration]: @SDL_SCANCODE_INTERNATIONAL3@, defined at @SDL3\/SDL_scancode.h 260:5@
+pattern SDL_SCANCODE_INTERNATIONAL3 :: SDL_Scancode
+pattern SDL_SCANCODE_INTERNATIONAL3 = SDL_Scancode 137
+
+-- | [C declaration]: @SDL_SCANCODE_INTERNATIONAL4@, defined at @SDL3\/SDL_scancode.h 261:5@
+pattern SDL_SCANCODE_INTERNATIONAL4 :: SDL_Scancode
+pattern SDL_SCANCODE_INTERNATIONAL4 = SDL_Scancode 138
+
+-- | [C declaration]: @SDL_SCANCODE_INTERNATIONAL5@, defined at @SDL3\/SDL_scancode.h 262:5@
+pattern SDL_SCANCODE_INTERNATIONAL5 :: SDL_Scancode
+pattern SDL_SCANCODE_INTERNATIONAL5 = SDL_Scancode 139
+
+-- | [C declaration]: @SDL_SCANCODE_INTERNATIONAL6@, defined at @SDL3\/SDL_scancode.h 263:5@
+pattern SDL_SCANCODE_INTERNATIONAL6 :: SDL_Scancode
+pattern SDL_SCANCODE_INTERNATIONAL6 = SDL_Scancode 140
+
+-- | [C declaration]: @SDL_SCANCODE_INTERNATIONAL7@, defined at @SDL3\/SDL_scancode.h 264:5@
+pattern SDL_SCANCODE_INTERNATIONAL7 :: SDL_Scancode
+pattern SDL_SCANCODE_INTERNATIONAL7 = SDL_Scancode 141
+
+-- | [C declaration]: @SDL_SCANCODE_INTERNATIONAL8@, defined at @SDL3\/SDL_scancode.h 265:5@
+pattern SDL_SCANCODE_INTERNATIONAL8 :: SDL_Scancode
+pattern SDL_SCANCODE_INTERNATIONAL8 = SDL_Scancode 142
+
+-- | [C declaration]: @SDL_SCANCODE_INTERNATIONAL9@, defined at @SDL3\/SDL_scancode.h 266:5@
+pattern SDL_SCANCODE_INTERNATIONAL9 :: SDL_Scancode
+pattern SDL_SCANCODE_INTERNATIONAL9 = SDL_Scancode 143
+
+-- | Hangul\/English toggle
+--
+--     [C declaration]: @SDL_SCANCODE_LANG1@, defined at @SDL3\/SDL_scancode.h 267:5@
+pattern SDL_SCANCODE_LANG1 :: SDL_Scancode
+pattern SDL_SCANCODE_LANG1 = SDL_Scancode 144
+
+-- | Hanja conversion
+--
+--     [C declaration]: @SDL_SCANCODE_LANG2@, defined at @SDL3\/SDL_scancode.h 268:5@
+pattern SDL_SCANCODE_LANG2 :: SDL_Scancode
+pattern SDL_SCANCODE_LANG2 = SDL_Scancode 145
+
+-- | Katakana
+--
+--     [C declaration]: @SDL_SCANCODE_LANG3@, defined at @SDL3\/SDL_scancode.h 269:5@
+pattern SDL_SCANCODE_LANG3 :: SDL_Scancode
+pattern SDL_SCANCODE_LANG3 = SDL_Scancode 146
+
+-- | Hiragana
+--
+--     [C declaration]: @SDL_SCANCODE_LANG4@, defined at @SDL3\/SDL_scancode.h 270:5@
+pattern SDL_SCANCODE_LANG4 :: SDL_Scancode
+pattern SDL_SCANCODE_LANG4 = SDL_Scancode 147
+
+-- | Zenkaku\/Hankaku
+--
+--     [C declaration]: @SDL_SCANCODE_LANG5@, defined at @SDL3\/SDL_scancode.h 271:5@
+pattern SDL_SCANCODE_LANG5 :: SDL_Scancode
+pattern SDL_SCANCODE_LANG5 = SDL_Scancode 148
+
+-- | reserved
+--
+--     [C declaration]: @SDL_SCANCODE_LANG6@, defined at @SDL3\/SDL_scancode.h 272:5@
+pattern SDL_SCANCODE_LANG6 :: SDL_Scancode
+pattern SDL_SCANCODE_LANG6 = SDL_Scancode 149
+
+-- | reserved
+--
+--     [C declaration]: @SDL_SCANCODE_LANG7@, defined at @SDL3\/SDL_scancode.h 273:5@
+pattern SDL_SCANCODE_LANG7 :: SDL_Scancode
+pattern SDL_SCANCODE_LANG7 = SDL_Scancode 150
+
+-- | reserved
+--
+--     [C declaration]: @SDL_SCANCODE_LANG8@, defined at @SDL3\/SDL_scancode.h 274:5@
+pattern SDL_SCANCODE_LANG8 :: SDL_Scancode
+pattern SDL_SCANCODE_LANG8 = SDL_Scancode 151
+
+-- | reserved
+--
+--     [C declaration]: @SDL_SCANCODE_LANG9@, defined at @SDL3\/SDL_scancode.h 275:5@
+pattern SDL_SCANCODE_LANG9 :: SDL_Scancode
+pattern SDL_SCANCODE_LANG9 = SDL_Scancode 152
+
+-- | Erase-Eaze
+--
+--     [C declaration]: @SDL_SCANCODE_ALTERASE@, defined at @SDL3\/SDL_scancode.h 277:5@
+pattern SDL_SCANCODE_ALTERASE :: SDL_Scancode
+pattern SDL_SCANCODE_ALTERASE = SDL_Scancode 153
+
+-- | [C declaration]: @SDL_SCANCODE_SYSREQ@, defined at @SDL3\/SDL_scancode.h 278:5@
+pattern SDL_SCANCODE_SYSREQ :: SDL_Scancode
+pattern SDL_SCANCODE_SYSREQ = SDL_Scancode 154
+
+-- | AC Cancel
+--
+--     [C declaration]: @SDL_SCANCODE_CANCEL@, defined at @SDL3\/SDL_scancode.h 279:5@
+pattern SDL_SCANCODE_CANCEL :: SDL_Scancode
+pattern SDL_SCANCODE_CANCEL = SDL_Scancode 155
+
+-- | [C declaration]: @SDL_SCANCODE_CLEAR@, defined at @SDL3\/SDL_scancode.h 280:5@
+pattern SDL_SCANCODE_CLEAR :: SDL_Scancode
+pattern SDL_SCANCODE_CLEAR = SDL_Scancode 156
+
+-- | [C declaration]: @SDL_SCANCODE_PRIOR@, defined at @SDL3\/SDL_scancode.h 281:5@
+pattern SDL_SCANCODE_PRIOR :: SDL_Scancode
+pattern SDL_SCANCODE_PRIOR = SDL_Scancode 157
+
+-- | [C declaration]: @SDL_SCANCODE_RETURN2@, defined at @SDL3\/SDL_scancode.h 282:5@
+pattern SDL_SCANCODE_RETURN2 :: SDL_Scancode
+pattern SDL_SCANCODE_RETURN2 = SDL_Scancode 158
+
+-- | [C declaration]: @SDL_SCANCODE_SEPARATOR@, defined at @SDL3\/SDL_scancode.h 283:5@
+pattern SDL_SCANCODE_SEPARATOR :: SDL_Scancode
+pattern SDL_SCANCODE_SEPARATOR = SDL_Scancode 159
+
+-- | [C declaration]: @SDL_SCANCODE_OUT@, defined at @SDL3\/SDL_scancode.h 284:5@
+pattern SDL_SCANCODE_OUT :: SDL_Scancode
+pattern SDL_SCANCODE_OUT = SDL_Scancode 160
+
+-- | [C declaration]: @SDL_SCANCODE_OPER@, defined at @SDL3\/SDL_scancode.h 285:5@
+pattern SDL_SCANCODE_OPER :: SDL_Scancode
+pattern SDL_SCANCODE_OPER = SDL_Scancode 161
+
+-- | [C declaration]: @SDL_SCANCODE_CLEARAGAIN@, defined at @SDL3\/SDL_scancode.h 286:5@
+pattern SDL_SCANCODE_CLEARAGAIN :: SDL_Scancode
+pattern SDL_SCANCODE_CLEARAGAIN = SDL_Scancode 162
+
+-- | [C declaration]: @SDL_SCANCODE_CRSEL@, defined at @SDL3\/SDL_scancode.h 287:5@
+pattern SDL_SCANCODE_CRSEL :: SDL_Scancode
+pattern SDL_SCANCODE_CRSEL = SDL_Scancode 163
+
+-- | [C declaration]: @SDL_SCANCODE_EXSEL@, defined at @SDL3\/SDL_scancode.h 288:5@
+pattern SDL_SCANCODE_EXSEL :: SDL_Scancode
+pattern SDL_SCANCODE_EXSEL = SDL_Scancode 164
+
+-- | [C declaration]: @SDL_SCANCODE_KP_00@, defined at @SDL3\/SDL_scancode.h 290:5@
+pattern SDL_SCANCODE_KP_00 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_00 = SDL_Scancode 176
+
+-- | [C declaration]: @SDL_SCANCODE_KP_000@, defined at @SDL3\/SDL_scancode.h 291:5@
+pattern SDL_SCANCODE_KP_000 :: SDL_Scancode
+pattern SDL_SCANCODE_KP_000 = SDL_Scancode 177
+
+-- | [C declaration]: @SDL_SCANCODE_THOUSANDSSEPARATOR@, defined at @SDL3\/SDL_scancode.h 292:5@
+pattern SDL_SCANCODE_THOUSANDSSEPARATOR :: SDL_Scancode
+pattern SDL_SCANCODE_THOUSANDSSEPARATOR = SDL_Scancode 178
+
+-- | [C declaration]: @SDL_SCANCODE_DECIMALSEPARATOR@, defined at @SDL3\/SDL_scancode.h 293:5@
+pattern SDL_SCANCODE_DECIMALSEPARATOR :: SDL_Scancode
+pattern SDL_SCANCODE_DECIMALSEPARATOR = SDL_Scancode 179
+
+-- | [C declaration]: @SDL_SCANCODE_CURRENCYUNIT@, defined at @SDL3\/SDL_scancode.h 294:5@
+pattern SDL_SCANCODE_CURRENCYUNIT :: SDL_Scancode
+pattern SDL_SCANCODE_CURRENCYUNIT = SDL_Scancode 180
+
+-- | [C declaration]: @SDL_SCANCODE_CURRENCYSUBUNIT@, defined at @SDL3\/SDL_scancode.h 295:5@
+pattern SDL_SCANCODE_CURRENCYSUBUNIT :: SDL_Scancode
+pattern SDL_SCANCODE_CURRENCYSUBUNIT = SDL_Scancode 181
+
+-- | [C declaration]: @SDL_SCANCODE_KP_LEFTPAREN@, defined at @SDL3\/SDL_scancode.h 296:5@
+pattern SDL_SCANCODE_KP_LEFTPAREN :: SDL_Scancode
+pattern SDL_SCANCODE_KP_LEFTPAREN = SDL_Scancode 182
+
+-- | [C declaration]: @SDL_SCANCODE_KP_RIGHTPAREN@, defined at @SDL3\/SDL_scancode.h 297:5@
+pattern SDL_SCANCODE_KP_RIGHTPAREN :: SDL_Scancode
+pattern SDL_SCANCODE_KP_RIGHTPAREN = SDL_Scancode 183
+
+-- | [C declaration]: @SDL_SCANCODE_KP_LEFTBRACE@, defined at @SDL3\/SDL_scancode.h 298:5@
+pattern SDL_SCANCODE_KP_LEFTBRACE :: SDL_Scancode
+pattern SDL_SCANCODE_KP_LEFTBRACE = SDL_Scancode 184
+
+-- | [C declaration]: @SDL_SCANCODE_KP_RIGHTBRACE@, defined at @SDL3\/SDL_scancode.h 299:5@
+pattern SDL_SCANCODE_KP_RIGHTBRACE :: SDL_Scancode
+pattern SDL_SCANCODE_KP_RIGHTBRACE = SDL_Scancode 185
+
+-- | [C declaration]: @SDL_SCANCODE_KP_TAB@, defined at @SDL3\/SDL_scancode.h 300:5@
+pattern SDL_SCANCODE_KP_TAB :: SDL_Scancode
+pattern SDL_SCANCODE_KP_TAB = SDL_Scancode 186
+
+-- | [C declaration]: @SDL_SCANCODE_KP_BACKSPACE@, defined at @SDL3\/SDL_scancode.h 301:5@
+pattern SDL_SCANCODE_KP_BACKSPACE :: SDL_Scancode
+pattern SDL_SCANCODE_KP_BACKSPACE = SDL_Scancode 187
+
+-- | [C declaration]: @SDL_SCANCODE_KP_A@, defined at @SDL3\/SDL_scancode.h 302:5@
+pattern SDL_SCANCODE_KP_A :: SDL_Scancode
+pattern SDL_SCANCODE_KP_A = SDL_Scancode 188
+
+-- | [C declaration]: @SDL_SCANCODE_KP_B@, defined at @SDL3\/SDL_scancode.h 303:5@
+pattern SDL_SCANCODE_KP_B :: SDL_Scancode
+pattern SDL_SCANCODE_KP_B = SDL_Scancode 189
+
+-- | [C declaration]: @SDL_SCANCODE_KP_C@, defined at @SDL3\/SDL_scancode.h 304:5@
+pattern SDL_SCANCODE_KP_C :: SDL_Scancode
+pattern SDL_SCANCODE_KP_C = SDL_Scancode 190
+
+-- | [C declaration]: @SDL_SCANCODE_KP_D@, defined at @SDL3\/SDL_scancode.h 305:5@
+pattern SDL_SCANCODE_KP_D :: SDL_Scancode
+pattern SDL_SCANCODE_KP_D = SDL_Scancode 191
+
+-- | [C declaration]: @SDL_SCANCODE_KP_E@, defined at @SDL3\/SDL_scancode.h 306:5@
+pattern SDL_SCANCODE_KP_E :: SDL_Scancode
+pattern SDL_SCANCODE_KP_E = SDL_Scancode 192
+
+-- | [C declaration]: @SDL_SCANCODE_KP_F@, defined at @SDL3\/SDL_scancode.h 307:5@
+pattern SDL_SCANCODE_KP_F :: SDL_Scancode
+pattern SDL_SCANCODE_KP_F = SDL_Scancode 193
+
+-- | [C declaration]: @SDL_SCANCODE_KP_XOR@, defined at @SDL3\/SDL_scancode.h 308:5@
+pattern SDL_SCANCODE_KP_XOR :: SDL_Scancode
+pattern SDL_SCANCODE_KP_XOR = SDL_Scancode 194
+
+-- | [C declaration]: @SDL_SCANCODE_KP_POWER@, defined at @SDL3\/SDL_scancode.h 309:5@
+pattern SDL_SCANCODE_KP_POWER :: SDL_Scancode
+pattern SDL_SCANCODE_KP_POWER = SDL_Scancode 195
+
+-- | [C declaration]: @SDL_SCANCODE_KP_PERCENT@, defined at @SDL3\/SDL_scancode.h 310:5@
+pattern SDL_SCANCODE_KP_PERCENT :: SDL_Scancode
+pattern SDL_SCANCODE_KP_PERCENT = SDL_Scancode 196
+
+-- | [C declaration]: @SDL_SCANCODE_KP_LESS@, defined at @SDL3\/SDL_scancode.h 311:5@
+pattern SDL_SCANCODE_KP_LESS :: SDL_Scancode
+pattern SDL_SCANCODE_KP_LESS = SDL_Scancode 197
+
+-- | [C declaration]: @SDL_SCANCODE_KP_GREATER@, defined at @SDL3\/SDL_scancode.h 312:5@
+pattern SDL_SCANCODE_KP_GREATER :: SDL_Scancode
+pattern SDL_SCANCODE_KP_GREATER = SDL_Scancode 198
+
+-- | [C declaration]: @SDL_SCANCODE_KP_AMPERSAND@, defined at @SDL3\/SDL_scancode.h 313:5@
+pattern SDL_SCANCODE_KP_AMPERSAND :: SDL_Scancode
+pattern SDL_SCANCODE_KP_AMPERSAND = SDL_Scancode 199
+
+-- | [C declaration]: @SDL_SCANCODE_KP_DBLAMPERSAND@, defined at @SDL3\/SDL_scancode.h 314:5@
+pattern SDL_SCANCODE_KP_DBLAMPERSAND :: SDL_Scancode
+pattern SDL_SCANCODE_KP_DBLAMPERSAND = SDL_Scancode 200
+
+-- | [C declaration]: @SDL_SCANCODE_KP_VERTICALBAR@, defined at @SDL3\/SDL_scancode.h 315:5@
+pattern SDL_SCANCODE_KP_VERTICALBAR :: SDL_Scancode
+pattern SDL_SCANCODE_KP_VERTICALBAR = SDL_Scancode 201
+
+-- | [C declaration]: @SDL_SCANCODE_KP_DBLVERTICALBAR@, defined at @SDL3\/SDL_scancode.h 316:5@
+pattern SDL_SCANCODE_KP_DBLVERTICALBAR :: SDL_Scancode
+pattern SDL_SCANCODE_KP_DBLVERTICALBAR = SDL_Scancode 202
+
+-- | [C declaration]: @SDL_SCANCODE_KP_COLON@, defined at @SDL3\/SDL_scancode.h 317:5@
+pattern SDL_SCANCODE_KP_COLON :: SDL_Scancode
+pattern SDL_SCANCODE_KP_COLON = SDL_Scancode 203
+
+-- | [C declaration]: @SDL_SCANCODE_KP_HASH@, defined at @SDL3\/SDL_scancode.h 318:5@
+pattern SDL_SCANCODE_KP_HASH :: SDL_Scancode
+pattern SDL_SCANCODE_KP_HASH = SDL_Scancode 204
+
+-- | [C declaration]: @SDL_SCANCODE_KP_SPACE@, defined at @SDL3\/SDL_scancode.h 319:5@
+pattern SDL_SCANCODE_KP_SPACE :: SDL_Scancode
+pattern SDL_SCANCODE_KP_SPACE = SDL_Scancode 205
+
+-- | [C declaration]: @SDL_SCANCODE_KP_AT@, defined at @SDL3\/SDL_scancode.h 320:5@
+pattern SDL_SCANCODE_KP_AT :: SDL_Scancode
+pattern SDL_SCANCODE_KP_AT = SDL_Scancode 206
+
+-- | [C declaration]: @SDL_SCANCODE_KP_EXCLAM@, defined at @SDL3\/SDL_scancode.h 321:5@
+pattern SDL_SCANCODE_KP_EXCLAM :: SDL_Scancode
+pattern SDL_SCANCODE_KP_EXCLAM = SDL_Scancode 207
+
+-- | [C declaration]: @SDL_SCANCODE_KP_MEMSTORE@, defined at @SDL3\/SDL_scancode.h 322:5@
+pattern SDL_SCANCODE_KP_MEMSTORE :: SDL_Scancode
+pattern SDL_SCANCODE_KP_MEMSTORE = SDL_Scancode 208
+
+-- | [C declaration]: @SDL_SCANCODE_KP_MEMRECALL@, defined at @SDL3\/SDL_scancode.h 323:5@
+pattern SDL_SCANCODE_KP_MEMRECALL :: SDL_Scancode
+pattern SDL_SCANCODE_KP_MEMRECALL = SDL_Scancode 209
+
+-- | [C declaration]: @SDL_SCANCODE_KP_MEMCLEAR@, defined at @SDL3\/SDL_scancode.h 324:5@
+pattern SDL_SCANCODE_KP_MEMCLEAR :: SDL_Scancode
+pattern SDL_SCANCODE_KP_MEMCLEAR = SDL_Scancode 210
+
+-- | [C declaration]: @SDL_SCANCODE_KP_MEMADD@, defined at @SDL3\/SDL_scancode.h 325:5@
+pattern SDL_SCANCODE_KP_MEMADD :: SDL_Scancode
+pattern SDL_SCANCODE_KP_MEMADD = SDL_Scancode 211
+
+-- | [C declaration]: @SDL_SCANCODE_KP_MEMSUBTRACT@, defined at @SDL3\/SDL_scancode.h 326:5@
+pattern SDL_SCANCODE_KP_MEMSUBTRACT :: SDL_Scancode
+pattern SDL_SCANCODE_KP_MEMSUBTRACT = SDL_Scancode 212
+
+-- | [C declaration]: @SDL_SCANCODE_KP_MEMMULTIPLY@, defined at @SDL3\/SDL_scancode.h 327:5@
+pattern SDL_SCANCODE_KP_MEMMULTIPLY :: SDL_Scancode
+pattern SDL_SCANCODE_KP_MEMMULTIPLY = SDL_Scancode 213
+
+-- | [C declaration]: @SDL_SCANCODE_KP_MEMDIVIDE@, defined at @SDL3\/SDL_scancode.h 328:5@
+pattern SDL_SCANCODE_KP_MEMDIVIDE :: SDL_Scancode
+pattern SDL_SCANCODE_KP_MEMDIVIDE = SDL_Scancode 214
+
+-- | [C declaration]: @SDL_SCANCODE_KP_PLUSMINUS@, defined at @SDL3\/SDL_scancode.h 329:5@
+pattern SDL_SCANCODE_KP_PLUSMINUS :: SDL_Scancode
+pattern SDL_SCANCODE_KP_PLUSMINUS = SDL_Scancode 215
+
+-- | [C declaration]: @SDL_SCANCODE_KP_CLEAR@, defined at @SDL3\/SDL_scancode.h 330:5@
+pattern SDL_SCANCODE_KP_CLEAR :: SDL_Scancode
+pattern SDL_SCANCODE_KP_CLEAR = SDL_Scancode 216
+
+-- | [C declaration]: @SDL_SCANCODE_KP_CLEARENTRY@, defined at @SDL3\/SDL_scancode.h 331:5@
+pattern SDL_SCANCODE_KP_CLEARENTRY :: SDL_Scancode
+pattern SDL_SCANCODE_KP_CLEARENTRY = SDL_Scancode 217
+
+-- | [C declaration]: @SDL_SCANCODE_KP_BINARY@, defined at @SDL3\/SDL_scancode.h 332:5@
+pattern SDL_SCANCODE_KP_BINARY :: SDL_Scancode
+pattern SDL_SCANCODE_KP_BINARY = SDL_Scancode 218
+
+-- | [C declaration]: @SDL_SCANCODE_KP_OCTAL@, defined at @SDL3\/SDL_scancode.h 333:5@
+pattern SDL_SCANCODE_KP_OCTAL :: SDL_Scancode
+pattern SDL_SCANCODE_KP_OCTAL = SDL_Scancode 219
+
+-- | [C declaration]: @SDL_SCANCODE_KP_DECIMAL@, defined at @SDL3\/SDL_scancode.h 334:5@
+pattern SDL_SCANCODE_KP_DECIMAL :: SDL_Scancode
+pattern SDL_SCANCODE_KP_DECIMAL = SDL_Scancode 220
+
+-- | [C declaration]: @SDL_SCANCODE_KP_HEXADECIMAL@, defined at @SDL3\/SDL_scancode.h 335:5@
+pattern SDL_SCANCODE_KP_HEXADECIMAL :: SDL_Scancode
+pattern SDL_SCANCODE_KP_HEXADECIMAL = SDL_Scancode 221
+
+-- | [C declaration]: @SDL_SCANCODE_LCTRL@, defined at @SDL3\/SDL_scancode.h 337:5@
+pattern SDL_SCANCODE_LCTRL :: SDL_Scancode
+pattern SDL_SCANCODE_LCTRL = SDL_Scancode 224
+
+-- | [C declaration]: @SDL_SCANCODE_LSHIFT@, defined at @SDL3\/SDL_scancode.h 338:5@
+pattern SDL_SCANCODE_LSHIFT :: SDL_Scancode
+pattern SDL_SCANCODE_LSHIFT = SDL_Scancode 225
+
+-- | alt, option
+--
+--     [C declaration]: @SDL_SCANCODE_LALT@, defined at @SDL3\/SDL_scancode.h 339:5@
+pattern SDL_SCANCODE_LALT :: SDL_Scancode
+pattern SDL_SCANCODE_LALT = SDL_Scancode 226
+
+-- | windows, command (apple), meta
+--
+--     [C declaration]: @SDL_SCANCODE_LGUI@, defined at @SDL3\/SDL_scancode.h 340:5@
+pattern SDL_SCANCODE_LGUI :: SDL_Scancode
+pattern SDL_SCANCODE_LGUI = SDL_Scancode 227
+
+-- | [C declaration]: @SDL_SCANCODE_RCTRL@, defined at @SDL3\/SDL_scancode.h 341:5@
+pattern SDL_SCANCODE_RCTRL :: SDL_Scancode
+pattern SDL_SCANCODE_RCTRL = SDL_Scancode 228
+
+-- | [C declaration]: @SDL_SCANCODE_RSHIFT@, defined at @SDL3\/SDL_scancode.h 342:5@
+pattern SDL_SCANCODE_RSHIFT :: SDL_Scancode
+pattern SDL_SCANCODE_RSHIFT = SDL_Scancode 229
+
+-- | alt gr, option
+--
+--     [C declaration]: @SDL_SCANCODE_RALT@, defined at @SDL3\/SDL_scancode.h 343:5@
+pattern SDL_SCANCODE_RALT :: SDL_Scancode
+pattern SDL_SCANCODE_RALT = SDL_Scancode 230
+
+-- | windows, command (apple), meta
+--
+--     [C declaration]: @SDL_SCANCODE_RGUI@, defined at @SDL3\/SDL_scancode.h 344:5@
+pattern SDL_SCANCODE_RGUI :: SDL_Scancode
+pattern SDL_SCANCODE_RGUI = SDL_Scancode 231
+
+-- | I\'m not sure if this is really not covered by any of the above, but since there\'s a special SDL_KMOD_MODE for it I\'m adding it here
+--
+--     [C declaration]: @SDL_SCANCODE_MODE@, defined at @SDL3\/SDL_scancode.h 346:5@
+pattern SDL_SCANCODE_MODE :: SDL_Scancode
+pattern SDL_SCANCODE_MODE = SDL_Scancode 257
+
+-- | Sleep
+--
+--     [C declaration]: @SDL_SCANCODE_SLEEP@, defined at @SDL3\/SDL_scancode.h 364:5@
+pattern SDL_SCANCODE_SLEEP :: SDL_Scancode
+pattern SDL_SCANCODE_SLEEP = SDL_Scancode 258
+
+-- | Wake
+--
+--     [C declaration]: @SDL_SCANCODE_WAKE@, defined at @SDL3\/SDL_scancode.h 365:5@
+pattern SDL_SCANCODE_WAKE :: SDL_Scancode
+pattern SDL_SCANCODE_WAKE = SDL_Scancode 259
+
+-- | Channel Increment
+--
+--     [C declaration]: @SDL_SCANCODE_CHANNEL_INCREMENT@, defined at @SDL3\/SDL_scancode.h 367:5@
+pattern SDL_SCANCODE_CHANNEL_INCREMENT :: SDL_Scancode
+pattern SDL_SCANCODE_CHANNEL_INCREMENT = SDL_Scancode 260
+
+-- | Channel Decrement
+--
+--     [C declaration]: @SDL_SCANCODE_CHANNEL_DECREMENT@, defined at @SDL3\/SDL_scancode.h 368:5@
+pattern SDL_SCANCODE_CHANNEL_DECREMENT :: SDL_Scancode
+pattern SDL_SCANCODE_CHANNEL_DECREMENT = SDL_Scancode 261
+
+-- | Play
+--
+--     [C declaration]: @SDL_SCANCODE_MEDIA_PLAY@, defined at @SDL3\/SDL_scancode.h 370:5@
+pattern SDL_SCANCODE_MEDIA_PLAY :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_PLAY = SDL_Scancode 262
+
+-- | Pause
+--
+--     [C declaration]: @SDL_SCANCODE_MEDIA_PAUSE@, defined at @SDL3\/SDL_scancode.h 371:5@
+pattern SDL_SCANCODE_MEDIA_PAUSE :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_PAUSE = SDL_Scancode 263
+
+-- | Record
+--
+--     [C declaration]: @SDL_SCANCODE_MEDIA_RECORD@, defined at @SDL3\/SDL_scancode.h 372:5@
+pattern SDL_SCANCODE_MEDIA_RECORD :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_RECORD = SDL_Scancode 264
+
+-- | Fast Forward
+--
+--     [C declaration]: @SDL_SCANCODE_MEDIA_FAST_FORWARD@, defined at @SDL3\/SDL_scancode.h 373:5@
+pattern SDL_SCANCODE_MEDIA_FAST_FORWARD :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_FAST_FORWARD = SDL_Scancode 265
+
+-- | Rewind
+--
+--     [C declaration]: @SDL_SCANCODE_MEDIA_REWIND@, defined at @SDL3\/SDL_scancode.h 374:5@
+pattern SDL_SCANCODE_MEDIA_REWIND :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_REWIND = SDL_Scancode 266
+
+-- | Next Track
+--
+--     [C declaration]: @SDL_SCANCODE_MEDIA_NEXT_TRACK@, defined at @SDL3\/SDL_scancode.h 375:5@
+pattern SDL_SCANCODE_MEDIA_NEXT_TRACK :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_NEXT_TRACK = SDL_Scancode 267
+
+-- | Previous Track
+--
+--     [C declaration]: @SDL_SCANCODE_MEDIA_PREVIOUS_TRACK@, defined at @SDL3\/SDL_scancode.h 376:5@
+pattern SDL_SCANCODE_MEDIA_PREVIOUS_TRACK :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_PREVIOUS_TRACK = SDL_Scancode 268
+
+-- | Stop
+--
+--     [C declaration]: @SDL_SCANCODE_MEDIA_STOP@, defined at @SDL3\/SDL_scancode.h 377:5@
+pattern SDL_SCANCODE_MEDIA_STOP :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_STOP = SDL_Scancode 269
+
+-- | Eject
+--
+--     [C declaration]: @SDL_SCANCODE_MEDIA_EJECT@, defined at @SDL3\/SDL_scancode.h 378:5@
+pattern SDL_SCANCODE_MEDIA_EJECT :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_EJECT = SDL_Scancode 270
+
+-- | Play \/ Pause
+--
+--     [C declaration]: @SDL_SCANCODE_MEDIA_PLAY_PAUSE@, defined at @SDL3\/SDL_scancode.h 379:5@
+pattern SDL_SCANCODE_MEDIA_PLAY_PAUSE :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_PLAY_PAUSE = SDL_Scancode 271
+
+-- | [C declaration]: @SDL_SCANCODE_MEDIA_SELECT@, defined at @SDL3\/SDL_scancode.h 380:5@
+pattern SDL_SCANCODE_MEDIA_SELECT :: SDL_Scancode
+pattern SDL_SCANCODE_MEDIA_SELECT = SDL_Scancode 272
+
+-- | AC New
+--
+--     [C declaration]: @SDL_SCANCODE_AC_NEW@, defined at @SDL3\/SDL_scancode.h 382:5@
+pattern SDL_SCANCODE_AC_NEW :: SDL_Scancode
+pattern SDL_SCANCODE_AC_NEW = SDL_Scancode 273
+
+-- | AC Open
+--
+--     [C declaration]: @SDL_SCANCODE_AC_OPEN@, defined at @SDL3\/SDL_scancode.h 383:5@
+pattern SDL_SCANCODE_AC_OPEN :: SDL_Scancode
+pattern SDL_SCANCODE_AC_OPEN = SDL_Scancode 274
+
+-- | AC Close
+--
+--     [C declaration]: @SDL_SCANCODE_AC_CLOSE@, defined at @SDL3\/SDL_scancode.h 384:5@
+pattern SDL_SCANCODE_AC_CLOSE :: SDL_Scancode
+pattern SDL_SCANCODE_AC_CLOSE = SDL_Scancode 275
+
+-- | AC Exit
+--
+--     [C declaration]: @SDL_SCANCODE_AC_EXIT@, defined at @SDL3\/SDL_scancode.h 385:5@
+pattern SDL_SCANCODE_AC_EXIT :: SDL_Scancode
+pattern SDL_SCANCODE_AC_EXIT = SDL_Scancode 276
+
+-- | AC Save
+--
+--     [C declaration]: @SDL_SCANCODE_AC_SAVE@, defined at @SDL3\/SDL_scancode.h 386:5@
+pattern SDL_SCANCODE_AC_SAVE :: SDL_Scancode
+pattern SDL_SCANCODE_AC_SAVE = SDL_Scancode 277
+
+-- | AC Print
+--
+--     [C declaration]: @SDL_SCANCODE_AC_PRINT@, defined at @SDL3\/SDL_scancode.h 387:5@
+pattern SDL_SCANCODE_AC_PRINT :: SDL_Scancode
+pattern SDL_SCANCODE_AC_PRINT = SDL_Scancode 278
+
+-- | AC Properties
+--
+--     [C declaration]: @SDL_SCANCODE_AC_PROPERTIES@, defined at @SDL3\/SDL_scancode.h 388:5@
+pattern SDL_SCANCODE_AC_PROPERTIES :: SDL_Scancode
+pattern SDL_SCANCODE_AC_PROPERTIES = SDL_Scancode 279
+
+-- | AC Search
+--
+--     [C declaration]: @SDL_SCANCODE_AC_SEARCH@, defined at @SDL3\/SDL_scancode.h 390:5@
+pattern SDL_SCANCODE_AC_SEARCH :: SDL_Scancode
+pattern SDL_SCANCODE_AC_SEARCH = SDL_Scancode 280
+
+-- | AC Home
+--
+--     [C declaration]: @SDL_SCANCODE_AC_HOME@, defined at @SDL3\/SDL_scancode.h 391:5@
+pattern SDL_SCANCODE_AC_HOME :: SDL_Scancode
+pattern SDL_SCANCODE_AC_HOME = SDL_Scancode 281
+
+-- | AC Back
+--
+--     [C declaration]: @SDL_SCANCODE_AC_BACK@, defined at @SDL3\/SDL_scancode.h 392:5@
+pattern SDL_SCANCODE_AC_BACK :: SDL_Scancode
+pattern SDL_SCANCODE_AC_BACK = SDL_Scancode 282
+
+-- | AC Forward
+--
+--     [C declaration]: @SDL_SCANCODE_AC_FORWARD@, defined at @SDL3\/SDL_scancode.h 393:5@
+pattern SDL_SCANCODE_AC_FORWARD :: SDL_Scancode
+pattern SDL_SCANCODE_AC_FORWARD = SDL_Scancode 283
+
+-- | AC Stop
+--
+--     [C declaration]: @SDL_SCANCODE_AC_STOP@, defined at @SDL3\/SDL_scancode.h 394:5@
+pattern SDL_SCANCODE_AC_STOP :: SDL_Scancode
+pattern SDL_SCANCODE_AC_STOP = SDL_Scancode 284
+
+-- | AC Refresh
+--
+--     [C declaration]: @SDL_SCANCODE_AC_REFRESH@, defined at @SDL3\/SDL_scancode.h 395:5@
+pattern SDL_SCANCODE_AC_REFRESH :: SDL_Scancode
+pattern SDL_SCANCODE_AC_REFRESH = SDL_Scancode 285
+
+-- | AC Bookmarks
+--
+--     [C declaration]: @SDL_SCANCODE_AC_BOOKMARKS@, defined at @SDL3\/SDL_scancode.h 396:5@
+pattern SDL_SCANCODE_AC_BOOKMARKS :: SDL_Scancode
+pattern SDL_SCANCODE_AC_BOOKMARKS = SDL_Scancode 286
+
+-- | Usually situated below the display on phones and used as a multi-function feature key for selecting a software defined function shown on the bottom left of the display.
+--
+--     [C declaration]: @SDL_SCANCODE_SOFTLEFT@, defined at @SDL3\/SDL_scancode.h 408:5@
+pattern SDL_SCANCODE_SOFTLEFT :: SDL_Scancode
+pattern SDL_SCANCODE_SOFTLEFT = SDL_Scancode 287
+
+-- | Usually situated below the display on phones and used as a multi-function feature key for selecting a software defined function shown on the bottom right of the display.
+--
+--     [C declaration]: @SDL_SCANCODE_SOFTRIGHT@, defined at @SDL3\/SDL_scancode.h 412:5@
+pattern SDL_SCANCODE_SOFTRIGHT :: SDL_Scancode
+pattern SDL_SCANCODE_SOFTRIGHT = SDL_Scancode 288
+
+-- | Used for accepting phone calls.
+--
+--     [C declaration]: @SDL_SCANCODE_CALL@, defined at @SDL3\/SDL_scancode.h 416:5@
+pattern SDL_SCANCODE_CALL :: SDL_Scancode
+pattern SDL_SCANCODE_CALL = SDL_Scancode 289
+
+-- | Used for rejecting phone calls.
+--
+--     [C declaration]: @SDL_SCANCODE_ENDCALL@, defined at @SDL3\/SDL_scancode.h 417:5@
+pattern SDL_SCANCODE_ENDCALL :: SDL_Scancode
+pattern SDL_SCANCODE_ENDCALL = SDL_Scancode 290
+
+-- | 400-500 reserved for dynamic keycodes
+--
+--     [C declaration]: @SDL_SCANCODE_RESERVED@, defined at @SDL3\/SDL_scancode.h 423:5@
+pattern SDL_SCANCODE_RESERVED :: SDL_Scancode
+pattern SDL_SCANCODE_RESERVED = SDL_Scancode 400
+
+-- | not a key, just marks the number of scancodes for array bounds
+--
+--     [C declaration]: @SDL_SCANCODE_COUNT@, defined at @SDL3\/SDL_scancode.h 425:5@
+pattern SDL_SCANCODE_COUNT :: SDL_Scancode
+pattern SDL_SCANCODE_COUNT = SDL_Scancode 512
diff --git a/src/SDL3/Sys/Bindgen/Sensor.hs b/src/SDL3/Sys/Bindgen/Sensor.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Sensor.hs
@@ -0,0 +1,319 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL sensor management.
+--
+--     These APIs grant access to gyros and accelerometers on various platforms.
+--
+--     In order to use these functions, SDL_Init() must have been called with the SDL_INIT_SENSOR flag. This causes SDL to scan the system for sensors, and load appropriate drivers. The opaque structure used to identify an opened SDL sensor.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Sensor (
+  SDL3.Sys.Bindgen.Sensor.SDL_Sensor,
+  SDL3.Sys.Bindgen.Sensor.SDL_SensorID (..),
+  SDL3.Sys.Bindgen.Sensor.sDL_STANDARD_GRAVITY,
+  SDL3.Sys.Bindgen.Sensor.SDL_SensorType (..),
+  pattern SDL3.Sys.Bindgen.Sensor.SDL_SENSOR_INVALID,
+  pattern SDL3.Sys.Bindgen.Sensor.SDL_SENSOR_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Sensor.SDL_SENSOR_ACCEL,
+  pattern SDL3.Sys.Bindgen.Sensor.SDL_SENSOR_GYRO,
+  pattern SDL3.Sys.Bindgen.Sensor.SDL_SENSOR_ACCEL_L,
+  pattern SDL3.Sys.Bindgen.Sensor.SDL_SENSOR_GYRO_L,
+  pattern SDL3.Sys.Bindgen.Sensor.SDL_SENSOR_ACCEL_R,
+  pattern SDL3.Sys.Bindgen.Sensor.SDL_SENSOR_GYRO_R,
+  pattern SDL3.Sys.Bindgen.Sensor.SDL_SENSOR_COUNT,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @struct SDL_Sensor@, defined at @SDL3\/SDL_sensor.h 54:16@
+data SDL_Sensor
+
+-- | This is a unique ID for a sensor for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SensorID@, defined at @SDL3\/SDL_sensor.h 64:16@
+newtype SDL_SensorID = SDL_SensorID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_SensorID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SensorID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_SensorID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_SensorID "unwrap" where
+  type
+    CFieldType SDL_SensorID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | A constant to represent standard gravity for accelerometer sensors.
+--
+--     The accelerometer returns the current acceleration in SI meters per second squared. This measurement includes the force of gravity, so a device at rest will have an value of SDL_STANDARD_GRAVITY away from the center of the earth, which is a positive Y value.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_STANDARD_GRAVITY@, defined at @SDL3\/SDL_sensor.h 76:9@
+sDL_STANDARD_GRAVITY :: BG.CFloat
+sDL_STANDARD_GRAVITY = (9.80665 :: BG.CFloat)
+
+-- | The different sensors defined by SDL.
+--
+--     Additional sensors may be available, using platform dependent semantics.
+--
+--     Here are the additional Android sensors:
+--
+--     [https:\/\/developer.android.com\/reference\/android\/hardware\/SensorEvent.html\#values](https://developer.android.com/reference/android/hardware/SensorEvent.html#values)
+--
+--     Accelerometer sensor notes:
+--
+--     The accelerometer returns the current acceleration in SI meters per second squared. This measurement includes the force of gravity, so a device at rest will have an value of SDL_STANDARD_GRAVITY away from the center of the earth, which is a positive Y value.
+--
+--     * @values[0]@: Acceleration on the x axis
+--
+--     * @values[1]@: Acceleration on the y axis
+--
+--     * @values[2]@: Acceleration on the z axis
+--
+--     For phones and tablets held in natural orientation and game controllers held in front of you, the axes are defined as follows:
+--
+--     * -X ... +X : left ... right
+--
+--     * -Y ... +Y : bottom ... top
+--
+--     * -Z ... +Z : farther ... closer
+--
+--     The accelerometer axis data is not changed when the device is rotated.
+--
+--     Gyroscope sensor notes:
+--
+--     The gyroscope returns the current rate of rotation in radians per second. The rotation is positive in the counter-clockwise direction. That is, an observer looking from a positive location on one of the axes would see positive rotation on that axis when it appeared to be rotating counter-clockwise.
+--
+--     * @values[0]@: Angular speed around the x axis (pitch)
+--
+--     * @values[1]@: Angular speed around the y axis (yaw)
+--
+--     * @values[2]@: Angular speed around the z axis (roll)
+--
+--     For phones and tablets held in natural orientation and game controllers held in front of you, the axes are defined as follows:
+--
+--     * -X ... +X : left ... right
+--
+--     * -Y ... +Y : bottom ... top
+--
+--     * -Z ... +Z : farther ... closer
+--
+--     The gyroscope axis data is not changed when the device is rotated.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetCurrentDisplayOrientation
+--
+--     [C declaration]: @enum SDL_SensorType@, defined at @SDL3\/SDL_sensor.h 132:14@
+newtype SDL_SensorType = SDL_SensorType
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_SensorType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_SensorType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_SensorType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_SensorType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_SensorType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_SensorType instance BG.Storable SDL_SensorType
+
+deriving via BG.CInt instance BG.Prim SDL_SensorType
+
+instance CEnum.CEnum SDL_SensorType where
+  type CEnumZ SDL_SensorType = BG.CInt
+
+  toCEnum = SDL_SensorType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_SENSOR_INVALID")
+        , (0, BG.singleton "SDL_SENSOR_UNKNOWN")
+        , (1, BG.singleton "SDL_SENSOR_ACCEL")
+        , (2, BG.singleton "SDL_SENSOR_GYRO")
+        , (3, BG.singleton "SDL_SENSOR_ACCEL_L")
+        , (4, BG.singleton "SDL_SENSOR_GYRO_L")
+        , (5, BG.singleton "SDL_SENSOR_ACCEL_R")
+        , (6, BG.singleton "SDL_SENSOR_GYRO_R")
+        , (7, BG.singleton "SDL_SENSOR_COUNT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_SensorType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_SensorType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_SensorType where
+  minDeclaredValue = SDL_SENSOR_INVALID
+
+  maxDeclaredValue = SDL_SENSOR_COUNT
+
+instance Show SDL_SensorType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_SensorType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_SensorType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SensorType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_SensorType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_SensorType "unwrap" where
+  type CFieldType SDL_SensorType "unwrap" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Returned for an invalid sensor
+--
+--     [C declaration]: @SDL_SENSOR_INVALID@, defined at @SDL3\/SDL_sensor.h 134:5@
+pattern SDL_SENSOR_INVALID :: SDL_SensorType
+pattern SDL_SENSOR_INVALID = SDL_SensorType (-1)
+
+-- | Unknown sensor type
+--
+--     [C declaration]: @SDL_SENSOR_UNKNOWN@, defined at @SDL3\/SDL_sensor.h 135:5@
+pattern SDL_SENSOR_UNKNOWN :: SDL_SensorType
+pattern SDL_SENSOR_UNKNOWN = SDL_SensorType 0
+
+-- | Accelerometer
+--
+--     [C declaration]: @SDL_SENSOR_ACCEL@, defined at @SDL3\/SDL_sensor.h 136:5@
+pattern SDL_SENSOR_ACCEL :: SDL_SensorType
+pattern SDL_SENSOR_ACCEL = SDL_SensorType 1
+
+-- | Gyroscope
+--
+--     [C declaration]: @SDL_SENSOR_GYRO@, defined at @SDL3\/SDL_sensor.h 137:5@
+pattern SDL_SENSOR_GYRO :: SDL_SensorType
+pattern SDL_SENSOR_GYRO = SDL_SensorType 2
+
+-- | Accelerometer for left Joy-Con controller and Wii nunchuk
+--
+--     [C declaration]: @SDL_SENSOR_ACCEL_L@, defined at @SDL3\/SDL_sensor.h 138:5@
+pattern SDL_SENSOR_ACCEL_L :: SDL_SensorType
+pattern SDL_SENSOR_ACCEL_L = SDL_SensorType 3
+
+-- | Gyroscope for left Joy-Con controller
+--
+--     [C declaration]: @SDL_SENSOR_GYRO_L@, defined at @SDL3\/SDL_sensor.h 139:5@
+pattern SDL_SENSOR_GYRO_L :: SDL_SensorType
+pattern SDL_SENSOR_GYRO_L = SDL_SensorType 4
+
+-- | Accelerometer for right Joy-Con controller
+--
+--     [C declaration]: @SDL_SENSOR_ACCEL_R@, defined at @SDL3\/SDL_sensor.h 140:5@
+pattern SDL_SENSOR_ACCEL_R :: SDL_SensorType
+pattern SDL_SENSOR_ACCEL_R = SDL_SensorType 5
+
+-- | Gyroscope for right Joy-Con controller
+--
+--     [C declaration]: @SDL_SENSOR_GYRO_R@, defined at @SDL3\/SDL_sensor.h 141:5@
+pattern SDL_SENSOR_GYRO_R :: SDL_SensorType
+pattern SDL_SENSOR_GYRO_R = SDL_SensorType 6
+
+-- | [C declaration]: @SDL_SENSOR_COUNT@, defined at @SDL3\/SDL_sensor.h 142:5@
+pattern SDL_SENSOR_COUNT :: SDL_SensorType
+pattern SDL_SENSOR_COUNT = SDL_SensorType 7
diff --git a/src/SDL3/Sys/Bindgen/Sensor/FunPtr.hs b/src/SDL3/Sys/Bindgen/Sensor/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Sensor/FunPtr.hs
@@ -0,0 +1,509 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Sensor.FunPtr (
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensors,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensorNameForID,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensorTypeForID,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensorNonPortableTypeForID,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_OpenSensor,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensorFromID,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensorProperties,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensorName,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensorType,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensorNonPortableType,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensorID,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_GetSensorData,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_CloseSensor,
+  SDL3.Sys.Bindgen.Sensor.FunPtr.sDL_UpdateSensors,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_sensor.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensors */"
+         , "__attribute__ ((const))"
+         , "SDL_SensorID *(*hs_bindgen_7d117dd7b42cc40e (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensors;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorNameForID */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_064803dcda1d2e45 (void)) ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensorNameForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorTypeForID */"
+         , "__attribute__ ((const))"
+         , "SDL_SensorType (*hs_bindgen_15067de6fd7eab81 (void)) ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensorTypeForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorNonPortableTypeForID */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_93df6e86c5ae7de1 (void)) ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensorNonPortableTypeForID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_OpenSensor */"
+         , "__attribute__ ((const))"
+         , "SDL_Sensor *(*hs_bindgen_3ddd92169c898cc5 (void)) ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenSensor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorFromID */"
+         , "__attribute__ ((const))"
+         , "SDL_Sensor *(*hs_bindgen_599e05d453695d54 (void)) ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensorFromID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_4164cf08823b4939 (void)) ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensorProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_73c9e66388d63d79 (void)) ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensorName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorType */"
+         , "__attribute__ ((const))"
+         , "SDL_SensorType (*hs_bindgen_d2b64d0316fa8124 (void)) ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensorType;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorNonPortableType */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_0e763d01bffcfa1a (void)) ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensorNonPortableType;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorID */"
+         , "__attribute__ ((const))"
+         , "SDL_SensorID (*hs_bindgen_ccc4b71ce529cea1 (void)) ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensorID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorData */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_63c226fd6c34b399 (void)) ("
+         , "  SDL_Sensor *arg1,"
+         , "  float *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSensorData;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_CloseSensor */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_a117a0cf60dc00d1 (void)) ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CloseSensor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_UpdateSensors */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_bbc7d6be143f2f1d (void)) (void)"
+         , "{"
+         , "  return &SDL_UpdateSensors;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensors@
+foreign import ccall unsafe "hs_bindgen_7d117dd7b42cc40e"
+  hs_bindgen_7d117dd7b42cc40e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensors@
+hs_bindgen_7d117dd7b42cc40e :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_SensorID)))
+hs_bindgen_7d117dd7b42cc40e =
+  BG.fromFFIType hs_bindgen_7d117dd7b42cc40e_base
+
+{-# NOINLINE sDL_GetSensors #-}
+
+-- | Get a list of currently connected sensors.
+--
+--     [@count@]: a pointer filled in with the number of sensors returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of sensor instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensors@, defined at @SDL3\/SDL_sensor.h 159:44@
+sDL_GetSensors :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_SensorID))
+sDL_GetSensors =
+  BG.unsafePerformIO hs_bindgen_7d117dd7b42cc40e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorNameForID@
+foreign import ccall unsafe "hs_bindgen_064803dcda1d2e45"
+  hs_bindgen_064803dcda1d2e45_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorNameForID@
+hs_bindgen_064803dcda1d2e45 :: IO (BG.FunPtr (SDL_SensorID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_064803dcda1d2e45 =
+  BG.fromFFIType hs_bindgen_064803dcda1d2e45_base
+
+{-# NOINLINE sDL_GetSensorNameForID #-}
+
+-- | Get the implementation dependent name of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [@instance_id@]: the sensor instance ID.
+--
+--     [Returns]: the sensor name, or NULL if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorNameForID@, defined at @SDL3\/SDL_sensor.h 171:42@
+sDL_GetSensorNameForID :: BG.FunPtr (SDL_SensorID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetSensorNameForID =
+  BG.unsafePerformIO hs_bindgen_064803dcda1d2e45
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorTypeForID@
+foreign import ccall unsafe "hs_bindgen_15067de6fd7eab81"
+  hs_bindgen_15067de6fd7eab81_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorTypeForID@
+hs_bindgen_15067de6fd7eab81 :: IO (BG.FunPtr (SDL_SensorID -> IO SDL_SensorType))
+hs_bindgen_15067de6fd7eab81 =
+  BG.fromFFIType hs_bindgen_15067de6fd7eab81_base
+
+{-# NOINLINE sDL_GetSensorTypeForID #-}
+
+-- | Get the type of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [@instance_id@]: the sensor instance ID.
+--
+--     [Returns]: the 'SDL_SensorType', or @SDL_SENSOR_INVALID@ if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorTypeForID@, defined at @SDL3\/SDL_sensor.h 184:44@
+sDL_GetSensorTypeForID :: BG.FunPtr (SDL_SensorID -> IO SDL_SensorType)
+sDL_GetSensorTypeForID =
+  BG.unsafePerformIO hs_bindgen_15067de6fd7eab81
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorNonPortableTypeForID@
+foreign import ccall unsafe "hs_bindgen_93df6e86c5ae7de1"
+  hs_bindgen_93df6e86c5ae7de1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorNonPortableTypeForID@
+hs_bindgen_93df6e86c5ae7de1 :: IO (BG.FunPtr (SDL_SensorID -> IO BG.CInt))
+hs_bindgen_93df6e86c5ae7de1 =
+  BG.fromFFIType hs_bindgen_93df6e86c5ae7de1_base
+
+{-# NOINLINE sDL_GetSensorNonPortableTypeForID #-}
+
+-- | Get the platform dependent type of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [@instance_id@]: the sensor instance ID.
+--
+--     [Returns]: the sensor platform dependent type, or -1 if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorNonPortableTypeForID@, defined at @SDL3\/SDL_sensor.h 197:33@
+sDL_GetSensorNonPortableTypeForID :: BG.FunPtr (SDL_SensorID -> IO BG.CInt)
+sDL_GetSensorNonPortableTypeForID =
+  BG.unsafePerformIO hs_bindgen_93df6e86c5ae7de1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_OpenSensor@
+foreign import ccall unsafe "hs_bindgen_3ddd92169c898cc5"
+  hs_bindgen_3ddd92169c898cc5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_OpenSensor@
+hs_bindgen_3ddd92169c898cc5 :: IO (BG.FunPtr (SDL_SensorID -> IO (BG.Ptr SDL_Sensor)))
+hs_bindgen_3ddd92169c898cc5 =
+  BG.fromFFIType hs_bindgen_3ddd92169c898cc5_base
+
+{-# NOINLINE sDL_OpenSensor #-}
+
+-- | Open a sensor for use.
+--
+--     [@instance_id@]: the sensor instance ID.
+--
+--     [Returns]: an 'SDL_Sensor' object or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OpenSensor@, defined at @SDL3\/SDL_sensor.h 208:42@
+sDL_OpenSensor :: BG.FunPtr (SDL_SensorID -> IO (BG.Ptr SDL_Sensor))
+sDL_OpenSensor =
+  BG.unsafePerformIO hs_bindgen_3ddd92169c898cc5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorFromID@
+foreign import ccall unsafe "hs_bindgen_599e05d453695d54"
+  hs_bindgen_599e05d453695d54_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorFromID@
+hs_bindgen_599e05d453695d54 :: IO (BG.FunPtr (SDL_SensorID -> IO (BG.Ptr SDL_Sensor)))
+hs_bindgen_599e05d453695d54 =
+  BG.fromFFIType hs_bindgen_599e05d453695d54_base
+
+{-# NOINLINE sDL_GetSensorFromID #-}
+
+-- | Return the 'SDL_Sensor' associated with an instance ID.
+--
+--     [@instance_id@]: the sensor instance ID.
+--
+--     [Returns]: an 'SDL_Sensor' object or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorFromID@, defined at @SDL3\/SDL_sensor.h 219:42@
+sDL_GetSensorFromID :: BG.FunPtr (SDL_SensorID -> IO (BG.Ptr SDL_Sensor))
+sDL_GetSensorFromID =
+  BG.unsafePerformIO hs_bindgen_599e05d453695d54
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorProperties@
+foreign import ccall unsafe "hs_bindgen_4164cf08823b4939"
+  hs_bindgen_4164cf08823b4939_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorProperties@
+hs_bindgen_4164cf08823b4939
+  :: IO (BG.FunPtr (BG.Ptr SDL_Sensor -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_4164cf08823b4939 =
+  BG.fromFFIType hs_bindgen_4164cf08823b4939_base
+
+{-# NOINLINE sDL_GetSensorProperties #-}
+
+-- | Get the properties associated with a sensor.
+--
+--     [@sensor@]: the 'SDL_Sensor' object.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorProperties@, defined at @SDL3\/SDL_sensor.h 230:46@
+sDL_GetSensorProperties
+  :: BG.FunPtr (BG.Ptr SDL_Sensor -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetSensorProperties =
+  BG.unsafePerformIO hs_bindgen_4164cf08823b4939
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorName@
+foreign import ccall unsafe "hs_bindgen_73c9e66388d63d79"
+  hs_bindgen_73c9e66388d63d79_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorName@
+hs_bindgen_73c9e66388d63d79 :: IO (BG.FunPtr (BG.Ptr SDL_Sensor -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_73c9e66388d63d79 =
+  BG.fromFFIType hs_bindgen_73c9e66388d63d79_base
+
+{-# NOINLINE sDL_GetSensorName #-}
+
+-- | Get the implementation dependent name of a sensor.
+--
+--     [@sensor@]: the 'SDL_Sensor' object.
+--
+--     [Returns]: the sensor name or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorName@, defined at @SDL3\/SDL_sensor.h 241:42@
+sDL_GetSensorName :: BG.FunPtr (BG.Ptr SDL_Sensor -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetSensorName =
+  BG.unsafePerformIO hs_bindgen_73c9e66388d63d79
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorType@
+foreign import ccall unsafe "hs_bindgen_d2b64d0316fa8124"
+  hs_bindgen_d2b64d0316fa8124_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorType@
+hs_bindgen_d2b64d0316fa8124 :: IO (BG.FunPtr (BG.Ptr SDL_Sensor -> IO SDL_SensorType))
+hs_bindgen_d2b64d0316fa8124 =
+  BG.fromFFIType hs_bindgen_d2b64d0316fa8124_base
+
+{-# NOINLINE sDL_GetSensorType #-}
+
+-- | Get the type of a sensor.
+--
+--     [@sensor@]: the 'SDL_Sensor' object to inspect.
+--
+--     [Returns]: the 'SDL_SensorType' type, or @SDL_SENSOR_INVALID@ if @sensor@ is NULL.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorType@, defined at @SDL3\/SDL_sensor.h 252:44@
+sDL_GetSensorType :: BG.FunPtr (BG.Ptr SDL_Sensor -> IO SDL_SensorType)
+sDL_GetSensorType =
+  BG.unsafePerformIO hs_bindgen_d2b64d0316fa8124
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorNonPortableType@
+foreign import ccall unsafe "hs_bindgen_0e763d01bffcfa1a"
+  hs_bindgen_0e763d01bffcfa1a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorNonPortableType@
+hs_bindgen_0e763d01bffcfa1a :: IO (BG.FunPtr (BG.Ptr SDL_Sensor -> IO BG.CInt))
+hs_bindgen_0e763d01bffcfa1a =
+  BG.fromFFIType hs_bindgen_0e763d01bffcfa1a_base
+
+{-# NOINLINE sDL_GetSensorNonPortableType #-}
+
+-- | Get the platform dependent type of a sensor.
+--
+--     [@sensor@]: the 'SDL_Sensor' object to inspect.
+--
+--     [Returns]: the sensor platform dependent type, or -1 if @sensor@ is NULL.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorNonPortableType@, defined at @SDL3\/SDL_sensor.h 262:33@
+sDL_GetSensorNonPortableType :: BG.FunPtr (BG.Ptr SDL_Sensor -> IO BG.CInt)
+sDL_GetSensorNonPortableType =
+  BG.unsafePerformIO hs_bindgen_0e763d01bffcfa1a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorID@
+foreign import ccall unsafe "hs_bindgen_ccc4b71ce529cea1"
+  hs_bindgen_ccc4b71ce529cea1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorID@
+hs_bindgen_ccc4b71ce529cea1 :: IO (BG.FunPtr (BG.Ptr SDL_Sensor -> IO SDL_SensorID))
+hs_bindgen_ccc4b71ce529cea1 =
+  BG.fromFFIType hs_bindgen_ccc4b71ce529cea1_base
+
+{-# NOINLINE sDL_GetSensorID #-}
+
+-- | Get the instance ID of a sensor.
+--
+--     [@sensor@]: the 'SDL_Sensor' object to inspect.
+--
+--     [Returns]: the sensor instance ID, or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorID@, defined at @SDL3\/SDL_sensor.h 273:42@
+sDL_GetSensorID :: BG.FunPtr (BG.Ptr SDL_Sensor -> IO SDL_SensorID)
+sDL_GetSensorID =
+  BG.unsafePerformIO hs_bindgen_ccc4b71ce529cea1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorData@
+foreign import ccall unsafe "hs_bindgen_63c226fd6c34b399"
+  hs_bindgen_63c226fd6c34b399_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_GetSensorData@
+hs_bindgen_63c226fd6c34b399
+  :: IO (BG.FunPtr (BG.Ptr SDL_Sensor -> BG.Ptr BG.CFloat -> BG.CInt -> IO BG.CBool))
+hs_bindgen_63c226fd6c34b399 =
+  BG.fromFFIType hs_bindgen_63c226fd6c34b399_base
+
+{-# NOINLINE sDL_GetSensorData #-}
+
+-- | Get the current state of an opened sensor.
+--
+--     The number of values and interpretation of the data is sensor dependent.
+--
+--     [@sensor@]: the 'SDL_Sensor' object to query.
+--
+--     [@data@]: a pointer filled with the current sensor state.
+--
+--     [@num_values@]: the number of values to write to data.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorData@, defined at @SDL3\/SDL_sensor.h 288:34@
+sDL_GetSensorData :: BG.FunPtr (BG.Ptr SDL_Sensor -> BG.Ptr BG.CFloat -> BG.CInt -> IO BG.CBool)
+sDL_GetSensorData =
+  BG.unsafePerformIO hs_bindgen_63c226fd6c34b399
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_CloseSensor@
+foreign import ccall unsafe "hs_bindgen_a117a0cf60dc00d1"
+  hs_bindgen_a117a0cf60dc00d1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_CloseSensor@
+hs_bindgen_a117a0cf60dc00d1 :: IO (BG.FunPtr (BG.Ptr SDL_Sensor -> IO ()))
+hs_bindgen_a117a0cf60dc00d1 =
+  BG.fromFFIType hs_bindgen_a117a0cf60dc00d1_base
+
+{-# NOINLINE sDL_CloseSensor #-}
+
+-- | Close a sensor previously opened with @SDL_OpenSensor()@.
+--
+--     [@sensor@]: the 'SDL_Sensor' object to close.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CloseSensor@, defined at @SDL3\/SDL_sensor.h 297:34@
+sDL_CloseSensor :: BG.FunPtr (BG.Ptr SDL_Sensor -> IO ())
+sDL_CloseSensor =
+  BG.unsafePerformIO hs_bindgen_a117a0cf60dc00d1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_UpdateSensors@
+foreign import ccall unsafe "hs_bindgen_bbc7d6be143f2f1d"
+  hs_bindgen_bbc7d6be143f2f1d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_get_SDL_UpdateSensors@
+hs_bindgen_bbc7d6be143f2f1d :: IO (BG.FunPtr (IO ()))
+hs_bindgen_bbc7d6be143f2f1d =
+  BG.fromFFIType hs_bindgen_bbc7d6be143f2f1d_base
+
+{-# NOINLINE sDL_UpdateSensors #-}
+
+-- | Update the current state of the open sensors.
+--
+--     This is called automatically by the event loop if sensor events are enabled.
+--
+--     This needs to be called from the thread that initialized the sensor subsystem.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateSensors@, defined at @SDL3\/SDL_sensor.h 310:34@
+sDL_UpdateSensors :: BG.FunPtr (IO ())
+sDL_UpdateSensors =
+  BG.unsafePerformIO hs_bindgen_bbc7d6be143f2f1d
diff --git a/src/SDL3/Sys/Bindgen/Sensor/Safe.hs b/src/SDL3/Sys/Bindgen/Sensor/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Sensor/Safe.hs
@@ -0,0 +1,524 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Sensor.Safe (
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensors,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensorNameForID,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensorTypeForID,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensorNonPortableTypeForID,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_OpenSensor,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensorFromID,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensorProperties,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensorName,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensorType,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensorNonPortableType,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensorID,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_GetSensorData,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_CloseSensor,
+  SDL3.Sys.Bindgen.Sensor.Safe.sDL_UpdateSensors,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_sensor.h>"
+         , "SDL_SensorID *hs_bindgen_b61dd178746c7ddb ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensors)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_bcad5852f7430e0f ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorNameForID)(arg1);"
+         , "}"
+         , "SDL_SensorType hs_bindgen_d24575268bab12e0 ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorTypeForID)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_0cc7e36b2b816613 ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorNonPortableTypeForID)(arg1);"
+         , "}"
+         , "SDL_Sensor *hs_bindgen_ca89770aec33d403 ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenSensor)(arg1);"
+         , "}"
+         , "SDL_Sensor *hs_bindgen_c02f722bb2e6edde ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorFromID)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_635e63e84138735f ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorProperties)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_ecdd3ba2245007fb ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorName)(arg1);"
+         , "}"
+         , "SDL_SensorType hs_bindgen_6493367408e25f83 ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorType)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_a88558880074a522 ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorNonPortableType)(arg1);"
+         , "}"
+         , "SDL_SensorID hs_bindgen_de19e07a9cb2bdf7 ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorID)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_67086d7531309dea ("
+         , "  SDL_Sensor *arg1,"
+         , "  float *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorData)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_8ac47026ac2650df ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseSensor)(arg1);"
+         , "}"
+         , "void hs_bindgen_bcad9e8be73cbb74 (void)"
+         , "{"
+         , "  (SDL_UpdateSensors)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensors@
+foreign import ccall safe "hs_bindgen_b61dd178746c7ddb"
+  hs_bindgen_b61dd178746c7ddb_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensors@
+hs_bindgen_b61dd178746c7ddb
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_SensorID)
+hs_bindgen_b61dd178746c7ddb =
+  BG.fromFFIType hs_bindgen_b61dd178746c7ddb_base
+
+-- | Get a list of currently connected sensors.
+--
+--     [Returns]: a 0 terminated array of sensor instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensors@, defined at @SDL3\/SDL_sensor.h 159:44@
+sDL_GetSensors
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of sensors returned, may be NULL.
+  -> IO (BG.Ptr SDL_SensorID)
+sDL_GetSensors = hs_bindgen_b61dd178746c7ddb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorNameForID@
+foreign import ccall safe "hs_bindgen_bcad5852f7430e0f"
+  hs_bindgen_bcad5852f7430e0f_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorNameForID@
+hs_bindgen_bcad5852f7430e0f
+  :: SDL_SensorID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_bcad5852f7430e0f =
+  BG.fromFFIType hs_bindgen_bcad5852f7430e0f_base
+
+-- | Get the implementation dependent name of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the sensor name, or NULL if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorNameForID@, defined at @SDL3\/SDL_sensor.h 171:42@
+sDL_GetSensorNameForID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetSensorNameForID = hs_bindgen_bcad5852f7430e0f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorTypeForID@
+foreign import ccall safe "hs_bindgen_d24575268bab12e0"
+  hs_bindgen_d24575268bab12e0_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorTypeForID@
+hs_bindgen_d24575268bab12e0
+  :: SDL_SensorID
+  -> IO SDL_SensorType
+hs_bindgen_d24575268bab12e0 =
+  BG.fromFFIType hs_bindgen_d24575268bab12e0_base
+
+-- | Get the type of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the 'SDL_SensorType', or @SDL_SENSOR_INVALID@ if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorTypeForID@, defined at @SDL3\/SDL_sensor.h 184:44@
+sDL_GetSensorTypeForID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO SDL_SensorType
+sDL_GetSensorTypeForID = hs_bindgen_d24575268bab12e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorNonPortableTypeForID@
+foreign import ccall safe "hs_bindgen_0cc7e36b2b816613"
+  hs_bindgen_0cc7e36b2b816613_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorNonPortableTypeForID@
+hs_bindgen_0cc7e36b2b816613
+  :: SDL_SensorID
+  -> IO BG.CInt
+hs_bindgen_0cc7e36b2b816613 =
+  BG.fromFFIType hs_bindgen_0cc7e36b2b816613_base
+
+-- | Get the platform dependent type of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the sensor platform dependent type, or -1 if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorNonPortableTypeForID@, defined at @SDL3\/SDL_sensor.h 197:33@
+sDL_GetSensorNonPortableTypeForID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO BG.CInt
+sDL_GetSensorNonPortableTypeForID =
+  hs_bindgen_0cc7e36b2b816613
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_OpenSensor@
+foreign import ccall safe "hs_bindgen_ca89770aec33d403"
+  hs_bindgen_ca89770aec33d403_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_OpenSensor@
+hs_bindgen_ca89770aec33d403
+  :: SDL_SensorID
+  -> IO (BG.Ptr SDL_Sensor)
+hs_bindgen_ca89770aec33d403 =
+  BG.fromFFIType hs_bindgen_ca89770aec33d403_base
+
+-- | Open a sensor for use.
+--
+--     [Returns]: an 'SDL_Sensor' object or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OpenSensor@, defined at @SDL3\/SDL_sensor.h 208:42@
+sDL_OpenSensor
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (BG.Ptr SDL_Sensor)
+sDL_OpenSensor = hs_bindgen_ca89770aec33d403
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorFromID@
+foreign import ccall safe "hs_bindgen_c02f722bb2e6edde"
+  hs_bindgen_c02f722bb2e6edde_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorFromID@
+hs_bindgen_c02f722bb2e6edde
+  :: SDL_SensorID
+  -> IO (BG.Ptr SDL_Sensor)
+hs_bindgen_c02f722bb2e6edde =
+  BG.fromFFIType hs_bindgen_c02f722bb2e6edde_base
+
+-- | Return the 'SDL_Sensor' associated with an instance ID.
+--
+--     [Returns]: an 'SDL_Sensor' object or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorFromID@, defined at @SDL3\/SDL_sensor.h 219:42@
+sDL_GetSensorFromID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (BG.Ptr SDL_Sensor)
+sDL_GetSensorFromID = hs_bindgen_c02f722bb2e6edde
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorProperties@
+foreign import ccall safe "hs_bindgen_635e63e84138735f"
+  hs_bindgen_635e63e84138735f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorProperties@
+hs_bindgen_635e63e84138735f
+  :: BG.Ptr SDL_Sensor
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_635e63e84138735f =
+  BG.fromFFIType hs_bindgen_635e63e84138735f_base
+
+-- | Get the properties associated with a sensor.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorProperties@, defined at @SDL3\/SDL_sensor.h 230:46@
+sDL_GetSensorProperties
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetSensorProperties = hs_bindgen_635e63e84138735f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorName@
+foreign import ccall safe "hs_bindgen_ecdd3ba2245007fb"
+  hs_bindgen_ecdd3ba2245007fb_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorName@
+hs_bindgen_ecdd3ba2245007fb
+  :: BG.Ptr SDL_Sensor
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_ecdd3ba2245007fb =
+  BG.fromFFIType hs_bindgen_ecdd3ba2245007fb_base
+
+-- | Get the implementation dependent name of a sensor.
+--
+--     [Returns]: the sensor name or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorName@, defined at @SDL3\/SDL_sensor.h 241:42@
+sDL_GetSensorName
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetSensorName = hs_bindgen_ecdd3ba2245007fb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorType@
+foreign import ccall safe "hs_bindgen_6493367408e25f83"
+  hs_bindgen_6493367408e25f83_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorType@
+hs_bindgen_6493367408e25f83
+  :: BG.Ptr SDL_Sensor
+  -> IO SDL_SensorType
+hs_bindgen_6493367408e25f83 =
+  BG.fromFFIType hs_bindgen_6493367408e25f83_base
+
+-- | Get the type of a sensor.
+--
+--     [Returns]: the 'SDL_SensorType' type, or @SDL_SENSOR_INVALID@ if @sensor@ is NULL.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorType@, defined at @SDL3\/SDL_sensor.h 252:44@
+sDL_GetSensorType
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO SDL_SensorType
+sDL_GetSensorType = hs_bindgen_6493367408e25f83
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorNonPortableType@
+foreign import ccall safe "hs_bindgen_a88558880074a522"
+  hs_bindgen_a88558880074a522_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorNonPortableType@
+hs_bindgen_a88558880074a522
+  :: BG.Ptr SDL_Sensor
+  -> IO BG.CInt
+hs_bindgen_a88558880074a522 =
+  BG.fromFFIType hs_bindgen_a88558880074a522_base
+
+-- | Get the platform dependent type of a sensor.
+--
+--     [Returns]: the sensor platform dependent type, or -1 if @sensor@ is NULL.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorNonPortableType@, defined at @SDL3\/SDL_sensor.h 262:33@
+sDL_GetSensorNonPortableType
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO BG.CInt
+sDL_GetSensorNonPortableType =
+  hs_bindgen_a88558880074a522
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorID@
+foreign import ccall safe "hs_bindgen_de19e07a9cb2bdf7"
+  hs_bindgen_de19e07a9cb2bdf7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorID@
+hs_bindgen_de19e07a9cb2bdf7
+  :: BG.Ptr SDL_Sensor
+  -> IO SDL_SensorID
+hs_bindgen_de19e07a9cb2bdf7 =
+  BG.fromFFIType hs_bindgen_de19e07a9cb2bdf7_base
+
+-- | Get the instance ID of a sensor.
+--
+--     [Returns]: the sensor instance ID, or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorID@, defined at @SDL3\/SDL_sensor.h 273:42@
+sDL_GetSensorID
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO SDL_SensorID
+sDL_GetSensorID = hs_bindgen_de19e07a9cb2bdf7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorData@
+foreign import ccall safe "hs_bindgen_67086d7531309dea"
+  hs_bindgen_67086d7531309dea_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_GetSensorData@
+hs_bindgen_67086d7531309dea
+  :: BG.Ptr SDL_Sensor
+  -> BG.Ptr BG.CFloat
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_67086d7531309dea =
+  BG.fromFFIType hs_bindgen_67086d7531309dea_base
+
+-- | Get the current state of an opened sensor.
+--
+--     The number of values and interpretation of the data is sensor dependent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorData@, defined at @SDL3\/SDL_sensor.h 288:34@
+sDL_GetSensorData
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@data@]: a pointer filled with the current sensor state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_values@]: the number of values to write to data.
+  -> IO BG.CBool
+sDL_GetSensorData = hs_bindgen_67086d7531309dea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_CloseSensor@
+foreign import ccall safe "hs_bindgen_8ac47026ac2650df"
+  hs_bindgen_8ac47026ac2650df_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_CloseSensor@
+hs_bindgen_8ac47026ac2650df
+  :: BG.Ptr SDL_Sensor
+  -> IO ()
+hs_bindgen_8ac47026ac2650df =
+  BG.fromFFIType hs_bindgen_8ac47026ac2650df_base
+
+-- | Close a sensor previously opened with @SDL_OpenSensor()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CloseSensor@, defined at @SDL3\/SDL_sensor.h 297:34@
+sDL_CloseSensor
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to close.
+  -> IO ()
+sDL_CloseSensor = hs_bindgen_8ac47026ac2650df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_UpdateSensors@
+foreign import ccall safe "hs_bindgen_bcad9e8be73cbb74"
+  hs_bindgen_bcad9e8be73cbb74_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Safe_SDL_UpdateSensors@
+hs_bindgen_bcad9e8be73cbb74 :: IO ()
+hs_bindgen_bcad9e8be73cbb74 =
+  BG.fromFFIType hs_bindgen_bcad9e8be73cbb74_base
+
+-- | Update the current state of the open sensors.
+--
+--     This is called automatically by the event loop if sensor events are enabled.
+--
+--     This needs to be called from the thread that initialized the sensor subsystem.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateSensors@, defined at @SDL3\/SDL_sensor.h 310:34@
+sDL_UpdateSensors :: IO ()
+sDL_UpdateSensors = hs_bindgen_bcad9e8be73cbb74
diff --git a/src/SDL3/Sys/Bindgen/Sensor/Unsafe.hs b/src/SDL3/Sys/Bindgen/Sensor/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Sensor/Unsafe.hs
@@ -0,0 +1,524 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Sensor.Unsafe (
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensors,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensorNameForID,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensorTypeForID,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensorNonPortableTypeForID,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_OpenSensor,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensorFromID,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensorProperties,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensorName,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensorType,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensorNonPortableType,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensorID,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_GetSensorData,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_CloseSensor,
+  SDL3.Sys.Bindgen.Sensor.Unsafe.sDL_UpdateSensors,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_sensor.h>"
+         , "SDL_SensorID *hs_bindgen_ee6d720498ccfcf9 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensors)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_fa9519ef92359fd7 ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorNameForID)(arg1);"
+         , "}"
+         , "SDL_SensorType hs_bindgen_b228ff19dccc3470 ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorTypeForID)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_55dc63ea84b90dfd ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorNonPortableTypeForID)(arg1);"
+         , "}"
+         , "SDL_Sensor *hs_bindgen_96a064de06af7f5b ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenSensor)(arg1);"
+         , "}"
+         , "SDL_Sensor *hs_bindgen_538466d72bb89e2a ("
+         , "  SDL_SensorID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorFromID)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_bd4281541ec37b4a ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorProperties)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_0b99eed337a49b0f ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorName)(arg1);"
+         , "}"
+         , "SDL_SensorType hs_bindgen_a8f08b8d675c0eb3 ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorType)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_559a0243cc021a62 ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorNonPortableType)(arg1);"
+         , "}"
+         , "SDL_SensorID hs_bindgen_83b38918f593ff72 ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorID)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_e4251a0c2836940f ("
+         , "  SDL_Sensor *arg1,"
+         , "  float *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSensorData)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_55183617e9522a14 ("
+         , "  SDL_Sensor *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_CloseSensor)(arg1);"
+         , "}"
+         , "void hs_bindgen_da4b495835d9041d (void)"
+         , "{"
+         , "  (SDL_UpdateSensors)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensors@
+foreign import ccall unsafe "hs_bindgen_ee6d720498ccfcf9"
+  hs_bindgen_ee6d720498ccfcf9_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensors@
+hs_bindgen_ee6d720498ccfcf9
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_SensorID)
+hs_bindgen_ee6d720498ccfcf9 =
+  BG.fromFFIType hs_bindgen_ee6d720498ccfcf9_base
+
+-- | Get a list of currently connected sensors.
+--
+--     [Returns]: a 0 terminated array of sensor instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensors@, defined at @SDL3\/SDL_sensor.h 159:44@
+sDL_GetSensors
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of sensors returned, may be NULL.
+  -> IO (BG.Ptr SDL_SensorID)
+sDL_GetSensors = hs_bindgen_ee6d720498ccfcf9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorNameForID@
+foreign import ccall unsafe "hs_bindgen_fa9519ef92359fd7"
+  hs_bindgen_fa9519ef92359fd7_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorNameForID@
+hs_bindgen_fa9519ef92359fd7
+  :: SDL_SensorID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_fa9519ef92359fd7 =
+  BG.fromFFIType hs_bindgen_fa9519ef92359fd7_base
+
+-- | Get the implementation dependent name of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the sensor name, or NULL if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorNameForID@, defined at @SDL3\/SDL_sensor.h 171:42@
+sDL_GetSensorNameForID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetSensorNameForID = hs_bindgen_fa9519ef92359fd7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorTypeForID@
+foreign import ccall unsafe "hs_bindgen_b228ff19dccc3470"
+  hs_bindgen_b228ff19dccc3470_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorTypeForID@
+hs_bindgen_b228ff19dccc3470
+  :: SDL_SensorID
+  -> IO SDL_SensorType
+hs_bindgen_b228ff19dccc3470 =
+  BG.fromFFIType hs_bindgen_b228ff19dccc3470_base
+
+-- | Get the type of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the 'SDL_SensorType', or @SDL_SENSOR_INVALID@ if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorTypeForID@, defined at @SDL3\/SDL_sensor.h 184:44@
+sDL_GetSensorTypeForID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO SDL_SensorType
+sDL_GetSensorTypeForID = hs_bindgen_b228ff19dccc3470
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorNonPortableTypeForID@
+foreign import ccall unsafe "hs_bindgen_55dc63ea84b90dfd"
+  hs_bindgen_55dc63ea84b90dfd_base
+    :: BG.Word32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorNonPortableTypeForID@
+hs_bindgen_55dc63ea84b90dfd
+  :: SDL_SensorID
+  -> IO BG.CInt
+hs_bindgen_55dc63ea84b90dfd =
+  BG.fromFFIType hs_bindgen_55dc63ea84b90dfd_base
+
+-- | Get the platform dependent type of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the sensor platform dependent type, or -1 if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorNonPortableTypeForID@, defined at @SDL3\/SDL_sensor.h 197:33@
+sDL_GetSensorNonPortableTypeForID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO BG.CInt
+sDL_GetSensorNonPortableTypeForID =
+  hs_bindgen_55dc63ea84b90dfd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_OpenSensor@
+foreign import ccall unsafe "hs_bindgen_96a064de06af7f5b"
+  hs_bindgen_96a064de06af7f5b_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_OpenSensor@
+hs_bindgen_96a064de06af7f5b
+  :: SDL_SensorID
+  -> IO (BG.Ptr SDL_Sensor)
+hs_bindgen_96a064de06af7f5b =
+  BG.fromFFIType hs_bindgen_96a064de06af7f5b_base
+
+-- | Open a sensor for use.
+--
+--     [Returns]: an 'SDL_Sensor' object or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OpenSensor@, defined at @SDL3\/SDL_sensor.h 208:42@
+sDL_OpenSensor
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (BG.Ptr SDL_Sensor)
+sDL_OpenSensor = hs_bindgen_96a064de06af7f5b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorFromID@
+foreign import ccall unsafe "hs_bindgen_538466d72bb89e2a"
+  hs_bindgen_538466d72bb89e2a_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorFromID@
+hs_bindgen_538466d72bb89e2a
+  :: SDL_SensorID
+  -> IO (BG.Ptr SDL_Sensor)
+hs_bindgen_538466d72bb89e2a =
+  BG.fromFFIType hs_bindgen_538466d72bb89e2a_base
+
+-- | Return the 'SDL_Sensor' associated with an instance ID.
+--
+--     [Returns]: an 'SDL_Sensor' object or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorFromID@, defined at @SDL3\/SDL_sensor.h 219:42@
+sDL_GetSensorFromID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (BG.Ptr SDL_Sensor)
+sDL_GetSensorFromID = hs_bindgen_538466d72bb89e2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorProperties@
+foreign import ccall unsafe "hs_bindgen_bd4281541ec37b4a"
+  hs_bindgen_bd4281541ec37b4a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorProperties@
+hs_bindgen_bd4281541ec37b4a
+  :: BG.Ptr SDL_Sensor
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_bd4281541ec37b4a =
+  BG.fromFFIType hs_bindgen_bd4281541ec37b4a_base
+
+-- | Get the properties associated with a sensor.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorProperties@, defined at @SDL3\/SDL_sensor.h 230:46@
+sDL_GetSensorProperties
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetSensorProperties = hs_bindgen_bd4281541ec37b4a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorName@
+foreign import ccall unsafe "hs_bindgen_0b99eed337a49b0f"
+  hs_bindgen_0b99eed337a49b0f_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorName@
+hs_bindgen_0b99eed337a49b0f
+  :: BG.Ptr SDL_Sensor
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_0b99eed337a49b0f =
+  BG.fromFFIType hs_bindgen_0b99eed337a49b0f_base
+
+-- | Get the implementation dependent name of a sensor.
+--
+--     [Returns]: the sensor name or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorName@, defined at @SDL3\/SDL_sensor.h 241:42@
+sDL_GetSensorName
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetSensorName = hs_bindgen_0b99eed337a49b0f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorType@
+foreign import ccall unsafe "hs_bindgen_a8f08b8d675c0eb3"
+  hs_bindgen_a8f08b8d675c0eb3_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorType@
+hs_bindgen_a8f08b8d675c0eb3
+  :: BG.Ptr SDL_Sensor
+  -> IO SDL_SensorType
+hs_bindgen_a8f08b8d675c0eb3 =
+  BG.fromFFIType hs_bindgen_a8f08b8d675c0eb3_base
+
+-- | Get the type of a sensor.
+--
+--     [Returns]: the 'SDL_SensorType' type, or @SDL_SENSOR_INVALID@ if @sensor@ is NULL.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorType@, defined at @SDL3\/SDL_sensor.h 252:44@
+sDL_GetSensorType
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO SDL_SensorType
+sDL_GetSensorType = hs_bindgen_a8f08b8d675c0eb3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorNonPortableType@
+foreign import ccall unsafe "hs_bindgen_559a0243cc021a62"
+  hs_bindgen_559a0243cc021a62_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorNonPortableType@
+hs_bindgen_559a0243cc021a62
+  :: BG.Ptr SDL_Sensor
+  -> IO BG.CInt
+hs_bindgen_559a0243cc021a62 =
+  BG.fromFFIType hs_bindgen_559a0243cc021a62_base
+
+-- | Get the platform dependent type of a sensor.
+--
+--     [Returns]: the sensor platform dependent type, or -1 if @sensor@ is NULL.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorNonPortableType@, defined at @SDL3\/SDL_sensor.h 262:33@
+sDL_GetSensorNonPortableType
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO BG.CInt
+sDL_GetSensorNonPortableType =
+  hs_bindgen_559a0243cc021a62
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorID@
+foreign import ccall unsafe "hs_bindgen_83b38918f593ff72"
+  hs_bindgen_83b38918f593ff72_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorID@
+hs_bindgen_83b38918f593ff72
+  :: BG.Ptr SDL_Sensor
+  -> IO SDL_SensorID
+hs_bindgen_83b38918f593ff72 =
+  BG.fromFFIType hs_bindgen_83b38918f593ff72_base
+
+-- | Get the instance ID of a sensor.
+--
+--     [Returns]: the sensor instance ID, or 0 on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorID@, defined at @SDL3\/SDL_sensor.h 273:42@
+sDL_GetSensorID
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO SDL_SensorID
+sDL_GetSensorID = hs_bindgen_83b38918f593ff72
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorData@
+foreign import ccall unsafe "hs_bindgen_e4251a0c2836940f"
+  hs_bindgen_e4251a0c2836940f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_GetSensorData@
+hs_bindgen_e4251a0c2836940f
+  :: BG.Ptr SDL_Sensor
+  -> BG.Ptr BG.CFloat
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_e4251a0c2836940f =
+  BG.fromFFIType hs_bindgen_e4251a0c2836940f_base
+
+-- | Get the current state of an opened sensor.
+--
+--     The number of values and interpretation of the data is sensor dependent.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSensorData@, defined at @SDL3\/SDL_sensor.h 288:34@
+sDL_GetSensorData
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@data@]: a pointer filled with the current sensor state.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@num_values@]: the number of values to write to data.
+  -> IO BG.CBool
+sDL_GetSensorData = hs_bindgen_e4251a0c2836940f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_CloseSensor@
+foreign import ccall unsafe "hs_bindgen_55183617e9522a14"
+  hs_bindgen_55183617e9522a14_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_CloseSensor@
+hs_bindgen_55183617e9522a14
+  :: BG.Ptr SDL_Sensor
+  -> IO ()
+hs_bindgen_55183617e9522a14 =
+  BG.fromFFIType hs_bindgen_55183617e9522a14_base
+
+-- | Close a sensor previously opened with @SDL_OpenSensor()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CloseSensor@, defined at @SDL3\/SDL_sensor.h 297:34@
+sDL_CloseSensor
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to close.
+  -> IO ()
+sDL_CloseSensor = hs_bindgen_55183617e9522a14
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_UpdateSensors@
+foreign import ccall unsafe "hs_bindgen_da4b495835d9041d"
+  hs_bindgen_da4b495835d9041d_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Sensor_Unsafe_SDL_UpdateSensors@
+hs_bindgen_da4b495835d9041d :: IO ()
+hs_bindgen_da4b495835d9041d =
+  BG.fromFFIType hs_bindgen_da4b495835d9041d_base
+
+-- | Update the current state of the open sensors.
+--
+--     This is called automatically by the event loop if sensor events are enabled.
+--
+--     This needs to be called from the thread that initialized the sensor subsystem.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateSensors@, defined at @SDL3\/SDL_sensor.h 310:34@
+sDL_UpdateSensors :: IO ()
+sDL_UpdateSensors = hs_bindgen_da4b495835d9041d
diff --git a/src/SDL3/Sys/Bindgen/Stdinc.hs b/src/SDL3/Sys/Bindgen/Stdinc.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Stdinc.hs
@@ -0,0 +1,1624 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+module SDL3.Sys.Bindgen.Stdinc (
+  SDL3.Sys.Bindgen.Stdinc.Sint8 (..),
+  SDL3.Sys.Bindgen.Stdinc.Uint8 (..),
+  SDL3.Sys.Bindgen.Stdinc.Sint16 (..),
+  SDL3.Sys.Bindgen.Stdinc.Uint16 (..),
+  SDL3.Sys.Bindgen.Stdinc.Sint32 (..),
+  SDL3.Sys.Bindgen.Stdinc.Uint32 (..),
+  SDL3.Sys.Bindgen.Stdinc.Sint64 (..),
+  SDL3.Sys.Bindgen.Stdinc.Uint64 (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_Time (..),
+  SDL3.Sys.Bindgen.Stdinc.sDL_FLT_EPSILON,
+  SDL3.Sys.Bindgen.Stdinc.sDL_PRILL_PREFIX,
+  SDL3.Sys.Bindgen.Stdinc.SDL_alignment_test (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_DUMMY_ENUM (..),
+  pattern SDL3.Sys.Bindgen.Stdinc.DUMMY_ENUM_VALUE,
+  SDL3.Sys.Bindgen.Stdinc.SDL_malloc_func_Aux (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_malloc_func (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_calloc_func_Aux (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_calloc_func (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_realloc_func_Aux (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_realloc_func (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_free_func_Aux (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_free_func (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_Environment,
+  SDL3.Sys.Bindgen.Stdinc.SDL_CompareCallback_Aux (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_CompareCallback (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_CompareCallback_r_Aux (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_CompareCallback_r (..),
+  SDL3.Sys.Bindgen.Stdinc.sDL_INVALID_UNICODE_CODEPOINT,
+  SDL3.Sys.Bindgen.Stdinc.sDL_PI_D,
+  SDL3.Sys.Bindgen.Stdinc.sDL_PI_F,
+  SDL3.Sys.Bindgen.Stdinc.SDL_iconv_data_t,
+  SDL3.Sys.Bindgen.Stdinc.SDL_iconv_t (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer_Aux (..),
+  SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | A signed 8-bit integer type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @Sint8@, defined at @SDL3\/SDL_stdinc.h 437:16@
+newtype Sint8 = Sint8
+  { unwrap :: HsBindgen.Runtime.LibC.Int8
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Int8)
+  => BG.CompatHasField.HasField "unwrap" Sint8 ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          Sint8{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Int8)
+  => BG.HasField "unwrap" (BG.Ptr Sint8) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField Sint8 "unwrap" where
+  type
+    CFieldType Sint8 "unwrap" =
+      HsBindgen.Runtime.LibC.Int8
+
+  offset# = \_ -> \_ -> 0
+
+-- | An unsigned 8-bit integer type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @Uint8@, defined at @SDL3\/SDL_stdinc.h 446:17@
+newtype Uint8 = Uint8
+  { unwrap :: HsBindgen.Runtime.LibC.Word8
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Word8)
+  => BG.CompatHasField.HasField "unwrap" Uint8 ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          Uint8{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Word8)
+  => BG.HasField "unwrap" (BG.Ptr Uint8) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField Uint8 "unwrap" where
+  type
+    CFieldType Uint8 "unwrap" =
+      HsBindgen.Runtime.LibC.Word8
+
+  offset# = \_ -> \_ -> 0
+
+-- | A signed 16-bit integer type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @Sint16@, defined at @SDL3\/SDL_stdinc.h 455:17@
+newtype Sint16 = Sint16
+  { unwrap :: HsBindgen.Runtime.LibC.Int16
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Int16)
+  => BG.CompatHasField.HasField "unwrap" Sint16 ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          Sint16{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Int16)
+  => BG.HasField "unwrap" (BG.Ptr Sint16) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField Sint16 "unwrap" where
+  type
+    CFieldType Sint16 "unwrap" =
+      HsBindgen.Runtime.LibC.Int16
+
+  offset# = \_ -> \_ -> 0
+
+-- | An unsigned 16-bit integer type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @Uint16@, defined at @SDL3\/SDL_stdinc.h 464:18@
+newtype Uint16 = Uint16
+  { unwrap :: HsBindgen.Runtime.LibC.Word16
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Word16)
+  => BG.CompatHasField.HasField "unwrap" Uint16 ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          Uint16{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Word16)
+  => BG.HasField "unwrap" (BG.Ptr Uint16) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField Uint16 "unwrap" where
+  type
+    CFieldType Uint16 "unwrap" =
+      HsBindgen.Runtime.LibC.Word16
+
+  offset# = \_ -> \_ -> 0
+
+-- | A signed 32-bit integer type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @Sint32@, defined at @SDL3\/SDL_stdinc.h 473:17@
+newtype Sint32 = Sint32
+  { unwrap :: HsBindgen.Runtime.LibC.Int32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Int32)
+  => BG.CompatHasField.HasField "unwrap" Sint32 ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          Sint32{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Int32)
+  => BG.HasField "unwrap" (BG.Ptr Sint32) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField Sint32 "unwrap" where
+  type
+    CFieldType Sint32 "unwrap" =
+      HsBindgen.Runtime.LibC.Int32
+
+  offset# = \_ -> \_ -> 0
+
+-- | An unsigned 32-bit integer type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @Uint32@, defined at @SDL3\/SDL_stdinc.h 482:18@
+newtype Uint32 = Uint32
+  { unwrap :: HsBindgen.Runtime.LibC.Word32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Word32)
+  => BG.CompatHasField.HasField "unwrap" Uint32 ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          Uint32{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Word32)
+  => BG.HasField "unwrap" (BG.Ptr Uint32) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField Uint32 "unwrap" where
+  type
+    CFieldType Uint32 "unwrap" =
+      HsBindgen.Runtime.LibC.Word32
+
+  offset# = \_ -> \_ -> 0
+
+-- | A signed 64-bit integer type.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_SINT64_C@
+--
+--     [C declaration]: @Sint64@, defined at @SDL3\/SDL_stdinc.h 493:17@
+newtype Sint64 = Sint64
+  { unwrap :: HsBindgen.Runtime.LibC.Int64
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Int64)
+  => BG.CompatHasField.HasField "unwrap" Sint64 ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          Sint64{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Int64)
+  => BG.HasField "unwrap" (BG.Ptr Sint64) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField Sint64 "unwrap" where
+  type
+    CFieldType Sint64 "unwrap" =
+      HsBindgen.Runtime.LibC.Int64
+
+  offset# = \_ -> \_ -> 0
+
+-- | An unsigned 64-bit integer type.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_UINT64_C@
+--
+--     [C declaration]: @Uint64@, defined at @SDL3\/SDL_stdinc.h 504:18@
+newtype Uint64 = Uint64
+  { unwrap :: HsBindgen.Runtime.LibC.Word64
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Word64)
+  => BG.CompatHasField.HasField "unwrap" Uint64 ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          Uint64{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.Word64)
+  => BG.HasField "unwrap" (BG.Ptr Uint64) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField Uint64 "unwrap" where
+  type
+    CFieldType Uint64 "unwrap" =
+      HsBindgen.Runtime.LibC.Word64
+
+  offset# = \_ -> \_ -> 0
+
+-- | SDL times are signed, 64-bit integers representing nanoseconds since the Unix epoch (Jan 1, 1970).
+--
+--     They can be converted between POSIX time_t values with SDL_NS_TO_SECONDS() and SDL_SECONDS_TO_NS(), and between Windows FILETIME values with SDL_TimeToWindows() and SDL_TimeFromWindows().
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MAX_SINT64@, @SDL_MIN_SINT64@
+--
+--     [C declaration]: @SDL_Time@, defined at @SDL3\/SDL_stdinc.h 521:16@
+newtype SDL_Time = SDL_Time
+  { unwrap :: Sint64
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance (ty ~ Sint64) => BG.CompatHasField.HasField "unwrap" SDL_Time ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Time{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ Sint64)
+  => BG.HasField "unwrap" (BG.Ptr SDL_Time) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_Time "unwrap" where
+  type CFieldType SDL_Time "unwrap" = Sint64
+
+  offset# = \_ -> \_ -> 0
+
+-- | Epsilon constant, used for comparing floating-point numbers.
+--
+--     Equals by default to platform-defined @FLT_EPSILON@, or @1.1920928955078125e-07F@ if that\'s not available.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_FLT_EPSILON@, defined at @SDL3\/SDL_stdinc.h 544:9@
+sDL_FLT_EPSILON :: BG.CFloat
+sDL_FLT_EPSILON = (1.1920929e-7 :: BG.CFloat)
+
+-- | [C declaration]: @macro SDL_PRILL_PREFIX@, literal @\"ll\"@, defined at @SDL3\/SDL_stdinc.h 808:9@
+sDL_PRILL_PREFIX :: BG.ByteString
+sDL_PRILL_PREFIX = BG.pack [0x6C, 0x6C]
+
+-- | [C declaration]: @struct SDL_alignment_test@, defined at @SDL3\/SDL_stdinc.h 1182:16@
+data SDL_alignment_test = SDL_alignment_test
+  { a :: Uint8
+  -- ^ [C declaration]: @a@, defined at @SDL3\/SDL_stdinc.h 1184:11@
+  , b :: BG.Ptr BG.Void
+  -- ^ [C declaration]: @b@, defined at @SDL3\/SDL_stdinc.h 1185:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_alignment_test where
+  staticSizeOf = \_ -> (16 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_alignment_test where
+  readRaw =
+    \ptr0 ->
+      pure SDL_alignment_test
+        <*> HasCField.readRaw (BG.Proxy @"a") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"b") ptr0
+
+instance Marshal.WriteRaw SDL_alignment_test where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_alignment_test a2 b3 ->
+            HasCField.writeRaw (BG.Proxy @"a") ptr0 a2
+              >> HasCField.writeRaw (BG.Proxy @"b") ptr0 b3
+
+deriving via Marshal.EquivStorable SDL_alignment_test instance BG.Storable SDL_alignment_test
+
+instance
+  (ty ~ Uint8)
+  => BG.CompatHasField.HasField "a" SDL_alignment_test ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_alignment_test{a = y1, b = BG.getField @"b" x0}
+      , BG.getField @"a" x0
+      )
+
+instance
+  (ty ~ Uint8)
+  => BG.HasField "a" (BG.Ptr SDL_alignment_test) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"a")
+
+instance HasCField.HasCField SDL_alignment_test "a" where
+  type CFieldType SDL_alignment_test "a" = Uint8
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "b" SDL_alignment_test ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_alignment_test{b = y1, a = BG.getField @"a" x0}
+      , BG.getField @"b" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "b" (BG.Ptr SDL_alignment_test) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"b")
+
+instance HasCField.HasCField SDL_alignment_test "b" where
+  type
+    CFieldType SDL_alignment_test "b" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 8
+
+-- | [C declaration]: @enum SDL_DUMMY_ENUM@, defined at @SDL3\/SDL_stdinc.h 1202:14@
+newtype SDL_DUMMY_ENUM = SDL_DUMMY_ENUM
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_DUMMY_ENUM where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_DUMMY_ENUM where
+  readRaw =
+    \ptr0 ->
+      pure SDL_DUMMY_ENUM
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_DUMMY_ENUM where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_DUMMY_ENUM unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_DUMMY_ENUM instance BG.Storable SDL_DUMMY_ENUM
+
+deriving via BG.CUInt instance BG.Prim SDL_DUMMY_ENUM
+
+instance CEnum.CEnum SDL_DUMMY_ENUM where
+  type CEnumZ SDL_DUMMY_ENUM = BG.CUInt
+
+  toCEnum = SDL_DUMMY_ENUM
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList [(0, BG.singleton "DUMMY_ENUM_VALUE")]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_DUMMY_ENUM"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_DUMMY_ENUM"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_DUMMY_ENUM where
+  minDeclaredValue = DUMMY_ENUM_VALUE
+
+  maxDeclaredValue = DUMMY_ENUM_VALUE
+
+instance Show SDL_DUMMY_ENUM where
+  showsPrec = CEnum.shows
+
+instance Read SDL_DUMMY_ENUM where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_DUMMY_ENUM ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DUMMY_ENUM{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_DUMMY_ENUM) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_DUMMY_ENUM "unwrap" where
+  type CFieldType SDL_DUMMY_ENUM "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @DUMMY_ENUM_VALUE@, defined at @SDL3\/SDL_stdinc.h 1204:5@
+pattern DUMMY_ENUM_VALUE :: SDL_DUMMY_ENUM
+pattern DUMMY_ENUM_VALUE = SDL_DUMMY_ENUM 0
+
+-- | Auxiliary type used by 'SDL_malloc_func'
+--
+--     [C declaration]: @SDL_malloc_func@, defined at @SDL3\/SDL_stdinc.h 1445:25@
+newtype SDL_malloc_func_Aux = SDL_malloc_func_Aux
+  { unwrap :: HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_malloc_func_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_5c5a0694498aea22_base
+    :: (BG.Word64 -> IO (BG.Ptr BG.Void))
+    -> IO (BG.FunPtr (BG.Word64 -> IO (BG.Ptr BG.Void)))
+
+-- __unique:__ @toSDL_malloc_func_Aux@
+hs_bindgen_5c5a0694498aea22
+  :: SDL_malloc_func_Aux
+  -> IO (BG.FunPtr SDL_malloc_func_Aux)
+hs_bindgen_5c5a0694498aea22 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_5c5a0694498aea22_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_malloc_func_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_3dfc01b3bec18b2f_base
+    :: BG.FunPtr (BG.Word64 -> IO (BG.Ptr BG.Void))
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @fromSDL_malloc_func_Aux@
+hs_bindgen_3dfc01b3bec18b2f
+  :: BG.FunPtr SDL_malloc_func_Aux
+  -> SDL_malloc_func_Aux
+hs_bindgen_3dfc01b3bec18b2f =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_3dfc01b3bec18b2f_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_malloc_func_Aux where
+  toFunPtr = hs_bindgen_5c5a0694498aea22
+
+instance BG.FromFunPtr SDL_malloc_func_Aux where
+  fromFunPtr = hs_bindgen_3dfc01b3bec18b2f
+
+instance
+  (ty ~ (HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+  => BG.CompatHasField.HasField "unwrap" SDL_malloc_func_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_malloc_func_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+  => BG.HasField "unwrap" (BG.Ptr SDL_malloc_func_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_malloc_func_Aux "unwrap" where
+  type
+    CFieldType SDL_malloc_func_Aux "unwrap" =
+      HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback used to implement @SDL_malloc()@.
+--
+--     SDL will always ensure that the passed @size@ is greater than 0.
+--
+--     [@size@]: the size to allocate.
+--
+--     [Returns]: a pointer to the allocated memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It should be safe to call this callback from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_malloc', 'sDL_GetOriginalMemoryFunctions', 'sDL_GetMemoryFunctions', 'sDL_SetMemoryFunctions'
+--
+--     [C declaration]: @SDL_malloc_func@, defined at @SDL3\/SDL_stdinc.h 1445:25@
+newtype SDL_malloc_func = SDL_malloc_func
+  { unwrap :: BG.FunPtr SDL_malloc_func_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_malloc_func_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_malloc_func ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_malloc_func{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_malloc_func_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_malloc_func) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_malloc_func "unwrap" where
+  type
+    CFieldType SDL_malloc_func "unwrap" =
+      BG.FunPtr SDL_malloc_func_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_calloc_func'
+--
+--     [C declaration]: @SDL_calloc_func@, defined at @SDL3\/SDL_stdinc.h 1466:25@
+newtype SDL_calloc_func_Aux = SDL_calloc_func_Aux
+  { unwrap :: HsBindgen.Runtime.LibC.CSize -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_calloc_func_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_e0fe0baaf22a9277_base
+    :: (BG.Word64 -> BG.Word64 -> IO (BG.Ptr BG.Void))
+    -> IO (BG.FunPtr (BG.Word64 -> BG.Word64 -> IO (BG.Ptr BG.Void)))
+
+-- __unique:__ @toSDL_calloc_func_Aux@
+hs_bindgen_e0fe0baaf22a9277
+  :: SDL_calloc_func_Aux
+  -> IO (BG.FunPtr SDL_calloc_func_Aux)
+hs_bindgen_e0fe0baaf22a9277 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_e0fe0baaf22a9277_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_calloc_func_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_3046202e62b950f1_base
+    :: BG.FunPtr (BG.Word64 -> BG.Word64 -> IO (BG.Ptr BG.Void))
+    -> BG.Word64
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @fromSDL_calloc_func_Aux@
+hs_bindgen_3046202e62b950f1
+  :: BG.FunPtr SDL_calloc_func_Aux
+  -> SDL_calloc_func_Aux
+hs_bindgen_3046202e62b950f1 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_3046202e62b950f1_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_calloc_func_Aux where
+  toFunPtr = hs_bindgen_e0fe0baaf22a9277
+
+instance BG.FromFunPtr SDL_calloc_func_Aux where
+  fromFunPtr = hs_bindgen_3046202e62b950f1
+
+instance
+  (ty ~ (HsBindgen.Runtime.LibC.CSize -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+  => BG.CompatHasField.HasField "unwrap" SDL_calloc_func_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_calloc_func_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (HsBindgen.Runtime.LibC.CSize -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+  => BG.HasField "unwrap" (BG.Ptr SDL_calloc_func_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_calloc_func_Aux "unwrap" where
+  type
+    CFieldType SDL_calloc_func_Aux "unwrap" =
+      HsBindgen.Runtime.LibC.CSize -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback used to implement SDL_calloc().
+--
+--     SDL will always ensure that the passed @nmemb@ and @size@ are both greater than 0.
+--
+--     [@nmemb@]: the number of elements in the array.
+--
+--     [@size@]: the size of each element of the array.
+--
+--     [Returns]: a pointer to the allocated array, or NULL if allocation failed.
+--
+--     [Thread safety]: It should be safe to call this callback from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_calloc, 'sDL_GetOriginalMemoryFunctions', 'sDL_GetMemoryFunctions', 'sDL_SetMemoryFunctions'
+--
+--     [C declaration]: @SDL_calloc_func@, defined at @SDL3\/SDL_stdinc.h 1466:25@
+newtype SDL_calloc_func = SDL_calloc_func
+  { unwrap :: BG.FunPtr SDL_calloc_func_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_calloc_func_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_calloc_func ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_calloc_func{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_calloc_func_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_calloc_func) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_calloc_func "unwrap" where
+  type
+    CFieldType SDL_calloc_func "unwrap" =
+      BG.FunPtr SDL_calloc_func_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_realloc_func'
+--
+--     [C declaration]: @SDL_realloc_func@, defined at @SDL3\/SDL_stdinc.h 1487:25@
+newtype SDL_realloc_func_Aux = SDL_realloc_func_Aux
+  { unwrap :: BG.Ptr BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_realloc_func_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_ae5f282d8127c075_base
+    :: (BG.Ptr BG.Void -> BG.Word64 -> IO (BG.Ptr BG.Void))
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Word64 -> IO (BG.Ptr BG.Void)))
+
+-- __unique:__ @toSDL_realloc_func_Aux@
+hs_bindgen_ae5f282d8127c075
+  :: SDL_realloc_func_Aux
+  -> IO (BG.FunPtr SDL_realloc_func_Aux)
+hs_bindgen_ae5f282d8127c075 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_ae5f282d8127c075_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_realloc_func_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_60fef27e3e28e137_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Word64 -> IO (BG.Ptr BG.Void))
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @fromSDL_realloc_func_Aux@
+hs_bindgen_60fef27e3e28e137
+  :: BG.FunPtr SDL_realloc_func_Aux
+  -> SDL_realloc_func_Aux
+hs_bindgen_60fef27e3e28e137 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_60fef27e3e28e137_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_realloc_func_Aux where
+  toFunPtr = hs_bindgen_ae5f282d8127c075
+
+instance BG.FromFunPtr SDL_realloc_func_Aux where
+  fromFunPtr = hs_bindgen_60fef27e3e28e137
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+  => BG.CompatHasField.HasField "unwrap" SDL_realloc_func_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_realloc_func_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+  => BG.HasField "unwrap" (BG.Ptr SDL_realloc_func_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_realloc_func_Aux "unwrap" where
+  type
+    CFieldType SDL_realloc_func_Aux "unwrap" =
+      BG.Ptr BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback used to implement SDL_realloc().
+--
+--     SDL will always ensure that the passed @size@ is greater than 0.
+--
+--     [@mem@]: a pointer to allocated memory to reallocate, or NULL.
+--
+--     [@size@]: the new size of the memory.
+--
+--     [Returns]: a pointer to the newly allocated memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It should be safe to call this callback from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_realloc, 'sDL_GetOriginalMemoryFunctions', 'sDL_GetMemoryFunctions', 'sDL_SetMemoryFunctions'
+--
+--     [C declaration]: @SDL_realloc_func@, defined at @SDL3\/SDL_stdinc.h 1487:25@
+newtype SDL_realloc_func = SDL_realloc_func
+  { unwrap :: BG.FunPtr SDL_realloc_func_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_realloc_func_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_realloc_func ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_realloc_func{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_realloc_func_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_realloc_func) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_realloc_func "unwrap" where
+  type
+    CFieldType SDL_realloc_func "unwrap" =
+      BG.FunPtr SDL_realloc_func_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_free_func'
+--
+--     [C declaration]: @SDL_free_func@, defined at @SDL3\/SDL_stdinc.h 1505:24@
+newtype SDL_free_func_Aux = SDL_free_func_Aux
+  { unwrap :: BG.Ptr BG.Void -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_free_func_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_f13c0d9d2bec2096_base
+    :: (BG.Ptr BG.Void -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> IO ()))
+
+-- __unique:__ @toSDL_free_func_Aux@
+hs_bindgen_f13c0d9d2bec2096
+  :: SDL_free_func_Aux
+  -> IO (BG.FunPtr SDL_free_func_Aux)
+hs_bindgen_f13c0d9d2bec2096 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_f13c0d9d2bec2096_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_free_func_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_05ceac4716402972_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> IO ())
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @fromSDL_free_func_Aux@
+hs_bindgen_05ceac4716402972
+  :: BG.FunPtr SDL_free_func_Aux
+  -> SDL_free_func_Aux
+hs_bindgen_05ceac4716402972 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_05ceac4716402972_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_free_func_Aux where
+  toFunPtr = hs_bindgen_f13c0d9d2bec2096
+
+instance BG.FromFunPtr SDL_free_func_Aux where
+  fromFunPtr = hs_bindgen_05ceac4716402972
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_free_func_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_free_func_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_free_func_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_free_func_Aux "unwrap" where
+  type
+    CFieldType SDL_free_func_Aux "unwrap" =
+      BG.Ptr BG.Void -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback used to implement @SDL_free()@.
+--
+--     SDL will always ensure that the passed @mem@ is a non-NULL pointer.
+--
+--     [@mem@]: a pointer to allocated memory.
+--
+--     [Thread safety]: It should be safe to call this callback from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_free', 'sDL_GetOriginalMemoryFunctions', 'sDL_GetMemoryFunctions', 'sDL_SetMemoryFunctions'
+--
+--     [C declaration]: @SDL_free_func@, defined at @SDL3\/SDL_stdinc.h 1505:24@
+newtype SDL_free_func = SDL_free_func
+  { unwrap :: BG.FunPtr SDL_free_func_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_free_func_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_free_func ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_free_func{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_free_func_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_free_func) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_free_func "unwrap" where
+  type
+    CFieldType SDL_free_func "unwrap" =
+      BG.FunPtr SDL_free_func_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | A thread-safe set of environment variables
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable', 'sDL_DestroyEnvironment'
+--
+--     [C declaration]: @struct SDL_Environment@, defined at @SDL3\/SDL_stdinc.h 1649:16@
+data SDL_Environment
+
+-- | Auxiliary type used by 'SDL_CompareCallback'
+--
+--     [C declaration]: @SDL_CompareCallback@, defined at @SDL3\/SDL_stdinc.h 1877:23@
+newtype SDL_CompareCallback_Aux = SDL_CompareCallback_Aux
+  { unwrap :: PtrConst.PtrConst BG.Void -> PtrConst.PtrConst BG.Void -> IO BG.CInt
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_CompareCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_b4335f7e8ef40f79_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Int32)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Int32))
+
+-- __unique:__ @toSDL_CompareCallback_Aux@
+hs_bindgen_b4335f7e8ef40f79
+  :: SDL_CompareCallback_Aux
+  -> IO (BG.FunPtr SDL_CompareCallback_Aux)
+hs_bindgen_b4335f7e8ef40f79 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_b4335f7e8ef40f79_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_CompareCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_72d385fa3e33955d_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Int32)
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @fromSDL_CompareCallback_Aux@
+hs_bindgen_72d385fa3e33955d
+  :: BG.FunPtr SDL_CompareCallback_Aux
+  -> SDL_CompareCallback_Aux
+hs_bindgen_72d385fa3e33955d =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_72d385fa3e33955d_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_CompareCallback_Aux where
+  toFunPtr = hs_bindgen_b4335f7e8ef40f79
+
+instance BG.FromFunPtr SDL_CompareCallback_Aux where
+  fromFunPtr = hs_bindgen_72d385fa3e33955d
+
+instance
+  (ty ~ (PtrConst.PtrConst BG.Void -> PtrConst.PtrConst BG.Void -> IO BG.CInt))
+  => BG.CompatHasField.HasField "unwrap" SDL_CompareCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CompareCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (PtrConst.PtrConst BG.Void -> PtrConst.PtrConst BG.Void -> IO BG.CInt))
+  => BG.HasField "unwrap" (BG.Ptr SDL_CompareCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_CompareCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_CompareCallback_Aux "unwrap" =
+      PtrConst.PtrConst BG.Void -> PtrConst.PtrConst BG.Void -> IO BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback used with SDL sorting and binary search functions.
+--
+--     [@a@]: a pointer to the first element being compared.
+--
+--     [@b@]: a pointer to the second element being compared.
+--
+--     [Returns]: -1 if @a@ should be sorted before @b@, 1 if @b@ should be sorted before @a@, 0 if they are equal. If two elements are equal, their order in the sorted array is undefined.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch', 'sDL_qsort'
+--
+--     [C declaration]: @SDL_CompareCallback@, defined at @SDL3\/SDL_stdinc.h 1877:23@
+newtype SDL_CompareCallback = SDL_CompareCallback
+  { unwrap :: BG.FunPtr SDL_CompareCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_CompareCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_CompareCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CompareCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_CompareCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_CompareCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_CompareCallback "unwrap" where
+  type
+    CFieldType SDL_CompareCallback "unwrap" =
+      BG.FunPtr SDL_CompareCallback_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_CompareCallback_r'
+--
+--     [C declaration]: @SDL_CompareCallback_r@, defined at @SDL3\/SDL_stdinc.h 1990:23@
+newtype SDL_CompareCallback_r_Aux = SDL_CompareCallback_r_Aux
+  { unwrap :: BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> PtrConst.PtrConst BG.Void -> IO BG.CInt
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_CompareCallback_r_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_a12f359999653344_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Int32)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Int32))
+
+-- __unique:__ @toSDL_CompareCallback_r_Aux@
+hs_bindgen_a12f359999653344
+  :: SDL_CompareCallback_r_Aux
+  -> IO (BG.FunPtr SDL_CompareCallback_r_Aux)
+hs_bindgen_a12f359999653344 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_a12f359999653344_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_CompareCallback_r_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_c41d0998fdad0a16_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Int32)
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @fromSDL_CompareCallback_r_Aux@
+hs_bindgen_c41d0998fdad0a16
+  :: BG.FunPtr SDL_CompareCallback_r_Aux
+  -> SDL_CompareCallback_r_Aux
+hs_bindgen_c41d0998fdad0a16 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_c41d0998fdad0a16_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_CompareCallback_r_Aux where
+  toFunPtr = hs_bindgen_a12f359999653344
+
+instance BG.FromFunPtr SDL_CompareCallback_r_Aux where
+  fromFunPtr = hs_bindgen_c41d0998fdad0a16
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> PtrConst.PtrConst BG.Void -> IO BG.CInt))
+  => BG.CompatHasField.HasField "unwrap" SDL_CompareCallback_r_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CompareCallback_r_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> PtrConst.PtrConst BG.Void -> IO BG.CInt))
+  => BG.HasField "unwrap" (BG.Ptr SDL_CompareCallback_r_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_CompareCallback_r_Aux "unwrap" where
+  type
+    CFieldType SDL_CompareCallback_r_Aux "unwrap" =
+      BG.Ptr BG.Void -> PtrConst.PtrConst BG.Void -> PtrConst.PtrConst BG.Void -> IO BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback used with SDL sorting and binary search functions.
+--
+--     [@userdata@]: the @userdata@ pointer passed to the sort function.
+--
+--     [@a@]: a pointer to the first element being compared.
+--
+--     [@b@]: a pointer to the second element being compared.
+--
+--     [Returns]: -1 if @a@ should be sorted before @b@, 1 if @b@ should be sorted before @a@, 0 if they are equal. If two elements are equal, their order in the sorted array is undefined.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_qsort_r', 'sDL_bsearch_r'
+--
+--     [C declaration]: @SDL_CompareCallback_r@, defined at @SDL3\/SDL_stdinc.h 1990:23@
+newtype SDL_CompareCallback_r = SDL_CompareCallback_r
+  { unwrap :: BG.FunPtr SDL_CompareCallback_r_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_CompareCallback_r_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_CompareCallback_r ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_CompareCallback_r{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_CompareCallback_r_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_CompareCallback_r) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_CompareCallback_r "unwrap" where
+  type
+    CFieldType SDL_CompareCallback_r "unwrap" =
+      BG.FunPtr SDL_CompareCallback_r_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | The Unicode REPLACEMENT CHARACTER codepoint.
+--
+--     @SDL_StepUTF8()@ and @SDL_StepBackUTF8()@ report this codepoint when they encounter a UTF-8 string with encoding errors.
+--
+--     This tends to render as something like a question mark in most places.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StepBackUTF8', 'sDL_StepUTF8'
+--
+--     [C declaration]: @macro SDL_INVALID_UNICODE_CODEPOINT@, defined at @SDL3\/SDL_stdinc.h 3977:9@
+sDL_INVALID_UNICODE_CODEPOINT :: BG.CInt
+sDL_INVALID_UNICODE_CODEPOINT = (65533 :: BG.CInt)
+
+-- | The value of Pi, as a double-precision floating point literal.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PI_F' pi (double)
+--
+--     [C declaration]: @macro SDL_PI_D@, defined at @SDL3\/SDL_stdinc.h 4472:9@
+sDL_PI_D :: BG.CDouble
+sDL_PI_D = (3.141592653589793 :: BG.CDouble)
+
+-- | The value of Pi, as a single-precision floating point literal.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_PI_D' pi (float)
+--
+--     [C declaration]: @macro SDL_PI_F@, defined at @SDL3\/SDL_stdinc.h 4484:9@
+sDL_PI_F :: BG.CFloat
+sDL_PI_F = (3.1415927 :: BG.CFloat)
+
+-- | [C declaration]: @struct SDL_iconv_data_t@, defined at @SDL3\/SDL_stdinc.h 5807:16@
+data SDL_iconv_data_t
+
+-- | An opaque handle representing string encoding conversion state.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv_open'
+--
+--     [C declaration]: @SDL_iconv_t@, defined at @SDL3\/SDL_stdinc.h 5807:34@
+newtype SDL_iconv_t = SDL_iconv_t
+  { unwrap :: BG.Ptr SDL_iconv_data_t
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.Ptr SDL_iconv_data_t)
+  => BG.CompatHasField.HasField "unwrap" SDL_iconv_t ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_iconv_t{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_iconv_data_t)
+  => BG.HasField "unwrap" (BG.Ptr SDL_iconv_t) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_iconv_t "unwrap" where
+  type
+    CFieldType SDL_iconv_t "unwrap" =
+      BG.Ptr SDL_iconv_data_t
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_FunctionPointer'
+--
+--     [C declaration]: @SDL_FunctionPointer@, defined at @SDL3\/SDL_stdinc.h 6169:16@
+newtype SDL_FunctionPointer_Aux = SDL_FunctionPointer_Aux
+  { unwrap :: IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_FunctionPointer_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_8e3379ae5ebc8b29_base
+    :: IO ()
+    -> IO (BG.FunPtr (IO ()))
+
+-- __unique:__ @toSDL_FunctionPointer_Aux@
+hs_bindgen_8e3379ae5ebc8b29
+  :: SDL_FunctionPointer_Aux
+  -> IO (BG.FunPtr SDL_FunctionPointer_Aux)
+hs_bindgen_8e3379ae5ebc8b29 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_8e3379ae5ebc8b29_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_FunctionPointer_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_8a4eac10e33e73be_base
+    :: BG.FunPtr (IO ())
+    -> IO ()
+
+-- __unique:__ @fromSDL_FunctionPointer_Aux@
+hs_bindgen_8a4eac10e33e73be
+  :: BG.FunPtr SDL_FunctionPointer_Aux
+  -> SDL_FunctionPointer_Aux
+hs_bindgen_8a4eac10e33e73be =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_8a4eac10e33e73be_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_FunctionPointer_Aux where
+  toFunPtr = hs_bindgen_8e3379ae5ebc8b29
+
+instance BG.FromFunPtr SDL_FunctionPointer_Aux where
+  fromFunPtr = hs_bindgen_8a4eac10e33e73be
+
+instance
+  (ty ~ IO ())
+  => BG.CompatHasField.HasField "unwrap" SDL_FunctionPointer_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FunctionPointer_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ IO ())
+  => BG.HasField "unwrap" (BG.Ptr SDL_FunctionPointer_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_FunctionPointer_Aux "unwrap" where
+  type
+    CFieldType SDL_FunctionPointer_Aux "unwrap" =
+      IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_FunctionPointer@, defined at @SDL3\/SDL_stdinc.h 6169:16@
+newtype SDL_FunctionPointer = SDL_FunctionPointer
+  { unwrap :: BG.FunPtr SDL_FunctionPointer_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_FunctionPointer_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_FunctionPointer ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FunctionPointer{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_FunctionPointer_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_FunctionPointer) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_FunctionPointer "unwrap" where
+  type
+    CFieldType SDL_FunctionPointer "unwrap" =
+      BG.FunPtr SDL_FunctionPointer_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Stdinc/FunPtr.hs b/src/SDL3/Sys/Bindgen/Stdinc/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Stdinc/FunPtr.hs
@@ -0,0 +1,7266 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Stdinc.FunPtr (
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_malloc,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_calloc,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_realloc,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_free,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_GetOriginalMemoryFunctions,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_GetMemoryFunctions,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_SetMemoryFunctions,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_aligned_alloc,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_aligned_free,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_GetNumAllocations,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_GetEnvironment,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_CreateEnvironment,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_GetEnvironmentVariable,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_GetEnvironmentVariables,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_SetEnvironmentVariable,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_UnsetEnvironmentVariable,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_DestroyEnvironment,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_getenv,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_getenv_unsafe,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_setenv_unsafe,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_unsetenv_unsafe,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_qsort,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_bsearch,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_qsort_r,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_bsearch_r,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_abs,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isalpha,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isalnum,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isblank,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_iscntrl,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isdigit,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isxdigit,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_ispunct,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isspace,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isupper,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_islower,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isprint,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isgraph,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_toupper,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_tolower,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_crc16,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_crc32,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_murmur3_32,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_memset4,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_memcmp,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcslen,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcsnlen,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcslcpy,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcslcat,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcsdup,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcsstr,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcsnstr,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcscmp,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcsncmp,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcscasecmp,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_wcsncasecmp,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strlen,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strnlen,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strlcpy,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_utf8strlcpy,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strlcat,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strdup,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strndup,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strrev,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strupr,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strlwr,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strchr,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strrchr,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strstr,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strnstr,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strcasestr,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strtok_r,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_utf8strlen,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_utf8strnlen,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_itoa,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_uitoa,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_lltoa,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_ulltoa,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_atoi,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_atof,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strtoll,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strtoull,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strtod,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strcmp,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strncmp,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strcasecmp,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strncasecmp,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_strpbrk,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_StepUTF8,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_StepBackUTF8,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_UCS4ToUTF8,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_srand,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_rand,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_randf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_rand_bits,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_rand_r,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_randf_r,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_rand_bits_r,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_acos,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_acosf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_asin,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_asinf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_atan,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_atanf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_atan2,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_atan2f,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_ceil,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_ceilf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_copysign,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_copysignf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_cos,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_cosf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_exp,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_expf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_fabs,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_fabsf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_floor,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_floorf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_trunc,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_truncf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_fmod,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_fmodf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isinf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isinff,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isnan,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_isnanf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_log,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_logf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_log10,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_log10f,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_modf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_modff,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_pow,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_powf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_round,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_roundf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_scalbn,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_scalbnf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_sin,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_sinf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_sqrt,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_sqrtf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_tan,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_tanf,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_iconv_open,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_iconv_close,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_iconv,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_iconv_string,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_size_mul_check_overflow_builtin,
+  SDL3.Sys.Bindgen.Stdinc.FunPtr.sDL_size_add_check_overflow_builtin,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_stdinc.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_malloc */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_9722441ea82cf670 (void)) ("
+         , "  size_t arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_malloc;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_calloc */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_2b076bb91cf947df (void)) ("
+         , "  size_t arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_calloc;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_realloc */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_bbae567861825a2b (void)) ("
+         , "  void *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_realloc;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_free */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_0f3dfcf2ab9d228a (void)) ("
+         , "  void *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_free;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetOriginalMemoryFunctions */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_4ad4cf326cf2d8ee (void)) ("
+         , "  SDL_malloc_func *arg1,"
+         , "  SDL_calloc_func *arg2,"
+         , "  SDL_realloc_func *arg3,"
+         , "  SDL_free_func *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GetOriginalMemoryFunctions;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetMemoryFunctions */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_d860ef935b823504 (void)) ("
+         , "  SDL_malloc_func *arg1,"
+         , "  SDL_calloc_func *arg2,"
+         , "  SDL_realloc_func *arg3,"
+         , "  SDL_free_func *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GetMemoryFunctions;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_SetMemoryFunctions */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a474c8c00b052ea2 (void)) ("
+         , "  SDL_malloc_func arg1,"
+         , "  SDL_calloc_func arg2,"
+         , "  SDL_realloc_func arg3,"
+         , "  SDL_free_func arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetMemoryFunctions;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_aligned_alloc */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_de151c2774561d5d (void)) ("
+         , "  size_t arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_aligned_alloc;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_aligned_free */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_dd6b53bc3c6f96ea (void)) ("
+         , "  void *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_aligned_free;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetNumAllocations */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_fe81cad123788733 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetNumAllocations;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetEnvironment */"
+         , "__attribute__ ((const))"
+         , "SDL_Environment *(*hs_bindgen_9a656c04aab82f9e (void)) (void)"
+         , "{"
+         , "  return &SDL_GetEnvironment;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_CreateEnvironment */"
+         , "__attribute__ ((const))"
+         , "SDL_Environment *(*hs_bindgen_c0820759e235b8e4 (void)) ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateEnvironment;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetEnvironmentVariable */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_a475668aa4ab4369 (void)) ("
+         , "  SDL_Environment *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetEnvironmentVariable;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetEnvironmentVariables */"
+         , "__attribute__ ((const))"
+         , "char **(*hs_bindgen_9fb7038d3656b96c (void)) ("
+         , "  SDL_Environment *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetEnvironmentVariables;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_SetEnvironmentVariable */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a99329e2f1a82258 (void)) ("
+         , "  SDL_Environment *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetEnvironmentVariable;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_UnsetEnvironmentVariable */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c6a62ea65fc9d622 (void)) ("
+         , "  SDL_Environment *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_UnsetEnvironmentVariable;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_DestroyEnvironment */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_e750bb904f747388 (void)) ("
+         , "  SDL_Environment *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyEnvironment;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_getenv */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_b563cf6799d5c876 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_getenv;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_getenv_unsafe */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_e6077a375be5ae63 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_getenv_unsafe;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_setenv_unsafe */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_aaf5efc0afa93f4f (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_setenv_unsafe;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_unsetenv_unsafe */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_519fb9e8ee876013 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_unsetenv_unsafe;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_qsort */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_fd5cea92e3ba7b16 (void)) ("
+         , "  void *arg1,"
+         , "  size_t arg2,"
+         , "  size_t arg3,"
+         , "  SDL_CompareCallback arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_qsort;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_bsearch */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_00f02cc97cc6b9fd (void)) ("
+         , "  void const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3,"
+         , "  size_t arg4,"
+         , "  SDL_CompareCallback arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_bsearch;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_qsort_r */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_271b6eff10a288b3 (void)) ("
+         , "  void *arg1,"
+         , "  size_t arg2,"
+         , "  size_t arg3,"
+         , "  SDL_CompareCallback_r arg4,"
+         , "  void *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_qsort_r;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_bsearch_r */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_39f0a8a8445979b1 (void)) ("
+         , "  void const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3,"
+         , "  size_t arg4,"
+         , "  SDL_CompareCallback_r arg5,"
+         , "  void *arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_bsearch_r;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_abs */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_955d92475ad359d8 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_abs;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isalpha */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_8e8018b5d5d8d98f (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isalpha;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isalnum */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_a52d45d106787b27 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isalnum;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isblank */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_0c075721ec100ff5 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isblank;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iscntrl */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_de902558496e469f (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_iscntrl;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isdigit */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_61af141b860ceb41 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isdigit;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isxdigit */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_c17beb32f0f1fd52 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isxdigit;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ispunct */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_a88a9667ca4e8aa7 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ispunct;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isspace */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_02457e0c40d5e057 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isspace;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isupper */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_0f55cc5ba611a3f2 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isupper;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_islower */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_f681ed21a8e1349a (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_islower;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isprint */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_991fe49732021ccb (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isprint;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isgraph */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_192487d885c8ab5a (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isgraph;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_toupper */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_ffb5de4d18c52c67 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_toupper;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_tolower */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_9f7c4f835baa2ffa (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_tolower;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_crc16 */"
+         , "__attribute__ ((const))"
+         , "Uint16 (*hs_bindgen_a900454baab74e94 (void)) ("
+         , "  Uint16 arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_crc16;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_crc32 */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_ce720b59f82b140a (void)) ("
+         , "  Uint32 arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_crc32;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_murmur3_32 */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_fe133a77578cb1aa (void)) ("
+         , "  void const *arg1,"
+         , "  size_t arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_murmur3_32;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_memset4 */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_45d6fa96a2a35062 (void)) ("
+         , "  void *arg1,"
+         , "  Uint32 arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_memset4;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_memcmp */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_d8af51803c9c5c62 (void)) ("
+         , "  void const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_memcmp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcslen */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_b1d053429f9e09c3 (void)) ("
+         , "  wchar_t const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_wcslen;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsnlen */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_ce1645bc94a325e1 (void)) ("
+         , "  wchar_t const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_wcsnlen;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcslcpy */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_11ca43711b8baf20 (void)) ("
+         , "  wchar_t *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_wcslcpy;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcslcat */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_7e7896cd495dd344 (void)) ("
+         , "  wchar_t *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_wcslcat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsdup */"
+         , "__attribute__ ((const))"
+         , "wchar_t *(*hs_bindgen_9ab91a86c489d607 (void)) ("
+         , "  wchar_t const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_wcsdup;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsstr */"
+         , "__attribute__ ((const))"
+         , "wchar_t *(*hs_bindgen_e5c78fe942e46a5f (void)) ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_wcsstr;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsnstr */"
+         , "__attribute__ ((const))"
+         , "wchar_t *(*hs_bindgen_2dc934c7f1856237 (void)) ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_wcsnstr;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcscmp */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_759b9046679b686f (void)) ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_wcscmp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsncmp */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_c5ac0e330fb4ae45 (void)) ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_wcsncmp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcscasecmp */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_fb42c136f5dd392f (void)) ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_wcscasecmp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsncasecmp */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_fcc719df5ea9c486 (void)) ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_wcsncasecmp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlen */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_7f2511e625836c60 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_strlen;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strnlen */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_f4143204114af698 (void)) ("
+         , "  char const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_strnlen;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlcpy */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_7640410395c54d89 (void)) ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_strlcpy;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_utf8strlcpy */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_a2badcf2b044ea50 (void)) ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_utf8strlcpy;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlcat */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_26754eda643124d0 (void)) ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_strlcat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strdup */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_71b06acdd2d314be (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_strdup;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strndup */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_fd797c695710e05f (void)) ("
+         , "  char const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_strndup;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strrev */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_ffc5b79b6b976433 (void)) ("
+         , "  char *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_strrev;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strupr */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_ca97edf7bfcb6705 (void)) ("
+         , "  char *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_strupr;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlwr */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_d78a5116cc6d3f71 (void)) ("
+         , "  char *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_strlwr;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strchr */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_6ce9f7bacdf27653 (void)) ("
+         , "  char const *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_strchr;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strrchr */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_d2538022eb73bf53 (void)) ("
+         , "  char const *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_strrchr;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strstr */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_b07cb6fe84d9cf1e (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_strstr;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strnstr */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_c3b37921fa630595 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_strnstr;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strcasestr */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_3b1f9973e35be364 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_strcasestr;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtok_r */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_99a1a0af797e8aad (void)) ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  char **arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_strtok_r;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_utf8strlen */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_fdd33f5a5e9573d8 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_utf8strlen;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_utf8strnlen */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_1e79ccdd40706b8d (void)) ("
+         , "  char const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_utf8strnlen;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_itoa */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_4cfc9a356cf1014c (void)) ("
+         , "  signed int arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_itoa;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_uitoa */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_e052861370ec1ea4 (void)) ("
+         , "  unsigned int arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_uitoa;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_lltoa */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_9c5155b926feaa3f (void)) ("
+         , "  signed long long arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_lltoa;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ulltoa */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_a3b3fdde6f9a0142 (void)) ("
+         , "  unsigned long long arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_ulltoa;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atoi */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_9a3e9e2b67b916a2 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_atoi;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atof */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_2804d8be78ed3cae (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_atof;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtoll */"
+         , "__attribute__ ((const))"
+         , "signed long long (*hs_bindgen_6e1c8dc5ccea4653 (void)) ("
+         , "  char const *arg1,"
+         , "  char **arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_strtoll;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtoull */"
+         , "__attribute__ ((const))"
+         , "unsigned long long (*hs_bindgen_f81f822f17549fa4 (void)) ("
+         , "  char const *arg1,"
+         , "  char **arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_strtoull;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtod */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_6ab6327bbf86f171 (void)) ("
+         , "  char const *arg1,"
+         , "  char **arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_strtod;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strcmp */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_fc45ddd2c1f0219e (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_strcmp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strncmp */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_18f45fe45a42c194 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_strncmp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strcasecmp */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_2996562bf0a4585e (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_strcasecmp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strncasecmp */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_28d4c90d056ca0bb (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_strncasecmp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strpbrk */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_65f684850b2f315d (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_strpbrk;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_StepUTF8 */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_0907aee5a9e22b6c (void)) ("
+         , "  char const **arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_StepUTF8;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_StepBackUTF8 */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_ccaed4cafbb7e45b (void)) ("
+         , "  char const *arg1,"
+         , "  char const **arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_StepBackUTF8;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_UCS4ToUTF8 */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_d8d90fbed44bffa4 (void)) ("
+         , "  Uint32 arg1,"
+         , "  char *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_UCS4ToUTF8;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_srand */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_da73119d08a07679 (void)) ("
+         , "  Uint64 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_srand;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand */"
+         , "__attribute__ ((const))"
+         , "Sint32 (*hs_bindgen_4e5afaafc53503d2 (void)) ("
+         , "  Sint32 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_rand;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_randf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_e6a11f5c2731e306 (void)) (void)"
+         , "{"
+         , "  return &SDL_randf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand_bits */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_1b4a072c67be4b47 (void)) (void)"
+         , "{"
+         , "  return &SDL_rand_bits;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand_r */"
+         , "__attribute__ ((const))"
+         , "Sint32 (*hs_bindgen_b7805b04f67ee663 (void)) ("
+         , "  Uint64 *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_rand_r;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_randf_r */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_2868c0dca829c12d (void)) ("
+         , "  Uint64 *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_randf_r;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand_bits_r */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_4f041e8bf307388e (void)) ("
+         , "  Uint64 *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_rand_bits_r;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_acos */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_fc7fee2483850ab3 (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_acos;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_acosf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_521ecf135cd97997 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_acosf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_asin */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_0446975347dc0e74 (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_asin;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_asinf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_6069a6cbf645d9a4 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_asinf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atan */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_eb9c094d5b8cc44a (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_atan;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atanf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_9807f179a4fbb908 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_atanf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atan2 */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_c868e29b9251ada8 (void)) ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_atan2;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atan2f */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_357a95d359b4aaad (void)) ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_atan2f;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ceil */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_51763cbf0b798de3 (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ceil;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ceilf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_362325253c9b19f8 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ceilf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_copysign */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_df3beaabf480a0d3 (void)) ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_copysign;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_copysignf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_e6af77974ed5435f (void)) ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_copysignf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_cos */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_3d9b0e8a53288293 (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_cos;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_cosf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_8a6d19c21d08744f (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_cosf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_exp */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_32a0ab5c8aca638e (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_exp;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_expf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_e734b446bd66b310 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_expf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fabs */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_0fe1f848b90d29bc (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_fabs;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fabsf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_1e189b3e959f375b (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_fabsf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_floor */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_ae709679ac231e3a (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_floor;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_floorf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_6bcbc045e8590408 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_floorf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_trunc */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_9ff826562c85b6db (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_trunc;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_truncf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_5afacbe63e710528 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_truncf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fmod */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_3a93d2030ffd9ef3 (void)) ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_fmod;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fmodf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_a851844ef04e542d (void)) ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_fmodf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isinf */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_d9346ba385534fdd (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isinf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isinff */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_bfaf6777c1c350c3 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isinff;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isnan */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_006f33027be22f99 (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isnan;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isnanf */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_308e1efef7090245 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_isnanf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_log */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_4f9418e7e4267684 (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_log;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_logf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_ab81f791c1e3e516 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_logf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_log10 */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_c9a4b45a046047ba (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_log10;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_log10f */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_72ace8de925eb690 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_log10f;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_modf */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_b05adeb0cad2dab6 (void)) ("
+         , "  double arg1,"
+         , "  double *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_modf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_modff */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_59f3b87137ea46cd (void)) ("
+         , "  float arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_modff;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_pow */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_75e5e5b712af4971 (void)) ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_pow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_powf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_deb1ba3db460136c (void)) ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_powf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_round */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_e8841dcdfaff32de (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_round;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_roundf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_57450d2f082e285c (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_roundf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_scalbn */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_6fc1ebd971ec8157 (void)) ("
+         , "  double arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_scalbn;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_scalbnf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_706cd6213dd8d69d (void)) ("
+         , "  float arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_scalbnf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sin */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_e4b1725cdd38afe4 (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_sin;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sinf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_4d400d672d200ac9 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_sinf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sqrt */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_8352f3e6d4755f65 (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_sqrt;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sqrtf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_87f1efd0a9654c58 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_sqrtf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_tan */"
+         , "__attribute__ ((const))"
+         , "double (*hs_bindgen_4a65c95891312c30 (void)) ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_tan;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_tanf */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_094dc8b00c4ee010 (void)) ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_tanf;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv_open */"
+         , "__attribute__ ((const))"
+         , "SDL_iconv_t (*hs_bindgen_704fe1bf2ce9aef6 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_iconv_open;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv_close */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_2c0a62f403d4446c (void)) ("
+         , "  SDL_iconv_t arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_iconv_close;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv */"
+         , "__attribute__ ((const))"
+         , "size_t (*hs_bindgen_c0049201d1f4606f (void)) ("
+         , "  SDL_iconv_t arg1,"
+         , "  char const **arg2,"
+         , "  size_t *arg3,"
+         , "  char **arg4,"
+         , "  size_t *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_iconv;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv_string */"
+         , "__attribute__ ((const))"
+         , "char *(*hs_bindgen_ce165346002f1247 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  size_t arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_iconv_string;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_size_mul_check_overflow_builtin */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_5f2e41800217ca05 (void)) ("
+         , "  size_t arg1,"
+         , "  size_t arg2,"
+         , "  size_t *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_size_mul_check_overflow_builtin;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_size_add_check_overflow_builtin */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2d8ca557aa2f3eb0 (void)) ("
+         , "  size_t arg1,"
+         , "  size_t arg2,"
+         , "  size_t *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_size_add_check_overflow_builtin;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_malloc@
+foreign import ccall unsafe "hs_bindgen_9722441ea82cf670"
+  hs_bindgen_9722441ea82cf670_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_malloc@
+hs_bindgen_9722441ea82cf670 :: IO (BG.FunPtr (HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+hs_bindgen_9722441ea82cf670 =
+  BG.fromFFIType hs_bindgen_9722441ea82cf670_base
+
+{-# NOINLINE sDL_malloc #-}
+
+-- | Allocate uninitialized memory.
+--
+--     The allocated memory returned by this function must be freed with @SDL_free()@.
+--
+--     If @size@ is 0, it will be set to 1.
+--
+--     If the allocation is successful, the returned pointer is guaranteed to be aligned to either the /fundamental alignment/ (@alignof(max_align_t)@ in C11 and later) or @2 * sizeof(void *)@, whichever is smaller. Use @SDL_aligned_alloc()@ if you need to allocate memory aligned to an alignment greater than this guarantee.
+--
+--     [@size@]: the size to allocate.
+--
+--     [Returns]: a pointer to the allocated memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_free', SDL_calloc, SDL_realloc, 'sDL_aligned_alloc'
+--
+--     [C declaration]: @SDL_malloc@, defined at @SDL3\/SDL_stdinc.h 1341:47@
+sDL_malloc :: BG.FunPtr (HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void))
+sDL_malloc =
+  BG.unsafePerformIO hs_bindgen_9722441ea82cf670
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_calloc@
+foreign import ccall unsafe "hs_bindgen_2b076bb91cf947df"
+  hs_bindgen_2b076bb91cf947df_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_calloc@
+hs_bindgen_2b076bb91cf947df
+  :: IO (BG.FunPtr (HsBindgen.Runtime.LibC.CSize -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+hs_bindgen_2b076bb91cf947df =
+  BG.fromFFIType hs_bindgen_2b076bb91cf947df_base
+
+{-# NOINLINE sDL_calloc #-}
+
+-- | [C declaration]: @SDL_calloc@, defined at @SDL3\/SDL_stdinc.h 1366:69@
+sDL_calloc
+  :: BG.FunPtr (HsBindgen.Runtime.LibC.CSize -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void))
+sDL_calloc =
+  BG.unsafePerformIO hs_bindgen_2b076bb91cf947df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_realloc@
+foreign import ccall unsafe "hs_bindgen_bbae567861825a2b"
+  hs_bindgen_bbae567861825a2b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_realloc@
+hs_bindgen_bbae567861825a2b
+  :: IO (BG.FunPtr (BG.Ptr BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+hs_bindgen_bbae567861825a2b =
+  BG.fromFFIType hs_bindgen_bbae567861825a2b_base
+
+{-# NOINLINE sDL_realloc #-}
+
+-- | [C declaration]: @SDL_realloc@, defined at @SDL3\/SDL_stdinc.h 1406:54@
+sDL_realloc :: BG.FunPtr (BG.Ptr BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void))
+sDL_realloc =
+  BG.unsafePerformIO hs_bindgen_bbae567861825a2b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_free@
+foreign import ccall unsafe "hs_bindgen_0f3dfcf2ab9d228a"
+  hs_bindgen_0f3dfcf2ab9d228a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_free@
+hs_bindgen_0f3dfcf2ab9d228a :: IO (BG.FunPtr (BG.Ptr BG.Void -> IO ()))
+hs_bindgen_0f3dfcf2ab9d228a =
+  BG.fromFFIType hs_bindgen_0f3dfcf2ab9d228a_base
+
+{-# NOINLINE sDL_free #-}
+
+-- | Free allocated memory.
+--
+--     The pointer is no longer valid after this call and cannot be dereferenced anymore.
+--
+--     If @mem@ is NULL, this function does nothing.
+--
+--     [@mem@]: a pointer to allocated memory, or NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_malloc', SDL_calloc, SDL_realloc
+--
+--     [C declaration]: @SDL_free@, defined at @SDL3\/SDL_stdinc.h 1426:34@
+sDL_free :: BG.FunPtr (BG.Ptr BG.Void -> IO ())
+sDL_free =
+  BG.unsafePerformIO hs_bindgen_0f3dfcf2ab9d228a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetOriginalMemoryFunctions@
+foreign import ccall unsafe "hs_bindgen_4ad4cf326cf2d8ee"
+  hs_bindgen_4ad4cf326cf2d8ee_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetOriginalMemoryFunctions@
+hs_bindgen_4ad4cf326cf2d8ee
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_malloc_func
+             -> BG.Ptr SDL_calloc_func
+             -> BG.Ptr SDL_realloc_func
+             -> BG.Ptr SDL_free_func
+             -> IO ()
+           )
+       )
+hs_bindgen_4ad4cf326cf2d8ee =
+  BG.fromFFIType hs_bindgen_4ad4cf326cf2d8ee_base
+
+{-# NOINLINE sDL_GetOriginalMemoryFunctions #-}
+
+-- | Get the original set of SDL memory functions.
+--
+--     This is what SDL_malloc and friends will use by default, if there has been no call to SDL_SetMemoryFunctions. This is not necessarily using the C runtime\'s @malloc@ functions behind the scenes! Different platforms and build configurations might do any number of unexpected things.
+--
+--     [@malloc_func@]: filled with malloc function.
+--
+--     [@calloc_func@]: filled with calloc function.
+--
+--     [@realloc_func@]: filled with realloc function.
+--
+--     [@free_func@]: filled with free function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetOriginalMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1524:34@
+sDL_GetOriginalMemoryFunctions
+  :: BG.FunPtr
+       ( BG.Ptr SDL_malloc_func
+         -> BG.Ptr SDL_calloc_func
+         -> BG.Ptr SDL_realloc_func
+         -> BG.Ptr SDL_free_func
+         -> IO ()
+       )
+sDL_GetOriginalMemoryFunctions =
+  BG.unsafePerformIO hs_bindgen_4ad4cf326cf2d8ee
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetMemoryFunctions@
+foreign import ccall unsafe "hs_bindgen_d860ef935b823504"
+  hs_bindgen_d860ef935b823504_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetMemoryFunctions@
+hs_bindgen_d860ef935b823504
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_malloc_func
+             -> BG.Ptr SDL_calloc_func
+             -> BG.Ptr SDL_realloc_func
+             -> BG.Ptr SDL_free_func
+             -> IO ()
+           )
+       )
+hs_bindgen_d860ef935b823504 =
+  BG.fromFFIType hs_bindgen_d860ef935b823504_base
+
+{-# NOINLINE sDL_GetMemoryFunctions #-}
+
+-- | Get the current set of SDL memory functions.
+--
+--     [@malloc_func@]: filled with malloc function.
+--
+--     [@calloc_func@]: filled with calloc function.
+--
+--     [@realloc_func@]: filled with realloc function.
+--
+--     [@free_func@]: filled with free function.
+--
+--     [Thread safety]: This does not hold a lock, so do not call this in the unlikely event of a background thread calling SDL_SetMemoryFunctions simultaneously.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetMemoryFunctions', 'sDL_GetOriginalMemoryFunctions'
+--
+--     [C declaration]: @SDL_GetMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1546:34@
+sDL_GetMemoryFunctions
+  :: BG.FunPtr
+       ( BG.Ptr SDL_malloc_func
+         -> BG.Ptr SDL_calloc_func
+         -> BG.Ptr SDL_realloc_func
+         -> BG.Ptr SDL_free_func
+         -> IO ()
+       )
+sDL_GetMemoryFunctions =
+  BG.unsafePerformIO hs_bindgen_d860ef935b823504
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_SetMemoryFunctions@
+foreign import ccall unsafe "hs_bindgen_a474c8c00b052ea2"
+  hs_bindgen_a474c8c00b052ea2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_SetMemoryFunctions@
+hs_bindgen_a474c8c00b052ea2
+  :: IO
+       (BG.FunPtr (SDL_malloc_func -> SDL_calloc_func -> SDL_realloc_func -> SDL_free_func -> IO BG.CBool))
+hs_bindgen_a474c8c00b052ea2 =
+  BG.fromFFIType hs_bindgen_a474c8c00b052ea2_base
+
+{-# NOINLINE sDL_SetMemoryFunctions #-}
+
+-- | Replace SDL\'s memory allocation functions with a custom set.
+--
+--     It is not safe to call this function once any allocations have been made, as future calls to SDL_free will use the new allocator, even if they came from an SDL_malloc made with the old one!
+--
+--     If used, usually this needs to be the first call made into the SDL library, if not the very first thing done at program startup time.
+--
+--     [@malloc_func@]: custom malloc function.
+--
+--     [@calloc_func@]: custom calloc function.
+--
+--     [@realloc_func@]: custom realloc function.
+--
+--     [@free_func@]: custom free function.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but one should not replace the memory functions once any allocations are made!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMemoryFunctions', 'sDL_GetOriginalMemoryFunctions'
+--
+--     [C declaration]: @SDL_SetMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1577:34@
+sDL_SetMemoryFunctions
+  :: BG.FunPtr (SDL_malloc_func -> SDL_calloc_func -> SDL_realloc_func -> SDL_free_func -> IO BG.CBool)
+sDL_SetMemoryFunctions =
+  BG.unsafePerformIO hs_bindgen_a474c8c00b052ea2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_aligned_alloc@
+foreign import ccall unsafe "hs_bindgen_de151c2774561d5d"
+  hs_bindgen_de151c2774561d5d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_aligned_alloc@
+hs_bindgen_de151c2774561d5d
+  :: IO (BG.FunPtr (HsBindgen.Runtime.LibC.CSize -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+hs_bindgen_de151c2774561d5d =
+  BG.fromFFIType hs_bindgen_de151c2774561d5d_base
+
+{-# NOINLINE sDL_aligned_alloc #-}
+
+-- | Allocate memory aligned to a specific alignment.
+--
+--     The memory returned by this function must be freed with @SDL_aligned_free()@, /not/ @SDL_free()@.
+--
+--     If @alignment@ is less than the size of @void *@, it will be increased to match that.
+--
+--     The returned memory address will be a multiple of the alignment value, and the size of the memory allocated will be a multiple of the alignment value.
+--
+--     [@alignment@]: the alignment of the memory.
+--
+--     [@size@]: the size to allocate.
+--
+--     [Returns]: a pointer to the aligned memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_aligned_free'
+--
+--     [C declaration]: @SDL_aligned_alloc@, defined at @SDL3\/SDL_stdinc.h 1604:47@
+sDL_aligned_alloc
+  :: BG.FunPtr (HsBindgen.Runtime.LibC.CSize -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void))
+sDL_aligned_alloc =
+  BG.unsafePerformIO hs_bindgen_de151c2774561d5d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_aligned_free@
+foreign import ccall unsafe "hs_bindgen_dd6b53bc3c6f96ea"
+  hs_bindgen_dd6b53bc3c6f96ea_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_aligned_free@
+hs_bindgen_dd6b53bc3c6f96ea :: IO (BG.FunPtr (BG.Ptr BG.Void -> IO ()))
+hs_bindgen_dd6b53bc3c6f96ea =
+  BG.fromFFIType hs_bindgen_dd6b53bc3c6f96ea_base
+
+{-# NOINLINE sDL_aligned_free #-}
+
+-- | Free memory allocated by @SDL_aligned_alloc()@.
+--
+--     The pointer is no longer valid after this call and cannot be dereferenced anymore.
+--
+--     If @mem@ is NULL, this function does nothing.
+--
+--     [@mem@]: a pointer previously returned by @SDL_aligned_alloc()@, or NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_aligned_alloc'
+--
+--     [C declaration]: @SDL_aligned_free@, defined at @SDL3\/SDL_stdinc.h 1622:34@
+sDL_aligned_free :: BG.FunPtr (BG.Ptr BG.Void -> IO ())
+sDL_aligned_free =
+  BG.unsafePerformIO hs_bindgen_dd6b53bc3c6f96ea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetNumAllocations@
+foreign import ccall unsafe "hs_bindgen_fe81cad123788733"
+  hs_bindgen_fe81cad123788733_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetNumAllocations@
+hs_bindgen_fe81cad123788733 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_fe81cad123788733 =
+  BG.fromFFIType hs_bindgen_fe81cad123788733_base
+
+{-# NOINLINE sDL_GetNumAllocations #-}
+
+-- | Get the number of outstanding (unfreed) allocations.
+--
+--     [Returns]: the number of allocations or -1 if allocation counting is disabled.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetNumAllocations@, defined at @SDL3\/SDL_stdinc.h 1634:33@
+sDL_GetNumAllocations :: BG.FunPtr (IO BG.CInt)
+sDL_GetNumAllocations =
+  BG.unsafePerformIO hs_bindgen_fe81cad123788733
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetEnvironment@
+foreign import ccall unsafe "hs_bindgen_9a656c04aab82f9e"
+  hs_bindgen_9a656c04aab82f9e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetEnvironment@
+hs_bindgen_9a656c04aab82f9e :: IO (BG.FunPtr (IO (BG.Ptr SDL_Environment)))
+hs_bindgen_9a656c04aab82f9e =
+  BG.fromFFIType hs_bindgen_9a656c04aab82f9e_base
+
+{-# NOINLINE sDL_GetEnvironment #-}
+
+-- | Get the process environment.
+--
+--     This is initialized at application start and is not affected by setenv() and unsetenv() calls after that point. Use @SDL_SetEnvironmentVariable()@ and @SDL_UnsetEnvironmentVariable()@ if you want to modify this environment, or @SDL_setenv_unsafe()@ or @SDL_unsetenv_unsafe()@ if you want changes to persist in the C runtime environment after SDL_Quit().
+--
+--     [Returns]: a pointer to the environment for the process or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_GetEnvironment@, defined at @SDL3\/SDL_stdinc.h 1672:47@
+sDL_GetEnvironment :: BG.FunPtr (IO (BG.Ptr SDL_Environment))
+sDL_GetEnvironment =
+  BG.unsafePerformIO hs_bindgen_9a656c04aab82f9e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_CreateEnvironment@
+foreign import ccall unsafe "hs_bindgen_c0820759e235b8e4"
+  hs_bindgen_c0820759e235b8e4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_CreateEnvironment@
+hs_bindgen_c0820759e235b8e4 :: IO (BG.FunPtr (BG.CBool -> IO (BG.Ptr SDL_Environment)))
+hs_bindgen_c0820759e235b8e4 =
+  BG.fromFFIType hs_bindgen_c0820759e235b8e4_base
+
+{-# NOINLINE sDL_CreateEnvironment #-}
+
+-- | Create a set of environment variables
+--
+--     [@populated@]: true to initialize it from the C runtime environment, false to create an empty environment.
+--
+--     [Returns]: a pointer to the new environment or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: If @populated@ is false, it is safe to call this function from any thread, otherwise it is safe if no other threads are calling setenv() or unsetenv()
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable', 'sDL_DestroyEnvironment'
+--
+--     [C declaration]: @SDL_CreateEnvironment@, defined at @SDL3\/SDL_stdinc.h 1694:47@
+sDL_CreateEnvironment :: BG.FunPtr (BG.CBool -> IO (BG.Ptr SDL_Environment))
+sDL_CreateEnvironment =
+  BG.unsafePerformIO hs_bindgen_c0820759e235b8e4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetEnvironmentVariable@
+foreign import ccall unsafe "hs_bindgen_a475668aa4ab4369"
+  hs_bindgen_a475668aa4ab4369_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetEnvironmentVariable@
+hs_bindgen_a475668aa4ab4369
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Environment -> PtrConst.PtrConst BG.CChar -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_a475668aa4ab4369 =
+  BG.fromFFIType hs_bindgen_a475668aa4ab4369_base
+
+{-# NOINLINE sDL_GetEnvironmentVariable #-}
+
+-- | Get the value of a variable in the environment.
+--
+--     [@env@]: the environment to query.
+--
+--     [@name@]: the name of the variable to get.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_GetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1714:42@
+sDL_GetEnvironmentVariable
+  :: BG.FunPtr (BG.Ptr SDL_Environment -> PtrConst.PtrConst BG.CChar -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetEnvironmentVariable =
+  BG.unsafePerformIO hs_bindgen_a475668aa4ab4369
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetEnvironmentVariables@
+foreign import ccall unsafe "hs_bindgen_9fb7038d3656b96c"
+  hs_bindgen_9fb7038d3656b96c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_GetEnvironmentVariables@
+hs_bindgen_9fb7038d3656b96c
+  :: IO (BG.FunPtr (BG.Ptr SDL_Environment -> IO (BG.Ptr (BG.Ptr BG.CChar))))
+hs_bindgen_9fb7038d3656b96c =
+  BG.fromFFIType hs_bindgen_9fb7038d3656b96c_base
+
+{-# NOINLINE sDL_GetEnvironmentVariables #-}
+
+-- | Get all variables in the environment.
+--
+--     [@env@]: the environment to query.
+--
+--     [Returns]: a NULL terminated array of pointers to environment variables in the form \"variable=value\" or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with @SDL_free()@ when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_GetEnvironmentVariables@, defined at @SDL3\/SDL_stdinc.h 1735:37@
+sDL_GetEnvironmentVariables :: BG.FunPtr (BG.Ptr SDL_Environment -> IO (BG.Ptr (BG.Ptr BG.CChar)))
+sDL_GetEnvironmentVariables =
+  BG.unsafePerformIO hs_bindgen_9fb7038d3656b96c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_SetEnvironmentVariable@
+foreign import ccall unsafe "hs_bindgen_a99329e2f1a82258"
+  hs_bindgen_a99329e2f1a82258_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_SetEnvironmentVariable@
+hs_bindgen_a99329e2f1a82258
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Environment
+             -> PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.CBool
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_a99329e2f1a82258 =
+  BG.fromFFIType hs_bindgen_a99329e2f1a82258_base
+
+{-# NOINLINE sDL_SetEnvironmentVariable #-}
+
+-- | Set the value of a variable in the environment.
+--
+--     [@env@]: the environment to modify.
+--
+--     [@name@]: the name of the variable to set.
+--
+--     [@value@]: the value of the variable to set.
+--
+--     [@overwrite@]: true to overwrite the variable if it exists, false to return success without setting the variable if it already exists.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_SetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1759:34@
+sDL_SetEnvironmentVariable
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Environment
+         -> PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> BG.CBool
+         -> IO BG.CBool
+       )
+sDL_SetEnvironmentVariable =
+  BG.unsafePerformIO hs_bindgen_a99329e2f1a82258
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_UnsetEnvironmentVariable@
+foreign import ccall unsafe "hs_bindgen_c6a62ea65fc9d622"
+  hs_bindgen_c6a62ea65fc9d622_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_UnsetEnvironmentVariable@
+hs_bindgen_c6a62ea65fc9d622
+  :: IO (BG.FunPtr (BG.Ptr SDL_Environment -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_c6a62ea65fc9d622 =
+  BG.fromFFIType hs_bindgen_c6a62ea65fc9d622_base
+
+{-# NOINLINE sDL_UnsetEnvironmentVariable #-}
+
+-- | Clear a variable from the environment.
+--
+--     [@env@]: the environment to modify.
+--
+--     [@name@]: the name of the variable to unset.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_UnsetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1780:34@
+sDL_UnsetEnvironmentVariable
+  :: BG.FunPtr (BG.Ptr SDL_Environment -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_UnsetEnvironmentVariable =
+  BG.unsafePerformIO hs_bindgen_c6a62ea65fc9d622
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_DestroyEnvironment@
+foreign import ccall unsafe "hs_bindgen_e750bb904f747388"
+  hs_bindgen_e750bb904f747388_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_DestroyEnvironment@
+hs_bindgen_e750bb904f747388 :: IO (BG.FunPtr (BG.Ptr SDL_Environment -> IO ()))
+hs_bindgen_e750bb904f747388 =
+  BG.fromFFIType hs_bindgen_e750bb904f747388_base
+
+{-# NOINLINE sDL_DestroyEnvironment #-}
+
+-- | Destroy a set of environment variables.
+--
+--     [@env@]: the environment to destroy.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the environment is no longer in use.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateEnvironment'
+--
+--     [C declaration]: @SDL_DestroyEnvironment@, defined at @SDL3\/SDL_stdinc.h 1794:34@
+sDL_DestroyEnvironment :: BG.FunPtr (BG.Ptr SDL_Environment -> IO ())
+sDL_DestroyEnvironment =
+  BG.unsafePerformIO hs_bindgen_e750bb904f747388
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_getenv@
+foreign import ccall unsafe "hs_bindgen_b563cf6799d5c876"
+  hs_bindgen_b563cf6799d5c876_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_getenv@
+hs_bindgen_b563cf6799d5c876
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_b563cf6799d5c876 =
+  BG.fromFFIType hs_bindgen_b563cf6799d5c876_base
+
+{-# NOINLINE sDL_getenv #-}
+
+-- | Get the value of a variable in the environment.
+--
+--     This function uses SDL\'s cached copy of the environment and is thread-safe.
+--
+--     [@name@]: the name of the variable to get.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_getenv@, defined at @SDL3\/SDL_stdinc.h 1809:42@
+sDL_getenv :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (PtrConst.PtrConst BG.CChar))
+sDL_getenv =
+  BG.unsafePerformIO hs_bindgen_b563cf6799d5c876
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_getenv_unsafe@
+foreign import ccall unsafe "hs_bindgen_e6077a375be5ae63"
+  hs_bindgen_e6077a375be5ae63_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_getenv_unsafe@
+hs_bindgen_e6077a375be5ae63
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_e6077a375be5ae63 =
+  BG.fromFFIType hs_bindgen_e6077a375be5ae63_base
+
+{-# NOINLINE sDL_getenv_unsafe #-}
+
+-- | Get the value of a variable in the environment.
+--
+--     This function bypasses SDL\'s cached copy of the environment and is not thread-safe.
+--
+--     [@name@]: the name of the variable to get.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: This function is not thread safe, consider using @SDL_getenv()@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_getenv'
+--
+--     [C declaration]: @SDL_getenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1828:42@
+sDL_getenv_unsafe :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (PtrConst.PtrConst BG.CChar))
+sDL_getenv_unsafe =
+  BG.unsafePerformIO hs_bindgen_e6077a375be5ae63
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_setenv_unsafe@
+foreign import ccall unsafe "hs_bindgen_aaf5efc0afa93f4f"
+  hs_bindgen_aaf5efc0afa93f4f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_setenv_unsafe@
+hs_bindgen_aaf5efc0afa93f4f
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> BG.CInt -> IO BG.CInt))
+hs_bindgen_aaf5efc0afa93f4f =
+  BG.fromFFIType hs_bindgen_aaf5efc0afa93f4f_base
+
+{-# NOINLINE sDL_setenv_unsafe #-}
+
+-- | Set the value of a variable in the environment.
+--
+--     [@name@]: the name of the variable to set.
+--
+--     [@value@]: the value of the variable to set.
+--
+--     [@overwrite@]: 1 to overwrite the variable if it exists, 0 to return success without setting the variable if it already exists.
+--
+--     [Returns]: 0 on success, -1 on error.
+--
+--     [Thread safety]: This function is not thread safe, consider using @SDL_SetEnvironmentVariable()@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_setenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1846:33@
+sDL_setenv_unsafe
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> BG.CInt -> IO BG.CInt)
+sDL_setenv_unsafe =
+  BG.unsafePerformIO hs_bindgen_aaf5efc0afa93f4f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_unsetenv_unsafe@
+foreign import ccall unsafe "hs_bindgen_519fb9e8ee876013"
+  hs_bindgen_519fb9e8ee876013_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_unsetenv_unsafe@
+hs_bindgen_519fb9e8ee876013 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CInt))
+hs_bindgen_519fb9e8ee876013 =
+  BG.fromFFIType hs_bindgen_519fb9e8ee876013_base
+
+{-# NOINLINE sDL_unsetenv_unsafe #-}
+
+-- | Clear a variable from the environment.
+--
+--     [@name@]: the name of the variable to unset.
+--
+--     [Returns]: 0 on success, -1 on error.
+--
+--     [Thread safety]: This function is not thread safe, consider using @SDL_UnsetEnvironmentVariable()@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_unsetenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1861:33@
+sDL_unsetenv_unsafe :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CInt)
+sDL_unsetenv_unsafe =
+  BG.unsafePerformIO hs_bindgen_519fb9e8ee876013
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_qsort@
+foreign import ccall unsafe "hs_bindgen_fd5cea92e3ba7b16"
+  hs_bindgen_fd5cea92e3ba7b16_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_qsort@
+hs_bindgen_fd5cea92e3ba7b16
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr BG.Void
+             -> HsBindgen.Runtime.LibC.CSize
+             -> HsBindgen.Runtime.LibC.CSize
+             -> SDL_CompareCallback
+             -> IO ()
+           )
+       )
+hs_bindgen_fd5cea92e3ba7b16 =
+  BG.fromFFIType hs_bindgen_fd5cea92e3ba7b16_base
+
+{-# NOINLINE sDL_qsort #-}
+
+-- | Sort an array.
+--
+--     For example:
+--
+--     @
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *a, const void *b)
+--     {
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->n \< B->n) {
+--             return -1;
+--         } else if (B->n \< A->n) {
+--             return 1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 3, \"third\" }, { 1, \"first\" }, { 2, \"second\" }
+--     };
+--
+--     SDL_qsort(values, SDL_arraysize(values), sizeof(values[0]), compare);
+--     @
+--
+--     [@base@]: a pointer to the start of the array.
+--
+--     [@nmemb@]: the number of elements in the array.
+--
+--     [@size@]: the size of the elements in the array.
+--
+--     [@compare@]: a function used to compare elements in the array.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch', 'sDL_qsort_r'
+--
+--     [C declaration]: @SDL_qsort@, defined at @SDL3\/SDL_stdinc.h 1923:34@
+sDL_qsort
+  :: BG.FunPtr
+       ( BG.Ptr BG.Void
+         -> HsBindgen.Runtime.LibC.CSize
+         -> HsBindgen.Runtime.LibC.CSize
+         -> SDL_CompareCallback
+         -> IO ()
+       )
+sDL_qsort =
+  BG.unsafePerformIO hs_bindgen_fd5cea92e3ba7b16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_bsearch@
+foreign import ccall unsafe "hs_bindgen_00f02cc97cc6b9fd"
+  hs_bindgen_00f02cc97cc6b9fd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_bsearch@
+hs_bindgen_00f02cc97cc6b9fd
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.Void
+             -> PtrConst.PtrConst BG.Void
+             -> HsBindgen.Runtime.LibC.CSize
+             -> HsBindgen.Runtime.LibC.CSize
+             -> SDL_CompareCallback
+             -> IO (BG.Ptr BG.Void)
+           )
+       )
+hs_bindgen_00f02cc97cc6b9fd =
+  BG.fromFFIType hs_bindgen_00f02cc97cc6b9fd_base
+
+{-# NOINLINE sDL_bsearch #-}
+
+-- | Perform a binary search on a previously sorted array.
+--
+--     For example:
+--
+--     @
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *a, const void *b)
+--     {
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->n \< B->n) {
+--             return -1;
+--         } else if (B->n \< A->n) {
+--             return 1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 1, \"first\" }, { 2, \"second\" }, { 3, \"third\" }
+--     };
+--     data key = { 2, NULL };
+--
+--     data *result = SDL_bsearch(&key, values, SDL_arraysize(values), sizeof(values[0]), compare);
+--     @
+--
+--     [@key@]: a pointer to a key equal to the element being searched for.
+--
+--     [@base@]: a pointer to the start of the array.
+--
+--     [@nmemb@]: the number of elements in the array.
+--
+--     [@size@]: the size of the elements in the array.
+--
+--     [@compare@]: a function used to compare elements in the array.
+--
+--     [Returns]: a pointer to the matching element in the array, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch_r', 'sDL_qsort'
+--
+--     [C declaration]: @SDL_bsearch@, defined at @SDL3\/SDL_stdinc.h 1973:36@
+sDL_bsearch
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.Void
+         -> PtrConst.PtrConst BG.Void
+         -> HsBindgen.Runtime.LibC.CSize
+         -> HsBindgen.Runtime.LibC.CSize
+         -> SDL_CompareCallback
+         -> IO (BG.Ptr BG.Void)
+       )
+sDL_bsearch =
+  BG.unsafePerformIO hs_bindgen_00f02cc97cc6b9fd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_qsort_r@
+foreign import ccall unsafe "hs_bindgen_271b6eff10a288b3"
+  hs_bindgen_271b6eff10a288b3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_qsort_r@
+hs_bindgen_271b6eff10a288b3
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr BG.Void
+             -> HsBindgen.Runtime.LibC.CSize
+             -> HsBindgen.Runtime.LibC.CSize
+             -> SDL_CompareCallback_r
+             -> BG.Ptr BG.Void
+             -> IO ()
+           )
+       )
+hs_bindgen_271b6eff10a288b3 =
+  BG.fromFFIType hs_bindgen_271b6eff10a288b3_base
+
+{-# NOINLINE sDL_qsort_r #-}
+
+-- | Sort an array, passing a userdata pointer to the compare function.
+--
+--     For example:
+--
+--     @
+--     typedef enum {
+--         sort_increasing,
+--         sort_decreasing,
+--     } sort_method;
+--
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *userdata, const void *a, const void *b)
+--     {
+--         sort_method method = (sort_method)(uintptr_t)userdata;
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->key \< B->key) {
+--             return (method == sort_increasing) ? -1 : 1;
+--         } else if (B->key \< A->key) {
+--             return (method == sort_increasing) ? 1 : -1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 3, \"third\" }, { 1, \"first\" }, { 2, \"second\" }
+--     };
+--
+--     SDL_qsort_r(values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing);
+--     @
+--
+--     [@base@]: a pointer to the start of the array.
+--
+--     [@nmemb@]: the number of elements in the array.
+--
+--     [@size@]: the size of the elements in the array.
+--
+--     [@compare@]: a function used to compare elements in the array.
+--
+--     [@userdata@]: a pointer to pass to the compare function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch_r', 'sDL_qsort'
+--
+--     [C declaration]: @SDL_qsort_r@, defined at @SDL3\/SDL_stdinc.h 2043:34@
+sDL_qsort_r
+  :: BG.FunPtr
+       ( BG.Ptr BG.Void
+         -> HsBindgen.Runtime.LibC.CSize
+         -> HsBindgen.Runtime.LibC.CSize
+         -> SDL_CompareCallback_r
+         -> BG.Ptr BG.Void
+         -> IO ()
+       )
+sDL_qsort_r =
+  BG.unsafePerformIO hs_bindgen_271b6eff10a288b3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_bsearch_r@
+foreign import ccall unsafe "hs_bindgen_39f0a8a8445979b1"
+  hs_bindgen_39f0a8a8445979b1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_bsearch_r@
+hs_bindgen_39f0a8a8445979b1
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.Void
+             -> PtrConst.PtrConst BG.Void
+             -> HsBindgen.Runtime.LibC.CSize
+             -> HsBindgen.Runtime.LibC.CSize
+             -> SDL_CompareCallback_r
+             -> BG.Ptr BG.Void
+             -> IO (BG.Ptr BG.Void)
+           )
+       )
+hs_bindgen_39f0a8a8445979b1 =
+  BG.fromFFIType hs_bindgen_39f0a8a8445979b1_base
+
+{-# NOINLINE sDL_bsearch_r #-}
+
+-- | Perform a binary search on a previously sorted array, passing a userdata pointer to the compare function.
+--
+--     For example:
+--
+--     @
+--     typedef enum {
+--         sort_increasing,
+--         sort_decreasing,
+--     } sort_method;
+--
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *userdata, const void *a, const void *b)
+--     {
+--         sort_method method = (sort_method)(uintptr_t)userdata;
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->key \< B->key) {
+--             return (method == sort_increasing) ? -1 : 1;
+--         } else if (B->key \< A->key) {
+--             return (method == sort_increasing) ? 1 : -1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 1, \"first\" }, { 2, \"second\" }, { 3, \"third\" }
+--     };
+--     data key = { 2, NULL };
+--
+--     data *result = SDL_bsearch_r(&key, values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing);
+--     @
+--
+--     [@key@]: a pointer to a key equal to the element being searched for.
+--
+--     [@base@]: a pointer to the start of the array.
+--
+--     [@nmemb@]: the number of elements in the array.
+--
+--     [@size@]: the size of the elements in the array.
+--
+--     [@compare@]: a function used to compare elements in the array.
+--
+--     [@userdata@]: a pointer to pass to the compare function.
+--
+--     [Returns]: a pointer to the matching element in the array, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch', 'sDL_qsort_r'
+--
+--     [C declaration]: @SDL_bsearch_r@, defined at @SDL3\/SDL_stdinc.h 2101:36@
+sDL_bsearch_r
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.Void
+         -> PtrConst.PtrConst BG.Void
+         -> HsBindgen.Runtime.LibC.CSize
+         -> HsBindgen.Runtime.LibC.CSize
+         -> SDL_CompareCallback_r
+         -> BG.Ptr BG.Void
+         -> IO (BG.Ptr BG.Void)
+       )
+sDL_bsearch_r =
+  BG.unsafePerformIO hs_bindgen_39f0a8a8445979b1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_abs@
+foreign import ccall unsafe "hs_bindgen_955d92475ad359d8"
+  hs_bindgen_955d92475ad359d8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_abs@
+hs_bindgen_955d92475ad359d8 :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_955d92475ad359d8 =
+  BG.fromFFIType hs_bindgen_955d92475ad359d8_base
+
+{-# NOINLINE sDL_abs #-}
+
+-- | Compute the absolute value of @x@.
+--
+--     [@x@]: an integer value.
+--
+--     [Returns]: the absolute value of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_abs@, defined at @SDL3\/SDL_stdinc.h 2113:33@
+sDL_abs :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_abs =
+  BG.unsafePerformIO hs_bindgen_955d92475ad359d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isalpha@
+foreign import ccall unsafe "hs_bindgen_8e8018b5d5d8d98f"
+  hs_bindgen_8e8018b5d5d8d98f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isalpha@
+hs_bindgen_8e8018b5d5d8d98f :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_8e8018b5d5d8d98f =
+  BG.fromFFIType hs_bindgen_8e8018b5d5d8d98f_base
+
+{-# NOINLINE sDL_isalpha #-}
+
+-- | Query if a character is alphabetic (a letter).
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values for English \'a-z\' and \'A-Z\' as true.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isalpha@, defined at @SDL3\/SDL_stdinc.h 2188:33@
+sDL_isalpha :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_isalpha =
+  BG.unsafePerformIO hs_bindgen_8e8018b5d5d8d98f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isalnum@
+foreign import ccall unsafe "hs_bindgen_a52d45d106787b27"
+  hs_bindgen_a52d45d106787b27_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isalnum@
+hs_bindgen_a52d45d106787b27 :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_a52d45d106787b27 =
+  BG.fromFFIType hs_bindgen_a52d45d106787b27_base
+
+{-# NOINLINE sDL_isalnum #-}
+
+-- | Query if a character is alphabetic (a letter) or a number.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values for English \'a-z\', \'A-Z\', and \'0-9\' as true.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isalnum@, defined at @SDL3\/SDL_stdinc.h 2203:33@
+sDL_isalnum :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_isalnum =
+  BG.unsafePerformIO hs_bindgen_a52d45d106787b27
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isblank@
+foreign import ccall unsafe "hs_bindgen_0c075721ec100ff5"
+  hs_bindgen_0c075721ec100ff5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isblank@
+hs_bindgen_0c075721ec100ff5 :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_0c075721ec100ff5 =
+  BG.fromFFIType hs_bindgen_0c075721ec100ff5_base
+
+{-# NOINLINE sDL_isblank #-}
+
+-- | Report if a character is blank (a space or tab).
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values 0x20 (space) or 0x9 (tab) as true.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isblank@, defined at @SDL3\/SDL_stdinc.h 2218:33@
+sDL_isblank :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_isblank =
+  BG.unsafePerformIO hs_bindgen_0c075721ec100ff5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iscntrl@
+foreign import ccall unsafe "hs_bindgen_de902558496e469f"
+  hs_bindgen_de902558496e469f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iscntrl@
+hs_bindgen_de902558496e469f :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_de902558496e469f =
+  BG.fromFFIType hs_bindgen_de902558496e469f_base
+
+{-# NOINLINE sDL_iscntrl #-}
+
+-- | Report if a character is a control character.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values 0 through 0x1F, and 0x7F, as true.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_iscntrl@, defined at @SDL3\/SDL_stdinc.h 2233:33@
+sDL_iscntrl :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_iscntrl =
+  BG.unsafePerformIO hs_bindgen_de902558496e469f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isdigit@
+foreign import ccall unsafe "hs_bindgen_61af141b860ceb41"
+  hs_bindgen_61af141b860ceb41_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isdigit@
+hs_bindgen_61af141b860ceb41 :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_61af141b860ceb41 =
+  BG.fromFFIType hs_bindgen_61af141b860ceb41_base
+
+{-# NOINLINE sDL_isdigit #-}
+
+-- | Report if a character is a numeric digit.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'0\' (0x30) through \'9\' (0x39), as true.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isdigit@, defined at @SDL3\/SDL_stdinc.h 2248:33@
+sDL_isdigit :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_isdigit =
+  BG.unsafePerformIO hs_bindgen_61af141b860ceb41
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isxdigit@
+foreign import ccall unsafe "hs_bindgen_c17beb32f0f1fd52"
+  hs_bindgen_c17beb32f0f1fd52_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isxdigit@
+hs_bindgen_c17beb32f0f1fd52 :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_c17beb32f0f1fd52 =
+  BG.fromFFIType hs_bindgen_c17beb32f0f1fd52_base
+
+{-# NOINLINE sDL_isxdigit #-}
+
+-- | Report if a character is a hexadecimal digit.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'A\' through \'F\', \'a\' through \'f\', and \'0\' through \'9\', as true.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isxdigit@, defined at @SDL3\/SDL_stdinc.h 2263:33@
+sDL_isxdigit :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_isxdigit =
+  BG.unsafePerformIO hs_bindgen_c17beb32f0f1fd52
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ispunct@
+foreign import ccall unsafe "hs_bindgen_a88a9667ca4e8aa7"
+  hs_bindgen_a88a9667ca4e8aa7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ispunct@
+hs_bindgen_a88a9667ca4e8aa7 :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_a88a9667ca4e8aa7 =
+  BG.fromFFIType hs_bindgen_a88a9667ca4e8aa7_base
+
+{-# NOINLINE sDL_ispunct #-}
+
+-- | Report if a character is a punctuation mark.
+--
+--     __WARNING__: Regardless of system locale, this is equivalent to @((SDL_isgraph(x)) && (!SDL_isalnum(x)))@.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isgraph', 'sDL_isalnum'
+--
+--     [C declaration]: @SDL_ispunct@, defined at @SDL3\/SDL_stdinc.h 2281:33@
+sDL_ispunct :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_ispunct =
+  BG.unsafePerformIO hs_bindgen_a88a9667ca4e8aa7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isspace@
+foreign import ccall unsafe "hs_bindgen_02457e0c40d5e057"
+  hs_bindgen_02457e0c40d5e057_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isspace@
+hs_bindgen_02457e0c40d5e057 :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_02457e0c40d5e057 =
+  BG.fromFFIType hs_bindgen_02457e0c40d5e057_base
+
+{-# NOINLINE sDL_isspace #-}
+
+-- | Report if a character is whitespace.
+--
+--     __WARNING__: Regardless of system locale, this will only treat the following ASCII values as true:
+--
+--     * space (0x20)
+--
+--     * tab (0x09)
+--
+--     * newline (0x0A)
+--
+--     * vertical tab (0x0B)
+--
+--     * form feed (0x0C)
+--
+--     * return (0x0D)
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isspace@, defined at @SDL3\/SDL_stdinc.h 2303:33@
+sDL_isspace :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_isspace =
+  BG.unsafePerformIO hs_bindgen_02457e0c40d5e057
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isupper@
+foreign import ccall unsafe "hs_bindgen_0f55cc5ba611a3f2"
+  hs_bindgen_0f55cc5ba611a3f2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isupper@
+hs_bindgen_0f55cc5ba611a3f2 :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_0f55cc5ba611a3f2 =
+  BG.fromFFIType hs_bindgen_0f55cc5ba611a3f2_base
+
+{-# NOINLINE sDL_isupper #-}
+
+-- | Report if a character is upper case.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'A\' through \'Z\' as true.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isupper@, defined at @SDL3\/SDL_stdinc.h 2318:33@
+sDL_isupper :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_isupper =
+  BG.unsafePerformIO hs_bindgen_0f55cc5ba611a3f2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_islower@
+foreign import ccall unsafe "hs_bindgen_f681ed21a8e1349a"
+  hs_bindgen_f681ed21a8e1349a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_islower@
+hs_bindgen_f681ed21a8e1349a :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_f681ed21a8e1349a =
+  BG.fromFFIType hs_bindgen_f681ed21a8e1349a_base
+
+{-# NOINLINE sDL_islower #-}
+
+-- | Report if a character is lower case.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'a\' through \'z\' as true.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_islower@, defined at @SDL3\/SDL_stdinc.h 2333:33@
+sDL_islower :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_islower =
+  BG.unsafePerformIO hs_bindgen_f681ed21a8e1349a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isprint@
+foreign import ccall unsafe "hs_bindgen_991fe49732021ccb"
+  hs_bindgen_991fe49732021ccb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isprint@
+hs_bindgen_991fe49732021ccb :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_991fe49732021ccb =
+  BG.fromFFIType hs_bindgen_991fe49732021ccb_base
+
+{-# NOINLINE sDL_isprint #-}
+
+-- | Report if a character is \"printable\".
+--
+--     Be advised that \"printable\" has a definition that goes back to text terminals from the dawn of computing, making this a sort of special case function that is not suitable for Unicode (or most any) text management.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \' \' (0x20) through \'~\' (0x7E) as true.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isprint@, defined at @SDL3\/SDL_stdinc.h 2352:33@
+sDL_isprint :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_isprint =
+  BG.unsafePerformIO hs_bindgen_991fe49732021ccb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isgraph@
+foreign import ccall unsafe "hs_bindgen_192487d885c8ab5a"
+  hs_bindgen_192487d885c8ab5a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isgraph@
+hs_bindgen_192487d885c8ab5a :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_192487d885c8ab5a =
+  BG.fromFFIType hs_bindgen_192487d885c8ab5a_base
+
+{-# NOINLINE sDL_isgraph #-}
+
+-- | Report if a character is any \"printable\" except space.
+--
+--     Be advised that \"printable\" has a definition that goes back to text terminals from the dawn of computing, making this a sort of special case function that is not suitable for Unicode (or most any) text management.
+--
+--     __WARNING__: Regardless of system locale, this is equivalent to @(SDL_isprint(x)) && ((x) != \' \')@.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isprint'
+--
+--     [C declaration]: @SDL_isgraph@, defined at @SDL3\/SDL_stdinc.h 2373:33@
+sDL_isgraph :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_isgraph =
+  BG.unsafePerformIO hs_bindgen_192487d885c8ab5a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_toupper@
+foreign import ccall unsafe "hs_bindgen_ffb5de4d18c52c67"
+  hs_bindgen_ffb5de4d18c52c67_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_toupper@
+hs_bindgen_ffb5de4d18c52c67 :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_ffb5de4d18c52c67 =
+  BG.fromFFIType hs_bindgen_ffb5de4d18c52c67_base
+
+{-# NOINLINE sDL_toupper #-}
+
+-- | Convert low-ASCII English letters to uppercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'a\' through \'z\' to uppercase.
+--
+--     This function returns the uppercase equivalent of @x@. If a character cannot be converted, or is already uppercase, this function returns @x@.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: capitalized version of x, or x if no conversion available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_toupper@, defined at @SDL3\/SDL_stdinc.h 2391:33@
+sDL_toupper :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_toupper =
+  BG.unsafePerformIO hs_bindgen_ffb5de4d18c52c67
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_tolower@
+foreign import ccall unsafe "hs_bindgen_9f7c4f835baa2ffa"
+  hs_bindgen_9f7c4f835baa2ffa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_tolower@
+hs_bindgen_9f7c4f835baa2ffa :: IO (BG.FunPtr (BG.CInt -> IO BG.CInt))
+hs_bindgen_9f7c4f835baa2ffa =
+  BG.fromFFIType hs_bindgen_9f7c4f835baa2ffa_base
+
+{-# NOINLINE sDL_tolower #-}
+
+-- | Convert low-ASCII English letters to lowercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to lowercase.
+--
+--     This function returns the lowercase equivalent of @x@. If a character cannot be converted, or is already lowercase, this function returns @x@.
+--
+--     [@x@]: character value to check.
+--
+--     [Returns]: lowercase version of x, or x if no conversion available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_tolower@, defined at @SDL3\/SDL_stdinc.h 2409:33@
+sDL_tolower :: BG.FunPtr (BG.CInt -> IO BG.CInt)
+sDL_tolower =
+  BG.unsafePerformIO hs_bindgen_9f7c4f835baa2ffa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_crc16@
+foreign import ccall unsafe "hs_bindgen_a900454baab74e94"
+  hs_bindgen_a900454baab74e94_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_crc16@
+hs_bindgen_a900454baab74e94
+  :: IO (BG.FunPtr (Uint16 -> PtrConst.PtrConst BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO Uint16))
+hs_bindgen_a900454baab74e94 =
+  BG.fromFFIType hs_bindgen_a900454baab74e94_base
+
+{-# NOINLINE sDL_crc16 #-}
+
+-- | Calculate a CRC-16 value.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
+--
+--     This function can be called multiple times, to stream data to be checksummed in blocks. Each call must provide the previous CRC-16 return value to be updated with the next block. The first call to this function for a set of blocks should pass in a zero CRC value.
+--
+--     [@crc@]: the current checksum for this data set, or 0 for a new data set.
+--
+--     [@data@]: a new block of data to add to the checksum.
+--
+--     [@len@]: the size, in bytes, of the new block of data.
+--
+--     [Returns]: a CRC-16 checksum value of all blocks in the data set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_crc16@, defined at @SDL3\/SDL_stdinc.h 2430:36@
+sDL_crc16
+  :: BG.FunPtr (Uint16 -> PtrConst.PtrConst BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO Uint16)
+sDL_crc16 =
+  BG.unsafePerformIO hs_bindgen_a900454baab74e94
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_crc32@
+foreign import ccall unsafe "hs_bindgen_ce720b59f82b140a"
+  hs_bindgen_ce720b59f82b140a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_crc32@
+hs_bindgen_ce720b59f82b140a
+  :: IO (BG.FunPtr (Uint32 -> PtrConst.PtrConst BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO Uint32))
+hs_bindgen_ce720b59f82b140a =
+  BG.fromFFIType hs_bindgen_ce720b59f82b140a_base
+
+{-# NOINLINE sDL_crc32 #-}
+
+-- | Calculate a CRC-32 value.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
+--
+--     This function can be called multiple times, to stream data to be checksummed in blocks. Each call must provide the previous CRC-32 return value to be updated with the next block. The first call to this function for a set of blocks should pass in a zero CRC value.
+--
+--     [@crc@]: the current checksum for this data set, or 0 for a new data set.
+--
+--     [@data@]: a new block of data to add to the checksum.
+--
+--     [@len@]: the size, in bytes, of the new block of data.
+--
+--     [Returns]: a CRC-32 checksum value of all blocks in the data set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_crc32@, defined at @SDL3\/SDL_stdinc.h 2451:36@
+sDL_crc32
+  :: BG.FunPtr (Uint32 -> PtrConst.PtrConst BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO Uint32)
+sDL_crc32 =
+  BG.unsafePerformIO hs_bindgen_ce720b59f82b140a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_murmur3_32@
+foreign import ccall unsafe "hs_bindgen_fe133a77578cb1aa"
+  hs_bindgen_fe133a77578cb1aa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_murmur3_32@
+hs_bindgen_fe133a77578cb1aa
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.Void -> HsBindgen.Runtime.LibC.CSize -> Uint32 -> IO Uint32))
+hs_bindgen_fe133a77578cb1aa =
+  BG.fromFFIType hs_bindgen_fe133a77578cb1aa_base
+
+{-# NOINLINE sDL_murmur3_32 #-}
+
+-- | Calculate a 32-bit MurmurHash3 value for a block of data.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/MurmurHash](https://en.wikipedia.org/wiki/MurmurHash)
+--
+--     A seed may be specified, which changes the final results consistently, but this does not work like SDL_crc16 and SDL_crc32: you can\'t feed a previous result from this function back into itself as the next seed value to calculate a hash in chunks; it won\'t produce the same hash as it would if the same data was provided in a single call.
+--
+--     If you aren\'t sure what to provide for a seed, zero is fine. Murmur3 is not cryptographically secure, so it shouldn\'t be used for hashing top-secret data.
+--
+--     [@data@]: the data to be hashed.
+--
+--     [@len@]: the size of data, in bytes.
+--
+--     [@seed@]: a value that alters the final hash value.
+--
+--     [Returns]: a Murmur3 32-bit hash value.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_murmur3_32@, defined at @SDL3\/SDL_stdinc.h 2477:36@
+sDL_murmur3_32
+  :: BG.FunPtr (PtrConst.PtrConst BG.Void -> HsBindgen.Runtime.LibC.CSize -> Uint32 -> IO Uint32)
+sDL_murmur3_32 =
+  BG.unsafePerformIO hs_bindgen_fe133a77578cb1aa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_memset4@
+foreign import ccall unsafe "hs_bindgen_45d6fa96a2a35062"
+  hs_bindgen_45d6fa96a2a35062_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_memset4@
+hs_bindgen_45d6fa96a2a35062
+  :: IO (BG.FunPtr (BG.Ptr BG.Void -> Uint32 -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+hs_bindgen_45d6fa96a2a35062 =
+  BG.fromFFIType hs_bindgen_45d6fa96a2a35062_base
+
+{-# NOINLINE sDL_memset4 #-}
+
+-- | Initialize all 32-bit words of buffer of memory to a specific value.
+--
+--     This function will set a buffer of @dwords@ 'Uint32' values, pointed to by @dst@, to the value specified in @val@.
+--
+--     Unlike SDL_memset, this sets 32-bit values, not bytes, so it\'s not limited to a range of 0-255.
+--
+--     [@dst@]: the destination memory region. Must not be NULL.
+--
+--     [@val@]: the 'Uint32' value to set.
+--
+--     [@dwords@]: the number of 'Uint32' values to set in @dst@.
+--
+--     [Returns]: @dst@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_memset4@, defined at @SDL3\/SDL_stdinc.h 2601:36@
+sDL_memset4
+  :: BG.FunPtr (BG.Ptr BG.Void -> Uint32 -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void))
+sDL_memset4 =
+  BG.unsafePerformIO hs_bindgen_45d6fa96a2a35062
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_memcmp@
+foreign import ccall unsafe "hs_bindgen_d8af51803c9c5c62"
+  hs_bindgen_d8af51803c9c5c62_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_memcmp@
+hs_bindgen_d8af51803c9c5c62
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst BG.Void -> PtrConst.PtrConst BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt)
+       )
+hs_bindgen_d8af51803c9c5c62 =
+  BG.fromFFIType hs_bindgen_d8af51803c9c5c62_base
+
+{-# NOINLINE sDL_memcmp #-}
+
+-- | Compare two buffers of memory.
+--
+--     [@s1@]: the first buffer to compare. NULL is not permitted!
+--
+--     [@s2@]: the second buffer to compare. NULL is not permitted!
+--
+--     [@len@]: the number of bytes to compare between the buffers.
+--
+--     [Returns]: less than zero if s1 is \"less than\" s2, greater than zero if s1 is \"greater than\" s2, and zero if the buffers match exactly for @len@ bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_memcmp@, defined at @SDL3\/SDL_stdinc.h 2683:33@
+sDL_memcmp
+  :: BG.FunPtr
+       (PtrConst.PtrConst BG.Void -> PtrConst.PtrConst BG.Void -> HsBindgen.Runtime.LibC.CSize -> IO BG.CInt)
+sDL_memcmp =
+  BG.unsafePerformIO hs_bindgen_d8af51803c9c5c62
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcslen@
+foreign import ccall unsafe "hs_bindgen_b1d053429f9e09c3"
+  hs_bindgen_b1d053429f9e09c3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcslen@
+hs_bindgen_b1d053429f9e09c3
+  :: IO (BG.FunPtr (PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar -> IO HsBindgen.Runtime.LibC.CSize))
+hs_bindgen_b1d053429f9e09c3 =
+  BG.fromFFIType hs_bindgen_b1d053429f9e09c3_base
+
+{-# NOINLINE sDL_wcslen #-}
+
+-- | This works exactly like wcslen() but doesn\'t require access to a C runtime.
+--
+--     Counts the number of wchar_t values in @wstr@, excluding the null terminator.
+--
+--     Like SDL_strlen only counts bytes and not codepoints in a UTF-8 string, this counts wchar_t values in a string, even if the string\'s encoding is of variable width, like UTF-16.
+--
+--     Also be aware that wchar_t is different sizes on different platforms (4 bytes on Linux, 2 on Windows, etc).
+--
+--     [@wstr@]: The null-terminated wide string to read. Must not be NULL.
+--
+--     [Returns]: the length (in wchar_t values, excluding the null terminator) of @wstr@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcsnlen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_wcslen@, defined at @SDL3\/SDL_stdinc.h 2710:36@
+sDL_wcslen
+  :: BG.FunPtr (PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar -> IO HsBindgen.Runtime.LibC.CSize)
+sDL_wcslen =
+  BG.unsafePerformIO hs_bindgen_b1d053429f9e09c3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsnlen@
+foreign import ccall unsafe "hs_bindgen_ce1645bc94a325e1"
+  hs_bindgen_ce1645bc94a325e1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsnlen@
+hs_bindgen_ce1645bc94a325e1
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+       )
+hs_bindgen_ce1645bc94a325e1 =
+  BG.fromFFIType hs_bindgen_ce1645bc94a325e1_base
+
+{-# NOINLINE sDL_wcsnlen #-}
+
+-- | This works exactly like wcsnlen() but doesn\'t require access to a C runtime.
+--
+--     Counts up to a maximum of @maxlen@ wchar_t values in @wstr@, excluding the null terminator.
+--
+--     Like SDL_strnlen only counts bytes and not codepoints in a UTF-8 string, this counts wchar_t values in a string, even if the string\'s encoding is of variable width, like UTF-16.
+--
+--     Also be aware that wchar_t is different sizes on different platforms (4 bytes on Linux, 2 on Windows, etc).
+--
+--     Also, @maxlen@ is a count of wide characters, not bytes!
+--
+--     [@wstr@]: The null-terminated wide string to read. Must not be NULL.
+--
+--     [@maxlen@]: The maximum amount of wide characters to count.
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of @wstr@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcslen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_wcsnlen@, defined at @SDL3\/SDL_stdinc.h 2741:36@
+sDL_wcsnlen
+  :: BG.FunPtr
+       ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO HsBindgen.Runtime.LibC.CSize
+       )
+sDL_wcsnlen =
+  BG.unsafePerformIO hs_bindgen_ce1645bc94a325e1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcslcpy@
+foreign import ccall unsafe "hs_bindgen_11ca43711b8baf20"
+  hs_bindgen_11ca43711b8baf20_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcslcpy@
+hs_bindgen_11ca43711b8baf20
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr HsBindgen.Runtime.LibC.CWchar
+             -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+       )
+hs_bindgen_11ca43711b8baf20 =
+  BG.fromFFIType hs_bindgen_11ca43711b8baf20_base
+
+{-# NOINLINE sDL_wcslcpy #-}
+
+-- | Copy a wide string.
+--
+--     This function copies @maxlen@ - 1 wide characters from @src@ to @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ is 0, no wide characters are copied and no null terminator is written.
+--
+--     [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+--
+--     [@src@]: The null-terminated wide string to copy. Must not be NULL, and must not overlap with @dst@.
+--
+--     [@maxlen@]: The length (in wide characters) of the destination buffer.
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcslcat'
+--
+--     [C declaration]: @SDL_wcslcpy@, defined at @SDL3\/SDL_stdinc.h 2768:36@
+sDL_wcslcpy
+  :: BG.FunPtr
+       ( BG.Ptr HsBindgen.Runtime.LibC.CWchar
+         -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO HsBindgen.Runtime.LibC.CSize
+       )
+sDL_wcslcpy =
+  BG.unsafePerformIO hs_bindgen_11ca43711b8baf20
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcslcat@
+foreign import ccall unsafe "hs_bindgen_7e7896cd495dd344"
+  hs_bindgen_7e7896cd495dd344_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcslcat@
+hs_bindgen_7e7896cd495dd344
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr HsBindgen.Runtime.LibC.CWchar
+             -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+       )
+hs_bindgen_7e7896cd495dd344 =
+  BG.fromFFIType hs_bindgen_7e7896cd495dd344_base
+
+{-# NOINLINE sDL_wcslcat #-}
+
+-- | Concatenate wide strings.
+--
+--     This function appends up to @maxlen@ - SDL_wcslen(dst) - 1 wide characters from @src@ to the end of the wide string in @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ - SDL_wcslen(dst) - 1 is less than or equal to 0, then @dst@ is unmodified.
+--
+--     [@dst@]: The destination buffer already containing the first null-terminated wide string. Must not be NULL and must not overlap with @src@.
+--
+--     [@src@]: The second null-terminated wide string. Must not be NULL, and must not overlap with @dst@.
+--
+--     [@maxlen@]: The length (in wide characters) of the destination buffer.
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of the string in @dst@ plus the length of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcslcpy'
+--
+--     [C declaration]: @SDL_wcslcat@, defined at @SDL3\/SDL_stdinc.h 2797:36@
+sDL_wcslcat
+  :: BG.FunPtr
+       ( BG.Ptr HsBindgen.Runtime.LibC.CWchar
+         -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO HsBindgen.Runtime.LibC.CSize
+       )
+sDL_wcslcat =
+  BG.unsafePerformIO hs_bindgen_7e7896cd495dd344
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsdup@
+foreign import ccall unsafe "hs_bindgen_9ab91a86c489d607"
+  hs_bindgen_9ab91a86c489d607_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsdup@
+hs_bindgen_9ab91a86c489d607
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar))
+       )
+hs_bindgen_9ab91a86c489d607 =
+  BG.fromFFIType hs_bindgen_9ab91a86c489d607_base
+
+{-# NOINLINE sDL_wcsdup #-}
+
+-- | Allocate a copy of a wide string.
+--
+--     This allocates enough space for a null-terminated copy of @wstr@, using SDL_malloc, and then makes a copy of the string into this space.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [@wstr@]: the string to copy.
+--
+--     [Returns]: a pointer to the newly-allocated wide string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsdup@, defined at @SDL3\/SDL_stdinc.h 2815:39@
+sDL_wcsdup
+  :: BG.FunPtr
+       (PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar))
+sDL_wcsdup =
+  BG.unsafePerformIO hs_bindgen_9ab91a86c489d607
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsstr@
+foreign import ccall unsafe "hs_bindgen_e5c78fe942e46a5f"
+  hs_bindgen_e5c78fe942e46a5f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsstr@
+hs_bindgen_e5c78fe942e46a5f
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+           )
+       )
+hs_bindgen_e5c78fe942e46a5f =
+  BG.fromFFIType hs_bindgen_e5c78fe942e46a5f_base
+
+{-# NOINLINE sDL_wcsstr #-}
+
+-- | Search a wide string for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string.
+--
+--     Note that this looks for strings of /wide characters/, not /codepoints/, so it\'s legal to search for malformed and incomplete UTF-16 sequences.
+--
+--     [@haystack@]: the wide string to search. Must not be NULL.
+--
+--     [@needle@]: the wide string to search for. Must not be NULL.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsstr@, defined at @SDL3\/SDL_stdinc.h 2835:39@
+sDL_wcsstr
+  :: BG.FunPtr
+       ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+       )
+sDL_wcsstr =
+  BG.unsafePerformIO hs_bindgen_e5c78fe942e46a5f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsnstr@
+foreign import ccall unsafe "hs_bindgen_2dc934c7f1856237"
+  hs_bindgen_2dc934c7f1856237_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsnstr@
+hs_bindgen_2dc934c7f1856237
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+           )
+       )
+hs_bindgen_2dc934c7f1856237 =
+  BG.fromFFIType hs_bindgen_2dc934c7f1856237_base
+
+{-# NOINLINE sDL_wcsnstr #-}
+
+-- | Search a wide string, up to n wide chars, for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator value to end the string, or @maxlen@ wide character have been examined. It is possible to use this function on a wide string without a null terminator.
+--
+--     Note that this looks for strings of /wide characters/, not /codepoints/, so it\'s legal to search for malformed and incomplete UTF-16 sequences.
+--
+--     [@haystack@]: the wide string to search. Must not be NULL.
+--
+--     [@needle@]: the wide string to search for. Must not be NULL.
+--
+--     [@maxlen@]: the maximum number of wide characters to search in @haystack@.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsnstr@, defined at @SDL3\/SDL_stdinc.h 2860:39@
+sDL_wcsnstr
+  :: BG.FunPtr
+       ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+       )
+sDL_wcsnstr =
+  BG.unsafePerformIO hs_bindgen_2dc934c7f1856237
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcscmp@
+foreign import ccall unsafe "hs_bindgen_759b9046679b686f"
+  hs_bindgen_759b9046679b686f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcscmp@
+hs_bindgen_759b9046679b686f
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_759b9046679b686f =
+  BG.fromFFIType hs_bindgen_759b9046679b686f_base
+
+{-# NOINLINE sDL_wcscmp #-}
+
+-- | Compare two null-terminated wide strings.
+--
+--     This only compares wchar_t values until it hits a null-terminating character; it does not care if the string is well-formed UTF-16 (or UTF-32, depending on your platform\'s wchar_t size), or uses valid Unicode values.
+--
+--     [@str1@]: the first string to compare. NULL is not permitted!
+--
+--     [@str2@]: the second string to compare. NULL is not permitted!
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcscmp@, defined at @SDL3\/SDL_stdinc.h 2879:33@
+sDL_wcscmp
+  :: BG.FunPtr
+       ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> IO BG.CInt
+       )
+sDL_wcscmp =
+  BG.unsafePerformIO hs_bindgen_759b9046679b686f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsncmp@
+foreign import ccall unsafe "hs_bindgen_c5ac0e330fb4ae45"
+  hs_bindgen_c5ac0e330fb4ae45_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsncmp@
+hs_bindgen_c5ac0e330fb4ae45
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_c5ac0e330fb4ae45 =
+  BG.fromFFIType hs_bindgen_c5ac0e330fb4ae45_base
+
+{-# NOINLINE sDL_wcsncmp #-}
+
+-- | Compare two wide strings up to a number of wchar_t values.
+--
+--     This only compares wchar_t values; it does not care if the string is well-formed UTF-16 (or UTF-32, depending on your platform\'s wchar_t size), or uses valid Unicode values.
+--
+--     Note that while this function is intended to be used with UTF-16 (or UTF-32, depending on your platform\'s definition of wchar_t), it is comparing raw wchar_t values and not Unicode codepoints: @maxlen@ specifies a wchar_t limit! If the limit lands in the middle of a multi-wchar UTF-16 sequence, it will only compare a portion of the final character.
+--
+--     @maxlen@ specifies a maximum number of wchar_t to compare; if the strings match to this number of wide chars (or both have matched to a null-terminator character before this count), they will be considered equal.
+--
+--     [@str1@]: the first string to compare. NULL is not permitted!
+--
+--     [@str2@]: the second string to compare. NULL is not permitted!
+--
+--     [@maxlen@]: the maximum number of wchar_t to compare.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsncmp@, defined at @SDL3\/SDL_stdinc.h 2910:33@
+sDL_wcsncmp
+  :: BG.FunPtr
+       ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CInt
+       )
+sDL_wcsncmp =
+  BG.unsafePerformIO hs_bindgen_c5ac0e330fb4ae45
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcscasecmp@
+foreign import ccall unsafe "hs_bindgen_fb42c136f5dd392f"
+  hs_bindgen_fb42c136f5dd392f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcscasecmp@
+hs_bindgen_fb42c136f5dd392f
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_fb42c136f5dd392f =
+  BG.fromFFIType hs_bindgen_fb42c136f5dd392f_base
+
+{-# NOINLINE sDL_wcscasecmp #-}
+
+-- | Compare two null-terminated wide strings, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Depending on your platform, \"wchar_t\" might be 2 bytes, and expected to be UTF-16 encoded (like Windows), or 4 bytes in UTF-32 format. Since this handles Unicode, it expects the string to be well-formed and not a null-terminated string of arbitrary bytes. Characters that are not valid UTF-16 (or UTF-32) are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [@str1@]: the first string to compare. NULL is not permitted!
+--
+--     [@str2@]: the second string to compare. NULL is not permitted!
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcscasecmp@, defined at @SDL3\/SDL_stdinc.h 2940:33@
+sDL_wcscasecmp
+  :: BG.FunPtr
+       ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> IO BG.CInt
+       )
+sDL_wcscasecmp =
+  BG.unsafePerformIO hs_bindgen_fb42c136f5dd392f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsncasecmp@
+foreign import ccall unsafe "hs_bindgen_fcc719df5ea9c486"
+  hs_bindgen_fcc719df5ea9c486_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_wcsncasecmp@
+hs_bindgen_fcc719df5ea9c486
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_fcc719df5ea9c486 =
+  BG.fromFFIType hs_bindgen_fcc719df5ea9c486_base
+
+{-# NOINLINE sDL_wcsncasecmp #-}
+
+-- | Compare two wide strings, case-insensitively, up to a number of wchar_t.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Depending on your platform, \"wchar_t\" might be 2 bytes, and expected to be UTF-16 encoded (like Windows), or 4 bytes in UTF-32 format. Since this handles Unicode, it expects the string to be well-formed and not a null-terminated string of arbitrary bytes. Characters that are not valid UTF-16 (or UTF-32) are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     Note that while this function might deal with variable-sized characters, @maxlen@ specifies a /wchar/ limit! If the limit lands in the middle of a multi-byte UTF-16 sequence, it may convert a portion of the final character to one or more Unicode character U+FFFD (REPLACEMENT CHARACTER) so as not to overflow a buffer.
+--
+--     @maxlen@ specifies a maximum number of wchar_t values to compare; if the strings match to this number of wchar_t (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [@str1@]: the first string to compare. NULL is not permitted!
+--
+--     [@str2@]: the second string to compare. NULL is not permitted!
+--
+--     [@maxlen@]: the maximum number of wchar_t values to compare.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsncasecmp@, defined at @SDL3\/SDL_stdinc.h 2982:33@
+sDL_wcsncasecmp
+  :: BG.FunPtr
+       ( PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CInt
+       )
+sDL_wcsncasecmp =
+  BG.unsafePerformIO hs_bindgen_fcc719df5ea9c486
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlen@
+foreign import ccall unsafe "hs_bindgen_7f2511e625836c60"
+  hs_bindgen_7f2511e625836c60_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlen@
+hs_bindgen_7f2511e625836c60
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO HsBindgen.Runtime.LibC.CSize))
+hs_bindgen_7f2511e625836c60 =
+  BG.fromFFIType hs_bindgen_7f2511e625836c60_base
+
+{-# NOINLINE sDL_strlen #-}
+
+-- | This works exactly like strlen() but doesn\'t require access to a C runtime.
+--
+--     Counts the bytes in @str@, excluding the null terminator.
+--
+--     If you need the length of a UTF-8 string, consider using @SDL_utf8strlen()@.
+--
+--     [@str@]: The null-terminated string to read. Must not be NULL.
+--
+--     [Returns]: the length (in bytes, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strnlen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_strlen@, defined at @SDL3\/SDL_stdinc.h 3029:36@
+sDL_strlen :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO HsBindgen.Runtime.LibC.CSize)
+sDL_strlen =
+  BG.unsafePerformIO hs_bindgen_7f2511e625836c60
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strnlen@
+foreign import ccall unsafe "hs_bindgen_f4143204114af698"
+  hs_bindgen_f4143204114af698_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strnlen@
+hs_bindgen_f4143204114af698
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst BG.CChar -> HsBindgen.Runtime.LibC.CSize -> IO HsBindgen.Runtime.LibC.CSize)
+       )
+hs_bindgen_f4143204114af698 =
+  BG.fromFFIType hs_bindgen_f4143204114af698_base
+
+{-# NOINLINE sDL_strnlen #-}
+
+-- | This works exactly like strnlen() but doesn\'t require access to a C runtime.
+--
+--     Counts up to a maximum of @maxlen@ bytes in @str@, excluding the null terminator.
+--
+--     If you need the length of a UTF-8 string, consider using @SDL_utf8strnlen()@.
+--
+--     [@str@]: The null-terminated string to read. Must not be NULL.
+--
+--     [@maxlen@]: The maximum amount of bytes to count.
+--
+--     [Returns]: the length (in bytes, excluding the null terminator) of @src@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_strnlen@, defined at @SDL3\/SDL_stdinc.h 3053:36@
+sDL_strnlen
+  :: BG.FunPtr
+       (PtrConst.PtrConst BG.CChar -> HsBindgen.Runtime.LibC.CSize -> IO HsBindgen.Runtime.LibC.CSize)
+sDL_strnlen =
+  BG.unsafePerformIO hs_bindgen_f4143204114af698
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlcpy@
+foreign import ccall unsafe "hs_bindgen_7640410395c54d89"
+  hs_bindgen_7640410395c54d89_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlcpy@
+hs_bindgen_7640410395c54d89
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+       )
+hs_bindgen_7640410395c54d89 =
+  BG.fromFFIType hs_bindgen_7640410395c54d89_base
+
+{-# NOINLINE sDL_strlcpy #-}
+
+-- | Copy a string.
+--
+--     This function copies up to @maxlen@ - 1 characters from @src@ to @dst@, then appends a null terminator.
+--
+--     If @maxlen@ is 0, no characters are copied and no null terminator is written.
+--
+--     If you want to copy an UTF-8 string but need to ensure that multi-byte sequences are not truncated, consider using @SDL_utf8strlcpy()@.
+--
+--     [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+--
+--     [@src@]: The null-terminated string to copy. Must not be NULL, and must not overlap with @dst@.
+--
+--     [@maxlen@]: The length (in characters) of the destination buffer.
+--
+--     [Returns]: the length (in characters, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlcat', 'sDL_utf8strlcpy'
+--
+--     [C declaration]: @SDL_strlcpy@, defined at @SDL3\/SDL_stdinc.h 3082:36@
+sDL_strlcpy
+  :: BG.FunPtr
+       ( BG.Ptr BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO HsBindgen.Runtime.LibC.CSize
+       )
+sDL_strlcpy =
+  BG.unsafePerformIO hs_bindgen_7640410395c54d89
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_utf8strlcpy@
+foreign import ccall unsafe "hs_bindgen_a2badcf2b044ea50"
+  hs_bindgen_a2badcf2b044ea50_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_utf8strlcpy@
+hs_bindgen_a2badcf2b044ea50
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+       )
+hs_bindgen_a2badcf2b044ea50 =
+  BG.fromFFIType hs_bindgen_a2badcf2b044ea50_base
+
+{-# NOINLINE sDL_utf8strlcpy #-}
+
+-- | Copy an UTF-8 string.
+--
+--     This function copies up to @dst_bytes@ - 1 bytes from @src@ to @dst@ while also ensuring that the string written to @dst@ does not end in a truncated multi-byte sequence. Finally, it appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     Note that unlike @SDL_strlcpy()@, this function returns the number of bytes written, not the length of @src@.
+--
+--     [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+--
+--     [@src@]: The null-terminated UTF-8 string to copy. Must not be NULL, and must not overlap with @dst@.
+--
+--     [@dst_bytes@]: The length (in bytes) of the destination buffer. Must not be 0.
+--
+--     [Returns]: the number of bytes written, excluding the null terminator.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlcpy'
+--
+--     [C declaration]: @SDL_utf8strlcpy@, defined at @SDL3\/SDL_stdinc.h 3110:36@
+sDL_utf8strlcpy
+  :: BG.FunPtr
+       ( BG.Ptr BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO HsBindgen.Runtime.LibC.CSize
+       )
+sDL_utf8strlcpy =
+  BG.unsafePerformIO hs_bindgen_a2badcf2b044ea50
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlcat@
+foreign import ccall unsafe "hs_bindgen_26754eda643124d0"
+  hs_bindgen_26754eda643124d0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlcat@
+hs_bindgen_26754eda643124d0
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+       )
+hs_bindgen_26754eda643124d0 =
+  BG.fromFFIType hs_bindgen_26754eda643124d0_base
+
+{-# NOINLINE sDL_strlcat #-}
+
+-- | Concatenate strings.
+--
+--     This function appends up to @maxlen@ - SDL_strlen(dst) - 1 characters from @src@ to the end of the string in @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ - SDL_strlen(dst) - 1 is less than or equal to 0, then @dst@ is unmodified.
+--
+--     [@dst@]: The destination buffer already containing the first null-terminated string. Must not be NULL and must not overlap with @src@.
+--
+--     [@src@]: The second null-terminated string. Must not be NULL, and must not overlap with @dst@.
+--
+--     [@maxlen@]: The length (in characters) of the destination buffer.
+--
+--     [Returns]: the length (in characters, excluding the null terminator) of the string in @dst@ plus the length of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlcpy'
+--
+--     [C declaration]: @SDL_strlcat@, defined at @SDL3\/SDL_stdinc.h 3138:36@
+sDL_strlcat
+  :: BG.FunPtr
+       ( BG.Ptr BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO HsBindgen.Runtime.LibC.CSize
+       )
+sDL_strlcat =
+  BG.unsafePerformIO hs_bindgen_26754eda643124d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strdup@
+foreign import ccall unsafe "hs_bindgen_71b06acdd2d314be"
+  hs_bindgen_71b06acdd2d314be_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strdup@
+hs_bindgen_71b06acdd2d314be :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_71b06acdd2d314be =
+  BG.fromFFIType hs_bindgen_71b06acdd2d314be_base
+
+{-# NOINLINE sDL_strdup #-}
+
+-- | Allocate a copy of a string.
+--
+--     This allocates enough space for a null-terminated copy of @str@, using SDL_malloc, and then makes a copy of the string into this space.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [@str@]: the string to copy.
+--
+--     [Returns]: a pointer to the newly-allocated string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strdup@, defined at @SDL3\/SDL_stdinc.h 3156:47@
+sDL_strdup :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr BG.CChar))
+sDL_strdup =
+  BG.unsafePerformIO hs_bindgen_71b06acdd2d314be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strndup@
+foreign import ccall unsafe "hs_bindgen_fd797c695710e05f"
+  hs_bindgen_fd797c695710e05f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strndup@
+hs_bindgen_fd797c695710e05f
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_fd797c695710e05f =
+  BG.fromFFIType hs_bindgen_fd797c695710e05f_base
+
+{-# NOINLINE sDL_strndup #-}
+
+-- | Allocate a copy of a string, up to n characters.
+--
+--     This allocates enough space for a null-terminated copy of @str@, up to @maxlen@ bytes, using SDL_malloc, and then makes a copy of the string into this space.
+--
+--     If the string is longer than @maxlen@ bytes, the returned string will be @maxlen@ bytes long, plus a null-terminator character that isn\'t included in the count.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [@str@]: the string to copy.
+--
+--     [@maxlen@]: the maximum length of the copied string, not counting the null-terminator character.
+--
+--     [Returns]: a pointer to the newly-allocated string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strndup@, defined at @SDL3\/SDL_stdinc.h 3181:47@
+sDL_strndup
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.CChar))
+sDL_strndup =
+  BG.unsafePerformIO hs_bindgen_fd797c695710e05f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strrev@
+foreign import ccall unsafe "hs_bindgen_ffc5b79b6b976433"
+  hs_bindgen_ffc5b79b6b976433_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strrev@
+hs_bindgen_ffc5b79b6b976433 :: IO (BG.FunPtr (BG.Ptr BG.CChar -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_ffc5b79b6b976433 =
+  BG.fromFFIType hs_bindgen_ffc5b79b6b976433_base
+
+{-# NOINLINE sDL_strrev #-}
+
+-- | Reverse a string\'s contents.
+--
+--     This reverses a null-terminated string in-place. Only the content of the string is reversed; the null-terminator character remains at the end of the reversed string.
+--
+--     __WARNING__: This function reverses the /bytes/ of the string, not the codepoints. If @str@ is a UTF-8 string with Unicode codepoints > 127, this will ruin the string data. You should only use this function on strings that are completely comprised of low ASCII characters.
+--
+--     [@str@]: the string to reverse.
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strrev@, defined at @SDL3\/SDL_stdinc.h 3202:36@
+sDL_strrev :: BG.FunPtr (BG.Ptr BG.CChar -> IO (BG.Ptr BG.CChar))
+sDL_strrev =
+  BG.unsafePerformIO hs_bindgen_ffc5b79b6b976433
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strupr@
+foreign import ccall unsafe "hs_bindgen_ca97edf7bfcb6705"
+  hs_bindgen_ca97edf7bfcb6705_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strupr@
+hs_bindgen_ca97edf7bfcb6705 :: IO (BG.FunPtr (BG.Ptr BG.CChar -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_ca97edf7bfcb6705 =
+  BG.fromFFIType hs_bindgen_ca97edf7bfcb6705_base
+
+{-# NOINLINE sDL_strupr #-}
+
+-- | Convert a string to uppercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to uppercase.
+--
+--     This function operates on a null-terminated string of bytes even if it is malformed UTF-8! and converts ASCII characters \'a\' through \'z\' to their uppercase equivalents in-place, returning the original @str@ pointer.
+--
+--     [@str@]: the string to convert in-place. Can not be NULL.
+--
+--     [Returns]: the @str@ pointer passed into this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlwr'
+--
+--     [C declaration]: @SDL_strupr@, defined at @SDL3\/SDL_stdinc.h 3223:36@
+sDL_strupr :: BG.FunPtr (BG.Ptr BG.CChar -> IO (BG.Ptr BG.CChar))
+sDL_strupr =
+  BG.unsafePerformIO hs_bindgen_ca97edf7bfcb6705
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlwr@
+foreign import ccall unsafe "hs_bindgen_d78a5116cc6d3f71"
+  hs_bindgen_d78a5116cc6d3f71_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strlwr@
+hs_bindgen_d78a5116cc6d3f71 :: IO (BG.FunPtr (BG.Ptr BG.CChar -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_d78a5116cc6d3f71 =
+  BG.fromFFIType hs_bindgen_d78a5116cc6d3f71_base
+
+{-# NOINLINE sDL_strlwr #-}
+
+-- | Convert a string to lowercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to lowercase.
+--
+--     This function operates on a null-terminated string of bytes even if it is malformed UTF-8! and converts ASCII characters \'A\' through \'Z\' to their lowercase equivalents in-place, returning the original @str@ pointer.
+--
+--     [@str@]: the string to convert in-place. Can not be NULL.
+--
+--     [Returns]: the @str@ pointer passed into this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strupr'
+--
+--     [C declaration]: @SDL_strlwr@, defined at @SDL3\/SDL_stdinc.h 3244:36@
+sDL_strlwr :: BG.FunPtr (BG.Ptr BG.CChar -> IO (BG.Ptr BG.CChar))
+sDL_strlwr =
+  BG.unsafePerformIO hs_bindgen_d78a5116cc6d3f71
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strchr@
+foreign import ccall unsafe "hs_bindgen_6ce9f7bacdf27653"
+  hs_bindgen_6ce9f7bacdf27653_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strchr@
+hs_bindgen_6ce9f7bacdf27653
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_6ce9f7bacdf27653 =
+  BG.fromFFIType hs_bindgen_6ce9f7bacdf27653_base
+
+{-# NOINLINE sDL_strchr #-}
+
+-- | Search a string for the first instance of a specific byte.
+--
+--     The search ends once it finds the requested byte value, or a null terminator byte to end the string.
+--
+--     Note that this looks for /bytes/, not /characters/, so you cannot match against a Unicode codepoint > 255, regardless of character encoding.
+--
+--     [@str@]: the string to search. Must not be NULL.
+--
+--     [@c@]: the byte value to search for.
+--
+--     [Returns]: a pointer to the first instance of @c@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strchr@, defined at @SDL3\/SDL_stdinc.h 3264:36@
+sDL_strchr :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar))
+sDL_strchr =
+  BG.unsafePerformIO hs_bindgen_6ce9f7bacdf27653
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strrchr@
+foreign import ccall unsafe "hs_bindgen_d2538022eb73bf53"
+  hs_bindgen_d2538022eb73bf53_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strrchr@
+hs_bindgen_d2538022eb73bf53
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_d2538022eb73bf53 =
+  BG.fromFFIType hs_bindgen_d2538022eb73bf53_base
+
+{-# NOINLINE sDL_strrchr #-}
+
+-- | Search a string for the last instance of a specific byte.
+--
+--     The search must go until it finds a null terminator byte to end the string.
+--
+--     Note that this looks for /bytes/, not /characters/, so you cannot match against a Unicode codepoint > 255, regardless of character encoding.
+--
+--     [@str@]: the string to search. Must not be NULL.
+--
+--     [@c@]: the byte value to search for.
+--
+--     [Returns]: a pointer to the last instance of @c@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strrchr@, defined at @SDL3\/SDL_stdinc.h 3283:36@
+sDL_strrchr :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar))
+sDL_strrchr =
+  BG.unsafePerformIO hs_bindgen_d2538022eb73bf53
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strstr@
+foreign import ccall unsafe "hs_bindgen_b07cb6fe84d9cf1e"
+  hs_bindgen_b07cb6fe84d9cf1e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strstr@
+hs_bindgen_b07cb6fe84d9cf1e
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_b07cb6fe84d9cf1e =
+  BG.fromFFIType hs_bindgen_b07cb6fe84d9cf1e_base
+
+{-# NOINLINE sDL_strstr #-}
+
+-- | Search a string for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string.
+--
+--     Note that this looks for strings of /bytes/, not /characters/, so it\'s legal to search for malformed and incomplete UTF-8 sequences.
+--
+--     [@haystack@]: the string to search. Must not be NULL.
+--
+--     [@needle@]: the string to search for. Must not be NULL.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strstr@, defined at @SDL3\/SDL_stdinc.h 3303:36@
+sDL_strstr
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr BG.CChar))
+sDL_strstr =
+  BG.unsafePerformIO hs_bindgen_b07cb6fe84d9cf1e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strnstr@
+foreign import ccall unsafe "hs_bindgen_c3b37921fa630595"
+  hs_bindgen_c3b37921fa630595_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strnstr@
+hs_bindgen_c3b37921fa630595
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO (BG.Ptr BG.CChar)
+           )
+       )
+hs_bindgen_c3b37921fa630595 =
+  BG.fromFFIType hs_bindgen_c3b37921fa630595_base
+
+{-# NOINLINE sDL_strnstr #-}
+
+-- | Search a string, up to n bytes, for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string, or @maxlen@ bytes have been examined. It is possible to use this function on a string without a null terminator.
+--
+--     Note that this looks for strings of /bytes/, not /characters/, so it\'s legal to search for malformed and incomplete UTF-8 sequences.
+--
+--     [@haystack@]: the string to search. Must not be NULL.
+--
+--     [@needle@]: the string to search for. Must not be NULL.
+--
+--     [@maxlen@]: the maximum number of bytes to search in @haystack@.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strnstr@, defined at @SDL3\/SDL_stdinc.h 3326:36@
+sDL_strnstr
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO (BG.Ptr BG.CChar)
+       )
+sDL_strnstr =
+  BG.unsafePerformIO hs_bindgen_c3b37921fa630595
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strcasestr@
+foreign import ccall unsafe "hs_bindgen_3b1f9973e35be364"
+  hs_bindgen_3b1f9973e35be364_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strcasestr@
+hs_bindgen_3b1f9973e35be364
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_3b1f9973e35be364 =
+  BG.fromFFIType hs_bindgen_3b1f9973e35be364_base
+
+{-# NOINLINE sDL_strcasestr #-}
+
+-- | Search a UTF-8 string for the first instance of a specific substring, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [@haystack@]: the string to search. Must not be NULL.
+--
+--     [@needle@]: the string to search for. Must not be NULL.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strcasestr@, defined at @SDL3\/SDL_stdinc.h 3354:36@
+sDL_strcasestr
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr BG.CChar))
+sDL_strcasestr =
+  BG.unsafePerformIO hs_bindgen_3b1f9973e35be364
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtok_r@
+foreign import ccall unsafe "hs_bindgen_99a1a0af797e8aad"
+  hs_bindgen_99a1a0af797e8aad_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtok_r@
+hs_bindgen_99a1a0af797e8aad
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr BG.CChar -> PtrConst.PtrConst BG.CChar -> BG.Ptr (BG.Ptr BG.CChar) -> IO (BG.Ptr BG.CChar))
+       )
+hs_bindgen_99a1a0af797e8aad =
+  BG.fromFFIType hs_bindgen_99a1a0af797e8aad_base
+
+{-# NOINLINE sDL_strtok_r #-}
+
+-- | This works exactly like strtok_r() but doesn\'t require access to a C runtime.
+--
+--     Break a string up into a series of tokens.
+--
+--     To start tokenizing a new string, @str@ should be the non-NULL address of the string to start tokenizing. Future calls to get the next token from the same string should specify a NULL.
+--
+--     Note that this function will overwrite pieces of @str@ with null chars to split it into tokens. This function cannot be used with const\/read-only strings!
+--
+--     @saveptr@ just needs to point to a @char *@ that can be overwritten; SDL will use this to save tokenizing state between calls. It is initialized if @str@ is non-NULL, and used to resume tokenizing when @str@ is NULL.
+--
+--     [@str@]: the string to tokenize, or NULL to continue tokenizing.
+--
+--     [@delim@]: the delimiter string that separates tokens.
+--
+--     [@saveptr@]: pointer to a char *, used for ongoing state.
+--
+--     [Returns]: A pointer to the next token, or NULL if no tokens remain.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strtok_r@, defined at @SDL3\/SDL_stdinc.h 3383:36@
+sDL_strtok_r
+  :: BG.FunPtr
+       (BG.Ptr BG.CChar -> PtrConst.PtrConst BG.CChar -> BG.Ptr (BG.Ptr BG.CChar) -> IO (BG.Ptr BG.CChar))
+sDL_strtok_r =
+  BG.unsafePerformIO hs_bindgen_99a1a0af797e8aad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_utf8strlen@
+foreign import ccall unsafe "hs_bindgen_fdd33f5a5e9573d8"
+  hs_bindgen_fdd33f5a5e9573d8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_utf8strlen@
+hs_bindgen_fdd33f5a5e9573d8
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO HsBindgen.Runtime.LibC.CSize))
+hs_bindgen_fdd33f5a5e9573d8 =
+  BG.fromFFIType hs_bindgen_fdd33f5a5e9573d8_base
+
+{-# NOINLINE sDL_utf8strlen #-}
+
+-- | Count the number of codepoints in a UTF-8 string.
+--
+--     Counts the /codepoints/, not /bytes/, in @str@, excluding the null terminator.
+--
+--     If you need to count the bytes in a string instead, consider using @SDL_strlen()@.
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the count by several replacement characters.
+--
+--     [@str@]: The null-terminated UTF-8 string to read. Must not be NULL.
+--
+--     [Returns]: The length (in codepoints, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_utf8strnlen', 'sDL_strlen'
+--
+--     [C declaration]: @SDL_utf8strlen@, defined at @SDL3\/SDL_stdinc.h 3411:36@
+sDL_utf8strlen :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO HsBindgen.Runtime.LibC.CSize)
+sDL_utf8strlen =
+  BG.unsafePerformIO hs_bindgen_fdd33f5a5e9573d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_utf8strnlen@
+foreign import ccall unsafe "hs_bindgen_1e79ccdd40706b8d"
+  hs_bindgen_1e79ccdd40706b8d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_utf8strnlen@
+hs_bindgen_1e79ccdd40706b8d
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst BG.CChar -> HsBindgen.Runtime.LibC.CSize -> IO HsBindgen.Runtime.LibC.CSize)
+       )
+hs_bindgen_1e79ccdd40706b8d =
+  BG.fromFFIType hs_bindgen_1e79ccdd40706b8d_base
+
+{-# NOINLINE sDL_utf8strnlen #-}
+
+-- | Count the number of codepoints in a UTF-8 string, up to n bytes.
+--
+--     Counts the /codepoints/, not /bytes/, in @str@, excluding the null terminator.
+--
+--     If you need to count the bytes in a string instead, consider using @SDL_strnlen()@.
+--
+--     The counting stops at @bytes@ bytes (not codepoints!). This seems counterintuitive, but makes it easy to express the total size of the string\'s buffer.
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the count by several replacement characters.
+--
+--     [@str@]: The null-terminated UTF-8 string to read. Must not be NULL.
+--
+--     [@bytes@]: The maximum amount of bytes to count.
+--
+--     [Returns]: The length (in codepoints, excluding the null terminator) of @src@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_utf8strlen', 'sDL_strnlen'
+--
+--     [C declaration]: @SDL_utf8strnlen@, defined at @SDL3\/SDL_stdinc.h 3444:36@
+sDL_utf8strnlen
+  :: BG.FunPtr
+       (PtrConst.PtrConst BG.CChar -> HsBindgen.Runtime.LibC.CSize -> IO HsBindgen.Runtime.LibC.CSize)
+sDL_utf8strnlen =
+  BG.unsafePerformIO hs_bindgen_1e79ccdd40706b8d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_itoa@
+foreign import ccall unsafe "hs_bindgen_4cfc9a356cf1014c"
+  hs_bindgen_4cfc9a356cf1014c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_itoa@
+hs_bindgen_4cfc9a356cf1014c
+  :: IO (BG.FunPtr (BG.CInt -> BG.Ptr BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_4cfc9a356cf1014c =
+  BG.fromFFIType hs_bindgen_4cfc9a356cf1014c_base
+
+{-# NOINLINE sDL_itoa #-}
+
+-- | Convert an integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget possible negative signs, null terminator bytes, etc).
+--
+--     [@value@]: the integer to convert.
+--
+--     [@str@]: the buffer to write the string into.
+--
+--     [@radix@]: the radix to use for string generation.
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_uitoa', @SDL_ltoa@, 'sDL_lltoa'
+--
+--     [C declaration]: @SDL_itoa@, defined at @SDL3\/SDL_stdinc.h 3472:36@
+sDL_itoa :: BG.FunPtr (BG.CInt -> BG.Ptr BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar))
+sDL_itoa =
+  BG.unsafePerformIO hs_bindgen_4cfc9a356cf1014c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_uitoa@
+foreign import ccall unsafe "hs_bindgen_e052861370ec1ea4"
+  hs_bindgen_e052861370ec1ea4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_uitoa@
+hs_bindgen_e052861370ec1ea4
+  :: IO (BG.FunPtr (BG.CUInt -> BG.Ptr BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_e052861370ec1ea4 =
+  BG.fromFFIType hs_bindgen_e052861370ec1ea4_base
+
+{-# NOINLINE sDL_uitoa #-}
+
+-- | Convert an unsigned integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget null terminator bytes, etc).
+--
+--     [@value@]: the unsigned integer to convert.
+--
+--     [@str@]: the buffer to write the string into.
+--
+--     [@radix@]: the radix to use for string generation.
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_itoa', @SDL_ultoa@, 'sDL_ulltoa'
+--
+--     [C declaration]: @SDL_uitoa@, defined at @SDL3\/SDL_stdinc.h 3500:36@
+sDL_uitoa :: BG.FunPtr (BG.CUInt -> BG.Ptr BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar))
+sDL_uitoa =
+  BG.unsafePerformIO hs_bindgen_e052861370ec1ea4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_lltoa@
+foreign import ccall unsafe "hs_bindgen_9c5155b926feaa3f"
+  hs_bindgen_9c5155b926feaa3f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_lltoa@
+hs_bindgen_9c5155b926feaa3f
+  :: IO (BG.FunPtr (BG.CLLong -> BG.Ptr BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_9c5155b926feaa3f =
+  BG.fromFFIType hs_bindgen_9c5155b926feaa3f_base
+
+{-# NOINLINE sDL_lltoa #-}
+
+-- | Convert a long long integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget possible negative signs, null terminator bytes, etc).
+--
+--     [@value@]: the long long integer to convert.
+--
+--     [@str@]: the buffer to write the string into.
+--
+--     [@radix@]: the radix to use for string generation.
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ulltoa', 'sDL_itoa', @SDL_ltoa@
+--
+--     [C declaration]: @SDL_lltoa@, defined at @SDL3\/SDL_stdinc.h 3586:36@
+sDL_lltoa :: BG.FunPtr (BG.CLLong -> BG.Ptr BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar))
+sDL_lltoa =
+  BG.unsafePerformIO hs_bindgen_9c5155b926feaa3f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ulltoa@
+foreign import ccall unsafe "hs_bindgen_a3b3fdde6f9a0142"
+  hs_bindgen_a3b3fdde6f9a0142_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ulltoa@
+hs_bindgen_a3b3fdde6f9a0142
+  :: IO (BG.FunPtr (BG.CULLong -> BG.Ptr BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_a3b3fdde6f9a0142 =
+  BG.fromFFIType hs_bindgen_a3b3fdde6f9a0142_base
+
+{-# NOINLINE sDL_ulltoa #-}
+
+-- | Convert an unsigned long long integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget null terminator bytes, etc).
+--
+--     [@value@]: the unsigned long long integer to convert.
+--
+--     [@str@]: the buffer to write the string into.
+--
+--     [@radix@]: the radix to use for string generation.
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_lltoa', 'sDL_uitoa', @SDL_ultoa@
+--
+--     [C declaration]: @SDL_ulltoa@, defined at @SDL3\/SDL_stdinc.h 3614:36@
+sDL_ulltoa :: BG.FunPtr (BG.CULLong -> BG.Ptr BG.CChar -> BG.CInt -> IO (BG.Ptr BG.CChar))
+sDL_ulltoa =
+  BG.unsafePerformIO hs_bindgen_a3b3fdde6f9a0142
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atoi@
+foreign import ccall unsafe "hs_bindgen_9a3e9e2b67b916a2"
+  hs_bindgen_9a3e9e2b67b916a2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atoi@
+hs_bindgen_9a3e9e2b67b916a2 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CInt))
+hs_bindgen_9a3e9e2b67b916a2 =
+  BG.fromFFIType hs_bindgen_9a3e9e2b67b916a2_base
+
+{-# NOINLINE sDL_atoi #-}
+
+-- | Parse an @int@ from a string.
+--
+--     The result of calling @SDL_atoi(str)@ is equivalent to @(int)SDL_strtol(str, NULL, 10)@.
+--
+--     [@str@]: The null-terminated string to read. Must not be NULL.
+--
+--     [Returns]: the parsed @int@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atof', @SDL_strtol@, @SDL_strtoul@, 'sDL_strtoll', 'sDL_strtoull', 'sDL_strtod', 'sDL_itoa'
+--
+--     [C declaration]: @SDL_atoi@, defined at @SDL3\/SDL_stdinc.h 3638:33@
+sDL_atoi :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CInt)
+sDL_atoi =
+  BG.unsafePerformIO hs_bindgen_9a3e9e2b67b916a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atof@
+foreign import ccall unsafe "hs_bindgen_2804d8be78ed3cae"
+  hs_bindgen_2804d8be78ed3cae_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atof@
+hs_bindgen_2804d8be78ed3cae :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CDouble))
+hs_bindgen_2804d8be78ed3cae =
+  BG.fromFFIType hs_bindgen_2804d8be78ed3cae_base
+
+{-# NOINLINE sDL_atof #-}
+
+-- | Parse a @double@ from a string.
+--
+--     The result of calling @SDL_atof(str)@ is equivalent to @SDL_strtod(str, NULL)@.
+--
+--     [@str@]: The null-terminated string to read. Must not be NULL.
+--
+--     [Returns]: the parsed @double@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', @SDL_strtol@, @SDL_strtoul@, 'sDL_strtoll', 'sDL_strtoull', 'sDL_strtod'
+--
+--     [C declaration]: @SDL_atof@, defined at @SDL3\/SDL_stdinc.h 3660:36@
+sDL_atof :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CDouble)
+sDL_atof =
+  BG.unsafePerformIO hs_bindgen_2804d8be78ed3cae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtoll@
+foreign import ccall unsafe "hs_bindgen_6e1c8dc5ccea4653"
+  hs_bindgen_6e1c8dc5ccea4653_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtoll@
+hs_bindgen_6e1c8dc5ccea4653
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr (BG.Ptr BG.CChar) -> BG.CInt -> IO BG.CLLong))
+hs_bindgen_6e1c8dc5ccea4653 =
+  BG.fromFFIType hs_bindgen_6e1c8dc5ccea4653_base
+
+{-# NOINLINE sDL_strtoll #-}
+
+-- | Parse a @long long@ from a string.
+--
+--     If @str@ starts with whitespace, then those whitespace characters are skipped before attempting to parse the number.
+--
+--     If the parsed number does not fit inside a @long long@, the result is clamped to the minimum and maximum representable @long long@ values.
+--
+--     [@str@]: The null-terminated string to read. Must not be NULL.
+--
+--     [@endp@]: If not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+--
+--     [@base@]: The base of the integer to read. Supported values are 0 and 2 to 36 inclusive. If 0, the base will be inferred from the number\'s prefix (0x for hexadecimal, 0 for octal, decimal otherwise).
+--
+--     [Returns]: the parsed @long long@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', 'sDL_atof', @SDL_strtol@, @SDL_strtoul@, 'sDL_strtoull', 'sDL_strtod', 'sDL_lltoa'
+--
+--     [C declaration]: @SDL_strtoll@, defined at @SDL3\/SDL_stdinc.h 3762:39@
+sDL_strtoll
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr (BG.Ptr BG.CChar) -> BG.CInt -> IO BG.CLLong)
+sDL_strtoll =
+  BG.unsafePerformIO hs_bindgen_6e1c8dc5ccea4653
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtoull@
+foreign import ccall unsafe "hs_bindgen_f81f822f17549fa4"
+  hs_bindgen_f81f822f17549fa4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtoull@
+hs_bindgen_f81f822f17549fa4
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr (BG.Ptr BG.CChar) -> BG.CInt -> IO BG.CULLong))
+hs_bindgen_f81f822f17549fa4 =
+  BG.fromFFIType hs_bindgen_f81f822f17549fa4_base
+
+{-# NOINLINE sDL_strtoull #-}
+
+-- | Parse an @unsigned long long@ from a string.
+--
+--     If @str@ starts with whitespace, then those whitespace characters are skipped before attempting to parse the number.
+--
+--     If the parsed number does not fit inside an @unsigned long long@, the result is clamped to the maximum representable @unsigned long long@ value.
+--
+--     [@str@]: The null-terminated string to read. Must not be NULL.
+--
+--     [@endp@]: If not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+--
+--     [@base@]: The base of the integer to read. Supported values are 0 and 2 to 36 inclusive. If 0, the base will be inferred from the number\'s prefix (0x for hexadecimal, 0 for octal, decimal otherwise).
+--
+--     [Returns]: the parsed @unsigned long long@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', 'sDL_atof', @SDL_strtol@, 'sDL_strtoll', @SDL_strtoul@, 'sDL_strtod', 'sDL_ulltoa'
+--
+--     [C declaration]: @SDL_strtoull@, defined at @SDL3\/SDL_stdinc.h 3796:48@
+sDL_strtoull
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr (BG.Ptr BG.CChar) -> BG.CInt -> IO BG.CULLong)
+sDL_strtoull =
+  BG.unsafePerformIO hs_bindgen_f81f822f17549fa4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtod@
+foreign import ccall unsafe "hs_bindgen_6ab6327bbf86f171"
+  hs_bindgen_6ab6327bbf86f171_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strtod@
+hs_bindgen_6ab6327bbf86f171
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr (BG.Ptr BG.CChar) -> IO BG.CDouble))
+hs_bindgen_6ab6327bbf86f171 =
+  BG.fromFFIType hs_bindgen_6ab6327bbf86f171_base
+
+{-# NOINLINE sDL_strtod #-}
+
+-- | Parse a @double@ from a string.
+--
+--     This function makes fewer guarantees than the C runtime @strtod@:
+--
+--     * Only decimal notation is guaranteed to be supported. The handling of scientific and hexadecimal notation is unspecified.
+--
+--     * Whether or not INF and NAN can be parsed is unspecified.
+--
+--     * The precision of the result is unspecified.
+--
+--     [@str@]: the null-terminated string to read. Must not be NULL.
+--
+--     [@endp@]: if not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+--
+--     [Returns]: the parsed @double@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', 'sDL_atof', @SDL_strtol@, 'sDL_strtoll', @SDL_strtoul@, 'sDL_strtoull'
+--
+--     [C declaration]: @SDL_strtod@, defined at @SDL3\/SDL_stdinc.h 3826:36@
+sDL_strtod :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr (BG.Ptr BG.CChar) -> IO BG.CDouble)
+sDL_strtod =
+  BG.unsafePerformIO hs_bindgen_6ab6327bbf86f171
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strcmp@
+foreign import ccall unsafe "hs_bindgen_fc45ddd2c1f0219e"
+  hs_bindgen_fc45ddd2c1f0219e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strcmp@
+hs_bindgen_fc45ddd2c1f0219e
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CInt))
+hs_bindgen_fc45ddd2c1f0219e =
+  BG.fromFFIType hs_bindgen_fc45ddd2c1f0219e_base
+
+{-# NOINLINE sDL_strcmp #-}
+
+-- | Compare two null-terminated UTF-8 strings.
+--
+--     Due to the nature of UTF-8 encoding, this will work with Unicode strings, since effectively this function just compares bytes until it hits a null-terminating character. Also due to the nature of UTF-8, this can be used with @SDL_qsort()@ to put strings in (roughly) alphabetical order.
+--
+--     [@str1@]: the first string to compare. NULL is not permitted!
+--
+--     [@str2@]: the second string to compare. NULL is not permitted!
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strcmp@, defined at @SDL3\/SDL_stdinc.h 3846:33@
+sDL_strcmp :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CInt)
+sDL_strcmp =
+  BG.unsafePerformIO hs_bindgen_fc45ddd2c1f0219e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strncmp@
+foreign import ccall unsafe "hs_bindgen_18f45fe45a42c194"
+  hs_bindgen_18f45fe45a42c194_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strncmp@
+hs_bindgen_18f45fe45a42c194
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_18f45fe45a42c194 =
+  BG.fromFFIType hs_bindgen_18f45fe45a42c194_base
+
+{-# NOINLINE sDL_strncmp #-}
+
+-- | Compare two UTF-8 strings up to a number of bytes.
+--
+--     Due to the nature of UTF-8 encoding, this will work with Unicode strings, since effectively this function just compares bytes until it hits a null-terminating character. Also due to the nature of UTF-8, this can be used with @SDL_qsort()@ to put strings in (roughly) alphabetical order.
+--
+--     Note that while this function is intended to be used with UTF-8, it is doing a bytewise comparison, and @maxlen@ specifies a /byte/ limit! If the limit lands in the middle of a multi-byte UTF-8 sequence, it will only compare a portion of the final character.
+--
+--     @maxlen@ specifies a maximum number of bytes to compare; if the strings match to this number of bytes (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [@str1@]: the first string to compare. NULL is not permitted!
+--
+--     [@str2@]: the second string to compare. NULL is not permitted!
+--
+--     [@maxlen@]: the maximum number of /bytes/ to compare.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strncmp@, defined at @SDL3\/SDL_stdinc.h 3876:33@
+sDL_strncmp
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CInt
+       )
+sDL_strncmp =
+  BG.unsafePerformIO hs_bindgen_18f45fe45a42c194
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strcasecmp@
+foreign import ccall unsafe "hs_bindgen_2996562bf0a4585e"
+  hs_bindgen_2996562bf0a4585e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strcasecmp@
+hs_bindgen_2996562bf0a4585e
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CInt))
+hs_bindgen_2996562bf0a4585e =
+  BG.fromFFIType hs_bindgen_2996562bf0a4585e_base
+
+{-# NOINLINE sDL_strcasecmp #-}
+
+-- | Compare two null-terminated UTF-8 strings, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the string to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [@str1@]: the first string to compare. NULL is not permitted!
+--
+--     [@str2@]: the second string to compare. NULL is not permitted!
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strcasecmp@, defined at @SDL3\/SDL_stdinc.h 3904:33@
+sDL_strcasecmp :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CInt)
+sDL_strcasecmp =
+  BG.unsafePerformIO hs_bindgen_2996562bf0a4585e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strncasecmp@
+foreign import ccall unsafe "hs_bindgen_28d4c90d056ca0bb"
+  hs_bindgen_28d4c90d056ca0bb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strncasecmp@
+hs_bindgen_28d4c90d056ca0bb
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CInt
+           )
+       )
+hs_bindgen_28d4c90d056ca0bb =
+  BG.fromFFIType hs_bindgen_28d4c90d056ca0bb_base
+
+{-# NOINLINE sDL_strncasecmp #-}
+
+-- | Compare two UTF-8 strings, case-insensitively, up to a number of bytes.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the string to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     Note that while this function is intended to be used with UTF-8, @maxlen@ specifies a /byte/ limit! If the limit lands in the middle of a multi-byte UTF-8 sequence, it may convert a portion of the final character to one or more Unicode character U+FFFD (REPLACEMENT CHARACTER) so as not to overflow a buffer.
+--
+--     @maxlen@ specifies a maximum number of bytes to compare; if the strings match to this number of bytes (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [@str1@]: the first string to compare. NULL is not permitted!
+--
+--     [@str2@]: the second string to compare. NULL is not permitted!
+--
+--     [@maxlen@]: the maximum number of bytes to compare.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strncasecmp@, defined at @SDL3\/SDL_stdinc.h 3944:33@
+sDL_strncasecmp
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CInt
+       )
+sDL_strncasecmp =
+  BG.unsafePerformIO hs_bindgen_28d4c90d056ca0bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strpbrk@
+foreign import ccall unsafe "hs_bindgen_65f684850b2f315d"
+  hs_bindgen_65f684850b2f315d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_strpbrk@
+hs_bindgen_65f684850b2f315d
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_65f684850b2f315d =
+  BG.fromFFIType hs_bindgen_65f684850b2f315d_base
+
+{-# NOINLINE sDL_strpbrk #-}
+
+-- | Searches a string for the first occurrence of any character contained in a breakset, and returns a pointer from the string to that character.
+--
+--     [@str@]: The null-terminated string to be searched. Must not be NULL, and must not overlap with @breakset@.
+--
+--     [@breakset@]: A null-terminated string containing the list of characters to look for. Must not be NULL, and must not overlap with @str@.
+--
+--     [Returns]: A pointer to the location, in str, of the first occurrence of a character present in the breakset, or NULL if none is found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strpbrk@, defined at @SDL3\/SDL_stdinc.h 3962:36@
+sDL_strpbrk
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr BG.CChar))
+sDL_strpbrk =
+  BG.unsafePerformIO hs_bindgen_65f684850b2f315d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_StepUTF8@
+foreign import ccall unsafe "hs_bindgen_0907aee5a9e22b6c"
+  hs_bindgen_0907aee5a9e22b6c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_StepUTF8@
+hs_bindgen_0907aee5a9e22b6c
+  :: IO
+       (BG.FunPtr (BG.Ptr (PtrConst.PtrConst BG.CChar) -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> IO Uint32))
+hs_bindgen_0907aee5a9e22b6c =
+  BG.fromFFIType hs_bindgen_0907aee5a9e22b6c_base
+
+{-# NOINLINE sDL_StepUTF8 #-}
+
+-- | Decode a UTF-8 string, one Unicode codepoint at a time.
+--
+--     This will return the first Unicode codepoint in the UTF-8 encoded string in @*pstr@, and then advance @*pstr@ past any consumed bytes before returning.
+--
+--     It will not access more than @*pslen@ bytes from the string. @*pslen@ will be adjusted, as well, subtracting the number of bytes consumed.
+--
+--     @pslen@ is allowed to be NULL, in which case the string /must/ be NULL-terminated, as the function will blindly read until it sees the NULL char.
+--
+--     if @*pslen@ is zero, it assumes the end of string is reached and returns a zero codepoint regardless of the contents of the string buffer.
+--
+--     If the resulting codepoint is zero (a NULL terminator), or @*pslen@ is zero, it will not advance @*pstr@ or @*pslen@ at all.
+--
+--     Generally this function is called in a loop until it returns zero, adjusting its parameters each iteration.
+--
+--     If an invalid UTF-8 sequence is encountered, this function returns SDL_INVALID_UNICODE_CODEPOINT and advances the string\/length by one byte (which is to say, a multibyte sequence might produce several SDL_INVALID_UNICODE_CODEPOINT returns before it syncs to the next valid UTF-8 sequence).
+--
+--     Several things can generate invalid UTF-8 sequences, including overlong encodings, the use of UTF-16 surrogate values, and truncated data. Please refer to [RFC3629](https://www.ietf.org/rfc/rfc3629.txt) for details.
+--
+--     [@pstr@]: a pointer to a UTF-8 string pointer to be read and adjusted.
+--
+--     [@pslen@]: a pointer to the number of bytes in the string, to be read and adjusted. NULL is allowed.
+--
+--     [Returns]: the first Unicode codepoint in the string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_StepUTF8@, defined at @SDL3\/SDL_stdinc.h 4022:36@
+sDL_StepUTF8
+  :: BG.FunPtr (BG.Ptr (PtrConst.PtrConst BG.CChar) -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> IO Uint32)
+sDL_StepUTF8 =
+  BG.unsafePerformIO hs_bindgen_0907aee5a9e22b6c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_StepBackUTF8@
+foreign import ccall unsafe "hs_bindgen_ccaed4cafbb7e45b"
+  hs_bindgen_ccaed4cafbb7e45b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_StepBackUTF8@
+hs_bindgen_ccaed4cafbb7e45b
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr (PtrConst.PtrConst BG.CChar) -> IO Uint32))
+hs_bindgen_ccaed4cafbb7e45b =
+  BG.fromFFIType hs_bindgen_ccaed4cafbb7e45b_base
+
+{-# NOINLINE sDL_StepBackUTF8 #-}
+
+-- | Decode a UTF-8 string in reverse, one Unicode codepoint at a time.
+--
+--     This will go to the start of the previous Unicode codepoint in the string, move @*pstr@ to that location and return that codepoint.
+--
+--     If @*pstr@ is already at the start of the string), it will not advance @*pstr@ at all.
+--
+--     Generally this function is called in a loop until it returns zero, adjusting its parameter each iteration.
+--
+--     If an invalid UTF-8 sequence is encountered, this function returns SDL_INVALID_UNICODE_CODEPOINT.
+--
+--     Several things can generate invalid UTF-8 sequences, including overlong encodings, the use of UTF-16 surrogate values, and truncated data. Please refer to [RFC3629](https://www.ietf.org/rfc/rfc3629.txt) for details.
+--
+--     [@start@]: a pointer to the beginning of the UTF-8 string.
+--
+--     [@pstr@]: a pointer to a UTF-8 string pointer to be read and adjusted.
+--
+--     [Returns]: the previous Unicode codepoint in the string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_StepBackUTF8@, defined at @SDL3\/SDL_stdinc.h 4053:36@
+sDL_StepBackUTF8
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> BG.Ptr (PtrConst.PtrConst BG.CChar) -> IO Uint32)
+sDL_StepBackUTF8 =
+  BG.unsafePerformIO hs_bindgen_ccaed4cafbb7e45b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_UCS4ToUTF8@
+foreign import ccall unsafe "hs_bindgen_d8d90fbed44bffa4"
+  hs_bindgen_d8d90fbed44bffa4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_UCS4ToUTF8@
+hs_bindgen_d8d90fbed44bffa4 :: IO (BG.FunPtr (Uint32 -> BG.Ptr BG.CChar -> IO (BG.Ptr BG.CChar)))
+hs_bindgen_d8d90fbed44bffa4 =
+  BG.fromFFIType hs_bindgen_d8d90fbed44bffa4_base
+
+{-# NOINLINE sDL_UCS4ToUTF8 #-}
+
+-- | Convert a single Unicode codepoint to UTF-8.
+--
+--     The buffer pointed to by @dst@ must be at least 4 bytes long, as this function may generate between 1 and 4 bytes of output.
+--
+--     This function returns the first byte /after/ the newly-written UTF-8 sequence, which is useful for encoding multiple codepoints in a loop, or knowing where to write a NULL-terminator character to end the string (in either case, plan to have a buffer of /more/ than 4 bytes!).
+--
+--     If @codepoint@ is an invalid value (outside the Unicode range, or a UTF-16 surrogate value, etc), this will use U+FFFD (REPLACEMENT CHARACTER) for the codepoint instead, and not set an error.
+--
+--     If @dst@ is NULL, this returns NULL immediately without writing to the pointer and without setting an error.
+--
+--     [@codepoint@]: a Unicode codepoint to convert to UTF-8.
+--
+--     [@dst@]: the location to write the encoded UTF-8. Must point to at least 4 bytes!
+--
+--     [Returns]: the first byte past the newly-written UTF-8 sequence.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UCS4ToUTF8@, defined at @SDL3\/SDL_stdinc.h 4082:36@
+sDL_UCS4ToUTF8 :: BG.FunPtr (Uint32 -> BG.Ptr BG.CChar -> IO (BG.Ptr BG.CChar))
+sDL_UCS4ToUTF8 =
+  BG.unsafePerformIO hs_bindgen_d8d90fbed44bffa4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_srand@
+foreign import ccall unsafe "hs_bindgen_da73119d08a07679"
+  hs_bindgen_da73119d08a07679_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_srand@
+hs_bindgen_da73119d08a07679 :: IO (BG.FunPtr (Uint64 -> IO ()))
+hs_bindgen_da73119d08a07679 =
+  BG.fromFFIType hs_bindgen_da73119d08a07679_base
+
+{-# NOINLINE sDL_srand #-}
+
+-- | Seeds the pseudo-random number generator.
+--
+--     Reusing the seed number will cause @SDL_rand()@ to repeat the same stream of \'random\' numbers.
+--
+--     [@seed@]: the value to use as a random number seed, or 0 to use SDL_GetPerformanceCounter().
+--
+--     [Thread safety]: This should be called on the same thread that calls @SDL_rand()@
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand', 'sDL_rand_bits', 'sDL_randf'
+--
+--     [C declaration]: @SDL_srand@, defined at @SDL3\/SDL_stdinc.h 4294:34@
+sDL_srand :: BG.FunPtr (Uint64 -> IO ())
+sDL_srand =
+  BG.unsafePerformIO hs_bindgen_da73119d08a07679
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand@
+foreign import ccall unsafe "hs_bindgen_4e5afaafc53503d2"
+  hs_bindgen_4e5afaafc53503d2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand@
+hs_bindgen_4e5afaafc53503d2 :: IO (BG.FunPtr (Sint32 -> IO Sint32))
+hs_bindgen_4e5afaafc53503d2 =
+  BG.fromFFIType hs_bindgen_4e5afaafc53503d2_base
+
+{-# NOINLINE sDL_rand #-}
+
+-- | Generate a pseudo-random number less than n for positive n
+--
+--     The method used is faster and of better quality than @rand() % n@. Odds are roughly 99.9% even for n = 1 million. Evenness is better for smaller n, and much worse as n gets bigger.
+--
+--     Example: to simulate a d6 use @SDL_rand(6) + 1@ The +1 converts 0..5 to 1..6
+--
+--     If you want to generate a pseudo-random number in the full range of 'Sint32', you should use: ('Sint32') @SDL_rand_bits()@
+--
+--     If you want reproducible output, be sure to initialize with @SDL_srand()@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [@n@]: the number of possible outcomes. n must be positive.
+--
+--     [Returns]: a random value in the range of [0 .. n-1].
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_srand', 'sDL_randf'
+--
+--     [C declaration]: @SDL_rand@, defined at @SDL3\/SDL_stdinc.h 4328:36@
+sDL_rand :: BG.FunPtr (Sint32 -> IO Sint32)
+sDL_rand =
+  BG.unsafePerformIO hs_bindgen_4e5afaafc53503d2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_randf@
+foreign import ccall unsafe "hs_bindgen_e6a11f5c2731e306"
+  hs_bindgen_e6a11f5c2731e306_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_randf@
+hs_bindgen_e6a11f5c2731e306 :: IO (BG.FunPtr (IO BG.CFloat))
+hs_bindgen_e6a11f5c2731e306 =
+  BG.fromFFIType hs_bindgen_e6a11f5c2731e306_base
+
+{-# NOINLINE sDL_randf #-}
+
+-- | Generate a uniform pseudo-random floating point number less than 1.0
+--
+--     If you want reproducible output, be sure to initialize with @SDL_srand()@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0.0, 1.0).
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_srand', 'sDL_rand'
+--
+--     [C declaration]: @SDL_randf@, defined at @SDL3\/SDL_stdinc.h 4351:35@
+sDL_randf :: BG.FunPtr (IO BG.CFloat)
+sDL_randf =
+  BG.unsafePerformIO hs_bindgen_e6a11f5c2731e306
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand_bits@
+foreign import ccall unsafe "hs_bindgen_1b4a072c67be4b47"
+  hs_bindgen_1b4a072c67be4b47_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand_bits@
+hs_bindgen_1b4a072c67be4b47 :: IO (BG.FunPtr (IO Uint32))
+hs_bindgen_1b4a072c67be4b47 =
+  BG.fromFFIType hs_bindgen_1b4a072c67be4b47_base
+
+{-# NOINLINE sDL_rand_bits #-}
+
+-- | Generate 32 pseudo-random bits.
+--
+--     You likely want to use @SDL_rand()@ to get a psuedo-random number instead.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0-SDL_MAX_UINT32].
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand', 'sDL_randf', 'sDL_srand'
+--
+--     [C declaration]: @SDL_rand_bits@, defined at @SDL3\/SDL_stdinc.h 4374:36@
+sDL_rand_bits :: BG.FunPtr (IO Uint32)
+sDL_rand_bits =
+  BG.unsafePerformIO hs_bindgen_1b4a072c67be4b47
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand_r@
+foreign import ccall unsafe "hs_bindgen_b7805b04f67ee663"
+  hs_bindgen_b7805b04f67ee663_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand_r@
+hs_bindgen_b7805b04f67ee663 :: IO (BG.FunPtr (BG.Ptr Uint64 -> Sint32 -> IO Sint32))
+hs_bindgen_b7805b04f67ee663 =
+  BG.fromFFIType hs_bindgen_b7805b04f67ee663_base
+
+{-# NOINLINE sDL_rand_r #-}
+
+-- | Generate a pseudo-random number less than n for positive n
+--
+--     The method used is faster and of better quality than @rand() % n@. Odds are roughly 99.9% even for n = 1 million. Evenness is better for smaller n, and much worse as n gets bigger.
+--
+--     Example: to simulate a d6 use @SDL_rand_r(state, 6) + 1@ The +1 converts 0..5 to 1..6
+--
+--     If you want to generate a pseudo-random number in the full range of 'Sint32', you should use: ('Sint32')SDL_rand_bits_r(state)
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [@state@]: a pointer to the current random number state, this may not be NULL.
+--
+--     [@n@]: the number of possible outcomes. n must be positive.
+--
+--     [Returns]: a random value in the range of [0 .. n-1].
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand', 'sDL_rand_bits_r', 'sDL_randf_r'
+--
+--     [C declaration]: @SDL_rand_r@, defined at @SDL3\/SDL_stdinc.h 4409:36@
+sDL_rand_r :: BG.FunPtr (BG.Ptr Uint64 -> Sint32 -> IO Sint32)
+sDL_rand_r =
+  BG.unsafePerformIO hs_bindgen_b7805b04f67ee663
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_randf_r@
+foreign import ccall unsafe "hs_bindgen_2868c0dca829c12d"
+  hs_bindgen_2868c0dca829c12d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_randf_r@
+hs_bindgen_2868c0dca829c12d :: IO (BG.FunPtr (BG.Ptr Uint64 -> IO BG.CFloat))
+hs_bindgen_2868c0dca829c12d =
+  BG.fromFFIType hs_bindgen_2868c0dca829c12d_base
+
+{-# NOINLINE sDL_randf_r #-}
+
+-- | Generate a uniform pseudo-random floating point number less than 1.0
+--
+--     If you want reproducible output, be sure to initialize with @SDL_srand()@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [@state@]: a pointer to the current random number state, this may not be NULL.
+--
+--     [Returns]: a random value in the range of [0.0, 1.0).
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand_bits_r', 'sDL_rand_r', 'sDL_randf'
+--
+--     [C declaration]: @SDL_randf_r@, defined at @SDL3\/SDL_stdinc.h 4436:35@
+sDL_randf_r :: BG.FunPtr (BG.Ptr Uint64 -> IO BG.CFloat)
+sDL_randf_r =
+  BG.unsafePerformIO hs_bindgen_2868c0dca829c12d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand_bits_r@
+foreign import ccall unsafe "hs_bindgen_4f041e8bf307388e"
+  hs_bindgen_4f041e8bf307388e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_rand_bits_r@
+hs_bindgen_4f041e8bf307388e :: IO (BG.FunPtr (BG.Ptr Uint64 -> IO Uint32))
+hs_bindgen_4f041e8bf307388e =
+  BG.fromFFIType hs_bindgen_4f041e8bf307388e_base
+
+{-# NOINLINE sDL_rand_bits_r #-}
+
+-- | Generate 32 pseudo-random bits.
+--
+--     You likely want to use @SDL_rand_r()@ to get a psuedo-random number instead.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [@state@]: a pointer to the current random number state, this may not be NULL.
+--
+--     [Returns]: a random value in the range of [0-SDL_MAX_UINT32].
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand_r', 'sDL_randf_r'
+--
+--     [C declaration]: @SDL_rand_bits_r@, defined at @SDL3\/SDL_stdinc.h 4461:36@
+sDL_rand_bits_r :: BG.FunPtr (BG.Ptr Uint64 -> IO Uint32)
+sDL_rand_bits_r =
+  BG.unsafePerformIO hs_bindgen_4f041e8bf307388e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_acos@
+foreign import ccall unsafe "hs_bindgen_fc7fee2483850ab3"
+  hs_bindgen_fc7fee2483850ab3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_acos@
+hs_bindgen_fc7fee2483850ab3 :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_fc7fee2483850ab3 =
+  BG.fromFFIType hs_bindgen_fc7fee2483850ab3_base
+
+{-# NOINLINE sDL_acos #-}
+
+-- | Compute the arc cosine of @x@.
+--
+--     The definition of @y = acos(x)@ is @x = cos(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @0 \<= y \<= Pi@
+--
+--     This function operates on double-precision floating point values, use SDL_acosf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: arc cosine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_acosf', 'sDL_asin', 'sDL_cos'
+--
+--     [C declaration]: @SDL_acos@, defined at @SDL3\/SDL_stdinc.h 4515:36@
+sDL_acos :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_acos =
+  BG.unsafePerformIO hs_bindgen_fc7fee2483850ab3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_acosf@
+foreign import ccall unsafe "hs_bindgen_521ecf135cd97997"
+  hs_bindgen_521ecf135cd97997_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_acosf@
+hs_bindgen_521ecf135cd97997 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_521ecf135cd97997 =
+  BG.fromFFIType hs_bindgen_521ecf135cd97997_base
+
+{-# NOINLINE sDL_acosf #-}
+
+-- | Compute the arc cosine of @x@.
+--
+--     The definition of @y = acos(x)@ is @x = cos(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @0 \<= y \<= Pi@
+--
+--     This function operates on single-precision floating point values, use SDL_acos for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: arc cosine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_acos', 'sDL_asinf', 'sDL_cosf'
+--
+--     [C declaration]: @SDL_acosf@, defined at @SDL3\/SDL_stdinc.h 4545:35@
+sDL_acosf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_acosf =
+  BG.unsafePerformIO hs_bindgen_521ecf135cd97997
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_asin@
+foreign import ccall unsafe "hs_bindgen_0446975347dc0e74"
+  hs_bindgen_0446975347dc0e74_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_asin@
+hs_bindgen_0446975347dc0e74 :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_0446975347dc0e74 =
+  BG.fromFFIType hs_bindgen_0446975347dc0e74_base
+
+{-# NOINLINE sDL_asin #-}
+
+-- | Compute the arc sine of @x@.
+--
+--     The definition of @y = asin(x)@ is @x = sin(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on double-precision floating point values, use SDL_asinf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: arc sine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_asinf', 'sDL_acos', 'sDL_sin'
+--
+--     [C declaration]: @SDL_asin@, defined at @SDL3\/SDL_stdinc.h 4575:36@
+sDL_asin :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_asin =
+  BG.unsafePerformIO hs_bindgen_0446975347dc0e74
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_asinf@
+foreign import ccall unsafe "hs_bindgen_6069a6cbf645d9a4"
+  hs_bindgen_6069a6cbf645d9a4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_asinf@
+hs_bindgen_6069a6cbf645d9a4 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_6069a6cbf645d9a4 =
+  BG.fromFFIType hs_bindgen_6069a6cbf645d9a4_base
+
+{-# NOINLINE sDL_asinf #-}
+
+-- | Compute the arc sine of @x@.
+--
+--     The definition of @y = asin(x)@ is @x = sin(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on single-precision floating point values, use SDL_asin for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: arc sine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_asin', 'sDL_acosf', 'sDL_sinf'
+--
+--     [C declaration]: @SDL_asinf@, defined at @SDL3\/SDL_stdinc.h 4605:35@
+sDL_asinf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_asinf =
+  BG.unsafePerformIO hs_bindgen_6069a6cbf645d9a4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atan@
+foreign import ccall unsafe "hs_bindgen_eb9c094d5b8cc44a"
+  hs_bindgen_eb9c094d5b8cc44a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atan@
+hs_bindgen_eb9c094d5b8cc44a :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_eb9c094d5b8cc44a =
+  BG.fromFFIType hs_bindgen_eb9c094d5b8cc44a_base
+
+{-# NOINLINE sDL_atan #-}
+
+-- | Compute the arc tangent of @x@.
+--
+--     The definition of @y = atan(x)@ is @x = tan(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on double-precision floating point values, use SDL_atanf for single-precision floats.
+--
+--     To calculate the arc tangent of y \/ x, use SDL_atan2.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: arc tangent of of @x@ in radians, or 0 if @x = 0@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atanf', 'sDL_atan2', 'sDL_tan'
+--
+--     [C declaration]: @SDL_atan@, defined at @SDL3\/SDL_stdinc.h 4637:36@
+sDL_atan :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_atan =
+  BG.unsafePerformIO hs_bindgen_eb9c094d5b8cc44a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atanf@
+foreign import ccall unsafe "hs_bindgen_9807f179a4fbb908"
+  hs_bindgen_9807f179a4fbb908_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atanf@
+hs_bindgen_9807f179a4fbb908 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_9807f179a4fbb908 =
+  BG.fromFFIType hs_bindgen_9807f179a4fbb908_base
+
+{-# NOINLINE sDL_atanf #-}
+
+-- | Compute the arc tangent of @x@.
+--
+--     The definition of @y = atan(x)@ is @x = tan(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on single-precision floating point values, use SDL_atan for dboule-precision floats.
+--
+--     To calculate the arc tangent of y \/ x, use SDL_atan2f.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: arc tangent of of @x@ in radians, or 0 if @x = 0@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atan', 'sDL_atan2f', 'sDL_tanf'
+--
+--     [C declaration]: @SDL_atanf@, defined at @SDL3\/SDL_stdinc.h 4669:35@
+sDL_atanf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_atanf =
+  BG.unsafePerformIO hs_bindgen_9807f179a4fbb908
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atan2@
+foreign import ccall unsafe "hs_bindgen_c868e29b9251ada8"
+  hs_bindgen_c868e29b9251ada8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atan2@
+hs_bindgen_c868e29b9251ada8 :: IO (BG.FunPtr (BG.CDouble -> BG.CDouble -> IO BG.CDouble))
+hs_bindgen_c868e29b9251ada8 =
+  BG.fromFFIType hs_bindgen_c868e29b9251ada8_base
+
+{-# NOINLINE sDL_atan2 #-}
+
+-- | Compute the arc tangent of @y \/ x@, using the signs of x and y to adjust the result\'s quadrant.
+--
+--     The definition of @z = atan2(x, y)@ is @y = x tan(z)@, where the quadrant of z is determined based on the signs of x and y.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-Pi \<= y \<= Pi@
+--
+--     This function operates on double-precision floating point values, use SDL_atan2f for single-precision floats.
+--
+--     To calculate the arc tangent of a single value, use SDL_atan.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@y@]: floating point value of the numerator (y coordinate).
+--
+--     [@x@]: floating point value of the denominator (x coordinate).
+--
+--     [Returns]: arc tangent of of @y \/ x@ in radians, or, if @x = 0@, either @-Pi\/2@, @0@, or @Pi\/2@, depending on the value of @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atan2f', 'sDL_atan', 'sDL_tan'
+--
+--     [C declaration]: @SDL_atan2@, defined at @SDL3\/SDL_stdinc.h 4705:36@
+sDL_atan2 :: BG.FunPtr (BG.CDouble -> BG.CDouble -> IO BG.CDouble)
+sDL_atan2 =
+  BG.unsafePerformIO hs_bindgen_c868e29b9251ada8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atan2f@
+foreign import ccall unsafe "hs_bindgen_357a95d359b4aaad"
+  hs_bindgen_357a95d359b4aaad_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_atan2f@
+hs_bindgen_357a95d359b4aaad :: IO (BG.FunPtr (BG.CFloat -> BG.CFloat -> IO BG.CFloat))
+hs_bindgen_357a95d359b4aaad =
+  BG.fromFFIType hs_bindgen_357a95d359b4aaad_base
+
+{-# NOINLINE sDL_atan2f #-}
+
+-- | Compute the arc tangent of @y \/ x@, using the signs of x and y to adjust the result\'s quadrant.
+--
+--     The definition of @z = atan2(x, y)@ is @y = x tan(z)@, where the quadrant of z is determined based on the signs of x and y.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-Pi \<= y \<= Pi@
+--
+--     This function operates on single-precision floating point values, use SDL_atan2 for double-precision floats.
+--
+--     To calculate the arc tangent of a single value, use SDL_atanf.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@y@]: floating point value of the numerator (y coordinate).
+--
+--     [@x@]: floating point value of the denominator (x coordinate).
+--
+--     [Returns]: arc tangent of of @y \/ x@ in radians, or, if @x = 0@, either @-Pi\/2@, @0@, or @Pi\/2@, depending on the value of @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atan2', 'sDL_atan', 'sDL_tan'
+--
+--     [C declaration]: @SDL_atan2f@, defined at @SDL3\/SDL_stdinc.h 4741:35@
+sDL_atan2f :: BG.FunPtr (BG.CFloat -> BG.CFloat -> IO BG.CFloat)
+sDL_atan2f =
+  BG.unsafePerformIO hs_bindgen_357a95d359b4aaad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ceil@
+foreign import ccall unsafe "hs_bindgen_51763cbf0b798de3"
+  hs_bindgen_51763cbf0b798de3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ceil@
+hs_bindgen_51763cbf0b798de3 :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_51763cbf0b798de3 =
+  BG.fromFFIType hs_bindgen_51763cbf0b798de3_base
+
+{-# NOINLINE sDL_ceil #-}
+
+-- | Compute the ceiling of @x@.
+--
+--     The ceiling of @x@ is the smallest integer @y@ such that @y >= x@, i.e @x@ rounded up to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_ceilf for single-precision floats.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: the ceiling of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ceilf', 'sDL_floor', 'sDL_trunc', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_ceil@, defined at @SDL3\/SDL_stdinc.h 4769:36@
+sDL_ceil :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_ceil =
+  BG.unsafePerformIO hs_bindgen_51763cbf0b798de3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ceilf@
+foreign import ccall unsafe "hs_bindgen_362325253c9b19f8"
+  hs_bindgen_362325253c9b19f8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_ceilf@
+hs_bindgen_362325253c9b19f8 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_362325253c9b19f8 =
+  BG.fromFFIType hs_bindgen_362325253c9b19f8_base
+
+{-# NOINLINE sDL_ceilf #-}
+
+-- | Compute the ceiling of @x@.
+--
+--     The ceiling of @x@ is the smallest integer @y@ such that @y >= x@, i.e @x@ rounded up to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_ceil for double-precision floats.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: the ceiling of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ceil', 'sDL_floorf', 'sDL_truncf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_ceilf@, defined at @SDL3\/SDL_stdinc.h 4797:35@
+sDL_ceilf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_ceilf =
+  BG.unsafePerformIO hs_bindgen_362325253c9b19f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_copysign@
+foreign import ccall unsafe "hs_bindgen_df3beaabf480a0d3"
+  hs_bindgen_df3beaabf480a0d3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_copysign@
+hs_bindgen_df3beaabf480a0d3 :: IO (BG.FunPtr (BG.CDouble -> BG.CDouble -> IO BG.CDouble))
+hs_bindgen_df3beaabf480a0d3 =
+  BG.fromFFIType hs_bindgen_df3beaabf480a0d3_base
+
+{-# NOINLINE sDL_copysign #-}
+
+-- | Copy the sign of one floating-point value to another.
+--
+--     The definition of copysign is that @copysign(x, y) = abs(x) * sign(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= f@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_copysignf for single-precision floats.
+--
+--     [@x@]: floating point value to use as the magnitude.
+--
+--     [@y@]: floating point value to use as the sign.
+--
+--     [Returns]: the floating point value with the sign of y and the magnitude of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_copysignf', 'sDL_fabs'
+--
+--     [C declaration]: @SDL_copysign@, defined at @SDL3\/SDL_stdinc.h 4823:36@
+sDL_copysign :: BG.FunPtr (BG.CDouble -> BG.CDouble -> IO BG.CDouble)
+sDL_copysign =
+  BG.unsafePerformIO hs_bindgen_df3beaabf480a0d3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_copysignf@
+foreign import ccall unsafe "hs_bindgen_e6af77974ed5435f"
+  hs_bindgen_e6af77974ed5435f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_copysignf@
+hs_bindgen_e6af77974ed5435f :: IO (BG.FunPtr (BG.CFloat -> BG.CFloat -> IO BG.CFloat))
+hs_bindgen_e6af77974ed5435f =
+  BG.fromFFIType hs_bindgen_e6af77974ed5435f_base
+
+{-# NOINLINE sDL_copysignf #-}
+
+-- | Copy the sign of one floating-point value to another.
+--
+--     The definition of copysign is that @copysign(x, y) = abs(x) * sign(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= f@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_copysign for double-precision floats.
+--
+--     [@x@]: floating point value to use as the magnitude.
+--
+--     [@y@]: floating point value to use as the sign.
+--
+--     [Returns]: the floating point value with the sign of y and the magnitude of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_copysign', 'sDL_fabsf'
+--
+--     [C declaration]: @SDL_copysignf@, defined at @SDL3\/SDL_stdinc.h 4849:35@
+sDL_copysignf :: BG.FunPtr (BG.CFloat -> BG.CFloat -> IO BG.CFloat)
+sDL_copysignf =
+  BG.unsafePerformIO hs_bindgen_e6af77974ed5435f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_cos@
+foreign import ccall unsafe "hs_bindgen_3d9b0e8a53288293"
+  hs_bindgen_3d9b0e8a53288293_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_cos@
+hs_bindgen_3d9b0e8a53288293 :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_3d9b0e8a53288293 =
+  BG.fromFFIType hs_bindgen_3d9b0e8a53288293_base
+
+{-# NOINLINE sDL_cos #-}
+
+-- | Compute the cosine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on double-precision floating point values, use SDL_cosf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value, in radians.
+--
+--     [Returns]: cosine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_cosf', 'sDL_acos', 'sDL_sin'
+--
+--     [C declaration]: @SDL_cos@, defined at @SDL3\/SDL_stdinc.h 4877:36@
+sDL_cos :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_cos =
+  BG.unsafePerformIO hs_bindgen_3d9b0e8a53288293
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_cosf@
+foreign import ccall unsafe "hs_bindgen_8a6d19c21d08744f"
+  hs_bindgen_8a6d19c21d08744f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_cosf@
+hs_bindgen_8a6d19c21d08744f :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_8a6d19c21d08744f =
+  BG.fromFFIType hs_bindgen_8a6d19c21d08744f_base
+
+{-# NOINLINE sDL_cosf #-}
+
+-- | Compute the cosine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on single-precision floating point values, use SDL_cos for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value, in radians.
+--
+--     [Returns]: cosine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_cos', 'sDL_acosf', 'sDL_sinf'
+--
+--     [C declaration]: @SDL_cosf@, defined at @SDL3\/SDL_stdinc.h 4905:35@
+sDL_cosf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_cosf =
+  BG.unsafePerformIO hs_bindgen_8a6d19c21d08744f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_exp@
+foreign import ccall unsafe "hs_bindgen_32a0ab5c8aca638e"
+  hs_bindgen_32a0ab5c8aca638e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_exp@
+hs_bindgen_32a0ab5c8aca638e :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_32a0ab5c8aca638e =
+  BG.fromFFIType hs_bindgen_32a0ab5c8aca638e_base
+
+{-# NOINLINE sDL_exp #-}
+
+-- | Compute the exponential of @x@.
+--
+--     The definition of @y = exp(x)@ is @y = e^x@, where @e@ is the base of the natural logarithm. The inverse is the natural logarithm, SDL_log.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     The output will overflow if @exp(x)@ is too large to be represented.
+--
+--     This function operates on double-precision floating point values, use SDL_expf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: value of @e^x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_expf', 'sDL_log'
+--
+--     [C declaration]: @SDL_exp@, defined at @SDL3\/SDL_stdinc.h 4937:36@
+sDL_exp :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_exp =
+  BG.unsafePerformIO hs_bindgen_32a0ab5c8aca638e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_expf@
+foreign import ccall unsafe "hs_bindgen_e734b446bd66b310"
+  hs_bindgen_e734b446bd66b310_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_expf@
+hs_bindgen_e734b446bd66b310 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_e734b446bd66b310 =
+  BG.fromFFIType hs_bindgen_e734b446bd66b310_base
+
+{-# NOINLINE sDL_expf #-}
+
+-- | Compute the exponential of @x@.
+--
+--     The definition of @y = exp(x)@ is @y = e^x@, where @e@ is the base of the natural logarithm. The inverse is the natural logarithm, SDL_logf.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     The output will overflow if @exp(x)@ is too large to be represented.
+--
+--     This function operates on single-precision floating point values, use SDL_exp for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: value of @e^x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_exp', 'sDL_logf'
+--
+--     [C declaration]: @SDL_expf@, defined at @SDL3\/SDL_stdinc.h 4969:35@
+sDL_expf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_expf =
+  BG.unsafePerformIO hs_bindgen_e734b446bd66b310
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fabs@
+foreign import ccall unsafe "hs_bindgen_0fe1f848b90d29bc"
+  hs_bindgen_0fe1f848b90d29bc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fabs@
+hs_bindgen_0fe1f848b90d29bc :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_0fe1f848b90d29bc =
+  BG.fromFFIType hs_bindgen_0fe1f848b90d29bc_base
+
+{-# NOINLINE sDL_fabs #-}
+
+-- | Compute the absolute value of @x@
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_fabsf for single-precision floats.
+--
+--     [@x@]: floating point value to use as the magnitude.
+--
+--     [Returns]: the absolute value of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fabsf'
+--
+--     [C declaration]: @SDL_fabs@, defined at @SDL3\/SDL_stdinc.h 4990:36@
+sDL_fabs :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_fabs =
+  BG.unsafePerformIO hs_bindgen_0fe1f848b90d29bc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fabsf@
+foreign import ccall unsafe "hs_bindgen_1e189b3e959f375b"
+  hs_bindgen_1e189b3e959f375b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fabsf@
+hs_bindgen_1e189b3e959f375b :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_1e189b3e959f375b =
+  BG.fromFFIType hs_bindgen_1e189b3e959f375b_base
+
+{-# NOINLINE sDL_fabsf #-}
+
+-- | Compute the absolute value of @x@
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_fabs for double-precision floats.
+--
+--     [@x@]: floating point value to use as the magnitude.
+--
+--     [Returns]: the absolute value of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fabs'
+--
+--     [C declaration]: @SDL_fabsf@, defined at @SDL3\/SDL_stdinc.h 5011:35@
+sDL_fabsf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_fabsf =
+  BG.unsafePerformIO hs_bindgen_1e189b3e959f375b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_floor@
+foreign import ccall unsafe "hs_bindgen_ae709679ac231e3a"
+  hs_bindgen_ae709679ac231e3a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_floor@
+hs_bindgen_ae709679ac231e3a :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_ae709679ac231e3a =
+  BG.fromFFIType hs_bindgen_ae709679ac231e3a_base
+
+{-# NOINLINE sDL_floor #-}
+
+-- | Compute the floor of @x@.
+--
+--     The floor of @x@ is the largest integer @y@ such that @y \<= x@, i.e @x@ rounded down to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_floorf for single-precision floats.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: the floor of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_floorf', 'sDL_ceil', 'sDL_trunc', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_floor@, defined at @SDL3\/SDL_stdinc.h 5039:36@
+sDL_floor :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_floor =
+  BG.unsafePerformIO hs_bindgen_ae709679ac231e3a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_floorf@
+foreign import ccall unsafe "hs_bindgen_6bcbc045e8590408"
+  hs_bindgen_6bcbc045e8590408_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_floorf@
+hs_bindgen_6bcbc045e8590408 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_6bcbc045e8590408 =
+  BG.fromFFIType hs_bindgen_6bcbc045e8590408_base
+
+{-# NOINLINE sDL_floorf #-}
+
+-- | Compute the floor of @x@.
+--
+--     The floor of @x@ is the largest integer @y@ such that @y \<= x@, i.e @x@ rounded down to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_floor for double-precision floats.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: the floor of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_floor', 'sDL_ceilf', 'sDL_truncf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_floorf@, defined at @SDL3\/SDL_stdinc.h 5067:35@
+sDL_floorf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_floorf =
+  BG.unsafePerformIO hs_bindgen_6bcbc045e8590408
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_trunc@
+foreign import ccall unsafe "hs_bindgen_9ff826562c85b6db"
+  hs_bindgen_9ff826562c85b6db_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_trunc@
+hs_bindgen_9ff826562c85b6db :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_9ff826562c85b6db =
+  BG.fromFFIType hs_bindgen_9ff826562c85b6db_base
+
+{-# NOINLINE sDL_trunc #-}
+
+-- | Truncate @x@ to an integer.
+--
+--     Rounds @x@ to the next closest integer to 0. This is equivalent to removing the fractional part of @x@, leaving only the integer part.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_truncf for single-precision floats.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: @x@ truncated to an integer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_truncf', 'sDL_fmod', 'sDL_ceil', 'sDL_floor', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_trunc@, defined at @SDL3\/SDL_stdinc.h 5096:36@
+sDL_trunc :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_trunc =
+  BG.unsafePerformIO hs_bindgen_9ff826562c85b6db
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_truncf@
+foreign import ccall unsafe "hs_bindgen_5afacbe63e710528"
+  hs_bindgen_5afacbe63e710528_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_truncf@
+hs_bindgen_5afacbe63e710528 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_5afacbe63e710528 =
+  BG.fromFFIType hs_bindgen_5afacbe63e710528_base
+
+{-# NOINLINE sDL_truncf #-}
+
+-- | Truncate @x@ to an integer.
+--
+--     Rounds @x@ to the next closest integer to 0. This is equivalent to removing the fractional part of @x@, leaving only the integer part.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_trunc for double-precision floats.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: @x@ truncated to an integer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_trunc', 'sDL_fmodf', 'sDL_ceilf', 'sDL_floorf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_truncf@, defined at @SDL3\/SDL_stdinc.h 5125:35@
+sDL_truncf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_truncf =
+  BG.unsafePerformIO hs_bindgen_5afacbe63e710528
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fmod@
+foreign import ccall unsafe "hs_bindgen_3a93d2030ffd9ef3"
+  hs_bindgen_3a93d2030ffd9ef3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fmod@
+hs_bindgen_3a93d2030ffd9ef3 :: IO (BG.FunPtr (BG.CDouble -> BG.CDouble -> IO BG.CDouble))
+hs_bindgen_3a93d2030ffd9ef3 =
+  BG.fromFFIType hs_bindgen_3a93d2030ffd9ef3_base
+
+{-# NOINLINE sDL_fmod #-}
+
+-- | Return the floating-point remainder of @x \/ y@
+--
+--     Divides @x@ by @y@, and returns the remainder.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@, @y != 0@
+--
+--     Range: @-y \<= z \<= y@
+--
+--     This function operates on double-precision floating point values, use SDL_fmodf for single-precision floats.
+--
+--     [@x@]: the numerator.
+--
+--     [@y@]: the denominator. Must not be 0.
+--
+--     [Returns]: the remainder of @x \/ y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fmodf', 'sDL_modf', 'sDL_trunc', 'sDL_ceil', 'sDL_floor', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_fmod@, defined at @SDL3\/SDL_stdinc.h 5155:36@
+sDL_fmod :: BG.FunPtr (BG.CDouble -> BG.CDouble -> IO BG.CDouble)
+sDL_fmod =
+  BG.unsafePerformIO hs_bindgen_3a93d2030ffd9ef3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fmodf@
+foreign import ccall unsafe "hs_bindgen_a851844ef04e542d"
+  hs_bindgen_a851844ef04e542d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_fmodf@
+hs_bindgen_a851844ef04e542d :: IO (BG.FunPtr (BG.CFloat -> BG.CFloat -> IO BG.CFloat))
+hs_bindgen_a851844ef04e542d =
+  BG.fromFFIType hs_bindgen_a851844ef04e542d_base
+
+{-# NOINLINE sDL_fmodf #-}
+
+-- | Return the floating-point remainder of @x \/ y@
+--
+--     Divides @x@ by @y@, and returns the remainder.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@, @y != 0@
+--
+--     Range: @-y \<= z \<= y@
+--
+--     This function operates on single-precision floating point values, use SDL_fmod for double-precision floats.
+--
+--     [@x@]: the numerator.
+--
+--     [@y@]: the denominator. Must not be 0.
+--
+--     [Returns]: the remainder of @x \/ y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fmod', 'sDL_truncf', 'sDL_modff', 'sDL_ceilf', 'sDL_floorf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_fmodf@, defined at @SDL3\/SDL_stdinc.h 5185:35@
+sDL_fmodf :: BG.FunPtr (BG.CFloat -> BG.CFloat -> IO BG.CFloat)
+sDL_fmodf =
+  BG.unsafePerformIO hs_bindgen_a851844ef04e542d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isinf@
+foreign import ccall unsafe "hs_bindgen_d9346ba385534fdd"
+  hs_bindgen_d9346ba385534fdd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isinf@
+hs_bindgen_d9346ba385534fdd :: IO (BG.FunPtr (BG.CDouble -> IO BG.CInt))
+hs_bindgen_d9346ba385534fdd =
+  BG.fromFFIType hs_bindgen_d9346ba385534fdd_base
+
+{-# NOINLINE sDL_isinf #-}
+
+-- | Return whether the value is infinity.
+--
+--     [@x@]: double-precision floating point value.
+--
+--     [Returns]: non-zero if the value is infinity, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isinff'
+--
+--     [C declaration]: @SDL_isinf@, defined at @SDL3\/SDL_stdinc.h 5199:33@
+sDL_isinf :: BG.FunPtr (BG.CDouble -> IO BG.CInt)
+sDL_isinf =
+  BG.unsafePerformIO hs_bindgen_d9346ba385534fdd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isinff@
+foreign import ccall unsafe "hs_bindgen_bfaf6777c1c350c3"
+  hs_bindgen_bfaf6777c1c350c3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isinff@
+hs_bindgen_bfaf6777c1c350c3 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CInt))
+hs_bindgen_bfaf6777c1c350c3 =
+  BG.fromFFIType hs_bindgen_bfaf6777c1c350c3_base
+
+{-# NOINLINE sDL_isinff #-}
+
+-- | Return whether the value is infinity.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: non-zero if the value is infinity, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isinf'
+--
+--     [C declaration]: @SDL_isinff@, defined at @SDL3\/SDL_stdinc.h 5213:33@
+sDL_isinff :: BG.FunPtr (BG.CFloat -> IO BG.CInt)
+sDL_isinff =
+  BG.unsafePerformIO hs_bindgen_bfaf6777c1c350c3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isnan@
+foreign import ccall unsafe "hs_bindgen_006f33027be22f99"
+  hs_bindgen_006f33027be22f99_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isnan@
+hs_bindgen_006f33027be22f99 :: IO (BG.FunPtr (BG.CDouble -> IO BG.CInt))
+hs_bindgen_006f33027be22f99 =
+  BG.fromFFIType hs_bindgen_006f33027be22f99_base
+
+{-# NOINLINE sDL_isnan #-}
+
+-- | Return whether the value is NaN.
+--
+--     [@x@]: double-precision floating point value.
+--
+--     [Returns]: non-zero if the value is NaN, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isnanf'
+--
+--     [C declaration]: @SDL_isnan@, defined at @SDL3\/SDL_stdinc.h 5227:33@
+sDL_isnan :: BG.FunPtr (BG.CDouble -> IO BG.CInt)
+sDL_isnan =
+  BG.unsafePerformIO hs_bindgen_006f33027be22f99
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isnanf@
+foreign import ccall unsafe "hs_bindgen_308e1efef7090245"
+  hs_bindgen_308e1efef7090245_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_isnanf@
+hs_bindgen_308e1efef7090245 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CInt))
+hs_bindgen_308e1efef7090245 =
+  BG.fromFFIType hs_bindgen_308e1efef7090245_base
+
+{-# NOINLINE sDL_isnanf #-}
+
+-- | Return whether the value is NaN.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: non-zero if the value is NaN, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isnan'
+--
+--     [C declaration]: @SDL_isnanf@, defined at @SDL3\/SDL_stdinc.h 5241:33@
+sDL_isnanf :: BG.FunPtr (BG.CFloat -> IO BG.CInt)
+sDL_isnanf =
+  BG.unsafePerformIO hs_bindgen_308e1efef7090245
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_log@
+foreign import ccall unsafe "hs_bindgen_4f9418e7e4267684"
+  hs_bindgen_4f9418e7e4267684_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_log@
+hs_bindgen_4f9418e7e4267684 :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_4f9418e7e4267684 =
+  BG.fromFFIType hs_bindgen_4f9418e7e4267684_base
+
+{-# NOINLINE sDL_log #-}
+
+-- | Compute the natural logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on double-precision floating point values, use SDL_logf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value. Must be greater than 0.
+--
+--     [Returns]: the natural logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_logf', 'sDL_log10', 'sDL_exp'
+--
+--     [C declaration]: @SDL_log@, defined at @SDL3\/SDL_stdinc.h 5271:36@
+sDL_log :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_log =
+  BG.unsafePerformIO hs_bindgen_4f9418e7e4267684
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_logf@
+foreign import ccall unsafe "hs_bindgen_ab81f791c1e3e516"
+  hs_bindgen_ab81f791c1e3e516_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_logf@
+hs_bindgen_ab81f791c1e3e516 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_ab81f791c1e3e516 =
+  BG.fromFFIType hs_bindgen_ab81f791c1e3e516_base
+
+{-# NOINLINE sDL_logf #-}
+
+-- | Compute the natural logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on single-precision floating point values, use SDL_log for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value. Must be greater than 0.
+--
+--     [Returns]: the natural logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_log', 'sDL_expf'
+--
+--     [C declaration]: @SDL_logf@, defined at @SDL3\/SDL_stdinc.h 5300:35@
+sDL_logf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_logf =
+  BG.unsafePerformIO hs_bindgen_ab81f791c1e3e516
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_log10@
+foreign import ccall unsafe "hs_bindgen_c9a4b45a046047ba"
+  hs_bindgen_c9a4b45a046047ba_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_log10@
+hs_bindgen_c9a4b45a046047ba :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_c9a4b45a046047ba =
+  BG.fromFFIType hs_bindgen_c9a4b45a046047ba_base
+
+{-# NOINLINE sDL_log10 #-}
+
+-- | Compute the base-10 logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on double-precision floating point values, use SDL_log10f for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value. Must be greater than 0.
+--
+--     [Returns]: the logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_log10f', 'sDL_log', 'sDL_pow'
+--
+--     [C declaration]: @SDL_log10@, defined at @SDL3\/SDL_stdinc.h 5330:36@
+sDL_log10 :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_log10 =
+  BG.unsafePerformIO hs_bindgen_c9a4b45a046047ba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_log10f@
+foreign import ccall unsafe "hs_bindgen_72ace8de925eb690"
+  hs_bindgen_72ace8de925eb690_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_log10f@
+hs_bindgen_72ace8de925eb690 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_72ace8de925eb690 =
+  BG.fromFFIType hs_bindgen_72ace8de925eb690_base
+
+{-# NOINLINE sDL_log10f #-}
+
+-- | Compute the base-10 logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on single-precision floating point values, use SDL_log10 for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value. Must be greater than 0.
+--
+--     [Returns]: the logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_log10', 'sDL_logf', 'sDL_powf'
+--
+--     [C declaration]: @SDL_log10f@, defined at @SDL3\/SDL_stdinc.h 5360:35@
+sDL_log10f :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_log10f =
+  BG.unsafePerformIO hs_bindgen_72ace8de925eb690
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_modf@
+foreign import ccall unsafe "hs_bindgen_b05adeb0cad2dab6"
+  hs_bindgen_b05adeb0cad2dab6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_modf@
+hs_bindgen_b05adeb0cad2dab6 :: IO (BG.FunPtr (BG.CDouble -> BG.Ptr BG.CDouble -> IO BG.CDouble))
+hs_bindgen_b05adeb0cad2dab6 =
+  BG.fromFFIType hs_bindgen_b05adeb0cad2dab6_base
+
+{-# NOINLINE sDL_modf #-}
+
+-- | Split @x@ into integer and fractional parts
+--
+--     This function operates on double-precision floating point values, use SDL_modff for single-precision floats.
+--
+--     [@x@]: floating point value.
+--
+--     [@y@]: output pointer to store the integer part of @x@.
+--
+--     [Returns]: the fractional part of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_modff', 'sDL_trunc', 'sDL_fmod'
+--
+--     [C declaration]: @SDL_modf@, defined at @SDL3\/SDL_stdinc.h 5380:36@
+sDL_modf :: BG.FunPtr (BG.CDouble -> BG.Ptr BG.CDouble -> IO BG.CDouble)
+sDL_modf =
+  BG.unsafePerformIO hs_bindgen_b05adeb0cad2dab6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_modff@
+foreign import ccall unsafe "hs_bindgen_59f3b87137ea46cd"
+  hs_bindgen_59f3b87137ea46cd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_modff@
+hs_bindgen_59f3b87137ea46cd :: IO (BG.FunPtr (BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CFloat))
+hs_bindgen_59f3b87137ea46cd =
+  BG.fromFFIType hs_bindgen_59f3b87137ea46cd_base
+
+{-# NOINLINE sDL_modff #-}
+
+-- | Split @x@ into integer and fractional parts
+--
+--     This function operates on single-precision floating point values, use SDL_modf for double-precision floats.
+--
+--     [@x@]: floating point value.
+--
+--     [@y@]: output pointer to store the integer part of @x@.
+--
+--     [Returns]: the fractional part of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_modf', 'sDL_truncf', 'sDL_fmodf'
+--
+--     [C declaration]: @SDL_modff@, defined at @SDL3\/SDL_stdinc.h 5400:35@
+sDL_modff :: BG.FunPtr (BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CFloat)
+sDL_modff =
+  BG.unsafePerformIO hs_bindgen_59f3b87137ea46cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_pow@
+foreign import ccall unsafe "hs_bindgen_75e5e5b712af4971"
+  hs_bindgen_75e5e5b712af4971_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_pow@
+hs_bindgen_75e5e5b712af4971 :: IO (BG.FunPtr (BG.CDouble -> BG.CDouble -> IO BG.CDouble))
+hs_bindgen_75e5e5b712af4971 =
+  BG.fromFFIType hs_bindgen_75e5e5b712af4971_base
+
+{-# NOINLINE sDL_pow #-}
+
+-- | Raise @x@ to the power @y@
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     If @y@ is the base of the natural logarithm (e), consider using SDL_exp instead.
+--
+--     This function operates on double-precision floating point values, use SDL_powf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: the base.
+--
+--     [@y@]: the exponent.
+--
+--     [Returns]: @x@ raised to the power @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_powf', 'sDL_exp', 'sDL_log'
+--
+--     [C declaration]: @SDL_pow@, defined at @SDL3\/SDL_stdinc.h 5432:36@
+sDL_pow :: BG.FunPtr (BG.CDouble -> BG.CDouble -> IO BG.CDouble)
+sDL_pow =
+  BG.unsafePerformIO hs_bindgen_75e5e5b712af4971
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_powf@
+foreign import ccall unsafe "hs_bindgen_deb1ba3db460136c"
+  hs_bindgen_deb1ba3db460136c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_powf@
+hs_bindgen_deb1ba3db460136c :: IO (BG.FunPtr (BG.CFloat -> BG.CFloat -> IO BG.CFloat))
+hs_bindgen_deb1ba3db460136c =
+  BG.fromFFIType hs_bindgen_deb1ba3db460136c_base
+
+{-# NOINLINE sDL_powf #-}
+
+-- | Raise @x@ to the power @y@
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     If @y@ is the base of the natural logarithm (e), consider using SDL_exp instead.
+--
+--     This function operates on single-precision floating point values, use SDL_pow for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: the base.
+--
+--     [@y@]: the exponent.
+--
+--     [Returns]: @x@ raised to the power @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_pow', 'sDL_expf', 'sDL_logf'
+--
+--     [C declaration]: @SDL_powf@, defined at @SDL3\/SDL_stdinc.h 5464:35@
+sDL_powf :: BG.FunPtr (BG.CFloat -> BG.CFloat -> IO BG.CFloat)
+sDL_powf =
+  BG.unsafePerformIO hs_bindgen_deb1ba3db460136c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_round@
+foreign import ccall unsafe "hs_bindgen_e8841dcdfaff32de"
+  hs_bindgen_e8841dcdfaff32de_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_round@
+hs_bindgen_e8841dcdfaff32de :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_e8841dcdfaff32de =
+  BG.fromFFIType hs_bindgen_e8841dcdfaff32de_base
+
+{-# NOINLINE sDL_round #-}
+
+-- | Round @x@ to the nearest integer.
+--
+--     Rounds @x@ to the nearest integer. Values halfway between integers will be rounded away from zero.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_roundf for single-precision floats. To get the result as an integer type, use SDL_lround.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: the nearest integer to @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_roundf', @SDL_lround@, 'sDL_floor', 'sDL_ceil', 'sDL_trunc'
+--
+--     [C declaration]: @SDL_round@, defined at @SDL3\/SDL_stdinc.h 5493:36@
+sDL_round :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_round =
+  BG.unsafePerformIO hs_bindgen_e8841dcdfaff32de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_roundf@
+foreign import ccall unsafe "hs_bindgen_57450d2f082e285c"
+  hs_bindgen_57450d2f082e285c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_roundf@
+hs_bindgen_57450d2f082e285c :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_57450d2f082e285c =
+  BG.fromFFIType hs_bindgen_57450d2f082e285c_base
+
+{-# NOINLINE sDL_roundf #-}
+
+-- | Round @x@ to the nearest integer.
+--
+--     Rounds @x@ to the nearest integer. Values halfway between integers will be rounded away from zero.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_round for double-precision floats. To get the result as an integer type, use SDL_lroundf.
+--
+--     [@x@]: floating point value.
+--
+--     [Returns]: the nearest integer to @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_round', @SDL_lroundf@, 'sDL_floorf', 'sDL_ceilf', 'sDL_truncf'
+--
+--     [C declaration]: @SDL_roundf@, defined at @SDL3\/SDL_stdinc.h 5522:35@
+sDL_roundf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_roundf =
+  BG.unsafePerformIO hs_bindgen_57450d2f082e285c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_scalbn@
+foreign import ccall unsafe "hs_bindgen_6fc1ebd971ec8157"
+  hs_bindgen_6fc1ebd971ec8157_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_scalbn@
+hs_bindgen_6fc1ebd971ec8157 :: IO (BG.FunPtr (BG.CDouble -> BG.CInt -> IO BG.CDouble))
+hs_bindgen_6fc1ebd971ec8157 =
+  BG.fromFFIType hs_bindgen_6fc1ebd971ec8157_base
+
+{-# NOINLINE sDL_scalbn #-}
+
+-- | Scale @x@ by an integer power of two.
+--
+--     Multiplies @x@ by the @n@ th power of the floating point radix (always 2).
+--
+--     Domain: @-INF \<= x \<= INF@, @n@ integer
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_scalbnf for single-precision floats.
+--
+--     [@x@]: floating point value to be scaled.
+--
+--     [@n@]: integer exponent.
+--
+--     [Returns]: @x * 2^n@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_scalbnf', 'sDL_pow'
+--
+--     [C declaration]: @SDL_scalbn@, defined at @SDL3\/SDL_stdinc.h 5605:36@
+sDL_scalbn :: BG.FunPtr (BG.CDouble -> BG.CInt -> IO BG.CDouble)
+sDL_scalbn =
+  BG.unsafePerformIO hs_bindgen_6fc1ebd971ec8157
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_scalbnf@
+foreign import ccall unsafe "hs_bindgen_706cd6213dd8d69d"
+  hs_bindgen_706cd6213dd8d69d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_scalbnf@
+hs_bindgen_706cd6213dd8d69d :: IO (BG.FunPtr (BG.CFloat -> BG.CInt -> IO BG.CFloat))
+hs_bindgen_706cd6213dd8d69d =
+  BG.fromFFIType hs_bindgen_706cd6213dd8d69d_base
+
+{-# NOINLINE sDL_scalbnf #-}
+
+-- | Scale @x@ by an integer power of two.
+--
+--     Multiplies @x@ by the @n@ th power of the floating point radix (always 2).
+--
+--     Domain: @-INF \<= x \<= INF@, @n@ integer
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_scalbn for double-precision floats.
+--
+--     [@x@]: floating point value to be scaled.
+--
+--     [@n@]: integer exponent.
+--
+--     [Returns]: @x * 2^n@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_scalbn', 'sDL_powf'
+--
+--     [C declaration]: @SDL_scalbnf@, defined at @SDL3\/SDL_stdinc.h 5630:35@
+sDL_scalbnf :: BG.FunPtr (BG.CFloat -> BG.CInt -> IO BG.CFloat)
+sDL_scalbnf =
+  BG.unsafePerformIO hs_bindgen_706cd6213dd8d69d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sin@
+foreign import ccall unsafe "hs_bindgen_e4b1725cdd38afe4"
+  hs_bindgen_e4b1725cdd38afe4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sin@
+hs_bindgen_e4b1725cdd38afe4 :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_e4b1725cdd38afe4 =
+  BG.fromFFIType hs_bindgen_e4b1725cdd38afe4_base
+
+{-# NOINLINE sDL_sin #-}
+
+-- | Compute the sine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on double-precision floating point values, use SDL_sinf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value, in radians.
+--
+--     [Returns]: sine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sinf', 'sDL_asin', 'sDL_cos'
+--
+--     [C declaration]: @SDL_sin@, defined at @SDL3\/SDL_stdinc.h 5658:36@
+sDL_sin :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_sin =
+  BG.unsafePerformIO hs_bindgen_e4b1725cdd38afe4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sinf@
+foreign import ccall unsafe "hs_bindgen_4d400d672d200ac9"
+  hs_bindgen_4d400d672d200ac9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sinf@
+hs_bindgen_4d400d672d200ac9 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_4d400d672d200ac9 =
+  BG.fromFFIType hs_bindgen_4d400d672d200ac9_base
+
+{-# NOINLINE sDL_sinf #-}
+
+-- | Compute the sine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on single-precision floating point values, use SDL_sin for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value, in radians.
+--
+--     [Returns]: sine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sin', 'sDL_asinf', 'sDL_cosf'
+--
+--     [C declaration]: @SDL_sinf@, defined at @SDL3\/SDL_stdinc.h 5686:35@
+sDL_sinf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_sinf =
+  BG.unsafePerformIO hs_bindgen_4d400d672d200ac9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sqrt@
+foreign import ccall unsafe "hs_bindgen_8352f3e6d4755f65"
+  hs_bindgen_8352f3e6d4755f65_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sqrt@
+hs_bindgen_8352f3e6d4755f65 :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_8352f3e6d4755f65 =
+  BG.fromFFIType hs_bindgen_8352f3e6d4755f65_base
+
+{-# NOINLINE sDL_sqrt #-}
+
+-- | Compute the square root of @x@.
+--
+--     Domain: @0 \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_sqrtf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value. Must be greater than or equal to 0.
+--
+--     [Returns]: square root of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sqrtf'
+--
+--     [C declaration]: @SDL_sqrt@, defined at @SDL3\/SDL_stdinc.h 5712:36@
+sDL_sqrt :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_sqrt =
+  BG.unsafePerformIO hs_bindgen_8352f3e6d4755f65
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sqrtf@
+foreign import ccall unsafe "hs_bindgen_87f1efd0a9654c58"
+  hs_bindgen_87f1efd0a9654c58_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_sqrtf@
+hs_bindgen_87f1efd0a9654c58 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_87f1efd0a9654c58 =
+  BG.fromFFIType hs_bindgen_87f1efd0a9654c58_base
+
+{-# NOINLINE sDL_sqrtf #-}
+
+-- | Compute the square root of @x@.
+--
+--     Domain: @0 \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_sqrt for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value. Must be greater than or equal to 0.
+--
+--     [Returns]: square root of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sqrt'
+--
+--     [C declaration]: @SDL_sqrtf@, defined at @SDL3\/SDL_stdinc.h 5738:35@
+sDL_sqrtf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_sqrtf =
+  BG.unsafePerformIO hs_bindgen_87f1efd0a9654c58
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_tan@
+foreign import ccall unsafe "hs_bindgen_4a65c95891312c30"
+  hs_bindgen_4a65c95891312c30_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_tan@
+hs_bindgen_4a65c95891312c30 :: IO (BG.FunPtr (BG.CDouble -> IO BG.CDouble))
+hs_bindgen_4a65c95891312c30 =
+  BG.fromFFIType hs_bindgen_4a65c95891312c30_base
+
+{-# NOINLINE sDL_tan #-}
+
+-- | Compute the tangent of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_tanf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value, in radians.
+--
+--     [Returns]: tangent of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_tanf', 'sDL_sin', 'sDL_cos', 'sDL_atan', 'sDL_atan2'
+--
+--     [C declaration]: @SDL_tan@, defined at @SDL3\/SDL_stdinc.h 5768:36@
+sDL_tan :: BG.FunPtr (BG.CDouble -> IO BG.CDouble)
+sDL_tan =
+  BG.unsafePerformIO hs_bindgen_4a65c95891312c30
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_tanf@
+foreign import ccall unsafe "hs_bindgen_094dc8b00c4ee010"
+  hs_bindgen_094dc8b00c4ee010_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_tanf@
+hs_bindgen_094dc8b00c4ee010 :: IO (BG.FunPtr (BG.CFloat -> IO BG.CFloat))
+hs_bindgen_094dc8b00c4ee010 =
+  BG.fromFFIType hs_bindgen_094dc8b00c4ee010_base
+
+{-# NOINLINE sDL_tanf #-}
+
+-- | Compute the tangent of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_tan for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [@x@]: floating point value, in radians.
+--
+--     [Returns]: tangent of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_tan', 'sDL_sinf', 'sDL_cosf', 'sDL_atanf', 'sDL_atan2f'
+--
+--     [C declaration]: @SDL_tanf@, defined at @SDL3\/SDL_stdinc.h 5798:35@
+sDL_tanf :: BG.FunPtr (BG.CFloat -> IO BG.CFloat)
+sDL_tanf =
+  BG.unsafePerformIO hs_bindgen_094dc8b00c4ee010
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv_open@
+foreign import ccall unsafe "hs_bindgen_704fe1bf2ce9aef6"
+  hs_bindgen_704fe1bf2ce9aef6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv_open@
+hs_bindgen_704fe1bf2ce9aef6
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO SDL_iconv_t))
+hs_bindgen_704fe1bf2ce9aef6 =
+  BG.fromFFIType hs_bindgen_704fe1bf2ce9aef6_base
+
+{-# NOINLINE sDL_iconv_open #-}
+
+-- | This function allocates a context for the specified character set conversion.
+--
+--     [@tocode@]: The target character encoding, must not be NULL.
+--
+--     [@fromcode@]: The source character encoding, must not be NULL.
+--
+--     [Returns]: a handle that must be freed with SDL_iconv_close, or SDL_ICONV_ERROR on failure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv', 'sDL_iconv_close', 'sDL_iconv_string'
+--
+--     [C declaration]: @SDL_iconv_open@, defined at @SDL3\/SDL_stdinc.h 5826:41@
+sDL_iconv_open
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO SDL_iconv_t)
+sDL_iconv_open =
+  BG.unsafePerformIO hs_bindgen_704fe1bf2ce9aef6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv_close@
+foreign import ccall unsafe "hs_bindgen_2c0a62f403d4446c"
+  hs_bindgen_2c0a62f403d4446c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv_close@
+hs_bindgen_2c0a62f403d4446c :: IO (BG.FunPtr (SDL_iconv_t -> IO BG.CInt))
+hs_bindgen_2c0a62f403d4446c =
+  BG.fromFFIType hs_bindgen_2c0a62f403d4446c_base
+
+{-# NOINLINE sDL_iconv_close #-}
+
+-- | This function frees a context used for character set conversion.
+--
+--     [@cd@]: The character set conversion handle.
+--
+--     [Returns]: 0 on success, or -1 on failure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv', 'sDL_iconv_open', 'sDL_iconv_string'
+--
+--     [C declaration]: @SDL_iconv_close@, defined at @SDL3\/SDL_stdinc.h 5843:33@
+sDL_iconv_close :: BG.FunPtr (SDL_iconv_t -> IO BG.CInt)
+sDL_iconv_close =
+  BG.unsafePerformIO hs_bindgen_2c0a62f403d4446c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv@
+foreign import ccall unsafe "hs_bindgen_c0049201d1f4606f"
+  hs_bindgen_c0049201d1f4606f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv@
+hs_bindgen_c0049201d1f4606f
+  :: IO
+       ( BG.FunPtr
+           ( SDL_iconv_t
+             -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+             -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+             -> BG.Ptr (BG.Ptr BG.CChar)
+             -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+             -> IO HsBindgen.Runtime.LibC.CSize
+           )
+       )
+hs_bindgen_c0049201d1f4606f =
+  BG.fromFFIType hs_bindgen_c0049201d1f4606f_base
+
+{-# NOINLINE sDL_iconv #-}
+
+-- | This function converts text between encodings, reading from and writing to a buffer.
+--
+--     It returns the number of successful conversions on success. On error, SDL_ICONV_E2BIG is returned when the output buffer is too small, or SDL_ICONV_EILSEQ is returned when an invalid input sequence is encountered, or SDL_ICONV_EINVAL is returned when an incomplete input sequence is encountered.
+--
+--     On exit:
+--
+--     * inbuf will point to the beginning of the next multibyte sequence. On error, this is the location of the problematic input sequence. On success, this is the end of the input sequence.
+--
+--     * inbytesleft will be set to the number of bytes left to convert, which will be 0 on success.
+--
+--     * outbuf will point to the location where to store the next output byte.
+--
+--     * outbytesleft will be set to the number of bytes left in the output buffer.
+--
+--     [@cd@]: The character set conversion context, created in @SDL_iconv_open()@.
+--
+--     [@inbuf@]: Address of variable that points to the first character of the input sequence.
+--
+--     [@inbytesleft@]: The number of bytes in the input buffer.
+--
+--     [@outbuf@]: Address of variable that points to the output buffer.
+--
+--     [@outbytesleft@]: The number of bytes in the output buffer.
+--
+--     [Returns]: the number of conversions on success, or a negative error code.
+--
+--     [Thread safety]: Do not use the same 'SDL_iconv_t' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv_open', 'sDL_iconv_close', 'sDL_iconv_string'
+--
+--     [C declaration]: @SDL_iconv@, defined at @SDL3\/SDL_stdinc.h 5883:36@
+sDL_iconv
+  :: BG.FunPtr
+       ( SDL_iconv_t
+         -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+         -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+         -> BG.Ptr (BG.Ptr BG.CChar)
+         -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+         -> IO HsBindgen.Runtime.LibC.CSize
+       )
+sDL_iconv =
+  BG.unsafePerformIO hs_bindgen_c0049201d1f4606f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv_string@
+foreign import ccall unsafe "hs_bindgen_ce165346002f1247"
+  hs_bindgen_ce165346002f1247_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_iconv_string@
+hs_bindgen_ce165346002f1247
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> HsBindgen.Runtime.LibC.CSize
+             -> IO (BG.Ptr BG.CChar)
+           )
+       )
+hs_bindgen_ce165346002f1247 =
+  BG.fromFFIType hs_bindgen_ce165346002f1247_base
+
+{-# NOINLINE sDL_iconv_string #-}
+
+-- | Helper function to convert a string\'s encoding in one call.
+--
+--     This function converts a buffer or string between encodings in one pass.
+--
+--     The string does not need to be NULL-terminated; this function operates on the number of bytes specified in @inbytesleft@ whether there is a NULL character anywhere in the buffer.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [@tocode@]: the character encoding of the output string. Examples are \"UTF-8\", \"UCS-4\", etc.
+--
+--     [@fromcode@]: the character encoding of data in @inbuf@.
+--
+--     [@inbuf@]: the string to convert to a different encoding.
+--
+--     [@inbytesleft@]: the size of the input string /in bytes/.
+--
+--     [Returns]: a new string, converted to the new encoding, or NULL on error.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv_open', 'sDL_iconv_close', 'sDL_iconv'
+--
+--     [C declaration]: @SDL_iconv_string@, defined at @SDL3\/SDL_stdinc.h 5920:36@
+sDL_iconv_string
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> HsBindgen.Runtime.LibC.CSize
+         -> IO (BG.Ptr BG.CChar)
+       )
+sDL_iconv_string =
+  BG.unsafePerformIO hs_bindgen_ce165346002f1247
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_size_mul_check_overflow_builtin@
+foreign import ccall unsafe "hs_bindgen_5f2e41800217ca05"
+  hs_bindgen_5f2e41800217ca05_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_size_mul_check_overflow_builtin@
+hs_bindgen_5f2e41800217ca05
+  :: IO
+       ( BG.FunPtr
+           ( HsBindgen.Runtime.LibC.CSize
+             -> HsBindgen.Runtime.LibC.CSize
+             -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_5f2e41800217ca05 =
+  BG.fromFFIType hs_bindgen_5f2e41800217ca05_base
+
+{-# NOINLINE sDL_size_mul_check_overflow_builtin #-}
+
+-- | [C declaration]: @SDL_size_mul_check_overflow_builtin@, defined at @SDL3\/SDL_stdinc.h 6101:23@
+sDL_size_mul_check_overflow_builtin
+  :: BG.FunPtr
+       ( HsBindgen.Runtime.LibC.CSize
+         -> HsBindgen.Runtime.LibC.CSize
+         -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CBool
+       )
+sDL_size_mul_check_overflow_builtin =
+  BG.unsafePerformIO hs_bindgen_5f2e41800217ca05
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_size_add_check_overflow_builtin@
+foreign import ccall unsafe "hs_bindgen_2d8ca557aa2f3eb0"
+  hs_bindgen_2d8ca557aa2f3eb0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_get_SDL_size_add_check_overflow_builtin@
+hs_bindgen_2d8ca557aa2f3eb0
+  :: IO
+       ( BG.FunPtr
+           ( HsBindgen.Runtime.LibC.CSize
+             -> HsBindgen.Runtime.LibC.CSize
+             -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_2d8ca557aa2f3eb0 =
+  BG.fromFFIType hs_bindgen_2d8ca557aa2f3eb0_base
+
+{-# NOINLINE sDL_size_add_check_overflow_builtin #-}
+
+-- | [C declaration]: @SDL_size_add_check_overflow_builtin@, defined at @SDL3\/SDL_stdinc.h 6139:23@
+sDL_size_add_check_overflow_builtin
+  :: BG.FunPtr
+       ( HsBindgen.Runtime.LibC.CSize
+         -> HsBindgen.Runtime.LibC.CSize
+         -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+         -> IO BG.CBool
+       )
+sDL_size_add_check_overflow_builtin =
+  BG.unsafePerformIO hs_bindgen_2d8ca557aa2f3eb0
diff --git a/src/SDL3/Sys/Bindgen/Stdinc/Safe.hs b/src/SDL3/Sys/Bindgen/Stdinc/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Stdinc/Safe.hs
@@ -0,0 +1,7423 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Stdinc.Safe (
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_malloc,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_calloc,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_realloc,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_free,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_GetOriginalMemoryFunctions,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_GetMemoryFunctions,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_SetMemoryFunctions,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_aligned_alloc,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_aligned_free,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_GetNumAllocations,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_GetEnvironment,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_CreateEnvironment,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_GetEnvironmentVariable,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_GetEnvironmentVariables,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_SetEnvironmentVariable,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_UnsetEnvironmentVariable,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_DestroyEnvironment,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_getenv,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_getenv_unsafe,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_setenv_unsafe,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_unsetenv_unsafe,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_qsort,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_bsearch,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_qsort_r,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_bsearch_r,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_abs,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isalpha,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isalnum,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isblank,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_iscntrl,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isdigit,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isxdigit,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_ispunct,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isspace,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isupper,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_islower,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isprint,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isgraph,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_toupper,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_tolower,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_crc16,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_crc32,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_murmur3_32,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_memset4,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_memcmp,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcslen,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcsnlen,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcslcpy,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcslcat,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcsdup,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcsstr,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcsnstr,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcscmp,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcsncmp,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcscasecmp,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_wcsncasecmp,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strlen,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strnlen,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strlcpy,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_utf8strlcpy,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strlcat,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strdup,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strndup,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strrev,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strupr,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strlwr,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strchr,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strrchr,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strstr,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strnstr,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strcasestr,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strtok_r,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_utf8strlen,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_utf8strnlen,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_itoa,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_uitoa,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_lltoa,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_ulltoa,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_atoi,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_atof,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strtoll,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strtoull,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strtod,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strcmp,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strncmp,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strcasecmp,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strncasecmp,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_strpbrk,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_StepUTF8,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_StepBackUTF8,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_UCS4ToUTF8,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_srand,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_rand,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_randf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_rand_bits,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_rand_r,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_randf_r,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_rand_bits_r,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_acos,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_acosf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_asin,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_asinf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_atan,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_atanf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_atan2,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_atan2f,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_ceil,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_ceilf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_copysign,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_copysignf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_cos,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_cosf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_exp,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_expf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_fabs,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_fabsf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_floor,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_floorf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_trunc,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_truncf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_fmod,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_fmodf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isinf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isinff,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isnan,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_isnanf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_log,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_logf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_log10,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_log10f,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_modf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_modff,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_pow,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_powf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_round,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_roundf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_scalbn,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_scalbnf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_sin,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_sinf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_sqrt,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_sqrtf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_tan,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_tanf,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_iconv_open,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_iconv_close,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_iconv,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_iconv_string,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_size_mul_check_overflow_builtin,
+  SDL3.Sys.Bindgen.Stdinc.Safe.sDL_size_add_check_overflow_builtin,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_stdinc.h>"
+         , "void *hs_bindgen_0fa0437465ff2e3b ("
+         , "  size_t arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_malloc)(arg1);"
+         , "}"
+         , "void *hs_bindgen_12a69b8549cd3a89 ("
+         , "  size_t arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_calloc)(arg1, arg2);"
+         , "}"
+         , "void *hs_bindgen_749e3624b605eca6 ("
+         , "  void *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_realloc)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_090b04617f4cc6c8 ("
+         , "  void *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_free)(arg1);"
+         , "}"
+         , "void hs_bindgen_8ba528e1d8cc4754 ("
+         , "  SDL_malloc_func *arg1,"
+         , "  SDL_calloc_func *arg2,"
+         , "  SDL_realloc_func *arg3,"
+         , "  SDL_free_func *arg4"
+         , ")"
+         , "{"
+         , "  (SDL_GetOriginalMemoryFunctions)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_ad8799017bc65037 ("
+         , "  SDL_malloc_func *arg1,"
+         , "  SDL_calloc_func *arg2,"
+         , "  SDL_realloc_func *arg3,"
+         , "  SDL_free_func *arg4"
+         , ")"
+         , "{"
+         , "  (SDL_GetMemoryFunctions)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_0320414e5ec49d1b ("
+         , "  SDL_malloc_func arg1,"
+         , "  SDL_calloc_func arg2,"
+         , "  SDL_realloc_func arg3,"
+         , "  SDL_free_func arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetMemoryFunctions)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void *hs_bindgen_f88d3921cd5e4163 ("
+         , "  size_t arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_aligned_alloc)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_d2d698681f3145f2 ("
+         , "  void *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_aligned_free)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_f0e7f10898be7ba4 (void)"
+         , "{"
+         , "  return (SDL_GetNumAllocations)();"
+         , "}"
+         , "SDL_Environment *hs_bindgen_e44727dd9f944e0a (void)"
+         , "{"
+         , "  return (SDL_GetEnvironment)();"
+         , "}"
+         , "SDL_Environment *hs_bindgen_5c62fc7482159de0 ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateEnvironment)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_4da0ee2273bc4013 ("
+         , "  SDL_Environment *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetEnvironmentVariable)(arg1, arg2);"
+         , "}"
+         , "char **hs_bindgen_4c1189e55e8583bb ("
+         , "  SDL_Environment *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetEnvironmentVariables)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_5824ff8a221d07c0 ("
+         , "  SDL_Environment *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetEnvironmentVariable)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_f695a3f593331aff ("
+         , "  SDL_Environment *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_UnsetEnvironmentVariable)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_1dd67a4722131c01 ("
+         , "  SDL_Environment *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyEnvironment)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_1af31e6913adf6ff ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_getenv)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_5a7e5c07a3b52c7c ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_getenv_unsafe)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_e57ac980835e41db ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_setenv_unsafe)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_6237b0757e59fa37 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_unsetenv_unsafe)(arg1);"
+         , "}"
+         , "void hs_bindgen_b81d78a311d44f46 ("
+         , "  void *arg1,"
+         , "  size_t arg2,"
+         , "  size_t arg3,"
+         , "  SDL_CompareCallback arg4"
+         , ")"
+         , "{"
+         , "  (SDL_qsort)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void *hs_bindgen_8c9a76f991574084 ("
+         , "  void const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3,"
+         , "  size_t arg4,"
+         , "  SDL_CompareCallback arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_bsearch)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_d22a2fabdcd748eb ("
+         , "  void *arg1,"
+         , "  size_t arg2,"
+         , "  size_t arg3,"
+         , "  SDL_CompareCallback_r arg4,"
+         , "  void *arg5"
+         , ")"
+         , "{"
+         , "  (SDL_qsort_r)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void *hs_bindgen_9cce970e9842407b ("
+         , "  void const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3,"
+         , "  size_t arg4,"
+         , "  SDL_CompareCallback_r arg5,"
+         , "  void *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_bsearch_r)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "signed int hs_bindgen_3b7f43f8c476ee06 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_abs)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_9a00314812b7b060 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isalpha)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_f2e3b47d308f6330 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isalnum)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_94e1edfbd7c1b6fd ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isblank)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_f4e70f258fc0cd31 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_iscntrl)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_a92ce90ddf0e012f ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isdigit)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_c2fe92c140d522e3 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isxdigit)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_abdf0b7703d7ef7b ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ispunct)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_b0c62a95d4008bcb ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isspace)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_dbe8ad5b2415f52b ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isupper)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_4f1c801e2ffe74d9 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_islower)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_1de66809f06ec2cf ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isprint)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_7cecb757f16ce85d ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isgraph)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_799fe4e6fc639bc0 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_toupper)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_af600e5bb74004b2 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_tolower)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_8b9d7fd6e4874342 ("
+         , "  Uint16 arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_crc16)(arg1, arg2, arg3);"
+         , "}"
+         , "Uint32 hs_bindgen_20e1e20820f9c17a ("
+         , "  Uint32 arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_crc32)(arg1, arg2, arg3);"
+         , "}"
+         , "Uint32 hs_bindgen_e26385eb1b169df1 ("
+         , "  void const *arg1,"
+         , "  size_t arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_murmur3_32)(arg1, arg2, arg3);"
+         , "}"
+         , "void *hs_bindgen_39f43c1520a45f57 ("
+         , "  void *arg1,"
+         , "  Uint32 arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_memset4)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_1386d72429f6b9cb ("
+         , "  void const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_memcmp)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_e6c3253fb4b72427 ("
+         , "  wchar_t const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_wcslen)(arg1);"
+         , "}"
+         , "size_t hs_bindgen_da04478d43043c90 ("
+         , "  wchar_t const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsnlen)(arg1, arg2);"
+         , "}"
+         , "size_t hs_bindgen_82a9094f0d522cdf ("
+         , "  wchar_t *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_wcslcpy)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_c85ef13eabbd96dd ("
+         , "  wchar_t *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_wcslcat)(arg1, arg2, arg3);"
+         , "}"
+         , "wchar_t *hs_bindgen_9a5bf9db9506735d ("
+         , "  wchar_t const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsdup)(arg1);"
+         , "}"
+         , "wchar_t *hs_bindgen_8807485ad58a476c ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsstr)(arg1, arg2);"
+         , "}"
+         , "wchar_t *hs_bindgen_0f95369992d6076d ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsnstr)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_a56659eded1129eb ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_wcscmp)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_f249ec61a8d5978a ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsncmp)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_0e487d7f98097b0d ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_wcscasecmp)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_9a4ad44438974867 ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsncasecmp)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_574becd3bb71e7b9 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_strlen)(arg1);"
+         , "}"
+         , "size_t hs_bindgen_9232c1cbf65df9e5 ("
+         , "  char const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strnlen)(arg1, arg2);"
+         , "}"
+         , "size_t hs_bindgen_1a460cf112b7fd68 ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strlcpy)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_10b5c948dc68c882 ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_utf8strlcpy)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_8132fc050b3dda62 ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strlcat)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_e91dd28c0e034753 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_strdup)(arg1);"
+         , "}"
+         , "char *hs_bindgen_9f484a433e6fd1be ("
+         , "  char const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strndup)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_fd83e6da8cdd54dc ("
+         , "  char *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_strrev)(arg1);"
+         , "}"
+         , "char *hs_bindgen_4821ca9fe328d7f0 ("
+         , "  char *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_strupr)(arg1);"
+         , "}"
+         , "char *hs_bindgen_b313d67572ea455e ("
+         , "  char *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_strlwr)(arg1);"
+         , "}"
+         , "char *hs_bindgen_9b8b80f67620d0c0 ("
+         , "  char const *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strchr)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_61eb1646e2706ec9 ("
+         , "  char const *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strrchr)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_09dae8bc6d27bfa7 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strstr)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_b253d6195ad29db6 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strnstr)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_845c9ada7f0145b4 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strcasestr)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_92aad5310bed80bf ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  char **arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strtok_r)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_2fe9c3d14ead61fa ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_utf8strlen)(arg1);"
+         , "}"
+         , "size_t hs_bindgen_7e1dc736bb92cf02 ("
+         , "  char const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_utf8strnlen)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_5e87f4eb430750ff ("
+         , "  signed int arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_itoa)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_6593301ad3b87e96 ("
+         , "  unsigned int arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_uitoa)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_49dab071ddd94418 ("
+         , "  signed long long arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_lltoa)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_8c172a64279b6c99 ("
+         , "  unsigned long long arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_ulltoa)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_7ec5dbb16b1ec441 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_atoi)(arg1);"
+         , "}"
+         , "double hs_bindgen_3da67c3a67185baf ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_atof)(arg1);"
+         , "}"
+         , "signed long long hs_bindgen_2d4f949f38ae668c ("
+         , "  char const *arg1,"
+         , "  char **arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strtoll)(arg1, arg2, arg3);"
+         , "}"
+         , "unsigned long long hs_bindgen_af470a839fcf6fbd ("
+         , "  char const *arg1,"
+         , "  char **arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strtoull)(arg1, arg2, arg3);"
+         , "}"
+         , "double hs_bindgen_717e481bd213c968 ("
+         , "  char const *arg1,"
+         , "  char **arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strtod)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_114ae5114f0f2f61 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strcmp)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_07f412ca6ac64bca ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strncmp)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_931c05e65f298770 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strcasecmp)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_974c20bb6f7b7d03 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strncasecmp)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_50473abaffb3417e ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strpbrk)(arg1, arg2);"
+         , "}"
+         , "Uint32 hs_bindgen_e49242de1cec91d5 ("
+         , "  char const **arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_StepUTF8)(arg1, arg2);"
+         , "}"
+         , "Uint32 hs_bindgen_0346c467944ee189 ("
+         , "  char const *arg1,"
+         , "  char const **arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_StepBackUTF8)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_bdc98e385efc6ab7 ("
+         , "  Uint32 arg1,"
+         , "  char *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_UCS4ToUTF8)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_bd195a3a2b34e483 ("
+         , "  Uint64 arg1"
+         , ")"
+         , "{"
+         , "  (SDL_srand)(arg1);"
+         , "}"
+         , "Sint32 hs_bindgen_4b2da7e53b63ed17 ("
+         , "  Sint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_rand)(arg1);"
+         , "}"
+         , "float hs_bindgen_91fe5edd016e0570 (void)"
+         , "{"
+         , "  return (SDL_randf)();"
+         , "}"
+         , "Uint32 hs_bindgen_5d81c1c12775308d (void)"
+         , "{"
+         , "  return (SDL_rand_bits)();"
+         , "}"
+         , "Sint32 hs_bindgen_59abfd01a8d7b8f7 ("
+         , "  Uint64 *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_rand_r)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_5da60fff1ce7873d ("
+         , "  Uint64 *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_randf_r)(arg1);"
+         , "}"
+         , "Uint32 hs_bindgen_23de01659ed6ba6b ("
+         , "  Uint64 *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_rand_bits_r)(arg1);"
+         , "}"
+         , "double hs_bindgen_217308a0a788520d ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_acos)(arg1);"
+         , "}"
+         , "float hs_bindgen_f093db4bb5e8e494 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_acosf)(arg1);"
+         , "}"
+         , "double hs_bindgen_205d9f923dff59cd ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_asin)(arg1);"
+         , "}"
+         , "float hs_bindgen_79771d582742f165 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_asinf)(arg1);"
+         , "}"
+         , "double hs_bindgen_3051cbc85bd5efba ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_atan)(arg1);"
+         , "}"
+         , "float hs_bindgen_7d0bcd6030adfae6 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_atanf)(arg1);"
+         , "}"
+         , "double hs_bindgen_9ae010b5b4d9f553 ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_atan2)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_3eac4b1bfc5aff58 ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_atan2f)(arg1, arg2);"
+         , "}"
+         , "double hs_bindgen_1630cb0e3a004beb ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ceil)(arg1);"
+         , "}"
+         , "float hs_bindgen_04a706bfcc971297 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ceilf)(arg1);"
+         , "}"
+         , "double hs_bindgen_fed0484ab850ee6a ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_copysign)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_d21fe858af73dd98 ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_copysignf)(arg1, arg2);"
+         , "}"
+         , "double hs_bindgen_a4c38d6732d22ffb ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_cos)(arg1);"
+         , "}"
+         , "float hs_bindgen_ad11505e8fd49060 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_cosf)(arg1);"
+         , "}"
+         , "double hs_bindgen_ffaa0913f3d0c63c ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_exp)(arg1);"
+         , "}"
+         , "float hs_bindgen_4d5e3977a4eb4c12 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_expf)(arg1);"
+         , "}"
+         , "double hs_bindgen_89730ae2b638ee61 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_fabs)(arg1);"
+         , "}"
+         , "float hs_bindgen_4e76324c9b8f7453 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_fabsf)(arg1);"
+         , "}"
+         , "double hs_bindgen_4c646d1d6b7e922f ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_floor)(arg1);"
+         , "}"
+         , "float hs_bindgen_db6fbb0a591a2804 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_floorf)(arg1);"
+         , "}"
+         , "double hs_bindgen_2b4f0ab682c421b7 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_trunc)(arg1);"
+         , "}"
+         , "float hs_bindgen_afe8ddb39d52a293 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_truncf)(arg1);"
+         , "}"
+         , "double hs_bindgen_f1fc4d1a8a6fd613 ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_fmod)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_19c2a30dd6614c51 ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_fmodf)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_9be13530739c3139 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isinf)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_d063ada15b71ed19 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isinff)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_bb4d9f6611f2a512 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isnan)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_48e10ed50de37991 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isnanf)(arg1);"
+         , "}"
+         , "double hs_bindgen_46922ccc470e92e0 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_log)(arg1);"
+         , "}"
+         , "float hs_bindgen_7ef0b9f4239eb37e ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_logf)(arg1);"
+         , "}"
+         , "double hs_bindgen_bc1ad316da1b3bbc ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_log10)(arg1);"
+         , "}"
+         , "float hs_bindgen_310aebbf28df3250 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_log10f)(arg1);"
+         , "}"
+         , "double hs_bindgen_93a468f91c55ba99 ("
+         , "  double arg1,"
+         , "  double *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_modf)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_76a18e33bbbed6ee ("
+         , "  float arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_modff)(arg1, arg2);"
+         , "}"
+         , "double hs_bindgen_b8c28ba00815fbb9 ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_pow)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_d853802a7561099f ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_powf)(arg1, arg2);"
+         , "}"
+         , "double hs_bindgen_097e1eceb090a078 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_round)(arg1);"
+         , "}"
+         , "float hs_bindgen_5b677097112f1617 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_roundf)(arg1);"
+         , "}"
+         , "double hs_bindgen_8038e0526522260c ("
+         , "  double arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_scalbn)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_fc0cb80cec8a11b0 ("
+         , "  float arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_scalbnf)(arg1, arg2);"
+         , "}"
+         , "double hs_bindgen_d062c0d717121757 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_sin)(arg1);"
+         , "}"
+         , "float hs_bindgen_4ee3ee787bd19e91 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_sinf)(arg1);"
+         , "}"
+         , "double hs_bindgen_45b7bf5fa33e3269 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_sqrt)(arg1);"
+         , "}"
+         , "float hs_bindgen_da05b17837e5fa68 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_sqrtf)(arg1);"
+         , "}"
+         , "double hs_bindgen_8e3c4624ada8d754 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_tan)(arg1);"
+         , "}"
+         , "float hs_bindgen_b4a5a33f270aeb8d ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_tanf)(arg1);"
+         , "}"
+         , "SDL_iconv_t hs_bindgen_4c58e728caad9aa3 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_iconv_open)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_85fcb2de02d7791f ("
+         , "  SDL_iconv_t arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_iconv_close)(arg1);"
+         , "}"
+         , "size_t hs_bindgen_73663c44fcaa8f9d ("
+         , "  SDL_iconv_t arg1,"
+         , "  char const **arg2,"
+         , "  size_t *arg3,"
+         , "  char **arg4,"
+         , "  size_t *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_iconv)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "char *hs_bindgen_066c0e98a41d1c6b ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  size_t arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_iconv_string)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_cb7ffceaa134d628 ("
+         , "  size_t arg1,"
+         , "  size_t arg2,"
+         , "  size_t *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_size_mul_check_overflow_builtin)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_ca88dcdcdddd2954 ("
+         , "  size_t arg1,"
+         , "  size_t arg2,"
+         , "  size_t *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_size_add_check_overflow_builtin)(arg1, arg2, arg3);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_malloc@
+foreign import ccall safe "hs_bindgen_0fa0437465ff2e3b"
+  hs_bindgen_0fa0437465ff2e3b_base
+    :: BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_malloc@
+hs_bindgen_0fa0437465ff2e3b
+  :: HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_0fa0437465ff2e3b =
+  BG.fromFFIType hs_bindgen_0fa0437465ff2e3b_base
+
+-- | Allocate uninitialized memory.
+--
+--     The allocated memory returned by this function must be freed with @SDL_free()@.
+--
+--     If @size@ is 0, it will be set to 1.
+--
+--     If the allocation is successful, the returned pointer is guaranteed to be aligned to either the /fundamental alignment/ (@alignof(max_align_t)@ in C11 and later) or @2 * sizeof(void *)@, whichever is smaller. Use @SDL_aligned_alloc()@ if you need to allocate memory aligned to an alignment greater than this guarantee.
+--
+--     [Returns]: a pointer to the allocated memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_free', SDL_calloc, SDL_realloc, 'sDL_aligned_alloc'
+--
+--     [C declaration]: @SDL_malloc@, defined at @SDL3\/SDL_stdinc.h 1341:47@
+sDL_malloc
+  :: HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size to allocate.
+  -> IO (BG.Ptr BG.Void)
+sDL_malloc = hs_bindgen_0fa0437465ff2e3b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_calloc@
+foreign import ccall safe "hs_bindgen_12a69b8549cd3a89"
+  hs_bindgen_12a69b8549cd3a89_base
+    :: BG.Word64
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_calloc@
+hs_bindgen_12a69b8549cd3a89
+  :: HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_12a69b8549cd3a89 =
+  BG.fromFFIType hs_bindgen_12a69b8549cd3a89_base
+
+-- | [C declaration]: @SDL_calloc@, defined at @SDL3\/SDL_stdinc.h 1366:69@
+sDL_calloc
+  :: HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @nmemb@
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @size@
+  -> IO (BG.Ptr BG.Void)
+sDL_calloc = hs_bindgen_12a69b8549cd3a89
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_realloc@
+foreign import ccall safe "hs_bindgen_749e3624b605eca6"
+  hs_bindgen_749e3624b605eca6_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_realloc@
+hs_bindgen_749e3624b605eca6
+  :: BG.Ptr BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_749e3624b605eca6 =
+  BG.fromFFIType hs_bindgen_749e3624b605eca6_base
+
+-- | [C declaration]: @SDL_realloc@, defined at @SDL3\/SDL_stdinc.h 1406:54@
+sDL_realloc
+  :: BG.Ptr BG.Void
+  -- ^ [C declaration]: @mem@
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @size@
+  -> IO (BG.Ptr BG.Void)
+sDL_realloc = hs_bindgen_749e3624b605eca6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_free@
+foreign import ccall safe "hs_bindgen_090b04617f4cc6c8"
+  hs_bindgen_090b04617f4cc6c8_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_free@
+hs_bindgen_090b04617f4cc6c8
+  :: BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_090b04617f4cc6c8 =
+  BG.fromFFIType hs_bindgen_090b04617f4cc6c8_base
+
+-- | Free allocated memory.
+--
+--     The pointer is no longer valid after this call and cannot be dereferenced anymore.
+--
+--     If @mem@ is NULL, this function does nothing.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_malloc', SDL_calloc, SDL_realloc
+--
+--     [C declaration]: @SDL_free@, defined at @SDL3\/SDL_stdinc.h 1426:34@
+sDL_free
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to allocated memory, or NULL.
+  -> IO ()
+sDL_free = hs_bindgen_090b04617f4cc6c8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetOriginalMemoryFunctions@
+foreign import ccall safe "hs_bindgen_8ba528e1d8cc4754"
+  hs_bindgen_8ba528e1d8cc4754_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetOriginalMemoryFunctions@
+hs_bindgen_8ba528e1d8cc4754
+  :: BG.Ptr SDL_malloc_func
+  -> BG.Ptr SDL_calloc_func
+  -> BG.Ptr SDL_realloc_func
+  -> BG.Ptr SDL_free_func
+  -> IO ()
+hs_bindgen_8ba528e1d8cc4754 =
+  BG.fromFFIType hs_bindgen_8ba528e1d8cc4754_base
+
+-- | Get the original set of SDL memory functions.
+--
+--     This is what SDL_malloc and friends will use by default, if there has been no call to SDL_SetMemoryFunctions. This is not necessarily using the C runtime\'s @malloc@ functions behind the scenes! Different platforms and build configurations might do any number of unexpected things.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetOriginalMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1524:34@
+sDL_GetOriginalMemoryFunctions
+  :: BG.Ptr SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: filled with malloc function.
+  -> BG.Ptr SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: filled with calloc function.
+  -> BG.Ptr SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: filled with realloc function.
+  -> BG.Ptr SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: filled with free function.
+  -> IO ()
+sDL_GetOriginalMemoryFunctions =
+  hs_bindgen_8ba528e1d8cc4754
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetMemoryFunctions@
+foreign import ccall safe "hs_bindgen_ad8799017bc65037"
+  hs_bindgen_ad8799017bc65037_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetMemoryFunctions@
+hs_bindgen_ad8799017bc65037
+  :: BG.Ptr SDL_malloc_func
+  -> BG.Ptr SDL_calloc_func
+  -> BG.Ptr SDL_realloc_func
+  -> BG.Ptr SDL_free_func
+  -> IO ()
+hs_bindgen_ad8799017bc65037 =
+  BG.fromFFIType hs_bindgen_ad8799017bc65037_base
+
+-- | Get the current set of SDL memory functions.
+--
+--     [Thread safety]: This does not hold a lock, so do not call this in the unlikely event of a background thread calling SDL_SetMemoryFunctions simultaneously.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetMemoryFunctions', 'sDL_GetOriginalMemoryFunctions'
+--
+--     [C declaration]: @SDL_GetMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1546:34@
+sDL_GetMemoryFunctions
+  :: BG.Ptr SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: filled with malloc function.
+  -> BG.Ptr SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: filled with calloc function.
+  -> BG.Ptr SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: filled with realloc function.
+  -> BG.Ptr SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: filled with free function.
+  -> IO ()
+sDL_GetMemoryFunctions = hs_bindgen_ad8799017bc65037
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_SetMemoryFunctions@
+foreign import ccall safe "hs_bindgen_0320414e5ec49d1b"
+  hs_bindgen_0320414e5ec49d1b_base
+    :: BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_SetMemoryFunctions@
+hs_bindgen_0320414e5ec49d1b
+  :: SDL_malloc_func
+  -> SDL_calloc_func
+  -> SDL_realloc_func
+  -> SDL_free_func
+  -> IO BG.CBool
+hs_bindgen_0320414e5ec49d1b =
+  BG.fromFFIType hs_bindgen_0320414e5ec49d1b_base
+
+-- | Replace SDL\'s memory allocation functions with a custom set.
+--
+--     It is not safe to call this function once any allocations have been made, as future calls to SDL_free will use the new allocator, even if they came from an SDL_malloc made with the old one!
+--
+--     If used, usually this needs to be the first call made into the SDL library, if not the very first thing done at program startup time.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but one should not replace the memory functions once any allocations are made!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMemoryFunctions', 'sDL_GetOriginalMemoryFunctions'
+--
+--     [C declaration]: @SDL_SetMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1577:34@
+sDL_SetMemoryFunctions
+  :: SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: custom malloc function.
+  -> SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: custom calloc function.
+  -> SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: custom realloc function.
+  -> SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: custom free function.
+  -> IO BG.CBool
+sDL_SetMemoryFunctions = hs_bindgen_0320414e5ec49d1b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_aligned_alloc@
+foreign import ccall safe "hs_bindgen_f88d3921cd5e4163"
+  hs_bindgen_f88d3921cd5e4163_base
+    :: BG.Word64
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_aligned_alloc@
+hs_bindgen_f88d3921cd5e4163
+  :: HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_f88d3921cd5e4163 =
+  BG.fromFFIType hs_bindgen_f88d3921cd5e4163_base
+
+-- | Allocate memory aligned to a specific alignment.
+--
+--     The memory returned by this function must be freed with @SDL_aligned_free()@, /not/ @SDL_free()@.
+--
+--     If @alignment@ is less than the size of @void *@, it will be increased to match that.
+--
+--     The returned memory address will be a multiple of the alignment value, and the size of the memory allocated will be a multiple of the alignment value.
+--
+--     [Returns]: a pointer to the aligned memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_aligned_free'
+--
+--     [C declaration]: @SDL_aligned_alloc@, defined at @SDL3\/SDL_stdinc.h 1604:47@
+sDL_aligned_alloc
+  :: HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@alignment@]: the alignment of the memory.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size to allocate.
+  -> IO (BG.Ptr BG.Void)
+sDL_aligned_alloc = hs_bindgen_f88d3921cd5e4163
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_aligned_free@
+foreign import ccall safe "hs_bindgen_d2d698681f3145f2"
+  hs_bindgen_d2d698681f3145f2_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_aligned_free@
+hs_bindgen_d2d698681f3145f2
+  :: BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_d2d698681f3145f2 =
+  BG.fromFFIType hs_bindgen_d2d698681f3145f2_base
+
+-- | Free memory allocated by @SDL_aligned_alloc()@.
+--
+--     The pointer is no longer valid after this call and cannot be dereferenced anymore.
+--
+--     If @mem@ is NULL, this function does nothing.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_aligned_alloc'
+--
+--     [C declaration]: @SDL_aligned_free@, defined at @SDL3\/SDL_stdinc.h 1622:34@
+sDL_aligned_free
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer previously returned by @SDL_aligned_alloc()@, or NULL.
+  -> IO ()
+sDL_aligned_free = hs_bindgen_d2d698681f3145f2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetNumAllocations@
+foreign import ccall safe "hs_bindgen_f0e7f10898be7ba4"
+  hs_bindgen_f0e7f10898be7ba4_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetNumAllocations@
+hs_bindgen_f0e7f10898be7ba4 :: IO BG.CInt
+hs_bindgen_f0e7f10898be7ba4 =
+  BG.fromFFIType hs_bindgen_f0e7f10898be7ba4_base
+
+-- | Get the number of outstanding (unfreed) allocations.
+--
+--     [Returns]: the number of allocations or -1 if allocation counting is disabled.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetNumAllocations@, defined at @SDL3\/SDL_stdinc.h 1634:33@
+sDL_GetNumAllocations :: IO BG.CInt
+sDL_GetNumAllocations = hs_bindgen_f0e7f10898be7ba4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetEnvironment@
+foreign import ccall safe "hs_bindgen_e44727dd9f944e0a"
+  hs_bindgen_e44727dd9f944e0a_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetEnvironment@
+hs_bindgen_e44727dd9f944e0a :: IO (BG.Ptr SDL_Environment)
+hs_bindgen_e44727dd9f944e0a =
+  BG.fromFFIType hs_bindgen_e44727dd9f944e0a_base
+
+-- | Get the process environment.
+--
+--     This is initialized at application start and is not affected by setenv() and unsetenv() calls after that point. Use @SDL_SetEnvironmentVariable()@ and @SDL_UnsetEnvironmentVariable()@ if you want to modify this environment, or @SDL_setenv_unsafe()@ or @SDL_unsetenv_unsafe()@ if you want changes to persist in the C runtime environment after SDL_Quit().
+--
+--     [Returns]: a pointer to the environment for the process or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_GetEnvironment@, defined at @SDL3\/SDL_stdinc.h 1672:47@
+sDL_GetEnvironment :: IO (BG.Ptr SDL_Environment)
+sDL_GetEnvironment = hs_bindgen_e44727dd9f944e0a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_CreateEnvironment@
+foreign import ccall safe "hs_bindgen_5c62fc7482159de0"
+  hs_bindgen_5c62fc7482159de0_base
+    :: BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_CreateEnvironment@
+hs_bindgen_5c62fc7482159de0
+  :: BG.CBool
+  -> IO (BG.Ptr SDL_Environment)
+hs_bindgen_5c62fc7482159de0 =
+  BG.fromFFIType hs_bindgen_5c62fc7482159de0_base
+
+-- | Create a set of environment variables
+--
+--     [Returns]: a pointer to the new environment or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: If @populated@ is false, it is safe to call this function from any thread, otherwise it is safe if no other threads are calling setenv() or unsetenv()
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable', 'sDL_DestroyEnvironment'
+--
+--     [C declaration]: @SDL_CreateEnvironment@, defined at @SDL3\/SDL_stdinc.h 1694:47@
+sDL_CreateEnvironment
+  :: BG.CBool
+  -- ^
+  --
+  --           [@populated@]: true to initialize it from the C runtime environment, false to create an empty environment.
+  -> IO (BG.Ptr SDL_Environment)
+sDL_CreateEnvironment = hs_bindgen_5c62fc7482159de0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetEnvironmentVariable@
+foreign import ccall safe "hs_bindgen_4da0ee2273bc4013"
+  hs_bindgen_4da0ee2273bc4013_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetEnvironmentVariable@
+hs_bindgen_4da0ee2273bc4013
+  :: BG.Ptr SDL_Environment
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_4da0ee2273bc4013 =
+  BG.fromFFIType hs_bindgen_4da0ee2273bc4013_base
+
+-- | Get the value of a variable in the environment.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_GetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1714:42@
+sDL_GetEnvironmentVariable
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetEnvironmentVariable =
+  hs_bindgen_4da0ee2273bc4013
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetEnvironmentVariables@
+foreign import ccall safe "hs_bindgen_4c1189e55e8583bb"
+  hs_bindgen_4c1189e55e8583bb_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_GetEnvironmentVariables@
+hs_bindgen_4c1189e55e8583bb
+  :: BG.Ptr SDL_Environment
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+hs_bindgen_4c1189e55e8583bb =
+  BG.fromFFIType hs_bindgen_4c1189e55e8583bb_base
+
+-- | Get all variables in the environment.
+--
+--     [Returns]: a NULL terminated array of pointers to environment variables in the form \"variable=value\" or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with @SDL_free()@ when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_GetEnvironmentVariables@, defined at @SDL3\/SDL_stdinc.h 1735:37@
+sDL_GetEnvironmentVariables
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to query.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+sDL_GetEnvironmentVariables =
+  hs_bindgen_4c1189e55e8583bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_SetEnvironmentVariable@
+foreign import ccall safe "hs_bindgen_5824ff8a221d07c0"
+  hs_bindgen_5824ff8a221d07c0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_SetEnvironmentVariable@
+hs_bindgen_5824ff8a221d07c0
+  :: BG.Ptr SDL_Environment
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_5824ff8a221d07c0 =
+  BG.fromFFIType hs_bindgen_5824ff8a221d07c0_base
+
+-- | Set the value of a variable in the environment.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_SetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1759:34@
+sDL_SetEnvironmentVariable
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the variable to set.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@overwrite@]: true to overwrite the variable if it exists, false to return success without setting the variable if it already exists.
+  -> IO BG.CBool
+sDL_SetEnvironmentVariable =
+  hs_bindgen_5824ff8a221d07c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_UnsetEnvironmentVariable@
+foreign import ccall safe "hs_bindgen_f695a3f593331aff"
+  hs_bindgen_f695a3f593331aff_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_UnsetEnvironmentVariable@
+hs_bindgen_f695a3f593331aff
+  :: BG.Ptr SDL_Environment
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_f695a3f593331aff =
+  BG.fromFFIType hs_bindgen_f695a3f593331aff_base
+
+-- | Clear a variable from the environment.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_UnsetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1780:34@
+sDL_UnsetEnvironmentVariable
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to unset.
+  -> IO BG.CBool
+sDL_UnsetEnvironmentVariable =
+  hs_bindgen_f695a3f593331aff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_DestroyEnvironment@
+foreign import ccall safe "hs_bindgen_1dd67a4722131c01"
+  hs_bindgen_1dd67a4722131c01_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_DestroyEnvironment@
+hs_bindgen_1dd67a4722131c01
+  :: BG.Ptr SDL_Environment
+  -> IO ()
+hs_bindgen_1dd67a4722131c01 =
+  BG.fromFFIType hs_bindgen_1dd67a4722131c01_base
+
+-- | Destroy a set of environment variables.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the environment is no longer in use.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateEnvironment'
+--
+--     [C declaration]: @SDL_DestroyEnvironment@, defined at @SDL3\/SDL_stdinc.h 1794:34@
+sDL_DestroyEnvironment
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to destroy.
+  -> IO ()
+sDL_DestroyEnvironment = hs_bindgen_1dd67a4722131c01
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_getenv@
+foreign import ccall safe "hs_bindgen_1af31e6913adf6ff"
+  hs_bindgen_1af31e6913adf6ff_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_getenv@
+hs_bindgen_1af31e6913adf6ff
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_1af31e6913adf6ff =
+  BG.fromFFIType hs_bindgen_1af31e6913adf6ff_base
+
+-- | Get the value of a variable in the environment.
+--
+--     This function uses SDL\'s cached copy of the environment and is thread-safe.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_getenv@, defined at @SDL3\/SDL_stdinc.h 1809:42@
+sDL_getenv
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_getenv = hs_bindgen_1af31e6913adf6ff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_getenv_unsafe@
+foreign import ccall safe "hs_bindgen_5a7e5c07a3b52c7c"
+  hs_bindgen_5a7e5c07a3b52c7c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_getenv_unsafe@
+hs_bindgen_5a7e5c07a3b52c7c
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_5a7e5c07a3b52c7c =
+  BG.fromFFIType hs_bindgen_5a7e5c07a3b52c7c_base
+
+-- | Get the value of a variable in the environment.
+--
+--     This function bypasses SDL\'s cached copy of the environment and is not thread-safe.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: This function is not thread safe, consider using @SDL_getenv()@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_getenv'
+--
+--     [C declaration]: @SDL_getenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1828:42@
+sDL_getenv_unsafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_getenv_unsafe = hs_bindgen_5a7e5c07a3b52c7c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_setenv_unsafe@
+foreign import ccall safe "hs_bindgen_e57ac980835e41db"
+  hs_bindgen_e57ac980835e41db_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_setenv_unsafe@
+hs_bindgen_e57ac980835e41db
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_e57ac980835e41db =
+  BG.fromFFIType hs_bindgen_e57ac980835e41db_base
+
+-- | Set the value of a variable in the environment.
+--
+--     [Returns]: 0 on success, -1 on error.
+--
+--     [Thread safety]: This function is not thread safe, consider using @SDL_SetEnvironmentVariable()@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_setenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1846:33@
+sDL_setenv_unsafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the variable to set.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@overwrite@]: 1 to overwrite the variable if it exists, 0 to return success without setting the variable if it already exists.
+  -> IO BG.CInt
+sDL_setenv_unsafe = hs_bindgen_e57ac980835e41db
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_unsetenv_unsafe@
+foreign import ccall safe "hs_bindgen_6237b0757e59fa37"
+  hs_bindgen_6237b0757e59fa37_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_unsetenv_unsafe@
+hs_bindgen_6237b0757e59fa37
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_6237b0757e59fa37 =
+  BG.fromFFIType hs_bindgen_6237b0757e59fa37_base
+
+-- | Clear a variable from the environment.
+--
+--     [Returns]: 0 on success, -1 on error.
+--
+--     [Thread safety]: This function is not thread safe, consider using @SDL_UnsetEnvironmentVariable()@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_unsetenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1861:33@
+sDL_unsetenv_unsafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to unset.
+  -> IO BG.CInt
+sDL_unsetenv_unsafe = hs_bindgen_6237b0757e59fa37
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_qsort@
+foreign import ccall safe "hs_bindgen_b81d78a311d44f46"
+  hs_bindgen_b81d78a311d44f46_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.FunPtr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_qsort@
+hs_bindgen_b81d78a311d44f46
+  :: BG.Ptr BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> SDL_CompareCallback
+  -> IO ()
+hs_bindgen_b81d78a311d44f46 =
+  BG.fromFFIType hs_bindgen_b81d78a311d44f46_base
+
+-- | Sort an array.
+--
+--     For example:
+--
+--     @
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *a, const void *b)
+--     {
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->n \< B->n) {
+--             return -1;
+--         } else if (B->n \< A->n) {
+--             return 1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 3, \"third\" }, { 1, \"first\" }, { 2, \"second\" }
+--     };
+--
+--     SDL_qsort(values, SDL_arraysize(values), sizeof(values[0]), compare);
+--     @
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch', 'sDL_qsort_r'
+--
+--     [C declaration]: @SDL_qsort@, defined at @SDL3\/SDL_stdinc.h 1923:34@
+sDL_qsort
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> IO ()
+sDL_qsort = hs_bindgen_b81d78a311d44f46
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_bsearch@
+foreign import ccall safe "hs_bindgen_8c9a76f991574084"
+  hs_bindgen_8c9a76f991574084_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.FunPtr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_bsearch@
+hs_bindgen_8c9a76f991574084
+  :: PtrConst.PtrConst BG.Void
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> SDL_CompareCallback
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_8c9a76f991574084 =
+  BG.fromFFIType hs_bindgen_8c9a76f991574084_base
+
+-- | Perform a binary search on a previously sorted array.
+--
+--     For example:
+--
+--     @
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *a, const void *b)
+--     {
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->n \< B->n) {
+--             return -1;
+--         } else if (B->n \< A->n) {
+--             return 1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 1, \"first\" }, { 2, \"second\" }, { 3, \"third\" }
+--     };
+--     data key = { 2, NULL };
+--
+--     data *result = SDL_bsearch(&key, values, SDL_arraysize(values), sizeof(values[0]), compare);
+--     @
+--
+--     [Returns]: a pointer to the matching element in the array, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch_r', 'sDL_qsort'
+--
+--     [C declaration]: @SDL_bsearch@, defined at @SDL3\/SDL_stdinc.h 1973:36@
+sDL_bsearch
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@key@]: a pointer to a key equal to the element being searched for.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> IO (BG.Ptr BG.Void)
+sDL_bsearch = hs_bindgen_8c9a76f991574084
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_qsort_r@
+foreign import ccall safe "hs_bindgen_d22a2fabdcd748eb"
+  hs_bindgen_d22a2fabdcd748eb_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_qsort_r@
+hs_bindgen_d22a2fabdcd748eb
+  :: BG.Ptr BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> SDL_CompareCallback_r
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_d22a2fabdcd748eb =
+  BG.fromFFIType hs_bindgen_d22a2fabdcd748eb_base
+
+-- | Sort an array, passing a userdata pointer to the compare function.
+--
+--     For example:
+--
+--     @
+--     typedef enum {
+--         sort_increasing,
+--         sort_decreasing,
+--     } sort_method;
+--
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *userdata, const void *a, const void *b)
+--     {
+--         sort_method method = (sort_method)(uintptr_t)userdata;
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->key \< B->key) {
+--             return (method == sort_increasing) ? -1 : 1;
+--         } else if (B->key \< A->key) {
+--             return (method == sort_increasing) ? 1 : -1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 3, \"third\" }, { 1, \"first\" }, { 2, \"second\" }
+--     };
+--
+--     SDL_qsort_r(values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing);
+--     @
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch_r', 'sDL_qsort'
+--
+--     [C declaration]: @SDL_qsort_r@, defined at @SDL3\/SDL_stdinc.h 2043:34@
+sDL_qsort_r
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback_r
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to the compare function.
+  -> IO ()
+sDL_qsort_r = hs_bindgen_d22a2fabdcd748eb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_bsearch_r@
+foreign import ccall safe "hs_bindgen_9cce970e9842407b"
+  hs_bindgen_9cce970e9842407b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_bsearch_r@
+hs_bindgen_9cce970e9842407b
+  :: PtrConst.PtrConst BG.Void
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> SDL_CompareCallback_r
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_9cce970e9842407b =
+  BG.fromFFIType hs_bindgen_9cce970e9842407b_base
+
+-- | Perform a binary search on a previously sorted array, passing a userdata pointer to the compare function.
+--
+--     For example:
+--
+--     @
+--     typedef enum {
+--         sort_increasing,
+--         sort_decreasing,
+--     } sort_method;
+--
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *userdata, const void *a, const void *b)
+--     {
+--         sort_method method = (sort_method)(uintptr_t)userdata;
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->key \< B->key) {
+--             return (method == sort_increasing) ? -1 : 1;
+--         } else if (B->key \< A->key) {
+--             return (method == sort_increasing) ? 1 : -1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 1, \"first\" }, { 2, \"second\" }, { 3, \"third\" }
+--     };
+--     data key = { 2, NULL };
+--
+--     data *result = SDL_bsearch_r(&key, values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing);
+--     @
+--
+--     [Returns]: a pointer to the matching element in the array, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch', 'sDL_qsort_r'
+--
+--     [C declaration]: @SDL_bsearch_r@, defined at @SDL3\/SDL_stdinc.h 2101:36@
+sDL_bsearch_r
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@key@]: a pointer to a key equal to the element being searched for.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback_r
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to the compare function.
+  -> IO (BG.Ptr BG.Void)
+sDL_bsearch_r = hs_bindgen_9cce970e9842407b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_abs@
+foreign import ccall safe "hs_bindgen_3b7f43f8c476ee06"
+  hs_bindgen_3b7f43f8c476ee06_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_abs@
+hs_bindgen_3b7f43f8c476ee06
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_3b7f43f8c476ee06 =
+  BG.fromFFIType hs_bindgen_3b7f43f8c476ee06_base
+
+-- | Compute the absolute value of @x@.
+--
+--     [Returns]: the absolute value of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_abs@, defined at @SDL3\/SDL_stdinc.h 2113:33@
+sDL_abs
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: an integer value.
+  -> IO BG.CInt
+sDL_abs = hs_bindgen_3b7f43f8c476ee06
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isalpha@
+foreign import ccall safe "hs_bindgen_9a00314812b7b060"
+  hs_bindgen_9a00314812b7b060_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isalpha@
+hs_bindgen_9a00314812b7b060
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_9a00314812b7b060 =
+  BG.fromFFIType hs_bindgen_9a00314812b7b060_base
+
+-- | Query if a character is alphabetic (a letter).
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values for English \'a-z\' and \'A-Z\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isalpha@, defined at @SDL3\/SDL_stdinc.h 2188:33@
+sDL_isalpha
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isalpha = hs_bindgen_9a00314812b7b060
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isalnum@
+foreign import ccall safe "hs_bindgen_f2e3b47d308f6330"
+  hs_bindgen_f2e3b47d308f6330_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isalnum@
+hs_bindgen_f2e3b47d308f6330
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_f2e3b47d308f6330 =
+  BG.fromFFIType hs_bindgen_f2e3b47d308f6330_base
+
+-- | Query if a character is alphabetic (a letter) or a number.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values for English \'a-z\', \'A-Z\', and \'0-9\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isalnum@, defined at @SDL3\/SDL_stdinc.h 2203:33@
+sDL_isalnum
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isalnum = hs_bindgen_f2e3b47d308f6330
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isblank@
+foreign import ccall safe "hs_bindgen_94e1edfbd7c1b6fd"
+  hs_bindgen_94e1edfbd7c1b6fd_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isblank@
+hs_bindgen_94e1edfbd7c1b6fd
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_94e1edfbd7c1b6fd =
+  BG.fromFFIType hs_bindgen_94e1edfbd7c1b6fd_base
+
+-- | Report if a character is blank (a space or tab).
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values 0x20 (space) or 0x9 (tab) as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isblank@, defined at @SDL3\/SDL_stdinc.h 2218:33@
+sDL_isblank
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isblank = hs_bindgen_94e1edfbd7c1b6fd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_iscntrl@
+foreign import ccall safe "hs_bindgen_f4e70f258fc0cd31"
+  hs_bindgen_f4e70f258fc0cd31_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_iscntrl@
+hs_bindgen_f4e70f258fc0cd31
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_f4e70f258fc0cd31 =
+  BG.fromFFIType hs_bindgen_f4e70f258fc0cd31_base
+
+-- | Report if a character is a control character.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values 0 through 0x1F, and 0x7F, as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_iscntrl@, defined at @SDL3\/SDL_stdinc.h 2233:33@
+sDL_iscntrl
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_iscntrl = hs_bindgen_f4e70f258fc0cd31
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isdigit@
+foreign import ccall safe "hs_bindgen_a92ce90ddf0e012f"
+  hs_bindgen_a92ce90ddf0e012f_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isdigit@
+hs_bindgen_a92ce90ddf0e012f
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_a92ce90ddf0e012f =
+  BG.fromFFIType hs_bindgen_a92ce90ddf0e012f_base
+
+-- | Report if a character is a numeric digit.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'0\' (0x30) through \'9\' (0x39), as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isdigit@, defined at @SDL3\/SDL_stdinc.h 2248:33@
+sDL_isdigit
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isdigit = hs_bindgen_a92ce90ddf0e012f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isxdigit@
+foreign import ccall safe "hs_bindgen_c2fe92c140d522e3"
+  hs_bindgen_c2fe92c140d522e3_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isxdigit@
+hs_bindgen_c2fe92c140d522e3
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_c2fe92c140d522e3 =
+  BG.fromFFIType hs_bindgen_c2fe92c140d522e3_base
+
+-- | Report if a character is a hexadecimal digit.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'A\' through \'F\', \'a\' through \'f\', and \'0\' through \'9\', as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isxdigit@, defined at @SDL3\/SDL_stdinc.h 2263:33@
+sDL_isxdigit
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isxdigit = hs_bindgen_c2fe92c140d522e3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_ispunct@
+foreign import ccall safe "hs_bindgen_abdf0b7703d7ef7b"
+  hs_bindgen_abdf0b7703d7ef7b_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_ispunct@
+hs_bindgen_abdf0b7703d7ef7b
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_abdf0b7703d7ef7b =
+  BG.fromFFIType hs_bindgen_abdf0b7703d7ef7b_base
+
+-- | Report if a character is a punctuation mark.
+--
+--     __WARNING__: Regardless of system locale, this is equivalent to @((SDL_isgraph(x)) && (!SDL_isalnum(x)))@.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isgraph', 'sDL_isalnum'
+--
+--     [C declaration]: @SDL_ispunct@, defined at @SDL3\/SDL_stdinc.h 2281:33@
+sDL_ispunct
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_ispunct = hs_bindgen_abdf0b7703d7ef7b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isspace@
+foreign import ccall safe "hs_bindgen_b0c62a95d4008bcb"
+  hs_bindgen_b0c62a95d4008bcb_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isspace@
+hs_bindgen_b0c62a95d4008bcb
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_b0c62a95d4008bcb =
+  BG.fromFFIType hs_bindgen_b0c62a95d4008bcb_base
+
+-- | Report if a character is whitespace.
+--
+--     __WARNING__: Regardless of system locale, this will only treat the following ASCII values as true:
+--
+--     * space (0x20)
+--
+--     * tab (0x09)
+--
+--     * newline (0x0A)
+--
+--     * vertical tab (0x0B)
+--
+--     * form feed (0x0C)
+--
+--     * return (0x0D)
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isspace@, defined at @SDL3\/SDL_stdinc.h 2303:33@
+sDL_isspace
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isspace = hs_bindgen_b0c62a95d4008bcb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isupper@
+foreign import ccall safe "hs_bindgen_dbe8ad5b2415f52b"
+  hs_bindgen_dbe8ad5b2415f52b_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isupper@
+hs_bindgen_dbe8ad5b2415f52b
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_dbe8ad5b2415f52b =
+  BG.fromFFIType hs_bindgen_dbe8ad5b2415f52b_base
+
+-- | Report if a character is upper case.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'A\' through \'Z\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isupper@, defined at @SDL3\/SDL_stdinc.h 2318:33@
+sDL_isupper
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isupper = hs_bindgen_dbe8ad5b2415f52b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_islower@
+foreign import ccall safe "hs_bindgen_4f1c801e2ffe74d9"
+  hs_bindgen_4f1c801e2ffe74d9_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_islower@
+hs_bindgen_4f1c801e2ffe74d9
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_4f1c801e2ffe74d9 =
+  BG.fromFFIType hs_bindgen_4f1c801e2ffe74d9_base
+
+-- | Report if a character is lower case.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'a\' through \'z\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_islower@, defined at @SDL3\/SDL_stdinc.h 2333:33@
+sDL_islower
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_islower = hs_bindgen_4f1c801e2ffe74d9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isprint@
+foreign import ccall safe "hs_bindgen_1de66809f06ec2cf"
+  hs_bindgen_1de66809f06ec2cf_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isprint@
+hs_bindgen_1de66809f06ec2cf
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_1de66809f06ec2cf =
+  BG.fromFFIType hs_bindgen_1de66809f06ec2cf_base
+
+-- | Report if a character is \"printable\".
+--
+--     Be advised that \"printable\" has a definition that goes back to text terminals from the dawn of computing, making this a sort of special case function that is not suitable for Unicode (or most any) text management.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \' \' (0x20) through \'~\' (0x7E) as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isprint@, defined at @SDL3\/SDL_stdinc.h 2352:33@
+sDL_isprint
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isprint = hs_bindgen_1de66809f06ec2cf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isgraph@
+foreign import ccall safe "hs_bindgen_7cecb757f16ce85d"
+  hs_bindgen_7cecb757f16ce85d_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isgraph@
+hs_bindgen_7cecb757f16ce85d
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_7cecb757f16ce85d =
+  BG.fromFFIType hs_bindgen_7cecb757f16ce85d_base
+
+-- | Report if a character is any \"printable\" except space.
+--
+--     Be advised that \"printable\" has a definition that goes back to text terminals from the dawn of computing, making this a sort of special case function that is not suitable for Unicode (or most any) text management.
+--
+--     __WARNING__: Regardless of system locale, this is equivalent to @(SDL_isprint(x)) && ((x) != \' \')@.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isprint'
+--
+--     [C declaration]: @SDL_isgraph@, defined at @SDL3\/SDL_stdinc.h 2373:33@
+sDL_isgraph
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isgraph = hs_bindgen_7cecb757f16ce85d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_toupper@
+foreign import ccall safe "hs_bindgen_799fe4e6fc639bc0"
+  hs_bindgen_799fe4e6fc639bc0_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_toupper@
+hs_bindgen_799fe4e6fc639bc0
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_799fe4e6fc639bc0 =
+  BG.fromFFIType hs_bindgen_799fe4e6fc639bc0_base
+
+-- | Convert low-ASCII English letters to uppercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'a\' through \'z\' to uppercase.
+--
+--     This function returns the uppercase equivalent of @x@. If a character cannot be converted, or is already uppercase, this function returns @x@.
+--
+--     [Returns]: capitalized version of x, or x if no conversion available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_toupper@, defined at @SDL3\/SDL_stdinc.h 2391:33@
+sDL_toupper
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_toupper = hs_bindgen_799fe4e6fc639bc0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_tolower@
+foreign import ccall safe "hs_bindgen_af600e5bb74004b2"
+  hs_bindgen_af600e5bb74004b2_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_tolower@
+hs_bindgen_af600e5bb74004b2
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_af600e5bb74004b2 =
+  BG.fromFFIType hs_bindgen_af600e5bb74004b2_base
+
+-- | Convert low-ASCII English letters to lowercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to lowercase.
+--
+--     This function returns the lowercase equivalent of @x@. If a character cannot be converted, or is already lowercase, this function returns @x@.
+--
+--     [Returns]: lowercase version of x, or x if no conversion available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_tolower@, defined at @SDL3\/SDL_stdinc.h 2409:33@
+sDL_tolower
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_tolower = hs_bindgen_af600e5bb74004b2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_crc16@
+foreign import ccall safe "hs_bindgen_8b9d7fd6e4874342"
+  hs_bindgen_8b9d7fd6e4874342_base
+    :: BG.Word16
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_crc16@
+hs_bindgen_8b9d7fd6e4874342
+  :: Uint16
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO Uint16
+hs_bindgen_8b9d7fd6e4874342 =
+  BG.fromFFIType hs_bindgen_8b9d7fd6e4874342_base
+
+-- | Calculate a CRC-16 value.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
+--
+--     This function can be called multiple times, to stream data to be checksummed in blocks. Each call must provide the previous CRC-16 return value to be updated with the next block. The first call to this function for a set of blocks should pass in a zero CRC value.
+--
+--     [Returns]: a CRC-16 checksum value of all blocks in the data set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_crc16@, defined at @SDL3\/SDL_stdinc.h 2430:36@
+sDL_crc16
+  :: Uint16
+  -- ^
+  --
+  --           [@crc@]: the current checksum for this data set, or 0 for a new data set.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: a new block of data to add to the checksum.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@len@]: the size, in bytes, of the new block of data.
+  -> IO Uint16
+sDL_crc16 = hs_bindgen_8b9d7fd6e4874342
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_crc32@
+foreign import ccall safe "hs_bindgen_20e1e20820f9c17a"
+  hs_bindgen_20e1e20820f9c17a_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_crc32@
+hs_bindgen_20e1e20820f9c17a
+  :: Uint32
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO Uint32
+hs_bindgen_20e1e20820f9c17a =
+  BG.fromFFIType hs_bindgen_20e1e20820f9c17a_base
+
+-- | Calculate a CRC-32 value.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
+--
+--     This function can be called multiple times, to stream data to be checksummed in blocks. Each call must provide the previous CRC-32 return value to be updated with the next block. The first call to this function for a set of blocks should pass in a zero CRC value.
+--
+--     [Returns]: a CRC-32 checksum value of all blocks in the data set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_crc32@, defined at @SDL3\/SDL_stdinc.h 2451:36@
+sDL_crc32
+  :: Uint32
+  -- ^
+  --
+  --           [@crc@]: the current checksum for this data set, or 0 for a new data set.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: a new block of data to add to the checksum.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@len@]: the size, in bytes, of the new block of data.
+  -> IO Uint32
+sDL_crc32 = hs_bindgen_20e1e20820f9c17a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_murmur3_32@
+foreign import ccall safe "hs_bindgen_e26385eb1b169df1"
+  hs_bindgen_e26385eb1b169df1_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_murmur3_32@
+hs_bindgen_e26385eb1b169df1
+  :: PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> Uint32
+  -> IO Uint32
+hs_bindgen_e26385eb1b169df1 =
+  BG.fromFFIType hs_bindgen_e26385eb1b169df1_base
+
+-- | Calculate a 32-bit MurmurHash3 value for a block of data.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/MurmurHash](https://en.wikipedia.org/wiki/MurmurHash)
+--
+--     A seed may be specified, which changes the final results consistently, but this does not work like SDL_crc16 and SDL_crc32: you can\'t feed a previous result from this function back into itself as the next seed value to calculate a hash in chunks; it won\'t produce the same hash as it would if the same data was provided in a single call.
+--
+--     If you aren\'t sure what to provide for a seed, zero is fine. Murmur3 is not cryptographically secure, so it shouldn\'t be used for hashing top-secret data.
+--
+--     [Returns]: a Murmur3 32-bit hash value.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_murmur3_32@, defined at @SDL3\/SDL_stdinc.h 2477:36@
+sDL_murmur3_32
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be hashed.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@len@]: the size of data, in bytes.
+  -> Uint32
+  -- ^
+  --
+  --           [@seed@]: a value that alters the final hash value.
+  -> IO Uint32
+sDL_murmur3_32 = hs_bindgen_e26385eb1b169df1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_memset4@
+foreign import ccall safe "hs_bindgen_39f43c1520a45f57"
+  hs_bindgen_39f43c1520a45f57_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_memset4@
+hs_bindgen_39f43c1520a45f57
+  :: BG.Ptr BG.Void
+  -> Uint32
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_39f43c1520a45f57 =
+  BG.fromFFIType hs_bindgen_39f43c1520a45f57_base
+
+-- | Initialize all 32-bit words of buffer of memory to a specific value.
+--
+--     This function will set a buffer of @dwords@ 'Uint32' values, pointed to by @dst@, to the value specified in @val@.
+--
+--     Unlike SDL_memset, this sets 32-bit values, not bytes, so it\'s not limited to a range of 0-255.
+--
+--     [Returns]: @dst@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_memset4@, defined at @SDL3\/SDL_stdinc.h 2601:36@
+sDL_memset4
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: the destination memory region. Must not be NULL.
+  -> Uint32
+  -- ^
+  --
+  --           [@val@]: the 'Uint32' value to set.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@dwords@]: the number of 'Uint32' values to set in @dst@.
+  -> IO (BG.Ptr BG.Void)
+sDL_memset4 = hs_bindgen_39f43c1520a45f57
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_memcmp@
+foreign import ccall safe "hs_bindgen_1386d72429f6b9cb"
+  hs_bindgen_1386d72429f6b9cb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_memcmp@
+hs_bindgen_1386d72429f6b9cb
+  :: PtrConst.PtrConst BG.Void
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_1386d72429f6b9cb =
+  BG.fromFFIType hs_bindgen_1386d72429f6b9cb_base
+
+-- | Compare two buffers of memory.
+--
+--     [Returns]: less than zero if s1 is \"less than\" s2, greater than zero if s1 is \"greater than\" s2, and zero if the buffers match exactly for @len@ bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_memcmp@, defined at @SDL3\/SDL_stdinc.h 2683:33@
+sDL_memcmp
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@s1@]: the first buffer to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@s2@]: the second buffer to compare. NULL is not permitted!
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@len@]: the number of bytes to compare between the buffers.
+  -> IO BG.CInt
+sDL_memcmp = hs_bindgen_1386d72429f6b9cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcslen@
+foreign import ccall safe "hs_bindgen_e6c3253fb4b72427"
+  hs_bindgen_e6c3253fb4b72427_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcslen@
+hs_bindgen_e6c3253fb4b72427
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_e6c3253fb4b72427 =
+  BG.fromFFIType hs_bindgen_e6c3253fb4b72427_base
+
+-- | This works exactly like wcslen() but doesn\'t require access to a C runtime.
+--
+--     Counts the number of wchar_t values in @wstr@, excluding the null terminator.
+--
+--     Like SDL_strlen only counts bytes and not codepoints in a UTF-8 string, this counts wchar_t values in a string, even if the string\'s encoding is of variable width, like UTF-16.
+--
+--     Also be aware that wchar_t is different sizes on different platforms (4 bytes on Linux, 2 on Windows, etc).
+--
+--     [Returns]: the length (in wchar_t values, excluding the null terminator) of @wstr@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcsnlen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_wcslen@, defined at @SDL3\/SDL_stdinc.h 2710:36@
+sDL_wcslen
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@wstr@]: The null-terminated wide string to read. Must not be NULL.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_wcslen = hs_bindgen_e6c3253fb4b72427
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsnlen@
+foreign import ccall safe "hs_bindgen_da04478d43043c90"
+  hs_bindgen_da04478d43043c90_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsnlen@
+hs_bindgen_da04478d43043c90
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_da04478d43043c90 =
+  BG.fromFFIType hs_bindgen_da04478d43043c90_base
+
+-- | This works exactly like wcsnlen() but doesn\'t require access to a C runtime.
+--
+--     Counts up to a maximum of @maxlen@ wchar_t values in @wstr@, excluding the null terminator.
+--
+--     Like SDL_strnlen only counts bytes and not codepoints in a UTF-8 string, this counts wchar_t values in a string, even if the string\'s encoding is of variable width, like UTF-16.
+--
+--     Also be aware that wchar_t is different sizes on different platforms (4 bytes on Linux, 2 on Windows, etc).
+--
+--     Also, @maxlen@ is a count of wide characters, not bytes!
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of @wstr@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcslen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_wcsnlen@, defined at @SDL3\/SDL_stdinc.h 2741:36@
+sDL_wcsnlen
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@wstr@]: The null-terminated wide string to read. Must not be NULL.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The maximum amount of wide characters to count.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_wcsnlen = hs_bindgen_da04478d43043c90
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcslcpy@
+foreign import ccall safe "hs_bindgen_82a9094f0d522cdf"
+  hs_bindgen_82a9094f0d522cdf_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcslcpy@
+hs_bindgen_82a9094f0d522cdf
+  :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_82a9094f0d522cdf =
+  BG.fromFFIType hs_bindgen_82a9094f0d522cdf_base
+
+-- | Copy a wide string.
+--
+--     This function copies @maxlen@ - 1 wide characters from @src@ to @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ is 0, no wide characters are copied and no null terminator is written.
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcslcat'
+--
+--     [C declaration]: @SDL_wcslcpy@, defined at @SDL3\/SDL_stdinc.h 2768:36@
+sDL_wcslcpy
+  :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@src@]: The null-terminated wide string to copy. Must not be NULL, and must not overlap with @dst@.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The length (in wide characters) of the destination buffer.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_wcslcpy = hs_bindgen_82a9094f0d522cdf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcslcat@
+foreign import ccall safe "hs_bindgen_c85ef13eabbd96dd"
+  hs_bindgen_c85ef13eabbd96dd_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcslcat@
+hs_bindgen_c85ef13eabbd96dd
+  :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_c85ef13eabbd96dd =
+  BG.fromFFIType hs_bindgen_c85ef13eabbd96dd_base
+
+-- | Concatenate wide strings.
+--
+--     This function appends up to @maxlen@ - SDL_wcslen(dst) - 1 wide characters from @src@ to the end of the wide string in @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ - SDL_wcslen(dst) - 1 is less than or equal to 0, then @dst@ is unmodified.
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of the string in @dst@ plus the length of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcslcpy'
+--
+--     [C declaration]: @SDL_wcslcat@, defined at @SDL3\/SDL_stdinc.h 2797:36@
+sDL_wcslcat
+  :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer already containing the first null-terminated wide string. Must not be NULL and must not overlap with @src@.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@src@]: The second null-terminated wide string. Must not be NULL, and must not overlap with @dst@.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The length (in wide characters) of the destination buffer.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_wcslcat = hs_bindgen_c85ef13eabbd96dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsdup@
+foreign import ccall safe "hs_bindgen_9a5bf9db9506735d"
+  hs_bindgen_9a5bf9db9506735d_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsdup@
+hs_bindgen_9a5bf9db9506735d
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+hs_bindgen_9a5bf9db9506735d =
+  BG.fromFFIType hs_bindgen_9a5bf9db9506735d_base
+
+-- | Allocate a copy of a wide string.
+--
+--     This allocates enough space for a null-terminated copy of @wstr@, using SDL_malloc, and then makes a copy of the string into this space.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated wide string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsdup@, defined at @SDL3\/SDL_stdinc.h 2815:39@
+sDL_wcsdup
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@wstr@]: the string to copy.
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+sDL_wcsdup = hs_bindgen_9a5bf9db9506735d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsstr@
+foreign import ccall safe "hs_bindgen_8807485ad58a476c"
+  hs_bindgen_8807485ad58a476c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsstr@
+hs_bindgen_8807485ad58a476c
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+hs_bindgen_8807485ad58a476c =
+  BG.fromFFIType hs_bindgen_8807485ad58a476c_base
+
+-- | Search a wide string for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string.
+--
+--     Note that this looks for strings of /wide characters/, not /codepoints/, so it\'s legal to search for malformed and incomplete UTF-16 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsstr@, defined at @SDL3\/SDL_stdinc.h 2835:39@
+sDL_wcsstr
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@haystack@]: the wide string to search. Must not be NULL.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@needle@]: the wide string to search for. Must not be NULL.
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+sDL_wcsstr = hs_bindgen_8807485ad58a476c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsnstr@
+foreign import ccall safe "hs_bindgen_0f95369992d6076d"
+  hs_bindgen_0f95369992d6076d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsnstr@
+hs_bindgen_0f95369992d6076d
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+hs_bindgen_0f95369992d6076d =
+  BG.fromFFIType hs_bindgen_0f95369992d6076d_base
+
+-- | Search a wide string, up to n wide chars, for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator value to end the string, or @maxlen@ wide character have been examined. It is possible to use this function on a wide string without a null terminator.
+--
+--     Note that this looks for strings of /wide characters/, not /codepoints/, so it\'s legal to search for malformed and incomplete UTF-16 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsnstr@, defined at @SDL3\/SDL_stdinc.h 2860:39@
+sDL_wcsnstr
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@haystack@]: the wide string to search. Must not be NULL.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@needle@]: the wide string to search for. Must not be NULL.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of wide characters to search in @haystack@.
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+sDL_wcsnstr = hs_bindgen_0f95369992d6076d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcscmp@
+foreign import ccall safe "hs_bindgen_a56659eded1129eb"
+  hs_bindgen_a56659eded1129eb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcscmp@
+hs_bindgen_a56659eded1129eb
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO BG.CInt
+hs_bindgen_a56659eded1129eb =
+  BG.fromFFIType hs_bindgen_a56659eded1129eb_base
+
+-- | Compare two null-terminated wide strings.
+--
+--     This only compares wchar_t values until it hits a null-terminating character; it does not care if the string is well-formed UTF-16 (or UTF-32, depending on your platform\'s wchar_t size), or uses valid Unicode values.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcscmp@, defined at @SDL3\/SDL_stdinc.h 2879:33@
+sDL_wcscmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.CInt
+sDL_wcscmp = hs_bindgen_a56659eded1129eb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsncmp@
+foreign import ccall safe "hs_bindgen_f249ec61a8d5978a"
+  hs_bindgen_f249ec61a8d5978a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsncmp@
+hs_bindgen_f249ec61a8d5978a
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_f249ec61a8d5978a =
+  BG.fromFFIType hs_bindgen_f249ec61a8d5978a_base
+
+-- | Compare two wide strings up to a number of wchar_t values.
+--
+--     This only compares wchar_t values; it does not care if the string is well-formed UTF-16 (or UTF-32, depending on your platform\'s wchar_t size), or uses valid Unicode values.
+--
+--     Note that while this function is intended to be used with UTF-16 (or UTF-32, depending on your platform\'s definition of wchar_t), it is comparing raw wchar_t values and not Unicode codepoints: @maxlen@ specifies a wchar_t limit! If the limit lands in the middle of a multi-wchar UTF-16 sequence, it will only compare a portion of the final character.
+--
+--     @maxlen@ specifies a maximum number of wchar_t to compare; if the strings match to this number of wide chars (or both have matched to a null-terminator character before this count), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsncmp@, defined at @SDL3\/SDL_stdinc.h 2910:33@
+sDL_wcsncmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of wchar_t to compare.
+  -> IO BG.CInt
+sDL_wcsncmp = hs_bindgen_f249ec61a8d5978a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcscasecmp@
+foreign import ccall safe "hs_bindgen_0e487d7f98097b0d"
+  hs_bindgen_0e487d7f98097b0d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcscasecmp@
+hs_bindgen_0e487d7f98097b0d
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO BG.CInt
+hs_bindgen_0e487d7f98097b0d =
+  BG.fromFFIType hs_bindgen_0e487d7f98097b0d_base
+
+-- | Compare two null-terminated wide strings, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Depending on your platform, \"wchar_t\" might be 2 bytes, and expected to be UTF-16 encoded (like Windows), or 4 bytes in UTF-32 format. Since this handles Unicode, it expects the string to be well-formed and not a null-terminated string of arbitrary bytes. Characters that are not valid UTF-16 (or UTF-32) are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcscasecmp@, defined at @SDL3\/SDL_stdinc.h 2940:33@
+sDL_wcscasecmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.CInt
+sDL_wcscasecmp = hs_bindgen_0e487d7f98097b0d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsncasecmp@
+foreign import ccall safe "hs_bindgen_9a4ad44438974867"
+  hs_bindgen_9a4ad44438974867_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_wcsncasecmp@
+hs_bindgen_9a4ad44438974867
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_9a4ad44438974867 =
+  BG.fromFFIType hs_bindgen_9a4ad44438974867_base
+
+-- | Compare two wide strings, case-insensitively, up to a number of wchar_t.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Depending on your platform, \"wchar_t\" might be 2 bytes, and expected to be UTF-16 encoded (like Windows), or 4 bytes in UTF-32 format. Since this handles Unicode, it expects the string to be well-formed and not a null-terminated string of arbitrary bytes. Characters that are not valid UTF-16 (or UTF-32) are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     Note that while this function might deal with variable-sized characters, @maxlen@ specifies a /wchar/ limit! If the limit lands in the middle of a multi-byte UTF-16 sequence, it may convert a portion of the final character to one or more Unicode character U+FFFD (REPLACEMENT CHARACTER) so as not to overflow a buffer.
+--
+--     @maxlen@ specifies a maximum number of wchar_t values to compare; if the strings match to this number of wchar_t (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsncasecmp@, defined at @SDL3\/SDL_stdinc.h 2982:33@
+sDL_wcsncasecmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of wchar_t values to compare.
+  -> IO BG.CInt
+sDL_wcsncasecmp = hs_bindgen_9a4ad44438974867
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strlen@
+foreign import ccall safe "hs_bindgen_574becd3bb71e7b9"
+  hs_bindgen_574becd3bb71e7b9_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strlen@
+hs_bindgen_574becd3bb71e7b9
+  :: PtrConst.PtrConst BG.CChar
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_574becd3bb71e7b9 =
+  BG.fromFFIType hs_bindgen_574becd3bb71e7b9_base
+
+-- | This works exactly like strlen() but doesn\'t require access to a C runtime.
+--
+--     Counts the bytes in @str@, excluding the null terminator.
+--
+--     If you need the length of a UTF-8 string, consider using @SDL_utf8strlen()@.
+--
+--     [Returns]: the length (in bytes, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strnlen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_strlen@, defined at @SDL3\/SDL_stdinc.h 3029:36@
+sDL_strlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_strlen = hs_bindgen_574becd3bb71e7b9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strnlen@
+foreign import ccall safe "hs_bindgen_9232c1cbf65df9e5"
+  hs_bindgen_9232c1cbf65df9e5_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strnlen@
+hs_bindgen_9232c1cbf65df9e5
+  :: PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_9232c1cbf65df9e5 =
+  BG.fromFFIType hs_bindgen_9232c1cbf65df9e5_base
+
+-- | This works exactly like strnlen() but doesn\'t require access to a C runtime.
+--
+--     Counts up to a maximum of @maxlen@ bytes in @str@, excluding the null terminator.
+--
+--     If you need the length of a UTF-8 string, consider using @SDL_utf8strnlen()@.
+--
+--     [Returns]: the length (in bytes, excluding the null terminator) of @src@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_strnlen@, defined at @SDL3\/SDL_stdinc.h 3053:36@
+sDL_strnlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The maximum amount of bytes to count.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_strnlen = hs_bindgen_9232c1cbf65df9e5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strlcpy@
+foreign import ccall safe "hs_bindgen_1a460cf112b7fd68"
+  hs_bindgen_1a460cf112b7fd68_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strlcpy@
+hs_bindgen_1a460cf112b7fd68
+  :: BG.Ptr BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_1a460cf112b7fd68 =
+  BG.fromFFIType hs_bindgen_1a460cf112b7fd68_base
+
+-- | Copy a string.
+--
+--     This function copies up to @maxlen@ - 1 characters from @src@ to @dst@, then appends a null terminator.
+--
+--     If @maxlen@ is 0, no characters are copied and no null terminator is written.
+--
+--     If you want to copy an UTF-8 string but need to ensure that multi-byte sequences are not truncated, consider using @SDL_utf8strlcpy()@.
+--
+--     [Returns]: the length (in characters, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlcat', 'sDL_utf8strlcpy'
+--
+--     [C declaration]: @SDL_strlcpy@, defined at @SDL3\/SDL_stdinc.h 3082:36@
+sDL_strlcpy
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@src@]: The null-terminated string to copy. Must not be NULL, and must not overlap with @dst@.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The length (in characters) of the destination buffer.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_strlcpy = hs_bindgen_1a460cf112b7fd68
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_utf8strlcpy@
+foreign import ccall safe "hs_bindgen_10b5c948dc68c882"
+  hs_bindgen_10b5c948dc68c882_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_utf8strlcpy@
+hs_bindgen_10b5c948dc68c882
+  :: BG.Ptr BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_10b5c948dc68c882 =
+  BG.fromFFIType hs_bindgen_10b5c948dc68c882_base
+
+-- | Copy an UTF-8 string.
+--
+--     This function copies up to @dst_bytes@ - 1 bytes from @src@ to @dst@ while also ensuring that the string written to @dst@ does not end in a truncated multi-byte sequence. Finally, it appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     Note that unlike @SDL_strlcpy()@, this function returns the number of bytes written, not the length of @src@.
+--
+--     [Returns]: the number of bytes written, excluding the null terminator.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlcpy'
+--
+--     [C declaration]: @SDL_utf8strlcpy@, defined at @SDL3\/SDL_stdinc.h 3110:36@
+sDL_utf8strlcpy
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@src@]: The null-terminated UTF-8 string to copy. Must not be NULL, and must not overlap with @dst@.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@dst_bytes@]: The length (in bytes) of the destination buffer. Must not be 0.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_utf8strlcpy = hs_bindgen_10b5c948dc68c882
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strlcat@
+foreign import ccall safe "hs_bindgen_8132fc050b3dda62"
+  hs_bindgen_8132fc050b3dda62_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strlcat@
+hs_bindgen_8132fc050b3dda62
+  :: BG.Ptr BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_8132fc050b3dda62 =
+  BG.fromFFIType hs_bindgen_8132fc050b3dda62_base
+
+-- | Concatenate strings.
+--
+--     This function appends up to @maxlen@ - SDL_strlen(dst) - 1 characters from @src@ to the end of the string in @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ - SDL_strlen(dst) - 1 is less than or equal to 0, then @dst@ is unmodified.
+--
+--     [Returns]: the length (in characters, excluding the null terminator) of the string in @dst@ plus the length of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlcpy'
+--
+--     [C declaration]: @SDL_strlcat@, defined at @SDL3\/SDL_stdinc.h 3138:36@
+sDL_strlcat
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer already containing the first null-terminated string. Must not be NULL and must not overlap with @src@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@src@]: The second null-terminated string. Must not be NULL, and must not overlap with @dst@.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The length (in characters) of the destination buffer.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_strlcat = hs_bindgen_8132fc050b3dda62
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strdup@
+foreign import ccall safe "hs_bindgen_e91dd28c0e034753"
+  hs_bindgen_e91dd28c0e034753_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strdup@
+hs_bindgen_e91dd28c0e034753
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_e91dd28c0e034753 =
+  BG.fromFFIType hs_bindgen_e91dd28c0e034753_base
+
+-- | Allocate a copy of a string.
+--
+--     This allocates enough space for a null-terminated copy of @str@, using SDL_malloc, and then makes a copy of the string into this space.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strdup@, defined at @SDL3\/SDL_stdinc.h 3156:47@
+sDL_strdup
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to copy.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strdup = hs_bindgen_e91dd28c0e034753
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strndup@
+foreign import ccall safe "hs_bindgen_9f484a433e6fd1be"
+  hs_bindgen_9f484a433e6fd1be_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strndup@
+hs_bindgen_9f484a433e6fd1be
+  :: PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_9f484a433e6fd1be =
+  BG.fromFFIType hs_bindgen_9f484a433e6fd1be_base
+
+-- | Allocate a copy of a string, up to n characters.
+--
+--     This allocates enough space for a null-terminated copy of @str@, up to @maxlen@ bytes, using SDL_malloc, and then makes a copy of the string into this space.
+--
+--     If the string is longer than @maxlen@ bytes, the returned string will be @maxlen@ bytes long, plus a null-terminator character that isn\'t included in the count.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strndup@, defined at @SDL3\/SDL_stdinc.h 3181:47@
+sDL_strndup
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to copy.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum length of the copied string, not counting the null-terminator character.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strndup = hs_bindgen_9f484a433e6fd1be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strrev@
+foreign import ccall safe "hs_bindgen_fd83e6da8cdd54dc"
+  hs_bindgen_fd83e6da8cdd54dc_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strrev@
+hs_bindgen_fd83e6da8cdd54dc
+  :: BG.Ptr BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_fd83e6da8cdd54dc =
+  BG.fromFFIType hs_bindgen_fd83e6da8cdd54dc_base
+
+-- | Reverse a string\'s contents.
+--
+--     This reverses a null-terminated string in-place. Only the content of the string is reversed; the null-terminator character remains at the end of the reversed string.
+--
+--     __WARNING__: This function reverses the /bytes/ of the string, not the codepoints. If @str@ is a UTF-8 string with Unicode codepoints > 127, this will ruin the string data. You should only use this function on strings that are completely comprised of low ASCII characters.
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strrev@, defined at @SDL3\/SDL_stdinc.h 3202:36@
+sDL_strrev
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to reverse.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strrev = hs_bindgen_fd83e6da8cdd54dc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strupr@
+foreign import ccall safe "hs_bindgen_4821ca9fe328d7f0"
+  hs_bindgen_4821ca9fe328d7f0_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strupr@
+hs_bindgen_4821ca9fe328d7f0
+  :: BG.Ptr BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_4821ca9fe328d7f0 =
+  BG.fromFFIType hs_bindgen_4821ca9fe328d7f0_base
+
+-- | Convert a string to uppercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to uppercase.
+--
+--     This function operates on a null-terminated string of bytes even if it is malformed UTF-8! and converts ASCII characters \'a\' through \'z\' to their uppercase equivalents in-place, returning the original @str@ pointer.
+--
+--     [Returns]: the @str@ pointer passed into this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlwr'
+--
+--     [C declaration]: @SDL_strupr@, defined at @SDL3\/SDL_stdinc.h 3223:36@
+sDL_strupr
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to convert in-place. Can not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strupr = hs_bindgen_4821ca9fe328d7f0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strlwr@
+foreign import ccall safe "hs_bindgen_b313d67572ea455e"
+  hs_bindgen_b313d67572ea455e_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strlwr@
+hs_bindgen_b313d67572ea455e
+  :: BG.Ptr BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_b313d67572ea455e =
+  BG.fromFFIType hs_bindgen_b313d67572ea455e_base
+
+-- | Convert a string to lowercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to lowercase.
+--
+--     This function operates on a null-terminated string of bytes even if it is malformed UTF-8! and converts ASCII characters \'A\' through \'Z\' to their lowercase equivalents in-place, returning the original @str@ pointer.
+--
+--     [Returns]: the @str@ pointer passed into this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strupr'
+--
+--     [C declaration]: @SDL_strlwr@, defined at @SDL3\/SDL_stdinc.h 3244:36@
+sDL_strlwr
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to convert in-place. Can not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strlwr = hs_bindgen_b313d67572ea455e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strchr@
+foreign import ccall safe "hs_bindgen_9b8b80f67620d0c0"
+  hs_bindgen_9b8b80f67620d0c0_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strchr@
+hs_bindgen_9b8b80f67620d0c0
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_9b8b80f67620d0c0 =
+  BG.fromFFIType hs_bindgen_9b8b80f67620d0c0_base
+
+-- | Search a string for the first instance of a specific byte.
+--
+--     The search ends once it finds the requested byte value, or a null terminator byte to end the string.
+--
+--     Note that this looks for /bytes/, not /characters/, so you cannot match against a Unicode codepoint > 255, regardless of character encoding.
+--
+--     [Returns]: a pointer to the first instance of @c@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strchr@, defined at @SDL3\/SDL_stdinc.h 3264:36@
+sDL_strchr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to search. Must not be NULL.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@c@]: the byte value to search for.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strchr = hs_bindgen_9b8b80f67620d0c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strrchr@
+foreign import ccall safe "hs_bindgen_61eb1646e2706ec9"
+  hs_bindgen_61eb1646e2706ec9_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strrchr@
+hs_bindgen_61eb1646e2706ec9
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_61eb1646e2706ec9 =
+  BG.fromFFIType hs_bindgen_61eb1646e2706ec9_base
+
+-- | Search a string for the last instance of a specific byte.
+--
+--     The search must go until it finds a null terminator byte to end the string.
+--
+--     Note that this looks for /bytes/, not /characters/, so you cannot match against a Unicode codepoint > 255, regardless of character encoding.
+--
+--     [Returns]: a pointer to the last instance of @c@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strrchr@, defined at @SDL3\/SDL_stdinc.h 3283:36@
+sDL_strrchr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to search. Must not be NULL.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@c@]: the byte value to search for.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strrchr = hs_bindgen_61eb1646e2706ec9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strstr@
+foreign import ccall safe "hs_bindgen_09dae8bc6d27bfa7"
+  hs_bindgen_09dae8bc6d27bfa7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strstr@
+hs_bindgen_09dae8bc6d27bfa7
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_09dae8bc6d27bfa7 =
+  BG.fromFFIType hs_bindgen_09dae8bc6d27bfa7_base
+
+-- | Search a string for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string.
+--
+--     Note that this looks for strings of /bytes/, not /characters/, so it\'s legal to search for malformed and incomplete UTF-8 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strstr@, defined at @SDL3\/SDL_stdinc.h 3303:36@
+sDL_strstr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@haystack@]: the string to search. Must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@needle@]: the string to search for. Must not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strstr = hs_bindgen_09dae8bc6d27bfa7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strnstr@
+foreign import ccall safe "hs_bindgen_b253d6195ad29db6"
+  hs_bindgen_b253d6195ad29db6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strnstr@
+hs_bindgen_b253d6195ad29db6
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_b253d6195ad29db6 =
+  BG.fromFFIType hs_bindgen_b253d6195ad29db6_base
+
+-- | Search a string, up to n bytes, for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string, or @maxlen@ bytes have been examined. It is possible to use this function on a string without a null terminator.
+--
+--     Note that this looks for strings of /bytes/, not /characters/, so it\'s legal to search for malformed and incomplete UTF-8 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strnstr@, defined at @SDL3\/SDL_stdinc.h 3326:36@
+sDL_strnstr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@haystack@]: the string to search. Must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@needle@]: the string to search for. Must not be NULL.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of bytes to search in @haystack@.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strnstr = hs_bindgen_b253d6195ad29db6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strcasestr@
+foreign import ccall safe "hs_bindgen_845c9ada7f0145b4"
+  hs_bindgen_845c9ada7f0145b4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strcasestr@
+hs_bindgen_845c9ada7f0145b4
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_845c9ada7f0145b4 =
+  BG.fromFFIType hs_bindgen_845c9ada7f0145b4_base
+
+-- | Search a UTF-8 string for the first instance of a specific substring, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strcasestr@, defined at @SDL3\/SDL_stdinc.h 3354:36@
+sDL_strcasestr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@haystack@]: the string to search. Must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@needle@]: the string to search for. Must not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strcasestr = hs_bindgen_845c9ada7f0145b4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strtok_r@
+foreign import ccall safe "hs_bindgen_92aad5310bed80bf"
+  hs_bindgen_92aad5310bed80bf_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strtok_r@
+hs_bindgen_92aad5310bed80bf
+  :: BG.Ptr BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_92aad5310bed80bf =
+  BG.fromFFIType hs_bindgen_92aad5310bed80bf_base
+
+-- | This works exactly like strtok_r() but doesn\'t require access to a C runtime.
+--
+--     Break a string up into a series of tokens.
+--
+--     To start tokenizing a new string, @str@ should be the non-NULL address of the string to start tokenizing. Future calls to get the next token from the same string should specify a NULL.
+--
+--     Note that this function will overwrite pieces of @str@ with null chars to split it into tokens. This function cannot be used with const\/read-only strings!
+--
+--     @saveptr@ just needs to point to a @char *@ that can be overwritten; SDL will use this to save tokenizing state between calls. It is initialized if @str@ is non-NULL, and used to resume tokenizing when @str@ is NULL.
+--
+--     [Returns]: A pointer to the next token, or NULL if no tokens remain.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strtok_r@, defined at @SDL3\/SDL_stdinc.h 3383:36@
+sDL_strtok_r
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to tokenize, or NULL to continue tokenizing.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@delim@]: the delimiter string that separates tokens.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@saveptr@]: pointer to a char *, used for ongoing state.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strtok_r = hs_bindgen_92aad5310bed80bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_utf8strlen@
+foreign import ccall safe "hs_bindgen_2fe9c3d14ead61fa"
+  hs_bindgen_2fe9c3d14ead61fa_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_utf8strlen@
+hs_bindgen_2fe9c3d14ead61fa
+  :: PtrConst.PtrConst BG.CChar
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_2fe9c3d14ead61fa =
+  BG.fromFFIType hs_bindgen_2fe9c3d14ead61fa_base
+
+-- | Count the number of codepoints in a UTF-8 string.
+--
+--     Counts the /codepoints/, not /bytes/, in @str@, excluding the null terminator.
+--
+--     If you need to count the bytes in a string instead, consider using @SDL_strlen()@.
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the count by several replacement characters.
+--
+--     [Returns]: The length (in codepoints, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_utf8strnlen', 'sDL_strlen'
+--
+--     [C declaration]: @SDL_utf8strlen@, defined at @SDL3\/SDL_stdinc.h 3411:36@
+sDL_utf8strlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated UTF-8 string to read. Must not be NULL.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_utf8strlen = hs_bindgen_2fe9c3d14ead61fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_utf8strnlen@
+foreign import ccall safe "hs_bindgen_7e1dc736bb92cf02"
+  hs_bindgen_7e1dc736bb92cf02_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_utf8strnlen@
+hs_bindgen_7e1dc736bb92cf02
+  :: PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_7e1dc736bb92cf02 =
+  BG.fromFFIType hs_bindgen_7e1dc736bb92cf02_base
+
+-- | Count the number of codepoints in a UTF-8 string, up to n bytes.
+--
+--     Counts the /codepoints/, not /bytes/, in @str@, excluding the null terminator.
+--
+--     If you need to count the bytes in a string instead, consider using @SDL_strnlen()@.
+--
+--     The counting stops at @bytes@ bytes (not codepoints!). This seems counterintuitive, but makes it easy to express the total size of the string\'s buffer.
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the count by several replacement characters.
+--
+--     [Returns]: The length (in codepoints, excluding the null terminator) of @src@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_utf8strlen', 'sDL_strnlen'
+--
+--     [C declaration]: @SDL_utf8strnlen@, defined at @SDL3\/SDL_stdinc.h 3444:36@
+sDL_utf8strnlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated UTF-8 string to read. Must not be NULL.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@bytes@]: The maximum amount of bytes to count.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_utf8strnlen = hs_bindgen_7e1dc736bb92cf02
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_itoa@
+foreign import ccall safe "hs_bindgen_5e87f4eb430750ff"
+  hs_bindgen_5e87f4eb430750ff_base
+    :: BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_itoa@
+hs_bindgen_5e87f4eb430750ff
+  :: BG.CInt
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_5e87f4eb430750ff =
+  BG.fromFFIType hs_bindgen_5e87f4eb430750ff_base
+
+-- | Convert an integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget possible negative signs, null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_uitoa', @SDL_ltoa@, 'sDL_lltoa'
+--
+--     [C declaration]: @SDL_itoa@, defined at @SDL3\/SDL_stdinc.h 3472:36@
+sDL_itoa
+  :: BG.CInt
+  -- ^
+  --
+  --           [@value@]: the integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+sDL_itoa = hs_bindgen_5e87f4eb430750ff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_uitoa@
+foreign import ccall safe "hs_bindgen_6593301ad3b87e96"
+  hs_bindgen_6593301ad3b87e96_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_uitoa@
+hs_bindgen_6593301ad3b87e96
+  :: BG.CUInt
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_6593301ad3b87e96 =
+  BG.fromFFIType hs_bindgen_6593301ad3b87e96_base
+
+-- | Convert an unsigned integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_itoa', @SDL_ultoa@, 'sDL_ulltoa'
+--
+--     [C declaration]: @SDL_uitoa@, defined at @SDL3\/SDL_stdinc.h 3500:36@
+sDL_uitoa
+  :: BG.CUInt
+  -- ^
+  --
+  --           [@value@]: the unsigned integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+sDL_uitoa = hs_bindgen_6593301ad3b87e96
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_lltoa@
+foreign import ccall safe "hs_bindgen_49dab071ddd94418"
+  hs_bindgen_49dab071ddd94418_base
+    :: BG.Int64
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_lltoa@
+hs_bindgen_49dab071ddd94418
+  :: BG.CLLong
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_49dab071ddd94418 =
+  BG.fromFFIType hs_bindgen_49dab071ddd94418_base
+
+-- | Convert a long long integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget possible negative signs, null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ulltoa', 'sDL_itoa', @SDL_ltoa@
+--
+--     [C declaration]: @SDL_lltoa@, defined at @SDL3\/SDL_stdinc.h 3586:36@
+sDL_lltoa
+  :: BG.CLLong
+  -- ^
+  --
+  --           [@value@]: the long long integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+sDL_lltoa = hs_bindgen_49dab071ddd94418
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_ulltoa@
+foreign import ccall safe "hs_bindgen_8c172a64279b6c99"
+  hs_bindgen_8c172a64279b6c99_base
+    :: BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_ulltoa@
+hs_bindgen_8c172a64279b6c99
+  :: BG.CULLong
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_8c172a64279b6c99 =
+  BG.fromFFIType hs_bindgen_8c172a64279b6c99_base
+
+-- | Convert an unsigned long long integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_lltoa', 'sDL_uitoa', @SDL_ultoa@
+--
+--     [C declaration]: @SDL_ulltoa@, defined at @SDL3\/SDL_stdinc.h 3614:36@
+sDL_ulltoa
+  :: BG.CULLong
+  -- ^
+  --
+  --           [@value@]: the unsigned long long integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+sDL_ulltoa = hs_bindgen_8c172a64279b6c99
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atoi@
+foreign import ccall safe "hs_bindgen_7ec5dbb16b1ec441"
+  hs_bindgen_7ec5dbb16b1ec441_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atoi@
+hs_bindgen_7ec5dbb16b1ec441
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_7ec5dbb16b1ec441 =
+  BG.fromFFIType hs_bindgen_7ec5dbb16b1ec441_base
+
+-- | Parse an @int@ from a string.
+--
+--     The result of calling @SDL_atoi(str)@ is equivalent to @(int)SDL_strtol(str, NULL, 10)@.
+--
+--     [Returns]: the parsed @int@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atof', @SDL_strtol@, @SDL_strtoul@, 'sDL_strtoll', 'sDL_strtoull', 'sDL_strtod', 'sDL_itoa'
+--
+--     [C declaration]: @SDL_atoi@, defined at @SDL3\/SDL_stdinc.h 3638:33@
+sDL_atoi
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> IO BG.CInt
+sDL_atoi = hs_bindgen_7ec5dbb16b1ec441
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atof@
+foreign import ccall safe "hs_bindgen_3da67c3a67185baf"
+  hs_bindgen_3da67c3a67185baf_base
+    :: BG.Ptr BG.Void
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atof@
+hs_bindgen_3da67c3a67185baf
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CDouble
+hs_bindgen_3da67c3a67185baf =
+  BG.fromFFIType hs_bindgen_3da67c3a67185baf_base
+
+-- | Parse a @double@ from a string.
+--
+--     The result of calling @SDL_atof(str)@ is equivalent to @SDL_strtod(str, NULL)@.
+--
+--     [Returns]: the parsed @double@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', @SDL_strtol@, @SDL_strtoul@, 'sDL_strtoll', 'sDL_strtoull', 'sDL_strtod'
+--
+--     [C declaration]: @SDL_atof@, defined at @SDL3\/SDL_stdinc.h 3660:36@
+sDL_atof
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> IO BG.CDouble
+sDL_atof = hs_bindgen_3da67c3a67185baf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strtoll@
+foreign import ccall safe "hs_bindgen_2d4f949f38ae668c"
+  hs_bindgen_2d4f949f38ae668c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strtoll@
+hs_bindgen_2d4f949f38ae668c
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -> BG.CInt
+  -> IO BG.CLLong
+hs_bindgen_2d4f949f38ae668c =
+  BG.fromFFIType hs_bindgen_2d4f949f38ae668c_base
+
+-- | Parse a @long long@ from a string.
+--
+--     If @str@ starts with whitespace, then those whitespace characters are skipped before attempting to parse the number.
+--
+--     If the parsed number does not fit inside a @long long@, the result is clamped to the minimum and maximum representable @long long@ values.
+--
+--     [Returns]: the parsed @long long@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', 'sDL_atof', @SDL_strtol@, @SDL_strtoul@, 'sDL_strtoull', 'sDL_strtod', 'sDL_lltoa'
+--
+--     [C declaration]: @SDL_strtoll@, defined at @SDL3\/SDL_stdinc.h 3762:39@
+sDL_strtoll
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@endp@]: If not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@base@]: The base of the integer to read. Supported values are 0 and 2 to 36 inclusive. If 0, the base will be inferred from the number\'s prefix (0x for hexadecimal, 0 for octal, decimal otherwise).
+  -> IO BG.CLLong
+sDL_strtoll = hs_bindgen_2d4f949f38ae668c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strtoull@
+foreign import ccall safe "hs_bindgen_af470a839fcf6fbd"
+  hs_bindgen_af470a839fcf6fbd_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strtoull@
+hs_bindgen_af470a839fcf6fbd
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -> BG.CInt
+  -> IO BG.CULLong
+hs_bindgen_af470a839fcf6fbd =
+  BG.fromFFIType hs_bindgen_af470a839fcf6fbd_base
+
+-- | Parse an @unsigned long long@ from a string.
+--
+--     If @str@ starts with whitespace, then those whitespace characters are skipped before attempting to parse the number.
+--
+--     If the parsed number does not fit inside an @unsigned long long@, the result is clamped to the maximum representable @unsigned long long@ value.
+--
+--     [Returns]: the parsed @unsigned long long@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', 'sDL_atof', @SDL_strtol@, 'sDL_strtoll', @SDL_strtoul@, 'sDL_strtod', 'sDL_ulltoa'
+--
+--     [C declaration]: @SDL_strtoull@, defined at @SDL3\/SDL_stdinc.h 3796:48@
+sDL_strtoull
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@endp@]: If not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@base@]: The base of the integer to read. Supported values are 0 and 2 to 36 inclusive. If 0, the base will be inferred from the number\'s prefix (0x for hexadecimal, 0 for octal, decimal otherwise).
+  -> IO BG.CULLong
+sDL_strtoull = hs_bindgen_af470a839fcf6fbd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strtod@
+foreign import ccall safe "hs_bindgen_717e481bd213c968"
+  hs_bindgen_717e481bd213c968_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strtod@
+hs_bindgen_717e481bd213c968
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -> IO BG.CDouble
+hs_bindgen_717e481bd213c968 =
+  BG.fromFFIType hs_bindgen_717e481bd213c968_base
+
+-- | Parse a @double@ from a string.
+--
+--     This function makes fewer guarantees than the C runtime @strtod@:
+--
+--     * Only decimal notation is guaranteed to be supported. The handling of scientific and hexadecimal notation is unspecified.
+--
+--     * Whether or not INF and NAN can be parsed is unspecified.
+--
+--     * The precision of the result is unspecified.
+--
+--     [Returns]: the parsed @double@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', 'sDL_atof', @SDL_strtol@, 'sDL_strtoll', @SDL_strtoul@, 'sDL_strtoull'
+--
+--     [C declaration]: @SDL_strtod@, defined at @SDL3\/SDL_stdinc.h 3826:36@
+sDL_strtod
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the null-terminated string to read. Must not be NULL.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@endp@]: if not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+  -> IO BG.CDouble
+sDL_strtod = hs_bindgen_717e481bd213c968
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strcmp@
+foreign import ccall safe "hs_bindgen_114ae5114f0f2f61"
+  hs_bindgen_114ae5114f0f2f61_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strcmp@
+hs_bindgen_114ae5114f0f2f61
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_114ae5114f0f2f61 =
+  BG.fromFFIType hs_bindgen_114ae5114f0f2f61_base
+
+-- | Compare two null-terminated UTF-8 strings.
+--
+--     Due to the nature of UTF-8 encoding, this will work with Unicode strings, since effectively this function just compares bytes until it hits a null-terminating character. Also due to the nature of UTF-8, this can be used with @SDL_qsort()@ to put strings in (roughly) alphabetical order.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strcmp@, defined at @SDL3\/SDL_stdinc.h 3846:33@
+sDL_strcmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.CInt
+sDL_strcmp = hs_bindgen_114ae5114f0f2f61
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strncmp@
+foreign import ccall safe "hs_bindgen_07f412ca6ac64bca"
+  hs_bindgen_07f412ca6ac64bca_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strncmp@
+hs_bindgen_07f412ca6ac64bca
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_07f412ca6ac64bca =
+  BG.fromFFIType hs_bindgen_07f412ca6ac64bca_base
+
+-- | Compare two UTF-8 strings up to a number of bytes.
+--
+--     Due to the nature of UTF-8 encoding, this will work with Unicode strings, since effectively this function just compares bytes until it hits a null-terminating character. Also due to the nature of UTF-8, this can be used with @SDL_qsort()@ to put strings in (roughly) alphabetical order.
+--
+--     Note that while this function is intended to be used with UTF-8, it is doing a bytewise comparison, and @maxlen@ specifies a /byte/ limit! If the limit lands in the middle of a multi-byte UTF-8 sequence, it will only compare a portion of the final character.
+--
+--     @maxlen@ specifies a maximum number of bytes to compare; if the strings match to this number of bytes (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strncmp@, defined at @SDL3\/SDL_stdinc.h 3876:33@
+sDL_strncmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of /bytes/ to compare.
+  -> IO BG.CInt
+sDL_strncmp = hs_bindgen_07f412ca6ac64bca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strcasecmp@
+foreign import ccall safe "hs_bindgen_931c05e65f298770"
+  hs_bindgen_931c05e65f298770_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strcasecmp@
+hs_bindgen_931c05e65f298770
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_931c05e65f298770 =
+  BG.fromFFIType hs_bindgen_931c05e65f298770_base
+
+-- | Compare two null-terminated UTF-8 strings, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the string to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strcasecmp@, defined at @SDL3\/SDL_stdinc.h 3904:33@
+sDL_strcasecmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.CInt
+sDL_strcasecmp = hs_bindgen_931c05e65f298770
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strncasecmp@
+foreign import ccall safe "hs_bindgen_974c20bb6f7b7d03"
+  hs_bindgen_974c20bb6f7b7d03_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strncasecmp@
+hs_bindgen_974c20bb6f7b7d03
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_974c20bb6f7b7d03 =
+  BG.fromFFIType hs_bindgen_974c20bb6f7b7d03_base
+
+-- | Compare two UTF-8 strings, case-insensitively, up to a number of bytes.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the string to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     Note that while this function is intended to be used with UTF-8, @maxlen@ specifies a /byte/ limit! If the limit lands in the middle of a multi-byte UTF-8 sequence, it may convert a portion of the final character to one or more Unicode character U+FFFD (REPLACEMENT CHARACTER) so as not to overflow a buffer.
+--
+--     @maxlen@ specifies a maximum number of bytes to compare; if the strings match to this number of bytes (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strncasecmp@, defined at @SDL3\/SDL_stdinc.h 3944:33@
+sDL_strncasecmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of bytes to compare.
+  -> IO BG.CInt
+sDL_strncasecmp = hs_bindgen_974c20bb6f7b7d03
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strpbrk@
+foreign import ccall safe "hs_bindgen_50473abaffb3417e"
+  hs_bindgen_50473abaffb3417e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_strpbrk@
+hs_bindgen_50473abaffb3417e
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_50473abaffb3417e =
+  BG.fromFFIType hs_bindgen_50473abaffb3417e_base
+
+-- | Searches a string for the first occurrence of any character contained in a breakset, and returns a pointer from the string to that character.
+--
+--     [Returns]: A pointer to the location, in str, of the first occurrence of a character present in the breakset, or NULL if none is found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strpbrk@, defined at @SDL3\/SDL_stdinc.h 3962:36@
+sDL_strpbrk
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to be searched. Must not be NULL, and must not overlap with @breakset@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@breakset@]: A null-terminated string containing the list of characters to look for. Must not be NULL, and must not overlap with @str@.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strpbrk = hs_bindgen_50473abaffb3417e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_StepUTF8@
+foreign import ccall safe "hs_bindgen_e49242de1cec91d5"
+  hs_bindgen_e49242de1cec91d5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_StepUTF8@
+hs_bindgen_e49242de1cec91d5
+  :: BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO Uint32
+hs_bindgen_e49242de1cec91d5 =
+  BG.fromFFIType hs_bindgen_e49242de1cec91d5_base
+
+-- | Decode a UTF-8 string, one Unicode codepoint at a time.
+--
+--     This will return the first Unicode codepoint in the UTF-8 encoded string in @*pstr@, and then advance @*pstr@ past any consumed bytes before returning.
+--
+--     It will not access more than @*pslen@ bytes from the string. @*pslen@ will be adjusted, as well, subtracting the number of bytes consumed.
+--
+--     @pslen@ is allowed to be NULL, in which case the string /must/ be NULL-terminated, as the function will blindly read until it sees the NULL char.
+--
+--     if @*pslen@ is zero, it assumes the end of string is reached and returns a zero codepoint regardless of the contents of the string buffer.
+--
+--     If the resulting codepoint is zero (a NULL terminator), or @*pslen@ is zero, it will not advance @*pstr@ or @*pslen@ at all.
+--
+--     Generally this function is called in a loop until it returns zero, adjusting its parameters each iteration.
+--
+--     If an invalid UTF-8 sequence is encountered, this function returns SDL_INVALID_UNICODE_CODEPOINT and advances the string\/length by one byte (which is to say, a multibyte sequence might produce several SDL_INVALID_UNICODE_CODEPOINT returns before it syncs to the next valid UTF-8 sequence).
+--
+--     Several things can generate invalid UTF-8 sequences, including overlong encodings, the use of UTF-16 surrogate values, and truncated data. Please refer to [RFC3629](https://www.ietf.org/rfc/rfc3629.txt) for details.
+--
+--     [Returns]: the first Unicode codepoint in the string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_StepUTF8@, defined at @SDL3\/SDL_stdinc.h 4022:36@
+sDL_StepUTF8
+  :: BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@pstr@]: a pointer to a UTF-8 string pointer to be read and adjusted.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@pslen@]: a pointer to the number of bytes in the string, to be read and adjusted. NULL is allowed.
+  -> IO Uint32
+sDL_StepUTF8 = hs_bindgen_e49242de1cec91d5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_StepBackUTF8@
+foreign import ccall safe "hs_bindgen_0346c467944ee189"
+  hs_bindgen_0346c467944ee189_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_StepBackUTF8@
+hs_bindgen_0346c467944ee189
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -> IO Uint32
+hs_bindgen_0346c467944ee189 =
+  BG.fromFFIType hs_bindgen_0346c467944ee189_base
+
+-- | Decode a UTF-8 string in reverse, one Unicode codepoint at a time.
+--
+--     This will go to the start of the previous Unicode codepoint in the string, move @*pstr@ to that location and return that codepoint.
+--
+--     If @*pstr@ is already at the start of the string), it will not advance @*pstr@ at all.
+--
+--     Generally this function is called in a loop until it returns zero, adjusting its parameter each iteration.
+--
+--     If an invalid UTF-8 sequence is encountered, this function returns SDL_INVALID_UNICODE_CODEPOINT.
+--
+--     Several things can generate invalid UTF-8 sequences, including overlong encodings, the use of UTF-16 surrogate values, and truncated data. Please refer to [RFC3629](https://www.ietf.org/rfc/rfc3629.txt) for details.
+--
+--     [Returns]: the previous Unicode codepoint in the string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_StepBackUTF8@, defined at @SDL3\/SDL_stdinc.h 4053:36@
+sDL_StepBackUTF8
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@start@]: a pointer to the beginning of the UTF-8 string.
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@pstr@]: a pointer to a UTF-8 string pointer to be read and adjusted.
+  -> IO Uint32
+sDL_StepBackUTF8 = hs_bindgen_0346c467944ee189
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_UCS4ToUTF8@
+foreign import ccall safe "hs_bindgen_bdc98e385efc6ab7"
+  hs_bindgen_bdc98e385efc6ab7_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_UCS4ToUTF8@
+hs_bindgen_bdc98e385efc6ab7
+  :: Uint32
+  -> BG.Ptr BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_bdc98e385efc6ab7 =
+  BG.fromFFIType hs_bindgen_bdc98e385efc6ab7_base
+
+-- | Convert a single Unicode codepoint to UTF-8.
+--
+--     The buffer pointed to by @dst@ must be at least 4 bytes long, as this function may generate between 1 and 4 bytes of output.
+--
+--     This function returns the first byte /after/ the newly-written UTF-8 sequence, which is useful for encoding multiple codepoints in a loop, or knowing where to write a NULL-terminator character to end the string (in either case, plan to have a buffer of /more/ than 4 bytes!).
+--
+--     If @codepoint@ is an invalid value (outside the Unicode range, or a UTF-16 surrogate value, etc), this will use U+FFFD (REPLACEMENT CHARACTER) for the codepoint instead, and not set an error.
+--
+--     If @dst@ is NULL, this returns NULL immediately without writing to the pointer and without setting an error.
+--
+--     [Returns]: the first byte past the newly-written UTF-8 sequence.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UCS4ToUTF8@, defined at @SDL3\/SDL_stdinc.h 4082:36@
+sDL_UCS4ToUTF8
+  :: Uint32
+  -- ^
+  --
+  --           [@codepoint@]: a Unicode codepoint to convert to UTF-8.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: the location to write the encoded UTF-8. Must point to at least 4 bytes!
+  -> IO (BG.Ptr BG.CChar)
+sDL_UCS4ToUTF8 = hs_bindgen_bdc98e385efc6ab7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_srand@
+foreign import ccall safe "hs_bindgen_bd195a3a2b34e483"
+  hs_bindgen_bd195a3a2b34e483_base
+    :: BG.Word64
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_srand@
+hs_bindgen_bd195a3a2b34e483
+  :: Uint64
+  -> IO ()
+hs_bindgen_bd195a3a2b34e483 =
+  BG.fromFFIType hs_bindgen_bd195a3a2b34e483_base
+
+-- | Seeds the pseudo-random number generator.
+--
+--     Reusing the seed number will cause @SDL_rand()@ to repeat the same stream of \'random\' numbers.
+--
+--     [Thread safety]: This should be called on the same thread that calls @SDL_rand()@
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand', 'sDL_rand_bits', 'sDL_randf'
+--
+--     [C declaration]: @SDL_srand@, defined at @SDL3\/SDL_stdinc.h 4294:34@
+sDL_srand
+  :: Uint64
+  -- ^
+  --
+  --           [@seed@]: the value to use as a random number seed, or 0 to use SDL_GetPerformanceCounter().
+  -> IO ()
+sDL_srand = hs_bindgen_bd195a3a2b34e483
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_rand@
+foreign import ccall safe "hs_bindgen_4b2da7e53b63ed17"
+  hs_bindgen_4b2da7e53b63ed17_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_rand@
+hs_bindgen_4b2da7e53b63ed17
+  :: Sint32
+  -> IO Sint32
+hs_bindgen_4b2da7e53b63ed17 =
+  BG.fromFFIType hs_bindgen_4b2da7e53b63ed17_base
+
+-- | Generate a pseudo-random number less than n for positive n
+--
+--     The method used is faster and of better quality than @rand() % n@. Odds are roughly 99.9% even for n = 1 million. Evenness is better for smaller n, and much worse as n gets bigger.
+--
+--     Example: to simulate a d6 use @SDL_rand(6) + 1@ The +1 converts 0..5 to 1..6
+--
+--     If you want to generate a pseudo-random number in the full range of 'Sint32', you should use: ('Sint32') @SDL_rand_bits()@
+--
+--     If you want reproducible output, be sure to initialize with @SDL_srand()@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0 .. n-1].
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_srand', 'sDL_randf'
+--
+--     [C declaration]: @SDL_rand@, defined at @SDL3\/SDL_stdinc.h 4328:36@
+sDL_rand
+  :: Sint32
+  -- ^
+  --
+  --           [@n@]: the number of possible outcomes. n must be positive.
+  -> IO Sint32
+sDL_rand = hs_bindgen_4b2da7e53b63ed17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_randf@
+foreign import ccall safe "hs_bindgen_91fe5edd016e0570"
+  hs_bindgen_91fe5edd016e0570_base
+    :: IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_randf@
+hs_bindgen_91fe5edd016e0570 :: IO BG.CFloat
+hs_bindgen_91fe5edd016e0570 =
+  BG.fromFFIType hs_bindgen_91fe5edd016e0570_base
+
+-- | Generate a uniform pseudo-random floating point number less than 1.0
+--
+--     If you want reproducible output, be sure to initialize with @SDL_srand()@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0.0, 1.0).
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_srand', 'sDL_rand'
+--
+--     [C declaration]: @SDL_randf@, defined at @SDL3\/SDL_stdinc.h 4351:35@
+sDL_randf :: IO BG.CFloat
+sDL_randf = hs_bindgen_91fe5edd016e0570
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_rand_bits@
+foreign import ccall safe "hs_bindgen_5d81c1c12775308d"
+  hs_bindgen_5d81c1c12775308d_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_rand_bits@
+hs_bindgen_5d81c1c12775308d :: IO Uint32
+hs_bindgen_5d81c1c12775308d =
+  BG.fromFFIType hs_bindgen_5d81c1c12775308d_base
+
+-- | Generate 32 pseudo-random bits.
+--
+--     You likely want to use @SDL_rand()@ to get a psuedo-random number instead.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0-SDL_MAX_UINT32].
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand', 'sDL_randf', 'sDL_srand'
+--
+--     [C declaration]: @SDL_rand_bits@, defined at @SDL3\/SDL_stdinc.h 4374:36@
+sDL_rand_bits :: IO Uint32
+sDL_rand_bits = hs_bindgen_5d81c1c12775308d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_rand_r@
+foreign import ccall safe "hs_bindgen_59abfd01a8d7b8f7"
+  hs_bindgen_59abfd01a8d7b8f7_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_rand_r@
+hs_bindgen_59abfd01a8d7b8f7
+  :: BG.Ptr Uint64
+  -> Sint32
+  -> IO Sint32
+hs_bindgen_59abfd01a8d7b8f7 =
+  BG.fromFFIType hs_bindgen_59abfd01a8d7b8f7_base
+
+-- | Generate a pseudo-random number less than n for positive n
+--
+--     The method used is faster and of better quality than @rand() % n@. Odds are roughly 99.9% even for n = 1 million. Evenness is better for smaller n, and much worse as n gets bigger.
+--
+--     Example: to simulate a d6 use @SDL_rand_r(state, 6) + 1@ The +1 converts 0..5 to 1..6
+--
+--     If you want to generate a pseudo-random number in the full range of 'Sint32', you should use: ('Sint32')SDL_rand_bits_r(state)
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0 .. n-1].
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand', 'sDL_rand_bits_r', 'sDL_randf_r'
+--
+--     [C declaration]: @SDL_rand_r@, defined at @SDL3\/SDL_stdinc.h 4409:36@
+sDL_rand_r
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> Sint32
+  -- ^
+  --
+  --           [@n@]: the number of possible outcomes. n must be positive.
+  -> IO Sint32
+sDL_rand_r = hs_bindgen_59abfd01a8d7b8f7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_randf_r@
+foreign import ccall safe "hs_bindgen_5da60fff1ce7873d"
+  hs_bindgen_5da60fff1ce7873d_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_randf_r@
+hs_bindgen_5da60fff1ce7873d
+  :: BG.Ptr Uint64
+  -> IO BG.CFloat
+hs_bindgen_5da60fff1ce7873d =
+  BG.fromFFIType hs_bindgen_5da60fff1ce7873d_base
+
+-- | Generate a uniform pseudo-random floating point number less than 1.0
+--
+--     If you want reproducible output, be sure to initialize with @SDL_srand()@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0.0, 1.0).
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand_bits_r', 'sDL_rand_r', 'sDL_randf'
+--
+--     [C declaration]: @SDL_randf_r@, defined at @SDL3\/SDL_stdinc.h 4436:35@
+sDL_randf_r
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> IO BG.CFloat
+sDL_randf_r = hs_bindgen_5da60fff1ce7873d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_rand_bits_r@
+foreign import ccall safe "hs_bindgen_23de01659ed6ba6b"
+  hs_bindgen_23de01659ed6ba6b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_rand_bits_r@
+hs_bindgen_23de01659ed6ba6b
+  :: BG.Ptr Uint64
+  -> IO Uint32
+hs_bindgen_23de01659ed6ba6b =
+  BG.fromFFIType hs_bindgen_23de01659ed6ba6b_base
+
+-- | Generate 32 pseudo-random bits.
+--
+--     You likely want to use @SDL_rand_r()@ to get a psuedo-random number instead.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0-SDL_MAX_UINT32].
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand_r', 'sDL_randf_r'
+--
+--     [C declaration]: @SDL_rand_bits_r@, defined at @SDL3\/SDL_stdinc.h 4461:36@
+sDL_rand_bits_r
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> IO Uint32
+sDL_rand_bits_r = hs_bindgen_23de01659ed6ba6b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_acos@
+foreign import ccall safe "hs_bindgen_217308a0a788520d"
+  hs_bindgen_217308a0a788520d_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_acos@
+hs_bindgen_217308a0a788520d
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_217308a0a788520d =
+  BG.fromFFIType hs_bindgen_217308a0a788520d_base
+
+-- | Compute the arc cosine of @x@.
+--
+--     The definition of @y = acos(x)@ is @x = cos(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @0 \<= y \<= Pi@
+--
+--     This function operates on double-precision floating point values, use SDL_acosf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc cosine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_acosf', 'sDL_asin', 'sDL_cos'
+--
+--     [C declaration]: @SDL_acos@, defined at @SDL3\/SDL_stdinc.h 4515:36@
+sDL_acos
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_acos = hs_bindgen_217308a0a788520d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_acosf@
+foreign import ccall safe "hs_bindgen_f093db4bb5e8e494"
+  hs_bindgen_f093db4bb5e8e494_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_acosf@
+hs_bindgen_f093db4bb5e8e494
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_f093db4bb5e8e494 =
+  BG.fromFFIType hs_bindgen_f093db4bb5e8e494_base
+
+-- | Compute the arc cosine of @x@.
+--
+--     The definition of @y = acos(x)@ is @x = cos(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @0 \<= y \<= Pi@
+--
+--     This function operates on single-precision floating point values, use SDL_acos for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc cosine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_acos', 'sDL_asinf', 'sDL_cosf'
+--
+--     [C declaration]: @SDL_acosf@, defined at @SDL3\/SDL_stdinc.h 4545:35@
+sDL_acosf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_acosf = hs_bindgen_f093db4bb5e8e494
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_asin@
+foreign import ccall safe "hs_bindgen_205d9f923dff59cd"
+  hs_bindgen_205d9f923dff59cd_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_asin@
+hs_bindgen_205d9f923dff59cd
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_205d9f923dff59cd =
+  BG.fromFFIType hs_bindgen_205d9f923dff59cd_base
+
+-- | Compute the arc sine of @x@.
+--
+--     The definition of @y = asin(x)@ is @x = sin(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on double-precision floating point values, use SDL_asinf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc sine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_asinf', 'sDL_acos', 'sDL_sin'
+--
+--     [C declaration]: @SDL_asin@, defined at @SDL3\/SDL_stdinc.h 4575:36@
+sDL_asin
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_asin = hs_bindgen_205d9f923dff59cd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_asinf@
+foreign import ccall safe "hs_bindgen_79771d582742f165"
+  hs_bindgen_79771d582742f165_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_asinf@
+hs_bindgen_79771d582742f165
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_79771d582742f165 =
+  BG.fromFFIType hs_bindgen_79771d582742f165_base
+
+-- | Compute the arc sine of @x@.
+--
+--     The definition of @y = asin(x)@ is @x = sin(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on single-precision floating point values, use SDL_asin for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc sine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_asin', 'sDL_acosf', 'sDL_sinf'
+--
+--     [C declaration]: @SDL_asinf@, defined at @SDL3\/SDL_stdinc.h 4605:35@
+sDL_asinf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_asinf = hs_bindgen_79771d582742f165
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atan@
+foreign import ccall safe "hs_bindgen_3051cbc85bd5efba"
+  hs_bindgen_3051cbc85bd5efba_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atan@
+hs_bindgen_3051cbc85bd5efba
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_3051cbc85bd5efba =
+  BG.fromFFIType hs_bindgen_3051cbc85bd5efba_base
+
+-- | Compute the arc tangent of @x@.
+--
+--     The definition of @y = atan(x)@ is @x = tan(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on double-precision floating point values, use SDL_atanf for single-precision floats.
+--
+--     To calculate the arc tangent of y \/ x, use SDL_atan2.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @x@ in radians, or 0 if @x = 0@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atanf', 'sDL_atan2', 'sDL_tan'
+--
+--     [C declaration]: @SDL_atan@, defined at @SDL3\/SDL_stdinc.h 4637:36@
+sDL_atan
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_atan = hs_bindgen_3051cbc85bd5efba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atanf@
+foreign import ccall safe "hs_bindgen_7d0bcd6030adfae6"
+  hs_bindgen_7d0bcd6030adfae6_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atanf@
+hs_bindgen_7d0bcd6030adfae6
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_7d0bcd6030adfae6 =
+  BG.fromFFIType hs_bindgen_7d0bcd6030adfae6_base
+
+-- | Compute the arc tangent of @x@.
+--
+--     The definition of @y = atan(x)@ is @x = tan(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on single-precision floating point values, use SDL_atan for dboule-precision floats.
+--
+--     To calculate the arc tangent of y \/ x, use SDL_atan2f.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @x@ in radians, or 0 if @x = 0@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atan', 'sDL_atan2f', 'sDL_tanf'
+--
+--     [C declaration]: @SDL_atanf@, defined at @SDL3\/SDL_stdinc.h 4669:35@
+sDL_atanf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_atanf = hs_bindgen_7d0bcd6030adfae6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atan2@
+foreign import ccall safe "hs_bindgen_9ae010b5b4d9f553"
+  hs_bindgen_9ae010b5b4d9f553_base
+    :: Double
+    -> Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atan2@
+hs_bindgen_9ae010b5b4d9f553
+  :: BG.CDouble
+  -> BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_9ae010b5b4d9f553 =
+  BG.fromFFIType hs_bindgen_9ae010b5b4d9f553_base
+
+-- | Compute the arc tangent of @y \/ x@, using the signs of x and y to adjust the result\'s quadrant.
+--
+--     The definition of @z = atan2(x, y)@ is @y = x tan(z)@, where the quadrant of z is determined based on the signs of x and y.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-Pi \<= y \<= Pi@
+--
+--     This function operates on double-precision floating point values, use SDL_atan2f for single-precision floats.
+--
+--     To calculate the arc tangent of a single value, use SDL_atan.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @y \/ x@ in radians, or, if @x = 0@, either @-Pi\/2@, @0@, or @Pi\/2@, depending on the value of @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atan2f', 'sDL_atan', 'sDL_tan'
+--
+--     [C declaration]: @SDL_atan2@, defined at @SDL3\/SDL_stdinc.h 4705:36@
+sDL_atan2
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@y@]: floating point value of the numerator (y coordinate).
+  -> BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value of the denominator (x coordinate).
+  -> IO BG.CDouble
+sDL_atan2 = hs_bindgen_9ae010b5b4d9f553
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atan2f@
+foreign import ccall safe "hs_bindgen_3eac4b1bfc5aff58"
+  hs_bindgen_3eac4b1bfc5aff58_base
+    :: Float
+    -> Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_atan2f@
+hs_bindgen_3eac4b1bfc5aff58
+  :: BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_3eac4b1bfc5aff58 =
+  BG.fromFFIType hs_bindgen_3eac4b1bfc5aff58_base
+
+-- | Compute the arc tangent of @y \/ x@, using the signs of x and y to adjust the result\'s quadrant.
+--
+--     The definition of @z = atan2(x, y)@ is @y = x tan(z)@, where the quadrant of z is determined based on the signs of x and y.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-Pi \<= y \<= Pi@
+--
+--     This function operates on single-precision floating point values, use SDL_atan2 for double-precision floats.
+--
+--     To calculate the arc tangent of a single value, use SDL_atanf.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @y \/ x@ in radians, or, if @x = 0@, either @-Pi\/2@, @0@, or @Pi\/2@, depending on the value of @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atan2', 'sDL_atan', 'sDL_tan'
+--
+--     [C declaration]: @SDL_atan2f@, defined at @SDL3\/SDL_stdinc.h 4741:35@
+sDL_atan2f
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@y@]: floating point value of the numerator (y coordinate).
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value of the denominator (x coordinate).
+  -> IO BG.CFloat
+sDL_atan2f = hs_bindgen_3eac4b1bfc5aff58
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_ceil@
+foreign import ccall safe "hs_bindgen_1630cb0e3a004beb"
+  hs_bindgen_1630cb0e3a004beb_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_ceil@
+hs_bindgen_1630cb0e3a004beb
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_1630cb0e3a004beb =
+  BG.fromFFIType hs_bindgen_1630cb0e3a004beb_base
+
+-- | Compute the ceiling of @x@.
+--
+--     The ceiling of @x@ is the smallest integer @y@ such that @y >= x@, i.e @x@ rounded up to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_ceilf for single-precision floats.
+--
+--     [Returns]: the ceiling of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ceilf', 'sDL_floor', 'sDL_trunc', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_ceil@, defined at @SDL3\/SDL_stdinc.h 4769:36@
+sDL_ceil
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_ceil = hs_bindgen_1630cb0e3a004beb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_ceilf@
+foreign import ccall safe "hs_bindgen_04a706bfcc971297"
+  hs_bindgen_04a706bfcc971297_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_ceilf@
+hs_bindgen_04a706bfcc971297
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_04a706bfcc971297 =
+  BG.fromFFIType hs_bindgen_04a706bfcc971297_base
+
+-- | Compute the ceiling of @x@.
+--
+--     The ceiling of @x@ is the smallest integer @y@ such that @y >= x@, i.e @x@ rounded up to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_ceil for double-precision floats.
+--
+--     [Returns]: the ceiling of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ceil', 'sDL_floorf', 'sDL_truncf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_ceilf@, defined at @SDL3\/SDL_stdinc.h 4797:35@
+sDL_ceilf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_ceilf = hs_bindgen_04a706bfcc971297
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_copysign@
+foreign import ccall safe "hs_bindgen_fed0484ab850ee6a"
+  hs_bindgen_fed0484ab850ee6a_base
+    :: Double
+    -> Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_copysign@
+hs_bindgen_fed0484ab850ee6a
+  :: BG.CDouble
+  -> BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_fed0484ab850ee6a =
+  BG.fromFFIType hs_bindgen_fed0484ab850ee6a_base
+
+-- | Copy the sign of one floating-point value to another.
+--
+--     The definition of copysign is that @copysign(x, y) = abs(x) * sign(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= f@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_copysignf for single-precision floats.
+--
+--     [Returns]: the floating point value with the sign of y and the magnitude of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_copysignf', 'sDL_fabs'
+--
+--     [C declaration]: @SDL_copysign@, defined at @SDL3\/SDL_stdinc.h 4823:36@
+sDL_copysign
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> BG.CDouble
+  -- ^
+  --
+  --           [@y@]: floating point value to use as the sign.
+  -> IO BG.CDouble
+sDL_copysign = hs_bindgen_fed0484ab850ee6a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_copysignf@
+foreign import ccall safe "hs_bindgen_d21fe858af73dd98"
+  hs_bindgen_d21fe858af73dd98_base
+    :: Float
+    -> Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_copysignf@
+hs_bindgen_d21fe858af73dd98
+  :: BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_d21fe858af73dd98 =
+  BG.fromFFIType hs_bindgen_d21fe858af73dd98_base
+
+-- | Copy the sign of one floating-point value to another.
+--
+--     The definition of copysign is that @copysign(x, y) = abs(x) * sign(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= f@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_copysign for double-precision floats.
+--
+--     [Returns]: the floating point value with the sign of y and the magnitude of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_copysign', 'sDL_fabsf'
+--
+--     [C declaration]: @SDL_copysignf@, defined at @SDL3\/SDL_stdinc.h 4849:35@
+sDL_copysignf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: floating point value to use as the sign.
+  -> IO BG.CFloat
+sDL_copysignf = hs_bindgen_d21fe858af73dd98
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_cos@
+foreign import ccall safe "hs_bindgen_a4c38d6732d22ffb"
+  hs_bindgen_a4c38d6732d22ffb_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_cos@
+hs_bindgen_a4c38d6732d22ffb
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_a4c38d6732d22ffb =
+  BG.fromFFIType hs_bindgen_a4c38d6732d22ffb_base
+
+-- | Compute the cosine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on double-precision floating point values, use SDL_cosf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: cosine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_cosf', 'sDL_acos', 'sDL_sin'
+--
+--     [C declaration]: @SDL_cos@, defined at @SDL3\/SDL_stdinc.h 4877:36@
+sDL_cos
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CDouble
+sDL_cos = hs_bindgen_a4c38d6732d22ffb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_cosf@
+foreign import ccall safe "hs_bindgen_ad11505e8fd49060"
+  hs_bindgen_ad11505e8fd49060_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_cosf@
+hs_bindgen_ad11505e8fd49060
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_ad11505e8fd49060 =
+  BG.fromFFIType hs_bindgen_ad11505e8fd49060_base
+
+-- | Compute the cosine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on single-precision floating point values, use SDL_cos for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: cosine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_cos', 'sDL_acosf', 'sDL_sinf'
+--
+--     [C declaration]: @SDL_cosf@, defined at @SDL3\/SDL_stdinc.h 4905:35@
+sDL_cosf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CFloat
+sDL_cosf = hs_bindgen_ad11505e8fd49060
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_exp@
+foreign import ccall safe "hs_bindgen_ffaa0913f3d0c63c"
+  hs_bindgen_ffaa0913f3d0c63c_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_exp@
+hs_bindgen_ffaa0913f3d0c63c
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_ffaa0913f3d0c63c =
+  BG.fromFFIType hs_bindgen_ffaa0913f3d0c63c_base
+
+-- | Compute the exponential of @x@.
+--
+--     The definition of @y = exp(x)@ is @y = e^x@, where @e@ is the base of the natural logarithm. The inverse is the natural logarithm, SDL_log.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     The output will overflow if @exp(x)@ is too large to be represented.
+--
+--     This function operates on double-precision floating point values, use SDL_expf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: value of @e^x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_expf', 'sDL_log'
+--
+--     [C declaration]: @SDL_exp@, defined at @SDL3\/SDL_stdinc.h 4937:36@
+sDL_exp
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_exp = hs_bindgen_ffaa0913f3d0c63c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_expf@
+foreign import ccall safe "hs_bindgen_4d5e3977a4eb4c12"
+  hs_bindgen_4d5e3977a4eb4c12_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_expf@
+hs_bindgen_4d5e3977a4eb4c12
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_4d5e3977a4eb4c12 =
+  BG.fromFFIType hs_bindgen_4d5e3977a4eb4c12_base
+
+-- | Compute the exponential of @x@.
+--
+--     The definition of @y = exp(x)@ is @y = e^x@, where @e@ is the base of the natural logarithm. The inverse is the natural logarithm, SDL_logf.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     The output will overflow if @exp(x)@ is too large to be represented.
+--
+--     This function operates on single-precision floating point values, use SDL_exp for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: value of @e^x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_exp', 'sDL_logf'
+--
+--     [C declaration]: @SDL_expf@, defined at @SDL3\/SDL_stdinc.h 4969:35@
+sDL_expf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_expf = hs_bindgen_4d5e3977a4eb4c12
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_fabs@
+foreign import ccall safe "hs_bindgen_89730ae2b638ee61"
+  hs_bindgen_89730ae2b638ee61_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_fabs@
+hs_bindgen_89730ae2b638ee61
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_89730ae2b638ee61 =
+  BG.fromFFIType hs_bindgen_89730ae2b638ee61_base
+
+-- | Compute the absolute value of @x@
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_fabsf for single-precision floats.
+--
+--     [Returns]: the absolute value of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fabsf'
+--
+--     [C declaration]: @SDL_fabs@, defined at @SDL3\/SDL_stdinc.h 4990:36@
+sDL_fabs
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> IO BG.CDouble
+sDL_fabs = hs_bindgen_89730ae2b638ee61
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_fabsf@
+foreign import ccall safe "hs_bindgen_4e76324c9b8f7453"
+  hs_bindgen_4e76324c9b8f7453_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_fabsf@
+hs_bindgen_4e76324c9b8f7453
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_4e76324c9b8f7453 =
+  BG.fromFFIType hs_bindgen_4e76324c9b8f7453_base
+
+-- | Compute the absolute value of @x@
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_fabs for double-precision floats.
+--
+--     [Returns]: the absolute value of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fabs'
+--
+--     [C declaration]: @SDL_fabsf@, defined at @SDL3\/SDL_stdinc.h 5011:35@
+sDL_fabsf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> IO BG.CFloat
+sDL_fabsf = hs_bindgen_4e76324c9b8f7453
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_floor@
+foreign import ccall safe "hs_bindgen_4c646d1d6b7e922f"
+  hs_bindgen_4c646d1d6b7e922f_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_floor@
+hs_bindgen_4c646d1d6b7e922f
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_4c646d1d6b7e922f =
+  BG.fromFFIType hs_bindgen_4c646d1d6b7e922f_base
+
+-- | Compute the floor of @x@.
+--
+--     The floor of @x@ is the largest integer @y@ such that @y \<= x@, i.e @x@ rounded down to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_floorf for single-precision floats.
+--
+--     [Returns]: the floor of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_floorf', 'sDL_ceil', 'sDL_trunc', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_floor@, defined at @SDL3\/SDL_stdinc.h 5039:36@
+sDL_floor
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_floor = hs_bindgen_4c646d1d6b7e922f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_floorf@
+foreign import ccall safe "hs_bindgen_db6fbb0a591a2804"
+  hs_bindgen_db6fbb0a591a2804_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_floorf@
+hs_bindgen_db6fbb0a591a2804
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_db6fbb0a591a2804 =
+  BG.fromFFIType hs_bindgen_db6fbb0a591a2804_base
+
+-- | Compute the floor of @x@.
+--
+--     The floor of @x@ is the largest integer @y@ such that @y \<= x@, i.e @x@ rounded down to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_floor for double-precision floats.
+--
+--     [Returns]: the floor of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_floor', 'sDL_ceilf', 'sDL_truncf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_floorf@, defined at @SDL3\/SDL_stdinc.h 5067:35@
+sDL_floorf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_floorf = hs_bindgen_db6fbb0a591a2804
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_trunc@
+foreign import ccall safe "hs_bindgen_2b4f0ab682c421b7"
+  hs_bindgen_2b4f0ab682c421b7_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_trunc@
+hs_bindgen_2b4f0ab682c421b7
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_2b4f0ab682c421b7 =
+  BG.fromFFIType hs_bindgen_2b4f0ab682c421b7_base
+
+-- | Truncate @x@ to an integer.
+--
+--     Rounds @x@ to the next closest integer to 0. This is equivalent to removing the fractional part of @x@, leaving only the integer part.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_truncf for single-precision floats.
+--
+--     [Returns]: @x@ truncated to an integer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_truncf', 'sDL_fmod', 'sDL_ceil', 'sDL_floor', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_trunc@, defined at @SDL3\/SDL_stdinc.h 5096:36@
+sDL_trunc
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_trunc = hs_bindgen_2b4f0ab682c421b7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_truncf@
+foreign import ccall safe "hs_bindgen_afe8ddb39d52a293"
+  hs_bindgen_afe8ddb39d52a293_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_truncf@
+hs_bindgen_afe8ddb39d52a293
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_afe8ddb39d52a293 =
+  BG.fromFFIType hs_bindgen_afe8ddb39d52a293_base
+
+-- | Truncate @x@ to an integer.
+--
+--     Rounds @x@ to the next closest integer to 0. This is equivalent to removing the fractional part of @x@, leaving only the integer part.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_trunc for double-precision floats.
+--
+--     [Returns]: @x@ truncated to an integer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_trunc', 'sDL_fmodf', 'sDL_ceilf', 'sDL_floorf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_truncf@, defined at @SDL3\/SDL_stdinc.h 5125:35@
+sDL_truncf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_truncf = hs_bindgen_afe8ddb39d52a293
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_fmod@
+foreign import ccall safe "hs_bindgen_f1fc4d1a8a6fd613"
+  hs_bindgen_f1fc4d1a8a6fd613_base
+    :: Double
+    -> Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_fmod@
+hs_bindgen_f1fc4d1a8a6fd613
+  :: BG.CDouble
+  -> BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_f1fc4d1a8a6fd613 =
+  BG.fromFFIType hs_bindgen_f1fc4d1a8a6fd613_base
+
+-- | Return the floating-point remainder of @x \/ y@
+--
+--     Divides @x@ by @y@, and returns the remainder.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@, @y != 0@
+--
+--     Range: @-y \<= z \<= y@
+--
+--     This function operates on double-precision floating point values, use SDL_fmodf for single-precision floats.
+--
+--     [Returns]: the remainder of @x \/ y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fmodf', 'sDL_modf', 'sDL_trunc', 'sDL_ceil', 'sDL_floor', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_fmod@, defined at @SDL3\/SDL_stdinc.h 5155:36@
+sDL_fmod
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: the numerator.
+  -> BG.CDouble
+  -- ^
+  --
+  --           [@y@]: the denominator. Must not be 0.
+  -> IO BG.CDouble
+sDL_fmod = hs_bindgen_f1fc4d1a8a6fd613
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_fmodf@
+foreign import ccall safe "hs_bindgen_19c2a30dd6614c51"
+  hs_bindgen_19c2a30dd6614c51_base
+    :: Float
+    -> Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_fmodf@
+hs_bindgen_19c2a30dd6614c51
+  :: BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_19c2a30dd6614c51 =
+  BG.fromFFIType hs_bindgen_19c2a30dd6614c51_base
+
+-- | Return the floating-point remainder of @x \/ y@
+--
+--     Divides @x@ by @y@, and returns the remainder.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@, @y != 0@
+--
+--     Range: @-y \<= z \<= y@
+--
+--     This function operates on single-precision floating point values, use SDL_fmod for double-precision floats.
+--
+--     [Returns]: the remainder of @x \/ y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fmod', 'sDL_truncf', 'sDL_modff', 'sDL_ceilf', 'sDL_floorf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_fmodf@, defined at @SDL3\/SDL_stdinc.h 5185:35@
+sDL_fmodf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the numerator.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the denominator. Must not be 0.
+  -> IO BG.CFloat
+sDL_fmodf = hs_bindgen_19c2a30dd6614c51
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isinf@
+foreign import ccall safe "hs_bindgen_9be13530739c3139"
+  hs_bindgen_9be13530739c3139_base
+    :: Double
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isinf@
+hs_bindgen_9be13530739c3139
+  :: BG.CDouble
+  -> IO BG.CInt
+hs_bindgen_9be13530739c3139 =
+  BG.fromFFIType hs_bindgen_9be13530739c3139_base
+
+-- | Return whether the value is infinity.
+--
+--     [Returns]: non-zero if the value is infinity, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isinff'
+--
+--     [C declaration]: @SDL_isinf@, defined at @SDL3\/SDL_stdinc.h 5199:33@
+sDL_isinf
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: double-precision floating point value.
+  -> IO BG.CInt
+sDL_isinf = hs_bindgen_9be13530739c3139
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isinff@
+foreign import ccall safe "hs_bindgen_d063ada15b71ed19"
+  hs_bindgen_d063ada15b71ed19_base
+    :: Float
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isinff@
+hs_bindgen_d063ada15b71ed19
+  :: BG.CFloat
+  -> IO BG.CInt
+hs_bindgen_d063ada15b71ed19 =
+  BG.fromFFIType hs_bindgen_d063ada15b71ed19_base
+
+-- | Return whether the value is infinity.
+--
+--     [Returns]: non-zero if the value is infinity, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isinf'
+--
+--     [C declaration]: @SDL_isinff@, defined at @SDL3\/SDL_stdinc.h 5213:33@
+sDL_isinff
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CInt
+sDL_isinff = hs_bindgen_d063ada15b71ed19
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isnan@
+foreign import ccall safe "hs_bindgen_bb4d9f6611f2a512"
+  hs_bindgen_bb4d9f6611f2a512_base
+    :: Double
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isnan@
+hs_bindgen_bb4d9f6611f2a512
+  :: BG.CDouble
+  -> IO BG.CInt
+hs_bindgen_bb4d9f6611f2a512 =
+  BG.fromFFIType hs_bindgen_bb4d9f6611f2a512_base
+
+-- | Return whether the value is NaN.
+--
+--     [Returns]: non-zero if the value is NaN, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isnanf'
+--
+--     [C declaration]: @SDL_isnan@, defined at @SDL3\/SDL_stdinc.h 5227:33@
+sDL_isnan
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: double-precision floating point value.
+  -> IO BG.CInt
+sDL_isnan = hs_bindgen_bb4d9f6611f2a512
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isnanf@
+foreign import ccall safe "hs_bindgen_48e10ed50de37991"
+  hs_bindgen_48e10ed50de37991_base
+    :: Float
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_isnanf@
+hs_bindgen_48e10ed50de37991
+  :: BG.CFloat
+  -> IO BG.CInt
+hs_bindgen_48e10ed50de37991 =
+  BG.fromFFIType hs_bindgen_48e10ed50de37991_base
+
+-- | Return whether the value is NaN.
+--
+--     [Returns]: non-zero if the value is NaN, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isnan'
+--
+--     [C declaration]: @SDL_isnanf@, defined at @SDL3\/SDL_stdinc.h 5241:33@
+sDL_isnanf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CInt
+sDL_isnanf = hs_bindgen_48e10ed50de37991
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_log@
+foreign import ccall safe "hs_bindgen_46922ccc470e92e0"
+  hs_bindgen_46922ccc470e92e0_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_log@
+hs_bindgen_46922ccc470e92e0
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_46922ccc470e92e0 =
+  BG.fromFFIType hs_bindgen_46922ccc470e92e0_base
+
+-- | Compute the natural logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on double-precision floating point values, use SDL_logf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the natural logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_logf', 'sDL_log10', 'sDL_exp'
+--
+--     [C declaration]: @SDL_log@, defined at @SDL3\/SDL_stdinc.h 5271:36@
+sDL_log
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO BG.CDouble
+sDL_log = hs_bindgen_46922ccc470e92e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_logf@
+foreign import ccall safe "hs_bindgen_7ef0b9f4239eb37e"
+  hs_bindgen_7ef0b9f4239eb37e_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_logf@
+hs_bindgen_7ef0b9f4239eb37e
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_7ef0b9f4239eb37e =
+  BG.fromFFIType hs_bindgen_7ef0b9f4239eb37e_base
+
+-- | Compute the natural logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on single-precision floating point values, use SDL_log for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the natural logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_log', 'sDL_expf'
+--
+--     [C declaration]: @SDL_logf@, defined at @SDL3\/SDL_stdinc.h 5300:35@
+sDL_logf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO BG.CFloat
+sDL_logf = hs_bindgen_7ef0b9f4239eb37e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_log10@
+foreign import ccall safe "hs_bindgen_bc1ad316da1b3bbc"
+  hs_bindgen_bc1ad316da1b3bbc_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_log10@
+hs_bindgen_bc1ad316da1b3bbc
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_bc1ad316da1b3bbc =
+  BG.fromFFIType hs_bindgen_bc1ad316da1b3bbc_base
+
+-- | Compute the base-10 logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on double-precision floating point values, use SDL_log10f for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_log10f', 'sDL_log', 'sDL_pow'
+--
+--     [C declaration]: @SDL_log10@, defined at @SDL3\/SDL_stdinc.h 5330:36@
+sDL_log10
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO BG.CDouble
+sDL_log10 = hs_bindgen_bc1ad316da1b3bbc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_log10f@
+foreign import ccall safe "hs_bindgen_310aebbf28df3250"
+  hs_bindgen_310aebbf28df3250_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_log10f@
+hs_bindgen_310aebbf28df3250
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_310aebbf28df3250 =
+  BG.fromFFIType hs_bindgen_310aebbf28df3250_base
+
+-- | Compute the base-10 logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on single-precision floating point values, use SDL_log10 for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_log10', 'sDL_logf', 'sDL_powf'
+--
+--     [C declaration]: @SDL_log10f@, defined at @SDL3\/SDL_stdinc.h 5360:35@
+sDL_log10f
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO BG.CFloat
+sDL_log10f = hs_bindgen_310aebbf28df3250
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_modf@
+foreign import ccall safe "hs_bindgen_93a468f91c55ba99"
+  hs_bindgen_93a468f91c55ba99_base
+    :: Double
+    -> BG.Ptr BG.Void
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_modf@
+hs_bindgen_93a468f91c55ba99
+  :: BG.CDouble
+  -> BG.Ptr BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_93a468f91c55ba99 =
+  BG.fromFFIType hs_bindgen_93a468f91c55ba99_base
+
+-- | Split @x@ into integer and fractional parts
+--
+--     This function operates on double-precision floating point values, use SDL_modff for single-precision floats.
+--
+--     [Returns]: the fractional part of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_modff', 'sDL_trunc', 'sDL_fmod'
+--
+--     [C declaration]: @SDL_modf@, defined at @SDL3\/SDL_stdinc.h 5380:36@
+sDL_modf
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> BG.Ptr BG.CDouble
+  -- ^
+  --
+  --           [@y@]: output pointer to store the integer part of @x@.
+  -> IO BG.CDouble
+sDL_modf = hs_bindgen_93a468f91c55ba99
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_modff@
+foreign import ccall safe "hs_bindgen_76a18e33bbbed6ee"
+  hs_bindgen_76a18e33bbbed6ee_base
+    :: Float
+    -> BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_modff@
+hs_bindgen_76a18e33bbbed6ee
+  :: BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_76a18e33bbbed6ee =
+  BG.fromFFIType hs_bindgen_76a18e33bbbed6ee_base
+
+-- | Split @x@ into integer and fractional parts
+--
+--     This function operates on single-precision floating point values, use SDL_modf for double-precision floats.
+--
+--     [Returns]: the fractional part of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_modf', 'sDL_truncf', 'sDL_fmodf'
+--
+--     [C declaration]: @SDL_modff@, defined at @SDL3\/SDL_stdinc.h 5400:35@
+sDL_modff
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: output pointer to store the integer part of @x@.
+  -> IO BG.CFloat
+sDL_modff = hs_bindgen_76a18e33bbbed6ee
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_pow@
+foreign import ccall safe "hs_bindgen_b8c28ba00815fbb9"
+  hs_bindgen_b8c28ba00815fbb9_base
+    :: Double
+    -> Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_pow@
+hs_bindgen_b8c28ba00815fbb9
+  :: BG.CDouble
+  -> BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_b8c28ba00815fbb9 =
+  BG.fromFFIType hs_bindgen_b8c28ba00815fbb9_base
+
+-- | Raise @x@ to the power @y@
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     If @y@ is the base of the natural logarithm (e), consider using SDL_exp instead.
+--
+--     This function operates on double-precision floating point values, use SDL_powf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: @x@ raised to the power @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_powf', 'sDL_exp', 'sDL_log'
+--
+--     [C declaration]: @SDL_pow@, defined at @SDL3\/SDL_stdinc.h 5432:36@
+sDL_pow
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: the base.
+  -> BG.CDouble
+  -- ^
+  --
+  --           [@y@]: the exponent.
+  -> IO BG.CDouble
+sDL_pow = hs_bindgen_b8c28ba00815fbb9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_powf@
+foreign import ccall safe "hs_bindgen_d853802a7561099f"
+  hs_bindgen_d853802a7561099f_base
+    :: Float
+    -> Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_powf@
+hs_bindgen_d853802a7561099f
+  :: BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_d853802a7561099f =
+  BG.fromFFIType hs_bindgen_d853802a7561099f_base
+
+-- | Raise @x@ to the power @y@
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     If @y@ is the base of the natural logarithm (e), consider using SDL_exp instead.
+--
+--     This function operates on single-precision floating point values, use SDL_pow for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: @x@ raised to the power @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_pow', 'sDL_expf', 'sDL_logf'
+--
+--     [C declaration]: @SDL_powf@, defined at @SDL3\/SDL_stdinc.h 5464:35@
+sDL_powf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the base.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the exponent.
+  -> IO BG.CFloat
+sDL_powf = hs_bindgen_d853802a7561099f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_round@
+foreign import ccall safe "hs_bindgen_097e1eceb090a078"
+  hs_bindgen_097e1eceb090a078_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_round@
+hs_bindgen_097e1eceb090a078
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_097e1eceb090a078 =
+  BG.fromFFIType hs_bindgen_097e1eceb090a078_base
+
+-- | Round @x@ to the nearest integer.
+--
+--     Rounds @x@ to the nearest integer. Values halfway between integers will be rounded away from zero.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_roundf for single-precision floats. To get the result as an integer type, use SDL_lround.
+--
+--     [Returns]: the nearest integer to @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_roundf', @SDL_lround@, 'sDL_floor', 'sDL_ceil', 'sDL_trunc'
+--
+--     [C declaration]: @SDL_round@, defined at @SDL3\/SDL_stdinc.h 5493:36@
+sDL_round
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_round = hs_bindgen_097e1eceb090a078
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_roundf@
+foreign import ccall safe "hs_bindgen_5b677097112f1617"
+  hs_bindgen_5b677097112f1617_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_roundf@
+hs_bindgen_5b677097112f1617
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_5b677097112f1617 =
+  BG.fromFFIType hs_bindgen_5b677097112f1617_base
+
+-- | Round @x@ to the nearest integer.
+--
+--     Rounds @x@ to the nearest integer. Values halfway between integers will be rounded away from zero.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_round for double-precision floats. To get the result as an integer type, use SDL_lroundf.
+--
+--     [Returns]: the nearest integer to @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_round', @SDL_lroundf@, 'sDL_floorf', 'sDL_ceilf', 'sDL_truncf'
+--
+--     [C declaration]: @SDL_roundf@, defined at @SDL3\/SDL_stdinc.h 5522:35@
+sDL_roundf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_roundf = hs_bindgen_5b677097112f1617
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_scalbn@
+foreign import ccall safe "hs_bindgen_8038e0526522260c"
+  hs_bindgen_8038e0526522260c_base
+    :: Double
+    -> BG.Int32
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_scalbn@
+hs_bindgen_8038e0526522260c
+  :: BG.CDouble
+  -> BG.CInt
+  -> IO BG.CDouble
+hs_bindgen_8038e0526522260c =
+  BG.fromFFIType hs_bindgen_8038e0526522260c_base
+
+-- | Scale @x@ by an integer power of two.
+--
+--     Multiplies @x@ by the @n@ th power of the floating point radix (always 2).
+--
+--     Domain: @-INF \<= x \<= INF@, @n@ integer
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_scalbnf for single-precision floats.
+--
+--     [Returns]: @x * 2^n@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_scalbnf', 'sDL_pow'
+--
+--     [C declaration]: @SDL_scalbn@, defined at @SDL3\/SDL_stdinc.h 5605:36@
+sDL_scalbn
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value to be scaled.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@n@]: integer exponent.
+  -> IO BG.CDouble
+sDL_scalbn = hs_bindgen_8038e0526522260c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_scalbnf@
+foreign import ccall safe "hs_bindgen_fc0cb80cec8a11b0"
+  hs_bindgen_fc0cb80cec8a11b0_base
+    :: Float
+    -> BG.Int32
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_scalbnf@
+hs_bindgen_fc0cb80cec8a11b0
+  :: BG.CFloat
+  -> BG.CInt
+  -> IO BG.CFloat
+hs_bindgen_fc0cb80cec8a11b0 =
+  BG.fromFFIType hs_bindgen_fc0cb80cec8a11b0_base
+
+-- | Scale @x@ by an integer power of two.
+--
+--     Multiplies @x@ by the @n@ th power of the floating point radix (always 2).
+--
+--     Domain: @-INF \<= x \<= INF@, @n@ integer
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_scalbn for double-precision floats.
+--
+--     [Returns]: @x * 2^n@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_scalbn', 'sDL_powf'
+--
+--     [C declaration]: @SDL_scalbnf@, defined at @SDL3\/SDL_stdinc.h 5630:35@
+sDL_scalbnf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value to be scaled.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@n@]: integer exponent.
+  -> IO BG.CFloat
+sDL_scalbnf = hs_bindgen_fc0cb80cec8a11b0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_sin@
+foreign import ccall safe "hs_bindgen_d062c0d717121757"
+  hs_bindgen_d062c0d717121757_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_sin@
+hs_bindgen_d062c0d717121757
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_d062c0d717121757 =
+  BG.fromFFIType hs_bindgen_d062c0d717121757_base
+
+-- | Compute the sine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on double-precision floating point values, use SDL_sinf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: sine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sinf', 'sDL_asin', 'sDL_cos'
+--
+--     [C declaration]: @SDL_sin@, defined at @SDL3\/SDL_stdinc.h 5658:36@
+sDL_sin
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CDouble
+sDL_sin = hs_bindgen_d062c0d717121757
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_sinf@
+foreign import ccall safe "hs_bindgen_4ee3ee787bd19e91"
+  hs_bindgen_4ee3ee787bd19e91_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_sinf@
+hs_bindgen_4ee3ee787bd19e91
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_4ee3ee787bd19e91 =
+  BG.fromFFIType hs_bindgen_4ee3ee787bd19e91_base
+
+-- | Compute the sine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on single-precision floating point values, use SDL_sin for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: sine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sin', 'sDL_asinf', 'sDL_cosf'
+--
+--     [C declaration]: @SDL_sinf@, defined at @SDL3\/SDL_stdinc.h 5686:35@
+sDL_sinf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CFloat
+sDL_sinf = hs_bindgen_4ee3ee787bd19e91
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_sqrt@
+foreign import ccall safe "hs_bindgen_45b7bf5fa33e3269"
+  hs_bindgen_45b7bf5fa33e3269_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_sqrt@
+hs_bindgen_45b7bf5fa33e3269
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_45b7bf5fa33e3269 =
+  BG.fromFFIType hs_bindgen_45b7bf5fa33e3269_base
+
+-- | Compute the square root of @x@.
+--
+--     Domain: @0 \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_sqrtf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: square root of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sqrtf'
+--
+--     [C declaration]: @SDL_sqrt@, defined at @SDL3\/SDL_stdinc.h 5712:36@
+sDL_sqrt
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than or equal to 0.
+  -> IO BG.CDouble
+sDL_sqrt = hs_bindgen_45b7bf5fa33e3269
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_sqrtf@
+foreign import ccall safe "hs_bindgen_da05b17837e5fa68"
+  hs_bindgen_da05b17837e5fa68_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_sqrtf@
+hs_bindgen_da05b17837e5fa68
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_da05b17837e5fa68 =
+  BG.fromFFIType hs_bindgen_da05b17837e5fa68_base
+
+-- | Compute the square root of @x@.
+--
+--     Domain: @0 \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_sqrt for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: square root of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sqrt'
+--
+--     [C declaration]: @SDL_sqrtf@, defined at @SDL3\/SDL_stdinc.h 5738:35@
+sDL_sqrtf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than or equal to 0.
+  -> IO BG.CFloat
+sDL_sqrtf = hs_bindgen_da05b17837e5fa68
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_tan@
+foreign import ccall safe "hs_bindgen_8e3c4624ada8d754"
+  hs_bindgen_8e3c4624ada8d754_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_tan@
+hs_bindgen_8e3c4624ada8d754
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_8e3c4624ada8d754 =
+  BG.fromFFIType hs_bindgen_8e3c4624ada8d754_base
+
+-- | Compute the tangent of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_tanf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: tangent of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_tanf', 'sDL_sin', 'sDL_cos', 'sDL_atan', 'sDL_atan2'
+--
+--     [C declaration]: @SDL_tan@, defined at @SDL3\/SDL_stdinc.h 5768:36@
+sDL_tan
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CDouble
+sDL_tan = hs_bindgen_8e3c4624ada8d754
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_tanf@
+foreign import ccall safe "hs_bindgen_b4a5a33f270aeb8d"
+  hs_bindgen_b4a5a33f270aeb8d_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_tanf@
+hs_bindgen_b4a5a33f270aeb8d
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_b4a5a33f270aeb8d =
+  BG.fromFFIType hs_bindgen_b4a5a33f270aeb8d_base
+
+-- | Compute the tangent of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_tan for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: tangent of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_tan', 'sDL_sinf', 'sDL_cosf', 'sDL_atanf', 'sDL_atan2f'
+--
+--     [C declaration]: @SDL_tanf@, defined at @SDL3\/SDL_stdinc.h 5798:35@
+sDL_tanf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CFloat
+sDL_tanf = hs_bindgen_b4a5a33f270aeb8d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_iconv_open@
+foreign import ccall safe "hs_bindgen_4c58e728caad9aa3"
+  hs_bindgen_4c58e728caad9aa3_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_iconv_open@
+hs_bindgen_4c58e728caad9aa3
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO SDL_iconv_t
+hs_bindgen_4c58e728caad9aa3 =
+  BG.fromFFIType hs_bindgen_4c58e728caad9aa3_base
+
+-- | This function allocates a context for the specified character set conversion.
+--
+--     [Returns]: a handle that must be freed with SDL_iconv_close, or SDL_ICONV_ERROR on failure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv', 'sDL_iconv_close', 'sDL_iconv_string'
+--
+--     [C declaration]: @SDL_iconv_open@, defined at @SDL3\/SDL_stdinc.h 5826:41@
+sDL_iconv_open
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tocode@]: The target character encoding, must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@fromcode@]: The source character encoding, must not be NULL.
+  -> IO SDL_iconv_t
+sDL_iconv_open = hs_bindgen_4c58e728caad9aa3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_iconv_close@
+foreign import ccall safe "hs_bindgen_85fcb2de02d7791f"
+  hs_bindgen_85fcb2de02d7791f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_iconv_close@
+hs_bindgen_85fcb2de02d7791f
+  :: SDL_iconv_t
+  -> IO BG.CInt
+hs_bindgen_85fcb2de02d7791f =
+  BG.fromFFIType hs_bindgen_85fcb2de02d7791f_base
+
+-- | This function frees a context used for character set conversion.
+--
+--     [Returns]: 0 on success, or -1 on failure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv', 'sDL_iconv_open', 'sDL_iconv_string'
+--
+--     [C declaration]: @SDL_iconv_close@, defined at @SDL3\/SDL_stdinc.h 5843:33@
+sDL_iconv_close
+  :: SDL_iconv_t
+  -- ^
+  --
+  --           [@cd@]: The character set conversion handle.
+  -> IO BG.CInt
+sDL_iconv_close = hs_bindgen_85fcb2de02d7791f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_iconv@
+foreign import ccall safe "hs_bindgen_73663c44fcaa8f9d"
+  hs_bindgen_73663c44fcaa8f9d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_iconv@
+hs_bindgen_73663c44fcaa8f9d
+  :: SDL_iconv_t
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_73663c44fcaa8f9d =
+  BG.fromFFIType hs_bindgen_73663c44fcaa8f9d_base
+
+-- | This function converts text between encodings, reading from and writing to a buffer.
+--
+--     It returns the number of successful conversions on success. On error, SDL_ICONV_E2BIG is returned when the output buffer is too small, or SDL_ICONV_EILSEQ is returned when an invalid input sequence is encountered, or SDL_ICONV_EINVAL is returned when an incomplete input sequence is encountered.
+--
+--     On exit:
+--
+--     * inbuf will point to the beginning of the next multibyte sequence. On error, this is the location of the problematic input sequence. On success, this is the end of the input sequence.
+--
+--     * inbytesleft will be set to the number of bytes left to convert, which will be 0 on success.
+--
+--     * outbuf will point to the location where to store the next output byte.
+--
+--     * outbytesleft will be set to the number of bytes left in the output buffer.
+--
+--     [Returns]: the number of conversions on success, or a negative error code.
+--
+--     [Thread safety]: Do not use the same 'SDL_iconv_t' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv_open', 'sDL_iconv_close', 'sDL_iconv_string'
+--
+--     [C declaration]: @SDL_iconv@, defined at @SDL3\/SDL_stdinc.h 5883:36@
+sDL_iconv
+  :: SDL_iconv_t
+  -- ^
+  --
+  --           [@cd@]: The character set conversion context, created in @SDL_iconv_open()@.
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@inbuf@]: Address of variable that points to the first character of the input sequence.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@inbytesleft@]: The number of bytes in the input buffer.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@outbuf@]: Address of variable that points to the output buffer.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@outbytesleft@]: The number of bytes in the output buffer.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_iconv = hs_bindgen_73663c44fcaa8f9d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_iconv_string@
+foreign import ccall safe "hs_bindgen_066c0e98a41d1c6b"
+  hs_bindgen_066c0e98a41d1c6b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_iconv_string@
+hs_bindgen_066c0e98a41d1c6b
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_066c0e98a41d1c6b =
+  BG.fromFFIType hs_bindgen_066c0e98a41d1c6b_base
+
+-- | Helper function to convert a string\'s encoding in one call.
+--
+--     This function converts a buffer or string between encodings in one pass.
+--
+--     The string does not need to be NULL-terminated; this function operates on the number of bytes specified in @inbytesleft@ whether there is a NULL character anywhere in the buffer.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [Returns]: a new string, converted to the new encoding, or NULL on error.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv_open', 'sDL_iconv_close', 'sDL_iconv'
+--
+--     [C declaration]: @SDL_iconv_string@, defined at @SDL3\/SDL_stdinc.h 5920:36@
+sDL_iconv_string
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tocode@]: the character encoding of the output string. Examples are \"UTF-8\", \"UCS-4\", etc.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@fromcode@]: the character encoding of data in @inbuf@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@inbuf@]: the string to convert to a different encoding.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@inbytesleft@]: the size of the input string /in bytes/.
+  -> IO (BG.Ptr BG.CChar)
+sDL_iconv_string = hs_bindgen_066c0e98a41d1c6b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_size_mul_check_overflow_builtin@
+foreign import ccall safe "hs_bindgen_cb7ffceaa134d628"
+  hs_bindgen_cb7ffceaa134d628_base
+    :: BG.Word64
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_size_mul_check_overflow_builtin@
+hs_bindgen_cb7ffceaa134d628
+  :: HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CBool
+hs_bindgen_cb7ffceaa134d628 =
+  BG.fromFFIType hs_bindgen_cb7ffceaa134d628_base
+
+-- | [C declaration]: @SDL_size_mul_check_overflow_builtin@, defined at @SDL3\/SDL_stdinc.h 6101:23@
+sDL_size_mul_check_overflow_builtin
+  :: HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @a@
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @b@
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @ret@
+  -> IO BG.CBool
+sDL_size_mul_check_overflow_builtin =
+  hs_bindgen_cb7ffceaa134d628
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_size_add_check_overflow_builtin@
+foreign import ccall safe "hs_bindgen_ca88dcdcdddd2954"
+  hs_bindgen_ca88dcdcdddd2954_base
+    :: BG.Word64
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Safe_SDL_size_add_check_overflow_builtin@
+hs_bindgen_ca88dcdcdddd2954
+  :: HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CBool
+hs_bindgen_ca88dcdcdddd2954 =
+  BG.fromFFIType hs_bindgen_ca88dcdcdddd2954_base
+
+-- | [C declaration]: @SDL_size_add_check_overflow_builtin@, defined at @SDL3\/SDL_stdinc.h 6139:23@
+sDL_size_add_check_overflow_builtin
+  :: HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @a@
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @b@
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @ret@
+  -> IO BG.CBool
+sDL_size_add_check_overflow_builtin =
+  hs_bindgen_ca88dcdcdddd2954
diff --git a/src/SDL3/Sys/Bindgen/Stdinc/Unsafe.hs b/src/SDL3/Sys/Bindgen/Stdinc/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Stdinc/Unsafe.hs
@@ -0,0 +1,7423 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Stdinc.Unsafe (
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_malloc,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_calloc,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_realloc,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_free,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_GetOriginalMemoryFunctions,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_GetMemoryFunctions,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_SetMemoryFunctions,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_aligned_alloc,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_aligned_free,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_GetNumAllocations,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_GetEnvironment,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_CreateEnvironment,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_GetEnvironmentVariable,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_GetEnvironmentVariables,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_SetEnvironmentVariable,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_UnsetEnvironmentVariable,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_DestroyEnvironment,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_getenv,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_getenv_unsafe,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_setenv_unsafe,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_unsetenv_unsafe,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_qsort,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_bsearch,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_qsort_r,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_bsearch_r,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_abs,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isalpha,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isalnum,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isblank,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_iscntrl,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isdigit,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isxdigit,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_ispunct,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isspace,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isupper,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_islower,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isprint,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isgraph,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_toupper,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_tolower,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_crc16,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_crc32,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_murmur3_32,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_memset4,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_memcmp,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcslen,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcsnlen,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcslcpy,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcslcat,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcsdup,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcsstr,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcsnstr,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcscmp,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcsncmp,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcscasecmp,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_wcsncasecmp,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strlen,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strnlen,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strlcpy,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_utf8strlcpy,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strlcat,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strdup,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strndup,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strrev,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strupr,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strlwr,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strchr,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strrchr,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strstr,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strnstr,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strcasestr,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strtok_r,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_utf8strlen,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_utf8strnlen,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_itoa,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_uitoa,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_lltoa,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_ulltoa,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_atoi,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_atof,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strtoll,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strtoull,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strtod,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strcmp,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strncmp,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strcasecmp,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strncasecmp,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_strpbrk,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_StepUTF8,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_StepBackUTF8,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_UCS4ToUTF8,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_srand,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_rand,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_randf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_rand_bits,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_rand_r,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_randf_r,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_rand_bits_r,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_acos,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_acosf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_asin,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_asinf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_atan,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_atanf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_atan2,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_atan2f,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_ceil,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_ceilf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_copysign,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_copysignf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_cos,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_cosf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_exp,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_expf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_fabs,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_fabsf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_floor,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_floorf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_trunc,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_truncf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_fmod,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_fmodf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isinf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isinff,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isnan,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_isnanf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_log,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_logf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_log10,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_log10f,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_modf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_modff,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_pow,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_powf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_round,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_roundf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_scalbn,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_scalbnf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_sin,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_sinf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_sqrt,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_sqrtf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_tan,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_tanf,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_iconv_open,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_iconv_close,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_iconv,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_iconv_string,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_size_mul_check_overflow_builtin,
+  SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_size_add_check_overflow_builtin,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_stdinc.h>"
+         , "void *hs_bindgen_5bd8a699d72971c5 ("
+         , "  size_t arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_malloc)(arg1);"
+         , "}"
+         , "void *hs_bindgen_08746ff05ca3003c ("
+         , "  size_t arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_calloc)(arg1, arg2);"
+         , "}"
+         , "void *hs_bindgen_0730e7e13356c626 ("
+         , "  void *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_realloc)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_22f31e5d111da6c1 ("
+         , "  void *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_free)(arg1);"
+         , "}"
+         , "void hs_bindgen_f517f867f38f6071 ("
+         , "  SDL_malloc_func *arg1,"
+         , "  SDL_calloc_func *arg2,"
+         , "  SDL_realloc_func *arg3,"
+         , "  SDL_free_func *arg4"
+         , ")"
+         , "{"
+         , "  (SDL_GetOriginalMemoryFunctions)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_25189a0da3d426a6 ("
+         , "  SDL_malloc_func *arg1,"
+         , "  SDL_calloc_func *arg2,"
+         , "  SDL_realloc_func *arg3,"
+         , "  SDL_free_func *arg4"
+         , ")"
+         , "{"
+         , "  (SDL_GetMemoryFunctions)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_226182971f75d2c0 ("
+         , "  SDL_malloc_func arg1,"
+         , "  SDL_calloc_func arg2,"
+         , "  SDL_realloc_func arg3,"
+         , "  SDL_free_func arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetMemoryFunctions)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void *hs_bindgen_9900ed39a18caec5 ("
+         , "  size_t arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_aligned_alloc)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_2bf7e303c1a730bf ("
+         , "  void *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_aligned_free)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_4528828ea69b3f8b (void)"
+         , "{"
+         , "  return (SDL_GetNumAllocations)();"
+         , "}"
+         , "SDL_Environment *hs_bindgen_e1f4a04ee814291a (void)"
+         , "{"
+         , "  return (SDL_GetEnvironment)();"
+         , "}"
+         , "SDL_Environment *hs_bindgen_e85a9062a561d535 ("
+         , "  _Bool arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateEnvironment)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_5beeb06044229d5f ("
+         , "  SDL_Environment *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetEnvironmentVariable)(arg1, arg2);"
+         , "}"
+         , "char **hs_bindgen_b31ecc5c3d715978 ("
+         , "  SDL_Environment *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetEnvironmentVariables)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_a9acd1c932154b24 ("
+         , "  SDL_Environment *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  _Bool arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetEnvironmentVariable)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_c64095b9c616bfe0 ("
+         , "  SDL_Environment *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_UnsetEnvironmentVariable)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_099a6ae1ccd5370b ("
+         , "  SDL_Environment *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyEnvironment)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_bf38503a85842347 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_getenv)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_8bb86791a34eff6a ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_getenv_unsafe)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_07289159390730ef ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_setenv_unsafe)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_8eb1656d4bfcd1be ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_unsetenv_unsafe)(arg1);"
+         , "}"
+         , "void hs_bindgen_95192c7f785c4c45 ("
+         , "  void *arg1,"
+         , "  size_t arg2,"
+         , "  size_t arg3,"
+         , "  SDL_CompareCallback arg4"
+         , ")"
+         , "{"
+         , "  (SDL_qsort)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void *hs_bindgen_e3d85c2fcc0e0182 ("
+         , "  void const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3,"
+         , "  size_t arg4,"
+         , "  SDL_CompareCallback arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_bsearch)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_7a30995c664569a4 ("
+         , "  void *arg1,"
+         , "  size_t arg2,"
+         , "  size_t arg3,"
+         , "  SDL_CompareCallback_r arg4,"
+         , "  void *arg5"
+         , ")"
+         , "{"
+         , "  (SDL_qsort_r)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void *hs_bindgen_57399b9b8aa9f8f0 ("
+         , "  void const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3,"
+         , "  size_t arg4,"
+         , "  SDL_CompareCallback_r arg5,"
+         , "  void *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_bsearch_r)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "signed int hs_bindgen_a928603d6470ca50 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_abs)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_89185a009225cfaf ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isalpha)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_1ab6c2f3868de0bb ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isalnum)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_3c28b4a4af971951 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isblank)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_13a0eb9bfa9faec7 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_iscntrl)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_9fae2f93c08cfbf0 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isdigit)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_0f033c6150a762a3 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isxdigit)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_9b835961c1753aa6 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ispunct)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_37bfc6e46aee6fcc ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isspace)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_6a23210549f82553 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isupper)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_4ef887be849a9002 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_islower)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_258633f7820b5c3c ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isprint)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_64e7a8597c7c9710 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isgraph)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_c1347761ea69159d ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_toupper)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_b3fecd41676fe4be ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_tolower)(arg1);"
+         , "}"
+         , "Uint16 hs_bindgen_35ff41be4e4da9d1 ("
+         , "  Uint16 arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_crc16)(arg1, arg2, arg3);"
+         , "}"
+         , "Uint32 hs_bindgen_6755f946704473dc ("
+         , "  Uint32 arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_crc32)(arg1, arg2, arg3);"
+         , "}"
+         , "Uint32 hs_bindgen_4538e03ee60f6976 ("
+         , "  void const *arg1,"
+         , "  size_t arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_murmur3_32)(arg1, arg2, arg3);"
+         , "}"
+         , "void *hs_bindgen_006ad9913290aee0 ("
+         , "  void *arg1,"
+         , "  Uint32 arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_memset4)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_f8312f3094e9811f ("
+         , "  void const *arg1,"
+         , "  void const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_memcmp)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_7819cc3f05f6e767 ("
+         , "  wchar_t const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_wcslen)(arg1);"
+         , "}"
+         , "size_t hs_bindgen_4d4c9962d27e8c57 ("
+         , "  wchar_t const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsnlen)(arg1, arg2);"
+         , "}"
+         , "size_t hs_bindgen_6a63636fffe52a27 ("
+         , "  wchar_t *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_wcslcpy)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_ae63311931250a61 ("
+         , "  wchar_t *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_wcslcat)(arg1, arg2, arg3);"
+         , "}"
+         , "wchar_t *hs_bindgen_0c56a99a680dde86 ("
+         , "  wchar_t const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsdup)(arg1);"
+         , "}"
+         , "wchar_t *hs_bindgen_0e15f64725300a1d ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsstr)(arg1, arg2);"
+         , "}"
+         , "wchar_t *hs_bindgen_ed81408c495114ac ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsnstr)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_523128c66baf772a ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_wcscmp)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_ae16252c87514b75 ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsncmp)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_2a1f0e71a040879b ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_wcscasecmp)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_1c13738568f12d1d ("
+         , "  wchar_t const *arg1,"
+         , "  wchar_t const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_wcsncasecmp)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_59a6bfea24e96b34 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_strlen)(arg1);"
+         , "}"
+         , "size_t hs_bindgen_c8b4424317df84e9 ("
+         , "  char const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strnlen)(arg1, arg2);"
+         , "}"
+         , "size_t hs_bindgen_e26f240b36c1f7f4 ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strlcpy)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_a6570a6c65177caf ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_utf8strlcpy)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_6776d8c4c9824b69 ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strlcat)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_642470a5439764a1 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_strdup)(arg1);"
+         , "}"
+         , "char *hs_bindgen_2d11135d4a4cd09d ("
+         , "  char const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strndup)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_3e344b4dbd1fefd5 ("
+         , "  char *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_strrev)(arg1);"
+         , "}"
+         , "char *hs_bindgen_2a6a16beae86f690 ("
+         , "  char *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_strupr)(arg1);"
+         , "}"
+         , "char *hs_bindgen_d398f95cc6b941fb ("
+         , "  char *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_strlwr)(arg1);"
+         , "}"
+         , "char *hs_bindgen_ce84b72a37d721aa ("
+         , "  char const *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strchr)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_42f6725f3eb6c437 ("
+         , "  char const *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strrchr)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_4dd450b42cd71d7b ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strstr)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_84a9d060fbe6dadf ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strnstr)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_81f801141b3ad731 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strcasestr)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_409faece247c319b ("
+         , "  char *arg1,"
+         , "  char const *arg2,"
+         , "  char **arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strtok_r)(arg1, arg2, arg3);"
+         , "}"
+         , "size_t hs_bindgen_36470941402cdd53 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_utf8strlen)(arg1);"
+         , "}"
+         , "size_t hs_bindgen_479082db51ecf46b ("
+         , "  char const *arg1,"
+         , "  size_t arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_utf8strnlen)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_c69b2ef36677f953 ("
+         , "  signed int arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_itoa)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_dbe69ee767be00c8 ("
+         , "  unsigned int arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_uitoa)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_94ca108dca07ec6f ("
+         , "  signed long long arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_lltoa)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_d122b88ccc45fe33 ("
+         , "  unsigned long long arg1,"
+         , "  char *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_ulltoa)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_ca9f4297368b5437 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_atoi)(arg1);"
+         , "}"
+         , "double hs_bindgen_81f2fcbff595d766 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_atof)(arg1);"
+         , "}"
+         , "signed long long hs_bindgen_29424912342d9a55 ("
+         , "  char const *arg1,"
+         , "  char **arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strtoll)(arg1, arg2, arg3);"
+         , "}"
+         , "unsigned long long hs_bindgen_fe908f5a8d183e7b ("
+         , "  char const *arg1,"
+         , "  char **arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strtoull)(arg1, arg2, arg3);"
+         , "}"
+         , "double hs_bindgen_93115f1648467a21 ("
+         , "  char const *arg1,"
+         , "  char **arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strtod)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_1165e1ac637a910f ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strcmp)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_6286679cc5d88e95 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strncmp)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_592440e0cc89a66c ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strcasecmp)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_9a7486257c6bf068 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  size_t arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_strncasecmp)(arg1, arg2, arg3);"
+         , "}"
+         , "char *hs_bindgen_e53784dcceef6c88 ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_strpbrk)(arg1, arg2);"
+         , "}"
+         , "Uint32 hs_bindgen_5010b6d322eef729 ("
+         , "  char const **arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_StepUTF8)(arg1, arg2);"
+         , "}"
+         , "Uint32 hs_bindgen_e9d45c14c965c799 ("
+         , "  char const *arg1,"
+         , "  char const **arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_StepBackUTF8)(arg1, arg2);"
+         , "}"
+         , "char *hs_bindgen_2621d8f742eba582 ("
+         , "  Uint32 arg1,"
+         , "  char *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_UCS4ToUTF8)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_1620e07051837ddb ("
+         , "  Uint64 arg1"
+         , ")"
+         , "{"
+         , "  (SDL_srand)(arg1);"
+         , "}"
+         , "Sint32 hs_bindgen_bb32712cf4e3959c ("
+         , "  Sint32 arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_rand)(arg1);"
+         , "}"
+         , "float hs_bindgen_4354197498dc7635 (void)"
+         , "{"
+         , "  return (SDL_randf)();"
+         , "}"
+         , "Uint32 hs_bindgen_eed752851bd8b3e2 (void)"
+         , "{"
+         , "  return (SDL_rand_bits)();"
+         , "}"
+         , "Sint32 hs_bindgen_e31222be551ae9d1 ("
+         , "  Uint64 *arg1,"
+         , "  Sint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_rand_r)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_b728fa521e1f33ba ("
+         , "  Uint64 *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_randf_r)(arg1);"
+         , "}"
+         , "Uint32 hs_bindgen_1779b3d1ac6c6ca0 ("
+         , "  Uint64 *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_rand_bits_r)(arg1);"
+         , "}"
+         , "double hs_bindgen_77d2b09de2f907bb ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_acos)(arg1);"
+         , "}"
+         , "float hs_bindgen_a7dfe79fdc884d97 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_acosf)(arg1);"
+         , "}"
+         , "double hs_bindgen_c1c2c5b2424934f7 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_asin)(arg1);"
+         , "}"
+         , "float hs_bindgen_c0162f35a592c4d6 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_asinf)(arg1);"
+         , "}"
+         , "double hs_bindgen_62e948cecf885b31 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_atan)(arg1);"
+         , "}"
+         , "float hs_bindgen_429e4b987b465ff9 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_atanf)(arg1);"
+         , "}"
+         , "double hs_bindgen_dd25876f2db3e27f ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_atan2)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_8131501831457d98 ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_atan2f)(arg1, arg2);"
+         , "}"
+         , "double hs_bindgen_6654a059aee78106 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ceil)(arg1);"
+         , "}"
+         , "float hs_bindgen_ad644f683da406f9 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ceilf)(arg1);"
+         , "}"
+         , "double hs_bindgen_8091ddede7c04cbc ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_copysign)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_b3f4ceb6b2fe20ee ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_copysignf)(arg1, arg2);"
+         , "}"
+         , "double hs_bindgen_a3469aec056551e2 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_cos)(arg1);"
+         , "}"
+         , "float hs_bindgen_905fd229e6d8b35e ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_cosf)(arg1);"
+         , "}"
+         , "double hs_bindgen_1512e406037d12ac ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_exp)(arg1);"
+         , "}"
+         , "float hs_bindgen_d3dd134efe3abfff ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_expf)(arg1);"
+         , "}"
+         , "double hs_bindgen_52ba4ac175596d0a ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_fabs)(arg1);"
+         , "}"
+         , "float hs_bindgen_184b19c145435e41 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_fabsf)(arg1);"
+         , "}"
+         , "double hs_bindgen_f490c8eee1698a66 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_floor)(arg1);"
+         , "}"
+         , "float hs_bindgen_2f0b4572dde60cf4 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_floorf)(arg1);"
+         , "}"
+         , "double hs_bindgen_0babb20dade49b7a ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_trunc)(arg1);"
+         , "}"
+         , "float hs_bindgen_90bf99d352a2662e ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_truncf)(arg1);"
+         , "}"
+         , "double hs_bindgen_01e3fd06ce04c71f ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_fmod)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_d31c39dbd23d1312 ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_fmodf)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_a7c939d2e78d66af ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isinf)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_dd1421aaa48b6683 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isinff)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_8b37e78060d7faba ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isnan)(arg1);"
+         , "}"
+         , "signed int hs_bindgen_a7fc9d37cba1e7fb ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_isnanf)(arg1);"
+         , "}"
+         , "double hs_bindgen_e20d665d8e9d64dc ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_log)(arg1);"
+         , "}"
+         , "float hs_bindgen_7e096c5f793dcab0 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_logf)(arg1);"
+         , "}"
+         , "double hs_bindgen_923087147ca0e620 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_log10)(arg1);"
+         , "}"
+         , "float hs_bindgen_bfd8d2db495dd53c ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_log10f)(arg1);"
+         , "}"
+         , "double hs_bindgen_b899f8ade3afe831 ("
+         , "  double arg1,"
+         , "  double *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_modf)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_6ff7524556040016 ("
+         , "  float arg1,"
+         , "  float *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_modff)(arg1, arg2);"
+         , "}"
+         , "double hs_bindgen_fd54b81ef06bf15c ("
+         , "  double arg1,"
+         , "  double arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_pow)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_e6e1cafad3d1ca48 ("
+         , "  float arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_powf)(arg1, arg2);"
+         , "}"
+         , "double hs_bindgen_263d784275f69beb ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_round)(arg1);"
+         , "}"
+         , "float hs_bindgen_11783f7b112ca4ce ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_roundf)(arg1);"
+         , "}"
+         , "double hs_bindgen_e6bb2ac10b5df120 ("
+         , "  double arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_scalbn)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_98b72e0135481fa6 ("
+         , "  float arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_scalbnf)(arg1, arg2);"
+         , "}"
+         , "double hs_bindgen_7f63dcf686d5381e ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_sin)(arg1);"
+         , "}"
+         , "float hs_bindgen_3b77259c6cddba0e ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_sinf)(arg1);"
+         , "}"
+         , "double hs_bindgen_911bffe699be4bcc ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_sqrt)(arg1);"
+         , "}"
+         , "float hs_bindgen_44ac9f7898a32796 ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_sqrtf)(arg1);"
+         , "}"
+         , "double hs_bindgen_aece2559e5dc0392 ("
+         , "  double arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_tan)(arg1);"
+         , "}"
+         , "float hs_bindgen_c528bf7014ccff4b ("
+         , "  float arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_tanf)(arg1);"
+         , "}"
+         , "SDL_iconv_t hs_bindgen_f0bd929aee0b42ea ("
+         , "  char const *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_iconv_open)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_3f715b186320f23e ("
+         , "  SDL_iconv_t arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_iconv_close)(arg1);"
+         , "}"
+         , "size_t hs_bindgen_97b150fcf3a8acd6 ("
+         , "  SDL_iconv_t arg1,"
+         , "  char const **arg2,"
+         , "  size_t *arg3,"
+         , "  char **arg4,"
+         , "  size_t *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_iconv)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "char *hs_bindgen_75bcf8b9f2da9e0a ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  size_t arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_iconv_string)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_51dba5ddaea9f2e4 ("
+         , "  size_t arg1,"
+         , "  size_t arg2,"
+         , "  size_t *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_size_mul_check_overflow_builtin)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_7509bdb3d2cd84da ("
+         , "  size_t arg1,"
+         , "  size_t arg2,"
+         , "  size_t *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_size_add_check_overflow_builtin)(arg1, arg2, arg3);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_malloc@
+foreign import ccall unsafe "hs_bindgen_5bd8a699d72971c5"
+  hs_bindgen_5bd8a699d72971c5_base
+    :: BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_malloc@
+hs_bindgen_5bd8a699d72971c5
+  :: HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_5bd8a699d72971c5 =
+  BG.fromFFIType hs_bindgen_5bd8a699d72971c5_base
+
+-- | Allocate uninitialized memory.
+--
+--     The allocated memory returned by this function must be freed with @SDL_free()@.
+--
+--     If @size@ is 0, it will be set to 1.
+--
+--     If the allocation is successful, the returned pointer is guaranteed to be aligned to either the /fundamental alignment/ (@alignof(max_align_t)@ in C11 and later) or @2 * sizeof(void *)@, whichever is smaller. Use @SDL_aligned_alloc()@ if you need to allocate memory aligned to an alignment greater than this guarantee.
+--
+--     [Returns]: a pointer to the allocated memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_free', SDL_calloc, SDL_realloc, 'sDL_aligned_alloc'
+--
+--     [C declaration]: @SDL_malloc@, defined at @SDL3\/SDL_stdinc.h 1341:47@
+sDL_malloc
+  :: HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size to allocate.
+  -> IO (BG.Ptr BG.Void)
+sDL_malloc = hs_bindgen_5bd8a699d72971c5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_calloc@
+foreign import ccall unsafe "hs_bindgen_08746ff05ca3003c"
+  hs_bindgen_08746ff05ca3003c_base
+    :: BG.Word64
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_calloc@
+hs_bindgen_08746ff05ca3003c
+  :: HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_08746ff05ca3003c =
+  BG.fromFFIType hs_bindgen_08746ff05ca3003c_base
+
+-- | [C declaration]: @SDL_calloc@, defined at @SDL3\/SDL_stdinc.h 1366:69@
+sDL_calloc
+  :: HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @nmemb@
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @size@
+  -> IO (BG.Ptr BG.Void)
+sDL_calloc = hs_bindgen_08746ff05ca3003c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_realloc@
+foreign import ccall unsafe "hs_bindgen_0730e7e13356c626"
+  hs_bindgen_0730e7e13356c626_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_realloc@
+hs_bindgen_0730e7e13356c626
+  :: BG.Ptr BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_0730e7e13356c626 =
+  BG.fromFFIType hs_bindgen_0730e7e13356c626_base
+
+-- | [C declaration]: @SDL_realloc@, defined at @SDL3\/SDL_stdinc.h 1406:54@
+sDL_realloc
+  :: BG.Ptr BG.Void
+  -- ^ [C declaration]: @mem@
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @size@
+  -> IO (BG.Ptr BG.Void)
+sDL_realloc = hs_bindgen_0730e7e13356c626
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_free@
+foreign import ccall unsafe "hs_bindgen_22f31e5d111da6c1"
+  hs_bindgen_22f31e5d111da6c1_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_free@
+hs_bindgen_22f31e5d111da6c1
+  :: BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_22f31e5d111da6c1 =
+  BG.fromFFIType hs_bindgen_22f31e5d111da6c1_base
+
+-- | Free allocated memory.
+--
+--     The pointer is no longer valid after this call and cannot be dereferenced anymore.
+--
+--     If @mem@ is NULL, this function does nothing.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_malloc', SDL_calloc, SDL_realloc
+--
+--     [C declaration]: @SDL_free@, defined at @SDL3\/SDL_stdinc.h 1426:34@
+sDL_free
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to allocated memory, or NULL.
+  -> IO ()
+sDL_free = hs_bindgen_22f31e5d111da6c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetOriginalMemoryFunctions@
+foreign import ccall unsafe "hs_bindgen_f517f867f38f6071"
+  hs_bindgen_f517f867f38f6071_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetOriginalMemoryFunctions@
+hs_bindgen_f517f867f38f6071
+  :: BG.Ptr SDL_malloc_func
+  -> BG.Ptr SDL_calloc_func
+  -> BG.Ptr SDL_realloc_func
+  -> BG.Ptr SDL_free_func
+  -> IO ()
+hs_bindgen_f517f867f38f6071 =
+  BG.fromFFIType hs_bindgen_f517f867f38f6071_base
+
+-- | Get the original set of SDL memory functions.
+--
+--     This is what SDL_malloc and friends will use by default, if there has been no call to SDL_SetMemoryFunctions. This is not necessarily using the C runtime\'s @malloc@ functions behind the scenes! Different platforms and build configurations might do any number of unexpected things.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetOriginalMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1524:34@
+sDL_GetOriginalMemoryFunctions
+  :: BG.Ptr SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: filled with malloc function.
+  -> BG.Ptr SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: filled with calloc function.
+  -> BG.Ptr SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: filled with realloc function.
+  -> BG.Ptr SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: filled with free function.
+  -> IO ()
+sDL_GetOriginalMemoryFunctions =
+  hs_bindgen_f517f867f38f6071
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetMemoryFunctions@
+foreign import ccall unsafe "hs_bindgen_25189a0da3d426a6"
+  hs_bindgen_25189a0da3d426a6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetMemoryFunctions@
+hs_bindgen_25189a0da3d426a6
+  :: BG.Ptr SDL_malloc_func
+  -> BG.Ptr SDL_calloc_func
+  -> BG.Ptr SDL_realloc_func
+  -> BG.Ptr SDL_free_func
+  -> IO ()
+hs_bindgen_25189a0da3d426a6 =
+  BG.fromFFIType hs_bindgen_25189a0da3d426a6_base
+
+-- | Get the current set of SDL memory functions.
+--
+--     [Thread safety]: This does not hold a lock, so do not call this in the unlikely event of a background thread calling SDL_SetMemoryFunctions simultaneously.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetMemoryFunctions', 'sDL_GetOriginalMemoryFunctions'
+--
+--     [C declaration]: @SDL_GetMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1546:34@
+sDL_GetMemoryFunctions
+  :: BG.Ptr SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: filled with malloc function.
+  -> BG.Ptr SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: filled with calloc function.
+  -> BG.Ptr SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: filled with realloc function.
+  -> BG.Ptr SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: filled with free function.
+  -> IO ()
+sDL_GetMemoryFunctions = hs_bindgen_25189a0da3d426a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_SetMemoryFunctions@
+foreign import ccall unsafe "hs_bindgen_226182971f75d2c0"
+  hs_bindgen_226182971f75d2c0_base
+    :: BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_SetMemoryFunctions@
+hs_bindgen_226182971f75d2c0
+  :: SDL_malloc_func
+  -> SDL_calloc_func
+  -> SDL_realloc_func
+  -> SDL_free_func
+  -> IO BG.CBool
+hs_bindgen_226182971f75d2c0 =
+  BG.fromFFIType hs_bindgen_226182971f75d2c0_base
+
+-- | Replace SDL\'s memory allocation functions with a custom set.
+--
+--     It is not safe to call this function once any allocations have been made, as future calls to SDL_free will use the new allocator, even if they came from an SDL_malloc made with the old one!
+--
+--     If used, usually this needs to be the first call made into the SDL library, if not the very first thing done at program startup time.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but one should not replace the memory functions once any allocations are made!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetMemoryFunctions', 'sDL_GetOriginalMemoryFunctions'
+--
+--     [C declaration]: @SDL_SetMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1577:34@
+sDL_SetMemoryFunctions
+  :: SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: custom malloc function.
+  -> SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: custom calloc function.
+  -> SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: custom realloc function.
+  -> SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: custom free function.
+  -> IO BG.CBool
+sDL_SetMemoryFunctions = hs_bindgen_226182971f75d2c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_aligned_alloc@
+foreign import ccall unsafe "hs_bindgen_9900ed39a18caec5"
+  hs_bindgen_9900ed39a18caec5_base
+    :: BG.Word64
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_aligned_alloc@
+hs_bindgen_9900ed39a18caec5
+  :: HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_9900ed39a18caec5 =
+  BG.fromFFIType hs_bindgen_9900ed39a18caec5_base
+
+-- | Allocate memory aligned to a specific alignment.
+--
+--     The memory returned by this function must be freed with @SDL_aligned_free()@, /not/ @SDL_free()@.
+--
+--     If @alignment@ is less than the size of @void *@, it will be increased to match that.
+--
+--     The returned memory address will be a multiple of the alignment value, and the size of the memory allocated will be a multiple of the alignment value.
+--
+--     [Returns]: a pointer to the aligned memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_aligned_free'
+--
+--     [C declaration]: @SDL_aligned_alloc@, defined at @SDL3\/SDL_stdinc.h 1604:47@
+sDL_aligned_alloc
+  :: HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@alignment@]: the alignment of the memory.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size to allocate.
+  -> IO (BG.Ptr BG.Void)
+sDL_aligned_alloc = hs_bindgen_9900ed39a18caec5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_aligned_free@
+foreign import ccall unsafe "hs_bindgen_2bf7e303c1a730bf"
+  hs_bindgen_2bf7e303c1a730bf_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_aligned_free@
+hs_bindgen_2bf7e303c1a730bf
+  :: BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_2bf7e303c1a730bf =
+  BG.fromFFIType hs_bindgen_2bf7e303c1a730bf_base
+
+-- | Free memory allocated by @SDL_aligned_alloc()@.
+--
+--     The pointer is no longer valid after this call and cannot be dereferenced anymore.
+--
+--     If @mem@ is NULL, this function does nothing.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_aligned_alloc'
+--
+--     [C declaration]: @SDL_aligned_free@, defined at @SDL3\/SDL_stdinc.h 1622:34@
+sDL_aligned_free
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer previously returned by @SDL_aligned_alloc()@, or NULL.
+  -> IO ()
+sDL_aligned_free = hs_bindgen_2bf7e303c1a730bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetNumAllocations@
+foreign import ccall unsafe "hs_bindgen_4528828ea69b3f8b"
+  hs_bindgen_4528828ea69b3f8b_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetNumAllocations@
+hs_bindgen_4528828ea69b3f8b :: IO BG.CInt
+hs_bindgen_4528828ea69b3f8b =
+  BG.fromFFIType hs_bindgen_4528828ea69b3f8b_base
+
+-- | Get the number of outstanding (unfreed) allocations.
+--
+--     [Returns]: the number of allocations or -1 if allocation counting is disabled.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetNumAllocations@, defined at @SDL3\/SDL_stdinc.h 1634:33@
+sDL_GetNumAllocations :: IO BG.CInt
+sDL_GetNumAllocations = hs_bindgen_4528828ea69b3f8b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetEnvironment@
+foreign import ccall unsafe "hs_bindgen_e1f4a04ee814291a"
+  hs_bindgen_e1f4a04ee814291a_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetEnvironment@
+hs_bindgen_e1f4a04ee814291a :: IO (BG.Ptr SDL_Environment)
+hs_bindgen_e1f4a04ee814291a =
+  BG.fromFFIType hs_bindgen_e1f4a04ee814291a_base
+
+-- | Get the process environment.
+--
+--     This is initialized at application start and is not affected by setenv() and unsetenv() calls after that point. Use @SDL_SetEnvironmentVariable()@ and @SDL_UnsetEnvironmentVariable()@ if you want to modify this environment, or @SDL_setenv_unsafe()@ or @SDL_unsetenv_unsafe()@ if you want changes to persist in the C runtime environment after SDL_Quit().
+--
+--     [Returns]: a pointer to the environment for the process or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_GetEnvironment@, defined at @SDL3\/SDL_stdinc.h 1672:47@
+sDL_GetEnvironment :: IO (BG.Ptr SDL_Environment)
+sDL_GetEnvironment = hs_bindgen_e1f4a04ee814291a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_CreateEnvironment@
+foreign import ccall unsafe "hs_bindgen_e85a9062a561d535"
+  hs_bindgen_e85a9062a561d535_base
+    :: BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_CreateEnvironment@
+hs_bindgen_e85a9062a561d535
+  :: BG.CBool
+  -> IO (BG.Ptr SDL_Environment)
+hs_bindgen_e85a9062a561d535 =
+  BG.fromFFIType hs_bindgen_e85a9062a561d535_base
+
+-- | Create a set of environment variables
+--
+--     [Returns]: a pointer to the new environment or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: If @populated@ is false, it is safe to call this function from any thread, otherwise it is safe if no other threads are calling setenv() or unsetenv()
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable', 'sDL_DestroyEnvironment'
+--
+--     [C declaration]: @SDL_CreateEnvironment@, defined at @SDL3\/SDL_stdinc.h 1694:47@
+sDL_CreateEnvironment
+  :: BG.CBool
+  -- ^
+  --
+  --           [@populated@]: true to initialize it from the C runtime environment, false to create an empty environment.
+  -> IO (BG.Ptr SDL_Environment)
+sDL_CreateEnvironment = hs_bindgen_e85a9062a561d535
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetEnvironmentVariable@
+foreign import ccall unsafe "hs_bindgen_5beeb06044229d5f"
+  hs_bindgen_5beeb06044229d5f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetEnvironmentVariable@
+hs_bindgen_5beeb06044229d5f
+  :: BG.Ptr SDL_Environment
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_5beeb06044229d5f =
+  BG.fromFFIType hs_bindgen_5beeb06044229d5f_base
+
+-- | Get the value of a variable in the environment.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_GetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1714:42@
+sDL_GetEnvironmentVariable
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetEnvironmentVariable =
+  hs_bindgen_5beeb06044229d5f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetEnvironmentVariables@
+foreign import ccall unsafe "hs_bindgen_b31ecc5c3d715978"
+  hs_bindgen_b31ecc5c3d715978_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_GetEnvironmentVariables@
+hs_bindgen_b31ecc5c3d715978
+  :: BG.Ptr SDL_Environment
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+hs_bindgen_b31ecc5c3d715978 =
+  BG.fromFFIType hs_bindgen_b31ecc5c3d715978_base
+
+-- | Get all variables in the environment.
+--
+--     [Returns]: a NULL terminated array of pointers to environment variables in the form \"variable=value\" or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with @SDL_free()@ when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_GetEnvironmentVariables@, defined at @SDL3\/SDL_stdinc.h 1735:37@
+sDL_GetEnvironmentVariables
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to query.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+sDL_GetEnvironmentVariables =
+  hs_bindgen_b31ecc5c3d715978
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_SetEnvironmentVariable@
+foreign import ccall unsafe "hs_bindgen_a9acd1c932154b24"
+  hs_bindgen_a9acd1c932154b24_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_SetEnvironmentVariable@
+hs_bindgen_a9acd1c932154b24
+  :: BG.Ptr SDL_Environment
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_a9acd1c932154b24 =
+  BG.fromFFIType hs_bindgen_a9acd1c932154b24_base
+
+-- | Set the value of a variable in the environment.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_SetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1759:34@
+sDL_SetEnvironmentVariable
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the variable to set.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@overwrite@]: true to overwrite the variable if it exists, false to return success without setting the variable if it already exists.
+  -> IO BG.CBool
+sDL_SetEnvironmentVariable =
+  hs_bindgen_a9acd1c932154b24
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_UnsetEnvironmentVariable@
+foreign import ccall unsafe "hs_bindgen_c64095b9c616bfe0"
+  hs_bindgen_c64095b9c616bfe0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_UnsetEnvironmentVariable@
+hs_bindgen_c64095b9c616bfe0
+  :: BG.Ptr SDL_Environment
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_c64095b9c616bfe0 =
+  BG.fromFFIType hs_bindgen_c64095b9c616bfe0_base
+
+-- | Clear a variable from the environment.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetEnvironment', 'sDL_CreateEnvironment', 'sDL_GetEnvironmentVariable', 'sDL_GetEnvironmentVariables', 'sDL_SetEnvironmentVariable', 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_UnsetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1780:34@
+sDL_UnsetEnvironmentVariable
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to unset.
+  -> IO BG.CBool
+sDL_UnsetEnvironmentVariable =
+  hs_bindgen_c64095b9c616bfe0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_DestroyEnvironment@
+foreign import ccall unsafe "hs_bindgen_099a6ae1ccd5370b"
+  hs_bindgen_099a6ae1ccd5370b_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_DestroyEnvironment@
+hs_bindgen_099a6ae1ccd5370b
+  :: BG.Ptr SDL_Environment
+  -> IO ()
+hs_bindgen_099a6ae1ccd5370b =
+  BG.fromFFIType hs_bindgen_099a6ae1ccd5370b_base
+
+-- | Destroy a set of environment variables.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the environment is no longer in use.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateEnvironment'
+--
+--     [C declaration]: @SDL_DestroyEnvironment@, defined at @SDL3\/SDL_stdinc.h 1794:34@
+sDL_DestroyEnvironment
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to destroy.
+  -> IO ()
+sDL_DestroyEnvironment = hs_bindgen_099a6ae1ccd5370b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_getenv@
+foreign import ccall unsafe "hs_bindgen_bf38503a85842347"
+  hs_bindgen_bf38503a85842347_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_getenv@
+hs_bindgen_bf38503a85842347
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_bf38503a85842347 =
+  BG.fromFFIType hs_bindgen_bf38503a85842347_base
+
+-- | Get the value of a variable in the environment.
+--
+--     This function uses SDL\'s cached copy of the environment and is thread-safe.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_getenv@, defined at @SDL3\/SDL_stdinc.h 1809:42@
+sDL_getenv
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_getenv = hs_bindgen_bf38503a85842347
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_getenv_unsafe@
+foreign import ccall unsafe "hs_bindgen_8bb86791a34eff6a"
+  hs_bindgen_8bb86791a34eff6a_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_getenv_unsafe@
+hs_bindgen_8bb86791a34eff6a
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_8bb86791a34eff6a =
+  BG.fromFFIType hs_bindgen_8bb86791a34eff6a_base
+
+-- | Get the value of a variable in the environment.
+--
+--     This function bypasses SDL\'s cached copy of the environment and is not thread-safe.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: This function is not thread safe, consider using @SDL_getenv()@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_getenv'
+--
+--     [C declaration]: @SDL_getenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1828:42@
+sDL_getenv_unsafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_getenv_unsafe = hs_bindgen_8bb86791a34eff6a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_setenv_unsafe@
+foreign import ccall unsafe "hs_bindgen_07289159390730ef"
+  hs_bindgen_07289159390730ef_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_setenv_unsafe@
+hs_bindgen_07289159390730ef
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_07289159390730ef =
+  BG.fromFFIType hs_bindgen_07289159390730ef_base
+
+-- | Set the value of a variable in the environment.
+--
+--     [Returns]: 0 on success, -1 on error.
+--
+--     [Thread safety]: This function is not thread safe, consider using @SDL_SetEnvironmentVariable()@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_setenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1846:33@
+sDL_setenv_unsafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the variable to set.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@overwrite@]: 1 to overwrite the variable if it exists, 0 to return success without setting the variable if it already exists.
+  -> IO BG.CInt
+sDL_setenv_unsafe = hs_bindgen_07289159390730ef
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_unsetenv_unsafe@
+foreign import ccall unsafe "hs_bindgen_8eb1656d4bfcd1be"
+  hs_bindgen_8eb1656d4bfcd1be_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_unsetenv_unsafe@
+hs_bindgen_8eb1656d4bfcd1be
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_8eb1656d4bfcd1be =
+  BG.fromFFIType hs_bindgen_8eb1656d4bfcd1be_base
+
+-- | Clear a variable from the environment.
+--
+--     [Returns]: 0 on success, -1 on error.
+--
+--     [Thread safety]: This function is not thread safe, consider using @SDL_UnsetEnvironmentVariable()@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_UnsetEnvironmentVariable'
+--
+--     [C declaration]: @SDL_unsetenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1861:33@
+sDL_unsetenv_unsafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to unset.
+  -> IO BG.CInt
+sDL_unsetenv_unsafe = hs_bindgen_8eb1656d4bfcd1be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_qsort@
+foreign import ccall unsafe "hs_bindgen_95192c7f785c4c45"
+  hs_bindgen_95192c7f785c4c45_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.FunPtr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_qsort@
+hs_bindgen_95192c7f785c4c45
+  :: BG.Ptr BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> SDL_CompareCallback
+  -> IO ()
+hs_bindgen_95192c7f785c4c45 =
+  BG.fromFFIType hs_bindgen_95192c7f785c4c45_base
+
+-- | Sort an array.
+--
+--     For example:
+--
+--     @
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *a, const void *b)
+--     {
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->n \< B->n) {
+--             return -1;
+--         } else if (B->n \< A->n) {
+--             return 1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 3, \"third\" }, { 1, \"first\" }, { 2, \"second\" }
+--     };
+--
+--     SDL_qsort(values, SDL_arraysize(values), sizeof(values[0]), compare);
+--     @
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch', 'sDL_qsort_r'
+--
+--     [C declaration]: @SDL_qsort@, defined at @SDL3\/SDL_stdinc.h 1923:34@
+sDL_qsort
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> IO ()
+sDL_qsort = hs_bindgen_95192c7f785c4c45
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_bsearch@
+foreign import ccall unsafe "hs_bindgen_e3d85c2fcc0e0182"
+  hs_bindgen_e3d85c2fcc0e0182_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.FunPtr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_bsearch@
+hs_bindgen_e3d85c2fcc0e0182
+  :: PtrConst.PtrConst BG.Void
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> SDL_CompareCallback
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_e3d85c2fcc0e0182 =
+  BG.fromFFIType hs_bindgen_e3d85c2fcc0e0182_base
+
+-- | Perform a binary search on a previously sorted array.
+--
+--     For example:
+--
+--     @
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *a, const void *b)
+--     {
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->n \< B->n) {
+--             return -1;
+--         } else if (B->n \< A->n) {
+--             return 1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 1, \"first\" }, { 2, \"second\" }, { 3, \"third\" }
+--     };
+--     data key = { 2, NULL };
+--
+--     data *result = SDL_bsearch(&key, values, SDL_arraysize(values), sizeof(values[0]), compare);
+--     @
+--
+--     [Returns]: a pointer to the matching element in the array, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch_r', 'sDL_qsort'
+--
+--     [C declaration]: @SDL_bsearch@, defined at @SDL3\/SDL_stdinc.h 1973:36@
+sDL_bsearch
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@key@]: a pointer to a key equal to the element being searched for.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> IO (BG.Ptr BG.Void)
+sDL_bsearch = hs_bindgen_e3d85c2fcc0e0182
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_qsort_r@
+foreign import ccall unsafe "hs_bindgen_7a30995c664569a4"
+  hs_bindgen_7a30995c664569a4_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_qsort_r@
+hs_bindgen_7a30995c664569a4
+  :: BG.Ptr BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> SDL_CompareCallback_r
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_7a30995c664569a4 =
+  BG.fromFFIType hs_bindgen_7a30995c664569a4_base
+
+-- | Sort an array, passing a userdata pointer to the compare function.
+--
+--     For example:
+--
+--     @
+--     typedef enum {
+--         sort_increasing,
+--         sort_decreasing,
+--     } sort_method;
+--
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *userdata, const void *a, const void *b)
+--     {
+--         sort_method method = (sort_method)(uintptr_t)userdata;
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->key \< B->key) {
+--             return (method == sort_increasing) ? -1 : 1;
+--         } else if (B->key \< A->key) {
+--             return (method == sort_increasing) ? 1 : -1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 3, \"third\" }, { 1, \"first\" }, { 2, \"second\" }
+--     };
+--
+--     SDL_qsort_r(values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing);
+--     @
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch_r', 'sDL_qsort'
+--
+--     [C declaration]: @SDL_qsort_r@, defined at @SDL3\/SDL_stdinc.h 2043:34@
+sDL_qsort_r
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback_r
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to the compare function.
+  -> IO ()
+sDL_qsort_r = hs_bindgen_7a30995c664569a4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_bsearch_r@
+foreign import ccall unsafe "hs_bindgen_57399b9b8aa9f8f0"
+  hs_bindgen_57399b9b8aa9f8f0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word64
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_bsearch_r@
+hs_bindgen_57399b9b8aa9f8f0
+  :: PtrConst.PtrConst BG.Void
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> SDL_CompareCallback_r
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_57399b9b8aa9f8f0 =
+  BG.fromFFIType hs_bindgen_57399b9b8aa9f8f0_base
+
+-- | Perform a binary search on a previously sorted array, passing a userdata pointer to the compare function.
+--
+--     For example:
+--
+--     @
+--     typedef enum {
+--         sort_increasing,
+--         sort_decreasing,
+--     } sort_method;
+--
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *userdata, const void *a, const void *b)
+--     {
+--         sort_method method = (sort_method)(uintptr_t)userdata;
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->key \< B->key) {
+--             return (method == sort_increasing) ? -1 : 1;
+--         } else if (B->key \< A->key) {
+--             return (method == sort_increasing) ? 1 : -1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 1, \"first\" }, { 2, \"second\" }, { 3, \"third\" }
+--     };
+--     data key = { 2, NULL };
+--
+--     data *result = SDL_bsearch_r(&key, values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing);
+--     @
+--
+--     [Returns]: a pointer to the matching element in the array, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_bsearch', 'sDL_qsort_r'
+--
+--     [C declaration]: @SDL_bsearch_r@, defined at @SDL3\/SDL_stdinc.h 2101:36@
+sDL_bsearch_r
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@key@]: a pointer to a key equal to the element being searched for.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback_r
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to the compare function.
+  -> IO (BG.Ptr BG.Void)
+sDL_bsearch_r = hs_bindgen_57399b9b8aa9f8f0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_abs@
+foreign import ccall unsafe "hs_bindgen_a928603d6470ca50"
+  hs_bindgen_a928603d6470ca50_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_abs@
+hs_bindgen_a928603d6470ca50
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_a928603d6470ca50 =
+  BG.fromFFIType hs_bindgen_a928603d6470ca50_base
+
+-- | Compute the absolute value of @x@.
+--
+--     [Returns]: the absolute value of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_abs@, defined at @SDL3\/SDL_stdinc.h 2113:33@
+sDL_abs
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: an integer value.
+  -> IO BG.CInt
+sDL_abs = hs_bindgen_a928603d6470ca50
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isalpha@
+foreign import ccall unsafe "hs_bindgen_89185a009225cfaf"
+  hs_bindgen_89185a009225cfaf_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isalpha@
+hs_bindgen_89185a009225cfaf
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_89185a009225cfaf =
+  BG.fromFFIType hs_bindgen_89185a009225cfaf_base
+
+-- | Query if a character is alphabetic (a letter).
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values for English \'a-z\' and \'A-Z\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isalpha@, defined at @SDL3\/SDL_stdinc.h 2188:33@
+sDL_isalpha
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isalpha = hs_bindgen_89185a009225cfaf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isalnum@
+foreign import ccall unsafe "hs_bindgen_1ab6c2f3868de0bb"
+  hs_bindgen_1ab6c2f3868de0bb_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isalnum@
+hs_bindgen_1ab6c2f3868de0bb
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_1ab6c2f3868de0bb =
+  BG.fromFFIType hs_bindgen_1ab6c2f3868de0bb_base
+
+-- | Query if a character is alphabetic (a letter) or a number.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values for English \'a-z\', \'A-Z\', and \'0-9\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isalnum@, defined at @SDL3\/SDL_stdinc.h 2203:33@
+sDL_isalnum
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isalnum = hs_bindgen_1ab6c2f3868de0bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isblank@
+foreign import ccall unsafe "hs_bindgen_3c28b4a4af971951"
+  hs_bindgen_3c28b4a4af971951_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isblank@
+hs_bindgen_3c28b4a4af971951
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_3c28b4a4af971951 =
+  BG.fromFFIType hs_bindgen_3c28b4a4af971951_base
+
+-- | Report if a character is blank (a space or tab).
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values 0x20 (space) or 0x9 (tab) as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isblank@, defined at @SDL3\/SDL_stdinc.h 2218:33@
+sDL_isblank
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isblank = hs_bindgen_3c28b4a4af971951
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_iscntrl@
+foreign import ccall unsafe "hs_bindgen_13a0eb9bfa9faec7"
+  hs_bindgen_13a0eb9bfa9faec7_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_iscntrl@
+hs_bindgen_13a0eb9bfa9faec7
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_13a0eb9bfa9faec7 =
+  BG.fromFFIType hs_bindgen_13a0eb9bfa9faec7_base
+
+-- | Report if a character is a control character.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values 0 through 0x1F, and 0x7F, as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_iscntrl@, defined at @SDL3\/SDL_stdinc.h 2233:33@
+sDL_iscntrl
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_iscntrl = hs_bindgen_13a0eb9bfa9faec7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isdigit@
+foreign import ccall unsafe "hs_bindgen_9fae2f93c08cfbf0"
+  hs_bindgen_9fae2f93c08cfbf0_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isdigit@
+hs_bindgen_9fae2f93c08cfbf0
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_9fae2f93c08cfbf0 =
+  BG.fromFFIType hs_bindgen_9fae2f93c08cfbf0_base
+
+-- | Report if a character is a numeric digit.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'0\' (0x30) through \'9\' (0x39), as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isdigit@, defined at @SDL3\/SDL_stdinc.h 2248:33@
+sDL_isdigit
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isdigit = hs_bindgen_9fae2f93c08cfbf0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isxdigit@
+foreign import ccall unsafe "hs_bindgen_0f033c6150a762a3"
+  hs_bindgen_0f033c6150a762a3_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isxdigit@
+hs_bindgen_0f033c6150a762a3
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_0f033c6150a762a3 =
+  BG.fromFFIType hs_bindgen_0f033c6150a762a3_base
+
+-- | Report if a character is a hexadecimal digit.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'A\' through \'F\', \'a\' through \'f\', and \'0\' through \'9\', as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isxdigit@, defined at @SDL3\/SDL_stdinc.h 2263:33@
+sDL_isxdigit
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isxdigit = hs_bindgen_0f033c6150a762a3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_ispunct@
+foreign import ccall unsafe "hs_bindgen_9b835961c1753aa6"
+  hs_bindgen_9b835961c1753aa6_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_ispunct@
+hs_bindgen_9b835961c1753aa6
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_9b835961c1753aa6 =
+  BG.fromFFIType hs_bindgen_9b835961c1753aa6_base
+
+-- | Report if a character is a punctuation mark.
+--
+--     __WARNING__: Regardless of system locale, this is equivalent to @((SDL_isgraph(x)) && (!SDL_isalnum(x)))@.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isgraph', 'sDL_isalnum'
+--
+--     [C declaration]: @SDL_ispunct@, defined at @SDL3\/SDL_stdinc.h 2281:33@
+sDL_ispunct
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_ispunct = hs_bindgen_9b835961c1753aa6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isspace@
+foreign import ccall unsafe "hs_bindgen_37bfc6e46aee6fcc"
+  hs_bindgen_37bfc6e46aee6fcc_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isspace@
+hs_bindgen_37bfc6e46aee6fcc
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_37bfc6e46aee6fcc =
+  BG.fromFFIType hs_bindgen_37bfc6e46aee6fcc_base
+
+-- | Report if a character is whitespace.
+--
+--     __WARNING__: Regardless of system locale, this will only treat the following ASCII values as true:
+--
+--     * space (0x20)
+--
+--     * tab (0x09)
+--
+--     * newline (0x0A)
+--
+--     * vertical tab (0x0B)
+--
+--     * form feed (0x0C)
+--
+--     * return (0x0D)
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isspace@, defined at @SDL3\/SDL_stdinc.h 2303:33@
+sDL_isspace
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isspace = hs_bindgen_37bfc6e46aee6fcc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isupper@
+foreign import ccall unsafe "hs_bindgen_6a23210549f82553"
+  hs_bindgen_6a23210549f82553_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isupper@
+hs_bindgen_6a23210549f82553
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_6a23210549f82553 =
+  BG.fromFFIType hs_bindgen_6a23210549f82553_base
+
+-- | Report if a character is upper case.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'A\' through \'Z\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isupper@, defined at @SDL3\/SDL_stdinc.h 2318:33@
+sDL_isupper
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isupper = hs_bindgen_6a23210549f82553
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_islower@
+foreign import ccall unsafe "hs_bindgen_4ef887be849a9002"
+  hs_bindgen_4ef887be849a9002_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_islower@
+hs_bindgen_4ef887be849a9002
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_4ef887be849a9002 =
+  BG.fromFFIType hs_bindgen_4ef887be849a9002_base
+
+-- | Report if a character is lower case.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'a\' through \'z\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_islower@, defined at @SDL3\/SDL_stdinc.h 2333:33@
+sDL_islower
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_islower = hs_bindgen_4ef887be849a9002
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isprint@
+foreign import ccall unsafe "hs_bindgen_258633f7820b5c3c"
+  hs_bindgen_258633f7820b5c3c_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isprint@
+hs_bindgen_258633f7820b5c3c
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_258633f7820b5c3c =
+  BG.fromFFIType hs_bindgen_258633f7820b5c3c_base
+
+-- | Report if a character is \"printable\".
+--
+--     Be advised that \"printable\" has a definition that goes back to text terminals from the dawn of computing, making this a sort of special case function that is not suitable for Unicode (or most any) text management.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \' \' (0x20) through \'~\' (0x7E) as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_isprint@, defined at @SDL3\/SDL_stdinc.h 2352:33@
+sDL_isprint
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isprint = hs_bindgen_258633f7820b5c3c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isgraph@
+foreign import ccall unsafe "hs_bindgen_64e7a8597c7c9710"
+  hs_bindgen_64e7a8597c7c9710_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isgraph@
+hs_bindgen_64e7a8597c7c9710
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_64e7a8597c7c9710 =
+  BG.fromFFIType hs_bindgen_64e7a8597c7c9710_base
+
+-- | Report if a character is any \"printable\" except space.
+--
+--     Be advised that \"printable\" has a definition that goes back to text terminals from the dawn of computing, making this a sort of special case function that is not suitable for Unicode (or most any) text management.
+--
+--     __WARNING__: Regardless of system locale, this is equivalent to @(SDL_isprint(x)) && ((x) != \' \')@.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isprint'
+--
+--     [C declaration]: @SDL_isgraph@, defined at @SDL3\/SDL_stdinc.h 2373:33@
+sDL_isgraph
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_isgraph = hs_bindgen_64e7a8597c7c9710
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_toupper@
+foreign import ccall unsafe "hs_bindgen_c1347761ea69159d"
+  hs_bindgen_c1347761ea69159d_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_toupper@
+hs_bindgen_c1347761ea69159d
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_c1347761ea69159d =
+  BG.fromFFIType hs_bindgen_c1347761ea69159d_base
+
+-- | Convert low-ASCII English letters to uppercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'a\' through \'z\' to uppercase.
+--
+--     This function returns the uppercase equivalent of @x@. If a character cannot be converted, or is already uppercase, this function returns @x@.
+--
+--     [Returns]: capitalized version of x, or x if no conversion available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_toupper@, defined at @SDL3\/SDL_stdinc.h 2391:33@
+sDL_toupper
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_toupper = hs_bindgen_c1347761ea69159d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_tolower@
+foreign import ccall unsafe "hs_bindgen_b3fecd41676fe4be"
+  hs_bindgen_b3fecd41676fe4be_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_tolower@
+hs_bindgen_b3fecd41676fe4be
+  :: BG.CInt
+  -> IO BG.CInt
+hs_bindgen_b3fecd41676fe4be =
+  BG.fromFFIType hs_bindgen_b3fecd41676fe4be_base
+
+-- | Convert low-ASCII English letters to lowercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to lowercase.
+--
+--     This function returns the lowercase equivalent of @x@. If a character cannot be converted, or is already lowercase, this function returns @x@.
+--
+--     [Returns]: lowercase version of x, or x if no conversion available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_tolower@, defined at @SDL3\/SDL_stdinc.h 2409:33@
+sDL_tolower
+  :: BG.CInt
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.CInt
+sDL_tolower = hs_bindgen_b3fecd41676fe4be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_crc16@
+foreign import ccall unsafe "hs_bindgen_35ff41be4e4da9d1"
+  hs_bindgen_35ff41be4e4da9d1_base
+    :: BG.Word16
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word16
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_crc16@
+hs_bindgen_35ff41be4e4da9d1
+  :: Uint16
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO Uint16
+hs_bindgen_35ff41be4e4da9d1 =
+  BG.fromFFIType hs_bindgen_35ff41be4e4da9d1_base
+
+-- | Calculate a CRC-16 value.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
+--
+--     This function can be called multiple times, to stream data to be checksummed in blocks. Each call must provide the previous CRC-16 return value to be updated with the next block. The first call to this function for a set of blocks should pass in a zero CRC value.
+--
+--     [Returns]: a CRC-16 checksum value of all blocks in the data set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_crc16@, defined at @SDL3\/SDL_stdinc.h 2430:36@
+sDL_crc16
+  :: Uint16
+  -- ^
+  --
+  --           [@crc@]: the current checksum for this data set, or 0 for a new data set.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: a new block of data to add to the checksum.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@len@]: the size, in bytes, of the new block of data.
+  -> IO Uint16
+sDL_crc16 = hs_bindgen_35ff41be4e4da9d1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_crc32@
+foreign import ccall unsafe "hs_bindgen_6755f946704473dc"
+  hs_bindgen_6755f946704473dc_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_crc32@
+hs_bindgen_6755f946704473dc
+  :: Uint32
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO Uint32
+hs_bindgen_6755f946704473dc =
+  BG.fromFFIType hs_bindgen_6755f946704473dc_base
+
+-- | Calculate a CRC-32 value.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
+--
+--     This function can be called multiple times, to stream data to be checksummed in blocks. Each call must provide the previous CRC-32 return value to be updated with the next block. The first call to this function for a set of blocks should pass in a zero CRC value.
+--
+--     [Returns]: a CRC-32 checksum value of all blocks in the data set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_crc32@, defined at @SDL3\/SDL_stdinc.h 2451:36@
+sDL_crc32
+  :: Uint32
+  -- ^
+  --
+  --           [@crc@]: the current checksum for this data set, or 0 for a new data set.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: a new block of data to add to the checksum.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@len@]: the size, in bytes, of the new block of data.
+  -> IO Uint32
+sDL_crc32 = hs_bindgen_6755f946704473dc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_murmur3_32@
+foreign import ccall unsafe "hs_bindgen_4538e03ee60f6976"
+  hs_bindgen_4538e03ee60f6976_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_murmur3_32@
+hs_bindgen_4538e03ee60f6976
+  :: PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> Uint32
+  -> IO Uint32
+hs_bindgen_4538e03ee60f6976 =
+  BG.fromFFIType hs_bindgen_4538e03ee60f6976_base
+
+-- | Calculate a 32-bit MurmurHash3 value for a block of data.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/MurmurHash](https://en.wikipedia.org/wiki/MurmurHash)
+--
+--     A seed may be specified, which changes the final results consistently, but this does not work like SDL_crc16 and SDL_crc32: you can\'t feed a previous result from this function back into itself as the next seed value to calculate a hash in chunks; it won\'t produce the same hash as it would if the same data was provided in a single call.
+--
+--     If you aren\'t sure what to provide for a seed, zero is fine. Murmur3 is not cryptographically secure, so it shouldn\'t be used for hashing top-secret data.
+--
+--     [Returns]: a Murmur3 32-bit hash value.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_murmur3_32@, defined at @SDL3\/SDL_stdinc.h 2477:36@
+sDL_murmur3_32
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be hashed.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@len@]: the size of data, in bytes.
+  -> Uint32
+  -- ^
+  --
+  --           [@seed@]: a value that alters the final hash value.
+  -> IO Uint32
+sDL_murmur3_32 = hs_bindgen_4538e03ee60f6976
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_memset4@
+foreign import ccall unsafe "hs_bindgen_006ad9913290aee0"
+  hs_bindgen_006ad9913290aee0_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_memset4@
+hs_bindgen_006ad9913290aee0
+  :: BG.Ptr BG.Void
+  -> Uint32
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_006ad9913290aee0 =
+  BG.fromFFIType hs_bindgen_006ad9913290aee0_base
+
+-- | Initialize all 32-bit words of buffer of memory to a specific value.
+--
+--     This function will set a buffer of @dwords@ 'Uint32' values, pointed to by @dst@, to the value specified in @val@.
+--
+--     Unlike SDL_memset, this sets 32-bit values, not bytes, so it\'s not limited to a range of 0-255.
+--
+--     [Returns]: @dst@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_memset4@, defined at @SDL3\/SDL_stdinc.h 2601:36@
+sDL_memset4
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: the destination memory region. Must not be NULL.
+  -> Uint32
+  -- ^
+  --
+  --           [@val@]: the 'Uint32' value to set.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@dwords@]: the number of 'Uint32' values to set in @dst@.
+  -> IO (BG.Ptr BG.Void)
+sDL_memset4 = hs_bindgen_006ad9913290aee0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_memcmp@
+foreign import ccall unsafe "hs_bindgen_f8312f3094e9811f"
+  hs_bindgen_f8312f3094e9811f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_memcmp@
+hs_bindgen_f8312f3094e9811f
+  :: PtrConst.PtrConst BG.Void
+  -> PtrConst.PtrConst BG.Void
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_f8312f3094e9811f =
+  BG.fromFFIType hs_bindgen_f8312f3094e9811f_base
+
+-- | Compare two buffers of memory.
+--
+--     [Returns]: less than zero if s1 is \"less than\" s2, greater than zero if s1 is \"greater than\" s2, and zero if the buffers match exactly for @len@ bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_memcmp@, defined at @SDL3\/SDL_stdinc.h 2683:33@
+sDL_memcmp
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@s1@]: the first buffer to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@s2@]: the second buffer to compare. NULL is not permitted!
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@len@]: the number of bytes to compare between the buffers.
+  -> IO BG.CInt
+sDL_memcmp = hs_bindgen_f8312f3094e9811f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcslen@
+foreign import ccall unsafe "hs_bindgen_7819cc3f05f6e767"
+  hs_bindgen_7819cc3f05f6e767_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcslen@
+hs_bindgen_7819cc3f05f6e767
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_7819cc3f05f6e767 =
+  BG.fromFFIType hs_bindgen_7819cc3f05f6e767_base
+
+-- | This works exactly like wcslen() but doesn\'t require access to a C runtime.
+--
+--     Counts the number of wchar_t values in @wstr@, excluding the null terminator.
+--
+--     Like SDL_strlen only counts bytes and not codepoints in a UTF-8 string, this counts wchar_t values in a string, even if the string\'s encoding is of variable width, like UTF-16.
+--
+--     Also be aware that wchar_t is different sizes on different platforms (4 bytes on Linux, 2 on Windows, etc).
+--
+--     [Returns]: the length (in wchar_t values, excluding the null terminator) of @wstr@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcsnlen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_wcslen@, defined at @SDL3\/SDL_stdinc.h 2710:36@
+sDL_wcslen
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@wstr@]: The null-terminated wide string to read. Must not be NULL.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_wcslen = hs_bindgen_7819cc3f05f6e767
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsnlen@
+foreign import ccall unsafe "hs_bindgen_4d4c9962d27e8c57"
+  hs_bindgen_4d4c9962d27e8c57_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsnlen@
+hs_bindgen_4d4c9962d27e8c57
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_4d4c9962d27e8c57 =
+  BG.fromFFIType hs_bindgen_4d4c9962d27e8c57_base
+
+-- | This works exactly like wcsnlen() but doesn\'t require access to a C runtime.
+--
+--     Counts up to a maximum of @maxlen@ wchar_t values in @wstr@, excluding the null terminator.
+--
+--     Like SDL_strnlen only counts bytes and not codepoints in a UTF-8 string, this counts wchar_t values in a string, even if the string\'s encoding is of variable width, like UTF-16.
+--
+--     Also be aware that wchar_t is different sizes on different platforms (4 bytes on Linux, 2 on Windows, etc).
+--
+--     Also, @maxlen@ is a count of wide characters, not bytes!
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of @wstr@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcslen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_wcsnlen@, defined at @SDL3\/SDL_stdinc.h 2741:36@
+sDL_wcsnlen
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@wstr@]: The null-terminated wide string to read. Must not be NULL.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The maximum amount of wide characters to count.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_wcsnlen = hs_bindgen_4d4c9962d27e8c57
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcslcpy@
+foreign import ccall unsafe "hs_bindgen_6a63636fffe52a27"
+  hs_bindgen_6a63636fffe52a27_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcslcpy@
+hs_bindgen_6a63636fffe52a27
+  :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_6a63636fffe52a27 =
+  BG.fromFFIType hs_bindgen_6a63636fffe52a27_base
+
+-- | Copy a wide string.
+--
+--     This function copies @maxlen@ - 1 wide characters from @src@ to @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ is 0, no wide characters are copied and no null terminator is written.
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcslcat'
+--
+--     [C declaration]: @SDL_wcslcpy@, defined at @SDL3\/SDL_stdinc.h 2768:36@
+sDL_wcslcpy
+  :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@src@]: The null-terminated wide string to copy. Must not be NULL, and must not overlap with @dst@.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The length (in wide characters) of the destination buffer.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_wcslcpy = hs_bindgen_6a63636fffe52a27
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcslcat@
+foreign import ccall unsafe "hs_bindgen_ae63311931250a61"
+  hs_bindgen_ae63311931250a61_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcslcat@
+hs_bindgen_ae63311931250a61
+  :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_ae63311931250a61 =
+  BG.fromFFIType hs_bindgen_ae63311931250a61_base
+
+-- | Concatenate wide strings.
+--
+--     This function appends up to @maxlen@ - SDL_wcslen(dst) - 1 wide characters from @src@ to the end of the wide string in @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ - SDL_wcslen(dst) - 1 is less than or equal to 0, then @dst@ is unmodified.
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of the string in @dst@ plus the length of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_wcslcpy'
+--
+--     [C declaration]: @SDL_wcslcat@, defined at @SDL3\/SDL_stdinc.h 2797:36@
+sDL_wcslcat
+  :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer already containing the first null-terminated wide string. Must not be NULL and must not overlap with @src@.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@src@]: The second null-terminated wide string. Must not be NULL, and must not overlap with @dst@.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The length (in wide characters) of the destination buffer.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_wcslcat = hs_bindgen_ae63311931250a61
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsdup@
+foreign import ccall unsafe "hs_bindgen_0c56a99a680dde86"
+  hs_bindgen_0c56a99a680dde86_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsdup@
+hs_bindgen_0c56a99a680dde86
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+hs_bindgen_0c56a99a680dde86 =
+  BG.fromFFIType hs_bindgen_0c56a99a680dde86_base
+
+-- | Allocate a copy of a wide string.
+--
+--     This allocates enough space for a null-terminated copy of @wstr@, using SDL_malloc, and then makes a copy of the string into this space.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated wide string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsdup@, defined at @SDL3\/SDL_stdinc.h 2815:39@
+sDL_wcsdup
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@wstr@]: the string to copy.
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+sDL_wcsdup = hs_bindgen_0c56a99a680dde86
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsstr@
+foreign import ccall unsafe "hs_bindgen_0e15f64725300a1d"
+  hs_bindgen_0e15f64725300a1d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsstr@
+hs_bindgen_0e15f64725300a1d
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+hs_bindgen_0e15f64725300a1d =
+  BG.fromFFIType hs_bindgen_0e15f64725300a1d_base
+
+-- | Search a wide string for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string.
+--
+--     Note that this looks for strings of /wide characters/, not /codepoints/, so it\'s legal to search for malformed and incomplete UTF-16 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsstr@, defined at @SDL3\/SDL_stdinc.h 2835:39@
+sDL_wcsstr
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@haystack@]: the wide string to search. Must not be NULL.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@needle@]: the wide string to search for. Must not be NULL.
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+sDL_wcsstr = hs_bindgen_0e15f64725300a1d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsnstr@
+foreign import ccall unsafe "hs_bindgen_ed81408c495114ac"
+  hs_bindgen_ed81408c495114ac_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsnstr@
+hs_bindgen_ed81408c495114ac
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+hs_bindgen_ed81408c495114ac =
+  BG.fromFFIType hs_bindgen_ed81408c495114ac_base
+
+-- | Search a wide string, up to n wide chars, for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator value to end the string, or @maxlen@ wide character have been examined. It is possible to use this function on a wide string without a null terminator.
+--
+--     Note that this looks for strings of /wide characters/, not /codepoints/, so it\'s legal to search for malformed and incomplete UTF-16 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsnstr@, defined at @SDL3\/SDL_stdinc.h 2860:39@
+sDL_wcsnstr
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@haystack@]: the wide string to search. Must not be NULL.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@needle@]: the wide string to search for. Must not be NULL.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of wide characters to search in @haystack@.
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+sDL_wcsnstr = hs_bindgen_ed81408c495114ac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcscmp@
+foreign import ccall unsafe "hs_bindgen_523128c66baf772a"
+  hs_bindgen_523128c66baf772a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcscmp@
+hs_bindgen_523128c66baf772a
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO BG.CInt
+hs_bindgen_523128c66baf772a =
+  BG.fromFFIType hs_bindgen_523128c66baf772a_base
+
+-- | Compare two null-terminated wide strings.
+--
+--     This only compares wchar_t values until it hits a null-terminating character; it does not care if the string is well-formed UTF-16 (or UTF-32, depending on your platform\'s wchar_t size), or uses valid Unicode values.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcscmp@, defined at @SDL3\/SDL_stdinc.h 2879:33@
+sDL_wcscmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.CInt
+sDL_wcscmp = hs_bindgen_523128c66baf772a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsncmp@
+foreign import ccall unsafe "hs_bindgen_ae16252c87514b75"
+  hs_bindgen_ae16252c87514b75_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsncmp@
+hs_bindgen_ae16252c87514b75
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_ae16252c87514b75 =
+  BG.fromFFIType hs_bindgen_ae16252c87514b75_base
+
+-- | Compare two wide strings up to a number of wchar_t values.
+--
+--     This only compares wchar_t values; it does not care if the string is well-formed UTF-16 (or UTF-32, depending on your platform\'s wchar_t size), or uses valid Unicode values.
+--
+--     Note that while this function is intended to be used with UTF-16 (or UTF-32, depending on your platform\'s definition of wchar_t), it is comparing raw wchar_t values and not Unicode codepoints: @maxlen@ specifies a wchar_t limit! If the limit lands in the middle of a multi-wchar UTF-16 sequence, it will only compare a portion of the final character.
+--
+--     @maxlen@ specifies a maximum number of wchar_t to compare; if the strings match to this number of wide chars (or both have matched to a null-terminator character before this count), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsncmp@, defined at @SDL3\/SDL_stdinc.h 2910:33@
+sDL_wcsncmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of wchar_t to compare.
+  -> IO BG.CInt
+sDL_wcsncmp = hs_bindgen_ae16252c87514b75
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcscasecmp@
+foreign import ccall unsafe "hs_bindgen_2a1f0e71a040879b"
+  hs_bindgen_2a1f0e71a040879b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcscasecmp@
+hs_bindgen_2a1f0e71a040879b
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> IO BG.CInt
+hs_bindgen_2a1f0e71a040879b =
+  BG.fromFFIType hs_bindgen_2a1f0e71a040879b_base
+
+-- | Compare two null-terminated wide strings, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Depending on your platform, \"wchar_t\" might be 2 bytes, and expected to be UTF-16 encoded (like Windows), or 4 bytes in UTF-32 format. Since this handles Unicode, it expects the string to be well-formed and not a null-terminated string of arbitrary bytes. Characters that are not valid UTF-16 (or UTF-32) are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcscasecmp@, defined at @SDL3\/SDL_stdinc.h 2940:33@
+sDL_wcscasecmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.CInt
+sDL_wcscasecmp = hs_bindgen_2a1f0e71a040879b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsncasecmp@
+foreign import ccall unsafe "hs_bindgen_1c13738568f12d1d"
+  hs_bindgen_1c13738568f12d1d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_wcsncasecmp@
+hs_bindgen_1c13738568f12d1d
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_1c13738568f12d1d =
+  BG.fromFFIType hs_bindgen_1c13738568f12d1d_base
+
+-- | Compare two wide strings, case-insensitively, up to a number of wchar_t.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Depending on your platform, \"wchar_t\" might be 2 bytes, and expected to be UTF-16 encoded (like Windows), or 4 bytes in UTF-32 format. Since this handles Unicode, it expects the string to be well-formed and not a null-terminated string of arbitrary bytes. Characters that are not valid UTF-16 (or UTF-32) are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     Note that while this function might deal with variable-sized characters, @maxlen@ specifies a /wchar/ limit! If the limit lands in the middle of a multi-byte UTF-16 sequence, it may convert a portion of the final character to one or more Unicode character U+FFFD (REPLACEMENT CHARACTER) so as not to overflow a buffer.
+--
+--     @maxlen@ specifies a maximum number of wchar_t values to compare; if the strings match to this number of wchar_t (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_wcsncasecmp@, defined at @SDL3\/SDL_stdinc.h 2982:33@
+sDL_wcsncasecmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of wchar_t values to compare.
+  -> IO BG.CInt
+sDL_wcsncasecmp = hs_bindgen_1c13738568f12d1d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strlen@
+foreign import ccall unsafe "hs_bindgen_59a6bfea24e96b34"
+  hs_bindgen_59a6bfea24e96b34_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strlen@
+hs_bindgen_59a6bfea24e96b34
+  :: PtrConst.PtrConst BG.CChar
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_59a6bfea24e96b34 =
+  BG.fromFFIType hs_bindgen_59a6bfea24e96b34_base
+
+-- | This works exactly like strlen() but doesn\'t require access to a C runtime.
+--
+--     Counts the bytes in @str@, excluding the null terminator.
+--
+--     If you need the length of a UTF-8 string, consider using @SDL_utf8strlen()@.
+--
+--     [Returns]: the length (in bytes, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strnlen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_strlen@, defined at @SDL3\/SDL_stdinc.h 3029:36@
+sDL_strlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_strlen = hs_bindgen_59a6bfea24e96b34
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strnlen@
+foreign import ccall unsafe "hs_bindgen_c8b4424317df84e9"
+  hs_bindgen_c8b4424317df84e9_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strnlen@
+hs_bindgen_c8b4424317df84e9
+  :: PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_c8b4424317df84e9 =
+  BG.fromFFIType hs_bindgen_c8b4424317df84e9_base
+
+-- | This works exactly like strnlen() but doesn\'t require access to a C runtime.
+--
+--     Counts up to a maximum of @maxlen@ bytes in @str@, excluding the null terminator.
+--
+--     If you need the length of a UTF-8 string, consider using @SDL_utf8strnlen()@.
+--
+--     [Returns]: the length (in bytes, excluding the null terminator) of @src@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlen', 'sDL_utf8strlen', 'sDL_utf8strnlen'
+--
+--     [C declaration]: @SDL_strnlen@, defined at @SDL3\/SDL_stdinc.h 3053:36@
+sDL_strnlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The maximum amount of bytes to count.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_strnlen = hs_bindgen_c8b4424317df84e9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strlcpy@
+foreign import ccall unsafe "hs_bindgen_e26f240b36c1f7f4"
+  hs_bindgen_e26f240b36c1f7f4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strlcpy@
+hs_bindgen_e26f240b36c1f7f4
+  :: BG.Ptr BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_e26f240b36c1f7f4 =
+  BG.fromFFIType hs_bindgen_e26f240b36c1f7f4_base
+
+-- | Copy a string.
+--
+--     This function copies up to @maxlen@ - 1 characters from @src@ to @dst@, then appends a null terminator.
+--
+--     If @maxlen@ is 0, no characters are copied and no null terminator is written.
+--
+--     If you want to copy an UTF-8 string but need to ensure that multi-byte sequences are not truncated, consider using @SDL_utf8strlcpy()@.
+--
+--     [Returns]: the length (in characters, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlcat', 'sDL_utf8strlcpy'
+--
+--     [C declaration]: @SDL_strlcpy@, defined at @SDL3\/SDL_stdinc.h 3082:36@
+sDL_strlcpy
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@src@]: The null-terminated string to copy. Must not be NULL, and must not overlap with @dst@.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The length (in characters) of the destination buffer.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_strlcpy = hs_bindgen_e26f240b36c1f7f4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_utf8strlcpy@
+foreign import ccall unsafe "hs_bindgen_a6570a6c65177caf"
+  hs_bindgen_a6570a6c65177caf_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_utf8strlcpy@
+hs_bindgen_a6570a6c65177caf
+  :: BG.Ptr BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_a6570a6c65177caf =
+  BG.fromFFIType hs_bindgen_a6570a6c65177caf_base
+
+-- | Copy an UTF-8 string.
+--
+--     This function copies up to @dst_bytes@ - 1 bytes from @src@ to @dst@ while also ensuring that the string written to @dst@ does not end in a truncated multi-byte sequence. Finally, it appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     Note that unlike @SDL_strlcpy()@, this function returns the number of bytes written, not the length of @src@.
+--
+--     [Returns]: the number of bytes written, excluding the null terminator.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlcpy'
+--
+--     [C declaration]: @SDL_utf8strlcpy@, defined at @SDL3\/SDL_stdinc.h 3110:36@
+sDL_utf8strlcpy
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@src@]: The null-terminated UTF-8 string to copy. Must not be NULL, and must not overlap with @dst@.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@dst_bytes@]: The length (in bytes) of the destination buffer. Must not be 0.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_utf8strlcpy = hs_bindgen_a6570a6c65177caf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strlcat@
+foreign import ccall unsafe "hs_bindgen_6776d8c4c9824b69"
+  hs_bindgen_6776d8c4c9824b69_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strlcat@
+hs_bindgen_6776d8c4c9824b69
+  :: BG.Ptr BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_6776d8c4c9824b69 =
+  BG.fromFFIType hs_bindgen_6776d8c4c9824b69_base
+
+-- | Concatenate strings.
+--
+--     This function appends up to @maxlen@ - SDL_strlen(dst) - 1 characters from @src@ to the end of the string in @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ - SDL_strlen(dst) - 1 is less than or equal to 0, then @dst@ is unmodified.
+--
+--     [Returns]: the length (in characters, excluding the null terminator) of the string in @dst@ plus the length of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlcpy'
+--
+--     [C declaration]: @SDL_strlcat@, defined at @SDL3\/SDL_stdinc.h 3138:36@
+sDL_strlcat
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer already containing the first null-terminated string. Must not be NULL and must not overlap with @src@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@src@]: The second null-terminated string. Must not be NULL, and must not overlap with @dst@.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: The length (in characters) of the destination buffer.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_strlcat = hs_bindgen_6776d8c4c9824b69
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strdup@
+foreign import ccall unsafe "hs_bindgen_642470a5439764a1"
+  hs_bindgen_642470a5439764a1_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strdup@
+hs_bindgen_642470a5439764a1
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_642470a5439764a1 =
+  BG.fromFFIType hs_bindgen_642470a5439764a1_base
+
+-- | Allocate a copy of a string.
+--
+--     This allocates enough space for a null-terminated copy of @str@, using SDL_malloc, and then makes a copy of the string into this space.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strdup@, defined at @SDL3\/SDL_stdinc.h 3156:47@
+sDL_strdup
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to copy.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strdup = hs_bindgen_642470a5439764a1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strndup@
+foreign import ccall unsafe "hs_bindgen_2d11135d4a4cd09d"
+  hs_bindgen_2d11135d4a4cd09d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strndup@
+hs_bindgen_2d11135d4a4cd09d
+  :: PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_2d11135d4a4cd09d =
+  BG.fromFFIType hs_bindgen_2d11135d4a4cd09d_base
+
+-- | Allocate a copy of a string, up to n characters.
+--
+--     This allocates enough space for a null-terminated copy of @str@, up to @maxlen@ bytes, using SDL_malloc, and then makes a copy of the string into this space.
+--
+--     If the string is longer than @maxlen@ bytes, the returned string will be @maxlen@ bytes long, plus a null-terminator character that isn\'t included in the count.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strndup@, defined at @SDL3\/SDL_stdinc.h 3181:47@
+sDL_strndup
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to copy.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum length of the copied string, not counting the null-terminator character.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strndup = hs_bindgen_2d11135d4a4cd09d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strrev@
+foreign import ccall unsafe "hs_bindgen_3e344b4dbd1fefd5"
+  hs_bindgen_3e344b4dbd1fefd5_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strrev@
+hs_bindgen_3e344b4dbd1fefd5
+  :: BG.Ptr BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_3e344b4dbd1fefd5 =
+  BG.fromFFIType hs_bindgen_3e344b4dbd1fefd5_base
+
+-- | Reverse a string\'s contents.
+--
+--     This reverses a null-terminated string in-place. Only the content of the string is reversed; the null-terminator character remains at the end of the reversed string.
+--
+--     __WARNING__: This function reverses the /bytes/ of the string, not the codepoints. If @str@ is a UTF-8 string with Unicode codepoints > 127, this will ruin the string data. You should only use this function on strings that are completely comprised of low ASCII characters.
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strrev@, defined at @SDL3\/SDL_stdinc.h 3202:36@
+sDL_strrev
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to reverse.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strrev = hs_bindgen_3e344b4dbd1fefd5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strupr@
+foreign import ccall unsafe "hs_bindgen_2a6a16beae86f690"
+  hs_bindgen_2a6a16beae86f690_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strupr@
+hs_bindgen_2a6a16beae86f690
+  :: BG.Ptr BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_2a6a16beae86f690 =
+  BG.fromFFIType hs_bindgen_2a6a16beae86f690_base
+
+-- | Convert a string to uppercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to uppercase.
+--
+--     This function operates on a null-terminated string of bytes even if it is malformed UTF-8! and converts ASCII characters \'a\' through \'z\' to their uppercase equivalents in-place, returning the original @str@ pointer.
+--
+--     [Returns]: the @str@ pointer passed into this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strlwr'
+--
+--     [C declaration]: @SDL_strupr@, defined at @SDL3\/SDL_stdinc.h 3223:36@
+sDL_strupr
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to convert in-place. Can not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strupr = hs_bindgen_2a6a16beae86f690
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strlwr@
+foreign import ccall unsafe "hs_bindgen_d398f95cc6b941fb"
+  hs_bindgen_d398f95cc6b941fb_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strlwr@
+hs_bindgen_d398f95cc6b941fb
+  :: BG.Ptr BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_d398f95cc6b941fb =
+  BG.fromFFIType hs_bindgen_d398f95cc6b941fb_base
+
+-- | Convert a string to lowercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to lowercase.
+--
+--     This function operates on a null-terminated string of bytes even if it is malformed UTF-8! and converts ASCII characters \'A\' through \'Z\' to their lowercase equivalents in-place, returning the original @str@ pointer.
+--
+--     [Returns]: the @str@ pointer passed into this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_strupr'
+--
+--     [C declaration]: @SDL_strlwr@, defined at @SDL3\/SDL_stdinc.h 3244:36@
+sDL_strlwr
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to convert in-place. Can not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strlwr = hs_bindgen_d398f95cc6b941fb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strchr@
+foreign import ccall unsafe "hs_bindgen_ce84b72a37d721aa"
+  hs_bindgen_ce84b72a37d721aa_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strchr@
+hs_bindgen_ce84b72a37d721aa
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_ce84b72a37d721aa =
+  BG.fromFFIType hs_bindgen_ce84b72a37d721aa_base
+
+-- | Search a string for the first instance of a specific byte.
+--
+--     The search ends once it finds the requested byte value, or a null terminator byte to end the string.
+--
+--     Note that this looks for /bytes/, not /characters/, so you cannot match against a Unicode codepoint > 255, regardless of character encoding.
+--
+--     [Returns]: a pointer to the first instance of @c@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strchr@, defined at @SDL3\/SDL_stdinc.h 3264:36@
+sDL_strchr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to search. Must not be NULL.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@c@]: the byte value to search for.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strchr = hs_bindgen_ce84b72a37d721aa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strrchr@
+foreign import ccall unsafe "hs_bindgen_42f6725f3eb6c437"
+  hs_bindgen_42f6725f3eb6c437_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strrchr@
+hs_bindgen_42f6725f3eb6c437
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_42f6725f3eb6c437 =
+  BG.fromFFIType hs_bindgen_42f6725f3eb6c437_base
+
+-- | Search a string for the last instance of a specific byte.
+--
+--     The search must go until it finds a null terminator byte to end the string.
+--
+--     Note that this looks for /bytes/, not /characters/, so you cannot match against a Unicode codepoint > 255, regardless of character encoding.
+--
+--     [Returns]: a pointer to the last instance of @c@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strrchr@, defined at @SDL3\/SDL_stdinc.h 3283:36@
+sDL_strrchr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to search. Must not be NULL.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@c@]: the byte value to search for.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strrchr = hs_bindgen_42f6725f3eb6c437
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strstr@
+foreign import ccall unsafe "hs_bindgen_4dd450b42cd71d7b"
+  hs_bindgen_4dd450b42cd71d7b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strstr@
+hs_bindgen_4dd450b42cd71d7b
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_4dd450b42cd71d7b =
+  BG.fromFFIType hs_bindgen_4dd450b42cd71d7b_base
+
+-- | Search a string for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string.
+--
+--     Note that this looks for strings of /bytes/, not /characters/, so it\'s legal to search for malformed and incomplete UTF-8 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strstr@, defined at @SDL3\/SDL_stdinc.h 3303:36@
+sDL_strstr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@haystack@]: the string to search. Must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@needle@]: the string to search for. Must not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strstr = hs_bindgen_4dd450b42cd71d7b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strnstr@
+foreign import ccall unsafe "hs_bindgen_84a9d060fbe6dadf"
+  hs_bindgen_84a9d060fbe6dadf_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strnstr@
+hs_bindgen_84a9d060fbe6dadf
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_84a9d060fbe6dadf =
+  BG.fromFFIType hs_bindgen_84a9d060fbe6dadf_base
+
+-- | Search a string, up to n bytes, for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string, or @maxlen@ bytes have been examined. It is possible to use this function on a string without a null terminator.
+--
+--     Note that this looks for strings of /bytes/, not /characters/, so it\'s legal to search for malformed and incomplete UTF-8 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strnstr@, defined at @SDL3\/SDL_stdinc.h 3326:36@
+sDL_strnstr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@haystack@]: the string to search. Must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@needle@]: the string to search for. Must not be NULL.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of bytes to search in @haystack@.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strnstr = hs_bindgen_84a9d060fbe6dadf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strcasestr@
+foreign import ccall unsafe "hs_bindgen_81f801141b3ad731"
+  hs_bindgen_81f801141b3ad731_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strcasestr@
+hs_bindgen_81f801141b3ad731
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_81f801141b3ad731 =
+  BG.fromFFIType hs_bindgen_81f801141b3ad731_base
+
+-- | Search a UTF-8 string for the first instance of a specific substring, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strcasestr@, defined at @SDL3\/SDL_stdinc.h 3354:36@
+sDL_strcasestr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@haystack@]: the string to search. Must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@needle@]: the string to search for. Must not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strcasestr = hs_bindgen_81f801141b3ad731
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strtok_r@
+foreign import ccall unsafe "hs_bindgen_409faece247c319b"
+  hs_bindgen_409faece247c319b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strtok_r@
+hs_bindgen_409faece247c319b
+  :: BG.Ptr BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_409faece247c319b =
+  BG.fromFFIType hs_bindgen_409faece247c319b_base
+
+-- | This works exactly like strtok_r() but doesn\'t require access to a C runtime.
+--
+--     Break a string up into a series of tokens.
+--
+--     To start tokenizing a new string, @str@ should be the non-NULL address of the string to start tokenizing. Future calls to get the next token from the same string should specify a NULL.
+--
+--     Note that this function will overwrite pieces of @str@ with null chars to split it into tokens. This function cannot be used with const\/read-only strings!
+--
+--     @saveptr@ just needs to point to a @char *@ that can be overwritten; SDL will use this to save tokenizing state between calls. It is initialized if @str@ is non-NULL, and used to resume tokenizing when @str@ is NULL.
+--
+--     [Returns]: A pointer to the next token, or NULL if no tokens remain.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strtok_r@, defined at @SDL3\/SDL_stdinc.h 3383:36@
+sDL_strtok_r
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to tokenize, or NULL to continue tokenizing.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@delim@]: the delimiter string that separates tokens.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@saveptr@]: pointer to a char *, used for ongoing state.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strtok_r = hs_bindgen_409faece247c319b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_utf8strlen@
+foreign import ccall unsafe "hs_bindgen_36470941402cdd53"
+  hs_bindgen_36470941402cdd53_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_utf8strlen@
+hs_bindgen_36470941402cdd53
+  :: PtrConst.PtrConst BG.CChar
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_36470941402cdd53 =
+  BG.fromFFIType hs_bindgen_36470941402cdd53_base
+
+-- | Count the number of codepoints in a UTF-8 string.
+--
+--     Counts the /codepoints/, not /bytes/, in @str@, excluding the null terminator.
+--
+--     If you need to count the bytes in a string instead, consider using @SDL_strlen()@.
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the count by several replacement characters.
+--
+--     [Returns]: The length (in codepoints, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_utf8strnlen', 'sDL_strlen'
+--
+--     [C declaration]: @SDL_utf8strlen@, defined at @SDL3\/SDL_stdinc.h 3411:36@
+sDL_utf8strlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated UTF-8 string to read. Must not be NULL.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_utf8strlen = hs_bindgen_36470941402cdd53
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_utf8strnlen@
+foreign import ccall unsafe "hs_bindgen_479082db51ecf46b"
+  hs_bindgen_479082db51ecf46b_base
+    :: BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_utf8strnlen@
+hs_bindgen_479082db51ecf46b
+  :: PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_479082db51ecf46b =
+  BG.fromFFIType hs_bindgen_479082db51ecf46b_base
+
+-- | Count the number of codepoints in a UTF-8 string, up to n bytes.
+--
+--     Counts the /codepoints/, not /bytes/, in @str@, excluding the null terminator.
+--
+--     If you need to count the bytes in a string instead, consider using @SDL_strnlen()@.
+--
+--     The counting stops at @bytes@ bytes (not codepoints!). This seems counterintuitive, but makes it easy to express the total size of the string\'s buffer.
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the count by several replacement characters.
+--
+--     [Returns]: The length (in codepoints, excluding the null terminator) of @src@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_utf8strlen', 'sDL_strnlen'
+--
+--     [C declaration]: @SDL_utf8strnlen@, defined at @SDL3\/SDL_stdinc.h 3444:36@
+sDL_utf8strnlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated UTF-8 string to read. Must not be NULL.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@bytes@]: The maximum amount of bytes to count.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_utf8strnlen = hs_bindgen_479082db51ecf46b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_itoa@
+foreign import ccall unsafe "hs_bindgen_c69b2ef36677f953"
+  hs_bindgen_c69b2ef36677f953_base
+    :: BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_itoa@
+hs_bindgen_c69b2ef36677f953
+  :: BG.CInt
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_c69b2ef36677f953 =
+  BG.fromFFIType hs_bindgen_c69b2ef36677f953_base
+
+-- | Convert an integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget possible negative signs, null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_uitoa', @SDL_ltoa@, 'sDL_lltoa'
+--
+--     [C declaration]: @SDL_itoa@, defined at @SDL3\/SDL_stdinc.h 3472:36@
+sDL_itoa
+  :: BG.CInt
+  -- ^
+  --
+  --           [@value@]: the integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+sDL_itoa = hs_bindgen_c69b2ef36677f953
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_uitoa@
+foreign import ccall unsafe "hs_bindgen_dbe69ee767be00c8"
+  hs_bindgen_dbe69ee767be00c8_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_uitoa@
+hs_bindgen_dbe69ee767be00c8
+  :: BG.CUInt
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_dbe69ee767be00c8 =
+  BG.fromFFIType hs_bindgen_dbe69ee767be00c8_base
+
+-- | Convert an unsigned integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_itoa', @SDL_ultoa@, 'sDL_ulltoa'
+--
+--     [C declaration]: @SDL_uitoa@, defined at @SDL3\/SDL_stdinc.h 3500:36@
+sDL_uitoa
+  :: BG.CUInt
+  -- ^
+  --
+  --           [@value@]: the unsigned integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+sDL_uitoa = hs_bindgen_dbe69ee767be00c8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_lltoa@
+foreign import ccall unsafe "hs_bindgen_94ca108dca07ec6f"
+  hs_bindgen_94ca108dca07ec6f_base
+    :: BG.Int64
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_lltoa@
+hs_bindgen_94ca108dca07ec6f
+  :: BG.CLLong
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_94ca108dca07ec6f =
+  BG.fromFFIType hs_bindgen_94ca108dca07ec6f_base
+
+-- | Convert a long long integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget possible negative signs, null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ulltoa', 'sDL_itoa', @SDL_ltoa@
+--
+--     [C declaration]: @SDL_lltoa@, defined at @SDL3\/SDL_stdinc.h 3586:36@
+sDL_lltoa
+  :: BG.CLLong
+  -- ^
+  --
+  --           [@value@]: the long long integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+sDL_lltoa = hs_bindgen_94ca108dca07ec6f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_ulltoa@
+foreign import ccall unsafe "hs_bindgen_d122b88ccc45fe33"
+  hs_bindgen_d122b88ccc45fe33_base
+    :: BG.Word64
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_ulltoa@
+hs_bindgen_d122b88ccc45fe33
+  :: BG.CULLong
+  -> BG.Ptr BG.CChar
+  -> BG.CInt
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_d122b88ccc45fe33 =
+  BG.fromFFIType hs_bindgen_d122b88ccc45fe33_base
+
+-- | Convert an unsigned long long integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_lltoa', 'sDL_uitoa', @SDL_ultoa@
+--
+--     [C declaration]: @SDL_ulltoa@, defined at @SDL3\/SDL_stdinc.h 3614:36@
+sDL_ulltoa
+  :: BG.CULLong
+  -- ^
+  --
+  --           [@value@]: the unsigned long long integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+sDL_ulltoa = hs_bindgen_d122b88ccc45fe33
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atoi@
+foreign import ccall unsafe "hs_bindgen_ca9f4297368b5437"
+  hs_bindgen_ca9f4297368b5437_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atoi@
+hs_bindgen_ca9f4297368b5437
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_ca9f4297368b5437 =
+  BG.fromFFIType hs_bindgen_ca9f4297368b5437_base
+
+-- | Parse an @int@ from a string.
+--
+--     The result of calling @SDL_atoi(str)@ is equivalent to @(int)SDL_strtol(str, NULL, 10)@.
+--
+--     [Returns]: the parsed @int@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atof', @SDL_strtol@, @SDL_strtoul@, 'sDL_strtoll', 'sDL_strtoull', 'sDL_strtod', 'sDL_itoa'
+--
+--     [C declaration]: @SDL_atoi@, defined at @SDL3\/SDL_stdinc.h 3638:33@
+sDL_atoi
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> IO BG.CInt
+sDL_atoi = hs_bindgen_ca9f4297368b5437
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atof@
+foreign import ccall unsafe "hs_bindgen_81f2fcbff595d766"
+  hs_bindgen_81f2fcbff595d766_base
+    :: BG.Ptr BG.Void
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atof@
+hs_bindgen_81f2fcbff595d766
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CDouble
+hs_bindgen_81f2fcbff595d766 =
+  BG.fromFFIType hs_bindgen_81f2fcbff595d766_base
+
+-- | Parse a @double@ from a string.
+--
+--     The result of calling @SDL_atof(str)@ is equivalent to @SDL_strtod(str, NULL)@.
+--
+--     [Returns]: the parsed @double@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', @SDL_strtol@, @SDL_strtoul@, 'sDL_strtoll', 'sDL_strtoull', 'sDL_strtod'
+--
+--     [C declaration]: @SDL_atof@, defined at @SDL3\/SDL_stdinc.h 3660:36@
+sDL_atof
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> IO BG.CDouble
+sDL_atof = hs_bindgen_81f2fcbff595d766
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strtoll@
+foreign import ccall unsafe "hs_bindgen_29424912342d9a55"
+  hs_bindgen_29424912342d9a55_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strtoll@
+hs_bindgen_29424912342d9a55
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -> BG.CInt
+  -> IO BG.CLLong
+hs_bindgen_29424912342d9a55 =
+  BG.fromFFIType hs_bindgen_29424912342d9a55_base
+
+-- | Parse a @long long@ from a string.
+--
+--     If @str@ starts with whitespace, then those whitespace characters are skipped before attempting to parse the number.
+--
+--     If the parsed number does not fit inside a @long long@, the result is clamped to the minimum and maximum representable @long long@ values.
+--
+--     [Returns]: the parsed @long long@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', 'sDL_atof', @SDL_strtol@, @SDL_strtoul@, 'sDL_strtoull', 'sDL_strtod', 'sDL_lltoa'
+--
+--     [C declaration]: @SDL_strtoll@, defined at @SDL3\/SDL_stdinc.h 3762:39@
+sDL_strtoll
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@endp@]: If not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@base@]: The base of the integer to read. Supported values are 0 and 2 to 36 inclusive. If 0, the base will be inferred from the number\'s prefix (0x for hexadecimal, 0 for octal, decimal otherwise).
+  -> IO BG.CLLong
+sDL_strtoll = hs_bindgen_29424912342d9a55
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strtoull@
+foreign import ccall unsafe "hs_bindgen_fe908f5a8d183e7b"
+  hs_bindgen_fe908f5a8d183e7b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strtoull@
+hs_bindgen_fe908f5a8d183e7b
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -> BG.CInt
+  -> IO BG.CULLong
+hs_bindgen_fe908f5a8d183e7b =
+  BG.fromFFIType hs_bindgen_fe908f5a8d183e7b_base
+
+-- | Parse an @unsigned long long@ from a string.
+--
+--     If @str@ starts with whitespace, then those whitespace characters are skipped before attempting to parse the number.
+--
+--     If the parsed number does not fit inside an @unsigned long long@, the result is clamped to the maximum representable @unsigned long long@ value.
+--
+--     [Returns]: the parsed @unsigned long long@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', 'sDL_atof', @SDL_strtol@, 'sDL_strtoll', @SDL_strtoul@, 'sDL_strtod', 'sDL_ulltoa'
+--
+--     [C declaration]: @SDL_strtoull@, defined at @SDL3\/SDL_stdinc.h 3796:48@
+sDL_strtoull
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@endp@]: If not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@base@]: The base of the integer to read. Supported values are 0 and 2 to 36 inclusive. If 0, the base will be inferred from the number\'s prefix (0x for hexadecimal, 0 for octal, decimal otherwise).
+  -> IO BG.CULLong
+sDL_strtoull = hs_bindgen_fe908f5a8d183e7b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strtod@
+foreign import ccall unsafe "hs_bindgen_93115f1648467a21"
+  hs_bindgen_93115f1648467a21_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strtod@
+hs_bindgen_93115f1648467a21
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -> IO BG.CDouble
+hs_bindgen_93115f1648467a21 =
+  BG.fromFFIType hs_bindgen_93115f1648467a21_base
+
+-- | Parse a @double@ from a string.
+--
+--     This function makes fewer guarantees than the C runtime @strtod@:
+--
+--     * Only decimal notation is guaranteed to be supported. The handling of scientific and hexadecimal notation is unspecified.
+--
+--     * Whether or not INF and NAN can be parsed is unspecified.
+--
+--     * The precision of the result is unspecified.
+--
+--     [Returns]: the parsed @double@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atoi', 'sDL_atof', @SDL_strtol@, 'sDL_strtoll', @SDL_strtoul@, 'sDL_strtoull'
+--
+--     [C declaration]: @SDL_strtod@, defined at @SDL3\/SDL_stdinc.h 3826:36@
+sDL_strtod
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the null-terminated string to read. Must not be NULL.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@endp@]: if not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+  -> IO BG.CDouble
+sDL_strtod = hs_bindgen_93115f1648467a21
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strcmp@
+foreign import ccall unsafe "hs_bindgen_1165e1ac637a910f"
+  hs_bindgen_1165e1ac637a910f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strcmp@
+hs_bindgen_1165e1ac637a910f
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_1165e1ac637a910f =
+  BG.fromFFIType hs_bindgen_1165e1ac637a910f_base
+
+-- | Compare two null-terminated UTF-8 strings.
+--
+--     Due to the nature of UTF-8 encoding, this will work with Unicode strings, since effectively this function just compares bytes until it hits a null-terminating character. Also due to the nature of UTF-8, this can be used with @SDL_qsort()@ to put strings in (roughly) alphabetical order.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strcmp@, defined at @SDL3\/SDL_stdinc.h 3846:33@
+sDL_strcmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.CInt
+sDL_strcmp = hs_bindgen_1165e1ac637a910f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strncmp@
+foreign import ccall unsafe "hs_bindgen_6286679cc5d88e95"
+  hs_bindgen_6286679cc5d88e95_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strncmp@
+hs_bindgen_6286679cc5d88e95
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_6286679cc5d88e95 =
+  BG.fromFFIType hs_bindgen_6286679cc5d88e95_base
+
+-- | Compare two UTF-8 strings up to a number of bytes.
+--
+--     Due to the nature of UTF-8 encoding, this will work with Unicode strings, since effectively this function just compares bytes until it hits a null-terminating character. Also due to the nature of UTF-8, this can be used with @SDL_qsort()@ to put strings in (roughly) alphabetical order.
+--
+--     Note that while this function is intended to be used with UTF-8, it is doing a bytewise comparison, and @maxlen@ specifies a /byte/ limit! If the limit lands in the middle of a multi-byte UTF-8 sequence, it will only compare a portion of the final character.
+--
+--     @maxlen@ specifies a maximum number of bytes to compare; if the strings match to this number of bytes (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strncmp@, defined at @SDL3\/SDL_stdinc.h 3876:33@
+sDL_strncmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of /bytes/ to compare.
+  -> IO BG.CInt
+sDL_strncmp = hs_bindgen_6286679cc5d88e95
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strcasecmp@
+foreign import ccall unsafe "hs_bindgen_592440e0cc89a66c"
+  hs_bindgen_592440e0cc89a66c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strcasecmp@
+hs_bindgen_592440e0cc89a66c
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CInt
+hs_bindgen_592440e0cc89a66c =
+  BG.fromFFIType hs_bindgen_592440e0cc89a66c_base
+
+-- | Compare two null-terminated UTF-8 strings, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the string to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strcasecmp@, defined at @SDL3\/SDL_stdinc.h 3904:33@
+sDL_strcasecmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.CInt
+sDL_strcasecmp = hs_bindgen_592440e0cc89a66c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strncasecmp@
+foreign import ccall unsafe "hs_bindgen_9a7486257c6bf068"
+  hs_bindgen_9a7486257c6bf068_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strncasecmp@
+hs_bindgen_9a7486257c6bf068
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CInt
+hs_bindgen_9a7486257c6bf068 =
+  BG.fromFFIType hs_bindgen_9a7486257c6bf068_base
+
+-- | Compare two UTF-8 strings, case-insensitively, up to a number of bytes.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the string to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     Note that while this function is intended to be used with UTF-8, @maxlen@ specifies a /byte/ limit! If the limit lands in the middle of a multi-byte UTF-8 sequence, it may convert a portion of the final character to one or more Unicode character U+FFFD (REPLACEMENT CHARACTER) so as not to overflow a buffer.
+--
+--     @maxlen@ specifies a maximum number of bytes to compare; if the strings match to this number of bytes (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strncasecmp@, defined at @SDL3\/SDL_stdinc.h 3944:33@
+sDL_strncasecmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of bytes to compare.
+  -> IO BG.CInt
+sDL_strncasecmp = hs_bindgen_9a7486257c6bf068
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strpbrk@
+foreign import ccall unsafe "hs_bindgen_e53784dcceef6c88"
+  hs_bindgen_e53784dcceef6c88_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_strpbrk@
+hs_bindgen_e53784dcceef6c88
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_e53784dcceef6c88 =
+  BG.fromFFIType hs_bindgen_e53784dcceef6c88_base
+
+-- | Searches a string for the first occurrence of any character contained in a breakset, and returns a pointer from the string to that character.
+--
+--     [Returns]: A pointer to the location, in str, of the first occurrence of a character present in the breakset, or NULL if none is found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_strpbrk@, defined at @SDL3\/SDL_stdinc.h 3962:36@
+sDL_strpbrk
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to be searched. Must not be NULL, and must not overlap with @breakset@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@breakset@]: A null-terminated string containing the list of characters to look for. Must not be NULL, and must not overlap with @str@.
+  -> IO (BG.Ptr BG.CChar)
+sDL_strpbrk = hs_bindgen_e53784dcceef6c88
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_StepUTF8@
+foreign import ccall unsafe "hs_bindgen_5010b6d322eef729"
+  hs_bindgen_5010b6d322eef729_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_StepUTF8@
+hs_bindgen_5010b6d322eef729
+  :: BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO Uint32
+hs_bindgen_5010b6d322eef729 =
+  BG.fromFFIType hs_bindgen_5010b6d322eef729_base
+
+-- | Decode a UTF-8 string, one Unicode codepoint at a time.
+--
+--     This will return the first Unicode codepoint in the UTF-8 encoded string in @*pstr@, and then advance @*pstr@ past any consumed bytes before returning.
+--
+--     It will not access more than @*pslen@ bytes from the string. @*pslen@ will be adjusted, as well, subtracting the number of bytes consumed.
+--
+--     @pslen@ is allowed to be NULL, in which case the string /must/ be NULL-terminated, as the function will blindly read until it sees the NULL char.
+--
+--     if @*pslen@ is zero, it assumes the end of string is reached and returns a zero codepoint regardless of the contents of the string buffer.
+--
+--     If the resulting codepoint is zero (a NULL terminator), or @*pslen@ is zero, it will not advance @*pstr@ or @*pslen@ at all.
+--
+--     Generally this function is called in a loop until it returns zero, adjusting its parameters each iteration.
+--
+--     If an invalid UTF-8 sequence is encountered, this function returns SDL_INVALID_UNICODE_CODEPOINT and advances the string\/length by one byte (which is to say, a multibyte sequence might produce several SDL_INVALID_UNICODE_CODEPOINT returns before it syncs to the next valid UTF-8 sequence).
+--
+--     Several things can generate invalid UTF-8 sequences, including overlong encodings, the use of UTF-16 surrogate values, and truncated data. Please refer to [RFC3629](https://www.ietf.org/rfc/rfc3629.txt) for details.
+--
+--     [Returns]: the first Unicode codepoint in the string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_StepUTF8@, defined at @SDL3\/SDL_stdinc.h 4022:36@
+sDL_StepUTF8
+  :: BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@pstr@]: a pointer to a UTF-8 string pointer to be read and adjusted.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@pslen@]: a pointer to the number of bytes in the string, to be read and adjusted. NULL is allowed.
+  -> IO Uint32
+sDL_StepUTF8 = hs_bindgen_5010b6d322eef729
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_StepBackUTF8@
+foreign import ccall unsafe "hs_bindgen_e9d45c14c965c799"
+  hs_bindgen_e9d45c14c965c799_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_StepBackUTF8@
+hs_bindgen_e9d45c14c965c799
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -> IO Uint32
+hs_bindgen_e9d45c14c965c799 =
+  BG.fromFFIType hs_bindgen_e9d45c14c965c799_base
+
+-- | Decode a UTF-8 string in reverse, one Unicode codepoint at a time.
+--
+--     This will go to the start of the previous Unicode codepoint in the string, move @*pstr@ to that location and return that codepoint.
+--
+--     If @*pstr@ is already at the start of the string), it will not advance @*pstr@ at all.
+--
+--     Generally this function is called in a loop until it returns zero, adjusting its parameter each iteration.
+--
+--     If an invalid UTF-8 sequence is encountered, this function returns SDL_INVALID_UNICODE_CODEPOINT.
+--
+--     Several things can generate invalid UTF-8 sequences, including overlong encodings, the use of UTF-16 surrogate values, and truncated data. Please refer to [RFC3629](https://www.ietf.org/rfc/rfc3629.txt) for details.
+--
+--     [Returns]: the previous Unicode codepoint in the string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_StepBackUTF8@, defined at @SDL3\/SDL_stdinc.h 4053:36@
+sDL_StepBackUTF8
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@start@]: a pointer to the beginning of the UTF-8 string.
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@pstr@]: a pointer to a UTF-8 string pointer to be read and adjusted.
+  -> IO Uint32
+sDL_StepBackUTF8 = hs_bindgen_e9d45c14c965c799
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_UCS4ToUTF8@
+foreign import ccall unsafe "hs_bindgen_2621d8f742eba582"
+  hs_bindgen_2621d8f742eba582_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_UCS4ToUTF8@
+hs_bindgen_2621d8f742eba582
+  :: Uint32
+  -> BG.Ptr BG.CChar
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_2621d8f742eba582 =
+  BG.fromFFIType hs_bindgen_2621d8f742eba582_base
+
+-- | Convert a single Unicode codepoint to UTF-8.
+--
+--     The buffer pointed to by @dst@ must be at least 4 bytes long, as this function may generate between 1 and 4 bytes of output.
+--
+--     This function returns the first byte /after/ the newly-written UTF-8 sequence, which is useful for encoding multiple codepoints in a loop, or knowing where to write a NULL-terminator character to end the string (in either case, plan to have a buffer of /more/ than 4 bytes!).
+--
+--     If @codepoint@ is an invalid value (outside the Unicode range, or a UTF-16 surrogate value, etc), this will use U+FFFD (REPLACEMENT CHARACTER) for the codepoint instead, and not set an error.
+--
+--     If @dst@ is NULL, this returns NULL immediately without writing to the pointer and without setting an error.
+--
+--     [Returns]: the first byte past the newly-written UTF-8 sequence.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UCS4ToUTF8@, defined at @SDL3\/SDL_stdinc.h 4082:36@
+sDL_UCS4ToUTF8
+  :: Uint32
+  -- ^
+  --
+  --           [@codepoint@]: a Unicode codepoint to convert to UTF-8.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: the location to write the encoded UTF-8. Must point to at least 4 bytes!
+  -> IO (BG.Ptr BG.CChar)
+sDL_UCS4ToUTF8 = hs_bindgen_2621d8f742eba582
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_srand@
+foreign import ccall unsafe "hs_bindgen_1620e07051837ddb"
+  hs_bindgen_1620e07051837ddb_base
+    :: BG.Word64
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_srand@
+hs_bindgen_1620e07051837ddb
+  :: Uint64
+  -> IO ()
+hs_bindgen_1620e07051837ddb =
+  BG.fromFFIType hs_bindgen_1620e07051837ddb_base
+
+-- | Seeds the pseudo-random number generator.
+--
+--     Reusing the seed number will cause @SDL_rand()@ to repeat the same stream of \'random\' numbers.
+--
+--     [Thread safety]: This should be called on the same thread that calls @SDL_rand()@
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand', 'sDL_rand_bits', 'sDL_randf'
+--
+--     [C declaration]: @SDL_srand@, defined at @SDL3\/SDL_stdinc.h 4294:34@
+sDL_srand
+  :: Uint64
+  -- ^
+  --
+  --           [@seed@]: the value to use as a random number seed, or 0 to use SDL_GetPerformanceCounter().
+  -> IO ()
+sDL_srand = hs_bindgen_1620e07051837ddb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_rand@
+foreign import ccall unsafe "hs_bindgen_bb32712cf4e3959c"
+  hs_bindgen_bb32712cf4e3959c_base
+    :: BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_rand@
+hs_bindgen_bb32712cf4e3959c
+  :: Sint32
+  -> IO Sint32
+hs_bindgen_bb32712cf4e3959c =
+  BG.fromFFIType hs_bindgen_bb32712cf4e3959c_base
+
+-- | Generate a pseudo-random number less than n for positive n
+--
+--     The method used is faster and of better quality than @rand() % n@. Odds are roughly 99.9% even for n = 1 million. Evenness is better for smaller n, and much worse as n gets bigger.
+--
+--     Example: to simulate a d6 use @SDL_rand(6) + 1@ The +1 converts 0..5 to 1..6
+--
+--     If you want to generate a pseudo-random number in the full range of 'Sint32', you should use: ('Sint32') @SDL_rand_bits()@
+--
+--     If you want reproducible output, be sure to initialize with @SDL_srand()@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0 .. n-1].
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_srand', 'sDL_randf'
+--
+--     [C declaration]: @SDL_rand@, defined at @SDL3\/SDL_stdinc.h 4328:36@
+sDL_rand
+  :: Sint32
+  -- ^
+  --
+  --           [@n@]: the number of possible outcomes. n must be positive.
+  -> IO Sint32
+sDL_rand = hs_bindgen_bb32712cf4e3959c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_randf@
+foreign import ccall unsafe "hs_bindgen_4354197498dc7635"
+  hs_bindgen_4354197498dc7635_base
+    :: IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_randf@
+hs_bindgen_4354197498dc7635 :: IO BG.CFloat
+hs_bindgen_4354197498dc7635 =
+  BG.fromFFIType hs_bindgen_4354197498dc7635_base
+
+-- | Generate a uniform pseudo-random floating point number less than 1.0
+--
+--     If you want reproducible output, be sure to initialize with @SDL_srand()@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0.0, 1.0).
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_srand', 'sDL_rand'
+--
+--     [C declaration]: @SDL_randf@, defined at @SDL3\/SDL_stdinc.h 4351:35@
+sDL_randf :: IO BG.CFloat
+sDL_randf = hs_bindgen_4354197498dc7635
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_rand_bits@
+foreign import ccall unsafe "hs_bindgen_eed752851bd8b3e2"
+  hs_bindgen_eed752851bd8b3e2_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_rand_bits@
+hs_bindgen_eed752851bd8b3e2 :: IO Uint32
+hs_bindgen_eed752851bd8b3e2 =
+  BG.fromFFIType hs_bindgen_eed752851bd8b3e2_base
+
+-- | Generate 32 pseudo-random bits.
+--
+--     You likely want to use @SDL_rand()@ to get a psuedo-random number instead.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0-SDL_MAX_UINT32].
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand', 'sDL_randf', 'sDL_srand'
+--
+--     [C declaration]: @SDL_rand_bits@, defined at @SDL3\/SDL_stdinc.h 4374:36@
+sDL_rand_bits :: IO Uint32
+sDL_rand_bits = hs_bindgen_eed752851bd8b3e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_rand_r@
+foreign import ccall unsafe "hs_bindgen_e31222be551ae9d1"
+  hs_bindgen_e31222be551ae9d1_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_rand_r@
+hs_bindgen_e31222be551ae9d1
+  :: BG.Ptr Uint64
+  -> Sint32
+  -> IO Sint32
+hs_bindgen_e31222be551ae9d1 =
+  BG.fromFFIType hs_bindgen_e31222be551ae9d1_base
+
+-- | Generate a pseudo-random number less than n for positive n
+--
+--     The method used is faster and of better quality than @rand() % n@. Odds are roughly 99.9% even for n = 1 million. Evenness is better for smaller n, and much worse as n gets bigger.
+--
+--     Example: to simulate a d6 use @SDL_rand_r(state, 6) + 1@ The +1 converts 0..5 to 1..6
+--
+--     If you want to generate a pseudo-random number in the full range of 'Sint32', you should use: ('Sint32')SDL_rand_bits_r(state)
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0 .. n-1].
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand', 'sDL_rand_bits_r', 'sDL_randf_r'
+--
+--     [C declaration]: @SDL_rand_r@, defined at @SDL3\/SDL_stdinc.h 4409:36@
+sDL_rand_r
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> Sint32
+  -- ^
+  --
+  --           [@n@]: the number of possible outcomes. n must be positive.
+  -> IO Sint32
+sDL_rand_r = hs_bindgen_e31222be551ae9d1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_randf_r@
+foreign import ccall unsafe "hs_bindgen_b728fa521e1f33ba"
+  hs_bindgen_b728fa521e1f33ba_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_randf_r@
+hs_bindgen_b728fa521e1f33ba
+  :: BG.Ptr Uint64
+  -> IO BG.CFloat
+hs_bindgen_b728fa521e1f33ba =
+  BG.fromFFIType hs_bindgen_b728fa521e1f33ba_base
+
+-- | Generate a uniform pseudo-random floating point number less than 1.0
+--
+--     If you want reproducible output, be sure to initialize with @SDL_srand()@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0.0, 1.0).
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand_bits_r', 'sDL_rand_r', 'sDL_randf'
+--
+--     [C declaration]: @SDL_randf_r@, defined at @SDL3\/SDL_stdinc.h 4436:35@
+sDL_randf_r
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> IO BG.CFloat
+sDL_randf_r = hs_bindgen_b728fa521e1f33ba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_rand_bits_r@
+foreign import ccall unsafe "hs_bindgen_1779b3d1ac6c6ca0"
+  hs_bindgen_1779b3d1ac6c6ca0_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_rand_bits_r@
+hs_bindgen_1779b3d1ac6c6ca0
+  :: BG.Ptr Uint64
+  -> IO Uint32
+hs_bindgen_1779b3d1ac6c6ca0 =
+  BG.fromFFIType hs_bindgen_1779b3d1ac6c6ca0_base
+
+-- | Generate 32 pseudo-random bits.
+--
+--     You likely want to use @SDL_rand_r()@ to get a psuedo-random number instead.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0-SDL_MAX_UINT32].
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_rand_r', 'sDL_randf_r'
+--
+--     [C declaration]: @SDL_rand_bits_r@, defined at @SDL3\/SDL_stdinc.h 4461:36@
+sDL_rand_bits_r
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> IO Uint32
+sDL_rand_bits_r = hs_bindgen_1779b3d1ac6c6ca0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_acos@
+foreign import ccall unsafe "hs_bindgen_77d2b09de2f907bb"
+  hs_bindgen_77d2b09de2f907bb_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_acos@
+hs_bindgen_77d2b09de2f907bb
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_77d2b09de2f907bb =
+  BG.fromFFIType hs_bindgen_77d2b09de2f907bb_base
+
+-- | Compute the arc cosine of @x@.
+--
+--     The definition of @y = acos(x)@ is @x = cos(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @0 \<= y \<= Pi@
+--
+--     This function operates on double-precision floating point values, use SDL_acosf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc cosine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_acosf', 'sDL_asin', 'sDL_cos'
+--
+--     [C declaration]: @SDL_acos@, defined at @SDL3\/SDL_stdinc.h 4515:36@
+sDL_acos
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_acos = hs_bindgen_77d2b09de2f907bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_acosf@
+foreign import ccall unsafe "hs_bindgen_a7dfe79fdc884d97"
+  hs_bindgen_a7dfe79fdc884d97_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_acosf@
+hs_bindgen_a7dfe79fdc884d97
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_a7dfe79fdc884d97 =
+  BG.fromFFIType hs_bindgen_a7dfe79fdc884d97_base
+
+-- | Compute the arc cosine of @x@.
+--
+--     The definition of @y = acos(x)@ is @x = cos(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @0 \<= y \<= Pi@
+--
+--     This function operates on single-precision floating point values, use SDL_acos for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc cosine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_acos', 'sDL_asinf', 'sDL_cosf'
+--
+--     [C declaration]: @SDL_acosf@, defined at @SDL3\/SDL_stdinc.h 4545:35@
+sDL_acosf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_acosf = hs_bindgen_a7dfe79fdc884d97
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_asin@
+foreign import ccall unsafe "hs_bindgen_c1c2c5b2424934f7"
+  hs_bindgen_c1c2c5b2424934f7_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_asin@
+hs_bindgen_c1c2c5b2424934f7
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_c1c2c5b2424934f7 =
+  BG.fromFFIType hs_bindgen_c1c2c5b2424934f7_base
+
+-- | Compute the arc sine of @x@.
+--
+--     The definition of @y = asin(x)@ is @x = sin(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on double-precision floating point values, use SDL_asinf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc sine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_asinf', 'sDL_acos', 'sDL_sin'
+--
+--     [C declaration]: @SDL_asin@, defined at @SDL3\/SDL_stdinc.h 4575:36@
+sDL_asin
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_asin = hs_bindgen_c1c2c5b2424934f7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_asinf@
+foreign import ccall unsafe "hs_bindgen_c0162f35a592c4d6"
+  hs_bindgen_c0162f35a592c4d6_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_asinf@
+hs_bindgen_c0162f35a592c4d6
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_c0162f35a592c4d6 =
+  BG.fromFFIType hs_bindgen_c0162f35a592c4d6_base
+
+-- | Compute the arc sine of @x@.
+--
+--     The definition of @y = asin(x)@ is @x = sin(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on single-precision floating point values, use SDL_asin for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc sine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_asin', 'sDL_acosf', 'sDL_sinf'
+--
+--     [C declaration]: @SDL_asinf@, defined at @SDL3\/SDL_stdinc.h 4605:35@
+sDL_asinf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_asinf = hs_bindgen_c0162f35a592c4d6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atan@
+foreign import ccall unsafe "hs_bindgen_62e948cecf885b31"
+  hs_bindgen_62e948cecf885b31_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atan@
+hs_bindgen_62e948cecf885b31
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_62e948cecf885b31 =
+  BG.fromFFIType hs_bindgen_62e948cecf885b31_base
+
+-- | Compute the arc tangent of @x@.
+--
+--     The definition of @y = atan(x)@ is @x = tan(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on double-precision floating point values, use SDL_atanf for single-precision floats.
+--
+--     To calculate the arc tangent of y \/ x, use SDL_atan2.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @x@ in radians, or 0 if @x = 0@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atanf', 'sDL_atan2', 'sDL_tan'
+--
+--     [C declaration]: @SDL_atan@, defined at @SDL3\/SDL_stdinc.h 4637:36@
+sDL_atan
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_atan = hs_bindgen_62e948cecf885b31
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atanf@
+foreign import ccall unsafe "hs_bindgen_429e4b987b465ff9"
+  hs_bindgen_429e4b987b465ff9_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atanf@
+hs_bindgen_429e4b987b465ff9
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_429e4b987b465ff9 =
+  BG.fromFFIType hs_bindgen_429e4b987b465ff9_base
+
+-- | Compute the arc tangent of @x@.
+--
+--     The definition of @y = atan(x)@ is @x = tan(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on single-precision floating point values, use SDL_atan for dboule-precision floats.
+--
+--     To calculate the arc tangent of y \/ x, use SDL_atan2f.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @x@ in radians, or 0 if @x = 0@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atan', 'sDL_atan2f', 'sDL_tanf'
+--
+--     [C declaration]: @SDL_atanf@, defined at @SDL3\/SDL_stdinc.h 4669:35@
+sDL_atanf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_atanf = hs_bindgen_429e4b987b465ff9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atan2@
+foreign import ccall unsafe "hs_bindgen_dd25876f2db3e27f"
+  hs_bindgen_dd25876f2db3e27f_base
+    :: Double
+    -> Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atan2@
+hs_bindgen_dd25876f2db3e27f
+  :: BG.CDouble
+  -> BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_dd25876f2db3e27f =
+  BG.fromFFIType hs_bindgen_dd25876f2db3e27f_base
+
+-- | Compute the arc tangent of @y \/ x@, using the signs of x and y to adjust the result\'s quadrant.
+--
+--     The definition of @z = atan2(x, y)@ is @y = x tan(z)@, where the quadrant of z is determined based on the signs of x and y.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-Pi \<= y \<= Pi@
+--
+--     This function operates on double-precision floating point values, use SDL_atan2f for single-precision floats.
+--
+--     To calculate the arc tangent of a single value, use SDL_atan.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @y \/ x@ in radians, or, if @x = 0@, either @-Pi\/2@, @0@, or @Pi\/2@, depending on the value of @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atan2f', 'sDL_atan', 'sDL_tan'
+--
+--     [C declaration]: @SDL_atan2@, defined at @SDL3\/SDL_stdinc.h 4705:36@
+sDL_atan2
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@y@]: floating point value of the numerator (y coordinate).
+  -> BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value of the denominator (x coordinate).
+  -> IO BG.CDouble
+sDL_atan2 = hs_bindgen_dd25876f2db3e27f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atan2f@
+foreign import ccall unsafe "hs_bindgen_8131501831457d98"
+  hs_bindgen_8131501831457d98_base
+    :: Float
+    -> Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_atan2f@
+hs_bindgen_8131501831457d98
+  :: BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_8131501831457d98 =
+  BG.fromFFIType hs_bindgen_8131501831457d98_base
+
+-- | Compute the arc tangent of @y \/ x@, using the signs of x and y to adjust the result\'s quadrant.
+--
+--     The definition of @z = atan2(x, y)@ is @y = x tan(z)@, where the quadrant of z is determined based on the signs of x and y.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-Pi \<= y \<= Pi@
+--
+--     This function operates on single-precision floating point values, use SDL_atan2 for double-precision floats.
+--
+--     To calculate the arc tangent of a single value, use SDL_atanf.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @y \/ x@ in radians, or, if @x = 0@, either @-Pi\/2@, @0@, or @Pi\/2@, depending on the value of @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_atan2', 'sDL_atan', 'sDL_tan'
+--
+--     [C declaration]: @SDL_atan2f@, defined at @SDL3\/SDL_stdinc.h 4741:35@
+sDL_atan2f
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@y@]: floating point value of the numerator (y coordinate).
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value of the denominator (x coordinate).
+  -> IO BG.CFloat
+sDL_atan2f = hs_bindgen_8131501831457d98
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_ceil@
+foreign import ccall unsafe "hs_bindgen_6654a059aee78106"
+  hs_bindgen_6654a059aee78106_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_ceil@
+hs_bindgen_6654a059aee78106
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_6654a059aee78106 =
+  BG.fromFFIType hs_bindgen_6654a059aee78106_base
+
+-- | Compute the ceiling of @x@.
+--
+--     The ceiling of @x@ is the smallest integer @y@ such that @y >= x@, i.e @x@ rounded up to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_ceilf for single-precision floats.
+--
+--     [Returns]: the ceiling of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ceilf', 'sDL_floor', 'sDL_trunc', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_ceil@, defined at @SDL3\/SDL_stdinc.h 4769:36@
+sDL_ceil
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_ceil = hs_bindgen_6654a059aee78106
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_ceilf@
+foreign import ccall unsafe "hs_bindgen_ad644f683da406f9"
+  hs_bindgen_ad644f683da406f9_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_ceilf@
+hs_bindgen_ad644f683da406f9
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_ad644f683da406f9 =
+  BG.fromFFIType hs_bindgen_ad644f683da406f9_base
+
+-- | Compute the ceiling of @x@.
+--
+--     The ceiling of @x@ is the smallest integer @y@ such that @y >= x@, i.e @x@ rounded up to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_ceil for double-precision floats.
+--
+--     [Returns]: the ceiling of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ceil', 'sDL_floorf', 'sDL_truncf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_ceilf@, defined at @SDL3\/SDL_stdinc.h 4797:35@
+sDL_ceilf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_ceilf = hs_bindgen_ad644f683da406f9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_copysign@
+foreign import ccall unsafe "hs_bindgen_8091ddede7c04cbc"
+  hs_bindgen_8091ddede7c04cbc_base
+    :: Double
+    -> Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_copysign@
+hs_bindgen_8091ddede7c04cbc
+  :: BG.CDouble
+  -> BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_8091ddede7c04cbc =
+  BG.fromFFIType hs_bindgen_8091ddede7c04cbc_base
+
+-- | Copy the sign of one floating-point value to another.
+--
+--     The definition of copysign is that @copysign(x, y) = abs(x) * sign(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= f@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_copysignf for single-precision floats.
+--
+--     [Returns]: the floating point value with the sign of y and the magnitude of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_copysignf', 'sDL_fabs'
+--
+--     [C declaration]: @SDL_copysign@, defined at @SDL3\/SDL_stdinc.h 4823:36@
+sDL_copysign
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> BG.CDouble
+  -- ^
+  --
+  --           [@y@]: floating point value to use as the sign.
+  -> IO BG.CDouble
+sDL_copysign = hs_bindgen_8091ddede7c04cbc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_copysignf@
+foreign import ccall unsafe "hs_bindgen_b3f4ceb6b2fe20ee"
+  hs_bindgen_b3f4ceb6b2fe20ee_base
+    :: Float
+    -> Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_copysignf@
+hs_bindgen_b3f4ceb6b2fe20ee
+  :: BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_b3f4ceb6b2fe20ee =
+  BG.fromFFIType hs_bindgen_b3f4ceb6b2fe20ee_base
+
+-- | Copy the sign of one floating-point value to another.
+--
+--     The definition of copysign is that @copysign(x, y) = abs(x) * sign(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= f@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_copysign for double-precision floats.
+--
+--     [Returns]: the floating point value with the sign of y and the magnitude of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_copysign', 'sDL_fabsf'
+--
+--     [C declaration]: @SDL_copysignf@, defined at @SDL3\/SDL_stdinc.h 4849:35@
+sDL_copysignf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: floating point value to use as the sign.
+  -> IO BG.CFloat
+sDL_copysignf = hs_bindgen_b3f4ceb6b2fe20ee
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_cos@
+foreign import ccall unsafe "hs_bindgen_a3469aec056551e2"
+  hs_bindgen_a3469aec056551e2_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_cos@
+hs_bindgen_a3469aec056551e2
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_a3469aec056551e2 =
+  BG.fromFFIType hs_bindgen_a3469aec056551e2_base
+
+-- | Compute the cosine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on double-precision floating point values, use SDL_cosf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: cosine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_cosf', 'sDL_acos', 'sDL_sin'
+--
+--     [C declaration]: @SDL_cos@, defined at @SDL3\/SDL_stdinc.h 4877:36@
+sDL_cos
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CDouble
+sDL_cos = hs_bindgen_a3469aec056551e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_cosf@
+foreign import ccall unsafe "hs_bindgen_905fd229e6d8b35e"
+  hs_bindgen_905fd229e6d8b35e_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_cosf@
+hs_bindgen_905fd229e6d8b35e
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_905fd229e6d8b35e =
+  BG.fromFFIType hs_bindgen_905fd229e6d8b35e_base
+
+-- | Compute the cosine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on single-precision floating point values, use SDL_cos for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: cosine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_cos', 'sDL_acosf', 'sDL_sinf'
+--
+--     [C declaration]: @SDL_cosf@, defined at @SDL3\/SDL_stdinc.h 4905:35@
+sDL_cosf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CFloat
+sDL_cosf = hs_bindgen_905fd229e6d8b35e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_exp@
+foreign import ccall unsafe "hs_bindgen_1512e406037d12ac"
+  hs_bindgen_1512e406037d12ac_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_exp@
+hs_bindgen_1512e406037d12ac
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_1512e406037d12ac =
+  BG.fromFFIType hs_bindgen_1512e406037d12ac_base
+
+-- | Compute the exponential of @x@.
+--
+--     The definition of @y = exp(x)@ is @y = e^x@, where @e@ is the base of the natural logarithm. The inverse is the natural logarithm, SDL_log.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     The output will overflow if @exp(x)@ is too large to be represented.
+--
+--     This function operates on double-precision floating point values, use SDL_expf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: value of @e^x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_expf', 'sDL_log'
+--
+--     [C declaration]: @SDL_exp@, defined at @SDL3\/SDL_stdinc.h 4937:36@
+sDL_exp
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_exp = hs_bindgen_1512e406037d12ac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_expf@
+foreign import ccall unsafe "hs_bindgen_d3dd134efe3abfff"
+  hs_bindgen_d3dd134efe3abfff_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_expf@
+hs_bindgen_d3dd134efe3abfff
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_d3dd134efe3abfff =
+  BG.fromFFIType hs_bindgen_d3dd134efe3abfff_base
+
+-- | Compute the exponential of @x@.
+--
+--     The definition of @y = exp(x)@ is @y = e^x@, where @e@ is the base of the natural logarithm. The inverse is the natural logarithm, SDL_logf.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     The output will overflow if @exp(x)@ is too large to be represented.
+--
+--     This function operates on single-precision floating point values, use SDL_exp for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: value of @e^x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_exp', 'sDL_logf'
+--
+--     [C declaration]: @SDL_expf@, defined at @SDL3\/SDL_stdinc.h 4969:35@
+sDL_expf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_expf = hs_bindgen_d3dd134efe3abfff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_fabs@
+foreign import ccall unsafe "hs_bindgen_52ba4ac175596d0a"
+  hs_bindgen_52ba4ac175596d0a_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_fabs@
+hs_bindgen_52ba4ac175596d0a
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_52ba4ac175596d0a =
+  BG.fromFFIType hs_bindgen_52ba4ac175596d0a_base
+
+-- | Compute the absolute value of @x@
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_fabsf for single-precision floats.
+--
+--     [Returns]: the absolute value of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fabsf'
+--
+--     [C declaration]: @SDL_fabs@, defined at @SDL3\/SDL_stdinc.h 4990:36@
+sDL_fabs
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> IO BG.CDouble
+sDL_fabs = hs_bindgen_52ba4ac175596d0a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_fabsf@
+foreign import ccall unsafe "hs_bindgen_184b19c145435e41"
+  hs_bindgen_184b19c145435e41_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_fabsf@
+hs_bindgen_184b19c145435e41
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_184b19c145435e41 =
+  BG.fromFFIType hs_bindgen_184b19c145435e41_base
+
+-- | Compute the absolute value of @x@
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_fabs for double-precision floats.
+--
+--     [Returns]: the absolute value of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fabs'
+--
+--     [C declaration]: @SDL_fabsf@, defined at @SDL3\/SDL_stdinc.h 5011:35@
+sDL_fabsf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> IO BG.CFloat
+sDL_fabsf = hs_bindgen_184b19c145435e41
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_floor@
+foreign import ccall unsafe "hs_bindgen_f490c8eee1698a66"
+  hs_bindgen_f490c8eee1698a66_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_floor@
+hs_bindgen_f490c8eee1698a66
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_f490c8eee1698a66 =
+  BG.fromFFIType hs_bindgen_f490c8eee1698a66_base
+
+-- | Compute the floor of @x@.
+--
+--     The floor of @x@ is the largest integer @y@ such that @y \<= x@, i.e @x@ rounded down to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_floorf for single-precision floats.
+--
+--     [Returns]: the floor of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_floorf', 'sDL_ceil', 'sDL_trunc', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_floor@, defined at @SDL3\/SDL_stdinc.h 5039:36@
+sDL_floor
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_floor = hs_bindgen_f490c8eee1698a66
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_floorf@
+foreign import ccall unsafe "hs_bindgen_2f0b4572dde60cf4"
+  hs_bindgen_2f0b4572dde60cf4_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_floorf@
+hs_bindgen_2f0b4572dde60cf4
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_2f0b4572dde60cf4 =
+  BG.fromFFIType hs_bindgen_2f0b4572dde60cf4_base
+
+-- | Compute the floor of @x@.
+--
+--     The floor of @x@ is the largest integer @y@ such that @y \<= x@, i.e @x@ rounded down to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_floor for double-precision floats.
+--
+--     [Returns]: the floor of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_floor', 'sDL_ceilf', 'sDL_truncf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_floorf@, defined at @SDL3\/SDL_stdinc.h 5067:35@
+sDL_floorf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_floorf = hs_bindgen_2f0b4572dde60cf4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_trunc@
+foreign import ccall unsafe "hs_bindgen_0babb20dade49b7a"
+  hs_bindgen_0babb20dade49b7a_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_trunc@
+hs_bindgen_0babb20dade49b7a
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_0babb20dade49b7a =
+  BG.fromFFIType hs_bindgen_0babb20dade49b7a_base
+
+-- | Truncate @x@ to an integer.
+--
+--     Rounds @x@ to the next closest integer to 0. This is equivalent to removing the fractional part of @x@, leaving only the integer part.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_truncf for single-precision floats.
+--
+--     [Returns]: @x@ truncated to an integer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_truncf', 'sDL_fmod', 'sDL_ceil', 'sDL_floor', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_trunc@, defined at @SDL3\/SDL_stdinc.h 5096:36@
+sDL_trunc
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_trunc = hs_bindgen_0babb20dade49b7a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_truncf@
+foreign import ccall unsafe "hs_bindgen_90bf99d352a2662e"
+  hs_bindgen_90bf99d352a2662e_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_truncf@
+hs_bindgen_90bf99d352a2662e
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_90bf99d352a2662e =
+  BG.fromFFIType hs_bindgen_90bf99d352a2662e_base
+
+-- | Truncate @x@ to an integer.
+--
+--     Rounds @x@ to the next closest integer to 0. This is equivalent to removing the fractional part of @x@, leaving only the integer part.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_trunc for double-precision floats.
+--
+--     [Returns]: @x@ truncated to an integer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_trunc', 'sDL_fmodf', 'sDL_ceilf', 'sDL_floorf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_truncf@, defined at @SDL3\/SDL_stdinc.h 5125:35@
+sDL_truncf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_truncf = hs_bindgen_90bf99d352a2662e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_fmod@
+foreign import ccall unsafe "hs_bindgen_01e3fd06ce04c71f"
+  hs_bindgen_01e3fd06ce04c71f_base
+    :: Double
+    -> Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_fmod@
+hs_bindgen_01e3fd06ce04c71f
+  :: BG.CDouble
+  -> BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_01e3fd06ce04c71f =
+  BG.fromFFIType hs_bindgen_01e3fd06ce04c71f_base
+
+-- | Return the floating-point remainder of @x \/ y@
+--
+--     Divides @x@ by @y@, and returns the remainder.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@, @y != 0@
+--
+--     Range: @-y \<= z \<= y@
+--
+--     This function operates on double-precision floating point values, use SDL_fmodf for single-precision floats.
+--
+--     [Returns]: the remainder of @x \/ y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fmodf', 'sDL_modf', 'sDL_trunc', 'sDL_ceil', 'sDL_floor', 'sDL_round', @SDL_lround@
+--
+--     [C declaration]: @SDL_fmod@, defined at @SDL3\/SDL_stdinc.h 5155:36@
+sDL_fmod
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: the numerator.
+  -> BG.CDouble
+  -- ^
+  --
+  --           [@y@]: the denominator. Must not be 0.
+  -> IO BG.CDouble
+sDL_fmod = hs_bindgen_01e3fd06ce04c71f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_fmodf@
+foreign import ccall unsafe "hs_bindgen_d31c39dbd23d1312"
+  hs_bindgen_d31c39dbd23d1312_base
+    :: Float
+    -> Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_fmodf@
+hs_bindgen_d31c39dbd23d1312
+  :: BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_d31c39dbd23d1312 =
+  BG.fromFFIType hs_bindgen_d31c39dbd23d1312_base
+
+-- | Return the floating-point remainder of @x \/ y@
+--
+--     Divides @x@ by @y@, and returns the remainder.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@, @y != 0@
+--
+--     Range: @-y \<= z \<= y@
+--
+--     This function operates on single-precision floating point values, use SDL_fmod for double-precision floats.
+--
+--     [Returns]: the remainder of @x \/ y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_fmod', 'sDL_truncf', 'sDL_modff', 'sDL_ceilf', 'sDL_floorf', 'sDL_roundf', @SDL_lroundf@
+--
+--     [C declaration]: @SDL_fmodf@, defined at @SDL3\/SDL_stdinc.h 5185:35@
+sDL_fmodf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the numerator.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the denominator. Must not be 0.
+  -> IO BG.CFloat
+sDL_fmodf = hs_bindgen_d31c39dbd23d1312
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isinf@
+foreign import ccall unsafe "hs_bindgen_a7c939d2e78d66af"
+  hs_bindgen_a7c939d2e78d66af_base
+    :: Double
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isinf@
+hs_bindgen_a7c939d2e78d66af
+  :: BG.CDouble
+  -> IO BG.CInt
+hs_bindgen_a7c939d2e78d66af =
+  BG.fromFFIType hs_bindgen_a7c939d2e78d66af_base
+
+-- | Return whether the value is infinity.
+--
+--     [Returns]: non-zero if the value is infinity, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isinff'
+--
+--     [C declaration]: @SDL_isinf@, defined at @SDL3\/SDL_stdinc.h 5199:33@
+sDL_isinf
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: double-precision floating point value.
+  -> IO BG.CInt
+sDL_isinf = hs_bindgen_a7c939d2e78d66af
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isinff@
+foreign import ccall unsafe "hs_bindgen_dd1421aaa48b6683"
+  hs_bindgen_dd1421aaa48b6683_base
+    :: Float
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isinff@
+hs_bindgen_dd1421aaa48b6683
+  :: BG.CFloat
+  -> IO BG.CInt
+hs_bindgen_dd1421aaa48b6683 =
+  BG.fromFFIType hs_bindgen_dd1421aaa48b6683_base
+
+-- | Return whether the value is infinity.
+--
+--     [Returns]: non-zero if the value is infinity, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isinf'
+--
+--     [C declaration]: @SDL_isinff@, defined at @SDL3\/SDL_stdinc.h 5213:33@
+sDL_isinff
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CInt
+sDL_isinff = hs_bindgen_dd1421aaa48b6683
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isnan@
+foreign import ccall unsafe "hs_bindgen_8b37e78060d7faba"
+  hs_bindgen_8b37e78060d7faba_base
+    :: Double
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isnan@
+hs_bindgen_8b37e78060d7faba
+  :: BG.CDouble
+  -> IO BG.CInt
+hs_bindgen_8b37e78060d7faba =
+  BG.fromFFIType hs_bindgen_8b37e78060d7faba_base
+
+-- | Return whether the value is NaN.
+--
+--     [Returns]: non-zero if the value is NaN, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isnanf'
+--
+--     [C declaration]: @SDL_isnan@, defined at @SDL3\/SDL_stdinc.h 5227:33@
+sDL_isnan
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: double-precision floating point value.
+  -> IO BG.CInt
+sDL_isnan = hs_bindgen_8b37e78060d7faba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isnanf@
+foreign import ccall unsafe "hs_bindgen_a7fc9d37cba1e7fb"
+  hs_bindgen_a7fc9d37cba1e7fb_base
+    :: Float
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_isnanf@
+hs_bindgen_a7fc9d37cba1e7fb
+  :: BG.CFloat
+  -> IO BG.CInt
+hs_bindgen_a7fc9d37cba1e7fb =
+  BG.fromFFIType hs_bindgen_a7fc9d37cba1e7fb_base
+
+-- | Return whether the value is NaN.
+--
+--     [Returns]: non-zero if the value is NaN, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_isnan'
+--
+--     [C declaration]: @SDL_isnanf@, defined at @SDL3\/SDL_stdinc.h 5241:33@
+sDL_isnanf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CInt
+sDL_isnanf = hs_bindgen_a7fc9d37cba1e7fb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_log@
+foreign import ccall unsafe "hs_bindgen_e20d665d8e9d64dc"
+  hs_bindgen_e20d665d8e9d64dc_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_log@
+hs_bindgen_e20d665d8e9d64dc
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_e20d665d8e9d64dc =
+  BG.fromFFIType hs_bindgen_e20d665d8e9d64dc_base
+
+-- | Compute the natural logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on double-precision floating point values, use SDL_logf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the natural logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_logf', 'sDL_log10', 'sDL_exp'
+--
+--     [C declaration]: @SDL_log@, defined at @SDL3\/SDL_stdinc.h 5271:36@
+sDL_log
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO BG.CDouble
+sDL_log = hs_bindgen_e20d665d8e9d64dc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_logf@
+foreign import ccall unsafe "hs_bindgen_7e096c5f793dcab0"
+  hs_bindgen_7e096c5f793dcab0_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_logf@
+hs_bindgen_7e096c5f793dcab0
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_7e096c5f793dcab0 =
+  BG.fromFFIType hs_bindgen_7e096c5f793dcab0_base
+
+-- | Compute the natural logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on single-precision floating point values, use SDL_log for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the natural logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_log', 'sDL_expf'
+--
+--     [C declaration]: @SDL_logf@, defined at @SDL3\/SDL_stdinc.h 5300:35@
+sDL_logf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO BG.CFloat
+sDL_logf = hs_bindgen_7e096c5f793dcab0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_log10@
+foreign import ccall unsafe "hs_bindgen_923087147ca0e620"
+  hs_bindgen_923087147ca0e620_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_log10@
+hs_bindgen_923087147ca0e620
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_923087147ca0e620 =
+  BG.fromFFIType hs_bindgen_923087147ca0e620_base
+
+-- | Compute the base-10 logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on double-precision floating point values, use SDL_log10f for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_log10f', 'sDL_log', 'sDL_pow'
+--
+--     [C declaration]: @SDL_log10@, defined at @SDL3\/SDL_stdinc.h 5330:36@
+sDL_log10
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO BG.CDouble
+sDL_log10 = hs_bindgen_923087147ca0e620
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_log10f@
+foreign import ccall unsafe "hs_bindgen_bfd8d2db495dd53c"
+  hs_bindgen_bfd8d2db495dd53c_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_log10f@
+hs_bindgen_bfd8d2db495dd53c
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_bfd8d2db495dd53c =
+  BG.fromFFIType hs_bindgen_bfd8d2db495dd53c_base
+
+-- | Compute the base-10 logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on single-precision floating point values, use SDL_log10 for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_log10', 'sDL_logf', 'sDL_powf'
+--
+--     [C declaration]: @SDL_log10f@, defined at @SDL3\/SDL_stdinc.h 5360:35@
+sDL_log10f
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO BG.CFloat
+sDL_log10f = hs_bindgen_bfd8d2db495dd53c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_modf@
+foreign import ccall unsafe "hs_bindgen_b899f8ade3afe831"
+  hs_bindgen_b899f8ade3afe831_base
+    :: Double
+    -> BG.Ptr BG.Void
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_modf@
+hs_bindgen_b899f8ade3afe831
+  :: BG.CDouble
+  -> BG.Ptr BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_b899f8ade3afe831 =
+  BG.fromFFIType hs_bindgen_b899f8ade3afe831_base
+
+-- | Split @x@ into integer and fractional parts
+--
+--     This function operates on double-precision floating point values, use SDL_modff for single-precision floats.
+--
+--     [Returns]: the fractional part of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_modff', 'sDL_trunc', 'sDL_fmod'
+--
+--     [C declaration]: @SDL_modf@, defined at @SDL3\/SDL_stdinc.h 5380:36@
+sDL_modf
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> BG.Ptr BG.CDouble
+  -- ^
+  --
+  --           [@y@]: output pointer to store the integer part of @x@.
+  -> IO BG.CDouble
+sDL_modf = hs_bindgen_b899f8ade3afe831
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_modff@
+foreign import ccall unsafe "hs_bindgen_6ff7524556040016"
+  hs_bindgen_6ff7524556040016_base
+    :: Float
+    -> BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_modff@
+hs_bindgen_6ff7524556040016
+  :: BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_6ff7524556040016 =
+  BG.fromFFIType hs_bindgen_6ff7524556040016_base
+
+-- | Split @x@ into integer and fractional parts
+--
+--     This function operates on single-precision floating point values, use SDL_modf for double-precision floats.
+--
+--     [Returns]: the fractional part of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_modf', 'sDL_truncf', 'sDL_fmodf'
+--
+--     [C declaration]: @SDL_modff@, defined at @SDL3\/SDL_stdinc.h 5400:35@
+sDL_modff
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: output pointer to store the integer part of @x@.
+  -> IO BG.CFloat
+sDL_modff = hs_bindgen_6ff7524556040016
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_pow@
+foreign import ccall unsafe "hs_bindgen_fd54b81ef06bf15c"
+  hs_bindgen_fd54b81ef06bf15c_base
+    :: Double
+    -> Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_pow@
+hs_bindgen_fd54b81ef06bf15c
+  :: BG.CDouble
+  -> BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_fd54b81ef06bf15c =
+  BG.fromFFIType hs_bindgen_fd54b81ef06bf15c_base
+
+-- | Raise @x@ to the power @y@
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     If @y@ is the base of the natural logarithm (e), consider using SDL_exp instead.
+--
+--     This function operates on double-precision floating point values, use SDL_powf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: @x@ raised to the power @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_powf', 'sDL_exp', 'sDL_log'
+--
+--     [C declaration]: @SDL_pow@, defined at @SDL3\/SDL_stdinc.h 5432:36@
+sDL_pow
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: the base.
+  -> BG.CDouble
+  -- ^
+  --
+  --           [@y@]: the exponent.
+  -> IO BG.CDouble
+sDL_pow = hs_bindgen_fd54b81ef06bf15c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_powf@
+foreign import ccall unsafe "hs_bindgen_e6e1cafad3d1ca48"
+  hs_bindgen_e6e1cafad3d1ca48_base
+    :: Float
+    -> Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_powf@
+hs_bindgen_e6e1cafad3d1ca48
+  :: BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_e6e1cafad3d1ca48 =
+  BG.fromFFIType hs_bindgen_e6e1cafad3d1ca48_base
+
+-- | Raise @x@ to the power @y@
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     If @y@ is the base of the natural logarithm (e), consider using SDL_exp instead.
+--
+--     This function operates on single-precision floating point values, use SDL_pow for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: @x@ raised to the power @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_pow', 'sDL_expf', 'sDL_logf'
+--
+--     [C declaration]: @SDL_powf@, defined at @SDL3\/SDL_stdinc.h 5464:35@
+sDL_powf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: the base.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@y@]: the exponent.
+  -> IO BG.CFloat
+sDL_powf = hs_bindgen_e6e1cafad3d1ca48
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_round@
+foreign import ccall unsafe "hs_bindgen_263d784275f69beb"
+  hs_bindgen_263d784275f69beb_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_round@
+hs_bindgen_263d784275f69beb
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_263d784275f69beb =
+  BG.fromFFIType hs_bindgen_263d784275f69beb_base
+
+-- | Round @x@ to the nearest integer.
+--
+--     Rounds @x@ to the nearest integer. Values halfway between integers will be rounded away from zero.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use SDL_roundf for single-precision floats. To get the result as an integer type, use SDL_lround.
+--
+--     [Returns]: the nearest integer to @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_roundf', @SDL_lround@, 'sDL_floor', 'sDL_ceil', 'sDL_trunc'
+--
+--     [C declaration]: @SDL_round@, defined at @SDL3\/SDL_stdinc.h 5493:36@
+sDL_round
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CDouble
+sDL_round = hs_bindgen_263d784275f69beb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_roundf@
+foreign import ccall unsafe "hs_bindgen_11783f7b112ca4ce"
+  hs_bindgen_11783f7b112ca4ce_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_roundf@
+hs_bindgen_11783f7b112ca4ce
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_11783f7b112ca4ce =
+  BG.fromFFIType hs_bindgen_11783f7b112ca4ce_base
+
+-- | Round @x@ to the nearest integer.
+--
+--     Rounds @x@ to the nearest integer. Values halfway between integers will be rounded away from zero.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use SDL_round for double-precision floats. To get the result as an integer type, use SDL_lroundf.
+--
+--     [Returns]: the nearest integer to @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_round', @SDL_lroundf@, 'sDL_floorf', 'sDL_ceilf', 'sDL_truncf'
+--
+--     [C declaration]: @SDL_roundf@, defined at @SDL3\/SDL_stdinc.h 5522:35@
+sDL_roundf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.CFloat
+sDL_roundf = hs_bindgen_11783f7b112ca4ce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_scalbn@
+foreign import ccall unsafe "hs_bindgen_e6bb2ac10b5df120"
+  hs_bindgen_e6bb2ac10b5df120_base
+    :: Double
+    -> BG.Int32
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_scalbn@
+hs_bindgen_e6bb2ac10b5df120
+  :: BG.CDouble
+  -> BG.CInt
+  -> IO BG.CDouble
+hs_bindgen_e6bb2ac10b5df120 =
+  BG.fromFFIType hs_bindgen_e6bb2ac10b5df120_base
+
+-- | Scale @x@ by an integer power of two.
+--
+--     Multiplies @x@ by the @n@ th power of the floating point radix (always 2).
+--
+--     Domain: @-INF \<= x \<= INF@, @n@ integer
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_scalbnf for single-precision floats.
+--
+--     [Returns]: @x * 2^n@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_scalbnf', 'sDL_pow'
+--
+--     [C declaration]: @SDL_scalbn@, defined at @SDL3\/SDL_stdinc.h 5605:36@
+sDL_scalbn
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value to be scaled.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@n@]: integer exponent.
+  -> IO BG.CDouble
+sDL_scalbn = hs_bindgen_e6bb2ac10b5df120
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_scalbnf@
+foreign import ccall unsafe "hs_bindgen_98b72e0135481fa6"
+  hs_bindgen_98b72e0135481fa6_base
+    :: Float
+    -> BG.Int32
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_scalbnf@
+hs_bindgen_98b72e0135481fa6
+  :: BG.CFloat
+  -> BG.CInt
+  -> IO BG.CFloat
+hs_bindgen_98b72e0135481fa6 =
+  BG.fromFFIType hs_bindgen_98b72e0135481fa6_base
+
+-- | Scale @x@ by an integer power of two.
+--
+--     Multiplies @x@ by the @n@ th power of the floating point radix (always 2).
+--
+--     Domain: @-INF \<= x \<= INF@, @n@ integer
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_scalbn for double-precision floats.
+--
+--     [Returns]: @x * 2^n@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_scalbn', 'sDL_powf'
+--
+--     [C declaration]: @SDL_scalbnf@, defined at @SDL3\/SDL_stdinc.h 5630:35@
+sDL_scalbnf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value to be scaled.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@n@]: integer exponent.
+  -> IO BG.CFloat
+sDL_scalbnf = hs_bindgen_98b72e0135481fa6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_sin@
+foreign import ccall unsafe "hs_bindgen_7f63dcf686d5381e"
+  hs_bindgen_7f63dcf686d5381e_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_sin@
+hs_bindgen_7f63dcf686d5381e
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_7f63dcf686d5381e =
+  BG.fromFFIType hs_bindgen_7f63dcf686d5381e_base
+
+-- | Compute the sine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on double-precision floating point values, use SDL_sinf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: sine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sinf', 'sDL_asin', 'sDL_cos'
+--
+--     [C declaration]: @SDL_sin@, defined at @SDL3\/SDL_stdinc.h 5658:36@
+sDL_sin
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CDouble
+sDL_sin = hs_bindgen_7f63dcf686d5381e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_sinf@
+foreign import ccall unsafe "hs_bindgen_3b77259c6cddba0e"
+  hs_bindgen_3b77259c6cddba0e_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_sinf@
+hs_bindgen_3b77259c6cddba0e
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_3b77259c6cddba0e =
+  BG.fromFFIType hs_bindgen_3b77259c6cddba0e_base
+
+-- | Compute the sine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on single-precision floating point values, use SDL_sin for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: sine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sin', 'sDL_asinf', 'sDL_cosf'
+--
+--     [C declaration]: @SDL_sinf@, defined at @SDL3\/SDL_stdinc.h 5686:35@
+sDL_sinf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CFloat
+sDL_sinf = hs_bindgen_3b77259c6cddba0e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_sqrt@
+foreign import ccall unsafe "hs_bindgen_911bffe699be4bcc"
+  hs_bindgen_911bffe699be4bcc_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_sqrt@
+hs_bindgen_911bffe699be4bcc
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_911bffe699be4bcc =
+  BG.fromFFIType hs_bindgen_911bffe699be4bcc_base
+
+-- | Compute the square root of @x@.
+--
+--     Domain: @0 \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_sqrtf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: square root of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sqrtf'
+--
+--     [C declaration]: @SDL_sqrt@, defined at @SDL3\/SDL_stdinc.h 5712:36@
+sDL_sqrt
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than or equal to 0.
+  -> IO BG.CDouble
+sDL_sqrt = hs_bindgen_911bffe699be4bcc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_sqrtf@
+foreign import ccall unsafe "hs_bindgen_44ac9f7898a32796"
+  hs_bindgen_44ac9f7898a32796_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_sqrtf@
+hs_bindgen_44ac9f7898a32796
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_44ac9f7898a32796 =
+  BG.fromFFIType hs_bindgen_44ac9f7898a32796_base
+
+-- | Compute the square root of @x@.
+--
+--     Domain: @0 \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_sqrt for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: square root of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_sqrt'
+--
+--     [C declaration]: @SDL_sqrtf@, defined at @SDL3\/SDL_stdinc.h 5738:35@
+sDL_sqrtf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than or equal to 0.
+  -> IO BG.CFloat
+sDL_sqrtf = hs_bindgen_44ac9f7898a32796
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_tan@
+foreign import ccall unsafe "hs_bindgen_aece2559e5dc0392"
+  hs_bindgen_aece2559e5dc0392_base
+    :: Double
+    -> IO Double
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_tan@
+hs_bindgen_aece2559e5dc0392
+  :: BG.CDouble
+  -> IO BG.CDouble
+hs_bindgen_aece2559e5dc0392 =
+  BG.fromFFIType hs_bindgen_aece2559e5dc0392_base
+
+-- | Compute the tangent of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use SDL_tanf for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: tangent of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_tanf', 'sDL_sin', 'sDL_cos', 'sDL_atan', 'sDL_atan2'
+--
+--     [C declaration]: @SDL_tan@, defined at @SDL3\/SDL_stdinc.h 5768:36@
+sDL_tan
+  :: BG.CDouble
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CDouble
+sDL_tan = hs_bindgen_aece2559e5dc0392
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_tanf@
+foreign import ccall unsafe "hs_bindgen_c528bf7014ccff4b"
+  hs_bindgen_c528bf7014ccff4b_base
+    :: Float
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_tanf@
+hs_bindgen_c528bf7014ccff4b
+  :: BG.CFloat
+  -> IO BG.CFloat
+hs_bindgen_c528bf7014ccff4b =
+  BG.fromFFIType hs_bindgen_c528bf7014ccff4b_base
+
+-- | Compute the tangent of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use SDL_tan for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: tangent of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_tan', 'sDL_sinf', 'sDL_cosf', 'sDL_atanf', 'sDL_atan2f'
+--
+--     [C declaration]: @SDL_tanf@, defined at @SDL3\/SDL_stdinc.h 5798:35@
+sDL_tanf
+  :: BG.CFloat
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO BG.CFloat
+sDL_tanf = hs_bindgen_c528bf7014ccff4b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_iconv_open@
+foreign import ccall unsafe "hs_bindgen_f0bd929aee0b42ea"
+  hs_bindgen_f0bd929aee0b42ea_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_iconv_open@
+hs_bindgen_f0bd929aee0b42ea
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO SDL_iconv_t
+hs_bindgen_f0bd929aee0b42ea =
+  BG.fromFFIType hs_bindgen_f0bd929aee0b42ea_base
+
+-- | This function allocates a context for the specified character set conversion.
+--
+--     [Returns]: a handle that must be freed with SDL_iconv_close, or SDL_ICONV_ERROR on failure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv', 'sDL_iconv_close', 'sDL_iconv_string'
+--
+--     [C declaration]: @SDL_iconv_open@, defined at @SDL3\/SDL_stdinc.h 5826:41@
+sDL_iconv_open
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tocode@]: The target character encoding, must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@fromcode@]: The source character encoding, must not be NULL.
+  -> IO SDL_iconv_t
+sDL_iconv_open = hs_bindgen_f0bd929aee0b42ea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_iconv_close@
+foreign import ccall unsafe "hs_bindgen_3f715b186320f23e"
+  hs_bindgen_3f715b186320f23e_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_iconv_close@
+hs_bindgen_3f715b186320f23e
+  :: SDL_iconv_t
+  -> IO BG.CInt
+hs_bindgen_3f715b186320f23e =
+  BG.fromFFIType hs_bindgen_3f715b186320f23e_base
+
+-- | This function frees a context used for character set conversion.
+--
+--     [Returns]: 0 on success, or -1 on failure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv', 'sDL_iconv_open', 'sDL_iconv_string'
+--
+--     [C declaration]: @SDL_iconv_close@, defined at @SDL3\/SDL_stdinc.h 5843:33@
+sDL_iconv_close
+  :: SDL_iconv_t
+  -- ^
+  --
+  --           [@cd@]: The character set conversion handle.
+  -> IO BG.CInt
+sDL_iconv_close = hs_bindgen_3f715b186320f23e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_iconv@
+foreign import ccall unsafe "hs_bindgen_97b150fcf3a8acd6"
+  hs_bindgen_97b150fcf3a8acd6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_iconv@
+hs_bindgen_97b150fcf3a8acd6
+  :: SDL_iconv_t
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO HsBindgen.Runtime.LibC.CSize
+hs_bindgen_97b150fcf3a8acd6 =
+  BG.fromFFIType hs_bindgen_97b150fcf3a8acd6_base
+
+-- | This function converts text between encodings, reading from and writing to a buffer.
+--
+--     It returns the number of successful conversions on success. On error, SDL_ICONV_E2BIG is returned when the output buffer is too small, or SDL_ICONV_EILSEQ is returned when an invalid input sequence is encountered, or SDL_ICONV_EINVAL is returned when an incomplete input sequence is encountered.
+--
+--     On exit:
+--
+--     * inbuf will point to the beginning of the next multibyte sequence. On error, this is the location of the problematic input sequence. On success, this is the end of the input sequence.
+--
+--     * inbytesleft will be set to the number of bytes left to convert, which will be 0 on success.
+--
+--     * outbuf will point to the location where to store the next output byte.
+--
+--     * outbytesleft will be set to the number of bytes left in the output buffer.
+--
+--     [Returns]: the number of conversions on success, or a negative error code.
+--
+--     [Thread safety]: Do not use the same 'SDL_iconv_t' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv_open', 'sDL_iconv_close', 'sDL_iconv_string'
+--
+--     [C declaration]: @SDL_iconv@, defined at @SDL3\/SDL_stdinc.h 5883:36@
+sDL_iconv
+  :: SDL_iconv_t
+  -- ^
+  --
+  --           [@cd@]: The character set conversion context, created in @SDL_iconv_open()@.
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@inbuf@]: Address of variable that points to the first character of the input sequence.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@inbytesleft@]: The number of bytes in the input buffer.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@outbuf@]: Address of variable that points to the output buffer.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@outbytesleft@]: The number of bytes in the output buffer.
+  -> IO HsBindgen.Runtime.LibC.CSize
+sDL_iconv = hs_bindgen_97b150fcf3a8acd6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_iconv_string@
+foreign import ccall unsafe "hs_bindgen_75bcf8b9f2da9e0a"
+  hs_bindgen_75bcf8b9f2da9e0a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_iconv_string@
+hs_bindgen_75bcf8b9f2da9e0a
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.CChar)
+hs_bindgen_75bcf8b9f2da9e0a =
+  BG.fromFFIType hs_bindgen_75bcf8b9f2da9e0a_base
+
+-- | Helper function to convert a string\'s encoding in one call.
+--
+--     This function converts a buffer or string between encodings in one pass.
+--
+--     The string does not need to be NULL-terminated; this function operates on the number of bytes specified in @inbytesleft@ whether there is a NULL character anywhere in the buffer.
+--
+--     The returned string is owned by the caller, and should be passed to SDL_free when no longer needed.
+--
+--     [Returns]: a new string, converted to the new encoding, or NULL on error.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_iconv_open', 'sDL_iconv_close', 'sDL_iconv'
+--
+--     [C declaration]: @SDL_iconv_string@, defined at @SDL3\/SDL_stdinc.h 5920:36@
+sDL_iconv_string
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tocode@]: the character encoding of the output string. Examples are \"UTF-8\", \"UCS-4\", etc.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@fromcode@]: the character encoding of data in @inbuf@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@inbuf@]: the string to convert to a different encoding.
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@inbytesleft@]: the size of the input string /in bytes/.
+  -> IO (BG.Ptr BG.CChar)
+sDL_iconv_string = hs_bindgen_75bcf8b9f2da9e0a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_size_mul_check_overflow_builtin@
+foreign import ccall unsafe "hs_bindgen_51dba5ddaea9f2e4"
+  hs_bindgen_51dba5ddaea9f2e4_base
+    :: BG.Word64
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_size_mul_check_overflow_builtin@
+hs_bindgen_51dba5ddaea9f2e4
+  :: HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CBool
+hs_bindgen_51dba5ddaea9f2e4 =
+  BG.fromFFIType hs_bindgen_51dba5ddaea9f2e4_base
+
+-- | [C declaration]: @SDL_size_mul_check_overflow_builtin@, defined at @SDL3\/SDL_stdinc.h 6101:23@
+sDL_size_mul_check_overflow_builtin
+  :: HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @a@
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @b@
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @ret@
+  -> IO BG.CBool
+sDL_size_mul_check_overflow_builtin =
+  hs_bindgen_51dba5ddaea9f2e4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_size_add_check_overflow_builtin@
+foreign import ccall unsafe "hs_bindgen_7509bdb3d2cd84da"
+  hs_bindgen_7509bdb3d2cd84da_base
+    :: BG.Word64
+    -> BG.Word64
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Stdinc_Unsafe_SDL_size_add_check_overflow_builtin@
+hs_bindgen_7509bdb3d2cd84da
+  :: HsBindgen.Runtime.LibC.CSize
+  -> HsBindgen.Runtime.LibC.CSize
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO BG.CBool
+hs_bindgen_7509bdb3d2cd84da =
+  BG.fromFFIType hs_bindgen_7509bdb3d2cd84da_base
+
+-- | [C declaration]: @SDL_size_add_check_overflow_builtin@, defined at @SDL3\/SDL_stdinc.h 6139:23@
+sDL_size_add_check_overflow_builtin
+  :: HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @a@
+  -> HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @b@
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @ret@
+  -> IO BG.CBool
+sDL_size_add_check_overflow_builtin =
+  hs_bindgen_7509bdb3d2cd84da
diff --git a/src/SDL3/Sys/Bindgen/Storage.hs b/src/SDL3/Sys/Bindgen/Storage.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Storage.hs
@@ -0,0 +1,874 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | The storage API is a high-level API designed to abstract away the portability issues that come up when using something lower-level (in SDL\'s case, this sits on top of the [Filesystem](CategoryFilesystem) and [IOStream](CategoryIOStream) subsystems). It is significantly more restrictive than a typical filesystem API, for a number of reasons:
+--
+--     1. __What to Access:__ A common pitfall with existing filesystem APIs is the assumption that all storage is monolithic. However, many other platforms (game consoles in particular) are more strict about what /type/ of filesystem is being accessed; for example, game content and user data are usually two separate storage devices with entirely different characteristics (and possibly different low-level APIs altogether!).
+--
+--     2. __How to Access:__ Another common mistake is applications assuming that all storage is universally writeable - again, many platforms treat game content and user data as two separate storage devices, and only user data is writeable while game content is read-only.
+--
+--     3. __When to Access:__ The most common portability issue with filesystem access is /timing/ - you cannot always assume that the storage device is always accessible all of the time, nor can you assume that there are no limits to how long you have access to a particular device.
+--
+--     Consider the following example:
+--
+--     @
+--     void ReadGameData(void)
+--     {
+--         extern char** fileNames;
+--         extern size_t numFiles;
+--         for (size_t i = 0; i \< numFiles; i += 1) {
+--             FILE *data = fopen(fileNames[i], \"rwb\");
+--             if (data == NULL) {
+--                 \/\/ Something bad happened!
+--             } else {
+--                 \/\/ A bunch of stuff happens here
+--                 fclose(data);
+--             }
+--         }
+--     }
+--
+--     void ReadSave(void)
+--     {
+--         FILE *save = fopen(\"saves\/save0.sav\", \"rb\");
+--         if (save == NULL) {
+--             \/\/ Something bad happened!
+--         } else {
+--             \/\/ A bunch of stuff happens here
+--             fclose(save);
+--         }
+--     }
+--
+--     void WriteSave(void)
+--     {
+--         FILE *save = fopen(\"saves\/save0.sav\", \"wb\");
+--         if (save == NULL) {
+--             \/\/ Something bad happened!
+--         } else {
+--             \/\/ A bunch of stuff happens here
+--             fclose(save);
+--         }
+--     }
+--     @
+--
+--     Going over the bullet points again:
+--
+--     1. __What to Access:__ This code accesses a global filesystem; game data and saves are all presumed to be in the current working directory (which may or may not be the game\'s installation folder!).
+--
+--     2. __How to Access:__ This code assumes that content paths are writeable, and that save data is also writeable despite being in the same location as the game data.
+--
+--     3. __When to Access:__ This code assumes that they can be called at any time, since the filesystem is always accessible and has no limits on how long the filesystem is being accessed.
+--
+--     Due to these assumptions, the filesystem code is not portable and will fail under these common scenarios:
+--
+--     * The game is installed on a device that is read-only, both content loading and game saves will fail or crash outright
+--
+--     * Game\/User storage is not implicitly mounted, so no files will be found for either scenario when a platform requires explicitly mounting filesystems
+--
+--     * Save data may not be safe since the I\/O is not being flushed or validated, so an error occurring elsewhere in the program may result in missing\/corrupted save data
+--
+--     When using 'SDL_Storage', these types of problems are virtually impossible to trip over:
+--
+--     @
+--     void ReadGameData(void)
+--     {
+--         extern char** fileNames;
+--         extern size_t numFiles;
+--
+--         SDL_Storage *title = SDL_OpenTitleStorage(NULL, 0);
+--         if (title == NULL) {
+--             \/\/ Something bad happened!
+--         }
+--         while (!SDL_StorageReady(title)) {
+--             SDL_Delay(1);
+--         }
+--
+--         for (size_t i = 0; i \< numFiles; i += 1) {
+--             void* dst;
+--             Uint64 dstLen = 0;
+--
+--             if (SDL_GetStorageFileSize(title, fileNames[i], &dstLen) && dstLen > 0) {
+--                 dst = SDL_malloc(dstLen);
+--                 if (SDL_ReadStorageFile(title, fileNames[i], dst, dstLen)) {
+--                     \/\/ A bunch of stuff happens here
+--                 } else {
+--                     \/\/ Something bad happened!
+--                 }
+--                 SDL_free(dst);
+--             } else {
+--                 \/\/ Something bad happened!
+--             }
+--         }
+--
+--         SDL_CloseStorage(title);
+--     }
+--
+--     void ReadSave(void)
+--     {
+--         SDL_Storage *user = SDL_OpenUserStorage(\"libsdl\", \"Storage Example\", 0);
+--         if (user == NULL) {
+--             \/\/ Something bad happened!
+--         }
+--         while (!SDL_StorageReady(user)) {
+--             SDL_Delay(1);
+--         }
+--
+--         Uint64 saveLen = 0;
+--         if (SDL_GetStorageFileSize(user, \"save0.sav\", &saveLen) && saveLen > 0) {
+--             void* dst = SDL_malloc(saveLen);
+--             if (SDL_ReadStorageFile(user, \"save0.sav\", dst, saveLen)) {
+--                 \/\/ A bunch of stuff happens here
+--             } else {
+--                 \/\/ Something bad happened!
+--             }
+--             SDL_free(dst);
+--         } else {
+--             \/\/ Something bad happened!
+--         }
+--
+--         SDL_CloseStorage(user);
+--     }
+--
+--     void WriteSave(void)
+--     {
+--         SDL_Storage *user = SDL_OpenUserStorage(\"libsdl\", \"Storage Example\", 0);
+--         if (user == NULL) {
+--             \/\/ Something bad happened!
+--         }
+--         while (!SDL_StorageReady(user)) {
+--             SDL_Delay(1);
+--         }
+--
+--         extern void *saveData; \/\/ A bunch of stuff happened here...
+--         extern Uint64 saveLen;
+--         if (!SDL_WriteStorageFile(user, \"save0.sav\", saveData, saveLen)) {
+--             \/\/ Something bad happened!
+--         }
+--
+--         SDL_CloseStorage(user);
+--     }
+--     @
+--
+--     Note the improvements that 'SDL_Storage' makes:
+--
+--     1. __What to Access:__ This code explicitly reads from a title or user storage device based on the context of the function.
+--
+--     2. __How to Access:__ This code explicitly uses either a read or write function based on the context of the function.
+--
+--     3. __When to Access:__ This code explicitly opens the device when it needs to, and closes it when it is finished working with the filesystem.
+--
+--     The result is an application that is significantly more robust against the increasing demands of platforms and their filesystems!
+--
+--     A publicly available example of an 'SDL_Storage' backend is the [Steam Cloud](https://partner.steamgames.com/doc/features/cloud) backend - you can initialize Steamworks when starting the program, and then SDL will recognize that Steamworks is initialized and automatically use ISteamRemoteStorage when the application opens user storage. More importantly, when you /open/ storage it knows to begin a \"batch\" of filesystem operations, and when you /close/ storage it knows to end and flush the batch. This is used by Steam to support [Dynamic Cloud Sync](https://steamcommunity.com/groups/steamworks/announcements/detail/3142949576401813670); users can save data on one PC, put the device to sleep, and then continue playing on another PC (and vice versa) with the save data fully synchronized across all devices, allowing for a seamless experience without having to do full restarts of the program.
+--
+--     Notes on valid paths
+--
+--     All paths in the Storage API use Unix-style path separators (\'\/\'). Using a different path separator will not work, even if the underlying platform would otherwise accept it. This is to keep code using the Storage API portable between platforms and Storage implementations and simplify app code.
+--
+--     Paths with relative directories (\".\" and \"..\") are forbidden by the Storage API.
+--
+--     All valid UTF-8 strings (discounting the NULL terminator character and the \'\/\' path separator) are usable for filenames, however, an underlying Storage implementation may not support particularly strange sequences and refuse to create files with those names, etc. Function interface for 'SDL_Storage'.
+--
+--     Apps that want to supply a custom implementation of 'SDL_Storage' will fill in all the functions in this struct, and then pass it to SDL_OpenStorage to create a custom 'SDL_Storage' object.
+--
+--     It is not usually necessary to do this; SDL provides standard implementations for many things you might expect to do with an 'SDL_Storage'.
+--
+--     This structure should be initialized using SDL_INIT_INTERFACE()
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_INIT_INTERFACE
+module SDL3.Sys.Bindgen.Storage (
+  SDL3.Sys.Bindgen.Storage.SDL_StorageInterface (..),
+  SDL3.Sys.Bindgen.Storage.SDL_Storage,
+)
+where
+
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Filesystem qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @struct SDL_StorageInterface@, defined at @SDL3\/SDL_storage.h 274:16@
+data SDL_StorageInterface = SDL_StorageInterface
+  { version :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^ [C declaration]: @version@, defined at @SDL3\/SDL_storage.h 277:12@
+  , close :: BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool)
+  -- ^ [C declaration]: @close@, defined at @SDL3\/SDL_storage.h 280:20@
+  , ready :: BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool)
+  -- ^ [C declaration]: @ready@, defined at @SDL3\/SDL_storage.h 283:20@
+  , enumerate
+      :: BG.FunPtr
+           ( BG.Ptr BG.Void
+             -> PtrConst.PtrConst BG.CChar
+             -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+             -> BG.Ptr BG.Void
+             -> IO BG.CBool
+           )
+  -- ^ [C declaration]: @enumerate@, defined at @SDL3\/SDL_storage.h 286:20@
+  , info
+      :: BG.FunPtr
+           ( BG.Ptr BG.Void
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+             -> IO BG.CBool
+           )
+  -- ^ [C declaration]: @info@, defined at @SDL3\/SDL_storage.h 289:20@
+  , read_file
+      :: BG.FunPtr
+           ( BG.Ptr BG.Void
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.Ptr BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> IO BG.CBool
+           )
+  -- ^ [C declaration]: @read_file@, defined at @SDL3\/SDL_storage.h 292:20@
+  , write_file
+      :: BG.FunPtr
+           ( BG.Ptr BG.Void
+             -> PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> IO BG.CBool
+           )
+  -- ^ [C declaration]: @write_file@, defined at @SDL3\/SDL_storage.h 295:20@
+  , mkdir :: BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+  -- ^ [C declaration]: @mkdir@, defined at @SDL3\/SDL_storage.h 298:20@
+  , remove :: BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+  -- ^ [C declaration]: @remove@, defined at @SDL3\/SDL_storage.h 301:20@
+  , rename
+      :: BG.FunPtr
+           (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+  -- ^ [C declaration]: @rename@, defined at @SDL3\/SDL_storage.h 304:20@
+  , copy
+      :: BG.FunPtr
+           (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+  -- ^ [C declaration]: @copy@, defined at @SDL3\/SDL_storage.h 307:20@
+  , space_remaining :: BG.FunPtr (BG.Ptr BG.Void -> IO SDL3.Sys.Bindgen.Stdinc.Uint64)
+  -- ^ [C declaration]: @space_remaining@, defined at @SDL3\/SDL_storage.h 310:22@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_StorageInterface where
+  staticSizeOf = \_ -> (96 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_StorageInterface where
+  readRaw =
+    \ptr0 ->
+      pure SDL_StorageInterface
+        <*> HasCField.readRaw (BG.Proxy @"version") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"close") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"ready") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"enumerate") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"info") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"read_file") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"write_file") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"mkdir") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"remove") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"rename") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"copy") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"space_remaining") ptr0
+
+instance Marshal.WriteRaw SDL_StorageInterface where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_StorageInterface
+            version2
+            close3
+            ready4
+            enumerate5
+            info6
+            read_file7
+            write_file8
+            mkdir9
+            remove10
+            rename11
+            copy12
+            space_remaining13 ->
+              HasCField.writeRaw (BG.Proxy @"version") ptr0 version2
+                >> HasCField.writeRaw (BG.Proxy @"close") ptr0 close3
+                >> HasCField.writeRaw (BG.Proxy @"ready") ptr0 ready4
+                >> HasCField.writeRaw (BG.Proxy @"enumerate") ptr0 enumerate5
+                >> HasCField.writeRaw (BG.Proxy @"info") ptr0 info6
+                >> HasCField.writeRaw (BG.Proxy @"read_file") ptr0 read_file7
+                >> HasCField.writeRaw (BG.Proxy @"write_file") ptr0 write_file8
+                >> HasCField.writeRaw (BG.Proxy @"mkdir") ptr0 mkdir9
+                >> HasCField.writeRaw (BG.Proxy @"remove") ptr0 remove10
+                >> HasCField.writeRaw (BG.Proxy @"rename") ptr0 rename11
+                >> HasCField.writeRaw (BG.Proxy @"copy") ptr0 copy12
+                >> HasCField.writeRaw (BG.Proxy @"space_remaining") ptr0 space_remaining13
+
+deriving via Marshal.EquivStorable SDL_StorageInterface instance BG.Storable SDL_StorageInterface
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "version" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { version = y1
+            , close = BG.getField @"close" x0
+            , ready = BG.getField @"ready" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , info = BG.getField @"info" x0
+            , read_file = BG.getField @"read_file" x0
+            , write_file = BG.getField @"write_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , remove = BG.getField @"remove" x0
+            , rename = BG.getField @"rename" x0
+            , copy = BG.getField @"copy" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"version" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "version" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"version")
+
+instance HasCField.HasCField SDL_StorageInterface "version" where
+  type
+    CFieldType SDL_StorageInterface "version" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool))
+  => BG.CompatHasField.HasField "close" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { close = y1
+            , version = BG.getField @"version" x0
+            , ready = BG.getField @"ready" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , info = BG.getField @"info" x0
+            , read_file = BG.getField @"read_file" x0
+            , write_file = BG.getField @"write_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , remove = BG.getField @"remove" x0
+            , rename = BG.getField @"rename" x0
+            , copy = BG.getField @"copy" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"close" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool))
+  => BG.HasField "close" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"close")
+
+instance HasCField.HasCField SDL_StorageInterface "close" where
+  type
+    CFieldType SDL_StorageInterface "close" =
+      BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool))
+  => BG.CompatHasField.HasField "ready" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { ready = y1
+            , version = BG.getField @"version" x0
+            , close = BG.getField @"close" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , info = BG.getField @"info" x0
+            , read_file = BG.getField @"read_file" x0
+            , write_file = BG.getField @"write_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , remove = BG.getField @"remove" x0
+            , rename = BG.getField @"rename" x0
+            , copy = BG.getField @"copy" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"ready" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool))
+  => BG.HasField "ready" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"ready")
+
+instance HasCField.HasCField SDL_StorageInterface "ready" where
+  type
+    CFieldType SDL_StorageInterface "ready" =
+      BG.FunPtr (BG.Ptr BG.Void -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> PtrConst.PtrConst BG.CChar
+            -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+            -> BG.Ptr BG.Void
+            -> IO BG.CBool
+          )
+  )
+  => BG.CompatHasField.HasField "enumerate" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { enumerate = y1
+            , version = BG.getField @"version" x0
+            , close = BG.getField @"close" x0
+            , ready = BG.getField @"ready" x0
+            , info = BG.getField @"info" x0
+            , read_file = BG.getField @"read_file" x0
+            , write_file = BG.getField @"write_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , remove = BG.getField @"remove" x0
+            , rename = BG.getField @"rename" x0
+            , copy = BG.getField @"copy" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"enumerate" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> PtrConst.PtrConst BG.CChar
+            -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+            -> BG.Ptr BG.Void
+            -> IO BG.CBool
+          )
+  )
+  => BG.HasField "enumerate" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"enumerate")
+
+instance HasCField.HasCField SDL_StorageInterface "enumerate" where
+  type
+    CFieldType SDL_StorageInterface "enumerate" =
+      BG.FunPtr
+        ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.CChar
+          -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+          -> BG.Ptr BG.Void
+          -> IO BG.CBool
+        )
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> PtrConst.PtrConst BG.CChar
+            -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+            -> IO BG.CBool
+          )
+  )
+  => BG.CompatHasField.HasField "info" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { info = y1
+            , version = BG.getField @"version" x0
+            , close = BG.getField @"close" x0
+            , ready = BG.getField @"ready" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , read_file = BG.getField @"read_file" x0
+            , write_file = BG.getField @"write_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , remove = BG.getField @"remove" x0
+            , rename = BG.getField @"rename" x0
+            , copy = BG.getField @"copy" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"info" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> PtrConst.PtrConst BG.CChar
+            -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+            -> IO BG.CBool
+          )
+  )
+  => BG.HasField "info" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"info")
+
+instance HasCField.HasCField SDL_StorageInterface "info" where
+  type
+    CFieldType SDL_StorageInterface "info" =
+      BG.FunPtr
+        ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.CChar
+          -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+          -> IO BG.CBool
+        )
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> PtrConst.PtrConst BG.CChar
+            -> BG.Ptr BG.Void
+            -> SDL3.Sys.Bindgen.Stdinc.Uint64
+            -> IO BG.CBool
+          )
+  )
+  => BG.CompatHasField.HasField "read_file" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { read_file = y1
+            , version = BG.getField @"version" x0
+            , close = BG.getField @"close" x0
+            , ready = BG.getField @"ready" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , info = BG.getField @"info" x0
+            , write_file = BG.getField @"write_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , remove = BG.getField @"remove" x0
+            , rename = BG.getField @"rename" x0
+            , copy = BG.getField @"copy" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"read_file" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> PtrConst.PtrConst BG.CChar
+            -> BG.Ptr BG.Void
+            -> SDL3.Sys.Bindgen.Stdinc.Uint64
+            -> IO BG.CBool
+          )
+  )
+  => BG.HasField "read_file" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"read_file")
+
+instance HasCField.HasCField SDL_StorageInterface "read_file" where
+  type
+    CFieldType SDL_StorageInterface "read_file" =
+      BG.FunPtr
+        ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.CChar
+          -> BG.Ptr BG.Void
+          -> SDL3.Sys.Bindgen.Stdinc.Uint64
+          -> IO BG.CBool
+        )
+
+  offset# = \_ -> \_ -> 40
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> PtrConst.PtrConst BG.CChar
+            -> PtrConst.PtrConst BG.Void
+            -> SDL3.Sys.Bindgen.Stdinc.Uint64
+            -> IO BG.CBool
+          )
+  )
+  => BG.CompatHasField.HasField "write_file" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { write_file = y1
+            , version = BG.getField @"version" x0
+            , close = BG.getField @"close" x0
+            , ready = BG.getField @"ready" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , info = BG.getField @"info" x0
+            , read_file = BG.getField @"read_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , remove = BG.getField @"remove" x0
+            , rename = BG.getField @"rename" x0
+            , copy = BG.getField @"copy" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"write_file" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          ( BG.Ptr BG.Void
+            -> PtrConst.PtrConst BG.CChar
+            -> PtrConst.PtrConst BG.Void
+            -> SDL3.Sys.Bindgen.Stdinc.Uint64
+            -> IO BG.CBool
+          )
+  )
+  => BG.HasField "write_file" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"write_file")
+
+instance HasCField.HasCField SDL_StorageInterface "write_file" where
+  type
+    CFieldType SDL_StorageInterface "write_file" =
+      BG.FunPtr
+        ( BG.Ptr BG.Void
+          -> PtrConst.PtrConst BG.CChar
+          -> PtrConst.PtrConst BG.Void
+          -> SDL3.Sys.Bindgen.Stdinc.Uint64
+          -> IO BG.CBool
+        )
+
+  offset# = \_ -> \_ -> 48
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+  => BG.CompatHasField.HasField "mkdir" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { mkdir = y1
+            , version = BG.getField @"version" x0
+            , close = BG.getField @"close" x0
+            , ready = BG.getField @"ready" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , info = BG.getField @"info" x0
+            , read_file = BG.getField @"read_file" x0
+            , write_file = BG.getField @"write_file" x0
+            , remove = BG.getField @"remove" x0
+            , rename = BG.getField @"rename" x0
+            , copy = BG.getField @"copy" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"mkdir" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+  => BG.HasField "mkdir" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"mkdir")
+
+instance HasCField.HasCField SDL_StorageInterface "mkdir" where
+  type
+    CFieldType SDL_StorageInterface "mkdir" =
+      BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 56
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+  => BG.CompatHasField.HasField "remove" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { remove = y1
+            , version = BG.getField @"version" x0
+            , close = BG.getField @"close" x0
+            , ready = BG.getField @"ready" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , info = BG.getField @"info" x0
+            , read_file = BG.getField @"read_file" x0
+            , write_file = BG.getField @"write_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , rename = BG.getField @"rename" x0
+            , copy = BG.getField @"copy" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"remove" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+  => BG.HasField "remove" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"remove")
+
+instance HasCField.HasCField SDL_StorageInterface "remove" where
+  type
+    CFieldType SDL_StorageInterface "remove" =
+      BG.FunPtr (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 64
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+  )
+  => BG.CompatHasField.HasField "rename" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { rename = y1
+            , version = BG.getField @"version" x0
+            , close = BG.getField @"close" x0
+            , ready = BG.getField @"ready" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , info = BG.getField @"info" x0
+            , read_file = BG.getField @"read_file" x0
+            , write_file = BG.getField @"write_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , remove = BG.getField @"remove" x0
+            , copy = BG.getField @"copy" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"rename" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+  )
+  => BG.HasField "rename" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"rename")
+
+instance HasCField.HasCField SDL_StorageInterface "rename" where
+  type
+    CFieldType SDL_StorageInterface "rename" =
+      BG.FunPtr
+        (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 72
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+  )
+  => BG.CompatHasField.HasField "copy" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { copy = y1
+            , version = BG.getField @"version" x0
+            , close = BG.getField @"close" x0
+            , ready = BG.getField @"ready" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , info = BG.getField @"info" x0
+            , read_file = BG.getField @"read_file" x0
+            , write_file = BG.getField @"write_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , remove = BG.getField @"remove" x0
+            , rename = BG.getField @"rename" x0
+            , space_remaining = BG.getField @"space_remaining" x0
+            }
+      , BG.getField @"copy" x0
+      )
+
+instance
+  ( ty
+      ~ BG.FunPtr
+          (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+  )
+  => BG.HasField "copy" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"copy")
+
+instance HasCField.HasCField SDL_StorageInterface "copy" where
+  type
+    CFieldType SDL_StorageInterface "copy" =
+      BG.FunPtr
+        (BG.Ptr BG.Void -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+
+  offset# = \_ -> \_ -> 80
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO SDL3.Sys.Bindgen.Stdinc.Uint64))
+  => BG.CompatHasField.HasField "space_remaining" SDL_StorageInterface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_StorageInterface
+            { space_remaining = y1
+            , version = BG.getField @"version" x0
+            , close = BG.getField @"close" x0
+            , ready = BG.getField @"ready" x0
+            , enumerate = BG.getField @"enumerate" x0
+            , info = BG.getField @"info" x0
+            , read_file = BG.getField @"read_file" x0
+            , write_file = BG.getField @"write_file" x0
+            , mkdir = BG.getField @"mkdir" x0
+            , remove = BG.getField @"remove" x0
+            , rename = BG.getField @"rename" x0
+            , copy = BG.getField @"copy" x0
+            }
+      , BG.getField @"space_remaining" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr (BG.Ptr BG.Void -> IO SDL3.Sys.Bindgen.Stdinc.Uint64))
+  => BG.HasField "space_remaining" (BG.Ptr SDL_StorageInterface) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"space_remaining")
+
+instance HasCField.HasCField SDL_StorageInterface "space_remaining" where
+  type
+    CFieldType SDL_StorageInterface "space_remaining" =
+      BG.FunPtr (BG.Ptr BG.Void -> IO SDL3.Sys.Bindgen.Stdinc.Uint64)
+
+  offset# = \_ -> \_ -> 88
+
+-- | An abstract interface for filesystem access.
+--
+--     This is an opaque datatype. One can create this object using standard SDL functions like SDL_OpenTitleStorage or SDL_OpenUserStorage, etc, or create an object with a custom implementation using SDL_OpenStorage.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_Storage@, defined at @SDL3\/SDL_storage.h 332:16@
+data SDL_Storage
diff --git a/src/SDL3/Sys/Bindgen/Storage/FunPtr.hs b/src/SDL3/Sys/Bindgen/Storage/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Storage/FunPtr.hs
@@ -0,0 +1,880 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Storage.FunPtr (
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_OpenTitleStorage,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_OpenUserStorage,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_OpenFileStorage,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_OpenStorage,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_CloseStorage,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_StorageReady,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_GetStorageFileSize,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_ReadStorageFile,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_WriteStorageFile,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_CreateStorageDirectory,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_EnumerateStorageDirectory,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_RemoveStoragePath,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_RenameStoragePath,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_CopyStorageFile,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_GetStoragePathInfo,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_GetStorageSpaceRemaining,
+  SDL3.Sys.Bindgen.Storage.FunPtr.sDL_GlobStorageDirectory,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Filesystem qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Storage
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_storage.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenTitleStorage */"
+         , "__attribute__ ((const))"
+         , "SDL_Storage *(*hs_bindgen_41dc0d42da3c13fb (void)) ("
+         , "  char const *arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenTitleStorage;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenUserStorage */"
+         , "__attribute__ ((const))"
+         , "SDL_Storage *(*hs_bindgen_12c55994171bb882 (void)) ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_PropertiesID arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenUserStorage;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenFileStorage */"
+         , "__attribute__ ((const))"
+         , "SDL_Storage *(*hs_bindgen_fef879e18b533feb (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenFileStorage;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenStorage */"
+         , "__attribute__ ((const))"
+         , "SDL_Storage *(*hs_bindgen_21801b8b233def48 (void)) ("
+         , "  SDL_StorageInterface const *arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_OpenStorage;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_CloseStorage */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_df81ee6f0c32e051 (void)) ("
+         , "  SDL_Storage *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CloseStorage;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_StorageReady */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_026acf35472ecd32 (void)) ("
+         , "  SDL_Storage *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_StorageReady;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GetStorageFileSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_24ba0ea421ce2ba3 (void)) ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  Uint64 *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetStorageFileSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_ReadStorageFile */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1b79f3ffe3c4acb4 (void)) ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3,"
+         , "  Uint64 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadStorageFile;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_WriteStorageFile */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_cf1d254ac8e06322 (void)) ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  void const *arg3,"
+         , "  Uint64 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteStorageFile;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_CreateStorageDirectory */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1ccf47e38725aac9 (void)) ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateStorageDirectory;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_EnumerateStorageDirectory */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c662a58224242e1a (void)) ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_EnumerateDirectoryCallback arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_EnumerateStorageDirectory;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_RemoveStoragePath */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6e74dd5d268a0290 (void)) ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_RemoveStoragePath;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_RenameStoragePath */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d9c1fb4dbd31bb7f (void)) ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_RenameStoragePath;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_CopyStorageFile */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_af4030dd32ec02ae (void)) ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_CopyStorageFile;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GetStoragePathInfo */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_5eb9dbc0d85e32f2 (void)) ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_PathInfo *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetStoragePathInfo;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GetStorageSpaceRemaining */"
+         , "__attribute__ ((const))"
+         , "Uint64 (*hs_bindgen_848d4258c8d4d64e (void)) ("
+         , "  SDL_Storage *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetStorageSpaceRemaining;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GlobStorageDirectory */"
+         , "__attribute__ ((const))"
+         , "char **(*hs_bindgen_d50b8834aa3490cc (void)) ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  SDL_GlobFlags arg4,"
+         , "  signed int *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_GlobStorageDirectory;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenTitleStorage@
+foreign import ccall unsafe "hs_bindgen_41dc0d42da3c13fb"
+  hs_bindgen_41dc0d42da3c13fb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenTitleStorage@
+hs_bindgen_41dc0d42da3c13fb
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+             -> IO (BG.Ptr SDL_Storage)
+           )
+       )
+hs_bindgen_41dc0d42da3c13fb =
+  BG.fromFFIType hs_bindgen_41dc0d42da3c13fb_base
+
+{-# NOINLINE sDL_OpenTitleStorage #-}
+
+-- | Opens up a read-only container for the application\'s filesystem.
+--
+--     By default, SDL_OpenTitleStorage uses the generic storage implementation. When the path override is not provided, the generic implementation will use the output of SDL_GetBasePath as the base path.
+--
+--     [@override@]: a path to override the backend\'s default title root.
+--
+--     [@props@]: a property list that may contain backend-specific information.
+--
+--     [Returns]: a title storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_OpenUserStorage', 'sDL_ReadStorageFile'
+--
+--     [C declaration]: @SDL_OpenTitleStorage@, defined at @SDL3\/SDL_storage.h 353:43@
+sDL_OpenTitleStorage
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+         -> IO (BG.Ptr SDL_Storage)
+       )
+sDL_OpenTitleStorage =
+  BG.unsafePerformIO hs_bindgen_41dc0d42da3c13fb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenUserStorage@
+foreign import ccall unsafe "hs_bindgen_12c55994171bb882"
+  hs_bindgen_12c55994171bb882_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenUserStorage@
+hs_bindgen_12c55994171bb882
+  :: IO
+       ( BG.FunPtr
+           ( PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+             -> IO (BG.Ptr SDL_Storage)
+           )
+       )
+hs_bindgen_12c55994171bb882 =
+  BG.fromFFIType hs_bindgen_12c55994171bb882_base
+
+{-# NOINLINE sDL_OpenUserStorage #-}
+
+-- | Opens up a container for a user\'s unique read\/write filesystem.
+--
+--     While title storage can generally be kept open throughout runtime, user storage should only be opened when the client is ready to read\/write files. This allows the backend to properly batch file operations and flush them when the container has been closed; ensuring safe and optimal save I\/O.
+--
+--     [@org@]: the name of your organization.
+--
+--     [@app@]: the name of your application.
+--
+--     [@props@]: a property list that may contain backend-specific information.
+--
+--     [Returns]: a user storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_GetStorageSpaceRemaining', 'sDL_OpenTitleStorage', 'sDL_ReadStorageFile', 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_OpenUserStorage@, defined at @SDL3\/SDL_storage.h 379:43@
+sDL_OpenUserStorage
+  :: BG.FunPtr
+       ( PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+         -> IO (BG.Ptr SDL_Storage)
+       )
+sDL_OpenUserStorage =
+  BG.unsafePerformIO hs_bindgen_12c55994171bb882
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenFileStorage@
+foreign import ccall unsafe "hs_bindgen_fef879e18b533feb"
+  hs_bindgen_fef879e18b533feb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenFileStorage@
+hs_bindgen_fef879e18b533feb
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Storage)))
+hs_bindgen_fef879e18b533feb =
+  BG.fromFFIType hs_bindgen_fef879e18b533feb_base
+
+{-# NOINLINE sDL_OpenFileStorage #-}
+
+-- | Opens up a container for local filesystem storage.
+--
+--     This is provided for development and tools. Portable applications should use @SDL_OpenTitleStorage()@ for access to game data and @SDL_OpenUserStorage()@ for access to user data.
+--
+--     [@path@]: the base path prepended to all storage paths, or NULL for no base path.
+--
+--     [Returns]: a filesystem storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_GetStorageSpaceRemaining', 'sDL_OpenTitleStorage', 'sDL_OpenUserStorage', 'sDL_ReadStorageFile', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_OpenFileStorage@, defined at @SDL3\/SDL_storage.h 403:43@
+sDL_OpenFileStorage :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Storage))
+sDL_OpenFileStorage =
+  BG.unsafePerformIO hs_bindgen_fef879e18b533feb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenStorage@
+foreign import ccall unsafe "hs_bindgen_21801b8b233def48"
+  hs_bindgen_21801b8b233def48_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_OpenStorage@
+hs_bindgen_21801b8b233def48
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL_StorageInterface -> BG.Ptr BG.Void -> IO (BG.Ptr SDL_Storage)))
+hs_bindgen_21801b8b233def48 =
+  BG.fromFFIType hs_bindgen_21801b8b233def48_base
+
+{-# NOINLINE sDL_OpenStorage #-}
+
+-- | Opens up a container using a client-provided storage interface.
+--
+--     Applications do not need to use this function unless they are providing their own 'SDL_Storage' implementation. If you just need an 'SDL_Storage', you should use the built-in implementations in SDL, like @SDL_OpenTitleStorage()@ or @SDL_OpenUserStorage()@.
+--
+--     This function makes a copy of @iface@ and the caller does not need to keep it around after this call.
+--
+--     [@iface@]: the interface that implements this storage, initialized using SDL_INIT_INTERFACE().
+--
+--     [@userdata@]: the pointer that will be passed to the interface functions.
+--
+--     [Returns]: a storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_GetStorageSpaceRemaining', SDL_INIT_INTERFACE, 'sDL_ReadStorageFile', 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_OpenStorage@, defined at @SDL3\/SDL_storage.h 432:43@
+sDL_OpenStorage
+  :: BG.FunPtr (PtrConst.PtrConst SDL_StorageInterface -> BG.Ptr BG.Void -> IO (BG.Ptr SDL_Storage))
+sDL_OpenStorage =
+  BG.unsafePerformIO hs_bindgen_21801b8b233def48
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_CloseStorage@
+foreign import ccall unsafe "hs_bindgen_df81ee6f0c32e051"
+  hs_bindgen_df81ee6f0c32e051_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_CloseStorage@
+hs_bindgen_df81ee6f0c32e051 :: IO (BG.FunPtr (BG.Ptr SDL_Storage -> IO BG.CBool))
+hs_bindgen_df81ee6f0c32e051 =
+  BG.fromFFIType hs_bindgen_df81ee6f0c32e051_base
+
+{-# NOINLINE sDL_CloseStorage #-}
+
+-- | Closes and frees a storage container.
+--
+--     [@storage@]: a storage container to close.
+--
+--     [Returns]: true if the container was freed with no errors, false otherwise; call SDL_GetError() for more information. Even if the function returns an error, the container data will be freed; the error is only for informational purposes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenFileStorage', 'sDL_OpenStorage', 'sDL_OpenTitleStorage', 'sDL_OpenUserStorage'
+--
+--     [C declaration]: @SDL_CloseStorage@, defined at @SDL3\/SDL_storage.h 450:34@
+sDL_CloseStorage :: BG.FunPtr (BG.Ptr SDL_Storage -> IO BG.CBool)
+sDL_CloseStorage =
+  BG.unsafePerformIO hs_bindgen_df81ee6f0c32e051
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_StorageReady@
+foreign import ccall unsafe "hs_bindgen_026acf35472ecd32"
+  hs_bindgen_026acf35472ecd32_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_StorageReady@
+hs_bindgen_026acf35472ecd32 :: IO (BG.FunPtr (BG.Ptr SDL_Storage -> IO BG.CBool))
+hs_bindgen_026acf35472ecd32 =
+  BG.fromFFIType hs_bindgen_026acf35472ecd32_base
+
+{-# NOINLINE sDL_StorageReady #-}
+
+-- | Checks if the storage container is ready to use.
+--
+--     This function should be called in regular intervals until it returns true - however, it is not recommended to spinwait on this call, as the backend may depend on a synchronous message loop. You might instead poll this in your game\'s main loop while processing events and drawing a loading screen.
+--
+--     [@storage@]: a storage container to query.
+--
+--     [Returns]: true if the container is ready, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_StorageReady@, defined at @SDL3\/SDL_storage.h 465:34@
+sDL_StorageReady :: BG.FunPtr (BG.Ptr SDL_Storage -> IO BG.CBool)
+sDL_StorageReady =
+  BG.unsafePerformIO hs_bindgen_026acf35472ecd32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GetStorageFileSize@
+foreign import ccall unsafe "hs_bindgen_24ba0ea421ce2ba3"
+  hs_bindgen_24ba0ea421ce2ba3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GetStorageFileSize@
+hs_bindgen_24ba0ea421ce2ba3
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Storage
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_24ba0ea421ce2ba3 =
+  BG.fromFFIType hs_bindgen_24ba0ea421ce2ba3_base
+
+{-# NOINLINE sDL_GetStorageFileSize #-}
+
+-- | Query the size of a file within a storage container.
+--
+--     [@storage@]: a storage container to query.
+--
+--     [@path@]: the relative path of the file to query.
+--
+--     [@length@]: a pointer to be filled with the file\'s length.
+--
+--     [Returns]: true if the file could be queried or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ReadStorageFile', 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_GetStorageFileSize@, defined at @SDL3\/SDL_storage.h 481:34@
+sDL_GetStorageFileSize
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Storage
+         -> PtrConst.PtrConst BG.CChar
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+         -> IO BG.CBool
+       )
+sDL_GetStorageFileSize =
+  BG.unsafePerformIO hs_bindgen_24ba0ea421ce2ba3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_ReadStorageFile@
+foreign import ccall unsafe "hs_bindgen_1b79f3ffe3c4acb4"
+  hs_bindgen_1b79f3ffe3c4acb4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_ReadStorageFile@
+hs_bindgen_1b79f3ffe3c4acb4
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Storage
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.Ptr BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_1b79f3ffe3c4acb4 =
+  BG.fromFFIType hs_bindgen_1b79f3ffe3c4acb4_base
+
+{-# NOINLINE sDL_ReadStorageFile #-}
+
+-- | Synchronously read a file from a storage container into a client-provided buffer.
+--
+--     The value of @length@ must match the length of the file exactly; call @SDL_GetStorageFileSize()@ to get this value. This behavior may be relaxed in a future release.
+--
+--     [@storage@]: a storage container to read from.
+--
+--     [@path@]: the relative path of the file to read.
+--
+--     [@destination@]: a client-provided buffer to read the file into.
+--
+--     [@length@]: the length of the destination buffer.
+--
+--     [Returns]: true if the file was read or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetStorageFileSize', 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_ReadStorageFile@, defined at @SDL3\/SDL_storage.h 504:34@
+sDL_ReadStorageFile
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Storage
+         -> PtrConst.PtrConst BG.CChar
+         -> BG.Ptr BG.Void
+         -> SDL3.Sys.Bindgen.Stdinc.Uint64
+         -> IO BG.CBool
+       )
+sDL_ReadStorageFile =
+  BG.unsafePerformIO hs_bindgen_1b79f3ffe3c4acb4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_WriteStorageFile@
+foreign import ccall unsafe "hs_bindgen_cf1d254ac8e06322"
+  hs_bindgen_cf1d254ac8e06322_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_WriteStorageFile@
+hs_bindgen_cf1d254ac8e06322
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Storage
+             -> PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.Uint64
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_cf1d254ac8e06322 =
+  BG.fromFFIType hs_bindgen_cf1d254ac8e06322_base
+
+{-# NOINLINE sDL_WriteStorageFile #-}
+
+-- | Synchronously write a file from client memory into a storage container.
+--
+--     [@storage@]: a storage container to write to.
+--
+--     [@path@]: the relative path of the file to write.
+--
+--     [@source@]: a client-provided buffer to write from.
+--
+--     [@length@]: the length of the source buffer.
+--
+--     [Returns]: true if the file was written or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetStorageSpaceRemaining', 'sDL_ReadStorageFile', 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_WriteStorageFile@, defined at @SDL3\/SDL_storage.h 522:34@
+sDL_WriteStorageFile
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Storage
+         -> PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.Void
+         -> SDL3.Sys.Bindgen.Stdinc.Uint64
+         -> IO BG.CBool
+       )
+sDL_WriteStorageFile =
+  BG.unsafePerformIO hs_bindgen_cf1d254ac8e06322
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_CreateStorageDirectory@
+foreign import ccall unsafe "hs_bindgen_1ccf47e38725aac9"
+  hs_bindgen_1ccf47e38725aac9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_CreateStorageDirectory@
+hs_bindgen_1ccf47e38725aac9
+  :: IO (BG.FunPtr (BG.Ptr SDL_Storage -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_1ccf47e38725aac9 =
+  BG.fromFFIType hs_bindgen_1ccf47e38725aac9_base
+
+{-# NOINLINE sDL_CreateStorageDirectory #-}
+
+-- | Create a directory in a writable storage container.
+--
+--     [@storage@]: a storage container.
+--
+--     [@path@]: the path of the directory to create.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_CreateStorageDirectory@, defined at @SDL3\/SDL_storage.h 536:34@
+sDL_CreateStorageDirectory
+  :: BG.FunPtr (BG.Ptr SDL_Storage -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_CreateStorageDirectory =
+  BG.unsafePerformIO hs_bindgen_1ccf47e38725aac9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_EnumerateStorageDirectory@
+foreign import ccall unsafe "hs_bindgen_c662a58224242e1a"
+  hs_bindgen_c662a58224242e1a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_EnumerateStorageDirectory@
+hs_bindgen_c662a58224242e1a
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Storage
+             -> PtrConst.PtrConst BG.CChar
+             -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+             -> BG.Ptr BG.Void
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_c662a58224242e1a =
+  BG.fromFFIType hs_bindgen_c662a58224242e1a_base
+
+{-# NOINLINE sDL_EnumerateStorageDirectory #-}
+
+-- | Enumerate a directory in a storage container through a callback function.
+--
+--     This function provides every directory entry through an app-provided callback, called once for each directory entry, until all results have been provided or the callback returns either SDL_ENUM_SUCCESS or SDL_ENUM_FAILURE.
+--
+--     This will return false if there was a system problem in general, or if a callback returns SDL_ENUM_FAILURE. A successful return means a callback returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries were enumerated.
+--
+--     If @path@ is NULL, this is treated as a request to enumerate the root of the storage container\'s tree. An empty string also works for this.
+--
+--     [@storage@]: a storage container.
+--
+--     [@path@]: the path of the directory to enumerate, or NULL for the root.
+--
+--     [@callback@]: a function that is called for each entry in the directory.
+--
+--     [@userdata@]: a pointer that is passed to @callback@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_EnumerateStorageDirectory@, defined at @SDL3\/SDL_storage.h 565:34@
+sDL_EnumerateStorageDirectory
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Storage
+         -> PtrConst.PtrConst BG.CChar
+         -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+         -> BG.Ptr BG.Void
+         -> IO BG.CBool
+       )
+sDL_EnumerateStorageDirectory =
+  BG.unsafePerformIO hs_bindgen_c662a58224242e1a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_RemoveStoragePath@
+foreign import ccall unsafe "hs_bindgen_6e74dd5d268a0290"
+  hs_bindgen_6e74dd5d268a0290_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_RemoveStoragePath@
+hs_bindgen_6e74dd5d268a0290
+  :: IO (BG.FunPtr (BG.Ptr SDL_Storage -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_6e74dd5d268a0290 =
+  BG.fromFFIType hs_bindgen_6e74dd5d268a0290_base
+
+{-# NOINLINE sDL_RemoveStoragePath #-}
+
+-- | Remove a file or an empty directory in a writable storage container.
+--
+--     [@storage@]: a storage container.
+--
+--     [@path@]: the path of the directory to enumerate.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_RemoveStoragePath@, defined at @SDL3\/SDL_storage.h 579:34@
+sDL_RemoveStoragePath :: BG.FunPtr (BG.Ptr SDL_Storage -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_RemoveStoragePath =
+  BG.unsafePerformIO hs_bindgen_6e74dd5d268a0290
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_RenameStoragePath@
+foreign import ccall unsafe "hs_bindgen_d9c1fb4dbd31bb7f"
+  hs_bindgen_d9c1fb4dbd31bb7f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_RenameStoragePath@
+hs_bindgen_d9c1fb4dbd31bb7f
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Storage -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+       )
+hs_bindgen_d9c1fb4dbd31bb7f =
+  BG.fromFFIType hs_bindgen_d9c1fb4dbd31bb7f_base
+
+{-# NOINLINE sDL_RenameStoragePath #-}
+
+-- | Rename a file or directory in a writable storage container.
+--
+--     [@storage@]: a storage container.
+--
+--     [@oldpath@]: the old path.
+--
+--     [@newpath@]: the new path.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_RenameStoragePath@, defined at @SDL3\/SDL_storage.h 594:34@
+sDL_RenameStoragePath
+  :: BG.FunPtr
+       (BG.Ptr SDL_Storage -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_RenameStoragePath =
+  BG.unsafePerformIO hs_bindgen_d9c1fb4dbd31bb7f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_CopyStorageFile@
+foreign import ccall unsafe "hs_bindgen_af4030dd32ec02ae"
+  hs_bindgen_af4030dd32ec02ae_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_CopyStorageFile@
+hs_bindgen_af4030dd32ec02ae
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Storage -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+       )
+hs_bindgen_af4030dd32ec02ae =
+  BG.fromFFIType hs_bindgen_af4030dd32ec02ae_base
+
+{-# NOINLINE sDL_CopyStorageFile #-}
+
+-- | Copy a file in a writable storage container.
+--
+--     [@storage@]: a storage container.
+--
+--     [@oldpath@]: the old path.
+--
+--     [@newpath@]: the new path.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_CopyStorageFile@, defined at @SDL3\/SDL_storage.h 609:34@
+sDL_CopyStorageFile
+  :: BG.FunPtr
+       (BG.Ptr SDL_Storage -> PtrConst.PtrConst BG.CChar -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_CopyStorageFile =
+  BG.unsafePerformIO hs_bindgen_af4030dd32ec02ae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GetStoragePathInfo@
+foreign import ccall unsafe "hs_bindgen_5eb9dbc0d85e32f2"
+  hs_bindgen_5eb9dbc0d85e32f2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GetStoragePathInfo@
+hs_bindgen_5eb9dbc0d85e32f2
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Storage
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_5eb9dbc0d85e32f2 =
+  BG.fromFFIType hs_bindgen_5eb9dbc0d85e32f2_base
+
+{-# NOINLINE sDL_GetStoragePathInfo #-}
+
+-- | Get information about a filesystem path in a storage container.
+--
+--     [@storage@]: a storage container.
+--
+--     [@path@]: the path to query.
+--
+--     [@info@]: a pointer filled in with information about the path, or NULL to check for the existence of a file.
+--
+--     [Returns]: true on success or false if the file doesn\'t exist, or another failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_GetStoragePathInfo@, defined at @SDL3\/SDL_storage.h 625:34@
+sDL_GetStoragePathInfo
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Storage
+         -> PtrConst.PtrConst BG.CChar
+         -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+         -> IO BG.CBool
+       )
+sDL_GetStoragePathInfo =
+  BG.unsafePerformIO hs_bindgen_5eb9dbc0d85e32f2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GetStorageSpaceRemaining@
+foreign import ccall unsafe "hs_bindgen_848d4258c8d4d64e"
+  hs_bindgen_848d4258c8d4d64e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GetStorageSpaceRemaining@
+hs_bindgen_848d4258c8d4d64e
+  :: IO (BG.FunPtr (BG.Ptr SDL_Storage -> IO SDL3.Sys.Bindgen.Stdinc.Uint64))
+hs_bindgen_848d4258c8d4d64e =
+  BG.fromFFIType hs_bindgen_848d4258c8d4d64e_base
+
+{-# NOINLINE sDL_GetStorageSpaceRemaining #-}
+
+-- | Queries the remaining space in a storage container.
+--
+--     [@storage@]: a storage container to query.
+--
+--     [Returns]: the amount of remaining space, in bytes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_GetStorageSpaceRemaining@, defined at @SDL3\/SDL_storage.h 638:36@
+sDL_GetStorageSpaceRemaining :: BG.FunPtr (BG.Ptr SDL_Storage -> IO SDL3.Sys.Bindgen.Stdinc.Uint64)
+sDL_GetStorageSpaceRemaining =
+  BG.unsafePerformIO hs_bindgen_848d4258c8d4d64e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GlobStorageDirectory@
+foreign import ccall unsafe "hs_bindgen_d50b8834aa3490cc"
+  hs_bindgen_d50b8834aa3490cc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_get_SDL_GlobStorageDirectory@
+hs_bindgen_d50b8834aa3490cc
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Storage
+             -> PtrConst.PtrConst BG.CChar
+             -> PtrConst.PtrConst BG.CChar
+             -> SDL3.Sys.Bindgen.Filesystem.SDL_GlobFlags
+             -> BG.Ptr BG.CInt
+             -> IO (BG.Ptr (BG.Ptr BG.CChar))
+           )
+       )
+hs_bindgen_d50b8834aa3490cc =
+  BG.fromFFIType hs_bindgen_d50b8834aa3490cc_base
+
+{-# NOINLINE sDL_GlobStorageDirectory #-}
+
+-- | Enumerate a directory tree, filtered by pattern, and return a list.
+--
+--     Files are filtered out if they don\'t match the string in @pattern@, which may contain wildcard characters @*@ (match everything) and @?@ (match one character). If pattern is NULL, no filtering is done and all results are returned. Subdirectories are permitted, and are specified with a path separator of \'\/\'. Wildcard characters @*@ and @?@ never match a path separator.
+--
+--     @flags@ may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching case-insensitive.
+--
+--     The returned array is always NULL-terminated, for your iterating convenience, but if @count@ is non-NULL, on return it will contain the number of items in the array, not counting the NULL terminator.
+--
+--     If @path@ is NULL, this is treated as a request to enumerate the root of the storage container\'s tree. An empty string also works for this.
+--
+--     [@storage@]: a storage container.
+--
+--     [@path@]: the path of the directory to enumerate, or NULL for the root.
+--
+--     [@pattern@]: the pattern that files in the directory must match. Can be NULL.
+--
+--     [@flags@]: @SDL_GLOB_*@ bitflags that affect this search.
+--
+--     [@count@]: on return, will be set to the number of items in the returned array. Can be NULL.
+--
+--     [Returns]: an array of strings on success or NULL on failure; call SDL_GetError() for more information. The caller should pass the returned pointer to SDL_free when done with it. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, assuming the @storage@ object is thread-safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GlobStorageDirectory@, defined at @SDL3\/SDL_storage.h 678:37@
+sDL_GlobStorageDirectory
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Storage
+         -> PtrConst.PtrConst BG.CChar
+         -> PtrConst.PtrConst BG.CChar
+         -> SDL3.Sys.Bindgen.Filesystem.SDL_GlobFlags
+         -> BG.Ptr BG.CInt
+         -> IO (BG.Ptr (BG.Ptr BG.CChar))
+       )
+sDL_GlobStorageDirectory =
+  BG.unsafePerformIO hs_bindgen_d50b8834aa3490cc
diff --git a/src/SDL3/Sys/Bindgen/Storage/Safe.hs b/src/SDL3/Sys/Bindgen/Storage/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Storage/Safe.hs
@@ -0,0 +1,870 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Storage.Safe (
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_OpenTitleStorage,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_OpenUserStorage,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_OpenFileStorage,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_OpenStorage,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_CloseStorage,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_StorageReady,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_GetStorageFileSize,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_ReadStorageFile,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_WriteStorageFile,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_CreateStorageDirectory,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_EnumerateStorageDirectory,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_RemoveStoragePath,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_RenameStoragePath,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_CopyStorageFile,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_GetStoragePathInfo,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_GetStorageSpaceRemaining,
+  SDL3.Sys.Bindgen.Storage.Safe.sDL_GlobStorageDirectory,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Filesystem qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Storage
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_storage.h>"
+         , "SDL_Storage *hs_bindgen_a269c174e4d6d7b9 ("
+         , "  char const *arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenTitleStorage)(arg1, arg2);"
+         , "}"
+         , "SDL_Storage *hs_bindgen_c1288c49648e9aaa ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_PropertiesID arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenUserStorage)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_Storage *hs_bindgen_4a5bc70f5a32561a ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenFileStorage)(arg1);"
+         , "}"
+         , "SDL_Storage *hs_bindgen_f9cc35fa817572b3 ("
+         , "  SDL_StorageInterface const *arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenStorage)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_00aa433d2a04f831 ("
+         , "  SDL_Storage *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CloseStorage)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_edb4ca27af77b411 ("
+         , "  SDL_Storage *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_StorageReady)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_4cb320b95514046a ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  Uint64 *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetStorageFileSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_86cd3832a2a2afa1 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3,"
+         , "  Uint64 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadStorageFile)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_c2571a46edb50775 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  void const *arg3,"
+         , "  Uint64 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteStorageFile)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_d5b607d7f6956e66 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateStorageDirectory)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c3c153b007f4b8d7 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_EnumerateDirectoryCallback arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_EnumerateStorageDirectory)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_d92d44c2f8e020ee ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RemoveStoragePath)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_66aee97b54c3dcb2 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenameStoragePath)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_d6c508aee11578ae ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CopyStorageFile)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_cbcca6168ed4f658 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_PathInfo *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetStoragePathInfo)(arg1, arg2, arg3);"
+         , "}"
+         , "Uint64 hs_bindgen_33e3e12dc496414b ("
+         , "  SDL_Storage *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetStorageSpaceRemaining)(arg1);"
+         , "}"
+         , "char **hs_bindgen_7ef73cac376ed868 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  SDL_GlobFlags arg4,"
+         , "  signed int *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GlobStorageDirectory)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_OpenTitleStorage@
+foreign import ccall safe "hs_bindgen_a269c174e4d6d7b9"
+  hs_bindgen_a269c174e4d6d7b9_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_OpenTitleStorage@
+hs_bindgen_a269c174e4d6d7b9
+  :: PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Storage)
+hs_bindgen_a269c174e4d6d7b9 =
+  BG.fromFFIType hs_bindgen_a269c174e4d6d7b9_base
+
+-- | Opens up a read-only container for the application\'s filesystem.
+--
+--     By default, SDL_OpenTitleStorage uses the generic storage implementation. When the path override is not provided, the generic implementation will use the output of SDL_GetBasePath as the base path.
+--
+--     [Returns]: a title storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_OpenUserStorage', 'sDL_ReadStorageFile'
+--
+--     [C declaration]: @SDL_OpenTitleStorage@, defined at @SDL3\/SDL_storage.h 353:43@
+sDL_OpenTitleStorage
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@override@]: a path to override the backend\'s default title root.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: a property list that may contain backend-specific information.
+  -> IO (BG.Ptr SDL_Storage)
+sDL_OpenTitleStorage = hs_bindgen_a269c174e4d6d7b9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_OpenUserStorage@
+foreign import ccall safe "hs_bindgen_c1288c49648e9aaa"
+  hs_bindgen_c1288c49648e9aaa_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_OpenUserStorage@
+hs_bindgen_c1288c49648e9aaa
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Storage)
+hs_bindgen_c1288c49648e9aaa =
+  BG.fromFFIType hs_bindgen_c1288c49648e9aaa_base
+
+-- | Opens up a container for a user\'s unique read\/write filesystem.
+--
+--     While title storage can generally be kept open throughout runtime, user storage should only be opened when the client is ready to read\/write files. This allows the backend to properly batch file operations and flush them when the container has been closed; ensuring safe and optimal save I\/O.
+--
+--     [Returns]: a user storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_GetStorageSpaceRemaining', 'sDL_OpenTitleStorage', 'sDL_ReadStorageFile', 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_OpenUserStorage@, defined at @SDL3\/SDL_storage.h 379:43@
+sDL_OpenUserStorage
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@org@]: the name of your organization.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@app@]: the name of your application.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: a property list that may contain backend-specific information.
+  -> IO (BG.Ptr SDL_Storage)
+sDL_OpenUserStorage = hs_bindgen_c1288c49648e9aaa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_OpenFileStorage@
+foreign import ccall safe "hs_bindgen_4a5bc70f5a32561a"
+  hs_bindgen_4a5bc70f5a32561a_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_OpenFileStorage@
+hs_bindgen_4a5bc70f5a32561a
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Storage)
+hs_bindgen_4a5bc70f5a32561a =
+  BG.fromFFIType hs_bindgen_4a5bc70f5a32561a_base
+
+-- | Opens up a container for local filesystem storage.
+--
+--     This is provided for development and tools. Portable applications should use @SDL_OpenTitleStorage()@ for access to game data and @SDL_OpenUserStorage()@ for access to user data.
+--
+--     [Returns]: a filesystem storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_GetStorageSpaceRemaining', 'sDL_OpenTitleStorage', 'sDL_OpenUserStorage', 'sDL_ReadStorageFile', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_OpenFileStorage@, defined at @SDL3\/SDL_storage.h 403:43@
+sDL_OpenFileStorage
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the base path prepended to all storage paths, or NULL for no base path.
+  -> IO (BG.Ptr SDL_Storage)
+sDL_OpenFileStorage = hs_bindgen_4a5bc70f5a32561a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_OpenStorage@
+foreign import ccall safe "hs_bindgen_f9cc35fa817572b3"
+  hs_bindgen_f9cc35fa817572b3_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_OpenStorage@
+hs_bindgen_f9cc35fa817572b3
+  :: PtrConst.PtrConst SDL_StorageInterface
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr SDL_Storage)
+hs_bindgen_f9cc35fa817572b3 =
+  BG.fromFFIType hs_bindgen_f9cc35fa817572b3_base
+
+-- | Opens up a container using a client-provided storage interface.
+--
+--     Applications do not need to use this function unless they are providing their own 'SDL_Storage' implementation. If you just need an 'SDL_Storage', you should use the built-in implementations in SDL, like @SDL_OpenTitleStorage()@ or @SDL_OpenUserStorage()@.
+--
+--     This function makes a copy of @iface@ and the caller does not need to keep it around after this call.
+--
+--     [Returns]: a storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_GetStorageSpaceRemaining', SDL_INIT_INTERFACE, 'sDL_ReadStorageFile', 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_OpenStorage@, defined at @SDL3\/SDL_storage.h 432:43@
+sDL_OpenStorage
+  :: PtrConst.PtrConst SDL_StorageInterface
+  -- ^
+  --
+  --           [@iface@]: the interface that implements this storage, initialized using SDL_INIT_INTERFACE().
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer that will be passed to the interface functions.
+  -> IO (BG.Ptr SDL_Storage)
+sDL_OpenStorage = hs_bindgen_f9cc35fa817572b3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_CloseStorage@
+foreign import ccall safe "hs_bindgen_00aa433d2a04f831"
+  hs_bindgen_00aa433d2a04f831_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_CloseStorage@
+hs_bindgen_00aa433d2a04f831
+  :: BG.Ptr SDL_Storage
+  -> IO BG.CBool
+hs_bindgen_00aa433d2a04f831 =
+  BG.fromFFIType hs_bindgen_00aa433d2a04f831_base
+
+-- | Closes and frees a storage container.
+--
+--     [Returns]: true if the container was freed with no errors, false otherwise; call SDL_GetError() for more information. Even if the function returns an error, the container data will be freed; the error is only for informational purposes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenFileStorage', 'sDL_OpenStorage', 'sDL_OpenTitleStorage', 'sDL_OpenUserStorage'
+--
+--     [C declaration]: @SDL_CloseStorage@, defined at @SDL3\/SDL_storage.h 450:34@
+sDL_CloseStorage
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to close.
+  -> IO BG.CBool
+sDL_CloseStorage = hs_bindgen_00aa433d2a04f831
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_StorageReady@
+foreign import ccall safe "hs_bindgen_edb4ca27af77b411"
+  hs_bindgen_edb4ca27af77b411_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_StorageReady@
+hs_bindgen_edb4ca27af77b411
+  :: BG.Ptr SDL_Storage
+  -> IO BG.CBool
+hs_bindgen_edb4ca27af77b411 =
+  BG.fromFFIType hs_bindgen_edb4ca27af77b411_base
+
+-- | Checks if the storage container is ready to use.
+--
+--     This function should be called in regular intervals until it returns true - however, it is not recommended to spinwait on this call, as the backend may depend on a synchronous message loop. You might instead poll this in your game\'s main loop while processing events and drawing a loading screen.
+--
+--     [Returns]: true if the container is ready, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_StorageReady@, defined at @SDL3\/SDL_storage.h 465:34@
+sDL_StorageReady
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> IO BG.CBool
+sDL_StorageReady = hs_bindgen_edb4ca27af77b411
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_GetStorageFileSize@
+foreign import ccall safe "hs_bindgen_4cb320b95514046a"
+  hs_bindgen_4cb320b95514046a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_GetStorageFileSize@
+hs_bindgen_4cb320b95514046a
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_4cb320b95514046a =
+  BG.fromFFIType hs_bindgen_4cb320b95514046a_base
+
+-- | Query the size of a file within a storage container.
+--
+--     [Returns]: true if the file could be queried or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ReadStorageFile', 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_GetStorageFileSize@, defined at @SDL3\/SDL_storage.h 481:34@
+sDL_GetStorageFileSize
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@length@]: a pointer to be filled with the file\'s length.
+  -> IO BG.CBool
+sDL_GetStorageFileSize = hs_bindgen_4cb320b95514046a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_ReadStorageFile@
+foreign import ccall safe "hs_bindgen_86cd3832a2a2afa1"
+  hs_bindgen_86cd3832a2a2afa1_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_ReadStorageFile@
+hs_bindgen_86cd3832a2a2afa1
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_86cd3832a2a2afa1 =
+  BG.fromFFIType hs_bindgen_86cd3832a2a2afa1_base
+
+-- | Synchronously read a file from a storage container into a client-provided buffer.
+--
+--     The value of @length@ must match the length of the file exactly; call @SDL_GetStorageFileSize()@ to get this value. This behavior may be relaxed in a future release.
+--
+--     [Returns]: true if the file was read or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetStorageFileSize', 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_ReadStorageFile@, defined at @SDL3\/SDL_storage.h 504:34@
+sDL_ReadStorageFile
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to read from.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to read.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@destination@]: a client-provided buffer to read the file into.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@length@]: the length of the destination buffer.
+  -> IO BG.CBool
+sDL_ReadStorageFile = hs_bindgen_86cd3832a2a2afa1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_WriteStorageFile@
+foreign import ccall safe "hs_bindgen_c2571a46edb50775"
+  hs_bindgen_c2571a46edb50775_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_WriteStorageFile@
+hs_bindgen_c2571a46edb50775
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_c2571a46edb50775 =
+  BG.fromFFIType hs_bindgen_c2571a46edb50775_base
+
+-- | Synchronously write a file from client memory into a storage container.
+--
+--     [Returns]: true if the file was written or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetStorageSpaceRemaining', 'sDL_ReadStorageFile', 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_WriteStorageFile@, defined at @SDL3\/SDL_storage.h 522:34@
+sDL_WriteStorageFile
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to write to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to write.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@source@]: a client-provided buffer to write from.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@length@]: the length of the source buffer.
+  -> IO BG.CBool
+sDL_WriteStorageFile = hs_bindgen_c2571a46edb50775
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_CreateStorageDirectory@
+foreign import ccall safe "hs_bindgen_d5b607d7f6956e66"
+  hs_bindgen_d5b607d7f6956e66_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_CreateStorageDirectory@
+hs_bindgen_d5b607d7f6956e66
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_d5b607d7f6956e66 =
+  BG.fromFFIType hs_bindgen_d5b607d7f6956e66_base
+
+-- | Create a directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_CreateStorageDirectory@, defined at @SDL3\/SDL_storage.h 536:34@
+sDL_CreateStorageDirectory
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to create.
+  -> IO BG.CBool
+sDL_CreateStorageDirectory =
+  hs_bindgen_d5b607d7f6956e66
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_EnumerateStorageDirectory@
+foreign import ccall safe "hs_bindgen_c3c153b007f4b8d7"
+  hs_bindgen_c3c153b007f4b8d7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_EnumerateStorageDirectory@
+hs_bindgen_c3c153b007f4b8d7
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_c3c153b007f4b8d7 =
+  BG.fromFFIType hs_bindgen_c3c153b007f4b8d7_base
+
+-- | Enumerate a directory in a storage container through a callback function.
+--
+--     This function provides every directory entry through an app-provided callback, called once for each directory entry, until all results have been provided or the callback returns either SDL_ENUM_SUCCESS or SDL_ENUM_FAILURE.
+--
+--     This will return false if there was a system problem in general, or if a callback returns SDL_ENUM_FAILURE. A successful return means a callback returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries were enumerated.
+--
+--     If @path@ is NULL, this is treated as a request to enumerate the root of the storage container\'s tree. An empty string also works for this.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_EnumerateStorageDirectory@, defined at @SDL3\/SDL_storage.h 565:34@
+sDL_EnumerateStorageDirectory
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate, or NULL for the root.
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+  -- ^
+  --
+  --           [@callback@]: a function that is called for each entry in the directory.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO BG.CBool
+sDL_EnumerateStorageDirectory =
+  hs_bindgen_c3c153b007f4b8d7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_RemoveStoragePath@
+foreign import ccall safe "hs_bindgen_d92d44c2f8e020ee"
+  hs_bindgen_d92d44c2f8e020ee_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_RemoveStoragePath@
+hs_bindgen_d92d44c2f8e020ee
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_d92d44c2f8e020ee =
+  BG.fromFFIType hs_bindgen_d92d44c2f8e020ee_base
+
+-- | Remove a file or an empty directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_RemoveStoragePath@, defined at @SDL3\/SDL_storage.h 579:34@
+sDL_RemoveStoragePath
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> IO BG.CBool
+sDL_RemoveStoragePath = hs_bindgen_d92d44c2f8e020ee
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_RenameStoragePath@
+foreign import ccall safe "hs_bindgen_66aee97b54c3dcb2"
+  hs_bindgen_66aee97b54c3dcb2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_RenameStoragePath@
+hs_bindgen_66aee97b54c3dcb2
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_66aee97b54c3dcb2 =
+  BG.fromFFIType hs_bindgen_66aee97b54c3dcb2_base
+
+-- | Rename a file or directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_RenameStoragePath@, defined at @SDL3\/SDL_storage.h 594:34@
+sDL_RenameStoragePath
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO BG.CBool
+sDL_RenameStoragePath = hs_bindgen_66aee97b54c3dcb2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_CopyStorageFile@
+foreign import ccall safe "hs_bindgen_d6c508aee11578ae"
+  hs_bindgen_d6c508aee11578ae_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_CopyStorageFile@
+hs_bindgen_d6c508aee11578ae
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_d6c508aee11578ae =
+  BG.fromFFIType hs_bindgen_d6c508aee11578ae_base
+
+-- | Copy a file in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_CopyStorageFile@, defined at @SDL3\/SDL_storage.h 609:34@
+sDL_CopyStorageFile
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO BG.CBool
+sDL_CopyStorageFile = hs_bindgen_d6c508aee11578ae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_GetStoragePathInfo@
+foreign import ccall safe "hs_bindgen_cbcca6168ed4f658"
+  hs_bindgen_cbcca6168ed4f658_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_GetStoragePathInfo@
+hs_bindgen_cbcca6168ed4f658
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+  -> IO BG.CBool
+hs_bindgen_cbcca6168ed4f658 =
+  BG.fromFFIType hs_bindgen_cbcca6168ed4f658_base
+
+-- | Get information about a filesystem path in a storage container.
+--
+--     [Returns]: true on success or false if the file doesn\'t exist, or another failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_GetStoragePathInfo@, defined at @SDL3\/SDL_storage.h 625:34@
+sDL_GetStoragePathInfo
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+  -- ^
+  --
+  --           [@info@]: a pointer filled in with information about the path, or NULL to check for the existence of a file.
+  -> IO BG.CBool
+sDL_GetStoragePathInfo = hs_bindgen_cbcca6168ed4f658
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_GetStorageSpaceRemaining@
+foreign import ccall safe "hs_bindgen_33e3e12dc496414b"
+  hs_bindgen_33e3e12dc496414b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_GetStorageSpaceRemaining@
+hs_bindgen_33e3e12dc496414b
+  :: BG.Ptr SDL_Storage
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_33e3e12dc496414b =
+  BG.fromFFIType hs_bindgen_33e3e12dc496414b_base
+
+-- | Queries the remaining space in a storage container.
+--
+--     [Returns]: the amount of remaining space, in bytes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_GetStorageSpaceRemaining@, defined at @SDL3\/SDL_storage.h 638:36@
+sDL_GetStorageSpaceRemaining
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetStorageSpaceRemaining =
+  hs_bindgen_33e3e12dc496414b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_GlobStorageDirectory@
+foreign import ccall safe "hs_bindgen_7ef73cac376ed868"
+  hs_bindgen_7ef73cac376ed868_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Safe_SDL_GlobStorageDirectory@
+hs_bindgen_7ef73cac376ed868
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_GlobFlags
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+hs_bindgen_7ef73cac376ed868 =
+  BG.fromFFIType hs_bindgen_7ef73cac376ed868_base
+
+-- | Enumerate a directory tree, filtered by pattern, and return a list.
+--
+--     Files are filtered out if they don\'t match the string in @pattern@, which may contain wildcard characters @*@ (match everything) and @?@ (match one character). If pattern is NULL, no filtering is done and all results are returned. Subdirectories are permitted, and are specified with a path separator of \'\/\'. Wildcard characters @*@ and @?@ never match a path separator.
+--
+--     @flags@ may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching case-insensitive.
+--
+--     The returned array is always NULL-terminated, for your iterating convenience, but if @count@ is non-NULL, on return it will contain the number of items in the array, not counting the NULL terminator.
+--
+--     If @path@ is NULL, this is treated as a request to enumerate the root of the storage container\'s tree. An empty string also works for this.
+--
+--     [Returns]: an array of strings on success or NULL on failure; call SDL_GetError() for more information. The caller should pass the returned pointer to SDL_free when done with it. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, assuming the @storage@ object is thread-safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GlobStorageDirectory@, defined at @SDL3\/SDL_storage.h 678:37@
+sDL_GlobStorageDirectory
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate, or NULL for the root.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pattern@]: the pattern that files in the directory must match. Can be NULL.
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_GlobFlags
+  -- ^
+  --
+  --           [@flags@]: @SDL_GLOB_*@ bitflags that affect this search.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: on return, will be set to the number of items in the returned array. Can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+sDL_GlobStorageDirectory =
+  hs_bindgen_7ef73cac376ed868
diff --git a/src/SDL3/Sys/Bindgen/Storage/Unsafe.hs b/src/SDL3/Sys/Bindgen/Storage/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Storage/Unsafe.hs
@@ -0,0 +1,870 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Storage.Unsafe (
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_OpenTitleStorage,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_OpenUserStorage,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_OpenFileStorage,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_OpenStorage,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_CloseStorage,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_StorageReady,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_GetStorageFileSize,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_ReadStorageFile,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_WriteStorageFile,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_CreateStorageDirectory,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_EnumerateStorageDirectory,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_RemoveStoragePath,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_RenameStoragePath,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_CopyStorageFile,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_GetStoragePathInfo,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_GetStorageSpaceRemaining,
+  SDL3.Sys.Bindgen.Storage.Unsafe.sDL_GlobStorageDirectory,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Filesystem qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Storage
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_storage.h>"
+         , "SDL_Storage *hs_bindgen_3efb7b0f89cc88bf ("
+         , "  char const *arg1,"
+         , "  SDL_PropertiesID arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenTitleStorage)(arg1, arg2);"
+         , "}"
+         , "SDL_Storage *hs_bindgen_091f6a568e98e088 ("
+         , "  char const *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_PropertiesID arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenUserStorage)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_Storage *hs_bindgen_7005113c31f7da2f ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenFileStorage)(arg1);"
+         , "}"
+         , "SDL_Storage *hs_bindgen_b8dda6b007805de7 ("
+         , "  SDL_StorageInterface const *arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_OpenStorage)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_cbfe2f0e9b4cbc36 ("
+         , "  SDL_Storage *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CloseStorage)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_2696a9ea9d0fe58b ("
+         , "  SDL_Storage *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_StorageReady)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_4355da006df8358e ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  Uint64 *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetStorageFileSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_9bef126210db7928 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3,"
+         , "  Uint64 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadStorageFile)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_b7b6d20d57e278de ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  void const *arg3,"
+         , "  Uint64 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteStorageFile)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_ca002acf3667a014 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateStorageDirectory)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_26712abeb8ac186f ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_EnumerateDirectoryCallback arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_EnumerateStorageDirectory)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_76b7043c8ce038fa ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_RemoveStoragePath)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_27e9f0759ca9fa2b ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_RenameStoragePath)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_d46668712d52c888 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CopyStorageFile)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_a307c310a8b1e035 ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  SDL_PathInfo *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetStoragePathInfo)(arg1, arg2, arg3);"
+         , "}"
+         , "Uint64 hs_bindgen_0980e8da26f68acf ("
+         , "  SDL_Storage *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetStorageSpaceRemaining)(arg1);"
+         , "}"
+         , "char **hs_bindgen_c0ca5ffb0ed420ff ("
+         , "  SDL_Storage *arg1,"
+         , "  char const *arg2,"
+         , "  char const *arg3,"
+         , "  SDL_GlobFlags arg4,"
+         , "  signed int *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GlobStorageDirectory)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_OpenTitleStorage@
+foreign import ccall unsafe "hs_bindgen_3efb7b0f89cc88bf"
+  hs_bindgen_3efb7b0f89cc88bf_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_OpenTitleStorage@
+hs_bindgen_3efb7b0f89cc88bf
+  :: PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Storage)
+hs_bindgen_3efb7b0f89cc88bf =
+  BG.fromFFIType hs_bindgen_3efb7b0f89cc88bf_base
+
+-- | Opens up a read-only container for the application\'s filesystem.
+--
+--     By default, SDL_OpenTitleStorage uses the generic storage implementation. When the path override is not provided, the generic implementation will use the output of SDL_GetBasePath as the base path.
+--
+--     [Returns]: a title storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_OpenUserStorage', 'sDL_ReadStorageFile'
+--
+--     [C declaration]: @SDL_OpenTitleStorage@, defined at @SDL3\/SDL_storage.h 353:43@
+sDL_OpenTitleStorage
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@override@]: a path to override the backend\'s default title root.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: a property list that may contain backend-specific information.
+  -> IO (BG.Ptr SDL_Storage)
+sDL_OpenTitleStorage = hs_bindgen_3efb7b0f89cc88bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_OpenUserStorage@
+foreign import ccall unsafe "hs_bindgen_091f6a568e98e088"
+  hs_bindgen_091f6a568e98e088_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_OpenUserStorage@
+hs_bindgen_091f6a568e98e088
+  :: PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Storage)
+hs_bindgen_091f6a568e98e088 =
+  BG.fromFFIType hs_bindgen_091f6a568e98e088_base
+
+-- | Opens up a container for a user\'s unique read\/write filesystem.
+--
+--     While title storage can generally be kept open throughout runtime, user storage should only be opened when the client is ready to read\/write files. This allows the backend to properly batch file operations and flush them when the container has been closed; ensuring safe and optimal save I\/O.
+--
+--     [Returns]: a user storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_GetStorageSpaceRemaining', 'sDL_OpenTitleStorage', 'sDL_ReadStorageFile', 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_OpenUserStorage@, defined at @SDL3\/SDL_storage.h 379:43@
+sDL_OpenUserStorage
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@org@]: the name of your organization.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@app@]: the name of your application.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: a property list that may contain backend-specific information.
+  -> IO (BG.Ptr SDL_Storage)
+sDL_OpenUserStorage = hs_bindgen_091f6a568e98e088
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_OpenFileStorage@
+foreign import ccall unsafe "hs_bindgen_7005113c31f7da2f"
+  hs_bindgen_7005113c31f7da2f_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_OpenFileStorage@
+hs_bindgen_7005113c31f7da2f
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Storage)
+hs_bindgen_7005113c31f7da2f =
+  BG.fromFFIType hs_bindgen_7005113c31f7da2f_base
+
+-- | Opens up a container for local filesystem storage.
+--
+--     This is provided for development and tools. Portable applications should use @SDL_OpenTitleStorage()@ for access to game data and @SDL_OpenUserStorage()@ for access to user data.
+--
+--     [Returns]: a filesystem storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_GetStorageSpaceRemaining', 'sDL_OpenTitleStorage', 'sDL_OpenUserStorage', 'sDL_ReadStorageFile', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_OpenFileStorage@, defined at @SDL3\/SDL_storage.h 403:43@
+sDL_OpenFileStorage
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the base path prepended to all storage paths, or NULL for no base path.
+  -> IO (BG.Ptr SDL_Storage)
+sDL_OpenFileStorage = hs_bindgen_7005113c31f7da2f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_OpenStorage@
+foreign import ccall unsafe "hs_bindgen_b8dda6b007805de7"
+  hs_bindgen_b8dda6b007805de7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_OpenStorage@
+hs_bindgen_b8dda6b007805de7
+  :: PtrConst.PtrConst SDL_StorageInterface
+  -> BG.Ptr BG.Void
+  -> IO (BG.Ptr SDL_Storage)
+hs_bindgen_b8dda6b007805de7 =
+  BG.fromFFIType hs_bindgen_b8dda6b007805de7_base
+
+-- | Opens up a container using a client-provided storage interface.
+--
+--     Applications do not need to use this function unless they are providing their own 'SDL_Storage' implementation. If you just need an 'SDL_Storage', you should use the built-in implementations in SDL, like @SDL_OpenTitleStorage()@ or @SDL_OpenUserStorage()@.
+--
+--     This function makes a copy of @iface@ and the caller does not need to keep it around after this call.
+--
+--     [Returns]: a storage container on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CloseStorage', 'sDL_GetStorageFileSize', 'sDL_GetStorageSpaceRemaining', SDL_INIT_INTERFACE, 'sDL_ReadStorageFile', 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_OpenStorage@, defined at @SDL3\/SDL_storage.h 432:43@
+sDL_OpenStorage
+  :: PtrConst.PtrConst SDL_StorageInterface
+  -- ^
+  --
+  --           [@iface@]: the interface that implements this storage, initialized using SDL_INIT_INTERFACE().
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer that will be passed to the interface functions.
+  -> IO (BG.Ptr SDL_Storage)
+sDL_OpenStorage = hs_bindgen_b8dda6b007805de7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_CloseStorage@
+foreign import ccall unsafe "hs_bindgen_cbfe2f0e9b4cbc36"
+  hs_bindgen_cbfe2f0e9b4cbc36_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_CloseStorage@
+hs_bindgen_cbfe2f0e9b4cbc36
+  :: BG.Ptr SDL_Storage
+  -> IO BG.CBool
+hs_bindgen_cbfe2f0e9b4cbc36 =
+  BG.fromFFIType hs_bindgen_cbfe2f0e9b4cbc36_base
+
+-- | Closes and frees a storage container.
+--
+--     [Returns]: true if the container was freed with no errors, false otherwise; call SDL_GetError() for more information. Even if the function returns an error, the container data will be freed; the error is only for informational purposes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_OpenFileStorage', 'sDL_OpenStorage', 'sDL_OpenTitleStorage', 'sDL_OpenUserStorage'
+--
+--     [C declaration]: @SDL_CloseStorage@, defined at @SDL3\/SDL_storage.h 450:34@
+sDL_CloseStorage
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to close.
+  -> IO BG.CBool
+sDL_CloseStorage = hs_bindgen_cbfe2f0e9b4cbc36
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_StorageReady@
+foreign import ccall unsafe "hs_bindgen_2696a9ea9d0fe58b"
+  hs_bindgen_2696a9ea9d0fe58b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_StorageReady@
+hs_bindgen_2696a9ea9d0fe58b
+  :: BG.Ptr SDL_Storage
+  -> IO BG.CBool
+hs_bindgen_2696a9ea9d0fe58b =
+  BG.fromFFIType hs_bindgen_2696a9ea9d0fe58b_base
+
+-- | Checks if the storage container is ready to use.
+--
+--     This function should be called in regular intervals until it returns true - however, it is not recommended to spinwait on this call, as the backend may depend on a synchronous message loop. You might instead poll this in your game\'s main loop while processing events and drawing a loading screen.
+--
+--     [Returns]: true if the container is ready, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_StorageReady@, defined at @SDL3\/SDL_storage.h 465:34@
+sDL_StorageReady
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> IO BG.CBool
+sDL_StorageReady = hs_bindgen_2696a9ea9d0fe58b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_GetStorageFileSize@
+foreign import ccall unsafe "hs_bindgen_4355da006df8358e"
+  hs_bindgen_4355da006df8358e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_GetStorageFileSize@
+hs_bindgen_4355da006df8358e
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_4355da006df8358e =
+  BG.fromFFIType hs_bindgen_4355da006df8358e_base
+
+-- | Query the size of a file within a storage container.
+--
+--     [Returns]: true if the file could be queried or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ReadStorageFile', 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_GetStorageFileSize@, defined at @SDL3\/SDL_storage.h 481:34@
+sDL_GetStorageFileSize
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@length@]: a pointer to be filled with the file\'s length.
+  -> IO BG.CBool
+sDL_GetStorageFileSize = hs_bindgen_4355da006df8358e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_ReadStorageFile@
+foreign import ccall unsafe "hs_bindgen_9bef126210db7928"
+  hs_bindgen_9bef126210db7928_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_ReadStorageFile@
+hs_bindgen_9bef126210db7928
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_9bef126210db7928 =
+  BG.fromFFIType hs_bindgen_9bef126210db7928_base
+
+-- | Synchronously read a file from a storage container into a client-provided buffer.
+--
+--     The value of @length@ must match the length of the file exactly; call @SDL_GetStorageFileSize()@ to get this value. This behavior may be relaxed in a future release.
+--
+--     [Returns]: true if the file was read or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetStorageFileSize', 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_ReadStorageFile@, defined at @SDL3\/SDL_storage.h 504:34@
+sDL_ReadStorageFile
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to read from.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to read.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@destination@]: a client-provided buffer to read the file into.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@length@]: the length of the destination buffer.
+  -> IO BG.CBool
+sDL_ReadStorageFile = hs_bindgen_9bef126210db7928
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_WriteStorageFile@
+foreign import ccall unsafe "hs_bindgen_b7b6d20d57e278de"
+  hs_bindgen_b7b6d20d57e278de_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word64
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_WriteStorageFile@
+hs_bindgen_b7b6d20d57e278de
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO BG.CBool
+hs_bindgen_b7b6d20d57e278de =
+  BG.fromFFIType hs_bindgen_b7b6d20d57e278de_base
+
+-- | Synchronously write a file from client memory into a storage container.
+--
+--     [Returns]: true if the file was written or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetStorageSpaceRemaining', 'sDL_ReadStorageFile', 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_WriteStorageFile@, defined at @SDL3\/SDL_storage.h 522:34@
+sDL_WriteStorageFile
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to write to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to write.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@source@]: a client-provided buffer to write from.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@length@]: the length of the source buffer.
+  -> IO BG.CBool
+sDL_WriteStorageFile = hs_bindgen_b7b6d20d57e278de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_CreateStorageDirectory@
+foreign import ccall unsafe "hs_bindgen_ca002acf3667a014"
+  hs_bindgen_ca002acf3667a014_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_CreateStorageDirectory@
+hs_bindgen_ca002acf3667a014
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_ca002acf3667a014 =
+  BG.fromFFIType hs_bindgen_ca002acf3667a014_base
+
+-- | Create a directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_CreateStorageDirectory@, defined at @SDL3\/SDL_storage.h 536:34@
+sDL_CreateStorageDirectory
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to create.
+  -> IO BG.CBool
+sDL_CreateStorageDirectory =
+  hs_bindgen_ca002acf3667a014
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_EnumerateStorageDirectory@
+foreign import ccall unsafe "hs_bindgen_26712abeb8ac186f"
+  hs_bindgen_26712abeb8ac186f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_EnumerateStorageDirectory@
+hs_bindgen_26712abeb8ac186f
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_26712abeb8ac186f =
+  BG.fromFFIType hs_bindgen_26712abeb8ac186f_base
+
+-- | Enumerate a directory in a storage container through a callback function.
+--
+--     This function provides every directory entry through an app-provided callback, called once for each directory entry, until all results have been provided or the callback returns either SDL_ENUM_SUCCESS or SDL_ENUM_FAILURE.
+--
+--     This will return false if there was a system problem in general, or if a callback returns SDL_ENUM_FAILURE. A successful return means a callback returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries were enumerated.
+--
+--     If @path@ is NULL, this is treated as a request to enumerate the root of the storage container\'s tree. An empty string also works for this.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_EnumerateStorageDirectory@, defined at @SDL3\/SDL_storage.h 565:34@
+sDL_EnumerateStorageDirectory
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate, or NULL for the root.
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+  -- ^
+  --
+  --           [@callback@]: a function that is called for each entry in the directory.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO BG.CBool
+sDL_EnumerateStorageDirectory =
+  hs_bindgen_26712abeb8ac186f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_RemoveStoragePath@
+foreign import ccall unsafe "hs_bindgen_76b7043c8ce038fa"
+  hs_bindgen_76b7043c8ce038fa_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_RemoveStoragePath@
+hs_bindgen_76b7043c8ce038fa
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_76b7043c8ce038fa =
+  BG.fromFFIType hs_bindgen_76b7043c8ce038fa_base
+
+-- | Remove a file or an empty directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_RemoveStoragePath@, defined at @SDL3\/SDL_storage.h 579:34@
+sDL_RemoveStoragePath
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> IO BG.CBool
+sDL_RemoveStoragePath = hs_bindgen_76b7043c8ce038fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_RenameStoragePath@
+foreign import ccall unsafe "hs_bindgen_27e9f0759ca9fa2b"
+  hs_bindgen_27e9f0759ca9fa2b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_RenameStoragePath@
+hs_bindgen_27e9f0759ca9fa2b
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_27e9f0759ca9fa2b =
+  BG.fromFFIType hs_bindgen_27e9f0759ca9fa2b_base
+
+-- | Rename a file or directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_RenameStoragePath@, defined at @SDL3\/SDL_storage.h 594:34@
+sDL_RenameStoragePath
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO BG.CBool
+sDL_RenameStoragePath = hs_bindgen_27e9f0759ca9fa2b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_CopyStorageFile@
+foreign import ccall unsafe "hs_bindgen_d46668712d52c888"
+  hs_bindgen_d46668712d52c888_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_CopyStorageFile@
+hs_bindgen_d46668712d52c888
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_d46668712d52c888 =
+  BG.fromFFIType hs_bindgen_d46668712d52c888_base
+
+-- | Copy a file in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_CopyStorageFile@, defined at @SDL3\/SDL_storage.h 609:34@
+sDL_CopyStorageFile
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO BG.CBool
+sDL_CopyStorageFile = hs_bindgen_d46668712d52c888
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_GetStoragePathInfo@
+foreign import ccall unsafe "hs_bindgen_a307c310a8b1e035"
+  hs_bindgen_a307c310a8b1e035_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_GetStoragePathInfo@
+hs_bindgen_a307c310a8b1e035
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+  -> IO BG.CBool
+hs_bindgen_a307c310a8b1e035 =
+  BG.fromFFIType hs_bindgen_a307c310a8b1e035_base
+
+-- | Get information about a filesystem path in a storage container.
+--
+--     [Returns]: true on success or false if the file doesn\'t exist, or another failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady'
+--
+--     [C declaration]: @SDL_GetStoragePathInfo@, defined at @SDL3\/SDL_storage.h 625:34@
+sDL_GetStoragePathInfo
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+  -- ^
+  --
+  --           [@info@]: a pointer filled in with information about the path, or NULL to check for the existence of a file.
+  -> IO BG.CBool
+sDL_GetStoragePathInfo = hs_bindgen_a307c310a8b1e035
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_GetStorageSpaceRemaining@
+foreign import ccall unsafe "hs_bindgen_0980e8da26f68acf"
+  hs_bindgen_0980e8da26f68acf_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_GetStorageSpaceRemaining@
+hs_bindgen_0980e8da26f68acf
+  :: BG.Ptr SDL_Storage
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_0980e8da26f68acf =
+  BG.fromFFIType hs_bindgen_0980e8da26f68acf_base
+
+-- | Queries the remaining space in a storage container.
+--
+--     [Returns]: the amount of remaining space, in bytes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_StorageReady', 'sDL_WriteStorageFile'
+--
+--     [C declaration]: @SDL_GetStorageSpaceRemaining@, defined at @SDL3\/SDL_storage.h 638:36@
+sDL_GetStorageSpaceRemaining
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetStorageSpaceRemaining =
+  hs_bindgen_0980e8da26f68acf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_GlobStorageDirectory@
+foreign import ccall unsafe "hs_bindgen_c0ca5ffb0ed420ff"
+  hs_bindgen_c0ca5ffb0ed420ff_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Storage_Unsafe_SDL_GlobStorageDirectory@
+hs_bindgen_c0ca5ffb0ed420ff
+  :: BG.Ptr SDL_Storage
+  -> PtrConst.PtrConst BG.CChar
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_GlobFlags
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+hs_bindgen_c0ca5ffb0ed420ff =
+  BG.fromFFIType hs_bindgen_c0ca5ffb0ed420ff_base
+
+-- | Enumerate a directory tree, filtered by pattern, and return a list.
+--
+--     Files are filtered out if they don\'t match the string in @pattern@, which may contain wildcard characters @*@ (match everything) and @?@ (match one character). If pattern is NULL, no filtering is done and all results are returned. Subdirectories are permitted, and are specified with a path separator of \'\/\'. Wildcard characters @*@ and @?@ never match a path separator.
+--
+--     @flags@ may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching case-insensitive.
+--
+--     The returned array is always NULL-terminated, for your iterating convenience, but if @count@ is non-NULL, on return it will contain the number of items in the array, not counting the NULL terminator.
+--
+--     If @path@ is NULL, this is treated as a request to enumerate the root of the storage container\'s tree. An empty string also works for this.
+--
+--     [Returns]: an array of strings on success or NULL on failure; call SDL_GetError() for more information. The caller should pass the returned pointer to SDL_free when done with it. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, assuming the @storage@ object is thread-safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GlobStorageDirectory@, defined at @SDL3\/SDL_storage.h 678:37@
+sDL_GlobStorageDirectory
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate, or NULL for the root.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pattern@]: the pattern that files in the directory must match. Can be NULL.
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_GlobFlags
+  -- ^
+  --
+  --           [@flags@]: @SDL_GLOB_*@ bitflags that affect this search.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: on return, will be set to the number of items in the returned array. Can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+sDL_GlobStorageDirectory =
+  hs_bindgen_c0ca5ffb0ed420ff
diff --git a/src/SDL3/Sys/Bindgen/Surface.hs b/src/SDL3/Sys/Bindgen/Surface.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Surface.hs
@@ -0,0 +1,875 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL surfaces are buffers of pixels in system RAM. These are useful for passing around and manipulating images that are not stored in GPU memory.
+--
+--     'SDL_Surface' makes serious efforts to manage images in various formats, and provides a reasonable toolbox for transforming the data, including copying between surfaces, filling rectangles in the image data, etc.
+--
+--     There is also a simple .bmp loader, @SDL_LoadBMP()@, and a simple .png loader, @SDL_LoadPNG()@. SDL itself does not provide loaders for other file formats, but there are several excellent external libraries that do, including its own satellite library, [SDL_image](https://wiki.libsdl.org/SDL3_image) In general these functions are thread-safe in that they can be called on different threads with different surfaces. You should not try to modify any surface from two threads simultaneously. The flags on an 'SDL_Surface'.
+--
+--     These are generally considered read-only.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Surface (
+  SDL3.Sys.Bindgen.Surface.SDL_SurfaceFlags (..),
+  SDL3.Sys.Bindgen.Surface.sDL_SURFACE_PREALLOCATED,
+  SDL3.Sys.Bindgen.Surface.sDL_SURFACE_LOCK_NEEDED,
+  SDL3.Sys.Bindgen.Surface.sDL_SURFACE_LOCKED,
+  SDL3.Sys.Bindgen.Surface.sDL_SURFACE_SIMD_ALIGNED,
+  SDL3.Sys.Bindgen.Surface.SDL_ScaleMode (..),
+  pattern SDL3.Sys.Bindgen.Surface.SDL_SCALEMODE_INVALID,
+  pattern SDL3.Sys.Bindgen.Surface.SDL_SCALEMODE_NEAREST,
+  pattern SDL3.Sys.Bindgen.Surface.SDL_SCALEMODE_LINEAR,
+  pattern SDL3.Sys.Bindgen.Surface.SDL_SCALEMODE_PIXELART,
+  SDL3.Sys.Bindgen.Surface.SDL_FlipMode (..),
+  pattern SDL3.Sys.Bindgen.Surface.SDL_FLIP_NONE,
+  pattern SDL3.Sys.Bindgen.Surface.SDL_FLIP_HORIZONTAL,
+  pattern SDL3.Sys.Bindgen.Surface.SDL_FLIP_VERTICAL,
+  pattern SDL3.Sys.Bindgen.Surface.SDL_FLIP_HORIZONTAL_AND_VERTICAL,
+  SDL3.Sys.Bindgen.Surface.SDL_Surface (..),
+  SDL3.Sys.Bindgen.Surface.sDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT,
+  SDL3.Sys.Bindgen.Surface.sDL_PROP_SURFACE_HDR_HEADROOM_FLOAT,
+  SDL3.Sys.Bindgen.Surface.sDL_PROP_SURFACE_TONEMAP_OPERATOR_STRING,
+  SDL3.Sys.Bindgen.Surface.sDL_PROP_SURFACE_HOTSPOT_X_NUMBER,
+  SDL3.Sys.Bindgen.Surface.sDL_PROP_SURFACE_HOTSPOT_Y_NUMBER,
+  SDL3.Sys.Bindgen.Surface.sDL_PROP_SURFACE_ROTATION_FLOAT,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_SurfaceFlags@, defined at @SDL3\/SDL_surface.h 68:16@
+newtype SDL_SurfaceFlags = SDL_SurfaceFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_SurfaceFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SurfaceFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_SurfaceFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_SurfaceFlags "unwrap" where
+  type
+    CFieldType SDL_SurfaceFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Surface uses preallocated pixel memory
+--
+--     [C declaration]: @macro SDL_SURFACE_PREALLOCATED@, defined at @SDL3\/SDL_surface.h 70:9@
+sDL_SURFACE_PREALLOCATED :: BG.CUInt
+sDL_SURFACE_PREALLOCATED = (1 :: BG.CUInt)
+
+-- | Surface needs to be locked to access pixels
+--
+--     [C declaration]: @macro SDL_SURFACE_LOCK_NEEDED@, defined at @SDL3\/SDL_surface.h 71:9@
+sDL_SURFACE_LOCK_NEEDED :: BG.CUInt
+sDL_SURFACE_LOCK_NEEDED = (2 :: BG.CUInt)
+
+-- | Surface is currently locked
+--
+--     [C declaration]: @macro SDL_SURFACE_LOCKED@, defined at @SDL3\/SDL_surface.h 72:9@
+sDL_SURFACE_LOCKED :: BG.CUInt
+sDL_SURFACE_LOCKED = (4 :: BG.CUInt)
+
+-- | Surface uses pixel memory allocated with SDL_aligned_alloc()
+--
+--     [C declaration]: @macro SDL_SURFACE_SIMD_ALIGNED@, defined at @SDL3\/SDL_surface.h 73:9@
+sDL_SURFACE_SIMD_ALIGNED :: BG.CUInt
+sDL_SURFACE_SIMD_ALIGNED = (8 :: BG.CUInt)
+
+-- | The scaling mode.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_ScaleMode@, defined at @SDL3\/SDL_surface.h 87:14@
+newtype SDL_ScaleMode = SDL_ScaleMode
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_ScaleMode where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_ScaleMode where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ScaleMode
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_ScaleMode where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ScaleMode unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_ScaleMode instance BG.Storable SDL_ScaleMode
+
+deriving via BG.CInt instance BG.Prim SDL_ScaleMode
+
+instance CEnum.CEnum SDL_ScaleMode where
+  type CEnumZ SDL_ScaleMode = BG.CInt
+
+  toCEnum = SDL_ScaleMode
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_SCALEMODE_INVALID")
+        , (0, BG.singleton "SDL_SCALEMODE_NEAREST")
+        , (1, BG.singleton "SDL_SCALEMODE_LINEAR")
+        , (2, BG.singleton "SDL_SCALEMODE_PIXELART")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_ScaleMode"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_ScaleMode"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_ScaleMode where
+  minDeclaredValue = SDL_SCALEMODE_INVALID
+
+  maxDeclaredValue = SDL_SCALEMODE_PIXELART
+
+instance Show SDL_ScaleMode where
+  showsPrec = CEnum.shows
+
+instance Read SDL_ScaleMode where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_ScaleMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ScaleMode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ScaleMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ScaleMode "unwrap" where
+  type CFieldType SDL_ScaleMode "unwrap" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_SCALEMODE_INVALID@, defined at @SDL3\/SDL_surface.h 89:5@
+pattern SDL_SCALEMODE_INVALID :: SDL_ScaleMode
+pattern SDL_SCALEMODE_INVALID = SDL_ScaleMode (-1)
+
+-- | nearest pixel sampling
+--
+--     [C declaration]: @SDL_SCALEMODE_NEAREST@, defined at @SDL3\/SDL_surface.h 90:5@
+pattern SDL_SCALEMODE_NEAREST :: SDL_ScaleMode
+pattern SDL_SCALEMODE_NEAREST = SDL_ScaleMode 0
+
+-- | linear filtering
+--
+--     [C declaration]: @SDL_SCALEMODE_LINEAR@, defined at @SDL3\/SDL_surface.h 91:5@
+pattern SDL_SCALEMODE_LINEAR :: SDL_ScaleMode
+pattern SDL_SCALEMODE_LINEAR = SDL_ScaleMode 1
+
+-- | nearest pixel sampling with improved scaling for pixel art, available since SDL 3.4.0
+--
+--     [C declaration]: @SDL_SCALEMODE_PIXELART@, defined at @SDL3\/SDL_surface.h 92:5@
+pattern SDL_SCALEMODE_PIXELART :: SDL_ScaleMode
+pattern SDL_SCALEMODE_PIXELART = SDL_ScaleMode 2
+
+-- | The flip mode.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_FlipMode@, defined at @SDL3\/SDL_surface.h 100:14@
+newtype SDL_FlipMode = SDL_FlipMode
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_FlipMode where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_FlipMode where
+  readRaw =
+    \ptr0 ->
+      pure SDL_FlipMode
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_FlipMode where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_FlipMode unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_FlipMode instance BG.Storable SDL_FlipMode
+
+deriving via BG.CUInt instance BG.Prim SDL_FlipMode
+
+instance CEnum.CEnum SDL_FlipMode where
+  type CEnumZ SDL_FlipMode = BG.CUInt
+
+  toCEnum = SDL_FlipMode
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_FLIP_NONE")
+        , (1, BG.singleton "SDL_FLIP_HORIZONTAL")
+        , (2, BG.singleton "SDL_FLIP_VERTICAL")
+        , (3, BG.singleton "SDL_FLIP_HORIZONTAL_AND_VERTICAL")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_FlipMode"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_FlipMode"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_FlipMode where
+  minDeclaredValue = SDL_FLIP_NONE
+
+  maxDeclaredValue = SDL_FLIP_HORIZONTAL_AND_VERTICAL
+
+instance Show SDL_FlipMode where
+  showsPrec = CEnum.shows
+
+instance Read SDL_FlipMode where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_FlipMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FlipMode{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_FlipMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_FlipMode "unwrap" where
+  type CFieldType SDL_FlipMode "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Do not flip
+--
+--     [C declaration]: @SDL_FLIP_NONE@, defined at @SDL3\/SDL_surface.h 102:5@
+pattern SDL_FLIP_NONE :: SDL_FlipMode
+pattern SDL_FLIP_NONE = SDL_FlipMode 0
+
+-- | flip horizontally
+--
+--     [C declaration]: @SDL_FLIP_HORIZONTAL@, defined at @SDL3\/SDL_surface.h 103:5@
+pattern SDL_FLIP_HORIZONTAL :: SDL_FlipMode
+pattern SDL_FLIP_HORIZONTAL = SDL_FlipMode 1
+
+-- | flip vertically
+--
+--     [C declaration]: @SDL_FLIP_VERTICAL@, defined at @SDL3\/SDL_surface.h 104:5@
+pattern SDL_FLIP_VERTICAL :: SDL_FlipMode
+pattern SDL_FLIP_VERTICAL = SDL_FlipMode 2
+
+-- | flip horizontally and vertically (not a diagonal flip)
+--
+--     [C declaration]: @SDL_FLIP_HORIZONTAL_AND_VERTICAL@, defined at @SDL3\/SDL_surface.h 105:5@
+pattern SDL_FLIP_HORIZONTAL_AND_VERTICAL :: SDL_FlipMode
+pattern SDL_FLIP_HORIZONTAL_AND_VERTICAL = SDL_FlipMode 3
+
+-- | A collection of pixels used in software blitting.
+--
+--     Pixels are arranged in memory in rows, with the top row first. Each row occupies an amount of memory given by the pitch (sometimes known as the row stride in non-SDL APIs).
+--
+--     Within each row, pixels are arranged from left to right until the width is reached. Each pixel occupies a number of bits appropriate for its format, with most formats representing each pixel as one or more whole bytes (in some indexed formats, instead multiple pixels are packed into each byte), and a byte order given by the format. After encoding all pixels, any remaining bytes to reach the pitch are used as padding to reach a desired alignment, and have undefined contents.
+--
+--     When a surface holds YUV format data, the planes are assumed to be contiguous without padding between them, e.g. a 32x32 surface in NV12 format with a pitch of 32 would consist of 32x32 bytes of Y plane followed by 32x16 bytes of UV plane.
+--
+--     When a surface holds MJPG format data, pixels points at the compressed JPEG image and pitch is the length of that data.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSurface', 'sDL_DestroySurface'
+--
+--     [C declaration]: @struct SDL_Surface@, defined at @SDL3\/SDL_surface.h 138:8@
+data SDL_Surface = SDL_Surface
+  { flags :: SDL_SurfaceFlags
+  -- ^ The flags of the surface, read-only
+  --
+  --          [C declaration]: @flags@, defined at @SDL3\/SDL_surface.h 140:22@
+  , format :: SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^ The format of the surface, read-only
+  --
+  --          [C declaration]: @format@, defined at @SDL3\/SDL_surface.h 141:21@
+  , w :: BG.CInt
+  -- ^ The width of the surface, read-only.
+  --
+  --          [C declaration]: @w@, defined at @SDL3\/SDL_surface.h 142:9@
+  , h :: BG.CInt
+  -- ^ The height of the surface, read-only.
+  --
+  --          [C declaration]: @h@, defined at @SDL3\/SDL_surface.h 143:9@
+  , pitch :: BG.CInt
+  -- ^ The distance in bytes between rows of pixels, read-only
+  --
+  --          [C declaration]: @pitch@, defined at @SDL3\/SDL_surface.h 144:9@
+  , pixels :: BG.Ptr BG.Void
+  -- ^ A pointer to the pixels of the surface, the pixels are writeable if non-NULL
+  --
+  --          [C declaration]: @pixels@, defined at @SDL3\/SDL_surface.h 145:11@
+  , refcount :: BG.CInt
+  -- ^ Application reference count, used when freeing surface
+  --
+  --          [C declaration]: @refcount@, defined at @SDL3\/SDL_surface.h 147:9@
+  , reserved :: BG.Ptr BG.Void
+  -- ^ Reserved for internal use
+  --
+  --          [C declaration]: @reserved@, defined at @SDL3\/SDL_surface.h 149:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_Surface where
+  staticSizeOf = \_ -> (48 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_Surface where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Surface
+        <*> HasCField.readRaw (BG.Proxy @"flags") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"w") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"h") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pitch") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pixels") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"refcount") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"reserved") ptr0
+
+instance Marshal.WriteRaw SDL_Surface where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Surface flags2 format3 w4 h5 pitch6 pixels7 refcount8 reserved9 ->
+            HasCField.writeRaw (BG.Proxy @"flags") ptr0 flags2
+              >> HasCField.writeRaw (BG.Proxy @"format") ptr0 format3
+              >> HasCField.writeRaw (BG.Proxy @"w") ptr0 w4
+              >> HasCField.writeRaw (BG.Proxy @"h") ptr0 h5
+              >> HasCField.writeRaw (BG.Proxy @"pitch") ptr0 pitch6
+              >> HasCField.writeRaw (BG.Proxy @"pixels") ptr0 pixels7
+              >> HasCField.writeRaw (BG.Proxy @"refcount") ptr0 refcount8
+              >> HasCField.writeRaw (BG.Proxy @"reserved") ptr0 reserved9
+
+deriving via Marshal.EquivStorable SDL_Surface instance BG.Storable SDL_Surface
+
+instance
+  (ty ~ SDL_SurfaceFlags)
+  => BG.CompatHasField.HasField "flags" SDL_Surface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Surface
+            { flags = y1
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pitch = BG.getField @"pitch" x0
+            , pixels = BG.getField @"pixels" x0
+            , refcount = BG.getField @"refcount" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"flags" x0
+      )
+
+instance
+  (ty ~ SDL_SurfaceFlags)
+  => BG.HasField "flags" (BG.Ptr SDL_Surface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"flags")
+
+instance HasCField.HasCField SDL_Surface "flags" where
+  type
+    CFieldType SDL_Surface "flags" =
+      SDL_SurfaceFlags
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat)
+  => BG.CompatHasField.HasField "format" SDL_Surface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Surface
+            { format = y1
+            , flags = BG.getField @"flags" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pitch = BG.getField @"pitch" x0
+            , pixels = BG.getField @"pixels" x0
+            , refcount = BG.getField @"refcount" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat)
+  => BG.HasField "format" (BG.Ptr SDL_Surface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_Surface "format" where
+  type
+    CFieldType SDL_Surface "format" =
+      SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+
+  offset# = \_ -> \_ -> 4
+
+instance (ty ~ BG.CInt) => BG.CompatHasField.HasField "w" SDL_Surface ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Surface
+            { w = y1
+            , flags = BG.getField @"flags" x0
+            , format = BG.getField @"format" x0
+            , h = BG.getField @"h" x0
+            , pitch = BG.getField @"pitch" x0
+            , pixels = BG.getField @"pixels" x0
+            , refcount = BG.getField @"refcount" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"w" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "w" (BG.Ptr SDL_Surface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"w")
+
+instance HasCField.HasCField SDL_Surface "w" where
+  type CFieldType SDL_Surface "w" = BG.CInt
+
+  offset# = \_ -> \_ -> 8
+
+instance (ty ~ BG.CInt) => BG.CompatHasField.HasField "h" SDL_Surface ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Surface
+            { h = y1
+            , flags = BG.getField @"flags" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , pitch = BG.getField @"pitch" x0
+            , pixels = BG.getField @"pixels" x0
+            , refcount = BG.getField @"refcount" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"h" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "h" (BG.Ptr SDL_Surface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"h")
+
+instance HasCField.HasCField SDL_Surface "h" where
+  type CFieldType SDL_Surface "h" = BG.CInt
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "pitch" SDL_Surface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Surface
+            { pitch = y1
+            , flags = BG.getField @"flags" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pixels = BG.getField @"pixels" x0
+            , refcount = BG.getField @"refcount" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"pitch" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "pitch" (BG.Ptr SDL_Surface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pitch")
+
+instance HasCField.HasCField SDL_Surface "pitch" where
+  type CFieldType SDL_Surface "pitch" = BG.CInt
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "pixels" SDL_Surface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Surface
+            { pixels = y1
+            , flags = BG.getField @"flags" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pitch = BG.getField @"pitch" x0
+            , refcount = BG.getField @"refcount" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"pixels" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "pixels" (BG.Ptr SDL_Surface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pixels")
+
+instance HasCField.HasCField SDL_Surface "pixels" where
+  type CFieldType SDL_Surface "pixels" = BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "refcount" SDL_Surface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Surface
+            { refcount = y1
+            , flags = BG.getField @"flags" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pitch = BG.getField @"pitch" x0
+            , pixels = BG.getField @"pixels" x0
+            , reserved = BG.getField @"reserved" x0
+            }
+      , BG.getField @"refcount" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "refcount" (BG.Ptr SDL_Surface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"refcount")
+
+instance HasCField.HasCField SDL_Surface "refcount" where
+  type CFieldType SDL_Surface "refcount" = BG.CInt
+
+  offset# = \_ -> \_ -> 32
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "reserved" SDL_Surface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Surface
+            { reserved = y1
+            , flags = BG.getField @"flags" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pitch = BG.getField @"pitch" x0
+            , pixels = BG.getField @"pixels" x0
+            , refcount = BG.getField @"refcount" x0
+            }
+      , BG.getField @"reserved" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "reserved" (BG.Ptr SDL_Surface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"reserved")
+
+instance HasCField.HasCField SDL_Surface "reserved" where
+  type
+    CFieldType SDL_Surface "reserved" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 40
+
+-- | [C declaration]: @macro SDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT@, literal @\"SDL.surface.SDR_white_point\"@, defined at @SDL3\/SDL_surface.h 261:9@
+sDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT :: BG.ByteString
+sDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x53
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x77
+    , 0x68
+    , 0x69
+    , 0x74
+    , 0x65
+    , 0x5F
+    , 0x70
+    , 0x6F
+    , 0x69
+    , 0x6E
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_SURFACE_HDR_HEADROOM_FLOAT@, literal @\"SDL.surface.HDR_headroom\"@, defined at @SDL3\/SDL_surface.h 262:9@
+sDL_PROP_SURFACE_HDR_HEADROOM_FLOAT :: BG.ByteString
+sDL_PROP_SURFACE_HDR_HEADROOM_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x48
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x68
+    , 0x65
+    , 0x61
+    , 0x64
+    , 0x72
+    , 0x6F
+    , 0x6F
+    , 0x6D
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_SURFACE_TONEMAP_OPERATOR_STRING@, literal @\"SDL.surface.tonemap\"@, defined at @SDL3\/SDL_surface.h 263:9@
+sDL_PROP_SURFACE_TONEMAP_OPERATOR_STRING :: BG.ByteString
+sDL_PROP_SURFACE_TONEMAP_OPERATOR_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x74
+    , 0x6F
+    , 0x6E
+    , 0x65
+    , 0x6D
+    , 0x61
+    , 0x70
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_SURFACE_HOTSPOT_X_NUMBER@, literal @\"SDL.surface.hotspot.x\"@, defined at @SDL3\/SDL_surface.h 264:9@
+sDL_PROP_SURFACE_HOTSPOT_X_NUMBER :: BG.ByteString
+sDL_PROP_SURFACE_HOTSPOT_X_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x68
+    , 0x6F
+    , 0x74
+    , 0x73
+    , 0x70
+    , 0x6F
+    , 0x74
+    , 0x2E
+    , 0x78
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_SURFACE_HOTSPOT_Y_NUMBER@, literal @\"SDL.surface.hotspot.y\"@, defined at @SDL3\/SDL_surface.h 265:9@
+sDL_PROP_SURFACE_HOTSPOT_Y_NUMBER :: BG.ByteString
+sDL_PROP_SURFACE_HOTSPOT_Y_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x68
+    , 0x6F
+    , 0x74
+    , 0x73
+    , 0x70
+    , 0x6F
+    , 0x74
+    , 0x2E
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_SURFACE_ROTATION_FLOAT@, literal @\"SDL.surface.rotation\"@, defined at @SDL3\/SDL_surface.h 266:9@
+sDL_PROP_SURFACE_ROTATION_FLOAT :: BG.ByteString
+sDL_PROP_SURFACE_ROTATION_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    , 0x2E
+    , 0x72
+    , 0x6F
+    , 0x74
+    , 0x61
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
diff --git a/src/SDL3/Sys/Bindgen/Surface/FunPtr.hs b/src/SDL3/Sys/Bindgen/Surface/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Surface/FunPtr.hs
@@ -0,0 +1,3707 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Surface.FunPtr (
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_CreateSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_CreateSurfaceFrom,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_DestroySurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_GetSurfaceProperties,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SetSurfaceColorspace,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_GetSurfaceColorspace,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_CreateSurfacePalette,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SetSurfacePalette,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_GetSurfacePalette,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_AddSurfaceAlternateImage,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SurfaceHasAlternateImages,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_GetSurfaceImages,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_RemoveSurfaceAlternateImages,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_LockSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_UnlockSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_LoadSurface_IO,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_LoadSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_LoadBMP_IO,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_LoadBMP,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SaveBMP_IO,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SaveBMP,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_LoadPNG_IO,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_LoadPNG,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SavePNG_IO,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SavePNG,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SetSurfaceRLE,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SurfaceHasRLE,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SetSurfaceColorKey,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SurfaceHasColorKey,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_GetSurfaceColorKey,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SetSurfaceColorMod,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_GetSurfaceColorMod,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SetSurfaceAlphaMod,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_GetSurfaceAlphaMod,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SetSurfaceBlendMode,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_GetSurfaceBlendMode,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_SetSurfaceClipRect,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_GetSurfaceClipRect,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_FlipSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_RotateSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_DuplicateSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_ScaleSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_ConvertSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_ConvertSurfaceAndColorspace,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_ConvertPixels,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_ConvertPixelsAndColorspace,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_PremultiplyAlpha,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_PremultiplySurfaceAlpha,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_ClearSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_FillSurfaceRect,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_FillSurfaceRects,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_BlitSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_BlitSurfaceUnchecked,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_BlitSurfaceScaled,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_BlitSurfaceUncheckedScaled,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_StretchSurface,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_BlitSurfaceTiled,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_BlitSurfaceTiledWithScale,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_BlitSurface9Grid,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_MapSurfaceRGB,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_MapSurfaceRGBA,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_ReadSurfacePixel,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_ReadSurfacePixelFloat,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_WriteSurfacePixel,
+  SDL3.Sys.Bindgen.Surface.FunPtr.sDL_WriteSurfacePixelFloat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Blendmode qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_surface.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_CreateSurface */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_b611b0ad74e9df46 (void)) ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_CreateSurfaceFrom */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_618b221956f449f6 (void)) ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  void *arg4,"
+         , "  signed int arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateSurfaceFrom;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_DestroySurface */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_3abd108286bfceeb (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroySurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_19e46938182deff1 (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSurfaceProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceColorspace */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3dcd7404be98273c (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Colorspace arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetSurfaceColorspace;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceColorspace */"
+         , "__attribute__ ((const))"
+         , "SDL_Colorspace (*hs_bindgen_d23645a854452460 (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSurfaceColorspace;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_CreateSurfacePalette */"
+         , "__attribute__ ((const))"
+         , "SDL_Palette *(*hs_bindgen_7f4f9f996fc5d0fa (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateSurfacePalette;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfacePalette */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_38fd6f01b7193fdc (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Palette *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetSurfacePalette;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfacePalette */"
+         , "__attribute__ ((const))"
+         , "SDL_Palette *(*hs_bindgen_d7d43240b950a72f (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSurfacePalette;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_AddSurfaceAlternateImage */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_51641021bfbefd52 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_AddSurfaceAlternateImage;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SurfaceHasAlternateImages */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_246a5adcd0cb59d2 (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SurfaceHasAlternateImages;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceImages */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface **(*hs_bindgen_facc022f89ae54d4 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSurfaceImages;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_RemoveSurfaceAlternateImages */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_3cf1a6833f417511 (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RemoveSurfaceAlternateImages;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LockSurface */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d9555284e2bd0bd2 (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_LockSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_UnlockSurface */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_c9cc0ab93d524b01 (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_UnlockSurface;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadSurface_IO */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_b9f87aa5bdc60ef1 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_LoadSurface_IO;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_LoadSurface_IO requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadSurface */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_40bbeaa5b1c224ea (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_LoadSurface;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_LoadSurface requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadBMP_IO */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_6755776ca639dbdc (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_LoadBMP_IO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadBMP */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_551d0d7143060153 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_LoadBMP;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SaveBMP_IO */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7af781be626489b8 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_IOStream *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SaveBMP_IO;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SaveBMP */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2ca988106cd7ddb5 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SaveBMP;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadPNG_IO */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_1068e5bcdcfeee86 (void)) ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_LoadPNG_IO;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_LoadPNG_IO requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadPNG */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_b113bfea8941c2b8 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_LoadPNG;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_LoadPNG requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SavePNG_IO */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_784779331549b878 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_IOStream *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SavePNG_IO;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SavePNG_IO requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SavePNG */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3039586bfe90e597 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SavePNG;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SavePNG requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceRLE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_dd401b9169c44976 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetSurfaceRLE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SurfaceHasRLE */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8957a6011d9f44f9 (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SurfaceHasRLE;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceColorKey */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_bb6a923e2cd243f7 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  _Bool arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetSurfaceColorKey;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SurfaceHasColorKey */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9cb1ca0717710e5a (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SurfaceHasColorKey;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceColorKey */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b8a872d97663bea2 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint32 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSurfaceColorKey;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceColorMod */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d96bb8008d1b87a6 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_SetSurfaceColorMod;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceColorMod */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_bc145b87021a07e6 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 *arg2,"
+         , "  Uint8 *arg3,"
+         , "  Uint8 *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSurfaceColorMod;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceAlphaMod */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_44bc0c580740a2b4 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetSurfaceAlphaMod;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceAlphaMod */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2f7b92e198b60348 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSurfaceAlphaMod;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceBlendMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1abb9d9640e9f83b (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_BlendMode arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetSurfaceBlendMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceBlendMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ddc08ab588ab04b9 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_BlendMode *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSurfaceBlendMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceClipRect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ba59ae52e07cd998 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetSurfaceClipRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceClipRect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7d6c81cd63182c7e (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetSurfaceClipRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_FlipSurface */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3f1f98e8e0b7167f (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_FlipMode arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_FlipSurface;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_RotateSurface */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_bc3ef53813125bc9 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_RotateSurface;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_RotateSurface requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_DuplicateSurface */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_d6a7bd90e75ca1f4 (void)) ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DuplicateSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ScaleSurface */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_3c8c8f89fa471eaf (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_ScaleMode arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_ScaleSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertSurface */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_02efcc9cf840132b (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_PixelFormat arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_ConvertSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertSurfaceAndColorspace */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_d71b405fb2c63769 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_PixelFormat arg2,"
+         , "  SDL_Palette *arg3,"
+         , "  SDL_Colorspace arg4,"
+         , "  SDL_PropertiesID arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_ConvertSurfaceAndColorspace;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertPixels */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_57fab76de82ac9cf (void)) ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  void const *arg4,"
+         , "  signed int arg5,"
+         , "  SDL_PixelFormat arg6,"
+         , "  void *arg7,"
+         , "  signed int arg8"
+         , ")"
+         , "{"
+         , "  return &SDL_ConvertPixels;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertPixelsAndColorspace */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8ab04e66f663ce08 (void)) ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  SDL_Colorspace arg4,"
+         , "  SDL_PropertiesID arg5,"
+         , "  void const *arg6,"
+         , "  signed int arg7,"
+         , "  SDL_PixelFormat arg8,"
+         , "  SDL_Colorspace arg9,"
+         , "  SDL_PropertiesID arg10,"
+         , "  void *arg11,"
+         , "  signed int arg12"
+         , ")"
+         , "{"
+         , "  return &SDL_ConvertPixelsAndColorspace;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_PremultiplyAlpha */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fb56322259d07073 (void)) ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  void const *arg4,"
+         , "  signed int arg5,"
+         , "  SDL_PixelFormat arg6,"
+         , "  void *arg7,"
+         , "  signed int arg8,"
+         , "  _Bool arg9"
+         , ")"
+         , "{"
+         , "  return &SDL_PremultiplyAlpha;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_PremultiplySurfaceAlpha */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6d7894c44ea2dfc7 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_PremultiplySurfaceAlpha;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ClearSurface */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3eb9b7722a04b8f8 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_ClearSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_FillSurfaceRect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d466d8dde16f547b (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_FillSurfaceRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_FillSurfaceRects */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b0bc5bc8b57e73e3 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_FillSurfaceRects;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurface */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a29859c35fa4ca59 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BlitSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceUnchecked */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3f540dd5f5c2d037 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BlitSurfaceUnchecked;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceScaled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9a9b4e0ef4c33fb3 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4,"
+         , "  SDL_ScaleMode arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_BlitSurfaceScaled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceUncheckedScaled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4d0c17a14d7334d5 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4,"
+         , "  SDL_ScaleMode arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_BlitSurfaceUncheckedScaled;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_StretchSurface */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1a9d00d4cf3623eb (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4,"
+         , "  SDL_ScaleMode arg5"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 2, 4)"
+         , "  return &SDL_StretchSurface;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_StretchSurface requires SDL >= 3.2.4\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceTiled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_215dfb2882cacc76 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_BlitSurfaceTiled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceTiledWithScale */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c33eb3f53084c8a3 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  float arg3,"
+         , "  SDL_ScaleMode arg4,"
+         , "  SDL_Surface *arg5,"
+         , "  SDL_Rect const *arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_BlitSurfaceTiledWithScale;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurface9Grid */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_34b06f5d5e4b0b97 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5,"
+         , "  signed int arg6,"
+         , "  float arg7,"
+         , "  SDL_ScaleMode arg8,"
+         , "  SDL_Surface *arg9,"
+         , "  SDL_Rect const *arg10"
+         , ")"
+         , "{"
+         , "  return &SDL_BlitSurface9Grid;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_MapSurfaceRGB */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_22cd4dcdb87e7f1a (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_MapSurfaceRGB;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_MapSurfaceRGBA */"
+         , "__attribute__ ((const))"
+         , "Uint32 (*hs_bindgen_0a9db974db6877bb (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_MapSurfaceRGBA;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ReadSurfacePixel */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_621010702d3faa18 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5,"
+         , "  Uint8 *arg6,"
+         , "  Uint8 *arg7"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadSurfacePixel;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ReadSurfacePixelFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8c567029e60d9131 (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  float *arg4,"
+         , "  float *arg5,"
+         , "  float *arg6,"
+         , "  float *arg7"
+         , ")"
+         , "{"
+         , "  return &SDL_ReadSurfacePixelFloat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_WriteSurfacePixel */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_b9a3ff7742c64b4a (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5,"
+         , "  Uint8 arg6,"
+         , "  Uint8 arg7"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteSurfacePixel;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_WriteSurfacePixelFloat */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_622524c6fb921b4c (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  float arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7"
+         , ")"
+         , "{"
+         , "  return &SDL_WriteSurfacePixelFloat;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_CreateSurface@
+foreign import ccall unsafe "hs_bindgen_b611b0ad74e9df46"
+  hs_bindgen_b611b0ad74e9df46_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_CreateSurface@
+hs_bindgen_b611b0ad74e9df46
+  :: IO
+       (BG.FunPtr (BG.CInt -> BG.CInt -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_b611b0ad74e9df46 =
+  BG.fromFFIType hs_bindgen_b611b0ad74e9df46_base
+
+{-# NOINLINE sDL_CreateSurface #-}
+
+-- | Allocate a new surface with a specific pixel format.
+--
+--     The pixels of the new surface are initialized to zero.
+--
+--     [@width@]: the width of the surface.
+--
+--     [@height@]: the height of the surface.
+--
+--     [@format@]: the SDL_PixelFormat for the new surface\'s pixel format.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSurfaceFrom', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_CreateSurface@, defined at @SDL3\/SDL_surface.h 173:43@
+sDL_CreateSurface
+  :: BG.FunPtr (BG.CInt -> BG.CInt -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat -> IO (BG.Ptr SDL_Surface))
+sDL_CreateSurface =
+  BG.unsafePerformIO hs_bindgen_b611b0ad74e9df46
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_CreateSurfaceFrom@
+foreign import ccall unsafe "hs_bindgen_618b221956f449f6"
+  hs_bindgen_618b221956f449f6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_CreateSurfaceFrom@
+hs_bindgen_618b221956f449f6
+  :: IO
+       ( BG.FunPtr
+           ( BG.CInt
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+             -> BG.Ptr BG.Void
+             -> BG.CInt
+             -> IO (BG.Ptr SDL_Surface)
+           )
+       )
+hs_bindgen_618b221956f449f6 =
+  BG.fromFFIType hs_bindgen_618b221956f449f6_base
+
+{-# NOINLINE sDL_CreateSurfaceFrom #-}
+
+-- | Allocate a new surface with a specific pixel format and existing pixel data.
+--
+--     No copy is made of the pixel data. Pixel data is not managed automatically; you must free the surface before you free the pixel data.
+--
+--     Pitch is the offset in bytes from one row of pixels to the next, e.g. @width*4@ for @SDL_PIXELFORMAT_RGBA8888@.
+--
+--     You may pass NULL for pixels and 0 for pitch to create a surface that you will fill in with valid values later.
+--
+--     [@width@]: the width of the surface.
+--
+--     [@height@]: the height of the surface.
+--
+--     [@format@]: the SDL_PixelFormat for the new surface\'s pixel format.
+--
+--     [@pixels@]: a pointer to existing pixel data.
+--
+--     [@pitch@]: the number of bytes between each row, including padding.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSurface', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_CreateSurfaceFrom@, defined at @SDL3\/SDL_surface.h 203:43@
+sDL_CreateSurfaceFrom
+  :: BG.FunPtr
+       ( BG.CInt
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+         -> BG.Ptr BG.Void
+         -> BG.CInt
+         -> IO (BG.Ptr SDL_Surface)
+       )
+sDL_CreateSurfaceFrom =
+  BG.unsafePerformIO hs_bindgen_618b221956f449f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_DestroySurface@
+foreign import ccall unsafe "hs_bindgen_3abd108286bfceeb"
+  hs_bindgen_3abd108286bfceeb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_DestroySurface@
+hs_bindgen_3abd108286bfceeb :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO ()))
+hs_bindgen_3abd108286bfceeb =
+  BG.fromFFIType hs_bindgen_3abd108286bfceeb_base
+
+{-# NOINLINE sDL_DestroySurface #-}
+
+-- | Free a surface.
+--
+--     It is safe to pass NULL to this function.
+--
+--     [@surface@]: the 'SDL_Surface' to free.
+--
+--     [Thread safety]: No other thread should be using the surface when it is freed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSurface', 'sDL_CreateSurfaceFrom'
+--
+--     [C declaration]: @SDL_DestroySurface@, defined at @SDL3\/SDL_surface.h 219:34@
+sDL_DestroySurface :: BG.FunPtr (BG.Ptr SDL_Surface -> IO ())
+sDL_DestroySurface =
+  BG.unsafePerformIO hs_bindgen_3abd108286bfceeb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceProperties@
+foreign import ccall unsafe "hs_bindgen_19e46938182deff1"
+  hs_bindgen_19e46938182deff1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceProperties@
+hs_bindgen_19e46938182deff1
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_19e46938182deff1 =
+  BG.fromFFIType hs_bindgen_19e46938182deff1_base
+
+{-# NOINLINE sDL_GetSurfaceProperties #-}
+
+-- | Get the properties associated with a surface.
+--
+--     The following properties are understood by SDL:
+--
+--     * @'sDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point surfaces, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 203 for HDR10 surfaces and 1.0 for floating point surfaces.
+--
+--     * @'sDL_PROP_SURFACE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point surfaces, this defines the maximum dynamic range used by the content, in terms of the SDR white point. This defaults to 0.0, which disables tone mapping.
+--
+--     * @'sDL_PROP_SURFACE_TONEMAP_OPERATOR_STRING'@: the tone mapping operator used when compressing from a surface with high dynamic range to another with lower dynamic range. Currently this supports \"chrome\", which uses the same tone mapping that Chrome uses for HDR content, the form \"*=N\", where N is a floating point scale factor applied in linear space, and \"none\", which disables tone mapping. This defaults to \"chrome\".
+--
+--     * @'sDL_PROP_SURFACE_HOTSPOT_X_NUMBER'@: the hotspot pixel offset from the left edge of the image, if this surface is being used as a cursor.
+--
+--     * @'sDL_PROP_SURFACE_HOTSPOT_Y_NUMBER'@: the hotspot pixel offset from the top edge of the image, if this surface is being used as a cursor.
+--
+--     * @'sDL_PROP_SURFACE_ROTATION_FLOAT'@: the number of degrees a surface\'s data is meant to be rotated clockwise to make the image right-side up. Default
+--       1. This is used by the camera API, if a mobile device is oriented differently than what its camera provides (i.e. - the camera always provides portrait images but the phone is being held in landscape orientation). Since SDL 3.4.0.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSurfaceProperties@, defined at @SDL3\/SDL_surface.h 259:46@
+sDL_GetSurfaceProperties
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetSurfaceProperties =
+  BG.unsafePerformIO hs_bindgen_19e46938182deff1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceColorspace@
+foreign import ccall unsafe "hs_bindgen_3dcd7404be98273c"
+  hs_bindgen_3dcd7404be98273c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceColorspace@
+hs_bindgen_3dcd7404be98273c
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace -> IO BG.CBool))
+hs_bindgen_3dcd7404be98273c =
+  BG.fromFFIType hs_bindgen_3dcd7404be98273c_base
+
+{-# NOINLINE sDL_SetSurfaceColorspace #-}
+
+-- | Set the colorspace used by a surface.
+--
+--     Setting the colorspace doesn\'t change the pixels, only how they are interpreted in color operations.
+--
+--     [@surface@]: the 'SDL_Surface' structure to update.
+--
+--     [@colorspace@]: an SDL_Colorspace value describing the surface colorspace.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorspace'
+--
+--     [C declaration]: @SDL_SetSurfaceColorspace@, defined at @SDL3\/SDL_surface.h 287:34@
+sDL_SetSurfaceColorspace
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace -> IO BG.CBool)
+sDL_SetSurfaceColorspace =
+  BG.unsafePerformIO hs_bindgen_3dcd7404be98273c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceColorspace@
+foreign import ccall unsafe "hs_bindgen_d23645a854452460"
+  hs_bindgen_d23645a854452460_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceColorspace@
+hs_bindgen_d23645a854452460
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO SDL3.Sys.Bindgen.Pixels.SDL_Colorspace))
+hs_bindgen_d23645a854452460 =
+  BG.fromFFIType hs_bindgen_d23645a854452460_base
+
+{-# NOINLINE sDL_GetSurfaceColorspace #-}
+
+-- | Get the colorspace used by a surface.
+--
+--     The colorspace defaults to SDL_COLORSPACE_SRGB_LINEAR for floating point formats, SDL_COLORSPACE_HDR10 for 10-bit formats, SDL_COLORSPACE_SRGB for other RGB surfaces and SDL_COLORSPACE_BT709_FULL for YUV textures.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [Returns]: the colorspace used by the surface, or SDL_COLORSPACE_UNKNOWN if the surface is NULL.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceColorspace'
+--
+--     [C declaration]: @SDL_GetSurfaceColorspace@, defined at @SDL3\/SDL_surface.h 307:44@
+sDL_GetSurfaceColorspace
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> IO SDL3.Sys.Bindgen.Pixels.SDL_Colorspace)
+sDL_GetSurfaceColorspace =
+  BG.unsafePerformIO hs_bindgen_d23645a854452460
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_CreateSurfacePalette@
+foreign import ccall unsafe "hs_bindgen_7f4f9f996fc5d0fa"
+  hs_bindgen_7f4f9f996fc5d0fa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_CreateSurfacePalette@
+hs_bindgen_7f4f9f996fc5d0fa
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)))
+hs_bindgen_7f4f9f996fc5d0fa =
+  BG.fromFFIType hs_bindgen_7f4f9f996fc5d0fa_base
+
+{-# NOINLINE sDL_CreateSurfacePalette #-}
+
+-- | Create a palette and associate it with a surface.
+--
+--     This function creates a palette compatible with the provided surface. The palette is then returned for you to modify, and the surface will automatically use the new palette in future operations. You do not need to destroy the returned palette, it will be freed when the reference count reaches 0, usually when the surface is destroyed.
+--
+--     Bitmap surfaces (with format SDL_PIXELFORMAT_INDEX1LSB or SDL_PIXELFORMAT_INDEX1MSB) will have the palette initialized with 0 as white and 1 as black. Other surfaces will get a palette initialized with white in every entry.
+--
+--     If this function is called for a surface that already has a palette, a new palette will be created to replace it.
+--
+--     [@surface@]: the 'SDL_Surface' structure to update.
+--
+--     [Returns]: a new SDL_Palette structure on success or NULL on failure (e.g. if the surface didn\'t have an index format); call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_SetPaletteColors
+--
+--     [C declaration]: @SDL_CreateSurfacePalette@, defined at @SDL3\/SDL_surface.h 338:43@
+sDL_CreateSurfacePalette
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette))
+sDL_CreateSurfacePalette =
+  BG.unsafePerformIO hs_bindgen_7f4f9f996fc5d0fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfacePalette@
+foreign import ccall unsafe "hs_bindgen_38fd6f01b7193fdc"
+  hs_bindgen_38fd6f01b7193fdc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfacePalette@
+hs_bindgen_38fd6f01b7193fdc
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette -> IO BG.CBool))
+hs_bindgen_38fd6f01b7193fdc =
+  BG.fromFFIType hs_bindgen_38fd6f01b7193fdc_base
+
+{-# NOINLINE sDL_SetSurfacePalette #-}
+
+-- | Set the palette used by a surface.
+--
+--     Setting the palette keeps an internal reference to the palette, which can be safely destroyed afterwards.
+--
+--     A single palette can be shared with many surfaces.
+--
+--     [@surface@]: the 'SDL_Surface' structure to update.
+--
+--     [@palette@]: the SDL_Palette structure to use.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreatePalette, 'sDL_GetSurfacePalette'
+--
+--     [C declaration]: @SDL_SetSurfacePalette@, defined at @SDL3\/SDL_surface.h 361:34@
+sDL_SetSurfacePalette
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette -> IO BG.CBool)
+sDL_SetSurfacePalette =
+  BG.unsafePerformIO hs_bindgen_38fd6f01b7193fdc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfacePalette@
+foreign import ccall unsafe "hs_bindgen_d7d43240b950a72f"
+  hs_bindgen_d7d43240b950a72f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfacePalette@
+hs_bindgen_d7d43240b950a72f
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)))
+hs_bindgen_d7d43240b950a72f =
+  BG.fromFFIType hs_bindgen_d7d43240b950a72f_base
+
+{-# NOINLINE sDL_GetSurfacePalette #-}
+
+-- | Get the palette used by a surface.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [Returns]: a pointer to the palette used by the surface, or NULL if there is no palette used.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfacePalette'
+--
+--     [C declaration]: @SDL_GetSurfacePalette@, defined at @SDL3\/SDL_surface.h 376:43@
+sDL_GetSurfacePalette
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette))
+sDL_GetSurfacePalette =
+  BG.unsafePerformIO hs_bindgen_d7d43240b950a72f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_AddSurfaceAlternateImage@
+foreign import ccall unsafe "hs_bindgen_51641021bfbefd52"
+  hs_bindgen_51641021bfbefd52_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_AddSurfaceAlternateImage@
+hs_bindgen_51641021bfbefd52
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL_Surface -> IO BG.CBool))
+hs_bindgen_51641021bfbefd52 =
+  BG.fromFFIType hs_bindgen_51641021bfbefd52_base
+
+{-# NOINLINE sDL_AddSurfaceAlternateImage #-}
+
+-- | Add an alternate version of a surface.
+--
+--     This function adds an alternate version of this surface, usually used for content with high DPI representations like cursors or icons. The size, format, and content do not need to match the original surface, and these alternate versions will not be updated when the original surface changes.
+--
+--     This function adds a reference to the alternate version, so you should call @SDL_DestroySurface()@ on the image after this call.
+--
+--     [@surface@]: the 'SDL_Surface' structure to update.
+--
+--     [@image@]: a pointer to an alternate 'SDL_Surface' to associate with this surface.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveSurfaceAlternateImages', 'sDL_GetSurfaceImages', 'sDL_SurfaceHasAlternateImages'
+--
+--     [C declaration]: @SDL_AddSurfaceAlternateImage@, defined at @SDL3\/SDL_surface.h 404:34@
+sDL_AddSurfaceAlternateImage :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL_Surface -> IO BG.CBool)
+sDL_AddSurfaceAlternateImage =
+  BG.unsafePerformIO hs_bindgen_51641021bfbefd52
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SurfaceHasAlternateImages@
+foreign import ccall unsafe "hs_bindgen_246a5adcd0cb59d2"
+  hs_bindgen_246a5adcd0cb59d2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SurfaceHasAlternateImages@
+hs_bindgen_246a5adcd0cb59d2 :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO BG.CBool))
+hs_bindgen_246a5adcd0cb59d2 =
+  BG.fromFFIType hs_bindgen_246a5adcd0cb59d2_base
+
+{-# NOINLINE sDL_SurfaceHasAlternateImages #-}
+
+-- | Return whether a surface has alternate versions available.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [Returns]: true if alternate versions are available or false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddSurfaceAlternateImage', 'sDL_RemoveSurfaceAlternateImages', 'sDL_GetSurfaceImages'
+--
+--     [C declaration]: @SDL_SurfaceHasAlternateImages@, defined at @SDL3\/SDL_surface.h 420:34@
+sDL_SurfaceHasAlternateImages :: BG.FunPtr (BG.Ptr SDL_Surface -> IO BG.CBool)
+sDL_SurfaceHasAlternateImages =
+  BG.unsafePerformIO hs_bindgen_246a5adcd0cb59d2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceImages@
+foreign import ccall unsafe "hs_bindgen_facc022f89ae54d4"
+  hs_bindgen_facc022f89ae54d4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceImages@
+hs_bindgen_facc022f89ae54d4
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_Surface))))
+hs_bindgen_facc022f89ae54d4 =
+  BG.fromFFIType hs_bindgen_facc022f89ae54d4_base
+
+{-# NOINLINE sDL_GetSurfaceImages #-}
+
+-- | Get an array including all versions of a surface.
+--
+--     This returns all versions of a surface, with the surface being queried as the first element in the returned array.
+--
+--     Freeing the array of surfaces does not affect the surfaces in the array. They are still referenced by the surface being queried and will be cleaned up normally.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [@count@]: a pointer filled in with the number of surface pointers returned, may be NULL.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Surface' pointers or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddSurfaceAlternateImage', 'sDL_RemoveSurfaceAlternateImages', 'sDL_SurfaceHasAlternateImages'
+--
+--     [C declaration]: @SDL_GetSurfaceImages@, defined at @SDL3\/SDL_surface.h 448:44@
+sDL_GetSurfaceImages
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_Surface)))
+sDL_GetSurfaceImages =
+  BG.unsafePerformIO hs_bindgen_facc022f89ae54d4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_RemoveSurfaceAlternateImages@
+foreign import ccall unsafe "hs_bindgen_3cf1a6833f417511"
+  hs_bindgen_3cf1a6833f417511_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_RemoveSurfaceAlternateImages@
+hs_bindgen_3cf1a6833f417511 :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO ()))
+hs_bindgen_3cf1a6833f417511 =
+  BG.fromFFIType hs_bindgen_3cf1a6833f417511_base
+
+{-# NOINLINE sDL_RemoveSurfaceAlternateImages #-}
+
+-- | Remove all alternate versions of a surface.
+--
+--     This function removes a reference from all the alternative versions, destroying them if this is the last reference to them.
+--
+--     [@surface@]: the 'SDL_Surface' structure to update.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddSurfaceAlternateImage', 'sDL_GetSurfaceImages', 'sDL_SurfaceHasAlternateImages'
+--
+--     [C declaration]: @SDL_RemoveSurfaceAlternateImages@, defined at @SDL3\/SDL_surface.h 467:34@
+sDL_RemoveSurfaceAlternateImages :: BG.FunPtr (BG.Ptr SDL_Surface -> IO ())
+sDL_RemoveSurfaceAlternateImages =
+  BG.unsafePerformIO hs_bindgen_3cf1a6833f417511
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LockSurface@
+foreign import ccall unsafe "hs_bindgen_d9555284e2bd0bd2"
+  hs_bindgen_d9555284e2bd0bd2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LockSurface@
+hs_bindgen_d9555284e2bd0bd2 :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO BG.CBool))
+hs_bindgen_d9555284e2bd0bd2 =
+  BG.fromFFIType hs_bindgen_d9555284e2bd0bd2_base
+
+{-# NOINLINE sDL_LockSurface #-}
+
+-- | Set up a surface for directly accessing the pixels.
+--
+--     Between calls to @SDL_LockSurface()@ \/ @SDL_UnlockSurface()@, you can write to and read from @surface->pixels@, using the pixel format stored in @surface->format@. Once you are done accessing the surface, you should use @SDL_UnlockSurface()@ to release it.
+--
+--     Not all surfaces require locking. If @SDL_MUSTLOCK(surface)@ evaluates to 0, then you can read and write to the surface at any time, and the pixel format of the surface will not change.
+--
+--     [@surface@]: the 'SDL_Surface' structure to be locked.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces. The locking referred to by this function is making the pixels available for direct access, not thread-safe locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MUSTLOCK@, 'sDL_UnlockSurface'
+--
+--     [C declaration]: @SDL_LockSurface@, defined at @SDL3\/SDL_surface.h 495:34@
+sDL_LockSurface :: BG.FunPtr (BG.Ptr SDL_Surface -> IO BG.CBool)
+sDL_LockSurface =
+  BG.unsafePerformIO hs_bindgen_d9555284e2bd0bd2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_UnlockSurface@
+foreign import ccall unsafe "hs_bindgen_c9cc0ab93d524b01"
+  hs_bindgen_c9cc0ab93d524b01_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_UnlockSurface@
+hs_bindgen_c9cc0ab93d524b01 :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO ()))
+hs_bindgen_c9cc0ab93d524b01 =
+  BG.fromFFIType hs_bindgen_c9cc0ab93d524b01_base
+
+{-# NOINLINE sDL_UnlockSurface #-}
+
+-- | Release a surface after directly accessing the pixels.
+--
+--     [@surface@]: the 'SDL_Surface' structure to be unlocked.
+--
+--     [Thread safety]: This function is not thread safe. The locking referred to by this function is making the pixels available for direct access, not thread-safe locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockSurface'
+--
+--     [C declaration]: @SDL_UnlockSurface@, defined at @SDL3\/SDL_surface.h 510:34@
+sDL_UnlockSurface :: BG.FunPtr (BG.Ptr SDL_Surface -> IO ())
+sDL_UnlockSurface =
+  BG.unsafePerformIO hs_bindgen_c9cc0ab93d524b01
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadSurface_IO@
+foreign import ccall unsafe "hs_bindgen_b9f87aa5bdc60ef1"
+  hs_bindgen_b9f87aa5bdc60ef1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadSurface_IO@
+hs_bindgen_b9f87aa5bdc60ef1
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_b9f87aa5bdc60ef1 =
+  BG.fromFFIType hs_bindgen_b9f87aa5bdc60ef1_base
+
+{-# NOINLINE sDL_LoadSurface_IO #-}
+
+-- | Load a BMP or PNG image from a seekable SDL data stream.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [@src@]: the data stream for the surface.
+--
+--     [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadSurface'
+--
+--     [C declaration]: @SDL_LoadSurface_IO@, defined at @SDL3\/SDL_surface.h 531:43@
+sDL_LoadSurface_IO
+  :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO (BG.Ptr SDL_Surface))
+sDL_LoadSurface_IO =
+  BG.unsafePerformIO hs_bindgen_b9f87aa5bdc60ef1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadSurface@
+foreign import ccall unsafe "hs_bindgen_40bbeaa5b1c224ea"
+  hs_bindgen_40bbeaa5b1c224ea_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadSurface@
+hs_bindgen_40bbeaa5b1c224ea
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_40bbeaa5b1c224ea =
+  BG.fromFFIType hs_bindgen_40bbeaa5b1c224ea_base
+
+{-# NOINLINE sDL_LoadSurface #-}
+
+-- | Load a BMP or PNG image from a file.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [@file@]: the file to load.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadSurface_IO'
+--
+--     [C declaration]: @SDL_LoadSurface@, defined at @SDL3\/SDL_surface.h 550:43@
+sDL_LoadSurface :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Surface))
+sDL_LoadSurface =
+  BG.unsafePerformIO hs_bindgen_40bbeaa5b1c224ea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadBMP_IO@
+foreign import ccall unsafe "hs_bindgen_6755776ca639dbdc"
+  hs_bindgen_6755776ca639dbdc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadBMP_IO@
+hs_bindgen_6755776ca639dbdc
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_6755776ca639dbdc =
+  BG.fromFFIType hs_bindgen_6755776ca639dbdc_base
+
+{-# NOINLINE sDL_LoadBMP_IO #-}
+
+-- | Load a BMP image from a seekable SDL data stream.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [@src@]: the data stream for the surface.
+--
+--     [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadBMP', 'sDL_SaveBMP_IO'
+--
+--     [C declaration]: @SDL_LoadBMP_IO@, defined at @SDL3\/SDL_surface.h 572:43@
+sDL_LoadBMP_IO
+  :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO (BG.Ptr SDL_Surface))
+sDL_LoadBMP_IO =
+  BG.unsafePerformIO hs_bindgen_6755776ca639dbdc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadBMP@
+foreign import ccall unsafe "hs_bindgen_551d0d7143060153"
+  hs_bindgen_551d0d7143060153_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadBMP@
+hs_bindgen_551d0d7143060153
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_551d0d7143060153 =
+  BG.fromFFIType hs_bindgen_551d0d7143060153_base
+
+{-# NOINLINE sDL_LoadBMP #-}
+
+-- | Load a BMP image from a file.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [@file@]: the BMP file to load.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadBMP_IO', 'sDL_SaveBMP'
+--
+--     [C declaration]: @SDL_LoadBMP@, defined at @SDL3\/SDL_surface.h 592:43@
+sDL_LoadBMP :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Surface))
+sDL_LoadBMP =
+  BG.unsafePerformIO hs_bindgen_551d0d7143060153
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SaveBMP_IO@
+foreign import ccall unsafe "hs_bindgen_7af781be626489b8"
+  hs_bindgen_7af781be626489b8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SaveBMP_IO@
+hs_bindgen_7af781be626489b8
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO BG.CBool)
+       )
+hs_bindgen_7af781be626489b8 =
+  BG.fromFFIType hs_bindgen_7af781be626489b8_base
+
+{-# NOINLINE sDL_SaveBMP_IO #-}
+
+-- | Save a surface to a seekable SDL data stream in BMP format.
+--
+--     Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the BMP directly. Other RGB formats with 8-bit or higher get converted to a 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit surface before they are saved. YUV and paletted 1-bit and 4-bit formats are not supported.
+--
+--     [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+--
+--     [@dst@]: a data stream to save to.
+--
+--     [@closeio@]: if true, calls SDL_CloseIO() on @dst@ before returning, even in the case of an error.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadBMP_IO', 'sDL_SaveBMP'
+--
+--     [C declaration]: @SDL_SaveBMP_IO@, defined at @SDL3\/SDL_surface.h 618:34@
+sDL_SaveBMP_IO
+  :: BG.FunPtr
+       (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO BG.CBool)
+sDL_SaveBMP_IO =
+  BG.unsafePerformIO hs_bindgen_7af781be626489b8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SaveBMP@
+foreign import ccall unsafe "hs_bindgen_2ca988106cd7ddb5"
+  hs_bindgen_2ca988106cd7ddb5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SaveBMP@
+hs_bindgen_2ca988106cd7ddb5
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_2ca988106cd7ddb5 =
+  BG.fromFFIType hs_bindgen_2ca988106cd7ddb5_base
+
+{-# NOINLINE sDL_SaveBMP #-}
+
+-- | Save a surface to a file in BMP format.
+--
+--     Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the BMP directly. Other RGB formats with 8-bit or higher get converted to a 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit surface before they are saved. YUV and paletted 1-bit and 4-bit formats are not supported.
+--
+--     [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+--
+--     [@file@]: a file to save to.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadBMP', 'sDL_SaveBMP_IO'
+--
+--     [C declaration]: @SDL_SaveBMP@, defined at @SDL3\/SDL_surface.h 642:34@
+sDL_SaveBMP :: BG.FunPtr (BG.Ptr SDL_Surface -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SaveBMP =
+  BG.unsafePerformIO hs_bindgen_2ca988106cd7ddb5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadPNG_IO@
+foreign import ccall unsafe "hs_bindgen_1068e5bcdcfeee86"
+  hs_bindgen_1068e5bcdcfeee86_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadPNG_IO@
+hs_bindgen_1068e5bcdcfeee86
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_1068e5bcdcfeee86 =
+  BG.fromFFIType hs_bindgen_1068e5bcdcfeee86_base
+
+{-# NOINLINE sDL_LoadPNG_IO #-}
+
+-- | Load a PNG image from a seekable SDL data stream.
+--
+--     This is intended as a convenience function for loading images from trusted sources. If you want to load arbitrary images you should use libpng or another image loading library designed with security in mind.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [@src@]: the data stream for the surface.
+--
+--     [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadPNG', 'sDL_SavePNG_IO'
+--
+--     [C declaration]: @SDL_LoadPNG_IO@, defined at @SDL3\/SDL_surface.h 668:43@
+sDL_LoadPNG_IO
+  :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO (BG.Ptr SDL_Surface))
+sDL_LoadPNG_IO =
+  BG.unsafePerformIO hs_bindgen_1068e5bcdcfeee86
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadPNG@
+foreign import ccall unsafe "hs_bindgen_b113bfea8941c2b8"
+  hs_bindgen_b113bfea8941c2b8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_LoadPNG@
+hs_bindgen_b113bfea8941c2b8
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_b113bfea8941c2b8 =
+  BG.fromFFIType hs_bindgen_b113bfea8941c2b8_base
+
+{-# NOINLINE sDL_LoadPNG #-}
+
+-- | Load a PNG image from a file.
+--
+--     This is intended as a convenience function for loading images from trusted sources. If you want to load arbitrary images you should use libpng or another image loading library designed with security in mind.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [@file@]: the PNG file to load.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadPNG_IO', 'sDL_SavePNG'
+--
+--     [C declaration]: @SDL_LoadPNG@, defined at @SDL3\/SDL_surface.h 692:43@
+sDL_LoadPNG :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Surface))
+sDL_LoadPNG =
+  BG.unsafePerformIO hs_bindgen_b113bfea8941c2b8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SavePNG_IO@
+foreign import ccall unsafe "hs_bindgen_784779331549b878"
+  hs_bindgen_784779331549b878_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SavePNG_IO@
+hs_bindgen_784779331549b878
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO BG.CBool)
+       )
+hs_bindgen_784779331549b878 =
+  BG.fromFFIType hs_bindgen_784779331549b878_base
+
+{-# NOINLINE sDL_SavePNG_IO #-}
+
+-- | Save a surface to a seekable SDL data stream in PNG format.
+--
+--     [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+--
+--     [@dst@]: a data stream to save to.
+--
+--     [@closeio@]: if true, calls SDL_CloseIO() on @dst@ before returning, even in the case of an error.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_LoadPNG_IO', 'sDL_SavePNG'
+--
+--     [C declaration]: @SDL_SavePNG_IO@, defined at @SDL3\/SDL_surface.h 712:34@
+sDL_SavePNG_IO
+  :: BG.FunPtr
+       (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream -> BG.CBool -> IO BG.CBool)
+sDL_SavePNG_IO =
+  BG.unsafePerformIO hs_bindgen_784779331549b878
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SavePNG@
+foreign import ccall unsafe "hs_bindgen_3039586bfe90e597"
+  hs_bindgen_3039586bfe90e597_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SavePNG@
+hs_bindgen_3039586bfe90e597
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_3039586bfe90e597 =
+  BG.fromFFIType hs_bindgen_3039586bfe90e597_base
+
+{-# NOINLINE sDL_SavePNG #-}
+
+-- | Save a surface to a file in PNG format.
+--
+--     [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+--
+--     [@file@]: a file to save to.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_LoadPNG', 'sDL_SavePNG_IO'
+--
+--     [C declaration]: @SDL_SavePNG@, defined at @SDL3\/SDL_surface.h 730:34@
+sDL_SavePNG :: BG.FunPtr (BG.Ptr SDL_Surface -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SavePNG =
+  BG.unsafePerformIO hs_bindgen_3039586bfe90e597
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceRLE@
+foreign import ccall unsafe "hs_bindgen_dd401b9169c44976"
+  hs_bindgen_dd401b9169c44976_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceRLE@
+hs_bindgen_dd401b9169c44976 :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> BG.CBool -> IO BG.CBool))
+hs_bindgen_dd401b9169c44976 =
+  BG.fromFFIType hs_bindgen_dd401b9169c44976_base
+
+{-# NOINLINE sDL_SetSurfaceRLE #-}
+
+-- | Set the RLE acceleration hint for a surface.
+--
+--     If RLE is enabled, color key and alpha blending blits are much faster, but the surface must be locked before directly accessing the pixels.
+--
+--     [@surface@]: the 'SDL_Surface' structure to optimize.
+--
+--     [@enabled@]: true to enable RLE acceleration, false to disable it.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface', 'sDL_LockSurface', 'sDL_UnlockSurface'
+--
+--     [C declaration]: @SDL_SetSurfaceRLE@, defined at @SDL3\/SDL_surface.h 752:34@
+sDL_SetSurfaceRLE :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.CBool -> IO BG.CBool)
+sDL_SetSurfaceRLE =
+  BG.unsafePerformIO hs_bindgen_dd401b9169c44976
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SurfaceHasRLE@
+foreign import ccall unsafe "hs_bindgen_8957a6011d9f44f9"
+  hs_bindgen_8957a6011d9f44f9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SurfaceHasRLE@
+hs_bindgen_8957a6011d9f44f9 :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO BG.CBool))
+hs_bindgen_8957a6011d9f44f9 =
+  BG.fromFFIType hs_bindgen_8957a6011d9f44f9_base
+
+{-# NOINLINE sDL_SurfaceHasRLE #-}
+
+-- | Returns whether the surface is RLE enabled.
+--
+--     It is safe to pass a NULL @surface@ here; it will return false.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [Returns]: true if the surface is RLE enabled, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceRLE'
+--
+--     [C declaration]: @SDL_SurfaceHasRLE@, defined at @SDL3\/SDL_surface.h 768:34@
+sDL_SurfaceHasRLE :: BG.FunPtr (BG.Ptr SDL_Surface -> IO BG.CBool)
+sDL_SurfaceHasRLE =
+  BG.unsafePerformIO hs_bindgen_8957a6011d9f44f9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceColorKey@
+foreign import ccall unsafe "hs_bindgen_bb6a923e2cd243f7"
+  hs_bindgen_bb6a923e2cd243f7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceColorKey@
+hs_bindgen_bb6a923e2cd243f7
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> BG.CBool -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_bb6a923e2cd243f7 =
+  BG.fromFFIType hs_bindgen_bb6a923e2cd243f7_base
+
+{-# NOINLINE sDL_SetSurfaceColorKey #-}
+
+-- | Set the color key (transparent pixel) in a surface.
+--
+--     The color key defines a pixel value that will be treated as transparent in a blit. For example, one can use this to specify that cyan pixels should be considered transparent, and therefore not rendered.
+--
+--     It is a pixel of the format used by the surface, as generated by SDL_MapRGB().
+--
+--     [@surface@]: the 'SDL_Surface' structure to update.
+--
+--     [@enabled@]: true to enable color key, false to disable color key.
+--
+--     [@key@]: the transparent pixel.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorKey', 'sDL_SetSurfaceRLE', 'sDL_SurfaceHasColorKey'
+--
+--     [C declaration]: @SDL_SetSurfaceColorKey@, defined at @SDL3\/SDL_surface.h 795:34@
+sDL_SetSurfaceColorKey
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.CBool -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_SetSurfaceColorKey =
+  BG.unsafePerformIO hs_bindgen_bb6a923e2cd243f7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SurfaceHasColorKey@
+foreign import ccall unsafe "hs_bindgen_9cb1ca0717710e5a"
+  hs_bindgen_9cb1ca0717710e5a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SurfaceHasColorKey@
+hs_bindgen_9cb1ca0717710e5a :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO BG.CBool))
+hs_bindgen_9cb1ca0717710e5a =
+  BG.fromFFIType hs_bindgen_9cb1ca0717710e5a_base
+
+{-# NOINLINE sDL_SurfaceHasColorKey #-}
+
+-- | Returns whether the surface has a color key.
+--
+--     It is safe to pass a NULL @surface@ here; it will return false.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [Returns]: true if the surface has a color key, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceColorKey', 'sDL_GetSurfaceColorKey'
+--
+--     [C declaration]: @SDL_SurfaceHasColorKey@, defined at @SDL3\/SDL_surface.h 812:34@
+sDL_SurfaceHasColorKey :: BG.FunPtr (BG.Ptr SDL_Surface -> IO BG.CBool)
+sDL_SurfaceHasColorKey =
+  BG.unsafePerformIO hs_bindgen_9cb1ca0717710e5a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceColorKey@
+foreign import ccall unsafe "hs_bindgen_b8a872d97663bea2"
+  hs_bindgen_b8a872d97663bea2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceColorKey@
+hs_bindgen_b8a872d97663bea2
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_b8a872d97663bea2 =
+  BG.fromFFIType hs_bindgen_b8a872d97663bea2_base
+
+{-# NOINLINE sDL_GetSurfaceColorKey #-}
+
+-- | Get the color key (transparent pixel) for a surface.
+--
+--     The color key is a pixel of the format used by the surface, as generated by SDL_MapRGB().
+--
+--     If the surface doesn\'t have color key enabled this function returns false.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [@key@]: a pointer filled in with the transparent pixel.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceColorKey', 'sDL_SurfaceHasColorKey'
+--
+--     [C declaration]: @SDL_GetSurfaceColorKey@, defined at @SDL3\/SDL_surface.h 834:34@
+sDL_GetSurfaceColorKey
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_GetSurfaceColorKey =
+  BG.unsafePerformIO hs_bindgen_b8a872d97663bea2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceColorMod@
+foreign import ccall unsafe "hs_bindgen_d96bb8008d1b87a6"
+  hs_bindgen_d96bb8008d1b87a6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceColorMod@
+hs_bindgen_d96bb8008d1b87a6
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_d96bb8008d1b87a6 =
+  BG.fromFFIType hs_bindgen_d96bb8008d1b87a6_base
+
+{-# NOINLINE sDL_SetSurfaceColorMod #-}
+
+-- | Set an additional color value multiplied into blit operations.
+--
+--     When this surface is blitted, during the blit operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * (color \/ 255)@
+--
+--     [@surface@]: the 'SDL_Surface' structure to update.
+--
+--     [@r@]: the red color value multiplied into blit operations.
+--
+--     [@g@]: the green color value multiplied into blit operations.
+--
+--     [@b@]: the blue color value multiplied into blit operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorMod', 'sDL_SetSurfaceAlphaMod'
+--
+--     [C declaration]: @SDL_SetSurfaceColorMod@, defined at @SDL3\/SDL_surface.h 860:34@
+sDL_SetSurfaceColorMod
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO BG.CBool
+       )
+sDL_SetSurfaceColorMod =
+  BG.unsafePerformIO hs_bindgen_d96bb8008d1b87a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceColorMod@
+foreign import ccall unsafe "hs_bindgen_bc145b87021a07e6"
+  hs_bindgen_bc145b87021a07e6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceColorMod@
+hs_bindgen_bc145b87021a07e6
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_bc145b87021a07e6 =
+  BG.fromFFIType hs_bindgen_bc145b87021a07e6_base
+
+{-# NOINLINE sDL_GetSurfaceColorMod #-}
+
+-- | Get the additional color value multiplied into blit operations.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [@r@]: a pointer filled in with the current red color value.
+--
+--     [@g@]: a pointer filled in with the current green color value.
+--
+--     [@b@]: a pointer filled in with the current blue color value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceAlphaMod', 'sDL_SetSurfaceColorMod'
+--
+--     [C declaration]: @SDL_GetSurfaceColorMod@, defined at @SDL3\/SDL_surface.h 881:34@
+sDL_GetSurfaceColorMod
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO BG.CBool
+       )
+sDL_GetSurfaceColorMod =
+  BG.unsafePerformIO hs_bindgen_bc145b87021a07e6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceAlphaMod@
+foreign import ccall unsafe "hs_bindgen_44bc0c580740a2b4"
+  hs_bindgen_44bc0c580740a2b4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceAlphaMod@
+hs_bindgen_44bc0c580740a2b4
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool))
+hs_bindgen_44bc0c580740a2b4 =
+  BG.fromFFIType hs_bindgen_44bc0c580740a2b4_base
+
+{-# NOINLINE sDL_SetSurfaceAlphaMod #-}
+
+-- | Set an additional alpha value used in blit operations.
+--
+--     When this surface is blitted, during the blit operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * (alpha \/ 255)@
+--
+--     [@surface@]: the 'SDL_Surface' structure to update.
+--
+--     [@alpha@]: the alpha value multiplied into blit operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceAlphaMod', 'sDL_SetSurfaceColorMod'
+--
+--     [C declaration]: @SDL_SetSurfaceAlphaMod@, defined at @SDL3\/SDL_surface.h 904:34@
+sDL_SetSurfaceAlphaMod
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool)
+sDL_SetSurfaceAlphaMod =
+  BG.unsafePerformIO hs_bindgen_44bc0c580740a2b4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceAlphaMod@
+foreign import ccall unsafe "hs_bindgen_2f7b92e198b60348"
+  hs_bindgen_2f7b92e198b60348_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceAlphaMod@
+hs_bindgen_2f7b92e198b60348
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool))
+hs_bindgen_2f7b92e198b60348 =
+  BG.fromFFIType hs_bindgen_2f7b92e198b60348_base
+
+{-# NOINLINE sDL_GetSurfaceAlphaMod #-}
+
+-- | Get the additional alpha value used in blit operations.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [@alpha@]: a pointer filled in with the current alpha value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorMod', 'sDL_SetSurfaceAlphaMod'
+--
+--     [C declaration]: @SDL_GetSurfaceAlphaMod@, defined at @SDL3\/SDL_surface.h 921:34@
+sDL_GetSurfaceAlphaMod
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8 -> IO BG.CBool)
+sDL_GetSurfaceAlphaMod =
+  BG.unsafePerformIO hs_bindgen_2f7b92e198b60348
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceBlendMode@
+foreign import ccall unsafe "hs_bindgen_1abb9d9640e9f83b"
+  hs_bindgen_1abb9d9640e9f83b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceBlendMode@
+hs_bindgen_1abb9d9640e9f83b
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool))
+hs_bindgen_1abb9d9640e9f83b =
+  BG.fromFFIType hs_bindgen_1abb9d9640e9f83b_base
+
+{-# NOINLINE sDL_SetSurfaceBlendMode #-}
+
+-- | Set the blend mode used for blit operations.
+--
+--     To copy a surface to another surface (or texture) without blending with the existing data, the blendmode of the SOURCE surface should be set to @SDL_BLENDMODE_NONE@.
+--
+--     [@surface@]: the 'SDL_Surface' structure to update.
+--
+--     [@blendMode@]: the SDL_BlendMode to use for blit blending.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceBlendMode'
+--
+--     [C declaration]: @SDL_SetSurfaceBlendMode@, defined at @SDL3\/SDL_surface.h 942:34@
+sDL_SetSurfaceBlendMode
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool)
+sDL_SetSurfaceBlendMode =
+  BG.unsafePerformIO hs_bindgen_1abb9d9640e9f83b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceBlendMode@
+foreign import ccall unsafe "hs_bindgen_ddc08ab588ab04b9"
+  hs_bindgen_ddc08ab588ab04b9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceBlendMode@
+hs_bindgen_ddc08ab588ab04b9
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool))
+hs_bindgen_ddc08ab588ab04b9 =
+  BG.fromFFIType hs_bindgen_ddc08ab588ab04b9_base
+
+{-# NOINLINE sDL_GetSurfaceBlendMode #-}
+
+-- | Get the blend mode used for blit operations.
+--
+--     [@surface@]: the 'SDL_Surface' structure to query.
+--
+--     [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceBlendMode'
+--
+--     [C declaration]: @SDL_GetSurfaceBlendMode@, defined at @SDL3\/SDL_surface.h 958:34@
+sDL_GetSurfaceBlendMode
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode -> IO BG.CBool)
+sDL_GetSurfaceBlendMode =
+  BG.unsafePerformIO hs_bindgen_ddc08ab588ab04b9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceClipRect@
+foreign import ccall unsafe "hs_bindgen_ba59ae52e07cd998"
+  hs_bindgen_ba59ae52e07cd998_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_SetSurfaceClipRect@
+hs_bindgen_ba59ae52e07cd998
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Surface -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_ba59ae52e07cd998 =
+  BG.fromFFIType hs_bindgen_ba59ae52e07cd998_base
+
+{-# NOINLINE sDL_SetSurfaceClipRect #-}
+
+-- | Set the clipping rectangle for a surface.
+--
+--     When @surface@ is the destination of a blit, only the area within the clip rectangle is drawn into.
+--
+--     Note that blits are automatically clipped to the edges of the source and destination surfaces.
+--
+--     [@surface@]: the 'SDL_Surface' structure to be clipped.
+--
+--     [@rect@]: the SDL_Rect structure representing the clipping rectangle, or NULL to disable clipping.
+--
+--     [Returns]: true if the rectangle intersects the surface, otherwise false and blits will be completely clipped.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceClipRect'
+--
+--     [C declaration]: @SDL_SetSurfaceClipRect@, defined at @SDL3\/SDL_surface.h 982:34@
+sDL_SetSurfaceClipRect
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_SetSurfaceClipRect =
+  BG.unsafePerformIO hs_bindgen_ba59ae52e07cd998
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceClipRect@
+foreign import ccall unsafe "hs_bindgen_7d6c81cd63182c7e"
+  hs_bindgen_7d6c81cd63182c7e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_GetSurfaceClipRect@
+hs_bindgen_7d6c81cd63182c7e
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_7d6c81cd63182c7e =
+  BG.fromFFIType hs_bindgen_7d6c81cd63182c7e_base
+
+{-# NOINLINE sDL_GetSurfaceClipRect #-}
+
+-- | Get the clipping rectangle for a surface.
+--
+--     When @surface@ is the destination of a blit, only the area within the clip rectangle is drawn into.
+--
+--     [@surface@]: the 'SDL_Surface' structure representing the surface to be clipped.
+--
+--     [@rect@]: an SDL_Rect structure filled in with the clipping rectangle for the surface.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceClipRect'
+--
+--     [C declaration]: @SDL_GetSurfaceClipRect@, defined at @SDL3\/SDL_surface.h 1004:34@
+sDL_GetSurfaceClipRect
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_GetSurfaceClipRect =
+  BG.unsafePerformIO hs_bindgen_7d6c81cd63182c7e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_FlipSurface@
+foreign import ccall unsafe "hs_bindgen_3f1f98e8e0b7167f"
+  hs_bindgen_3f1f98e8e0b7167f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_FlipSurface@
+hs_bindgen_3f1f98e8e0b7167f :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> SDL_FlipMode -> IO BG.CBool))
+hs_bindgen_3f1f98e8e0b7167f =
+  BG.fromFFIType hs_bindgen_3f1f98e8e0b7167f_base
+
+{-# NOINLINE sDL_FlipSurface #-}
+
+-- | Flip a surface vertically or horizontally.
+--
+--     [@surface@]: the surface to flip.
+--
+--     [@flip@]: the direction to flip.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_FlipSurface@, defined at @SDL3\/SDL_surface.h 1019:34@
+sDL_FlipSurface :: BG.FunPtr (BG.Ptr SDL_Surface -> SDL_FlipMode -> IO BG.CBool)
+sDL_FlipSurface =
+  BG.unsafePerformIO hs_bindgen_3f1f98e8e0b7167f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_RotateSurface@
+foreign import ccall unsafe "hs_bindgen_bc3ef53813125bc9"
+  hs_bindgen_bc3ef53813125bc9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_RotateSurface@
+hs_bindgen_bc3ef53813125bc9
+  :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> BG.CFloat -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_bc3ef53813125bc9 =
+  BG.fromFFIType hs_bindgen_bc3ef53813125bc9_base
+
+{-# NOINLINE sDL_RotateSurface #-}
+
+-- | Return a copy of a surface rotated clockwise a number of degrees.
+--
+--     The angle of rotation can be negative for counter-clockwise rotation.
+--
+--     When the rotation isn\'t a multiple of 90 degrees, the resulting surface is larger than the original, with the background filled in with the colorkey, if available, or RGBA 255\/255\/255\/0 if not.
+--
+--     If @surface@ has the SDL_PROP_SURFACE_ROTATION_FLOAT property set on it, the new copy will have the adjusted value set: if the rotation property is 90 and @angle@ was 30, the new surface will have a property value of 60 (that is: to be upright vs gravity, this surface needs to rotate 60 more degrees). However, note that further rotations on the new surface in this example will produce unexpected results, since the image will have resized and padded to accommodate the not-90 degree angle.
+--
+--     [@surface@]: the surface to rotate.
+--
+--     [@angle@]: the rotation angle, in degrees.
+--
+--     [Returns]: a rotated copy of the surface or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_RotateSurface@, defined at @SDL3\/SDL_surface.h 1048:43@
+sDL_RotateSurface :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.CFloat -> IO (BG.Ptr SDL_Surface))
+sDL_RotateSurface =
+  BG.unsafePerformIO hs_bindgen_bc3ef53813125bc9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_DuplicateSurface@
+foreign import ccall unsafe "hs_bindgen_d6a7bd90e75ca1f4"
+  hs_bindgen_d6a7bd90e75ca1f4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_DuplicateSurface@
+hs_bindgen_d6a7bd90e75ca1f4 :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_d6a7bd90e75ca1f4 =
+  BG.fromFFIType hs_bindgen_d6a7bd90e75ca1f4_base
+
+{-# NOINLINE sDL_DuplicateSurface #-}
+
+-- | Creates a new surface identical to the existing surface.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     The returned surface should be freed with @SDL_DestroySurface()@.
+--
+--     [@surface@]: the surface to duplicate.
+--
+--     [Returns]: a copy of the surface or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_DuplicateSurface@, defined at @SDL3\/SDL_surface.h 1069:43@
+sDL_DuplicateSurface :: BG.FunPtr (BG.Ptr SDL_Surface -> IO (BG.Ptr SDL_Surface))
+sDL_DuplicateSurface =
+  BG.unsafePerformIO hs_bindgen_d6a7bd90e75ca1f4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ScaleSurface@
+foreign import ccall unsafe "hs_bindgen_3c8c8f89fa471eaf"
+  hs_bindgen_3c8c8f89fa471eaf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ScaleSurface@
+hs_bindgen_3c8c8f89fa471eaf
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Surface -> BG.CInt -> BG.CInt -> SDL_ScaleMode -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_3c8c8f89fa471eaf =
+  BG.fromFFIType hs_bindgen_3c8c8f89fa471eaf_base
+
+{-# NOINLINE sDL_ScaleSurface #-}
+
+-- | Creates a new surface identical to the existing surface, scaled to the desired size.
+--
+--     The returned surface should be freed with @SDL_DestroySurface()@.
+--
+--     [@surface@]: the surface to duplicate and scale.
+--
+--     [@width@]: the width of the new surface.
+--
+--     [@height@]: the height of the new surface.
+--
+--     [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+--
+--     [Returns]: a copy of the surface or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_ScaleSurface@, defined at @SDL3\/SDL_surface.h 1091:43@
+sDL_ScaleSurface
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.CInt -> BG.CInt -> SDL_ScaleMode -> IO (BG.Ptr SDL_Surface))
+sDL_ScaleSurface =
+  BG.unsafePerformIO hs_bindgen_3c8c8f89fa471eaf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertSurface@
+foreign import ccall unsafe "hs_bindgen_02efcc9cf840132b"
+  hs_bindgen_02efcc9cf840132b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertSurface@
+hs_bindgen_02efcc9cf840132b
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Surface -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat -> IO (BG.Ptr SDL_Surface)))
+hs_bindgen_02efcc9cf840132b =
+  BG.fromFFIType hs_bindgen_02efcc9cf840132b_base
+
+{-# NOINLINE sDL_ConvertSurface #-}
+
+-- | Copy an existing surface to a new surface of the specified format.
+--
+--     This function is used to optimize images for faster /repeat/ blitting. This is accomplished by converting the original and storing the result as a new surface. The new, optimized surface can then be used as the source for future blits, making them faster.
+--
+--     If you are converting to an indexed surface and want to map colors to a palette, you can use @SDL_ConvertSurfaceAndColorspace()@ instead.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     [@surface@]: the existing 'SDL_Surface' structure to convert.
+--
+--     [@format@]: the new pixel format.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertSurfaceAndColorspace', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_ConvertSurface@, defined at @SDL3\/SDL_surface.h 1120:43@
+sDL_ConvertSurface
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat -> IO (BG.Ptr SDL_Surface))
+sDL_ConvertSurface =
+  BG.unsafePerformIO hs_bindgen_02efcc9cf840132b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertSurfaceAndColorspace@
+foreign import ccall unsafe "hs_bindgen_d71b405fb2c63769"
+  hs_bindgen_d71b405fb2c63769_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertSurfaceAndColorspace@
+hs_bindgen_d71b405fb2c63769
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+             -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+             -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+             -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+             -> IO (BG.Ptr SDL_Surface)
+           )
+       )
+hs_bindgen_d71b405fb2c63769 =
+  BG.fromFFIType hs_bindgen_d71b405fb2c63769_base
+
+{-# NOINLINE sDL_ConvertSurfaceAndColorspace #-}
+
+-- | Copy an existing surface to a new surface of the specified format and colorspace.
+--
+--     This function converts an existing surface to a new format and colorspace and returns the new surface. This will perform any pixel format and colorspace conversion needed.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     [@surface@]: the existing 'SDL_Surface' structure to convert.
+--
+--     [@format@]: the new pixel format.
+--
+--     [@palette@]: an optional palette to use for indexed formats, may be NULL.
+--
+--     [@colorspace@]: the new colorspace.
+--
+--     [@props@]: an SDL_PropertiesID with additional color properties, or 0.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertSurface', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_ConvertSurfaceAndColorspace@, defined at @SDL3\/SDL_surface.h 1149:43@
+sDL_ConvertSurfaceAndColorspace
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+         -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+         -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+         -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+         -> IO (BG.Ptr SDL_Surface)
+       )
+sDL_ConvertSurfaceAndColorspace =
+  BG.unsafePerformIO hs_bindgen_d71b405fb2c63769
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertPixels@
+foreign import ccall unsafe "hs_bindgen_57fab76de82ac9cf"
+  hs_bindgen_57fab76de82ac9cf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertPixels@
+hs_bindgen_57fab76de82ac9cf
+  :: IO
+       ( BG.FunPtr
+           ( BG.CInt
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+             -> PtrConst.PtrConst BG.Void
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+             -> BG.Ptr BG.Void
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_57fab76de82ac9cf =
+  BG.fromFFIType hs_bindgen_57fab76de82ac9cf_base
+
+{-# NOINLINE sDL_ConvertPixels #-}
+
+-- | Copy a block of pixels of one format to another format.
+--
+--     [@width@]: the width of the block to copy, in pixels.
+--
+--     [@height@]: the height of the block to copy, in pixels.
+--
+--     [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+--
+--     [@src@]: a pointer to the source pixels.
+--
+--     [@src_pitch@]: the pitch of the source pixels, in bytes.
+--
+--     [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+--
+--     [@dst@]: a pointer to be filled in with new pixel data.
+--
+--     [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertPixelsAndColorspace'
+--
+--     [C declaration]: @SDL_ConvertPixels@, defined at @SDL3\/SDL_surface.h 1173:34@
+sDL_ConvertPixels
+  :: BG.FunPtr
+       ( BG.CInt
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+         -> PtrConst.PtrConst BG.Void
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+         -> BG.Ptr BG.Void
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_ConvertPixels =
+  BG.unsafePerformIO hs_bindgen_57fab76de82ac9cf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertPixelsAndColorspace@
+foreign import ccall unsafe "hs_bindgen_8ab04e66f663ce08"
+  hs_bindgen_8ab04e66f663ce08_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ConvertPixelsAndColorspace@
+hs_bindgen_8ab04e66f663ce08
+  :: IO
+       ( BG.FunPtr
+           ( BG.CInt
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+             -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+             -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+             -> PtrConst.PtrConst BG.Void
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+             -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+             -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+             -> BG.Ptr BG.Void
+             -> BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_8ab04e66f663ce08 =
+  BG.fromFFIType hs_bindgen_8ab04e66f663ce08_base
+
+{-# NOINLINE sDL_ConvertPixelsAndColorspace #-}
+
+-- | Copy a block of pixels of one format and colorspace to another format and colorspace.
+--
+--     [@width@]: the width of the block to copy, in pixels.
+--
+--     [@height@]: the height of the block to copy, in pixels.
+--
+--     [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+--
+--     [@src_colorspace@]: an SDL_Colorspace value describing the colorspace of the @src@ pixels.
+--
+--     [@src_properties@]: an SDL_PropertiesID with additional source color properties, or 0.
+--
+--     [@src@]: a pointer to the source pixels.
+--
+--     [@src_pitch@]: the pitch of the source pixels, in bytes.
+--
+--     [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+--
+--     [@dst_colorspace@]: an SDL_Colorspace value describing the colorspace of the @dst@ pixels.
+--
+--     [@dst_properties@]: an SDL_PropertiesID with additional destination color properties, or 0.
+--
+--     [@dst@]: a pointer to be filled in with new pixel data.
+--
+--     [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertPixels'
+--
+--     [C declaration]: @SDL_ConvertPixelsAndColorspace@, defined at @SDL3\/SDL_surface.h 1206:34@
+sDL_ConvertPixelsAndColorspace
+  :: BG.FunPtr
+       ( BG.CInt
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+         -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+         -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+         -> PtrConst.PtrConst BG.Void
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+         -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+         -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+         -> BG.Ptr BG.Void
+         -> BG.CInt
+         -> IO BG.CBool
+       )
+sDL_ConvertPixelsAndColorspace =
+  BG.unsafePerformIO hs_bindgen_8ab04e66f663ce08
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_PremultiplyAlpha@
+foreign import ccall unsafe "hs_bindgen_fb56322259d07073"
+  hs_bindgen_fb56322259d07073_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_PremultiplyAlpha@
+hs_bindgen_fb56322259d07073
+  :: IO
+       ( BG.FunPtr
+           ( BG.CInt
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+             -> PtrConst.PtrConst BG.Void
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+             -> BG.Ptr BG.Void
+             -> BG.CInt
+             -> BG.CBool
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_fb56322259d07073 =
+  BG.fromFFIType hs_bindgen_fb56322259d07073_base
+
+{-# NOINLINE sDL_PremultiplyAlpha #-}
+
+-- | Premultiply the alpha on a block of pixels.
+--
+--     This is safe to use with src == dst, but not for other overlapping areas.
+--
+--     [@width@]: the width of the block to convert, in pixels.
+--
+--     [@height@]: the height of the block to convert, in pixels.
+--
+--     [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+--
+--     [@src@]: a pointer to the source pixels.
+--
+--     [@src_pitch@]: the pitch of the source pixels, in bytes.
+--
+--     [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+--
+--     [@dst@]: a pointer to be filled in with premultiplied pixel data.
+--
+--     [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+--
+--     [@linear@]: true to convert from sRGB to linear space for the alpha multiplication, false to do multiplication in sRGB space.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PremultiplyAlpha@, defined at @SDL3\/SDL_surface.h 1232:34@
+sDL_PremultiplyAlpha
+  :: BG.FunPtr
+       ( BG.CInt
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+         -> PtrConst.PtrConst BG.Void
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+         -> BG.Ptr BG.Void
+         -> BG.CInt
+         -> BG.CBool
+         -> IO BG.CBool
+       )
+sDL_PremultiplyAlpha =
+  BG.unsafePerformIO hs_bindgen_fb56322259d07073
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_PremultiplySurfaceAlpha@
+foreign import ccall unsafe "hs_bindgen_6d7894c44ea2dfc7"
+  hs_bindgen_6d7894c44ea2dfc7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_PremultiplySurfaceAlpha@
+hs_bindgen_6d7894c44ea2dfc7 :: IO (BG.FunPtr (BG.Ptr SDL_Surface -> BG.CBool -> IO BG.CBool))
+hs_bindgen_6d7894c44ea2dfc7 =
+  BG.fromFFIType hs_bindgen_6d7894c44ea2dfc7_base
+
+{-# NOINLINE sDL_PremultiplySurfaceAlpha #-}
+
+-- | Premultiply the alpha in a surface.
+--
+--     This is safe to use with src == dst, but not for other overlapping areas.
+--
+--     [@surface@]: the surface to modify.
+--
+--     [@linear@]: true to convert from sRGB to linear space for the alpha multiplication, false to do multiplication in sRGB space.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PremultiplySurfaceAlpha@, defined at @SDL3\/SDL_surface.h 1250:34@
+sDL_PremultiplySurfaceAlpha :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.CBool -> IO BG.CBool)
+sDL_PremultiplySurfaceAlpha =
+  BG.unsafePerformIO hs_bindgen_6d7894c44ea2dfc7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ClearSurface@
+foreign import ccall unsafe "hs_bindgen_3eb9b7722a04b8f8"
+  hs_bindgen_3eb9b7722a04b8f8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ClearSurface@
+hs_bindgen_3eb9b7722a04b8f8
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Surface -> BG.CFloat -> BG.CFloat -> BG.CFloat -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_3eb9b7722a04b8f8 =
+  BG.fromFFIType hs_bindgen_3eb9b7722a04b8f8_base
+
+{-# NOINLINE sDL_ClearSurface #-}
+
+-- | Clear a surface with a specific color, with floating point precision.
+--
+--     This function handles all surface formats, and ignores any clip rectangle.
+--
+--     If the surface is YUV, the color is assumed to be in the sRGB colorspace, otherwise the color is assumed to be in the colorspace of the surface.
+--
+--     [@surface@]: the 'SDL_Surface' to clear.
+--
+--     [@r@]: the red component of the pixel, normally in the range 0-1.
+--
+--     [@g@]: the green component of the pixel, normally in the range 0-1.
+--
+--     [@b@]: the blue component of the pixel, normally in the range 0-1.
+--
+--     [@a@]: the alpha component of the pixel, normally in the range 0-1.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ClearSurface@, defined at @SDL3\/SDL_surface.h 1273:34@
+sDL_ClearSurface
+  :: BG.FunPtr (BG.Ptr SDL_Surface -> BG.CFloat -> BG.CFloat -> BG.CFloat -> BG.CFloat -> IO BG.CBool)
+sDL_ClearSurface =
+  BG.unsafePerformIO hs_bindgen_3eb9b7722a04b8f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_FillSurfaceRect@
+foreign import ccall unsafe "hs_bindgen_d466d8dde16f547b"
+  hs_bindgen_d466d8dde16f547b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_FillSurfaceRect@
+hs_bindgen_d466d8dde16f547b
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_d466d8dde16f547b =
+  BG.fromFFIType hs_bindgen_d466d8dde16f547b_base
+
+{-# NOINLINE sDL_FillSurfaceRect #-}
+
+-- | Perform a fast fill of a rectangle with a specific color.
+--
+--     @color@ should be a pixel of the format used by the surface, and can be generated by SDL_MapRGB() or SDL_MapRGBA(). If the color value contains an alpha component then the destination is simply filled with that alpha information, no blending takes place.
+--
+--     If there is a clip rectangle set on the destination (set via @SDL_SetSurfaceClipRect()@), then this function will fill based on the intersection of the clip rectangle and @rect@.
+--
+--     [@dst@]: the 'SDL_Surface' structure that is the drawing target.
+--
+--     [@rect@]: the SDL_Rect structure representing the rectangle to fill, or NULL to fill the entire surface.
+--
+--     [@color@]: the color to fill with.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FillSurfaceRects'
+--
+--     [C declaration]: @SDL_FillSurfaceRect@, defined at @SDL3\/SDL_surface.h 1301:34@
+sDL_FillSurfaceRect
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_FillSurfaceRect =
+  BG.unsafePerformIO hs_bindgen_d466d8dde16f547b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_FillSurfaceRects@
+foreign import ccall unsafe "hs_bindgen_b0bc5bc8b57e73e3"
+  hs_bindgen_b0bc5bc8b57e73e3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_FillSurfaceRects@
+hs_bindgen_b0bc5bc8b57e73e3
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_b0bc5bc8b57e73e3 =
+  BG.fromFFIType hs_bindgen_b0bc5bc8b57e73e3_base
+
+{-# NOINLINE sDL_FillSurfaceRects #-}
+
+-- | Perform a fast fill of a set of rectangles with a specific color.
+--
+--     @color@ should be a pixel of the format used by the surface, and can be generated by SDL_MapRGB() or SDL_MapRGBA(). If the color value contains an alpha component then the destination is simply filled with that alpha information, no blending takes place.
+--
+--     If there is a clip rectangle set on the destination (set via @SDL_SetSurfaceClipRect()@), then this function will fill based on the intersection of the clip rectangle and @rect@.
+--
+--     [@dst@]: the 'SDL_Surface' structure that is the drawing target.
+--
+--     [@rects@]: an array of SDL_Rects representing the rectangles to fill.
+--
+--     [@count@]: the number of rectangles in the array.
+--
+--     [@color@]: the color to fill with.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FillSurfaceRect'
+--
+--     [C declaration]: @SDL_FillSurfaceRects@, defined at @SDL3\/SDL_surface.h 1329:34@
+sDL_FillSurfaceRects
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO BG.CBool
+       )
+sDL_FillSurfaceRects =
+  BG.unsafePerformIO hs_bindgen_b0bc5bc8b57e73e3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurface@
+foreign import ccall unsafe "hs_bindgen_a29859c35fa4ca59"
+  hs_bindgen_a29859c35fa4ca59_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurface@
+hs_bindgen_a29859c35fa4ca59
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_a29859c35fa4ca59 =
+  BG.fromFFIType hs_bindgen_a29859c35fa4ca59_base
+
+{-# NOINLINE sDL_BlitSurface #-}
+
+-- | Performs a fast blit from the source surface to the destination surface with clipping.
+--
+--     If either @srcrect@ or @dstrect@ are NULL, the entire surface (@src@ or @dst@) is copied while ensuring clipping to @dst->clip_rect@.
+--
+--     The blit function should not be called on a locked surface.
+--
+--     The blit semantics for surfaces with and without blending and colorkey are defined as follows:
+--
+--     @
+--      RGBA->RGB:
+--        Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source alpha-channel and per-surface alpha)
+--         SDL_SRCCOLORKEY ignored.
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB.
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         RGB values of the source color key, ignoring alpha in the
+--         comparison.
+--
+--     RGB->RGBA:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source per-surface alpha)
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB, set destination alpha to source per-surface alpha value.
+--       both:
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         source color key.
+--
+--     RGBA->RGBA:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source alpha-channel and per-surface alpha)
+--         SDL_SRCCOLORKEY ignored.
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy all of RGBA to the destination.
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         RGB values of the source color key, ignoring alpha in the
+--         comparison.
+--
+--     RGB->RGB:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source per-surface alpha)
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB.
+--       both:
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         source color key.
+--     @
+--
+--     [@src@]: the 'SDL_Surface' structure to be copied from.
+--
+--     [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+--
+--     [@dst@]: the 'SDL_Surface' structure that is the blit target.
+--
+--     [@dstrect@]: the SDL_Rect structure representing the x and y position in the destination surface, or NULL for (0,0). The width and height are ignored, and are copied from @srcrect@. If you want a specific width and height, you should use @SDL_BlitSurfaceScaled()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurfaceScaled'
+--
+--     [C declaration]: @SDL_BlitSurface@, defined at @SDL3\/SDL_surface.h 1402:34@
+sDL_BlitSurface
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> IO BG.CBool
+       )
+sDL_BlitSurface =
+  BG.unsafePerformIO hs_bindgen_a29859c35fa4ca59
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceUnchecked@
+foreign import ccall unsafe "hs_bindgen_3f540dd5f5c2d037"
+  hs_bindgen_3f540dd5f5c2d037_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceUnchecked@
+hs_bindgen_3f540dd5f5c2d037
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_3f540dd5f5c2d037 =
+  BG.fromFFIType hs_bindgen_3f540dd5f5c2d037_base
+
+{-# NOINLINE sDL_BlitSurfaceUnchecked #-}
+
+-- | Perform low-level surface blitting only.
+--
+--     This is a semi-private blit function and it performs low-level surface blitting, assuming the input rectangles have already been clipped.
+--
+--     [@src@]: the 'SDL_Surface' structure to be copied from.
+--
+--     [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, may not be NULL.
+--
+--     [@dst@]: the 'SDL_Surface' structure that is the blit target.
+--
+--     [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, may not be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceUnchecked@, defined at @SDL3\/SDL_surface.h 1426:34@
+sDL_BlitSurfaceUnchecked
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> IO BG.CBool
+       )
+sDL_BlitSurfaceUnchecked =
+  BG.unsafePerformIO hs_bindgen_3f540dd5f5c2d037
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceScaled@
+foreign import ccall unsafe "hs_bindgen_9a9b4e0ef4c33fb3"
+  hs_bindgen_9a9b4e0ef4c33fb3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceScaled@
+hs_bindgen_9a9b4e0ef4c33fb3
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> SDL_ScaleMode
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_9a9b4e0ef4c33fb3 =
+  BG.fromFFIType hs_bindgen_9a9b4e0ef4c33fb3_base
+
+{-# NOINLINE sDL_BlitSurfaceScaled #-}
+
+-- | Perform a scaled blit to a destination surface, which may be of a different format.
+--
+--     [@src@]: the 'SDL_Surface' structure to be copied from.
+--
+--     [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+--
+--     [@dst@]: the 'SDL_Surface' structure that is the blit target.
+--
+--     [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire destination surface.
+--
+--     [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceScaled@, defined at @SDL3\/SDL_surface.h 1450:34@
+sDL_BlitSurfaceScaled
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> SDL_ScaleMode
+         -> IO BG.CBool
+       )
+sDL_BlitSurfaceScaled =
+  BG.unsafePerformIO hs_bindgen_9a9b4e0ef4c33fb3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceUncheckedScaled@
+foreign import ccall unsafe "hs_bindgen_4d0c17a14d7334d5"
+  hs_bindgen_4d0c17a14d7334d5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceUncheckedScaled@
+hs_bindgen_4d0c17a14d7334d5
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> SDL_ScaleMode
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_4d0c17a14d7334d5 =
+  BG.fromFFIType hs_bindgen_4d0c17a14d7334d5_base
+
+{-# NOINLINE sDL_BlitSurfaceUncheckedScaled #-}
+
+-- | Perform low-level surface scaled blitting only.
+--
+--     This is a semi-private function and it performs low-level surface blitting, assuming the input rectangles have already been clipped.
+--
+--     [@src@]: the 'SDL_Surface' structure to be copied from.
+--
+--     [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, may not be NULL.
+--
+--     [@dst@]: the 'SDL_Surface' structure that is the blit target.
+--
+--     [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, may not be NULL.
+--
+--     [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurfaceScaled'
+--
+--     [C declaration]: @SDL_BlitSurfaceUncheckedScaled@, defined at @SDL3\/SDL_surface.h 1475:34@
+sDL_BlitSurfaceUncheckedScaled
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> SDL_ScaleMode
+         -> IO BG.CBool
+       )
+sDL_BlitSurfaceUncheckedScaled =
+  BG.unsafePerformIO hs_bindgen_4d0c17a14d7334d5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_StretchSurface@
+foreign import ccall unsafe "hs_bindgen_1a9d00d4cf3623eb"
+  hs_bindgen_1a9d00d4cf3623eb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_StretchSurface@
+hs_bindgen_1a9d00d4cf3623eb
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> SDL_ScaleMode
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_1a9d00d4cf3623eb =
+  BG.fromFFIType hs_bindgen_1a9d00d4cf3623eb_base
+
+{-# NOINLINE sDL_StretchSurface #-}
+
+-- | Perform a stretched pixel copy from one surface to another.
+--
+--     [@src@]: the 'SDL_Surface' structure to be copied from.
+--
+--     [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+--
+--     [@dst@]: the 'SDL_Surface' structure that is the blit target.
+--
+--     [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire destination surface.
+--
+--     [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_BlitSurfaceScaled'
+--
+--     [C declaration]: @SDL_StretchSurface@, defined at @SDL3\/SDL_surface.h 1498:34@
+sDL_StretchSurface
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> SDL_ScaleMode
+         -> IO BG.CBool
+       )
+sDL_StretchSurface =
+  BG.unsafePerformIO hs_bindgen_1a9d00d4cf3623eb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceTiled@
+foreign import ccall unsafe "hs_bindgen_215dfb2882cacc76"
+  hs_bindgen_215dfb2882cacc76_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceTiled@
+hs_bindgen_215dfb2882cacc76
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_215dfb2882cacc76 =
+  BG.fromFFIType hs_bindgen_215dfb2882cacc76_base
+
+{-# NOINLINE sDL_BlitSurfaceTiled #-}
+
+-- | Perform a tiled blit to a destination surface, which may be of a different format.
+--
+--     The pixels in @srcrect@ will be repeated as many times as needed to completely fill @dstrect@.
+--
+--     [@src@]: the 'SDL_Surface' structure to be copied from.
+--
+--     [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+--
+--     [@dst@]: the 'SDL_Surface' structure that is the blit target.
+--
+--     [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceTiled@, defined at @SDL3\/SDL_surface.h 1523:34@
+sDL_BlitSurfaceTiled
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> IO BG.CBool
+       )
+sDL_BlitSurfaceTiled =
+  BG.unsafePerformIO hs_bindgen_215dfb2882cacc76
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceTiledWithScale@
+foreign import ccall unsafe "hs_bindgen_c33eb3f53084c8a3"
+  hs_bindgen_c33eb3f53084c8a3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurfaceTiledWithScale@
+hs_bindgen_c33eb3f53084c8a3
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.CFloat
+             -> SDL_ScaleMode
+             -> BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_c33eb3f53084c8a3 =
+  BG.fromFFIType hs_bindgen_c33eb3f53084c8a3_base
+
+{-# NOINLINE sDL_BlitSurfaceTiledWithScale #-}
+
+-- | Perform a scaled and tiled blit to a destination surface, which may be of a different format.
+--
+--     The pixels in @srcrect@ will be scaled and repeated as many times as needed to completely fill @dstrect@.
+--
+--     [@src@]: the 'SDL_Surface' structure to be copied from.
+--
+--     [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+--
+--     [@scale@]: the scale used to transform srcrect into the destination rectangle, e.g. a 32x32 texture with a scale of 2 would fill 64x64 tiles.
+--
+--     [@scaleMode@]: scale algorithm to be used.
+--
+--     [@dst@]: the 'SDL_Surface' structure that is the blit target.
+--
+--     [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceTiledWithScale@, defined at @SDL3\/SDL_surface.h 1552:34@
+sDL_BlitSurfaceTiledWithScale
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.CFloat
+         -> SDL_ScaleMode
+         -> BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> IO BG.CBool
+       )
+sDL_BlitSurfaceTiledWithScale =
+  BG.unsafePerformIO hs_bindgen_c33eb3f53084c8a3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurface9Grid@
+foreign import ccall unsafe "hs_bindgen_34b06f5d5e4b0b97"
+  hs_bindgen_34b06f5d5e4b0b97_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_BlitSurface9Grid@
+hs_bindgen_34b06f5d5e4b0b97
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.CFloat
+             -> SDL_ScaleMode
+             -> BG.Ptr SDL_Surface
+             -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_34b06f5d5e4b0b97 =
+  BG.fromFFIType hs_bindgen_34b06f5d5e4b0b97_base
+
+{-# NOINLINE sDL_BlitSurface9Grid #-}
+
+-- | Perform a scaled blit using the 9-grid algorithm to a destination surface, which may be of a different format.
+--
+--     The pixels in the source surface are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then stretched into place to cover the remaining destination rectangle.
+--
+--     [@src@]: the 'SDL_Surface' structure to be copied from.
+--
+--     [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire surface.
+--
+--     [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+--
+--     [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+--
+--     [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+--
+--     [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+--
+--     [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled blit.
+--
+--     [@scaleMode@]: scale algorithm to be used.
+--
+--     [@dst@]: the 'SDL_Surface' structure that is the blit target.
+--
+--     [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurface9Grid@, defined at @SDL3\/SDL_surface.h 1588:34@
+sDL_BlitSurface9Grid
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.CFloat
+         -> SDL_ScaleMode
+         -> BG.Ptr SDL_Surface
+         -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+         -> IO BG.CBool
+       )
+sDL_BlitSurface9Grid =
+  BG.unsafePerformIO hs_bindgen_34b06f5d5e4b0b97
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_MapSurfaceRGB@
+foreign import ccall unsafe "hs_bindgen_22cd4dcdb87e7f1a"
+  hs_bindgen_22cd4dcdb87e7f1a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_MapSurfaceRGB@
+hs_bindgen_22cd4dcdb87e7f1a
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+           )
+       )
+hs_bindgen_22cd4dcdb87e7f1a =
+  BG.fromFFIType hs_bindgen_22cd4dcdb87e7f1a_base
+
+{-# NOINLINE sDL_MapSurfaceRGB #-}
+
+-- | Map an RGB triple to an opaque pixel value for a surface.
+--
+--     This function maps the RGB color value to the specified pixel format and returns the pixel value best approximating the given RGB color value for the given pixel format.
+--
+--     If the surface has a palette, the index of the closest matching color in the palette will be returned.
+--
+--     If the surface pixel format has an alpha component it will be returned as all 1 bits (fully opaque).
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [@surface@]: the surface to use for the pixel format and palette.
+--
+--     [@r@]: the red component of the pixel in the range 0-255.
+--
+--     [@g@]: the green component of the pixel in the range 0-255.
+--
+--     [@b@]: the blue component of the pixel in the range 0-255.
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MapSurfaceRGBA'
+--
+--     [C declaration]: @SDL_MapSurfaceRGB@, defined at @SDL3\/SDL_surface.h 1621:36@
+sDL_MapSurfaceRGB
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+       )
+sDL_MapSurfaceRGB =
+  BG.unsafePerformIO hs_bindgen_22cd4dcdb87e7f1a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_MapSurfaceRGBA@
+foreign import ccall unsafe "hs_bindgen_0a9db974db6877bb"
+  hs_bindgen_0a9db974db6877bb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_MapSurfaceRGBA@
+hs_bindgen_0a9db974db6877bb
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+           )
+       )
+hs_bindgen_0a9db974db6877bb =
+  BG.fromFFIType hs_bindgen_0a9db974db6877bb_base
+
+{-# NOINLINE sDL_MapSurfaceRGBA #-}
+
+-- | Map an RGBA quadruple to a pixel value for a surface.
+--
+--     This function maps the RGBA color value to the specified pixel format and returns the pixel value best approximating the given RGBA color value for the given pixel format.
+--
+--     If the surface pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).
+--
+--     If the surface has a palette, the index of the closest matching color in the palette will be returned.
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [@surface@]: the surface to use for the pixel format and palette.
+--
+--     [@r@]: the red component of the pixel in the range 0-255.
+--
+--     [@g@]: the green component of the pixel in the range 0-255.
+--
+--     [@b@]: the blue component of the pixel in the range 0-255.
+--
+--     [@a@]: the alpha component of the pixel in the range 0-255.
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MapSurfaceRGB'
+--
+--     [C declaration]: @SDL_MapSurfaceRGBA@, defined at @SDL3\/SDL_surface.h 1655:36@
+sDL_MapSurfaceRGBA
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+       )
+sDL_MapSurfaceRGBA =
+  BG.unsafePerformIO hs_bindgen_0a9db974db6877bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ReadSurfacePixel@
+foreign import ccall unsafe "hs_bindgen_621010702d3faa18"
+  hs_bindgen_621010702d3faa18_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ReadSurfacePixel@
+hs_bindgen_621010702d3faa18
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_621010702d3faa18 =
+  BG.fromFFIType hs_bindgen_621010702d3faa18_base
+
+{-# NOINLINE sDL_ReadSurfacePixel #-}
+
+-- | Retrieves a single pixel from a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     Like SDL_GetRGBA, this uses the entire 0..255 range when converting color components from pixel formats with less than 8 bits per RGB component.
+--
+--     [@surface@]: the surface to read.
+--
+--     [@x@]: the horizontal coordinate, 0 \<= x \< width.
+--
+--     [@y@]: the vertical coordinate, 0 \<= y \< height.
+--
+--     [@r@]: a pointer filled in with the red channel, 0-255, or NULL to ignore this channel.
+--
+--     [@g@]: a pointer filled in with the green channel, 0-255, or NULL to ignore this channel.
+--
+--     [@b@]: a pointer filled in with the blue channel, 0-255, or NULL to ignore this channel.
+--
+--     [@a@]: a pointer filled in with the alpha channel, 0-255, or NULL to ignore this channel.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadSurfacePixel@, defined at @SDL3\/SDL_surface.h 1685:34@
+sDL_ReadSurfacePixel
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO BG.CBool
+       )
+sDL_ReadSurfacePixel =
+  BG.unsafePerformIO hs_bindgen_621010702d3faa18
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ReadSurfacePixelFloat@
+foreign import ccall unsafe "hs_bindgen_8c567029e60d9131"
+  hs_bindgen_8c567029e60d9131_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_ReadSurfacePixelFloat@
+hs_bindgen_8c567029e60d9131
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> BG.Ptr BG.CFloat
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_8c567029e60d9131 =
+  BG.fromFFIType hs_bindgen_8c567029e60d9131_base
+
+{-# NOINLINE sDL_ReadSurfacePixelFloat #-}
+
+-- | Retrieves a single pixel from a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     [@surface@]: the surface to read.
+--
+--     [@x@]: the horizontal coordinate, 0 \<= x \< width.
+--
+--     [@y@]: the vertical coordinate, 0 \<= y \< height.
+--
+--     [@r@]: a pointer filled in with the red channel, normally in the range 0-1, or NULL to ignore this channel.
+--
+--     [@g@]: a pointer filled in with the green channel, normally in the range 0-1, or NULL to ignore this channel.
+--
+--     [@b@]: a pointer filled in with the blue channel, normally in the range 0-1, or NULL to ignore this channel.
+--
+--     [@a@]: a pointer filled in with the alpha channel, normally in the range 0-1, or NULL to ignore this channel.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadSurfacePixelFloat@, defined at @SDL3\/SDL_surface.h 1712:34@
+sDL_ReadSurfacePixelFloat
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> BG.Ptr BG.CFloat
+         -> IO BG.CBool
+       )
+sDL_ReadSurfacePixelFloat =
+  BG.unsafePerformIO hs_bindgen_8c567029e60d9131
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_WriteSurfacePixel@
+foreign import ccall unsafe "hs_bindgen_b9a3ff7742c64b4a"
+  hs_bindgen_b9a3ff7742c64b4a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_WriteSurfacePixel@
+hs_bindgen_b9a3ff7742c64b4a
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> BG.CInt
+             -> BG.CInt
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> SDL3.Sys.Bindgen.Stdinc.Uint8
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_b9a3ff7742c64b4a =
+  BG.fromFFIType hs_bindgen_b9a3ff7742c64b4a_base
+
+{-# NOINLINE sDL_WriteSurfacePixel #-}
+
+-- | Writes a single pixel to a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     Like SDL_MapRGBA, this uses the entire 0..255 range when converting color components from pixel formats with less than 8 bits per RGB component.
+--
+--     [@surface@]: the surface to write.
+--
+--     [@x@]: the horizontal coordinate, 0 \<= x \< width.
+--
+--     [@y@]: the vertical coordinate, 0 \<= y \< height.
+--
+--     [@r@]: the red channel value, 0-255.
+--
+--     [@g@]: the green channel value, 0-255.
+--
+--     [@b@]: the blue channel value, 0-255.
+--
+--     [@a@]: the alpha channel value, 0-255.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteSurfacePixel@, defined at @SDL3\/SDL_surface.h 1738:34@
+sDL_WriteSurfacePixel
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> BG.CInt
+         -> BG.CInt
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> SDL3.Sys.Bindgen.Stdinc.Uint8
+         -> IO BG.CBool
+       )
+sDL_WriteSurfacePixel =
+  BG.unsafePerformIO hs_bindgen_b9a3ff7742c64b4a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_WriteSurfacePixelFloat@
+foreign import ccall unsafe "hs_bindgen_622524c6fb921b4c"
+  hs_bindgen_622524c6fb921b4c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_get_SDL_WriteSurfacePixelFloat@
+hs_bindgen_622524c6fb921b4c
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Surface
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.CFloat
+             -> BG.CFloat
+             -> BG.CFloat
+             -> BG.CFloat
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_622524c6fb921b4c =
+  BG.fromFFIType hs_bindgen_622524c6fb921b4c_base
+
+{-# NOINLINE sDL_WriteSurfacePixelFloat #-}
+
+-- | Writes a single pixel to a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     [@surface@]: the surface to write.
+--
+--     [@x@]: the horizontal coordinate, 0 \<= x \< width.
+--
+--     [@y@]: the vertical coordinate, 0 \<= y \< height.
+--
+--     [@r@]: the red channel value, normally in the range 0-1.
+--
+--     [@g@]: the green channel value, normally in the range 0-1.
+--
+--     [@b@]: the blue channel value, normally in the range 0-1.
+--
+--     [@a@]: the alpha channel value, normally in the range 0-1.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteSurfacePixelFloat@, defined at @SDL3\/SDL_surface.h 1761:34@
+sDL_WriteSurfacePixelFloat
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Surface
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.CFloat
+         -> BG.CFloat
+         -> BG.CFloat
+         -> BG.CFloat
+         -> IO BG.CBool
+       )
+sDL_WriteSurfacePixelFloat =
+  BG.unsafePerformIO hs_bindgen_622524c6fb921b4c
diff --git a/src/SDL3/Sys/Bindgen/Surface/Safe.hs b/src/SDL3/Sys/Bindgen/Surface/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Surface/Safe.hs
@@ -0,0 +1,3851 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Surface.Safe (
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_CreateSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_CreateSurfaceFrom,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_DestroySurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_GetSurfaceProperties,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SetSurfaceColorspace,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_GetSurfaceColorspace,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_CreateSurfacePalette,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SetSurfacePalette,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_GetSurfacePalette,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_AddSurfaceAlternateImage,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SurfaceHasAlternateImages,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_GetSurfaceImages,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_RemoveSurfaceAlternateImages,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_LockSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_UnlockSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_LoadSurface_IO,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_LoadSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_LoadBMP_IO,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_LoadBMP,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SaveBMP_IO,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SaveBMP,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_LoadPNG_IO,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_LoadPNG,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SavePNG_IO,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SavePNG,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SetSurfaceRLE,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SurfaceHasRLE,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SetSurfaceColorKey,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SurfaceHasColorKey,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_GetSurfaceColorKey,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SetSurfaceColorMod,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_GetSurfaceColorMod,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SetSurfaceAlphaMod,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_GetSurfaceAlphaMod,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SetSurfaceBlendMode,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_GetSurfaceBlendMode,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_SetSurfaceClipRect,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_GetSurfaceClipRect,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_FlipSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_RotateSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_DuplicateSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_ScaleSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_ConvertSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_ConvertSurfaceAndColorspace,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_ConvertPixels,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_ConvertPixelsAndColorspace,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_PremultiplyAlpha,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_PremultiplySurfaceAlpha,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_ClearSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_FillSurfaceRect,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_FillSurfaceRects,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_BlitSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_BlitSurfaceUnchecked,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_BlitSurfaceScaled,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_BlitSurfaceUncheckedScaled,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_StretchSurface,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_BlitSurfaceTiled,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_BlitSurfaceTiledWithScale,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_BlitSurface9Grid,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_MapSurfaceRGB,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_MapSurfaceRGBA,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_ReadSurfacePixel,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_ReadSurfacePixelFloat,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_WriteSurfacePixel,
+  SDL3.Sys.Bindgen.Surface.Safe.sDL_WriteSurfacePixelFloat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Blendmode qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_surface.h>"
+         , "SDL_Surface *hs_bindgen_f5d9dffb67ed3a02 ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSurface)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_049fe6b29b9f6b0c ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  void *arg4,"
+         , "  signed int arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSurfaceFrom)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_96adc31ed3b85b0e ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroySurface)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_67ff85788cdc8372 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceProperties)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_598d48691dcd3ff1 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Colorspace arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceColorspace)(arg1, arg2);"
+         , "}"
+         , "SDL_Colorspace hs_bindgen_ecbc9fcba66d62a3 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceColorspace)(arg1);"
+         , "}"
+         , "SDL_Palette *hs_bindgen_5932b732849a1735 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSurfacePalette)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_3d3e0724db0ed7ce ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Palette *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfacePalette)(arg1, arg2);"
+         , "}"
+         , "SDL_Palette *hs_bindgen_5876f907103f7e2a ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfacePalette)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0b7cea3e32121db6 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AddSurfaceAlternateImage)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_bb885b70690a833c ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SurfaceHasAlternateImages)(arg1);"
+         , "}"
+         , "SDL_Surface **hs_bindgen_a622f58d7ad78b73 ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceImages)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_9d874c9b10aefa86 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_RemoveSurfaceAlternateImages)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_db64a610fba08fca ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_LockSurface)(arg1);"
+         , "}"
+         , "void hs_bindgen_8f1af892d2fe009c ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockSurface)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Surface *hs_bindgen_35d3f5b89da7d967 ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_LoadSurface_IO)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_LoadSurface_IO requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Surface *hs_bindgen_3fecd62d86ccada1 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_LoadSurface)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_LoadSurface requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_Surface *hs_bindgen_8327ab2e34d76ef3 ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadBMP_IO)(arg1, arg2);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_fced4187c12f6580 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadBMP)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_a8c9380df03494fa ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_IOStream *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SaveBMP_IO)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_9f5c906fe39b463b ("
+         , "  SDL_Surface *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SaveBMP)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Surface *hs_bindgen_5438f82ebfd0db2d ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_LoadPNG_IO)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_LoadPNG_IO requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Surface *hs_bindgen_75a60dd30aa46884 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_LoadPNG)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_LoadPNG requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_9e770fcf56e4fd03 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_IOStream *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SavePNG_IO)(arg1, arg2, arg3);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; SDL_SetError(\"SDL_SavePNG_IO requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_6bc28b4b1f4a9d05 ("
+         , "  SDL_Surface *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SavePNG)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SavePNG requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_15ba59ca0ef8e4ad ("
+         , "  SDL_Surface *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceRLE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d627111ac7084ad7 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SurfaceHasRLE)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_f4def14a31ba1ed7 ("
+         , "  SDL_Surface *arg1,"
+         , "  _Bool arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceColorKey)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_4d3f9b51f9d999a8 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SurfaceHasColorKey)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_a54e363a1e1eaa5a ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint32 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceColorKey)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8b27208d3c207793 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceColorMod)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_34ffb5b1c38e964a ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 *arg2,"
+         , "  Uint8 *arg3,"
+         , "  Uint8 *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceColorMod)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_c9f8378e1f43a4b5 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceAlphaMod)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c58e7719cc38fbb7 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceAlphaMod)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8e7ff2b3301fecfa ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_BlendMode arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_79a3cd778c72f8e2 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_BlendMode *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_2820354795314f60 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceClipRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b910b24fe46481d6 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceClipRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c88156522122ee98 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_FlipMode arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_FlipSurface)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Surface *hs_bindgen_a1316efcfef047d4 ("
+         , "  SDL_Surface *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_RotateSurface)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_RotateSurface requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_Surface *hs_bindgen_6d95029f36464bfd ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_DuplicateSurface)(arg1);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_face97baca762cbd ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_ScaleMode arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_ScaleSurface)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_73e1e8c13e580d46 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_PixelFormat arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertSurface)(arg1, arg2);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_e534837314acf47f ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_PixelFormat arg2,"
+         , "  SDL_Palette *arg3,"
+         , "  SDL_Colorspace arg4,"
+         , "  SDL_PropertiesID arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertSurfaceAndColorspace)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_435765f57837af03 ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  void const *arg4,"
+         , "  signed int arg5,"
+         , "  SDL_PixelFormat arg6,"
+         , "  void *arg7,"
+         , "  signed int arg8"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertPixels)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);"
+         , "}"
+         , "_Bool hs_bindgen_c1b70c1ec2328788 ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  SDL_Colorspace arg4,"
+         , "  SDL_PropertiesID arg5,"
+         , "  void const *arg6,"
+         , "  signed int arg7,"
+         , "  SDL_PixelFormat arg8,"
+         , "  SDL_Colorspace arg9,"
+         , "  SDL_PropertiesID arg10,"
+         , "  void *arg11,"
+         , "  signed int arg12"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertPixelsAndColorspace)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12);"
+         , "}"
+         , "_Bool hs_bindgen_8e4daa78971d0cb7 ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  void const *arg4,"
+         , "  signed int arg5,"
+         , "  SDL_PixelFormat arg6,"
+         , "  void *arg7,"
+         , "  signed int arg8,"
+         , "  _Bool arg9"
+         , ")"
+         , "{"
+         , "  return (SDL_PremultiplyAlpha)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);"
+         , "}"
+         , "_Bool hs_bindgen_56aa84cbef3d8f40 ("
+         , "  SDL_Surface *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_PremultiplySurfaceAlpha)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_e97c19a44df98438 ("
+         , "  SDL_Surface *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_ClearSurface)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_5dccf89603882fe7 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_FillSurfaceRect)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_a2b5b19e2436d28a ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_FillSurfaceRects)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_b1a30c4f5f8d91a8 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurface)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_f01f13adea578bc6 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurfaceUnchecked)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_ff01194286dad7f2 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4,"
+         , "  SDL_ScaleMode arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurfaceScaled)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_203cef09fdf11016 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4,"
+         , "  SDL_ScaleMode arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurfaceUncheckedScaled)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_3f0e13150dff4407 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4,"
+         , "  SDL_ScaleMode arg5"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 2, 4)"
+         , "  return (SDL_StretchSurface)(arg1, arg2, arg3, arg4, arg5);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; (void)arg5; SDL_SetError(\"SDL_StretchSurface requires SDL >= 3.2.4\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_d87d2c7a0fc3e08c ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurfaceTiled)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_a0b5a4d660b97157 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  float arg3,"
+         , "  SDL_ScaleMode arg4,"
+         , "  SDL_Surface *arg5,"
+         , "  SDL_Rect const *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurfaceTiledWithScale)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_c841a6c05cf5fdff ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5,"
+         , "  signed int arg6,"
+         , "  float arg7,"
+         , "  SDL_ScaleMode arg8,"
+         , "  SDL_Surface *arg9,"
+         , "  SDL_Rect const *arg10"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurface9Grid)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);"
+         , "}"
+         , "Uint32 hs_bindgen_c74008884f7b6019 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_MapSurfaceRGB)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "Uint32 hs_bindgen_d299991f35295874 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_MapSurfaceRGBA)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_a30b6c841f82ebcc ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5,"
+         , "  Uint8 *arg6,"
+         , "  Uint8 *arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadSurfacePixel)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_1a263d49fd0125f6 ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  float *arg4,"
+         , "  float *arg5,"
+         , "  float *arg6,"
+         , "  float *arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadSurfacePixelFloat)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_51ee7af8b74364b9 ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5,"
+         , "  Uint8 arg6,"
+         , "  Uint8 arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteSurfacePixel)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_0a72c0432b672135 ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  float arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteSurfacePixelFloat)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_CreateSurface@
+foreign import ccall safe "hs_bindgen_f5d9dffb67ed3a02"
+  hs_bindgen_f5d9dffb67ed3a02_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_CreateSurface@
+hs_bindgen_f5d9dffb67ed3a02
+  :: BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_f5d9dffb67ed3a02 =
+  BG.fromFFIType hs_bindgen_f5d9dffb67ed3a02_base
+
+-- | Allocate a new surface with a specific pixel format.
+--
+--     The pixels of the new surface are initialized to zero.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSurfaceFrom', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_CreateSurface@, defined at @SDL3\/SDL_surface.h 173:43@
+sDL_CreateSurface
+  :: BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the surface.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the surface.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the SDL_PixelFormat for the new surface\'s pixel format.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_CreateSurface = hs_bindgen_f5d9dffb67ed3a02
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_CreateSurfaceFrom@
+foreign import ccall safe "hs_bindgen_049fe6b29b9f6b0c"
+  hs_bindgen_049fe6b29b9f6b0c_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_CreateSurfaceFrom@
+hs_bindgen_049fe6b29b9f6b0c
+  :: BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> BG.Ptr BG.Void
+  -> BG.CInt
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_049fe6b29b9f6b0c =
+  BG.fromFFIType hs_bindgen_049fe6b29b9f6b0c_base
+
+-- | Allocate a new surface with a specific pixel format and existing pixel data.
+--
+--     No copy is made of the pixel data. Pixel data is not managed automatically; you must free the surface before you free the pixel data.
+--
+--     Pitch is the offset in bytes from one row of pixels to the next, e.g. @width*4@ for @SDL_PIXELFORMAT_RGBA8888@.
+--
+--     You may pass NULL for pixels and 0 for pitch to create a surface that you will fill in with valid values later.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSurface', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_CreateSurfaceFrom@, defined at @SDL3\/SDL_surface.h 203:43@
+sDL_CreateSurfaceFrom
+  :: BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the surface.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the surface.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the SDL_PixelFormat for the new surface\'s pixel format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@pixels@]: a pointer to existing pixel data.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@pitch@]: the number of bytes between each row, including padding.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_CreateSurfaceFrom = hs_bindgen_049fe6b29b9f6b0c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_DestroySurface@
+foreign import ccall safe "hs_bindgen_96adc31ed3b85b0e"
+  hs_bindgen_96adc31ed3b85b0e_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_DestroySurface@
+hs_bindgen_96adc31ed3b85b0e
+  :: BG.Ptr SDL_Surface
+  -> IO ()
+hs_bindgen_96adc31ed3b85b0e =
+  BG.fromFFIType hs_bindgen_96adc31ed3b85b0e_base
+
+-- | Free a surface.
+--
+--     It is safe to pass NULL to this function.
+--
+--     [Thread safety]: No other thread should be using the surface when it is freed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSurface', 'sDL_CreateSurfaceFrom'
+--
+--     [C declaration]: @SDL_DestroySurface@, defined at @SDL3\/SDL_surface.h 219:34@
+sDL_DestroySurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' to free.
+  -> IO ()
+sDL_DestroySurface = hs_bindgen_96adc31ed3b85b0e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceProperties@
+foreign import ccall safe "hs_bindgen_67ff85788cdc8372"
+  hs_bindgen_67ff85788cdc8372_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceProperties@
+hs_bindgen_67ff85788cdc8372
+  :: BG.Ptr SDL_Surface
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_67ff85788cdc8372 =
+  BG.fromFFIType hs_bindgen_67ff85788cdc8372_base
+
+-- | Get the properties associated with a surface.
+--
+--     The following properties are understood by SDL:
+--
+--     * @'sDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point surfaces, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 203 for HDR10 surfaces and 1.0 for floating point surfaces.
+--
+--     * @'sDL_PROP_SURFACE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point surfaces, this defines the maximum dynamic range used by the content, in terms of the SDR white point. This defaults to 0.0, which disables tone mapping.
+--
+--     * @'sDL_PROP_SURFACE_TONEMAP_OPERATOR_STRING'@: the tone mapping operator used when compressing from a surface with high dynamic range to another with lower dynamic range. Currently this supports \"chrome\", which uses the same tone mapping that Chrome uses for HDR content, the form \"*=N\", where N is a floating point scale factor applied in linear space, and \"none\", which disables tone mapping. This defaults to \"chrome\".
+--
+--     * @'sDL_PROP_SURFACE_HOTSPOT_X_NUMBER'@: the hotspot pixel offset from the left edge of the image, if this surface is being used as a cursor.
+--
+--     * @'sDL_PROP_SURFACE_HOTSPOT_Y_NUMBER'@: the hotspot pixel offset from the top edge of the image, if this surface is being used as a cursor.
+--
+--     * @'sDL_PROP_SURFACE_ROTATION_FLOAT'@: the number of degrees a surface\'s data is meant to be rotated clockwise to make the image right-side up. Default
+--       1. This is used by the camera API, if a mobile device is oriented differently than what its camera provides (i.e. - the camera always provides portrait images but the phone is being held in landscape orientation). Since SDL 3.4.0.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSurfaceProperties@, defined at @SDL3\/SDL_surface.h 259:46@
+sDL_GetSurfaceProperties
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetSurfaceProperties =
+  hs_bindgen_67ff85788cdc8372
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceColorspace@
+foreign import ccall safe "hs_bindgen_598d48691dcd3ff1"
+  hs_bindgen_598d48691dcd3ff1_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceColorspace@
+hs_bindgen_598d48691dcd3ff1
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -> IO BG.CBool
+hs_bindgen_598d48691dcd3ff1 =
+  BG.fromFFIType hs_bindgen_598d48691dcd3ff1_base
+
+-- | Set the colorspace used by a surface.
+--
+--     Setting the colorspace doesn\'t change the pixels, only how they are interpreted in color operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorspace'
+--
+--     [C declaration]: @SDL_SetSurfaceColorspace@, defined at @SDL3\/SDL_surface.h 287:34@
+sDL_SetSurfaceColorspace
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@colorspace@]: an SDL_Colorspace value describing the surface colorspace.
+  -> IO BG.CBool
+sDL_SetSurfaceColorspace =
+  hs_bindgen_598d48691dcd3ff1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceColorspace@
+foreign import ccall safe "hs_bindgen_ecbc9fcba66d62a3"
+  hs_bindgen_ecbc9fcba66d62a3_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceColorspace@
+hs_bindgen_ecbc9fcba66d62a3
+  :: BG.Ptr SDL_Surface
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+hs_bindgen_ecbc9fcba66d62a3 =
+  BG.fromFFIType hs_bindgen_ecbc9fcba66d62a3_base
+
+-- | Get the colorspace used by a surface.
+--
+--     The colorspace defaults to SDL_COLORSPACE_SRGB_LINEAR for floating point formats, SDL_COLORSPACE_HDR10 for 10-bit formats, SDL_COLORSPACE_SRGB for other RGB surfaces and SDL_COLORSPACE_BT709_FULL for YUV textures.
+--
+--     [Returns]: the colorspace used by the surface, or SDL_COLORSPACE_UNKNOWN if the surface is NULL.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceColorspace'
+--
+--     [C declaration]: @SDL_GetSurfaceColorspace@, defined at @SDL3\/SDL_surface.h 307:44@
+sDL_GetSurfaceColorspace
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+sDL_GetSurfaceColorspace =
+  hs_bindgen_ecbc9fcba66d62a3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_CreateSurfacePalette@
+foreign import ccall safe "hs_bindgen_5932b732849a1735"
+  hs_bindgen_5932b732849a1735_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_CreateSurfacePalette@
+hs_bindgen_5932b732849a1735
+  :: BG.Ptr SDL_Surface
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+hs_bindgen_5932b732849a1735 =
+  BG.fromFFIType hs_bindgen_5932b732849a1735_base
+
+-- | Create a palette and associate it with a surface.
+--
+--     This function creates a palette compatible with the provided surface. The palette is then returned for you to modify, and the surface will automatically use the new palette in future operations. You do not need to destroy the returned palette, it will be freed when the reference count reaches 0, usually when the surface is destroyed.
+--
+--     Bitmap surfaces (with format SDL_PIXELFORMAT_INDEX1LSB or SDL_PIXELFORMAT_INDEX1MSB) will have the palette initialized with 0 as white and 1 as black. Other surfaces will get a palette initialized with white in every entry.
+--
+--     If this function is called for a surface that already has a palette, a new palette will be created to replace it.
+--
+--     [Returns]: a new SDL_Palette structure on success or NULL on failure (e.g. if the surface didn\'t have an index format); call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_SetPaletteColors
+--
+--     [C declaration]: @SDL_CreateSurfacePalette@, defined at @SDL3\/SDL_surface.h 338:43@
+sDL_CreateSurfacePalette
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+sDL_CreateSurfacePalette =
+  hs_bindgen_5932b732849a1735
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfacePalette@
+foreign import ccall safe "hs_bindgen_3d3e0724db0ed7ce"
+  hs_bindgen_3d3e0724db0ed7ce_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfacePalette@
+hs_bindgen_3d3e0724db0ed7ce
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -> IO BG.CBool
+hs_bindgen_3d3e0724db0ed7ce =
+  BG.fromFFIType hs_bindgen_3d3e0724db0ed7ce_base
+
+-- | Set the palette used by a surface.
+--
+--     Setting the palette keeps an internal reference to the palette, which can be safely destroyed afterwards.
+--
+--     A single palette can be shared with many surfaces.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreatePalette, 'sDL_GetSurfacePalette'
+--
+--     [C declaration]: @SDL_SetSurfacePalette@, defined at @SDL3\/SDL_surface.h 361:34@
+sDL_SetSurfacePalette
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the SDL_Palette structure to use.
+  -> IO BG.CBool
+sDL_SetSurfacePalette = hs_bindgen_3d3e0724db0ed7ce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfacePalette@
+foreign import ccall safe "hs_bindgen_5876f907103f7e2a"
+  hs_bindgen_5876f907103f7e2a_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfacePalette@
+hs_bindgen_5876f907103f7e2a
+  :: BG.Ptr SDL_Surface
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+hs_bindgen_5876f907103f7e2a =
+  BG.fromFFIType hs_bindgen_5876f907103f7e2a_base
+
+-- | Get the palette used by a surface.
+--
+--     [Returns]: a pointer to the palette used by the surface, or NULL if there is no palette used.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfacePalette'
+--
+--     [C declaration]: @SDL_GetSurfacePalette@, defined at @SDL3\/SDL_surface.h 376:43@
+sDL_GetSurfacePalette
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+sDL_GetSurfacePalette = hs_bindgen_5876f907103f7e2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_AddSurfaceAlternateImage@
+foreign import ccall safe "hs_bindgen_0b7cea3e32121db6"
+  hs_bindgen_0b7cea3e32121db6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_AddSurfaceAlternateImage@
+hs_bindgen_0b7cea3e32121db6
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_0b7cea3e32121db6 =
+  BG.fromFFIType hs_bindgen_0b7cea3e32121db6_base
+
+-- | Add an alternate version of a surface.
+--
+--     This function adds an alternate version of this surface, usually used for content with high DPI representations like cursors or icons. The size, format, and content do not need to match the original surface, and these alternate versions will not be updated when the original surface changes.
+--
+--     This function adds a reference to the alternate version, so you should call @SDL_DestroySurface()@ on the image after this call.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveSurfaceAlternateImages', 'sDL_GetSurfaceImages', 'sDL_SurfaceHasAlternateImages'
+--
+--     [C declaration]: @SDL_AddSurfaceAlternateImage@, defined at @SDL3\/SDL_surface.h 404:34@
+sDL_AddSurfaceAlternateImage
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@image@]: a pointer to an alternate 'SDL_Surface' to associate with this surface.
+  -> IO BG.CBool
+sDL_AddSurfaceAlternateImage =
+  hs_bindgen_0b7cea3e32121db6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SurfaceHasAlternateImages@
+foreign import ccall safe "hs_bindgen_bb885b70690a833c"
+  hs_bindgen_bb885b70690a833c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SurfaceHasAlternateImages@
+hs_bindgen_bb885b70690a833c
+  :: BG.Ptr SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_bb885b70690a833c =
+  BG.fromFFIType hs_bindgen_bb885b70690a833c_base
+
+-- | Return whether a surface has alternate versions available.
+--
+--     [Returns]: true if alternate versions are available or false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddSurfaceAlternateImage', 'sDL_RemoveSurfaceAlternateImages', 'sDL_GetSurfaceImages'
+--
+--     [C declaration]: @SDL_SurfaceHasAlternateImages@, defined at @SDL3\/SDL_surface.h 420:34@
+sDL_SurfaceHasAlternateImages
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO BG.CBool
+sDL_SurfaceHasAlternateImages =
+  hs_bindgen_bb885b70690a833c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceImages@
+foreign import ccall safe "hs_bindgen_a622f58d7ad78b73"
+  hs_bindgen_a622f58d7ad78b73_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceImages@
+hs_bindgen_a622f58d7ad78b73
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_Surface))
+hs_bindgen_a622f58d7ad78b73 =
+  BG.fromFFIType hs_bindgen_a622f58d7ad78b73_base
+
+-- | Get an array including all versions of a surface.
+--
+--     This returns all versions of a surface, with the surface being queried as the first element in the returned array.
+--
+--     Freeing the array of surfaces does not affect the surfaces in the array. They are still referenced by the surface being queried and will be cleaned up normally.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Surface' pointers or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddSurfaceAlternateImage', 'sDL_RemoveSurfaceAlternateImages', 'sDL_SurfaceHasAlternateImages'
+--
+--     [C declaration]: @SDL_GetSurfaceImages@, defined at @SDL3\/SDL_surface.h 448:44@
+sDL_GetSurfaceImages
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of surface pointers returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Surface))
+sDL_GetSurfaceImages = hs_bindgen_a622f58d7ad78b73
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_RemoveSurfaceAlternateImages@
+foreign import ccall safe "hs_bindgen_9d874c9b10aefa86"
+  hs_bindgen_9d874c9b10aefa86_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_RemoveSurfaceAlternateImages@
+hs_bindgen_9d874c9b10aefa86
+  :: BG.Ptr SDL_Surface
+  -> IO ()
+hs_bindgen_9d874c9b10aefa86 =
+  BG.fromFFIType hs_bindgen_9d874c9b10aefa86_base
+
+-- | Remove all alternate versions of a surface.
+--
+--     This function removes a reference from all the alternative versions, destroying them if this is the last reference to them.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddSurfaceAlternateImage', 'sDL_GetSurfaceImages', 'sDL_SurfaceHasAlternateImages'
+--
+--     [C declaration]: @SDL_RemoveSurfaceAlternateImages@, defined at @SDL3\/SDL_surface.h 467:34@
+sDL_RemoveSurfaceAlternateImages
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> IO ()
+sDL_RemoveSurfaceAlternateImages =
+  hs_bindgen_9d874c9b10aefa86
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LockSurface@
+foreign import ccall safe "hs_bindgen_db64a610fba08fca"
+  hs_bindgen_db64a610fba08fca_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LockSurface@
+hs_bindgen_db64a610fba08fca
+  :: BG.Ptr SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_db64a610fba08fca =
+  BG.fromFFIType hs_bindgen_db64a610fba08fca_base
+
+-- | Set up a surface for directly accessing the pixels.
+--
+--     Between calls to @SDL_LockSurface()@ \/ @SDL_UnlockSurface()@, you can write to and read from @surface->pixels@, using the pixel format stored in @surface->format@. Once you are done accessing the surface, you should use @SDL_UnlockSurface()@ to release it.
+--
+--     Not all surfaces require locking. If @SDL_MUSTLOCK(surface)@ evaluates to 0, then you can read and write to the surface at any time, and the pixel format of the surface will not change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces. The locking referred to by this function is making the pixels available for direct access, not thread-safe locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MUSTLOCK@, 'sDL_UnlockSurface'
+--
+--     [C declaration]: @SDL_LockSurface@, defined at @SDL3\/SDL_surface.h 495:34@
+sDL_LockSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be locked.
+  -> IO BG.CBool
+sDL_LockSurface = hs_bindgen_db64a610fba08fca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_UnlockSurface@
+foreign import ccall safe "hs_bindgen_8f1af892d2fe009c"
+  hs_bindgen_8f1af892d2fe009c_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_UnlockSurface@
+hs_bindgen_8f1af892d2fe009c
+  :: BG.Ptr SDL_Surface
+  -> IO ()
+hs_bindgen_8f1af892d2fe009c =
+  BG.fromFFIType hs_bindgen_8f1af892d2fe009c_base
+
+-- | Release a surface after directly accessing the pixels.
+--
+--     [Thread safety]: This function is not thread safe. The locking referred to by this function is making the pixels available for direct access, not thread-safe locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockSurface'
+--
+--     [C declaration]: @SDL_UnlockSurface@, defined at @SDL3\/SDL_surface.h 510:34@
+sDL_UnlockSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be unlocked.
+  -> IO ()
+sDL_UnlockSurface = hs_bindgen_8f1af892d2fe009c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadSurface_IO@
+foreign import ccall safe "hs_bindgen_35d3f5b89da7d967"
+  hs_bindgen_35d3f5b89da7d967_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadSurface_IO@
+hs_bindgen_35d3f5b89da7d967
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_35d3f5b89da7d967 =
+  BG.fromFFIType hs_bindgen_35d3f5b89da7d967_base
+
+-- | Load a BMP or PNG image from a seekable SDL data stream.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadSurface'
+--
+--     [C declaration]: @SDL_LoadSurface_IO@, defined at @SDL3\/SDL_surface.h 531:43@
+sDL_LoadSurface_IO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadSurface_IO = hs_bindgen_35d3f5b89da7d967
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadSurface@
+foreign import ccall safe "hs_bindgen_3fecd62d86ccada1"
+  hs_bindgen_3fecd62d86ccada1_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadSurface@
+hs_bindgen_3fecd62d86ccada1
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_3fecd62d86ccada1 =
+  BG.fromFFIType hs_bindgen_3fecd62d86ccada1_base
+
+-- | Load a BMP or PNG image from a file.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadSurface_IO'
+--
+--     [C declaration]: @SDL_LoadSurface@, defined at @SDL3\/SDL_surface.h 550:43@
+sDL_LoadSurface
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the file to load.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadSurface = hs_bindgen_3fecd62d86ccada1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadBMP_IO@
+foreign import ccall safe "hs_bindgen_8327ab2e34d76ef3"
+  hs_bindgen_8327ab2e34d76ef3_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadBMP_IO@
+hs_bindgen_8327ab2e34d76ef3
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_8327ab2e34d76ef3 =
+  BG.fromFFIType hs_bindgen_8327ab2e34d76ef3_base
+
+-- | Load a BMP image from a seekable SDL data stream.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadBMP', 'sDL_SaveBMP_IO'
+--
+--     [C declaration]: @SDL_LoadBMP_IO@, defined at @SDL3\/SDL_surface.h 572:43@
+sDL_LoadBMP_IO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadBMP_IO = hs_bindgen_8327ab2e34d76ef3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadBMP@
+foreign import ccall safe "hs_bindgen_fced4187c12f6580"
+  hs_bindgen_fced4187c12f6580_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadBMP@
+hs_bindgen_fced4187c12f6580
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_fced4187c12f6580 =
+  BG.fromFFIType hs_bindgen_fced4187c12f6580_base
+
+-- | Load a BMP image from a file.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadBMP_IO', 'sDL_SaveBMP'
+--
+--     [C declaration]: @SDL_LoadBMP@, defined at @SDL3\/SDL_surface.h 592:43@
+sDL_LoadBMP
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the BMP file to load.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadBMP = hs_bindgen_fced4187c12f6580
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SaveBMP_IO@
+foreign import ccall safe "hs_bindgen_a8c9380df03494fa"
+  hs_bindgen_a8c9380df03494fa_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SaveBMP_IO@
+hs_bindgen_a8c9380df03494fa
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_a8c9380df03494fa =
+  BG.fromFFIType hs_bindgen_a8c9380df03494fa_base
+
+-- | Save a surface to a seekable SDL data stream in BMP format.
+--
+--     Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the BMP directly. Other RGB formats with 8-bit or higher get converted to a 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit surface before they are saved. YUV and paletted 1-bit and 4-bit formats are not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadBMP_IO', 'sDL_SaveBMP'
+--
+--     [C declaration]: @SDL_SaveBMP_IO@, defined at @SDL3\/SDL_surface.h 618:34@
+sDL_SaveBMP_IO
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: a data stream to save to.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @dst@ before returning, even in the case of an error.
+  -> IO BG.CBool
+sDL_SaveBMP_IO = hs_bindgen_a8c9380df03494fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SaveBMP@
+foreign import ccall safe "hs_bindgen_9f5c906fe39b463b"
+  hs_bindgen_9f5c906fe39b463b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SaveBMP@
+hs_bindgen_9f5c906fe39b463b
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_9f5c906fe39b463b =
+  BG.fromFFIType hs_bindgen_9f5c906fe39b463b_base
+
+-- | Save a surface to a file in BMP format.
+--
+--     Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the BMP directly. Other RGB formats with 8-bit or higher get converted to a 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit surface before they are saved. YUV and paletted 1-bit and 4-bit formats are not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadBMP', 'sDL_SaveBMP_IO'
+--
+--     [C declaration]: @SDL_SaveBMP@, defined at @SDL3\/SDL_surface.h 642:34@
+sDL_SaveBMP
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a file to save to.
+  -> IO BG.CBool
+sDL_SaveBMP = hs_bindgen_9f5c906fe39b463b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadPNG_IO@
+foreign import ccall safe "hs_bindgen_5438f82ebfd0db2d"
+  hs_bindgen_5438f82ebfd0db2d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadPNG_IO@
+hs_bindgen_5438f82ebfd0db2d
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_5438f82ebfd0db2d =
+  BG.fromFFIType hs_bindgen_5438f82ebfd0db2d_base
+
+-- | Load a PNG image from a seekable SDL data stream.
+--
+--     This is intended as a convenience function for loading images from trusted sources. If you want to load arbitrary images you should use libpng or another image loading library designed with security in mind.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadPNG', 'sDL_SavePNG_IO'
+--
+--     [C declaration]: @SDL_LoadPNG_IO@, defined at @SDL3\/SDL_surface.h 668:43@
+sDL_LoadPNG_IO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadPNG_IO = hs_bindgen_5438f82ebfd0db2d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadPNG@
+foreign import ccall safe "hs_bindgen_75a60dd30aa46884"
+  hs_bindgen_75a60dd30aa46884_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_LoadPNG@
+hs_bindgen_75a60dd30aa46884
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_75a60dd30aa46884 =
+  BG.fromFFIType hs_bindgen_75a60dd30aa46884_base
+
+-- | Load a PNG image from a file.
+--
+--     This is intended as a convenience function for loading images from trusted sources. If you want to load arbitrary images you should use libpng or another image loading library designed with security in mind.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadPNG_IO', 'sDL_SavePNG'
+--
+--     [C declaration]: @SDL_LoadPNG@, defined at @SDL3\/SDL_surface.h 692:43@
+sDL_LoadPNG
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the PNG file to load.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadPNG = hs_bindgen_75a60dd30aa46884
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SavePNG_IO@
+foreign import ccall safe "hs_bindgen_9e770fcf56e4fd03"
+  hs_bindgen_9e770fcf56e4fd03_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SavePNG_IO@
+hs_bindgen_9e770fcf56e4fd03
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_9e770fcf56e4fd03 =
+  BG.fromFFIType hs_bindgen_9e770fcf56e4fd03_base
+
+-- | Save a surface to a seekable SDL data stream in PNG format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_LoadPNG_IO', 'sDL_SavePNG'
+--
+--     [C declaration]: @SDL_SavePNG_IO@, defined at @SDL3\/SDL_surface.h 712:34@
+sDL_SavePNG_IO
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: a data stream to save to.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @dst@ before returning, even in the case of an error.
+  -> IO BG.CBool
+sDL_SavePNG_IO = hs_bindgen_9e770fcf56e4fd03
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SavePNG@
+foreign import ccall safe "hs_bindgen_6bc28b4b1f4a9d05"
+  hs_bindgen_6bc28b4b1f4a9d05_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SavePNG@
+hs_bindgen_6bc28b4b1f4a9d05
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_6bc28b4b1f4a9d05 =
+  BG.fromFFIType hs_bindgen_6bc28b4b1f4a9d05_base
+
+-- | Save a surface to a file in PNG format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_LoadPNG', 'sDL_SavePNG_IO'
+--
+--     [C declaration]: @SDL_SavePNG@, defined at @SDL3\/SDL_surface.h 730:34@
+sDL_SavePNG
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a file to save to.
+  -> IO BG.CBool
+sDL_SavePNG = hs_bindgen_6bc28b4b1f4a9d05
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceRLE@
+foreign import ccall safe "hs_bindgen_15ba59ca0ef8e4ad"
+  hs_bindgen_15ba59ca0ef8e4ad_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceRLE@
+hs_bindgen_15ba59ca0ef8e4ad
+  :: BG.Ptr SDL_Surface
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_15ba59ca0ef8e4ad =
+  BG.fromFFIType hs_bindgen_15ba59ca0ef8e4ad_base
+
+-- | Set the RLE acceleration hint for a surface.
+--
+--     If RLE is enabled, color key and alpha blending blits are much faster, but the surface must be locked before directly accessing the pixels.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface', 'sDL_LockSurface', 'sDL_UnlockSurface'
+--
+--     [C declaration]: @SDL_SetSurfaceRLE@, defined at @SDL3\/SDL_surface.h 752:34@
+sDL_SetSurfaceRLE
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to optimize.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: true to enable RLE acceleration, false to disable it.
+  -> IO BG.CBool
+sDL_SetSurfaceRLE = hs_bindgen_15ba59ca0ef8e4ad
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SurfaceHasRLE@
+foreign import ccall safe "hs_bindgen_d627111ac7084ad7"
+  hs_bindgen_d627111ac7084ad7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SurfaceHasRLE@
+hs_bindgen_d627111ac7084ad7
+  :: BG.Ptr SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_d627111ac7084ad7 =
+  BG.fromFFIType hs_bindgen_d627111ac7084ad7_base
+
+-- | Returns whether the surface is RLE enabled.
+--
+--     It is safe to pass a NULL @surface@ here; it will return false.
+--
+--     [Returns]: true if the surface is RLE enabled, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceRLE'
+--
+--     [C declaration]: @SDL_SurfaceHasRLE@, defined at @SDL3\/SDL_surface.h 768:34@
+sDL_SurfaceHasRLE
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO BG.CBool
+sDL_SurfaceHasRLE = hs_bindgen_d627111ac7084ad7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceColorKey@
+foreign import ccall safe "hs_bindgen_f4def14a31ba1ed7"
+  hs_bindgen_f4def14a31ba1ed7_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceColorKey@
+hs_bindgen_f4def14a31ba1ed7
+  :: BG.Ptr SDL_Surface
+  -> BG.CBool
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_f4def14a31ba1ed7 =
+  BG.fromFFIType hs_bindgen_f4def14a31ba1ed7_base
+
+-- | Set the color key (transparent pixel) in a surface.
+--
+--     The color key defines a pixel value that will be treated as transparent in a blit. For example, one can use this to specify that cyan pixels should be considered transparent, and therefore not rendered.
+--
+--     It is a pixel of the format used by the surface, as generated by SDL_MapRGB().
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorKey', 'sDL_SetSurfaceRLE', 'sDL_SurfaceHasColorKey'
+--
+--     [C declaration]: @SDL_SetSurfaceColorKey@, defined at @SDL3\/SDL_surface.h 795:34@
+sDL_SetSurfaceColorKey
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: true to enable color key, false to disable color key.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@key@]: the transparent pixel.
+  -> IO BG.CBool
+sDL_SetSurfaceColorKey = hs_bindgen_f4def14a31ba1ed7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SurfaceHasColorKey@
+foreign import ccall safe "hs_bindgen_4d3f9b51f9d999a8"
+  hs_bindgen_4d3f9b51f9d999a8_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SurfaceHasColorKey@
+hs_bindgen_4d3f9b51f9d999a8
+  :: BG.Ptr SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_4d3f9b51f9d999a8 =
+  BG.fromFFIType hs_bindgen_4d3f9b51f9d999a8_base
+
+-- | Returns whether the surface has a color key.
+--
+--     It is safe to pass a NULL @surface@ here; it will return false.
+--
+--     [Returns]: true if the surface has a color key, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceColorKey', 'sDL_GetSurfaceColorKey'
+--
+--     [C declaration]: @SDL_SurfaceHasColorKey@, defined at @SDL3\/SDL_surface.h 812:34@
+sDL_SurfaceHasColorKey
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO BG.CBool
+sDL_SurfaceHasColorKey = hs_bindgen_4d3f9b51f9d999a8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceColorKey@
+foreign import ccall safe "hs_bindgen_a54e363a1e1eaa5a"
+  hs_bindgen_a54e363a1e1eaa5a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceColorKey@
+hs_bindgen_a54e363a1e1eaa5a
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_a54e363a1e1eaa5a =
+  BG.fromFFIType hs_bindgen_a54e363a1e1eaa5a_base
+
+-- | Get the color key (transparent pixel) for a surface.
+--
+--     The color key is a pixel of the format used by the surface, as generated by SDL_MapRGB().
+--
+--     If the surface doesn\'t have color key enabled this function returns false.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceColorKey', 'sDL_SurfaceHasColorKey'
+--
+--     [C declaration]: @SDL_GetSurfaceColorKey@, defined at @SDL3\/SDL_surface.h 834:34@
+sDL_GetSurfaceColorKey
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@key@]: a pointer filled in with the transparent pixel.
+  -> IO BG.CBool
+sDL_GetSurfaceColorKey = hs_bindgen_a54e363a1e1eaa5a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceColorMod@
+foreign import ccall safe "hs_bindgen_8b27208d3c207793"
+  hs_bindgen_8b27208d3c207793_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceColorMod@
+hs_bindgen_8b27208d3c207793
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_8b27208d3c207793 =
+  BG.fromFFIType hs_bindgen_8b27208d3c207793_base
+
+-- | Set an additional color value multiplied into blit operations.
+--
+--     When this surface is blitted, during the blit operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * (color \/ 255)@
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorMod', 'sDL_SetSurfaceAlphaMod'
+--
+--     [C declaration]: @SDL_SetSurfaceColorMod@, defined at @SDL3\/SDL_surface.h 860:34@
+sDL_SetSurfaceColorMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into blit operations.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into blit operations.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into blit operations.
+  -> IO BG.CBool
+sDL_SetSurfaceColorMod = hs_bindgen_8b27208d3c207793
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceColorMod@
+foreign import ccall safe "hs_bindgen_34ffb5b1c38e964a"
+  hs_bindgen_34ffb5b1c38e964a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceColorMod@
+hs_bindgen_34ffb5b1c38e964a
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_34ffb5b1c38e964a =
+  BG.fromFFIType hs_bindgen_34ffb5b1c38e964a_base
+
+-- | Get the additional color value multiplied into blit operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceAlphaMod', 'sDL_SetSurfaceColorMod'
+--
+--     [C declaration]: @SDL_GetSurfaceColorMod@, defined at @SDL3\/SDL_surface.h 881:34@
+sDL_GetSurfaceColorMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO BG.CBool
+sDL_GetSurfaceColorMod = hs_bindgen_34ffb5b1c38e964a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceAlphaMod@
+foreign import ccall safe "hs_bindgen_c9f8378e1f43a4b5"
+  hs_bindgen_c9f8378e1f43a4b5_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceAlphaMod@
+hs_bindgen_c9f8378e1f43a4b5
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_c9f8378e1f43a4b5 =
+  BG.fromFFIType hs_bindgen_c9f8378e1f43a4b5_base
+
+-- | Set an additional alpha value used in blit operations.
+--
+--     When this surface is blitted, during the blit operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * (alpha \/ 255)@
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceAlphaMod', 'sDL_SetSurfaceColorMod'
+--
+--     [C declaration]: @SDL_SetSurfaceAlphaMod@, defined at @SDL3\/SDL_surface.h 904:34@
+sDL_SetSurfaceAlphaMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: the alpha value multiplied into blit operations.
+  -> IO BG.CBool
+sDL_SetSurfaceAlphaMod = hs_bindgen_c9f8378e1f43a4b5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceAlphaMod@
+foreign import ccall safe "hs_bindgen_c58e7719cc38fbb7"
+  hs_bindgen_c58e7719cc38fbb7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceAlphaMod@
+hs_bindgen_c58e7719cc38fbb7
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_c58e7719cc38fbb7 =
+  BG.fromFFIType hs_bindgen_c58e7719cc38fbb7_base
+
+-- | Get the additional alpha value used in blit operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorMod', 'sDL_SetSurfaceAlphaMod'
+--
+--     [C declaration]: @SDL_GetSurfaceAlphaMod@, defined at @SDL3\/SDL_surface.h 921:34@
+sDL_GetSurfaceAlphaMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO BG.CBool
+sDL_GetSurfaceAlphaMod = hs_bindgen_c58e7719cc38fbb7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceBlendMode@
+foreign import ccall safe "hs_bindgen_8e7ff2b3301fecfa"
+  hs_bindgen_8e7ff2b3301fecfa_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceBlendMode@
+hs_bindgen_8e7ff2b3301fecfa
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_8e7ff2b3301fecfa =
+  BG.fromFFIType hs_bindgen_8e7ff2b3301fecfa_base
+
+-- | Set the blend mode used for blit operations.
+--
+--     To copy a surface to another surface (or texture) without blending with the existing data, the blendmode of the SOURCE surface should be set to @SDL_BLENDMODE_NONE@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceBlendMode'
+--
+--     [C declaration]: @SDL_SetSurfaceBlendMode@, defined at @SDL3\/SDL_surface.h 942:34@
+sDL_SetSurfaceBlendMode
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for blit blending.
+  -> IO BG.CBool
+sDL_SetSurfaceBlendMode = hs_bindgen_8e7ff2b3301fecfa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceBlendMode@
+foreign import ccall safe "hs_bindgen_79a3cd778c72f8e2"
+  hs_bindgen_79a3cd778c72f8e2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceBlendMode@
+hs_bindgen_79a3cd778c72f8e2
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_79a3cd778c72f8e2 =
+  BG.fromFFIType hs_bindgen_79a3cd778c72f8e2_base
+
+-- | Get the blend mode used for blit operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceBlendMode'
+--
+--     [C declaration]: @SDL_GetSurfaceBlendMode@, defined at @SDL3\/SDL_surface.h 958:34@
+sDL_GetSurfaceBlendMode
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO BG.CBool
+sDL_GetSurfaceBlendMode = hs_bindgen_79a3cd778c72f8e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceClipRect@
+foreign import ccall safe "hs_bindgen_2820354795314f60"
+  hs_bindgen_2820354795314f60_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_SetSurfaceClipRect@
+hs_bindgen_2820354795314f60
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_2820354795314f60 =
+  BG.fromFFIType hs_bindgen_2820354795314f60_base
+
+-- | Set the clipping rectangle for a surface.
+--
+--     When @surface@ is the destination of a blit, only the area within the clip rectangle is drawn into.
+--
+--     Note that blits are automatically clipped to the edges of the source and destination surfaces.
+--
+--     [Returns]: true if the rectangle intersects the surface, otherwise false and blits will be completely clipped.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceClipRect'
+--
+--     [C declaration]: @SDL_SetSurfaceClipRect@, defined at @SDL3\/SDL_surface.h 982:34@
+sDL_SetSurfaceClipRect
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be clipped.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the clipping rectangle, or NULL to disable clipping.
+  -> IO BG.CBool
+sDL_SetSurfaceClipRect = hs_bindgen_2820354795314f60
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceClipRect@
+foreign import ccall safe "hs_bindgen_b910b24fe46481d6"
+  hs_bindgen_b910b24fe46481d6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_GetSurfaceClipRect@
+hs_bindgen_b910b24fe46481d6
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_b910b24fe46481d6 =
+  BG.fromFFIType hs_bindgen_b910b24fe46481d6_base
+
+-- | Get the clipping rectangle for a surface.
+--
+--     When @surface@ is the destination of a blit, only the area within the clip rectangle is drawn into.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceClipRect'
+--
+--     [C declaration]: @SDL_GetSurfaceClipRect@, defined at @SDL3\/SDL_surface.h 1004:34@
+sDL_GetSurfaceClipRect
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure representing the surface to be clipped.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the clipping rectangle for the surface.
+  -> IO BG.CBool
+sDL_GetSurfaceClipRect = hs_bindgen_b910b24fe46481d6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_FlipSurface@
+foreign import ccall safe "hs_bindgen_c88156522122ee98"
+  hs_bindgen_c88156522122ee98_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_FlipSurface@
+hs_bindgen_c88156522122ee98
+  :: BG.Ptr SDL_Surface
+  -> SDL_FlipMode
+  -> IO BG.CBool
+hs_bindgen_c88156522122ee98 =
+  BG.fromFFIType hs_bindgen_c88156522122ee98_base
+
+-- | Flip a surface vertically or horizontally.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_FlipSurface@, defined at @SDL3\/SDL_surface.h 1019:34@
+sDL_FlipSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to flip.
+  -> SDL_FlipMode
+  -- ^
+  --
+  --           [@flip@]: the direction to flip.
+  -> IO BG.CBool
+sDL_FlipSurface = hs_bindgen_c88156522122ee98
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_RotateSurface@
+foreign import ccall safe "hs_bindgen_a1316efcfef047d4"
+  hs_bindgen_a1316efcfef047d4_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_RotateSurface@
+hs_bindgen_a1316efcfef047d4
+  :: BG.Ptr SDL_Surface
+  -> BG.CFloat
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_a1316efcfef047d4 =
+  BG.fromFFIType hs_bindgen_a1316efcfef047d4_base
+
+-- | Return a copy of a surface rotated clockwise a number of degrees.
+--
+--     The angle of rotation can be negative for counter-clockwise rotation.
+--
+--     When the rotation isn\'t a multiple of 90 degrees, the resulting surface is larger than the original, with the background filled in with the colorkey, if available, or RGBA 255\/255\/255\/0 if not.
+--
+--     If @surface@ has the SDL_PROP_SURFACE_ROTATION_FLOAT property set on it, the new copy will have the adjusted value set: if the rotation property is 90 and @angle@ was 30, the new surface will have a property value of 60 (that is: to be upright vs gravity, this surface needs to rotate 60 more degrees). However, note that further rotations on the new surface in this example will produce unexpected results, since the image will have resized and padded to accommodate the not-90 degree angle.
+--
+--     [Returns]: a rotated copy of the surface or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_RotateSurface@, defined at @SDL3\/SDL_surface.h 1048:43@
+sDL_RotateSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to rotate.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@angle@]: the rotation angle, in degrees.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_RotateSurface = hs_bindgen_a1316efcfef047d4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_DuplicateSurface@
+foreign import ccall safe "hs_bindgen_6d95029f36464bfd"
+  hs_bindgen_6d95029f36464bfd_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_DuplicateSurface@
+hs_bindgen_6d95029f36464bfd
+  :: BG.Ptr SDL_Surface
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_6d95029f36464bfd =
+  BG.fromFFIType hs_bindgen_6d95029f36464bfd_base
+
+-- | Creates a new surface identical to the existing surface.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     The returned surface should be freed with @SDL_DestroySurface()@.
+--
+--     [Returns]: a copy of the surface or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_DuplicateSurface@, defined at @SDL3\/SDL_surface.h 1069:43@
+sDL_DuplicateSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to duplicate.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_DuplicateSurface = hs_bindgen_6d95029f36464bfd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ScaleSurface@
+foreign import ccall safe "hs_bindgen_face97baca762cbd"
+  hs_bindgen_face97baca762cbd_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ScaleSurface@
+hs_bindgen_face97baca762cbd
+  :: BG.Ptr SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL_ScaleMode
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_face97baca762cbd =
+  BG.fromFFIType hs_bindgen_face97baca762cbd_base
+
+-- | Creates a new surface identical to the existing surface, scaled to the desired size.
+--
+--     The returned surface should be freed with @SDL_DestroySurface()@.
+--
+--     [Returns]: a copy of the surface or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_ScaleSurface@, defined at @SDL3\/SDL_surface.h 1091:43@
+sDL_ScaleSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to duplicate and scale.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the new surface.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the new surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_ScaleSurface = hs_bindgen_face97baca762cbd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ConvertSurface@
+foreign import ccall safe "hs_bindgen_73e1e8c13e580d46"
+  hs_bindgen_73e1e8c13e580d46_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ConvertSurface@
+hs_bindgen_73e1e8c13e580d46
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_73e1e8c13e580d46 =
+  BG.fromFFIType hs_bindgen_73e1e8c13e580d46_base
+
+-- | Copy an existing surface to a new surface of the specified format.
+--
+--     This function is used to optimize images for faster /repeat/ blitting. This is accomplished by converting the original and storing the result as a new surface. The new, optimized surface can then be used as the source for future blits, making them faster.
+--
+--     If you are converting to an indexed surface and want to map colors to a palette, you can use @SDL_ConvertSurfaceAndColorspace()@ instead.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertSurfaceAndColorspace', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_ConvertSurface@, defined at @SDL3\/SDL_surface.h 1120:43@
+sDL_ConvertSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the existing 'SDL_Surface' structure to convert.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the new pixel format.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_ConvertSurface = hs_bindgen_73e1e8c13e580d46
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ConvertSurfaceAndColorspace@
+foreign import ccall safe "hs_bindgen_e534837314acf47f"
+  hs_bindgen_e534837314acf47f_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ConvertSurfaceAndColorspace@
+hs_bindgen_e534837314acf47f
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_e534837314acf47f =
+  BG.fromFFIType hs_bindgen_e534837314acf47f_base
+
+-- | Copy an existing surface to a new surface of the specified format and colorspace.
+--
+--     This function converts an existing surface to a new format and colorspace and returns the new surface. This will perform any pixel format and colorspace conversion needed.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertSurface', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_ConvertSurfaceAndColorspace@, defined at @SDL3\/SDL_surface.h 1149:43@
+sDL_ConvertSurfaceAndColorspace
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the existing 'SDL_Surface' structure to convert.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the new pixel format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette to use for indexed formats, may be NULL.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@colorspace@]: the new colorspace.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: an SDL_PropertiesID with additional color properties, or 0.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_ConvertSurfaceAndColorspace =
+  hs_bindgen_e534837314acf47f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ConvertPixels@
+foreign import ccall safe "hs_bindgen_435765f57837af03"
+  hs_bindgen_435765f57837af03_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ConvertPixels@
+hs_bindgen_435765f57837af03
+  :: BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> BG.Ptr BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_435765f57837af03 =
+  BG.fromFFIType hs_bindgen_435765f57837af03_base
+
+-- | Copy a block of pixels of one format to another format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertPixelsAndColorspace'
+--
+--     [C declaration]: @SDL_ConvertPixels@, defined at @SDL3\/SDL_surface.h 1173:34@
+sDL_ConvertPixels
+  :: BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the block to copy, in pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the block to copy, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with new pixel data.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> IO BG.CBool
+sDL_ConvertPixels = hs_bindgen_435765f57837af03
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ConvertPixelsAndColorspace@
+foreign import ccall safe "hs_bindgen_c1b70c1ec2328788"
+  hs_bindgen_c1b70c1ec2328788_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ConvertPixelsAndColorspace@
+hs_bindgen_c1b70c1ec2328788
+  :: BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> BG.Ptr BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_c1b70c1ec2328788 =
+  BG.fromFFIType hs_bindgen_c1b70c1ec2328788_base
+
+-- | Copy a block of pixels of one format and colorspace to another format and colorspace.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertPixels'
+--
+--     [C declaration]: @SDL_ConvertPixelsAndColorspace@, defined at @SDL3\/SDL_surface.h 1206:34@
+sDL_ConvertPixelsAndColorspace
+  :: BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the block to copy, in pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the block to copy, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@src_colorspace@]: an SDL_Colorspace value describing the colorspace of the @src@ pixels.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@src_properties@]: an SDL_PropertiesID with additional source color properties, or 0.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@dst_colorspace@]: an SDL_Colorspace value describing the colorspace of the @dst@ pixels.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@dst_properties@]: an SDL_PropertiesID with additional destination color properties, or 0.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with new pixel data.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> IO BG.CBool
+sDL_ConvertPixelsAndColorspace =
+  hs_bindgen_c1b70c1ec2328788
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_PremultiplyAlpha@
+foreign import ccall safe "hs_bindgen_8e4daa78971d0cb7"
+  hs_bindgen_8e4daa78971d0cb7_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_PremultiplyAlpha@
+hs_bindgen_8e4daa78971d0cb7
+  :: BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> BG.Ptr BG.Void
+  -> BG.CInt
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_8e4daa78971d0cb7 =
+  BG.fromFFIType hs_bindgen_8e4daa78971d0cb7_base
+
+-- | Premultiply the alpha on a block of pixels.
+--
+--     This is safe to use with src == dst, but not for other overlapping areas.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PremultiplyAlpha@, defined at @SDL3\/SDL_surface.h 1232:34@
+sDL_PremultiplyAlpha
+  :: BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the block to convert, in pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the block to convert, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with premultiplied pixel data.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@linear@]: true to convert from sRGB to linear space for the alpha multiplication, false to do multiplication in sRGB space.
+  -> IO BG.CBool
+sDL_PremultiplyAlpha = hs_bindgen_8e4daa78971d0cb7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_PremultiplySurfaceAlpha@
+foreign import ccall safe "hs_bindgen_56aa84cbef3d8f40"
+  hs_bindgen_56aa84cbef3d8f40_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_PremultiplySurfaceAlpha@
+hs_bindgen_56aa84cbef3d8f40
+  :: BG.Ptr SDL_Surface
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_56aa84cbef3d8f40 =
+  BG.fromFFIType hs_bindgen_56aa84cbef3d8f40_base
+
+-- | Premultiply the alpha in a surface.
+--
+--     This is safe to use with src == dst, but not for other overlapping areas.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PremultiplySurfaceAlpha@, defined at @SDL3\/SDL_surface.h 1250:34@
+sDL_PremultiplySurfaceAlpha
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to modify.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@linear@]: true to convert from sRGB to linear space for the alpha multiplication, false to do multiplication in sRGB space.
+  -> IO BG.CBool
+sDL_PremultiplySurfaceAlpha =
+  hs_bindgen_56aa84cbef3d8f40
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ClearSurface@
+foreign import ccall safe "hs_bindgen_e97c19a44df98438"
+  hs_bindgen_e97c19a44df98438_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ClearSurface@
+hs_bindgen_e97c19a44df98438
+  :: BG.Ptr SDL_Surface
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_e97c19a44df98438 =
+  BG.fromFFIType hs_bindgen_e97c19a44df98438_base
+
+-- | Clear a surface with a specific color, with floating point precision.
+--
+--     This function handles all surface formats, and ignores any clip rectangle.
+--
+--     If the surface is YUV, the color is assumed to be in the sRGB colorspace, otherwise the color is assumed to be in the colorspace of the surface.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ClearSurface@, defined at @SDL3\/SDL_surface.h 1273:34@
+sDL_ClearSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' to clear.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel, normally in the range 0-1.
+  -> IO BG.CBool
+sDL_ClearSurface = hs_bindgen_e97c19a44df98438
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_FillSurfaceRect@
+foreign import ccall safe "hs_bindgen_5dccf89603882fe7"
+  hs_bindgen_5dccf89603882fe7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_FillSurfaceRect@
+hs_bindgen_5dccf89603882fe7
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_5dccf89603882fe7 =
+  BG.fromFFIType hs_bindgen_5dccf89603882fe7_base
+
+-- | Perform a fast fill of a rectangle with a specific color.
+--
+--     @color@ should be a pixel of the format used by the surface, and can be generated by SDL_MapRGB() or SDL_MapRGBA(). If the color value contains an alpha component then the destination is simply filled with that alpha information, no blending takes place.
+--
+--     If there is a clip rectangle set on the destination (set via @SDL_SetSurfaceClipRect()@), then this function will fill based on the intersection of the clip rectangle and @rect@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FillSurfaceRects'
+--
+--     [C declaration]: @SDL_FillSurfaceRect@, defined at @SDL3\/SDL_surface.h 1301:34@
+sDL_FillSurfaceRect
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the drawing target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the rectangle to fill, or NULL to fill the entire surface.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@color@]: the color to fill with.
+  -> IO BG.CBool
+sDL_FillSurfaceRect = hs_bindgen_5dccf89603882fe7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_FillSurfaceRects@
+foreign import ccall safe "hs_bindgen_a2b5b19e2436d28a"
+  hs_bindgen_a2b5b19e2436d28a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_FillSurfaceRects@
+hs_bindgen_a2b5b19e2436d28a
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_a2b5b19e2436d28a =
+  BG.fromFFIType hs_bindgen_a2b5b19e2436d28a_base
+
+-- | Perform a fast fill of a set of rectangles with a specific color.
+--
+--     @color@ should be a pixel of the format used by the surface, and can be generated by SDL_MapRGB() or SDL_MapRGBA(). If the color value contains an alpha component then the destination is simply filled with that alpha information, no blending takes place.
+--
+--     If there is a clip rectangle set on the destination (set via @SDL_SetSurfaceClipRect()@), then this function will fill based on the intersection of the clip rectangle and @rect@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FillSurfaceRect'
+--
+--     [C declaration]: @SDL_FillSurfaceRects@, defined at @SDL3\/SDL_surface.h 1329:34@
+sDL_FillSurfaceRects
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the drawing target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rects@]: an array of SDL_Rects representing the rectangles to fill.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of rectangles in the array.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@color@]: the color to fill with.
+  -> IO BG.CBool
+sDL_FillSurfaceRects = hs_bindgen_a2b5b19e2436d28a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurface@
+foreign import ccall safe "hs_bindgen_b1a30c4f5f8d91a8"
+  hs_bindgen_b1a30c4f5f8d91a8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurface@
+hs_bindgen_b1a30c4f5f8d91a8
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_b1a30c4f5f8d91a8 =
+  BG.fromFFIType hs_bindgen_b1a30c4f5f8d91a8_base
+
+-- | Performs a fast blit from the source surface to the destination surface with clipping.
+--
+--     If either @srcrect@ or @dstrect@ are NULL, the entire surface (@src@ or @dst@) is copied while ensuring clipping to @dst->clip_rect@.
+--
+--     The blit function should not be called on a locked surface.
+--
+--     The blit semantics for surfaces with and without blending and colorkey are defined as follows:
+--
+--     @
+--      RGBA->RGB:
+--        Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source alpha-channel and per-surface alpha)
+--         SDL_SRCCOLORKEY ignored.
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB.
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         RGB values of the source color key, ignoring alpha in the
+--         comparison.
+--
+--     RGB->RGBA:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source per-surface alpha)
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB, set destination alpha to source per-surface alpha value.
+--       both:
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         source color key.
+--
+--     RGBA->RGBA:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source alpha-channel and per-surface alpha)
+--         SDL_SRCCOLORKEY ignored.
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy all of RGBA to the destination.
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         RGB values of the source color key, ignoring alpha in the
+--         comparison.
+--
+--     RGB->RGB:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source per-surface alpha)
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB.
+--       both:
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         source color key.
+--     @
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurfaceScaled'
+--
+--     [C declaration]: @SDL_BlitSurface@, defined at @SDL3\/SDL_surface.h 1402:34@
+sDL_BlitSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the x and y position in the destination surface, or NULL for (0,0). The width and height are ignored, and are copied from @srcrect@. If you want a specific width and height, you should use @SDL_BlitSurfaceScaled()@.
+  -> IO BG.CBool
+sDL_BlitSurface = hs_bindgen_b1a30c4f5f8d91a8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurfaceUnchecked@
+foreign import ccall safe "hs_bindgen_f01f13adea578bc6"
+  hs_bindgen_f01f13adea578bc6_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurfaceUnchecked@
+hs_bindgen_f01f13adea578bc6
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_f01f13adea578bc6 =
+  BG.fromFFIType hs_bindgen_f01f13adea578bc6_base
+
+-- | Perform low-level surface blitting only.
+--
+--     This is a semi-private blit function and it performs low-level surface blitting, assuming the input rectangles have already been clipped.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceUnchecked@, defined at @SDL3\/SDL_surface.h 1426:34@
+sDL_BlitSurfaceUnchecked
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, may not be NULL.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, may not be NULL.
+  -> IO BG.CBool
+sDL_BlitSurfaceUnchecked =
+  hs_bindgen_f01f13adea578bc6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurfaceScaled@
+foreign import ccall safe "hs_bindgen_ff01194286dad7f2"
+  hs_bindgen_ff01194286dad7f2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurfaceScaled@
+hs_bindgen_ff01194286dad7f2
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_ff01194286dad7f2 =
+  BG.fromFFIType hs_bindgen_ff01194286dad7f2_base
+
+-- | Perform a scaled blit to a destination surface, which may be of a different format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceScaled@, defined at @SDL3\/SDL_surface.h 1450:34@
+sDL_BlitSurfaceScaled
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire destination surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO BG.CBool
+sDL_BlitSurfaceScaled = hs_bindgen_ff01194286dad7f2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurfaceUncheckedScaled@
+foreign import ccall safe "hs_bindgen_203cef09fdf11016"
+  hs_bindgen_203cef09fdf11016_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurfaceUncheckedScaled@
+hs_bindgen_203cef09fdf11016
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_203cef09fdf11016 =
+  BG.fromFFIType hs_bindgen_203cef09fdf11016_base
+
+-- | Perform low-level surface scaled blitting only.
+--
+--     This is a semi-private function and it performs low-level surface blitting, assuming the input rectangles have already been clipped.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurfaceScaled'
+--
+--     [C declaration]: @SDL_BlitSurfaceUncheckedScaled@, defined at @SDL3\/SDL_surface.h 1475:34@
+sDL_BlitSurfaceUncheckedScaled
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, may not be NULL.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, may not be NULL.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO BG.CBool
+sDL_BlitSurfaceUncheckedScaled =
+  hs_bindgen_203cef09fdf11016
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_StretchSurface@
+foreign import ccall safe "hs_bindgen_3f0e13150dff4407"
+  hs_bindgen_3f0e13150dff4407_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_StretchSurface@
+hs_bindgen_3f0e13150dff4407
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_3f0e13150dff4407 =
+  BG.fromFFIType hs_bindgen_3f0e13150dff4407_base
+
+-- | Perform a stretched pixel copy from one surface to another.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_BlitSurfaceScaled'
+--
+--     [C declaration]: @SDL_StretchSurface@, defined at @SDL3\/SDL_surface.h 1498:34@
+sDL_StretchSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire destination surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO BG.CBool
+sDL_StretchSurface = hs_bindgen_3f0e13150dff4407
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurfaceTiled@
+foreign import ccall safe "hs_bindgen_d87d2c7a0fc3e08c"
+  hs_bindgen_d87d2c7a0fc3e08c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurfaceTiled@
+hs_bindgen_d87d2c7a0fc3e08c
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_d87d2c7a0fc3e08c =
+  BG.fromFFIType hs_bindgen_d87d2c7a0fc3e08c_base
+
+-- | Perform a tiled blit to a destination surface, which may be of a different format.
+--
+--     The pixels in @srcrect@ will be repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceTiled@, defined at @SDL3\/SDL_surface.h 1523:34@
+sDL_BlitSurfaceTiled
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO BG.CBool
+sDL_BlitSurfaceTiled = hs_bindgen_d87d2c7a0fc3e08c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurfaceTiledWithScale@
+foreign import ccall safe "hs_bindgen_a0b5a4d660b97157"
+  hs_bindgen_a0b5a4d660b97157_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Float
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurfaceTiledWithScale@
+hs_bindgen_a0b5a4d660b97157
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.CFloat
+  -> SDL_ScaleMode
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_a0b5a4d660b97157 =
+  BG.fromFFIType hs_bindgen_a0b5a4d660b97157_base
+
+-- | Perform a scaled and tiled blit to a destination surface, which may be of a different format.
+--
+--     The pixels in @srcrect@ will be scaled and repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceTiledWithScale@, defined at @SDL3\/SDL_surface.h 1552:34@
+sDL_BlitSurfaceTiledWithScale
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform srcrect into the destination rectangle, e.g. a 32x32 texture with a scale of 2 would fill 64x64 tiles.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: scale algorithm to be used.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO BG.CBool
+sDL_BlitSurfaceTiledWithScale =
+  hs_bindgen_a0b5a4d660b97157
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurface9Grid@
+foreign import ccall safe "hs_bindgen_c841a6c05cf5fdff"
+  hs_bindgen_c841a6c05cf5fdff_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> Float
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_BlitSurface9Grid@
+hs_bindgen_c841a6c05cf5fdff
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CFloat
+  -> SDL_ScaleMode
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_c841a6c05cf5fdff =
+  BG.fromFFIType hs_bindgen_c841a6c05cf5fdff_base
+
+-- | Perform a scaled blit using the 9-grid algorithm to a destination surface, which may be of a different format.
+--
+--     The pixels in the source surface are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then stretched into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurface9Grid@, defined at @SDL3\/SDL_surface.h 1588:34@
+sDL_BlitSurface9Grid
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire surface.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled blit.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: scale algorithm to be used.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO BG.CBool
+sDL_BlitSurface9Grid = hs_bindgen_c841a6c05cf5fdff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_MapSurfaceRGB@
+foreign import ccall safe "hs_bindgen_c74008884f7b6019"
+  hs_bindgen_c74008884f7b6019_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_MapSurfaceRGB@
+hs_bindgen_c74008884f7b6019
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_c74008884f7b6019 =
+  BG.fromFFIType hs_bindgen_c74008884f7b6019_base
+
+-- | Map an RGB triple to an opaque pixel value for a surface.
+--
+--     This function maps the RGB color value to the specified pixel format and returns the pixel value best approximating the given RGB color value for the given pixel format.
+--
+--     If the surface has a palette, the index of the closest matching color in the palette will be returned.
+--
+--     If the surface pixel format has an alpha component it will be returned as all 1 bits (fully opaque).
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MapSurfaceRGBA'
+--
+--     [C declaration]: @SDL_MapSurfaceRGB@, defined at @SDL3\/SDL_surface.h 1621:36@
+sDL_MapSurfaceRGB
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to use for the pixel format and palette.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_MapSurfaceRGB = hs_bindgen_c74008884f7b6019
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_MapSurfaceRGBA@
+foreign import ccall safe "hs_bindgen_d299991f35295874"
+  hs_bindgen_d299991f35295874_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_MapSurfaceRGBA@
+hs_bindgen_d299991f35295874
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_d299991f35295874 =
+  BG.fromFFIType hs_bindgen_d299991f35295874_base
+
+-- | Map an RGBA quadruple to a pixel value for a surface.
+--
+--     This function maps the RGBA color value to the specified pixel format and returns the pixel value best approximating the given RGBA color value for the given pixel format.
+--
+--     If the surface pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).
+--
+--     If the surface has a palette, the index of the closest matching color in the palette will be returned.
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MapSurfaceRGB'
+--
+--     [C declaration]: @SDL_MapSurfaceRGBA@, defined at @SDL3\/SDL_surface.h 1655:36@
+sDL_MapSurfaceRGBA
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to use for the pixel format and palette.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel in the range 0-255.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_MapSurfaceRGBA = hs_bindgen_d299991f35295874
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ReadSurfacePixel@
+foreign import ccall safe "hs_bindgen_a30b6c841f82ebcc"
+  hs_bindgen_a30b6c841f82ebcc_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ReadSurfacePixel@
+hs_bindgen_a30b6c841f82ebcc
+  :: BG.Ptr SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_a30b6c841f82ebcc =
+  BG.fromFFIType hs_bindgen_a30b6c841f82ebcc_base
+
+-- | Retrieves a single pixel from a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     Like SDL_GetRGBA, this uses the entire 0..255 range when converting color components from pixel formats with less than 8 bits per RGB component.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadSurfacePixel@, defined at @SDL3\/SDL_surface.h 1685:34@
+sDL_ReadSurfacePixel
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to read.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha channel, 0-255, or NULL to ignore this channel.
+  -> IO BG.CBool
+sDL_ReadSurfacePixel = hs_bindgen_a30b6c841f82ebcc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ReadSurfacePixelFloat@
+foreign import ccall safe "hs_bindgen_1a263d49fd0125f6"
+  hs_bindgen_1a263d49fd0125f6_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_ReadSurfacePixelFloat@
+hs_bindgen_1a263d49fd0125f6
+  :: BG.Ptr SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_1a263d49fd0125f6 =
+  BG.fromFFIType hs_bindgen_1a263d49fd0125f6_base
+
+-- | Retrieves a single pixel from a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadSurfacePixelFloat@, defined at @SDL3\/SDL_surface.h 1712:34@
+sDL_ReadSurfacePixelFloat
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to read.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> IO BG.CBool
+sDL_ReadSurfacePixelFloat =
+  hs_bindgen_1a263d49fd0125f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_WriteSurfacePixel@
+foreign import ccall safe "hs_bindgen_51ee7af8b74364b9"
+  hs_bindgen_51ee7af8b74364b9_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_WriteSurfacePixel@
+hs_bindgen_51ee7af8b74364b9
+  :: BG.Ptr SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_51ee7af8b74364b9 =
+  BG.fromFFIType hs_bindgen_51ee7af8b74364b9_base
+
+-- | Writes a single pixel to a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     Like SDL_MapRGBA, this uses the entire 0..255 range when converting color components from pixel formats with less than 8 bits per RGB component.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteSurfacePixel@, defined at @SDL3\/SDL_surface.h 1738:34@
+sDL_WriteSurfacePixel
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to write.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red channel value, 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green channel value, 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue channel value, 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: the alpha channel value, 0-255.
+  -> IO BG.CBool
+sDL_WriteSurfacePixel = hs_bindgen_51ee7af8b74364b9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_WriteSurfacePixelFloat@
+foreign import ccall safe "hs_bindgen_0a72c0432b672135"
+  hs_bindgen_0a72c0432b672135_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Safe_SDL_WriteSurfacePixelFloat@
+hs_bindgen_0a72c0432b672135
+  :: BG.Ptr SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_0a72c0432b672135 =
+  BG.fromFFIType hs_bindgen_0a72c0432b672135_base
+
+-- | Writes a single pixel to a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteSurfacePixelFloat@, defined at @SDL3\/SDL_surface.h 1761:34@
+sDL_WriteSurfacePixelFloat
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to write.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@r@]: the red channel value, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@g@]: the green channel value, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@b@]: the blue channel value, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@a@]: the alpha channel value, normally in the range 0-1.
+  -> IO BG.CBool
+sDL_WriteSurfacePixelFloat =
+  hs_bindgen_0a72c0432b672135
diff --git a/src/SDL3/Sys/Bindgen/Surface/Unsafe.hs b/src/SDL3/Sys/Bindgen/Surface/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Surface/Unsafe.hs
@@ -0,0 +1,3851 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Surface.Unsafe (
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_CreateSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_CreateSurfaceFrom,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_DestroySurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_GetSurfaceProperties,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SetSurfaceColorspace,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_GetSurfaceColorspace,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_CreateSurfacePalette,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SetSurfacePalette,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_GetSurfacePalette,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_AddSurfaceAlternateImage,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SurfaceHasAlternateImages,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_GetSurfaceImages,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_RemoveSurfaceAlternateImages,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_LockSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_UnlockSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_LoadSurface_IO,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_LoadSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_LoadBMP_IO,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_LoadBMP,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SaveBMP_IO,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SaveBMP,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_LoadPNG_IO,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_LoadPNG,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SavePNG_IO,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SavePNG,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SetSurfaceRLE,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SurfaceHasRLE,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SetSurfaceColorKey,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SurfaceHasColorKey,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_GetSurfaceColorKey,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SetSurfaceColorMod,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_GetSurfaceColorMod,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SetSurfaceAlphaMod,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_GetSurfaceAlphaMod,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SetSurfaceBlendMode,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_GetSurfaceBlendMode,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_SetSurfaceClipRect,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_GetSurfaceClipRect,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_FlipSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_RotateSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_DuplicateSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_ScaleSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_ConvertSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_ConvertSurfaceAndColorspace,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_ConvertPixels,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_ConvertPixelsAndColorspace,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_PremultiplyAlpha,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_PremultiplySurfaceAlpha,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_ClearSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_FillSurfaceRect,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_FillSurfaceRects,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_BlitSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_BlitSurfaceUnchecked,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_BlitSurfaceScaled,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_BlitSurfaceUncheckedScaled,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_StretchSurface,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_BlitSurfaceTiled,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_BlitSurfaceTiledWithScale,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_BlitSurface9Grid,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_MapSurfaceRGB,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_MapSurfaceRGBA,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_ReadSurfacePixel,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_ReadSurfacePixelFloat,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_WriteSurfacePixel,
+  SDL3.Sys.Bindgen.Surface.Unsafe.sDL_WriteSurfacePixelFloat,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Blendmode qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_surface.h>"
+         , "SDL_Surface *hs_bindgen_168e356f6cfde2ca ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSurface)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_19204ffb79c10370 ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  void *arg4,"
+         , "  signed int arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSurfaceFrom)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "void hs_bindgen_173baf44c4ee5552 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroySurface)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_104a480f6f0ca65f ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceProperties)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0511900fd59c0e54 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Colorspace arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceColorspace)(arg1, arg2);"
+         , "}"
+         , "SDL_Colorspace hs_bindgen_e144267d4a5dc8c1 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceColorspace)(arg1);"
+         , "}"
+         , "SDL_Palette *hs_bindgen_518323a2443a645c ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateSurfacePalette)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_6cb3893d72b38425 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Palette *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfacePalette)(arg1, arg2);"
+         , "}"
+         , "SDL_Palette *hs_bindgen_c36a6adcce04e3d9 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfacePalette)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_36366ea481866b40 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_AddSurfaceAlternateImage)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c8c9d6b2ea4d4292 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SurfaceHasAlternateImages)(arg1);"
+         , "}"
+         , "SDL_Surface **hs_bindgen_b3d55dcc42d5db12 ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceImages)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_1adedb2719efa1bf ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_RemoveSurfaceAlternateImages)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8363af1ae03d45b9 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_LockSurface)(arg1);"
+         , "}"
+         , "void hs_bindgen_0b94cbec8aca2abc ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_UnlockSurface)(arg1);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Surface *hs_bindgen_1a1549d61e2d7c6f ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_LoadSurface_IO)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_LoadSurface_IO requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Surface *hs_bindgen_84c82bda97a82d45 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_LoadSurface)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_LoadSurface requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_Surface *hs_bindgen_04dc7704680e62ca ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadBMP_IO)(arg1, arg2);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_fade244cdadaaa01 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_LoadBMP)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_9c98f1ae4256924d ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_IOStream *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SaveBMP_IO)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_66fb79ef3bca90df ("
+         , "  SDL_Surface *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SaveBMP)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Surface *hs_bindgen_7160fe58e1c51f22 ("
+         , "  SDL_IOStream *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_LoadPNG_IO)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_LoadPNG_IO requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Surface *hs_bindgen_bc316d886d9c3957 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_LoadPNG)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_LoadPNG requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_9c8e4c9fc901ee28 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_IOStream *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SavePNG_IO)(arg1, arg2, arg3);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; SDL_SetError(\"SDL_SavePNG_IO requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_759469fef46a8cd4 ("
+         , "  SDL_Surface *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SavePNG)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SavePNG requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_5d1b864a1323d92d ("
+         , "  SDL_Surface *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceRLE)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b51ce9068c82d3d0 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SurfaceHasRLE)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_13efdbaff73dc30f ("
+         , "  SDL_Surface *arg1,"
+         , "  _Bool arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceColorKey)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_998ae6f993d45bac ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SurfaceHasColorKey)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_463737aa98969701 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint32 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceColorKey)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5802144e4d11fa38 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceColorMod)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_8f67dce9db98e6f9 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 *arg2,"
+         , "  Uint8 *arg3,"
+         , "  Uint8 *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceColorMod)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_2f27871d133fe193 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceAlphaMod)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_62e7ffa57cc86c89 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceAlphaMod)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_31b5f1226bf51118 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_BlendMode arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_e69bee46110b6faa ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_BlendMode *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceBlendMode)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d3f690ca2bc82289 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetSurfaceClipRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_510cbf12ad718ad5 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetSurfaceClipRect)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c9050e1a6dbcc389 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_FlipMode arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_FlipSurface)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "SDL_Surface *hs_bindgen_b68c60a70d17f528 ("
+         , "  SDL_Surface *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_RotateSurface)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_RotateSurface requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "SDL_Surface *hs_bindgen_fb5b3c5560c73662 ("
+         , "  SDL_Surface *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_DuplicateSurface)(arg1);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_302fe5f6d166cef5 ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_ScaleMode arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_ScaleSurface)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_2d38a11d9ed40ec3 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_PixelFormat arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertSurface)(arg1, arg2);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_589af8fb0fd3b451 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_PixelFormat arg2,"
+         , "  SDL_Palette *arg3,"
+         , "  SDL_Colorspace arg4,"
+         , "  SDL_PropertiesID arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertSurfaceAndColorspace)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_c4ac87b53bb7fbaa ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  void const *arg4,"
+         , "  signed int arg5,"
+         , "  SDL_PixelFormat arg6,"
+         , "  void *arg7,"
+         , "  signed int arg8"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertPixels)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);"
+         , "}"
+         , "_Bool hs_bindgen_384b325525f7f1f3 ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  SDL_Colorspace arg4,"
+         , "  SDL_PropertiesID arg5,"
+         , "  void const *arg6,"
+         , "  signed int arg7,"
+         , "  SDL_PixelFormat arg8,"
+         , "  SDL_Colorspace arg9,"
+         , "  SDL_PropertiesID arg10,"
+         , "  void *arg11,"
+         , "  signed int arg12"
+         , ")"
+         , "{"
+         , "  return (SDL_ConvertPixelsAndColorspace)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10, arg11, arg12);"
+         , "}"
+         , "_Bool hs_bindgen_9a5c070f0253ae0a ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  SDL_PixelFormat arg3,"
+         , "  void const *arg4,"
+         , "  signed int arg5,"
+         , "  SDL_PixelFormat arg6,"
+         , "  void *arg7,"
+         , "  signed int arg8,"
+         , "  _Bool arg9"
+         , ")"
+         , "{"
+         , "  return (SDL_PremultiplyAlpha)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9);"
+         , "}"
+         , "_Bool hs_bindgen_7065a7a3bd7041c8 ("
+         , "  SDL_Surface *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_PremultiplySurfaceAlpha)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_de44f8d6106c7e71 ("
+         , "  SDL_Surface *arg1,"
+         , "  float arg2,"
+         , "  float arg3,"
+         , "  float arg4,"
+         , "  float arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_ClearSurface)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_8e254769393349cc ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_FillSurfaceRect)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_4eb2bdf51787fb5f ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3,"
+         , "  Uint32 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_FillSurfaceRects)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_dd9a2fd8000655e0 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurface)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_f1d3fd72bc95a376 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurfaceUnchecked)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_ca439260becd97fa ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4,"
+         , "  SDL_ScaleMode arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurfaceScaled)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_273462ee987888b2 ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4,"
+         , "  SDL_ScaleMode arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurfaceUncheckedScaled)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_cbba042ce7137c9a ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4,"
+         , "  SDL_ScaleMode arg5"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 2, 4)"
+         , "  return (SDL_StretchSurface)(arg1, arg2, arg3, arg4, arg5);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; (void)arg4; (void)arg5; SDL_SetError(\"SDL_StretchSurface requires SDL >= 3.2.4\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_cc06339086116f6d ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  SDL_Surface *arg3,"
+         , "  SDL_Rect const *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurfaceTiled)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_50d8214074d2e91b ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  float arg3,"
+         , "  SDL_ScaleMode arg4,"
+         , "  SDL_Surface *arg5,"
+         , "  SDL_Rect const *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurfaceTiledWithScale)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "_Bool hs_bindgen_84940b463dd6473c ("
+         , "  SDL_Surface *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5,"
+         , "  signed int arg6,"
+         , "  float arg7,"
+         , "  SDL_ScaleMode arg8,"
+         , "  SDL_Surface *arg9,"
+         , "  SDL_Rect const *arg10"
+         , ")"
+         , "{"
+         , "  return (SDL_BlitSurface9Grid)(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, arg10);"
+         , "}"
+         , "Uint32 hs_bindgen_5dfeeef5d5aa83da ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_MapSurfaceRGB)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "Uint32 hs_bindgen_456d7e009be906d0 ("
+         , "  SDL_Surface *arg1,"
+         , "  Uint8 arg2,"
+         , "  Uint8 arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_MapSurfaceRGBA)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_76b097df3deb39a7 ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  Uint8 *arg4,"
+         , "  Uint8 *arg5,"
+         , "  Uint8 *arg6,"
+         , "  Uint8 *arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadSurfacePixel)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_1dba774402b79156 ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  float *arg4,"
+         , "  float *arg5,"
+         , "  float *arg6,"
+         , "  float *arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_ReadSurfacePixelFloat)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_66bf3500cd5641bd ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  Uint8 arg4,"
+         , "  Uint8 arg5,"
+         , "  Uint8 arg6,"
+         , "  Uint8 arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteSurfacePixel)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         , "_Bool hs_bindgen_91babb583602ef71 ("
+         , "  SDL_Surface *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  float arg4,"
+         , "  float arg5,"
+         , "  float arg6,"
+         , "  float arg7"
+         , ")"
+         , "{"
+         , "  return (SDL_WriteSurfacePixelFloat)(arg1, arg2, arg3, arg4, arg5, arg6, arg7);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_CreateSurface@
+foreign import ccall unsafe "hs_bindgen_168e356f6cfde2ca"
+  hs_bindgen_168e356f6cfde2ca_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_CreateSurface@
+hs_bindgen_168e356f6cfde2ca
+  :: BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_168e356f6cfde2ca =
+  BG.fromFFIType hs_bindgen_168e356f6cfde2ca_base
+
+-- | Allocate a new surface with a specific pixel format.
+--
+--     The pixels of the new surface are initialized to zero.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSurfaceFrom', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_CreateSurface@, defined at @SDL3\/SDL_surface.h 173:43@
+sDL_CreateSurface
+  :: BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the surface.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the surface.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the SDL_PixelFormat for the new surface\'s pixel format.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_CreateSurface = hs_bindgen_168e356f6cfde2ca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_CreateSurfaceFrom@
+foreign import ccall unsafe "hs_bindgen_19204ffb79c10370"
+  hs_bindgen_19204ffb79c10370_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_CreateSurfaceFrom@
+hs_bindgen_19204ffb79c10370
+  :: BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> BG.Ptr BG.Void
+  -> BG.CInt
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_19204ffb79c10370 =
+  BG.fromFFIType hs_bindgen_19204ffb79c10370_base
+
+-- | Allocate a new surface with a specific pixel format and existing pixel data.
+--
+--     No copy is made of the pixel data. Pixel data is not managed automatically; you must free the surface before you free the pixel data.
+--
+--     Pitch is the offset in bytes from one row of pixels to the next, e.g. @width*4@ for @SDL_PIXELFORMAT_RGBA8888@.
+--
+--     You may pass NULL for pixels and 0 for pitch to create a surface that you will fill in with valid values later.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSurface', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_CreateSurfaceFrom@, defined at @SDL3\/SDL_surface.h 203:43@
+sDL_CreateSurfaceFrom
+  :: BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the surface.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the surface.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the SDL_PixelFormat for the new surface\'s pixel format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@pixels@]: a pointer to existing pixel data.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@pitch@]: the number of bytes between each row, including padding.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_CreateSurfaceFrom = hs_bindgen_19204ffb79c10370
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_DestroySurface@
+foreign import ccall unsafe "hs_bindgen_173baf44c4ee5552"
+  hs_bindgen_173baf44c4ee5552_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_DestroySurface@
+hs_bindgen_173baf44c4ee5552
+  :: BG.Ptr SDL_Surface
+  -> IO ()
+hs_bindgen_173baf44c4ee5552 =
+  BG.fromFFIType hs_bindgen_173baf44c4ee5552_base
+
+-- | Free a surface.
+--
+--     It is safe to pass NULL to this function.
+--
+--     [Thread safety]: No other thread should be using the surface when it is freed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateSurface', 'sDL_CreateSurfaceFrom'
+--
+--     [C declaration]: @SDL_DestroySurface@, defined at @SDL3\/SDL_surface.h 219:34@
+sDL_DestroySurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' to free.
+  -> IO ()
+sDL_DestroySurface = hs_bindgen_173baf44c4ee5552
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceProperties@
+foreign import ccall unsafe "hs_bindgen_104a480f6f0ca65f"
+  hs_bindgen_104a480f6f0ca65f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceProperties@
+hs_bindgen_104a480f6f0ca65f
+  :: BG.Ptr SDL_Surface
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_104a480f6f0ca65f =
+  BG.fromFFIType hs_bindgen_104a480f6f0ca65f_base
+
+-- | Get the properties associated with a surface.
+--
+--     The following properties are understood by SDL:
+--
+--     * @'sDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point surfaces, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 203 for HDR10 surfaces and 1.0 for floating point surfaces.
+--
+--     * @'sDL_PROP_SURFACE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point surfaces, this defines the maximum dynamic range used by the content, in terms of the SDR white point. This defaults to 0.0, which disables tone mapping.
+--
+--     * @'sDL_PROP_SURFACE_TONEMAP_OPERATOR_STRING'@: the tone mapping operator used when compressing from a surface with high dynamic range to another with lower dynamic range. Currently this supports \"chrome\", which uses the same tone mapping that Chrome uses for HDR content, the form \"*=N\", where N is a floating point scale factor applied in linear space, and \"none\", which disables tone mapping. This defaults to \"chrome\".
+--
+--     * @'sDL_PROP_SURFACE_HOTSPOT_X_NUMBER'@: the hotspot pixel offset from the left edge of the image, if this surface is being used as a cursor.
+--
+--     * @'sDL_PROP_SURFACE_HOTSPOT_Y_NUMBER'@: the hotspot pixel offset from the top edge of the image, if this surface is being used as a cursor.
+--
+--     * @'sDL_PROP_SURFACE_ROTATION_FLOAT'@: the number of degrees a surface\'s data is meant to be rotated clockwise to make the image right-side up. Default
+--       1. This is used by the camera API, if a mobile device is oriented differently than what its camera provides (i.e. - the camera always provides portrait images but the phone is being held in landscape orientation). Since SDL 3.4.0.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSurfaceProperties@, defined at @SDL3\/SDL_surface.h 259:46@
+sDL_GetSurfaceProperties
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetSurfaceProperties =
+  hs_bindgen_104a480f6f0ca65f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceColorspace@
+foreign import ccall unsafe "hs_bindgen_0511900fd59c0e54"
+  hs_bindgen_0511900fd59c0e54_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceColorspace@
+hs_bindgen_0511900fd59c0e54
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -> IO BG.CBool
+hs_bindgen_0511900fd59c0e54 =
+  BG.fromFFIType hs_bindgen_0511900fd59c0e54_base
+
+-- | Set the colorspace used by a surface.
+--
+--     Setting the colorspace doesn\'t change the pixels, only how they are interpreted in color operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorspace'
+--
+--     [C declaration]: @SDL_SetSurfaceColorspace@, defined at @SDL3\/SDL_surface.h 287:34@
+sDL_SetSurfaceColorspace
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@colorspace@]: an SDL_Colorspace value describing the surface colorspace.
+  -> IO BG.CBool
+sDL_SetSurfaceColorspace =
+  hs_bindgen_0511900fd59c0e54
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceColorspace@
+foreign import ccall unsafe "hs_bindgen_e144267d4a5dc8c1"
+  hs_bindgen_e144267d4a5dc8c1_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceColorspace@
+hs_bindgen_e144267d4a5dc8c1
+  :: BG.Ptr SDL_Surface
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+hs_bindgen_e144267d4a5dc8c1 =
+  BG.fromFFIType hs_bindgen_e144267d4a5dc8c1_base
+
+-- | Get the colorspace used by a surface.
+--
+--     The colorspace defaults to SDL_COLORSPACE_SRGB_LINEAR for floating point formats, SDL_COLORSPACE_HDR10 for 10-bit formats, SDL_COLORSPACE_SRGB for other RGB surfaces and SDL_COLORSPACE_BT709_FULL for YUV textures.
+--
+--     [Returns]: the colorspace used by the surface, or SDL_COLORSPACE_UNKNOWN if the surface is NULL.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceColorspace'
+--
+--     [C declaration]: @SDL_GetSurfaceColorspace@, defined at @SDL3\/SDL_surface.h 307:44@
+sDL_GetSurfaceColorspace
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+sDL_GetSurfaceColorspace =
+  hs_bindgen_e144267d4a5dc8c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_CreateSurfacePalette@
+foreign import ccall unsafe "hs_bindgen_518323a2443a645c"
+  hs_bindgen_518323a2443a645c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_CreateSurfacePalette@
+hs_bindgen_518323a2443a645c
+  :: BG.Ptr SDL_Surface
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+hs_bindgen_518323a2443a645c =
+  BG.fromFFIType hs_bindgen_518323a2443a645c_base
+
+-- | Create a palette and associate it with a surface.
+--
+--     This function creates a palette compatible with the provided surface. The palette is then returned for you to modify, and the surface will automatically use the new palette in future operations. You do not need to destroy the returned palette, it will be freed when the reference count reaches 0, usually when the surface is destroyed.
+--
+--     Bitmap surfaces (with format SDL_PIXELFORMAT_INDEX1LSB or SDL_PIXELFORMAT_INDEX1MSB) will have the palette initialized with 0 as white and 1 as black. Other surfaces will get a palette initialized with white in every entry.
+--
+--     If this function is called for a surface that already has a palette, a new palette will be created to replace it.
+--
+--     [Returns]: a new SDL_Palette structure on success or NULL on failure (e.g. if the surface didn\'t have an index format); call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_SetPaletteColors
+--
+--     [C declaration]: @SDL_CreateSurfacePalette@, defined at @SDL3\/SDL_surface.h 338:43@
+sDL_CreateSurfacePalette
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+sDL_CreateSurfacePalette =
+  hs_bindgen_518323a2443a645c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfacePalette@
+foreign import ccall unsafe "hs_bindgen_6cb3893d72b38425"
+  hs_bindgen_6cb3893d72b38425_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfacePalette@
+hs_bindgen_6cb3893d72b38425
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -> IO BG.CBool
+hs_bindgen_6cb3893d72b38425 =
+  BG.fromFFIType hs_bindgen_6cb3893d72b38425_base
+
+-- | Set the palette used by a surface.
+--
+--     Setting the palette keeps an internal reference to the palette, which can be safely destroyed afterwards.
+--
+--     A single palette can be shared with many surfaces.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreatePalette, 'sDL_GetSurfacePalette'
+--
+--     [C declaration]: @SDL_SetSurfacePalette@, defined at @SDL3\/SDL_surface.h 361:34@
+sDL_SetSurfacePalette
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the SDL_Palette structure to use.
+  -> IO BG.CBool
+sDL_SetSurfacePalette = hs_bindgen_6cb3893d72b38425
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfacePalette@
+foreign import ccall unsafe "hs_bindgen_c36a6adcce04e3d9"
+  hs_bindgen_c36a6adcce04e3d9_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfacePalette@
+hs_bindgen_c36a6adcce04e3d9
+  :: BG.Ptr SDL_Surface
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+hs_bindgen_c36a6adcce04e3d9 =
+  BG.fromFFIType hs_bindgen_c36a6adcce04e3d9_base
+
+-- | Get the palette used by a surface.
+--
+--     [Returns]: a pointer to the palette used by the surface, or NULL if there is no palette used.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfacePalette'
+--
+--     [C declaration]: @SDL_GetSurfacePalette@, defined at @SDL3\/SDL_surface.h 376:43@
+sDL_GetSurfacePalette
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+sDL_GetSurfacePalette = hs_bindgen_c36a6adcce04e3d9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_AddSurfaceAlternateImage@
+foreign import ccall unsafe "hs_bindgen_36366ea481866b40"
+  hs_bindgen_36366ea481866b40_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_AddSurfaceAlternateImage@
+hs_bindgen_36366ea481866b40
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_36366ea481866b40 =
+  BG.fromFFIType hs_bindgen_36366ea481866b40_base
+
+-- | Add an alternate version of a surface.
+--
+--     This function adds an alternate version of this surface, usually used for content with high DPI representations like cursors or icons. The size, format, and content do not need to match the original surface, and these alternate versions will not be updated when the original surface changes.
+--
+--     This function adds a reference to the alternate version, so you should call @SDL_DestroySurface()@ on the image after this call.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveSurfaceAlternateImages', 'sDL_GetSurfaceImages', 'sDL_SurfaceHasAlternateImages'
+--
+--     [C declaration]: @SDL_AddSurfaceAlternateImage@, defined at @SDL3\/SDL_surface.h 404:34@
+sDL_AddSurfaceAlternateImage
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@image@]: a pointer to an alternate 'SDL_Surface' to associate with this surface.
+  -> IO BG.CBool
+sDL_AddSurfaceAlternateImage =
+  hs_bindgen_36366ea481866b40
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SurfaceHasAlternateImages@
+foreign import ccall unsafe "hs_bindgen_c8c9d6b2ea4d4292"
+  hs_bindgen_c8c9d6b2ea4d4292_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SurfaceHasAlternateImages@
+hs_bindgen_c8c9d6b2ea4d4292
+  :: BG.Ptr SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_c8c9d6b2ea4d4292 =
+  BG.fromFFIType hs_bindgen_c8c9d6b2ea4d4292_base
+
+-- | Return whether a surface has alternate versions available.
+--
+--     [Returns]: true if alternate versions are available or false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddSurfaceAlternateImage', 'sDL_RemoveSurfaceAlternateImages', 'sDL_GetSurfaceImages'
+--
+--     [C declaration]: @SDL_SurfaceHasAlternateImages@, defined at @SDL3\/SDL_surface.h 420:34@
+sDL_SurfaceHasAlternateImages
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO BG.CBool
+sDL_SurfaceHasAlternateImages =
+  hs_bindgen_c8c9d6b2ea4d4292
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceImages@
+foreign import ccall unsafe "hs_bindgen_b3d55dcc42d5db12"
+  hs_bindgen_b3d55dcc42d5db12_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceImages@
+hs_bindgen_b3d55dcc42d5db12
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_Surface))
+hs_bindgen_b3d55dcc42d5db12 =
+  BG.fromFFIType hs_bindgen_b3d55dcc42d5db12_base
+
+-- | Get an array including all versions of a surface.
+--
+--     This returns all versions of a surface, with the surface being queried as the first element in the returned array.
+--
+--     Freeing the array of surfaces does not affect the surfaces in the array. They are still referenced by the surface being queried and will be cleaned up normally.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Surface' pointers or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddSurfaceAlternateImage', 'sDL_RemoveSurfaceAlternateImages', 'sDL_SurfaceHasAlternateImages'
+--
+--     [C declaration]: @SDL_GetSurfaceImages@, defined at @SDL3\/SDL_surface.h 448:44@
+sDL_GetSurfaceImages
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of surface pointers returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Surface))
+sDL_GetSurfaceImages = hs_bindgen_b3d55dcc42d5db12
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_RemoveSurfaceAlternateImages@
+foreign import ccall unsafe "hs_bindgen_1adedb2719efa1bf"
+  hs_bindgen_1adedb2719efa1bf_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_RemoveSurfaceAlternateImages@
+hs_bindgen_1adedb2719efa1bf
+  :: BG.Ptr SDL_Surface
+  -> IO ()
+hs_bindgen_1adedb2719efa1bf =
+  BG.fromFFIType hs_bindgen_1adedb2719efa1bf_base
+
+-- | Remove all alternate versions of a surface.
+--
+--     This function removes a reference from all the alternative versions, destroying them if this is the last reference to them.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddSurfaceAlternateImage', 'sDL_GetSurfaceImages', 'sDL_SurfaceHasAlternateImages'
+--
+--     [C declaration]: @SDL_RemoveSurfaceAlternateImages@, defined at @SDL3\/SDL_surface.h 467:34@
+sDL_RemoveSurfaceAlternateImages
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> IO ()
+sDL_RemoveSurfaceAlternateImages =
+  hs_bindgen_1adedb2719efa1bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LockSurface@
+foreign import ccall unsafe "hs_bindgen_8363af1ae03d45b9"
+  hs_bindgen_8363af1ae03d45b9_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LockSurface@
+hs_bindgen_8363af1ae03d45b9
+  :: BG.Ptr SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_8363af1ae03d45b9 =
+  BG.fromFFIType hs_bindgen_8363af1ae03d45b9_base
+
+-- | Set up a surface for directly accessing the pixels.
+--
+--     Between calls to @SDL_LockSurface()@ \/ @SDL_UnlockSurface()@, you can write to and read from @surface->pixels@, using the pixel format stored in @surface->format@. Once you are done accessing the surface, you should use @SDL_UnlockSurface()@ to release it.
+--
+--     Not all surfaces require locking. If @SDL_MUSTLOCK(surface)@ evaluates to 0, then you can read and write to the surface at any time, and the pixel format of the surface will not change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces. The locking referred to by this function is making the pixels available for direct access, not thread-safe locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MUSTLOCK@, 'sDL_UnlockSurface'
+--
+--     [C declaration]: @SDL_LockSurface@, defined at @SDL3\/SDL_surface.h 495:34@
+sDL_LockSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be locked.
+  -> IO BG.CBool
+sDL_LockSurface = hs_bindgen_8363af1ae03d45b9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_UnlockSurface@
+foreign import ccall unsafe "hs_bindgen_0b94cbec8aca2abc"
+  hs_bindgen_0b94cbec8aca2abc_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_UnlockSurface@
+hs_bindgen_0b94cbec8aca2abc
+  :: BG.Ptr SDL_Surface
+  -> IO ()
+hs_bindgen_0b94cbec8aca2abc =
+  BG.fromFFIType hs_bindgen_0b94cbec8aca2abc_base
+
+-- | Release a surface after directly accessing the pixels.
+--
+--     [Thread safety]: This function is not thread safe. The locking referred to by this function is making the pixels available for direct access, not thread-safe locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LockSurface'
+--
+--     [C declaration]: @SDL_UnlockSurface@, defined at @SDL3\/SDL_surface.h 510:34@
+sDL_UnlockSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be unlocked.
+  -> IO ()
+sDL_UnlockSurface = hs_bindgen_0b94cbec8aca2abc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadSurface_IO@
+foreign import ccall unsafe "hs_bindgen_1a1549d61e2d7c6f"
+  hs_bindgen_1a1549d61e2d7c6f_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadSurface_IO@
+hs_bindgen_1a1549d61e2d7c6f
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_1a1549d61e2d7c6f =
+  BG.fromFFIType hs_bindgen_1a1549d61e2d7c6f_base
+
+-- | Load a BMP or PNG image from a seekable SDL data stream.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadSurface'
+--
+--     [C declaration]: @SDL_LoadSurface_IO@, defined at @SDL3\/SDL_surface.h 531:43@
+sDL_LoadSurface_IO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadSurface_IO = hs_bindgen_1a1549d61e2d7c6f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadSurface@
+foreign import ccall unsafe "hs_bindgen_84c82bda97a82d45"
+  hs_bindgen_84c82bda97a82d45_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadSurface@
+hs_bindgen_84c82bda97a82d45
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_84c82bda97a82d45 =
+  BG.fromFFIType hs_bindgen_84c82bda97a82d45_base
+
+-- | Load a BMP or PNG image from a file.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadSurface_IO'
+--
+--     [C declaration]: @SDL_LoadSurface@, defined at @SDL3\/SDL_surface.h 550:43@
+sDL_LoadSurface
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the file to load.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadSurface = hs_bindgen_84c82bda97a82d45
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadBMP_IO@
+foreign import ccall unsafe "hs_bindgen_04dc7704680e62ca"
+  hs_bindgen_04dc7704680e62ca_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadBMP_IO@
+hs_bindgen_04dc7704680e62ca
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_04dc7704680e62ca =
+  BG.fromFFIType hs_bindgen_04dc7704680e62ca_base
+
+-- | Load a BMP image from a seekable SDL data stream.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadBMP', 'sDL_SaveBMP_IO'
+--
+--     [C declaration]: @SDL_LoadBMP_IO@, defined at @SDL3\/SDL_surface.h 572:43@
+sDL_LoadBMP_IO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadBMP_IO = hs_bindgen_04dc7704680e62ca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadBMP@
+foreign import ccall unsafe "hs_bindgen_fade244cdadaaa01"
+  hs_bindgen_fade244cdadaaa01_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadBMP@
+hs_bindgen_fade244cdadaaa01
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_fade244cdadaaa01 =
+  BG.fromFFIType hs_bindgen_fade244cdadaaa01_base
+
+-- | Load a BMP image from a file.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadBMP_IO', 'sDL_SaveBMP'
+--
+--     [C declaration]: @SDL_LoadBMP@, defined at @SDL3\/SDL_surface.h 592:43@
+sDL_LoadBMP
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the BMP file to load.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadBMP = hs_bindgen_fade244cdadaaa01
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SaveBMP_IO@
+foreign import ccall unsafe "hs_bindgen_9c98f1ae4256924d"
+  hs_bindgen_9c98f1ae4256924d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SaveBMP_IO@
+hs_bindgen_9c98f1ae4256924d
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_9c98f1ae4256924d =
+  BG.fromFFIType hs_bindgen_9c98f1ae4256924d_base
+
+-- | Save a surface to a seekable SDL data stream in BMP format.
+--
+--     Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the BMP directly. Other RGB formats with 8-bit or higher get converted to a 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit surface before they are saved. YUV and paletted 1-bit and 4-bit formats are not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadBMP_IO', 'sDL_SaveBMP'
+--
+--     [C declaration]: @SDL_SaveBMP_IO@, defined at @SDL3\/SDL_surface.h 618:34@
+sDL_SaveBMP_IO
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: a data stream to save to.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @dst@ before returning, even in the case of an error.
+  -> IO BG.CBool
+sDL_SaveBMP_IO = hs_bindgen_9c98f1ae4256924d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SaveBMP@
+foreign import ccall unsafe "hs_bindgen_66fb79ef3bca90df"
+  hs_bindgen_66fb79ef3bca90df_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SaveBMP@
+hs_bindgen_66fb79ef3bca90df
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_66fb79ef3bca90df =
+  BG.fromFFIType hs_bindgen_66fb79ef3bca90df_base
+
+-- | Save a surface to a file in BMP format.
+--
+--     Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the BMP directly. Other RGB formats with 8-bit or higher get converted to a 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit surface before they are saved. YUV and paletted 1-bit and 4-bit formats are not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_LoadBMP', 'sDL_SaveBMP_IO'
+--
+--     [C declaration]: @SDL_SaveBMP@, defined at @SDL3\/SDL_surface.h 642:34@
+sDL_SaveBMP
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a file to save to.
+  -> IO BG.CBool
+sDL_SaveBMP = hs_bindgen_66fb79ef3bca90df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadPNG_IO@
+foreign import ccall unsafe "hs_bindgen_7160fe58e1c51f22"
+  hs_bindgen_7160fe58e1c51f22_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadPNG_IO@
+hs_bindgen_7160fe58e1c51f22
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_7160fe58e1c51f22 =
+  BG.fromFFIType hs_bindgen_7160fe58e1c51f22_base
+
+-- | Load a PNG image from a seekable SDL data stream.
+--
+--     This is intended as a convenience function for loading images from trusted sources. If you want to load arbitrary images you should use libpng or another image loading library designed with security in mind.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadPNG', 'sDL_SavePNG_IO'
+--
+--     [C declaration]: @SDL_LoadPNG_IO@, defined at @SDL3\/SDL_surface.h 668:43@
+sDL_LoadPNG_IO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadPNG_IO = hs_bindgen_7160fe58e1c51f22
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadPNG@
+foreign import ccall unsafe "hs_bindgen_bc316d886d9c3957"
+  hs_bindgen_bc316d886d9c3957_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_LoadPNG@
+hs_bindgen_bc316d886d9c3957
+  :: PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_bc316d886d9c3957 =
+  BG.fromFFIType hs_bindgen_bc316d886d9c3957_base
+
+-- | Load a PNG image from a file.
+--
+--     This is intended as a convenience function for loading images from trusted sources. If you want to load arbitrary images you should use libpng or another image loading library designed with security in mind.
+--
+--     The new surface should be freed with @SDL_DestroySurface()@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_DestroySurface', 'sDL_LoadPNG_IO', 'sDL_SavePNG'
+--
+--     [C declaration]: @SDL_LoadPNG@, defined at @SDL3\/SDL_surface.h 692:43@
+sDL_LoadPNG
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the PNG file to load.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_LoadPNG = hs_bindgen_bc316d886d9c3957
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SavePNG_IO@
+foreign import ccall unsafe "hs_bindgen_9c8e4c9fc901ee28"
+  hs_bindgen_9c8e4c9fc901ee28_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SavePNG_IO@
+hs_bindgen_9c8e4c9fc901ee28
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_9c8e4c9fc901ee28 =
+  BG.fromFFIType hs_bindgen_9c8e4c9fc901ee28_base
+
+-- | Save a surface to a seekable SDL data stream in PNG format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_LoadPNG_IO', 'sDL_SavePNG'
+--
+--     [C declaration]: @SDL_SavePNG_IO@, defined at @SDL3\/SDL_surface.h 712:34@
+sDL_SavePNG_IO
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: a data stream to save to.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls SDL_CloseIO() on @dst@ before returning, even in the case of an error.
+  -> IO BG.CBool
+sDL_SavePNG_IO = hs_bindgen_9c8e4c9fc901ee28
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SavePNG@
+foreign import ccall unsafe "hs_bindgen_759469fef46a8cd4"
+  hs_bindgen_759469fef46a8cd4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SavePNG@
+hs_bindgen_759469fef46a8cd4
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_759469fef46a8cd4 =
+  BG.fromFFIType hs_bindgen_759469fef46a8cd4_base
+
+-- | Save a surface to a file in PNG format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_LoadPNG', 'sDL_SavePNG_IO'
+--
+--     [C declaration]: @SDL_SavePNG@, defined at @SDL3\/SDL_surface.h 730:34@
+sDL_SavePNG
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a file to save to.
+  -> IO BG.CBool
+sDL_SavePNG = hs_bindgen_759469fef46a8cd4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceRLE@
+foreign import ccall unsafe "hs_bindgen_5d1b864a1323d92d"
+  hs_bindgen_5d1b864a1323d92d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceRLE@
+hs_bindgen_5d1b864a1323d92d
+  :: BG.Ptr SDL_Surface
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_5d1b864a1323d92d =
+  BG.fromFFIType hs_bindgen_5d1b864a1323d92d_base
+
+-- | Set the RLE acceleration hint for a surface.
+--
+--     If RLE is enabled, color key and alpha blending blits are much faster, but the surface must be locked before directly accessing the pixels.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface', 'sDL_LockSurface', 'sDL_UnlockSurface'
+--
+--     [C declaration]: @SDL_SetSurfaceRLE@, defined at @SDL3\/SDL_surface.h 752:34@
+sDL_SetSurfaceRLE
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to optimize.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: true to enable RLE acceleration, false to disable it.
+  -> IO BG.CBool
+sDL_SetSurfaceRLE = hs_bindgen_5d1b864a1323d92d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SurfaceHasRLE@
+foreign import ccall unsafe "hs_bindgen_b51ce9068c82d3d0"
+  hs_bindgen_b51ce9068c82d3d0_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SurfaceHasRLE@
+hs_bindgen_b51ce9068c82d3d0
+  :: BG.Ptr SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_b51ce9068c82d3d0 =
+  BG.fromFFIType hs_bindgen_b51ce9068c82d3d0_base
+
+-- | Returns whether the surface is RLE enabled.
+--
+--     It is safe to pass a NULL @surface@ here; it will return false.
+--
+--     [Returns]: true if the surface is RLE enabled, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceRLE'
+--
+--     [C declaration]: @SDL_SurfaceHasRLE@, defined at @SDL3\/SDL_surface.h 768:34@
+sDL_SurfaceHasRLE
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO BG.CBool
+sDL_SurfaceHasRLE = hs_bindgen_b51ce9068c82d3d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceColorKey@
+foreign import ccall unsafe "hs_bindgen_13efdbaff73dc30f"
+  hs_bindgen_13efdbaff73dc30f_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceColorKey@
+hs_bindgen_13efdbaff73dc30f
+  :: BG.Ptr SDL_Surface
+  -> BG.CBool
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_13efdbaff73dc30f =
+  BG.fromFFIType hs_bindgen_13efdbaff73dc30f_base
+
+-- | Set the color key (transparent pixel) in a surface.
+--
+--     The color key defines a pixel value that will be treated as transparent in a blit. For example, one can use this to specify that cyan pixels should be considered transparent, and therefore not rendered.
+--
+--     It is a pixel of the format used by the surface, as generated by SDL_MapRGB().
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorKey', 'sDL_SetSurfaceRLE', 'sDL_SurfaceHasColorKey'
+--
+--     [C declaration]: @SDL_SetSurfaceColorKey@, defined at @SDL3\/SDL_surface.h 795:34@
+sDL_SetSurfaceColorKey
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: true to enable color key, false to disable color key.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@key@]: the transparent pixel.
+  -> IO BG.CBool
+sDL_SetSurfaceColorKey = hs_bindgen_13efdbaff73dc30f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SurfaceHasColorKey@
+foreign import ccall unsafe "hs_bindgen_998ae6f993d45bac"
+  hs_bindgen_998ae6f993d45bac_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SurfaceHasColorKey@
+hs_bindgen_998ae6f993d45bac
+  :: BG.Ptr SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_998ae6f993d45bac =
+  BG.fromFFIType hs_bindgen_998ae6f993d45bac_base
+
+-- | Returns whether the surface has a color key.
+--
+--     It is safe to pass a NULL @surface@ here; it will return false.
+--
+--     [Returns]: true if the surface has a color key, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceColorKey', 'sDL_GetSurfaceColorKey'
+--
+--     [C declaration]: @SDL_SurfaceHasColorKey@, defined at @SDL3\/SDL_surface.h 812:34@
+sDL_SurfaceHasColorKey
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO BG.CBool
+sDL_SurfaceHasColorKey = hs_bindgen_998ae6f993d45bac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceColorKey@
+foreign import ccall unsafe "hs_bindgen_463737aa98969701"
+  hs_bindgen_463737aa98969701_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceColorKey@
+hs_bindgen_463737aa98969701
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_463737aa98969701 =
+  BG.fromFFIType hs_bindgen_463737aa98969701_base
+
+-- | Get the color key (transparent pixel) for a surface.
+--
+--     The color key is a pixel of the format used by the surface, as generated by SDL_MapRGB().
+--
+--     If the surface doesn\'t have color key enabled this function returns false.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceColorKey', 'sDL_SurfaceHasColorKey'
+--
+--     [C declaration]: @SDL_GetSurfaceColorKey@, defined at @SDL3\/SDL_surface.h 834:34@
+sDL_GetSurfaceColorKey
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@key@]: a pointer filled in with the transparent pixel.
+  -> IO BG.CBool
+sDL_GetSurfaceColorKey = hs_bindgen_463737aa98969701
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceColorMod@
+foreign import ccall unsafe "hs_bindgen_5802144e4d11fa38"
+  hs_bindgen_5802144e4d11fa38_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceColorMod@
+hs_bindgen_5802144e4d11fa38
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_5802144e4d11fa38 =
+  BG.fromFFIType hs_bindgen_5802144e4d11fa38_base
+
+-- | Set an additional color value multiplied into blit operations.
+--
+--     When this surface is blitted, during the blit operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * (color \/ 255)@
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorMod', 'sDL_SetSurfaceAlphaMod'
+--
+--     [C declaration]: @SDL_SetSurfaceColorMod@, defined at @SDL3\/SDL_surface.h 860:34@
+sDL_SetSurfaceColorMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into blit operations.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into blit operations.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into blit operations.
+  -> IO BG.CBool
+sDL_SetSurfaceColorMod = hs_bindgen_5802144e4d11fa38
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceColorMod@
+foreign import ccall unsafe "hs_bindgen_8f67dce9db98e6f9"
+  hs_bindgen_8f67dce9db98e6f9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceColorMod@
+hs_bindgen_8f67dce9db98e6f9
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_8f67dce9db98e6f9 =
+  BG.fromFFIType hs_bindgen_8f67dce9db98e6f9_base
+
+-- | Get the additional color value multiplied into blit operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceAlphaMod', 'sDL_SetSurfaceColorMod'
+--
+--     [C declaration]: @SDL_GetSurfaceColorMod@, defined at @SDL3\/SDL_surface.h 881:34@
+sDL_GetSurfaceColorMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO BG.CBool
+sDL_GetSurfaceColorMod = hs_bindgen_8f67dce9db98e6f9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceAlphaMod@
+foreign import ccall unsafe "hs_bindgen_2f27871d133fe193"
+  hs_bindgen_2f27871d133fe193_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceAlphaMod@
+hs_bindgen_2f27871d133fe193
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_2f27871d133fe193 =
+  BG.fromFFIType hs_bindgen_2f27871d133fe193_base
+
+-- | Set an additional alpha value used in blit operations.
+--
+--     When this surface is blitted, during the blit operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * (alpha \/ 255)@
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceAlphaMod', 'sDL_SetSurfaceColorMod'
+--
+--     [C declaration]: @SDL_SetSurfaceAlphaMod@, defined at @SDL3\/SDL_surface.h 904:34@
+sDL_SetSurfaceAlphaMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: the alpha value multiplied into blit operations.
+  -> IO BG.CBool
+sDL_SetSurfaceAlphaMod = hs_bindgen_2f27871d133fe193
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceAlphaMod@
+foreign import ccall unsafe "hs_bindgen_62e7ffa57cc86c89"
+  hs_bindgen_62e7ffa57cc86c89_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceAlphaMod@
+hs_bindgen_62e7ffa57cc86c89
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_62e7ffa57cc86c89 =
+  BG.fromFFIType hs_bindgen_62e7ffa57cc86c89_base
+
+-- | Get the additional alpha value used in blit operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceColorMod', 'sDL_SetSurfaceAlphaMod'
+--
+--     [C declaration]: @SDL_GetSurfaceAlphaMod@, defined at @SDL3\/SDL_surface.h 921:34@
+sDL_GetSurfaceAlphaMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO BG.CBool
+sDL_GetSurfaceAlphaMod = hs_bindgen_62e7ffa57cc86c89
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceBlendMode@
+foreign import ccall unsafe "hs_bindgen_31b5f1226bf51118"
+  hs_bindgen_31b5f1226bf51118_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceBlendMode@
+hs_bindgen_31b5f1226bf51118
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_31b5f1226bf51118 =
+  BG.fromFFIType hs_bindgen_31b5f1226bf51118_base
+
+-- | Set the blend mode used for blit operations.
+--
+--     To copy a surface to another surface (or texture) without blending with the existing data, the blendmode of the SOURCE surface should be set to @SDL_BLENDMODE_NONE@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceBlendMode'
+--
+--     [C declaration]: @SDL_SetSurfaceBlendMode@, defined at @SDL3\/SDL_surface.h 942:34@
+sDL_SetSurfaceBlendMode
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for blit blending.
+  -> IO BG.CBool
+sDL_SetSurfaceBlendMode = hs_bindgen_31b5f1226bf51118
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceBlendMode@
+foreign import ccall unsafe "hs_bindgen_e69bee46110b6faa"
+  hs_bindgen_e69bee46110b6faa_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceBlendMode@
+hs_bindgen_e69bee46110b6faa
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -> IO BG.CBool
+hs_bindgen_e69bee46110b6faa =
+  BG.fromFFIType hs_bindgen_e69bee46110b6faa_base
+
+-- | Get the blend mode used for blit operations.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceBlendMode'
+--
+--     [C declaration]: @SDL_GetSurfaceBlendMode@, defined at @SDL3\/SDL_surface.h 958:34@
+sDL_GetSurfaceBlendMode
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO BG.CBool
+sDL_GetSurfaceBlendMode = hs_bindgen_e69bee46110b6faa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceClipRect@
+foreign import ccall unsafe "hs_bindgen_d3f690ca2bc82289"
+  hs_bindgen_d3f690ca2bc82289_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_SetSurfaceClipRect@
+hs_bindgen_d3f690ca2bc82289
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_d3f690ca2bc82289 =
+  BG.fromFFIType hs_bindgen_d3f690ca2bc82289_base
+
+-- | Set the clipping rectangle for a surface.
+--
+--     When @surface@ is the destination of a blit, only the area within the clip rectangle is drawn into.
+--
+--     Note that blits are automatically clipped to the edges of the source and destination surfaces.
+--
+--     [Returns]: true if the rectangle intersects the surface, otherwise false and blits will be completely clipped.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetSurfaceClipRect'
+--
+--     [C declaration]: @SDL_SetSurfaceClipRect@, defined at @SDL3\/SDL_surface.h 982:34@
+sDL_SetSurfaceClipRect
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be clipped.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the clipping rectangle, or NULL to disable clipping.
+  -> IO BG.CBool
+sDL_SetSurfaceClipRect = hs_bindgen_d3f690ca2bc82289
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceClipRect@
+foreign import ccall unsafe "hs_bindgen_510cbf12ad718ad5"
+  hs_bindgen_510cbf12ad718ad5_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_GetSurfaceClipRect@
+hs_bindgen_510cbf12ad718ad5
+  :: BG.Ptr SDL_Surface
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_510cbf12ad718ad5 =
+  BG.fromFFIType hs_bindgen_510cbf12ad718ad5_base
+
+-- | Get the clipping rectangle for a surface.
+--
+--     When @surface@ is the destination of a blit, only the area within the clip rectangle is drawn into.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetSurfaceClipRect'
+--
+--     [C declaration]: @SDL_GetSurfaceClipRect@, defined at @SDL3\/SDL_surface.h 1004:34@
+sDL_GetSurfaceClipRect
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure representing the surface to be clipped.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the clipping rectangle for the surface.
+  -> IO BG.CBool
+sDL_GetSurfaceClipRect = hs_bindgen_510cbf12ad718ad5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_FlipSurface@
+foreign import ccall unsafe "hs_bindgen_c9050e1a6dbcc389"
+  hs_bindgen_c9050e1a6dbcc389_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_FlipSurface@
+hs_bindgen_c9050e1a6dbcc389
+  :: BG.Ptr SDL_Surface
+  -> SDL_FlipMode
+  -> IO BG.CBool
+hs_bindgen_c9050e1a6dbcc389 =
+  BG.fromFFIType hs_bindgen_c9050e1a6dbcc389_base
+
+-- | Flip a surface vertically or horizontally.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_FlipSurface@, defined at @SDL3\/SDL_surface.h 1019:34@
+sDL_FlipSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to flip.
+  -> SDL_FlipMode
+  -- ^
+  --
+  --           [@flip@]: the direction to flip.
+  -> IO BG.CBool
+sDL_FlipSurface = hs_bindgen_c9050e1a6dbcc389
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_RotateSurface@
+foreign import ccall unsafe "hs_bindgen_b68c60a70d17f528"
+  hs_bindgen_b68c60a70d17f528_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_RotateSurface@
+hs_bindgen_b68c60a70d17f528
+  :: BG.Ptr SDL_Surface
+  -> BG.CFloat
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_b68c60a70d17f528 =
+  BG.fromFFIType hs_bindgen_b68c60a70d17f528_base
+
+-- | Return a copy of a surface rotated clockwise a number of degrees.
+--
+--     The angle of rotation can be negative for counter-clockwise rotation.
+--
+--     When the rotation isn\'t a multiple of 90 degrees, the resulting surface is larger than the original, with the background filled in with the colorkey, if available, or RGBA 255\/255\/255\/0 if not.
+--
+--     If @surface@ has the SDL_PROP_SURFACE_ROTATION_FLOAT property set on it, the new copy will have the adjusted value set: if the rotation property is 90 and @angle@ was 30, the new surface will have a property value of 60 (that is: to be upright vs gravity, this surface needs to rotate 60 more degrees). However, note that further rotations on the new surface in this example will produce unexpected results, since the image will have resized and padded to accommodate the not-90 degree angle.
+--
+--     [Returns]: a rotated copy of the surface or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_RotateSurface@, defined at @SDL3\/SDL_surface.h 1048:43@
+sDL_RotateSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to rotate.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@angle@]: the rotation angle, in degrees.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_RotateSurface = hs_bindgen_b68c60a70d17f528
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_DuplicateSurface@
+foreign import ccall unsafe "hs_bindgen_fb5b3c5560c73662"
+  hs_bindgen_fb5b3c5560c73662_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_DuplicateSurface@
+hs_bindgen_fb5b3c5560c73662
+  :: BG.Ptr SDL_Surface
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_fb5b3c5560c73662 =
+  BG.fromFFIType hs_bindgen_fb5b3c5560c73662_base
+
+-- | Creates a new surface identical to the existing surface.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     The returned surface should be freed with @SDL_DestroySurface()@.
+--
+--     [Returns]: a copy of the surface or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_DuplicateSurface@, defined at @SDL3\/SDL_surface.h 1069:43@
+sDL_DuplicateSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to duplicate.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_DuplicateSurface = hs_bindgen_fb5b3c5560c73662
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ScaleSurface@
+foreign import ccall unsafe "hs_bindgen_302fe5f6d166cef5"
+  hs_bindgen_302fe5f6d166cef5_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ScaleSurface@
+hs_bindgen_302fe5f6d166cef5
+  :: BG.Ptr SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL_ScaleMode
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_302fe5f6d166cef5 =
+  BG.fromFFIType hs_bindgen_302fe5f6d166cef5_base
+
+-- | Creates a new surface identical to the existing surface, scaled to the desired size.
+--
+--     The returned surface should be freed with @SDL_DestroySurface()@.
+--
+--     [Returns]: a copy of the surface or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_ScaleSurface@, defined at @SDL3\/SDL_surface.h 1091:43@
+sDL_ScaleSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to duplicate and scale.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the new surface.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the new surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_ScaleSurface = hs_bindgen_302fe5f6d166cef5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ConvertSurface@
+foreign import ccall unsafe "hs_bindgen_2d38a11d9ed40ec3"
+  hs_bindgen_2d38a11d9ed40ec3_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ConvertSurface@
+hs_bindgen_2d38a11d9ed40ec3
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_2d38a11d9ed40ec3 =
+  BG.fromFFIType hs_bindgen_2d38a11d9ed40ec3_base
+
+-- | Copy an existing surface to a new surface of the specified format.
+--
+--     This function is used to optimize images for faster /repeat/ blitting. This is accomplished by converting the original and storing the result as a new surface. The new, optimized surface can then be used as the source for future blits, making them faster.
+--
+--     If you are converting to an indexed surface and want to map colors to a palette, you can use @SDL_ConvertSurfaceAndColorspace()@ instead.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertSurfaceAndColorspace', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_ConvertSurface@, defined at @SDL3\/SDL_surface.h 1120:43@
+sDL_ConvertSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the existing 'SDL_Surface' structure to convert.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the new pixel format.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_ConvertSurface = hs_bindgen_2d38a11d9ed40ec3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ConvertSurfaceAndColorspace@
+foreign import ccall unsafe "hs_bindgen_589af8fb0fd3b451"
+  hs_bindgen_589af8fb0fd3b451_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ConvertSurfaceAndColorspace@
+hs_bindgen_589af8fb0fd3b451
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Surface)
+hs_bindgen_589af8fb0fd3b451 =
+  BG.fromFFIType hs_bindgen_589af8fb0fd3b451_base
+
+-- | Copy an existing surface to a new surface of the specified format and colorspace.
+--
+--     This function converts an existing surface to a new format and colorspace and returns the new surface. This will perform any pixel format and colorspace conversion needed.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertSurface', 'sDL_DestroySurface'
+--
+--     [C declaration]: @SDL_ConvertSurfaceAndColorspace@, defined at @SDL3\/SDL_surface.h 1149:43@
+sDL_ConvertSurfaceAndColorspace
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the existing 'SDL_Surface' structure to convert.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the new pixel format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette to use for indexed formats, may be NULL.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@colorspace@]: the new colorspace.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: an SDL_PropertiesID with additional color properties, or 0.
+  -> IO (BG.Ptr SDL_Surface)
+sDL_ConvertSurfaceAndColorspace =
+  hs_bindgen_589af8fb0fd3b451
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ConvertPixels@
+foreign import ccall unsafe "hs_bindgen_c4ac87b53bb7fbaa"
+  hs_bindgen_c4ac87b53bb7fbaa_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ConvertPixels@
+hs_bindgen_c4ac87b53bb7fbaa
+  :: BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> BG.Ptr BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_c4ac87b53bb7fbaa =
+  BG.fromFFIType hs_bindgen_c4ac87b53bb7fbaa_base
+
+-- | Copy a block of pixels of one format to another format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertPixelsAndColorspace'
+--
+--     [C declaration]: @SDL_ConvertPixels@, defined at @SDL3\/SDL_surface.h 1173:34@
+sDL_ConvertPixels
+  :: BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the block to copy, in pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the block to copy, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with new pixel data.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> IO BG.CBool
+sDL_ConvertPixels = hs_bindgen_c4ac87b53bb7fbaa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ConvertPixelsAndColorspace@
+foreign import ccall unsafe "hs_bindgen_384b325525f7f1f3"
+  hs_bindgen_384b325525f7f1f3_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ConvertPixelsAndColorspace@
+hs_bindgen_384b325525f7f1f3
+  :: BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> BG.Ptr BG.Void
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_384b325525f7f1f3 =
+  BG.fromFFIType hs_bindgen_384b325525f7f1f3_base
+
+-- | Copy a block of pixels of one format and colorspace to another format and colorspace.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ConvertPixels'
+--
+--     [C declaration]: @SDL_ConvertPixelsAndColorspace@, defined at @SDL3\/SDL_surface.h 1206:34@
+sDL_ConvertPixelsAndColorspace
+  :: BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the block to copy, in pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the block to copy, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@src_colorspace@]: an SDL_Colorspace value describing the colorspace of the @src@ pixels.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@src_properties@]: an SDL_PropertiesID with additional source color properties, or 0.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@dst_colorspace@]: an SDL_Colorspace value describing the colorspace of the @dst@ pixels.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@dst_properties@]: an SDL_PropertiesID with additional destination color properties, or 0.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with new pixel data.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> IO BG.CBool
+sDL_ConvertPixelsAndColorspace =
+  hs_bindgen_384b325525f7f1f3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_PremultiplyAlpha@
+foreign import ccall unsafe "hs_bindgen_9a5c070f0253ae0a"
+  hs_bindgen_9a5c070f0253ae0a_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_PremultiplyAlpha@
+hs_bindgen_9a5c070f0253ae0a
+  :: BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> PtrConst.PtrConst BG.Void
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -> BG.Ptr BG.Void
+  -> BG.CInt
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_9a5c070f0253ae0a =
+  BG.fromFFIType hs_bindgen_9a5c070f0253ae0a_base
+
+-- | Premultiply the alpha on a block of pixels.
+--
+--     This is safe to use with src == dst, but not for other overlapping areas.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PremultiplyAlpha@, defined at @SDL3\/SDL_surface.h 1232:34@
+sDL_PremultiplyAlpha
+  :: BG.CInt
+  -- ^
+  --
+  --           [@width@]: the width of the block to convert, in pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@height@]: the height of the block to convert, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with premultiplied pixel data.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@linear@]: true to convert from sRGB to linear space for the alpha multiplication, false to do multiplication in sRGB space.
+  -> IO BG.CBool
+sDL_PremultiplyAlpha = hs_bindgen_9a5c070f0253ae0a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_PremultiplySurfaceAlpha@
+foreign import ccall unsafe "hs_bindgen_7065a7a3bd7041c8"
+  hs_bindgen_7065a7a3bd7041c8_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_PremultiplySurfaceAlpha@
+hs_bindgen_7065a7a3bd7041c8
+  :: BG.Ptr SDL_Surface
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_7065a7a3bd7041c8 =
+  BG.fromFFIType hs_bindgen_7065a7a3bd7041c8_base
+
+-- | Premultiply the alpha in a surface.
+--
+--     This is safe to use with src == dst, but not for other overlapping areas.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_PremultiplySurfaceAlpha@, defined at @SDL3\/SDL_surface.h 1250:34@
+sDL_PremultiplySurfaceAlpha
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to modify.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@linear@]: true to convert from sRGB to linear space for the alpha multiplication, false to do multiplication in sRGB space.
+  -> IO BG.CBool
+sDL_PremultiplySurfaceAlpha =
+  hs_bindgen_7065a7a3bd7041c8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ClearSurface@
+foreign import ccall unsafe "hs_bindgen_de44f8d6106c7e71"
+  hs_bindgen_de44f8d6106c7e71_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ClearSurface@
+hs_bindgen_de44f8d6106c7e71
+  :: BG.Ptr SDL_Surface
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_de44f8d6106c7e71 =
+  BG.fromFFIType hs_bindgen_de44f8d6106c7e71_base
+
+-- | Clear a surface with a specific color, with floating point precision.
+--
+--     This function handles all surface formats, and ignores any clip rectangle.
+--
+--     If the surface is YUV, the color is assumed to be in the sRGB colorspace, otherwise the color is assumed to be in the colorspace of the surface.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ClearSurface@, defined at @SDL3\/SDL_surface.h 1273:34@
+sDL_ClearSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' to clear.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel, normally in the range 0-1.
+  -> IO BG.CBool
+sDL_ClearSurface = hs_bindgen_de44f8d6106c7e71
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_FillSurfaceRect@
+foreign import ccall unsafe "hs_bindgen_8e254769393349cc"
+  hs_bindgen_8e254769393349cc_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_FillSurfaceRect@
+hs_bindgen_8e254769393349cc
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_8e254769393349cc =
+  BG.fromFFIType hs_bindgen_8e254769393349cc_base
+
+-- | Perform a fast fill of a rectangle with a specific color.
+--
+--     @color@ should be a pixel of the format used by the surface, and can be generated by SDL_MapRGB() or SDL_MapRGBA(). If the color value contains an alpha component then the destination is simply filled with that alpha information, no blending takes place.
+--
+--     If there is a clip rectangle set on the destination (set via @SDL_SetSurfaceClipRect()@), then this function will fill based on the intersection of the clip rectangle and @rect@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FillSurfaceRects'
+--
+--     [C declaration]: @SDL_FillSurfaceRect@, defined at @SDL3\/SDL_surface.h 1301:34@
+sDL_FillSurfaceRect
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the drawing target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the rectangle to fill, or NULL to fill the entire surface.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@color@]: the color to fill with.
+  -> IO BG.CBool
+sDL_FillSurfaceRect = hs_bindgen_8e254769393349cc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_FillSurfaceRects@
+foreign import ccall unsafe "hs_bindgen_4eb2bdf51787fb5f"
+  hs_bindgen_4eb2bdf51787fb5f_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_FillSurfaceRects@
+hs_bindgen_4eb2bdf51787fb5f
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_4eb2bdf51787fb5f =
+  BG.fromFFIType hs_bindgen_4eb2bdf51787fb5f_base
+
+-- | Perform a fast fill of a set of rectangles with a specific color.
+--
+--     @color@ should be a pixel of the format used by the surface, and can be generated by SDL_MapRGB() or SDL_MapRGBA(). If the color value contains an alpha component then the destination is simply filled with that alpha information, no blending takes place.
+--
+--     If there is a clip rectangle set on the destination (set via @SDL_SetSurfaceClipRect()@), then this function will fill based on the intersection of the clip rectangle and @rect@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_FillSurfaceRect'
+--
+--     [C declaration]: @SDL_FillSurfaceRects@, defined at @SDL3\/SDL_surface.h 1329:34@
+sDL_FillSurfaceRects
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the drawing target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rects@]: an array of SDL_Rects representing the rectangles to fill.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@count@]: the number of rectangles in the array.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@color@]: the color to fill with.
+  -> IO BG.CBool
+sDL_FillSurfaceRects = hs_bindgen_4eb2bdf51787fb5f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurface@
+foreign import ccall unsafe "hs_bindgen_dd9a2fd8000655e0"
+  hs_bindgen_dd9a2fd8000655e0_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurface@
+hs_bindgen_dd9a2fd8000655e0
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_dd9a2fd8000655e0 =
+  BG.fromFFIType hs_bindgen_dd9a2fd8000655e0_base
+
+-- | Performs a fast blit from the source surface to the destination surface with clipping.
+--
+--     If either @srcrect@ or @dstrect@ are NULL, the entire surface (@src@ or @dst@) is copied while ensuring clipping to @dst->clip_rect@.
+--
+--     The blit function should not be called on a locked surface.
+--
+--     The blit semantics for surfaces with and without blending and colorkey are defined as follows:
+--
+--     @
+--      RGBA->RGB:
+--        Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source alpha-channel and per-surface alpha)
+--         SDL_SRCCOLORKEY ignored.
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB.
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         RGB values of the source color key, ignoring alpha in the
+--         comparison.
+--
+--     RGB->RGBA:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source per-surface alpha)
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB, set destination alpha to source per-surface alpha value.
+--       both:
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         source color key.
+--
+--     RGBA->RGBA:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source alpha-channel and per-surface alpha)
+--         SDL_SRCCOLORKEY ignored.
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy all of RGBA to the destination.
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         RGB values of the source color key, ignoring alpha in the
+--         comparison.
+--
+--     RGB->RGB:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source per-surface alpha)
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB.
+--       both:
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         source color key.
+--     @
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurfaceScaled'
+--
+--     [C declaration]: @SDL_BlitSurface@, defined at @SDL3\/SDL_surface.h 1402:34@
+sDL_BlitSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the x and y position in the destination surface, or NULL for (0,0). The width and height are ignored, and are copied from @srcrect@. If you want a specific width and height, you should use @SDL_BlitSurfaceScaled()@.
+  -> IO BG.CBool
+sDL_BlitSurface = hs_bindgen_dd9a2fd8000655e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurfaceUnchecked@
+foreign import ccall unsafe "hs_bindgen_f1d3fd72bc95a376"
+  hs_bindgen_f1d3fd72bc95a376_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurfaceUnchecked@
+hs_bindgen_f1d3fd72bc95a376
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_f1d3fd72bc95a376 =
+  BG.fromFFIType hs_bindgen_f1d3fd72bc95a376_base
+
+-- | Perform low-level surface blitting only.
+--
+--     This is a semi-private blit function and it performs low-level surface blitting, assuming the input rectangles have already been clipped.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceUnchecked@, defined at @SDL3\/SDL_surface.h 1426:34@
+sDL_BlitSurfaceUnchecked
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, may not be NULL.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, may not be NULL.
+  -> IO BG.CBool
+sDL_BlitSurfaceUnchecked =
+  hs_bindgen_f1d3fd72bc95a376
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurfaceScaled@
+foreign import ccall unsafe "hs_bindgen_ca439260becd97fa"
+  hs_bindgen_ca439260becd97fa_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurfaceScaled@
+hs_bindgen_ca439260becd97fa
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_ca439260becd97fa =
+  BG.fromFFIType hs_bindgen_ca439260becd97fa_base
+
+-- | Perform a scaled blit to a destination surface, which may be of a different format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceScaled@, defined at @SDL3\/SDL_surface.h 1450:34@
+sDL_BlitSurfaceScaled
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire destination surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO BG.CBool
+sDL_BlitSurfaceScaled = hs_bindgen_ca439260becd97fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurfaceUncheckedScaled@
+foreign import ccall unsafe "hs_bindgen_273462ee987888b2"
+  hs_bindgen_273462ee987888b2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurfaceUncheckedScaled@
+hs_bindgen_273462ee987888b2
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_273462ee987888b2 =
+  BG.fromFFIType hs_bindgen_273462ee987888b2_base
+
+-- | Perform low-level surface scaled blitting only.
+--
+--     This is a semi-private function and it performs low-level surface blitting, assuming the input rectangles have already been clipped.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurfaceScaled'
+--
+--     [C declaration]: @SDL_BlitSurfaceUncheckedScaled@, defined at @SDL3\/SDL_surface.h 1475:34@
+sDL_BlitSurfaceUncheckedScaled
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, may not be NULL.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, may not be NULL.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO BG.CBool
+sDL_BlitSurfaceUncheckedScaled =
+  hs_bindgen_273462ee987888b2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_StretchSurface@
+foreign import ccall unsafe "hs_bindgen_cbba042ce7137c9a"
+  hs_bindgen_cbba042ce7137c9a_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_StretchSurface@
+hs_bindgen_cbba042ce7137c9a
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> SDL_ScaleMode
+  -> IO BG.CBool
+hs_bindgen_cbba042ce7137c9a =
+  BG.fromFFIType hs_bindgen_cbba042ce7137c9a_base
+
+-- | Perform a stretched pixel copy from one surface to another.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_BlitSurfaceScaled'
+--
+--     [C declaration]: @SDL_StretchSurface@, defined at @SDL3\/SDL_surface.h 1498:34@
+sDL_StretchSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire destination surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO BG.CBool
+sDL_StretchSurface = hs_bindgen_cbba042ce7137c9a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurfaceTiled@
+foreign import ccall unsafe "hs_bindgen_cc06339086116f6d"
+  hs_bindgen_cc06339086116f6d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurfaceTiled@
+hs_bindgen_cc06339086116f6d
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_cc06339086116f6d =
+  BG.fromFFIType hs_bindgen_cc06339086116f6d_base
+
+-- | Perform a tiled blit to a destination surface, which may be of a different format.
+--
+--     The pixels in @srcrect@ will be repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceTiled@, defined at @SDL3\/SDL_surface.h 1523:34@
+sDL_BlitSurfaceTiled
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO BG.CBool
+sDL_BlitSurfaceTiled = hs_bindgen_cc06339086116f6d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurfaceTiledWithScale@
+foreign import ccall unsafe "hs_bindgen_50d8214074d2e91b"
+  hs_bindgen_50d8214074d2e91b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> Float
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurfaceTiledWithScale@
+hs_bindgen_50d8214074d2e91b
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.CFloat
+  -> SDL_ScaleMode
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_50d8214074d2e91b =
+  BG.fromFFIType hs_bindgen_50d8214074d2e91b_base
+
+-- | Perform a scaled and tiled blit to a destination surface, which may be of a different format.
+--
+--     The pixels in @srcrect@ will be scaled and repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurfaceTiledWithScale@, defined at @SDL3\/SDL_surface.h 1552:34@
+sDL_BlitSurfaceTiledWithScale
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform srcrect into the destination rectangle, e.g. a 32x32 texture with a scale of 2 would fill 64x64 tiles.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: scale algorithm to be used.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO BG.CBool
+sDL_BlitSurfaceTiledWithScale =
+  hs_bindgen_50d8214074d2e91b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurface9Grid@
+foreign import ccall unsafe "hs_bindgen_84940b463dd6473c"
+  hs_bindgen_84940b463dd6473c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> Float
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_BlitSurface9Grid@
+hs_bindgen_84940b463dd6473c
+  :: BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CFloat
+  -> SDL_ScaleMode
+  -> BG.Ptr SDL_Surface
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_84940b463dd6473c =
+  BG.fromFFIType hs_bindgen_84940b463dd6473c_base
+
+-- | Perform a scaled blit using the 9-grid algorithm to a destination surface, which may be of a different format.
+--
+--     The pixels in the source surface are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then stretched into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_BlitSurface'
+--
+--     [C declaration]: @SDL_BlitSurface9Grid@, defined at @SDL3\/SDL_surface.h 1588:34@
+sDL_BlitSurface9Grid
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire surface.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled blit.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: scale algorithm to be used.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO BG.CBool
+sDL_BlitSurface9Grid = hs_bindgen_84940b463dd6473c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_MapSurfaceRGB@
+foreign import ccall unsafe "hs_bindgen_5dfeeef5d5aa83da"
+  hs_bindgen_5dfeeef5d5aa83da_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_MapSurfaceRGB@
+hs_bindgen_5dfeeef5d5aa83da
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_5dfeeef5d5aa83da =
+  BG.fromFFIType hs_bindgen_5dfeeef5d5aa83da_base
+
+-- | Map an RGB triple to an opaque pixel value for a surface.
+--
+--     This function maps the RGB color value to the specified pixel format and returns the pixel value best approximating the given RGB color value for the given pixel format.
+--
+--     If the surface has a palette, the index of the closest matching color in the palette will be returned.
+--
+--     If the surface pixel format has an alpha component it will be returned as all 1 bits (fully opaque).
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MapSurfaceRGBA'
+--
+--     [C declaration]: @SDL_MapSurfaceRGB@, defined at @SDL3\/SDL_surface.h 1621:36@
+sDL_MapSurfaceRGB
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to use for the pixel format and palette.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_MapSurfaceRGB = hs_bindgen_5dfeeef5d5aa83da
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_MapSurfaceRGBA@
+foreign import ccall unsafe "hs_bindgen_456d7e009be906d0"
+  hs_bindgen_456d7e009be906d0_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_MapSurfaceRGBA@
+hs_bindgen_456d7e009be906d0
+  :: BG.Ptr SDL_Surface
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+hs_bindgen_456d7e009be906d0 =
+  BG.fromFFIType hs_bindgen_456d7e009be906d0_base
+
+-- | Map an RGBA quadruple to a pixel value for a surface.
+--
+--     This function maps the RGBA color value to the specified pixel format and returns the pixel value best approximating the given RGBA color value for the given pixel format.
+--
+--     If the surface pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).
+--
+--     If the surface has a palette, the index of the closest matching color in the palette will be returned.
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MapSurfaceRGB'
+--
+--     [C declaration]: @SDL_MapSurfaceRGBA@, defined at @SDL3\/SDL_surface.h 1655:36@
+sDL_MapSurfaceRGBA
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to use for the pixel format and palette.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel in the range 0-255.
+  -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+sDL_MapSurfaceRGBA = hs_bindgen_456d7e009be906d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ReadSurfacePixel@
+foreign import ccall unsafe "hs_bindgen_76b097df3deb39a7"
+  hs_bindgen_76b097df3deb39a7_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ReadSurfacePixel@
+hs_bindgen_76b097df3deb39a7
+  :: BG.Ptr SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_76b097df3deb39a7 =
+  BG.fromFFIType hs_bindgen_76b097df3deb39a7_base
+
+-- | Retrieves a single pixel from a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     Like SDL_GetRGBA, this uses the entire 0..255 range when converting color components from pixel formats with less than 8 bits per RGB component.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadSurfacePixel@, defined at @SDL3\/SDL_surface.h 1685:34@
+sDL_ReadSurfacePixel
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to read.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha channel, 0-255, or NULL to ignore this channel.
+  -> IO BG.CBool
+sDL_ReadSurfacePixel = hs_bindgen_76b097df3deb39a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ReadSurfacePixelFloat@
+foreign import ccall unsafe "hs_bindgen_1dba774402b79156"
+  hs_bindgen_1dba774402b79156_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_ReadSurfacePixelFloat@
+hs_bindgen_1dba774402b79156
+  :: BG.Ptr SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_1dba774402b79156 =
+  BG.fromFFIType hs_bindgen_1dba774402b79156_base
+
+-- | Retrieves a single pixel from a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ReadSurfacePixelFloat@, defined at @SDL3\/SDL_surface.h 1712:34@
+sDL_ReadSurfacePixelFloat
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to read.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> IO BG.CBool
+sDL_ReadSurfacePixelFloat =
+  hs_bindgen_1dba774402b79156
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_WriteSurfacePixel@
+foreign import ccall unsafe "hs_bindgen_66bf3500cd5641bd"
+  hs_bindgen_66bf3500cd5641bd_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_WriteSurfacePixel@
+hs_bindgen_66bf3500cd5641bd
+  :: BG.Ptr SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -> IO BG.CBool
+hs_bindgen_66bf3500cd5641bd =
+  BG.fromFFIType hs_bindgen_66bf3500cd5641bd_base
+
+-- | Writes a single pixel to a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     Like SDL_MapRGBA, this uses the entire 0..255 range when converting color components from pixel formats with less than 8 bits per RGB component.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteSurfacePixel@, defined at @SDL3\/SDL_surface.h 1738:34@
+sDL_WriteSurfacePixel
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to write.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: the red channel value, 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: the green channel value, 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: the blue channel value, 0-255.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: the alpha channel value, 0-255.
+  -> IO BG.CBool
+sDL_WriteSurfacePixel = hs_bindgen_66bf3500cd5641bd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_WriteSurfacePixelFloat@
+foreign import ccall unsafe "hs_bindgen_91babb583602ef71"
+  hs_bindgen_91babb583602ef71_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> Float
+    -> Float
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Surface_Unsafe_SDL_WriteSurfacePixelFloat@
+hs_bindgen_91babb583602ef71
+  :: BG.Ptr SDL_Surface
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_91babb583602ef71 =
+  BG.fromFFIType hs_bindgen_91babb583602ef71_base
+
+-- | Writes a single pixel to a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WriteSurfacePixelFloat@, defined at @SDL3\/SDL_surface.h 1761:34@
+sDL_WriteSurfacePixelFloat
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to write.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@r@]: the red channel value, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@g@]: the green channel value, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@b@]: the blue channel value, normally in the range 0-1.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@a@]: the alpha channel value, normally in the range 0-1.
+  -> IO BG.CBool
+sDL_WriteSurfacePixelFloat =
+  hs_bindgen_91babb583602ef71
diff --git a/src/SDL3/Sys/Bindgen/System.hs b/src/SDL3/Sys/Bindgen/System.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/System.hs
@@ -0,0 +1,283 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+module SDL3.Sys.Bindgen.System (
+  SDL3.Sys.Bindgen.System.XEvent,
+  SDL3.Sys.Bindgen.System.SDL_X11EventHook_Aux (..),
+  SDL3.Sys.Bindgen.System.SDL_X11EventHook (..),
+  SDL3.Sys.Bindgen.System.SDL_Sandbox (..),
+  pattern SDL3.Sys.Bindgen.System.SDL_SANDBOX_NONE,
+  pattern SDL3.Sys.Bindgen.System.SDL_SANDBOX_UNKNOWN_CONTAINER,
+  pattern SDL3.Sys.Bindgen.System.SDL_SANDBOX_FLATPAK,
+  pattern SDL3.Sys.Bindgen.System.SDL_SANDBOX_SNAP,
+  pattern SDL3.Sys.Bindgen.System.SDL_SANDBOX_MACOS,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @union _XEvent@, defined at @SDL3\/SDL_system.h 141:15@
+data XEvent
+
+-- | Auxiliary type used by 'SDL_X11EventHook'
+--
+--     [C declaration]: @SDL_X11EventHook@, defined at @SDL3\/SDL_system.h 163:24@
+newtype SDL_X11EventHook_Aux = SDL_X11EventHook_Aux
+  { unwrap :: BG.Ptr BG.Void -> BG.Ptr XEvent -> IO BG.CBool
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_X11EventHook_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_74aa64577de95c6c_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word8)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word8))
+
+-- __unique:__ @toSDL_X11EventHook_Aux@
+hs_bindgen_74aa64577de95c6c
+  :: SDL_X11EventHook_Aux
+  -> IO (BG.FunPtr SDL_X11EventHook_Aux)
+hs_bindgen_74aa64577de95c6c =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_74aa64577de95c6c_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_X11EventHook_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_cc5ab09f101f43e5_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word8)
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @fromSDL_X11EventHook_Aux@
+hs_bindgen_cc5ab09f101f43e5
+  :: BG.FunPtr SDL_X11EventHook_Aux
+  -> SDL_X11EventHook_Aux
+hs_bindgen_cc5ab09f101f43e5 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_cc5ab09f101f43e5_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_X11EventHook_Aux where
+  toFunPtr = hs_bindgen_74aa64577de95c6c
+
+instance BG.FromFunPtr SDL_X11EventHook_Aux where
+  fromFunPtr = hs_bindgen_cc5ab09f101f43e5
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr XEvent -> IO BG.CBool))
+  => BG.CompatHasField.HasField "unwrap" SDL_X11EventHook_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_X11EventHook_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr XEvent -> IO BG.CBool))
+  => BG.HasField "unwrap" (BG.Ptr SDL_X11EventHook_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_X11EventHook_Aux "unwrap" where
+  type
+    CFieldType SDL_X11EventHook_Aux "unwrap" =
+      BG.Ptr BG.Void -> BG.Ptr XEvent -> IO BG.CBool
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback to be used with SDL_SetX11EventHook.
+--
+--     This callback may modify the event, and should return true if the event should continue to be processed, or false to prevent further processing.
+--
+--     As this is processing an event directly from the X11 event loop, this callback should do the minimum required work and return quickly.
+--
+--     [@userdata@]: the app-defined pointer provided to SDL_SetX11EventHook.
+--
+--     [@xevent@]: a pointer to an Xlib 'XEvent' union to process.
+--
+--     [Returns]: true to let event continue on, false to drop it.
+--
+--     [Thread safety]: This may only be called (by SDL) from the thread handling the X11 event loop.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetX11EventHook'
+--
+--     [C declaration]: @SDL_X11EventHook@, defined at @SDL3\/SDL_system.h 163:24@
+newtype SDL_X11EventHook = SDL_X11EventHook
+  { unwrap :: BG.FunPtr SDL_X11EventHook_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_X11EventHook_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_X11EventHook ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_X11EventHook{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_X11EventHook_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_X11EventHook) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_X11EventHook "unwrap" where
+  type
+    CFieldType SDL_X11EventHook "unwrap" =
+      BG.FunPtr SDL_X11EventHook_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Application sandbox environment.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_Sandbox@, defined at @SDL3\/SDL_system.h 650:14@
+newtype SDL_Sandbox = SDL_Sandbox
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_Sandbox where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_Sandbox where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Sandbox
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_Sandbox where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Sandbox unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_Sandbox instance BG.Storable SDL_Sandbox
+
+deriving via BG.CUInt instance BG.Prim SDL_Sandbox
+
+instance CEnum.CEnum SDL_Sandbox where
+  type CEnumZ SDL_Sandbox = BG.CUInt
+
+  toCEnum = SDL_Sandbox
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_SANDBOX_NONE")
+        , (1, BG.singleton "SDL_SANDBOX_UNKNOWN_CONTAINER")
+        , (2, BG.singleton "SDL_SANDBOX_FLATPAK")
+        , (3, BG.singleton "SDL_SANDBOX_SNAP")
+        , (4, BG.singleton "SDL_SANDBOX_MACOS")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_Sandbox"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_Sandbox"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_Sandbox where
+  minDeclaredValue = SDL_SANDBOX_NONE
+
+  maxDeclaredValue = SDL_SANDBOX_MACOS
+
+instance Show SDL_Sandbox where
+  showsPrec = CEnum.shows
+
+instance Read SDL_Sandbox where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_Sandbox ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Sandbox{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_Sandbox) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_Sandbox "unwrap" where
+  type CFieldType SDL_Sandbox "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_SANDBOX_NONE@, defined at @SDL3\/SDL_system.h 652:5@
+pattern SDL_SANDBOX_NONE :: SDL_Sandbox
+pattern SDL_SANDBOX_NONE = SDL_Sandbox 0
+
+-- | [C declaration]: @SDL_SANDBOX_UNKNOWN_CONTAINER@, defined at @SDL3\/SDL_system.h 653:5@
+pattern SDL_SANDBOX_UNKNOWN_CONTAINER :: SDL_Sandbox
+pattern SDL_SANDBOX_UNKNOWN_CONTAINER = SDL_Sandbox 1
+
+-- | [C declaration]: @SDL_SANDBOX_FLATPAK@, defined at @SDL3\/SDL_system.h 654:5@
+pattern SDL_SANDBOX_FLATPAK :: SDL_Sandbox
+pattern SDL_SANDBOX_FLATPAK = SDL_Sandbox 2
+
+-- | [C declaration]: @SDL_SANDBOX_SNAP@, defined at @SDL3\/SDL_system.h 655:5@
+pattern SDL_SANDBOX_SNAP :: SDL_Sandbox
+pattern SDL_SANDBOX_SNAP = SDL_Sandbox 3
+
+-- | [C declaration]: @SDL_SANDBOX_MACOS@, defined at @SDL3\/SDL_system.h 656:5@
+pattern SDL_SANDBOX_MACOS :: SDL_Sandbox
+pattern SDL_SANDBOX_MACOS = SDL_Sandbox 4
diff --git a/src/SDL3/Sys/Bindgen/System/FunPtr.hs b/src/SDL3/Sys/Bindgen/System/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/System/FunPtr.hs
@@ -0,0 +1,414 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.System.FunPtr (
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_SetX11EventHook,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_SetLinuxThreadPriority,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_SetLinuxThreadPriorityAndPolicy,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_IsTablet,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_IsTV,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_GetSandbox,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_OnApplicationWillTerminate,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_OnApplicationDidReceiveMemoryWarning,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_OnApplicationWillEnterBackground,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_OnApplicationDidEnterBackground,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_OnApplicationWillEnterForeground,
+  SDL3.Sys.Bindgen.System.FunPtr.sDL_OnApplicationDidEnterForeground,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.System
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_system.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_SetX11EventHook */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_c8461cbd9f660faf (void)) ("
+         , "  SDL_X11EventHook arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetX11EventHook;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_SetLinuxThreadPriority */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1f8bde1858fb4a87 (void)) ("
+         , "  Sint64 arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "#ifdef SDL_PLATFORM_LINUX"
+         , "  return &SDL_SetLinuxThreadPriority;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetLinuxThreadPriority is only available on Linux\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_SetLinuxThreadPriorityAndPolicy */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_cfce4d2d582fd59d (void)) ("
+         , "  Sint64 arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "#ifdef SDL_PLATFORM_LINUX"
+         , "  return &SDL_SetLinuxThreadPriorityAndPolicy;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetLinuxThreadPriorityAndPolicy is only available on Linux\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_IsTablet */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9f492756c66f0817 (void)) (void)"
+         , "{"
+         , "  return &SDL_IsTablet;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_IsTV */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_cf95d51f81b9ae05 (void)) (void)"
+         , "{"
+         , "  return &SDL_IsTV;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_GetSandbox */"
+         , "__attribute__ ((const))"
+         , "SDL_Sandbox (*hs_bindgen_ec479faeb61e5dcc (void)) (void)"
+         , "{"
+         , "  return &SDL_GetSandbox;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationWillTerminate */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_d4425ea7b77d90a5 (void)) (void)"
+         , "{"
+         , "  return &SDL_OnApplicationWillTerminate;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationDidReceiveMemoryWarning */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_48da35892737056a (void)) (void)"
+         , "{"
+         , "  return &SDL_OnApplicationDidReceiveMemoryWarning;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationWillEnterBackground */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_b39763efba45615f (void)) (void)"
+         , "{"
+         , "  return &SDL_OnApplicationWillEnterBackground;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationDidEnterBackground */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_4930cfe88ee2ea33 (void)) (void)"
+         , "{"
+         , "  return &SDL_OnApplicationDidEnterBackground;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationWillEnterForeground */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_e6a127de1e095a24 (void)) (void)"
+         , "{"
+         , "  return &SDL_OnApplicationWillEnterForeground;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationDidEnterForeground */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_6ee69ef9852cabc3 (void)) (void)"
+         , "{"
+         , "  return &SDL_OnApplicationDidEnterForeground;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_SetX11EventHook@
+foreign import ccall unsafe "hs_bindgen_c8461cbd9f660faf"
+  hs_bindgen_c8461cbd9f660faf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_SetX11EventHook@
+hs_bindgen_c8461cbd9f660faf :: IO (BG.FunPtr (SDL_X11EventHook -> BG.Ptr BG.Void -> IO ()))
+hs_bindgen_c8461cbd9f660faf =
+  BG.fromFFIType hs_bindgen_c8461cbd9f660faf_base
+
+{-# NOINLINE sDL_SetX11EventHook #-}
+
+-- | Set a callback for every X11 event.
+--
+--     The callback may modify the event, and should return true if the event should continue to be processed, or false to prevent further processing.
+--
+--     [@callback@]: the 'SDL_X11EventHook' function to call.
+--
+--     [@userdata@]: a pointer to pass to every iteration of @callback@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetX11EventHook@, defined at @SDL3\/SDL_system.h 178:34@
+sDL_SetX11EventHook :: BG.FunPtr (SDL_X11EventHook -> BG.Ptr BG.Void -> IO ())
+sDL_SetX11EventHook =
+  BG.unsafePerformIO hs_bindgen_c8461cbd9f660faf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_SetLinuxThreadPriority@
+foreign import ccall unsafe "hs_bindgen_1f8bde1858fb4a87"
+  hs_bindgen_1f8bde1858fb4a87_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_SetLinuxThreadPriority@
+hs_bindgen_1f8bde1858fb4a87
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Sint64 -> BG.CInt -> IO BG.CBool))
+hs_bindgen_1f8bde1858fb4a87 =
+  BG.fromFFIType hs_bindgen_1f8bde1858fb4a87_base
+
+{-# NOINLINE sDL_SetLinuxThreadPriority #-}
+
+-- | [C declaration]: @SDL_SetLinuxThreadPriority@, defined at @SDL3\/SDL_system.h 197:34@
+sDL_SetLinuxThreadPriority :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Sint64 -> BG.CInt -> IO BG.CBool)
+sDL_SetLinuxThreadPriority =
+  BG.unsafePerformIO hs_bindgen_1f8bde1858fb4a87
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_SetLinuxThreadPriorityAndPolicy@
+foreign import ccall unsafe "hs_bindgen_cfce4d2d582fd59d"
+  hs_bindgen_cfce4d2d582fd59d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_SetLinuxThreadPriorityAndPolicy@
+hs_bindgen_cfce4d2d582fd59d
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Sint64 -> BG.CInt -> BG.CInt -> IO BG.CBool))
+hs_bindgen_cfce4d2d582fd59d =
+  BG.fromFFIType hs_bindgen_cfce4d2d582fd59d_base
+
+{-# NOINLINE sDL_SetLinuxThreadPriorityAndPolicy #-}
+
+-- | [C declaration]: @SDL_SetLinuxThreadPriorityAndPolicy@, defined at @SDL3\/SDL_system.h 215:34@
+sDL_SetLinuxThreadPriorityAndPolicy
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Sint64 -> BG.CInt -> BG.CInt -> IO BG.CBool)
+sDL_SetLinuxThreadPriorityAndPolicy =
+  BG.unsafePerformIO hs_bindgen_cfce4d2d582fd59d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_IsTablet@
+foreign import ccall unsafe "hs_bindgen_9f492756c66f0817"
+  hs_bindgen_9f492756c66f0817_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_IsTablet@
+hs_bindgen_9f492756c66f0817 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_9f492756c66f0817 =
+  BG.fromFFIType hs_bindgen_9f492756c66f0817_base
+
+{-# NOINLINE sDL_IsTablet #-}
+
+-- | Query if the current device is a tablet.
+--
+--     If SDL can\'t determine this, it will return false.
+--
+--     [Returns]: true if the device is a tablet, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsTablet@, defined at @SDL3\/SDL_system.h 630:34@
+sDL_IsTablet :: BG.FunPtr (IO BG.CBool)
+sDL_IsTablet =
+  BG.unsafePerformIO hs_bindgen_9f492756c66f0817
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_IsTV@
+foreign import ccall unsafe "hs_bindgen_cf95d51f81b9ae05"
+  hs_bindgen_cf95d51f81b9ae05_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_IsTV@
+hs_bindgen_cf95d51f81b9ae05 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_cf95d51f81b9ae05 =
+  BG.fromFFIType hs_bindgen_cf95d51f81b9ae05_base
+
+{-# NOINLINE sDL_IsTV #-}
+
+-- | Query if the current device is a TV.
+--
+--     If SDL can\'t determine this, it will return false.
+--
+--     [Returns]: true if the device is a TV, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsTV@, defined at @SDL3\/SDL_system.h 643:34@
+sDL_IsTV :: BG.FunPtr (IO BG.CBool)
+sDL_IsTV =
+  BG.unsafePerformIO hs_bindgen_cf95d51f81b9ae05
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_GetSandbox@
+foreign import ccall unsafe "hs_bindgen_ec479faeb61e5dcc"
+  hs_bindgen_ec479faeb61e5dcc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_GetSandbox@
+hs_bindgen_ec479faeb61e5dcc :: IO (BG.FunPtr (IO SDL_Sandbox))
+hs_bindgen_ec479faeb61e5dcc =
+  BG.fromFFIType hs_bindgen_ec479faeb61e5dcc_base
+
+{-# NOINLINE sDL_GetSandbox #-}
+
+-- | Get the application sandbox environment, if any.
+--
+--     [Returns]: the application sandbox environment or SDL_SANDBOX_NONE if the application is not running in a sandbox environment.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSandbox@, defined at @SDL3\/SDL_system.h 667:41@
+sDL_GetSandbox :: BG.FunPtr (IO SDL_Sandbox)
+sDL_GetSandbox =
+  BG.unsafePerformIO hs_bindgen_ec479faeb61e5dcc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationWillTerminate@
+foreign import ccall unsafe "hs_bindgen_d4425ea7b77d90a5"
+  hs_bindgen_d4425ea7b77d90a5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationWillTerminate@
+hs_bindgen_d4425ea7b77d90a5 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_d4425ea7b77d90a5 =
+  BG.fromFFIType hs_bindgen_d4425ea7b77d90a5_base
+
+{-# NOINLINE sDL_OnApplicationWillTerminate #-}
+
+-- | Let iOS apps with external event handling report onApplicationWillTerminate.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationWillTerminate@, defined at @SDL3\/SDL_system.h 687:34@
+sDL_OnApplicationWillTerminate :: BG.FunPtr (IO ())
+sDL_OnApplicationWillTerminate =
+  BG.unsafePerformIO hs_bindgen_d4425ea7b77d90a5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationDidReceiveMemoryWarning@
+foreign import ccall unsafe "hs_bindgen_48da35892737056a"
+  hs_bindgen_48da35892737056a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationDidReceiveMemoryWarning@
+hs_bindgen_48da35892737056a :: IO (BG.FunPtr (IO ()))
+hs_bindgen_48da35892737056a =
+  BG.fromFFIType hs_bindgen_48da35892737056a_base
+
+{-# NOINLINE sDL_OnApplicationDidReceiveMemoryWarning #-}
+
+-- | Let iOS apps with external event handling report onApplicationDidReceiveMemoryWarning.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationDidReceiveMemoryWarning@, defined at @SDL3\/SDL_system.h 704:34@
+sDL_OnApplicationDidReceiveMemoryWarning :: BG.FunPtr (IO ())
+sDL_OnApplicationDidReceiveMemoryWarning =
+  BG.unsafePerformIO hs_bindgen_48da35892737056a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationWillEnterBackground@
+foreign import ccall unsafe "hs_bindgen_b39763efba45615f"
+  hs_bindgen_b39763efba45615f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationWillEnterBackground@
+hs_bindgen_b39763efba45615f :: IO (BG.FunPtr (IO ()))
+hs_bindgen_b39763efba45615f =
+  BG.fromFFIType hs_bindgen_b39763efba45615f_base
+
+{-# NOINLINE sDL_OnApplicationWillEnterBackground #-}
+
+-- | Let iOS apps with external event handling report onApplicationWillResignActive.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationWillEnterBackground@, defined at @SDL3\/SDL_system.h 721:34@
+sDL_OnApplicationWillEnterBackground :: BG.FunPtr (IO ())
+sDL_OnApplicationWillEnterBackground =
+  BG.unsafePerformIO hs_bindgen_b39763efba45615f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationDidEnterBackground@
+foreign import ccall unsafe "hs_bindgen_4930cfe88ee2ea33"
+  hs_bindgen_4930cfe88ee2ea33_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationDidEnterBackground@
+hs_bindgen_4930cfe88ee2ea33 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_4930cfe88ee2ea33 =
+  BG.fromFFIType hs_bindgen_4930cfe88ee2ea33_base
+
+{-# NOINLINE sDL_OnApplicationDidEnterBackground #-}
+
+-- | Let iOS apps with external event handling report onApplicationDidEnterBackground.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationDidEnterBackground@, defined at @SDL3\/SDL_system.h 738:34@
+sDL_OnApplicationDidEnterBackground :: BG.FunPtr (IO ())
+sDL_OnApplicationDidEnterBackground =
+  BG.unsafePerformIO hs_bindgen_4930cfe88ee2ea33
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationWillEnterForeground@
+foreign import ccall unsafe "hs_bindgen_e6a127de1e095a24"
+  hs_bindgen_e6a127de1e095a24_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationWillEnterForeground@
+hs_bindgen_e6a127de1e095a24 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_e6a127de1e095a24 =
+  BG.fromFFIType hs_bindgen_e6a127de1e095a24_base
+
+{-# NOINLINE sDL_OnApplicationWillEnterForeground #-}
+
+-- | Let iOS apps with external event handling report onApplicationWillEnterForeground.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationWillEnterForeground@, defined at @SDL3\/SDL_system.h 755:34@
+sDL_OnApplicationWillEnterForeground :: BG.FunPtr (IO ())
+sDL_OnApplicationWillEnterForeground =
+  BG.unsafePerformIO hs_bindgen_e6a127de1e095a24
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationDidEnterForeground@
+foreign import ccall unsafe "hs_bindgen_6ee69ef9852cabc3"
+  hs_bindgen_6ee69ef9852cabc3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_get_SDL_OnApplicationDidEnterForeground@
+hs_bindgen_6ee69ef9852cabc3 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_6ee69ef9852cabc3 =
+  BG.fromFFIType hs_bindgen_6ee69ef9852cabc3_base
+
+{-# NOINLINE sDL_OnApplicationDidEnterForeground #-}
+
+-- | Let iOS apps with external event handling report onApplicationDidBecomeActive.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationDidEnterForeground@, defined at @SDL3\/SDL_system.h 772:34@
+sDL_OnApplicationDidEnterForeground :: BG.FunPtr (IO ())
+sDL_OnApplicationDidEnterForeground =
+  BG.unsafePerformIO hs_bindgen_6ee69ef9852cabc3
diff --git a/src/SDL3/Sys/Bindgen/System/Safe.hs b/src/SDL3/Sys/Bindgen/System/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/System/Safe.hs
@@ -0,0 +1,393 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.System.Safe (
+  SDL3.Sys.Bindgen.System.Safe.sDL_SetX11EventHook,
+  SDL3.Sys.Bindgen.System.Safe.sDL_SetLinuxThreadPriority,
+  SDL3.Sys.Bindgen.System.Safe.sDL_SetLinuxThreadPriorityAndPolicy,
+  SDL3.Sys.Bindgen.System.Safe.sDL_IsTablet,
+  SDL3.Sys.Bindgen.System.Safe.sDL_IsTV,
+  SDL3.Sys.Bindgen.System.Safe.sDL_GetSandbox,
+  SDL3.Sys.Bindgen.System.Safe.sDL_OnApplicationWillTerminate,
+  SDL3.Sys.Bindgen.System.Safe.sDL_OnApplicationDidReceiveMemoryWarning,
+  SDL3.Sys.Bindgen.System.Safe.sDL_OnApplicationWillEnterBackground,
+  SDL3.Sys.Bindgen.System.Safe.sDL_OnApplicationDidEnterBackground,
+  SDL3.Sys.Bindgen.System.Safe.sDL_OnApplicationWillEnterForeground,
+  SDL3.Sys.Bindgen.System.Safe.sDL_OnApplicationDidEnterForeground,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.System
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_system.h>"
+         , "void hs_bindgen_ead2e2ea2677d0f8 ("
+         , "  SDL_X11EventHook arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetX11EventHook)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_9110686f4456a2f3 ("
+         , "  Sint64 arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "#ifdef SDL_PLATFORM_LINUX"
+         , "  return (SDL_SetLinuxThreadPriority)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; return SDL_SetError(\"SDL_SetLinuxThreadPriority is only available on Linux\");"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_0383bd6da68658c0 ("
+         , "  Sint64 arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "#ifdef SDL_PLATFORM_LINUX"
+         , "  return (SDL_SetLinuxThreadPriorityAndPolicy)(arg1, arg2, arg3);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; return SDL_SetError(\"SDL_SetLinuxThreadPriorityAndPolicy is only available on Linux\");"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_c9f4754632fd8d42 (void)"
+         , "{"
+         , "  return (SDL_IsTablet)();"
+         , "}"
+         , "_Bool hs_bindgen_0cd31739327b6cd7 (void)"
+         , "{"
+         , "  return (SDL_IsTV)();"
+         , "}"
+         , "SDL_Sandbox hs_bindgen_e5a169479304c118 (void)"
+         , "{"
+         , "  return (SDL_GetSandbox)();"
+         , "}"
+         , "void hs_bindgen_6de90d6f8ee04ad6 (void)"
+         , "{"
+         , "  (SDL_OnApplicationWillTerminate)();"
+         , "}"
+         , "void hs_bindgen_36ae92858c8204df (void)"
+         , "{"
+         , "  (SDL_OnApplicationDidReceiveMemoryWarning)();"
+         , "}"
+         , "void hs_bindgen_62c6019205cd45c2 (void)"
+         , "{"
+         , "  (SDL_OnApplicationWillEnterBackground)();"
+         , "}"
+         , "void hs_bindgen_73b2cba299dd5591 (void)"
+         , "{"
+         , "  (SDL_OnApplicationDidEnterBackground)();"
+         , "}"
+         , "void hs_bindgen_2b70d675ad267009 (void)"
+         , "{"
+         , "  (SDL_OnApplicationWillEnterForeground)();"
+         , "}"
+         , "void hs_bindgen_cfd36268e651eb47 (void)"
+         , "{"
+         , "  (SDL_OnApplicationDidEnterForeground)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_SetX11EventHook@
+foreign import ccall safe "hs_bindgen_ead2e2ea2677d0f8"
+  hs_bindgen_ead2e2ea2677d0f8_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_SetX11EventHook@
+hs_bindgen_ead2e2ea2677d0f8
+  :: SDL_X11EventHook
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_ead2e2ea2677d0f8 =
+  BG.fromFFIType hs_bindgen_ead2e2ea2677d0f8_base
+
+-- | Set a callback for every X11 event.
+--
+--     The callback may modify the event, and should return true if the event should continue to be processed, or false to prevent further processing.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetX11EventHook@, defined at @SDL3\/SDL_system.h 178:34@
+sDL_SetX11EventHook
+  :: SDL_X11EventHook
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_X11EventHook' function to call.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to every iteration of @callback@.
+  -> IO ()
+sDL_SetX11EventHook = hs_bindgen_ead2e2ea2677d0f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_SetLinuxThreadPriority@
+foreign import ccall safe "hs_bindgen_9110686f4456a2f3"
+  hs_bindgen_9110686f4456a2f3_base
+    :: BG.Int64
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_SetLinuxThreadPriority@
+hs_bindgen_9110686f4456a2f3
+  :: SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_9110686f4456a2f3 =
+  BG.fromFFIType hs_bindgen_9110686f4456a2f3_base
+
+-- | [C declaration]: @SDL_SetLinuxThreadPriority@, defined at @SDL3\/SDL_system.h 197:34@
+sDL_SetLinuxThreadPriority
+  :: SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^ [C declaration]: @threadID@
+  -> BG.CInt
+  -- ^ [C declaration]: @priority@
+  -> IO BG.CBool
+sDL_SetLinuxThreadPriority =
+  hs_bindgen_9110686f4456a2f3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_SetLinuxThreadPriorityAndPolicy@
+foreign import ccall safe "hs_bindgen_0383bd6da68658c0"
+  hs_bindgen_0383bd6da68658c0_base
+    :: BG.Int64
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_SetLinuxThreadPriorityAndPolicy@
+hs_bindgen_0383bd6da68658c0
+  :: SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_0383bd6da68658c0 =
+  BG.fromFFIType hs_bindgen_0383bd6da68658c0_base
+
+-- | [C declaration]: @SDL_SetLinuxThreadPriorityAndPolicy@, defined at @SDL3\/SDL_system.h 215:34@
+sDL_SetLinuxThreadPriorityAndPolicy
+  :: SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^ [C declaration]: @threadID@
+  -> BG.CInt
+  -- ^ [C declaration]: @sdlPriority@
+  -> BG.CInt
+  -- ^ [C declaration]: @schedPolicy@
+  -> IO BG.CBool
+sDL_SetLinuxThreadPriorityAndPolicy =
+  hs_bindgen_0383bd6da68658c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_IsTablet@
+foreign import ccall safe "hs_bindgen_c9f4754632fd8d42"
+  hs_bindgen_c9f4754632fd8d42_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_IsTablet@
+hs_bindgen_c9f4754632fd8d42 :: IO BG.CBool
+hs_bindgen_c9f4754632fd8d42 =
+  BG.fromFFIType hs_bindgen_c9f4754632fd8d42_base
+
+-- | Query if the current device is a tablet.
+--
+--     If SDL can\'t determine this, it will return false.
+--
+--     [Returns]: true if the device is a tablet, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsTablet@, defined at @SDL3\/SDL_system.h 630:34@
+sDL_IsTablet :: IO BG.CBool
+sDL_IsTablet = hs_bindgen_c9f4754632fd8d42
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_IsTV@
+foreign import ccall safe "hs_bindgen_0cd31739327b6cd7"
+  hs_bindgen_0cd31739327b6cd7_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_IsTV@
+hs_bindgen_0cd31739327b6cd7 :: IO BG.CBool
+hs_bindgen_0cd31739327b6cd7 =
+  BG.fromFFIType hs_bindgen_0cd31739327b6cd7_base
+
+-- | Query if the current device is a TV.
+--
+--     If SDL can\'t determine this, it will return false.
+--
+--     [Returns]: true if the device is a TV, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsTV@, defined at @SDL3\/SDL_system.h 643:34@
+sDL_IsTV :: IO BG.CBool
+sDL_IsTV = hs_bindgen_0cd31739327b6cd7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_GetSandbox@
+foreign import ccall safe "hs_bindgen_e5a169479304c118"
+  hs_bindgen_e5a169479304c118_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_GetSandbox@
+hs_bindgen_e5a169479304c118 :: IO SDL_Sandbox
+hs_bindgen_e5a169479304c118 =
+  BG.fromFFIType hs_bindgen_e5a169479304c118_base
+
+-- | Get the application sandbox environment, if any.
+--
+--     [Returns]: the application sandbox environment or SDL_SANDBOX_NONE if the application is not running in a sandbox environment.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSandbox@, defined at @SDL3\/SDL_system.h 667:41@
+sDL_GetSandbox :: IO SDL_Sandbox
+sDL_GetSandbox = hs_bindgen_e5a169479304c118
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationWillTerminate@
+foreign import ccall safe "hs_bindgen_6de90d6f8ee04ad6"
+  hs_bindgen_6de90d6f8ee04ad6_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationWillTerminate@
+hs_bindgen_6de90d6f8ee04ad6 :: IO ()
+hs_bindgen_6de90d6f8ee04ad6 =
+  BG.fromFFIType hs_bindgen_6de90d6f8ee04ad6_base
+
+-- | Let iOS apps with external event handling report onApplicationWillTerminate.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationWillTerminate@, defined at @SDL3\/SDL_system.h 687:34@
+sDL_OnApplicationWillTerminate :: IO ()
+sDL_OnApplicationWillTerminate =
+  hs_bindgen_6de90d6f8ee04ad6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationDidReceiveMemoryWarning@
+foreign import ccall safe "hs_bindgen_36ae92858c8204df"
+  hs_bindgen_36ae92858c8204df_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationDidReceiveMemoryWarning@
+hs_bindgen_36ae92858c8204df :: IO ()
+hs_bindgen_36ae92858c8204df =
+  BG.fromFFIType hs_bindgen_36ae92858c8204df_base
+
+-- | Let iOS apps with external event handling report onApplicationDidReceiveMemoryWarning.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationDidReceiveMemoryWarning@, defined at @SDL3\/SDL_system.h 704:34@
+sDL_OnApplicationDidReceiveMemoryWarning :: IO ()
+sDL_OnApplicationDidReceiveMemoryWarning =
+  hs_bindgen_36ae92858c8204df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationWillEnterBackground@
+foreign import ccall safe "hs_bindgen_62c6019205cd45c2"
+  hs_bindgen_62c6019205cd45c2_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationWillEnterBackground@
+hs_bindgen_62c6019205cd45c2 :: IO ()
+hs_bindgen_62c6019205cd45c2 =
+  BG.fromFFIType hs_bindgen_62c6019205cd45c2_base
+
+-- | Let iOS apps with external event handling report onApplicationWillResignActive.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationWillEnterBackground@, defined at @SDL3\/SDL_system.h 721:34@
+sDL_OnApplicationWillEnterBackground :: IO ()
+sDL_OnApplicationWillEnterBackground =
+  hs_bindgen_62c6019205cd45c2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationDidEnterBackground@
+foreign import ccall safe "hs_bindgen_73b2cba299dd5591"
+  hs_bindgen_73b2cba299dd5591_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationDidEnterBackground@
+hs_bindgen_73b2cba299dd5591 :: IO ()
+hs_bindgen_73b2cba299dd5591 =
+  BG.fromFFIType hs_bindgen_73b2cba299dd5591_base
+
+-- | Let iOS apps with external event handling report onApplicationDidEnterBackground.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationDidEnterBackground@, defined at @SDL3\/SDL_system.h 738:34@
+sDL_OnApplicationDidEnterBackground :: IO ()
+sDL_OnApplicationDidEnterBackground =
+  hs_bindgen_73b2cba299dd5591
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationWillEnterForeground@
+foreign import ccall safe "hs_bindgen_2b70d675ad267009"
+  hs_bindgen_2b70d675ad267009_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationWillEnterForeground@
+hs_bindgen_2b70d675ad267009 :: IO ()
+hs_bindgen_2b70d675ad267009 =
+  BG.fromFFIType hs_bindgen_2b70d675ad267009_base
+
+-- | Let iOS apps with external event handling report onApplicationWillEnterForeground.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationWillEnterForeground@, defined at @SDL3\/SDL_system.h 755:34@
+sDL_OnApplicationWillEnterForeground :: IO ()
+sDL_OnApplicationWillEnterForeground =
+  hs_bindgen_2b70d675ad267009
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationDidEnterForeground@
+foreign import ccall safe "hs_bindgen_cfd36268e651eb47"
+  hs_bindgen_cfd36268e651eb47_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Safe_SDL_OnApplicationDidEnterForeground@
+hs_bindgen_cfd36268e651eb47 :: IO ()
+hs_bindgen_cfd36268e651eb47 =
+  BG.fromFFIType hs_bindgen_cfd36268e651eb47_base
+
+-- | Let iOS apps with external event handling report onApplicationDidBecomeActive.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationDidEnterForeground@, defined at @SDL3\/SDL_system.h 772:34@
+sDL_OnApplicationDidEnterForeground :: IO ()
+sDL_OnApplicationDidEnterForeground =
+  hs_bindgen_cfd36268e651eb47
diff --git a/src/SDL3/Sys/Bindgen/System/Unsafe.hs b/src/SDL3/Sys/Bindgen/System/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/System/Unsafe.hs
@@ -0,0 +1,393 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.System.Unsafe (
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_SetX11EventHook,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_SetLinuxThreadPriority,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_SetLinuxThreadPriorityAndPolicy,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_IsTablet,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_IsTV,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_GetSandbox,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_OnApplicationWillTerminate,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_OnApplicationDidReceiveMemoryWarning,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_OnApplicationWillEnterBackground,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_OnApplicationDidEnterBackground,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_OnApplicationWillEnterForeground,
+  SDL3.Sys.Bindgen.System.Unsafe.sDL_OnApplicationDidEnterForeground,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.System
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_system.h>"
+         , "void hs_bindgen_6578867fea03cacb ("
+         , "  SDL_X11EventHook arg1,"
+         , "  void *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetX11EventHook)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_2e342f8192ce7216 ("
+         , "  Sint64 arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "#ifdef SDL_PLATFORM_LINUX"
+         , "  return (SDL_SetLinuxThreadPriority)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; return SDL_SetError(\"SDL_SetLinuxThreadPriority is only available on Linux\");"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_5590fa8686376477 ("
+         , "  Sint64 arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "#ifdef SDL_PLATFORM_LINUX"
+         , "  return (SDL_SetLinuxThreadPriorityAndPolicy)(arg1, arg2, arg3);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; (void)arg3; return SDL_SetError(\"SDL_SetLinuxThreadPriorityAndPolicy is only available on Linux\");"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_3681fc863886c2d2 (void)"
+         , "{"
+         , "  return (SDL_IsTablet)();"
+         , "}"
+         , "_Bool hs_bindgen_0bab6eb88d9a9496 (void)"
+         , "{"
+         , "  return (SDL_IsTV)();"
+         , "}"
+         , "SDL_Sandbox hs_bindgen_090a9001bc04ef5b (void)"
+         , "{"
+         , "  return (SDL_GetSandbox)();"
+         , "}"
+         , "void hs_bindgen_b7f727ac4163d9e9 (void)"
+         , "{"
+         , "  (SDL_OnApplicationWillTerminate)();"
+         , "}"
+         , "void hs_bindgen_9064fb92743d3c76 (void)"
+         , "{"
+         , "  (SDL_OnApplicationDidReceiveMemoryWarning)();"
+         , "}"
+         , "void hs_bindgen_874965c3cc9cd908 (void)"
+         , "{"
+         , "  (SDL_OnApplicationWillEnterBackground)();"
+         , "}"
+         , "void hs_bindgen_092a71f4734666c3 (void)"
+         , "{"
+         , "  (SDL_OnApplicationDidEnterBackground)();"
+         , "}"
+         , "void hs_bindgen_bf629409e4677855 (void)"
+         , "{"
+         , "  (SDL_OnApplicationWillEnterForeground)();"
+         , "}"
+         , "void hs_bindgen_36db0306e16f75d9 (void)"
+         , "{"
+         , "  (SDL_OnApplicationDidEnterForeground)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_SetX11EventHook@
+foreign import ccall unsafe "hs_bindgen_6578867fea03cacb"
+  hs_bindgen_6578867fea03cacb_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_SetX11EventHook@
+hs_bindgen_6578867fea03cacb
+  :: SDL_X11EventHook
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_6578867fea03cacb =
+  BG.fromFFIType hs_bindgen_6578867fea03cacb_base
+
+-- | Set a callback for every X11 event.
+--
+--     The callback may modify the event, and should return true if the event should continue to be processed, or false to prevent further processing.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetX11EventHook@, defined at @SDL3\/SDL_system.h 178:34@
+sDL_SetX11EventHook
+  :: SDL_X11EventHook
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_X11EventHook' function to call.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to every iteration of @callback@.
+  -> IO ()
+sDL_SetX11EventHook = hs_bindgen_6578867fea03cacb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_SetLinuxThreadPriority@
+foreign import ccall unsafe "hs_bindgen_2e342f8192ce7216"
+  hs_bindgen_2e342f8192ce7216_base
+    :: BG.Int64
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_SetLinuxThreadPriority@
+hs_bindgen_2e342f8192ce7216
+  :: SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_2e342f8192ce7216 =
+  BG.fromFFIType hs_bindgen_2e342f8192ce7216_base
+
+-- | [C declaration]: @SDL_SetLinuxThreadPriority@, defined at @SDL3\/SDL_system.h 197:34@
+sDL_SetLinuxThreadPriority
+  :: SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^ [C declaration]: @threadID@
+  -> BG.CInt
+  -- ^ [C declaration]: @priority@
+  -> IO BG.CBool
+sDL_SetLinuxThreadPriority =
+  hs_bindgen_2e342f8192ce7216
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_SetLinuxThreadPriorityAndPolicy@
+foreign import ccall unsafe "hs_bindgen_5590fa8686376477"
+  hs_bindgen_5590fa8686376477_base
+    :: BG.Int64
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_SetLinuxThreadPriorityAndPolicy@
+hs_bindgen_5590fa8686376477
+  :: SDL3.Sys.Bindgen.Stdinc.Sint64
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_5590fa8686376477 =
+  BG.fromFFIType hs_bindgen_5590fa8686376477_base
+
+-- | [C declaration]: @SDL_SetLinuxThreadPriorityAndPolicy@, defined at @SDL3\/SDL_system.h 215:34@
+sDL_SetLinuxThreadPriorityAndPolicy
+  :: SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^ [C declaration]: @threadID@
+  -> BG.CInt
+  -- ^ [C declaration]: @sdlPriority@
+  -> BG.CInt
+  -- ^ [C declaration]: @schedPolicy@
+  -> IO BG.CBool
+sDL_SetLinuxThreadPriorityAndPolicy =
+  hs_bindgen_5590fa8686376477
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_IsTablet@
+foreign import ccall unsafe "hs_bindgen_3681fc863886c2d2"
+  hs_bindgen_3681fc863886c2d2_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_IsTablet@
+hs_bindgen_3681fc863886c2d2 :: IO BG.CBool
+hs_bindgen_3681fc863886c2d2 =
+  BG.fromFFIType hs_bindgen_3681fc863886c2d2_base
+
+-- | Query if the current device is a tablet.
+--
+--     If SDL can\'t determine this, it will return false.
+--
+--     [Returns]: true if the device is a tablet, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsTablet@, defined at @SDL3\/SDL_system.h 630:34@
+sDL_IsTablet :: IO BG.CBool
+sDL_IsTablet = hs_bindgen_3681fc863886c2d2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_IsTV@
+foreign import ccall unsafe "hs_bindgen_0bab6eb88d9a9496"
+  hs_bindgen_0bab6eb88d9a9496_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_IsTV@
+hs_bindgen_0bab6eb88d9a9496 :: IO BG.CBool
+hs_bindgen_0bab6eb88d9a9496 =
+  BG.fromFFIType hs_bindgen_0bab6eb88d9a9496_base
+
+-- | Query if the current device is a TV.
+--
+--     If SDL can\'t determine this, it will return false.
+--
+--     [Returns]: true if the device is a TV, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_IsTV@, defined at @SDL3\/SDL_system.h 643:34@
+sDL_IsTV :: IO BG.CBool
+sDL_IsTV = hs_bindgen_0bab6eb88d9a9496
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_GetSandbox@
+foreign import ccall unsafe "hs_bindgen_090a9001bc04ef5b"
+  hs_bindgen_090a9001bc04ef5b_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_GetSandbox@
+hs_bindgen_090a9001bc04ef5b :: IO SDL_Sandbox
+hs_bindgen_090a9001bc04ef5b =
+  BG.fromFFIType hs_bindgen_090a9001bc04ef5b_base
+
+-- | Get the application sandbox environment, if any.
+--
+--     [Returns]: the application sandbox environment or SDL_SANDBOX_NONE if the application is not running in a sandbox environment.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSandbox@, defined at @SDL3\/SDL_system.h 667:41@
+sDL_GetSandbox :: IO SDL_Sandbox
+sDL_GetSandbox = hs_bindgen_090a9001bc04ef5b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationWillTerminate@
+foreign import ccall unsafe "hs_bindgen_b7f727ac4163d9e9"
+  hs_bindgen_b7f727ac4163d9e9_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationWillTerminate@
+hs_bindgen_b7f727ac4163d9e9 :: IO ()
+hs_bindgen_b7f727ac4163d9e9 =
+  BG.fromFFIType hs_bindgen_b7f727ac4163d9e9_base
+
+-- | Let iOS apps with external event handling report onApplicationWillTerminate.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationWillTerminate@, defined at @SDL3\/SDL_system.h 687:34@
+sDL_OnApplicationWillTerminate :: IO ()
+sDL_OnApplicationWillTerminate =
+  hs_bindgen_b7f727ac4163d9e9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationDidReceiveMemoryWarning@
+foreign import ccall unsafe "hs_bindgen_9064fb92743d3c76"
+  hs_bindgen_9064fb92743d3c76_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationDidReceiveMemoryWarning@
+hs_bindgen_9064fb92743d3c76 :: IO ()
+hs_bindgen_9064fb92743d3c76 =
+  BG.fromFFIType hs_bindgen_9064fb92743d3c76_base
+
+-- | Let iOS apps with external event handling report onApplicationDidReceiveMemoryWarning.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationDidReceiveMemoryWarning@, defined at @SDL3\/SDL_system.h 704:34@
+sDL_OnApplicationDidReceiveMemoryWarning :: IO ()
+sDL_OnApplicationDidReceiveMemoryWarning =
+  hs_bindgen_9064fb92743d3c76
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationWillEnterBackground@
+foreign import ccall unsafe "hs_bindgen_874965c3cc9cd908"
+  hs_bindgen_874965c3cc9cd908_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationWillEnterBackground@
+hs_bindgen_874965c3cc9cd908 :: IO ()
+hs_bindgen_874965c3cc9cd908 =
+  BG.fromFFIType hs_bindgen_874965c3cc9cd908_base
+
+-- | Let iOS apps with external event handling report onApplicationWillResignActive.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationWillEnterBackground@, defined at @SDL3\/SDL_system.h 721:34@
+sDL_OnApplicationWillEnterBackground :: IO ()
+sDL_OnApplicationWillEnterBackground =
+  hs_bindgen_874965c3cc9cd908
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationDidEnterBackground@
+foreign import ccall unsafe "hs_bindgen_092a71f4734666c3"
+  hs_bindgen_092a71f4734666c3_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationDidEnterBackground@
+hs_bindgen_092a71f4734666c3 :: IO ()
+hs_bindgen_092a71f4734666c3 =
+  BG.fromFFIType hs_bindgen_092a71f4734666c3_base
+
+-- | Let iOS apps with external event handling report onApplicationDidEnterBackground.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationDidEnterBackground@, defined at @SDL3\/SDL_system.h 738:34@
+sDL_OnApplicationDidEnterBackground :: IO ()
+sDL_OnApplicationDidEnterBackground =
+  hs_bindgen_092a71f4734666c3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationWillEnterForeground@
+foreign import ccall unsafe "hs_bindgen_bf629409e4677855"
+  hs_bindgen_bf629409e4677855_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationWillEnterForeground@
+hs_bindgen_bf629409e4677855 :: IO ()
+hs_bindgen_bf629409e4677855 =
+  BG.fromFFIType hs_bindgen_bf629409e4677855_base
+
+-- | Let iOS apps with external event handling report onApplicationWillEnterForeground.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationWillEnterForeground@, defined at @SDL3\/SDL_system.h 755:34@
+sDL_OnApplicationWillEnterForeground :: IO ()
+sDL_OnApplicationWillEnterForeground =
+  hs_bindgen_bf629409e4677855
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationDidEnterForeground@
+foreign import ccall unsafe "hs_bindgen_36db0306e16f75d9"
+  hs_bindgen_36db0306e16f75d9_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.System_Unsafe_SDL_OnApplicationDidEnterForeground@
+hs_bindgen_36db0306e16f75d9 :: IO ()
+hs_bindgen_36db0306e16f75d9 =
+  BG.fromFFIType hs_bindgen_36db0306e16f75d9_base
+
+-- | Let iOS apps with external event handling report onApplicationDidBecomeActive.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by SDL_CreateWindow!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_OnApplicationDidEnterForeground@, defined at @SDL3\/SDL_system.h 772:34@
+sDL_OnApplicationDidEnterForeground :: IO ()
+sDL_OnApplicationDidEnterForeground =
+  hs_bindgen_36db0306e16f75d9
diff --git a/src/SDL3/Sys/Bindgen/Thread.hs b/src/SDL3/Sys/Bindgen/Thread.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Thread.hs
@@ -0,0 +1,768 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL offers cross-platform thread management functions. These are mostly concerned with starting threads, setting their priority, and dealing with their termination.
+--
+--     In addition, there is support for Thread Local Storage (data that is unique to each thread, but accessed from a single key).
+--
+--     On platforms without thread support (such as Emscripten when built without pthreads), these functions still exist, but things like @SDL_CreateThread()@ will report failure without doing anything.
+--
+--     If you\'re going to work with threads, you almost certainly need to have a good understanding of thread safety measures: locking and synchronization mechanisms are handled by the functions in SDL_mutex.h. The SDL thread object.
+--
+--     These are opaque data.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'sDL_WaitThread'
+module SDL3.Sys.Bindgen.Thread (
+  SDL3.Sys.Bindgen.Thread.SDL_Thread,
+  SDL3.Sys.Bindgen.Thread.SDL_ThreadID (..),
+  SDL3.Sys.Bindgen.Thread.SDL_TLSID (..),
+  SDL3.Sys.Bindgen.Thread.SDL_ThreadPriority (..),
+  pattern SDL3.Sys.Bindgen.Thread.SDL_THREAD_PRIORITY_LOW,
+  pattern SDL3.Sys.Bindgen.Thread.SDL_THREAD_PRIORITY_NORMAL,
+  pattern SDL3.Sys.Bindgen.Thread.SDL_THREAD_PRIORITY_HIGH,
+  pattern SDL3.Sys.Bindgen.Thread.SDL_THREAD_PRIORITY_TIME_CRITICAL,
+  SDL3.Sys.Bindgen.Thread.SDL_ThreadState (..),
+  pattern SDL3.Sys.Bindgen.Thread.SDL_THREAD_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Thread.SDL_THREAD_ALIVE,
+  pattern SDL3.Sys.Bindgen.Thread.SDL_THREAD_DETACHED,
+  pattern SDL3.Sys.Bindgen.Thread.SDL_THREAD_COMPLETE,
+  SDL3.Sys.Bindgen.Thread.SDL_ThreadFunction_Aux (..),
+  SDL3.Sys.Bindgen.Thread.SDL_ThreadFunction (..),
+  SDL3.Sys.Bindgen.Thread.sDL_PROP_THREAD_CREATE_ENTRY_FUNCTION_POINTER,
+  SDL3.Sys.Bindgen.Thread.sDL_PROP_THREAD_CREATE_NAME_STRING,
+  SDL3.Sys.Bindgen.Thread.sDL_PROP_THREAD_CREATE_USERDATA_POINTER,
+  SDL3.Sys.Bindgen.Thread.sDL_PROP_THREAD_CREATE_STACKSIZE_NUMBER,
+  SDL3.Sys.Bindgen.Thread.SDL_TLSDestructorCallback_Aux (..),
+  SDL3.Sys.Bindgen.Thread.SDL_TLSDestructorCallback (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Atomic qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @struct SDL_Thread@, defined at @SDL3\/SDL_thread.h 71:16@
+data SDL_Thread
+
+-- | A unique numeric ID that identifies a thread.
+--
+--     These are different from 'SDL_Thread' objects, which are generally what an application will operate on, but having a way to uniquely identify a thread can be useful at times.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetThreadID', 'sDL_GetCurrentThreadID'
+--
+--     [C declaration]: @SDL_ThreadID@, defined at @SDL3\/SDL_thread.h 85:16@
+newtype SDL_ThreadID = SDL_ThreadID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "unwrap" SDL_ThreadID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ThreadID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ThreadID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ThreadID "unwrap" where
+  type
+    CFieldType SDL_ThreadID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 0
+
+-- | Thread local storage ID.
+--
+--     0 is the invalid ID. An app can create these and then set data for these IDs that is unique to each thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTLS', 'sDL_SetTLS'
+--
+--     [C declaration]: @SDL_TLSID@, defined at @SDL3\/SDL_thread.h 98:23@
+newtype SDL_TLSID = SDL_TLSID
+  { unwrap :: SDL3.Sys.Bindgen.Atomic.SDL_AtomicInt
+  }
+  deriving stock (BG.Generic, Eq, Show)
+  deriving newtype
+    ( BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Atomic.SDL_AtomicInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_TLSID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TLSID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Atomic.SDL_AtomicInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TLSID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TLSID "unwrap" where
+  type
+    CFieldType SDL_TLSID "unwrap" =
+      SDL3.Sys.Bindgen.Atomic.SDL_AtomicInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The SDL thread priority.
+--
+--     SDL will make system changes as necessary in order to apply the thread priority. Code which attempts to control thread state related to priority should be aware that calling SDL_SetCurrentThreadPriority may alter such state. SDL_HINT_THREAD_PRIORITY_POLICY can be used to control aspects of this behavior.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_ThreadPriority@, defined at @SDL3\/SDL_thread.h 111:14@
+newtype SDL_ThreadPriority = SDL_ThreadPriority
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_ThreadPriority where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_ThreadPriority where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ThreadPriority
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_ThreadPriority where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ThreadPriority unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_ThreadPriority instance BG.Storable SDL_ThreadPriority
+
+deriving via BG.CUInt instance BG.Prim SDL_ThreadPriority
+
+instance CEnum.CEnum SDL_ThreadPriority where
+  type CEnumZ SDL_ThreadPriority = BG.CUInt
+
+  toCEnum = SDL_ThreadPriority
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_THREAD_PRIORITY_LOW")
+        , (1, BG.singleton "SDL_THREAD_PRIORITY_NORMAL")
+        , (2, BG.singleton "SDL_THREAD_PRIORITY_HIGH")
+        , (3, BG.singleton "SDL_THREAD_PRIORITY_TIME_CRITICAL")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_ThreadPriority"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_ThreadPriority"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_ThreadPriority where
+  minDeclaredValue = SDL_THREAD_PRIORITY_LOW
+
+  maxDeclaredValue = SDL_THREAD_PRIORITY_TIME_CRITICAL
+
+instance Show SDL_ThreadPriority where
+  showsPrec = CEnum.shows
+
+instance Read SDL_ThreadPriority where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_ThreadPriority ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ThreadPriority{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ThreadPriority) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ThreadPriority "unwrap" where
+  type
+    CFieldType SDL_ThreadPriority "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_THREAD_PRIORITY_LOW@, defined at @SDL3\/SDL_thread.h 112:5@
+pattern SDL_THREAD_PRIORITY_LOW :: SDL_ThreadPriority
+pattern SDL_THREAD_PRIORITY_LOW = SDL_ThreadPriority 0
+
+-- | [C declaration]: @SDL_THREAD_PRIORITY_NORMAL@, defined at @SDL3\/SDL_thread.h 113:5@
+pattern SDL_THREAD_PRIORITY_NORMAL :: SDL_ThreadPriority
+pattern SDL_THREAD_PRIORITY_NORMAL = SDL_ThreadPriority 1
+
+-- | [C declaration]: @SDL_THREAD_PRIORITY_HIGH@, defined at @SDL3\/SDL_thread.h 114:5@
+pattern SDL_THREAD_PRIORITY_HIGH :: SDL_ThreadPriority
+pattern SDL_THREAD_PRIORITY_HIGH = SDL_ThreadPriority 2
+
+-- | [C declaration]: @SDL_THREAD_PRIORITY_TIME_CRITICAL@, defined at @SDL3\/SDL_thread.h 115:5@
+pattern SDL_THREAD_PRIORITY_TIME_CRITICAL :: SDL_ThreadPriority
+pattern SDL_THREAD_PRIORITY_TIME_CRITICAL = SDL_ThreadPriority 3
+
+-- | The SDL thread state.
+--
+--     The current state of a thread can be checked by calling SDL_GetThreadState.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetThreadState'
+--
+--     [C declaration]: @enum SDL_ThreadState@, defined at @SDL3\/SDL_thread.h 127:14@
+newtype SDL_ThreadState = SDL_ThreadState
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_ThreadState where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_ThreadState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ThreadState
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_ThreadState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ThreadState unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_ThreadState instance BG.Storable SDL_ThreadState
+
+deriving via BG.CUInt instance BG.Prim SDL_ThreadState
+
+instance CEnum.CEnum SDL_ThreadState where
+  type CEnumZ SDL_ThreadState = BG.CUInt
+
+  toCEnum = SDL_ThreadState
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_THREAD_UNKNOWN")
+        , (1, BG.singleton "SDL_THREAD_ALIVE")
+        , (2, BG.singleton "SDL_THREAD_DETACHED")
+        , (3, BG.singleton "SDL_THREAD_COMPLETE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_ThreadState"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_ThreadState"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_ThreadState where
+  minDeclaredValue = SDL_THREAD_UNKNOWN
+
+  maxDeclaredValue = SDL_THREAD_COMPLETE
+
+instance Show SDL_ThreadState where
+  showsPrec = CEnum.shows
+
+instance Read SDL_ThreadState where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_ThreadState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ThreadState{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ThreadState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ThreadState "unwrap" where
+  type CFieldType SDL_ThreadState "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The thread is not valid
+--
+--     [C declaration]: @SDL_THREAD_UNKNOWN@, defined at @SDL3\/SDL_thread.h 129:5@
+pattern SDL_THREAD_UNKNOWN :: SDL_ThreadState
+pattern SDL_THREAD_UNKNOWN = SDL_ThreadState 0
+
+-- | The thread is currently running
+--
+--     [C declaration]: @SDL_THREAD_ALIVE@, defined at @SDL3\/SDL_thread.h 130:5@
+pattern SDL_THREAD_ALIVE :: SDL_ThreadState
+pattern SDL_THREAD_ALIVE = SDL_ThreadState 1
+
+-- | The thread is detached and can\'t be waited on
+--
+--     [C declaration]: @SDL_THREAD_DETACHED@, defined at @SDL3\/SDL_thread.h 131:5@
+pattern SDL_THREAD_DETACHED :: SDL_ThreadState
+pattern SDL_THREAD_DETACHED = SDL_ThreadState 2
+
+-- | The thread has finished and should be cleaned up with @SDL_WaitThread()@
+--
+--     [C declaration]: @SDL_THREAD_COMPLETE@, defined at @SDL3\/SDL_thread.h 132:5@
+pattern SDL_THREAD_COMPLETE :: SDL_ThreadState
+pattern SDL_THREAD_COMPLETE = SDL_ThreadState 3
+
+-- | Auxiliary type used by 'SDL_ThreadFunction'
+--
+--     [C declaration]: @SDL_ThreadFunction@, defined at @SDL3\/SDL_thread.h 143:23@
+newtype SDL_ThreadFunction_Aux = SDL_ThreadFunction_Aux
+  { unwrap :: BG.Ptr BG.Void -> IO BG.CInt
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_ThreadFunction_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_d53137dca60d82b1_base
+    :: (BG.Ptr BG.Void -> IO BG.Int32)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> IO BG.Int32))
+
+-- __unique:__ @toSDL_ThreadFunction_Aux@
+hs_bindgen_d53137dca60d82b1
+  :: SDL_ThreadFunction_Aux
+  -> IO (BG.FunPtr SDL_ThreadFunction_Aux)
+hs_bindgen_d53137dca60d82b1 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_d53137dca60d82b1_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_ThreadFunction_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_67f38a19566426bd_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> IO BG.Int32)
+    -> BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @fromSDL_ThreadFunction_Aux@
+hs_bindgen_67f38a19566426bd
+  :: BG.FunPtr SDL_ThreadFunction_Aux
+  -> SDL_ThreadFunction_Aux
+hs_bindgen_67f38a19566426bd =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_67f38a19566426bd_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_ThreadFunction_Aux where
+  toFunPtr = hs_bindgen_d53137dca60d82b1
+
+instance BG.FromFunPtr SDL_ThreadFunction_Aux where
+  fromFunPtr = hs_bindgen_67f38a19566426bd
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO BG.CInt))
+  => BG.CompatHasField.HasField "unwrap" SDL_ThreadFunction_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ThreadFunction_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO BG.CInt))
+  => BG.HasField "unwrap" (BG.Ptr SDL_ThreadFunction_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ThreadFunction_Aux "unwrap" where
+  type
+    CFieldType SDL_ThreadFunction_Aux "unwrap" =
+      BG.Ptr BG.Void -> IO BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The function passed to @SDL_CreateThread()@ as the new thread\'s entry point.
+--
+--     [@data@]: what was passed as @data@ to @SDL_CreateThread()@.
+--
+--     [Returns]: a value that can be reported through @SDL_WaitThread()@.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ThreadFunction@, defined at @SDL3\/SDL_thread.h 143:23@
+newtype SDL_ThreadFunction = SDL_ThreadFunction
+  { unwrap :: BG.FunPtr SDL_ThreadFunction_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_ThreadFunction_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_ThreadFunction ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ThreadFunction{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_ThreadFunction_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ThreadFunction) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ThreadFunction "unwrap" where
+  type
+    CFieldType SDL_ThreadFunction "unwrap" =
+      BG.FunPtr SDL_ThreadFunction_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @macro SDL_PROP_THREAD_CREATE_ENTRY_FUNCTION_POINTER@, literal @\"SDL.thread.create.entry_function\"@, defined at @SDL3\/SDL_thread.h 360:9@
+sDL_PROP_THREAD_CREATE_ENTRY_FUNCTION_POINTER :: BG.ByteString
+sDL_PROP_THREAD_CREATE_ENTRY_FUNCTION_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x68
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x64
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x65
+    , 0x6E
+    , 0x74
+    , 0x72
+    , 0x79
+    , 0x5F
+    , 0x66
+    , 0x75
+    , 0x6E
+    , 0x63
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_THREAD_CREATE_NAME_STRING@, literal @\"SDL.thread.create.name\"@, defined at @SDL3\/SDL_thread.h 361:9@
+sDL_PROP_THREAD_CREATE_NAME_STRING :: BG.ByteString
+sDL_PROP_THREAD_CREATE_NAME_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x68
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x64
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6E
+    , 0x61
+    , 0x6D
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_THREAD_CREATE_USERDATA_POINTER@, literal @\"SDL.thread.create.userdata\"@, defined at @SDL3\/SDL_thread.h 362:9@
+sDL_PROP_THREAD_CREATE_USERDATA_POINTER :: BG.ByteString
+sDL_PROP_THREAD_CREATE_USERDATA_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x68
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x64
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x75
+    , 0x73
+    , 0x65
+    , 0x72
+    , 0x64
+    , 0x61
+    , 0x74
+    , 0x61
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_THREAD_CREATE_STACKSIZE_NUMBER@, literal @\"SDL.thread.create.stacksize\"@, defined at @SDL3\/SDL_thread.h 363:9@
+sDL_PROP_THREAD_CREATE_STACKSIZE_NUMBER :: BG.ByteString
+sDL_PROP_THREAD_CREATE_STACKSIZE_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x74
+    , 0x68
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x64
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x74
+    , 0x61
+    , 0x63
+    , 0x6B
+    , 0x73
+    , 0x69
+    , 0x7A
+    , 0x65
+    ]
+
+-- | Auxiliary type used by 'SDL_TLSDestructorCallback'
+--
+--     [C declaration]: @SDL_TLSDestructorCallback@, defined at @SDL3\/SDL_thread.h 553:24@
+newtype SDL_TLSDestructorCallback_Aux = SDL_TLSDestructorCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_TLSDestructorCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_7c0725308cb75f6c_base
+    :: (BG.Ptr BG.Void -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> IO ()))
+
+-- __unique:__ @toSDL_TLSDestructorCallback_Aux@
+hs_bindgen_7c0725308cb75f6c
+  :: SDL_TLSDestructorCallback_Aux
+  -> IO (BG.FunPtr SDL_TLSDestructorCallback_Aux)
+hs_bindgen_7c0725308cb75f6c =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_7c0725308cb75f6c_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_TLSDestructorCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_bbd67b4f21094dd4_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> IO ())
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @fromSDL_TLSDestructorCallback_Aux@
+hs_bindgen_bbd67b4f21094dd4
+  :: BG.FunPtr SDL_TLSDestructorCallback_Aux
+  -> SDL_TLSDestructorCallback_Aux
+hs_bindgen_bbd67b4f21094dd4 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_bbd67b4f21094dd4_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_TLSDestructorCallback_Aux where
+  toFunPtr = hs_bindgen_7c0725308cb75f6c
+
+instance BG.FromFunPtr SDL_TLSDestructorCallback_Aux where
+  fromFunPtr = hs_bindgen_bbd67b4f21094dd4
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_TLSDestructorCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 -> SDL_TLSDestructorCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_TLSDestructorCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TLSDestructorCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_TLSDestructorCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | The callback used to cleanup data passed to SDL_SetTLS.
+--
+--     This is called when a thread exits, to allow an app to free any resources.
+--
+--     [@value@]: a pointer previously handed to SDL_SetTLS.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTLS'
+--
+--     [C declaration]: @SDL_TLSDestructorCallback@, defined at @SDL3\/SDL_thread.h 553:24@
+newtype SDL_TLSDestructorCallback = SDL_TLSDestructorCallback
+  { unwrap :: BG.FunPtr SDL_TLSDestructorCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_TLSDestructorCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_TLSDestructorCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TLSDestructorCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_TLSDestructorCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TLSDestructorCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TLSDestructorCallback "unwrap" where
+  type
+    CFieldType SDL_TLSDestructorCallback "unwrap" =
+      BG.FunPtr SDL_TLSDestructorCallback_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Thread/FunPtr.hs b/src/SDL3/Sys/Bindgen/Thread/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Thread/FunPtr.hs
@@ -0,0 +1,558 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Thread.FunPtr (
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_CreateThreadRuntime,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_CreateThreadWithPropertiesRuntime,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_GetThreadName,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_GetCurrentThreadID,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_GetThreadID,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_SetCurrentThreadPriority,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_WaitThread,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_GetThreadState,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_DetachThread,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_GetTLS,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_SetTLS,
+  SDL3.Sys.Bindgen.Thread.FunPtr.sDL_CleanupTLS,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Thread
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_thread.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_CreateThreadRuntime */"
+         , "__attribute__ ((const))"
+         , "SDL_Thread *(*hs_bindgen_079d67764828e8ca (void)) ("
+         , "  SDL_ThreadFunction arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3,"
+         , "  SDL_FunctionPointer arg4,"
+         , "  SDL_FunctionPointer arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateThreadRuntime;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_CreateThreadWithPropertiesRuntime */"
+         , "__attribute__ ((const))"
+         , "SDL_Thread *(*hs_bindgen_fbbbbe860e54a81b (void)) ("
+         , "  SDL_PropertiesID arg1,"
+         , "  SDL_FunctionPointer arg2,"
+         , "  SDL_FunctionPointer arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateThreadWithPropertiesRuntime;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetThreadName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_e563c48c050c310f (void)) ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetThreadName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetCurrentThreadID */"
+         , "__attribute__ ((const))"
+         , "SDL_ThreadID (*hs_bindgen_effa8645fe390420 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetCurrentThreadID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetThreadID */"
+         , "__attribute__ ((const))"
+         , "SDL_ThreadID (*hs_bindgen_c6b2baacca9ccf65 (void)) ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetThreadID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_SetCurrentThreadPriority */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a168059a22478eba (void)) ("
+         , "  SDL_ThreadPriority arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SetCurrentThreadPriority;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_WaitThread */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_cfb548a191eb099e (void)) ("
+         , "  SDL_Thread *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_WaitThread;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetThreadState */"
+         , "__attribute__ ((const))"
+         , "SDL_ThreadState (*hs_bindgen_f7f587323d3bdf2a (void)) ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetThreadState;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_DetachThread */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_aaa3526a91b1159b (void)) ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DetachThread;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetTLS */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_306c7e1462be621b (void)) ("
+         , "  SDL_TLSID *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTLS;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_SetTLS */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_aeaff0a42fc0a797 (void)) ("
+         , "  SDL_TLSID *arg1,"
+         , "  void const *arg2,"
+         , "  SDL_TLSDestructorCallback arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTLS;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_CleanupTLS */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_624951e26d725434 (void)) (void)"
+         , "{"
+         , "  return &SDL_CleanupTLS;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_CreateThreadRuntime@
+foreign import ccall unsafe "hs_bindgen_079d67764828e8ca"
+  hs_bindgen_079d67764828e8ca_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_CreateThreadRuntime@
+hs_bindgen_079d67764828e8ca
+  :: IO
+       ( BG.FunPtr
+           ( SDL_ThreadFunction
+             -> PtrConst.PtrConst BG.CChar
+             -> BG.Ptr BG.Void
+             -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+             -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+             -> IO (BG.Ptr SDL_Thread)
+           )
+       )
+hs_bindgen_079d67764828e8ca =
+  BG.fromFFIType hs_bindgen_079d67764828e8ca_base
+
+{-# NOINLINE sDL_CreateThreadRuntime #-}
+
+-- | The actual entry point for SDL_CreateThread.
+--
+--     [@fn@]: the 'SDL_ThreadFunction' function to call in the new thread
+--
+--     [@name@]: the name of the thread
+--
+--     [@data@]: a pointer that is passed to @fn@
+--
+--     [@pfnBeginThread@]: the C runtime\'s _beginthreadex (or whatnot). Can be NULL.
+--
+--     [@pfnEndThread@]: the C runtime\'s _endthreadex (or whatnot). Can be NULL.
+--
+--     [Returns]: an opaque pointer to the new thread object on success, NULL if the new thread could not be created; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CreateThreadRuntime@, defined at @SDL3\/SDL_thread.h 340:42@
+sDL_CreateThreadRuntime
+  :: BG.FunPtr
+       ( SDL_ThreadFunction
+         -> PtrConst.PtrConst BG.CChar
+         -> BG.Ptr BG.Void
+         -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+         -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+         -> IO (BG.Ptr SDL_Thread)
+       )
+sDL_CreateThreadRuntime =
+  BG.unsafePerformIO hs_bindgen_079d67764828e8ca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_CreateThreadWithPropertiesRuntime@
+foreign import ccall unsafe "hs_bindgen_fbbbbe860e54a81b"
+  hs_bindgen_fbbbbe860e54a81b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_CreateThreadWithPropertiesRuntime@
+hs_bindgen_fbbbbe860e54a81b
+  :: IO
+       ( BG.FunPtr
+           ( SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+             -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+             -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+             -> IO (BG.Ptr SDL_Thread)
+           )
+       )
+hs_bindgen_fbbbbe860e54a81b =
+  BG.fromFFIType hs_bindgen_fbbbbe860e54a81b_base
+
+{-# NOINLINE sDL_CreateThreadWithPropertiesRuntime #-}
+
+-- | The actual entry point for SDL_CreateThreadWithProperties.
+--
+--     [@props@]: the properties to use
+--
+--     [@pfnBeginThread@]: the C runtime\'s _beginthreadex (or whatnot). Can be NULL.
+--
+--     [@pfnEndThread@]: the C runtime\'s _endthreadex (or whatnot). Can be NULL.
+--
+--     [Returns]: an opaque pointer to the new thread object on success, NULL if the new thread could not be created; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CreateThreadWithPropertiesRuntime@, defined at @SDL3\/SDL_thread.h 356:42@
+sDL_CreateThreadWithPropertiesRuntime
+  :: BG.FunPtr
+       ( SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+         -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+         -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+         -> IO (BG.Ptr SDL_Thread)
+       )
+sDL_CreateThreadWithPropertiesRuntime =
+  BG.unsafePerformIO hs_bindgen_fbbbbe860e54a81b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetThreadName@
+foreign import ccall unsafe "hs_bindgen_e563c48c050c310f"
+  hs_bindgen_e563c48c050c310f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetThreadName@
+hs_bindgen_e563c48c050c310f :: IO (BG.FunPtr (BG.Ptr SDL_Thread -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_e563c48c050c310f =
+  BG.fromFFIType hs_bindgen_e563c48c050c310f_base
+
+{-# NOINLINE sDL_GetThreadName #-}
+
+-- | Get the thread name as it was specified in @SDL_CreateThread()@.
+--
+--     [@thread@]: the thread to query.
+--
+--     [Returns]: a pointer to a UTF-8 string that names the specified thread, or NULL if it doesn\'t have a name.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetThreadName@, defined at @SDL3\/SDL_thread.h 378:42@
+sDL_GetThreadName :: BG.FunPtr (BG.Ptr SDL_Thread -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetThreadName =
+  BG.unsafePerformIO hs_bindgen_e563c48c050c310f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetCurrentThreadID@
+foreign import ccall unsafe "hs_bindgen_effa8645fe390420"
+  hs_bindgen_effa8645fe390420_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetCurrentThreadID@
+hs_bindgen_effa8645fe390420 :: IO (BG.FunPtr (IO SDL_ThreadID))
+hs_bindgen_effa8645fe390420 =
+  BG.fromFFIType hs_bindgen_effa8645fe390420_base
+
+{-# NOINLINE sDL_GetCurrentThreadID #-}
+
+-- | Get the thread identifier for the current thread.
+--
+--     This thread identifier is as reported by the underlying operating system. If SDL is running on a platform that does not support threads the return value will always be zero.
+--
+--     This function also returns a valid thread ID when called from the main thread.
+--
+--     [Returns]: the ID of the current thread.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetThreadID'
+--
+--     [C declaration]: @SDL_GetCurrentThreadID@, defined at @SDL3\/SDL_thread.h 398:42@
+sDL_GetCurrentThreadID :: BG.FunPtr (IO SDL_ThreadID)
+sDL_GetCurrentThreadID =
+  BG.unsafePerformIO hs_bindgen_effa8645fe390420
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetThreadID@
+foreign import ccall unsafe "hs_bindgen_c6b2baacca9ccf65"
+  hs_bindgen_c6b2baacca9ccf65_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetThreadID@
+hs_bindgen_c6b2baacca9ccf65 :: IO (BG.FunPtr (BG.Ptr SDL_Thread -> IO SDL_ThreadID))
+hs_bindgen_c6b2baacca9ccf65 =
+  BG.fromFFIType hs_bindgen_c6b2baacca9ccf65_base
+
+{-# NOINLINE sDL_GetThreadID #-}
+
+-- | Get the thread identifier for the specified thread.
+--
+--     This thread identifier is as reported by the underlying operating system. If SDL is running on a platform that does not support threads the return value will always be zero.
+--
+--     [@thread@]: the thread to query.
+--
+--     [Returns]: the ID of the specified thread, or the ID of the current thread if @thread@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCurrentThreadID'
+--
+--     [C declaration]: @SDL_GetThreadID@, defined at @SDL3\/SDL_thread.h 417:42@
+sDL_GetThreadID :: BG.FunPtr (BG.Ptr SDL_Thread -> IO SDL_ThreadID)
+sDL_GetThreadID =
+  BG.unsafePerformIO hs_bindgen_c6b2baacca9ccf65
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_SetCurrentThreadPriority@
+foreign import ccall unsafe "hs_bindgen_a168059a22478eba"
+  hs_bindgen_a168059a22478eba_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_SetCurrentThreadPriority@
+hs_bindgen_a168059a22478eba :: IO (BG.FunPtr (SDL_ThreadPriority -> IO BG.CBool))
+hs_bindgen_a168059a22478eba =
+  BG.fromFFIType hs_bindgen_a168059a22478eba_base
+
+{-# NOINLINE sDL_SetCurrentThreadPriority #-}
+
+-- | Set the priority for the current thread.
+--
+--     Note that some platforms will not let you alter the priority (or at least, promote the thread to a higher priority) at all, and some require you to be an administrator account. Be prepared for this to fail.
+--
+--     [@priority@]: the 'SDL_ThreadPriority' to set.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetCurrentThreadPriority@, defined at @SDL3\/SDL_thread.h 434:34@
+sDL_SetCurrentThreadPriority :: BG.FunPtr (SDL_ThreadPriority -> IO BG.CBool)
+sDL_SetCurrentThreadPriority =
+  BG.unsafePerformIO hs_bindgen_a168059a22478eba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_WaitThread@
+foreign import ccall unsafe "hs_bindgen_cfb548a191eb099e"
+  hs_bindgen_cfb548a191eb099e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_WaitThread@
+hs_bindgen_cfb548a191eb099e :: IO (BG.FunPtr (BG.Ptr SDL_Thread -> BG.Ptr BG.CInt -> IO ()))
+hs_bindgen_cfb548a191eb099e =
+  BG.fromFFIType hs_bindgen_cfb548a191eb099e_base
+
+{-# NOINLINE sDL_WaitThread #-}
+
+-- | Wait for a thread to finish.
+--
+--     Threads that haven\'t been detached will remain until this function cleans them up. Not doing so is a resource leak.
+--
+--     Once a thread has been cleaned up through this function, the 'SDL_Thread' that references it becomes invalid and should not be referenced again. As such, only one thread may call @SDL_WaitThread()@ on another.
+--
+--     The return code from the thread function is placed in the area pointed to by @status@, if @status@ is not NULL.
+--
+--     You may not wait on a thread that has been used in a call to @SDL_DetachThread()@. Use either that function or this one, but not both, or behavior is undefined.
+--
+--     It is safe to pass a NULL thread to this function; it is a no-op.
+--
+--     Note that the thread pointer is freed by this function and is not valid afterward.
+--
+--     [@thread@]: the 'SDL_Thread' pointer that was returned from the @SDL_CreateThread()@ call that started this thread.
+--
+--     [@status@]: a pointer filled in with the value returned from the thread function by its \'return\', or -1 if the thread has been detached or isn\'t valid, may be NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but only a single thread can wait any specific thread to finish.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'sDL_DetachThread'
+--
+--     [C declaration]: @SDL_WaitThread@, defined at @SDL3\/SDL_thread.h 472:34@
+sDL_WaitThread :: BG.FunPtr (BG.Ptr SDL_Thread -> BG.Ptr BG.CInt -> IO ())
+sDL_WaitThread =
+  BG.unsafePerformIO hs_bindgen_cfb548a191eb099e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetThreadState@
+foreign import ccall unsafe "hs_bindgen_f7f587323d3bdf2a"
+  hs_bindgen_f7f587323d3bdf2a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetThreadState@
+hs_bindgen_f7f587323d3bdf2a :: IO (BG.FunPtr (BG.Ptr SDL_Thread -> IO SDL_ThreadState))
+hs_bindgen_f7f587323d3bdf2a =
+  BG.fromFFIType hs_bindgen_f7f587323d3bdf2a_base
+
+{-# NOINLINE sDL_GetThreadState #-}
+
+-- | Get the current state of a thread.
+--
+--     [@thread@]: the thread to query.
+--
+--     [Returns]: the current state of a thread, or SDL_THREAD_UNKNOWN if the thread isn\'t valid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_ThreadState'
+--
+--     [C declaration]: @SDL_GetThreadState@, defined at @SDL3\/SDL_thread.h 487:45@
+sDL_GetThreadState :: BG.FunPtr (BG.Ptr SDL_Thread -> IO SDL_ThreadState)
+sDL_GetThreadState =
+  BG.unsafePerformIO hs_bindgen_f7f587323d3bdf2a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_DetachThread@
+foreign import ccall unsafe "hs_bindgen_aaa3526a91b1159b"
+  hs_bindgen_aaa3526a91b1159b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_DetachThread@
+hs_bindgen_aaa3526a91b1159b :: IO (BG.FunPtr (BG.Ptr SDL_Thread -> IO ()))
+hs_bindgen_aaa3526a91b1159b =
+  BG.fromFFIType hs_bindgen_aaa3526a91b1159b_base
+
+{-# NOINLINE sDL_DetachThread #-}
+
+-- | Let a thread clean up on exit without intervention.
+--
+--     A thread may be \"detached\" to signify that it should not remain until another thread has called @SDL_WaitThread()@ on it. Detaching a thread is useful for long-running threads that nothing needs to synchronize with or further manage. When a detached thread is done, it simply goes away.
+--
+--     There is no way to recover the return code of a detached thread. If you need this, don\'t detach the thread and instead use @SDL_WaitThread()@.
+--
+--     Once a thread is detached, you should usually assume the 'SDL_Thread' isn\'t safe to reference again, as it will become invalid immediately upon the detached thread\'s exit, instead of remaining until someone has called @SDL_WaitThread()@ to finally clean it up. As such, don\'t detach the same thread more than once.
+--
+--     If a thread has already exited when passed to @SDL_DetachThread()@, it will stop waiting for a call to @SDL_WaitThread()@ and clean up immediately. It is not safe to detach a thread that might be used with @SDL_WaitThread()@.
+--
+--     You may not call @SDL_WaitThread()@ on a thread that has been detached. Use either that function or this one, but not both, or behavior is undefined.
+--
+--     It is safe to pass NULL to this function; it is a no-op.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     [@thread@]: the 'SDL_Thread' pointer that was returned from the @SDL_CreateThread()@ call that started this thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'sDL_WaitThread'
+--
+--     [C declaration]: @SDL_DetachThread@, defined at @SDL3\/SDL_thread.h 525:34@
+sDL_DetachThread :: BG.FunPtr (BG.Ptr SDL_Thread -> IO ())
+sDL_DetachThread =
+  BG.unsafePerformIO hs_bindgen_aaa3526a91b1159b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetTLS@
+foreign import ccall unsafe "hs_bindgen_306c7e1462be621b"
+  hs_bindgen_306c7e1462be621b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_GetTLS@
+hs_bindgen_306c7e1462be621b :: IO (BG.FunPtr (BG.Ptr SDL_TLSID -> IO (BG.Ptr BG.Void)))
+hs_bindgen_306c7e1462be621b =
+  BG.fromFFIType hs_bindgen_306c7e1462be621b_base
+
+{-# NOINLINE sDL_GetTLS #-}
+
+-- | Get the current thread\'s value associated with a thread local storage ID.
+--
+--     [@id@]: a pointer to the thread local storage ID, may not be NULL.
+--
+--     [Returns]: the value associated with the ID for the current thread or NULL if no value has been set; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTLS'
+--
+--     [C declaration]: @SDL_GetTLS@, defined at @SDL3\/SDL_thread.h 540:36@
+sDL_GetTLS :: BG.FunPtr (BG.Ptr SDL_TLSID -> IO (BG.Ptr BG.Void))
+sDL_GetTLS =
+  BG.unsafePerformIO hs_bindgen_306c7e1462be621b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_SetTLS@
+foreign import ccall unsafe "hs_bindgen_aeaff0a42fc0a797"
+  hs_bindgen_aeaff0a42fc0a797_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_SetTLS@
+hs_bindgen_aeaff0a42fc0a797
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_TLSID -> PtrConst.PtrConst BG.Void -> SDL_TLSDestructorCallback -> IO BG.CBool)
+       )
+hs_bindgen_aeaff0a42fc0a797 =
+  BG.fromFFIType hs_bindgen_aeaff0a42fc0a797_base
+
+{-# NOINLINE sDL_SetTLS #-}
+
+-- | Set the current thread\'s value associated with a thread local storage ID.
+--
+--     If the thread local storage ID is not initialized (the value is 0), a new ID will be created in a thread-safe way, so all calls using a pointer to the same ID will refer to the same local storage.
+--
+--     Note that replacing a value from a previous call to this function on the same thread does /not/ call the previous value\'s destructor!
+--
+--     @destructor@ can be NULL; it is assumed that @value@ does not need to be cleaned up if so.
+--
+--     [@id@]: a pointer to the thread local storage ID, may not be NULL.
+--
+--     [@value@]: the value to associate with the ID for the current thread.
+--
+--     [@destructor@]: a function called when the thread exits, to free the value, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTLS'
+--
+--     [C declaration]: @SDL_SetTLS@, defined at @SDL3\/SDL_thread.h 581:34@
+sDL_SetTLS
+  :: BG.FunPtr
+       (BG.Ptr SDL_TLSID -> PtrConst.PtrConst BG.Void -> SDL_TLSDestructorCallback -> IO BG.CBool)
+sDL_SetTLS =
+  BG.unsafePerformIO hs_bindgen_aeaff0a42fc0a797
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_CleanupTLS@
+foreign import ccall unsafe "hs_bindgen_624951e26d725434"
+  hs_bindgen_624951e26d725434_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_get_SDL_CleanupTLS@
+hs_bindgen_624951e26d725434 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_624951e26d725434 =
+  BG.fromFFIType hs_bindgen_624951e26d725434_base
+
+{-# NOINLINE sDL_CleanupTLS #-}
+
+-- | Cleanup all TLS data for this thread.
+--
+--     If you are creating your threads outside of SDL and then calling SDL functions, you should call this function before your thread exits, to properly clean up SDL memory.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CleanupTLS@, defined at @SDL3\/SDL_thread.h 594:34@
+sDL_CleanupTLS :: BG.FunPtr (IO ())
+sDL_CleanupTLS =
+  BG.unsafePerformIO hs_bindgen_624951e26d725434
diff --git a/src/SDL3/Sys/Bindgen/Thread/Safe.hs b/src/SDL3/Sys/Bindgen/Thread/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Thread/Safe.hs
@@ -0,0 +1,558 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Thread.Safe (
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_CreateThreadRuntime,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_CreateThreadWithPropertiesRuntime,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_GetThreadName,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_GetCurrentThreadID,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_GetThreadID,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_SetCurrentThreadPriority,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_WaitThread,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_GetThreadState,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_DetachThread,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_GetTLS,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_SetTLS,
+  SDL3.Sys.Bindgen.Thread.Safe.sDL_CleanupTLS,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Thread
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_thread.h>"
+         , "SDL_Thread *hs_bindgen_7a5bb8de9530cf97 ("
+         , "  SDL_ThreadFunction arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3,"
+         , "  SDL_FunctionPointer arg4,"
+         , "  SDL_FunctionPointer arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateThreadRuntime)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "SDL_Thread *hs_bindgen_f6b34f6b1ed3e652 ("
+         , "  SDL_PropertiesID arg1,"
+         , "  SDL_FunctionPointer arg2,"
+         , "  SDL_FunctionPointer arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateThreadWithPropertiesRuntime)(arg1, arg2, arg3);"
+         , "}"
+         , "char const *hs_bindgen_97b2a318eb18256b ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetThreadName)(arg1);"
+         , "}"
+         , "SDL_ThreadID hs_bindgen_5d7f41ef47a61ad6 (void)"
+         , "{"
+         , "  return (SDL_GetCurrentThreadID)();"
+         , "}"
+         , "SDL_ThreadID hs_bindgen_d5ff55252314f9e2 ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetThreadID)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_bba3006936da2399 ("
+         , "  SDL_ThreadPriority arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SetCurrentThreadPriority)(arg1);"
+         , "}"
+         , "void hs_bindgen_3cc86150a4e3dbed ("
+         , "  SDL_Thread *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_WaitThread)(arg1, arg2);"
+         , "}"
+         , "SDL_ThreadState hs_bindgen_dfbf2083fecd641f ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetThreadState)(arg1);"
+         , "}"
+         , "void hs_bindgen_bf6e3b719a8a289b ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DetachThread)(arg1);"
+         , "}"
+         , "void *hs_bindgen_a7ebc89f9b77863c ("
+         , "  SDL_TLSID *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTLS)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_09d0ca8da839649c ("
+         , "  SDL_TLSID *arg1,"
+         , "  void const *arg2,"
+         , "  SDL_TLSDestructorCallback arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTLS)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_ff0e7a5728335d6e (void)"
+         , "{"
+         , "  (SDL_CleanupTLS)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_CreateThreadRuntime@
+foreign import ccall safe "hs_bindgen_7a5bb8de9530cf97"
+  hs_bindgen_7a5bb8de9530cf97_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_CreateThreadRuntime@
+hs_bindgen_7a5bb8de9530cf97
+  :: SDL_ThreadFunction
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -> IO (BG.Ptr SDL_Thread)
+hs_bindgen_7a5bb8de9530cf97 =
+  BG.fromFFIType hs_bindgen_7a5bb8de9530cf97_base
+
+-- | The actual entry point for SDL_CreateThread.
+--
+--     [Returns]: an opaque pointer to the new thread object on success, NULL if the new thread could not be created; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CreateThreadRuntime@, defined at @SDL3\/SDL_thread.h 340:42@
+sDL_CreateThreadRuntime
+  :: SDL_ThreadFunction
+  -- ^
+  --
+  --           [@fn@]: the 'SDL_ThreadFunction' function to call in the new thread
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the thread
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@data@]: a pointer that is passed to @fn@
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnBeginThread@]: the C runtime\'s _beginthreadex (or whatnot). Can be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnEndThread@]: the C runtime\'s _endthreadex (or whatnot). Can be NULL.
+  -> IO (BG.Ptr SDL_Thread)
+sDL_CreateThreadRuntime = hs_bindgen_7a5bb8de9530cf97
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_CreateThreadWithPropertiesRuntime@
+foreign import ccall safe "hs_bindgen_f6b34f6b1ed3e652"
+  hs_bindgen_f6b34f6b1ed3e652_base
+    :: BG.Word32
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_CreateThreadWithPropertiesRuntime@
+hs_bindgen_f6b34f6b1ed3e652
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -> IO (BG.Ptr SDL_Thread)
+hs_bindgen_f6b34f6b1ed3e652 =
+  BG.fromFFIType hs_bindgen_f6b34f6b1ed3e652_base
+
+-- | The actual entry point for SDL_CreateThreadWithProperties.
+--
+--     [Returns]: an opaque pointer to the new thread object on success, NULL if the new thread could not be created; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CreateThreadWithPropertiesRuntime@, defined at @SDL3\/SDL_thread.h 356:42@
+sDL_CreateThreadWithPropertiesRuntime
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnBeginThread@]: the C runtime\'s _beginthreadex (or whatnot). Can be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnEndThread@]: the C runtime\'s _endthreadex (or whatnot). Can be NULL.
+  -> IO (BG.Ptr SDL_Thread)
+sDL_CreateThreadWithPropertiesRuntime =
+  hs_bindgen_f6b34f6b1ed3e652
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_GetThreadName@
+foreign import ccall safe "hs_bindgen_97b2a318eb18256b"
+  hs_bindgen_97b2a318eb18256b_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_GetThreadName@
+hs_bindgen_97b2a318eb18256b
+  :: BG.Ptr SDL_Thread
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_97b2a318eb18256b =
+  BG.fromFFIType hs_bindgen_97b2a318eb18256b_base
+
+-- | Get the thread name as it was specified in @SDL_CreateThread()@.
+--
+--     [Returns]: a pointer to a UTF-8 string that names the specified thread, or NULL if it doesn\'t have a name.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetThreadName@, defined at @SDL3\/SDL_thread.h 378:42@
+sDL_GetThreadName
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetThreadName = hs_bindgen_97b2a318eb18256b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_GetCurrentThreadID@
+foreign import ccall safe "hs_bindgen_5d7f41ef47a61ad6"
+  hs_bindgen_5d7f41ef47a61ad6_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_GetCurrentThreadID@
+hs_bindgen_5d7f41ef47a61ad6 :: IO SDL_ThreadID
+hs_bindgen_5d7f41ef47a61ad6 =
+  BG.fromFFIType hs_bindgen_5d7f41ef47a61ad6_base
+
+-- | Get the thread identifier for the current thread.
+--
+--     This thread identifier is as reported by the underlying operating system. If SDL is running on a platform that does not support threads the return value will always be zero.
+--
+--     This function also returns a valid thread ID when called from the main thread.
+--
+--     [Returns]: the ID of the current thread.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetThreadID'
+--
+--     [C declaration]: @SDL_GetCurrentThreadID@, defined at @SDL3\/SDL_thread.h 398:42@
+sDL_GetCurrentThreadID :: IO SDL_ThreadID
+sDL_GetCurrentThreadID = hs_bindgen_5d7f41ef47a61ad6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_GetThreadID@
+foreign import ccall safe "hs_bindgen_d5ff55252314f9e2"
+  hs_bindgen_d5ff55252314f9e2_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_GetThreadID@
+hs_bindgen_d5ff55252314f9e2
+  :: BG.Ptr SDL_Thread
+  -> IO SDL_ThreadID
+hs_bindgen_d5ff55252314f9e2 =
+  BG.fromFFIType hs_bindgen_d5ff55252314f9e2_base
+
+-- | Get the thread identifier for the specified thread.
+--
+--     This thread identifier is as reported by the underlying operating system. If SDL is running on a platform that does not support threads the return value will always be zero.
+--
+--     [Returns]: the ID of the specified thread, or the ID of the current thread if @thread@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCurrentThreadID'
+--
+--     [C declaration]: @SDL_GetThreadID@, defined at @SDL3\/SDL_thread.h 417:42@
+sDL_GetThreadID
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO SDL_ThreadID
+sDL_GetThreadID = hs_bindgen_d5ff55252314f9e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_SetCurrentThreadPriority@
+foreign import ccall safe "hs_bindgen_bba3006936da2399"
+  hs_bindgen_bba3006936da2399_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_SetCurrentThreadPriority@
+hs_bindgen_bba3006936da2399
+  :: SDL_ThreadPriority
+  -> IO BG.CBool
+hs_bindgen_bba3006936da2399 =
+  BG.fromFFIType hs_bindgen_bba3006936da2399_base
+
+-- | Set the priority for the current thread.
+--
+--     Note that some platforms will not let you alter the priority (or at least, promote the thread to a higher priority) at all, and some require you to be an administrator account. Be prepared for this to fail.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetCurrentThreadPriority@, defined at @SDL3\/SDL_thread.h 434:34@
+sDL_SetCurrentThreadPriority
+  :: SDL_ThreadPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_ThreadPriority' to set.
+  -> IO BG.CBool
+sDL_SetCurrentThreadPriority =
+  hs_bindgen_bba3006936da2399
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_WaitThread@
+foreign import ccall safe "hs_bindgen_3cc86150a4e3dbed"
+  hs_bindgen_3cc86150a4e3dbed_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_WaitThread@
+hs_bindgen_3cc86150a4e3dbed
+  :: BG.Ptr SDL_Thread
+  -> BG.Ptr BG.CInt
+  -> IO ()
+hs_bindgen_3cc86150a4e3dbed =
+  BG.fromFFIType hs_bindgen_3cc86150a4e3dbed_base
+
+-- | Wait for a thread to finish.
+--
+--     Threads that haven\'t been detached will remain until this function cleans them up. Not doing so is a resource leak.
+--
+--     Once a thread has been cleaned up through this function, the 'SDL_Thread' that references it becomes invalid and should not be referenced again. As such, only one thread may call @SDL_WaitThread()@ on another.
+--
+--     The return code from the thread function is placed in the area pointed to by @status@, if @status@ is not NULL.
+--
+--     You may not wait on a thread that has been used in a call to @SDL_DetachThread()@. Use either that function or this one, but not both, or behavior is undefined.
+--
+--     It is safe to pass a NULL thread to this function; it is a no-op.
+--
+--     Note that the thread pointer is freed by this function and is not valid afterward.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but only a single thread can wait any specific thread to finish.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'sDL_DetachThread'
+--
+--     [C declaration]: @SDL_WaitThread@, defined at @SDL3\/SDL_thread.h 472:34@
+sDL_WaitThread
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the 'SDL_Thread' pointer that was returned from the @SDL_CreateThread()@ call that started this thread.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@status@]: a pointer filled in with the value returned from the thread function by its \'return\', or -1 if the thread has been detached or isn\'t valid, may be NULL.
+  -> IO ()
+sDL_WaitThread = hs_bindgen_3cc86150a4e3dbed
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_GetThreadState@
+foreign import ccall safe "hs_bindgen_dfbf2083fecd641f"
+  hs_bindgen_dfbf2083fecd641f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_GetThreadState@
+hs_bindgen_dfbf2083fecd641f
+  :: BG.Ptr SDL_Thread
+  -> IO SDL_ThreadState
+hs_bindgen_dfbf2083fecd641f =
+  BG.fromFFIType hs_bindgen_dfbf2083fecd641f_base
+
+-- | Get the current state of a thread.
+--
+--     [Returns]: the current state of a thread, or SDL_THREAD_UNKNOWN if the thread isn\'t valid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_ThreadState'
+--
+--     [C declaration]: @SDL_GetThreadState@, defined at @SDL3\/SDL_thread.h 487:45@
+sDL_GetThreadState
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO SDL_ThreadState
+sDL_GetThreadState = hs_bindgen_dfbf2083fecd641f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_DetachThread@
+foreign import ccall safe "hs_bindgen_bf6e3b719a8a289b"
+  hs_bindgen_bf6e3b719a8a289b_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_DetachThread@
+hs_bindgen_bf6e3b719a8a289b
+  :: BG.Ptr SDL_Thread
+  -> IO ()
+hs_bindgen_bf6e3b719a8a289b =
+  BG.fromFFIType hs_bindgen_bf6e3b719a8a289b_base
+
+-- | Let a thread clean up on exit without intervention.
+--
+--     A thread may be \"detached\" to signify that it should not remain until another thread has called @SDL_WaitThread()@ on it. Detaching a thread is useful for long-running threads that nothing needs to synchronize with or further manage. When a detached thread is done, it simply goes away.
+--
+--     There is no way to recover the return code of a detached thread. If you need this, don\'t detach the thread and instead use @SDL_WaitThread()@.
+--
+--     Once a thread is detached, you should usually assume the 'SDL_Thread' isn\'t safe to reference again, as it will become invalid immediately upon the detached thread\'s exit, instead of remaining until someone has called @SDL_WaitThread()@ to finally clean it up. As such, don\'t detach the same thread more than once.
+--
+--     If a thread has already exited when passed to @SDL_DetachThread()@, it will stop waiting for a call to @SDL_WaitThread()@ and clean up immediately. It is not safe to detach a thread that might be used with @SDL_WaitThread()@.
+--
+--     You may not call @SDL_WaitThread()@ on a thread that has been detached. Use either that function or this one, but not both, or behavior is undefined.
+--
+--     It is safe to pass NULL to this function; it is a no-op.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'sDL_WaitThread'
+--
+--     [C declaration]: @SDL_DetachThread@, defined at @SDL3\/SDL_thread.h 525:34@
+sDL_DetachThread
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the 'SDL_Thread' pointer that was returned from the @SDL_CreateThread()@ call that started this thread.
+  -> IO ()
+sDL_DetachThread = hs_bindgen_bf6e3b719a8a289b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_GetTLS@
+foreign import ccall safe "hs_bindgen_a7ebc89f9b77863c"
+  hs_bindgen_a7ebc89f9b77863c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_GetTLS@
+hs_bindgen_a7ebc89f9b77863c
+  :: BG.Ptr SDL_TLSID
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_a7ebc89f9b77863c =
+  BG.fromFFIType hs_bindgen_a7ebc89f9b77863c_base
+
+-- | Get the current thread\'s value associated with a thread local storage ID.
+--
+--     [Returns]: the value associated with the ID for the current thread or NULL if no value has been set; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTLS'
+--
+--     [C declaration]: @SDL_GetTLS@, defined at @SDL3\/SDL_thread.h 540:36@
+sDL_GetTLS
+  :: BG.Ptr SDL_TLSID
+  -- ^
+  --
+  --           [@id@]: a pointer to the thread local storage ID, may not be NULL.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetTLS = hs_bindgen_a7ebc89f9b77863c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_SetTLS@
+foreign import ccall safe "hs_bindgen_09d0ca8da839649c"
+  hs_bindgen_09d0ca8da839649c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_SetTLS@
+hs_bindgen_09d0ca8da839649c
+  :: BG.Ptr SDL_TLSID
+  -> PtrConst.PtrConst BG.Void
+  -> SDL_TLSDestructorCallback
+  -> IO BG.CBool
+hs_bindgen_09d0ca8da839649c =
+  BG.fromFFIType hs_bindgen_09d0ca8da839649c_base
+
+-- | Set the current thread\'s value associated with a thread local storage ID.
+--
+--     If the thread local storage ID is not initialized (the value is 0), a new ID will be created in a thread-safe way, so all calls using a pointer to the same ID will refer to the same local storage.
+--
+--     Note that replacing a value from a previous call to this function on the same thread does /not/ call the previous value\'s destructor!
+--
+--     @destructor@ can be NULL; it is assumed that @value@ does not need to be cleaned up if so.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTLS'
+--
+--     [C declaration]: @SDL_SetTLS@, defined at @SDL3\/SDL_thread.h 581:34@
+sDL_SetTLS
+  :: BG.Ptr SDL_TLSID
+  -- ^
+  --
+  --           [@id@]: a pointer to the thread local storage ID, may not be NULL.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@value@]: the value to associate with the ID for the current thread.
+  -> SDL_TLSDestructorCallback
+  -- ^
+  --
+  --           [@destructor@]: a function called when the thread exits, to free the value, may be NULL.
+  -> IO BG.CBool
+sDL_SetTLS = hs_bindgen_09d0ca8da839649c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_CleanupTLS@
+foreign import ccall safe "hs_bindgen_ff0e7a5728335d6e"
+  hs_bindgen_ff0e7a5728335d6e_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Safe_SDL_CleanupTLS@
+hs_bindgen_ff0e7a5728335d6e :: IO ()
+hs_bindgen_ff0e7a5728335d6e =
+  BG.fromFFIType hs_bindgen_ff0e7a5728335d6e_base
+
+-- | Cleanup all TLS data for this thread.
+--
+--     If you are creating your threads outside of SDL and then calling SDL functions, you should call this function before your thread exits, to properly clean up SDL memory.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CleanupTLS@, defined at @SDL3\/SDL_thread.h 594:34@
+sDL_CleanupTLS :: IO ()
+sDL_CleanupTLS = hs_bindgen_ff0e7a5728335d6e
diff --git a/src/SDL3/Sys/Bindgen/Thread/Unsafe.hs b/src/SDL3/Sys/Bindgen/Thread/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Thread/Unsafe.hs
@@ -0,0 +1,558 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Thread.Unsafe (
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_CreateThreadRuntime,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_CreateThreadWithPropertiesRuntime,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_GetThreadName,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_GetCurrentThreadID,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_GetThreadID,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_SetCurrentThreadPriority,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_WaitThread,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_GetThreadState,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_DetachThread,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_GetTLS,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_SetTLS,
+  SDL3.Sys.Bindgen.Thread.Unsafe.sDL_CleanupTLS,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Thread
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_thread.h>"
+         , "SDL_Thread *hs_bindgen_0b01e232776d1771 ("
+         , "  SDL_ThreadFunction arg1,"
+         , "  char const *arg2,"
+         , "  void *arg3,"
+         , "  SDL_FunctionPointer arg4,"
+         , "  SDL_FunctionPointer arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateThreadRuntime)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "SDL_Thread *hs_bindgen_1c8412acc4b761ed ("
+         , "  SDL_PropertiesID arg1,"
+         , "  SDL_FunctionPointer arg2,"
+         , "  SDL_FunctionPointer arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateThreadWithPropertiesRuntime)(arg1, arg2, arg3);"
+         , "}"
+         , "char const *hs_bindgen_98e2f1286c996b7c ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetThreadName)(arg1);"
+         , "}"
+         , "SDL_ThreadID hs_bindgen_cdc0bfea9267653a (void)"
+         , "{"
+         , "  return (SDL_GetCurrentThreadID)();"
+         , "}"
+         , "SDL_ThreadID hs_bindgen_0bcf1cae64c8f7f6 ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetThreadID)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_3d388217e2964b35 ("
+         , "  SDL_ThreadPriority arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SetCurrentThreadPriority)(arg1);"
+         , "}"
+         , "void hs_bindgen_fe4fa21954b69cf9 ("
+         , "  SDL_Thread *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_WaitThread)(arg1, arg2);"
+         , "}"
+         , "SDL_ThreadState hs_bindgen_44514a39d4434fbe ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetThreadState)(arg1);"
+         , "}"
+         , "void hs_bindgen_4de0f0719eae79d5 ("
+         , "  SDL_Thread *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DetachThread)(arg1);"
+         , "}"
+         , "void *hs_bindgen_43b0e02438c01176 ("
+         , "  SDL_TLSID *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTLS)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ff93284cbd8231ff ("
+         , "  SDL_TLSID *arg1,"
+         , "  void const *arg2,"
+         , "  SDL_TLSDestructorCallback arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetTLS)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_b394a7e70a8b089a (void)"
+         , "{"
+         , "  (SDL_CleanupTLS)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_CreateThreadRuntime@
+foreign import ccall unsafe "hs_bindgen_0b01e232776d1771"
+  hs_bindgen_0b01e232776d1771_base
+    :: BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_CreateThreadRuntime@
+hs_bindgen_0b01e232776d1771
+  :: SDL_ThreadFunction
+  -> PtrConst.PtrConst BG.CChar
+  -> BG.Ptr BG.Void
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -> IO (BG.Ptr SDL_Thread)
+hs_bindgen_0b01e232776d1771 =
+  BG.fromFFIType hs_bindgen_0b01e232776d1771_base
+
+-- | The actual entry point for SDL_CreateThread.
+--
+--     [Returns]: an opaque pointer to the new thread object on success, NULL if the new thread could not be created; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CreateThreadRuntime@, defined at @SDL3\/SDL_thread.h 340:42@
+sDL_CreateThreadRuntime
+  :: SDL_ThreadFunction
+  -- ^
+  --
+  --           [@fn@]: the 'SDL_ThreadFunction' function to call in the new thread
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the thread
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@data@]: a pointer that is passed to @fn@
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnBeginThread@]: the C runtime\'s _beginthreadex (or whatnot). Can be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnEndThread@]: the C runtime\'s _endthreadex (or whatnot). Can be NULL.
+  -> IO (BG.Ptr SDL_Thread)
+sDL_CreateThreadRuntime = hs_bindgen_0b01e232776d1771
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_CreateThreadWithPropertiesRuntime@
+foreign import ccall unsafe "hs_bindgen_1c8412acc4b761ed"
+  hs_bindgen_1c8412acc4b761ed_base
+    :: BG.Word32
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_CreateThreadWithPropertiesRuntime@
+hs_bindgen_1c8412acc4b761ed
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -> IO (BG.Ptr SDL_Thread)
+hs_bindgen_1c8412acc4b761ed =
+  BG.fromFFIType hs_bindgen_1c8412acc4b761ed_base
+
+-- | The actual entry point for SDL_CreateThreadWithProperties.
+--
+--     [Returns]: an opaque pointer to the new thread object on success, NULL if the new thread could not be created; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CreateThreadWithPropertiesRuntime@, defined at @SDL3\/SDL_thread.h 356:42@
+sDL_CreateThreadWithPropertiesRuntime
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnBeginThread@]: the C runtime\'s _beginthreadex (or whatnot). Can be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnEndThread@]: the C runtime\'s _endthreadex (or whatnot). Can be NULL.
+  -> IO (BG.Ptr SDL_Thread)
+sDL_CreateThreadWithPropertiesRuntime =
+  hs_bindgen_1c8412acc4b761ed
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_GetThreadName@
+foreign import ccall unsafe "hs_bindgen_98e2f1286c996b7c"
+  hs_bindgen_98e2f1286c996b7c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_GetThreadName@
+hs_bindgen_98e2f1286c996b7c
+  :: BG.Ptr SDL_Thread
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_98e2f1286c996b7c =
+  BG.fromFFIType hs_bindgen_98e2f1286c996b7c_base
+
+-- | Get the thread name as it was specified in @SDL_CreateThread()@.
+--
+--     [Returns]: a pointer to a UTF-8 string that names the specified thread, or NULL if it doesn\'t have a name.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetThreadName@, defined at @SDL3\/SDL_thread.h 378:42@
+sDL_GetThreadName
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetThreadName = hs_bindgen_98e2f1286c996b7c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_GetCurrentThreadID@
+foreign import ccall unsafe "hs_bindgen_cdc0bfea9267653a"
+  hs_bindgen_cdc0bfea9267653a_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_GetCurrentThreadID@
+hs_bindgen_cdc0bfea9267653a :: IO SDL_ThreadID
+hs_bindgen_cdc0bfea9267653a =
+  BG.fromFFIType hs_bindgen_cdc0bfea9267653a_base
+
+-- | Get the thread identifier for the current thread.
+--
+--     This thread identifier is as reported by the underlying operating system. If SDL is running on a platform that does not support threads the return value will always be zero.
+--
+--     This function also returns a valid thread ID when called from the main thread.
+--
+--     [Returns]: the ID of the current thread.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetThreadID'
+--
+--     [C declaration]: @SDL_GetCurrentThreadID@, defined at @SDL3\/SDL_thread.h 398:42@
+sDL_GetCurrentThreadID :: IO SDL_ThreadID
+sDL_GetCurrentThreadID = hs_bindgen_cdc0bfea9267653a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_GetThreadID@
+foreign import ccall unsafe "hs_bindgen_0bcf1cae64c8f7f6"
+  hs_bindgen_0bcf1cae64c8f7f6_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_GetThreadID@
+hs_bindgen_0bcf1cae64c8f7f6
+  :: BG.Ptr SDL_Thread
+  -> IO SDL_ThreadID
+hs_bindgen_0bcf1cae64c8f7f6 =
+  BG.fromFFIType hs_bindgen_0bcf1cae64c8f7f6_base
+
+-- | Get the thread identifier for the specified thread.
+--
+--     This thread identifier is as reported by the underlying operating system. If SDL is running on a platform that does not support threads the return value will always be zero.
+--
+--     [Returns]: the ID of the specified thread, or the ID of the current thread if @thread@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCurrentThreadID'
+--
+--     [C declaration]: @SDL_GetThreadID@, defined at @SDL3\/SDL_thread.h 417:42@
+sDL_GetThreadID
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO SDL_ThreadID
+sDL_GetThreadID = hs_bindgen_0bcf1cae64c8f7f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_SetCurrentThreadPriority@
+foreign import ccall unsafe "hs_bindgen_3d388217e2964b35"
+  hs_bindgen_3d388217e2964b35_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_SetCurrentThreadPriority@
+hs_bindgen_3d388217e2964b35
+  :: SDL_ThreadPriority
+  -> IO BG.CBool
+hs_bindgen_3d388217e2964b35 =
+  BG.fromFFIType hs_bindgen_3d388217e2964b35_base
+
+-- | Set the priority for the current thread.
+--
+--     Note that some platforms will not let you alter the priority (or at least, promote the thread to a higher priority) at all, and some require you to be an administrator account. Be prepared for this to fail.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetCurrentThreadPriority@, defined at @SDL3\/SDL_thread.h 434:34@
+sDL_SetCurrentThreadPriority
+  :: SDL_ThreadPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_ThreadPriority' to set.
+  -> IO BG.CBool
+sDL_SetCurrentThreadPriority =
+  hs_bindgen_3d388217e2964b35
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_WaitThread@
+foreign import ccall unsafe "hs_bindgen_fe4fa21954b69cf9"
+  hs_bindgen_fe4fa21954b69cf9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_WaitThread@
+hs_bindgen_fe4fa21954b69cf9
+  :: BG.Ptr SDL_Thread
+  -> BG.Ptr BG.CInt
+  -> IO ()
+hs_bindgen_fe4fa21954b69cf9 =
+  BG.fromFFIType hs_bindgen_fe4fa21954b69cf9_base
+
+-- | Wait for a thread to finish.
+--
+--     Threads that haven\'t been detached will remain until this function cleans them up. Not doing so is a resource leak.
+--
+--     Once a thread has been cleaned up through this function, the 'SDL_Thread' that references it becomes invalid and should not be referenced again. As such, only one thread may call @SDL_WaitThread()@ on another.
+--
+--     The return code from the thread function is placed in the area pointed to by @status@, if @status@ is not NULL.
+--
+--     You may not wait on a thread that has been used in a call to @SDL_DetachThread()@. Use either that function or this one, but not both, or behavior is undefined.
+--
+--     It is safe to pass a NULL thread to this function; it is a no-op.
+--
+--     Note that the thread pointer is freed by this function and is not valid afterward.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but only a single thread can wait any specific thread to finish.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'sDL_DetachThread'
+--
+--     [C declaration]: @SDL_WaitThread@, defined at @SDL3\/SDL_thread.h 472:34@
+sDL_WaitThread
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the 'SDL_Thread' pointer that was returned from the @SDL_CreateThread()@ call that started this thread.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@status@]: a pointer filled in with the value returned from the thread function by its \'return\', or -1 if the thread has been detached or isn\'t valid, may be NULL.
+  -> IO ()
+sDL_WaitThread = hs_bindgen_fe4fa21954b69cf9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_GetThreadState@
+foreign import ccall unsafe "hs_bindgen_44514a39d4434fbe"
+  hs_bindgen_44514a39d4434fbe_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_GetThreadState@
+hs_bindgen_44514a39d4434fbe
+  :: BG.Ptr SDL_Thread
+  -> IO SDL_ThreadState
+hs_bindgen_44514a39d4434fbe =
+  BG.fromFFIType hs_bindgen_44514a39d4434fbe_base
+
+-- | Get the current state of a thread.
+--
+--     [Returns]: the current state of a thread, or SDL_THREAD_UNKNOWN if the thread isn\'t valid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_ThreadState'
+--
+--     [C declaration]: @SDL_GetThreadState@, defined at @SDL3\/SDL_thread.h 487:45@
+sDL_GetThreadState
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO SDL_ThreadState
+sDL_GetThreadState = hs_bindgen_44514a39d4434fbe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_DetachThread@
+foreign import ccall unsafe "hs_bindgen_4de0f0719eae79d5"
+  hs_bindgen_4de0f0719eae79d5_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_DetachThread@
+hs_bindgen_4de0f0719eae79d5
+  :: BG.Ptr SDL_Thread
+  -> IO ()
+hs_bindgen_4de0f0719eae79d5 =
+  BG.fromFFIType hs_bindgen_4de0f0719eae79d5_base
+
+-- | Let a thread clean up on exit without intervention.
+--
+--     A thread may be \"detached\" to signify that it should not remain until another thread has called @SDL_WaitThread()@ on it. Detaching a thread is useful for long-running threads that nothing needs to synchronize with or further manage. When a detached thread is done, it simply goes away.
+--
+--     There is no way to recover the return code of a detached thread. If you need this, don\'t detach the thread and instead use @SDL_WaitThread()@.
+--
+--     Once a thread is detached, you should usually assume the 'SDL_Thread' isn\'t safe to reference again, as it will become invalid immediately upon the detached thread\'s exit, instead of remaining until someone has called @SDL_WaitThread()@ to finally clean it up. As such, don\'t detach the same thread more than once.
+--
+--     If a thread has already exited when passed to @SDL_DetachThread()@, it will stop waiting for a call to @SDL_WaitThread()@ and clean up immediately. It is not safe to detach a thread that might be used with @SDL_WaitThread()@.
+--
+--     You may not call @SDL_WaitThread()@ on a thread that has been detached. Use either that function or this one, but not both, or behavior is undefined.
+--
+--     It is safe to pass NULL to this function; it is a no-op.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'sDL_WaitThread'
+--
+--     [C declaration]: @SDL_DetachThread@, defined at @SDL3\/SDL_thread.h 525:34@
+sDL_DetachThread
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the 'SDL_Thread' pointer that was returned from the @SDL_CreateThread()@ call that started this thread.
+  -> IO ()
+sDL_DetachThread = hs_bindgen_4de0f0719eae79d5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_GetTLS@
+foreign import ccall unsafe "hs_bindgen_43b0e02438c01176"
+  hs_bindgen_43b0e02438c01176_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_GetTLS@
+hs_bindgen_43b0e02438c01176
+  :: BG.Ptr SDL_TLSID
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_43b0e02438c01176 =
+  BG.fromFFIType hs_bindgen_43b0e02438c01176_base
+
+-- | Get the current thread\'s value associated with a thread local storage ID.
+--
+--     [Returns]: the value associated with the ID for the current thread or NULL if no value has been set; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTLS'
+--
+--     [C declaration]: @SDL_GetTLS@, defined at @SDL3\/SDL_thread.h 540:36@
+sDL_GetTLS
+  :: BG.Ptr SDL_TLSID
+  -- ^
+  --
+  --           [@id@]: a pointer to the thread local storage ID, may not be NULL.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetTLS = hs_bindgen_43b0e02438c01176
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_SetTLS@
+foreign import ccall unsafe "hs_bindgen_ff93284cbd8231ff"
+  hs_bindgen_ff93284cbd8231ff_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_SetTLS@
+hs_bindgen_ff93284cbd8231ff
+  :: BG.Ptr SDL_TLSID
+  -> PtrConst.PtrConst BG.Void
+  -> SDL_TLSDestructorCallback
+  -> IO BG.CBool
+hs_bindgen_ff93284cbd8231ff =
+  BG.fromFFIType hs_bindgen_ff93284cbd8231ff_base
+
+-- | Set the current thread\'s value associated with a thread local storage ID.
+--
+--     If the thread local storage ID is not initialized (the value is 0), a new ID will be created in a thread-safe way, so all calls using a pointer to the same ID will refer to the same local storage.
+--
+--     Note that replacing a value from a previous call to this function on the same thread does /not/ call the previous value\'s destructor!
+--
+--     @destructor@ can be NULL; it is assumed that @value@ does not need to be cleaned up if so.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTLS'
+--
+--     [C declaration]: @SDL_SetTLS@, defined at @SDL3\/SDL_thread.h 581:34@
+sDL_SetTLS
+  :: BG.Ptr SDL_TLSID
+  -- ^
+  --
+  --           [@id@]: a pointer to the thread local storage ID, may not be NULL.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@value@]: the value to associate with the ID for the current thread.
+  -> SDL_TLSDestructorCallback
+  -- ^
+  --
+  --           [@destructor@]: a function called when the thread exits, to free the value, may be NULL.
+  -> IO BG.CBool
+sDL_SetTLS = hs_bindgen_ff93284cbd8231ff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_CleanupTLS@
+foreign import ccall unsafe "hs_bindgen_b394a7e70a8b089a"
+  hs_bindgen_b394a7e70a8b089a_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Thread_Unsafe_SDL_CleanupTLS@
+hs_bindgen_b394a7e70a8b089a :: IO ()
+hs_bindgen_b394a7e70a8b089a =
+  BG.fromFFIType hs_bindgen_b394a7e70a8b089a_base
+
+-- | Cleanup all TLS data for this thread.
+--
+--     If you are creating your threads outside of SDL and then calling SDL functions, you should call this function before your thread exits, to properly clean up SDL memory.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_CleanupTLS@, defined at @SDL3\/SDL_thread.h 594:34@
+sDL_CleanupTLS :: IO ()
+sDL_CleanupTLS = hs_bindgen_b394a7e70a8b089a
diff --git a/src/SDL3/Sys/Bindgen/Time.hs b/src/SDL3/Sys/Bindgen/Time.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Time.hs
@@ -0,0 +1,644 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL realtime clock and date\/time routines.
+--
+--     There are two data types that are used in this category: SDL_Time, which represents the nanoseconds since a specific moment (an \"epoch\"), and 'SDL_DateTime', which breaks time down into human-understandable components: years, months, days, hours, etc.
+--
+--     Much of the functionality is involved in converting those two types to other useful forms. A structure holding a calendar date and time broken down into its components.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Time (
+  SDL3.Sys.Bindgen.Time.SDL_DateTime (..),
+  SDL3.Sys.Bindgen.Time.SDL_DateFormat (..),
+  pattern SDL3.Sys.Bindgen.Time.SDL_DATE_FORMAT_YYYYMMDD,
+  pattern SDL3.Sys.Bindgen.Time.SDL_DATE_FORMAT_DDMMYYYY,
+  pattern SDL3.Sys.Bindgen.Time.SDL_DATE_FORMAT_MMDDYYYY,
+  SDL3.Sys.Bindgen.Time.SDL_TimeFormat (..),
+  pattern SDL3.Sys.Bindgen.Time.SDL_TIME_FORMAT_24HR,
+  pattern SDL3.Sys.Bindgen.Time.SDL_TIME_FORMAT_12HR,
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @struct SDL_DateTime@, defined at @SDL3\/SDL_time.h 54:16@
+data SDL_DateTime = SDL_DateTime
+  { year :: BG.CInt
+  -- ^ Year
+  --
+  --          [C declaration]: @year@, defined at @SDL3\/SDL_time.h 56:9@
+  , month :: BG.CInt
+  -- ^ Month [01-12]
+  --
+  --          [C declaration]: @month@, defined at @SDL3\/SDL_time.h 57:9@
+  , day :: BG.CInt
+  -- ^ Day of the month [01-31]
+  --
+  --          [C declaration]: @day@, defined at @SDL3\/SDL_time.h 58:9@
+  , hour :: BG.CInt
+  -- ^ Hour [0-23]
+  --
+  --          [C declaration]: @hour@, defined at @SDL3\/SDL_time.h 59:9@
+  , minute :: BG.CInt
+  -- ^ Minute [0-59]
+  --
+  --          [C declaration]: @minute@, defined at @SDL3\/SDL_time.h 60:9@
+  , second :: BG.CInt
+  -- ^ Seconds [0-60]
+  --
+  --          [C declaration]: @second@, defined at @SDL3\/SDL_time.h 61:9@
+  , nanosecond :: BG.CInt
+  -- ^ Nanoseconds [0-999999999]
+  --
+  --          [C declaration]: @nanosecond@, defined at @SDL3\/SDL_time.h 62:9@
+  , day_of_week :: BG.CInt
+  -- ^ Day of the week [0-6] (0 being Sunday)
+  --
+  --          [C declaration]: @day_of_week@, defined at @SDL3\/SDL_time.h 63:9@
+  , utc_offset :: BG.CInt
+  -- ^ Seconds east of UTC
+  --
+  --          [C declaration]: @utc_offset@, defined at @SDL3\/SDL_time.h 64:9@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_DateTime where
+  staticSizeOf = \_ -> (36 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_DateTime where
+  readRaw =
+    \ptr0 ->
+      pure SDL_DateTime
+        <*> HasCField.readRaw (BG.Proxy @"year") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"month") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"day") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"hour") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"minute") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"second") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"nanosecond") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"day_of_week") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"utc_offset") ptr0
+
+instance Marshal.WriteRaw SDL_DateTime where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_DateTime
+            year2
+            month3
+            day4
+            hour5
+            minute6
+            second7
+            nanosecond8
+            day_of_week9
+            utc_offset10 ->
+              HasCField.writeRaw (BG.Proxy @"year") ptr0 year2
+                >> HasCField.writeRaw (BG.Proxy @"month") ptr0 month3
+                >> HasCField.writeRaw (BG.Proxy @"day") ptr0 day4
+                >> HasCField.writeRaw (BG.Proxy @"hour") ptr0 hour5
+                >> HasCField.writeRaw (BG.Proxy @"minute") ptr0 minute6
+                >> HasCField.writeRaw (BG.Proxy @"second") ptr0 second7
+                >> HasCField.writeRaw (BG.Proxy @"nanosecond") ptr0 nanosecond8
+                >> HasCField.writeRaw (BG.Proxy @"day_of_week") ptr0 day_of_week9
+                >> HasCField.writeRaw (BG.Proxy @"utc_offset") ptr0 utc_offset10
+
+deriving via Marshal.EquivStorable SDL_DateTime instance BG.Storable SDL_DateTime
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "year" SDL_DateTime ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DateTime
+            { year = y1
+            , month = BG.getField @"month" x0
+            , day = BG.getField @"day" x0
+            , hour = BG.getField @"hour" x0
+            , minute = BG.getField @"minute" x0
+            , second = BG.getField @"second" x0
+            , nanosecond = BG.getField @"nanosecond" x0
+            , day_of_week = BG.getField @"day_of_week" x0
+            , utc_offset = BG.getField @"utc_offset" x0
+            }
+      , BG.getField @"year" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "year" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"year")
+
+instance HasCField.HasCField SDL_DateTime "year" where
+  type CFieldType SDL_DateTime "year" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "month" SDL_DateTime ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DateTime
+            { month = y1
+            , year = BG.getField @"year" x0
+            , day = BG.getField @"day" x0
+            , hour = BG.getField @"hour" x0
+            , minute = BG.getField @"minute" x0
+            , second = BG.getField @"second" x0
+            , nanosecond = BG.getField @"nanosecond" x0
+            , day_of_week = BG.getField @"day_of_week" x0
+            , utc_offset = BG.getField @"utc_offset" x0
+            }
+      , BG.getField @"month" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "month" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"month")
+
+instance HasCField.HasCField SDL_DateTime "month" where
+  type CFieldType SDL_DateTime "month" = BG.CInt
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "day" SDL_DateTime ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DateTime
+            { day = y1
+            , year = BG.getField @"year" x0
+            , month = BG.getField @"month" x0
+            , hour = BG.getField @"hour" x0
+            , minute = BG.getField @"minute" x0
+            , second = BG.getField @"second" x0
+            , nanosecond = BG.getField @"nanosecond" x0
+            , day_of_week = BG.getField @"day_of_week" x0
+            , utc_offset = BG.getField @"utc_offset" x0
+            }
+      , BG.getField @"day" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "day" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"day")
+
+instance HasCField.HasCField SDL_DateTime "day" where
+  type CFieldType SDL_DateTime "day" = BG.CInt
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "hour" SDL_DateTime ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DateTime
+            { hour = y1
+            , year = BG.getField @"year" x0
+            , month = BG.getField @"month" x0
+            , day = BG.getField @"day" x0
+            , minute = BG.getField @"minute" x0
+            , second = BG.getField @"second" x0
+            , nanosecond = BG.getField @"nanosecond" x0
+            , day_of_week = BG.getField @"day_of_week" x0
+            , utc_offset = BG.getField @"utc_offset" x0
+            }
+      , BG.getField @"hour" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "hour" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"hour")
+
+instance HasCField.HasCField SDL_DateTime "hour" where
+  type CFieldType SDL_DateTime "hour" = BG.CInt
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "minute" SDL_DateTime ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DateTime
+            { minute = y1
+            , year = BG.getField @"year" x0
+            , month = BG.getField @"month" x0
+            , day = BG.getField @"day" x0
+            , hour = BG.getField @"hour" x0
+            , second = BG.getField @"second" x0
+            , nanosecond = BG.getField @"nanosecond" x0
+            , day_of_week = BG.getField @"day_of_week" x0
+            , utc_offset = BG.getField @"utc_offset" x0
+            }
+      , BG.getField @"minute" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "minute" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"minute")
+
+instance HasCField.HasCField SDL_DateTime "minute" where
+  type CFieldType SDL_DateTime "minute" = BG.CInt
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "second" SDL_DateTime ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DateTime
+            { second = y1
+            , year = BG.getField @"year" x0
+            , month = BG.getField @"month" x0
+            , day = BG.getField @"day" x0
+            , hour = BG.getField @"hour" x0
+            , minute = BG.getField @"minute" x0
+            , nanosecond = BG.getField @"nanosecond" x0
+            , day_of_week = BG.getField @"day_of_week" x0
+            , utc_offset = BG.getField @"utc_offset" x0
+            }
+      , BG.getField @"second" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "second" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"second")
+
+instance HasCField.HasCField SDL_DateTime "second" where
+  type CFieldType SDL_DateTime "second" = BG.CInt
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "nanosecond" SDL_DateTime ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DateTime
+            { nanosecond = y1
+            , year = BG.getField @"year" x0
+            , month = BG.getField @"month" x0
+            , day = BG.getField @"day" x0
+            , hour = BG.getField @"hour" x0
+            , minute = BG.getField @"minute" x0
+            , second = BG.getField @"second" x0
+            , day_of_week = BG.getField @"day_of_week" x0
+            , utc_offset = BG.getField @"utc_offset" x0
+            }
+      , BG.getField @"nanosecond" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "nanosecond" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"nanosecond")
+
+instance HasCField.HasCField SDL_DateTime "nanosecond" where
+  type CFieldType SDL_DateTime "nanosecond" = BG.CInt
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "day_of_week" SDL_DateTime ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DateTime
+            { day_of_week = y1
+            , year = BG.getField @"year" x0
+            , month = BG.getField @"month" x0
+            , day = BG.getField @"day" x0
+            , hour = BG.getField @"hour" x0
+            , minute = BG.getField @"minute" x0
+            , second = BG.getField @"second" x0
+            , nanosecond = BG.getField @"nanosecond" x0
+            , utc_offset = BG.getField @"utc_offset" x0
+            }
+      , BG.getField @"day_of_week" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "day_of_week" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"day_of_week")
+
+instance HasCField.HasCField SDL_DateTime "day_of_week" where
+  type CFieldType SDL_DateTime "day_of_week" = BG.CInt
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "utc_offset" SDL_DateTime ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DateTime
+            { utc_offset = y1
+            , year = BG.getField @"year" x0
+            , month = BG.getField @"month" x0
+            , day = BG.getField @"day" x0
+            , hour = BG.getField @"hour" x0
+            , minute = BG.getField @"minute" x0
+            , second = BG.getField @"second" x0
+            , nanosecond = BG.getField @"nanosecond" x0
+            , day_of_week = BG.getField @"day_of_week" x0
+            }
+      , BG.getField @"utc_offset" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "utc_offset" (BG.Ptr SDL_DateTime) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"utc_offset")
+
+instance HasCField.HasCField SDL_DateTime "utc_offset" where
+  type CFieldType SDL_DateTime "utc_offset" = BG.CInt
+
+  offset# = \_ -> \_ -> 32
+
+-- | The preferred date format of the current system locale.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDateTimeLocalePreferences'
+--
+--     [C declaration]: @enum SDL_DateFormat@, defined at @SDL3\/SDL_time.h 74:14@
+newtype SDL_DateFormat = SDL_DateFormat
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_DateFormat where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_DateFormat where
+  readRaw =
+    \ptr0 ->
+      pure SDL_DateFormat
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_DateFormat where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_DateFormat unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_DateFormat instance BG.Storable SDL_DateFormat
+
+deriving via BG.CUInt instance BG.Prim SDL_DateFormat
+
+instance CEnum.CEnum SDL_DateFormat where
+  type CEnumZ SDL_DateFormat = BG.CUInt
+
+  toCEnum = SDL_DateFormat
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_DATE_FORMAT_YYYYMMDD")
+        , (1, BG.singleton "SDL_DATE_FORMAT_DDMMYYYY")
+        , (2, BG.singleton "SDL_DATE_FORMAT_MMDDYYYY")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_DateFormat"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_DateFormat"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_DateFormat where
+  minDeclaredValue = SDL_DATE_FORMAT_YYYYMMDD
+
+  maxDeclaredValue = SDL_DATE_FORMAT_MMDDYYYY
+
+instance Show SDL_DateFormat where
+  showsPrec = CEnum.shows
+
+instance Read SDL_DateFormat where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_DateFormat ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DateFormat{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_DateFormat) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_DateFormat "unwrap" where
+  type CFieldType SDL_DateFormat "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Year\/Month\/Day
+--
+--     [C declaration]: @SDL_DATE_FORMAT_YYYYMMDD@, defined at @SDL3\/SDL_time.h 76:5@
+pattern SDL_DATE_FORMAT_YYYYMMDD :: SDL_DateFormat
+pattern SDL_DATE_FORMAT_YYYYMMDD = SDL_DateFormat 0
+
+-- | Day\/Month\/Year
+--
+--     [C declaration]: @SDL_DATE_FORMAT_DDMMYYYY@, defined at @SDL3\/SDL_time.h 77:5@
+pattern SDL_DATE_FORMAT_DDMMYYYY :: SDL_DateFormat
+pattern SDL_DATE_FORMAT_DDMMYYYY = SDL_DateFormat 1
+
+-- | Month\/Day\/Year
+--
+--     [C declaration]: @SDL_DATE_FORMAT_MMDDYYYY@, defined at @SDL3\/SDL_time.h 78:5@
+pattern SDL_DATE_FORMAT_MMDDYYYY :: SDL_DateFormat
+pattern SDL_DATE_FORMAT_MMDDYYYY = SDL_DateFormat 2
+
+-- | The preferred time format of the current system locale.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDateTimeLocalePreferences'
+--
+--     [C declaration]: @enum SDL_TimeFormat@, defined at @SDL3\/SDL_time.h 88:14@
+newtype SDL_TimeFormat = SDL_TimeFormat
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_TimeFormat where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_TimeFormat where
+  readRaw =
+    \ptr0 ->
+      pure SDL_TimeFormat
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_TimeFormat where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_TimeFormat unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_TimeFormat instance BG.Storable SDL_TimeFormat
+
+deriving via BG.CUInt instance BG.Prim SDL_TimeFormat
+
+instance CEnum.CEnum SDL_TimeFormat where
+  type CEnumZ SDL_TimeFormat = BG.CUInt
+
+  toCEnum = SDL_TimeFormat
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_TIME_FORMAT_24HR")
+        , (1, BG.singleton "SDL_TIME_FORMAT_12HR")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_TimeFormat"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_TimeFormat"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_TimeFormat where
+  minDeclaredValue = SDL_TIME_FORMAT_24HR
+
+  maxDeclaredValue = SDL_TIME_FORMAT_12HR
+
+instance Show SDL_TimeFormat where
+  showsPrec = CEnum.shows
+
+instance Read SDL_TimeFormat where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_TimeFormat ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TimeFormat{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TimeFormat) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TimeFormat "unwrap" where
+  type CFieldType SDL_TimeFormat "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | 24 hour time
+--
+--     [C declaration]: @SDL_TIME_FORMAT_24HR@, defined at @SDL3\/SDL_time.h 90:5@
+pattern SDL_TIME_FORMAT_24HR :: SDL_TimeFormat
+pattern SDL_TIME_FORMAT_24HR = SDL_TimeFormat 0
+
+-- | 12 hour time
+--
+--     [C declaration]: @SDL_TIME_FORMAT_12HR@, defined at @SDL3\/SDL_time.h 91:5@
+pattern SDL_TIME_FORMAT_12HR :: SDL_TimeFormat
+pattern SDL_TIME_FORMAT_12HR = SDL_TimeFormat 1
diff --git a/src/SDL3/Sys/Bindgen/Time/FunPtr.hs b/src/SDL3/Sys/Bindgen/Time/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Time/FunPtr.hs
@@ -0,0 +1,420 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Time.FunPtr (
+  SDL3.Sys.Bindgen.Time.FunPtr.sDL_GetDateTimeLocalePreferences,
+  SDL3.Sys.Bindgen.Time.FunPtr.sDL_GetCurrentTime,
+  SDL3.Sys.Bindgen.Time.FunPtr.sDL_TimeToDateTime,
+  SDL3.Sys.Bindgen.Time.FunPtr.sDL_DateTimeToTime,
+  SDL3.Sys.Bindgen.Time.FunPtr.sDL_TimeToWindows,
+  SDL3.Sys.Bindgen.Time.FunPtr.sDL_TimeFromWindows,
+  SDL3.Sys.Bindgen.Time.FunPtr.sDL_GetDaysInMonth,
+  SDL3.Sys.Bindgen.Time.FunPtr.sDL_GetDayOfYear,
+  SDL3.Sys.Bindgen.Time.FunPtr.sDL_GetDayOfWeek,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Time
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_time.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDateTimeLocalePreferences */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_652b921a3c9bf987 (void)) ("
+         , "  SDL_DateFormat *arg1,"
+         , "  SDL_TimeFormat *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDateTimeLocalePreferences;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetCurrentTime */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2e0928febd227948 (void)) ("
+         , "  SDL_Time *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCurrentTime;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_TimeToDateTime */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ccc14802da98ebc1 (void)) ("
+         , "  SDL_Time arg1,"
+         , "  SDL_DateTime *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_TimeToDateTime;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_DateTimeToTime */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6a3b281635772606 (void)) ("
+         , "  SDL_DateTime const *arg1,"
+         , "  SDL_Time *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_DateTimeToTime;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_TimeToWindows */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_06ec16aebabe56e2 (void)) ("
+         , "  SDL_Time arg1,"
+         , "  Uint32 *arg2,"
+         , "  Uint32 *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_TimeToWindows;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_TimeFromWindows */"
+         , "__attribute__ ((const))"
+         , "SDL_Time (*hs_bindgen_c98ae78917a45694 (void)) ("
+         , "  Uint32 arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_TimeFromWindows;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDaysInMonth */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_53993d062e70ae21 (void)) ("
+         , "  signed int arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDaysInMonth;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDayOfYear */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_040f71197ea113df (void)) ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDayOfYear;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDayOfWeek */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_6d1532a314d875ae (void)) ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDayOfWeek;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDateTimeLocalePreferences@
+foreign import ccall unsafe "hs_bindgen_652b921a3c9bf987"
+  hs_bindgen_652b921a3c9bf987_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDateTimeLocalePreferences@
+hs_bindgen_652b921a3c9bf987
+  :: IO (BG.FunPtr (BG.Ptr SDL_DateFormat -> BG.Ptr SDL_TimeFormat -> IO BG.CBool))
+hs_bindgen_652b921a3c9bf987 =
+  BG.fromFFIType hs_bindgen_652b921a3c9bf987_base
+
+{-# NOINLINE sDL_GetDateTimeLocalePreferences #-}
+
+-- | Gets the current preferred date and time format for the system locale.
+--
+--     This might be a \"slow\" call that has to query the operating system. It\'s best to ask for this once and save the results. However, the preferred formats can change, usually because the user has changed a system preference outside of your program.
+--
+--     [@dateFormat@]: a pointer to the 'SDL_DateFormat' to hold the returned date format, may be NULL.
+--
+--     [@timeFormat@]: a pointer to the 'SDL_TimeFormat' to hold the returned time format, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDateTimeLocalePreferences@, defined at @SDL3\/SDL_time.h 113:34@
+sDL_GetDateTimeLocalePreferences
+  :: BG.FunPtr (BG.Ptr SDL_DateFormat -> BG.Ptr SDL_TimeFormat -> IO BG.CBool)
+sDL_GetDateTimeLocalePreferences =
+  BG.unsafePerformIO hs_bindgen_652b921a3c9bf987
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetCurrentTime@
+foreign import ccall unsafe "hs_bindgen_2e0928febd227948"
+  hs_bindgen_2e0928febd227948_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetCurrentTime@
+hs_bindgen_2e0928febd227948
+  :: IO (BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time -> IO BG.CBool))
+hs_bindgen_2e0928febd227948 =
+  BG.fromFFIType hs_bindgen_2e0928febd227948_base
+
+{-# NOINLINE sDL_GetCurrentTime #-}
+
+-- | Gets the current value of the system realtime clock in nanoseconds since Jan 1, 1970 in Universal Coordinated Time (UTC).
+--
+--     [@ticks@]: the SDL_Time to hold the returned tick count.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentTime@, defined at @SDL3\/SDL_time.h 127:34@
+sDL_GetCurrentTime :: BG.FunPtr (BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time -> IO BG.CBool)
+sDL_GetCurrentTime =
+  BG.unsafePerformIO hs_bindgen_2e0928febd227948
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_TimeToDateTime@
+foreign import ccall unsafe "hs_bindgen_ccc14802da98ebc1"
+  hs_bindgen_ccc14802da98ebc1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_TimeToDateTime@
+hs_bindgen_ccc14802da98ebc1
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.SDL_Time -> BG.Ptr SDL_DateTime -> BG.CBool -> IO BG.CBool))
+hs_bindgen_ccc14802da98ebc1 =
+  BG.fromFFIType hs_bindgen_ccc14802da98ebc1_base
+
+{-# NOINLINE sDL_TimeToDateTime #-}
+
+-- | Converts an SDL_Time in nanoseconds since the epoch to a calendar time in the 'SDL_DateTime' format.
+--
+--     [@ticks@]: the SDL_Time to be converted.
+--
+--     [@dt@]: the resulting 'SDL_DateTime'.
+--
+--     [@localTime@]: the resulting 'SDL_DateTime' will be expressed in local time if true, otherwise it will be in Universal Coordinated Time (UTC).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_TimeToDateTime@, defined at @SDL3\/SDL_time.h 145:34@
+sDL_TimeToDateTime
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.SDL_Time -> BG.Ptr SDL_DateTime -> BG.CBool -> IO BG.CBool)
+sDL_TimeToDateTime =
+  BG.unsafePerformIO hs_bindgen_ccc14802da98ebc1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_DateTimeToTime@
+foreign import ccall unsafe "hs_bindgen_6a3b281635772606"
+  hs_bindgen_6a3b281635772606_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_DateTimeToTime@
+hs_bindgen_6a3b281635772606
+  :: IO
+       (BG.FunPtr (PtrConst.PtrConst SDL_DateTime -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time -> IO BG.CBool))
+hs_bindgen_6a3b281635772606 =
+  BG.fromFFIType hs_bindgen_6a3b281635772606_base
+
+{-# NOINLINE sDL_DateTimeToTime #-}
+
+-- | Converts a calendar time to an SDL_Time in nanoseconds since the epoch.
+--
+--     This function ignores the day_of_week member of the 'SDL_DateTime' struct, so it may remain unset.
+--
+--     [@dt@]: the source 'SDL_DateTime'.
+--
+--     [@ticks@]: the resulting SDL_Time.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DateTimeToTime@, defined at @SDL3\/SDL_time.h 162:34@
+sDL_DateTimeToTime
+  :: BG.FunPtr (PtrConst.PtrConst SDL_DateTime -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time -> IO BG.CBool)
+sDL_DateTimeToTime =
+  BG.unsafePerformIO hs_bindgen_6a3b281635772606
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_TimeToWindows@
+foreign import ccall unsafe "hs_bindgen_06ec16aebabe56e2"
+  hs_bindgen_06ec16aebabe56e2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_TimeToWindows@
+hs_bindgen_06ec16aebabe56e2
+  :: IO
+       ( BG.FunPtr
+           ( SDL3.Sys.Bindgen.Stdinc.SDL_Time
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO ()
+           )
+       )
+hs_bindgen_06ec16aebabe56e2 =
+  BG.fromFFIType hs_bindgen_06ec16aebabe56e2_base
+
+{-# NOINLINE sDL_TimeToWindows #-}
+
+-- | Converts an SDL time into a Windows FILETIME (100-nanosecond intervals since January 1, 1601).
+--
+--     This function fills in the two 32-bit values of the FILETIME structure.
+--
+--     [@ticks@]: the time to convert.
+--
+--     [@dwLowDateTime@]: a pointer filled in with the low portion of the Windows FILETIME value.
+--
+--     [@dwHighDateTime@]: a pointer filled in with the high portion of the Windows FILETIME value.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_TimeToWindows@, defined at @SDL3\/SDL_time.h 180:34@
+sDL_TimeToWindows
+  :: BG.FunPtr
+       ( SDL3.Sys.Bindgen.Stdinc.SDL_Time
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO ()
+       )
+sDL_TimeToWindows =
+  BG.unsafePerformIO hs_bindgen_06ec16aebabe56e2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_TimeFromWindows@
+foreign import ccall unsafe "hs_bindgen_c98ae78917a45694"
+  hs_bindgen_c98ae78917a45694_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_TimeFromWindows@
+hs_bindgen_c98ae78917a45694
+  :: IO
+       ( BG.FunPtr
+           ( SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> SDL3.Sys.Bindgen.Stdinc.Uint32
+             -> IO SDL3.Sys.Bindgen.Stdinc.SDL_Time
+           )
+       )
+hs_bindgen_c98ae78917a45694 =
+  BG.fromFFIType hs_bindgen_c98ae78917a45694_base
+
+{-# NOINLINE sDL_TimeFromWindows #-}
+
+-- | Converts a Windows FILETIME (100-nanosecond intervals since January 1, 1601) to an SDL time.
+--
+--     This function takes the two 32-bit values of the FILETIME structure as parameters.
+--
+--     [@dwLowDateTime@]: the low portion of the Windows FILETIME value.
+--
+--     [@dwHighDateTime@]: the high portion of the Windows FILETIME value.
+--
+--     [Returns]: the converted SDL time.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_TimeFromWindows@, defined at @SDL3\/SDL_time.h 197:38@
+sDL_TimeFromWindows
+  :: BG.FunPtr
+       ( SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> SDL3.Sys.Bindgen.Stdinc.Uint32
+         -> IO SDL3.Sys.Bindgen.Stdinc.SDL_Time
+       )
+sDL_TimeFromWindows =
+  BG.unsafePerformIO hs_bindgen_c98ae78917a45694
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDaysInMonth@
+foreign import ccall unsafe "hs_bindgen_53993d062e70ae21"
+  hs_bindgen_53993d062e70ae21_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDaysInMonth@
+hs_bindgen_53993d062e70ae21 :: IO (BG.FunPtr (BG.CInt -> BG.CInt -> IO BG.CInt))
+hs_bindgen_53993d062e70ae21 =
+  BG.fromFFIType hs_bindgen_53993d062e70ae21_base
+
+{-# NOINLINE sDL_GetDaysInMonth #-}
+
+-- | Get the number of days in a month for a given year.
+--
+--     [@year@]: the year.
+--
+--     [@month@]: the month [1-12].
+--
+--     [Returns]: the number of days in the requested month or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDaysInMonth@, defined at @SDL3\/SDL_time.h 211:33@
+sDL_GetDaysInMonth :: BG.FunPtr (BG.CInt -> BG.CInt -> IO BG.CInt)
+sDL_GetDaysInMonth =
+  BG.unsafePerformIO hs_bindgen_53993d062e70ae21
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDayOfYear@
+foreign import ccall unsafe "hs_bindgen_040f71197ea113df"
+  hs_bindgen_040f71197ea113df_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDayOfYear@
+hs_bindgen_040f71197ea113df :: IO (BG.FunPtr (BG.CInt -> BG.CInt -> BG.CInt -> IO BG.CInt))
+hs_bindgen_040f71197ea113df =
+  BG.fromFFIType hs_bindgen_040f71197ea113df_base
+
+{-# NOINLINE sDL_GetDayOfYear #-}
+
+-- | Get the day of year for a calendar date.
+--
+--     [@year@]: the year component of the date.
+--
+--     [@month@]: the month component of the date.
+--
+--     [@day@]: the day component of the date.
+--
+--     [Returns]: the day of year [0-365] if the date is valid or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDayOfYear@, defined at @SDL3\/SDL_time.h 226:33@
+sDL_GetDayOfYear :: BG.FunPtr (BG.CInt -> BG.CInt -> BG.CInt -> IO BG.CInt)
+sDL_GetDayOfYear =
+  BG.unsafePerformIO hs_bindgen_040f71197ea113df
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDayOfWeek@
+foreign import ccall unsafe "hs_bindgen_6d1532a314d875ae"
+  hs_bindgen_6d1532a314d875ae_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_get_SDL_GetDayOfWeek@
+hs_bindgen_6d1532a314d875ae :: IO (BG.FunPtr (BG.CInt -> BG.CInt -> BG.CInt -> IO BG.CInt))
+hs_bindgen_6d1532a314d875ae =
+  BG.fromFFIType hs_bindgen_6d1532a314d875ae_base
+
+{-# NOINLINE sDL_GetDayOfWeek #-}
+
+-- | Get the day of week for a calendar date.
+--
+--     [@year@]: the year component of the date.
+--
+--     [@month@]: the month component of the date.
+--
+--     [@day@]: the day component of the date.
+--
+--     [Returns]: a value between 0 and 6 (0 being Sunday) if the date is valid or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDayOfWeek@, defined at @SDL3\/SDL_time.h 241:33@
+sDL_GetDayOfWeek :: BG.FunPtr (BG.CInt -> BG.CInt -> BG.CInt -> IO BG.CInt)
+sDL_GetDayOfWeek =
+  BG.unsafePerformIO hs_bindgen_6d1532a314d875ae
diff --git a/src/SDL3/Sys/Bindgen/Time/Safe.hs b/src/SDL3/Sys/Bindgen/Time/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Time/Safe.hs
@@ -0,0 +1,444 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Time.Safe (
+  SDL3.Sys.Bindgen.Time.Safe.sDL_GetDateTimeLocalePreferences,
+  SDL3.Sys.Bindgen.Time.Safe.sDL_GetCurrentTime,
+  SDL3.Sys.Bindgen.Time.Safe.sDL_TimeToDateTime,
+  SDL3.Sys.Bindgen.Time.Safe.sDL_DateTimeToTime,
+  SDL3.Sys.Bindgen.Time.Safe.sDL_TimeToWindows,
+  SDL3.Sys.Bindgen.Time.Safe.sDL_TimeFromWindows,
+  SDL3.Sys.Bindgen.Time.Safe.sDL_GetDaysInMonth,
+  SDL3.Sys.Bindgen.Time.Safe.sDL_GetDayOfYear,
+  SDL3.Sys.Bindgen.Time.Safe.sDL_GetDayOfWeek,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Time
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_time.h>"
+         , "_Bool hs_bindgen_35c19e2819b62184 ("
+         , "  SDL_DateFormat *arg1,"
+         , "  SDL_TimeFormat *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDateTimeLocalePreferences)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_6fb3c3e03b775a52 ("
+         , "  SDL_Time *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCurrentTime)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_89e36f4522d6cda0 ("
+         , "  SDL_Time arg1,"
+         , "  SDL_DateTime *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_TimeToDateTime)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_caee0a375b8a5ff2 ("
+         , "  SDL_DateTime const *arg1,"
+         , "  SDL_Time *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_DateTimeToTime)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_5de74c256e5d982b ("
+         , "  SDL_Time arg1,"
+         , "  Uint32 *arg2,"
+         , "  Uint32 *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_TimeToWindows)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_Time hs_bindgen_4499efff303d7db9 ("
+         , "  Uint32 arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_TimeFromWindows)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_730455fde72d5545 ("
+         , "  signed int arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDaysInMonth)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_9a9db640e42ae3ab ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDayOfYear)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_edb5a4338549d6b2 ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDayOfWeek)(arg1, arg2, arg3);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_GetDateTimeLocalePreferences@
+foreign import ccall safe "hs_bindgen_35c19e2819b62184"
+  hs_bindgen_35c19e2819b62184_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_GetDateTimeLocalePreferences@
+hs_bindgen_35c19e2819b62184
+  :: BG.Ptr SDL_DateFormat
+  -> BG.Ptr SDL_TimeFormat
+  -> IO BG.CBool
+hs_bindgen_35c19e2819b62184 =
+  BG.fromFFIType hs_bindgen_35c19e2819b62184_base
+
+-- | Gets the current preferred date and time format for the system locale.
+--
+--     This might be a \"slow\" call that has to query the operating system. It\'s best to ask for this once and save the results. However, the preferred formats can change, usually because the user has changed a system preference outside of your program.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDateTimeLocalePreferences@, defined at @SDL3\/SDL_time.h 113:34@
+sDL_GetDateTimeLocalePreferences
+  :: BG.Ptr SDL_DateFormat
+  -- ^
+  --
+  --           [@dateFormat@]: a pointer to the 'SDL_DateFormat' to hold the returned date format, may be NULL.
+  -> BG.Ptr SDL_TimeFormat
+  -- ^
+  --
+  --           [@timeFormat@]: a pointer to the 'SDL_TimeFormat' to hold the returned time format, may be NULL.
+  -> IO BG.CBool
+sDL_GetDateTimeLocalePreferences =
+  hs_bindgen_35c19e2819b62184
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_GetCurrentTime@
+foreign import ccall safe "hs_bindgen_6fb3c3e03b775a52"
+  hs_bindgen_6fb3c3e03b775a52_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_GetCurrentTime@
+hs_bindgen_6fb3c3e03b775a52
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -> IO BG.CBool
+hs_bindgen_6fb3c3e03b775a52 =
+  BG.fromFFIType hs_bindgen_6fb3c3e03b775a52_base
+
+-- | Gets the current value of the system realtime clock in nanoseconds since Jan 1, 1970 in Universal Coordinated Time (UTC).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentTime@, defined at @SDL3\/SDL_time.h 127:34@
+sDL_GetCurrentTime
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the SDL_Time to hold the returned tick count.
+  -> IO BG.CBool
+sDL_GetCurrentTime = hs_bindgen_6fb3c3e03b775a52
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_TimeToDateTime@
+foreign import ccall safe "hs_bindgen_89e36f4522d6cda0"
+  hs_bindgen_89e36f4522d6cda0_base
+    :: BG.Int64
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_TimeToDateTime@
+hs_bindgen_89e36f4522d6cda0
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -> BG.Ptr SDL_DateTime
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_89e36f4522d6cda0 =
+  BG.fromFFIType hs_bindgen_89e36f4522d6cda0_base
+
+-- | Converts an SDL_Time in nanoseconds since the epoch to a calendar time in the 'SDL_DateTime' format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_TimeToDateTime@, defined at @SDL3\/SDL_time.h 145:34@
+sDL_TimeToDateTime
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the SDL_Time to be converted.
+  -> BG.Ptr SDL_DateTime
+  -- ^
+  --
+  --           [@dt@]: the resulting 'SDL_DateTime'.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@localTime@]: the resulting 'SDL_DateTime' will be expressed in local time if true, otherwise it will be in Universal Coordinated Time (UTC).
+  -> IO BG.CBool
+sDL_TimeToDateTime = hs_bindgen_89e36f4522d6cda0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_DateTimeToTime@
+foreign import ccall safe "hs_bindgen_caee0a375b8a5ff2"
+  hs_bindgen_caee0a375b8a5ff2_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_DateTimeToTime@
+hs_bindgen_caee0a375b8a5ff2
+  :: PtrConst.PtrConst SDL_DateTime
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -> IO BG.CBool
+hs_bindgen_caee0a375b8a5ff2 =
+  BG.fromFFIType hs_bindgen_caee0a375b8a5ff2_base
+
+-- | Converts a calendar time to an SDL_Time in nanoseconds since the epoch.
+--
+--     This function ignores the day_of_week member of the 'SDL_DateTime' struct, so it may remain unset.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DateTimeToTime@, defined at @SDL3\/SDL_time.h 162:34@
+sDL_DateTimeToTime
+  :: PtrConst.PtrConst SDL_DateTime
+  -- ^
+  --
+  --           [@dt@]: the source 'SDL_DateTime'.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the resulting SDL_Time.
+  -> IO BG.CBool
+sDL_DateTimeToTime = hs_bindgen_caee0a375b8a5ff2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_TimeToWindows@
+foreign import ccall safe "hs_bindgen_5de74c256e5d982b"
+  hs_bindgen_5de74c256e5d982b_base
+    :: BG.Int64
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_TimeToWindows@
+hs_bindgen_5de74c256e5d982b
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_5de74c256e5d982b =
+  BG.fromFFIType hs_bindgen_5de74c256e5d982b_base
+
+-- | Converts an SDL time into a Windows FILETIME (100-nanosecond intervals since January 1, 1601).
+--
+--     This function fills in the two 32-bit values of the FILETIME structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_TimeToWindows@, defined at @SDL3\/SDL_time.h 180:34@
+sDL_TimeToWindows
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the time to convert.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwLowDateTime@]: a pointer filled in with the low portion of the Windows FILETIME value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwHighDateTime@]: a pointer filled in with the high portion of the Windows FILETIME value.
+  -> IO ()
+sDL_TimeToWindows = hs_bindgen_5de74c256e5d982b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_TimeFromWindows@
+foreign import ccall safe "hs_bindgen_4499efff303d7db9"
+  hs_bindgen_4499efff303d7db9_base
+    :: BG.Word32
+    -> BG.Word32
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_TimeFromWindows@
+hs_bindgen_4499efff303d7db9
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_Time
+hs_bindgen_4499efff303d7db9 =
+  BG.fromFFIType hs_bindgen_4499efff303d7db9_base
+
+-- | Converts a Windows FILETIME (100-nanosecond intervals since January 1, 1601) to an SDL time.
+--
+--     This function takes the two 32-bit values of the FILETIME structure as parameters.
+--
+--     [Returns]: the converted SDL time.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_TimeFromWindows@, defined at @SDL3\/SDL_time.h 197:38@
+sDL_TimeFromWindows
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwLowDateTime@]: the low portion of the Windows FILETIME value.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwHighDateTime@]: the high portion of the Windows FILETIME value.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_Time
+sDL_TimeFromWindows = hs_bindgen_4499efff303d7db9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_GetDaysInMonth@
+foreign import ccall safe "hs_bindgen_730455fde72d5545"
+  hs_bindgen_730455fde72d5545_base
+    :: BG.Int32
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_GetDaysInMonth@
+hs_bindgen_730455fde72d5545
+  :: BG.CInt
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_730455fde72d5545 =
+  BG.fromFFIType hs_bindgen_730455fde72d5545_base
+
+-- | Get the number of days in a month for a given year.
+--
+--     [Returns]: the number of days in the requested month or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDaysInMonth@, defined at @SDL3\/SDL_time.h 211:33@
+sDL_GetDaysInMonth
+  :: BG.CInt
+  -- ^
+  --
+  --           [@year@]: the year.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@month@]: the month [1-12].
+  -> IO BG.CInt
+sDL_GetDaysInMonth = hs_bindgen_730455fde72d5545
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_GetDayOfYear@
+foreign import ccall safe "hs_bindgen_9a9db640e42ae3ab"
+  hs_bindgen_9a9db640e42ae3ab_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_GetDayOfYear@
+hs_bindgen_9a9db640e42ae3ab
+  :: BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_9a9db640e42ae3ab =
+  BG.fromFFIType hs_bindgen_9a9db640e42ae3ab_base
+
+-- | Get the day of year for a calendar date.
+--
+--     [Returns]: the day of year [0-365] if the date is valid or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDayOfYear@, defined at @SDL3\/SDL_time.h 226:33@
+sDL_GetDayOfYear
+  :: BG.CInt
+  -- ^
+  --
+  --           [@year@]: the year component of the date.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@month@]: the month component of the date.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@day@]: the day component of the date.
+  -> IO BG.CInt
+sDL_GetDayOfYear = hs_bindgen_9a9db640e42ae3ab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_GetDayOfWeek@
+foreign import ccall safe "hs_bindgen_edb5a4338549d6b2"
+  hs_bindgen_edb5a4338549d6b2_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Safe_SDL_GetDayOfWeek@
+hs_bindgen_edb5a4338549d6b2
+  :: BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_edb5a4338549d6b2 =
+  BG.fromFFIType hs_bindgen_edb5a4338549d6b2_base
+
+-- | Get the day of week for a calendar date.
+--
+--     [Returns]: a value between 0 and 6 (0 being Sunday) if the date is valid or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDayOfWeek@, defined at @SDL3\/SDL_time.h 241:33@
+sDL_GetDayOfWeek
+  :: BG.CInt
+  -- ^
+  --
+  --           [@year@]: the year component of the date.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@month@]: the month component of the date.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@day@]: the day component of the date.
+  -> IO BG.CInt
+sDL_GetDayOfWeek = hs_bindgen_edb5a4338549d6b2
diff --git a/src/SDL3/Sys/Bindgen/Time/Unsafe.hs b/src/SDL3/Sys/Bindgen/Time/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Time/Unsafe.hs
@@ -0,0 +1,444 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Time.Unsafe (
+  SDL3.Sys.Bindgen.Time.Unsafe.sDL_GetDateTimeLocalePreferences,
+  SDL3.Sys.Bindgen.Time.Unsafe.sDL_GetCurrentTime,
+  SDL3.Sys.Bindgen.Time.Unsafe.sDL_TimeToDateTime,
+  SDL3.Sys.Bindgen.Time.Unsafe.sDL_DateTimeToTime,
+  SDL3.Sys.Bindgen.Time.Unsafe.sDL_TimeToWindows,
+  SDL3.Sys.Bindgen.Time.Unsafe.sDL_TimeFromWindows,
+  SDL3.Sys.Bindgen.Time.Unsafe.sDL_GetDaysInMonth,
+  SDL3.Sys.Bindgen.Time.Unsafe.sDL_GetDayOfYear,
+  SDL3.Sys.Bindgen.Time.Unsafe.sDL_GetDayOfWeek,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Time
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_time.h>"
+         , "_Bool hs_bindgen_3432fa094bde3d31 ("
+         , "  SDL_DateFormat *arg1,"
+         , "  SDL_TimeFormat *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDateTimeLocalePreferences)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_8783e8faf159e5f6 ("
+         , "  SDL_Time *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCurrentTime)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_fd32d59b7aff0779 ("
+         , "  SDL_Time arg1,"
+         , "  SDL_DateTime *arg2,"
+         , "  _Bool arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_TimeToDateTime)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_f67b5047c1f40868 ("
+         , "  SDL_DateTime const *arg1,"
+         , "  SDL_Time *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_DateTimeToTime)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_073c7d3a9fd7c54d ("
+         , "  SDL_Time arg1,"
+         , "  Uint32 *arg2,"
+         , "  Uint32 *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_TimeToWindows)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_Time hs_bindgen_450903725dfdb0ee ("
+         , "  Uint32 arg1,"
+         , "  Uint32 arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_TimeFromWindows)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_81cc8f2d17acfd75 ("
+         , "  signed int arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDaysInMonth)(arg1, arg2);"
+         , "}"
+         , "signed int hs_bindgen_02c2e878757c0925 ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDayOfYear)(arg1, arg2, arg3);"
+         , "}"
+         , "signed int hs_bindgen_9583fd9571c78f9c ("
+         , "  signed int arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDayOfWeek)(arg1, arg2, arg3);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_GetDateTimeLocalePreferences@
+foreign import ccall unsafe "hs_bindgen_3432fa094bde3d31"
+  hs_bindgen_3432fa094bde3d31_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_GetDateTimeLocalePreferences@
+hs_bindgen_3432fa094bde3d31
+  :: BG.Ptr SDL_DateFormat
+  -> BG.Ptr SDL_TimeFormat
+  -> IO BG.CBool
+hs_bindgen_3432fa094bde3d31 =
+  BG.fromFFIType hs_bindgen_3432fa094bde3d31_base
+
+-- | Gets the current preferred date and time format for the system locale.
+--
+--     This might be a \"slow\" call that has to query the operating system. It\'s best to ask for this once and save the results. However, the preferred formats can change, usually because the user has changed a system preference outside of your program.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDateTimeLocalePreferences@, defined at @SDL3\/SDL_time.h 113:34@
+sDL_GetDateTimeLocalePreferences
+  :: BG.Ptr SDL_DateFormat
+  -- ^
+  --
+  --           [@dateFormat@]: a pointer to the 'SDL_DateFormat' to hold the returned date format, may be NULL.
+  -> BG.Ptr SDL_TimeFormat
+  -- ^
+  --
+  --           [@timeFormat@]: a pointer to the 'SDL_TimeFormat' to hold the returned time format, may be NULL.
+  -> IO BG.CBool
+sDL_GetDateTimeLocalePreferences =
+  hs_bindgen_3432fa094bde3d31
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_GetCurrentTime@
+foreign import ccall unsafe "hs_bindgen_8783e8faf159e5f6"
+  hs_bindgen_8783e8faf159e5f6_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_GetCurrentTime@
+hs_bindgen_8783e8faf159e5f6
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -> IO BG.CBool
+hs_bindgen_8783e8faf159e5f6 =
+  BG.fromFFIType hs_bindgen_8783e8faf159e5f6_base
+
+-- | Gets the current value of the system realtime clock in nanoseconds since Jan 1, 1970 in Universal Coordinated Time (UTC).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetCurrentTime@, defined at @SDL3\/SDL_time.h 127:34@
+sDL_GetCurrentTime
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the SDL_Time to hold the returned tick count.
+  -> IO BG.CBool
+sDL_GetCurrentTime = hs_bindgen_8783e8faf159e5f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_TimeToDateTime@
+foreign import ccall unsafe "hs_bindgen_fd32d59b7aff0779"
+  hs_bindgen_fd32d59b7aff0779_base
+    :: BG.Int64
+    -> BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_TimeToDateTime@
+hs_bindgen_fd32d59b7aff0779
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -> BG.Ptr SDL_DateTime
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_fd32d59b7aff0779 =
+  BG.fromFFIType hs_bindgen_fd32d59b7aff0779_base
+
+-- | Converts an SDL_Time in nanoseconds since the epoch to a calendar time in the 'SDL_DateTime' format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_TimeToDateTime@, defined at @SDL3\/SDL_time.h 145:34@
+sDL_TimeToDateTime
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the SDL_Time to be converted.
+  -> BG.Ptr SDL_DateTime
+  -- ^
+  --
+  --           [@dt@]: the resulting 'SDL_DateTime'.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@localTime@]: the resulting 'SDL_DateTime' will be expressed in local time if true, otherwise it will be in Universal Coordinated Time (UTC).
+  -> IO BG.CBool
+sDL_TimeToDateTime = hs_bindgen_fd32d59b7aff0779
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_DateTimeToTime@
+foreign import ccall unsafe "hs_bindgen_f67b5047c1f40868"
+  hs_bindgen_f67b5047c1f40868_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_DateTimeToTime@
+hs_bindgen_f67b5047c1f40868
+  :: PtrConst.PtrConst SDL_DateTime
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -> IO BG.CBool
+hs_bindgen_f67b5047c1f40868 =
+  BG.fromFFIType hs_bindgen_f67b5047c1f40868_base
+
+-- | Converts a calendar time to an SDL_Time in nanoseconds since the epoch.
+--
+--     This function ignores the day_of_week member of the 'SDL_DateTime' struct, so it may remain unset.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_DateTimeToTime@, defined at @SDL3\/SDL_time.h 162:34@
+sDL_DateTimeToTime
+  :: PtrConst.PtrConst SDL_DateTime
+  -- ^
+  --
+  --           [@dt@]: the source 'SDL_DateTime'.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the resulting SDL_Time.
+  -> IO BG.CBool
+sDL_DateTimeToTime = hs_bindgen_f67b5047c1f40868
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_TimeToWindows@
+foreign import ccall unsafe "hs_bindgen_073c7d3a9fd7c54d"
+  hs_bindgen_073c7d3a9fd7c54d_base
+    :: BG.Int64
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_TimeToWindows@
+hs_bindgen_073c7d3a9fd7c54d
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_073c7d3a9fd7c54d =
+  BG.fromFFIType hs_bindgen_073c7d3a9fd7c54d_base
+
+-- | Converts an SDL time into a Windows FILETIME (100-nanosecond intervals since January 1, 1601).
+--
+--     This function fills in the two 32-bit values of the FILETIME structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_TimeToWindows@, defined at @SDL3\/SDL_time.h 180:34@
+sDL_TimeToWindows
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the time to convert.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwLowDateTime@]: a pointer filled in with the low portion of the Windows FILETIME value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwHighDateTime@]: a pointer filled in with the high portion of the Windows FILETIME value.
+  -> IO ()
+sDL_TimeToWindows = hs_bindgen_073c7d3a9fd7c54d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_TimeFromWindows@
+foreign import ccall unsafe "hs_bindgen_450903725dfdb0ee"
+  hs_bindgen_450903725dfdb0ee_base
+    :: BG.Word32
+    -> BG.Word32
+    -> IO BG.Int64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_TimeFromWindows@
+hs_bindgen_450903725dfdb0ee
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_Time
+hs_bindgen_450903725dfdb0ee =
+  BG.fromFFIType hs_bindgen_450903725dfdb0ee_base
+
+-- | Converts a Windows FILETIME (100-nanosecond intervals since January 1, 1601) to an SDL time.
+--
+--     This function takes the two 32-bit values of the FILETIME structure as parameters.
+--
+--     [Returns]: the converted SDL time.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_TimeFromWindows@, defined at @SDL3\/SDL_time.h 197:38@
+sDL_TimeFromWindows
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwLowDateTime@]: the low portion of the Windows FILETIME value.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwHighDateTime@]: the high portion of the Windows FILETIME value.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_Time
+sDL_TimeFromWindows = hs_bindgen_450903725dfdb0ee
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_GetDaysInMonth@
+foreign import ccall unsafe "hs_bindgen_81cc8f2d17acfd75"
+  hs_bindgen_81cc8f2d17acfd75_base
+    :: BG.Int32
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_GetDaysInMonth@
+hs_bindgen_81cc8f2d17acfd75
+  :: BG.CInt
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_81cc8f2d17acfd75 =
+  BG.fromFFIType hs_bindgen_81cc8f2d17acfd75_base
+
+-- | Get the number of days in a month for a given year.
+--
+--     [Returns]: the number of days in the requested month or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDaysInMonth@, defined at @SDL3\/SDL_time.h 211:33@
+sDL_GetDaysInMonth
+  :: BG.CInt
+  -- ^
+  --
+  --           [@year@]: the year.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@month@]: the month [1-12].
+  -> IO BG.CInt
+sDL_GetDaysInMonth = hs_bindgen_81cc8f2d17acfd75
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_GetDayOfYear@
+foreign import ccall unsafe "hs_bindgen_02c2e878757c0925"
+  hs_bindgen_02c2e878757c0925_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_GetDayOfYear@
+hs_bindgen_02c2e878757c0925
+  :: BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_02c2e878757c0925 =
+  BG.fromFFIType hs_bindgen_02c2e878757c0925_base
+
+-- | Get the day of year for a calendar date.
+--
+--     [Returns]: the day of year [0-365] if the date is valid or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDayOfYear@, defined at @SDL3\/SDL_time.h 226:33@
+sDL_GetDayOfYear
+  :: BG.CInt
+  -- ^
+  --
+  --           [@year@]: the year component of the date.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@month@]: the month component of the date.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@day@]: the day component of the date.
+  -> IO BG.CInt
+sDL_GetDayOfYear = hs_bindgen_02c2e878757c0925
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_GetDayOfWeek@
+foreign import ccall unsafe "hs_bindgen_9583fd9571c78f9c"
+  hs_bindgen_9583fd9571c78f9c_base
+    :: BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Time_Unsafe_SDL_GetDayOfWeek@
+hs_bindgen_9583fd9571c78f9c
+  :: BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CInt
+hs_bindgen_9583fd9571c78f9c =
+  BG.fromFFIType hs_bindgen_9583fd9571c78f9c_base
+
+-- | Get the day of week for a calendar date.
+--
+--     [Returns]: a value between 0 and 6 (0 being Sunday) if the date is valid or -1 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDayOfWeek@, defined at @SDL3\/SDL_time.h 241:33@
+sDL_GetDayOfWeek
+  :: BG.CInt
+  -- ^
+  --
+  --           [@year@]: the year component of the date.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@month@]: the month component of the date.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@day@]: the day component of the date.
+  -> IO BG.CInt
+sDL_GetDayOfWeek = hs_bindgen_9583fd9571c78f9c
diff --git a/src/SDL3/Sys/Bindgen/Timer.hs b/src/SDL3/Sys/Bindgen/Timer.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Timer.hs
@@ -0,0 +1,460 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL provides time management functionality. It is useful for dealing with (usually) small durations of time.
+--
+--     This is not to be confused with /calendar time/ management, which is provided by [CategoryTime](CategoryTime).
+--
+--     This category covers measuring time elapsed (@SDL_GetTicks()@, @SDL_GetPerformanceCounter()@), putting a thread to sleep for a certain amount of time (@SDL_Delay()@, @SDL_DelayNS()@, @SDL_DelayPrecise()@), and firing a callback function after a certain amount of time has elapsed (@SDL_AddTimer()@, etc).
+--
+--     There are also useful macros to convert between time units, like @SDL_SECONDS_TO_NS()@ and such. Number of milliseconds in a second.
+--
+--     This is always 1000.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Timer (
+  SDL3.Sys.Bindgen.Timer.sDL_MS_PER_SECOND,
+  SDL3.Sys.Bindgen.Timer.sDL_US_PER_SECOND,
+  SDL3.Sys.Bindgen.Timer.sDL_NS_PER_SECOND,
+  SDL3.Sys.Bindgen.Timer.sDL_NS_PER_MS,
+  SDL3.Sys.Bindgen.Timer.sDL_NS_PER_US,
+  SDL3.Sys.Bindgen.Timer.sDL_NS_TO_SECONDS,
+  SDL3.Sys.Bindgen.Timer.sDL_NS_TO_MS,
+  SDL3.Sys.Bindgen.Timer.sDL_NS_TO_US,
+  SDL3.Sys.Bindgen.Timer.SDL_TimerID (..),
+  SDL3.Sys.Bindgen.Timer.SDL_TimerCallback_Aux (..),
+  SDL3.Sys.Bindgen.Timer.SDL_TimerCallback (..),
+  SDL3.Sys.Bindgen.Timer.SDL_NSTimerCallback_Aux (..),
+  SDL3.Sys.Bindgen.Timer.SDL_NSTimerCallback (..),
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @macro SDL_MS_PER_SECOND@, defined at @SDL3\/SDL_timer.h 62:9@
+sDL_MS_PER_SECOND :: BG.CInt
+sDL_MS_PER_SECOND = (1000 :: BG.CInt)
+
+-- | Number of microseconds in a second.
+--
+--     This is always 1000000.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_US_PER_SECOND@, defined at @SDL3\/SDL_timer.h 71:9@
+sDL_US_PER_SECOND :: BG.CInt
+sDL_US_PER_SECOND = (1000000 :: BG.CInt)
+
+-- | Number of nanoseconds in a second.
+--
+--     This is always 1000000000.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_NS_PER_SECOND@, defined at @SDL3\/SDL_timer.h 80:9@
+sDL_NS_PER_SECOND :: BG.CLLong
+sDL_NS_PER_SECOND = (1000000000 :: BG.CLLong)
+
+-- | Number of nanoseconds in a millisecond.
+--
+--     This is always 1000000.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_NS_PER_MS@, defined at @SDL3\/SDL_timer.h 89:9@
+sDL_NS_PER_MS :: BG.CInt
+sDL_NS_PER_MS = (1000000 :: BG.CInt)
+
+-- | Number of nanoseconds in a microsecond.
+--
+--     This is always 1000.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_NS_PER_US@, defined at @SDL3\/SDL_timer.h 98:9@
+sDL_NS_PER_US :: BG.CInt
+sDL_NS_PER_US = (1000 :: BG.CInt)
+
+-- | Convert nanoseconds to seconds.
+--
+--     This performs a division, so the results can be dramatically different if @NS@ is an integer or floating point value.
+--
+--     [@NS@]: the number of nanoseconds to convert.
+--
+--     [Returns]: NS, expressed in seconds.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_NS_TO_SECONDS@, defined at @SDL3\/SDL_timer.h 127:9@
+sDL_NS_TO_SECONDS
+  :: forall a0. (C.Expr.HostPlatform.Div a0 BG.CLLong) => a0 -> C.Expr.HostPlatform.DivRes a0 BG.CLLong
+sDL_NS_TO_SECONDS =
+  \nS0 -> (C.Expr.HostPlatform./) nS0 sDL_NS_PER_SECOND
+
+-- | Convert nanoseconds to milliseconds.
+--
+--     This performs a division, so the results can be dramatically different if @NS@ is an integer or floating point value.
+--
+--     [@NS@]: the number of nanoseconds to convert.
+--
+--     [Returns]: NS, expressed in milliseconds.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_NS_TO_MS@, defined at @SDL3\/SDL_timer.h 156:9@
+sDL_NS_TO_MS
+  :: forall a0. (C.Expr.HostPlatform.Div a0 BG.CInt) => a0 -> C.Expr.HostPlatform.DivRes a0 BG.CInt
+sDL_NS_TO_MS =
+  \nS0 -> (C.Expr.HostPlatform./) nS0 sDL_NS_PER_MS
+
+-- | Convert nanoseconds to microseconds.
+--
+--     This performs a division, so the results can be dramatically different if @NS@ is an integer or floating point value.
+--
+--     [@NS@]: the number of nanoseconds to convert.
+--
+--     [Returns]: NS, expressed in microseconds.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_NS_TO_US@, defined at @SDL3\/SDL_timer.h 185:9@
+sDL_NS_TO_US
+  :: forall a0. (C.Expr.HostPlatform.Div a0 BG.CInt) => a0 -> C.Expr.HostPlatform.DivRes a0 BG.CInt
+sDL_NS_TO_US =
+  \nS0 -> (C.Expr.HostPlatform./) nS0 sDL_NS_PER_US
+
+-- | Definition of the timer ID type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_TimerID@, defined at @SDL3\/SDL_timer.h 306:16@
+newtype SDL_TimerID = SDL_TimerID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_TimerID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TimerID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TimerID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TimerID "unwrap" where
+  type
+    CFieldType SDL_TimerID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_TimerCallback'
+--
+--     [C declaration]: @SDL_TimerCallback@, defined at @SDL3\/SDL_timer.h 332:26@
+newtype SDL_TimerCallback_Aux = SDL_TimerCallback_Aux
+  { unwrap
+      :: BG.Ptr BG.Void -> SDL_TimerID -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_TimerCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_a49c51828ca7c2b2_base
+    :: (BG.Ptr BG.Void -> BG.Word32 -> BG.Word32 -> IO BG.Word32)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Word32 -> BG.Word32 -> IO BG.Word32))
+
+-- __unique:__ @toSDL_TimerCallback_Aux@
+hs_bindgen_a49c51828ca7c2b2
+  :: SDL_TimerCallback_Aux
+  -> IO (BG.FunPtr SDL_TimerCallback_Aux)
+hs_bindgen_a49c51828ca7c2b2 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_a49c51828ca7c2b2_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_TimerCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_fecf80520b47dfb6_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Word32 -> BG.Word32 -> IO BG.Word32)
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @fromSDL_TimerCallback_Aux@
+hs_bindgen_fecf80520b47dfb6
+  :: BG.FunPtr SDL_TimerCallback_Aux
+  -> SDL_TimerCallback_Aux
+hs_bindgen_fecf80520b47dfb6 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_fecf80520b47dfb6_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_TimerCallback_Aux where
+  toFunPtr = hs_bindgen_a49c51828ca7c2b2
+
+instance BG.FromFunPtr SDL_TimerCallback_Aux where
+  fromFunPtr = hs_bindgen_fecf80520b47dfb6
+
+instance
+  ( ty
+      ~ (BG.Ptr BG.Void -> SDL_TimerID -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+  )
+  => BG.CompatHasField.HasField "unwrap" SDL_TimerCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TimerCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  ( ty
+      ~ (BG.Ptr BG.Void -> SDL_TimerID -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO SDL3.Sys.Bindgen.Stdinc.Uint32)
+  )
+  => BG.HasField "unwrap" (BG.Ptr SDL_TimerCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TimerCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_TimerCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> SDL_TimerID -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Function prototype for the millisecond timer callback function.
+--
+--     The callback function is passed the current timer interval and returns the next timer interval, in milliseconds. If the returned value is the same as the one passed in, the periodic alarm continues, otherwise a new alarm is scheduled. If the callback returns 0, the periodic alarm is canceled and will be removed.
+--
+--     [@userdata@]: an arbitrary pointer provided by the app through SDL_AddTimer, for its own use.
+--
+--     [@timerID@]: the current timer being processed.
+--
+--     [@interval@]: the current callback time interval.
+--
+--     [Returns]: the new callback time interval, or 0 to disable further runs of the callback.
+--
+--     [Thread safety]: SDL may call this callback at any time from a background thread; the application is responsible for locking resources the callback touches that need to be protected.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimer'
+--
+--     [C declaration]: @SDL_TimerCallback@, defined at @SDL3\/SDL_timer.h 332:26@
+newtype SDL_TimerCallback = SDL_TimerCallback
+  { unwrap :: BG.FunPtr SDL_TimerCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_TimerCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_TimerCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TimerCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_TimerCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TimerCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TimerCallback "unwrap" where
+  type
+    CFieldType SDL_TimerCallback "unwrap" =
+      BG.FunPtr SDL_TimerCallback_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_NSTimerCallback'
+--
+--     [C declaration]: @SDL_NSTimerCallback@, defined at @SDL3\/SDL_timer.h 394:26@
+newtype SDL_NSTimerCallback_Aux = SDL_NSTimerCallback_Aux
+  { unwrap
+      :: BG.Ptr BG.Void -> SDL_TimerID -> SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO SDL3.Sys.Bindgen.Stdinc.Uint64
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_NSTimerCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_31fbeb64177dcacb_base
+    :: (BG.Ptr BG.Void -> BG.Word32 -> BG.Word64 -> IO BG.Word64)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Word32 -> BG.Word64 -> IO BG.Word64))
+
+-- __unique:__ @toSDL_NSTimerCallback_Aux@
+hs_bindgen_31fbeb64177dcacb
+  :: SDL_NSTimerCallback_Aux
+  -> IO (BG.FunPtr SDL_NSTimerCallback_Aux)
+hs_bindgen_31fbeb64177dcacb =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_31fbeb64177dcacb_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_NSTimerCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_389ed0c3b28b1730_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Word32 -> BG.Word64 -> IO BG.Word64)
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> BG.Word64
+    -> IO BG.Word64
+
+-- __unique:__ @fromSDL_NSTimerCallback_Aux@
+hs_bindgen_389ed0c3b28b1730
+  :: BG.FunPtr SDL_NSTimerCallback_Aux
+  -> SDL_NSTimerCallback_Aux
+hs_bindgen_389ed0c3b28b1730 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_389ed0c3b28b1730_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_NSTimerCallback_Aux where
+  toFunPtr = hs_bindgen_31fbeb64177dcacb
+
+instance BG.FromFunPtr SDL_NSTimerCallback_Aux where
+  fromFunPtr = hs_bindgen_389ed0c3b28b1730
+
+instance
+  ( ty
+      ~ (BG.Ptr BG.Void -> SDL_TimerID -> SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO SDL3.Sys.Bindgen.Stdinc.Uint64)
+  )
+  => BG.CompatHasField.HasField "unwrap" SDL_NSTimerCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_NSTimerCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  ( ty
+      ~ (BG.Ptr BG.Void -> SDL_TimerID -> SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO SDL3.Sys.Bindgen.Stdinc.Uint64)
+  )
+  => BG.HasField "unwrap" (BG.Ptr SDL_NSTimerCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_NSTimerCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_NSTimerCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> SDL_TimerID -> SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 0
+
+-- | Function prototype for the nanosecond timer callback function.
+--
+--     The callback function is passed the current timer interval and returns the next timer interval, in nanoseconds. If the returned value is the same as the one passed in, the periodic alarm continues, otherwise a new alarm is scheduled. If the callback returns 0, the periodic alarm is canceled and will be removed.
+--
+--     [@userdata@]: an arbitrary pointer provided by the app through SDL_AddTimer, for its own use.
+--
+--     [@timerID@]: the current timer being processed.
+--
+--     [@interval@]: the current callback time interval.
+--
+--     [Returns]: the new callback time interval, or 0 to disable further runs of the callback.
+--
+--     [Thread safety]: SDL may call this callback at any time from a background thread; the application is responsible for locking resources the callback touches that need to be protected.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimerNS'
+--
+--     [C declaration]: @SDL_NSTimerCallback@, defined at @SDL3\/SDL_timer.h 394:26@
+newtype SDL_NSTimerCallback = SDL_NSTimerCallback
+  { unwrap :: BG.FunPtr SDL_NSTimerCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_NSTimerCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_NSTimerCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_NSTimerCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_NSTimerCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_NSTimerCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_NSTimerCallback "unwrap" where
+  type
+    CFieldType SDL_NSTimerCallback "unwrap" =
+      BG.FunPtr SDL_NSTimerCallback_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Timer/FunPtr.hs b/src/SDL3/Sys/Bindgen/Timer/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Timer/FunPtr.hs
@@ -0,0 +1,422 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Timer.FunPtr (
+  SDL3.Sys.Bindgen.Timer.FunPtr.sDL_GetTicks,
+  SDL3.Sys.Bindgen.Timer.FunPtr.sDL_GetTicksNS,
+  SDL3.Sys.Bindgen.Timer.FunPtr.sDL_GetPerformanceCounter,
+  SDL3.Sys.Bindgen.Timer.FunPtr.sDL_GetPerformanceFrequency,
+  SDL3.Sys.Bindgen.Timer.FunPtr.sDL_Delay,
+  SDL3.Sys.Bindgen.Timer.FunPtr.sDL_DelayNS,
+  SDL3.Sys.Bindgen.Timer.FunPtr.sDL_DelayPrecise,
+  SDL3.Sys.Bindgen.Timer.FunPtr.sDL_AddTimer,
+  SDL3.Sys.Bindgen.Timer.FunPtr.sDL_AddTimerNS,
+  SDL3.Sys.Bindgen.Timer.FunPtr.sDL_RemoveTimer,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Timer
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_timer.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetTicks */"
+         , "__attribute__ ((const))"
+         , "Uint64 (*hs_bindgen_b002c533def7d6e4 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetTicks;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetTicksNS */"
+         , "__attribute__ ((const))"
+         , "Uint64 (*hs_bindgen_b11474f76c0aba2f (void)) (void)"
+         , "{"
+         , "  return &SDL_GetTicksNS;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetPerformanceCounter */"
+         , "__attribute__ ((const))"
+         , "Uint64 (*hs_bindgen_2b2a93de1b59846d (void)) (void)"
+         , "{"
+         , "  return &SDL_GetPerformanceCounter;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetPerformanceFrequency */"
+         , "__attribute__ ((const))"
+         , "Uint64 (*hs_bindgen_4255230676734c7d (void)) (void)"
+         , "{"
+         , "  return &SDL_GetPerformanceFrequency;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_Delay */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_84b99149e32b080f (void)) ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_Delay;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_DelayNS */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_1a329c57b5bdd945 (void)) ("
+         , "  Uint64 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DelayNS;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_DelayPrecise */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_f88afdd785f29344 (void)) ("
+         , "  Uint64 arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DelayPrecise;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_AddTimer */"
+         , "__attribute__ ((const))"
+         , "SDL_TimerID (*hs_bindgen_fd3519e258872841 (void)) ("
+         , "  Uint32 arg1,"
+         , "  SDL_TimerCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_AddTimer;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_AddTimerNS */"
+         , "__attribute__ ((const))"
+         , "SDL_TimerID (*hs_bindgen_de4009388b75ebae (void)) ("
+         , "  Uint64 arg1,"
+         , "  SDL_NSTimerCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_AddTimerNS;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_RemoveTimer */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_837b4956d1a9314e (void)) ("
+         , "  SDL_TimerID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RemoveTimer;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetTicks@
+foreign import ccall unsafe "hs_bindgen_b002c533def7d6e4"
+  hs_bindgen_b002c533def7d6e4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetTicks@
+hs_bindgen_b002c533def7d6e4 :: IO (BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.Uint64))
+hs_bindgen_b002c533def7d6e4 =
+  BG.fromFFIType hs_bindgen_b002c533def7d6e4_base
+
+{-# NOINLINE sDL_GetTicks #-}
+
+-- | Get the number of milliseconds that have elapsed since the SDL library initialization.
+--
+--     [Returns]: an unsigned 64‑bit integer that represents the number of milliseconds that have elapsed since the SDL library was initialized (typically via a call to SDL_Init).
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTicksNS'
+--
+--     [C declaration]: @SDL_GetTicks@, defined at @SDL3\/SDL_timer.h 201:36@
+sDL_GetTicks :: BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.Uint64)
+sDL_GetTicks =
+  BG.unsafePerformIO hs_bindgen_b002c533def7d6e4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetTicksNS@
+foreign import ccall unsafe "hs_bindgen_b11474f76c0aba2f"
+  hs_bindgen_b11474f76c0aba2f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetTicksNS@
+hs_bindgen_b11474f76c0aba2f :: IO (BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.Uint64))
+hs_bindgen_b11474f76c0aba2f =
+  BG.fromFFIType hs_bindgen_b11474f76c0aba2f_base
+
+{-# NOINLINE sDL_GetTicksNS #-}
+
+-- | Get the number of nanoseconds since SDL library initialization.
+--
+--     [Returns]: an unsigned 64-bit value representing the number of nanoseconds since the SDL library initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTicksNS@, defined at @SDL3\/SDL_timer.h 213:36@
+sDL_GetTicksNS :: BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.Uint64)
+sDL_GetTicksNS =
+  BG.unsafePerformIO hs_bindgen_b11474f76c0aba2f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetPerformanceCounter@
+foreign import ccall unsafe "hs_bindgen_2b2a93de1b59846d"
+  hs_bindgen_2b2a93de1b59846d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetPerformanceCounter@
+hs_bindgen_2b2a93de1b59846d :: IO (BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.Uint64))
+hs_bindgen_2b2a93de1b59846d =
+  BG.fromFFIType hs_bindgen_2b2a93de1b59846d_base
+
+{-# NOINLINE sDL_GetPerformanceCounter #-}
+
+-- | Get the current value of the high resolution counter.
+--
+--     This function is typically used for profiling.
+--
+--     The counter values are only meaningful relative to each other. Differences between values can be converted to times by using @SDL_GetPerformanceFrequency()@.
+--
+--     [Returns]: the current counter value.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPerformanceFrequency'
+--
+--     [C declaration]: @SDL_GetPerformanceCounter@, defined at @SDL3\/SDL_timer.h 232:36@
+sDL_GetPerformanceCounter :: BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.Uint64)
+sDL_GetPerformanceCounter =
+  BG.unsafePerformIO hs_bindgen_2b2a93de1b59846d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetPerformanceFrequency@
+foreign import ccall unsafe "hs_bindgen_4255230676734c7d"
+  hs_bindgen_4255230676734c7d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_GetPerformanceFrequency@
+hs_bindgen_4255230676734c7d :: IO (BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.Uint64))
+hs_bindgen_4255230676734c7d =
+  BG.fromFFIType hs_bindgen_4255230676734c7d_base
+
+{-# NOINLINE sDL_GetPerformanceFrequency #-}
+
+-- | Get the count per second of the high resolution counter.
+--
+--     [Returns]: a platform-specific count per second.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPerformanceCounter'
+--
+--     [C declaration]: @SDL_GetPerformanceFrequency@, defined at @SDL3\/SDL_timer.h 245:36@
+sDL_GetPerformanceFrequency :: BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.Uint64)
+sDL_GetPerformanceFrequency =
+  BG.unsafePerformIO hs_bindgen_4255230676734c7d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_Delay@
+foreign import ccall unsafe "hs_bindgen_84b99149e32b080f"
+  hs_bindgen_84b99149e32b080f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_Delay@
+hs_bindgen_84b99149e32b080f :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO ()))
+hs_bindgen_84b99149e32b080f =
+  BG.fromFFIType hs_bindgen_84b99149e32b080f_base
+
+{-# NOINLINE sDL_Delay #-}
+
+-- | Wait a specified number of milliseconds before returning.
+--
+--     This function waits a specified number of milliseconds before returning. It waits at least the specified time, but possibly longer due to OS scheduling.
+--
+--     [@ms@]: the number of milliseconds to delay.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DelayNS', 'sDL_DelayPrecise'
+--
+--     [C declaration]: @SDL_Delay@, defined at @SDL3\/SDL_timer.h 263:34@
+sDL_Delay :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO ())
+sDL_Delay =
+  BG.unsafePerformIO hs_bindgen_84b99149e32b080f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_DelayNS@
+foreign import ccall unsafe "hs_bindgen_1a329c57b5bdd945"
+  hs_bindgen_1a329c57b5bdd945_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_DelayNS@
+hs_bindgen_1a329c57b5bdd945 :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO ()))
+hs_bindgen_1a329c57b5bdd945 =
+  BG.fromFFIType hs_bindgen_1a329c57b5bdd945_base
+
+{-# NOINLINE sDL_DelayNS #-}
+
+-- | Wait a specified number of nanoseconds before returning.
+--
+--     This function waits a specified number of nanoseconds before returning. It waits at least the specified time, but possibly longer due to OS scheduling.
+--
+--     [@ns@]: the number of nanoseconds to delay.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Delay', 'sDL_DelayPrecise'
+--
+--     [C declaration]: @SDL_DelayNS@, defined at @SDL3\/SDL_timer.h 281:34@
+sDL_DelayNS :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO ())
+sDL_DelayNS =
+  BG.unsafePerformIO hs_bindgen_1a329c57b5bdd945
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_DelayPrecise@
+foreign import ccall unsafe "hs_bindgen_f88afdd785f29344"
+  hs_bindgen_f88afdd785f29344_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_DelayPrecise@
+hs_bindgen_f88afdd785f29344 :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO ()))
+hs_bindgen_f88afdd785f29344 =
+  BG.fromFFIType hs_bindgen_f88afdd785f29344_base
+
+{-# NOINLINE sDL_DelayPrecise #-}
+
+-- | Wait a specified number of nanoseconds before returning.
+--
+--     This function waits a specified number of nanoseconds before returning. It will attempt to wait as close to the requested time as possible, busy waiting if necessary, but could return later due to OS scheduling.
+--
+--     [@ns@]: the number of nanoseconds to delay.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Delay', 'sDL_DelayNS'
+--
+--     [C declaration]: @SDL_DelayPrecise@, defined at @SDL3\/SDL_timer.h 299:34@
+sDL_DelayPrecise :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint64 -> IO ())
+sDL_DelayPrecise =
+  BG.unsafePerformIO hs_bindgen_f88afdd785f29344
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_AddTimer@
+foreign import ccall unsafe "hs_bindgen_fd3519e258872841"
+  hs_bindgen_fd3519e258872841_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_AddTimer@
+hs_bindgen_fd3519e258872841
+  :: IO
+       (BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> SDL_TimerCallback -> BG.Ptr BG.Void -> IO SDL_TimerID))
+hs_bindgen_fd3519e258872841 =
+  BG.fromFFIType hs_bindgen_fd3519e258872841_base
+
+{-# NOINLINE sDL_AddTimer #-}
+
+-- | Call a callback function at a future time.
+--
+--     The callback function is passed the current timer interval and the user supplied parameter from the @SDL_AddTimer()@ call and should return the next timer interval. If the value returned from the callback is 0, the timer is canceled and will be removed.
+--
+--     The callback is run on a separate thread, and for short timeouts can potentially be called before this function returns.
+--
+--     Timers take into account the amount of time it took to execute the callback. For example, if the callback took 250 ms to execute and returned 1000 (ms), the timer would only wait another 750 ms before its next iteration.
+--
+--     Timing may be inexact due to OS scheduling. Be sure to note the current time with @SDL_GetTicksNS()@ or @SDL_GetPerformanceCounter()@ in case your callback needs to adjust for variances.
+--
+--     [@interval@]: the timer delay, in milliseconds, passed to @callback@.
+--
+--     [@callback@]: the 'SDL_TimerCallback' function to call when the specified @interval@ elapses.
+--
+--     [@userdata@]: a pointer that is passed to @callback@.
+--
+--     [Returns]: a timer ID or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimerNS', 'sDL_RemoveTimer'
+--
+--     [C declaration]: @SDL_AddTimer@, defined at @SDL3\/SDL_timer.h 368:41@
+sDL_AddTimer
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Stdinc.Uint32 -> SDL_TimerCallback -> BG.Ptr BG.Void -> IO SDL_TimerID)
+sDL_AddTimer =
+  BG.unsafePerformIO hs_bindgen_fd3519e258872841
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_AddTimerNS@
+foreign import ccall unsafe "hs_bindgen_de4009388b75ebae"
+  hs_bindgen_de4009388b75ebae_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_AddTimerNS@
+hs_bindgen_de4009388b75ebae
+  :: IO
+       ( BG.FunPtr
+           (SDL3.Sys.Bindgen.Stdinc.Uint64 -> SDL_NSTimerCallback -> BG.Ptr BG.Void -> IO SDL_TimerID)
+       )
+hs_bindgen_de4009388b75ebae =
+  BG.fromFFIType hs_bindgen_de4009388b75ebae_base
+
+{-# NOINLINE sDL_AddTimerNS #-}
+
+-- | Call a callback function at a future time.
+--
+--     The callback function is passed the current timer interval and the user supplied parameter from the @SDL_AddTimerNS()@ call and should return the next timer interval. If the value returned from the callback is 0, the timer is canceled and will be removed.
+--
+--     The callback is run on a separate thread, and for short timeouts can potentially be called before this function returns.
+--
+--     Timers take into account the amount of time it took to execute the callback. For example, if the callback took 250 ns to execute and returned 1000 (ns), the timer would only wait another 750 ns before its next iteration.
+--
+--     Timing may be inexact due to OS scheduling. Be sure to note the current time with @SDL_GetTicksNS()@ or @SDL_GetPerformanceCounter()@ in case your callback needs to adjust for variances.
+--
+--     [@interval@]: the timer delay, in nanoseconds, passed to @callback@.
+--
+--     [@callback@]: the 'SDL_TimerCallback' function to call when the specified @interval@ elapses.
+--
+--     [@userdata@]: a pointer that is passed to @callback@.
+--
+--     [Returns]: a timer ID or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimer', 'sDL_RemoveTimer'
+--
+--     [C declaration]: @SDL_AddTimerNS@, defined at @SDL3\/SDL_timer.h 430:41@
+sDL_AddTimerNS
+  :: BG.FunPtr
+       (SDL3.Sys.Bindgen.Stdinc.Uint64 -> SDL_NSTimerCallback -> BG.Ptr BG.Void -> IO SDL_TimerID)
+sDL_AddTimerNS =
+  BG.unsafePerformIO hs_bindgen_de4009388b75ebae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_RemoveTimer@
+foreign import ccall unsafe "hs_bindgen_837b4956d1a9314e"
+  hs_bindgen_837b4956d1a9314e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_get_SDL_RemoveTimer@
+hs_bindgen_837b4956d1a9314e :: IO (BG.FunPtr (SDL_TimerID -> IO BG.CBool))
+hs_bindgen_837b4956d1a9314e =
+  BG.fromFFIType hs_bindgen_837b4956d1a9314e_base
+
+{-# NOINLINE sDL_RemoveTimer #-}
+
+-- | Remove a timer created with @SDL_AddTimer()@.
+--
+--     [@id@]: the ID of the timer to remove.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimer'
+--
+--     [C declaration]: @SDL_RemoveTimer@, defined at @SDL3\/SDL_timer.h 445:34@
+sDL_RemoveTimer :: BG.FunPtr (SDL_TimerID -> IO BG.CBool)
+sDL_RemoveTimer =
+  BG.unsafePerformIO hs_bindgen_837b4956d1a9314e
diff --git a/src/SDL3/Sys/Bindgen/Timer/Safe.hs b/src/SDL3/Sys/Bindgen/Timer/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Timer/Safe.hs
@@ -0,0 +1,417 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Timer.Safe (
+  SDL3.Sys.Bindgen.Timer.Safe.sDL_GetTicks,
+  SDL3.Sys.Bindgen.Timer.Safe.sDL_GetTicksNS,
+  SDL3.Sys.Bindgen.Timer.Safe.sDL_GetPerformanceCounter,
+  SDL3.Sys.Bindgen.Timer.Safe.sDL_GetPerformanceFrequency,
+  SDL3.Sys.Bindgen.Timer.Safe.sDL_Delay,
+  SDL3.Sys.Bindgen.Timer.Safe.sDL_DelayNS,
+  SDL3.Sys.Bindgen.Timer.Safe.sDL_DelayPrecise,
+  SDL3.Sys.Bindgen.Timer.Safe.sDL_AddTimer,
+  SDL3.Sys.Bindgen.Timer.Safe.sDL_AddTimerNS,
+  SDL3.Sys.Bindgen.Timer.Safe.sDL_RemoveTimer,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Timer
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_timer.h>"
+         , "Uint64 hs_bindgen_c6153618a018e856 (void)"
+         , "{"
+         , "  return (SDL_GetTicks)();"
+         , "}"
+         , "Uint64 hs_bindgen_47e2e360ac6e112d (void)"
+         , "{"
+         , "  return (SDL_GetTicksNS)();"
+         , "}"
+         , "Uint64 hs_bindgen_e58f7e74d5dfd2f6 (void)"
+         , "{"
+         , "  return (SDL_GetPerformanceCounter)();"
+         , "}"
+         , "Uint64 hs_bindgen_3a4825ac03082c11 (void)"
+         , "{"
+         , "  return (SDL_GetPerformanceFrequency)();"
+         , "}"
+         , "void hs_bindgen_8754cd6d3f04ccff ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  (SDL_Delay)(arg1);"
+         , "}"
+         , "void hs_bindgen_4581488a34fdd3e7 ("
+         , "  Uint64 arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DelayNS)(arg1);"
+         , "}"
+         , "void hs_bindgen_19457ba0f1d978a7 ("
+         , "  Uint64 arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DelayPrecise)(arg1);"
+         , "}"
+         , "SDL_TimerID hs_bindgen_1eb4863b9e459f9b ("
+         , "  Uint32 arg1,"
+         , "  SDL_TimerCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_AddTimer)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_TimerID hs_bindgen_04843533c2eea6bf ("
+         , "  Uint64 arg1,"
+         , "  SDL_NSTimerCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_AddTimerNS)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_3794f4416b9527ed ("
+         , "  SDL_TimerID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RemoveTimer)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_GetTicks@
+foreign import ccall safe "hs_bindgen_c6153618a018e856"
+  hs_bindgen_c6153618a018e856_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_GetTicks@
+hs_bindgen_c6153618a018e856 :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_c6153618a018e856 =
+  BG.fromFFIType hs_bindgen_c6153618a018e856_base
+
+-- | Get the number of milliseconds that have elapsed since the SDL library initialization.
+--
+--     [Returns]: an unsigned 64‑bit integer that represents the number of milliseconds that have elapsed since the SDL library was initialized (typically via a call to SDL_Init).
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTicksNS'
+--
+--     [C declaration]: @SDL_GetTicks@, defined at @SDL3\/SDL_timer.h 201:36@
+sDL_GetTicks :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetTicks = hs_bindgen_c6153618a018e856
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_GetTicksNS@
+foreign import ccall safe "hs_bindgen_47e2e360ac6e112d"
+  hs_bindgen_47e2e360ac6e112d_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_GetTicksNS@
+hs_bindgen_47e2e360ac6e112d :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_47e2e360ac6e112d =
+  BG.fromFFIType hs_bindgen_47e2e360ac6e112d_base
+
+-- | Get the number of nanoseconds since SDL library initialization.
+--
+--     [Returns]: an unsigned 64-bit value representing the number of nanoseconds since the SDL library initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTicksNS@, defined at @SDL3\/SDL_timer.h 213:36@
+sDL_GetTicksNS :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetTicksNS = hs_bindgen_47e2e360ac6e112d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_GetPerformanceCounter@
+foreign import ccall safe "hs_bindgen_e58f7e74d5dfd2f6"
+  hs_bindgen_e58f7e74d5dfd2f6_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_GetPerformanceCounter@
+hs_bindgen_e58f7e74d5dfd2f6 :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_e58f7e74d5dfd2f6 =
+  BG.fromFFIType hs_bindgen_e58f7e74d5dfd2f6_base
+
+-- | Get the current value of the high resolution counter.
+--
+--     This function is typically used for profiling.
+--
+--     The counter values are only meaningful relative to each other. Differences between values can be converted to times by using @SDL_GetPerformanceFrequency()@.
+--
+--     [Returns]: the current counter value.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPerformanceFrequency'
+--
+--     [C declaration]: @SDL_GetPerformanceCounter@, defined at @SDL3\/SDL_timer.h 232:36@
+sDL_GetPerformanceCounter :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetPerformanceCounter =
+  hs_bindgen_e58f7e74d5dfd2f6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_GetPerformanceFrequency@
+foreign import ccall safe "hs_bindgen_3a4825ac03082c11"
+  hs_bindgen_3a4825ac03082c11_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_GetPerformanceFrequency@
+hs_bindgen_3a4825ac03082c11 :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_3a4825ac03082c11 =
+  BG.fromFFIType hs_bindgen_3a4825ac03082c11_base
+
+-- | Get the count per second of the high resolution counter.
+--
+--     [Returns]: a platform-specific count per second.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPerformanceCounter'
+--
+--     [C declaration]: @SDL_GetPerformanceFrequency@, defined at @SDL3\/SDL_timer.h 245:36@
+sDL_GetPerformanceFrequency :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetPerformanceFrequency =
+  hs_bindgen_3a4825ac03082c11
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_Delay@
+foreign import ccall safe "hs_bindgen_8754cd6d3f04ccff"
+  hs_bindgen_8754cd6d3f04ccff_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_Delay@
+hs_bindgen_8754cd6d3f04ccff
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_8754cd6d3f04ccff =
+  BG.fromFFIType hs_bindgen_8754cd6d3f04ccff_base
+
+-- | Wait a specified number of milliseconds before returning.
+--
+--     This function waits a specified number of milliseconds before returning. It waits at least the specified time, but possibly longer due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DelayNS', 'sDL_DelayPrecise'
+--
+--     [C declaration]: @SDL_Delay@, defined at @SDL3\/SDL_timer.h 263:34@
+sDL_Delay
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@ms@]: the number of milliseconds to delay.
+  -> IO ()
+sDL_Delay = hs_bindgen_8754cd6d3f04ccff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_DelayNS@
+foreign import ccall safe "hs_bindgen_4581488a34fdd3e7"
+  hs_bindgen_4581488a34fdd3e7_base
+    :: BG.Word64
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_DelayNS@
+hs_bindgen_4581488a34fdd3e7
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO ()
+hs_bindgen_4581488a34fdd3e7 =
+  BG.fromFFIType hs_bindgen_4581488a34fdd3e7_base
+
+-- | Wait a specified number of nanoseconds before returning.
+--
+--     This function waits a specified number of nanoseconds before returning. It waits at least the specified time, but possibly longer due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Delay', 'sDL_DelayPrecise'
+--
+--     [C declaration]: @SDL_DelayNS@, defined at @SDL3\/SDL_timer.h 281:34@
+sDL_DelayNS
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@ns@]: the number of nanoseconds to delay.
+  -> IO ()
+sDL_DelayNS = hs_bindgen_4581488a34fdd3e7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_DelayPrecise@
+foreign import ccall safe "hs_bindgen_19457ba0f1d978a7"
+  hs_bindgen_19457ba0f1d978a7_base
+    :: BG.Word64
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_DelayPrecise@
+hs_bindgen_19457ba0f1d978a7
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO ()
+hs_bindgen_19457ba0f1d978a7 =
+  BG.fromFFIType hs_bindgen_19457ba0f1d978a7_base
+
+-- | Wait a specified number of nanoseconds before returning.
+--
+--     This function waits a specified number of nanoseconds before returning. It will attempt to wait as close to the requested time as possible, busy waiting if necessary, but could return later due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Delay', 'sDL_DelayNS'
+--
+--     [C declaration]: @SDL_DelayPrecise@, defined at @SDL3\/SDL_timer.h 299:34@
+sDL_DelayPrecise
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@ns@]: the number of nanoseconds to delay.
+  -> IO ()
+sDL_DelayPrecise = hs_bindgen_19457ba0f1d978a7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_AddTimer@
+foreign import ccall safe "hs_bindgen_1eb4863b9e459f9b"
+  hs_bindgen_1eb4863b9e459f9b_base
+    :: BG.Word32
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_AddTimer@
+hs_bindgen_1eb4863b9e459f9b
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL_TimerCallback
+  -> BG.Ptr BG.Void
+  -> IO SDL_TimerID
+hs_bindgen_1eb4863b9e459f9b =
+  BG.fromFFIType hs_bindgen_1eb4863b9e459f9b_base
+
+-- | Call a callback function at a future time.
+--
+--     The callback function is passed the current timer interval and the user supplied parameter from the @SDL_AddTimer()@ call and should return the next timer interval. If the value returned from the callback is 0, the timer is canceled and will be removed.
+--
+--     The callback is run on a separate thread, and for short timeouts can potentially be called before this function returns.
+--
+--     Timers take into account the amount of time it took to execute the callback. For example, if the callback took 250 ms to execute and returned 1000 (ms), the timer would only wait another 750 ms before its next iteration.
+--
+--     Timing may be inexact due to OS scheduling. Be sure to note the current time with @SDL_GetTicksNS()@ or @SDL_GetPerformanceCounter()@ in case your callback needs to adjust for variances.
+--
+--     [Returns]: a timer ID or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimerNS', 'sDL_RemoveTimer'
+--
+--     [C declaration]: @SDL_AddTimer@, defined at @SDL3\/SDL_timer.h 368:41@
+sDL_AddTimer
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@interval@]: the timer delay, in milliseconds, passed to @callback@.
+  -> SDL_TimerCallback
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_TimerCallback' function to call when the specified @interval@ elapses.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO SDL_TimerID
+sDL_AddTimer = hs_bindgen_1eb4863b9e459f9b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_AddTimerNS@
+foreign import ccall safe "hs_bindgen_04843533c2eea6bf"
+  hs_bindgen_04843533c2eea6bf_base
+    :: BG.Word64
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_AddTimerNS@
+hs_bindgen_04843533c2eea6bf
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> SDL_NSTimerCallback
+  -> BG.Ptr BG.Void
+  -> IO SDL_TimerID
+hs_bindgen_04843533c2eea6bf =
+  BG.fromFFIType hs_bindgen_04843533c2eea6bf_base
+
+-- | Call a callback function at a future time.
+--
+--     The callback function is passed the current timer interval and the user supplied parameter from the @SDL_AddTimerNS()@ call and should return the next timer interval. If the value returned from the callback is 0, the timer is canceled and will be removed.
+--
+--     The callback is run on a separate thread, and for short timeouts can potentially be called before this function returns.
+--
+--     Timers take into account the amount of time it took to execute the callback. For example, if the callback took 250 ns to execute and returned 1000 (ns), the timer would only wait another 750 ns before its next iteration.
+--
+--     Timing may be inexact due to OS scheduling. Be sure to note the current time with @SDL_GetTicksNS()@ or @SDL_GetPerformanceCounter()@ in case your callback needs to adjust for variances.
+--
+--     [Returns]: a timer ID or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimer', 'sDL_RemoveTimer'
+--
+--     [C declaration]: @SDL_AddTimerNS@, defined at @SDL3\/SDL_timer.h 430:41@
+sDL_AddTimerNS
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@interval@]: the timer delay, in nanoseconds, passed to @callback@.
+  -> SDL_NSTimerCallback
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_TimerCallback' function to call when the specified @interval@ elapses.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO SDL_TimerID
+sDL_AddTimerNS = hs_bindgen_04843533c2eea6bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_RemoveTimer@
+foreign import ccall safe "hs_bindgen_3794f4416b9527ed"
+  hs_bindgen_3794f4416b9527ed_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Safe_SDL_RemoveTimer@
+hs_bindgen_3794f4416b9527ed
+  :: SDL_TimerID
+  -> IO BG.CBool
+hs_bindgen_3794f4416b9527ed =
+  BG.fromFFIType hs_bindgen_3794f4416b9527ed_base
+
+-- | Remove a timer created with @SDL_AddTimer()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimer'
+--
+--     [C declaration]: @SDL_RemoveTimer@, defined at @SDL3\/SDL_timer.h 445:34@
+sDL_RemoveTimer
+  :: SDL_TimerID
+  -- ^
+  --
+  --           [@id@]: the ID of the timer to remove.
+  -> IO BG.CBool
+sDL_RemoveTimer = hs_bindgen_3794f4416b9527ed
diff --git a/src/SDL3/Sys/Bindgen/Timer/Unsafe.hs b/src/SDL3/Sys/Bindgen/Timer/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Timer/Unsafe.hs
@@ -0,0 +1,417 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Timer.Unsafe (
+  SDL3.Sys.Bindgen.Timer.Unsafe.sDL_GetTicks,
+  SDL3.Sys.Bindgen.Timer.Unsafe.sDL_GetTicksNS,
+  SDL3.Sys.Bindgen.Timer.Unsafe.sDL_GetPerformanceCounter,
+  SDL3.Sys.Bindgen.Timer.Unsafe.sDL_GetPerformanceFrequency,
+  SDL3.Sys.Bindgen.Timer.Unsafe.sDL_Delay,
+  SDL3.Sys.Bindgen.Timer.Unsafe.sDL_DelayNS,
+  SDL3.Sys.Bindgen.Timer.Unsafe.sDL_DelayPrecise,
+  SDL3.Sys.Bindgen.Timer.Unsafe.sDL_AddTimer,
+  SDL3.Sys.Bindgen.Timer.Unsafe.sDL_AddTimerNS,
+  SDL3.Sys.Bindgen.Timer.Unsafe.sDL_RemoveTimer,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Timer
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_timer.h>"
+         , "Uint64 hs_bindgen_048639750b48f695 (void)"
+         , "{"
+         , "  return (SDL_GetTicks)();"
+         , "}"
+         , "Uint64 hs_bindgen_5bd68dc01ceb08e8 (void)"
+         , "{"
+         , "  return (SDL_GetTicksNS)();"
+         , "}"
+         , "Uint64 hs_bindgen_8d8e0f9377cfcf7d (void)"
+         , "{"
+         , "  return (SDL_GetPerformanceCounter)();"
+         , "}"
+         , "Uint64 hs_bindgen_6775fe97a579d8be (void)"
+         , "{"
+         , "  return (SDL_GetPerformanceFrequency)();"
+         , "}"
+         , "void hs_bindgen_1b1b86e10ec2a52a ("
+         , "  Uint32 arg1"
+         , ")"
+         , "{"
+         , "  (SDL_Delay)(arg1);"
+         , "}"
+         , "void hs_bindgen_8bb71f8de5a6570c ("
+         , "  Uint64 arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DelayNS)(arg1);"
+         , "}"
+         , "void hs_bindgen_ec69e98c6a717d75 ("
+         , "  Uint64 arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DelayPrecise)(arg1);"
+         , "}"
+         , "SDL_TimerID hs_bindgen_14f66e216435c762 ("
+         , "  Uint32 arg1,"
+         , "  SDL_TimerCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_AddTimer)(arg1, arg2, arg3);"
+         , "}"
+         , "SDL_TimerID hs_bindgen_a0b2068e0ed2278f ("
+         , "  Uint64 arg1,"
+         , "  SDL_NSTimerCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_AddTimerNS)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_55aee2089fbaec7e ("
+         , "  SDL_TimerID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RemoveTimer)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_GetTicks@
+foreign import ccall unsafe "hs_bindgen_048639750b48f695"
+  hs_bindgen_048639750b48f695_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_GetTicks@
+hs_bindgen_048639750b48f695 :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_048639750b48f695 =
+  BG.fromFFIType hs_bindgen_048639750b48f695_base
+
+-- | Get the number of milliseconds that have elapsed since the SDL library initialization.
+--
+--     [Returns]: an unsigned 64‑bit integer that represents the number of milliseconds that have elapsed since the SDL library was initialized (typically via a call to SDL_Init).
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTicksNS'
+--
+--     [C declaration]: @SDL_GetTicks@, defined at @SDL3\/SDL_timer.h 201:36@
+sDL_GetTicks :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetTicks = hs_bindgen_048639750b48f695
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_GetTicksNS@
+foreign import ccall unsafe "hs_bindgen_5bd68dc01ceb08e8"
+  hs_bindgen_5bd68dc01ceb08e8_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_GetTicksNS@
+hs_bindgen_5bd68dc01ceb08e8 :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_5bd68dc01ceb08e8 =
+  BG.fromFFIType hs_bindgen_5bd68dc01ceb08e8_base
+
+-- | Get the number of nanoseconds since SDL library initialization.
+--
+--     [Returns]: an unsigned 64-bit value representing the number of nanoseconds since the SDL library initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTicksNS@, defined at @SDL3\/SDL_timer.h 213:36@
+sDL_GetTicksNS :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetTicksNS = hs_bindgen_5bd68dc01ceb08e8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_GetPerformanceCounter@
+foreign import ccall unsafe "hs_bindgen_8d8e0f9377cfcf7d"
+  hs_bindgen_8d8e0f9377cfcf7d_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_GetPerformanceCounter@
+hs_bindgen_8d8e0f9377cfcf7d :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_8d8e0f9377cfcf7d =
+  BG.fromFFIType hs_bindgen_8d8e0f9377cfcf7d_base
+
+-- | Get the current value of the high resolution counter.
+--
+--     This function is typically used for profiling.
+--
+--     The counter values are only meaningful relative to each other. Differences between values can be converted to times by using @SDL_GetPerformanceFrequency()@.
+--
+--     [Returns]: the current counter value.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPerformanceFrequency'
+--
+--     [C declaration]: @SDL_GetPerformanceCounter@, defined at @SDL3\/SDL_timer.h 232:36@
+sDL_GetPerformanceCounter :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetPerformanceCounter =
+  hs_bindgen_8d8e0f9377cfcf7d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_GetPerformanceFrequency@
+foreign import ccall unsafe "hs_bindgen_6775fe97a579d8be"
+  hs_bindgen_6775fe97a579d8be_base
+    :: IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_GetPerformanceFrequency@
+hs_bindgen_6775fe97a579d8be :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+hs_bindgen_6775fe97a579d8be =
+  BG.fromFFIType hs_bindgen_6775fe97a579d8be_base
+
+-- | Get the count per second of the high resolution counter.
+--
+--     [Returns]: a platform-specific count per second.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetPerformanceCounter'
+--
+--     [C declaration]: @SDL_GetPerformanceFrequency@, defined at @SDL3\/SDL_timer.h 245:36@
+sDL_GetPerformanceFrequency :: IO SDL3.Sys.Bindgen.Stdinc.Uint64
+sDL_GetPerformanceFrequency =
+  hs_bindgen_6775fe97a579d8be
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_Delay@
+foreign import ccall unsafe "hs_bindgen_1b1b86e10ec2a52a"
+  hs_bindgen_1b1b86e10ec2a52a_base
+    :: BG.Word32
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_Delay@
+hs_bindgen_1b1b86e10ec2a52a
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO ()
+hs_bindgen_1b1b86e10ec2a52a =
+  BG.fromFFIType hs_bindgen_1b1b86e10ec2a52a_base
+
+-- | Wait a specified number of milliseconds before returning.
+--
+--     This function waits a specified number of milliseconds before returning. It waits at least the specified time, but possibly longer due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DelayNS', 'sDL_DelayPrecise'
+--
+--     [C declaration]: @SDL_Delay@, defined at @SDL3\/SDL_timer.h 263:34@
+sDL_Delay
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@ms@]: the number of milliseconds to delay.
+  -> IO ()
+sDL_Delay = hs_bindgen_1b1b86e10ec2a52a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_DelayNS@
+foreign import ccall unsafe "hs_bindgen_8bb71f8de5a6570c"
+  hs_bindgen_8bb71f8de5a6570c_base
+    :: BG.Word64
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_DelayNS@
+hs_bindgen_8bb71f8de5a6570c
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO ()
+hs_bindgen_8bb71f8de5a6570c =
+  BG.fromFFIType hs_bindgen_8bb71f8de5a6570c_base
+
+-- | Wait a specified number of nanoseconds before returning.
+--
+--     This function waits a specified number of nanoseconds before returning. It waits at least the specified time, but possibly longer due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Delay', 'sDL_DelayPrecise'
+--
+--     [C declaration]: @SDL_DelayNS@, defined at @SDL3\/SDL_timer.h 281:34@
+sDL_DelayNS
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@ns@]: the number of nanoseconds to delay.
+  -> IO ()
+sDL_DelayNS = hs_bindgen_8bb71f8de5a6570c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_DelayPrecise@
+foreign import ccall unsafe "hs_bindgen_ec69e98c6a717d75"
+  hs_bindgen_ec69e98c6a717d75_base
+    :: BG.Word64
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_DelayPrecise@
+hs_bindgen_ec69e98c6a717d75
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> IO ()
+hs_bindgen_ec69e98c6a717d75 =
+  BG.fromFFIType hs_bindgen_ec69e98c6a717d75_base
+
+-- | Wait a specified number of nanoseconds before returning.
+--
+--     This function waits a specified number of nanoseconds before returning. It will attempt to wait as close to the requested time as possible, busy waiting if necessary, but could return later due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Delay', 'sDL_DelayNS'
+--
+--     [C declaration]: @SDL_DelayPrecise@, defined at @SDL3\/SDL_timer.h 299:34@
+sDL_DelayPrecise
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@ns@]: the number of nanoseconds to delay.
+  -> IO ()
+sDL_DelayPrecise = hs_bindgen_ec69e98c6a717d75
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_AddTimer@
+foreign import ccall unsafe "hs_bindgen_14f66e216435c762"
+  hs_bindgen_14f66e216435c762_base
+    :: BG.Word32
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_AddTimer@
+hs_bindgen_14f66e216435c762
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> SDL_TimerCallback
+  -> BG.Ptr BG.Void
+  -> IO SDL_TimerID
+hs_bindgen_14f66e216435c762 =
+  BG.fromFFIType hs_bindgen_14f66e216435c762_base
+
+-- | Call a callback function at a future time.
+--
+--     The callback function is passed the current timer interval and the user supplied parameter from the @SDL_AddTimer()@ call and should return the next timer interval. If the value returned from the callback is 0, the timer is canceled and will be removed.
+--
+--     The callback is run on a separate thread, and for short timeouts can potentially be called before this function returns.
+--
+--     Timers take into account the amount of time it took to execute the callback. For example, if the callback took 250 ms to execute and returned 1000 (ms), the timer would only wait another 750 ms before its next iteration.
+--
+--     Timing may be inexact due to OS scheduling. Be sure to note the current time with @SDL_GetTicksNS()@ or @SDL_GetPerformanceCounter()@ in case your callback needs to adjust for variances.
+--
+--     [Returns]: a timer ID or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimerNS', 'sDL_RemoveTimer'
+--
+--     [C declaration]: @SDL_AddTimer@, defined at @SDL3\/SDL_timer.h 368:41@
+sDL_AddTimer
+  :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@interval@]: the timer delay, in milliseconds, passed to @callback@.
+  -> SDL_TimerCallback
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_TimerCallback' function to call when the specified @interval@ elapses.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO SDL_TimerID
+sDL_AddTimer = hs_bindgen_14f66e216435c762
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_AddTimerNS@
+foreign import ccall unsafe "hs_bindgen_a0b2068e0ed2278f"
+  hs_bindgen_a0b2068e0ed2278f_base
+    :: BG.Word64
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_AddTimerNS@
+hs_bindgen_a0b2068e0ed2278f
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -> SDL_NSTimerCallback
+  -> BG.Ptr BG.Void
+  -> IO SDL_TimerID
+hs_bindgen_a0b2068e0ed2278f =
+  BG.fromFFIType hs_bindgen_a0b2068e0ed2278f_base
+
+-- | Call a callback function at a future time.
+--
+--     The callback function is passed the current timer interval and the user supplied parameter from the @SDL_AddTimerNS()@ call and should return the next timer interval. If the value returned from the callback is 0, the timer is canceled and will be removed.
+--
+--     The callback is run on a separate thread, and for short timeouts can potentially be called before this function returns.
+--
+--     Timers take into account the amount of time it took to execute the callback. For example, if the callback took 250 ns to execute and returned 1000 (ns), the timer would only wait another 750 ns before its next iteration.
+--
+--     Timing may be inexact due to OS scheduling. Be sure to note the current time with @SDL_GetTicksNS()@ or @SDL_GetPerformanceCounter()@ in case your callback needs to adjust for variances.
+--
+--     [Returns]: a timer ID or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimer', 'sDL_RemoveTimer'
+--
+--     [C declaration]: @SDL_AddTimerNS@, defined at @SDL3\/SDL_timer.h 430:41@
+sDL_AddTimerNS
+  :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@interval@]: the timer delay, in nanoseconds, passed to @callback@.
+  -> SDL_NSTimerCallback
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_TimerCallback' function to call when the specified @interval@ elapses.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO SDL_TimerID
+sDL_AddTimerNS = hs_bindgen_a0b2068e0ed2278f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_RemoveTimer@
+foreign import ccall unsafe "hs_bindgen_55aee2089fbaec7e"
+  hs_bindgen_55aee2089fbaec7e_base
+    :: BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Timer_Unsafe_SDL_RemoveTimer@
+hs_bindgen_55aee2089fbaec7e
+  :: SDL_TimerID
+  -> IO BG.CBool
+hs_bindgen_55aee2089fbaec7e =
+  BG.fromFFIType hs_bindgen_55aee2089fbaec7e_base
+
+-- | Remove a timer created with @SDL_AddTimer()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_AddTimer'
+--
+--     [C declaration]: @SDL_RemoveTimer@, defined at @SDL3\/SDL_timer.h 445:34@
+sDL_RemoveTimer
+  :: SDL_TimerID
+  -- ^
+  --
+  --           [@id@]: the ID of the timer to remove.
+  -> IO BG.CBool
+sDL_RemoveTimer = hs_bindgen_55aee2089fbaec7e
diff --git a/src/SDL3/Sys/Bindgen/Touch.hs b/src/SDL3/Sys/Bindgen/Touch.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Touch.hs
@@ -0,0 +1,429 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL offers touch input, on platforms that support it. It can manage multiple touch devices and track multiple fingers on those devices.
+--
+--     Touches are mostly dealt with through the event system, in the SDL_EVENT_FINGER_DOWN, SDL_EVENT_FINGER_MOTION, and SDL_EVENT_FINGER_UP events, but there are also functions to query for hardware details, etc.
+--
+--     The touch system, by default, will also send virtual mouse events; this can be useful for making a some desktop apps work on a phone without significant changes. For apps that care about mouse and touch input separately, they should ignore mouse events that have a @which@ field of SDL_TOUCH_MOUSEID. A unique ID for a touch device.
+--
+--     This ID is valid for the time the device is connected to the system, and is never reused for the lifetime of the application.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Touch (
+  SDL3.Sys.Bindgen.Touch.SDL_TouchID (..),
+  SDL3.Sys.Bindgen.Touch.SDL_FingerID (..),
+  SDL3.Sys.Bindgen.Touch.SDL_TouchDeviceType (..),
+  pattern SDL3.Sys.Bindgen.Touch.SDL_TOUCH_DEVICE_INVALID,
+  pattern SDL3.Sys.Bindgen.Touch.SDL_TOUCH_DEVICE_DIRECT,
+  pattern SDL3.Sys.Bindgen.Touch.SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE,
+  pattern SDL3.Sys.Bindgen.Touch.SDL_TOUCH_DEVICE_INDIRECT_RELATIVE,
+  SDL3.Sys.Bindgen.Touch.SDL_Finger (..),
+)
+where
+
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_TouchID@, defined at @SDL3\/SDL_touch.h 62:16@
+newtype SDL_TouchID = SDL_TouchID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "unwrap" SDL_TouchID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TouchID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TouchID "unwrap" where
+  type
+    CFieldType SDL_TouchID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 0
+
+-- | A unique ID for a single finger on a touch device.
+--
+--     This ID is valid for the time the finger (stylus, etc) is touching and will be unique for all fingers currently in contact, so this ID tracks the lifetime of a single continuous touch. This value may represent an index, a pointer, or some other unique ID, depending on the platform.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_FingerID@, defined at @SDL3\/SDL_touch.h 76:16@
+newtype SDL_FingerID = SDL_FingerID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "unwrap" SDL_FingerID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FingerID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "unwrap" (BG.Ptr SDL_FingerID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_FingerID "unwrap" where
+  type
+    CFieldType SDL_FingerID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 0
+
+-- | An enum that describes the type of a touch device.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_TouchDeviceType@, defined at @SDL3\/SDL_touch.h 83:14@
+newtype SDL_TouchDeviceType = SDL_TouchDeviceType
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_TouchDeviceType where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_TouchDeviceType where
+  readRaw =
+    \ptr0 ->
+      pure SDL_TouchDeviceType
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_TouchDeviceType where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_TouchDeviceType unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_TouchDeviceType instance BG.Storable SDL_TouchDeviceType
+
+deriving via BG.CInt instance BG.Prim SDL_TouchDeviceType
+
+instance CEnum.CEnum SDL_TouchDeviceType where
+  type CEnumZ SDL_TouchDeviceType = BG.CInt
+
+  toCEnum = SDL_TouchDeviceType
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_TOUCH_DEVICE_INVALID")
+        , (0, BG.singleton "SDL_TOUCH_DEVICE_DIRECT")
+        , (1, BG.singleton "SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE")
+        , (2, BG.singleton "SDL_TOUCH_DEVICE_INDIRECT_RELATIVE")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_TouchDeviceType"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_TouchDeviceType"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_TouchDeviceType where
+  minDeclaredValue = SDL_TOUCH_DEVICE_INVALID
+
+  maxDeclaredValue = SDL_TOUCH_DEVICE_INDIRECT_RELATIVE
+
+instance Show SDL_TouchDeviceType where
+  showsPrec = CEnum.shows
+
+instance Read SDL_TouchDeviceType where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_TouchDeviceType ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TouchDeviceType{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TouchDeviceType) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TouchDeviceType "unwrap" where
+  type
+    CFieldType SDL_TouchDeviceType "unwrap" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @SDL_TOUCH_DEVICE_INVALID@, defined at @SDL3\/SDL_touch.h 85:5@
+pattern SDL_TOUCH_DEVICE_INVALID :: SDL_TouchDeviceType
+pattern SDL_TOUCH_DEVICE_INVALID = SDL_TouchDeviceType (-1)
+
+-- | touch screen with window-relative coordinates
+--
+--     [C declaration]: @SDL_TOUCH_DEVICE_DIRECT@, defined at @SDL3\/SDL_touch.h 86:5@
+pattern SDL_TOUCH_DEVICE_DIRECT :: SDL_TouchDeviceType
+pattern SDL_TOUCH_DEVICE_DIRECT = SDL_TouchDeviceType 0
+
+-- | trackpad with absolute device coordinates
+--
+--     [C declaration]: @SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE@, defined at @SDL3\/SDL_touch.h 87:5@
+pattern SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE :: SDL_TouchDeviceType
+pattern SDL_TOUCH_DEVICE_INDIRECT_ABSOLUTE = SDL_TouchDeviceType 1
+
+-- | trackpad with screen cursor-relative coordinates
+--
+--     [C declaration]: @SDL_TOUCH_DEVICE_INDIRECT_RELATIVE@, defined at @SDL3\/SDL_touch.h 88:5@
+pattern SDL_TOUCH_DEVICE_INDIRECT_RELATIVE :: SDL_TouchDeviceType
+pattern SDL_TOUCH_DEVICE_INDIRECT_RELATIVE = SDL_TouchDeviceType 2
+
+-- | Data about a single finger in a multitouch event.
+--
+--     Each touch event is a collection of fingers that are simultaneously in contact with the touch device (so a \"touch\" can be a \"multitouch,\" in reality), and this struct reports details of the specific fingers.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTouchFingers'
+--
+--     [C declaration]: @struct SDL_Finger@, defined at @SDL3\/SDL_touch.h 102:16@
+data SDL_Finger = SDL_Finger
+  { id :: SDL_FingerID
+  -- ^ the finger ID
+  --
+  --          [C declaration]: @id@, defined at @SDL3\/SDL_touch.h 104:18@
+  , x :: BG.CFloat
+  -- ^ the x-axis location of the touch event, normalized (0...1)
+  --
+  --          [C declaration]: @x@, defined at @SDL3\/SDL_touch.h 105:11@
+  , y :: BG.CFloat
+  -- ^ the y-axis location of the touch event, normalized (0...1)
+  --
+  --          [C declaration]: @y@, defined at @SDL3\/SDL_touch.h 106:11@
+  , pressure :: BG.CFloat
+  -- ^ the quantity of pressure applied, normalized (0...1)
+  --
+  --          [C declaration]: @pressure@, defined at @SDL3\/SDL_touch.h 107:11@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_Finger where
+  staticSizeOf = \_ -> (24 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_Finger where
+  readRaw =
+    \ptr0 ->
+      pure SDL_Finger
+        <*> HasCField.readRaw (BG.Proxy @"id") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"x") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"y") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pressure") ptr0
+
+instance Marshal.WriteRaw SDL_Finger where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_Finger id2 x3 y4 pressure5 ->
+            HasCField.writeRaw (BG.Proxy @"id") ptr0 id2
+              >> HasCField.writeRaw (BG.Proxy @"x") ptr0 x3
+              >> HasCField.writeRaw (BG.Proxy @"y") ptr0 y4
+              >> HasCField.writeRaw (BG.Proxy @"pressure") ptr0 pressure5
+
+deriving via Marshal.EquivStorable SDL_Finger instance BG.Storable SDL_Finger
+
+instance
+  (ty ~ SDL_FingerID)
+  => BG.CompatHasField.HasField "id" SDL_Finger ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Finger
+            { id = y1
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"id" x0
+      )
+
+instance
+  (ty ~ SDL_FingerID)
+  => BG.HasField "id" (BG.Ptr SDL_Finger) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"id")
+
+instance HasCField.HasCField SDL_Finger "id" where
+  type CFieldType SDL_Finger "id" = SDL_FingerID
+
+  offset# = \_ -> \_ -> 0
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "x" SDL_Finger ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Finger
+            { x = y1
+            , id = BG.getField @"id" x0
+            , y = BG.getField @"y" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"x" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "x" (BG.Ptr SDL_Finger) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"x")
+
+instance HasCField.HasCField SDL_Finger "x" where
+  type CFieldType SDL_Finger "x" = BG.CFloat
+
+  offset# = \_ -> \_ -> 8
+
+instance (ty ~ BG.CFloat) => BG.CompatHasField.HasField "y" SDL_Finger ty where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Finger
+            { y = y1
+            , id = BG.getField @"id" x0
+            , x = BG.getField @"x" x0
+            , pressure = BG.getField @"pressure" x0
+            }
+      , BG.getField @"y" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "y" (BG.Ptr SDL_Finger) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"y")
+
+instance HasCField.HasCField SDL_Finger "y" where
+  type CFieldType SDL_Finger "y" = BG.CFloat
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "pressure" SDL_Finger ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_Finger
+            { pressure = y1
+            , id = BG.getField @"id" x0
+            , x = BG.getField @"x" x0
+            , y = BG.getField @"y" x0
+            }
+      , BG.getField @"pressure" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "pressure" (BG.Ptr SDL_Finger) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"pressure")
+
+instance HasCField.HasCField SDL_Finger "pressure" where
+  type CFieldType SDL_Finger "pressure" = BG.CFloat
+
+  offset# = \_ -> \_ -> 16
diff --git a/src/SDL3/Sys/Bindgen/Touch/FunPtr.hs b/src/SDL3/Sys/Bindgen/Touch/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Touch/FunPtr.hs
@@ -0,0 +1,161 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Touch.FunPtr (
+  SDL3.Sys.Bindgen.Touch.FunPtr.sDL_GetTouchDevices,
+  SDL3.Sys.Bindgen.Touch.FunPtr.sDL_GetTouchDeviceName,
+  SDL3.Sys.Bindgen.Touch.FunPtr.sDL_GetTouchDeviceType,
+  SDL3.Sys.Bindgen.Touch.FunPtr.sDL_GetTouchFingers,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Touch
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_touch.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchDevices */"
+         , "__attribute__ ((const))"
+         , "SDL_TouchID *(*hs_bindgen_d990cfdd3ce3b935 (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTouchDevices;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchDeviceName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_a221ea688dfb8835 (void)) ("
+         , "  SDL_TouchID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTouchDeviceName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchDeviceType */"
+         , "__attribute__ ((const))"
+         , "SDL_TouchDeviceType (*hs_bindgen_41907e6474c07d6d (void)) ("
+         , "  SDL_TouchID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTouchDeviceType;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchFingers */"
+         , "__attribute__ ((const))"
+         , "SDL_Finger **(*hs_bindgen_7edabe47405f9352 (void)) ("
+         , "  SDL_TouchID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTouchFingers;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchDevices@
+foreign import ccall unsafe "hs_bindgen_d990cfdd3ce3b935"
+  hs_bindgen_d990cfdd3ce3b935_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchDevices@
+hs_bindgen_d990cfdd3ce3b935 :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_TouchID)))
+hs_bindgen_d990cfdd3ce3b935 =
+  BG.fromFFIType hs_bindgen_d990cfdd3ce3b935_base
+
+{-# NOINLINE sDL_GetTouchDevices #-}
+
+-- | Get a list of registered touch devices.
+--
+--     On some platforms SDL first sees the touch device if it was actually used. Therefore the returned list might be empty, although devices are available. After using all devices at least once the number will be correct.
+--
+--     [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of touch device IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchDevices@, defined at @SDL3\/SDL_touch.h 140:43@
+sDL_GetTouchDevices :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_TouchID))
+sDL_GetTouchDevices =
+  BG.unsafePerformIO hs_bindgen_d990cfdd3ce3b935
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchDeviceName@
+foreign import ccall unsafe "hs_bindgen_a221ea688dfb8835"
+  hs_bindgen_a221ea688dfb8835_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchDeviceName@
+hs_bindgen_a221ea688dfb8835 :: IO (BG.FunPtr (SDL_TouchID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_a221ea688dfb8835 =
+  BG.fromFFIType hs_bindgen_a221ea688dfb8835_base
+
+{-# NOINLINE sDL_GetTouchDeviceName #-}
+
+-- | Get the touch device name as reported from the driver.
+--
+--     [@touchID@]: the touch device instance ID.
+--
+--     [Returns]: touch device name, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchDeviceName@, defined at @SDL3\/SDL_touch.h 151:42@
+sDL_GetTouchDeviceName :: BG.FunPtr (SDL_TouchID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetTouchDeviceName =
+  BG.unsafePerformIO hs_bindgen_a221ea688dfb8835
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchDeviceType@
+foreign import ccall unsafe "hs_bindgen_41907e6474c07d6d"
+  hs_bindgen_41907e6474c07d6d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchDeviceType@
+hs_bindgen_41907e6474c07d6d :: IO (BG.FunPtr (SDL_TouchID -> IO SDL_TouchDeviceType))
+hs_bindgen_41907e6474c07d6d =
+  BG.fromFFIType hs_bindgen_41907e6474c07d6d_base
+
+{-# NOINLINE sDL_GetTouchDeviceType #-}
+
+-- | Get the type of the given touch device.
+--
+--     [@touchID@]: the ID of a touch device.
+--
+--     [Returns]: touch device type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchDeviceType@, defined at @SDL3\/SDL_touch.h 161:49@
+sDL_GetTouchDeviceType :: BG.FunPtr (SDL_TouchID -> IO SDL_TouchDeviceType)
+sDL_GetTouchDeviceType =
+  BG.unsafePerformIO hs_bindgen_41907e6474c07d6d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchFingers@
+foreign import ccall unsafe "hs_bindgen_7edabe47405f9352"
+  hs_bindgen_7edabe47405f9352_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_get_SDL_GetTouchFingers@
+hs_bindgen_7edabe47405f9352
+  :: IO (BG.FunPtr (SDL_TouchID -> BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_Finger))))
+hs_bindgen_7edabe47405f9352 =
+  BG.fromFFIType hs_bindgen_7edabe47405f9352_base
+
+{-# NOINLINE sDL_GetTouchFingers #-}
+
+-- | Get a list of active fingers for a given touch device.
+--
+--     [@touchID@]: the ID of a touch device.
+--
+--     [@count@]: a pointer filled in with the number of fingers returned, can be NULL.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Finger' pointers or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchFingers@, defined at @SDL3\/SDL_touch.h 176:43@
+sDL_GetTouchFingers :: BG.FunPtr (SDL_TouchID -> BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_Finger)))
+sDL_GetTouchFingers =
+  BG.unsafePerformIO hs_bindgen_7edabe47405f9352
diff --git a/src/SDL3/Sys/Bindgen/Touch/Safe.hs b/src/SDL3/Sys/Bindgen/Touch/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Touch/Safe.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Touch.Safe (
+  SDL3.Sys.Bindgen.Touch.Safe.sDL_GetTouchDevices,
+  SDL3.Sys.Bindgen.Touch.Safe.sDL_GetTouchDeviceName,
+  SDL3.Sys.Bindgen.Touch.Safe.sDL_GetTouchDeviceType,
+  SDL3.Sys.Bindgen.Touch.Safe.sDL_GetTouchFingers,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Touch
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_touch.h>"
+         , "SDL_TouchID *hs_bindgen_5bb90a8e6a2a7744 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTouchDevices)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_8215300124d28f2f ("
+         , "  SDL_TouchID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTouchDeviceName)(arg1);"
+         , "}"
+         , "SDL_TouchDeviceType hs_bindgen_a494e81cbe4e8c2f ("
+         , "  SDL_TouchID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTouchDeviceType)(arg1);"
+         , "}"
+         , "SDL_Finger **hs_bindgen_ea3a929a9ac35739 ("
+         , "  SDL_TouchID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTouchFingers)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Safe_SDL_GetTouchDevices@
+foreign import ccall safe "hs_bindgen_5bb90a8e6a2a7744"
+  hs_bindgen_5bb90a8e6a2a7744_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Safe_SDL_GetTouchDevices@
+hs_bindgen_5bb90a8e6a2a7744
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_TouchID)
+hs_bindgen_5bb90a8e6a2a7744 =
+  BG.fromFFIType hs_bindgen_5bb90a8e6a2a7744_base
+
+-- | Get a list of registered touch devices.
+--
+--     On some platforms SDL first sees the touch device if it was actually used. Therefore the returned list might be empty, although devices are available. After using all devices at least once the number will be correct.
+--
+--     [Returns]: a 0 terminated array of touch device IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchDevices@, defined at @SDL3\/SDL_touch.h 140:43@
+sDL_GetTouchDevices
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_TouchID)
+sDL_GetTouchDevices = hs_bindgen_5bb90a8e6a2a7744
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Safe_SDL_GetTouchDeviceName@
+foreign import ccall safe "hs_bindgen_8215300124d28f2f"
+  hs_bindgen_8215300124d28f2f_base
+    :: BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Safe_SDL_GetTouchDeviceName@
+hs_bindgen_8215300124d28f2f
+  :: SDL_TouchID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_8215300124d28f2f =
+  BG.fromFFIType hs_bindgen_8215300124d28f2f_base
+
+-- | Get the touch device name as reported from the driver.
+--
+--     [Returns]: touch device name, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchDeviceName@, defined at @SDL3\/SDL_touch.h 151:42@
+sDL_GetTouchDeviceName
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the touch device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetTouchDeviceName = hs_bindgen_8215300124d28f2f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Safe_SDL_GetTouchDeviceType@
+foreign import ccall safe "hs_bindgen_a494e81cbe4e8c2f"
+  hs_bindgen_a494e81cbe4e8c2f_base
+    :: BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Safe_SDL_GetTouchDeviceType@
+hs_bindgen_a494e81cbe4e8c2f
+  :: SDL_TouchID
+  -> IO SDL_TouchDeviceType
+hs_bindgen_a494e81cbe4e8c2f =
+  BG.fromFFIType hs_bindgen_a494e81cbe4e8c2f_base
+
+-- | Get the type of the given touch device.
+--
+--     [Returns]: touch device type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchDeviceType@, defined at @SDL3\/SDL_touch.h 161:49@
+sDL_GetTouchDeviceType
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the ID of a touch device.
+  -> IO SDL_TouchDeviceType
+sDL_GetTouchDeviceType = hs_bindgen_a494e81cbe4e8c2f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Safe_SDL_GetTouchFingers@
+foreign import ccall safe "hs_bindgen_ea3a929a9ac35739"
+  hs_bindgen_ea3a929a9ac35739_base
+    :: BG.Word64
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Safe_SDL_GetTouchFingers@
+hs_bindgen_ea3a929a9ac35739
+  :: SDL_TouchID
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_Finger))
+hs_bindgen_ea3a929a9ac35739 =
+  BG.fromFFIType hs_bindgen_ea3a929a9ac35739_base
+
+-- | Get a list of active fingers for a given touch device.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Finger' pointers or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchFingers@, defined at @SDL3\/SDL_touch.h 176:43@
+sDL_GetTouchFingers
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the ID of a touch device.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of fingers returned, can be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Finger))
+sDL_GetTouchFingers = hs_bindgen_ea3a929a9ac35739
diff --git a/src/SDL3/Sys/Bindgen/Touch/Unsafe.hs b/src/SDL3/Sys/Bindgen/Touch/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Touch/Unsafe.hs
@@ -0,0 +1,168 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Touch.Unsafe (
+  SDL3.Sys.Bindgen.Touch.Unsafe.sDL_GetTouchDevices,
+  SDL3.Sys.Bindgen.Touch.Unsafe.sDL_GetTouchDeviceName,
+  SDL3.Sys.Bindgen.Touch.Unsafe.sDL_GetTouchDeviceType,
+  SDL3.Sys.Bindgen.Touch.Unsafe.sDL_GetTouchFingers,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Touch
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_touch.h>"
+         , "SDL_TouchID *hs_bindgen_adf35ae251419f33 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTouchDevices)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_abb682109ef47145 ("
+         , "  SDL_TouchID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTouchDeviceName)(arg1);"
+         , "}"
+         , "SDL_TouchDeviceType hs_bindgen_bba2e3647e7dd111 ("
+         , "  SDL_TouchID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTouchDeviceType)(arg1);"
+         , "}"
+         , "SDL_Finger **hs_bindgen_645cd3b208b9edce ("
+         , "  SDL_TouchID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTouchFingers)(arg1, arg2);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Unsafe_SDL_GetTouchDevices@
+foreign import ccall unsafe "hs_bindgen_adf35ae251419f33"
+  hs_bindgen_adf35ae251419f33_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Unsafe_SDL_GetTouchDevices@
+hs_bindgen_adf35ae251419f33
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_TouchID)
+hs_bindgen_adf35ae251419f33 =
+  BG.fromFFIType hs_bindgen_adf35ae251419f33_base
+
+-- | Get a list of registered touch devices.
+--
+--     On some platforms SDL first sees the touch device if it was actually used. Therefore the returned list might be empty, although devices are available. After using all devices at least once the number will be correct.
+--
+--     [Returns]: a 0 terminated array of touch device IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchDevices@, defined at @SDL3\/SDL_touch.h 140:43@
+sDL_GetTouchDevices
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_TouchID)
+sDL_GetTouchDevices = hs_bindgen_adf35ae251419f33
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Unsafe_SDL_GetTouchDeviceName@
+foreign import ccall unsafe "hs_bindgen_abb682109ef47145"
+  hs_bindgen_abb682109ef47145_base
+    :: BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Unsafe_SDL_GetTouchDeviceName@
+hs_bindgen_abb682109ef47145
+  :: SDL_TouchID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_abb682109ef47145 =
+  BG.fromFFIType hs_bindgen_abb682109ef47145_base
+
+-- | Get the touch device name as reported from the driver.
+--
+--     [Returns]: touch device name, or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchDeviceName@, defined at @SDL3\/SDL_touch.h 151:42@
+sDL_GetTouchDeviceName
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the touch device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetTouchDeviceName = hs_bindgen_abb682109ef47145
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Unsafe_SDL_GetTouchDeviceType@
+foreign import ccall unsafe "hs_bindgen_bba2e3647e7dd111"
+  hs_bindgen_bba2e3647e7dd111_base
+    :: BG.Word64
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Unsafe_SDL_GetTouchDeviceType@
+hs_bindgen_bba2e3647e7dd111
+  :: SDL_TouchID
+  -> IO SDL_TouchDeviceType
+hs_bindgen_bba2e3647e7dd111 =
+  BG.fromFFIType hs_bindgen_bba2e3647e7dd111_base
+
+-- | Get the type of the given touch device.
+--
+--     [Returns]: touch device type.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchDeviceType@, defined at @SDL3\/SDL_touch.h 161:49@
+sDL_GetTouchDeviceType
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the ID of a touch device.
+  -> IO SDL_TouchDeviceType
+sDL_GetTouchDeviceType = hs_bindgen_bba2e3647e7dd111
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Unsafe_SDL_GetTouchFingers@
+foreign import ccall unsafe "hs_bindgen_645cd3b208b9edce"
+  hs_bindgen_645cd3b208b9edce_base
+    :: BG.Word64
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Touch_Unsafe_SDL_GetTouchFingers@
+hs_bindgen_645cd3b208b9edce
+  :: SDL_TouchID
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_Finger))
+hs_bindgen_645cd3b208b9edce =
+  BG.fromFFIType hs_bindgen_645cd3b208b9edce_base
+
+-- | Get a list of active fingers for a given touch device.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Finger' pointers or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetTouchFingers@, defined at @SDL3\/SDL_touch.h 176:43@
+sDL_GetTouchFingers
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the ID of a touch device.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of fingers returned, can be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Finger))
+sDL_GetTouchFingers = hs_bindgen_645cd3b208b9edce
diff --git a/src/SDL3/Sys/Bindgen/Tray.hs b/src/SDL3/Sys/Bindgen/Tray.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Tray.hs
@@ -0,0 +1,259 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL offers a way to add items to the \"system tray\" (more correctly called the \"notification area\" on Windows). On platforms that offer this concept, an SDL app can add a tray icon, submenus, checkboxes, and clickable entries, and register a callback that is fired when the user clicks on these pieces. An opaque handle representing a toplevel system tray object.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Tray (
+  SDL3.Sys.Bindgen.Tray.SDL_Tray,
+  SDL3.Sys.Bindgen.Tray.SDL_TrayMenu,
+  SDL3.Sys.Bindgen.Tray.SDL_TrayEntry,
+  SDL3.Sys.Bindgen.Tray.SDL_TrayEntryFlags (..),
+  SDL3.Sys.Bindgen.Tray.sDL_TRAYENTRY_BUTTON,
+  SDL3.Sys.Bindgen.Tray.sDL_TRAYENTRY_CHECKBOX,
+  SDL3.Sys.Bindgen.Tray.sDL_TRAYENTRY_SUBMENU,
+  SDL3.Sys.Bindgen.Tray.sDL_TRAYENTRY_DISABLED,
+  SDL3.Sys.Bindgen.Tray.sDL_TRAYENTRY_CHECKED,
+  SDL3.Sys.Bindgen.Tray.SDL_TrayCallback_Aux (..),
+  SDL3.Sys.Bindgen.Tray.SDL_TrayCallback (..),
+)
+where
+
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @struct SDL_Tray@, defined at @SDL3\/SDL_tray.h 51:16@
+data SDL_Tray
+
+-- | An opaque handle representing a menu\/submenu on a system tray object.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_TrayMenu@, defined at @SDL3\/SDL_tray.h 58:16@
+data SDL_TrayMenu
+
+-- | An opaque handle representing an entry on a system tray object.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @struct SDL_TrayEntry@, defined at @SDL3\/SDL_tray.h 65:16@
+data SDL_TrayEntry
+
+-- | Flags that control the creation of system tray entries.
+--
+--     Some of these flags are required; exactly one of them must be specified at the time a tray entry is created. Other flags are optional; zero or more of those can be OR\'ed together with the required flag.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_TrayEntryFlags@, defined at @SDL3\/SDL_tray.h 78:16@
+newtype SDL_TrayEntryFlags = SDL_TrayEntryFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_TrayEntryFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TrayEntryFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TrayEntryFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TrayEntryFlags "unwrap" where
+  type
+    CFieldType SDL_TrayEntryFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | Make the entry a simple button. Required.
+--
+--     [C declaration]: @macro SDL_TRAYENTRY_BUTTON@, defined at @SDL3\/SDL_tray.h 80:9@
+sDL_TRAYENTRY_BUTTON :: BG.CUInt
+sDL_TRAYENTRY_BUTTON = (1 :: BG.CUInt)
+
+-- | Make the entry a checkbox. Required.
+--
+--     [C declaration]: @macro SDL_TRAYENTRY_CHECKBOX@, defined at @SDL3\/SDL_tray.h 81:9@
+sDL_TRAYENTRY_CHECKBOX :: BG.CUInt
+sDL_TRAYENTRY_CHECKBOX = (2 :: BG.CUInt)
+
+-- | Prepare the entry to have a submenu. Required
+--
+--     [C declaration]: @macro SDL_TRAYENTRY_SUBMENU@, defined at @SDL3\/SDL_tray.h 82:9@
+sDL_TRAYENTRY_SUBMENU :: BG.CUInt
+sDL_TRAYENTRY_SUBMENU = (4 :: BG.CUInt)
+
+-- | Make the entry disabled. Optional.
+--
+--     [C declaration]: @macro SDL_TRAYENTRY_DISABLED@, defined at @SDL3\/SDL_tray.h 83:9@
+sDL_TRAYENTRY_DISABLED :: BG.CUInt
+sDL_TRAYENTRY_DISABLED = (2147483648 :: BG.CUInt)
+
+-- | Make the entry checked. This is valid only for checkboxes. Optional.
+--
+--     [C declaration]: @macro SDL_TRAYENTRY_CHECKED@, defined at @SDL3\/SDL_tray.h 84:9@
+sDL_TRAYENTRY_CHECKED :: BG.CUInt
+sDL_TRAYENTRY_CHECKED = (1073741824 :: BG.CUInt)
+
+-- | Auxiliary type used by 'SDL_TrayCallback'
+--
+--     [C declaration]: @SDL_TrayCallback@, defined at @SDL3\/SDL_tray.h 97:24@
+newtype SDL_TrayCallback_Aux = SDL_TrayCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> BG.Ptr SDL_TrayEntry -> IO ()
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_TrayCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_6a8b13b7097ccaf5_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ())
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ()))
+
+-- __unique:__ @toSDL_TrayCallback_Aux@
+hs_bindgen_6a8b13b7097ccaf5
+  :: SDL_TrayCallback_Aux
+  -> IO (BG.FunPtr SDL_TrayCallback_Aux)
+hs_bindgen_6a8b13b7097ccaf5 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_6a8b13b7097ccaf5_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_TrayCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_0aa010ee3dd2ffa9_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO ())
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @fromSDL_TrayCallback_Aux@
+hs_bindgen_0aa010ee3dd2ffa9
+  :: BG.FunPtr SDL_TrayCallback_Aux
+  -> SDL_TrayCallback_Aux
+hs_bindgen_0aa010ee3dd2ffa9 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_0aa010ee3dd2ffa9_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_TrayCallback_Aux where
+  toFunPtr = hs_bindgen_6a8b13b7097ccaf5
+
+instance BG.FromFunPtr SDL_TrayCallback_Aux where
+  fromFunPtr = hs_bindgen_0aa010ee3dd2ffa9
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr SDL_TrayEntry -> IO ()))
+  => BG.CompatHasField.HasField "unwrap" SDL_TrayCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TrayCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> BG.Ptr SDL_TrayEntry -> IO ()))
+  => BG.HasField "unwrap" (BG.Ptr SDL_TrayCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TrayCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_TrayCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> BG.Ptr SDL_TrayEntry -> IO ()
+
+  offset# = \_ -> \_ -> 0
+
+-- | A callback that is invoked when a tray entry is selected.
+--
+--     [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+--
+--     [@entry@]: the tray entry that was selected.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetTrayEntryCallback'
+--
+--     [C declaration]: @SDL_TrayCallback@, defined at @SDL3\/SDL_tray.h 97:24@
+newtype SDL_TrayCallback = SDL_TrayCallback
+  { unwrap :: BG.FunPtr SDL_TrayCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_TrayCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_TrayCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_TrayCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_TrayCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_TrayCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_TrayCallback "unwrap" where
+  type
+    CFieldType SDL_TrayCallback "unwrap" =
+      BG.FunPtr SDL_TrayCallback_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Tray/FunPtr.hs b/src/SDL3/Sys/Bindgen/Tray/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Tray/FunPtr.hs
@@ -0,0 +1,982 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Tray.FunPtr (
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_CreateTray,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_SetTrayIcon,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_SetTrayTooltip,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_CreateTrayMenu,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_CreateTraySubmenu,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_GetTrayMenu,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_GetTraySubmenu,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_GetTrayEntries,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_RemoveTrayEntry,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_InsertTrayEntryAt,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_SetTrayEntryLabel,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_GetTrayEntryLabel,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_SetTrayEntryChecked,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_GetTrayEntryChecked,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_SetTrayEntryEnabled,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_GetTrayEntryEnabled,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_SetTrayEntryCallback,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_ClickTrayEntry,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_DestroyTray,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_GetTrayEntryParent,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_GetTrayMenuParentEntry,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_GetTrayMenuParentTray,
+  SDL3.Sys.Bindgen.Tray.FunPtr.sDL_UpdateTrays,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Tray
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_tray.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_CreateTray */"
+         , "__attribute__ ((const))"
+         , "SDL_Tray *(*hs_bindgen_e0b641cea81dd78b (void)) ("
+         , "  SDL_Surface *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateTray;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayIcon */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_4c9964d8c06580ec (void)) ("
+         , "  SDL_Tray *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTrayIcon;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayTooltip */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_783d3d9ca84c197c (void)) ("
+         , "  SDL_Tray *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTrayTooltip;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_CreateTrayMenu */"
+         , "__attribute__ ((const))"
+         , "SDL_TrayMenu *(*hs_bindgen_e6418e186102af71 (void)) ("
+         , "  SDL_Tray *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateTrayMenu;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_CreateTraySubmenu */"
+         , "__attribute__ ((const))"
+         , "SDL_TrayMenu *(*hs_bindgen_7979c3b75512dd28 (void)) ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateTraySubmenu;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayMenu */"
+         , "__attribute__ ((const))"
+         , "SDL_TrayMenu *(*hs_bindgen_487b4a68acb6ce70 (void)) ("
+         , "  SDL_Tray *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTrayMenu;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTraySubmenu */"
+         , "__attribute__ ((const))"
+         , "SDL_TrayMenu *(*hs_bindgen_fa3f90a24097169c (void)) ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTraySubmenu;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntries */"
+         , "__attribute__ ((const))"
+         , "SDL_TrayEntry const **(*hs_bindgen_924f686f0f9c486a (void)) ("
+         , "  SDL_TrayMenu *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTrayEntries;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_RemoveTrayEntry */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_207a05e5b588636c (void)) ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RemoveTrayEntry;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_InsertTrayEntryAt */"
+         , "__attribute__ ((const))"
+         , "SDL_TrayEntry *(*hs_bindgen_4f1eb15eda9eecc5 (void)) ("
+         , "  SDL_TrayMenu *arg1,"
+         , "  signed int arg2,"
+         , "  char const *arg3,"
+         , "  SDL_TrayEntryFlags arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_InsertTrayEntryAt;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryLabel */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_db2f3045cf28b5d5 (void)) ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTrayEntryLabel;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryLabel */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_f9b74cb4f55c043f (void)) ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTrayEntryLabel;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryChecked */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_815ad50438649e5d (void)) ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTrayEntryChecked;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryChecked */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_89a7fa670bbdd4aa (void)) ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTrayEntryChecked;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryEnabled */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_d2ae14ecd73c137a (void)) ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTrayEntryEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryEnabled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_aacde4500657f4c0 (void)) ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTrayEntryEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryCallback */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_624772d3d1eca5e3 (void)) ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  SDL_TrayCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetTrayEntryCallback;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_ClickTrayEntry */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_7aff8a582dc1af42 (void)) ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ClickTrayEntry;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_DestroyTray */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_ac5647a4ad9aa76d (void)) ("
+         , "  SDL_Tray *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyTray;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryParent */"
+         , "__attribute__ ((const))"
+         , "SDL_TrayMenu *(*hs_bindgen_14c614d00cef77fa (void)) ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTrayEntryParent;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayMenuParentEntry */"
+         , "__attribute__ ((const))"
+         , "SDL_TrayEntry *(*hs_bindgen_5521b8512f50cc76 (void)) ("
+         , "  SDL_TrayMenu *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTrayMenuParentEntry;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayMenuParentTray */"
+         , "__attribute__ ((const))"
+         , "SDL_Tray *(*hs_bindgen_43523d65356b241b (void)) ("
+         , "  SDL_TrayMenu *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetTrayMenuParentTray;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_UpdateTrays */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_108816203a48fe42 (void)) (void)"
+         , "{"
+         , "  return &SDL_UpdateTrays;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_CreateTray@
+foreign import ccall unsafe "hs_bindgen_e0b641cea81dd78b"
+  hs_bindgen_e0b641cea81dd78b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_CreateTray@
+hs_bindgen_e0b641cea81dd78b
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Tray))
+       )
+hs_bindgen_e0b641cea81dd78b =
+  BG.fromFFIType hs_bindgen_e0b641cea81dd78b_base
+
+{-# NOINLINE sDL_CreateTray #-}
+
+-- | Create an icon to be placed in the operating system\'s tray, or equivalent.
+--
+--     Many platforms advise not using a system tray unless persistence is a necessary feature. Avoid needlessly creating a tray icon, as the user may feel like it clutters their interface.
+--
+--     Using tray icons require the video subsystem.
+--
+--     [@icon@]: a surface to be used as icon. May be NULL.
+--
+--     [@tooltip@]: a tooltip to be displayed when the mouse hovers the icon in UTF-8 encoding. Not supported on all platforms. May be NULL.
+--
+--     [Returns]: The newly created system tray icon.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTrayMenu', 'sDL_GetTrayMenu', 'sDL_DestroyTray'
+--
+--     [C declaration]: @SDL_CreateTray@, defined at @SDL3\/SDL_tray.h 121:40@
+sDL_CreateTray
+  :: BG.FunPtr
+       (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> PtrConst.PtrConst BG.CChar -> IO (BG.Ptr SDL_Tray))
+sDL_CreateTray =
+  BG.unsafePerformIO hs_bindgen_e0b641cea81dd78b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayIcon@
+foreign import ccall unsafe "hs_bindgen_4c9964d8c06580ec"
+  hs_bindgen_4c9964d8c06580ec_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayIcon@
+hs_bindgen_4c9964d8c06580ec
+  :: IO (BG.FunPtr (BG.Ptr SDL_Tray -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO ()))
+hs_bindgen_4c9964d8c06580ec =
+  BG.fromFFIType hs_bindgen_4c9964d8c06580ec_base
+
+{-# NOINLINE sDL_SetTrayIcon #-}
+
+-- | Updates the system tray icon\'s icon.
+--
+--     [@tray@]: the tray icon to be updated.
+--
+--     [@icon@]: the new icon. May be NULL.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray'
+--
+--     [C declaration]: @SDL_SetTrayIcon@, defined at @SDL3\/SDL_tray.h 136:34@
+sDL_SetTrayIcon
+  :: BG.FunPtr (BG.Ptr SDL_Tray -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO ())
+sDL_SetTrayIcon =
+  BG.unsafePerformIO hs_bindgen_4c9964d8c06580ec
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayTooltip@
+foreign import ccall unsafe "hs_bindgen_783d3d9ca84c197c"
+  hs_bindgen_783d3d9ca84c197c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayTooltip@
+hs_bindgen_783d3d9ca84c197c
+  :: IO (BG.FunPtr (BG.Ptr SDL_Tray -> PtrConst.PtrConst BG.CChar -> IO ()))
+hs_bindgen_783d3d9ca84c197c =
+  BG.fromFFIType hs_bindgen_783d3d9ca84c197c_base
+
+{-# NOINLINE sDL_SetTrayTooltip #-}
+
+-- | Updates the system tray icon\'s tooltip.
+--
+--     [@tray@]: the tray icon to be updated.
+--
+--     [@tooltip@]: the new tooltip in UTF-8 encoding. May be NULL.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray'
+--
+--     [C declaration]: @SDL_SetTrayTooltip@, defined at @SDL3\/SDL_tray.h 151:34@
+sDL_SetTrayTooltip :: BG.FunPtr (BG.Ptr SDL_Tray -> PtrConst.PtrConst BG.CChar -> IO ())
+sDL_SetTrayTooltip =
+  BG.unsafePerformIO hs_bindgen_783d3d9ca84c197c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_CreateTrayMenu@
+foreign import ccall unsafe "hs_bindgen_e6418e186102af71"
+  hs_bindgen_e6418e186102af71_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_CreateTrayMenu@
+hs_bindgen_e6418e186102af71 :: IO (BG.FunPtr (BG.Ptr SDL_Tray -> IO (BG.Ptr SDL_TrayMenu)))
+hs_bindgen_e6418e186102af71 =
+  BG.fromFFIType hs_bindgen_e6418e186102af71_base
+
+{-# NOINLINE sDL_CreateTrayMenu #-}
+
+-- | Create a menu for a system tray.
+--
+--     This should be called at most once per tray icon.
+--
+--     This function does the same thing as @SDL_CreateTraySubmenu()@, except that it takes a 'SDL_Tray' instead of a 'SDL_TrayEntry'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [@tray@]: the tray to bind the menu to.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray', 'sDL_GetTrayMenu', 'sDL_GetTrayMenuParentTray'
+--
+--     [C declaration]: @SDL_CreateTrayMenu@, defined at @SDL3\/SDL_tray.h 175:44@
+sDL_CreateTrayMenu :: BG.FunPtr (BG.Ptr SDL_Tray -> IO (BG.Ptr SDL_TrayMenu))
+sDL_CreateTrayMenu =
+  BG.unsafePerformIO hs_bindgen_e6418e186102af71
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_CreateTraySubmenu@
+foreign import ccall unsafe "hs_bindgen_7979c3b75512dd28"
+  hs_bindgen_7979c3b75512dd28_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_CreateTraySubmenu@
+hs_bindgen_7979c3b75512dd28 :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO (BG.Ptr SDL_TrayMenu)))
+hs_bindgen_7979c3b75512dd28 =
+  BG.fromFFIType hs_bindgen_7979c3b75512dd28_base
+
+{-# NOINLINE sDL_CreateTraySubmenu #-}
+
+-- | Create a submenu for a system tray entry.
+--
+--     This should be called at most once per tray entry.
+--
+--     This function does the same thing as SDL_CreateTrayMenu, except that it takes a 'SDL_TrayEntry' instead of a 'SDL_Tray'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [@entry@]: the tray entry to bind the menu to.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InsertTrayEntryAt', 'sDL_GetTraySubmenu', 'sDL_GetTrayMenuParentEntry'
+--
+--     [C declaration]: @SDL_CreateTraySubmenu@, defined at @SDL3\/SDL_tray.h 199:44@
+sDL_CreateTraySubmenu :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO (BG.Ptr SDL_TrayMenu))
+sDL_CreateTraySubmenu =
+  BG.unsafePerformIO hs_bindgen_7979c3b75512dd28
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayMenu@
+foreign import ccall unsafe "hs_bindgen_487b4a68acb6ce70"
+  hs_bindgen_487b4a68acb6ce70_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayMenu@
+hs_bindgen_487b4a68acb6ce70 :: IO (BG.FunPtr (BG.Ptr SDL_Tray -> IO (BG.Ptr SDL_TrayMenu)))
+hs_bindgen_487b4a68acb6ce70 =
+  BG.fromFFIType hs_bindgen_487b4a68acb6ce70_base
+
+{-# NOINLINE sDL_GetTrayMenu #-}
+
+-- | Gets a previously created tray menu.
+--
+--     You should have called @SDL_CreateTrayMenu()@ on the tray object. This function allows you to fetch it again later.
+--
+--     This function does the same thing as @SDL_GetTraySubmenu()@, except that it takes a 'SDL_Tray' instead of a 'SDL_TrayEntry'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [@tray@]: the tray entry to bind the menu to.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray', 'sDL_CreateTrayMenu'
+--
+--     [C declaration]: @SDL_GetTrayMenu@, defined at @SDL3\/SDL_tray.h 223:44@
+sDL_GetTrayMenu :: BG.FunPtr (BG.Ptr SDL_Tray -> IO (BG.Ptr SDL_TrayMenu))
+sDL_GetTrayMenu =
+  BG.unsafePerformIO hs_bindgen_487b4a68acb6ce70
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTraySubmenu@
+foreign import ccall unsafe "hs_bindgen_fa3f90a24097169c"
+  hs_bindgen_fa3f90a24097169c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTraySubmenu@
+hs_bindgen_fa3f90a24097169c :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO (BG.Ptr SDL_TrayMenu)))
+hs_bindgen_fa3f90a24097169c =
+  BG.fromFFIType hs_bindgen_fa3f90a24097169c_base
+
+{-# NOINLINE sDL_GetTraySubmenu #-}
+
+-- | Gets a previously created tray entry submenu.
+--
+--     You should have called @SDL_CreateTraySubmenu()@ on the entry object. This function allows you to fetch it again later.
+--
+--     This function does the same thing as @SDL_GetTrayMenu()@, except that it takes a 'SDL_TrayEntry' instead of a 'SDL_Tray'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [@entry@]: the tray entry to bind the menu to.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InsertTrayEntryAt', 'sDL_CreateTraySubmenu'
+--
+--     [C declaration]: @SDL_GetTraySubmenu@, defined at @SDL3\/SDL_tray.h 247:44@
+sDL_GetTraySubmenu :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO (BG.Ptr SDL_TrayMenu))
+sDL_GetTraySubmenu =
+  BG.unsafePerformIO hs_bindgen_fa3f90a24097169c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntries@
+foreign import ccall unsafe "hs_bindgen_924f686f0f9c486a"
+  hs_bindgen_924f686f0f9c486a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntries@
+hs_bindgen_924f686f0f9c486a
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_TrayMenu -> BG.Ptr BG.CInt -> IO (BG.Ptr (PtrConst.PtrConst SDL_TrayEntry))))
+hs_bindgen_924f686f0f9c486a =
+  BG.fromFFIType hs_bindgen_924f686f0f9c486a_base
+
+{-# NOINLINE sDL_GetTrayEntries #-}
+
+-- | Returns a list of entries in the menu, in order.
+--
+--     [@menu@]: The menu to get entries from.
+--
+--     [@count@]: An optional pointer to obtain the number of entries in the menu.
+--
+--     [Returns]: a NULL-terminated list of entries within the given menu. The pointer becomes invalid when any function that inserts or deletes entries in the menu is called.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveTrayEntry', 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_GetTrayEntries@, defined at @SDL3\/SDL_tray.h 267:52@
+sDL_GetTrayEntries
+  :: BG.FunPtr (BG.Ptr SDL_TrayMenu -> BG.Ptr BG.CInt -> IO (BG.Ptr (PtrConst.PtrConst SDL_TrayEntry)))
+sDL_GetTrayEntries =
+  BG.unsafePerformIO hs_bindgen_924f686f0f9c486a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_RemoveTrayEntry@
+foreign import ccall unsafe "hs_bindgen_207a05e5b588636c"
+  hs_bindgen_207a05e5b588636c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_RemoveTrayEntry@
+hs_bindgen_207a05e5b588636c :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO ()))
+hs_bindgen_207a05e5b588636c =
+  BG.fromFFIType hs_bindgen_207a05e5b588636c_base
+
+{-# NOINLINE sDL_RemoveTrayEntry #-}
+
+-- | Removes a tray entry.
+--
+--     [@entry@]: The entry to be deleted.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_RemoveTrayEntry@, defined at @SDL3\/SDL_tray.h 282:34@
+sDL_RemoveTrayEntry :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO ())
+sDL_RemoveTrayEntry =
+  BG.unsafePerformIO hs_bindgen_207a05e5b588636c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_InsertTrayEntryAt@
+foreign import ccall unsafe "hs_bindgen_4f1eb15eda9eecc5"
+  hs_bindgen_4f1eb15eda9eecc5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_InsertTrayEntryAt@
+hs_bindgen_4f1eb15eda9eecc5
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_TrayMenu
+             -> BG.CInt
+             -> PtrConst.PtrConst BG.CChar
+             -> SDL_TrayEntryFlags
+             -> IO (BG.Ptr SDL_TrayEntry)
+           )
+       )
+hs_bindgen_4f1eb15eda9eecc5 =
+  BG.fromFFIType hs_bindgen_4f1eb15eda9eecc5_base
+
+{-# NOINLINE sDL_InsertTrayEntryAt #-}
+
+-- | Insert a tray entry at a given position.
+--
+--     If label is NULL, the entry will be a separator. Many functions won\'t work for an entry that is a separator.
+--
+--     An entry does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [@menu@]: the menu to append the entry to.
+--
+--     [@pos@]: the desired position for the new entry. Entries at or following this place will be moved. If pos is -1, the entry is appended.
+--
+--     [@label@]: the text to be displayed on the entry, in UTF-8 encoding, or NULL for a separator.
+--
+--     [@flags@]: a combination of flags, some of which are mandatory.
+--
+--     [Returns]: the newly created entry, or NULL if pos is out of bounds.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_TrayEntryFlags', 'sDL_GetTrayEntries', 'sDL_RemoveTrayEntry', 'sDL_GetTrayEntryParent'
+--
+--     [C declaration]: @SDL_InsertTrayEntryAt@, defined at @SDL3\/SDL_tray.h 310:45@
+sDL_InsertTrayEntryAt
+  :: BG.FunPtr
+       ( BG.Ptr SDL_TrayMenu
+         -> BG.CInt
+         -> PtrConst.PtrConst BG.CChar
+         -> SDL_TrayEntryFlags
+         -> IO (BG.Ptr SDL_TrayEntry)
+       )
+sDL_InsertTrayEntryAt =
+  BG.unsafePerformIO hs_bindgen_4f1eb15eda9eecc5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryLabel@
+foreign import ccall unsafe "hs_bindgen_db2f3045cf28b5d5"
+  hs_bindgen_db2f3045cf28b5d5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryLabel@
+hs_bindgen_db2f3045cf28b5d5
+  :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> PtrConst.PtrConst BG.CChar -> IO ()))
+hs_bindgen_db2f3045cf28b5d5 =
+  BG.fromFFIType hs_bindgen_db2f3045cf28b5d5_base
+
+{-# NOINLINE sDL_SetTrayEntryLabel #-}
+
+-- | Sets the label of an entry.
+--
+--     An entry cannot change between a separator and an ordinary entry; that is, it is not possible to set a non-NULL label on an entry that has a NULL label (separators), or to set a NULL label to an entry that has a non-NULL label. The function will silently fail if that happens.
+--
+--     [@entry@]: the entry to be updated.
+--
+--     [@label@]: the new label for the entry in UTF-8 encoding.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_GetTrayEntryLabel'
+--
+--     [C declaration]: @SDL_SetTrayEntryLabel@, defined at @SDL3\/SDL_tray.h 332:34@
+sDL_SetTrayEntryLabel :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> PtrConst.PtrConst BG.CChar -> IO ())
+sDL_SetTrayEntryLabel =
+  BG.unsafePerformIO hs_bindgen_db2f3045cf28b5d5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryLabel@
+foreign import ccall unsafe "hs_bindgen_f9b74cb4f55c043f"
+  hs_bindgen_f9b74cb4f55c043f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryLabel@
+hs_bindgen_f9b74cb4f55c043f
+  :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_f9b74cb4f55c043f =
+  BG.fromFFIType hs_bindgen_f9b74cb4f55c043f_base
+
+{-# NOINLINE sDL_GetTrayEntryLabel #-}
+
+-- | Gets the label of an entry.
+--
+--     If the returned value is NULL, the entry is a separator.
+--
+--     [@entry@]: the entry to be read.
+--
+--     [Returns]: the label of the entry in UTF-8 encoding.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_SetTrayEntryLabel'
+--
+--     [C declaration]: @SDL_GetTrayEntryLabel@, defined at @SDL3\/SDL_tray.h 351:42@
+sDL_GetTrayEntryLabel :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetTrayEntryLabel =
+  BG.unsafePerformIO hs_bindgen_f9b74cb4f55c043f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryChecked@
+foreign import ccall unsafe "hs_bindgen_815ad50438649e5d"
+  hs_bindgen_815ad50438649e5d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryChecked@
+hs_bindgen_815ad50438649e5d :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> BG.CBool -> IO ()))
+hs_bindgen_815ad50438649e5d =
+  BG.fromFFIType hs_bindgen_815ad50438649e5d_base
+
+{-# NOINLINE sDL_SetTrayEntryChecked #-}
+
+-- | Sets whether or not an entry is checked.
+--
+--     The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag.
+--
+--     [@entry@]: the entry to be updated.
+--
+--     [@checked@]: true if the entry should be checked; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_GetTrayEntryChecked'
+--
+--     [C declaration]: @SDL_SetTrayEntryChecked@, defined at @SDL3\/SDL_tray.h 370:34@
+sDL_SetTrayEntryChecked :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> BG.CBool -> IO ())
+sDL_SetTrayEntryChecked =
+  BG.unsafePerformIO hs_bindgen_815ad50438649e5d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryChecked@
+foreign import ccall unsafe "hs_bindgen_89a7fa670bbdd4aa"
+  hs_bindgen_89a7fa670bbdd4aa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryChecked@
+hs_bindgen_89a7fa670bbdd4aa :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO BG.CBool))
+hs_bindgen_89a7fa670bbdd4aa =
+  BG.fromFFIType hs_bindgen_89a7fa670bbdd4aa_base
+
+{-# NOINLINE sDL_GetTrayEntryChecked #-}
+
+-- | Gets whether or not an entry is checked.
+--
+--     The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag.
+--
+--     [@entry@]: the entry to be read.
+--
+--     [Returns]: true if the entry is checked; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_SetTrayEntryChecked'
+--
+--     [C declaration]: @SDL_GetTrayEntryChecked@, defined at @SDL3\/SDL_tray.h 389:34@
+sDL_GetTrayEntryChecked :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO BG.CBool)
+sDL_GetTrayEntryChecked =
+  BG.unsafePerformIO hs_bindgen_89a7fa670bbdd4aa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryEnabled@
+foreign import ccall unsafe "hs_bindgen_d2ae14ecd73c137a"
+  hs_bindgen_d2ae14ecd73c137a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryEnabled@
+hs_bindgen_d2ae14ecd73c137a :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> BG.CBool -> IO ()))
+hs_bindgen_d2ae14ecd73c137a =
+  BG.fromFFIType hs_bindgen_d2ae14ecd73c137a_base
+
+{-# NOINLINE sDL_SetTrayEntryEnabled #-}
+
+-- | Sets whether or not an entry is enabled.
+--
+--     [@entry@]: the entry to be updated.
+--
+--     [@enabled@]: true if the entry should be enabled; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_GetTrayEntryEnabled'
+--
+--     [C declaration]: @SDL_SetTrayEntryEnabled@, defined at @SDL3\/SDL_tray.h 406:34@
+sDL_SetTrayEntryEnabled :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> BG.CBool -> IO ())
+sDL_SetTrayEntryEnabled =
+  BG.unsafePerformIO hs_bindgen_d2ae14ecd73c137a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryEnabled@
+foreign import ccall unsafe "hs_bindgen_aacde4500657f4c0"
+  hs_bindgen_aacde4500657f4c0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryEnabled@
+hs_bindgen_aacde4500657f4c0 :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO BG.CBool))
+hs_bindgen_aacde4500657f4c0 =
+  BG.fromFFIType hs_bindgen_aacde4500657f4c0_base
+
+{-# NOINLINE sDL_GetTrayEntryEnabled #-}
+
+-- | Gets whether or not an entry is enabled.
+--
+--     [@entry@]: the entry to be read.
+--
+--     [Returns]: true if the entry is enabled; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_SetTrayEntryEnabled'
+--
+--     [C declaration]: @SDL_GetTrayEntryEnabled@, defined at @SDL3\/SDL_tray.h 423:34@
+sDL_GetTrayEntryEnabled :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO BG.CBool)
+sDL_GetTrayEntryEnabled =
+  BG.unsafePerformIO hs_bindgen_aacde4500657f4c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryCallback@
+foreign import ccall unsafe "hs_bindgen_624772d3d1eca5e3"
+  hs_bindgen_624772d3d1eca5e3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_SetTrayEntryCallback@
+hs_bindgen_624772d3d1eca5e3
+  :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> SDL_TrayCallback -> BG.Ptr BG.Void -> IO ()))
+hs_bindgen_624772d3d1eca5e3 =
+  BG.fromFFIType hs_bindgen_624772d3d1eca5e3_base
+
+{-# NOINLINE sDL_SetTrayEntryCallback #-}
+
+-- | Sets a callback to be invoked when the entry is selected.
+--
+--     [@entry@]: the entry to be updated.
+--
+--     [@callback@]: a callback to be invoked when the entry is selected.
+--
+--     [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_SetTrayEntryCallback@, defined at @SDL3\/SDL_tray.h 441:34@
+sDL_SetTrayEntryCallback
+  :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> SDL_TrayCallback -> BG.Ptr BG.Void -> IO ())
+sDL_SetTrayEntryCallback =
+  BG.unsafePerformIO hs_bindgen_624772d3d1eca5e3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_ClickTrayEntry@
+foreign import ccall unsafe "hs_bindgen_7aff8a582dc1af42"
+  hs_bindgen_7aff8a582dc1af42_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_ClickTrayEntry@
+hs_bindgen_7aff8a582dc1af42 :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO ()))
+hs_bindgen_7aff8a582dc1af42 =
+  BG.fromFFIType hs_bindgen_7aff8a582dc1af42_base
+
+{-# NOINLINE sDL_ClickTrayEntry #-}
+
+-- | Simulate a click on a tray entry.
+--
+--     [@entry@]: The entry to activate.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ClickTrayEntry@, defined at @SDL3\/SDL_tray.h 453:34@
+sDL_ClickTrayEntry :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO ())
+sDL_ClickTrayEntry =
+  BG.unsafePerformIO hs_bindgen_7aff8a582dc1af42
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_DestroyTray@
+foreign import ccall unsafe "hs_bindgen_ac5647a4ad9aa76d"
+  hs_bindgen_ac5647a4ad9aa76d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_DestroyTray@
+hs_bindgen_ac5647a4ad9aa76d :: IO (BG.FunPtr (BG.Ptr SDL_Tray -> IO ()))
+hs_bindgen_ac5647a4ad9aa76d =
+  BG.fromFFIType hs_bindgen_ac5647a4ad9aa76d_base
+
+{-# NOINLINE sDL_DestroyTray #-}
+
+-- | Destroys a tray object.
+--
+--     This also destroys all associated menus and entries.
+--
+--     [@tray@]: the tray icon to be destroyed.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray'
+--
+--     [C declaration]: @SDL_DestroyTray@, defined at @SDL3\/SDL_tray.h 469:34@
+sDL_DestroyTray :: BG.FunPtr (BG.Ptr SDL_Tray -> IO ())
+sDL_DestroyTray =
+  BG.unsafePerformIO hs_bindgen_ac5647a4ad9aa76d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryParent@
+foreign import ccall unsafe "hs_bindgen_14c614d00cef77fa"
+  hs_bindgen_14c614d00cef77fa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayEntryParent@
+hs_bindgen_14c614d00cef77fa :: IO (BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO (BG.Ptr SDL_TrayMenu)))
+hs_bindgen_14c614d00cef77fa =
+  BG.fromFFIType hs_bindgen_14c614d00cef77fa_base
+
+{-# NOINLINE sDL_GetTrayEntryParent #-}
+
+-- | Gets the menu containing a certain tray entry.
+--
+--     [@entry@]: the entry for which to get the parent menu.
+--
+--     [Returns]: the parent menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_GetTrayEntryParent@, defined at @SDL3\/SDL_tray.h 484:44@
+sDL_GetTrayEntryParent :: BG.FunPtr (BG.Ptr SDL_TrayEntry -> IO (BG.Ptr SDL_TrayMenu))
+sDL_GetTrayEntryParent =
+  BG.unsafePerformIO hs_bindgen_14c614d00cef77fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayMenuParentEntry@
+foreign import ccall unsafe "hs_bindgen_5521b8512f50cc76"
+  hs_bindgen_5521b8512f50cc76_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayMenuParentEntry@
+hs_bindgen_5521b8512f50cc76 :: IO (BG.FunPtr (BG.Ptr SDL_TrayMenu -> IO (BG.Ptr SDL_TrayEntry)))
+hs_bindgen_5521b8512f50cc76 =
+  BG.fromFFIType hs_bindgen_5521b8512f50cc76_base
+
+{-# NOINLINE sDL_GetTrayMenuParentEntry #-}
+
+-- | Gets the entry for which the menu is a submenu, if the current menu is a submenu.
+--
+--     Either this function or @SDL_GetTrayMenuParentTray()@ will return non-NULL for any given menu.
+--
+--     [@menu@]: the menu for which to get the parent entry.
+--
+--     [Returns]: the parent entry, or NULL if this menu is not a submenu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTraySubmenu', 'sDL_GetTrayMenuParentTray'
+--
+--     [C declaration]: @SDL_GetTrayMenuParentEntry@, defined at @SDL3\/SDL_tray.h 504:45@
+sDL_GetTrayMenuParentEntry :: BG.FunPtr (BG.Ptr SDL_TrayMenu -> IO (BG.Ptr SDL_TrayEntry))
+sDL_GetTrayMenuParentEntry =
+  BG.unsafePerformIO hs_bindgen_5521b8512f50cc76
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayMenuParentTray@
+foreign import ccall unsafe "hs_bindgen_43523d65356b241b"
+  hs_bindgen_43523d65356b241b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_GetTrayMenuParentTray@
+hs_bindgen_43523d65356b241b :: IO (BG.FunPtr (BG.Ptr SDL_TrayMenu -> IO (BG.Ptr SDL_Tray)))
+hs_bindgen_43523d65356b241b =
+  BG.fromFFIType hs_bindgen_43523d65356b241b_base
+
+{-# NOINLINE sDL_GetTrayMenuParentTray #-}
+
+-- | Gets the tray for which this menu is the first-level menu, if the current menu isn\'t a submenu.
+--
+--     Either this function or @SDL_GetTrayMenuParentEntry()@ will return non-NULL for any given menu.
+--
+--     [@menu@]: the menu for which to get the parent enttrayry.
+--
+--     [Returns]: the parent tray, or NULL if this menu is a submenu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTrayMenu', 'sDL_GetTrayMenuParentEntry'
+--
+--     [C declaration]: @SDL_GetTrayMenuParentTray@, defined at @SDL3\/SDL_tray.h 524:40@
+sDL_GetTrayMenuParentTray :: BG.FunPtr (BG.Ptr SDL_TrayMenu -> IO (BG.Ptr SDL_Tray))
+sDL_GetTrayMenuParentTray =
+  BG.unsafePerformIO hs_bindgen_43523d65356b241b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_UpdateTrays@
+foreign import ccall unsafe "hs_bindgen_108816203a48fe42"
+  hs_bindgen_108816203a48fe42_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_get_SDL_UpdateTrays@
+hs_bindgen_108816203a48fe42 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_108816203a48fe42 =
+  BG.fromFFIType hs_bindgen_108816203a48fe42_base
+
+{-# NOINLINE sDL_UpdateTrays #-}
+
+-- | Update the trays.
+--
+--     This is called automatically by the event loop and is only needed if you\'re using trays but aren\'t handling SDL events.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateTrays@, defined at @SDL3\/SDL_tray.h 536:34@
+sDL_UpdateTrays :: BG.FunPtr (IO ())
+sDL_UpdateTrays =
+  BG.unsafePerformIO hs_bindgen_108816203a48fe42
diff --git a/src/SDL3/Sys/Bindgen/Tray/Safe.hs b/src/SDL3/Sys/Bindgen/Tray/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Tray/Safe.hs
@@ -0,0 +1,1018 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Tray.Safe (
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_CreateTray,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_SetTrayIcon,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_SetTrayTooltip,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_CreateTrayMenu,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_CreateTraySubmenu,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_GetTrayMenu,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_GetTraySubmenu,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_GetTrayEntries,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_RemoveTrayEntry,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_InsertTrayEntryAt,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_SetTrayEntryLabel,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_GetTrayEntryLabel,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_SetTrayEntryChecked,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_GetTrayEntryChecked,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_SetTrayEntryEnabled,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_GetTrayEntryEnabled,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_SetTrayEntryCallback,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_ClickTrayEntry,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_DestroyTray,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_GetTrayEntryParent,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_GetTrayMenuParentEntry,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_GetTrayMenuParentTray,
+  SDL3.Sys.Bindgen.Tray.Safe.sDL_UpdateTrays,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Tray
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_tray.h>"
+         , "SDL_Tray *hs_bindgen_883df5f31028a1a4 ("
+         , "  SDL_Surface *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTray)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_e4467c5dfb0eefec ("
+         , "  SDL_Tray *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayIcon)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_f0fbabccc349ab12 ("
+         , "  SDL_Tray *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayTooltip)(arg1, arg2);"
+         , "}"
+         , "SDL_TrayMenu *hs_bindgen_591a284511251aa4 ("
+         , "  SDL_Tray *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTrayMenu)(arg1);"
+         , "}"
+         , "SDL_TrayMenu *hs_bindgen_519964613c2d0dd2 ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTraySubmenu)(arg1);"
+         , "}"
+         , "SDL_TrayMenu *hs_bindgen_d00b06b7312eb4e3 ("
+         , "  SDL_Tray *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayMenu)(arg1);"
+         , "}"
+         , "SDL_TrayMenu *hs_bindgen_ac4f72f06dc56c8f ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTraySubmenu)(arg1);"
+         , "}"
+         , "SDL_TrayEntry const **hs_bindgen_db28f928b77b3b21 ("
+         , "  SDL_TrayMenu *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayEntries)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_760690f62725f41d ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_RemoveTrayEntry)(arg1);"
+         , "}"
+         , "SDL_TrayEntry *hs_bindgen_97f828a3ddf4bda6 ("
+         , "  SDL_TrayMenu *arg1,"
+         , "  signed int arg2,"
+         , "  char const *arg3,"
+         , "  SDL_TrayEntryFlags arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_InsertTrayEntryAt)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_d259c08f8b2fea97 ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayEntryLabel)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_f42afcfe13e00a9d ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayEntryLabel)(arg1);"
+         , "}"
+         , "void hs_bindgen_c732ae30d80c2bac ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayEntryChecked)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_9ab5ede401963c0b ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayEntryChecked)(arg1);"
+         , "}"
+         , "void hs_bindgen_a82f265fc5763bf3 ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayEntryEnabled)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_102ba65c8464342f ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayEntryEnabled)(arg1);"
+         , "}"
+         , "void hs_bindgen_94ff69ef9d4fdfe8 ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  SDL_TrayCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayEntryCallback)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_0157d583c118c3cc ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_ClickTrayEntry)(arg1);"
+         , "}"
+         , "void hs_bindgen_8b1a746817e6df61 ("
+         , "  SDL_Tray *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyTray)(arg1);"
+         , "}"
+         , "SDL_TrayMenu *hs_bindgen_7ca22a5fb9c165d8 ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayEntryParent)(arg1);"
+         , "}"
+         , "SDL_TrayEntry *hs_bindgen_6e7d37f626feacc8 ("
+         , "  SDL_TrayMenu *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayMenuParentEntry)(arg1);"
+         , "}"
+         , "SDL_Tray *hs_bindgen_9e7d7b320d4c4ce1 ("
+         , "  SDL_TrayMenu *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayMenuParentTray)(arg1);"
+         , "}"
+         , "void hs_bindgen_92bb76cd94576ed5 (void)"
+         , "{"
+         , "  (SDL_UpdateTrays)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_CreateTray@
+foreign import ccall safe "hs_bindgen_883df5f31028a1a4"
+  hs_bindgen_883df5f31028a1a4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_CreateTray@
+hs_bindgen_883df5f31028a1a4
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Tray)
+hs_bindgen_883df5f31028a1a4 =
+  BG.fromFFIType hs_bindgen_883df5f31028a1a4_base
+
+-- | Create an icon to be placed in the operating system\'s tray, or equivalent.
+--
+--     Many platforms advise not using a system tray unless persistence is a necessary feature. Avoid needlessly creating a tray icon, as the user may feel like it clutters their interface.
+--
+--     Using tray icons require the video subsystem.
+--
+--     [Returns]: The newly created system tray icon.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTrayMenu', 'sDL_GetTrayMenu', 'sDL_DestroyTray'
+--
+--     [C declaration]: @SDL_CreateTray@, defined at @SDL3\/SDL_tray.h 121:40@
+sDL_CreateTray
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: a surface to be used as icon. May be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tooltip@]: a tooltip to be displayed when the mouse hovers the icon in UTF-8 encoding. Not supported on all platforms. May be NULL.
+  -> IO (BG.Ptr SDL_Tray)
+sDL_CreateTray = hs_bindgen_883df5f31028a1a4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayIcon@
+foreign import ccall safe "hs_bindgen_e4467c5dfb0eefec"
+  hs_bindgen_e4467c5dfb0eefec_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayIcon@
+hs_bindgen_e4467c5dfb0eefec
+  :: BG.Ptr SDL_Tray
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO ()
+hs_bindgen_e4467c5dfb0eefec =
+  BG.fromFFIType hs_bindgen_e4467c5dfb0eefec_base
+
+-- | Updates the system tray icon\'s icon.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray'
+--
+--     [C declaration]: @SDL_SetTrayIcon@, defined at @SDL3\/SDL_tray.h 136:34@
+sDL_SetTrayIcon
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be updated.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: the new icon. May be NULL.
+  -> IO ()
+sDL_SetTrayIcon = hs_bindgen_e4467c5dfb0eefec
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayTooltip@
+foreign import ccall safe "hs_bindgen_f0fbabccc349ab12"
+  hs_bindgen_f0fbabccc349ab12_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayTooltip@
+hs_bindgen_f0fbabccc349ab12
+  :: BG.Ptr SDL_Tray
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_f0fbabccc349ab12 =
+  BG.fromFFIType hs_bindgen_f0fbabccc349ab12_base
+
+-- | Updates the system tray icon\'s tooltip.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray'
+--
+--     [C declaration]: @SDL_SetTrayTooltip@, defined at @SDL3\/SDL_tray.h 151:34@
+sDL_SetTrayTooltip
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be updated.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tooltip@]: the new tooltip in UTF-8 encoding. May be NULL.
+  -> IO ()
+sDL_SetTrayTooltip = hs_bindgen_f0fbabccc349ab12
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_CreateTrayMenu@
+foreign import ccall safe "hs_bindgen_591a284511251aa4"
+  hs_bindgen_591a284511251aa4_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_CreateTrayMenu@
+hs_bindgen_591a284511251aa4
+  :: BG.Ptr SDL_Tray
+  -> IO (BG.Ptr SDL_TrayMenu)
+hs_bindgen_591a284511251aa4 =
+  BG.fromFFIType hs_bindgen_591a284511251aa4_base
+
+-- | Create a menu for a system tray.
+--
+--     This should be called at most once per tray icon.
+--
+--     This function does the same thing as @SDL_CreateTraySubmenu()@, except that it takes a 'SDL_Tray' instead of a 'SDL_TrayEntry'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray', 'sDL_GetTrayMenu', 'sDL_GetTrayMenuParentTray'
+--
+--     [C declaration]: @SDL_CreateTrayMenu@, defined at @SDL3\/SDL_tray.h 175:44@
+sDL_CreateTrayMenu
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+sDL_CreateTrayMenu = hs_bindgen_591a284511251aa4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_CreateTraySubmenu@
+foreign import ccall safe "hs_bindgen_519964613c2d0dd2"
+  hs_bindgen_519964613c2d0dd2_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_CreateTraySubmenu@
+hs_bindgen_519964613c2d0dd2
+  :: BG.Ptr SDL_TrayEntry
+  -> IO (BG.Ptr SDL_TrayMenu)
+hs_bindgen_519964613c2d0dd2 =
+  BG.fromFFIType hs_bindgen_519964613c2d0dd2_base
+
+-- | Create a submenu for a system tray entry.
+--
+--     This should be called at most once per tray entry.
+--
+--     This function does the same thing as SDL_CreateTrayMenu, except that it takes a 'SDL_TrayEntry' instead of a 'SDL_Tray'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InsertTrayEntryAt', 'sDL_GetTraySubmenu', 'sDL_GetTrayMenuParentEntry'
+--
+--     [C declaration]: @SDL_CreateTraySubmenu@, defined at @SDL3\/SDL_tray.h 199:44@
+sDL_CreateTraySubmenu
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+sDL_CreateTraySubmenu = hs_bindgen_519964613c2d0dd2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayMenu@
+foreign import ccall safe "hs_bindgen_d00b06b7312eb4e3"
+  hs_bindgen_d00b06b7312eb4e3_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayMenu@
+hs_bindgen_d00b06b7312eb4e3
+  :: BG.Ptr SDL_Tray
+  -> IO (BG.Ptr SDL_TrayMenu)
+hs_bindgen_d00b06b7312eb4e3 =
+  BG.fromFFIType hs_bindgen_d00b06b7312eb4e3_base
+
+-- | Gets a previously created tray menu.
+--
+--     You should have called @SDL_CreateTrayMenu()@ on the tray object. This function allows you to fetch it again later.
+--
+--     This function does the same thing as @SDL_GetTraySubmenu()@, except that it takes a 'SDL_Tray' instead of a 'SDL_TrayEntry'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray', 'sDL_CreateTrayMenu'
+--
+--     [C declaration]: @SDL_GetTrayMenu@, defined at @SDL3\/SDL_tray.h 223:44@
+sDL_GetTrayMenu
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+sDL_GetTrayMenu = hs_bindgen_d00b06b7312eb4e3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTraySubmenu@
+foreign import ccall safe "hs_bindgen_ac4f72f06dc56c8f"
+  hs_bindgen_ac4f72f06dc56c8f_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTraySubmenu@
+hs_bindgen_ac4f72f06dc56c8f
+  :: BG.Ptr SDL_TrayEntry
+  -> IO (BG.Ptr SDL_TrayMenu)
+hs_bindgen_ac4f72f06dc56c8f =
+  BG.fromFFIType hs_bindgen_ac4f72f06dc56c8f_base
+
+-- | Gets a previously created tray entry submenu.
+--
+--     You should have called @SDL_CreateTraySubmenu()@ on the entry object. This function allows you to fetch it again later.
+--
+--     This function does the same thing as @SDL_GetTrayMenu()@, except that it takes a 'SDL_TrayEntry' instead of a 'SDL_Tray'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InsertTrayEntryAt', 'sDL_CreateTraySubmenu'
+--
+--     [C declaration]: @SDL_GetTraySubmenu@, defined at @SDL3\/SDL_tray.h 247:44@
+sDL_GetTraySubmenu
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+sDL_GetTraySubmenu = hs_bindgen_ac4f72f06dc56c8f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayEntries@
+foreign import ccall safe "hs_bindgen_db28f928b77b3b21"
+  hs_bindgen_db28f928b77b3b21_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayEntries@
+hs_bindgen_db28f928b77b3b21
+  :: BG.Ptr SDL_TrayMenu
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (PtrConst.PtrConst SDL_TrayEntry))
+hs_bindgen_db28f928b77b3b21 =
+  BG.fromFFIType hs_bindgen_db28f928b77b3b21_base
+
+-- | Returns a list of entries in the menu, in order.
+--
+--     [Returns]: a NULL-terminated list of entries within the given menu. The pointer becomes invalid when any function that inserts or deletes entries in the menu is called.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveTrayEntry', 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_GetTrayEntries@, defined at @SDL3\/SDL_tray.h 267:52@
+sDL_GetTrayEntries
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: The menu to get entries from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: An optional pointer to obtain the number of entries in the menu.
+  -> IO (BG.Ptr (PtrConst.PtrConst SDL_TrayEntry))
+sDL_GetTrayEntries = hs_bindgen_db28f928b77b3b21
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_RemoveTrayEntry@
+foreign import ccall safe "hs_bindgen_760690f62725f41d"
+  hs_bindgen_760690f62725f41d_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_RemoveTrayEntry@
+hs_bindgen_760690f62725f41d
+  :: BG.Ptr SDL_TrayEntry
+  -> IO ()
+hs_bindgen_760690f62725f41d =
+  BG.fromFFIType hs_bindgen_760690f62725f41d_base
+
+-- | Removes a tray entry.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_RemoveTrayEntry@, defined at @SDL3\/SDL_tray.h 282:34@
+sDL_RemoveTrayEntry
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: The entry to be deleted.
+  -> IO ()
+sDL_RemoveTrayEntry = hs_bindgen_760690f62725f41d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_InsertTrayEntryAt@
+foreign import ccall safe "hs_bindgen_97f828a3ddf4bda6"
+  hs_bindgen_97f828a3ddf4bda6_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_InsertTrayEntryAt@
+hs_bindgen_97f828a3ddf4bda6
+  :: BG.Ptr SDL_TrayMenu
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL_TrayEntryFlags
+  -> IO (BG.Ptr SDL_TrayEntry)
+hs_bindgen_97f828a3ddf4bda6 =
+  BG.fromFFIType hs_bindgen_97f828a3ddf4bda6_base
+
+-- | Insert a tray entry at a given position.
+--
+--     If label is NULL, the entry will be a separator. Many functions won\'t work for an entry that is a separator.
+--
+--     An entry does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created entry, or NULL if pos is out of bounds.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_TrayEntryFlags', 'sDL_GetTrayEntries', 'sDL_RemoveTrayEntry', 'sDL_GetTrayEntryParent'
+--
+--     [C declaration]: @SDL_InsertTrayEntryAt@, defined at @SDL3\/SDL_tray.h 310:45@
+sDL_InsertTrayEntryAt
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu to append the entry to.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@pos@]: the desired position for the new entry. Entries at or following this place will be moved. If pos is -1, the entry is appended.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@label@]: the text to be displayed on the entry, in UTF-8 encoding, or NULL for a separator.
+  -> SDL_TrayEntryFlags
+  -- ^
+  --
+  --           [@flags@]: a combination of flags, some of which are mandatory.
+  -> IO (BG.Ptr SDL_TrayEntry)
+sDL_InsertTrayEntryAt = hs_bindgen_97f828a3ddf4bda6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayEntryLabel@
+foreign import ccall safe "hs_bindgen_d259c08f8b2fea97"
+  hs_bindgen_d259c08f8b2fea97_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayEntryLabel@
+hs_bindgen_d259c08f8b2fea97
+  :: BG.Ptr SDL_TrayEntry
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_d259c08f8b2fea97 =
+  BG.fromFFIType hs_bindgen_d259c08f8b2fea97_base
+
+-- | Sets the label of an entry.
+--
+--     An entry cannot change between a separator and an ordinary entry; that is, it is not possible to set a non-NULL label on an entry that has a NULL label (separators), or to set a NULL label to an entry that has a non-NULL label. The function will silently fail if that happens.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_GetTrayEntryLabel'
+--
+--     [C declaration]: @SDL_SetTrayEntryLabel@, defined at @SDL3\/SDL_tray.h 332:34@
+sDL_SetTrayEntryLabel
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@label@]: the new label for the entry in UTF-8 encoding.
+  -> IO ()
+sDL_SetTrayEntryLabel = hs_bindgen_d259c08f8b2fea97
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayEntryLabel@
+foreign import ccall safe "hs_bindgen_f42afcfe13e00a9d"
+  hs_bindgen_f42afcfe13e00a9d_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayEntryLabel@
+hs_bindgen_f42afcfe13e00a9d
+  :: BG.Ptr SDL_TrayEntry
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_f42afcfe13e00a9d =
+  BG.fromFFIType hs_bindgen_f42afcfe13e00a9d_base
+
+-- | Gets the label of an entry.
+--
+--     If the returned value is NULL, the entry is a separator.
+--
+--     [Returns]: the label of the entry in UTF-8 encoding.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_SetTrayEntryLabel'
+--
+--     [C declaration]: @SDL_GetTrayEntryLabel@, defined at @SDL3\/SDL_tray.h 351:42@
+sDL_GetTrayEntryLabel
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetTrayEntryLabel = hs_bindgen_f42afcfe13e00a9d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayEntryChecked@
+foreign import ccall safe "hs_bindgen_c732ae30d80c2bac"
+  hs_bindgen_c732ae30d80c2bac_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayEntryChecked@
+hs_bindgen_c732ae30d80c2bac
+  :: BG.Ptr SDL_TrayEntry
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_c732ae30d80c2bac =
+  BG.fromFFIType hs_bindgen_c732ae30d80c2bac_base
+
+-- | Sets whether or not an entry is checked.
+--
+--     The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_GetTrayEntryChecked'
+--
+--     [C declaration]: @SDL_SetTrayEntryChecked@, defined at @SDL3\/SDL_tray.h 370:34@
+sDL_SetTrayEntryChecked
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@checked@]: true if the entry should be checked; false otherwise.
+  -> IO ()
+sDL_SetTrayEntryChecked = hs_bindgen_c732ae30d80c2bac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayEntryChecked@
+foreign import ccall safe "hs_bindgen_9ab5ede401963c0b"
+  hs_bindgen_9ab5ede401963c0b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayEntryChecked@
+hs_bindgen_9ab5ede401963c0b
+  :: BG.Ptr SDL_TrayEntry
+  -> IO BG.CBool
+hs_bindgen_9ab5ede401963c0b =
+  BG.fromFFIType hs_bindgen_9ab5ede401963c0b_base
+
+-- | Gets whether or not an entry is checked.
+--
+--     The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag.
+--
+--     [Returns]: true if the entry is checked; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_SetTrayEntryChecked'
+--
+--     [C declaration]: @SDL_GetTrayEntryChecked@, defined at @SDL3\/SDL_tray.h 389:34@
+sDL_GetTrayEntryChecked
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO BG.CBool
+sDL_GetTrayEntryChecked = hs_bindgen_9ab5ede401963c0b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayEntryEnabled@
+foreign import ccall safe "hs_bindgen_a82f265fc5763bf3"
+  hs_bindgen_a82f265fc5763bf3_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayEntryEnabled@
+hs_bindgen_a82f265fc5763bf3
+  :: BG.Ptr SDL_TrayEntry
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_a82f265fc5763bf3 =
+  BG.fromFFIType hs_bindgen_a82f265fc5763bf3_base
+
+-- | Sets whether or not an entry is enabled.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_GetTrayEntryEnabled'
+--
+--     [C declaration]: @SDL_SetTrayEntryEnabled@, defined at @SDL3\/SDL_tray.h 406:34@
+sDL_SetTrayEntryEnabled
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: true if the entry should be enabled; false otherwise.
+  -> IO ()
+sDL_SetTrayEntryEnabled = hs_bindgen_a82f265fc5763bf3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayEntryEnabled@
+foreign import ccall safe "hs_bindgen_102ba65c8464342f"
+  hs_bindgen_102ba65c8464342f_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayEntryEnabled@
+hs_bindgen_102ba65c8464342f
+  :: BG.Ptr SDL_TrayEntry
+  -> IO BG.CBool
+hs_bindgen_102ba65c8464342f =
+  BG.fromFFIType hs_bindgen_102ba65c8464342f_base
+
+-- | Gets whether or not an entry is enabled.
+--
+--     [Returns]: true if the entry is enabled; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_SetTrayEntryEnabled'
+--
+--     [C declaration]: @SDL_GetTrayEntryEnabled@, defined at @SDL3\/SDL_tray.h 423:34@
+sDL_GetTrayEntryEnabled
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO BG.CBool
+sDL_GetTrayEntryEnabled = hs_bindgen_102ba65c8464342f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayEntryCallback@
+foreign import ccall safe "hs_bindgen_94ff69ef9d4fdfe8"
+  hs_bindgen_94ff69ef9d4fdfe8_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_SetTrayEntryCallback@
+hs_bindgen_94ff69ef9d4fdfe8
+  :: BG.Ptr SDL_TrayEntry
+  -> SDL_TrayCallback
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_94ff69ef9d4fdfe8 =
+  BG.fromFFIType hs_bindgen_94ff69ef9d4fdfe8_base
+
+-- | Sets a callback to be invoked when the entry is selected.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_SetTrayEntryCallback@, defined at @SDL3\/SDL_tray.h 441:34@
+sDL_SetTrayEntryCallback
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> SDL_TrayCallback
+  -- ^
+  --
+  --           [@callback@]: a callback to be invoked when the entry is selected.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> IO ()
+sDL_SetTrayEntryCallback =
+  hs_bindgen_94ff69ef9d4fdfe8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_ClickTrayEntry@
+foreign import ccall safe "hs_bindgen_0157d583c118c3cc"
+  hs_bindgen_0157d583c118c3cc_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_ClickTrayEntry@
+hs_bindgen_0157d583c118c3cc
+  :: BG.Ptr SDL_TrayEntry
+  -> IO ()
+hs_bindgen_0157d583c118c3cc =
+  BG.fromFFIType hs_bindgen_0157d583c118c3cc_base
+
+-- | Simulate a click on a tray entry.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ClickTrayEntry@, defined at @SDL3\/SDL_tray.h 453:34@
+sDL_ClickTrayEntry
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: The entry to activate.
+  -> IO ()
+sDL_ClickTrayEntry = hs_bindgen_0157d583c118c3cc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_DestroyTray@
+foreign import ccall safe "hs_bindgen_8b1a746817e6df61"
+  hs_bindgen_8b1a746817e6df61_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_DestroyTray@
+hs_bindgen_8b1a746817e6df61
+  :: BG.Ptr SDL_Tray
+  -> IO ()
+hs_bindgen_8b1a746817e6df61 =
+  BG.fromFFIType hs_bindgen_8b1a746817e6df61_base
+
+-- | Destroys a tray object.
+--
+--     This also destroys all associated menus and entries.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray'
+--
+--     [C declaration]: @SDL_DestroyTray@, defined at @SDL3\/SDL_tray.h 469:34@
+sDL_DestroyTray
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be destroyed.
+  -> IO ()
+sDL_DestroyTray = hs_bindgen_8b1a746817e6df61
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayEntryParent@
+foreign import ccall safe "hs_bindgen_7ca22a5fb9c165d8"
+  hs_bindgen_7ca22a5fb9c165d8_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayEntryParent@
+hs_bindgen_7ca22a5fb9c165d8
+  :: BG.Ptr SDL_TrayEntry
+  -> IO (BG.Ptr SDL_TrayMenu)
+hs_bindgen_7ca22a5fb9c165d8 =
+  BG.fromFFIType hs_bindgen_7ca22a5fb9c165d8_base
+
+-- | Gets the menu containing a certain tray entry.
+--
+--     [Returns]: the parent menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_GetTrayEntryParent@, defined at @SDL3\/SDL_tray.h 484:44@
+sDL_GetTrayEntryParent
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry for which to get the parent menu.
+  -> IO (BG.Ptr SDL_TrayMenu)
+sDL_GetTrayEntryParent = hs_bindgen_7ca22a5fb9c165d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayMenuParentEntry@
+foreign import ccall safe "hs_bindgen_6e7d37f626feacc8"
+  hs_bindgen_6e7d37f626feacc8_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayMenuParentEntry@
+hs_bindgen_6e7d37f626feacc8
+  :: BG.Ptr SDL_TrayMenu
+  -> IO (BG.Ptr SDL_TrayEntry)
+hs_bindgen_6e7d37f626feacc8 =
+  BG.fromFFIType hs_bindgen_6e7d37f626feacc8_base
+
+-- | Gets the entry for which the menu is a submenu, if the current menu is a submenu.
+--
+--     Either this function or @SDL_GetTrayMenuParentTray()@ will return non-NULL for any given menu.
+--
+--     [Returns]: the parent entry, or NULL if this menu is not a submenu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTraySubmenu', 'sDL_GetTrayMenuParentTray'
+--
+--     [C declaration]: @SDL_GetTrayMenuParentEntry@, defined at @SDL3\/SDL_tray.h 504:45@
+sDL_GetTrayMenuParentEntry
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu for which to get the parent entry.
+  -> IO (BG.Ptr SDL_TrayEntry)
+sDL_GetTrayMenuParentEntry =
+  hs_bindgen_6e7d37f626feacc8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayMenuParentTray@
+foreign import ccall safe "hs_bindgen_9e7d7b320d4c4ce1"
+  hs_bindgen_9e7d7b320d4c4ce1_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_GetTrayMenuParentTray@
+hs_bindgen_9e7d7b320d4c4ce1
+  :: BG.Ptr SDL_TrayMenu
+  -> IO (BG.Ptr SDL_Tray)
+hs_bindgen_9e7d7b320d4c4ce1 =
+  BG.fromFFIType hs_bindgen_9e7d7b320d4c4ce1_base
+
+-- | Gets the tray for which this menu is the first-level menu, if the current menu isn\'t a submenu.
+--
+--     Either this function or @SDL_GetTrayMenuParentEntry()@ will return non-NULL for any given menu.
+--
+--     [Returns]: the parent tray, or NULL if this menu is a submenu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTrayMenu', 'sDL_GetTrayMenuParentEntry'
+--
+--     [C declaration]: @SDL_GetTrayMenuParentTray@, defined at @SDL3\/SDL_tray.h 524:40@
+sDL_GetTrayMenuParentTray
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu for which to get the parent enttrayry.
+  -> IO (BG.Ptr SDL_Tray)
+sDL_GetTrayMenuParentTray =
+  hs_bindgen_9e7d7b320d4c4ce1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_UpdateTrays@
+foreign import ccall safe "hs_bindgen_92bb76cd94576ed5"
+  hs_bindgen_92bb76cd94576ed5_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Safe_SDL_UpdateTrays@
+hs_bindgen_92bb76cd94576ed5 :: IO ()
+hs_bindgen_92bb76cd94576ed5 =
+  BG.fromFFIType hs_bindgen_92bb76cd94576ed5_base
+
+-- | Update the trays.
+--
+--     This is called automatically by the event loop and is only needed if you\'re using trays but aren\'t handling SDL events.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateTrays@, defined at @SDL3\/SDL_tray.h 536:34@
+sDL_UpdateTrays :: IO ()
+sDL_UpdateTrays = hs_bindgen_92bb76cd94576ed5
diff --git a/src/SDL3/Sys/Bindgen/Tray/Unsafe.hs b/src/SDL3/Sys/Bindgen/Tray/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Tray/Unsafe.hs
@@ -0,0 +1,1018 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Tray.Unsafe (
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_CreateTray,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_SetTrayIcon,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_SetTrayTooltip,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_CreateTrayMenu,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_CreateTraySubmenu,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_GetTrayMenu,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_GetTraySubmenu,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_GetTrayEntries,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_RemoveTrayEntry,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_InsertTrayEntryAt,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_SetTrayEntryLabel,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_GetTrayEntryLabel,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_SetTrayEntryChecked,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_GetTrayEntryChecked,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_SetTrayEntryEnabled,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_GetTrayEntryEnabled,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_SetTrayEntryCallback,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_ClickTrayEntry,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_DestroyTray,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_GetTrayEntryParent,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_GetTrayMenuParentEntry,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_GetTrayMenuParentTray,
+  SDL3.Sys.Bindgen.Tray.Unsafe.sDL_UpdateTrays,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Tray
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_tray.h>"
+         , "SDL_Tray *hs_bindgen_e85818417f6c25aa ("
+         , "  SDL_Surface *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTray)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_9aff16c03b0f79a4 ("
+         , "  SDL_Tray *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayIcon)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_3a0f6abbabc3be43 ("
+         , "  SDL_Tray *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayTooltip)(arg1, arg2);"
+         , "}"
+         , "SDL_TrayMenu *hs_bindgen_bd35a68090435dd7 ("
+         , "  SDL_Tray *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTrayMenu)(arg1);"
+         , "}"
+         , "SDL_TrayMenu *hs_bindgen_c024bcab15166d09 ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateTraySubmenu)(arg1);"
+         , "}"
+         , "SDL_TrayMenu *hs_bindgen_a75b79185593c812 ("
+         , "  SDL_Tray *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayMenu)(arg1);"
+         , "}"
+         , "SDL_TrayMenu *hs_bindgen_a4e00099ee20fd23 ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTraySubmenu)(arg1);"
+         , "}"
+         , "SDL_TrayEntry const **hs_bindgen_210fd2f6b416750d ("
+         , "  SDL_TrayMenu *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayEntries)(arg1, arg2);"
+         , "}"
+         , "void hs_bindgen_6b3503beb8dd3ba3 ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_RemoveTrayEntry)(arg1);"
+         , "}"
+         , "SDL_TrayEntry *hs_bindgen_cc14c44dbb0c78cb ("
+         , "  SDL_TrayMenu *arg1,"
+         , "  signed int arg2,"
+         , "  char const *arg3,"
+         , "  SDL_TrayEntryFlags arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_InsertTrayEntryAt)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_504886286a699c39 ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayEntryLabel)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_9759e7e644805c7d ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayEntryLabel)(arg1);"
+         , "}"
+         , "void hs_bindgen_74cb41035d525059 ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayEntryChecked)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_fe94492d1c67a601 ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayEntryChecked)(arg1);"
+         , "}"
+         , "void hs_bindgen_5263a949bd152767 ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayEntryEnabled)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_76a35c1dee9b4197 ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayEntryEnabled)(arg1);"
+         , "}"
+         , "void hs_bindgen_3a82abfce11b4c94 ("
+         , "  SDL_TrayEntry *arg1,"
+         , "  SDL_TrayCallback arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_SetTrayEntryCallback)(arg1, arg2, arg3);"
+         , "}"
+         , "void hs_bindgen_a8a4d1df90923df2 ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_ClickTrayEntry)(arg1);"
+         , "}"
+         , "void hs_bindgen_fe47cafa5c754a5a ("
+         , "  SDL_Tray *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyTray)(arg1);"
+         , "}"
+         , "SDL_TrayMenu *hs_bindgen_3e7aeb66ff2f2f10 ("
+         , "  SDL_TrayEntry *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayEntryParent)(arg1);"
+         , "}"
+         , "SDL_TrayEntry *hs_bindgen_89d0a7d911ebcebd ("
+         , "  SDL_TrayMenu *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayMenuParentEntry)(arg1);"
+         , "}"
+         , "SDL_Tray *hs_bindgen_48fcf0bd7a472bcb ("
+         , "  SDL_TrayMenu *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetTrayMenuParentTray)(arg1);"
+         , "}"
+         , "void hs_bindgen_03e94a19f107d107 (void)"
+         , "{"
+         , "  (SDL_UpdateTrays)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_CreateTray@
+foreign import ccall unsafe "hs_bindgen_e85818417f6c25aa"
+  hs_bindgen_e85818417f6c25aa_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_CreateTray@
+hs_bindgen_e85818417f6c25aa
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> PtrConst.PtrConst BG.CChar
+  -> IO (BG.Ptr SDL_Tray)
+hs_bindgen_e85818417f6c25aa =
+  BG.fromFFIType hs_bindgen_e85818417f6c25aa_base
+
+-- | Create an icon to be placed in the operating system\'s tray, or equivalent.
+--
+--     Many platforms advise not using a system tray unless persistence is a necessary feature. Avoid needlessly creating a tray icon, as the user may feel like it clutters their interface.
+--
+--     Using tray icons require the video subsystem.
+--
+--     [Returns]: The newly created system tray icon.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTrayMenu', 'sDL_GetTrayMenu', 'sDL_DestroyTray'
+--
+--     [C declaration]: @SDL_CreateTray@, defined at @SDL3\/SDL_tray.h 121:40@
+sDL_CreateTray
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: a surface to be used as icon. May be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tooltip@]: a tooltip to be displayed when the mouse hovers the icon in UTF-8 encoding. Not supported on all platforms. May be NULL.
+  -> IO (BG.Ptr SDL_Tray)
+sDL_CreateTray = hs_bindgen_e85818417f6c25aa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayIcon@
+foreign import ccall unsafe "hs_bindgen_9aff16c03b0f79a4"
+  hs_bindgen_9aff16c03b0f79a4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayIcon@
+hs_bindgen_9aff16c03b0f79a4
+  :: BG.Ptr SDL_Tray
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO ()
+hs_bindgen_9aff16c03b0f79a4 =
+  BG.fromFFIType hs_bindgen_9aff16c03b0f79a4_base
+
+-- | Updates the system tray icon\'s icon.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray'
+--
+--     [C declaration]: @SDL_SetTrayIcon@, defined at @SDL3\/SDL_tray.h 136:34@
+sDL_SetTrayIcon
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be updated.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: the new icon. May be NULL.
+  -> IO ()
+sDL_SetTrayIcon = hs_bindgen_9aff16c03b0f79a4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayTooltip@
+foreign import ccall unsafe "hs_bindgen_3a0f6abbabc3be43"
+  hs_bindgen_3a0f6abbabc3be43_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayTooltip@
+hs_bindgen_3a0f6abbabc3be43
+  :: BG.Ptr SDL_Tray
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_3a0f6abbabc3be43 =
+  BG.fromFFIType hs_bindgen_3a0f6abbabc3be43_base
+
+-- | Updates the system tray icon\'s tooltip.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray'
+--
+--     [C declaration]: @SDL_SetTrayTooltip@, defined at @SDL3\/SDL_tray.h 151:34@
+sDL_SetTrayTooltip
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be updated.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tooltip@]: the new tooltip in UTF-8 encoding. May be NULL.
+  -> IO ()
+sDL_SetTrayTooltip = hs_bindgen_3a0f6abbabc3be43
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_CreateTrayMenu@
+foreign import ccall unsafe "hs_bindgen_bd35a68090435dd7"
+  hs_bindgen_bd35a68090435dd7_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_CreateTrayMenu@
+hs_bindgen_bd35a68090435dd7
+  :: BG.Ptr SDL_Tray
+  -> IO (BG.Ptr SDL_TrayMenu)
+hs_bindgen_bd35a68090435dd7 =
+  BG.fromFFIType hs_bindgen_bd35a68090435dd7_base
+
+-- | Create a menu for a system tray.
+--
+--     This should be called at most once per tray icon.
+--
+--     This function does the same thing as @SDL_CreateTraySubmenu()@, except that it takes a 'SDL_Tray' instead of a 'SDL_TrayEntry'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray', 'sDL_GetTrayMenu', 'sDL_GetTrayMenuParentTray'
+--
+--     [C declaration]: @SDL_CreateTrayMenu@, defined at @SDL3\/SDL_tray.h 175:44@
+sDL_CreateTrayMenu
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+sDL_CreateTrayMenu = hs_bindgen_bd35a68090435dd7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_CreateTraySubmenu@
+foreign import ccall unsafe "hs_bindgen_c024bcab15166d09"
+  hs_bindgen_c024bcab15166d09_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_CreateTraySubmenu@
+hs_bindgen_c024bcab15166d09
+  :: BG.Ptr SDL_TrayEntry
+  -> IO (BG.Ptr SDL_TrayMenu)
+hs_bindgen_c024bcab15166d09 =
+  BG.fromFFIType hs_bindgen_c024bcab15166d09_base
+
+-- | Create a submenu for a system tray entry.
+--
+--     This should be called at most once per tray entry.
+--
+--     This function does the same thing as SDL_CreateTrayMenu, except that it takes a 'SDL_TrayEntry' instead of a 'SDL_Tray'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InsertTrayEntryAt', 'sDL_GetTraySubmenu', 'sDL_GetTrayMenuParentEntry'
+--
+--     [C declaration]: @SDL_CreateTraySubmenu@, defined at @SDL3\/SDL_tray.h 199:44@
+sDL_CreateTraySubmenu
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+sDL_CreateTraySubmenu = hs_bindgen_c024bcab15166d09
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayMenu@
+foreign import ccall unsafe "hs_bindgen_a75b79185593c812"
+  hs_bindgen_a75b79185593c812_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayMenu@
+hs_bindgen_a75b79185593c812
+  :: BG.Ptr SDL_Tray
+  -> IO (BG.Ptr SDL_TrayMenu)
+hs_bindgen_a75b79185593c812 =
+  BG.fromFFIType hs_bindgen_a75b79185593c812_base
+
+-- | Gets a previously created tray menu.
+--
+--     You should have called @SDL_CreateTrayMenu()@ on the tray object. This function allows you to fetch it again later.
+--
+--     This function does the same thing as @SDL_GetTraySubmenu()@, except that it takes a 'SDL_Tray' instead of a 'SDL_TrayEntry'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray', 'sDL_CreateTrayMenu'
+--
+--     [C declaration]: @SDL_GetTrayMenu@, defined at @SDL3\/SDL_tray.h 223:44@
+sDL_GetTrayMenu
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+sDL_GetTrayMenu = hs_bindgen_a75b79185593c812
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTraySubmenu@
+foreign import ccall unsafe "hs_bindgen_a4e00099ee20fd23"
+  hs_bindgen_a4e00099ee20fd23_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTraySubmenu@
+hs_bindgen_a4e00099ee20fd23
+  :: BG.Ptr SDL_TrayEntry
+  -> IO (BG.Ptr SDL_TrayMenu)
+hs_bindgen_a4e00099ee20fd23 =
+  BG.fromFFIType hs_bindgen_a4e00099ee20fd23_base
+
+-- | Gets a previously created tray entry submenu.
+--
+--     You should have called @SDL_CreateTraySubmenu()@ on the entry object. This function allows you to fetch it again later.
+--
+--     This function does the same thing as @SDL_GetTrayMenu()@, except that it takes a 'SDL_TrayEntry' instead of a 'SDL_Tray'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InsertTrayEntryAt', 'sDL_CreateTraySubmenu'
+--
+--     [C declaration]: @SDL_GetTraySubmenu@, defined at @SDL3\/SDL_tray.h 247:44@
+sDL_GetTraySubmenu
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+sDL_GetTraySubmenu = hs_bindgen_a4e00099ee20fd23
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayEntries@
+foreign import ccall unsafe "hs_bindgen_210fd2f6b416750d"
+  hs_bindgen_210fd2f6b416750d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayEntries@
+hs_bindgen_210fd2f6b416750d
+  :: BG.Ptr SDL_TrayMenu
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (PtrConst.PtrConst SDL_TrayEntry))
+hs_bindgen_210fd2f6b416750d =
+  BG.fromFFIType hs_bindgen_210fd2f6b416750d_base
+
+-- | Returns a list of entries in the menu, in order.
+--
+--     [Returns]: a NULL-terminated list of entries within the given menu. The pointer becomes invalid when any function that inserts or deletes entries in the menu is called.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_RemoveTrayEntry', 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_GetTrayEntries@, defined at @SDL3\/SDL_tray.h 267:52@
+sDL_GetTrayEntries
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: The menu to get entries from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: An optional pointer to obtain the number of entries in the menu.
+  -> IO (BG.Ptr (PtrConst.PtrConst SDL_TrayEntry))
+sDL_GetTrayEntries = hs_bindgen_210fd2f6b416750d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_RemoveTrayEntry@
+foreign import ccall unsafe "hs_bindgen_6b3503beb8dd3ba3"
+  hs_bindgen_6b3503beb8dd3ba3_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_RemoveTrayEntry@
+hs_bindgen_6b3503beb8dd3ba3
+  :: BG.Ptr SDL_TrayEntry
+  -> IO ()
+hs_bindgen_6b3503beb8dd3ba3 =
+  BG.fromFFIType hs_bindgen_6b3503beb8dd3ba3_base
+
+-- | Removes a tray entry.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_RemoveTrayEntry@, defined at @SDL3\/SDL_tray.h 282:34@
+sDL_RemoveTrayEntry
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: The entry to be deleted.
+  -> IO ()
+sDL_RemoveTrayEntry = hs_bindgen_6b3503beb8dd3ba3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_InsertTrayEntryAt@
+foreign import ccall unsafe "hs_bindgen_cc14c44dbb0c78cb"
+  hs_bindgen_cc14c44dbb0c78cb_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_InsertTrayEntryAt@
+hs_bindgen_cc14c44dbb0c78cb
+  :: BG.Ptr SDL_TrayMenu
+  -> BG.CInt
+  -> PtrConst.PtrConst BG.CChar
+  -> SDL_TrayEntryFlags
+  -> IO (BG.Ptr SDL_TrayEntry)
+hs_bindgen_cc14c44dbb0c78cb =
+  BG.fromFFIType hs_bindgen_cc14c44dbb0c78cb_base
+
+-- | Insert a tray entry at a given position.
+--
+--     If label is NULL, the entry will be a separator. Many functions won\'t work for an entry that is a separator.
+--
+--     An entry does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created entry, or NULL if pos is out of bounds.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_TrayEntryFlags', 'sDL_GetTrayEntries', 'sDL_RemoveTrayEntry', 'sDL_GetTrayEntryParent'
+--
+--     [C declaration]: @SDL_InsertTrayEntryAt@, defined at @SDL3\/SDL_tray.h 310:45@
+sDL_InsertTrayEntryAt
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu to append the entry to.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@pos@]: the desired position for the new entry. Entries at or following this place will be moved. If pos is -1, the entry is appended.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@label@]: the text to be displayed on the entry, in UTF-8 encoding, or NULL for a separator.
+  -> SDL_TrayEntryFlags
+  -- ^
+  --
+  --           [@flags@]: a combination of flags, some of which are mandatory.
+  -> IO (BG.Ptr SDL_TrayEntry)
+sDL_InsertTrayEntryAt = hs_bindgen_cc14c44dbb0c78cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayEntryLabel@
+foreign import ccall unsafe "hs_bindgen_504886286a699c39"
+  hs_bindgen_504886286a699c39_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayEntryLabel@
+hs_bindgen_504886286a699c39
+  :: BG.Ptr SDL_TrayEntry
+  -> PtrConst.PtrConst BG.CChar
+  -> IO ()
+hs_bindgen_504886286a699c39 =
+  BG.fromFFIType hs_bindgen_504886286a699c39_base
+
+-- | Sets the label of an entry.
+--
+--     An entry cannot change between a separator and an ordinary entry; that is, it is not possible to set a non-NULL label on an entry that has a NULL label (separators), or to set a NULL label to an entry that has a non-NULL label. The function will silently fail if that happens.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_GetTrayEntryLabel'
+--
+--     [C declaration]: @SDL_SetTrayEntryLabel@, defined at @SDL3\/SDL_tray.h 332:34@
+sDL_SetTrayEntryLabel
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@label@]: the new label for the entry in UTF-8 encoding.
+  -> IO ()
+sDL_SetTrayEntryLabel = hs_bindgen_504886286a699c39
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayEntryLabel@
+foreign import ccall unsafe "hs_bindgen_9759e7e644805c7d"
+  hs_bindgen_9759e7e644805c7d_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayEntryLabel@
+hs_bindgen_9759e7e644805c7d
+  :: BG.Ptr SDL_TrayEntry
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_9759e7e644805c7d =
+  BG.fromFFIType hs_bindgen_9759e7e644805c7d_base
+
+-- | Gets the label of an entry.
+--
+--     If the returned value is NULL, the entry is a separator.
+--
+--     [Returns]: the label of the entry in UTF-8 encoding.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_SetTrayEntryLabel'
+--
+--     [C declaration]: @SDL_GetTrayEntryLabel@, defined at @SDL3\/SDL_tray.h 351:42@
+sDL_GetTrayEntryLabel
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetTrayEntryLabel = hs_bindgen_9759e7e644805c7d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayEntryChecked@
+foreign import ccall unsafe "hs_bindgen_74cb41035d525059"
+  hs_bindgen_74cb41035d525059_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayEntryChecked@
+hs_bindgen_74cb41035d525059
+  :: BG.Ptr SDL_TrayEntry
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_74cb41035d525059 =
+  BG.fromFFIType hs_bindgen_74cb41035d525059_base
+
+-- | Sets whether or not an entry is checked.
+--
+--     The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_GetTrayEntryChecked'
+--
+--     [C declaration]: @SDL_SetTrayEntryChecked@, defined at @SDL3\/SDL_tray.h 370:34@
+sDL_SetTrayEntryChecked
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@checked@]: true if the entry should be checked; false otherwise.
+  -> IO ()
+sDL_SetTrayEntryChecked = hs_bindgen_74cb41035d525059
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayEntryChecked@
+foreign import ccall unsafe "hs_bindgen_fe94492d1c67a601"
+  hs_bindgen_fe94492d1c67a601_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayEntryChecked@
+hs_bindgen_fe94492d1c67a601
+  :: BG.Ptr SDL_TrayEntry
+  -> IO BG.CBool
+hs_bindgen_fe94492d1c67a601 =
+  BG.fromFFIType hs_bindgen_fe94492d1c67a601_base
+
+-- | Gets whether or not an entry is checked.
+--
+--     The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag.
+--
+--     [Returns]: true if the entry is checked; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_SetTrayEntryChecked'
+--
+--     [C declaration]: @SDL_GetTrayEntryChecked@, defined at @SDL3\/SDL_tray.h 389:34@
+sDL_GetTrayEntryChecked
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO BG.CBool
+sDL_GetTrayEntryChecked = hs_bindgen_fe94492d1c67a601
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayEntryEnabled@
+foreign import ccall unsafe "hs_bindgen_5263a949bd152767"
+  hs_bindgen_5263a949bd152767_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayEntryEnabled@
+hs_bindgen_5263a949bd152767
+  :: BG.Ptr SDL_TrayEntry
+  -> BG.CBool
+  -> IO ()
+hs_bindgen_5263a949bd152767 =
+  BG.fromFFIType hs_bindgen_5263a949bd152767_base
+
+-- | Sets whether or not an entry is enabled.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_GetTrayEntryEnabled'
+--
+--     [C declaration]: @SDL_SetTrayEntryEnabled@, defined at @SDL3\/SDL_tray.h 406:34@
+sDL_SetTrayEntryEnabled
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@enabled@]: true if the entry should be enabled; false otherwise.
+  -> IO ()
+sDL_SetTrayEntryEnabled = hs_bindgen_5263a949bd152767
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayEntryEnabled@
+foreign import ccall unsafe "hs_bindgen_76a35c1dee9b4197"
+  hs_bindgen_76a35c1dee9b4197_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayEntryEnabled@
+hs_bindgen_76a35c1dee9b4197
+  :: BG.Ptr SDL_TrayEntry
+  -> IO BG.CBool
+hs_bindgen_76a35c1dee9b4197 =
+  BG.fromFFIType hs_bindgen_76a35c1dee9b4197_base
+
+-- | Gets whether or not an entry is enabled.
+--
+--     [Returns]: true if the entry is enabled; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt', 'sDL_SetTrayEntryEnabled'
+--
+--     [C declaration]: @SDL_GetTrayEntryEnabled@, defined at @SDL3\/SDL_tray.h 423:34@
+sDL_GetTrayEntryEnabled
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO BG.CBool
+sDL_GetTrayEntryEnabled = hs_bindgen_76a35c1dee9b4197
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayEntryCallback@
+foreign import ccall unsafe "hs_bindgen_3a82abfce11b4c94"
+  hs_bindgen_3a82abfce11b4c94_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_SetTrayEntryCallback@
+hs_bindgen_3a82abfce11b4c94
+  :: BG.Ptr SDL_TrayEntry
+  -> SDL_TrayCallback
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_3a82abfce11b4c94 =
+  BG.fromFFIType hs_bindgen_3a82abfce11b4c94_base
+
+-- | Sets a callback to be invoked when the entry is selected.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetTrayEntries', 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_SetTrayEntryCallback@, defined at @SDL3\/SDL_tray.h 441:34@
+sDL_SetTrayEntryCallback
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> SDL_TrayCallback
+  -- ^
+  --
+  --           [@callback@]: a callback to be invoked when the entry is selected.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> IO ()
+sDL_SetTrayEntryCallback =
+  hs_bindgen_3a82abfce11b4c94
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_ClickTrayEntry@
+foreign import ccall unsafe "hs_bindgen_a8a4d1df90923df2"
+  hs_bindgen_a8a4d1df90923df2_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_ClickTrayEntry@
+hs_bindgen_a8a4d1df90923df2
+  :: BG.Ptr SDL_TrayEntry
+  -> IO ()
+hs_bindgen_a8a4d1df90923df2 =
+  BG.fromFFIType hs_bindgen_a8a4d1df90923df2_base
+
+-- | Simulate a click on a tray entry.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ClickTrayEntry@, defined at @SDL3\/SDL_tray.h 453:34@
+sDL_ClickTrayEntry
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: The entry to activate.
+  -> IO ()
+sDL_ClickTrayEntry = hs_bindgen_a8a4d1df90923df2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_DestroyTray@
+foreign import ccall unsafe "hs_bindgen_fe47cafa5c754a5a"
+  hs_bindgen_fe47cafa5c754a5a_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_DestroyTray@
+hs_bindgen_fe47cafa5c754a5a
+  :: BG.Ptr SDL_Tray
+  -> IO ()
+hs_bindgen_fe47cafa5c754a5a =
+  BG.fromFFIType hs_bindgen_fe47cafa5c754a5a_base
+
+-- | Destroys a tray object.
+--
+--     This also destroys all associated menus and entries.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTray'
+--
+--     [C declaration]: @SDL_DestroyTray@, defined at @SDL3\/SDL_tray.h 469:34@
+sDL_DestroyTray
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be destroyed.
+  -> IO ()
+sDL_DestroyTray = hs_bindgen_fe47cafa5c754a5a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayEntryParent@
+foreign import ccall unsafe "hs_bindgen_3e7aeb66ff2f2f10"
+  hs_bindgen_3e7aeb66ff2f2f10_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayEntryParent@
+hs_bindgen_3e7aeb66ff2f2f10
+  :: BG.Ptr SDL_TrayEntry
+  -> IO (BG.Ptr SDL_TrayMenu)
+hs_bindgen_3e7aeb66ff2f2f10 =
+  BG.fromFFIType hs_bindgen_3e7aeb66ff2f2f10_base
+
+-- | Gets the menu containing a certain tray entry.
+--
+--     [Returns]: the parent menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_InsertTrayEntryAt'
+--
+--     [C declaration]: @SDL_GetTrayEntryParent@, defined at @SDL3\/SDL_tray.h 484:44@
+sDL_GetTrayEntryParent
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry for which to get the parent menu.
+  -> IO (BG.Ptr SDL_TrayMenu)
+sDL_GetTrayEntryParent = hs_bindgen_3e7aeb66ff2f2f10
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayMenuParentEntry@
+foreign import ccall unsafe "hs_bindgen_89d0a7d911ebcebd"
+  hs_bindgen_89d0a7d911ebcebd_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayMenuParentEntry@
+hs_bindgen_89d0a7d911ebcebd
+  :: BG.Ptr SDL_TrayMenu
+  -> IO (BG.Ptr SDL_TrayEntry)
+hs_bindgen_89d0a7d911ebcebd =
+  BG.fromFFIType hs_bindgen_89d0a7d911ebcebd_base
+
+-- | Gets the entry for which the menu is a submenu, if the current menu is a submenu.
+--
+--     Either this function or @SDL_GetTrayMenuParentTray()@ will return non-NULL for any given menu.
+--
+--     [Returns]: the parent entry, or NULL if this menu is not a submenu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTraySubmenu', 'sDL_GetTrayMenuParentTray'
+--
+--     [C declaration]: @SDL_GetTrayMenuParentEntry@, defined at @SDL3\/SDL_tray.h 504:45@
+sDL_GetTrayMenuParentEntry
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu for which to get the parent entry.
+  -> IO (BG.Ptr SDL_TrayEntry)
+sDL_GetTrayMenuParentEntry =
+  hs_bindgen_89d0a7d911ebcebd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayMenuParentTray@
+foreign import ccall unsafe "hs_bindgen_48fcf0bd7a472bcb"
+  hs_bindgen_48fcf0bd7a472bcb_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_GetTrayMenuParentTray@
+hs_bindgen_48fcf0bd7a472bcb
+  :: BG.Ptr SDL_TrayMenu
+  -> IO (BG.Ptr SDL_Tray)
+hs_bindgen_48fcf0bd7a472bcb =
+  BG.fromFFIType hs_bindgen_48fcf0bd7a472bcb_base
+
+-- | Gets the tray for which this menu is the first-level menu, if the current menu isn\'t a submenu.
+--
+--     Either this function or @SDL_GetTrayMenuParentEntry()@ will return non-NULL for any given menu.
+--
+--     [Returns]: the parent tray, or NULL if this menu is a submenu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateTrayMenu', 'sDL_GetTrayMenuParentEntry'
+--
+--     [C declaration]: @SDL_GetTrayMenuParentTray@, defined at @SDL3\/SDL_tray.h 524:40@
+sDL_GetTrayMenuParentTray
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu for which to get the parent enttrayry.
+  -> IO (BG.Ptr SDL_Tray)
+sDL_GetTrayMenuParentTray =
+  hs_bindgen_48fcf0bd7a472bcb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_UpdateTrays@
+foreign import ccall unsafe "hs_bindgen_03e94a19f107d107"
+  hs_bindgen_03e94a19f107d107_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Tray_Unsafe_SDL_UpdateTrays@
+hs_bindgen_03e94a19f107d107 :: IO ()
+hs_bindgen_03e94a19f107d107 =
+  BG.fromFFIType hs_bindgen_03e94a19f107d107_base
+
+-- | Update the trays.
+--
+--     This is called automatically by the event loop and is only needed if you\'re using trays but aren\'t handling SDL events.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_UpdateTrays@, defined at @SDL3\/SDL_tray.h 536:34@
+sDL_UpdateTrays :: IO ()
+sDL_UpdateTrays = hs_bindgen_03e94a19f107d107
diff --git a/src/SDL3/Sys/Bindgen/Version.hs b/src/SDL3/Sys/Bindgen/Version.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Version.hs
@@ -0,0 +1,202 @@
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | Functionality to query the current SDL version, both as headers the app was compiled against, and a library the app is linked to. The current major version of SDL headers.
+--
+--     If this were SDL version 3.2.1, this value would be 3.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Version (
+  SDL3.Sys.Bindgen.Version.sDL_MAJOR_VERSION,
+  SDL3.Sys.Bindgen.Version.sDL_MINOR_VERSION,
+  SDL3.Sys.Bindgen.Version.sDL_MICRO_VERSION,
+  SDL3.Sys.Bindgen.Version.sDL_VERSIONNUM,
+  SDL3.Sys.Bindgen.Version.sDL_VERSIONNUM_MAJOR,
+  SDL3.Sys.Bindgen.Version.sDL_VERSIONNUM_MINOR,
+  SDL3.Sys.Bindgen.Version.sDL_VERSIONNUM_MICRO,
+  SDL3.Sys.Bindgen.Version.sDL_VERSION,
+  SDL3.Sys.Bindgen.Version.sDL_VERSION_ATLEAST,
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.Support qualified as BG
+
+-- | [C declaration]: @macro SDL_MAJOR_VERSION@, defined at @SDL3\/SDL_version.h 47:9@
+sDL_MAJOR_VERSION :: BG.CInt
+sDL_MAJOR_VERSION = (3 :: BG.CInt)
+
+-- | The current minor version of the SDL headers.
+--
+--     If this were SDL version 3.2.1, this value would be 2.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_MINOR_VERSION@, defined at @SDL3\/SDL_version.h 56:9@
+sDL_MINOR_VERSION :: BG.CInt
+sDL_MINOR_VERSION = (4 :: BG.CInt)
+
+-- | The current micro (or patchlevel) version of the SDL headers.
+--
+--     If this were SDL version 3.2.1, this value would be 1.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_MICRO_VERSION@, defined at @SDL3\/SDL_version.h 65:9@
+sDL_MICRO_VERSION :: BG.CInt
+sDL_MICRO_VERSION = (2 :: BG.CInt)
+
+-- | This macro turns the version numbers into a numeric value.
+--
+--     (1,2,3) becomes 1002003.
+--
+--     [@major@]: the major version number.
+--
+--     [@minor@]: the minorversion number.
+--
+--     [@patch@]: the patch version number.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_VERSIONNUM@, defined at @SDL3\/SDL_version.h 78:9@
+sDL_VERSIONNUM
+  :: forall a0 b1 c2
+   . ( C.Expr.HostPlatform.Add
+         (C.Expr.HostPlatform.MultRes a0 BG.CInt)
+         (C.Expr.HostPlatform.MultRes b1 BG.CInt)
+     )
+  => ( C.Expr.HostPlatform.Add
+         ( C.Expr.HostPlatform.AddRes
+             (C.Expr.HostPlatform.MultRes a0 BG.CInt)
+             (C.Expr.HostPlatform.MultRes b1 BG.CInt)
+         )
+         c2
+     )
+  => (C.Expr.HostPlatform.Mult b1 BG.CInt)
+  => (C.Expr.HostPlatform.Mult a0 BG.CInt)
+  => a0
+  -> b1
+  -> c2
+  -> C.Expr.HostPlatform.AddRes
+       ( C.Expr.HostPlatform.AddRes
+           (C.Expr.HostPlatform.MultRes a0 BG.CInt)
+           (C.Expr.HostPlatform.MultRes b1 BG.CInt)
+       )
+       c2
+sDL_VERSIONNUM =
+  \major0 ->
+    \minor1 ->
+      \patch2 ->
+        (C.Expr.HostPlatform.+)
+          ( (C.Expr.HostPlatform.+)
+              ((C.Expr.HostPlatform.*) major0 (1000000 :: BG.CInt))
+              ((C.Expr.HostPlatform.*) minor1 (1000 :: BG.CInt))
+          )
+          patch2
+
+-- | This macro extracts the major version from a version number
+--
+--     1002003 becomes 1.
+--
+--     [@version@]: the version number.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_VERSIONNUM_MAJOR@, defined at @SDL3\/SDL_version.h 92:9@
+sDL_VERSIONNUM_MAJOR
+  :: forall a0. (C.Expr.HostPlatform.Div a0 BG.CInt) => a0 -> C.Expr.HostPlatform.DivRes a0 BG.CInt
+sDL_VERSIONNUM_MAJOR =
+  \version0 ->
+    (C.Expr.HostPlatform./) version0 (1000000 :: BG.CInt)
+
+-- | This macro extracts the minor version from a version number
+--
+--     1002003 becomes 2.
+--
+--     [@version@]: the version number.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_VERSIONNUM_MINOR@, defined at @SDL3\/SDL_version.h 105:9@
+sDL_VERSIONNUM_MINOR
+  :: forall a0
+   . (C.Expr.HostPlatform.Div a0 BG.CInt)
+  => (C.Expr.HostPlatform.Rem (C.Expr.HostPlatform.DivRes a0 BG.CInt) BG.CInt)
+  => a0 -> C.Expr.HostPlatform.RemRes (C.Expr.HostPlatform.DivRes a0 BG.CInt) BG.CInt
+sDL_VERSIONNUM_MINOR =
+  \version0 ->
+    (C.Expr.HostPlatform.%) ((C.Expr.HostPlatform./) version0 (1000 :: BG.CInt)) (1000 :: BG.CInt)
+
+-- | This macro extracts the micro version from a version number
+--
+--     1002003 becomes 3.
+--
+--     [@version@]: the version number.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_VERSIONNUM_MICRO@, defined at @SDL3\/SDL_version.h 118:9@
+sDL_VERSIONNUM_MICRO
+  :: forall a0. (C.Expr.HostPlatform.Rem a0 BG.CInt) => a0 -> C.Expr.HostPlatform.RemRes a0 BG.CInt
+sDL_VERSIONNUM_MICRO =
+  \version0 ->
+    (C.Expr.HostPlatform.%) version0 (1000 :: BG.CInt)
+
+-- | This is the version number macro for the current SDL version.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetVersion'
+--
+--     [C declaration]: @macro SDL_VERSION@, defined at @SDL3\/SDL_version.h 129:9@
+sDL_VERSION :: BG.CInt
+sDL_VERSION =
+  sDL_VERSIONNUM sDL_MAJOR_VERSION sDL_MINOR_VERSION sDL_MICRO_VERSION
+
+-- | This macro will evaluate to true if compiled with SDL at least X.Y.Z.
+--
+--     [Thread safety]: It is safe to call this macro from any thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_VERSION_ATLEAST@, defined at @SDL3\/SDL_version.h 139:9@
+sDL_VERSION_ATLEAST
+  :: forall a0 b1 c2
+   . ( C.Expr.HostPlatform.RelOrd
+         BG.CInt
+         ( C.Expr.HostPlatform.AddRes
+             ( C.Expr.HostPlatform.AddRes
+                 (C.Expr.HostPlatform.MultRes a0 BG.CInt)
+                 (C.Expr.HostPlatform.MultRes b1 BG.CInt)
+             )
+             c2
+         )
+     )
+  => ( C.Expr.HostPlatform.Add
+         ( C.Expr.HostPlatform.AddRes
+             (C.Expr.HostPlatform.MultRes a0 BG.CInt)
+             (C.Expr.HostPlatform.MultRes b1 BG.CInt)
+         )
+         c2
+     )
+  => ( C.Expr.HostPlatform.Add
+         (C.Expr.HostPlatform.MultRes a0 BG.CInt)
+         (C.Expr.HostPlatform.MultRes b1 BG.CInt)
+     )
+  => (C.Expr.HostPlatform.Mult a0 BG.CInt)
+  => (C.Expr.HostPlatform.Mult b1 BG.CInt)
+  => a0 -> b1 -> c2 -> BG.CInt
+sDL_VERSION_ATLEAST =
+  \x0 ->
+    \y1 ->
+      \z2 ->
+        (C.Expr.HostPlatform.>=) sDL_VERSION (sDL_VERSIONNUM x0 y1 z2)
diff --git a/src/SDL3/Sys/Bindgen/Version/FunPtr.hs b/src/SDL3/Sys/Bindgen/Version/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Version/FunPtr.hs
@@ -0,0 +1,98 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Version.FunPtr (
+  SDL3.Sys.Bindgen.Version.FunPtr.sDL_GetVersion,
+  SDL3.Sys.Bindgen.Version.FunPtr.sDL_GetRevision,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_version.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Version_get_SDL_GetVersion */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_44ed10f40287cec8 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetVersion;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Version_get_SDL_GetRevision */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_e9f711a7185d859a (void)) (void)"
+         , "{"
+         , "  return &SDL_GetRevision;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_get_SDL_GetVersion@
+foreign import ccall unsafe "hs_bindgen_44ed10f40287cec8"
+  hs_bindgen_44ed10f40287cec8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_get_SDL_GetVersion@
+hs_bindgen_44ed10f40287cec8 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_44ed10f40287cec8 =
+  BG.fromFFIType hs_bindgen_44ed10f40287cec8_base
+
+{-# NOINLINE sDL_GetVersion #-}
+
+-- | Get the version of SDL that is linked against your program.
+--
+--     If you are linking to SDL dynamically, then it is possible that the current version will be different than the version you compiled against. This function returns the current version, while SDL_VERSION is the version you compiled with.
+--
+--     This function may be called safely at any time, even before SDL_Init().
+--
+--     [Returns]: the version of the linked library.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRevision'
+--
+--     [C declaration]: @SDL_GetVersion@, defined at @SDL3\/SDL_version.h 160:33@
+sDL_GetVersion :: BG.FunPtr (IO BG.CInt)
+sDL_GetVersion =
+  BG.unsafePerformIO hs_bindgen_44ed10f40287cec8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_get_SDL_GetRevision@
+foreign import ccall unsafe "hs_bindgen_e9f711a7185d859a"
+  hs_bindgen_e9f711a7185d859a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_get_SDL_GetRevision@
+hs_bindgen_e9f711a7185d859a :: IO (BG.FunPtr (IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_e9f711a7185d859a =
+  BG.fromFFIType hs_bindgen_e9f711a7185d859a_base
+
+{-# NOINLINE sDL_GetRevision #-}
+
+-- | Get the code revision of the SDL library that is linked against your program.
+--
+--     This value is the revision of the code you are linking against and may be different from the code you are compiling with, which is found in the constant SDL_REVISION if you explicitly include SDL_revision.h
+--
+--     The revision is an arbitrary string (a hash value) uniquely identifying the exact revision of the SDL library in use, and is only useful in comparing against other revisions. It is NOT an incrementing number.
+--
+--     If SDL wasn\'t built from a git repository with the appropriate tools, this will return an empty string.
+--
+--     You shouldn\'t use this function for anything but logging it for debugging purposes. The string is not intended to be reliable in any way.
+--
+--     [Returns]: an arbitrary string, uniquely identifying the exact revision of the SDL library in use.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetVersion'
+--
+--     [C declaration]: @SDL_GetRevision@, defined at @SDL3\/SDL_version.h 189:42@
+sDL_GetRevision :: BG.FunPtr (IO (PtrConst.PtrConst BG.CChar))
+sDL_GetRevision =
+  BG.unsafePerformIO hs_bindgen_e9f711a7185d859a
diff --git a/src/SDL3/Sys/Bindgen/Version/Safe.hs b/src/SDL3/Sys/Bindgen/Version/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Version/Safe.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Version.Safe (
+  SDL3.Sys.Bindgen.Version.Safe.sDL_GetVersion,
+  SDL3.Sys.Bindgen.Version.Safe.sDL_GetRevision,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_version.h>"
+         , "signed int hs_bindgen_773c658657d9ec27 (void)"
+         , "{"
+         , "  return (SDL_GetVersion)();"
+         , "}"
+         , "char const *hs_bindgen_56f1110e8f8cc4a0 (void)"
+         , "{"
+         , "  return (SDL_GetRevision)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_Safe_SDL_GetVersion@
+foreign import ccall safe "hs_bindgen_773c658657d9ec27"
+  hs_bindgen_773c658657d9ec27_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_Safe_SDL_GetVersion@
+hs_bindgen_773c658657d9ec27 :: IO BG.CInt
+hs_bindgen_773c658657d9ec27 =
+  BG.fromFFIType hs_bindgen_773c658657d9ec27_base
+
+-- | Get the version of SDL that is linked against your program.
+--
+--     If you are linking to SDL dynamically, then it is possible that the current version will be different than the version you compiled against. This function returns the current version, while SDL_VERSION is the version you compiled with.
+--
+--     This function may be called safely at any time, even before SDL_Init().
+--
+--     [Returns]: the version of the linked library.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRevision'
+--
+--     [C declaration]: @SDL_GetVersion@, defined at @SDL3\/SDL_version.h 160:33@
+sDL_GetVersion :: IO BG.CInt
+sDL_GetVersion = hs_bindgen_773c658657d9ec27
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_Safe_SDL_GetRevision@
+foreign import ccall safe "hs_bindgen_56f1110e8f8cc4a0"
+  hs_bindgen_56f1110e8f8cc4a0_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_Safe_SDL_GetRevision@
+hs_bindgen_56f1110e8f8cc4a0 :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_56f1110e8f8cc4a0 =
+  BG.fromFFIType hs_bindgen_56f1110e8f8cc4a0_base
+
+-- | Get the code revision of the SDL library that is linked against your program.
+--
+--     This value is the revision of the code you are linking against and may be different from the code you are compiling with, which is found in the constant SDL_REVISION if you explicitly include SDL_revision.h
+--
+--     The revision is an arbitrary string (a hash value) uniquely identifying the exact revision of the SDL library in use, and is only useful in comparing against other revisions. It is NOT an incrementing number.
+--
+--     If SDL wasn\'t built from a git repository with the appropriate tools, this will return an empty string.
+--
+--     You shouldn\'t use this function for anything but logging it for debugging purposes. The string is not intended to be reliable in any way.
+--
+--     [Returns]: an arbitrary string, uniquely identifying the exact revision of the SDL library in use.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetVersion'
+--
+--     [C declaration]: @SDL_GetRevision@, defined at @SDL3\/SDL_version.h 189:42@
+sDL_GetRevision :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetRevision = hs_bindgen_56f1110e8f8cc4a0
diff --git a/src/SDL3/Sys/Bindgen/Version/Unsafe.hs b/src/SDL3/Sys/Bindgen/Version/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Version/Unsafe.hs
@@ -0,0 +1,88 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Version.Unsafe (
+  SDL3.Sys.Bindgen.Version.Unsafe.sDL_GetVersion,
+  SDL3.Sys.Bindgen.Version.Unsafe.sDL_GetRevision,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_version.h>"
+         , "signed int hs_bindgen_0ffc70e00585797e (void)"
+         , "{"
+         , "  return (SDL_GetVersion)();"
+         , "}"
+         , "char const *hs_bindgen_204f064542493b41 (void)"
+         , "{"
+         , "  return (SDL_GetRevision)();"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_Unsafe_SDL_GetVersion@
+foreign import ccall unsafe "hs_bindgen_0ffc70e00585797e"
+  hs_bindgen_0ffc70e00585797e_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_Unsafe_SDL_GetVersion@
+hs_bindgen_0ffc70e00585797e :: IO BG.CInt
+hs_bindgen_0ffc70e00585797e =
+  BG.fromFFIType hs_bindgen_0ffc70e00585797e_base
+
+-- | Get the version of SDL that is linked against your program.
+--
+--     If you are linking to SDL dynamically, then it is possible that the current version will be different than the version you compiled against. This function returns the current version, while SDL_VERSION is the version you compiled with.
+--
+--     This function may be called safely at any time, even before SDL_Init().
+--
+--     [Returns]: the version of the linked library.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetRevision'
+--
+--     [C declaration]: @SDL_GetVersion@, defined at @SDL3\/SDL_version.h 160:33@
+sDL_GetVersion :: IO BG.CInt
+sDL_GetVersion = hs_bindgen_0ffc70e00585797e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_Unsafe_SDL_GetRevision@
+foreign import ccall unsafe "hs_bindgen_204f064542493b41"
+  hs_bindgen_204f064542493b41_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Version_Unsafe_SDL_GetRevision@
+hs_bindgen_204f064542493b41 :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_204f064542493b41 =
+  BG.fromFFIType hs_bindgen_204f064542493b41_base
+
+-- | Get the code revision of the SDL library that is linked against your program.
+--
+--     This value is the revision of the code you are linking against and may be different from the code you are compiling with, which is found in the constant SDL_REVISION if you explicitly include SDL_revision.h
+--
+--     The revision is an arbitrary string (a hash value) uniquely identifying the exact revision of the SDL library in use, and is only useful in comparing against other revisions. It is NOT an incrementing number.
+--
+--     If SDL wasn\'t built from a git repository with the appropriate tools, this will return an empty string.
+--
+--     You shouldn\'t use this function for anything but logging it for debugging purposes. The string is not intended to be reliable in any way.
+--
+--     [Returns]: an arbitrary string, uniquely identifying the exact revision of the SDL library in use.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetVersion'
+--
+--     [C declaration]: @SDL_GetRevision@, defined at @SDL3\/SDL_version.h 189:42@
+sDL_GetRevision :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetRevision = hs_bindgen_204f064542493b41
diff --git a/src/SDL3/Sys/Bindgen/Video.hs b/src/SDL3/Sys/Bindgen/Video.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Video.hs
@@ -0,0 +1,5547 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DerivingVia #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE ExplicitForAll #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE StandaloneDeriving #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UnboxedTuples #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+-- | SDL\'s video subsystem is largely interested in abstracting window management from the underlying operating system. You can create windows, manage them in various ways, set them fullscreen, and get events when interesting things happen with them, such as the mouse or keyboard interacting with a window.
+--
+--     The video subsystem is also interested in abstracting away some platform-specific differences in OpenGL: context creation, swapping buffers, etc. This may be crucial to your app, but also you are not required to use OpenGL at all. In fact, SDL can provide rendering to those windows as well, either with an easy-to-use [2D API](https://wiki.libsdl.org/SDL3/CategoryRender) or with a more-powerful [GPU API](https://wiki.libsdl.org/SDL3/CategoryGPU). Of course, it can simply get out of your way and give you the window handles you need to use Vulkan, Direct3D, Metal, or whatever else you like directly, too.
+--
+--     The video subsystem covers a lot of functionality, out of necessity, so it is worth perusing the list of functions just to see what\'s available, but most apps can get by with simply creating a window and listening for events, so start with @SDL_CreateWindow()@ and SDL_PollEvent(). This is a unique ID for a display for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     If the display is disconnected and reconnected, it will get a new ID.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+module SDL3.Sys.Bindgen.Video (
+  SDL3.Sys.Bindgen.Video.SDL_DisplayID (..),
+  SDL3.Sys.Bindgen.Video.SDL_WindowID (..),
+  SDL3.Sys.Bindgen.Video.sDL_PROP_GLOBAL_VIDEO_WAYLAND_WL_DISPLAY_POINTER,
+  SDL3.Sys.Bindgen.Video.SDL_SystemTheme (..),
+  pattern SDL3.Sys.Bindgen.Video.SDL_SYSTEM_THEME_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Video.SDL_SYSTEM_THEME_LIGHT,
+  pattern SDL3.Sys.Bindgen.Video.SDL_SYSTEM_THEME_DARK,
+  SDL3.Sys.Bindgen.Video.SDL_DisplayModeData,
+  SDL3.Sys.Bindgen.Video.SDL_DisplayMode (..),
+  SDL3.Sys.Bindgen.Video.SDL_DisplayOrientation (..),
+  pattern SDL3.Sys.Bindgen.Video.SDL_ORIENTATION_UNKNOWN,
+  pattern SDL3.Sys.Bindgen.Video.SDL_ORIENTATION_LANDSCAPE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_ORIENTATION_LANDSCAPE_FLIPPED,
+  pattern SDL3.Sys.Bindgen.Video.SDL_ORIENTATION_PORTRAIT,
+  pattern SDL3.Sys.Bindgen.Video.SDL_ORIENTATION_PORTRAIT_FLIPPED,
+  SDL3.Sys.Bindgen.Video.SDL_Window,
+  SDL3.Sys.Bindgen.Video.SDL_WindowFlags (..),
+  SDL3.Sys.Bindgen.Video.sDL_WINDOWPOS_UNDEFINED_MASK,
+  SDL3.Sys.Bindgen.Video.sDL_WINDOWPOS_UNDEFINED_DISPLAY,
+  SDL3.Sys.Bindgen.Video.sDL_WINDOWPOS_UNDEFINED,
+  SDL3.Sys.Bindgen.Video.sDL_WINDOWPOS_ISUNDEFINED,
+  SDL3.Sys.Bindgen.Video.sDL_WINDOWPOS_CENTERED_MASK,
+  SDL3.Sys.Bindgen.Video.sDL_WINDOWPOS_CENTERED_DISPLAY,
+  SDL3.Sys.Bindgen.Video.sDL_WINDOWPOS_CENTERED,
+  SDL3.Sys.Bindgen.Video.sDL_WINDOWPOS_ISCENTERED,
+  SDL3.Sys.Bindgen.Video.SDL_FlashOperation (..),
+  pattern SDL3.Sys.Bindgen.Video.SDL_FLASH_CANCEL,
+  pattern SDL3.Sys.Bindgen.Video.SDL_FLASH_BRIEFLY,
+  pattern SDL3.Sys.Bindgen.Video.SDL_FLASH_UNTIL_FOCUSED,
+  SDL3.Sys.Bindgen.Video.SDL_ProgressState (..),
+  pattern SDL3.Sys.Bindgen.Video.SDL_PROGRESS_STATE_INVALID,
+  pattern SDL3.Sys.Bindgen.Video.SDL_PROGRESS_STATE_NONE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_PROGRESS_STATE_INDETERMINATE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_PROGRESS_STATE_NORMAL,
+  pattern SDL3.Sys.Bindgen.Video.SDL_PROGRESS_STATE_PAUSED,
+  pattern SDL3.Sys.Bindgen.Video.SDL_PROGRESS_STATE_ERROR,
+  SDL3.Sys.Bindgen.Video.SDL_GLContextState,
+  SDL3.Sys.Bindgen.Video.SDL_GLContext (..),
+  SDL3.Sys.Bindgen.Video.SDL_EGLDisplay (..),
+  SDL3.Sys.Bindgen.Video.SDL_EGLConfig (..),
+  SDL3.Sys.Bindgen.Video.SDL_EGLSurface (..),
+  SDL3.Sys.Bindgen.Video.SDL_EGLAttrib (..),
+  SDL3.Sys.Bindgen.Video.SDL_EGLint (..),
+  SDL3.Sys.Bindgen.Video.SDL_EGLAttribArrayCallback_Aux (..),
+  SDL3.Sys.Bindgen.Video.SDL_EGLAttribArrayCallback (..),
+  SDL3.Sys.Bindgen.Video.SDL_EGLIntArrayCallback_Aux (..),
+  SDL3.Sys.Bindgen.Video.SDL_EGLIntArrayCallback (..),
+  SDL3.Sys.Bindgen.Video.SDL_GLAttr (..),
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_RED_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_GREEN_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_BLUE_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_ALPHA_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_BUFFER_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_DOUBLEBUFFER,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_DEPTH_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_STENCIL_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_ACCUM_RED_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_ACCUM_GREEN_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_ACCUM_BLUE_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_ACCUM_ALPHA_SIZE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_STEREO,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_MULTISAMPLEBUFFERS,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_MULTISAMPLESAMPLES,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_ACCELERATED_VISUAL,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_RETAINED_BACKING,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_CONTEXT_MAJOR_VERSION,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_CONTEXT_MINOR_VERSION,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_CONTEXT_FLAGS,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_CONTEXT_PROFILE_MASK,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_SHARE_WITH_CURRENT_CONTEXT,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_FRAMEBUFFER_SRGB_CAPABLE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_CONTEXT_RELEASE_BEHAVIOR,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_CONTEXT_RESET_NOTIFICATION,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_CONTEXT_NO_ERROR,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_FLOATBUFFERS,
+  pattern SDL3.Sys.Bindgen.Video.SDL_GL_EGL_PLATFORM,
+  SDL3.Sys.Bindgen.Video.SDL_GLProfile (..),
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_PROFILE_CORE,
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_PROFILE_COMPATIBILITY,
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_PROFILE_ES,
+  SDL3.Sys.Bindgen.Video.SDL_GLContextFlag (..),
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_DEBUG_FLAG,
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG,
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_ROBUST_ACCESS_FLAG,
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_RESET_ISOLATION_FLAG,
+  SDL3.Sys.Bindgen.Video.SDL_GLContextReleaseFlag (..),
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE,
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH,
+  SDL3.Sys.Bindgen.Video.SDL_GLContextResetNotification (..),
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_RESET_NO_NOTIFICATION,
+  SDL3.Sys.Bindgen.Video.sDL_GL_CONTEXT_RESET_LOSE_CONTEXT,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_FLAGS_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_FULLSCREEN_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_HIGH_PIXEL_DENSITY_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_MAXIMIZED_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_MENU_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_METAL_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_MINIMIZED_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_MODAL_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_MOUSE_GRABBED_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_PARENT_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_TITLE_STRING,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_TRANSPARENT_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_TOOLTIP_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_UTILITY_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_VULKAN_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_WIDTH_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_X_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_Y_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_SHAPE_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_HDR_ENABLED_BOOLEAN,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_SDR_WHITE_LEVEL_FLOAT,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_HDR_HEADROOM_FLOAT,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_ANDROID_WINDOW_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_ANDROID_SURFACE_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_UIKIT_WINDOW_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_KMSDRM_DEVICE_INDEX_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_KMSDRM_DRM_FD_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_COCOA_WINDOW_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WIN32_HWND_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WIN32_HDC_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WIN32_INSTANCE_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_EXPORT_HANDLE_STRING,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WAYLAND_XDG_POPUP_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_WAYLAND_XDG_POSITIONER_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_X11_DISPLAY_POINTER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_X11_SCREEN_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_X11_WINDOW_NUMBER,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING,
+  SDL3.Sys.Bindgen.Video.sDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING,
+  SDL3.Sys.Bindgen.Video.sDL_WINDOW_SURFACE_VSYNC_DISABLED,
+  SDL3.Sys.Bindgen.Video.sDL_WINDOW_SURFACE_VSYNC_ADAPTIVE,
+  SDL3.Sys.Bindgen.Video.SDL_HitTestResult (..),
+  pattern SDL3.Sys.Bindgen.Video.SDL_HITTEST_NORMAL,
+  pattern SDL3.Sys.Bindgen.Video.SDL_HITTEST_DRAGGABLE,
+  pattern SDL3.Sys.Bindgen.Video.SDL_HITTEST_RESIZE_TOPLEFT,
+  pattern SDL3.Sys.Bindgen.Video.SDL_HITTEST_RESIZE_TOP,
+  pattern SDL3.Sys.Bindgen.Video.SDL_HITTEST_RESIZE_TOPRIGHT,
+  pattern SDL3.Sys.Bindgen.Video.SDL_HITTEST_RESIZE_RIGHT,
+  pattern SDL3.Sys.Bindgen.Video.SDL_HITTEST_RESIZE_BOTTOMRIGHT,
+  pattern SDL3.Sys.Bindgen.Video.SDL_HITTEST_RESIZE_BOTTOM,
+  pattern SDL3.Sys.Bindgen.Video.SDL_HITTEST_RESIZE_BOTTOMLEFT,
+  pattern SDL3.Sys.Bindgen.Video.SDL_HITTEST_RESIZE_LEFT,
+  SDL3.Sys.Bindgen.Video.SDL_HitTest_Aux (..),
+  SDL3.Sys.Bindgen.Video.SDL_HitTest (..),
+)
+where
+
+import C.Expr.HostPlatform qualified
+import HsBindgen.Runtime.CEnum qualified as CEnum
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | [C declaration]: @SDL_DisplayID@, defined at @SDL3\/SDL_video.h 75:16@
+newtype SDL_DisplayID = SDL_DisplayID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_DisplayID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_DisplayID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_DisplayID "unwrap" where
+  type
+    CFieldType SDL_DisplayID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | This is a unique ID for a window.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_WindowID@, defined at @SDL3\/SDL_video.h 84:16@
+newtype SDL_WindowID = SDL_WindowID
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_WindowID ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_WindowID{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_WindowID) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_WindowID "unwrap" where
+  type
+    CFieldType SDL_WindowID "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | The pointer to the global @wl_display@ object used by the Wayland video backend.
+--
+--     Can be set before the video subsystem is initialized to import an external @wl_display@ object from an application or toolkit for use in SDL, or read after initialization to export the @wl_display@ used by the Wayland video backend. Setting this property after the video subsystem has been initialized has no effect, and reading it when the video subsystem is uninitialized will either return the user provided value, if one was set prior to initialization, or NULL. See docs\/README-wayland.md for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @macro SDL_PROP_GLOBAL_VIDEO_WAYLAND_WL_DISPLAY_POINTER@, literal @\"SDL.video.wayland.wl_display\"@, defined at @SDL3\/SDL_video.h 103:9@
+sDL_PROP_GLOBAL_VIDEO_WAYLAND_WL_DISPLAY_POINTER :: BG.ByteString
+sDL_PROP_GLOBAL_VIDEO_WAYLAND_WL_DISPLAY_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x76
+    , 0x69
+    , 0x64
+    , 0x65
+    , 0x6F
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x77
+    , 0x6C
+    , 0x5F
+    , 0x64
+    , 0x69
+    , 0x73
+    , 0x70
+    , 0x6C
+    , 0x61
+    , 0x79
+    ]
+
+-- | System theme.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_SystemTheme@, defined at @SDL3\/SDL_video.h 110:14@
+newtype SDL_SystemTheme = SDL_SystemTheme
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_SystemTheme where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_SystemTheme where
+  readRaw =
+    \ptr0 ->
+      pure SDL_SystemTheme
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_SystemTheme where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_SystemTheme unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_SystemTheme instance BG.Storable SDL_SystemTheme
+
+deriving via BG.CUInt instance BG.Prim SDL_SystemTheme
+
+instance CEnum.CEnum SDL_SystemTheme where
+  type CEnumZ SDL_SystemTheme = BG.CUInt
+
+  toCEnum = SDL_SystemTheme
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_SYSTEM_THEME_UNKNOWN")
+        , (1, BG.singleton "SDL_SYSTEM_THEME_LIGHT")
+        , (2, BG.singleton "SDL_SYSTEM_THEME_DARK")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_SystemTheme"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_SystemTheme"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_SystemTheme where
+  minDeclaredValue = SDL_SYSTEM_THEME_UNKNOWN
+
+  maxDeclaredValue = SDL_SYSTEM_THEME_DARK
+
+instance Show SDL_SystemTheme where
+  showsPrec = CEnum.shows
+
+instance Read SDL_SystemTheme where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_SystemTheme ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_SystemTheme{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_SystemTheme) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_SystemTheme "unwrap" where
+  type CFieldType SDL_SystemTheme "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Unknown system theme
+--
+--     [C declaration]: @SDL_SYSTEM_THEME_UNKNOWN@, defined at @SDL3\/SDL_video.h 112:5@
+pattern SDL_SYSTEM_THEME_UNKNOWN :: SDL_SystemTheme
+pattern SDL_SYSTEM_THEME_UNKNOWN = SDL_SystemTheme 0
+
+-- | Light colored system theme
+--
+--     [C declaration]: @SDL_SYSTEM_THEME_LIGHT@, defined at @SDL3\/SDL_video.h 113:5@
+pattern SDL_SYSTEM_THEME_LIGHT :: SDL_SystemTheme
+pattern SDL_SYSTEM_THEME_LIGHT = SDL_SystemTheme 1
+
+-- | Dark colored system theme
+--
+--     [C declaration]: @SDL_SYSTEM_THEME_DARK@, defined at @SDL3\/SDL_video.h 114:5@
+pattern SDL_SYSTEM_THEME_DARK :: SDL_SystemTheme
+pattern SDL_SYSTEM_THEME_DARK = SDL_SystemTheme 2
+
+-- | Internal display mode data.
+--
+--     This lives as a field in 'SDL_DisplayMode', as opaque data.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DisplayMode'
+--
+--     [C declaration]: @struct SDL_DisplayModeData@, defined at @SDL3\/SDL_video.h 126:16@
+data SDL_DisplayModeData
+
+-- | The structure that defines a display mode.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetFullscreenDisplayModes', 'sDL_GetDesktopDisplayMode', 'sDL_GetCurrentDisplayMode', 'sDL_SetWindowFullscreenMode', 'sDL_GetWindowFullscreenMode'
+--
+--     [C declaration]: @struct SDL_DisplayMode@, defined at @SDL3\/SDL_video.h 139:16@
+data SDL_DisplayMode = SDL_DisplayMode
+  { displayID :: SDL_DisplayID
+  -- ^ the display this mode is associated with
+  --
+  --          [C declaration]: @displayID@, defined at @SDL3\/SDL_video.h 141:19@
+  , format :: SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^ pixel format
+  --
+  --          [C declaration]: @format@, defined at @SDL3\/SDL_video.h 142:21@
+  , w :: BG.CInt
+  -- ^ width
+  --
+  --          [C declaration]: @w@, defined at @SDL3\/SDL_video.h 143:9@
+  , h :: BG.CInt
+  -- ^ height
+  --
+  --          [C declaration]: @h@, defined at @SDL3\/SDL_video.h 144:9@
+  , pixel_density :: BG.CFloat
+  -- ^ scale converting size to pixels (e.g. a 1920x1080 mode with 2.0 scale would have 3840x2160 pixels)
+  --
+  --          [C declaration]: @pixel_density@, defined at @SDL3\/SDL_video.h 145:11@
+  , refresh_rate :: BG.CFloat
+  -- ^ refresh rate (or 0.0f for unspecified)
+  --
+  --          [C declaration]: @refresh_rate@, defined at @SDL3\/SDL_video.h 146:11@
+  , refresh_rate_numerator :: BG.CInt
+  -- ^ precise refresh rate numerator (or 0 for unspecified)
+  --
+  --          [C declaration]: @refresh_rate_numerator@, defined at @SDL3\/SDL_video.h 147:9@
+  , refresh_rate_denominator :: BG.CInt
+  -- ^ precise refresh rate denominator
+  --
+  --          [C declaration]: @refresh_rate_denominator@, defined at @SDL3\/SDL_video.h 148:9@
+  , internal :: BG.Ptr SDL_DisplayModeData
+  -- ^ Private
+  --
+  --          [C declaration]: @internal@, defined at @SDL3\/SDL_video.h 150:26@
+  }
+  deriving stock (BG.Generic, Eq, Show)
+
+instance Marshal.StaticSize SDL_DisplayMode where
+  staticSizeOf = \_ -> (40 :: Int)
+
+  staticAlignment = \_ -> (8 :: Int)
+
+instance Marshal.ReadRaw SDL_DisplayMode where
+  readRaw =
+    \ptr0 ->
+      pure SDL_DisplayMode
+        <*> HasCField.readRaw (BG.Proxy @"displayID") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"format") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"w") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"h") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"pixel_density") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"refresh_rate") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"refresh_rate_numerator") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"refresh_rate_denominator") ptr0
+        <*> HasCField.readRaw (BG.Proxy @"internal") ptr0
+
+instance Marshal.WriteRaw SDL_DisplayMode where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_DisplayMode
+            displayID2
+            format3
+            w4
+            h5
+            pixel_density6
+            refresh_rate7
+            refresh_rate_numerator8
+            refresh_rate_denominator9
+            internal10 ->
+              HasCField.writeRaw (BG.Proxy @"displayID") ptr0 displayID2
+                >> HasCField.writeRaw (BG.Proxy @"format") ptr0 format3
+                >> HasCField.writeRaw (BG.Proxy @"w") ptr0 w4
+                >> HasCField.writeRaw (BG.Proxy @"h") ptr0 h5
+                >> HasCField.writeRaw (BG.Proxy @"pixel_density") ptr0 pixel_density6
+                >> HasCField.writeRaw (BG.Proxy @"refresh_rate") ptr0 refresh_rate7
+                >> HasCField.writeRaw (BG.Proxy @"refresh_rate_numerator") ptr0 refresh_rate_numerator8
+                >> HasCField.writeRaw (BG.Proxy @"refresh_rate_denominator") ptr0 refresh_rate_denominator9
+                >> HasCField.writeRaw (BG.Proxy @"internal") ptr0 internal10
+
+deriving via Marshal.EquivStorable SDL_DisplayMode instance BG.Storable SDL_DisplayMode
+
+instance
+  (ty ~ SDL_DisplayID)
+  => BG.CompatHasField.HasField "displayID" SDL_DisplayMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayMode
+            { displayID = y1
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pixel_density = BG.getField @"pixel_density" x0
+            , refresh_rate = BG.getField @"refresh_rate" x0
+            , refresh_rate_numerator = BG.getField @"refresh_rate_numerator" x0
+            , refresh_rate_denominator = BG.getField @"refresh_rate_denominator" x0
+            , internal = BG.getField @"internal" x0
+            }
+      , BG.getField @"displayID" x0
+      )
+
+instance
+  (ty ~ SDL_DisplayID)
+  => BG.HasField "displayID" (BG.Ptr SDL_DisplayMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"displayID")
+
+instance HasCField.HasCField SDL_DisplayMode "displayID" where
+  type
+    CFieldType SDL_DisplayMode "displayID" =
+      SDL_DisplayID
+
+  offset# = \_ -> \_ -> 0
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat)
+  => BG.CompatHasField.HasField "format" SDL_DisplayMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayMode
+            { format = y1
+            , displayID = BG.getField @"displayID" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pixel_density = BG.getField @"pixel_density" x0
+            , refresh_rate = BG.getField @"refresh_rate" x0
+            , refresh_rate_numerator = BG.getField @"refresh_rate_numerator" x0
+            , refresh_rate_denominator = BG.getField @"refresh_rate_denominator" x0
+            , internal = BG.getField @"internal" x0
+            }
+      , BG.getField @"format" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat)
+  => BG.HasField "format" (BG.Ptr SDL_DisplayMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"format")
+
+instance HasCField.HasCField SDL_DisplayMode "format" where
+  type
+    CFieldType SDL_DisplayMode "format" =
+      SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+
+  offset# = \_ -> \_ -> 4
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "w" SDL_DisplayMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayMode
+            { w = y1
+            , displayID = BG.getField @"displayID" x0
+            , format = BG.getField @"format" x0
+            , h = BG.getField @"h" x0
+            , pixel_density = BG.getField @"pixel_density" x0
+            , refresh_rate = BG.getField @"refresh_rate" x0
+            , refresh_rate_numerator = BG.getField @"refresh_rate_numerator" x0
+            , refresh_rate_denominator = BG.getField @"refresh_rate_denominator" x0
+            , internal = BG.getField @"internal" x0
+            }
+      , BG.getField @"w" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "w" (BG.Ptr SDL_DisplayMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"w")
+
+instance HasCField.HasCField SDL_DisplayMode "w" where
+  type CFieldType SDL_DisplayMode "w" = BG.CInt
+
+  offset# = \_ -> \_ -> 8
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "h" SDL_DisplayMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayMode
+            { h = y1
+            , displayID = BG.getField @"displayID" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , pixel_density = BG.getField @"pixel_density" x0
+            , refresh_rate = BG.getField @"refresh_rate" x0
+            , refresh_rate_numerator = BG.getField @"refresh_rate_numerator" x0
+            , refresh_rate_denominator = BG.getField @"refresh_rate_denominator" x0
+            , internal = BG.getField @"internal" x0
+            }
+      , BG.getField @"h" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "h" (BG.Ptr SDL_DisplayMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"h")
+
+instance HasCField.HasCField SDL_DisplayMode "h" where
+  type CFieldType SDL_DisplayMode "h" = BG.CInt
+
+  offset# = \_ -> \_ -> 12
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "pixel_density" SDL_DisplayMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayMode
+            { pixel_density = y1
+            , displayID = BG.getField @"displayID" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , refresh_rate = BG.getField @"refresh_rate" x0
+            , refresh_rate_numerator = BG.getField @"refresh_rate_numerator" x0
+            , refresh_rate_denominator = BG.getField @"refresh_rate_denominator" x0
+            , internal = BG.getField @"internal" x0
+            }
+      , BG.getField @"pixel_density" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "pixel_density" (BG.Ptr SDL_DisplayMode) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"pixel_density")
+
+instance HasCField.HasCField SDL_DisplayMode "pixel_density" where
+  type
+    CFieldType SDL_DisplayMode "pixel_density" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 16
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.CompatHasField.HasField "refresh_rate" SDL_DisplayMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayMode
+            { refresh_rate = y1
+            , displayID = BG.getField @"displayID" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pixel_density = BG.getField @"pixel_density" x0
+            , refresh_rate_numerator = BG.getField @"refresh_rate_numerator" x0
+            , refresh_rate_denominator = BG.getField @"refresh_rate_denominator" x0
+            , internal = BG.getField @"internal" x0
+            }
+      , BG.getField @"refresh_rate" x0
+      )
+
+instance
+  (ty ~ BG.CFloat)
+  => BG.HasField "refresh_rate" (BG.Ptr SDL_DisplayMode) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"refresh_rate")
+
+instance HasCField.HasCField SDL_DisplayMode "refresh_rate" where
+  type
+    CFieldType SDL_DisplayMode "refresh_rate" =
+      BG.CFloat
+
+  offset# = \_ -> \_ -> 20
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "refresh_rate_numerator" SDL_DisplayMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayMode
+            { refresh_rate_numerator = y1
+            , displayID = BG.getField @"displayID" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pixel_density = BG.getField @"pixel_density" x0
+            , refresh_rate = BG.getField @"refresh_rate" x0
+            , refresh_rate_denominator = BG.getField @"refresh_rate_denominator" x0
+            , internal = BG.getField @"internal" x0
+            }
+      , BG.getField @"refresh_rate_numerator" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "refresh_rate_numerator" (BG.Ptr SDL_DisplayMode) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"refresh_rate_numerator")
+
+instance HasCField.HasCField SDL_DisplayMode "refresh_rate_numerator" where
+  type
+    CFieldType SDL_DisplayMode "refresh_rate_numerator" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 24
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "refresh_rate_denominator" SDL_DisplayMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayMode
+            { refresh_rate_denominator = y1
+            , displayID = BG.getField @"displayID" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pixel_density = BG.getField @"pixel_density" x0
+            , refresh_rate = BG.getField @"refresh_rate" x0
+            , refresh_rate_numerator = BG.getField @"refresh_rate_numerator" x0
+            , internal = BG.getField @"internal" x0
+            }
+      , BG.getField @"refresh_rate_denominator" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "refresh_rate_denominator" (BG.Ptr SDL_DisplayMode) (BG.Ptr ty)
+  where
+  getField =
+    HasCField.fromPtr (BG.Proxy @"refresh_rate_denominator")
+
+instance HasCField.HasCField SDL_DisplayMode "refresh_rate_denominator" where
+  type
+    CFieldType SDL_DisplayMode "refresh_rate_denominator" =
+      BG.CInt
+
+  offset# = \_ -> \_ -> 28
+
+instance
+  (ty ~ BG.Ptr SDL_DisplayModeData)
+  => BG.CompatHasField.HasField "internal" SDL_DisplayMode ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayMode
+            { internal = y1
+            , displayID = BG.getField @"displayID" x0
+            , format = BG.getField @"format" x0
+            , w = BG.getField @"w" x0
+            , h = BG.getField @"h" x0
+            , pixel_density = BG.getField @"pixel_density" x0
+            , refresh_rate = BG.getField @"refresh_rate" x0
+            , refresh_rate_numerator = BG.getField @"refresh_rate_numerator" x0
+            , refresh_rate_denominator = BG.getField @"refresh_rate_denominator" x0
+            }
+      , BG.getField @"internal" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_DisplayModeData)
+  => BG.HasField "internal" (BG.Ptr SDL_DisplayMode) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"internal")
+
+instance HasCField.HasCField SDL_DisplayMode "internal" where
+  type
+    CFieldType SDL_DisplayMode "internal" =
+      BG.Ptr SDL_DisplayModeData
+
+  offset# = \_ -> \_ -> 32
+
+-- | Display orientation values; the way a display is rotated.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_DisplayOrientation@, defined at @SDL3\/SDL_video.h 159:14@
+newtype SDL_DisplayOrientation = SDL_DisplayOrientation
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_DisplayOrientation where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_DisplayOrientation where
+  readRaw =
+    \ptr0 ->
+      pure SDL_DisplayOrientation
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_DisplayOrientation where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_DisplayOrientation unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via
+  Marshal.EquivStorable SDL_DisplayOrientation
+  instance
+    BG.Storable SDL_DisplayOrientation
+
+deriving via BG.CUInt instance BG.Prim SDL_DisplayOrientation
+
+instance CEnum.CEnum SDL_DisplayOrientation where
+  type CEnumZ SDL_DisplayOrientation = BG.CUInt
+
+  toCEnum = SDL_DisplayOrientation
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_ORIENTATION_UNKNOWN")
+        , (1, BG.singleton "SDL_ORIENTATION_LANDSCAPE")
+        , (2, BG.singleton "SDL_ORIENTATION_LANDSCAPE_FLIPPED")
+        , (3, BG.singleton "SDL_ORIENTATION_PORTRAIT")
+        , (4, BG.singleton "SDL_ORIENTATION_PORTRAIT_FLIPPED")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_DisplayOrientation"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_DisplayOrientation"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_DisplayOrientation where
+  minDeclaredValue = SDL_ORIENTATION_UNKNOWN
+
+  maxDeclaredValue = SDL_ORIENTATION_PORTRAIT_FLIPPED
+
+instance Show SDL_DisplayOrientation where
+  showsPrec = CEnum.shows
+
+instance Read SDL_DisplayOrientation where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_DisplayOrientation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_DisplayOrientation{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_DisplayOrientation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_DisplayOrientation "unwrap" where
+  type
+    CFieldType SDL_DisplayOrientation "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | The display orientation can\'t be determined
+--
+--     [C declaration]: @SDL_ORIENTATION_UNKNOWN@, defined at @SDL3\/SDL_video.h 161:5@
+pattern SDL_ORIENTATION_UNKNOWN :: SDL_DisplayOrientation
+pattern SDL_ORIENTATION_UNKNOWN = SDL_DisplayOrientation 0
+
+-- | The display is in landscape mode, with the right side up, relative to portrait mode
+--
+--     [C declaration]: @SDL_ORIENTATION_LANDSCAPE@, defined at @SDL3\/SDL_video.h 162:5@
+pattern SDL_ORIENTATION_LANDSCAPE :: SDL_DisplayOrientation
+pattern SDL_ORIENTATION_LANDSCAPE = SDL_DisplayOrientation 1
+
+-- | The display is in landscape mode, with the left side up, relative to portrait mode
+--
+--     [C declaration]: @SDL_ORIENTATION_LANDSCAPE_FLIPPED@, defined at @SDL3\/SDL_video.h 163:5@
+pattern SDL_ORIENTATION_LANDSCAPE_FLIPPED :: SDL_DisplayOrientation
+pattern SDL_ORIENTATION_LANDSCAPE_FLIPPED = SDL_DisplayOrientation 2
+
+-- | The display is in portrait mode
+--
+--     [C declaration]: @SDL_ORIENTATION_PORTRAIT@, defined at @SDL3\/SDL_video.h 164:5@
+pattern SDL_ORIENTATION_PORTRAIT :: SDL_DisplayOrientation
+pattern SDL_ORIENTATION_PORTRAIT = SDL_DisplayOrientation 3
+
+-- | The display is in portrait mode, upside down
+--
+--     [C declaration]: @SDL_ORIENTATION_PORTRAIT_FLIPPED@, defined at @SDL3\/SDL_video.h 165:5@
+pattern SDL_ORIENTATION_PORTRAIT_FLIPPED :: SDL_DisplayOrientation
+pattern SDL_ORIENTATION_PORTRAIT_FLIPPED = SDL_DisplayOrientation 4
+
+-- | The struct used as an opaque handle to a window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateWindow'
+--
+--     [C declaration]: @struct SDL_Window@, defined at @SDL3\/SDL_video.h 175:16@
+data SDL_Window
+
+-- | The flags on a window.
+--
+--     These cover a lot of true\/false, or on\/off, window state. Some of it is immutable after being set through @SDL_CreateWindow()@, some of it can be changed on existing windows by the app, and some of it might be altered by the user or system outside of the app\'s control.
+--
+--     When creating windows with @SDL_WINDOW_RESIZABLE@, SDL will constrain resizable windows to the dimensions recommended by the compositor to fit it within the usable desktop space, although some compositors will do this automatically without intervention as well. Use @'sDL_SetWindowResizable'@ after creation instead if you wish to create a window with a specific size.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_WindowFlags@, defined at @SDL3\/SDL_video.h 195:16@
+newtype SDL_WindowFlags = SDL_WindowFlags
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint64
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.CompatHasField.HasField "unwrap" SDL_WindowFlags ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_WindowFlags{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint64)
+  => BG.HasField "unwrap" (BG.Ptr SDL_WindowFlags) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_WindowFlags "unwrap" where
+  type
+    CFieldType SDL_WindowFlags "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint64
+
+  offset# = \_ -> \_ -> 0
+
+-- | A magic value used with SDL_WINDOWPOS_UNDEFINED.
+--
+--     Generally this macro isn\'t used directly, but rather through SDL_WINDOWPOS_UNDEFINED or SDL_WINDOWPOS_UNDEFINED_DISPLAY.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowPosition'
+--
+--     [C declaration]: @macro SDL_WINDOWPOS_UNDEFINED_MASK@, defined at @SDL3\/SDL_video.h 235:9@
+sDL_WINDOWPOS_UNDEFINED_MASK :: BG.CUInt
+sDL_WINDOWPOS_UNDEFINED_MASK =
+  (536805376 :: BG.CUInt)
+
+-- | Used to indicate that you don\'t care what the window position is.
+--
+--     If you /really/ don\'t care, SDL_WINDOWPOS_UNDEFINED is the same, but always uses the primary display instead of specifying one.
+--
+--     [@X@]: the 'SDL_DisplayID' of the display to use.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowPosition'
+--
+--     [C declaration]: @macro SDL_WINDOWPOS_UNDEFINED_DISPLAY@, defined at @SDL3\/SDL_video.h 249:9@
+sDL_WINDOWPOS_UNDEFINED_DISPLAY
+  :: forall a0. (C.Expr.HostPlatform.Bitwise BG.CUInt a0) => a0 -> C.Expr.HostPlatform.BitsRes BG.CUInt a0
+sDL_WINDOWPOS_UNDEFINED_DISPLAY =
+  \x0 ->
+    (C.Expr.HostPlatform..|.) sDL_WINDOWPOS_UNDEFINED_MASK x0
+
+-- | Used to indicate that you don\'t care what the window position\/display is.
+--
+--     This always uses the primary display.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowPosition'
+--
+--     [C declaration]: @macro SDL_WINDOWPOS_UNDEFINED@, defined at @SDL3\/SDL_video.h 260:9@
+sDL_WINDOWPOS_UNDEFINED :: BG.CUInt
+sDL_WINDOWPOS_UNDEFINED =
+  sDL_WINDOWPOS_UNDEFINED_DISPLAY (0 :: BG.CInt)
+
+-- | A macro to test if the window position is marked as \"undefined.\"
+--
+--     [@X@]: the window position value.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowPosition'
+--
+--     [C declaration]: @macro SDL_WINDOWPOS_ISUNDEFINED@, defined at @SDL3\/SDL_video.h 271:9@
+sDL_WINDOWPOS_ISUNDEFINED
+  :: forall a0
+   . (C.Expr.HostPlatform.RelEq (C.Expr.HostPlatform.BitsRes a0 BG.CInt) BG.CUInt)
+  => (C.Expr.HostPlatform.Bitwise a0 BG.CInt)
+  => a0 -> BG.CInt
+sDL_WINDOWPOS_ISUNDEFINED =
+  \x0 ->
+    (C.Expr.HostPlatform.==)
+      ((C.Expr.HostPlatform..&.) x0 (4294901760 :: BG.CInt))
+      sDL_WINDOWPOS_UNDEFINED_MASK
+
+-- | A magic value used with SDL_WINDOWPOS_CENTERED.
+--
+--     Generally this macro isn\'t used directly, but rather through SDL_WINDOWPOS_CENTERED or SDL_WINDOWPOS_CENTERED_DISPLAY.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowPosition'
+--
+--     [C declaration]: @macro SDL_WINDOWPOS_CENTERED_MASK@, defined at @SDL3\/SDL_video.h 283:9@
+sDL_WINDOWPOS_CENTERED_MASK :: BG.CUInt
+sDL_WINDOWPOS_CENTERED_MASK = (805240832 :: BG.CUInt)
+
+-- | Used to indicate that the window position should be centered.
+--
+--     SDL_WINDOWPOS_CENTERED is the same, but always uses the primary display instead of specifying one.
+--
+--     [@X@]: the 'SDL_DisplayID' of the display to use.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowPosition'
+--
+--     [C declaration]: @macro SDL_WINDOWPOS_CENTERED_DISPLAY@, defined at @SDL3\/SDL_video.h 297:9@
+sDL_WINDOWPOS_CENTERED_DISPLAY
+  :: forall a0. (C.Expr.HostPlatform.Bitwise BG.CUInt a0) => a0 -> C.Expr.HostPlatform.BitsRes BG.CUInt a0
+sDL_WINDOWPOS_CENTERED_DISPLAY =
+  \x0 ->
+    (C.Expr.HostPlatform..|.) sDL_WINDOWPOS_CENTERED_MASK x0
+
+-- | Used to indicate that the window position should be centered.
+--
+--     This always uses the primary display.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowPosition'
+--
+--     [C declaration]: @macro SDL_WINDOWPOS_CENTERED@, defined at @SDL3\/SDL_video.h 308:9@
+sDL_WINDOWPOS_CENTERED :: BG.CUInt
+sDL_WINDOWPOS_CENTERED =
+  sDL_WINDOWPOS_CENTERED_DISPLAY (0 :: BG.CInt)
+
+-- | A macro to test if the window position is marked as \"centered.\"
+--
+--     [@X@]: the window position value.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowPosition'
+--
+--     [C declaration]: @macro SDL_WINDOWPOS_ISCENTERED@, defined at @SDL3\/SDL_video.h 319:9@
+sDL_WINDOWPOS_ISCENTERED
+  :: forall a0
+   . (C.Expr.HostPlatform.RelEq (C.Expr.HostPlatform.BitsRes a0 BG.CInt) BG.CUInt)
+  => (C.Expr.HostPlatform.Bitwise a0 BG.CInt)
+  => a0 -> BG.CInt
+sDL_WINDOWPOS_ISCENTERED =
+  \x0 ->
+    (C.Expr.HostPlatform.==)
+      ((C.Expr.HostPlatform..&.) x0 (4294901760 :: BG.CInt))
+      sDL_WINDOWPOS_CENTERED_MASK
+
+-- | Window flash operation.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_FlashOperation@, defined at @SDL3\/SDL_video.h 328:14@
+newtype SDL_FlashOperation = SDL_FlashOperation
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_FlashOperation where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_FlashOperation where
+  readRaw =
+    \ptr0 ->
+      pure SDL_FlashOperation
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_FlashOperation where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_FlashOperation unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_FlashOperation instance BG.Storable SDL_FlashOperation
+
+deriving via BG.CUInt instance BG.Prim SDL_FlashOperation
+
+instance CEnum.CEnum SDL_FlashOperation where
+  type CEnumZ SDL_FlashOperation = BG.CUInt
+
+  toCEnum = SDL_FlashOperation
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_FLASH_CANCEL")
+        , (1, BG.singleton "SDL_FLASH_BRIEFLY")
+        , (2, BG.singleton "SDL_FLASH_UNTIL_FOCUSED")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_FlashOperation"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_FlashOperation"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_FlashOperation where
+  minDeclaredValue = SDL_FLASH_CANCEL
+
+  maxDeclaredValue = SDL_FLASH_UNTIL_FOCUSED
+
+instance Show SDL_FlashOperation where
+  showsPrec = CEnum.shows
+
+instance Read SDL_FlashOperation where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_FlashOperation ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_FlashOperation{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_FlashOperation) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_FlashOperation "unwrap" where
+  type
+    CFieldType SDL_FlashOperation "unwrap" =
+      BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Cancel any window flash state
+--
+--     [C declaration]: @SDL_FLASH_CANCEL@, defined at @SDL3\/SDL_video.h 330:5@
+pattern SDL_FLASH_CANCEL :: SDL_FlashOperation
+pattern SDL_FLASH_CANCEL = SDL_FlashOperation 0
+
+-- | Flash the window briefly to get attention
+--
+--     [C declaration]: @SDL_FLASH_BRIEFLY@, defined at @SDL3\/SDL_video.h 331:5@
+pattern SDL_FLASH_BRIEFLY :: SDL_FlashOperation
+pattern SDL_FLASH_BRIEFLY = SDL_FlashOperation 1
+
+-- | Flash the window until it gets focus
+--
+--     [C declaration]: @SDL_FLASH_UNTIL_FOCUSED@, defined at @SDL3\/SDL_video.h 332:5@
+pattern SDL_FLASH_UNTIL_FOCUSED :: SDL_FlashOperation
+pattern SDL_FLASH_UNTIL_FOCUSED = SDL_FlashOperation 2
+
+-- | Window progress state
+--
+--     @since 3.2.8
+--
+--     [C declaration]: @enum SDL_ProgressState@, defined at @SDL3\/SDL_video.h 340:14@
+newtype SDL_ProgressState = SDL_ProgressState
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_ProgressState where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_ProgressState where
+  readRaw =
+    \ptr0 ->
+      pure SDL_ProgressState
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_ProgressState where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_ProgressState unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_ProgressState instance BG.Storable SDL_ProgressState
+
+deriving via BG.CInt instance BG.Prim SDL_ProgressState
+
+instance CEnum.CEnum SDL_ProgressState where
+  type CEnumZ SDL_ProgressState = BG.CInt
+
+  toCEnum = SDL_ProgressState
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (-1, BG.singleton "SDL_PROGRESS_STATE_INVALID")
+        , (0, BG.singleton "SDL_PROGRESS_STATE_NONE")
+        , (1, BG.singleton "SDL_PROGRESS_STATE_INDETERMINATE")
+        , (2, BG.singleton "SDL_PROGRESS_STATE_NORMAL")
+        , (3, BG.singleton "SDL_PROGRESS_STATE_PAUSED")
+        , (4, BG.singleton "SDL_PROGRESS_STATE_ERROR")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_ProgressState"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_ProgressState"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_ProgressState where
+  minDeclaredValue = SDL_PROGRESS_STATE_INVALID
+
+  maxDeclaredValue = SDL_PROGRESS_STATE_ERROR
+
+instance Show SDL_ProgressState where
+  showsPrec = CEnum.shows
+
+instance Read SDL_ProgressState where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_ProgressState ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_ProgressState{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_ProgressState) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_ProgressState "unwrap" where
+  type CFieldType SDL_ProgressState "unwrap" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | An invalid progress state indicating an error; check SDL_GetError()
+--
+--     [C declaration]: @SDL_PROGRESS_STATE_INVALID@, defined at @SDL3\/SDL_video.h 342:5@
+pattern SDL_PROGRESS_STATE_INVALID :: SDL_ProgressState
+pattern SDL_PROGRESS_STATE_INVALID = SDL_ProgressState (-1)
+
+-- | No progress bar is shown
+--
+--     [C declaration]: @SDL_PROGRESS_STATE_NONE@, defined at @SDL3\/SDL_video.h 343:5@
+pattern SDL_PROGRESS_STATE_NONE :: SDL_ProgressState
+pattern SDL_PROGRESS_STATE_NONE = SDL_ProgressState 0
+
+-- | The progress bar is shown in a indeterminate state
+--
+--     [C declaration]: @SDL_PROGRESS_STATE_INDETERMINATE@, defined at @SDL3\/SDL_video.h 344:5@
+pattern SDL_PROGRESS_STATE_INDETERMINATE :: SDL_ProgressState
+pattern SDL_PROGRESS_STATE_INDETERMINATE = SDL_ProgressState 1
+
+-- | The progress bar is shown in a normal state
+--
+--     [C declaration]: @SDL_PROGRESS_STATE_NORMAL@, defined at @SDL3\/SDL_video.h 345:5@
+pattern SDL_PROGRESS_STATE_NORMAL :: SDL_ProgressState
+pattern SDL_PROGRESS_STATE_NORMAL = SDL_ProgressState 2
+
+-- | The progress bar is shown in a paused state
+--
+--     [C declaration]: @SDL_PROGRESS_STATE_PAUSED@, defined at @SDL3\/SDL_video.h 346:5@
+pattern SDL_PROGRESS_STATE_PAUSED :: SDL_ProgressState
+pattern SDL_PROGRESS_STATE_PAUSED = SDL_ProgressState 3
+
+-- | The progress bar is shown in a state indicating the application had an error
+--
+--     [C declaration]: @SDL_PROGRESS_STATE_ERROR@, defined at @SDL3\/SDL_video.h 347:5@
+pattern SDL_PROGRESS_STATE_ERROR :: SDL_ProgressState
+pattern SDL_PROGRESS_STATE_ERROR = SDL_ProgressState 4
+
+-- | [C declaration]: @struct SDL_GLContextState@, defined at @SDL3\/SDL_video.h 360:16@
+data SDL_GLContextState
+
+-- | An opaque handle to an OpenGL context.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_CreateContext', 'sDL_GL_SetAttribute', 'sDL_GL_MakeCurrent', 'sDL_GL_DestroyContext'
+--
+--     [C declaration]: @SDL_GLContext@, defined at @SDL3\/SDL_video.h 360:36@
+newtype SDL_GLContext = SDL_GLContext
+  { unwrap :: BG.Ptr SDL_GLContextState
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.Ptr SDL_GLContextState)
+  => BG.CompatHasField.HasField "unwrap" SDL_GLContext ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GLContext{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.Ptr SDL_GLContextState)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GLContext) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GLContext "unwrap" where
+  type
+    CFieldType SDL_GLContext "unwrap" =
+      BG.Ptr SDL_GLContextState
+
+  offset# = \_ -> \_ -> 0
+
+-- | Opaque type for an EGL display.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGLDisplay@, defined at @SDL3\/SDL_video.h 367:15@
+newtype SDL_EGLDisplay = SDL_EGLDisplay
+  { unwrap :: BG.Ptr BG.Void
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "unwrap" SDL_EGLDisplay ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EGLDisplay{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EGLDisplay) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EGLDisplay "unwrap" where
+  type
+    CFieldType SDL_EGLDisplay "unwrap" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 0
+
+-- | Opaque type for an EGL config.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGLConfig@, defined at @SDL3\/SDL_video.h 374:15@
+newtype SDL_EGLConfig = SDL_EGLConfig
+  { unwrap :: BG.Ptr BG.Void
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "unwrap" SDL_EGLConfig ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EGLConfig{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EGLConfig) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EGLConfig "unwrap" where
+  type
+    CFieldType SDL_EGLConfig "unwrap" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 0
+
+-- | Opaque type for an EGL surface.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGLSurface@, defined at @SDL3\/SDL_video.h 381:15@
+newtype SDL_EGLSurface = SDL_EGLSurface
+  { unwrap :: BG.Ptr BG.Void
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.CompatHasField.HasField "unwrap" SDL_EGLSurface ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EGLSurface{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.Ptr BG.Void)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EGLSurface) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EGLSurface "unwrap" where
+  type
+    CFieldType SDL_EGLSurface "unwrap" =
+      BG.Ptr BG.Void
+
+  offset# = \_ -> \_ -> 0
+
+-- | An EGL attribute, used when creating an EGL context.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGLAttrib@, defined at @SDL3\/SDL_video.h 388:18@
+newtype SDL_EGLAttrib = SDL_EGLAttrib
+  { unwrap :: HsBindgen.Runtime.LibC.CIntPtr
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.CIntPtr)
+  => BG.CompatHasField.HasField "unwrap" SDL_EGLAttrib ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EGLAttrib{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ HsBindgen.Runtime.LibC.CIntPtr)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EGLAttrib) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EGLAttrib "unwrap" where
+  type
+    CFieldType SDL_EGLAttrib "unwrap" =
+      HsBindgen.Runtime.LibC.CIntPtr
+
+  offset# = \_ -> \_ -> 0
+
+-- | An EGL integer attribute, used when creating an EGL surface.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGLint@, defined at @SDL3\/SDL_video.h 395:13@
+newtype SDL_EGLint = SDL_EGLint
+  { unwrap :: BG.CInt
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_EGLint ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EGLint{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EGLint) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EGLint "unwrap" where
+  type CFieldType SDL_EGLint "unwrap" = BG.CInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_EGLAttribArrayCallback'
+--
+--     [C declaration]: @SDL_EGLAttribArrayCallback@, defined at @SDL3\/SDL_video.h 420:34@
+newtype SDL_EGLAttribArrayCallback_Aux = SDL_EGLAttribArrayCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> IO (BG.Ptr SDL_EGLAttrib)
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_EGLAttribArrayCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_11c111f1d1328021_base
+    :: (BG.Ptr BG.Void -> IO (BG.Ptr BG.Void))
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> IO (BG.Ptr BG.Void)))
+
+-- __unique:__ @toSDL_EGLAttribArrayCallback_Aux@
+hs_bindgen_11c111f1d1328021
+  :: SDL_EGLAttribArrayCallback_Aux
+  -> IO (BG.FunPtr SDL_EGLAttribArrayCallback_Aux)
+hs_bindgen_11c111f1d1328021 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_11c111f1d1328021_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_EGLAttribArrayCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_30601c44a183aaaa_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> IO (BG.Ptr BG.Void))
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @fromSDL_EGLAttribArrayCallback_Aux@
+hs_bindgen_30601c44a183aaaa
+  :: BG.FunPtr SDL_EGLAttribArrayCallback_Aux
+  -> SDL_EGLAttribArrayCallback_Aux
+hs_bindgen_30601c44a183aaaa =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_30601c44a183aaaa_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_EGLAttribArrayCallback_Aux where
+  toFunPtr = hs_bindgen_11c111f1d1328021
+
+instance BG.FromFunPtr SDL_EGLAttribArrayCallback_Aux where
+  fromFunPtr = hs_bindgen_30601c44a183aaaa
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO (BG.Ptr SDL_EGLAttrib)))
+  => BG.CompatHasField.HasField "unwrap" SDL_EGLAttribArrayCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 -> SDL_EGLAttribArrayCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> IO (BG.Ptr SDL_EGLAttrib)))
+  => BG.HasField "unwrap" (BG.Ptr SDL_EGLAttribArrayCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EGLAttribArrayCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_EGLAttribArrayCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> IO (BG.Ptr SDL_EGLAttrib)
+
+  offset# = \_ -> \_ -> 0
+
+-- | EGL platform attribute initialization callback.
+--
+--     This is called when SDL is attempting to create an EGL context, to let the app add extra attributes to its eglGetPlatformDisplay() call.
+--
+--     The callback should return a pointer to an EGL attribute array terminated with @EGL_NONE@. If this function returns NULL, the SDL_CreateWindow process will fail gracefully.
+--
+--     The returned pointer should be allocated with SDL_malloc() and will be passed to SDL_free().
+--
+--     The arrays returned by each callback will be appended to the existing attribute arrays defined by SDL.
+--
+--     [@userdata@]: an app-controlled pointer that is passed to the callback.
+--
+--     [Returns]: a newly-allocated array of attributes, terminated with @EGL_NONE@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EGL_SetAttributeCallbacks'
+--
+--     [C declaration]: @SDL_EGLAttribArrayCallback@, defined at @SDL3\/SDL_video.h 420:34@
+newtype SDL_EGLAttribArrayCallback = SDL_EGLAttribArrayCallback
+  { unwrap :: BG.FunPtr SDL_EGLAttribArrayCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_EGLAttribArrayCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_EGLAttribArrayCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EGLAttribArrayCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_EGLAttribArrayCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EGLAttribArrayCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EGLAttribArrayCallback "unwrap" where
+  type
+    CFieldType SDL_EGLAttribArrayCallback "unwrap" =
+      BG.FunPtr SDL_EGLAttribArrayCallback_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | Auxiliary type used by 'SDL_EGLIntArrayCallback'
+--
+--     [C declaration]: @SDL_EGLIntArrayCallback@, defined at @SDL3\/SDL_video.h 451:31@
+newtype SDL_EGLIntArrayCallback_Aux = SDL_EGLIntArrayCallback_Aux
+  { unwrap :: BG.Ptr BG.Void -> SDL_EGLDisplay -> SDL_EGLConfig -> IO (BG.Ptr SDL_EGLint)
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_EGLIntArrayCallback_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_6f9a11d91e338196_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO (BG.Ptr BG.Void))
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO (BG.Ptr BG.Void)))
+
+-- __unique:__ @toSDL_EGLIntArrayCallback_Aux@
+hs_bindgen_6f9a11d91e338196
+  :: SDL_EGLIntArrayCallback_Aux
+  -> IO (BG.FunPtr SDL_EGLIntArrayCallback_Aux)
+hs_bindgen_6f9a11d91e338196 =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_6f9a11d91e338196_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_EGLIntArrayCallback_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_19e73e54259a2a81_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO (BG.Ptr BG.Void))
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @fromSDL_EGLIntArrayCallback_Aux@
+hs_bindgen_19e73e54259a2a81
+  :: BG.FunPtr SDL_EGLIntArrayCallback_Aux
+  -> SDL_EGLIntArrayCallback_Aux
+hs_bindgen_19e73e54259a2a81 =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_19e73e54259a2a81_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_EGLIntArrayCallback_Aux where
+  toFunPtr = hs_bindgen_6f9a11d91e338196
+
+instance BG.FromFunPtr SDL_EGLIntArrayCallback_Aux where
+  fromFunPtr = hs_bindgen_19e73e54259a2a81
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> SDL_EGLDisplay -> SDL_EGLConfig -> IO (BG.Ptr SDL_EGLint)))
+  => BG.CompatHasField.HasField "unwrap" SDL_EGLIntArrayCallback_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EGLIntArrayCallback_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ (BG.Ptr BG.Void -> SDL_EGLDisplay -> SDL_EGLConfig -> IO (BG.Ptr SDL_EGLint)))
+  => BG.HasField "unwrap" (BG.Ptr SDL_EGLIntArrayCallback_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EGLIntArrayCallback_Aux "unwrap" where
+  type
+    CFieldType SDL_EGLIntArrayCallback_Aux "unwrap" =
+      BG.Ptr BG.Void -> SDL_EGLDisplay -> SDL_EGLConfig -> IO (BG.Ptr SDL_EGLint)
+
+  offset# = \_ -> \_ -> 0
+
+-- | EGL surface\/context attribute initialization callback types.
+--
+--     This is called when SDL is attempting to create an EGL surface, to let the app add extra attributes to its eglCreateWindowSurface() or eglCreateContext calls.
+--
+--     For convenience, the EGLDisplay and EGLConfig to use are provided to the callback.
+--
+--     The callback should return a pointer to an EGL attribute array terminated with @EGL_NONE@. If this function returns NULL, the SDL_CreateWindow process will fail gracefully.
+--
+--     The returned pointer should be allocated with SDL_malloc() and will be passed to SDL_free().
+--
+--     The arrays returned by each callback will be appended to the existing attribute arrays defined by SDL.
+--
+--     [@userdata@]: an app-controlled pointer that is passed to the callback.
+--
+--     [@display@]: the EGL display to be used.
+--
+--     [@config@]: the EGL config to be used.
+--
+--     [Returns]: a newly-allocated array of attributes, terminated with @EGL_NONE@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EGL_SetAttributeCallbacks'
+--
+--     [C declaration]: @SDL_EGLIntArrayCallback@, defined at @SDL3\/SDL_video.h 451:31@
+newtype SDL_EGLIntArrayCallback = SDL_EGLIntArrayCallback
+  { unwrap :: BG.FunPtr SDL_EGLIntArrayCallback_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_EGLIntArrayCallback_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_EGLIntArrayCallback ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_EGLIntArrayCallback{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_EGLIntArrayCallback_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_EGLIntArrayCallback) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_EGLIntArrayCallback "unwrap" where
+  type
+    CFieldType SDL_EGLIntArrayCallback "unwrap" =
+      BG.FunPtr SDL_EGLIntArrayCallback_Aux
+
+  offset# = \_ -> \_ -> 0
+
+-- | An enumeration of OpenGL configuration attributes.
+--
+--     While you can set most OpenGL attributes normally, the attributes listed above must be known before SDL creates the window that will be used with the OpenGL context. These attributes are set and read with @SDL_GL_SetAttribute()@ and @SDL_GL_GetAttribute()@.
+--
+--     In some cases, these attributes are minimum requests; the GL does not promise to give you exactly what you asked for. It\'s possible to ask for a 16-bit depth buffer and get a 24-bit one instead, for example, or to ask for no stencil buffer and still have one available. Context creation should fail if the GL can\'t provide your requested attributes at a minimum, but you should check to see exactly what you got.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @enum SDL_GLAttr@, defined at @SDL3\/SDL_video.h 470:14@
+newtype SDL_GLAttr = SDL_GLAttr
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_GLAttr where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_GLAttr where
+  readRaw =
+    \ptr0 ->
+      pure SDL_GLAttr
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_GLAttr where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_GLAttr unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_GLAttr instance BG.Storable SDL_GLAttr
+
+deriving via BG.CUInt instance BG.Prim SDL_GLAttr
+
+instance CEnum.CEnum SDL_GLAttr where
+  type CEnumZ SDL_GLAttr = BG.CUInt
+
+  toCEnum = SDL_GLAttr
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_GL_RED_SIZE")
+        , (1, BG.singleton "SDL_GL_GREEN_SIZE")
+        , (2, BG.singleton "SDL_GL_BLUE_SIZE")
+        , (3, BG.singleton "SDL_GL_ALPHA_SIZE")
+        , (4, BG.singleton "SDL_GL_BUFFER_SIZE")
+        , (5, BG.singleton "SDL_GL_DOUBLEBUFFER")
+        , (6, BG.singleton "SDL_GL_DEPTH_SIZE")
+        , (7, BG.singleton "SDL_GL_STENCIL_SIZE")
+        , (8, BG.singleton "SDL_GL_ACCUM_RED_SIZE")
+        , (9, BG.singleton "SDL_GL_ACCUM_GREEN_SIZE")
+        , (10, BG.singleton "SDL_GL_ACCUM_BLUE_SIZE")
+        , (11, BG.singleton "SDL_GL_ACCUM_ALPHA_SIZE")
+        , (12, BG.singleton "SDL_GL_STEREO")
+        , (13, BG.singleton "SDL_GL_MULTISAMPLEBUFFERS")
+        , (14, BG.singleton "SDL_GL_MULTISAMPLESAMPLES")
+        , (15, BG.singleton "SDL_GL_ACCELERATED_VISUAL")
+        , (16, BG.singleton "SDL_GL_RETAINED_BACKING")
+        , (17, BG.singleton "SDL_GL_CONTEXT_MAJOR_VERSION")
+        , (18, BG.singleton "SDL_GL_CONTEXT_MINOR_VERSION")
+        , (19, BG.singleton "SDL_GL_CONTEXT_FLAGS")
+        , (20, BG.singleton "SDL_GL_CONTEXT_PROFILE_MASK")
+        , (21, BG.singleton "SDL_GL_SHARE_WITH_CURRENT_CONTEXT")
+        , (22, BG.singleton "SDL_GL_FRAMEBUFFER_SRGB_CAPABLE")
+        , (23, BG.singleton "SDL_GL_CONTEXT_RELEASE_BEHAVIOR")
+        , (24, BG.singleton "SDL_GL_CONTEXT_RESET_NOTIFICATION")
+        , (25, BG.singleton "SDL_GL_CONTEXT_NO_ERROR")
+        , (26, BG.singleton "SDL_GL_FLOATBUFFERS")
+        , (27, BG.singleton "SDL_GL_EGL_PLATFORM")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_GLAttr"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_GLAttr"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_GLAttr where
+  minDeclaredValue = SDL_GL_RED_SIZE
+
+  maxDeclaredValue = SDL_GL_EGL_PLATFORM
+
+instance Show SDL_GLAttr where
+  showsPrec = CEnum.shows
+
+instance Read SDL_GLAttr where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_GLAttr ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GLAttr{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GLAttr) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GLAttr "unwrap" where
+  type CFieldType SDL_GLAttr "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | the minimum number of bits for the red channel of the color buffer; defaults to 8.
+--
+--     [C declaration]: @SDL_GL_RED_SIZE@, defined at @SDL3\/SDL_video.h 472:5@
+pattern SDL_GL_RED_SIZE :: SDL_GLAttr
+pattern SDL_GL_RED_SIZE = SDL_GLAttr 0
+
+-- | the minimum number of bits for the green channel of the color buffer; defaults to 8.
+--
+--     [C declaration]: @SDL_GL_GREEN_SIZE@, defined at @SDL3\/SDL_video.h 473:5@
+pattern SDL_GL_GREEN_SIZE :: SDL_GLAttr
+pattern SDL_GL_GREEN_SIZE = SDL_GLAttr 1
+
+-- | the minimum number of bits for the blue channel of the color buffer; defaults to 8.
+--
+--     [C declaration]: @SDL_GL_BLUE_SIZE@, defined at @SDL3\/SDL_video.h 474:5@
+pattern SDL_GL_BLUE_SIZE :: SDL_GLAttr
+pattern SDL_GL_BLUE_SIZE = SDL_GLAttr 2
+
+-- | the minimum number of bits for the alpha channel of the color buffer; defaults to 8.
+--
+--     [C declaration]: @SDL_GL_ALPHA_SIZE@, defined at @SDL3\/SDL_video.h 475:5@
+pattern SDL_GL_ALPHA_SIZE :: SDL_GLAttr
+pattern SDL_GL_ALPHA_SIZE = SDL_GLAttr 3
+
+-- | the minimum number of bits for frame buffer size; defaults to 0.
+--
+--     [C declaration]: @SDL_GL_BUFFER_SIZE@, defined at @SDL3\/SDL_video.h 476:5@
+pattern SDL_GL_BUFFER_SIZE :: SDL_GLAttr
+pattern SDL_GL_BUFFER_SIZE = SDL_GLAttr 4
+
+-- | whether the output is single or double buffered; defaults to double buffering on.
+--
+--     [C declaration]: @SDL_GL_DOUBLEBUFFER@, defined at @SDL3\/SDL_video.h 477:5@
+pattern SDL_GL_DOUBLEBUFFER :: SDL_GLAttr
+pattern SDL_GL_DOUBLEBUFFER = SDL_GLAttr 5
+
+-- | the minimum number of bits in the depth buffer; defaults to 16.
+--
+--     [C declaration]: @SDL_GL_DEPTH_SIZE@, defined at @SDL3\/SDL_video.h 478:5@
+pattern SDL_GL_DEPTH_SIZE :: SDL_GLAttr
+pattern SDL_GL_DEPTH_SIZE = SDL_GLAttr 6
+
+-- | the minimum number of bits in the stencil buffer; defaults to 0.
+--
+--     [C declaration]: @SDL_GL_STENCIL_SIZE@, defined at @SDL3\/SDL_video.h 479:5@
+pattern SDL_GL_STENCIL_SIZE :: SDL_GLAttr
+pattern SDL_GL_STENCIL_SIZE = SDL_GLAttr 7
+
+-- | the minimum number of bits for the red channel of the accumulation buffer; defaults to 0.
+--
+--     [C declaration]: @SDL_GL_ACCUM_RED_SIZE@, defined at @SDL3\/SDL_video.h 480:5@
+pattern SDL_GL_ACCUM_RED_SIZE :: SDL_GLAttr
+pattern SDL_GL_ACCUM_RED_SIZE = SDL_GLAttr 8
+
+-- | the minimum number of bits for the green channel of the accumulation buffer; defaults to 0.
+--
+--     [C declaration]: @SDL_GL_ACCUM_GREEN_SIZE@, defined at @SDL3\/SDL_video.h 481:5@
+pattern SDL_GL_ACCUM_GREEN_SIZE :: SDL_GLAttr
+pattern SDL_GL_ACCUM_GREEN_SIZE = SDL_GLAttr 9
+
+-- | the minimum number of bits for the blue channel of the accumulation buffer; defaults to 0.
+--
+--     [C declaration]: @SDL_GL_ACCUM_BLUE_SIZE@, defined at @SDL3\/SDL_video.h 482:5@
+pattern SDL_GL_ACCUM_BLUE_SIZE :: SDL_GLAttr
+pattern SDL_GL_ACCUM_BLUE_SIZE = SDL_GLAttr 10
+
+-- | the minimum number of bits for the alpha channel of the accumulation buffer; defaults to 0.
+--
+--     [C declaration]: @SDL_GL_ACCUM_ALPHA_SIZE@, defined at @SDL3\/SDL_video.h 483:5@
+pattern SDL_GL_ACCUM_ALPHA_SIZE :: SDL_GLAttr
+pattern SDL_GL_ACCUM_ALPHA_SIZE = SDL_GLAttr 11
+
+-- | whether the output is stereo 3D; defaults to off.
+--
+--     [C declaration]: @SDL_GL_STEREO@, defined at @SDL3\/SDL_video.h 484:5@
+pattern SDL_GL_STEREO :: SDL_GLAttr
+pattern SDL_GL_STEREO = SDL_GLAttr 12
+
+-- | the number of buffers used for multisample anti-aliasing; defaults to 0.
+--
+--     [C declaration]: @SDL_GL_MULTISAMPLEBUFFERS@, defined at @SDL3\/SDL_video.h 485:5@
+pattern SDL_GL_MULTISAMPLEBUFFERS :: SDL_GLAttr
+pattern SDL_GL_MULTISAMPLEBUFFERS = SDL_GLAttr 13
+
+-- | the number of samples used around the current pixel used for multisample anti-aliasing.
+--
+--     [C declaration]: @SDL_GL_MULTISAMPLESAMPLES@, defined at @SDL3\/SDL_video.h 486:5@
+pattern SDL_GL_MULTISAMPLESAMPLES :: SDL_GLAttr
+pattern SDL_GL_MULTISAMPLESAMPLES = SDL_GLAttr 14
+
+-- | set to 1 to require hardware acceleration, set to 0 to force software rendering; defaults to allow either.
+--
+--     [C declaration]: @SDL_GL_ACCELERATED_VISUAL@, defined at @SDL3\/SDL_video.h 487:5@
+pattern SDL_GL_ACCELERATED_VISUAL :: SDL_GLAttr
+pattern SDL_GL_ACCELERATED_VISUAL = SDL_GLAttr 15
+
+-- | not used (deprecated).
+--
+--     [C declaration]: @SDL_GL_RETAINED_BACKING@, defined at @SDL3\/SDL_video.h 488:5@
+pattern SDL_GL_RETAINED_BACKING :: SDL_GLAttr
+pattern SDL_GL_RETAINED_BACKING = SDL_GLAttr 16
+
+-- | OpenGL context major version.
+--
+--     [C declaration]: @SDL_GL_CONTEXT_MAJOR_VERSION@, defined at @SDL3\/SDL_video.h 489:5@
+pattern SDL_GL_CONTEXT_MAJOR_VERSION :: SDL_GLAttr
+pattern SDL_GL_CONTEXT_MAJOR_VERSION = SDL_GLAttr 17
+
+-- | OpenGL context minor version.
+--
+--     [C declaration]: @SDL_GL_CONTEXT_MINOR_VERSION@, defined at @SDL3\/SDL_video.h 490:5@
+pattern SDL_GL_CONTEXT_MINOR_VERSION :: SDL_GLAttr
+pattern SDL_GL_CONTEXT_MINOR_VERSION = SDL_GLAttr 18
+
+-- | some combination of 0 or more of elements of the 'SDL_GLContextFlag' enumeration; defaults to 0.
+--
+--     [C declaration]: @SDL_GL_CONTEXT_FLAGS@, defined at @SDL3\/SDL_video.h 491:5@
+pattern SDL_GL_CONTEXT_FLAGS :: SDL_GLAttr
+pattern SDL_GL_CONTEXT_FLAGS = SDL_GLAttr 19
+
+-- | type of GL context (Core, Compatibility, ES). See 'SDL_GLProfile'; default value depends on platform.
+--
+--     [C declaration]: @SDL_GL_CONTEXT_PROFILE_MASK@, defined at @SDL3\/SDL_video.h 492:5@
+pattern SDL_GL_CONTEXT_PROFILE_MASK :: SDL_GLAttr
+pattern SDL_GL_CONTEXT_PROFILE_MASK = SDL_GLAttr 20
+
+-- | OpenGL context sharing; defaults to 0.
+--
+--     [C declaration]: @SDL_GL_SHARE_WITH_CURRENT_CONTEXT@, defined at @SDL3\/SDL_video.h 493:5@
+pattern SDL_GL_SHARE_WITH_CURRENT_CONTEXT :: SDL_GLAttr
+pattern SDL_GL_SHARE_WITH_CURRENT_CONTEXT = SDL_GLAttr 21
+
+-- | requests sRGB-capable visual if 1. Defaults to -1 (\"don\'t care\"). This is a request; GL drivers might not comply!
+--
+--     [C declaration]: @SDL_GL_FRAMEBUFFER_SRGB_CAPABLE@, defined at @SDL3\/SDL_video.h 494:5@
+pattern SDL_GL_FRAMEBUFFER_SRGB_CAPABLE :: SDL_GLAttr
+pattern SDL_GL_FRAMEBUFFER_SRGB_CAPABLE = SDL_GLAttr 22
+
+-- | sets context the release behavior. See 'SDL_GLContextReleaseFlag'; defaults to FLUSH.
+--
+--     [C declaration]: @SDL_GL_CONTEXT_RELEASE_BEHAVIOR@, defined at @SDL3\/SDL_video.h 495:5@
+pattern SDL_GL_CONTEXT_RELEASE_BEHAVIOR :: SDL_GLAttr
+pattern SDL_GL_CONTEXT_RELEASE_BEHAVIOR = SDL_GLAttr 23
+
+-- | set context reset notification. See 'SDL_GLContextResetNotification'; defaults to NO_NOTIFICATION.
+--
+--     [C declaration]: @SDL_GL_CONTEXT_RESET_NOTIFICATION@, defined at @SDL3\/SDL_video.h 496:5@
+pattern SDL_GL_CONTEXT_RESET_NOTIFICATION :: SDL_GLAttr
+pattern SDL_GL_CONTEXT_RESET_NOTIFICATION = SDL_GLAttr 24
+
+-- | [C declaration]: @SDL_GL_CONTEXT_NO_ERROR@, defined at @SDL3\/SDL_video.h 497:5@
+pattern SDL_GL_CONTEXT_NO_ERROR :: SDL_GLAttr
+pattern SDL_GL_CONTEXT_NO_ERROR = SDL_GLAttr 25
+
+-- | [C declaration]: @SDL_GL_FLOATBUFFERS@, defined at @SDL3\/SDL_video.h 498:5@
+pattern SDL_GL_FLOATBUFFERS :: SDL_GLAttr
+pattern SDL_GL_FLOATBUFFERS = SDL_GLAttr 26
+
+-- | [C declaration]: @SDL_GL_EGL_PLATFORM@, defined at @SDL3\/SDL_video.h 499:5@
+pattern SDL_GL_EGL_PLATFORM :: SDL_GLAttr
+pattern SDL_GL_EGL_PLATFORM = SDL_GLAttr 27
+
+-- | Possible values to be set for the SDL_GL_CONTEXT_PROFILE_MASK attribute.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GLProfile@, defined at @SDL3\/SDL_video.h 507:16@
+newtype SDL_GLProfile = SDL_GLProfile
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_GLProfile ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GLProfile{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GLProfile) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GLProfile "unwrap" where
+  type
+    CFieldType SDL_GLProfile "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | OpenGL Core Profile context
+--
+--     [C declaration]: @macro SDL_GL_CONTEXT_PROFILE_CORE@, defined at @SDL3\/SDL_video.h 509:9@
+sDL_GL_CONTEXT_PROFILE_CORE :: BG.CInt
+sDL_GL_CONTEXT_PROFILE_CORE = (1 :: BG.CInt)
+
+-- | OpenGL Compatibility Profile context
+--
+--     [C declaration]: @macro SDL_GL_CONTEXT_PROFILE_COMPATIBILITY@, defined at @SDL3\/SDL_video.h 510:9@
+sDL_GL_CONTEXT_PROFILE_COMPATIBILITY :: BG.CInt
+sDL_GL_CONTEXT_PROFILE_COMPATIBILITY = (2 :: BG.CInt)
+
+-- | GLX_CONTEXT_ES2_PROFILE_BIT_EXT
+--
+--     [C declaration]: @macro SDL_GL_CONTEXT_PROFILE_ES@, defined at @SDL3\/SDL_video.h 511:9@
+sDL_GL_CONTEXT_PROFILE_ES :: BG.CInt
+sDL_GL_CONTEXT_PROFILE_ES = (4 :: BG.CInt)
+
+-- | Possible flags to be set for the SDL_GL_CONTEXT_FLAGS attribute.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GLContextFlag@, defined at @SDL3\/SDL_video.h 519:16@
+newtype SDL_GLContextFlag = SDL_GLContextFlag
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_GLContextFlag ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GLContextFlag{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GLContextFlag) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GLContextFlag "unwrap" where
+  type
+    CFieldType SDL_GLContextFlag "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @macro SDL_GL_CONTEXT_DEBUG_FLAG@, defined at @SDL3\/SDL_video.h 521:9@
+sDL_GL_CONTEXT_DEBUG_FLAG :: BG.CInt
+sDL_GL_CONTEXT_DEBUG_FLAG = (1 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG@, defined at @SDL3\/SDL_video.h 522:9@
+sDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG :: BG.CInt
+sDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG =
+  (2 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG@, defined at @SDL3\/SDL_video.h 523:9@
+sDL_GL_CONTEXT_ROBUST_ACCESS_FLAG :: BG.CInt
+sDL_GL_CONTEXT_ROBUST_ACCESS_FLAG = (4 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_GL_CONTEXT_RESET_ISOLATION_FLAG@, defined at @SDL3\/SDL_video.h 524:9@
+sDL_GL_CONTEXT_RESET_ISOLATION_FLAG :: BG.CInt
+sDL_GL_CONTEXT_RESET_ISOLATION_FLAG = (8 :: BG.CInt)
+
+-- | Possible values to be set for the SDL_GL_CONTEXT_RELEASE_BEHAVIOR attribute.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GLContextReleaseFlag@, defined at @SDL3\/SDL_video.h 533:16@
+newtype SDL_GLContextReleaseFlag = SDL_GLContextReleaseFlag
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_GLContextReleaseFlag ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_GLContextReleaseFlag{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GLContextReleaseFlag) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GLContextReleaseFlag "unwrap" where
+  type
+    CFieldType SDL_GLContextReleaseFlag "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @macro SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE@, defined at @SDL3\/SDL_video.h 535:9@
+sDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE :: BG.CInt
+sDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE = (0 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH@, defined at @SDL3\/SDL_video.h 536:9@
+sDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH :: BG.CInt
+sDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH =
+  (1 :: BG.CInt)
+
+-- | Possible values to be set SDL_GL_CONTEXT_RESET_NOTIFICATION attribute.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GLContextResetNotification@, defined at @SDL3\/SDL_video.h 544:16@
+newtype SDL_GLContextResetNotification = SDL_GLContextResetNotification
+  { unwrap :: SDL3.Sys.Bindgen.Stdinc.Uint32
+  }
+  deriving stock (BG.Generic, Eq, Ord, Read, Show)
+  deriving newtype
+    ( BG.Bitfield
+    , BG.Bits
+    , BG.FiniteBits
+    , BG.HasFFIType
+    , BG.Ix
+    , BG.Prim
+    , BG.Storable
+    , Bounded
+    , Enum
+    , Integral
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    , Num
+    , Real
+    )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.CompatHasField.HasField "unwrap" SDL_GLContextResetNotification ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 -> SDL_GLContextResetNotification{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ SDL3.Sys.Bindgen.Stdinc.Uint32)
+  => BG.HasField "unwrap" (BG.Ptr SDL_GLContextResetNotification) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_GLContextResetNotification "unwrap" where
+  type
+    CFieldType SDL_GLContextResetNotification "unwrap" =
+      SDL3.Sys.Bindgen.Stdinc.Uint32
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @macro SDL_GL_CONTEXT_RESET_NO_NOTIFICATION@, defined at @SDL3\/SDL_video.h 546:9@
+sDL_GL_CONTEXT_RESET_NO_NOTIFICATION :: BG.CInt
+sDL_GL_CONTEXT_RESET_NO_NOTIFICATION = (0 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_GL_CONTEXT_RESET_LOSE_CONTEXT@, defined at @SDL3\/SDL_video.h 547:9@
+sDL_GL_CONTEXT_RESET_LOSE_CONTEXT :: BG.CInt
+sDL_GL_CONTEXT_RESET_LOSE_CONTEXT = (1 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN@, literal @\"SDL.display.HDR_enabled\"@, defined at @SDL3\/SDL_video.h 684:9@
+sDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN :: BG.ByteString
+sDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x64
+    , 0x69
+    , 0x73
+    , 0x70
+    , 0x6C
+    , 0x61
+    , 0x79
+    , 0x2E
+    , 0x48
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x65
+    , 0x6E
+    , 0x61
+    , 0x62
+    , 0x6C
+    , 0x65
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER@, literal @\"SDL.display.KMSDRM.panel_orientation\"@, defined at @SDL3\/SDL_video.h 685:9@
+sDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER :: BG.ByteString
+sDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x64
+    , 0x69
+    , 0x73
+    , 0x70
+    , 0x6C
+    , 0x61
+    , 0x79
+    , 0x2E
+    , 0x4B
+    , 0x4D
+    , 0x53
+    , 0x44
+    , 0x52
+    , 0x4D
+    , 0x2E
+    , 0x70
+    , 0x61
+    , 0x6E
+    , 0x65
+    , 0x6C
+    , 0x5F
+    , 0x6F
+    , 0x72
+    , 0x69
+    , 0x65
+    , 0x6E
+    , 0x74
+    , 0x61
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER@, literal @\"SDL.display.wayland.wl_output\"@, defined at @SDL3\/SDL_video.h 686:9@
+sDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER :: BG.ByteString
+sDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x64
+    , 0x69
+    , 0x73
+    , 0x70
+    , 0x6C
+    , 0x61
+    , 0x79
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x77
+    , 0x6C
+    , 0x5F
+    , 0x6F
+    , 0x75
+    , 0x74
+    , 0x70
+    , 0x75
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER@, literal @\"SDL.display.windows.hmonitor\"@, defined at @SDL3\/SDL_video.h 687:9@
+sDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER :: BG.ByteString
+sDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x64
+    , 0x69
+    , 0x73
+    , 0x70
+    , 0x6C
+    , 0x61
+    , 0x79
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x73
+    , 0x2E
+    , 0x68
+    , 0x6D
+    , 0x6F
+    , 0x6E
+    , 0x69
+    , 0x74
+    , 0x6F
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN@, literal @\"SDL.window.create.always_on_top\"@, defined at @SDL3\/SDL_video.h 1411:9@
+sDL_PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x61
+    , 0x6C
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x73
+    , 0x5F
+    , 0x6F
+    , 0x6E
+    , 0x5F
+    , 0x74
+    , 0x6F
+    , 0x70
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN@, literal @\"SDL.window.create.borderless\"@, defined at @SDL3\/SDL_video.h 1412:9@
+sDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x62
+    , 0x6F
+    , 0x72
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x6C
+    , 0x65
+    , 0x73
+    , 0x73
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN@, literal @\"SDL.window.create.constrain_popup\"@, defined at @SDL3\/SDL_video.h 1413:9@
+sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x6F
+    , 0x6E
+    , 0x73
+    , 0x74
+    , 0x72
+    , 0x61
+    , 0x69
+    , 0x6E
+    , 0x5F
+    , 0x70
+    , 0x6F
+    , 0x70
+    , 0x75
+    , 0x70
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN@, literal @\"SDL.window.create.focusable\"@, defined at @SDL3\/SDL_video.h 1414:9@
+sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x66
+    , 0x6F
+    , 0x63
+    , 0x75
+    , 0x73
+    , 0x61
+    , 0x62
+    , 0x6C
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN@, literal @\"SDL.window.create.external_graphics_context\"@, defined at @SDL3\/SDL_video.h 1415:9@
+sDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x65
+    , 0x78
+    , 0x74
+    , 0x65
+    , 0x72
+    , 0x6E
+    , 0x61
+    , 0x6C
+    , 0x5F
+    , 0x67
+    , 0x72
+    , 0x61
+    , 0x70
+    , 0x68
+    , 0x69
+    , 0x63
+    , 0x73
+    , 0x5F
+    , 0x63
+    , 0x6F
+    , 0x6E
+    , 0x74
+    , 0x65
+    , 0x78
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_FLAGS_NUMBER@, literal @\"SDL.window.create.flags\"@, defined at @SDL3\/SDL_video.h 1416:9@
+sDL_PROP_WINDOW_CREATE_FLAGS_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_FLAGS_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x66
+    , 0x6C
+    , 0x61
+    , 0x67
+    , 0x73
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_FULLSCREEN_BOOLEAN@, literal @\"SDL.window.create.fullscreen\"@, defined at @SDL3\/SDL_video.h 1417:9@
+sDL_PROP_WINDOW_CREATE_FULLSCREEN_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_FULLSCREEN_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x66
+    , 0x75
+    , 0x6C
+    , 0x6C
+    , 0x73
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x65
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER@, literal @\"SDL.window.create.height\"@, defined at @SDL3\/SDL_video.h 1418:9@
+sDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x68
+    , 0x65
+    , 0x69
+    , 0x67
+    , 0x68
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN@, literal @\"SDL.window.create.hidden\"@, defined at @SDL3\/SDL_video.h 1419:9@
+sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x68
+    , 0x69
+    , 0x64
+    , 0x64
+    , 0x65
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_HIGH_PIXEL_DENSITY_BOOLEAN@, literal @\"SDL.window.create.high_pixel_density\"@, defined at @SDL3\/SDL_video.h 1420:9@
+sDL_PROP_WINDOW_CREATE_HIGH_PIXEL_DENSITY_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_HIGH_PIXEL_DENSITY_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x68
+    , 0x69
+    , 0x67
+    , 0x68
+    , 0x5F
+    , 0x70
+    , 0x69
+    , 0x78
+    , 0x65
+    , 0x6C
+    , 0x5F
+    , 0x64
+    , 0x65
+    , 0x6E
+    , 0x73
+    , 0x69
+    , 0x74
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_MAXIMIZED_BOOLEAN@, literal @\"SDL.window.create.maximized\"@, defined at @SDL3\/SDL_video.h 1421:9@
+sDL_PROP_WINDOW_CREATE_MAXIMIZED_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_MAXIMIZED_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6D
+    , 0x61
+    , 0x78
+    , 0x69
+    , 0x6D
+    , 0x69
+    , 0x7A
+    , 0x65
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_MENU_BOOLEAN@, literal @\"SDL.window.create.menu\"@, defined at @SDL3\/SDL_video.h 1422:9@
+sDL_PROP_WINDOW_CREATE_MENU_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_MENU_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x6E
+    , 0x75
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_METAL_BOOLEAN@, literal @\"SDL.window.create.metal\"@, defined at @SDL3\/SDL_video.h 1423:9@
+sDL_PROP_WINDOW_CREATE_METAL_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_METAL_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_MINIMIZED_BOOLEAN@, literal @\"SDL.window.create.minimized\"@, defined at @SDL3\/SDL_video.h 1424:9@
+sDL_PROP_WINDOW_CREATE_MINIMIZED_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_MINIMIZED_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6D
+    , 0x69
+    , 0x6E
+    , 0x69
+    , 0x6D
+    , 0x69
+    , 0x7A
+    , 0x65
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_MODAL_BOOLEAN@, literal @\"SDL.window.create.modal\"@, defined at @SDL3\/SDL_video.h 1425:9@
+sDL_PROP_WINDOW_CREATE_MODAL_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_MODAL_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6D
+    , 0x6F
+    , 0x64
+    , 0x61
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_MOUSE_GRABBED_BOOLEAN@, literal @\"SDL.window.create.mouse_grabbed\"@, defined at @SDL3\/SDL_video.h 1426:9@
+sDL_PROP_WINDOW_CREATE_MOUSE_GRABBED_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_MOUSE_GRABBED_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6D
+    , 0x6F
+    , 0x75
+    , 0x73
+    , 0x65
+    , 0x5F
+    , 0x67
+    , 0x72
+    , 0x61
+    , 0x62
+    , 0x62
+    , 0x65
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN@, literal @\"SDL.window.create.opengl\"@, defined at @SDL3\/SDL_video.h 1427:9@
+sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_PARENT_POINTER@, literal @\"SDL.window.create.parent\"@, defined at @SDL3\/SDL_video.h 1428:9@
+sDL_PROP_WINDOW_CREATE_PARENT_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_PARENT_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x70
+    , 0x61
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN@, literal @\"SDL.window.create.resizable\"@, defined at @SDL3\/SDL_video.h 1429:9@
+sDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x73
+    , 0x69
+    , 0x7A
+    , 0x61
+    , 0x62
+    , 0x6C
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_TITLE_STRING@, literal @\"SDL.window.create.title\"@, defined at @SDL3\/SDL_video.h 1430:9@
+sDL_PROP_WINDOW_CREATE_TITLE_STRING :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_TITLE_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x74
+    , 0x69
+    , 0x74
+    , 0x6C
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_TRANSPARENT_BOOLEAN@, literal @\"SDL.window.create.transparent\"@, defined at @SDL3\/SDL_video.h 1431:9@
+sDL_PROP_WINDOW_CREATE_TRANSPARENT_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_TRANSPARENT_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x74
+    , 0x72
+    , 0x61
+    , 0x6E
+    , 0x73
+    , 0x70
+    , 0x61
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_TOOLTIP_BOOLEAN@, literal @\"SDL.window.create.tooltip\"@, defined at @SDL3\/SDL_video.h 1432:9@
+sDL_PROP_WINDOW_CREATE_TOOLTIP_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_TOOLTIP_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x74
+    , 0x6F
+    , 0x6F
+    , 0x6C
+    , 0x74
+    , 0x69
+    , 0x70
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_UTILITY_BOOLEAN@, literal @\"SDL.window.create.utility\"@, defined at @SDL3\/SDL_video.h 1433:9@
+sDL_PROP_WINDOW_CREATE_UTILITY_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_UTILITY_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x75
+    , 0x74
+    , 0x69
+    , 0x6C
+    , 0x69
+    , 0x74
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_VULKAN_BOOLEAN@, literal @\"SDL.window.create.vulkan\"@, defined at @SDL3\/SDL_video.h 1434:9@
+sDL_PROP_WINDOW_CREATE_VULKAN_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_VULKAN_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x76
+    , 0x75
+    , 0x6C
+    , 0x6B
+    , 0x61
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_WIDTH_NUMBER@, literal @\"SDL.window.create.width\"@, defined at @SDL3\/SDL_video.h 1435:9@
+sDL_PROP_WINDOW_CREATE_WIDTH_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_WIDTH_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x64
+    , 0x74
+    , 0x68
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_X_NUMBER@, literal @\"SDL.window.create.x\"@, defined at @SDL3\/SDL_video.h 1436:9@
+sDL_PROP_WINDOW_CREATE_X_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_X_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x78
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_Y_NUMBER@, literal @\"SDL.window.create.y\"@, defined at @SDL3\/SDL_video.h 1437:9@
+sDL_PROP_WINDOW_CREATE_Y_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_Y_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER@, literal @\"SDL.window.create.cocoa.window\"@, defined at @SDL3\/SDL_video.h 1438:9@
+sDL_PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x6F
+    , 0x63
+    , 0x6F
+    , 0x61
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER@, literal @\"SDL.window.create.cocoa.view\"@, defined at @SDL3\/SDL_video.h 1439:9@
+sDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x63
+    , 0x6F
+    , 0x63
+    , 0x6F
+    , 0x61
+    , 0x2E
+    , 0x76
+    , 0x69
+    , 0x65
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER@, literal @\"SDL.window.create.uikit.windowscene\"@, defined at @SDL3\/SDL_video.h 1440:9@
+sDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x75
+    , 0x69
+    , 0x6B
+    , 0x69
+    , 0x74
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x73
+    , 0x63
+    , 0x65
+    , 0x6E
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN@, literal @\"SDL.window.create.wayland.surface_role_custom\"@, defined at @SDL3\/SDL_video.h 1441:9@
+sDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    , 0x5F
+    , 0x72
+    , 0x6F
+    , 0x6C
+    , 0x65
+    , 0x5F
+    , 0x63
+    , 0x75
+    , 0x73
+    , 0x74
+    , 0x6F
+    , 0x6D
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN@, literal @\"SDL.window.create.wayland.create_egl_window\"@, defined at @SDL3\/SDL_video.h 1442:9@
+sDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x5F
+    , 0x65
+    , 0x67
+    , 0x6C
+    , 0x5F
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER@, literal @\"SDL.window.create.wayland.wl_surface\"@, defined at @SDL3\/SDL_video.h 1443:9@
+sDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x77
+    , 0x6C
+    , 0x5F
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER@, literal @\"SDL.window.create.win32.hwnd\"@, defined at @SDL3\/SDL_video.h 1444:9@
+sDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x33
+    , 0x32
+    , 0x2E
+    , 0x68
+    , 0x77
+    , 0x6E
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER@, literal @\"SDL.window.create.win32.pixel_format_hwnd\"@, defined at @SDL3\/SDL_video.h 1445:9@
+sDL_PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x33
+    , 0x32
+    , 0x2E
+    , 0x70
+    , 0x69
+    , 0x78
+    , 0x65
+    , 0x6C
+    , 0x5F
+    , 0x66
+    , 0x6F
+    , 0x72
+    , 0x6D
+    , 0x61
+    , 0x74
+    , 0x5F
+    , 0x68
+    , 0x77
+    , 0x6E
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER@, literal @\"SDL.window.create.x11.window\"@, defined at @SDL3\/SDL_video.h 1446:9@
+sDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x78
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING@, literal @\"SDL.window.create.emscripten.canvas_id\"@, defined at @SDL3\/SDL_video.h 1447:9@
+sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x65
+    , 0x6D
+    , 0x73
+    , 0x63
+    , 0x72
+    , 0x69
+    , 0x70
+    , 0x74
+    , 0x65
+    , 0x6E
+    , 0x2E
+    , 0x63
+    , 0x61
+    , 0x6E
+    , 0x76
+    , 0x61
+    , 0x73
+    , 0x5F
+    , 0x69
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING@, literal @\"SDL.window.create.emscripten.keyboard_element\"@, defined at @SDL3\/SDL_video.h 1448:9@
+sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING :: BG.ByteString
+sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x61
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x65
+    , 0x6D
+    , 0x73
+    , 0x63
+    , 0x72
+    , 0x69
+    , 0x70
+    , 0x74
+    , 0x65
+    , 0x6E
+    , 0x2E
+    , 0x6B
+    , 0x65
+    , 0x79
+    , 0x62
+    , 0x6F
+    , 0x61
+    , 0x72
+    , 0x64
+    , 0x5F
+    , 0x65
+    , 0x6C
+    , 0x65
+    , 0x6D
+    , 0x65
+    , 0x6E
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_SHAPE_POINTER@, literal @\"SDL.window.shape\"@, defined at @SDL3\/SDL_video.h 1630:9@
+sDL_PROP_WINDOW_SHAPE_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_SHAPE_POINTER =
+  BG.pack
+    [0x53, 0x44, 0x4C, 0x2E, 0x77, 0x69, 0x6E, 0x64, 0x6F, 0x77, 0x2E, 0x73, 0x68, 0x61, 0x70, 0x65]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_HDR_ENABLED_BOOLEAN@, literal @\"SDL.window.HDR_enabled\"@, defined at @SDL3\/SDL_video.h 1631:9@
+sDL_PROP_WINDOW_HDR_ENABLED_BOOLEAN :: BG.ByteString
+sDL_PROP_WINDOW_HDR_ENABLED_BOOLEAN =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x48
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x65
+    , 0x6E
+    , 0x61
+    , 0x62
+    , 0x6C
+    , 0x65
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_SDR_WHITE_LEVEL_FLOAT@, literal @\"SDL.window.SDR_white_level\"@, defined at @SDL3\/SDL_video.h 1632:9@
+sDL_PROP_WINDOW_SDR_WHITE_LEVEL_FLOAT :: BG.ByteString
+sDL_PROP_WINDOW_SDR_WHITE_LEVEL_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x53
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x77
+    , 0x68
+    , 0x69
+    , 0x74
+    , 0x65
+    , 0x5F
+    , 0x6C
+    , 0x65
+    , 0x76
+    , 0x65
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_HDR_HEADROOM_FLOAT@, literal @\"SDL.window.HDR_headroom\"@, defined at @SDL3\/SDL_video.h 1633:9@
+sDL_PROP_WINDOW_HDR_HEADROOM_FLOAT :: BG.ByteString
+sDL_PROP_WINDOW_HDR_HEADROOM_FLOAT =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x48
+    , 0x44
+    , 0x52
+    , 0x5F
+    , 0x68
+    , 0x65
+    , 0x61
+    , 0x64
+    , 0x72
+    , 0x6F
+    , 0x6F
+    , 0x6D
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_ANDROID_WINDOW_POINTER@, literal @\"SDL.window.android.window\"@, defined at @SDL3\/SDL_video.h 1634:9@
+sDL_PROP_WINDOW_ANDROID_WINDOW_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_ANDROID_WINDOW_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x72
+    , 0x6F
+    , 0x69
+    , 0x64
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_ANDROID_SURFACE_POINTER@, literal @\"SDL.window.android.surface\"@, defined at @SDL3\/SDL_video.h 1635:9@
+sDL_PROP_WINDOW_ANDROID_SURFACE_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_ANDROID_SURFACE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x72
+    , 0x6F
+    , 0x69
+    , 0x64
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_UIKIT_WINDOW_POINTER@, literal @\"SDL.window.uikit.window\"@, defined at @SDL3\/SDL_video.h 1636:9@
+sDL_PROP_WINDOW_UIKIT_WINDOW_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_UIKIT_WINDOW_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x75
+    , 0x69
+    , 0x6B
+    , 0x69
+    , 0x74
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER@, literal @\"SDL.window.uikit.metal_view_tag\"@, defined at @SDL3\/SDL_video.h 1637:9@
+sDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x75
+    , 0x69
+    , 0x6B
+    , 0x69
+    , 0x74
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x6C
+    , 0x5F
+    , 0x76
+    , 0x69
+    , 0x65
+    , 0x77
+    , 0x5F
+    , 0x74
+    , 0x61
+    , 0x67
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER@, literal @\"SDL.window.uikit.opengl.framebuffer\"@, defined at @SDL3\/SDL_video.h 1638:9@
+sDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x75
+    , 0x69
+    , 0x6B
+    , 0x69
+    , 0x74
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x66
+    , 0x72
+    , 0x61
+    , 0x6D
+    , 0x65
+    , 0x62
+    , 0x75
+    , 0x66
+    , 0x66
+    , 0x65
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER@, literal @\"SDL.window.uikit.opengl.renderbuffer\"@, defined at @SDL3\/SDL_video.h 1639:9@
+sDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x75
+    , 0x69
+    , 0x6B
+    , 0x69
+    , 0x74
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x72
+    , 0x62
+    , 0x75
+    , 0x66
+    , 0x66
+    , 0x65
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER@, literal @\"SDL.window.uikit.opengl.resolve_framebuffer\"@, defined at @SDL3\/SDL_video.h 1640:9@
+sDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x75
+    , 0x69
+    , 0x6B
+    , 0x69
+    , 0x74
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x67
+    , 0x6C
+    , 0x2E
+    , 0x72
+    , 0x65
+    , 0x73
+    , 0x6F
+    , 0x6C
+    , 0x76
+    , 0x65
+    , 0x5F
+    , 0x66
+    , 0x72
+    , 0x61
+    , 0x6D
+    , 0x65
+    , 0x62
+    , 0x75
+    , 0x66
+    , 0x66
+    , 0x65
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_KMSDRM_DEVICE_INDEX_NUMBER@, literal @\"SDL.window.kmsdrm.dev_index\"@, defined at @SDL3\/SDL_video.h 1641:9@
+sDL_PROP_WINDOW_KMSDRM_DEVICE_INDEX_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_KMSDRM_DEVICE_INDEX_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x6B
+    , 0x6D
+    , 0x73
+    , 0x64
+    , 0x72
+    , 0x6D
+    , 0x2E
+    , 0x64
+    , 0x65
+    , 0x76
+    , 0x5F
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x65
+    , 0x78
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_KMSDRM_DRM_FD_NUMBER@, literal @\"SDL.window.kmsdrm.drm_fd\"@, defined at @SDL3\/SDL_video.h 1642:9@
+sDL_PROP_WINDOW_KMSDRM_DRM_FD_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_KMSDRM_DRM_FD_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x6B
+    , 0x6D
+    , 0x73
+    , 0x64
+    , 0x72
+    , 0x6D
+    , 0x2E
+    , 0x64
+    , 0x72
+    , 0x6D
+    , 0x5F
+    , 0x66
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER@, literal @\"SDL.window.kmsdrm.gbm_dev\"@, defined at @SDL3\/SDL_video.h 1643:9@
+sDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x6B
+    , 0x6D
+    , 0x73
+    , 0x64
+    , 0x72
+    , 0x6D
+    , 0x2E
+    , 0x67
+    , 0x62
+    , 0x6D
+    , 0x5F
+    , 0x64
+    , 0x65
+    , 0x76
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_COCOA_WINDOW_POINTER@, literal @\"SDL.window.cocoa.window\"@, defined at @SDL3\/SDL_video.h 1644:9@
+sDL_PROP_WINDOW_COCOA_WINDOW_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_COCOA_WINDOW_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x6F
+    , 0x63
+    , 0x6F
+    , 0x61
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER@, literal @\"SDL.window.cocoa.metal_view_tag\"@, defined at @SDL3\/SDL_video.h 1645:9@
+sDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x63
+    , 0x6F
+    , 0x63
+    , 0x6F
+    , 0x61
+    , 0x2E
+    , 0x6D
+    , 0x65
+    , 0x74
+    , 0x61
+    , 0x6C
+    , 0x5F
+    , 0x76
+    , 0x69
+    , 0x65
+    , 0x77
+    , 0x5F
+    , 0x74
+    , 0x61
+    , 0x67
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER@, literal @\"SDL.window.openvr.overlay_id\"@, defined at @SDL3\/SDL_video.h 1646:9@
+sDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x6F
+    , 0x70
+    , 0x65
+    , 0x6E
+    , 0x76
+    , 0x72
+    , 0x2E
+    , 0x6F
+    , 0x76
+    , 0x65
+    , 0x72
+    , 0x6C
+    , 0x61
+    , 0x79
+    , 0x5F
+    , 0x69
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER@, literal @\"SDL.window.vivante.display\"@, defined at @SDL3\/SDL_video.h 1647:9@
+sDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x76
+    , 0x69
+    , 0x76
+    , 0x61
+    , 0x6E
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x64
+    , 0x69
+    , 0x73
+    , 0x70
+    , 0x6C
+    , 0x61
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER@, literal @\"SDL.window.vivante.window\"@, defined at @SDL3\/SDL_video.h 1648:9@
+sDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x76
+    , 0x69
+    , 0x76
+    , 0x61
+    , 0x6E
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER@, literal @\"SDL.window.vivante.surface\"@, defined at @SDL3\/SDL_video.h 1649:9@
+sDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x76
+    , 0x69
+    , 0x76
+    , 0x61
+    , 0x6E
+    , 0x74
+    , 0x65
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WIN32_HWND_POINTER@, literal @\"SDL.window.win32.hwnd\"@, defined at @SDL3\/SDL_video.h 1650:9@
+sDL_PROP_WINDOW_WIN32_HWND_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WIN32_HWND_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x33
+    , 0x32
+    , 0x2E
+    , 0x68
+    , 0x77
+    , 0x6E
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WIN32_HDC_POINTER@, literal @\"SDL.window.win32.hdc\"@, defined at @SDL3\/SDL_video.h 1651:9@
+sDL_PROP_WINDOW_WIN32_HDC_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WIN32_HDC_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x33
+    , 0x32
+    , 0x2E
+    , 0x68
+    , 0x64
+    , 0x63
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WIN32_INSTANCE_POINTER@, literal @\"SDL.window.win32.instance\"@, defined at @SDL3\/SDL_video.h 1652:9@
+sDL_PROP_WINDOW_WIN32_INSTANCE_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WIN32_INSTANCE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x33
+    , 0x32
+    , 0x2E
+    , 0x69
+    , 0x6E
+    , 0x73
+    , 0x74
+    , 0x61
+    , 0x6E
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER@, literal @\"SDL.window.wayland.display\"@, defined at @SDL3\/SDL_video.h 1653:9@
+sDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x64
+    , 0x69
+    , 0x73
+    , 0x70
+    , 0x6C
+    , 0x61
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER@, literal @\"SDL.window.wayland.surface\"@, defined at @SDL3\/SDL_video.h 1654:9@
+sDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER@, literal @\"SDL.window.wayland.viewport\"@, defined at @SDL3\/SDL_video.h 1655:9@
+sDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x76
+    , 0x69
+    , 0x65
+    , 0x77
+    , 0x70
+    , 0x6F
+    , 0x72
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER@, literal @\"SDL.window.wayland.egl_window\"@, defined at @SDL3\/SDL_video.h 1656:9@
+sDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x65
+    , 0x67
+    , 0x6C
+    , 0x5F
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER@, literal @\"SDL.window.wayland.xdg_surface\"@, defined at @SDL3\/SDL_video.h 1657:9@
+sDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x78
+    , 0x64
+    , 0x67
+    , 0x5F
+    , 0x73
+    , 0x75
+    , 0x72
+    , 0x66
+    , 0x61
+    , 0x63
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER@, literal @\"SDL.window.wayland.xdg_toplevel\"@, defined at @SDL3\/SDL_video.h 1658:9@
+sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x78
+    , 0x64
+    , 0x67
+    , 0x5F
+    , 0x74
+    , 0x6F
+    , 0x70
+    , 0x6C
+    , 0x65
+    , 0x76
+    , 0x65
+    , 0x6C
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_EXPORT_HANDLE_STRING@, literal @\"SDL.window.wayland.xdg_toplevel_export_handle\"@, defined at @SDL3\/SDL_video.h 1659:9@
+sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_EXPORT_HANDLE_STRING :: BG.ByteString
+sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_EXPORT_HANDLE_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x78
+    , 0x64
+    , 0x67
+    , 0x5F
+    , 0x74
+    , 0x6F
+    , 0x70
+    , 0x6C
+    , 0x65
+    , 0x76
+    , 0x65
+    , 0x6C
+    , 0x5F
+    , 0x65
+    , 0x78
+    , 0x70
+    , 0x6F
+    , 0x72
+    , 0x74
+    , 0x5F
+    , 0x68
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x6C
+    , 0x65
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WAYLAND_XDG_POPUP_POINTER@, literal @\"SDL.window.wayland.xdg_popup\"@, defined at @SDL3\/SDL_video.h 1660:9@
+sDL_PROP_WINDOW_WAYLAND_XDG_POPUP_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WAYLAND_XDG_POPUP_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x78
+    , 0x64
+    , 0x67
+    , 0x5F
+    , 0x70
+    , 0x6F
+    , 0x70
+    , 0x75
+    , 0x70
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_WAYLAND_XDG_POSITIONER_POINTER@, literal @\"SDL.window.wayland.xdg_positioner\"@, defined at @SDL3\/SDL_video.h 1661:9@
+sDL_PROP_WINDOW_WAYLAND_XDG_POSITIONER_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_WAYLAND_XDG_POSITIONER_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x77
+    , 0x61
+    , 0x79
+    , 0x6C
+    , 0x61
+    , 0x6E
+    , 0x64
+    , 0x2E
+    , 0x78
+    , 0x64
+    , 0x67
+    , 0x5F
+    , 0x70
+    , 0x6F
+    , 0x73
+    , 0x69
+    , 0x74
+    , 0x69
+    , 0x6F
+    , 0x6E
+    , 0x65
+    , 0x72
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_X11_DISPLAY_POINTER@, literal @\"SDL.window.x11.display\"@, defined at @SDL3\/SDL_video.h 1662:9@
+sDL_PROP_WINDOW_X11_DISPLAY_POINTER :: BG.ByteString
+sDL_PROP_WINDOW_X11_DISPLAY_POINTER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x78
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x64
+    , 0x69
+    , 0x73
+    , 0x70
+    , 0x6C
+    , 0x61
+    , 0x79
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_X11_SCREEN_NUMBER@, literal @\"SDL.window.x11.screen\"@, defined at @SDL3\/SDL_video.h 1663:9@
+sDL_PROP_WINDOW_X11_SCREEN_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_X11_SCREEN_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x78
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x73
+    , 0x63
+    , 0x72
+    , 0x65
+    , 0x65
+    , 0x6E
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_X11_WINDOW_NUMBER@, literal @\"SDL.window.x11.window\"@, defined at @SDL3\/SDL_video.h 1664:9@
+sDL_PROP_WINDOW_X11_WINDOW_NUMBER :: BG.ByteString
+sDL_PROP_WINDOW_X11_WINDOW_NUMBER =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x78
+    , 0x31
+    , 0x31
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING@, literal @\"SDL.window.emscripten.canvas_id\"@, defined at @SDL3\/SDL_video.h 1665:9@
+sDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING :: BG.ByteString
+sDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x65
+    , 0x6D
+    , 0x73
+    , 0x63
+    , 0x72
+    , 0x69
+    , 0x70
+    , 0x74
+    , 0x65
+    , 0x6E
+    , 0x2E
+    , 0x63
+    , 0x61
+    , 0x6E
+    , 0x76
+    , 0x61
+    , 0x73
+    , 0x5F
+    , 0x69
+    , 0x64
+    ]
+
+-- | [C declaration]: @macro SDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING@, literal @\"SDL.window.emscripten.keyboard_element\"@, defined at @SDL3\/SDL_video.h 1666:9@
+sDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING :: BG.ByteString
+sDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING =
+  BG.pack
+    [ 0x53
+    , 0x44
+    , 0x4C
+    , 0x2E
+    , 0x77
+    , 0x69
+    , 0x6E
+    , 0x64
+    , 0x6F
+    , 0x77
+    , 0x2E
+    , 0x65
+    , 0x6D
+    , 0x73
+    , 0x63
+    , 0x72
+    , 0x69
+    , 0x70
+    , 0x74
+    , 0x65
+    , 0x6E
+    , 0x2E
+    , 0x6B
+    , 0x65
+    , 0x79
+    , 0x62
+    , 0x6F
+    , 0x61
+    , 0x72
+    , 0x64
+    , 0x5F
+    , 0x65
+    , 0x6C
+    , 0x65
+    , 0x6D
+    , 0x65
+    , 0x6E
+    , 0x74
+    ]
+
+-- | [C declaration]: @macro SDL_WINDOW_SURFACE_VSYNC_DISABLED@, defined at @SDL3\/SDL_video.h 2463:9@
+sDL_WINDOW_SURFACE_VSYNC_DISABLED :: BG.CInt
+sDL_WINDOW_SURFACE_VSYNC_DISABLED = (0 :: BG.CInt)
+
+-- | [C declaration]: @macro SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE@, defined at @SDL3\/SDL_video.h 2464:9@
+sDL_WINDOW_SURFACE_VSYNC_ADAPTIVE :: BG.CInt
+sDL_WINDOW_SURFACE_VSYNC_ADAPTIVE =
+  C.Expr.HostPlatform.negate (1 :: BG.CInt)
+
+-- | Possible return values from the 'SDL_HitTest' callback.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_HitTest'
+--
+--     [C declaration]: @enum SDL_HitTestResult@, defined at @SDL3\/SDL_video.h 2828:14@
+newtype SDL_HitTestResult = SDL_HitTestResult
+  { unwrap :: BG.CUInt
+  }
+  deriving stock (BG.Generic, Eq, Ord)
+  deriving newtype (BG.HasFFIType)
+
+instance Marshal.StaticSize SDL_HitTestResult where
+  staticSizeOf = \_ -> (4 :: Int)
+
+  staticAlignment = \_ -> (4 :: Int)
+
+instance Marshal.ReadRaw SDL_HitTestResult where
+  readRaw =
+    \ptr0 ->
+      pure SDL_HitTestResult
+        <*> Marshal.readRawByteOff ptr0 (0 :: Int)
+
+instance Marshal.WriteRaw SDL_HitTestResult where
+  writeRaw =
+    \ptr0 ->
+      \s1 ->
+        case s1 of
+          SDL_HitTestResult unwrap2 ->
+            Marshal.writeRawByteOff ptr0 (0 :: Int) unwrap2
+
+deriving via Marshal.EquivStorable SDL_HitTestResult instance BG.Storable SDL_HitTestResult
+
+deriving via BG.CUInt instance BG.Prim SDL_HitTestResult
+
+instance CEnum.CEnum SDL_HitTestResult where
+  type CEnumZ SDL_HitTestResult = BG.CUInt
+
+  toCEnum = SDL_HitTestResult
+
+  fromCEnum = BG.getField @"unwrap"
+
+  declaredValues =
+    \_ ->
+      CEnum.declaredValuesFromList
+        [ (0, BG.singleton "SDL_HITTEST_NORMAL")
+        , (1, BG.singleton "SDL_HITTEST_DRAGGABLE")
+        , (2, BG.singleton "SDL_HITTEST_RESIZE_TOPLEFT")
+        , (3, BG.singleton "SDL_HITTEST_RESIZE_TOP")
+        , (4, BG.singleton "SDL_HITTEST_RESIZE_TOPRIGHT")
+        , (5, BG.singleton "SDL_HITTEST_RESIZE_RIGHT")
+        , (6, BG.singleton "SDL_HITTEST_RESIZE_BOTTOMRIGHT")
+        , (7, BG.singleton "SDL_HITTEST_RESIZE_BOTTOM")
+        , (8, BG.singleton "SDL_HITTEST_RESIZE_BOTTOMLEFT")
+        , (9, BG.singleton "SDL_HITTEST_RESIZE_LEFT")
+        ]
+
+  showsUndeclared =
+    CEnum.showsWrappedUndeclared "SDL_HitTestResult"
+
+  readPrecUndeclared =
+    CEnum.readPrecWrappedUndeclared "SDL_HitTestResult"
+
+  isDeclared = CEnum.seqIsDeclared
+
+  mkDeclared = CEnum.seqMkDeclared
+
+instance CEnum.SequentialCEnum SDL_HitTestResult where
+  minDeclaredValue = SDL_HITTEST_NORMAL
+
+  maxDeclaredValue = SDL_HITTEST_RESIZE_LEFT
+
+instance Show SDL_HitTestResult where
+  showsPrec = CEnum.shows
+
+instance Read SDL_HitTestResult where
+  readPrec = CEnum.readPrec
+
+  readList = BG.readListDefault
+
+  readListPrec = BG.readListPrecDefault
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.CompatHasField.HasField "unwrap" SDL_HitTestResult ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HitTestResult{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.CUInt)
+  => BG.HasField "unwrap" (BG.Ptr SDL_HitTestResult) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_HitTestResult "unwrap" where
+  type CFieldType SDL_HitTestResult "unwrap" = BG.CUInt
+
+  offset# = \_ -> \_ -> 0
+
+-- | Region is normal. No special properties.
+--
+--     [C declaration]: @SDL_HITTEST_NORMAL@, defined at @SDL3\/SDL_video.h 2830:5@
+pattern SDL_HITTEST_NORMAL :: SDL_HitTestResult
+pattern SDL_HITTEST_NORMAL = SDL_HitTestResult 0
+
+-- | Region can drag entire window.
+--
+--     [C declaration]: @SDL_HITTEST_DRAGGABLE@, defined at @SDL3\/SDL_video.h 2831:5@
+pattern SDL_HITTEST_DRAGGABLE :: SDL_HitTestResult
+pattern SDL_HITTEST_DRAGGABLE = SDL_HitTestResult 1
+
+-- | Region is the resizable top-left corner border.
+--
+--     [C declaration]: @SDL_HITTEST_RESIZE_TOPLEFT@, defined at @SDL3\/SDL_video.h 2832:5@
+pattern SDL_HITTEST_RESIZE_TOPLEFT :: SDL_HitTestResult
+pattern SDL_HITTEST_RESIZE_TOPLEFT = SDL_HitTestResult 2
+
+-- | Region is the resizable top border.
+--
+--     [C declaration]: @SDL_HITTEST_RESIZE_TOP@, defined at @SDL3\/SDL_video.h 2833:5@
+pattern SDL_HITTEST_RESIZE_TOP :: SDL_HitTestResult
+pattern SDL_HITTEST_RESIZE_TOP = SDL_HitTestResult 3
+
+-- | Region is the resizable top-right corner border.
+--
+--     [C declaration]: @SDL_HITTEST_RESIZE_TOPRIGHT@, defined at @SDL3\/SDL_video.h 2834:5@
+pattern SDL_HITTEST_RESIZE_TOPRIGHT :: SDL_HitTestResult
+pattern SDL_HITTEST_RESIZE_TOPRIGHT = SDL_HitTestResult 4
+
+-- | Region is the resizable right border.
+--
+--     [C declaration]: @SDL_HITTEST_RESIZE_RIGHT@, defined at @SDL3\/SDL_video.h 2835:5@
+pattern SDL_HITTEST_RESIZE_RIGHT :: SDL_HitTestResult
+pattern SDL_HITTEST_RESIZE_RIGHT = SDL_HitTestResult 5
+
+-- | Region is the resizable bottom-right corner border.
+--
+--     [C declaration]: @SDL_HITTEST_RESIZE_BOTTOMRIGHT@, defined at @SDL3\/SDL_video.h 2836:5@
+pattern SDL_HITTEST_RESIZE_BOTTOMRIGHT :: SDL_HitTestResult
+pattern SDL_HITTEST_RESIZE_BOTTOMRIGHT = SDL_HitTestResult 6
+
+-- | Region is the resizable bottom border.
+--
+--     [C declaration]: @SDL_HITTEST_RESIZE_BOTTOM@, defined at @SDL3\/SDL_video.h 2837:5@
+pattern SDL_HITTEST_RESIZE_BOTTOM :: SDL_HitTestResult
+pattern SDL_HITTEST_RESIZE_BOTTOM = SDL_HitTestResult 7
+
+-- | Region is the resizable bottom-left corner border.
+--
+--     [C declaration]: @SDL_HITTEST_RESIZE_BOTTOMLEFT@, defined at @SDL3\/SDL_video.h 2838:5@
+pattern SDL_HITTEST_RESIZE_BOTTOMLEFT :: SDL_HitTestResult
+pattern SDL_HITTEST_RESIZE_BOTTOMLEFT = SDL_HitTestResult 8
+
+-- | Region is the resizable left border.
+--
+--     [C declaration]: @SDL_HITTEST_RESIZE_LEFT@, defined at @SDL3\/SDL_video.h 2839:5@
+pattern SDL_HITTEST_RESIZE_LEFT :: SDL_HitTestResult
+pattern SDL_HITTEST_RESIZE_LEFT = SDL_HitTestResult 9
+
+-- | Auxiliary type used by 'SDL_HitTest'
+--
+--     [C declaration]: @SDL_HitTest@, defined at @SDL3\/SDL_video.h 2852:37@
+newtype SDL_HitTest_Aux = SDL_HitTest_Aux
+  { unwrap
+      :: BG.Ptr SDL_Window
+      -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point
+      -> BG.Ptr BG.Void
+      -> IO SDL_HitTestResult
+  }
+  deriving stock (BG.Generic)
+  deriving newtype (BG.HasFFIType)
+
+-- __unique:__ @toSDL_HitTest_Aux@
+foreign import ccall safe "wrapper"
+  hs_bindgen_22e8e872c7c7261b_base
+    :: (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32)
+    -> IO (BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32))
+
+-- __unique:__ @toSDL_HitTest_Aux@
+hs_bindgen_22e8e872c7c7261b
+  :: SDL_HitTest_Aux
+  -> IO (BG.FunPtr SDL_HitTest_Aux)
+hs_bindgen_22e8e872c7c7261b =
+  \fun0 ->
+    fmap BG.castFunPtrFromFFIType (hs_bindgen_22e8e872c7c7261b_base (BG.toFFIType fun0))
+
+-- __unique:__ @fromSDL_HitTest_Aux@
+foreign import ccall safe "dynamic"
+  hs_bindgen_33151ef072f28e0c_base
+    :: BG.FunPtr (BG.Ptr BG.Void -> BG.Ptr BG.Void -> BG.Ptr BG.Void -> IO BG.Word32)
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @fromSDL_HitTest_Aux@
+hs_bindgen_33151ef072f28e0c
+  :: BG.FunPtr SDL_HitTest_Aux
+  -> SDL_HitTest_Aux
+hs_bindgen_33151ef072f28e0c =
+  \funPtr0 ->
+    BG.fromFFIType (hs_bindgen_33151ef072f28e0c_base (BG.castFunPtrToFFIType funPtr0))
+
+instance BG.ToFunPtr SDL_HitTest_Aux where
+  toFunPtr = hs_bindgen_22e8e872c7c7261b
+
+instance BG.FromFunPtr SDL_HitTest_Aux where
+  fromFunPtr = hs_bindgen_33151ef072f28e0c
+
+instance
+  ( ty
+      ~ ( BG.Ptr SDL_Window
+          -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point
+          -> BG.Ptr BG.Void
+          -> IO SDL_HitTestResult
+        )
+  )
+  => BG.CompatHasField.HasField "unwrap" SDL_HitTest_Aux ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HitTest_Aux{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  ( ty
+      ~ ( BG.Ptr SDL_Window
+          -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point
+          -> BG.Ptr BG.Void
+          -> IO SDL_HitTestResult
+        )
+  )
+  => BG.HasField "unwrap" (BG.Ptr SDL_HitTest_Aux) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_HitTest_Aux "unwrap" where
+  type
+    CFieldType SDL_HitTest_Aux "unwrap" =
+      BG.Ptr SDL_Window
+      -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point
+      -> BG.Ptr BG.Void
+      -> IO SDL_HitTestResult
+
+  offset# = \_ -> \_ -> 0
+
+-- | Callback used for hit-testing.
+--
+--     [@win@]: the 'SDL_Window' where hit-testing was set on.
+--
+--     [@area@]: an SDL_Point which should be hit-tested.
+--
+--     [@data@]: what was passed as @callback_data@ to @SDL_SetWindowHitTest()@.
+--
+--     [Returns]: an 'SDL_HitTestResult' value.
+--
+--     [See also]: 'sDL_SetWindowHitTest'
+--
+--     [C declaration]: @SDL_HitTest@, defined at @SDL3\/SDL_video.h 2852:37@
+newtype SDL_HitTest = SDL_HitTest
+  { unwrap :: BG.FunPtr SDL_HitTest_Aux
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.FunPtr SDL_HitTest_Aux)
+  => BG.CompatHasField.HasField "unwrap" SDL_HitTest ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          SDL_HitTest{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.FunPtr SDL_HitTest_Aux)
+  => BG.HasField "unwrap" (BG.Ptr SDL_HitTest) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField SDL_HitTest "unwrap" where
+  type
+    CFieldType SDL_HitTest "unwrap" =
+      BG.FunPtr SDL_HitTest_Aux
+
+  offset# = \_ -> \_ -> 0
diff --git a/src/SDL3/Sys/Bindgen/Video/FunPtr.hs b/src/SDL3/Sys/Bindgen/Video/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Video/FunPtr.hs
@@ -0,0 +1,5267 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Video.FunPtr (
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetNumVideoDrivers,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetVideoDriver,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetCurrentVideoDriver,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetSystemTheme,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetDisplays,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetPrimaryDisplay,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetDisplayProperties,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetDisplayName,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetDisplayBounds,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetDisplayUsableBounds,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetNaturalDisplayOrientation,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetCurrentDisplayOrientation,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetDisplayContentScale,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetFullscreenDisplayModes,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetClosestFullscreenDisplayMode,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetDesktopDisplayMode,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetCurrentDisplayMode,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetDisplayForPoint,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetDisplayForRect,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetDisplayForWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowPixelDensity,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowDisplayScale,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowFullscreenMode,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowFullscreenMode,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowICCProfile,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowPixelFormat,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindows,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_CreateWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_CreatePopupWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_CreateWindowWithProperties,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowID,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowFromID,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowParent,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowProperties,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowFlags,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowTitle,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowTitle,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowIcon,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowPosition,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowPosition,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowSize,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowSize,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowSafeArea,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowAspectRatio,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowAspectRatio,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowBordersSize,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowSizeInPixels,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowMinimumSize,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowMinimumSize,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowMaximumSize,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowMaximumSize,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowBordered,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowResizable,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowAlwaysOnTop,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowFillDocument,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_ShowWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_HideWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_RaiseWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_MaximizeWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_MinimizeWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_RestoreWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowFullscreen,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SyncWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_WindowHasSurface,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowSurface,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowSurfaceVSync,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowSurfaceVSync,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_UpdateWindowSurface,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_UpdateWindowSurfaceRects,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_DestroyWindowSurface,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowKeyboardGrab,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowMouseGrab,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowKeyboardGrab,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowMouseGrab,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetGrabbedWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowMouseRect,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowMouseRect,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowOpacity,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowOpacity,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowParent,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowModal,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowFocusable,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_ShowWindowSystemMenu,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowHitTest,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowShape,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_FlashWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowProgressState,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowProgressState,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_SetWindowProgressValue,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GetWindowProgressValue,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_DestroyWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_ScreenSaverEnabled,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_EnableScreenSaver,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_DisableScreenSaver,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_LoadLibrary,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_GetProcAddress,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_EGL_GetProcAddress,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_UnloadLibrary,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_ExtensionSupported,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_ResetAttributes,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_SetAttribute,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_GetAttribute,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_CreateContext,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_MakeCurrent,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_GetCurrentWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_GetCurrentContext,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_EGL_GetCurrentDisplay,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_EGL_GetCurrentConfig,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_EGL_GetWindowSurface,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_EGL_SetAttributeCallbacks,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_SetSwapInterval,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_GetSwapInterval,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_SwapWindow,
+  SDL3.Sys.Bindgen.Video.FunPtr.sDL_GL_DestroyContext,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_video.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetNumVideoDrivers */"
+         , "__attribute__ ((const))"
+         , "signed int (*hs_bindgen_cd62c011cded1808 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetNumVideoDrivers;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetVideoDriver */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_046d70207bafe47f (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetVideoDriver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetCurrentVideoDriver */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_fb283d39e283ed14 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetCurrentVideoDriver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetSystemTheme */"
+         , "__attribute__ ((const))"
+         , "SDL_SystemTheme (*hs_bindgen_7bbdbd7274c0b5b5 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetSystemTheme;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplays */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayID *(*hs_bindgen_70f7cf654509b2c3 (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDisplays;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetPrimaryDisplay */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayID (*hs_bindgen_b790a4a3043628fa (void)) (void)"
+         , "{"
+         , "  return &SDL_GetPrimaryDisplay;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_c3f8ffe6ded9cfd6 (void)) ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDisplayProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayName */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_d5ad6e555b5cb237 (void)) ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDisplayName;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayBounds */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6d5f9eee448719f4 (void)) ("
+         , "  SDL_DisplayID arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDisplayBounds;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayUsableBounds */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_65535f32592754c4 (void)) ("
+         , "  SDL_DisplayID arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDisplayUsableBounds;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetNaturalDisplayOrientation */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayOrientation (*hs_bindgen_66971f9bdcb4b971 (void)) ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetNaturalDisplayOrientation;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetCurrentDisplayOrientation */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayOrientation (*hs_bindgen_a24aa5e4df6d8aa0 (void)) ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCurrentDisplayOrientation;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayContentScale */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_eab36ce421e54b3e (void)) ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDisplayContentScale;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetFullscreenDisplayModes */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayMode **(*hs_bindgen_bd010935798ea365 (void)) ("
+         , "  SDL_DisplayID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetFullscreenDisplayModes;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetClosestFullscreenDisplayMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d0e64a6f43b88a5e (void)) ("
+         , "  SDL_DisplayID arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  float arg4,"
+         , "  _Bool arg5,"
+         , "  SDL_DisplayMode *arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_GetClosestFullscreenDisplayMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDesktopDisplayMode */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayMode const *(*hs_bindgen_72b78488001b241a (void)) ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDesktopDisplayMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetCurrentDisplayMode */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayMode const *(*hs_bindgen_4ea9690ee956f077 (void)) ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetCurrentDisplayMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayForPoint */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayID (*hs_bindgen_de146763764fd52f (void)) ("
+         , "  SDL_Point const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDisplayForPoint;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayForRect */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayID (*hs_bindgen_710a7746f071d499 (void)) ("
+         , "  SDL_Rect const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDisplayForRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayForWindow */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayID (*hs_bindgen_ab0b114093b84662 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetDisplayForWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowPixelDensity */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_dc1af7f260c7365f (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowPixelDensity;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowDisplayScale */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_95da25536b3703d7 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowDisplayScale;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFullscreenMode */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f0a6d02b7642ed3e (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_DisplayMode const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowFullscreenMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowFullscreenMode */"
+         , "__attribute__ ((const))"
+         , "SDL_DisplayMode const *(*hs_bindgen_16bce449fb30d23a (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowFullscreenMode;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowICCProfile */"
+         , "__attribute__ ((const))"
+         , "void *(*hs_bindgen_5c1cf7c698aa08ce (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowICCProfile;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowPixelFormat */"
+         , "__attribute__ ((const))"
+         , "SDL_PixelFormat (*hs_bindgen_b8027cb465e5a5a2 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowPixelFormat;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindows */"
+         , "__attribute__ ((const))"
+         , "SDL_Window **(*hs_bindgen_b2965b9f9dd9971d (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindows;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_CreateWindow */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_c12016fdc0d7966b (void)) ("
+         , "  char const *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_WindowFlags arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_CreatePopupWindow */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_684a9951d98feb17 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5,"
+         , "  SDL_WindowFlags arg6"
+         , ")"
+         , "{"
+         , "  return &SDL_CreatePopupWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_CreateWindowWithProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_2143bdc9c78e0e7e (void)) ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_CreateWindowWithProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowID */"
+         , "__attribute__ ((const))"
+         , "SDL_WindowID (*hs_bindgen_271b950c2d28e361 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowFromID */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_4b427f44c79ceb27 (void)) ("
+         , "  SDL_WindowID arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowFromID;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowParent */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_3f127843661c07d5 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowParent;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowProperties */"
+         , "__attribute__ ((const))"
+         , "SDL_PropertiesID (*hs_bindgen_985031bf6e083168 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowProperties;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowFlags */"
+         , "__attribute__ ((const))"
+         , "SDL_WindowFlags (*hs_bindgen_b1430580544057d6 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowFlags;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowTitle */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_02e6f654a8740cb6 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowTitle;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowTitle */"
+         , "__attribute__ ((const))"
+         , "char const *(*hs_bindgen_461782ed3ae5273a (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowTitle;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowIcon */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c87ab967152ab788 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowIcon;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowPosition */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_196834c01e56d982 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowPosition;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowPosition */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f2881c8d992e0f1f (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowPosition;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c18dc3d08bf90f70 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_df749a5a4c237fc6 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSafeArea */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8d8deb6f3e406cac (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowSafeArea;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowAspectRatio */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_25a8a6e0ad2d08d8 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowAspectRatio;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowAspectRatio */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d18b72c056e3e796 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowAspectRatio;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowBordersSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_72cf6e7cf38f6a60 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3,"
+         , "  signed int *arg4,"
+         , "  signed int *arg5"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowBordersSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSizeInPixels */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6affb1847f677537 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowSizeInPixels;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMinimumSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_6edf78b362442bfc (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowMinimumSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMinimumSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_95a71d8cbb92dc9e (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowMinimumSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMaximumSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_291022ee01415afe (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowMaximumSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMaximumSize */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_dc1d465b3b604dcd (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowMaximumSize;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowBordered */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_88f2360be3e7e300 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowBordered;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowResizable */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_5100302cfda497dd (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowResizable;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowAlwaysOnTop */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_608fd57fdcd4f95b (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowAlwaysOnTop;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFillDocument */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_68dc00f60262f0f8 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SetWindowFillDocument;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetWindowFillDocument requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_ShowWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_64fdfc7ce17dc625 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_ShowWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_HideWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c2ab0cd6e971a55f (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_HideWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_RaiseWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e3e1a65c603c3d63 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RaiseWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_MaximizeWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_fe10be381d9d51e0 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_MaximizeWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_MinimizeWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d04014fe275b362c (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_MinimizeWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_RestoreWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7fb2f1337e1419c4 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_RestoreWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFullscreen */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7997a9fb73c8d257 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowFullscreen;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SyncWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_99cfe89c3d1870d2 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_SyncWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_WindowHasSurface */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_492c4aeae7928033 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_WindowHasSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSurface */"
+         , "__attribute__ ((const))"
+         , "SDL_Surface *(*hs_bindgen_2f8a00e3685394ac (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowSurfaceVSync */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8e03aa1985376fed (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowSurfaceVSync;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSurfaceVSync */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d0cf4eceaaa0e08e (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowSurfaceVSync;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_UpdateWindowSurface */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_ed4a6fb4d50f6be0 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_UpdateWindowSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_UpdateWindowSurfaceRects */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_02e706becc194495 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_UpdateWindowSurfaceRects;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_DestroyWindowSurface */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3f86b6de52c490a8 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyWindowSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowKeyboardGrab */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1a10593b47408de7 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowKeyboardGrab;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMouseGrab */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_1c52b8e1bc921458 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowMouseGrab;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowKeyboardGrab */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_bd31081b6b534f49 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowKeyboardGrab;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMouseGrab */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_40af0f6caff933b4 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowMouseGrab;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetGrabbedWindow */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_072d8bccac218ad2 (void)) (void)"
+         , "{"
+         , "  return &SDL_GetGrabbedWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMouseRect */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_95863c8d80115819 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowMouseRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMouseRect */"
+         , "__attribute__ ((const))"
+         , "SDL_Rect const *(*hs_bindgen_049b065f15b35ce9 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowMouseRect;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowOpacity */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_0e865d00ef5cb4eb (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowOpacity;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowOpacity */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_fd15ea94ae6c8654 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GetWindowOpacity;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowParent */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_da11824c9c49e3e7 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowParent;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowModal */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9c2f4466a2e12383 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowModal;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFocusable */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_61fa950af6d7c2e1 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowFocusable;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_ShowWindowSystemMenu */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_cd482a252a1dea04 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_ShowWindowSystemMenu;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowHitTest */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d2a7a11a0da70b01 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_HitTest arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowHitTest;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowShape */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_3067f5f277541798 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_SetWindowShape;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_FlashWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_7accb263b1f5da86 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_FlashOperation arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_FlashWindow;"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_ProgressState;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowProgressState */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_9c2c63ad5f7e2b4b (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_ProgressState arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SetWindowProgressState;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetWindowProgressState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_ProgressState;"
+         , "#endif"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowProgressState */"
+         , "__attribute__ ((const))"
+         , "SDL_ProgressState (*hs_bindgen_3c97888e379fc33c (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetWindowProgressState;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetWindowProgressState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowProgressValue */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_df10903c71d955ff (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_SetWindowProgressValue;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_SetWindowProgressValue requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowProgressValue */"
+         , "__attribute__ ((const))"
+         , "float (*hs_bindgen_1e0d101b30846cb1 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return &SDL_GetWindowProgressValue;"
+         , "#else"
+         , "  SDL_SetError(\"SDL_GetWindowProgressValue requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_DestroyWindow */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_3af09b929d2d36ab (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_DestroyWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_ScreenSaverEnabled */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_91298d9810095c05 (void)) (void)"
+         , "{"
+         , "  return &SDL_ScreenSaverEnabled;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EnableScreenSaver */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_a142225724865b93 (void)) (void)"
+         , "{"
+         , "  return &SDL_EnableScreenSaver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_DisableScreenSaver */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_96e0130db8c924c0 (void)) (void)"
+         , "{"
+         , "  return &SDL_DisableScreenSaver;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_LoadLibrary */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_eab5183eb86cd104 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_LoadLibrary;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetProcAddress */"
+         , "__attribute__ ((const))"
+         , "SDL_FunctionPointer (*hs_bindgen_34476455b181778b (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_GetProcAddress;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetProcAddress */"
+         , "__attribute__ ((const))"
+         , "SDL_FunctionPointer (*hs_bindgen_b7365d91417dcc00 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_EGL_GetProcAddress;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_UnloadLibrary */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_626ee6f51d853cc4 (void)) (void)"
+         , "{"
+         , "  return &SDL_GL_UnloadLibrary;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_ExtensionSupported */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_4b6ac25f9c74898b (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_ExtensionSupported;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_ResetAttributes */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_8d3172eec8730621 (void)) (void)"
+         , "{"
+         , "  return &SDL_GL_ResetAttributes;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_SetAttribute */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2c780ec7126f44cf (void)) ("
+         , "  SDL_GLAttr arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_SetAttribute;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetAttribute */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_f2be9d4ead0d65a2 (void)) ("
+         , "  SDL_GLAttr arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_GetAttribute;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_CreateContext */"
+         , "__attribute__ ((const))"
+         , "SDL_GLContext (*hs_bindgen_9f1f69477c4acb50 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_CreateContext;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_MakeCurrent */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2336de6c69b02847 (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_GLContext arg2"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_MakeCurrent;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetCurrentWindow */"
+         , "__attribute__ ((const))"
+         , "SDL_Window *(*hs_bindgen_1d77b3c33533bc52 (void)) (void)"
+         , "{"
+         , "  return &SDL_GL_GetCurrentWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetCurrentContext */"
+         , "__attribute__ ((const))"
+         , "SDL_GLContext (*hs_bindgen_70929e076db9af7f (void)) (void)"
+         , "{"
+         , "  return &SDL_GL_GetCurrentContext;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetCurrentDisplay */"
+         , "__attribute__ ((const))"
+         , "SDL_EGLDisplay (*hs_bindgen_ad8ff3579d19bf4c (void)) (void)"
+         , "{"
+         , "  return &SDL_EGL_GetCurrentDisplay;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetCurrentConfig */"
+         , "__attribute__ ((const))"
+         , "SDL_EGLConfig (*hs_bindgen_52c08e8d53d84085 (void)) (void)"
+         , "{"
+         , "  return &SDL_EGL_GetCurrentConfig;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetWindowSurface */"
+         , "__attribute__ ((const))"
+         , "SDL_EGLSurface (*hs_bindgen_4d9d3145651703ea (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_EGL_GetWindowSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_SetAttributeCallbacks */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_2d4a4b5954adbdda (void)) ("
+         , "  SDL_EGLAttribArrayCallback arg1,"
+         , "  SDL_EGLIntArrayCallback arg2,"
+         , "  SDL_EGLIntArrayCallback arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_EGL_SetAttributeCallbacks;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_SetSwapInterval */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_61901cbd29279d80 (void)) ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_SetSwapInterval;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetSwapInterval */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_2ead7bd70a2b5362 (void)) ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_GetSwapInterval;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_SwapWindow */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_21d656c344c13469 (void)) ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_SwapWindow;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_DestroyContext */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_c03de6ace9ca6264 (void)) ("
+         , "  SDL_GLContext arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_GL_DestroyContext;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetNumVideoDrivers@
+foreign import ccall unsafe "hs_bindgen_cd62c011cded1808"
+  hs_bindgen_cd62c011cded1808_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetNumVideoDrivers@
+hs_bindgen_cd62c011cded1808 :: IO (BG.FunPtr (IO BG.CInt))
+hs_bindgen_cd62c011cded1808 =
+  BG.fromFFIType hs_bindgen_cd62c011cded1808_base
+
+{-# NOINLINE sDL_GetNumVideoDrivers #-}
+
+-- | Get the number of video drivers compiled into SDL.
+--
+--     [Returns]: the number of built in video drivers.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetVideoDriver'
+--
+--     [C declaration]: @SDL_GetNumVideoDrivers@, defined at @SDL3\/SDL_video.h 563:33@
+sDL_GetNumVideoDrivers :: BG.FunPtr (IO BG.CInt)
+sDL_GetNumVideoDrivers =
+  BG.unsafePerformIO hs_bindgen_cd62c011cded1808
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetVideoDriver@
+foreign import ccall unsafe "hs_bindgen_046d70207bafe47f"
+  hs_bindgen_046d70207bafe47f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetVideoDriver@
+hs_bindgen_046d70207bafe47f :: IO (BG.FunPtr (BG.CInt -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_046d70207bafe47f =
+  BG.fromFFIType hs_bindgen_046d70207bafe47f_base
+
+{-# NOINLINE sDL_GetVideoDriver #-}
+
+-- | Get the name of a built in video driver.
+--
+--     The video 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 \"cocoa\", \"x11\" or \"windows\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [@index@]: the index of a video driver.
+--
+--     [Returns]: the name of the video driver with the given __index__, or NULL if index is out of bounds.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumVideoDrivers'
+--
+--     [C declaration]: @SDL_GetVideoDriver@, defined at @SDL3\/SDL_video.h 585:42@
+sDL_GetVideoDriver :: BG.FunPtr (BG.CInt -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetVideoDriver =
+  BG.unsafePerformIO hs_bindgen_046d70207bafe47f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetCurrentVideoDriver@
+foreign import ccall unsafe "hs_bindgen_fb283d39e283ed14"
+  hs_bindgen_fb283d39e283ed14_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetCurrentVideoDriver@
+hs_bindgen_fb283d39e283ed14 :: IO (BG.FunPtr (IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_fb283d39e283ed14 =
+  BG.fromFFIType hs_bindgen_fb283d39e283ed14_base
+
+{-# NOINLINE sDL_GetCurrentVideoDriver #-}
+
+-- | Get the name of the currently initialized video driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"cocoa\", \"x11\" or \"windows\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current video driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumVideoDrivers', 'sDL_GetVideoDriver'
+--
+--     [C declaration]: @SDL_GetCurrentVideoDriver@, defined at @SDL3\/SDL_video.h 604:42@
+sDL_GetCurrentVideoDriver :: BG.FunPtr (IO (PtrConst.PtrConst BG.CChar))
+sDL_GetCurrentVideoDriver =
+  BG.unsafePerformIO hs_bindgen_fb283d39e283ed14
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetSystemTheme@
+foreign import ccall unsafe "hs_bindgen_7bbdbd7274c0b5b5"
+  hs_bindgen_7bbdbd7274c0b5b5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetSystemTheme@
+hs_bindgen_7bbdbd7274c0b5b5 :: IO (BG.FunPtr (IO SDL_SystemTheme))
+hs_bindgen_7bbdbd7274c0b5b5 =
+  BG.fromFFIType hs_bindgen_7bbdbd7274c0b5b5_base
+
+{-# NOINLINE sDL_GetSystemTheme #-}
+
+-- | Get the current system theme.
+--
+--     [Returns]: the current system theme, light, dark, or unknown.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSystemTheme@, defined at @SDL3\/SDL_video.h 615:45@
+sDL_GetSystemTheme :: BG.FunPtr (IO SDL_SystemTheme)
+sDL_GetSystemTheme =
+  BG.unsafePerformIO hs_bindgen_7bbdbd7274c0b5b5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplays@
+foreign import ccall unsafe "hs_bindgen_70f7cf654509b2c3"
+  hs_bindgen_70f7cf654509b2c3_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplays@
+hs_bindgen_70f7cf654509b2c3 :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_DisplayID)))
+hs_bindgen_70f7cf654509b2c3 =
+  BG.fromFFIType hs_bindgen_70f7cf654509b2c3_base
+
+{-# NOINLINE sDL_GetDisplays #-}
+
+-- | Get a list of currently connected displays.
+--
+--     [@count@]: a pointer filled in with the number of displays returned, may be NULL.
+--
+--     [Returns]: a 0 terminated array of display instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDisplays@, defined at @SDL3\/SDL_video.h 630:45@
+sDL_GetDisplays :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr SDL_DisplayID))
+sDL_GetDisplays =
+  BG.unsafePerformIO hs_bindgen_70f7cf654509b2c3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetPrimaryDisplay@
+foreign import ccall unsafe "hs_bindgen_b790a4a3043628fa"
+  hs_bindgen_b790a4a3043628fa_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetPrimaryDisplay@
+hs_bindgen_b790a4a3043628fa :: IO (BG.FunPtr (IO SDL_DisplayID))
+hs_bindgen_b790a4a3043628fa =
+  BG.fromFFIType hs_bindgen_b790a4a3043628fa_base
+
+{-# NOINLINE sDL_GetPrimaryDisplay #-}
+
+-- | Return the primary display.
+--
+--     [Returns]: the instance ID of the primary display on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetPrimaryDisplay@, defined at @SDL3\/SDL_video.h 644:43@
+sDL_GetPrimaryDisplay :: BG.FunPtr (IO SDL_DisplayID)
+sDL_GetPrimaryDisplay =
+  BG.unsafePerformIO hs_bindgen_b790a4a3043628fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayProperties@
+foreign import ccall unsafe "hs_bindgen_c3f8ffe6ded9cfd6"
+  hs_bindgen_c3f8ffe6ded9cfd6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayProperties@
+hs_bindgen_c3f8ffe6ded9cfd6
+  :: IO (BG.FunPtr (SDL_DisplayID -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_c3f8ffe6ded9cfd6 =
+  BG.fromFFIType hs_bindgen_c3f8ffe6ded9cfd6_base
+
+{-# NOINLINE sDL_GetDisplayProperties #-}
+
+-- | Get the properties associated with a display.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN'@: true if the display has HDR headroom above the SDR white point. This is for informational and diagnostic purposes only, as not all platforms provide this information at the display level.
+--
+--     On KMS\/DRM:
+--
+--     * @'sDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER'@: the \"panel orientation\" property for the display in degrees of clockwise rotation. Note that this is provided only as a hint, and the application is responsible for any coordinate transformations needed to conform to the requested display orientation.
+--
+--     On Wayland:
+--
+--     * @'sDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER'@: the wl_output associated with the display
+--
+--     On Windows:
+--
+--     * @'sDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER'@: the monitor handle (HMONITOR) associated with the display
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDisplayProperties@, defined at @SDL3\/SDL_video.h 682:46@
+sDL_GetDisplayProperties
+  :: BG.FunPtr (SDL_DisplayID -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetDisplayProperties =
+  BG.unsafePerformIO hs_bindgen_c3f8ffe6ded9cfd6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayName@
+foreign import ccall unsafe "hs_bindgen_d5ad6e555b5cb237"
+  hs_bindgen_d5ad6e555b5cb237_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayName@
+hs_bindgen_d5ad6e555b5cb237 :: IO (BG.FunPtr (SDL_DisplayID -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_d5ad6e555b5cb237 =
+  BG.fromFFIType hs_bindgen_d5ad6e555b5cb237_base
+
+{-# NOINLINE sDL_GetDisplayName #-}
+
+-- | Get the name of a display in UTF-8 encoding.
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [Returns]: the name of a display or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayName@, defined at @SDL3\/SDL_video.h 702:42@
+sDL_GetDisplayName :: BG.FunPtr (SDL_DisplayID -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetDisplayName =
+  BG.unsafePerformIO hs_bindgen_d5ad6e555b5cb237
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayBounds@
+foreign import ccall unsafe "hs_bindgen_6d5f9eee448719f4"
+  hs_bindgen_6d5f9eee448719f4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayBounds@
+hs_bindgen_6d5f9eee448719f4
+  :: IO (BG.FunPtr (SDL_DisplayID -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_6d5f9eee448719f4 =
+  BG.fromFFIType hs_bindgen_6d5f9eee448719f4_base
+
+{-# NOINLINE sDL_GetDisplayBounds #-}
+
+-- | Get the desktop area represented by a display.
+--
+--     The primary display is often located at (0,0), but may be placed at a different location depending on monitor layout.
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [@rect@]: the SDL_Rect structure filled in with the display bounds.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayUsableBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayBounds@, defined at @SDL3\/SDL_video.h 722:34@
+sDL_GetDisplayBounds
+  :: BG.FunPtr (SDL_DisplayID -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_GetDisplayBounds =
+  BG.unsafePerformIO hs_bindgen_6d5f9eee448719f4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayUsableBounds@
+foreign import ccall unsafe "hs_bindgen_65535f32592754c4"
+  hs_bindgen_65535f32592754c4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayUsableBounds@
+hs_bindgen_65535f32592754c4
+  :: IO (BG.FunPtr (SDL_DisplayID -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_65535f32592754c4 =
+  BG.fromFFIType hs_bindgen_65535f32592754c4_base
+
+{-# NOINLINE sDL_GetDisplayUsableBounds #-}
+
+-- | Get the usable desktop area represented by a display, in screen coordinates.
+--
+--     This is the same area as @SDL_GetDisplayBounds()@ reports, but with portions reserved by the system removed. For example, on Apple\'s macOS, this subtracts the area occupied by the menu bar and dock.
+--
+--     Setting a window to be fullscreen generally bypasses these unusable areas, so these are good guidelines for the maximum space available to a non-fullscreen window.
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [@rect@]: the SDL_Rect structure filled in with the display bounds.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayUsableBounds@, defined at @SDL3\/SDL_video.h 748:34@
+sDL_GetDisplayUsableBounds
+  :: BG.FunPtr (SDL_DisplayID -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_GetDisplayUsableBounds =
+  BG.unsafePerformIO hs_bindgen_65535f32592754c4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetNaturalDisplayOrientation@
+foreign import ccall unsafe "hs_bindgen_66971f9bdcb4b971"
+  hs_bindgen_66971f9bdcb4b971_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetNaturalDisplayOrientation@
+hs_bindgen_66971f9bdcb4b971 :: IO (BG.FunPtr (SDL_DisplayID -> IO SDL_DisplayOrientation))
+hs_bindgen_66971f9bdcb4b971 =
+  BG.fromFFIType hs_bindgen_66971f9bdcb4b971_base
+
+{-# NOINLINE sDL_GetNaturalDisplayOrientation #-}
+
+-- | Get the orientation of a display when it is unrotated.
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [Returns]: the 'SDL_DisplayOrientation' enum value of the display, or @SDL_ORIENTATION_UNKNOWN@ if it isn\'t available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetNaturalDisplayOrientation@, defined at @SDL3\/SDL_video.h 763:52@
+sDL_GetNaturalDisplayOrientation :: BG.FunPtr (SDL_DisplayID -> IO SDL_DisplayOrientation)
+sDL_GetNaturalDisplayOrientation =
+  BG.unsafePerformIO hs_bindgen_66971f9bdcb4b971
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetCurrentDisplayOrientation@
+foreign import ccall unsafe "hs_bindgen_a24aa5e4df6d8aa0"
+  hs_bindgen_a24aa5e4df6d8aa0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetCurrentDisplayOrientation@
+hs_bindgen_a24aa5e4df6d8aa0 :: IO (BG.FunPtr (SDL_DisplayID -> IO SDL_DisplayOrientation))
+hs_bindgen_a24aa5e4df6d8aa0 =
+  BG.fromFFIType hs_bindgen_a24aa5e4df6d8aa0_base
+
+{-# NOINLINE sDL_GetCurrentDisplayOrientation #-}
+
+-- | Get the orientation of a display.
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [Returns]: the 'SDL_DisplayOrientation' enum value of the display, or @SDL_ORIENTATION_UNKNOWN@ if it isn\'t available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetCurrentDisplayOrientation@, defined at @SDL3\/SDL_video.h 778:52@
+sDL_GetCurrentDisplayOrientation :: BG.FunPtr (SDL_DisplayID -> IO SDL_DisplayOrientation)
+sDL_GetCurrentDisplayOrientation =
+  BG.unsafePerformIO hs_bindgen_a24aa5e4df6d8aa0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayContentScale@
+foreign import ccall unsafe "hs_bindgen_eab36ce421e54b3e"
+  hs_bindgen_eab36ce421e54b3e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayContentScale@
+hs_bindgen_eab36ce421e54b3e :: IO (BG.FunPtr (SDL_DisplayID -> IO BG.CFloat))
+hs_bindgen_eab36ce421e54b3e =
+  BG.fromFFIType hs_bindgen_eab36ce421e54b3e_base
+
+{-# NOINLINE sDL_GetDisplayContentScale #-}
+
+-- | Get the content scale of a display.
+--
+--     The content scale is the expected scale for content based on the DPI settings of the display. For example, a 4K display might have a 2.0 (200%) display scale, which means that the user expects UI elements to be twice as big on this display, to aid in readability.
+--
+--     After window creation, @SDL_GetWindowDisplayScale()@ should be used to query the content scale factor for individual windows instead of querying the display for a window and calling this function, as the per-window content scale factor may differ from the base value of the display it is on, particularly on high-DPI and\/or multi-monitor desktop configurations.
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [Returns]: the content scale of the display, or 0.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowDisplayScale', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayContentScale@, defined at @SDL3\/SDL_video.h 805:35@
+sDL_GetDisplayContentScale :: BG.FunPtr (SDL_DisplayID -> IO BG.CFloat)
+sDL_GetDisplayContentScale =
+  BG.unsafePerformIO hs_bindgen_eab36ce421e54b3e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetFullscreenDisplayModes@
+foreign import ccall unsafe "hs_bindgen_bd010935798ea365"
+  hs_bindgen_bd010935798ea365_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetFullscreenDisplayModes@
+hs_bindgen_bd010935798ea365
+  :: IO (BG.FunPtr (SDL_DisplayID -> BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_DisplayMode))))
+hs_bindgen_bd010935798ea365 =
+  BG.fromFFIType hs_bindgen_bd010935798ea365_base
+
+{-# NOINLINE sDL_GetFullscreenDisplayModes #-}
+
+-- | Get a list of fullscreen display modes available on a display.
+--
+--     The display modes are sorted in this priority:
+--
+--     * w -> largest to smallest
+--
+--     * h -> largest to smallest
+--
+--     * bits per pixel -> more colors to fewer colors
+--
+--     * packed pixel layout -> largest to smallest
+--
+--     * refresh rate -> highest to lowest
+--
+--     * pixel density -> lowest to highest
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [@count@]: a pointer filled in with the number of display modes returned, may be NULL.
+--
+--     [Returns]: a NULL terminated array of display mode pointers or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetFullscreenDisplayModes@, defined at @SDL3\/SDL_video.h 833:48@
+sDL_GetFullscreenDisplayModes
+  :: BG.FunPtr (SDL_DisplayID -> BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_DisplayMode)))
+sDL_GetFullscreenDisplayModes =
+  BG.unsafePerformIO hs_bindgen_bd010935798ea365
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetClosestFullscreenDisplayMode@
+foreign import ccall unsafe "hs_bindgen_d0e64a6f43b88a5e"
+  hs_bindgen_d0e64a6f43b88a5e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetClosestFullscreenDisplayMode@
+hs_bindgen_d0e64a6f43b88a5e
+  :: IO
+       ( BG.FunPtr
+           ( SDL_DisplayID
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.CFloat
+             -> BG.CBool
+             -> BG.Ptr SDL_DisplayMode
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_d0e64a6f43b88a5e =
+  BG.fromFFIType hs_bindgen_d0e64a6f43b88a5e_base
+
+{-# NOINLINE sDL_GetClosestFullscreenDisplayMode #-}
+
+-- | Get the closest match to the requested display mode.
+--
+--     The available display modes are scanned and @closest@ is filled in with the closest mode matching the requested mode and returned. The mode format and refresh rate default to the desktop mode if they are set to 0. The modes are scanned with size being first priority, format being second priority, and finally checking the refresh rate. If all the available modes are too small, then false is returned.
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [@w@]: the width in pixels of the desired display mode.
+--
+--     [@h@]: the height in pixels of the desired display mode.
+--
+--     [@refresh_rate@]: the refresh rate of the desired display mode, or 0.0f for the desktop refresh rate.
+--
+--     [@include_high_density_modes@]: boolean to include high density modes in the search.
+--
+--     [@closest@]: a pointer filled in with the closest display mode equal to or larger than the desired mode.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays', 'sDL_GetFullscreenDisplayModes'
+--
+--     [C declaration]: @SDL_GetClosestFullscreenDisplayMode@, defined at @SDL3\/SDL_video.h 864:34@
+sDL_GetClosestFullscreenDisplayMode
+  :: BG.FunPtr
+       ( SDL_DisplayID
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.CFloat
+         -> BG.CBool
+         -> BG.Ptr SDL_DisplayMode
+         -> IO BG.CBool
+       )
+sDL_GetClosestFullscreenDisplayMode =
+  BG.unsafePerformIO hs_bindgen_d0e64a6f43b88a5e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDesktopDisplayMode@
+foreign import ccall unsafe "hs_bindgen_72b78488001b241a"
+  hs_bindgen_72b78488001b241a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDesktopDisplayMode@
+hs_bindgen_72b78488001b241a
+  :: IO (BG.FunPtr (SDL_DisplayID -> IO (PtrConst.PtrConst SDL_DisplayMode)))
+hs_bindgen_72b78488001b241a =
+  BG.fromFFIType hs_bindgen_72b78488001b241a_base
+
+{-# NOINLINE sDL_GetDesktopDisplayMode #-}
+
+-- | Get information about the desktop\'s display mode.
+--
+--     There\'s a difference between this function and @SDL_GetCurrentDisplayMode()@ when SDL runs fullscreen and has changed the resolution. In that case this function will return the previous native display mode, and not the current display mode.
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [Returns]: a pointer to the desktop display mode or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCurrentDisplayMode', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDesktopDisplayMode@, defined at @SDL3\/SDL_video.h 885:53@
+sDL_GetDesktopDisplayMode :: BG.FunPtr (SDL_DisplayID -> IO (PtrConst.PtrConst SDL_DisplayMode))
+sDL_GetDesktopDisplayMode =
+  BG.unsafePerformIO hs_bindgen_72b78488001b241a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetCurrentDisplayMode@
+foreign import ccall unsafe "hs_bindgen_4ea9690ee956f077"
+  hs_bindgen_4ea9690ee956f077_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetCurrentDisplayMode@
+hs_bindgen_4ea9690ee956f077
+  :: IO (BG.FunPtr (SDL_DisplayID -> IO (PtrConst.PtrConst SDL_DisplayMode)))
+hs_bindgen_4ea9690ee956f077 =
+  BG.fromFFIType hs_bindgen_4ea9690ee956f077_base
+
+{-# NOINLINE sDL_GetCurrentDisplayMode #-}
+
+-- | Get information about the current display mode.
+--
+--     There\'s a difference between this function and @SDL_GetDesktopDisplayMode()@ when SDL runs fullscreen and has changed the resolution. In that case this function will return the current display mode, and not the previous native display mode.
+--
+--     [@displayID@]: the instance ID of the display to query.
+--
+--     [Returns]: a pointer to the desktop display mode or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDesktopDisplayMode', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetCurrentDisplayMode@, defined at @SDL3\/SDL_video.h 906:53@
+sDL_GetCurrentDisplayMode :: BG.FunPtr (SDL_DisplayID -> IO (PtrConst.PtrConst SDL_DisplayMode))
+sDL_GetCurrentDisplayMode =
+  BG.unsafePerformIO hs_bindgen_4ea9690ee956f077
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayForPoint@
+foreign import ccall unsafe "hs_bindgen_de146763764fd52f"
+  hs_bindgen_de146763764fd52f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayForPoint@
+hs_bindgen_de146763764fd52f
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point -> IO SDL_DisplayID))
+hs_bindgen_de146763764fd52f =
+  BG.fromFFIType hs_bindgen_de146763764fd52f_base
+
+{-# NOINLINE sDL_GetDisplayForPoint #-}
+
+-- | Get the display containing a point.
+--
+--     [@point@]: the point to query.
+--
+--     [Returns]: the instance ID of the display containing the point or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayForPoint@, defined at @SDL3\/SDL_video.h 922:43@
+sDL_GetDisplayForPoint
+  :: BG.FunPtr (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point -> IO SDL_DisplayID)
+sDL_GetDisplayForPoint =
+  BG.unsafePerformIO hs_bindgen_de146763764fd52f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayForRect@
+foreign import ccall unsafe "hs_bindgen_710a7746f071d499"
+  hs_bindgen_710a7746f071d499_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayForRect@
+hs_bindgen_710a7746f071d499
+  :: IO (BG.FunPtr (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO SDL_DisplayID))
+hs_bindgen_710a7746f071d499 =
+  BG.fromFFIType hs_bindgen_710a7746f071d499_base
+
+{-# NOINLINE sDL_GetDisplayForRect #-}
+
+-- | Get the display primarily containing a rect.
+--
+--     [@rect@]: the rect to query.
+--
+--     [Returns]: the instance ID of the display entirely containing the rect or closest to the center of the rect on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayForRect@, defined at @SDL3\/SDL_video.h 939:43@
+sDL_GetDisplayForRect
+  :: BG.FunPtr (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO SDL_DisplayID)
+sDL_GetDisplayForRect =
+  BG.unsafePerformIO hs_bindgen_710a7746f071d499
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayForWindow@
+foreign import ccall unsafe "hs_bindgen_ab0b114093b84662"
+  hs_bindgen_ab0b114093b84662_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetDisplayForWindow@
+hs_bindgen_ab0b114093b84662 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_DisplayID))
+hs_bindgen_ab0b114093b84662 =
+  BG.fromFFIType hs_bindgen_ab0b114093b84662_base
+
+{-# NOINLINE sDL_GetDisplayForWindow #-}
+
+-- | Get the display associated with a window.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: the instance ID of the display containing the center of the window on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayForWindow@, defined at @SDL3\/SDL_video.h 956:43@
+sDL_GetDisplayForWindow :: BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_DisplayID)
+sDL_GetDisplayForWindow =
+  BG.unsafePerformIO hs_bindgen_ab0b114093b84662
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowPixelDensity@
+foreign import ccall unsafe "hs_bindgen_dc1af7f260c7365f"
+  hs_bindgen_dc1af7f260c7365f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowPixelDensity@
+hs_bindgen_dc1af7f260c7365f :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CFloat))
+hs_bindgen_dc1af7f260c7365f =
+  BG.fromFFIType hs_bindgen_dc1af7f260c7365f_base
+
+{-# NOINLINE sDL_GetWindowPixelDensity #-}
+
+-- | Get the pixel density of a window.
+--
+--     This is a ratio of pixel size to window size. For example, if the window is 1920x1080 and it has a high density back buffer of 3840x2160 pixels, it would have a pixel density of 2.0.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: the pixel density or 0.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowDisplayScale'
+--
+--     [C declaration]: @SDL_GetWindowPixelDensity@, defined at @SDL3\/SDL_video.h 975:35@
+sDL_GetWindowPixelDensity :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CFloat)
+sDL_GetWindowPixelDensity =
+  BG.unsafePerformIO hs_bindgen_dc1af7f260c7365f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowDisplayScale@
+foreign import ccall unsafe "hs_bindgen_95da25536b3703d7"
+  hs_bindgen_95da25536b3703d7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowDisplayScale@
+hs_bindgen_95da25536b3703d7 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CFloat))
+hs_bindgen_95da25536b3703d7 =
+  BG.fromFFIType hs_bindgen_95da25536b3703d7_base
+
+{-# NOINLINE sDL_GetWindowDisplayScale #-}
+
+-- | Get the content display scale relative to a window\'s pixel size.
+--
+--     This is a combination of the window pixel density and the display content scale, and is the expected scale for displaying content in this window. For example, if a 3840x2160 window had a display scale of 2.0, the user expects the content to take twice as many pixels and be the same physical size as if it were being displayed in a 1920x1080 window with a display scale of 1.0.
+--
+--     Conceptually this value corresponds to the scale display setting, and is updated when that setting is changed, or the window moves to a display with a different scale setting.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: the display scale, or 0.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowDisplayScale@, defined at @SDL3\/SDL_video.h 999:35@
+sDL_GetWindowDisplayScale :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CFloat)
+sDL_GetWindowDisplayScale =
+  BG.unsafePerformIO hs_bindgen_95da25536b3703d7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFullscreenMode@
+foreign import ccall unsafe "hs_bindgen_f0a6d02b7642ed3e"
+  hs_bindgen_f0a6d02b7642ed3e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFullscreenMode@
+hs_bindgen_f0a6d02b7642ed3e
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> PtrConst.PtrConst SDL_DisplayMode -> IO BG.CBool))
+hs_bindgen_f0a6d02b7642ed3e =
+  BG.fromFFIType hs_bindgen_f0a6d02b7642ed3e_base
+
+{-# NOINLINE sDL_SetWindowFullscreenMode #-}
+
+-- | Set the display mode to use when a window is visible and fullscreen.
+--
+--     This only affects the display mode used when the window is fullscreen. To change the window size when the window is not fullscreen, use @SDL_SetWindowSize()@.
+--
+--     If the window is currently in the fullscreen state, this request is asynchronous on some windowing systems and the new mode dimensions may not be applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the new mode takes effect, an SDL_EVENT_WINDOW_RESIZED and\/or an SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event will be emitted with the new mode dimensions.
+--
+--     [@window@]: the window to affect.
+--
+--     [@mode@]: a pointer to the display mode to use, which can be NULL for borderless fullscreen desktop mode, or one of the fullscreen modes returned by @SDL_GetFullscreenDisplayModes()@ to set an exclusive fullscreen mode.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFullscreenMode', 'sDL_SetWindowFullscreen', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowFullscreenMode@, defined at @SDL3\/SDL_video.h 1034:34@
+sDL_SetWindowFullscreenMode
+  :: BG.FunPtr (BG.Ptr SDL_Window -> PtrConst.PtrConst SDL_DisplayMode -> IO BG.CBool)
+sDL_SetWindowFullscreenMode =
+  BG.unsafePerformIO hs_bindgen_f0a6d02b7642ed3e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowFullscreenMode@
+foreign import ccall unsafe "hs_bindgen_16bce449fb30d23a"
+  hs_bindgen_16bce449fb30d23a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowFullscreenMode@
+hs_bindgen_16bce449fb30d23a
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO (PtrConst.PtrConst SDL_DisplayMode)))
+hs_bindgen_16bce449fb30d23a =
+  BG.fromFFIType hs_bindgen_16bce449fb30d23a_base
+
+{-# NOINLINE sDL_GetWindowFullscreenMode #-}
+
+-- | Query the display mode to use when a window is visible at fullscreen.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: a pointer to the exclusive fullscreen mode to use or NULL for borderless fullscreen desktop mode.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowFullscreenMode', 'sDL_SetWindowFullscreen'
+--
+--     [C declaration]: @SDL_GetWindowFullscreenMode@, defined at @SDL3\/SDL_video.h 1050:53@
+sDL_GetWindowFullscreenMode
+  :: BG.FunPtr (BG.Ptr SDL_Window -> IO (PtrConst.PtrConst SDL_DisplayMode))
+sDL_GetWindowFullscreenMode =
+  BG.unsafePerformIO hs_bindgen_16bce449fb30d23a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowICCProfile@
+foreign import ccall unsafe "hs_bindgen_5c1cf7c698aa08ce"
+  hs_bindgen_5c1cf7c698aa08ce_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowICCProfile@
+hs_bindgen_5c1cf7c698aa08ce
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void)))
+hs_bindgen_5c1cf7c698aa08ce =
+  BG.fromFFIType hs_bindgen_5c1cf7c698aa08ce_base
+
+{-# NOINLINE sDL_GetWindowICCProfile #-}
+
+-- | Get the raw ICC profile data for the screen the window is currently on.
+--
+--     [@window@]: the window to query.
+--
+--     [@size@]: the size of the ICC profile.
+--
+--     [Returns]: the raw ICC profile data on success or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowICCProfile@, defined at @SDL3\/SDL_video.h 1065:36@
+sDL_GetWindowICCProfile
+  :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr HsBindgen.Runtime.LibC.CSize -> IO (BG.Ptr BG.Void))
+sDL_GetWindowICCProfile =
+  BG.unsafePerformIO hs_bindgen_5c1cf7c698aa08ce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowPixelFormat@
+foreign import ccall unsafe "hs_bindgen_b8027cb465e5a5a2"
+  hs_bindgen_b8027cb465e5a5a2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowPixelFormat@
+hs_bindgen_b8027cb465e5a5a2
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat))
+hs_bindgen_b8027cb465e5a5a2 =
+  BG.fromFFIType hs_bindgen_b8027cb465e5a5a2_base
+
+{-# NOINLINE sDL_GetWindowPixelFormat #-}
+
+-- | Get the pixel format associated with the window.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: the pixel format of the window on success or SDL_PIXELFORMAT_UNKNOWN on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowPixelFormat@, defined at @SDL3\/SDL_video.h 1079:45@
+sDL_GetWindowPixelFormat
+  :: BG.FunPtr (BG.Ptr SDL_Window -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat)
+sDL_GetWindowPixelFormat =
+  BG.unsafePerformIO hs_bindgen_b8027cb465e5a5a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindows@
+foreign import ccall unsafe "hs_bindgen_b2965b9f9dd9971d"
+  hs_bindgen_b2965b9f9dd9971d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindows@
+hs_bindgen_b2965b9f9dd9971d :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_Window))))
+hs_bindgen_b2965b9f9dd9971d =
+  BG.fromFFIType hs_bindgen_b2965b9f9dd9971d_base
+
+{-# NOINLINE sDL_GetWindows #-}
+
+-- | Get a list of valid windows.
+--
+--     [@count@]: a pointer filled in with the number of windows returned, may be NULL.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Window' pointers or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindows@, defined at @SDL3\/SDL_video.h 1095:43@
+sDL_GetWindows :: BG.FunPtr (BG.Ptr BG.CInt -> IO (BG.Ptr (BG.Ptr SDL_Window)))
+sDL_GetWindows =
+  BG.unsafePerformIO hs_bindgen_b2965b9f9dd9971d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_CreateWindow@
+foreign import ccall unsafe "hs_bindgen_c12016fdc0d7966b"
+  hs_bindgen_c12016fdc0d7966b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_CreateWindow@
+hs_bindgen_c12016fdc0d7966b
+  :: IO
+       ( BG.FunPtr
+           (PtrConst.PtrConst BG.CChar -> BG.CInt -> BG.CInt -> SDL_WindowFlags -> IO (BG.Ptr SDL_Window))
+       )
+hs_bindgen_c12016fdc0d7966b =
+  BG.fromFFIType hs_bindgen_c12016fdc0d7966b_base
+
+{-# NOINLINE sDL_CreateWindow #-}
+
+-- | Create a window with the specified dimensions and flags.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     @flags@ may be any of the following OR\'d together:
+--
+--     * @SDL_WINDOW_FULLSCREEN@: fullscreen window at desktop resolution
+--
+--     * @SDL_WINDOW_OPENGL@: window usable with an OpenGL context
+--
+--     * @SDL_WINDOW_HIDDEN@: window is not visible
+--
+--     * @SDL_WINDOW_BORDERLESS@: no window decoration
+--
+--     * @SDL_WINDOW_RESIZABLE@: window can be resized
+--
+--     * @SDL_WINDOW_MINIMIZED@: window is minimized
+--
+--     * @SDL_WINDOW_MAXIMIZED@: window is maximized
+--
+--     * @SDL_WINDOW_MOUSE_GRABBED@: window has grabbed mouse focus
+--
+--     * @SDL_WINDOW_INPUT_FOCUS@: window has input focus
+--
+--     * @SDL_WINDOW_MOUSE_FOCUS@: window has mouse focus
+--
+--     * @SDL_WINDOW_EXTERNAL@: window not created by SDL
+--
+--     * @SDL_WINDOW_MODAL@: window is modal
+--
+--     * @SDL_WINDOW_HIGH_PIXEL_DENSITY@: window uses high pixel density back buffer if possible
+--
+--     * @SDL_WINDOW_MOUSE_CAPTURE@: window has mouse captured (unrelated to MOUSE_GRABBED)
+--
+--     * @SDL_WINDOW_ALWAYS_ON_TOP@: window should always be above others
+--
+--     * @SDL_WINDOW_UTILITY@: window should be treated as a utility window, not showing in the task bar and window list
+--
+--     * @SDL_WINDOW_TOOLTIP@: window should be treated as a tooltip and does not get mouse or keyboard focus, requires a parent window
+--
+--     * @SDL_WINDOW_POPUP_MENU@: window should be treated as a popup menu, requires a parent window
+--
+--     * @SDL_WINDOW_KEYBOARD_GRABBED@: window has grabbed keyboard input
+--
+--     * @SDL_WINDOW_VULKAN@: window usable with a Vulkan instance
+--
+--     * @SDL_WINDOW_METAL@: window usable with a Metal instance
+--
+--     * @SDL_WINDOW_TRANSPARENT@: window with transparent buffer
+--
+--     * @SDL_WINDOW_NOT_FOCUSABLE@: window should not be focusable
+--
+--     The 'SDL_Window' will be shown if SDL_WINDOW_HIDDEN is not set. If hidden at creation time, @SDL_ShowWindow()@ can be used to show it later.
+--
+--     On Apple\'s macOS, you __must__ set the NSHighResolutionCapable Info.plist property to YES, otherwise you will not receive a High-DPI OpenGL canvas.
+--
+--     The window pixel size may differ from its window coordinate size if the window is on a high pixel density display. Use @SDL_GetWindowSize()@ to query the client area\'s size in window coordinates, and @SDL_GetWindowSizeInPixels()@ or SDL_GetRenderOutputSize() to query the drawable size in pixels. Note that the drawable size can vary after the window is created and should be queried again if you get an SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event.
+--
+--     If the window is created with any of the SDL_WINDOW_OPENGL or SDL_WINDOW_VULKAN flags, then the corresponding LoadLibrary function (SDL_GL_LoadLibrary or SDL_Vulkan_LoadLibrary) is called and the corresponding UnloadLibrary function is called by @SDL_DestroyWindow()@.
+--
+--     If SDL_WINDOW_VULKAN is specified and there isn\'t a working Vulkan driver, @SDL_CreateWindow()@ will fail, because SDL_Vulkan_LoadLibrary() will fail.
+--
+--     If SDL_WINDOW_METAL is specified on an OS that does not support Metal, @SDL_CreateWindow()@ will fail.
+--
+--     If you intend to use this window with an SDL_Renderer, you should use SDL_CreateWindowAndRenderer() instead of this function, to avoid window flicker.
+--
+--     On non-Apple devices, SDL requires you to either not link to the Vulkan loader or link to a dynamic library version. This limitation may be removed in a future version of SDL.
+--
+--     [@title@]: the title of the window, in UTF-8 encoding.
+--
+--     [@w@]: the width of the window.
+--
+--     [@h@]: the height of the window.
+--
+--     [@flags@]: 0, or one or more 'SDL_WindowFlags' OR\'d together.
+--
+--     [Returns]: the window that was created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateWindowAndRenderer, 'sDL_CreatePopupWindow', 'sDL_CreateWindowWithProperties', 'sDL_DestroyWindow'
+--
+--     [C declaration]: @SDL_CreateWindow@, defined at @SDL3\/SDL_video.h 1184:42@
+sDL_CreateWindow
+  :: BG.FunPtr
+       (PtrConst.PtrConst BG.CChar -> BG.CInt -> BG.CInt -> SDL_WindowFlags -> IO (BG.Ptr SDL_Window))
+sDL_CreateWindow =
+  BG.unsafePerformIO hs_bindgen_c12016fdc0d7966b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_CreatePopupWindow@
+foreign import ccall unsafe "hs_bindgen_684a9951d98feb17"
+  hs_bindgen_684a9951d98feb17_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_CreatePopupWindow@
+hs_bindgen_684a9951d98feb17
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Window
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.CInt
+             -> BG.CInt
+             -> SDL_WindowFlags
+             -> IO (BG.Ptr SDL_Window)
+           )
+       )
+hs_bindgen_684a9951d98feb17 =
+  BG.fromFFIType hs_bindgen_684a9951d98feb17_base
+
+{-# NOINLINE sDL_CreatePopupWindow #-}
+
+-- | Create a child popup window of the specified parent window.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     The flags parameter __must__ contain at least one of the following:
+--
+--     * @SDL_WINDOW_TOOLTIP@: The popup window is a tooltip and will not pass any input events.
+--
+--     * @SDL_WINDOW_POPUP_MENU@: The popup window is a popup menu. The topmost popup menu will implicitly gain the keyboard focus.
+--
+--     The following flags are not relevant to popup window creation and will be ignored:
+--
+--     * @SDL_WINDOW_MINIMIZED@
+--
+--     * @SDL_WINDOW_MAXIMIZED@
+--
+--     * @SDL_WINDOW_FULLSCREEN@
+--
+--     * @SDL_WINDOW_BORDERLESS@
+--
+--     The following flags are incompatible with popup window creation and will cause it to fail:
+--
+--     * @SDL_WINDOW_UTILITY@
+--
+--     * @SDL_WINDOW_MODAL@
+--
+--     The parent parameter __must__ be non-null and a valid window. The parent of a popup window can be either a regular, toplevel window, or another popup window.
+--
+--     Popup windows cannot be minimized, maximized, made fullscreen, raised, flash, be made a modal window, be the parent of a toplevel window, or grab the mouse and\/or keyboard. Attempts to do so will fail.
+--
+--     Popup windows implicitly do not have a border\/decorations and do not appear on the taskbar\/dock or in lists of windows such as alt-tab menus.
+--
+--     By default, popup window positions will automatically be constrained to keep the entire window within display bounds. This can be overridden with the @'sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN'@ property.
+--
+--     By default, popup menus will automatically grab keyboard focus from the parent when shown. This behavior can be overridden by setting the @SDL_WINDOW_NOT_FOCUSABLE@ flag, setting the @'sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN'@ property to false, or toggling it after creation via the @SDL_SetWindowFocusable()@ function.
+--
+--     If a parent window is hidden or destroyed, any child popup windows will be recursively hidden or destroyed as well. Child popup windows not explicitly hidden will be restored when the parent is shown.
+--
+--     [@parent@]: the parent of the window, must not be NULL.
+--
+--     [@offset_x@]: the x position of the popup window relative to the origin of the parent.
+--
+--     [@offset_y@]: the y position of the popup window relative to the origin of the parent window.
+--
+--     [@w@]: the width of the window.
+--
+--     [@h@]: the height of the window.
+--
+--     [@flags@]: SDL_WINDOW_TOOLTIP or SDL_WINDOW_POPUP_MENU, and zero or more additional 'SDL_WindowFlags' OR\'d together.
+--
+--     [Returns]: the window that was created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateWindow', 'sDL_CreateWindowWithProperties', 'sDL_DestroyWindow', 'sDL_GetWindowParent'
+--
+--     [C declaration]: @SDL_CreatePopupWindow@, defined at @SDL3\/SDL_video.h 1260:42@
+sDL_CreatePopupWindow
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Window
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.CInt
+         -> BG.CInt
+         -> SDL_WindowFlags
+         -> IO (BG.Ptr SDL_Window)
+       )
+sDL_CreatePopupWindow =
+  BG.unsafePerformIO hs_bindgen_684a9951d98feb17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_CreateWindowWithProperties@
+foreign import ccall unsafe "hs_bindgen_2143bdc9c78e0e7e"
+  hs_bindgen_2143bdc9c78e0e7e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_CreateWindowWithProperties@
+hs_bindgen_2143bdc9c78e0e7e
+  :: IO (BG.FunPtr (SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO (BG.Ptr SDL_Window)))
+hs_bindgen_2143bdc9c78e0e7e =
+  BG.fromFFIType hs_bindgen_2143bdc9c78e0e7e_base
+
+{-# NOINLINE sDL_CreateWindowWithProperties #-}
+
+-- | Create a window with the specified properties.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN'@: true if the window should be always on top
+--
+--     * @'sDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN'@: true if the window has no window decoration
+--
+--     * @'sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN'@: true if the \"tooltip\" and \"menu\" window types should be automatically constrained to be entirely within display bounds (default), false if no constraints on the position are desired.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN'@: true if the window will be used with an externally managed graphics context.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN'@: true if the window should accept keyboard input (defaults true)
+--
+--     * @'sDL_PROP_WINDOW_CREATE_FULLSCREEN_BOOLEAN'@: true if the window should start in fullscreen mode at desktop resolution
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER'@: the height of the window
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN'@: true if the window should start hidden
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HIGH_PIXEL_DENSITY_BOOLEAN'@: true if the window uses a high pixel density buffer if possible
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MAXIMIZED_BOOLEAN'@: true if the window should start maximized
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MENU_BOOLEAN'@: true if the window is a popup menu
+--
+--     * @'sDL_PROP_WINDOW_CREATE_METAL_BOOLEAN'@: true if the window will be used with Metal rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MINIMIZED_BOOLEAN'@: true if the window should start minimized
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MODAL_BOOLEAN'@: true if the window is modal to its parent
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MOUSE_GRABBED_BOOLEAN'@: true if the window starts with grabbed mouse focus
+--
+--     * @'sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN'@: true if the window will be used with OpenGL rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_PARENT_POINTER'@: an 'SDL_Window' that will be the parent of this window, required for windows with the \"tooltip\", \"menu\", and \"modal\" properties
+--
+--     * @'sDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN'@: true if the window should be resizable
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TITLE_STRING'@: the title of the window, in UTF-8 encoding
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TRANSPARENT_BOOLEAN'@: true if the window show transparent in the areas with alpha of 0
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TOOLTIP_BOOLEAN'@: true if the window is a tooltip
+--
+--     * @'sDL_PROP_WINDOW_CREATE_UTILITY_BOOLEAN'@: true if the window is a utility window, not showing in the task bar and window list
+--
+--     * @'sDL_PROP_WINDOW_CREATE_VULKAN_BOOLEAN'@: true if the window will be used with Vulkan rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIDTH_NUMBER'@: the width of the window
+--
+--     * @'sDL_PROP_WINDOW_CREATE_X_NUMBER'@: the x position of the window, or @'sDL_WINDOWPOS_CENTERED'@, defaults to @'sDL_WINDOWPOS_UNDEFINED'@. This is relative to the parent for windows with the \"tooltip\" or \"menu\" property set.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_Y_NUMBER'@: the y position of the window, or @'sDL_WINDOWPOS_CENTERED'@, defaults to @'sDL_WINDOWPOS_UNDEFINED'@. This is relative to the parent for windows with the \"tooltip\" or \"menu\" property set.
+--
+--     These are additional supported properties on macOS:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER'@: the @(__unsafe_unretained)@ NSWindow associated with the window, if you want to wrap an existing window.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER'@: the @(__unsafe_unretained)@ NSView associated with the window, defaults to @[window contentView]@
+--
+--     These are additional supported properties on iOS, tvOS, and visionOS:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER'@: the @(__unsafe_unretained)@ UIWindowScene associated with the window, defaults to the active window scene.
+--
+--     These are additional supported properties on Wayland:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN'@ - true if the application wants to use the Wayland surface for a custom role and does not want it attached to an XDG toplevel window. See [README-wayland](README-wayland) for more information on using custom surfaces.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN'@ - true if the application wants an associated @wl_egl_window@ object to be created and attached to the window, even if the window does not have the OpenGL property or @SDL_WINDOW_OPENGL@ flag set.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER'@ - the wl_surface associated with the window, if you want to wrap an existing window. See [README-wayland](README-wayland) for more information.
+--
+--     These are additional supported properties on Windows:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER'@: the HWND associated with the window, if you want to wrap an existing window.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER'@: optional, another window to share pixel format with, useful for OpenGL windows
+--
+--     These are additional supported properties with X11:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER'@: the X11 Window associated with the window, if you want to wrap an existing window.
+--
+--     The window is implicitly shown if the \"hidden\" property is not set.
+--
+--     These are additional supported properties with Emscripten:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING'@: the id given to the canvas element. This should start with a \'\#\' sign
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING'@: override the binding element for keyboard inputs for this canvas. The variable can be one of:
+--
+--     * \"\#window\": the javascript window object (default)
+--
+--     * \"\#document\": the javascript document object
+--
+--     * \"\#screen\": the javascript window.screen object
+--
+--     * \"\#canvas\": the WebGL canvas element
+--
+--     * \"\#none\": Don\'t bind anything at all
+--
+--     * any other string without a leading \# sign applies to the element on the page with that ID. Windows with the \"tooltip\" and \"menu\" properties are popup windows and have the behaviors and guidelines outlined in @SDL_CreatePopupWindow()@.
+--
+--     If this window is being created to be used with an SDL_Renderer, you should not add a graphics API specific property (@'sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN'@, etc), as SDL will handle that internally when it chooses a renderer. However, SDL might need to recreate your window at that point, which may cause the window to appear briefly, and then flicker as it is recreated. The correct approach to this is to create the window with the @'sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN'@ property set to true, then create the renderer, then show the window with @SDL_ShowWindow()@.
+--
+--     [@props@]: the properties to use.
+--
+--     [Returns]: the window that was created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateProperties, 'sDL_CreateWindow', 'sDL_DestroyWindow'
+--
+--     [C declaration]: @SDL_CreateWindowWithProperties@, defined at @SDL3\/SDL_video.h 1409:42@
+sDL_CreateWindowWithProperties
+  :: BG.FunPtr (SDL3.Sys.Bindgen.Properties.SDL_PropertiesID -> IO (BG.Ptr SDL_Window))
+sDL_CreateWindowWithProperties =
+  BG.unsafePerformIO hs_bindgen_2143bdc9c78e0e7e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowID@
+foreign import ccall unsafe "hs_bindgen_271b950c2d28e361"
+  hs_bindgen_271b950c2d28e361_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowID@
+hs_bindgen_271b950c2d28e361 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_WindowID))
+hs_bindgen_271b950c2d28e361 =
+  BG.fromFFIType hs_bindgen_271b950c2d28e361_base
+
+{-# NOINLINE sDL_GetWindowID #-}
+
+-- | Get the numeric ID of a window.
+--
+--     The numeric ID is what SDL_WindowEvent references, and is necessary to map these events to specific 'SDL_Window' objects.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: the ID of the window on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFromID'
+--
+--     [C declaration]: @SDL_GetWindowID@, defined at @SDL3\/SDL_video.h 1466:42@
+sDL_GetWindowID :: BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_WindowID)
+sDL_GetWindowID =
+  BG.unsafePerformIO hs_bindgen_271b950c2d28e361
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowFromID@
+foreign import ccall unsafe "hs_bindgen_4b427f44c79ceb27"
+  hs_bindgen_4b427f44c79ceb27_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowFromID@
+hs_bindgen_4b427f44c79ceb27 :: IO (BG.FunPtr (SDL_WindowID -> IO (BG.Ptr SDL_Window)))
+hs_bindgen_4b427f44c79ceb27 =
+  BG.fromFFIType hs_bindgen_4b427f44c79ceb27_base
+
+{-# NOINLINE sDL_GetWindowFromID #-}
+
+-- | Get a window from a stored ID.
+--
+--     The numeric ID is what SDL_WindowEvent references, and is necessary to map these events to specific 'SDL_Window' objects.
+--
+--     [@id@]: the ID of the window.
+--
+--     [Returns]: the window associated with @id@ or NULL if it doesn\'t exist; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowID'
+--
+--     [C declaration]: @SDL_GetWindowFromID@, defined at @SDL3\/SDL_video.h 1484:42@
+sDL_GetWindowFromID :: BG.FunPtr (SDL_WindowID -> IO (BG.Ptr SDL_Window))
+sDL_GetWindowFromID =
+  BG.unsafePerformIO hs_bindgen_4b427f44c79ceb27
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowParent@
+foreign import ccall unsafe "hs_bindgen_3f127843661c07d5"
+  hs_bindgen_3f127843661c07d5_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowParent@
+hs_bindgen_3f127843661c07d5 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO (BG.Ptr SDL_Window)))
+hs_bindgen_3f127843661c07d5 =
+  BG.fromFFIType hs_bindgen_3f127843661c07d5_base
+
+{-# NOINLINE sDL_GetWindowParent #-}
+
+-- | Get parent of a window.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: the parent of the window on success or NULL if the window has no parent.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreatePopupWindow'
+--
+--     [C declaration]: @SDL_GetWindowParent@, defined at @SDL3\/SDL_video.h 1499:42@
+sDL_GetWindowParent :: BG.FunPtr (BG.Ptr SDL_Window -> IO (BG.Ptr SDL_Window))
+sDL_GetWindowParent =
+  BG.unsafePerformIO hs_bindgen_3f127843661c07d5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowProperties@
+foreign import ccall unsafe "hs_bindgen_985031bf6e083168"
+  hs_bindgen_985031bf6e083168_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowProperties@
+hs_bindgen_985031bf6e083168
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID))
+hs_bindgen_985031bf6e083168 =
+  BG.fromFFIType hs_bindgen_985031bf6e083168_base
+
+{-# NOINLINE sDL_GetWindowProperties #-}
+
+-- | Get the properties associated with a window.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_WINDOW_SHAPE_POINTER'@: the surface associated with a shaped window
+--
+--     * @'sDL_PROP_WINDOW_HDR_ENABLED_BOOLEAN'@: true if the window has HDR headroom above the SDR white point. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_WINDOW_SDR_WHITE_LEVEL_FLOAT'@: the value of SDR white in the SDL_COLORSPACE_SRGB_LINEAR colorspace. On Windows this corresponds to the SDR white level in scRGB colorspace, and on Apple platforms this is always 1.0 for EDR content. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_WINDOW_HDR_HEADROOM_FLOAT'@: the additional high dynamic range that can be displayed, in terms of the SDR white point. When HDR is not enabled, this will be 1.0. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     On Android:
+--
+--     * @'sDL_PROP_WINDOW_ANDROID_WINDOW_POINTER'@: the ANativeWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_ANDROID_SURFACE_POINTER'@: the EGLSurface associated with the window
+--
+--     On iOS:
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_WINDOW_POINTER'@: the @(__unsafe_unretained)@ UIWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER'@: the NSInteger tag associated with metal views on the window
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER'@: the OpenGL view\'s framebuffer object. It must be bound when rendering to the screen using OpenGL.
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER'@: the OpenGL view\'s renderbuffer object. It must be bound when SDL_GL_SwapWindow is called.
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER'@: the OpenGL view\'s resolve framebuffer, when MSAA is used.
+--
+--     On KMS\/DRM:
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_DEVICE_INDEX_NUMBER'@: the device index associated with the window (e.g. the X in \/dev\/dri\/cardX)
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_DRM_FD_NUMBER'@: the DRM FD associated with the window
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER'@: the GBM device associated with the window
+--
+--     On macOS:
+--
+--     * @'sDL_PROP_WINDOW_COCOA_WINDOW_POINTER'@: the @(__unsafe_unretained)@ NSWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER'@: the NSInteger tag associated with metal views on the window
+--
+--     On OpenVR:
+--
+--     * @'sDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER'@: the OpenVR Overlay Handle ID for the associated overlay window.
+--
+--     On Vivante:
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER'@: the EGLNativeDisplayType associated with the window
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER'@: the EGLNativeWindowType associated with the window
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER'@: the EGLSurface associated with the window
+--
+--     On Windows:
+--
+--     * @'sDL_PROP_WINDOW_WIN32_HWND_POINTER'@: the HWND associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WIN32_HDC_POINTER'@: the HDC associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WIN32_INSTANCE_POINTER'@: the HINSTANCE associated with the window
+--
+--     On Wayland:
+--
+--     Note: The @xdg_*@ window objects do not internally persist across window show\/hide calls. They will be null if the window is hidden and must be queried each time it is shown.
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER'@: the wl_display associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER'@: the wl_surface associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER'@: the wp_viewport associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER'@: the wl_egl_window associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER'@: the xdg_surface associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER'@: the xdg_toplevel role associated with the window
+--
+--     * \'SDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_EXPORT_HANDLE_STRING\': the export handle associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_POPUP_POINTER'@: the xdg_popup role associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_POSITIONER_POINTER'@: the xdg_positioner associated with the window, in popup mode
+--
+--     On X11:
+--
+--     * @'sDL_PROP_WINDOW_X11_DISPLAY_POINTER'@: the X11 Display associated with the window
+--
+--     * @'sDL_PROP_WINDOW_X11_SCREEN_NUMBER'@: the screen number associated with the window
+--
+--     * @'sDL_PROP_WINDOW_X11_WINDOW_NUMBER'@: the X11 Window associated with the window
+--
+--     On Emscripten:
+--
+--     * @'sDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING'@: the id the canvas element will have
+--
+--     * @'sDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING'@: the keyboard element that associates keyboard events to this window
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowProperties@, defined at @SDL3\/SDL_video.h 1628:46@
+sDL_GetWindowProperties
+  :: BG.FunPtr (BG.Ptr SDL_Window -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID)
+sDL_GetWindowProperties =
+  BG.unsafePerformIO hs_bindgen_985031bf6e083168
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowFlags@
+foreign import ccall unsafe "hs_bindgen_b1430580544057d6"
+  hs_bindgen_b1430580544057d6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowFlags@
+hs_bindgen_b1430580544057d6 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_WindowFlags))
+hs_bindgen_b1430580544057d6 =
+  BG.fromFFIType hs_bindgen_b1430580544057d6_base
+
+{-# NOINLINE sDL_GetWindowFlags #-}
+
+-- | Get the window flags.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: a mask of the 'SDL_WindowFlags' associated with @window@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateWindow', 'sDL_HideWindow', 'sDL_MaximizeWindow', 'sDL_MinimizeWindow', 'sDL_SetWindowFullscreen', 'sDL_SetWindowMouseGrab', 'sDL_SetWindowFillDocument', 'sDL_ShowWindow'
+--
+--     [C declaration]: @SDL_GetWindowFlags@, defined at @SDL3\/SDL_video.h 1687:45@
+sDL_GetWindowFlags :: BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_WindowFlags)
+sDL_GetWindowFlags =
+  BG.unsafePerformIO hs_bindgen_b1430580544057d6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowTitle@
+foreign import ccall unsafe "hs_bindgen_02e6f654a8740cb6"
+  hs_bindgen_02e6f654a8740cb6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowTitle@
+hs_bindgen_02e6f654a8740cb6
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_02e6f654a8740cb6 =
+  BG.fromFFIType hs_bindgen_02e6f654a8740cb6_base
+
+{-# NOINLINE sDL_SetWindowTitle #-}
+
+-- | Set the title of a window.
+--
+--     This string is expected to be in UTF-8 encoding.
+--
+--     [@window@]: the window to change.
+--
+--     [@title@]: the desired window title in UTF-8 format.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowTitle'
+--
+--     [C declaration]: @SDL_SetWindowTitle@, defined at @SDL3\/SDL_video.h 1705:34@
+sDL_SetWindowTitle :: BG.FunPtr (BG.Ptr SDL_Window -> PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_SetWindowTitle =
+  BG.unsafePerformIO hs_bindgen_02e6f654a8740cb6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowTitle@
+foreign import ccall unsafe "hs_bindgen_461782ed3ae5273a"
+  hs_bindgen_461782ed3ae5273a_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowTitle@
+hs_bindgen_461782ed3ae5273a :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO (PtrConst.PtrConst BG.CChar)))
+hs_bindgen_461782ed3ae5273a =
+  BG.fromFFIType hs_bindgen_461782ed3ae5273a_base
+
+{-# NOINLINE sDL_GetWindowTitle #-}
+
+-- | Get the title of a window.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: the title of the window in UTF-8 format or \"\" if there is no title.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowTitle'
+--
+--     [C declaration]: @SDL_GetWindowTitle@, defined at @SDL3\/SDL_video.h 1720:42@
+sDL_GetWindowTitle :: BG.FunPtr (BG.Ptr SDL_Window -> IO (PtrConst.PtrConst BG.CChar))
+sDL_GetWindowTitle =
+  BG.unsafePerformIO hs_bindgen_461782ed3ae5273a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowIcon@
+foreign import ccall unsafe "hs_bindgen_c87ab967152ab788"
+  hs_bindgen_c87ab967152ab788_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowIcon@
+hs_bindgen_c87ab967152ab788
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO BG.CBool))
+hs_bindgen_c87ab967152ab788 =
+  BG.fromFFIType hs_bindgen_c87ab967152ab788_base
+
+{-# NOINLINE sDL_SetWindowIcon #-}
+
+-- | Set the icon for a window.
+--
+--     If this function is passed a surface with alternate representations added using SDL_AddSurfaceAlternateImage(), the surface will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations. For example, if the original surface is 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     [@window@]: the window to change.
+--
+--     [@icon@]: an SDL_Surface structure containing the icon for the window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_AddSurfaceAlternateImage
+--
+--     [C declaration]: @SDL_SetWindowIcon@, defined at @SDL3\/SDL_video.h 1747:34@
+sDL_SetWindowIcon
+  :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO BG.CBool)
+sDL_SetWindowIcon =
+  BG.unsafePerformIO hs_bindgen_c87ab967152ab788
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowPosition@
+foreign import ccall unsafe "hs_bindgen_196834c01e56d982"
+  hs_bindgen_196834c01e56d982_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowPosition@
+hs_bindgen_196834c01e56d982
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> BG.CInt -> IO BG.CBool))
+hs_bindgen_196834c01e56d982 =
+  BG.fromFFIType hs_bindgen_196834c01e56d982_base
+
+{-# NOINLINE sDL_SetWindowPosition #-}
+
+-- | Request that the window\'s position be set.
+--
+--     If the window is in an exclusive fullscreen or maximized state, this request has no effect.
+--
+--     This can be used to reposition fullscreen-desktop windows onto a different display, however, as exclusive fullscreen windows are locked to a specific display, they can only be repositioned programmatically via @SDL_SetWindowFullscreenMode()@.
+--
+--     On some windowing systems this request is asynchronous and the new coordinates may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window position changes, an SDL_EVENT_WINDOW_MOVED event will be emitted with the window\'s new coordinates. Note that the new coordinates may not match the exact coordinates requested, as some windowing systems can restrict the position of the window in certain scenarios (e.g. constraining the position so the window is always within desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [@window@]: the window to reposition.
+--
+--     [@x@]: the x coordinate of the window, or @'sDL_WINDOWPOS_CENTERED'@ or @'sDL_WINDOWPOS_UNDEFINED'@.
+--
+--     [@y@]: the y coordinate of the window, or @'sDL_WINDOWPOS_CENTERED'@ or @'sDL_WINDOWPOS_UNDEFINED'@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowPosition', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowPosition@, defined at @SDL3\/SDL_video.h 1788:34@
+sDL_SetWindowPosition :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> BG.CInt -> IO BG.CBool)
+sDL_SetWindowPosition =
+  BG.unsafePerformIO hs_bindgen_196834c01e56d982
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowPosition@
+foreign import ccall unsafe "hs_bindgen_f2881c8d992e0f1f"
+  hs_bindgen_f2881c8d992e0f1f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowPosition@
+hs_bindgen_f2881c8d992e0f1f
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_f2881c8d992e0f1f =
+  BG.fromFFIType hs_bindgen_f2881c8d992e0f1f_base
+
+{-# NOINLINE sDL_GetWindowPosition #-}
+
+-- | Get the position of a window.
+--
+--     This is the current position of the window as last reported by the windowing system.
+--
+--     If you do not need the value for one of the positions a NULL may be passed in the @x@ or @y@ parameter.
+--
+--     [@window@]: the window to query.
+--
+--     [@x@]: a pointer filled in with the x position of the window, may be NULL.
+--
+--     [@y@]: a pointer filled in with the y position of the window, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowPosition'
+--
+--     [C declaration]: @SDL_GetWindowPosition@, defined at @SDL3\/SDL_video.h 1813:34@
+sDL_GetWindowPosition
+  :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetWindowPosition =
+  BG.unsafePerformIO hs_bindgen_f2881c8d992e0f1f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowSize@
+foreign import ccall unsafe "hs_bindgen_c18dc3d08bf90f70"
+  hs_bindgen_c18dc3d08bf90f70_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowSize@
+hs_bindgen_c18dc3d08bf90f70
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> BG.CInt -> IO BG.CBool))
+hs_bindgen_c18dc3d08bf90f70 =
+  BG.fromFFIType hs_bindgen_c18dc3d08bf90f70_base
+
+{-# NOINLINE sDL_SetWindowSize #-}
+
+-- | Request that the size of a window\'s client area be set.
+--
+--     If the window is in a fullscreen or maximized state, this request has no effect.
+--
+--     To change the exclusive fullscreen mode of a window, use @SDL_SetWindowFullscreenMode()@.
+--
+--     On some windowing systems, this request is asynchronous and the new window size may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window size changes, an SDL_EVENT_WINDOW_RESIZED event will be emitted with the new window dimensions. Note that the new dimensions may not match the exact size requested, as some windowing systems can restrict the window size in certain scenarios (e.g. constraining the size of the content area to remain within the usable desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [@window@]: the window to change.
+--
+--     [@w@]: the width of the window, must be > 0.
+--
+--     [@h@]: the height of the window, must be > 0.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSize', 'sDL_SetWindowFullscreenMode', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowSize@, defined at @SDL3\/SDL_video.h 1850:34@
+sDL_SetWindowSize :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> BG.CInt -> IO BG.CBool)
+sDL_SetWindowSize =
+  BG.unsafePerformIO hs_bindgen_c18dc3d08bf90f70
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSize@
+foreign import ccall unsafe "hs_bindgen_df749a5a4c237fc6"
+  hs_bindgen_df749a5a4c237fc6_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSize@
+hs_bindgen_df749a5a4c237fc6
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_df749a5a4c237fc6 =
+  BG.fromFFIType hs_bindgen_df749a5a4c237fc6_base
+
+{-# NOINLINE sDL_GetWindowSize #-}
+
+-- | Get the size of a window\'s client area.
+--
+--     The window pixel size may differ from its window coordinate size if the window is on a high pixel density display. Use @SDL_GetWindowSizeInPixels()@ or SDL_GetRenderOutputSize() to get the real client area size in pixels.
+--
+--     [@window@]: the window to query the width and height from.
+--
+--     [@w@]: a pointer filled in with the width of the window, may be NULL.
+--
+--     [@h@]: a pointer filled in with the height of the window, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetRenderOutputSize, 'sDL_GetWindowSizeInPixels', 'sDL_SetWindowSize', SDL_EVENT_WINDOW_RESIZED
+--
+--     [C declaration]: @SDL_GetWindowSize@, defined at @SDL3\/SDL_video.h 1874:34@
+sDL_GetWindowSize
+  :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetWindowSize =
+  BG.unsafePerformIO hs_bindgen_df749a5a4c237fc6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSafeArea@
+foreign import ccall unsafe "hs_bindgen_8d8deb6f3e406cac"
+  hs_bindgen_8d8deb6f3e406cac_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSafeArea@
+hs_bindgen_8d8deb6f3e406cac
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_8d8deb6f3e406cac =
+  BG.fromFFIType hs_bindgen_8d8deb6f3e406cac_base
+
+{-# NOINLINE sDL_GetWindowSafeArea #-}
+
+-- | Get the safe area for this window.
+--
+--     Some devices have portions of the screen which are partially obscured or not interactive, possibly due to on-screen controls, curved edges, camera notches, TV overscan, etc. This function provides the area of the window which is safe to have interactable content. You should continue rendering into the rest of the window, but it should not contain visually important or interactable content.
+--
+--     [@window@]: the window to query.
+--
+--     [@rect@]: a pointer filled in with the client area that is safe for interactive content.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowSafeArea@, defined at @SDL3\/SDL_video.h 1896:34@
+sDL_GetWindowSafeArea
+  :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_GetWindowSafeArea =
+  BG.unsafePerformIO hs_bindgen_8d8deb6f3e406cac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowAspectRatio@
+foreign import ccall unsafe "hs_bindgen_25a8a6e0ad2d08d8"
+  hs_bindgen_25a8a6e0ad2d08d8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowAspectRatio@
+hs_bindgen_25a8a6e0ad2d08d8
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CFloat -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_25a8a6e0ad2d08d8 =
+  BG.fromFFIType hs_bindgen_25a8a6e0ad2d08d8_base
+
+{-# NOINLINE sDL_SetWindowAspectRatio #-}
+
+-- | Request that the aspect ratio of a window\'s client area be set.
+--
+--     The aspect ratio is the ratio of width divided by height, e.g. 2560x1600 would be 1.6. Larger aspect ratios are wider and smaller aspect ratios are narrower.
+--
+--     If, at the time of this request, the window in a fixed-size state, such as maximized or fullscreen, the request will be deferred until the window exits this state and becomes resizable again.
+--
+--     On some windowing systems, this request is asynchronous and the new window aspect ratio may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window size changes, an SDL_EVENT_WINDOW_RESIZED event will be emitted with the new window dimensions. Note that the new dimensions may not match the exact aspect ratio requested, as some windowing systems can restrict the window size in certain scenarios (e.g. constraining the size of the content area to remain within the usable desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [@window@]: the window to change.
+--
+--     [@min_aspect@]: the minimum aspect ratio of the window, or 0.0f for no limit.
+--
+--     [@max_aspect@]: the maximum aspect ratio of the window, or 0.0f for no limit.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowAspectRatio', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowAspectRatio@, defined at @SDL3\/SDL_video.h 1937:34@
+sDL_SetWindowAspectRatio :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CFloat -> BG.CFloat -> IO BG.CBool)
+sDL_SetWindowAspectRatio =
+  BG.unsafePerformIO hs_bindgen_25a8a6e0ad2d08d8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowAspectRatio@
+foreign import ccall unsafe "hs_bindgen_d18b72c056e3e796"
+  hs_bindgen_d18b72c056e3e796_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowAspectRatio@
+hs_bindgen_d18b72c056e3e796
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool))
+hs_bindgen_d18b72c056e3e796 =
+  BG.fromFFIType hs_bindgen_d18b72c056e3e796_base
+
+{-# NOINLINE sDL_GetWindowAspectRatio #-}
+
+-- | Get the aspect ratio of a window\'s client area.
+--
+--     [@window@]: the window to query the width and height from.
+--
+--     [@min_aspect@]: a pointer filled in with the minimum aspect ratio of the window, may be NULL.
+--
+--     [@max_aspect@]: a pointer filled in with the maximum aspect ratio of the window, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowAspectRatio'
+--
+--     [C declaration]: @SDL_GetWindowAspectRatio@, defined at @SDL3\/SDL_video.h 1956:34@
+sDL_GetWindowAspectRatio
+  :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CFloat -> BG.Ptr BG.CFloat -> IO BG.CBool)
+sDL_GetWindowAspectRatio =
+  BG.unsafePerformIO hs_bindgen_d18b72c056e3e796
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowBordersSize@
+foreign import ccall unsafe "hs_bindgen_72cf6e7cf38f6a60"
+  hs_bindgen_72cf6e7cf38f6a60_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowBordersSize@
+hs_bindgen_72cf6e7cf38f6a60
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL_Window
+             -> BG.Ptr BG.CInt
+             -> BG.Ptr BG.CInt
+             -> BG.Ptr BG.CInt
+             -> BG.Ptr BG.CInt
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_72cf6e7cf38f6a60 =
+  BG.fromFFIType hs_bindgen_72cf6e7cf38f6a60_base
+
+{-# NOINLINE sDL_GetWindowBordersSize #-}
+
+-- | Get the size of a window\'s borders (decorations) around the client area.
+--
+--     Note: If this function fails (returns false), the size values will be initialized to 0, 0, 0, 0 (if a non-NULL pointer is provided), as if the window in question was borderless.
+--
+--     Note: This function may fail on systems where the window has not yet been decorated by the display server (for example, immediately after calling SDL_CreateWindow). It is recommended that you wait at least until the window has been presented and composited, so that the window system has a chance to decorate the window and provide the border dimensions to SDL.
+--
+--     This function also returns false if getting the information is not supported.
+--
+--     [@window@]: the window to query the size values of the border (decorations) from.
+--
+--     [@top@]: pointer to variable for storing the size of the top border; NULL is permitted.
+--
+--     [@left@]: pointer to variable for storing the size of the left border; NULL is permitted.
+--
+--     [@bottom@]: pointer to variable for storing the size of the bottom border; NULL is permitted.
+--
+--     [@right@]: pointer to variable for storing the size of the right border; NULL is permitted.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSize'
+--
+--     [C declaration]: @SDL_GetWindowBordersSize@, defined at @SDL3\/SDL_video.h 1993:34@
+sDL_GetWindowBordersSize
+  :: BG.FunPtr
+       ( BG.Ptr SDL_Window
+         -> BG.Ptr BG.CInt
+         -> BG.Ptr BG.CInt
+         -> BG.Ptr BG.CInt
+         -> BG.Ptr BG.CInt
+         -> IO BG.CBool
+       )
+sDL_GetWindowBordersSize =
+  BG.unsafePerformIO hs_bindgen_72cf6e7cf38f6a60
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSizeInPixels@
+foreign import ccall unsafe "hs_bindgen_6affb1847f677537"
+  hs_bindgen_6affb1847f677537_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSizeInPixels@
+hs_bindgen_6affb1847f677537
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_6affb1847f677537 =
+  BG.fromFFIType hs_bindgen_6affb1847f677537_base
+
+{-# NOINLINE sDL_GetWindowSizeInPixels #-}
+
+-- | Get the size of a window\'s client area, in pixels.
+--
+--     [@window@]: the window from which the drawable size should be queried.
+--
+--     [@w@]: a pointer to variable for storing the width in pixels, may be NULL.
+--
+--     [@h@]: a pointer to variable for storing the height in pixels, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateWindow', 'sDL_GetWindowSize'
+--
+--     [C declaration]: @SDL_GetWindowSizeInPixels@, defined at @SDL3\/SDL_video.h 2013:34@
+sDL_GetWindowSizeInPixels
+  :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetWindowSizeInPixels =
+  BG.unsafePerformIO hs_bindgen_6affb1847f677537
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMinimumSize@
+foreign import ccall unsafe "hs_bindgen_6edf78b362442bfc"
+  hs_bindgen_6edf78b362442bfc_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMinimumSize@
+hs_bindgen_6edf78b362442bfc
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> BG.CInt -> IO BG.CBool))
+hs_bindgen_6edf78b362442bfc =
+  BG.fromFFIType hs_bindgen_6edf78b362442bfc_base
+
+{-# NOINLINE sDL_SetWindowMinimumSize #-}
+
+-- | Set the minimum size of a window\'s client area.
+--
+--     [@window@]: the window to change.
+--
+--     [@min_w@]: the minimum width of the window, or 0 for no limit.
+--
+--     [@min_h@]: the minimum height of the window, or 0 for no limit.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMinimumSize', 'sDL_SetWindowMaximumSize'
+--
+--     [C declaration]: @SDL_SetWindowMinimumSize@, defined at @SDL3\/SDL_video.h 2031:34@
+sDL_SetWindowMinimumSize :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> BG.CInt -> IO BG.CBool)
+sDL_SetWindowMinimumSize =
+  BG.unsafePerformIO hs_bindgen_6edf78b362442bfc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMinimumSize@
+foreign import ccall unsafe "hs_bindgen_95a71d8cbb92dc9e"
+  hs_bindgen_95a71d8cbb92dc9e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMinimumSize@
+hs_bindgen_95a71d8cbb92dc9e
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_95a71d8cbb92dc9e =
+  BG.fromFFIType hs_bindgen_95a71d8cbb92dc9e_base
+
+{-# NOINLINE sDL_GetWindowMinimumSize #-}
+
+-- | Get the minimum size of a window\'s client area.
+--
+--     [@window@]: the window to query.
+--
+--     [@w@]: a pointer filled in with the minimum width of the window, may be NULL.
+--
+--     [@h@]: a pointer filled in with the minimum height of the window, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMaximumSize', 'sDL_SetWindowMinimumSize'
+--
+--     [C declaration]: @SDL_GetWindowMinimumSize@, defined at @SDL3\/SDL_video.h 2051:34@
+sDL_GetWindowMinimumSize
+  :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetWindowMinimumSize =
+  BG.unsafePerformIO hs_bindgen_95a71d8cbb92dc9e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMaximumSize@
+foreign import ccall unsafe "hs_bindgen_291022ee01415afe"
+  hs_bindgen_291022ee01415afe_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMaximumSize@
+hs_bindgen_291022ee01415afe
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> BG.CInt -> IO BG.CBool))
+hs_bindgen_291022ee01415afe =
+  BG.fromFFIType hs_bindgen_291022ee01415afe_base
+
+{-# NOINLINE sDL_SetWindowMaximumSize #-}
+
+-- | Set the maximum size of a window\'s client area.
+--
+--     [@window@]: the window to change.
+--
+--     [@max_w@]: the maximum width of the window, or 0 for no limit.
+--
+--     [@max_h@]: the maximum height of the window, or 0 for no limit.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMaximumSize', 'sDL_SetWindowMinimumSize'
+--
+--     [C declaration]: @SDL_SetWindowMaximumSize@, defined at @SDL3\/SDL_video.h 2069:34@
+sDL_SetWindowMaximumSize :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> BG.CInt -> IO BG.CBool)
+sDL_SetWindowMaximumSize =
+  BG.unsafePerformIO hs_bindgen_291022ee01415afe
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMaximumSize@
+foreign import ccall unsafe "hs_bindgen_dc1d465b3b604dcd"
+  hs_bindgen_dc1d465b3b604dcd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMaximumSize@
+hs_bindgen_dc1d465b3b604dcd
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_dc1d465b3b604dcd =
+  BG.fromFFIType hs_bindgen_dc1d465b3b604dcd_base
+
+{-# NOINLINE sDL_GetWindowMaximumSize #-}
+
+-- | Get the maximum size of a window\'s client area.
+--
+--     [@window@]: the window to query.
+--
+--     [@w@]: a pointer filled in with the maximum width of the window, may be NULL.
+--
+--     [@h@]: a pointer filled in with the maximum height of the window, may be NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMinimumSize', 'sDL_SetWindowMaximumSize'
+--
+--     [C declaration]: @SDL_GetWindowMaximumSize@, defined at @SDL3\/SDL_video.h 2089:34@
+sDL_GetWindowMaximumSize
+  :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetWindowMaximumSize =
+  BG.unsafePerformIO hs_bindgen_dc1d465b3b604dcd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowBordered@
+foreign import ccall unsafe "hs_bindgen_88f2360be3e7e300"
+  hs_bindgen_88f2360be3e7e300_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowBordered@
+hs_bindgen_88f2360be3e7e300 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool))
+hs_bindgen_88f2360be3e7e300 =
+  BG.fromFFIType hs_bindgen_88f2360be3e7e300_base
+
+{-# NOINLINE sDL_SetWindowBordered #-}
+
+-- | Set the border state of a window.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_BORDERLESS@ flag and add or remove the border from the actual window. This is a no-op if the window\'s border already matches the requested state.
+--
+--     You can\'t change the border state of a fullscreen window.
+--
+--     [@window@]: the window of which to change the border state.
+--
+--     [@bordered@]: false to remove border, true to add border.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowBordered@, defined at @SDL3\/SDL_video.h 2111:34@
+sDL_SetWindowBordered :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool)
+sDL_SetWindowBordered =
+  BG.unsafePerformIO hs_bindgen_88f2360be3e7e300
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowResizable@
+foreign import ccall unsafe "hs_bindgen_5100302cfda497dd"
+  hs_bindgen_5100302cfda497dd_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowResizable@
+hs_bindgen_5100302cfda497dd :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool))
+hs_bindgen_5100302cfda497dd =
+  BG.fromFFIType hs_bindgen_5100302cfda497dd_base
+
+{-# NOINLINE sDL_SetWindowResizable #-}
+
+-- | Set the user-resizable state of a window.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_RESIZABLE@ flag and allow\/disallow user resizing of the window. This is a no-op if the window\'s resizable state already matches the requested state.
+--
+--     You can\'t change the resizable state of a fullscreen window.
+--
+--     [@window@]: the window of which to change the resizable state.
+--
+--     [@resizable@]: true to allow resizing, false to disallow.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowResizable@, defined at @SDL3\/SDL_video.h 2133:34@
+sDL_SetWindowResizable :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool)
+sDL_SetWindowResizable =
+  BG.unsafePerformIO hs_bindgen_5100302cfda497dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowAlwaysOnTop@
+foreign import ccall unsafe "hs_bindgen_608fd57fdcd4f95b"
+  hs_bindgen_608fd57fdcd4f95b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowAlwaysOnTop@
+hs_bindgen_608fd57fdcd4f95b :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool))
+hs_bindgen_608fd57fdcd4f95b =
+  BG.fromFFIType hs_bindgen_608fd57fdcd4f95b_base
+
+{-# NOINLINE sDL_SetWindowAlwaysOnTop #-}
+
+-- | Set the window to always be above the others.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_ALWAYS_ON_TOP@ flag. This will bring the window to the front and keep the window above the rest.
+--
+--     [@window@]: the window of which to change the always on top state.
+--
+--     [@on_top@]: true to set the window always on top, false to disable.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowAlwaysOnTop@, defined at @SDL3\/SDL_video.h 2152:34@
+sDL_SetWindowAlwaysOnTop :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool)
+sDL_SetWindowAlwaysOnTop =
+  BG.unsafePerformIO hs_bindgen_608fd57fdcd4f95b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFillDocument@
+foreign import ccall unsafe "hs_bindgen_68dc00f60262f0f8"
+  hs_bindgen_68dc00f60262f0f8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFillDocument@
+hs_bindgen_68dc00f60262f0f8 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool))
+hs_bindgen_68dc00f60262f0f8 =
+  BG.fromFFIType hs_bindgen_68dc00f60262f0f8_base
+
+{-# NOINLINE sDL_SetWindowFillDocument #-}
+
+-- | Set the window to fill the current document space (Emscripten only).
+--
+--     This will add or remove the window\'s @SDL_WINDOW_FILL_DOCUMENT@ flag.
+--
+--     Currently this flag only applies to the Emscripten target.
+--
+--     When enabled, the canvas element fills the entire document. Resize events will be generated as the browser window is resized, as that will adjust the canvas size as well. The canvas will cover anything else on the page, including any controls provided by Emscripten in its generated HTML file (in fact, any elements on the page that aren\'t the canvas will be moved into a hidden @div@ element).
+--
+--     Often times this is desirable for a browser-based game, but it means several things that we expect of an SDL window on other platforms might not work as expected, such as minimum window sizes and aspect ratios.
+--
+--     [@window@]: the window of which to change the fill-document state.
+--
+--     [@fill@]: true to set the window to fill the document, false to disable.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowFillDocument@, defined at @SDL3\/SDL_video.h 2183:34@
+sDL_SetWindowFillDocument :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool)
+sDL_SetWindowFillDocument =
+  BG.unsafePerformIO hs_bindgen_68dc00f60262f0f8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_ShowWindow@
+foreign import ccall unsafe "hs_bindgen_64fdfc7ce17dc625"
+  hs_bindgen_64fdfc7ce17dc625_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_ShowWindow@
+hs_bindgen_64fdfc7ce17dc625 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_64fdfc7ce17dc625 =
+  BG.fromFFIType hs_bindgen_64fdfc7ce17dc625_base
+
+{-# NOINLINE sDL_ShowWindow #-}
+
+-- | Show a window.
+--
+--     [@window@]: the window to show.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HideWindow', 'sDL_RaiseWindow'
+--
+--     [C declaration]: @SDL_ShowWindow@, defined at @SDL3\/SDL_video.h 2199:34@
+sDL_ShowWindow :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_ShowWindow =
+  BG.unsafePerformIO hs_bindgen_64fdfc7ce17dc625
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_HideWindow@
+foreign import ccall unsafe "hs_bindgen_c2ab0cd6e971a55f"
+  hs_bindgen_c2ab0cd6e971a55f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_HideWindow@
+hs_bindgen_c2ab0cd6e971a55f :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_c2ab0cd6e971a55f =
+  BG.fromFFIType hs_bindgen_c2ab0cd6e971a55f_base
+
+{-# NOINLINE sDL_HideWindow #-}
+
+-- | Hide a window.
+--
+--     [@window@]: the window to hide.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShowWindow', @SDL_WINDOW_HIDDEN@
+--
+--     [C declaration]: @SDL_HideWindow@, defined at @SDL3\/SDL_video.h 2215:34@
+sDL_HideWindow :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_HideWindow =
+  BG.unsafePerformIO hs_bindgen_c2ab0cd6e971a55f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_RaiseWindow@
+foreign import ccall unsafe "hs_bindgen_e3e1a65c603c3d63"
+  hs_bindgen_e3e1a65c603c3d63_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_RaiseWindow@
+hs_bindgen_e3e1a65c603c3d63 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_e3e1a65c603c3d63 =
+  BG.fromFFIType hs_bindgen_e3e1a65c603c3d63_base
+
+{-# NOINLINE sDL_RaiseWindow #-}
+
+-- | Request that a window be raised above other windows and gain the input focus.
+--
+--     The result of this request is subject to desktop window manager policy, particularly if raising the requested window would result in stealing focus from another application. If the window is successfully raised and gains input focus, an SDL_EVENT_WINDOW_FOCUS_GAINED event will be emitted, and the window will have the SDL_WINDOW_INPUT_FOCUS flag set.
+--
+--     [@window@]: the window to raise.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RaiseWindow@, defined at @SDL3\/SDL_video.h 2235:34@
+sDL_RaiseWindow :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_RaiseWindow =
+  BG.unsafePerformIO hs_bindgen_e3e1a65c603c3d63
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_MaximizeWindow@
+foreign import ccall unsafe "hs_bindgen_fe10be381d9d51e0"
+  hs_bindgen_fe10be381d9d51e0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_MaximizeWindow@
+hs_bindgen_fe10be381d9d51e0 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_fe10be381d9d51e0 =
+  BG.fromFFIType hs_bindgen_fe10be381d9d51e0_base
+
+{-# NOINLINE sDL_MaximizeWindow #-}
+
+-- | Request that the window be made as large as possible.
+--
+--     Non-resizable windows can\'t be maximized. The window must have the SDL_WINDOW_RESIZABLE flag set, or this will have no effect.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_MAXIMIZED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     When maximizing a window, whether the constraints set via @SDL_SetWindowMaximumSize()@ are honored depends on the policy of the window manager. Win32 and macOS enforce the constraints when maximizing, while X11 and Wayland window managers may vary.
+--
+--     [@window@]: the window to maximize.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MinimizeWindow', 'sDL_RestoreWindow', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_MaximizeWindow@, defined at @SDL3\/SDL_video.h 2269:34@
+sDL_MaximizeWindow :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_MaximizeWindow =
+  BG.unsafePerformIO hs_bindgen_fe10be381d9d51e0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_MinimizeWindow@
+foreign import ccall unsafe "hs_bindgen_d04014fe275b362c"
+  hs_bindgen_d04014fe275b362c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_MinimizeWindow@
+hs_bindgen_d04014fe275b362c :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_d04014fe275b362c =
+  BG.fromFFIType hs_bindgen_d04014fe275b362c_base
+
+{-# NOINLINE sDL_MinimizeWindow #-}
+
+-- | Request that the window be minimized to an iconic representation.
+--
+--     If the window is in a fullscreen state, this request has no direct effect. It may alter the state the window is returned to when leaving fullscreen.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_MINIMIZED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     [@window@]: the window to minimize.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MaximizeWindow', 'sDL_RestoreWindow', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_MinimizeWindow@, defined at @SDL3\/SDL_video.h 2298:34@
+sDL_MinimizeWindow :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_MinimizeWindow =
+  BG.unsafePerformIO hs_bindgen_d04014fe275b362c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_RestoreWindow@
+foreign import ccall unsafe "hs_bindgen_7fb2f1337e1419c4"
+  hs_bindgen_7fb2f1337e1419c4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_RestoreWindow@
+hs_bindgen_7fb2f1337e1419c4 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_7fb2f1337e1419c4 =
+  BG.fromFFIType hs_bindgen_7fb2f1337e1419c4_base
+
+{-# NOINLINE sDL_RestoreWindow #-}
+
+-- | Request that the size and position of a minimized or maximized window be restored.
+--
+--     If the window is in a fullscreen state, this request has no direct effect. It may alter the state the window is returned to when leaving fullscreen.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_RESTORED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     [@window@]: the window to restore.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MaximizeWindow', 'sDL_MinimizeWindow', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_RestoreWindow@, defined at @SDL3\/SDL_video.h 2328:34@
+sDL_RestoreWindow :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_RestoreWindow =
+  BG.unsafePerformIO hs_bindgen_7fb2f1337e1419c4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFullscreen@
+foreign import ccall unsafe "hs_bindgen_7997a9fb73c8d257"
+  hs_bindgen_7997a9fb73c8d257_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFullscreen@
+hs_bindgen_7997a9fb73c8d257 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool))
+hs_bindgen_7997a9fb73c8d257 =
+  BG.fromFFIType hs_bindgen_7997a9fb73c8d257_base
+
+{-# NOINLINE sDL_SetWindowFullscreen #-}
+
+-- | Request that the window\'s fullscreen state be changed.
+--
+--     By default a window in fullscreen state uses borderless fullscreen desktop mode, but a specific exclusive display mode can be set using @SDL_SetWindowFullscreenMode()@.
+--
+--     On some windowing systems this request is asynchronous and the new fullscreen state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_ENTER_FULLSCREEN or SDL_EVENT_WINDOW_LEAVE_FULLSCREEN event will be emitted. Note that, as this is just a request, it can be denied by the windowing system.
+--
+--     [@window@]: the window to change.
+--
+--     [@fullscreen@]: true for fullscreen mode, false for windowed mode.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFullscreenMode', 'sDL_SetWindowFullscreenMode', 'sDL_SyncWindow', @SDL_WINDOW_FULLSCREEN@
+--
+--     [C declaration]: @SDL_SetWindowFullscreen@, defined at @SDL3\/SDL_video.h 2360:34@
+sDL_SetWindowFullscreen :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool)
+sDL_SetWindowFullscreen =
+  BG.unsafePerformIO hs_bindgen_7997a9fb73c8d257
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SyncWindow@
+foreign import ccall unsafe "hs_bindgen_99cfe89c3d1870d2"
+  hs_bindgen_99cfe89c3d1870d2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SyncWindow@
+hs_bindgen_99cfe89c3d1870d2 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_99cfe89c3d1870d2 =
+  BG.fromFFIType hs_bindgen_99cfe89c3d1870d2_base
+
+{-# NOINLINE sDL_SyncWindow #-}
+
+-- | Block until any pending window state is finalized.
+--
+--     On asynchronous windowing systems, this acts as a synchronization barrier for pending window state. It will attempt to wait until any pending window state has been applied and is guaranteed to return within finite time. Note that for how long it can potentially block depends on the underlying window system, as window state changes may involve somewhat lengthy animations that must complete before the window is in its final requested state.
+--
+--     On windowing systems where changes are immediate, this does nothing.
+--
+--     [@window@]: the window for which to wait for the pending state to be applied.
+--
+--     [Returns]: true on success or false if the operation timed out before the window was in the requested state.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowSize', 'sDL_SetWindowPosition', 'sDL_SetWindowFullscreen', 'sDL_MinimizeWindow', 'sDL_MaximizeWindow', 'sDL_RestoreWindow', SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS
+--
+--     [C declaration]: @SDL_SyncWindow@, defined at @SDL3\/SDL_video.h 2391:34@
+sDL_SyncWindow :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_SyncWindow =
+  BG.unsafePerformIO hs_bindgen_99cfe89c3d1870d2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_WindowHasSurface@
+foreign import ccall unsafe "hs_bindgen_492c4aeae7928033"
+  hs_bindgen_492c4aeae7928033_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_WindowHasSurface@
+hs_bindgen_492c4aeae7928033 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_492c4aeae7928033 =
+  BG.fromFFIType hs_bindgen_492c4aeae7928033_base
+
+{-# NOINLINE sDL_WindowHasSurface #-}
+
+-- | Return whether the window has a surface associated with it.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: true if there is a surface associated with the window, or false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface'
+--
+--     [C declaration]: @SDL_WindowHasSurface@, defined at @SDL3\/SDL_video.h 2406:34@
+sDL_WindowHasSurface :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_WindowHasSurface =
+  BG.unsafePerformIO hs_bindgen_492c4aeae7928033
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSurface@
+foreign import ccall unsafe "hs_bindgen_2f8a00e3685394ac"
+  hs_bindgen_2f8a00e3685394ac_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSurface@
+hs_bindgen_2f8a00e3685394ac
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)))
+hs_bindgen_2f8a00e3685394ac =
+  BG.fromFFIType hs_bindgen_2f8a00e3685394ac_base
+
+{-# NOINLINE sDL_GetWindowSurface #-}
+
+-- | Get the SDL surface associated with the window.
+--
+--     A new surface will be created with the optimal format for the window, if necessary. This surface will be freed when the window is destroyed. Do not free this surface.
+--
+--     This surface will be invalidated if the window is resized. After resizing a window this function must be called again to return a valid surface.
+--
+--     You may not combine this with 3D or the rendering API on this window.
+--
+--     This function is affected by @SDL_HINT_FRAMEBUFFER_ACCELERATION@.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: the surface associated with the window, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyWindowSurface', 'sDL_WindowHasSurface', 'sDL_UpdateWindowSurface', 'sDL_UpdateWindowSurfaceRects'
+--
+--     [C declaration]: @SDL_GetWindowSurface@, defined at @SDL3\/SDL_video.h 2435:43@
+sDL_GetWindowSurface
+  :: BG.FunPtr (BG.Ptr SDL_Window -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface))
+sDL_GetWindowSurface =
+  BG.unsafePerformIO hs_bindgen_2f8a00e3685394ac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowSurfaceVSync@
+foreign import ccall unsafe "hs_bindgen_8e03aa1985376fed"
+  hs_bindgen_8e03aa1985376fed_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowSurfaceVSync@
+hs_bindgen_8e03aa1985376fed :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> IO BG.CBool))
+hs_bindgen_8e03aa1985376fed =
+  BG.fromFFIType hs_bindgen_8e03aa1985376fed_base
+
+{-# NOINLINE sDL_SetWindowSurfaceVSync #-}
+
+-- | Toggle VSync for the window surface.
+--
+--     When a window surface is created, vsync defaults to SDL_WINDOW_SURFACE_VSYNC_DISABLED.
+--
+--     The @vsync@ parameter can be 1 to synchronize present with every vertical refresh, 2 to synchronize present with every second vertical refresh, etc., SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or SDL_WINDOW_SURFACE_VSYNC_DISABLED to disable. Not every value is supported by every driver, so you should check the return value to see whether the requested setting is supported.
+--
+--     [@window@]: the window.
+--
+--     [@vsync@]: the vertical refresh sync interval.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurfaceVSync'
+--
+--     [C declaration]: @SDL_SetWindowSurfaceVSync@, defined at @SDL3\/SDL_video.h 2461:34@
+sDL_SetWindowSurfaceVSync :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> IO BG.CBool)
+sDL_SetWindowSurfaceVSync =
+  BG.unsafePerformIO hs_bindgen_8e03aa1985376fed
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSurfaceVSync@
+foreign import ccall unsafe "hs_bindgen_d0cf4eceaaa0e08e"
+  hs_bindgen_d0cf4eceaaa0e08e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowSurfaceVSync@
+hs_bindgen_d0cf4eceaaa0e08e :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_d0cf4eceaaa0e08e =
+  BG.fromFFIType hs_bindgen_d0cf4eceaaa0e08e_base
+
+{-# NOINLINE sDL_GetWindowSurfaceVSync #-}
+
+-- | Get VSync for the window surface.
+--
+--     [@window@]: the window to query.
+--
+--     [@vsync@]: an int filled with the current vertical refresh sync interval. See @SDL_SetWindowSurfaceVSync()@ for the meaning of the value.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowSurfaceVSync'
+--
+--     [C declaration]: @SDL_GetWindowSurfaceVSync@, defined at @SDL3\/SDL_video.h 2481:34@
+sDL_GetWindowSurfaceVSync :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GetWindowSurfaceVSync =
+  BG.unsafePerformIO hs_bindgen_d0cf4eceaaa0e08e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_UpdateWindowSurface@
+foreign import ccall unsafe "hs_bindgen_ed4a6fb4d50f6be0"
+  hs_bindgen_ed4a6fb4d50f6be0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_UpdateWindowSurface@
+hs_bindgen_ed4a6fb4d50f6be0 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_ed4a6fb4d50f6be0 =
+  BG.fromFFIType hs_bindgen_ed4a6fb4d50f6be0_base
+
+{-# NOINLINE sDL_UpdateWindowSurface #-}
+
+-- | Copy the window surface to the screen.
+--
+--     This is the function you use to reflect any changes to the surface on the screen.
+--
+--     This function is equivalent to the SDL 1.2 API SDL_Flip().
+--
+--     [@window@]: the window to update.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface', 'sDL_UpdateWindowSurfaceRects'
+--
+--     [C declaration]: @SDL_UpdateWindowSurface@, defined at @SDL3\/SDL_video.h 2502:34@
+sDL_UpdateWindowSurface :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_UpdateWindowSurface =
+  BG.unsafePerformIO hs_bindgen_ed4a6fb4d50f6be0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_UpdateWindowSurfaceRects@
+foreign import ccall unsafe "hs_bindgen_02e706becc194495"
+  hs_bindgen_02e706becc194495_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_UpdateWindowSurfaceRects@
+hs_bindgen_02e706becc194495
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL_Window -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> BG.CInt -> IO BG.CBool)
+       )
+hs_bindgen_02e706becc194495 =
+  BG.fromFFIType hs_bindgen_02e706becc194495_base
+
+{-# NOINLINE sDL_UpdateWindowSurfaceRects #-}
+
+-- | Copy areas of the window surface to the screen.
+--
+--     This is the function you use to reflect changes to portions of the surface on the screen.
+--
+--     This function is equivalent to the SDL 1.2 API SDL_UpdateRects().
+--
+--     Note that this function will update /at least/ the rectangles specified, but this is only intended as an optimization; in practice, this might update more of the screen (or all of the screen!), depending on what method SDL uses to send pixels to the system.
+--
+--     [@window@]: the window to update.
+--
+--     [@rects@]: an array of SDL_Rect structures representing areas of the surface to copy, in pixels.
+--
+--     [@numrects@]: the number of rectangles.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface', 'sDL_UpdateWindowSurface'
+--
+--     [C declaration]: @SDL_UpdateWindowSurfaceRects@, defined at @SDL3\/SDL_video.h 2531:34@
+sDL_UpdateWindowSurfaceRects
+  :: BG.FunPtr
+       (BG.Ptr SDL_Window -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> BG.CInt -> IO BG.CBool)
+sDL_UpdateWindowSurfaceRects =
+  BG.unsafePerformIO hs_bindgen_02e706becc194495
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_DestroyWindowSurface@
+foreign import ccall unsafe "hs_bindgen_3f86b6de52c490a8"
+  hs_bindgen_3f86b6de52c490a8_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_DestroyWindowSurface@
+hs_bindgen_3f86b6de52c490a8 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_3f86b6de52c490a8 =
+  BG.fromFFIType hs_bindgen_3f86b6de52c490a8_base
+
+{-# NOINLINE sDL_DestroyWindowSurface #-}
+
+-- | Destroy the surface associated with the window.
+--
+--     [@window@]: the window to update.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface', 'sDL_WindowHasSurface'
+--
+--     [C declaration]: @SDL_DestroyWindowSurface@, defined at @SDL3\/SDL_video.h 2547:34@
+sDL_DestroyWindowSurface :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_DestroyWindowSurface =
+  BG.unsafePerformIO hs_bindgen_3f86b6de52c490a8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowKeyboardGrab@
+foreign import ccall unsafe "hs_bindgen_1a10593b47408de7"
+  hs_bindgen_1a10593b47408de7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowKeyboardGrab@
+hs_bindgen_1a10593b47408de7 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool))
+hs_bindgen_1a10593b47408de7 =
+  BG.fromFFIType hs_bindgen_1a10593b47408de7_base
+
+{-# NOINLINE sDL_SetWindowKeyboardGrab #-}
+
+-- | Set a window\'s keyboard grab mode.
+--
+--     Keyboard grab enables capture of system keyboard shortcuts like Alt+Tab or the Meta\/Super key. Note that not all system keyboard shortcuts can be captured by applications (one example is Ctrl+Alt+Del on Windows).
+--
+--     This is primarily intended for specialized applications such as VNC clients or VM frontends. Normal games should not use keyboard grab.
+--
+--     When keyboard grab is enabled, SDL will continue to handle Alt+Tab when the window is full-screen to ensure the user is not trapped in your application. If you have a custom keyboard shortcut to exit fullscreen mode, you may suppress this behavior with @SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED@.
+--
+--     If the caller enables a grab while another window is currently grabbed, the other window loses its grab in favor of the caller\'s window.
+--
+--     [@window@]: the window for which the keyboard grab mode should be set.
+--
+--     [@grabbed@]: this is true to grab keyboard, and false to release.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowKeyboardGrab', 'sDL_SetWindowMouseGrab'
+--
+--     [C declaration]: @SDL_SetWindowKeyboardGrab@, defined at @SDL3\/SDL_video.h 2580:34@
+sDL_SetWindowKeyboardGrab :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool)
+sDL_SetWindowKeyboardGrab =
+  BG.unsafePerformIO hs_bindgen_1a10593b47408de7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMouseGrab@
+foreign import ccall unsafe "hs_bindgen_1c52b8e1bc921458"
+  hs_bindgen_1c52b8e1bc921458_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMouseGrab@
+hs_bindgen_1c52b8e1bc921458 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool))
+hs_bindgen_1c52b8e1bc921458 =
+  BG.fromFFIType hs_bindgen_1c52b8e1bc921458_base
+
+{-# NOINLINE sDL_SetWindowMouseGrab #-}
+
+-- | Set a window\'s mouse grab mode.
+--
+--     Mouse grab confines the mouse cursor to the window.
+--
+--     [@window@]: the window for which the mouse grab mode should be set.
+--
+--     [@grabbed@]: this is true to grab mouse, and false to release.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMouseRect', 'sDL_SetWindowMouseRect', 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_SetWindowMouseGrab@, defined at @SDL3\/SDL_video.h 2600:34@
+sDL_SetWindowMouseGrab :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool)
+sDL_SetWindowMouseGrab =
+  BG.unsafePerformIO hs_bindgen_1c52b8e1bc921458
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowKeyboardGrab@
+foreign import ccall unsafe "hs_bindgen_bd31081b6b534f49"
+  hs_bindgen_bd31081b6b534f49_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowKeyboardGrab@
+hs_bindgen_bd31081b6b534f49 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_bd31081b6b534f49 =
+  BG.fromFFIType hs_bindgen_bd31081b6b534f49_base
+
+{-# NOINLINE sDL_GetWindowKeyboardGrab #-}
+
+-- | Get a window\'s keyboard grab mode.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: true if keyboard is grabbed, and false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_GetWindowKeyboardGrab@, defined at @SDL3\/SDL_video.h 2614:34@
+sDL_GetWindowKeyboardGrab :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_GetWindowKeyboardGrab =
+  BG.unsafePerformIO hs_bindgen_bd31081b6b534f49
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMouseGrab@
+foreign import ccall unsafe "hs_bindgen_40af0f6caff933b4"
+  hs_bindgen_40af0f6caff933b4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMouseGrab@
+hs_bindgen_40af0f6caff933b4 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_40af0f6caff933b4 =
+  BG.fromFFIType hs_bindgen_40af0f6caff933b4_base
+
+{-# NOINLINE sDL_GetWindowMouseGrab #-}
+
+-- | Get a window\'s mouse grab mode.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: true if mouse is grabbed, and false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMouseRect', 'sDL_SetWindowMouseRect', 'sDL_SetWindowMouseGrab', 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_GetWindowMouseGrab@, defined at @SDL3\/SDL_video.h 2631:34@
+sDL_GetWindowMouseGrab :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_GetWindowMouseGrab =
+  BG.unsafePerformIO hs_bindgen_40af0f6caff933b4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetGrabbedWindow@
+foreign import ccall unsafe "hs_bindgen_072d8bccac218ad2"
+  hs_bindgen_072d8bccac218ad2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetGrabbedWindow@
+hs_bindgen_072d8bccac218ad2 :: IO (BG.FunPtr (IO (BG.Ptr SDL_Window)))
+hs_bindgen_072d8bccac218ad2 =
+  BG.fromFFIType hs_bindgen_072d8bccac218ad2_base
+
+{-# NOINLINE sDL_GetGrabbedWindow #-}
+
+-- | Get the window that currently has an input grab enabled.
+--
+--     [Returns]: the window if input is grabbed or NULL otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowMouseGrab', 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_GetGrabbedWindow@, defined at @SDL3\/SDL_video.h 2645:42@
+sDL_GetGrabbedWindow :: BG.FunPtr (IO (BG.Ptr SDL_Window))
+sDL_GetGrabbedWindow =
+  BG.unsafePerformIO hs_bindgen_072d8bccac218ad2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMouseRect@
+foreign import ccall unsafe "hs_bindgen_95863c8d80115819"
+  hs_bindgen_95863c8d80115819_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowMouseRect@
+hs_bindgen_95863c8d80115819
+  :: IO
+       (BG.FunPtr (BG.Ptr SDL_Window -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool))
+hs_bindgen_95863c8d80115819 =
+  BG.fromFFIType hs_bindgen_95863c8d80115819_base
+
+{-# NOINLINE sDL_SetWindowMouseRect #-}
+
+-- | Confines the cursor to the specified area of a window.
+--
+--     Note that this does NOT grab the cursor, it only defines the area a cursor is restricted to when the window has mouse focus.
+--
+--     [@window@]: the window that will be associated with the barrier.
+--
+--     [@rect@]: a rectangle area in window-relative coordinates. If NULL the barrier for the specified window will be destroyed.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMouseRect', 'sDL_GetWindowMouseGrab', 'sDL_SetWindowMouseGrab'
+--
+--     [C declaration]: @SDL_SetWindowMouseRect@, defined at @SDL3\/SDL_video.h 2667:34@
+sDL_SetWindowMouseRect
+  :: BG.FunPtr (BG.Ptr SDL_Window -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect -> IO BG.CBool)
+sDL_SetWindowMouseRect =
+  BG.unsafePerformIO hs_bindgen_95863c8d80115819
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMouseRect@
+foreign import ccall unsafe "hs_bindgen_049b065f15b35ce9"
+  hs_bindgen_049b065f15b35ce9_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowMouseRect@
+hs_bindgen_049b065f15b35ce9
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect)))
+hs_bindgen_049b065f15b35ce9 =
+  BG.fromFFIType hs_bindgen_049b065f15b35ce9_base
+
+{-# NOINLINE sDL_GetWindowMouseRect #-}
+
+-- | Get the mouse confinement rectangle of a window.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: a pointer to the mouse confinement rectangle of a window, or NULL if there isn\'t one.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowMouseRect', 'sDL_GetWindowMouseGrab', 'sDL_SetWindowMouseGrab'
+--
+--     [C declaration]: @SDL_GetWindowMouseRect@, defined at @SDL3\/SDL_video.h 2684:46@
+sDL_GetWindowMouseRect
+  :: BG.FunPtr (BG.Ptr SDL_Window -> IO (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect))
+sDL_GetWindowMouseRect =
+  BG.unsafePerformIO hs_bindgen_049b065f15b35ce9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowOpacity@
+foreign import ccall unsafe "hs_bindgen_0e865d00ef5cb4eb"
+  hs_bindgen_0e865d00ef5cb4eb_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowOpacity@
+hs_bindgen_0e865d00ef5cb4eb :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_0e865d00ef5cb4eb =
+  BG.fromFFIType hs_bindgen_0e865d00ef5cb4eb_base
+
+{-# NOINLINE sDL_SetWindowOpacity #-}
+
+-- | Set the opacity for a window.
+--
+--     The parameter @opacity@ will be clamped internally between 0.0f (transparent) and 1.0f (opaque).
+--
+--     This function also returns false if setting the opacity isn\'t supported.
+--
+--     [@window@]: the window which will be made transparent or opaque.
+--
+--     [@opacity@]: the opacity value (0.0f - transparent, 1.0f - opaque).
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowOpacity'
+--
+--     [C declaration]: @SDL_SetWindowOpacity@, defined at @SDL3\/SDL_video.h 2705:34@
+sDL_SetWindowOpacity :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CFloat -> IO BG.CBool)
+sDL_SetWindowOpacity =
+  BG.unsafePerformIO hs_bindgen_0e865d00ef5cb4eb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowOpacity@
+foreign import ccall unsafe "hs_bindgen_fd15ea94ae6c8654"
+  hs_bindgen_fd15ea94ae6c8654_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowOpacity@
+hs_bindgen_fd15ea94ae6c8654 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CFloat))
+hs_bindgen_fd15ea94ae6c8654 =
+  BG.fromFFIType hs_bindgen_fd15ea94ae6c8654_base
+
+{-# NOINLINE sDL_GetWindowOpacity #-}
+
+-- | Get the opacity of a window.
+--
+--     If transparency isn\'t supported on this platform, opacity will be returned as 1.0f without error.
+--
+--     [@window@]: the window to get the current opacity value from.
+--
+--     [Returns]: the opacity, (0.0f - transparent, 1.0f - opaque), or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowOpacity'
+--
+--     [C declaration]: @SDL_GetWindowOpacity@, defined at @SDL3\/SDL_video.h 2723:35@
+sDL_GetWindowOpacity :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CFloat)
+sDL_GetWindowOpacity =
+  BG.unsafePerformIO hs_bindgen_fd15ea94ae6c8654
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowParent@
+foreign import ccall unsafe "hs_bindgen_da11824c9c49e3e7"
+  hs_bindgen_da11824c9c49e3e7_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowParent@
+hs_bindgen_da11824c9c49e3e7
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_da11824c9c49e3e7 =
+  BG.fromFFIType hs_bindgen_da11824c9c49e3e7_base
+
+{-# NOINLINE sDL_SetWindowParent #-}
+
+-- | Set the window as a child of a parent window.
+--
+--     If the window is already the child of an existing window, it will be reparented to the new owner. Setting the parent window to NULL unparents the window and removes child window status.
+--
+--     If a parent window is hidden or destroyed, the operation will be recursively applied to child windows. Child windows hidden with the parent that did not have their hidden status explicitly set will be restored when the parent is shown.
+--
+--     Attempting to set the parent of a window that is currently in the modal state will fail. Use @SDL_SetWindowModal()@ to cancel the modal status before attempting to change the parent.
+--
+--     Popup windows cannot change parents and attempts to do so will fail.
+--
+--     Setting a parent window that is currently the sibling or descendent of the child window results in undefined behavior.
+--
+--     [@window@]: the window that should become the child of a parent.
+--
+--     [@parent@]: the new parent window for the child window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowModal'
+--
+--     [C declaration]: @SDL_SetWindowParent@, defined at @SDL3\/SDL_video.h 2757:34@
+sDL_SetWindowParent :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_SetWindowParent =
+  BG.unsafePerformIO hs_bindgen_da11824c9c49e3e7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowModal@
+foreign import ccall unsafe "hs_bindgen_9c2f4466a2e12383"
+  hs_bindgen_9c2f4466a2e12383_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowModal@
+hs_bindgen_9c2f4466a2e12383 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool))
+hs_bindgen_9c2f4466a2e12383 =
+  BG.fromFFIType hs_bindgen_9c2f4466a2e12383_base
+
+{-# NOINLINE sDL_SetWindowModal #-}
+
+-- | Toggle the state of the window as modal.
+--
+--     To enable modal status on a window, the window must currently be the child window of a parent, or toggling modal status on will fail.
+--
+--     [@window@]: the window on which to set the modal state.
+--
+--     [@modal@]: true to toggle modal status on, false to toggle it off.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowParent', @SDL_WINDOW_MODAL@
+--
+--     [C declaration]: @SDL_SetWindowModal@, defined at @SDL3\/SDL_video.h 2777:34@
+sDL_SetWindowModal :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool)
+sDL_SetWindowModal =
+  BG.unsafePerformIO hs_bindgen_9c2f4466a2e12383
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFocusable@
+foreign import ccall unsafe "hs_bindgen_61fa950af6d7c2e1"
+  hs_bindgen_61fa950af6d7c2e1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowFocusable@
+hs_bindgen_61fa950af6d7c2e1 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool))
+hs_bindgen_61fa950af6d7c2e1 =
+  BG.fromFFIType hs_bindgen_61fa950af6d7c2e1_base
+
+{-# NOINLINE sDL_SetWindowFocusable #-}
+
+-- | Set whether the window may have input focus.
+--
+--     [@window@]: the window to set focusable state.
+--
+--     [@focusable@]: true to allow input focus, false to not allow input focus.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetWindowFocusable@, defined at @SDL3\/SDL_video.h 2791:34@
+sDL_SetWindowFocusable :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CBool -> IO BG.CBool)
+sDL_SetWindowFocusable =
+  BG.unsafePerformIO hs_bindgen_61fa950af6d7c2e1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_ShowWindowSystemMenu@
+foreign import ccall unsafe "hs_bindgen_cd482a252a1dea04"
+  hs_bindgen_cd482a252a1dea04_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_ShowWindowSystemMenu@
+hs_bindgen_cd482a252a1dea04
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> BG.CInt -> IO BG.CBool))
+hs_bindgen_cd482a252a1dea04 =
+  BG.fromFFIType hs_bindgen_cd482a252a1dea04_base
+
+{-# NOINLINE sDL_ShowWindowSystemMenu #-}
+
+-- | Display the system-level window menu.
+--
+--     This default window menu is provided by the system and on some platforms provides functionality for setting or changing privileged state on the window, such as moving it between workspaces or displays, or toggling the always-on-top property.
+--
+--     On platforms or desktops where this is unsupported, this function does nothing.
+--
+--     [@window@]: the window for which the menu will be displayed.
+--
+--     [@x@]: the x coordinate of the menu, relative to the origin (top-left) of the client area.
+--
+--     [@y@]: the y coordinate of the menu, relative to the origin (top-left) of the client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ShowWindowSystemMenu@, defined at @SDL3\/SDL_video.h 2817:34@
+sDL_ShowWindowSystemMenu :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CInt -> BG.CInt -> IO BG.CBool)
+sDL_ShowWindowSystemMenu =
+  BG.unsafePerformIO hs_bindgen_cd482a252a1dea04
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowHitTest@
+foreign import ccall unsafe "hs_bindgen_d2a7a11a0da70b01"
+  hs_bindgen_d2a7a11a0da70b01_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowHitTest@
+hs_bindgen_d2a7a11a0da70b01
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> SDL_HitTest -> BG.Ptr BG.Void -> IO BG.CBool))
+hs_bindgen_d2a7a11a0da70b01 =
+  BG.fromFFIType hs_bindgen_d2a7a11a0da70b01_base
+
+{-# NOINLINE sDL_SetWindowHitTest #-}
+
+-- | Provide a callback that decides if a window region has special properties.
+--
+--     Normally windows are dragged and resized by decorations provided by the system window manager (a title bar, borders, etc), but for some apps, it makes sense to drag them from somewhere else inside the window itself; for example, one might have a borderless window that wants to be draggable from any part, or simulate its own title bar, etc.
+--
+--     This function lets the app provide a callback that designates pieces of a given window as special. This callback is run during event processing if we need to tell the OS to treat a region of the window specially; the use of this callback is known as \"hit testing.\"
+--
+--     Mouse input may not be delivered to your application if it is within a special area; the OS will often apply that input to moving the window or resizing the window and not deliver it to the application.
+--
+--     Specifying NULL for a callback disables hit-testing. Hit-testing is disabled by default.
+--
+--     Platforms that don\'t support this functionality will return false unconditionally, even if you\'re attempting to disable hit-testing.
+--
+--     Your callback may fire at any time, and its firing does not indicate any specific behavior (for example, on Windows, this certainly might fire when the OS is deciding whether to drag your window, but it fires for lots of other reasons, too, some unrelated to anything you probably care about /and when the mouse isn\'t actually at the location it is testing/). Since this can fire at any time, you should try to keep your callback efficient, devoid of allocations, etc.
+--
+--     [@window@]: the window to set hit-testing on.
+--
+--     [@callback@]: the function to call when doing a hit-test.
+--
+--     [@callback_data@]: an app-defined void pointer passed to __callback__.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetWindowHitTest@, defined at @SDL3\/SDL_video.h 2898:34@
+sDL_SetWindowHitTest
+  :: BG.FunPtr (BG.Ptr SDL_Window -> SDL_HitTest -> BG.Ptr BG.Void -> IO BG.CBool)
+sDL_SetWindowHitTest =
+  BG.unsafePerformIO hs_bindgen_d2a7a11a0da70b01
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowShape@
+foreign import ccall unsafe "hs_bindgen_3067f5f277541798"
+  hs_bindgen_3067f5f277541798_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowShape@
+hs_bindgen_3067f5f277541798
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO BG.CBool))
+hs_bindgen_3067f5f277541798 =
+  BG.fromFFIType hs_bindgen_3067f5f277541798_base
+
+{-# NOINLINE sDL_SetWindowShape #-}
+
+-- | Set the shape of a transparent window.
+--
+--     This sets the alpha channel of a transparent window and any fully transparent areas are also transparent to mouse clicks. If you are using something besides the SDL render API, then you are responsible for drawing the alpha channel of the window to match the shape alpha channel to get consistent cross-platform results.
+--
+--     The shape is copied inside this function, so you can free it afterwards. If your shape surface changes, you should call @SDL_SetWindowShape()@ again to update the window. This is an expensive operation, so should be done sparingly.
+--
+--     The window must have been created with the SDL_WINDOW_TRANSPARENT flag.
+--
+--     [@window@]: the window.
+--
+--     [@shape@]: the surface representing the shape of the window, or NULL to remove any current shape.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetWindowShape@, defined at @SDL3\/SDL_video.h 2926:34@
+sDL_SetWindowShape
+  :: BG.FunPtr (BG.Ptr SDL_Window -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface -> IO BG.CBool)
+sDL_SetWindowShape =
+  BG.unsafePerformIO hs_bindgen_3067f5f277541798
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_FlashWindow@
+foreign import ccall unsafe "hs_bindgen_7accb263b1f5da86"
+  hs_bindgen_7accb263b1f5da86_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_FlashWindow@
+hs_bindgen_7accb263b1f5da86
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> SDL_FlashOperation -> IO BG.CBool))
+hs_bindgen_7accb263b1f5da86 =
+  BG.fromFFIType hs_bindgen_7accb263b1f5da86_base
+
+{-# NOINLINE sDL_FlashWindow #-}
+
+-- | Request a window to demand attention from the user.
+--
+--     [@window@]: the window to be flashed.
+--
+--     [@operation@]: the operation to perform.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_FlashWindow@, defined at @SDL3\/SDL_video.h 2940:34@
+sDL_FlashWindow :: BG.FunPtr (BG.Ptr SDL_Window -> SDL_FlashOperation -> IO BG.CBool)
+sDL_FlashWindow =
+  BG.unsafePerformIO hs_bindgen_7accb263b1f5da86
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowProgressState@
+foreign import ccall unsafe "hs_bindgen_9c2c63ad5f7e2b4b"
+  hs_bindgen_9c2c63ad5f7e2b4b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowProgressState@
+hs_bindgen_9c2c63ad5f7e2b4b
+  :: IO (BG.FunPtr (BG.Ptr SDL_Window -> SDL_ProgressState -> IO BG.CBool))
+hs_bindgen_9c2c63ad5f7e2b4b =
+  BG.fromFFIType hs_bindgen_9c2c63ad5f7e2b4b_base
+
+{-# NOINLINE sDL_SetWindowProgressState #-}
+
+-- | Sets the state of the progress bar for the given window’s taskbar icon.
+--
+--     [@window@]: the window whose progress state is to be modified.
+--
+--     [@state@]: the progress state. @SDL_PROGRESS_STATE_NONE@ stops displaying the progress bar.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetWindowProgressState@, defined at @SDL3\/SDL_video.h 2955:34@
+sDL_SetWindowProgressState :: BG.FunPtr (BG.Ptr SDL_Window -> SDL_ProgressState -> IO BG.CBool)
+sDL_SetWindowProgressState =
+  BG.unsafePerformIO hs_bindgen_9c2c63ad5f7e2b4b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowProgressState@
+foreign import ccall unsafe "hs_bindgen_3c97888e379fc33c"
+  hs_bindgen_3c97888e379fc33c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowProgressState@
+hs_bindgen_3c97888e379fc33c :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_ProgressState))
+hs_bindgen_3c97888e379fc33c =
+  BG.fromFFIType hs_bindgen_3c97888e379fc33c_base
+
+{-# NOINLINE sDL_GetWindowProgressState #-}
+
+-- | Get the state of the progress bar for the given window’s taskbar icon.
+--
+--     [@window@]: the window to get the current progress state from.
+--
+--     [Returns]: the progress state, or @SDL_PROGRESS_STATE_INVALID@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetWindowProgressState@, defined at @SDL3\/SDL_video.h 2968:47@
+sDL_GetWindowProgressState :: BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_ProgressState)
+sDL_GetWindowProgressState =
+  BG.unsafePerformIO hs_bindgen_3c97888e379fc33c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowProgressValue@
+foreign import ccall unsafe "hs_bindgen_df10903c71d955ff"
+  hs_bindgen_df10903c71d955ff_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_SetWindowProgressValue@
+hs_bindgen_df10903c71d955ff :: IO (BG.FunPtr (BG.Ptr SDL_Window -> BG.CFloat -> IO BG.CBool))
+hs_bindgen_df10903c71d955ff =
+  BG.fromFFIType hs_bindgen_df10903c71d955ff_base
+
+{-# NOINLINE sDL_SetWindowProgressValue #-}
+
+-- | Sets the value of the progress bar for the given window’s taskbar icon.
+--
+--     [@window@]: the window whose progress value is to be modified.
+--
+--     [@value@]: the progress value in the range of [0.0f - 1.0f]. If the value is outside the valid range, it gets clamped.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetWindowProgressValue@, defined at @SDL3\/SDL_video.h 2983:34@
+sDL_SetWindowProgressValue :: BG.FunPtr (BG.Ptr SDL_Window -> BG.CFloat -> IO BG.CBool)
+sDL_SetWindowProgressValue =
+  BG.unsafePerformIO hs_bindgen_df10903c71d955ff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowProgressValue@
+foreign import ccall unsafe "hs_bindgen_1e0d101b30846cb1"
+  hs_bindgen_1e0d101b30846cb1_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GetWindowProgressValue@
+hs_bindgen_1e0d101b30846cb1 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CFloat))
+hs_bindgen_1e0d101b30846cb1 =
+  BG.fromFFIType hs_bindgen_1e0d101b30846cb1_base
+
+{-# NOINLINE sDL_GetWindowProgressValue #-}
+
+-- | Get the value of the progress bar for the given window’s taskbar icon.
+--
+--     [@window@]: the window to get the current progress value from.
+--
+--     [Returns]: the progress value in the range of [0.0f - 1.0f], or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetWindowProgressValue@, defined at @SDL3\/SDL_video.h 2996:35@
+sDL_GetWindowProgressValue :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CFloat)
+sDL_GetWindowProgressValue =
+  BG.unsafePerformIO hs_bindgen_1e0d101b30846cb1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_DestroyWindow@
+foreign import ccall unsafe "hs_bindgen_3af09b929d2d36ab"
+  hs_bindgen_3af09b929d2d36ab_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_DestroyWindow@
+hs_bindgen_3af09b929d2d36ab :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO ()))
+hs_bindgen_3af09b929d2d36ab =
+  BG.fromFFIType hs_bindgen_3af09b929d2d36ab_base
+
+{-# NOINLINE sDL_DestroyWindow #-}
+
+-- | Destroy a window.
+--
+--     Any child windows owned by the window will be recursively destroyed as well.
+--
+--     Note that on some platforms, the visible window may not actually be removed from the screen until the SDL event loop is pumped again, even though the 'SDL_Window' is no longer valid after this call.
+--
+--     [@window@]: the window to destroy.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreatePopupWindow', 'sDL_CreateWindow', 'sDL_CreateWindowWithProperties'
+--
+--     [C declaration]: @SDL_DestroyWindow@, defined at @SDL3\/SDL_video.h 3018:34@
+sDL_DestroyWindow :: BG.FunPtr (BG.Ptr SDL_Window -> IO ())
+sDL_DestroyWindow =
+  BG.unsafePerformIO hs_bindgen_3af09b929d2d36ab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_ScreenSaverEnabled@
+foreign import ccall unsafe "hs_bindgen_91298d9810095c05"
+  hs_bindgen_91298d9810095c05_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_ScreenSaverEnabled@
+hs_bindgen_91298d9810095c05 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_91298d9810095c05 =
+  BG.fromFFIType hs_bindgen_91298d9810095c05_base
+
+{-# NOINLINE sDL_ScreenSaverEnabled #-}
+
+-- | Check whether the screensaver is currently enabled.
+--
+--     The screensaver is disabled by default.
+--
+--     The default can also be changed using @SDL_HINT_VIDEO_ALLOW_SCREENSAVER@.
+--
+--     [Returns]: true if the screensaver is enabled, false if it is disabled.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DisableScreenSaver', 'sDL_EnableScreenSaver'
+--
+--     [C declaration]: @SDL_ScreenSaverEnabled@, defined at @SDL3\/SDL_video.h 3037:34@
+sDL_ScreenSaverEnabled :: BG.FunPtr (IO BG.CBool)
+sDL_ScreenSaverEnabled =
+  BG.unsafePerformIO hs_bindgen_91298d9810095c05
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EnableScreenSaver@
+foreign import ccall unsafe "hs_bindgen_a142225724865b93"
+  hs_bindgen_a142225724865b93_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EnableScreenSaver@
+hs_bindgen_a142225724865b93 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_a142225724865b93 =
+  BG.fromFFIType hs_bindgen_a142225724865b93_base
+
+{-# NOINLINE sDL_EnableScreenSaver #-}
+
+-- | Allow the screen to be blanked by a screen saver.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DisableScreenSaver', 'sDL_ScreenSaverEnabled'
+--
+--     [C declaration]: @SDL_EnableScreenSaver@, defined at @SDL3\/SDL_video.h 3052:34@
+sDL_EnableScreenSaver :: BG.FunPtr (IO BG.CBool)
+sDL_EnableScreenSaver =
+  BG.unsafePerformIO hs_bindgen_a142225724865b93
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_DisableScreenSaver@
+foreign import ccall unsafe "hs_bindgen_96e0130db8c924c0"
+  hs_bindgen_96e0130db8c924c0_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_DisableScreenSaver@
+hs_bindgen_96e0130db8c924c0 :: IO (BG.FunPtr (IO BG.CBool))
+hs_bindgen_96e0130db8c924c0 =
+  BG.fromFFIType hs_bindgen_96e0130db8c924c0_base
+
+{-# NOINLINE sDL_DisableScreenSaver #-}
+
+-- | Prevent the screen from being blanked by a screen saver.
+--
+--     If you disable the screensaver, it is automatically re-enabled when SDL quits.
+--
+--     The screensaver is disabled by default, but this may by changed by SDL_HINT_VIDEO_ALLOW_SCREENSAVER.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EnableScreenSaver', 'sDL_ScreenSaverEnabled'
+--
+--     [C declaration]: @SDL_DisableScreenSaver@, defined at @SDL3\/SDL_video.h 3073:34@
+sDL_DisableScreenSaver :: BG.FunPtr (IO BG.CBool)
+sDL_DisableScreenSaver =
+  BG.unsafePerformIO hs_bindgen_96e0130db8c924c0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_LoadLibrary@
+foreign import ccall unsafe "hs_bindgen_eab5183eb86cd104"
+  hs_bindgen_eab5183eb86cd104_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_LoadLibrary@
+hs_bindgen_eab5183eb86cd104 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_eab5183eb86cd104 =
+  BG.fromFFIType hs_bindgen_eab5183eb86cd104_base
+
+{-# NOINLINE sDL_GL_LoadLibrary #-}
+
+-- | Dynamically load an OpenGL library.
+--
+--     This should be done after initializing the video driver, but before creating any OpenGL windows. If no OpenGL library is loaded, the default library will be loaded upon creation of the first OpenGL window.
+--
+--     If you do this, you need to retrieve all of the GL functions used in your program from the dynamic library using @SDL_GL_GetProcAddress()@.
+--
+--     [@path@]: the platform dependent OpenGL library name, or NULL to open the default OpenGL library.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_GetProcAddress', 'sDL_GL_UnloadLibrary'
+--
+--     [C declaration]: @SDL_GL_LoadLibrary@, defined at @SDL3\/SDL_video.h 3103:34@
+sDL_GL_LoadLibrary :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_GL_LoadLibrary =
+  BG.unsafePerformIO hs_bindgen_eab5183eb86cd104
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetProcAddress@
+foreign import ccall unsafe "hs_bindgen_34476455b181778b"
+  hs_bindgen_34476455b181778b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetProcAddress@
+hs_bindgen_34476455b181778b
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer))
+hs_bindgen_34476455b181778b =
+  BG.fromFFIType hs_bindgen_34476455b181778b_base
+
+{-# NOINLINE sDL_GL_GetProcAddress #-}
+
+-- | Get an OpenGL function by name.
+--
+--     If the GL library is loaded at runtime with @SDL_GL_LoadLibrary()@, then all GL functions must be retrieved this way. Usually this is used to retrieve function pointers to OpenGL extensions.
+--
+--     There are some quirks to looking up OpenGL functions that require some extra care from the application. If you code carefully, you can handle these quirks without any platform-specific code, though:
+--
+--     * On Windows, function pointers are specific to the current GL context; this means you need to have created a GL context and made it current before calling @SDL_GL_GetProcAddress()@. If you recreate your context or create a second context, you should assume that any existing function pointers aren\'t valid to use with it. This is (currently) a Windows-specific limitation, and in practice lots of drivers don\'t suffer this limitation, but it is still the way the wgl API is documented to work and you should expect crashes if you don\'t respect it. Store a copy of the function pointers that comes and goes with context lifespan.
+--
+--     * On X11, function pointers returned by this function are valid for any context, and can even be looked up before a context is created at all. This means that, for at least some common OpenGL implementations, if you look up a function that doesn\'t exist, you\'ll get a non-NULL result that is /NOT/ safe to call. You must always make sure the function is actually available for a given GL context before calling it, by checking for the existence of the appropriate extension with @SDL_GL_ExtensionSupported()@, or verifying that the version of OpenGL you\'re using offers the function as core functionality.
+--
+--     * Some OpenGL drivers, on all platforms, /will/ return NULL if a function isn\'t supported, but you can\'t count on this behavior. Check for extensions you use, and if you get a NULL anyway, act as if that extension wasn\'t available. This is probably a bug in the driver, but you can code defensively for this scenario anyhow.
+--
+--     * Just because you\'re on Linux\/Unix, don\'t assume you\'ll be using X11. Next-gen display servers are waiting to replace it, and may or may not make the same promises about function pointers.
+--
+--     * OpenGL function pointers must be declared @APIENTRY@ as in the example code. This will ensure the proper calling convention is followed on platforms where this matters (Win32) thereby avoiding stack corruption.
+--
+--     [@proc@]: the name of an OpenGL function.
+--
+--     [Returns]: a pointer to the named OpenGL function. The returned pointer should be cast to the appropriate function signature.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_ExtensionSupported', 'sDL_GL_LoadLibrary', 'sDL_GL_UnloadLibrary'
+--
+--     [C declaration]: @SDL_GL_GetProcAddress@, defined at @SDL3\/SDL_video.h 3158:49@
+sDL_GL_GetProcAddress
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer)
+sDL_GL_GetProcAddress =
+  BG.unsafePerformIO hs_bindgen_34476455b181778b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetProcAddress@
+foreign import ccall unsafe "hs_bindgen_b7365d91417dcc00"
+  hs_bindgen_b7365d91417dcc00_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetProcAddress@
+hs_bindgen_b7365d91417dcc00
+  :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer))
+hs_bindgen_b7365d91417dcc00 =
+  BG.fromFFIType hs_bindgen_b7365d91417dcc00_base
+
+{-# NOINLINE sDL_EGL_GetProcAddress #-}
+
+-- | Get an EGL library function by name.
+--
+--     If an EGL library is loaded, this function allows applications to get entry points for EGL functions. This is useful to provide to an EGL API and extension loader.
+--
+--     [@proc@]: the name of an EGL function.
+--
+--     [Returns]: a pointer to the named EGL function. The returned pointer should be cast to the appropriate function signature.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EGL_GetCurrentDisplay'
+--
+--     [C declaration]: @SDL_EGL_GetProcAddress@, defined at @SDL3\/SDL_video.h 3177:49@
+sDL_EGL_GetProcAddress
+  :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer)
+sDL_EGL_GetProcAddress =
+  BG.unsafePerformIO hs_bindgen_b7365d91417dcc00
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_UnloadLibrary@
+foreign import ccall unsafe "hs_bindgen_626ee6f51d853cc4"
+  hs_bindgen_626ee6f51d853cc4_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_UnloadLibrary@
+hs_bindgen_626ee6f51d853cc4 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_626ee6f51d853cc4 =
+  BG.fromFFIType hs_bindgen_626ee6f51d853cc4_base
+
+{-# NOINLINE sDL_GL_UnloadLibrary #-}
+
+-- | Unload the OpenGL library previously loaded by @SDL_GL_LoadLibrary()@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_LoadLibrary'
+--
+--     [C declaration]: @SDL_GL_UnloadLibrary@, defined at @SDL3\/SDL_video.h 3188:34@
+sDL_GL_UnloadLibrary :: BG.FunPtr (IO ())
+sDL_GL_UnloadLibrary =
+  BG.unsafePerformIO hs_bindgen_626ee6f51d853cc4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_ExtensionSupported@
+foreign import ccall unsafe "hs_bindgen_4b6ac25f9c74898b"
+  hs_bindgen_4b6ac25f9c74898b_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_ExtensionSupported@
+hs_bindgen_4b6ac25f9c74898b :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_4b6ac25f9c74898b =
+  BG.fromFFIType hs_bindgen_4b6ac25f9c74898b_base
+
+{-# NOINLINE sDL_GL_ExtensionSupported #-}
+
+-- | Check if an OpenGL extension is supported for the current context.
+--
+--     This function operates on the current GL context; you must have created a context and it must be current before calling this function. Do not assume that all contexts you create will have the same set of extensions available, or that recreating an existing context will offer the same extensions again.
+--
+--     While it\'s probably not a massive overhead, this function is not an O(1) operation. Check the extensions you care about after creating the GL context and save that information somewhere instead of calling the function every time you need to know.
+--
+--     [@extension@]: the name of the extension to check.
+--
+--     [Returns]: true if the extension is supported, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GL_ExtensionSupported@, defined at @SDL3\/SDL_video.h 3211:34@
+sDL_GL_ExtensionSupported :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_GL_ExtensionSupported =
+  BG.unsafePerformIO hs_bindgen_4b6ac25f9c74898b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_ResetAttributes@
+foreign import ccall unsafe "hs_bindgen_8d3172eec8730621"
+  hs_bindgen_8d3172eec8730621_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_ResetAttributes@
+hs_bindgen_8d3172eec8730621 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_8d3172eec8730621 =
+  BG.fromFFIType hs_bindgen_8d3172eec8730621_base
+
+{-# NOINLINE sDL_GL_ResetAttributes #-}
+
+-- | Reset all previously set OpenGL context attributes to their default values.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_GetAttribute', 'sDL_GL_SetAttribute'
+--
+--     [C declaration]: @SDL_GL_ResetAttributes@, defined at @SDL3\/SDL_video.h 3223:34@
+sDL_GL_ResetAttributes :: BG.FunPtr (IO ())
+sDL_GL_ResetAttributes =
+  BG.unsafePerformIO hs_bindgen_8d3172eec8730621
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_SetAttribute@
+foreign import ccall unsafe "hs_bindgen_2c780ec7126f44cf"
+  hs_bindgen_2c780ec7126f44cf_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_SetAttribute@
+hs_bindgen_2c780ec7126f44cf :: IO (BG.FunPtr (SDL_GLAttr -> BG.CInt -> IO BG.CBool))
+hs_bindgen_2c780ec7126f44cf =
+  BG.fromFFIType hs_bindgen_2c780ec7126f44cf_base
+
+{-# NOINLINE sDL_GL_SetAttribute #-}
+
+-- | Set an OpenGL window attribute before window creation.
+--
+--     This function sets the OpenGL attribute @attr@ to @value@. The requested attributes should be set before creating an OpenGL window. You should use @SDL_GL_GetAttribute()@ to check the values after creating the OpenGL context, since the values obtained can differ from the requested ones.
+--
+--     [@attr@]: an enum value specifying the OpenGL attribute to set.
+--
+--     [@value@]: the desired value for the attribute.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_CreateContext', 'sDL_GL_GetAttribute', 'sDL_GL_ResetAttributes'
+--
+--     [C declaration]: @SDL_GL_SetAttribute@, defined at @SDL3\/SDL_video.h 3246:34@
+sDL_GL_SetAttribute :: BG.FunPtr (SDL_GLAttr -> BG.CInt -> IO BG.CBool)
+sDL_GL_SetAttribute =
+  BG.unsafePerformIO hs_bindgen_2c780ec7126f44cf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetAttribute@
+foreign import ccall unsafe "hs_bindgen_f2be9d4ead0d65a2"
+  hs_bindgen_f2be9d4ead0d65a2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetAttribute@
+hs_bindgen_f2be9d4ead0d65a2 :: IO (BG.FunPtr (SDL_GLAttr -> BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_f2be9d4ead0d65a2 =
+  BG.fromFFIType hs_bindgen_f2be9d4ead0d65a2_base
+
+{-# NOINLINE sDL_GL_GetAttribute #-}
+
+-- | Get the actual value for an attribute from the current context.
+--
+--     [@attr@]: an 'SDL_GLAttr' enum value specifying the OpenGL attribute to get.
+--
+--     [@value@]: a pointer filled in with the current value of @attr@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_ResetAttributes', 'sDL_GL_SetAttribute'
+--
+--     [C declaration]: @SDL_GL_GetAttribute@, defined at @SDL3\/SDL_video.h 3264:34@
+sDL_GL_GetAttribute :: BG.FunPtr (SDL_GLAttr -> BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GL_GetAttribute =
+  BG.unsafePerformIO hs_bindgen_f2be9d4ead0d65a2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_CreateContext@
+foreign import ccall unsafe "hs_bindgen_9f1f69477c4acb50"
+  hs_bindgen_9f1f69477c4acb50_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_CreateContext@
+hs_bindgen_9f1f69477c4acb50 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_GLContext))
+hs_bindgen_9f1f69477c4acb50 =
+  BG.fromFFIType hs_bindgen_9f1f69477c4acb50_base
+
+{-# NOINLINE sDL_GL_CreateContext #-}
+
+-- | Create an OpenGL context for an OpenGL window, and make it current.
+--
+--     The OpenGL context will be created with the current states set through @SDL_GL_SetAttribute()@.
+--
+--     The 'SDL_Window' specified must have been created with the SDL_WINDOW_OPENGL flag, or context creation will fail.
+--
+--     Windows users new to OpenGL should note that, for historical reasons, GL functions added after OpenGL version 1.1 are not available by default. Those functions must be loaded at run-time, either with an OpenGL extension-handling library or with @SDL_GL_GetProcAddress()@ and its related functions.
+--
+--     'SDL_GLContext' is opaque to the application.
+--
+--     [@window@]: the window to associate with the context.
+--
+--     [Returns]: the OpenGL context associated with @window@ or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_DestroyContext', 'sDL_GL_MakeCurrent'
+--
+--     [C declaration]: @SDL_GL_CreateContext@, defined at @SDL3\/SDL_video.h 3294:43@
+sDL_GL_CreateContext :: BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_GLContext)
+sDL_GL_CreateContext =
+  BG.unsafePerformIO hs_bindgen_9f1f69477c4acb50
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_MakeCurrent@
+foreign import ccall unsafe "hs_bindgen_2336de6c69b02847"
+  hs_bindgen_2336de6c69b02847_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_MakeCurrent@
+hs_bindgen_2336de6c69b02847 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> SDL_GLContext -> IO BG.CBool))
+hs_bindgen_2336de6c69b02847 =
+  BG.fromFFIType hs_bindgen_2336de6c69b02847_base
+
+{-# NOINLINE sDL_GL_MakeCurrent #-}
+
+-- | Set up an OpenGL context for rendering into an OpenGL window.
+--
+--     The context must have been created with a compatible window.
+--
+--     [@window@]: the window to associate with the context.
+--
+--     [@context@]: the OpenGL context to associate with the window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_CreateContext'
+--
+--     [C declaration]: @SDL_GL_MakeCurrent@, defined at @SDL3\/SDL_video.h 3312:34@
+sDL_GL_MakeCurrent :: BG.FunPtr (BG.Ptr SDL_Window -> SDL_GLContext -> IO BG.CBool)
+sDL_GL_MakeCurrent =
+  BG.unsafePerformIO hs_bindgen_2336de6c69b02847
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetCurrentWindow@
+foreign import ccall unsafe "hs_bindgen_1d77b3c33533bc52"
+  hs_bindgen_1d77b3c33533bc52_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetCurrentWindow@
+hs_bindgen_1d77b3c33533bc52 :: IO (BG.FunPtr (IO (BG.Ptr SDL_Window)))
+hs_bindgen_1d77b3c33533bc52 =
+  BG.fromFFIType hs_bindgen_1d77b3c33533bc52_base
+
+{-# NOINLINE sDL_GL_GetCurrentWindow #-}
+
+-- | Get the currently active OpenGL window.
+--
+--     [Returns]: the currently active OpenGL window on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GL_GetCurrentWindow@, defined at @SDL3\/SDL_video.h 3324:42@
+sDL_GL_GetCurrentWindow :: BG.FunPtr (IO (BG.Ptr SDL_Window))
+sDL_GL_GetCurrentWindow =
+  BG.unsafePerformIO hs_bindgen_1d77b3c33533bc52
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetCurrentContext@
+foreign import ccall unsafe "hs_bindgen_70929e076db9af7f"
+  hs_bindgen_70929e076db9af7f_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetCurrentContext@
+hs_bindgen_70929e076db9af7f :: IO (BG.FunPtr (IO SDL_GLContext))
+hs_bindgen_70929e076db9af7f =
+  BG.fromFFIType hs_bindgen_70929e076db9af7f_base
+
+{-# NOINLINE sDL_GL_GetCurrentContext #-}
+
+-- | Get the currently active OpenGL context.
+--
+--     [Returns]: the currently active OpenGL context or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_MakeCurrent'
+--
+--     [C declaration]: @SDL_GL_GetCurrentContext@, defined at @SDL3\/SDL_video.h 3338:43@
+sDL_GL_GetCurrentContext :: BG.FunPtr (IO SDL_GLContext)
+sDL_GL_GetCurrentContext =
+  BG.unsafePerformIO hs_bindgen_70929e076db9af7f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetCurrentDisplay@
+foreign import ccall unsafe "hs_bindgen_ad8ff3579d19bf4c"
+  hs_bindgen_ad8ff3579d19bf4c_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetCurrentDisplay@
+hs_bindgen_ad8ff3579d19bf4c :: IO (BG.FunPtr (IO SDL_EGLDisplay))
+hs_bindgen_ad8ff3579d19bf4c =
+  BG.fromFFIType hs_bindgen_ad8ff3579d19bf4c_base
+
+{-# NOINLINE sDL_EGL_GetCurrentDisplay #-}
+
+-- | Get the currently active EGL display.
+--
+--     [Returns]: the currently active EGL display or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_GetCurrentDisplay@, defined at @SDL3\/SDL_video.h 3350:44@
+sDL_EGL_GetCurrentDisplay :: BG.FunPtr (IO SDL_EGLDisplay)
+sDL_EGL_GetCurrentDisplay =
+  BG.unsafePerformIO hs_bindgen_ad8ff3579d19bf4c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetCurrentConfig@
+foreign import ccall unsafe "hs_bindgen_52c08e8d53d84085"
+  hs_bindgen_52c08e8d53d84085_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetCurrentConfig@
+hs_bindgen_52c08e8d53d84085 :: IO (BG.FunPtr (IO SDL_EGLConfig))
+hs_bindgen_52c08e8d53d84085 =
+  BG.fromFFIType hs_bindgen_52c08e8d53d84085_base
+
+{-# NOINLINE sDL_EGL_GetCurrentConfig #-}
+
+-- | Get the currently active EGL config.
+--
+--     [Returns]: the currently active EGL config or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_GetCurrentConfig@, defined at @SDL3\/SDL_video.h 3362:43@
+sDL_EGL_GetCurrentConfig :: BG.FunPtr (IO SDL_EGLConfig)
+sDL_EGL_GetCurrentConfig =
+  BG.unsafePerformIO hs_bindgen_52c08e8d53d84085
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetWindowSurface@
+foreign import ccall unsafe "hs_bindgen_4d9d3145651703ea"
+  hs_bindgen_4d9d3145651703ea_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_GetWindowSurface@
+hs_bindgen_4d9d3145651703ea :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_EGLSurface))
+hs_bindgen_4d9d3145651703ea =
+  BG.fromFFIType hs_bindgen_4d9d3145651703ea_base
+
+{-# NOINLINE sDL_EGL_GetWindowSurface #-}
+
+-- | Get the EGL surface associated with the window.
+--
+--     [@window@]: the window to query.
+--
+--     [Returns]: the EGLSurface pointer associated with the window, or NULL on failure.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_GetWindowSurface@, defined at @SDL3\/SDL_video.h 3375:44@
+sDL_EGL_GetWindowSurface :: BG.FunPtr (BG.Ptr SDL_Window -> IO SDL_EGLSurface)
+sDL_EGL_GetWindowSurface =
+  BG.unsafePerformIO hs_bindgen_4d9d3145651703ea
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_SetAttributeCallbacks@
+foreign import ccall unsafe "hs_bindgen_2d4a4b5954adbdda"
+  hs_bindgen_2d4a4b5954adbdda_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_EGL_SetAttributeCallbacks@
+hs_bindgen_2d4a4b5954adbdda
+  :: IO
+       ( BG.FunPtr
+           ( SDL_EGLAttribArrayCallback
+             -> SDL_EGLIntArrayCallback
+             -> SDL_EGLIntArrayCallback
+             -> BG.Ptr BG.Void
+             -> IO ()
+           )
+       )
+hs_bindgen_2d4a4b5954adbdda =
+  BG.fromFFIType hs_bindgen_2d4a4b5954adbdda_base
+
+{-# NOINLINE sDL_EGL_SetAttributeCallbacks #-}
+
+-- | Sets the callbacks for defining custom EGLAttrib arrays for EGL initialization.
+--
+--     Callbacks that aren\'t needed can be set to NULL.
+--
+--     NOTE: These callback pointers will be reset after SDL_GL_ResetAttributes.
+--
+--     [@platformAttribCallback@]: callback for attributes to pass to eglGetPlatformDisplay. May be NULL.
+--
+--     [@surfaceAttribCallback@]: callback for attributes to pass to eglCreateSurface. May be NULL.
+--
+--     [@contextAttribCallback@]: callback for attributes to pass to eglCreateContext. May be NULL.
+--
+--     [@userdata@]: a pointer that is passed to the callbacks.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_SetAttributeCallbacks@, defined at @SDL3\/SDL_video.h 3397:34@
+sDL_EGL_SetAttributeCallbacks
+  :: BG.FunPtr
+       ( SDL_EGLAttribArrayCallback
+         -> SDL_EGLIntArrayCallback
+         -> SDL_EGLIntArrayCallback
+         -> BG.Ptr BG.Void
+         -> IO ()
+       )
+sDL_EGL_SetAttributeCallbacks =
+  BG.unsafePerformIO hs_bindgen_2d4a4b5954adbdda
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_SetSwapInterval@
+foreign import ccall unsafe "hs_bindgen_61901cbd29279d80"
+  hs_bindgen_61901cbd29279d80_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_SetSwapInterval@
+hs_bindgen_61901cbd29279d80 :: IO (BG.FunPtr (BG.CInt -> IO BG.CBool))
+hs_bindgen_61901cbd29279d80 =
+  BG.fromFFIType hs_bindgen_61901cbd29279d80_base
+
+{-# NOINLINE sDL_GL_SetSwapInterval #-}
+
+-- | Set the swap interval for the current OpenGL context.
+--
+--     Some systems allow specifying -1 for the interval, to enable adaptive vsync. Adaptive vsync works the same as vsync, but if you\'ve already missed the vertical retrace for a given frame, it swaps buffers immediately, which might be less jarring for the user during occasional framerate drops. If an application requests adaptive vsync and the system does not support it, this function will fail and return false. In such a case, you should probably retry the call with 1 for the interval.
+--
+--     Adaptive vsync is implemented for some glX drivers with GLX_EXT_swap_control_tear, and for some Windows drivers with WGL_EXT_swap_control_tear.
+--
+--     Read more on the Khronos wiki: [https:\/\/www.khronos.org\/opengl\/wiki\/Swap_Interval\#Adaptive_Vsync](https://www.khronos.org/opengl/wiki/Swap_Interval#Adaptive_Vsync)
+--
+--     [@interval@]: 0 for immediate updates, 1 for updates synchronized with the vertical retrace, -1 for adaptive vsync.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_GetSwapInterval'
+--
+--     [C declaration]: @SDL_GL_SetSwapInterval@, defined at @SDL3\/SDL_video.h 3430:34@
+sDL_GL_SetSwapInterval :: BG.FunPtr (BG.CInt -> IO BG.CBool)
+sDL_GL_SetSwapInterval =
+  BG.unsafePerformIO hs_bindgen_61901cbd29279d80
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetSwapInterval@
+foreign import ccall unsafe "hs_bindgen_2ead7bd70a2b5362"
+  hs_bindgen_2ead7bd70a2b5362_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_GetSwapInterval@
+hs_bindgen_2ead7bd70a2b5362 :: IO (BG.FunPtr (BG.Ptr BG.CInt -> IO BG.CBool))
+hs_bindgen_2ead7bd70a2b5362 =
+  BG.fromFFIType hs_bindgen_2ead7bd70a2b5362_base
+
+{-# NOINLINE sDL_GL_GetSwapInterval #-}
+
+-- | Get the swap interval for the current OpenGL context.
+--
+--     If the system can\'t determine the swap interval, or there isn\'t a valid current context, this function will set *interval to 0 as a safe default.
+--
+--     [@interval@]: output interval value. 0 if there is no vertical retrace synchronization, 1 if the buffer swap is synchronized with the vertical retrace, and -1 if late swaps happen immediately instead of waiting for the next retrace.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_SetSwapInterval'
+--
+--     [C declaration]: @SDL_GL_GetSwapInterval@, defined at @SDL3\/SDL_video.h 3451:34@
+sDL_GL_GetSwapInterval :: BG.FunPtr (BG.Ptr BG.CInt -> IO BG.CBool)
+sDL_GL_GetSwapInterval =
+  BG.unsafePerformIO hs_bindgen_2ead7bd70a2b5362
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_SwapWindow@
+foreign import ccall unsafe "hs_bindgen_21d656c344c13469"
+  hs_bindgen_21d656c344c13469_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_SwapWindow@
+hs_bindgen_21d656c344c13469 :: IO (BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool))
+hs_bindgen_21d656c344c13469 =
+  BG.fromFFIType hs_bindgen_21d656c344c13469_base
+
+{-# NOINLINE sDL_GL_SwapWindow #-}
+
+-- | Update a window with OpenGL rendering.
+--
+--     This is used with double-buffered OpenGL contexts, which are the default.
+--
+--     On macOS, make sure you bind 0 to the draw framebuffer before swapping the window, otherwise nothing will happen. If you aren\'t using glBindFramebuffer(), this is the default and you won\'t have to do anything extra.
+--
+--     [@window@]: the window to change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GL_SwapWindow@, defined at @SDL3\/SDL_video.h 3471:34@
+sDL_GL_SwapWindow :: BG.FunPtr (BG.Ptr SDL_Window -> IO BG.CBool)
+sDL_GL_SwapWindow =
+  BG.unsafePerformIO hs_bindgen_21d656c344c13469
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_DestroyContext@
+foreign import ccall unsafe "hs_bindgen_c03de6ace9ca6264"
+  hs_bindgen_c03de6ace9ca6264_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_get_SDL_GL_DestroyContext@
+hs_bindgen_c03de6ace9ca6264 :: IO (BG.FunPtr (SDL_GLContext -> IO BG.CBool))
+hs_bindgen_c03de6ace9ca6264 =
+  BG.fromFFIType hs_bindgen_c03de6ace9ca6264_base
+
+{-# NOINLINE sDL_GL_DestroyContext #-}
+
+-- | Delete an OpenGL context.
+--
+--     [@context@]: the OpenGL context to be deleted.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_CreateContext'
+--
+--     [C declaration]: @SDL_GL_DestroyContext@, defined at @SDL3\/SDL_video.h 3486:34@
+sDL_GL_DestroyContext :: BG.FunPtr (SDL_GLContext -> IO BG.CBool)
+sDL_GL_DestroyContext =
+  BG.unsafePerformIO hs_bindgen_c03de6ace9ca6264
diff --git a/src/SDL3/Sys/Bindgen/Video/Safe.hs b/src/SDL3/Sys/Bindgen/Video/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Video/Safe.hs
@@ -0,0 +1,5495 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Video.Safe (
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetNumVideoDrivers,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetVideoDriver,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetCurrentVideoDriver,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetSystemTheme,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetDisplays,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetPrimaryDisplay,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetDisplayProperties,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetDisplayName,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetDisplayBounds,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetDisplayUsableBounds,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetNaturalDisplayOrientation,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetCurrentDisplayOrientation,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetDisplayContentScale,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetFullscreenDisplayModes,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetClosestFullscreenDisplayMode,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetDesktopDisplayMode,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetCurrentDisplayMode,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetDisplayForPoint,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetDisplayForRect,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetDisplayForWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowPixelDensity,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowDisplayScale,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowFullscreenMode,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowFullscreenMode,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowICCProfile,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowPixelFormat,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindows,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_CreateWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_CreatePopupWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_CreateWindowWithProperties,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowID,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowFromID,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowParent,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowProperties,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowFlags,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowTitle,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowTitle,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowIcon,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowPosition,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowPosition,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowSize,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowSize,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowSafeArea,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowAspectRatio,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowAspectRatio,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowBordersSize,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowSizeInPixels,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowMinimumSize,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowMinimumSize,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowMaximumSize,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowMaximumSize,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowBordered,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowResizable,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowAlwaysOnTop,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowFillDocument,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_ShowWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_HideWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_RaiseWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_MaximizeWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_MinimizeWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_RestoreWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowFullscreen,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SyncWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_WindowHasSurface,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowSurface,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowSurfaceVSync,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowSurfaceVSync,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_UpdateWindowSurface,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_UpdateWindowSurfaceRects,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_DestroyWindowSurface,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowKeyboardGrab,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowMouseGrab,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowKeyboardGrab,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowMouseGrab,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetGrabbedWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowMouseRect,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowMouseRect,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowOpacity,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowOpacity,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowParent,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowModal,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowFocusable,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_ShowWindowSystemMenu,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowHitTest,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowShape,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_FlashWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowProgressState,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowProgressState,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_SetWindowProgressValue,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GetWindowProgressValue,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_DestroyWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_ScreenSaverEnabled,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_EnableScreenSaver,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_DisableScreenSaver,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_LoadLibrary,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_GetProcAddress,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_EGL_GetProcAddress,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_UnloadLibrary,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_ExtensionSupported,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_ResetAttributes,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_SetAttribute,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_GetAttribute,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_CreateContext,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_MakeCurrent,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_GetCurrentWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_GetCurrentContext,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_EGL_GetCurrentDisplay,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_EGL_GetCurrentConfig,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_EGL_GetWindowSurface,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_EGL_SetAttributeCallbacks,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_SetSwapInterval,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_GetSwapInterval,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_SwapWindow,
+  SDL3.Sys.Bindgen.Video.Safe.sDL_GL_DestroyContext,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_video.h>"
+         , "signed int hs_bindgen_d211f6b04304439b (void)"
+         , "{"
+         , "  return (SDL_GetNumVideoDrivers)();"
+         , "}"
+         , "char const *hs_bindgen_307dbfd833225e2d ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetVideoDriver)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_efdaa516c2ee9810 (void)"
+         , "{"
+         , "  return (SDL_GetCurrentVideoDriver)();"
+         , "}"
+         , "SDL_SystemTheme hs_bindgen_d4ea00696b1a71bf (void)"
+         , "{"
+         , "  return (SDL_GetSystemTheme)();"
+         , "}"
+         , "SDL_DisplayID *hs_bindgen_d92afc43a12fbe95 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplays)(arg1);"
+         , "}"
+         , "SDL_DisplayID hs_bindgen_b8bacdf537be3b8f (void)"
+         , "{"
+         , "  return (SDL_GetPrimaryDisplay)();"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_d5cb0d5646844e17 ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayProperties)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_e9e9e841de7ccf5b ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayName)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_2de4b5a02136502b ("
+         , "  SDL_DisplayID arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayBounds)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ff1aeb910a17f8ef ("
+         , "  SDL_DisplayID arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayUsableBounds)(arg1, arg2);"
+         , "}"
+         , "SDL_DisplayOrientation hs_bindgen_a526ef31b456159e ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNaturalDisplayOrientation)(arg1);"
+         , "}"
+         , "SDL_DisplayOrientation hs_bindgen_51800c9c70250d96 ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCurrentDisplayOrientation)(arg1);"
+         , "}"
+         , "float hs_bindgen_bf2419cb99d8f412 ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayContentScale)(arg1);"
+         , "}"
+         , "SDL_DisplayMode **hs_bindgen_4662ea5b5904a3f7 ("
+         , "  SDL_DisplayID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetFullscreenDisplayModes)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5d464dea0236acd5 ("
+         , "  SDL_DisplayID arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  float arg4,"
+         , "  _Bool arg5,"
+         , "  SDL_DisplayMode *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_GetClosestFullscreenDisplayMode)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "SDL_DisplayMode const *hs_bindgen_dba50a660cc82b9f ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDesktopDisplayMode)(arg1);"
+         , "}"
+         , "SDL_DisplayMode const *hs_bindgen_4430016da3318782 ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCurrentDisplayMode)(arg1);"
+         , "}"
+         , "SDL_DisplayID hs_bindgen_e084554bb0ca9dc4 ("
+         , "  SDL_Point const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayForPoint)(arg1);"
+         , "}"
+         , "SDL_DisplayID hs_bindgen_50432f887d92198e ("
+         , "  SDL_Rect const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayForRect)(arg1);"
+         , "}"
+         , "SDL_DisplayID hs_bindgen_338231bd9673a8d7 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayForWindow)(arg1);"
+         , "}"
+         , "float hs_bindgen_c660a5f73943853a ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowPixelDensity)(arg1);"
+         , "}"
+         , "float hs_bindgen_830868f00a2186dd ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowDisplayScale)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_5bd56762b4e281bc ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_DisplayMode const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowFullscreenMode)(arg1, arg2);"
+         , "}"
+         , "SDL_DisplayMode const *hs_bindgen_75a4cc980febe857 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowFullscreenMode)(arg1);"
+         , "}"
+         , "void *hs_bindgen_7312928923ad5425 ("
+         , "  SDL_Window *arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowICCProfile)(arg1, arg2);"
+         , "}"
+         , "SDL_PixelFormat hs_bindgen_15580e3d1d0e9b89 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowPixelFormat)(arg1);"
+         , "}"
+         , "SDL_Window **hs_bindgen_6428ebf130092b37 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindows)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_8e424f740acbd80f ("
+         , "  char const *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_WindowFlags arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateWindow)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "SDL_Window *hs_bindgen_19b8bc2bc6b5cfae ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5,"
+         , "  SDL_WindowFlags arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_CreatePopupWindow)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "SDL_Window *hs_bindgen_a9c16b7c7380ac75 ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateWindowWithProperties)(arg1);"
+         , "}"
+         , "SDL_WindowID hs_bindgen_667e66cbe1d6489b ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowID)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_18346477e6758df9 ("
+         , "  SDL_WindowID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowFromID)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_2d39d8129359a89b ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowParent)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_57b7ab5cd9801744 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowProperties)(arg1);"
+         , "}"
+         , "SDL_WindowFlags hs_bindgen_99baf1d6e8b1ddeb ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowFlags)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_54f765221fc62cf4 ("
+         , "  SDL_Window *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowTitle)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_b3fe38980dd2012e ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowTitle)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_3ba2e8e7085b0cc8 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowIcon)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5267578336028cc0 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowPosition)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_cbc04f11ecff82d4 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowPosition)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_463917e130d8e442 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_31fa46c3424e203c ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_b2567486cc8ef384 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowSafeArea)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_4718fa8444201efc ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowAspectRatio)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_b91e4ae738b99383 ("
+         , "  SDL_Window *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowAspectRatio)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_1a0014cc2d5e995b ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3,"
+         , "  signed int *arg4,"
+         , "  signed int *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowBordersSize)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_30e760d14c134b4b ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowSizeInPixels)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_f0719ee9bdadb864 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowMinimumSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_8673ac2cc36b8fce ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowMinimumSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_8b1eeeed1710ce2d ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowMaximumSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_48e1ff926a106d78 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowMaximumSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_1fc2a3e35dc5c047 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowBordered)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_602617d3d8b24265 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowResizable)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_1ca9fa2de9450921 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowAlwaysOnTop)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_4de8e5711e0b8b35 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetWindowFillDocument)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetWindowFillDocument requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_db90afdec297ac45 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ShowWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_151dd0c79f668116 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_HideWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_f3eab79ea97d0a96 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RaiseWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_4702fc373b7a0194 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_MaximizeWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_740052b61f66d8b0 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_MinimizeWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_26d521828ca2c776 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RestoreWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_b364407ada14e440 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowFullscreen)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_5fa6f076247f8fc0 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SyncWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0094e6c8474f41c7 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_WindowHasSurface)(arg1);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_3935adead4d3fc9e ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowSurface)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_352d147569a3861c ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowSurfaceVSync)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_faa1386f6baf8835 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowSurfaceVSync)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_2865506d5d1ebc1d ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateWindowSurface)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_9f52950557ec570d ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateWindowSurfaceRects)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_281f842dd1d64c24 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_DestroyWindowSurface)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_9810610308d37d7a ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowKeyboardGrab)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d76ad355e95647e6 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowMouseGrab)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d6cecb629e2e4cf1 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowKeyboardGrab)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_c4a10336d87afa11 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowMouseGrab)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_dc47f3dead3a7c4c (void)"
+         , "{"
+         , "  return (SDL_GetGrabbedWindow)();"
+         , "}"
+         , "_Bool hs_bindgen_cea803a34ce672ab ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowMouseRect)(arg1, arg2);"
+         , "}"
+         , "SDL_Rect const *hs_bindgen_20aa207b179a0f01 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowMouseRect)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8604a41f1b752f5d ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowOpacity)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_3101cb57bb822dd1 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowOpacity)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_1cc8b9ab8edf00bb ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowParent)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_6a6cf75fb3644441 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowModal)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b8c33cea6b55cf17 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowFocusable)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ce10733e3b7a4ffa ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_ShowWindowSystemMenu)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_9639f427d08bb73e ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_HitTest arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowHitTest)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_ed6846899beda7ab ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowShape)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_e1ccf70cb57d0520 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_FlashOperation arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_FlashWindow)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_ProgressState;"
+         , "#endif"
+         , "_Bool hs_bindgen_5b04ab3d00de3188 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_ProgressState arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetWindowProgressState)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetWindowProgressState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_ProgressState;"
+         , "#endif"
+         , "SDL_ProgressState hs_bindgen_f0c456909c3f00e4 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetWindowProgressState)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetWindowProgressState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_61b3840500263851 ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetWindowProgressValue)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetWindowProgressValue requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "float hs_bindgen_11c3352b21aa2799 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetWindowProgressValue)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetWindowProgressValue requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "void hs_bindgen_b3962b19443d34da ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_84c0659acf0fe2dc (void)"
+         , "{"
+         , "  return (SDL_ScreenSaverEnabled)();"
+         , "}"
+         , "_Bool hs_bindgen_166142199f6402d0 (void)"
+         , "{"
+         , "  return (SDL_EnableScreenSaver)();"
+         , "}"
+         , "_Bool hs_bindgen_83a7f8efb2c664c5 (void)"
+         , "{"
+         , "  return (SDL_DisableScreenSaver)();"
+         , "}"
+         , "_Bool hs_bindgen_c47d12c66f8cfd5c ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_LoadLibrary)(arg1);"
+         , "}"
+         , "SDL_FunctionPointer hs_bindgen_e435ceb0289a8035 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_GetProcAddress)(arg1);"
+         , "}"
+         , "SDL_FunctionPointer hs_bindgen_894763e4be5fe96f ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_EGL_GetProcAddress)(arg1);"
+         , "}"
+         , "void hs_bindgen_88c7a6f4d6a9b36e (void)"
+         , "{"
+         , "  (SDL_GL_UnloadLibrary)();"
+         , "}"
+         , "_Bool hs_bindgen_d8ad3d720e0d97e4 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_ExtensionSupported)(arg1);"
+         , "}"
+         , "void hs_bindgen_0e89b220270eca27 (void)"
+         , "{"
+         , "  (SDL_GL_ResetAttributes)();"
+         , "}"
+         , "_Bool hs_bindgen_6a7a5b133a68dc0f ("
+         , "  SDL_GLAttr arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_SetAttribute)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a558edf739642b48 ("
+         , "  SDL_GLAttr arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_GetAttribute)(arg1, arg2);"
+         , "}"
+         , "SDL_GLContext hs_bindgen_7a22bf48d0f84507 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_CreateContext)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ff7daec2405dfb35 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_GLContext arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_MakeCurrent)(arg1, arg2);"
+         , "}"
+         , "SDL_Window *hs_bindgen_6eb4d946a4d2ae7b (void)"
+         , "{"
+         , "  return (SDL_GL_GetCurrentWindow)();"
+         , "}"
+         , "SDL_GLContext hs_bindgen_c32923dac368266d (void)"
+         , "{"
+         , "  return (SDL_GL_GetCurrentContext)();"
+         , "}"
+         , "SDL_EGLDisplay hs_bindgen_19cd590b75a39bcc (void)"
+         , "{"
+         , "  return (SDL_EGL_GetCurrentDisplay)();"
+         , "}"
+         , "SDL_EGLConfig hs_bindgen_652c87a58c2fcc27 (void)"
+         , "{"
+         , "  return (SDL_EGL_GetCurrentConfig)();"
+         , "}"
+         , "SDL_EGLSurface hs_bindgen_a7fa1925e88a0d07 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_EGL_GetWindowSurface)(arg1);"
+         , "}"
+         , "void hs_bindgen_5095f621e48adf13 ("
+         , "  SDL_EGLAttribArrayCallback arg1,"
+         , "  SDL_EGLIntArrayCallback arg2,"
+         , "  SDL_EGLIntArrayCallback arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  (SDL_EGL_SetAttributeCallbacks)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_32295faebc369c7a ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_SetSwapInterval)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_04719e6e434557d3 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_GetSwapInterval)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_1d8b57ab49fbefc1 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_SwapWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_7da107ca01a650af ("
+         , "  SDL_GLContext arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_DestroyContext)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetNumVideoDrivers@
+foreign import ccall safe "hs_bindgen_d211f6b04304439b"
+  hs_bindgen_d211f6b04304439b_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetNumVideoDrivers@
+hs_bindgen_d211f6b04304439b :: IO BG.CInt
+hs_bindgen_d211f6b04304439b =
+  BG.fromFFIType hs_bindgen_d211f6b04304439b_base
+
+-- | Get the number of video drivers compiled into SDL.
+--
+--     [Returns]: the number of built in video drivers.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetVideoDriver'
+--
+--     [C declaration]: @SDL_GetNumVideoDrivers@, defined at @SDL3\/SDL_video.h 563:33@
+sDL_GetNumVideoDrivers :: IO BG.CInt
+sDL_GetNumVideoDrivers = hs_bindgen_d211f6b04304439b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetVideoDriver@
+foreign import ccall safe "hs_bindgen_307dbfd833225e2d"
+  hs_bindgen_307dbfd833225e2d_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetVideoDriver@
+hs_bindgen_307dbfd833225e2d
+  :: BG.CInt
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_307dbfd833225e2d =
+  BG.fromFFIType hs_bindgen_307dbfd833225e2d_base
+
+-- | Get the name of a built in video driver.
+--
+--     The video 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 \"cocoa\", \"x11\" or \"windows\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the video driver with the given __index__, or NULL if index is out of bounds.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumVideoDrivers'
+--
+--     [C declaration]: @SDL_GetVideoDriver@, defined at @SDL3\/SDL_video.h 585:42@
+sDL_GetVideoDriver
+  :: BG.CInt
+  -- ^
+  --
+  --           [@index@]: the index of a video driver.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetVideoDriver = hs_bindgen_307dbfd833225e2d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetCurrentVideoDriver@
+foreign import ccall safe "hs_bindgen_efdaa516c2ee9810"
+  hs_bindgen_efdaa516c2ee9810_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetCurrentVideoDriver@
+hs_bindgen_efdaa516c2ee9810 :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_efdaa516c2ee9810 =
+  BG.fromFFIType hs_bindgen_efdaa516c2ee9810_base
+
+-- | Get the name of the currently initialized video driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"cocoa\", \"x11\" or \"windows\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current video driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumVideoDrivers', 'sDL_GetVideoDriver'
+--
+--     [C declaration]: @SDL_GetCurrentVideoDriver@, defined at @SDL3\/SDL_video.h 604:42@
+sDL_GetCurrentVideoDriver :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetCurrentVideoDriver =
+  hs_bindgen_efdaa516c2ee9810
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetSystemTheme@
+foreign import ccall safe "hs_bindgen_d4ea00696b1a71bf"
+  hs_bindgen_d4ea00696b1a71bf_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetSystemTheme@
+hs_bindgen_d4ea00696b1a71bf :: IO SDL_SystemTheme
+hs_bindgen_d4ea00696b1a71bf =
+  BG.fromFFIType hs_bindgen_d4ea00696b1a71bf_base
+
+-- | Get the current system theme.
+--
+--     [Returns]: the current system theme, light, dark, or unknown.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSystemTheme@, defined at @SDL3\/SDL_video.h 615:45@
+sDL_GetSystemTheme :: IO SDL_SystemTheme
+sDL_GetSystemTheme = hs_bindgen_d4ea00696b1a71bf
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplays@
+foreign import ccall safe "hs_bindgen_d92afc43a12fbe95"
+  hs_bindgen_d92afc43a12fbe95_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplays@
+hs_bindgen_d92afc43a12fbe95
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_DisplayID)
+hs_bindgen_d92afc43a12fbe95 =
+  BG.fromFFIType hs_bindgen_d92afc43a12fbe95_base
+
+-- | Get a list of currently connected displays.
+--
+--     [Returns]: a 0 terminated array of display instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDisplays@, defined at @SDL3\/SDL_video.h 630:45@
+sDL_GetDisplays
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of displays returned, may be NULL.
+  -> IO (BG.Ptr SDL_DisplayID)
+sDL_GetDisplays = hs_bindgen_d92afc43a12fbe95
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetPrimaryDisplay@
+foreign import ccall safe "hs_bindgen_b8bacdf537be3b8f"
+  hs_bindgen_b8bacdf537be3b8f_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetPrimaryDisplay@
+hs_bindgen_b8bacdf537be3b8f :: IO SDL_DisplayID
+hs_bindgen_b8bacdf537be3b8f =
+  BG.fromFFIType hs_bindgen_b8bacdf537be3b8f_base
+
+-- | Return the primary display.
+--
+--     [Returns]: the instance ID of the primary display on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetPrimaryDisplay@, defined at @SDL3\/SDL_video.h 644:43@
+sDL_GetPrimaryDisplay :: IO SDL_DisplayID
+sDL_GetPrimaryDisplay = hs_bindgen_b8bacdf537be3b8f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayProperties@
+foreign import ccall safe "hs_bindgen_d5cb0d5646844e17"
+  hs_bindgen_d5cb0d5646844e17_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayProperties@
+hs_bindgen_d5cb0d5646844e17
+  :: SDL_DisplayID
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_d5cb0d5646844e17 =
+  BG.fromFFIType hs_bindgen_d5cb0d5646844e17_base
+
+-- | Get the properties associated with a display.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN'@: true if the display has HDR headroom above the SDR white point. This is for informational and diagnostic purposes only, as not all platforms provide this information at the display level.
+--
+--     On KMS\/DRM:
+--
+--     * @'sDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER'@: the \"panel orientation\" property for the display in degrees of clockwise rotation. Note that this is provided only as a hint, and the application is responsible for any coordinate transformations needed to conform to the requested display orientation.
+--
+--     On Wayland:
+--
+--     * @'sDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER'@: the wl_output associated with the display
+--
+--     On Windows:
+--
+--     * @'sDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER'@: the monitor handle (HMONITOR) associated with the display
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDisplayProperties@, defined at @SDL3\/SDL_video.h 682:46@
+sDL_GetDisplayProperties
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetDisplayProperties =
+  hs_bindgen_d5cb0d5646844e17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayName@
+foreign import ccall safe "hs_bindgen_e9e9e841de7ccf5b"
+  hs_bindgen_e9e9e841de7ccf5b_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayName@
+hs_bindgen_e9e9e841de7ccf5b
+  :: SDL_DisplayID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_e9e9e841de7ccf5b =
+  BG.fromFFIType hs_bindgen_e9e9e841de7ccf5b_base
+
+-- | Get the name of a display in UTF-8 encoding.
+--
+--     [Returns]: the name of a display or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayName@, defined at @SDL3\/SDL_video.h 702:42@
+sDL_GetDisplayName
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetDisplayName = hs_bindgen_e9e9e841de7ccf5b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayBounds@
+foreign import ccall safe "hs_bindgen_2de4b5a02136502b"
+  hs_bindgen_2de4b5a02136502b_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayBounds@
+hs_bindgen_2de4b5a02136502b
+  :: SDL_DisplayID
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_2de4b5a02136502b =
+  BG.fromFFIType hs_bindgen_2de4b5a02136502b_base
+
+-- | Get the desktop area represented by a display.
+--
+--     The primary display is often located at (0,0), but may be placed at a different location depending on monitor layout.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayUsableBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayBounds@, defined at @SDL3\/SDL_video.h 722:34@
+sDL_GetDisplayBounds
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure filled in with the display bounds.
+  -> IO BG.CBool
+sDL_GetDisplayBounds = hs_bindgen_2de4b5a02136502b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayUsableBounds@
+foreign import ccall safe "hs_bindgen_ff1aeb910a17f8ef"
+  hs_bindgen_ff1aeb910a17f8ef_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayUsableBounds@
+hs_bindgen_ff1aeb910a17f8ef
+  :: SDL_DisplayID
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_ff1aeb910a17f8ef =
+  BG.fromFFIType hs_bindgen_ff1aeb910a17f8ef_base
+
+-- | Get the usable desktop area represented by a display, in screen coordinates.
+--
+--     This is the same area as @SDL_GetDisplayBounds()@ reports, but with portions reserved by the system removed. For example, on Apple\'s macOS, this subtracts the area occupied by the menu bar and dock.
+--
+--     Setting a window to be fullscreen generally bypasses these unusable areas, so these are good guidelines for the maximum space available to a non-fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayUsableBounds@, defined at @SDL3\/SDL_video.h 748:34@
+sDL_GetDisplayUsableBounds
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure filled in with the display bounds.
+  -> IO BG.CBool
+sDL_GetDisplayUsableBounds =
+  hs_bindgen_ff1aeb910a17f8ef
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetNaturalDisplayOrientation@
+foreign import ccall safe "hs_bindgen_a526ef31b456159e"
+  hs_bindgen_a526ef31b456159e_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetNaturalDisplayOrientation@
+hs_bindgen_a526ef31b456159e
+  :: SDL_DisplayID
+  -> IO SDL_DisplayOrientation
+hs_bindgen_a526ef31b456159e =
+  BG.fromFFIType hs_bindgen_a526ef31b456159e_base
+
+-- | Get the orientation of a display when it is unrotated.
+--
+--     [Returns]: the 'SDL_DisplayOrientation' enum value of the display, or @SDL_ORIENTATION_UNKNOWN@ if it isn\'t available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetNaturalDisplayOrientation@, defined at @SDL3\/SDL_video.h 763:52@
+sDL_GetNaturalDisplayOrientation
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL_DisplayOrientation
+sDL_GetNaturalDisplayOrientation =
+  hs_bindgen_a526ef31b456159e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetCurrentDisplayOrientation@
+foreign import ccall safe "hs_bindgen_51800c9c70250d96"
+  hs_bindgen_51800c9c70250d96_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetCurrentDisplayOrientation@
+hs_bindgen_51800c9c70250d96
+  :: SDL_DisplayID
+  -> IO SDL_DisplayOrientation
+hs_bindgen_51800c9c70250d96 =
+  BG.fromFFIType hs_bindgen_51800c9c70250d96_base
+
+-- | Get the orientation of a display.
+--
+--     [Returns]: the 'SDL_DisplayOrientation' enum value of the display, or @SDL_ORIENTATION_UNKNOWN@ if it isn\'t available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetCurrentDisplayOrientation@, defined at @SDL3\/SDL_video.h 778:52@
+sDL_GetCurrentDisplayOrientation
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL_DisplayOrientation
+sDL_GetCurrentDisplayOrientation =
+  hs_bindgen_51800c9c70250d96
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayContentScale@
+foreign import ccall safe "hs_bindgen_bf2419cb99d8f412"
+  hs_bindgen_bf2419cb99d8f412_base
+    :: BG.Word32
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayContentScale@
+hs_bindgen_bf2419cb99d8f412
+  :: SDL_DisplayID
+  -> IO BG.CFloat
+hs_bindgen_bf2419cb99d8f412 =
+  BG.fromFFIType hs_bindgen_bf2419cb99d8f412_base
+
+-- | Get the content scale of a display.
+--
+--     The content scale is the expected scale for content based on the DPI settings of the display. For example, a 4K display might have a 2.0 (200%) display scale, which means that the user expects UI elements to be twice as big on this display, to aid in readability.
+--
+--     After window creation, @SDL_GetWindowDisplayScale()@ should be used to query the content scale factor for individual windows instead of querying the display for a window and calling this function, as the per-window content scale factor may differ from the base value of the display it is on, particularly on high-DPI and\/or multi-monitor desktop configurations.
+--
+--     [Returns]: the content scale of the display, or 0.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowDisplayScale', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayContentScale@, defined at @SDL3\/SDL_video.h 805:35@
+sDL_GetDisplayContentScale
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO BG.CFloat
+sDL_GetDisplayContentScale =
+  hs_bindgen_bf2419cb99d8f412
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetFullscreenDisplayModes@
+foreign import ccall safe "hs_bindgen_4662ea5b5904a3f7"
+  hs_bindgen_4662ea5b5904a3f7_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetFullscreenDisplayModes@
+hs_bindgen_4662ea5b5904a3f7
+  :: SDL_DisplayID
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_DisplayMode))
+hs_bindgen_4662ea5b5904a3f7 =
+  BG.fromFFIType hs_bindgen_4662ea5b5904a3f7_base
+
+-- | Get a list of fullscreen display modes available on a display.
+--
+--     The display modes are sorted in this priority:
+--
+--     * w -> largest to smallest
+--
+--     * h -> largest to smallest
+--
+--     * bits per pixel -> more colors to fewer colors
+--
+--     * packed pixel layout -> largest to smallest
+--
+--     * refresh rate -> highest to lowest
+--
+--     * pixel density -> lowest to highest
+--
+--     [Returns]: a NULL terminated array of display mode pointers or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetFullscreenDisplayModes@, defined at @SDL3\/SDL_video.h 833:48@
+sDL_GetFullscreenDisplayModes
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of display modes returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_DisplayMode))
+sDL_GetFullscreenDisplayModes =
+  hs_bindgen_4662ea5b5904a3f7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetClosestFullscreenDisplayMode@
+foreign import ccall safe "hs_bindgen_5d464dea0236acd5"
+  hs_bindgen_5d464dea0236acd5_base
+    :: BG.Word32
+    -> BG.Int32
+    -> BG.Int32
+    -> Float
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetClosestFullscreenDisplayMode@
+hs_bindgen_5d464dea0236acd5
+  :: SDL_DisplayID
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CFloat
+  -> BG.CBool
+  -> BG.Ptr SDL_DisplayMode
+  -> IO BG.CBool
+hs_bindgen_5d464dea0236acd5 =
+  BG.fromFFIType hs_bindgen_5d464dea0236acd5_base
+
+-- | Get the closest match to the requested display mode.
+--
+--     The available display modes are scanned and @closest@ is filled in with the closest mode matching the requested mode and returned. The mode format and refresh rate default to the desktop mode if they are set to 0. The modes are scanned with size being first priority, format being second priority, and finally checking the refresh rate. If all the available modes are too small, then false is returned.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays', 'sDL_GetFullscreenDisplayModes'
+--
+--     [C declaration]: @SDL_GetClosestFullscreenDisplayMode@, defined at @SDL3\/SDL_video.h 864:34@
+sDL_GetClosestFullscreenDisplayMode
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width in pixels of the desired display mode.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height in pixels of the desired display mode.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@refresh_rate@]: the refresh rate of the desired display mode, or 0.0f for the desktop refresh rate.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@include_high_density_modes@]: boolean to include high density modes in the search.
+  -> BG.Ptr SDL_DisplayMode
+  -- ^
+  --
+  --           [@closest@]: a pointer filled in with the closest display mode equal to or larger than the desired mode.
+  -> IO BG.CBool
+sDL_GetClosestFullscreenDisplayMode =
+  hs_bindgen_5d464dea0236acd5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDesktopDisplayMode@
+foreign import ccall safe "hs_bindgen_dba50a660cc82b9f"
+  hs_bindgen_dba50a660cc82b9f_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDesktopDisplayMode@
+hs_bindgen_dba50a660cc82b9f
+  :: SDL_DisplayID
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+hs_bindgen_dba50a660cc82b9f =
+  BG.fromFFIType hs_bindgen_dba50a660cc82b9f_base
+
+-- | Get information about the desktop\'s display mode.
+--
+--     There\'s a difference between this function and @SDL_GetCurrentDisplayMode()@ when SDL runs fullscreen and has changed the resolution. In that case this function will return the previous native display mode, and not the current display mode.
+--
+--     [Returns]: a pointer to the desktop display mode or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCurrentDisplayMode', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDesktopDisplayMode@, defined at @SDL3\/SDL_video.h 885:53@
+sDL_GetDesktopDisplayMode
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+sDL_GetDesktopDisplayMode =
+  hs_bindgen_dba50a660cc82b9f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetCurrentDisplayMode@
+foreign import ccall safe "hs_bindgen_4430016da3318782"
+  hs_bindgen_4430016da3318782_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetCurrentDisplayMode@
+hs_bindgen_4430016da3318782
+  :: SDL_DisplayID
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+hs_bindgen_4430016da3318782 =
+  BG.fromFFIType hs_bindgen_4430016da3318782_base
+
+-- | Get information about the current display mode.
+--
+--     There\'s a difference between this function and @SDL_GetDesktopDisplayMode()@ when SDL runs fullscreen and has changed the resolution. In that case this function will return the current display mode, and not the previous native display mode.
+--
+--     [Returns]: a pointer to the desktop display mode or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDesktopDisplayMode', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetCurrentDisplayMode@, defined at @SDL3\/SDL_video.h 906:53@
+sDL_GetCurrentDisplayMode
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+sDL_GetCurrentDisplayMode =
+  hs_bindgen_4430016da3318782
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayForPoint@
+foreign import ccall safe "hs_bindgen_e084554bb0ca9dc4"
+  hs_bindgen_e084554bb0ca9dc4_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayForPoint@
+hs_bindgen_e084554bb0ca9dc4
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point
+  -> IO SDL_DisplayID
+hs_bindgen_e084554bb0ca9dc4 =
+  BG.fromFFIType hs_bindgen_e084554bb0ca9dc4_base
+
+-- | Get the display containing a point.
+--
+--     [Returns]: the instance ID of the display containing the point or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayForPoint@, defined at @SDL3\/SDL_video.h 922:43@
+sDL_GetDisplayForPoint
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point
+  -- ^
+  --
+  --           [@point@]: the point to query.
+  -> IO SDL_DisplayID
+sDL_GetDisplayForPoint = hs_bindgen_e084554bb0ca9dc4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayForRect@
+foreign import ccall safe "hs_bindgen_50432f887d92198e"
+  hs_bindgen_50432f887d92198e_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayForRect@
+hs_bindgen_50432f887d92198e
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO SDL_DisplayID
+hs_bindgen_50432f887d92198e =
+  BG.fromFFIType hs_bindgen_50432f887d92198e_base
+
+-- | Get the display primarily containing a rect.
+--
+--     [Returns]: the instance ID of the display entirely containing the rect or closest to the center of the rect on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayForRect@, defined at @SDL3\/SDL_video.h 939:43@
+sDL_GetDisplayForRect
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the rect to query.
+  -> IO SDL_DisplayID
+sDL_GetDisplayForRect = hs_bindgen_50432f887d92198e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayForWindow@
+foreign import ccall safe "hs_bindgen_338231bd9673a8d7"
+  hs_bindgen_338231bd9673a8d7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetDisplayForWindow@
+hs_bindgen_338231bd9673a8d7
+  :: BG.Ptr SDL_Window
+  -> IO SDL_DisplayID
+hs_bindgen_338231bd9673a8d7 =
+  BG.fromFFIType hs_bindgen_338231bd9673a8d7_base
+
+-- | Get the display associated with a window.
+--
+--     [Returns]: the instance ID of the display containing the center of the window on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayForWindow@, defined at @SDL3\/SDL_video.h 956:43@
+sDL_GetDisplayForWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_DisplayID
+sDL_GetDisplayForWindow = hs_bindgen_338231bd9673a8d7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowPixelDensity@
+foreign import ccall safe "hs_bindgen_c660a5f73943853a"
+  hs_bindgen_c660a5f73943853a_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowPixelDensity@
+hs_bindgen_c660a5f73943853a
+  :: BG.Ptr SDL_Window
+  -> IO BG.CFloat
+hs_bindgen_c660a5f73943853a =
+  BG.fromFFIType hs_bindgen_c660a5f73943853a_base
+
+-- | Get the pixel density of a window.
+--
+--     This is a ratio of pixel size to window size. For example, if the window is 1920x1080 and it has a high density back buffer of 3840x2160 pixels, it would have a pixel density of 2.0.
+--
+--     [Returns]: the pixel density or 0.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowDisplayScale'
+--
+--     [C declaration]: @SDL_GetWindowPixelDensity@, defined at @SDL3\/SDL_video.h 975:35@
+sDL_GetWindowPixelDensity
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CFloat
+sDL_GetWindowPixelDensity =
+  hs_bindgen_c660a5f73943853a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowDisplayScale@
+foreign import ccall safe "hs_bindgen_830868f00a2186dd"
+  hs_bindgen_830868f00a2186dd_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowDisplayScale@
+hs_bindgen_830868f00a2186dd
+  :: BG.Ptr SDL_Window
+  -> IO BG.CFloat
+hs_bindgen_830868f00a2186dd =
+  BG.fromFFIType hs_bindgen_830868f00a2186dd_base
+
+-- | Get the content display scale relative to a window\'s pixel size.
+--
+--     This is a combination of the window pixel density and the display content scale, and is the expected scale for displaying content in this window. For example, if a 3840x2160 window had a display scale of 2.0, the user expects the content to take twice as many pixels and be the same physical size as if it were being displayed in a 1920x1080 window with a display scale of 1.0.
+--
+--     Conceptually this value corresponds to the scale display setting, and is updated when that setting is changed, or the window moves to a display with a different scale setting.
+--
+--     [Returns]: the display scale, or 0.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowDisplayScale@, defined at @SDL3\/SDL_video.h 999:35@
+sDL_GetWindowDisplayScale
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CFloat
+sDL_GetWindowDisplayScale =
+  hs_bindgen_830868f00a2186dd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowFullscreenMode@
+foreign import ccall safe "hs_bindgen_5bd56762b4e281bc"
+  hs_bindgen_5bd56762b4e281bc_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowFullscreenMode@
+hs_bindgen_5bd56762b4e281bc
+  :: BG.Ptr SDL_Window
+  -> PtrConst.PtrConst SDL_DisplayMode
+  -> IO BG.CBool
+hs_bindgen_5bd56762b4e281bc =
+  BG.fromFFIType hs_bindgen_5bd56762b4e281bc_base
+
+-- | Set the display mode to use when a window is visible and fullscreen.
+--
+--     This only affects the display mode used when the window is fullscreen. To change the window size when the window is not fullscreen, use @SDL_SetWindowSize()@.
+--
+--     If the window is currently in the fullscreen state, this request is asynchronous on some windowing systems and the new mode dimensions may not be applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the new mode takes effect, an SDL_EVENT_WINDOW_RESIZED and\/or an SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event will be emitted with the new mode dimensions.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFullscreenMode', 'sDL_SetWindowFullscreen', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowFullscreenMode@, defined at @SDL3\/SDL_video.h 1034:34@
+sDL_SetWindowFullscreenMode
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to affect.
+  -> PtrConst.PtrConst SDL_DisplayMode
+  -- ^
+  --
+  --           [@mode@]: a pointer to the display mode to use, which can be NULL for borderless fullscreen desktop mode, or one of the fullscreen modes returned by @SDL_GetFullscreenDisplayModes()@ to set an exclusive fullscreen mode.
+  -> IO BG.CBool
+sDL_SetWindowFullscreenMode =
+  hs_bindgen_5bd56762b4e281bc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowFullscreenMode@
+foreign import ccall safe "hs_bindgen_75a4cc980febe857"
+  hs_bindgen_75a4cc980febe857_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowFullscreenMode@
+hs_bindgen_75a4cc980febe857
+  :: BG.Ptr SDL_Window
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+hs_bindgen_75a4cc980febe857 =
+  BG.fromFFIType hs_bindgen_75a4cc980febe857_base
+
+-- | Query the display mode to use when a window is visible at fullscreen.
+--
+--     [Returns]: a pointer to the exclusive fullscreen mode to use or NULL for borderless fullscreen desktop mode.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowFullscreenMode', 'sDL_SetWindowFullscreen'
+--
+--     [C declaration]: @SDL_GetWindowFullscreenMode@, defined at @SDL3\/SDL_video.h 1050:53@
+sDL_GetWindowFullscreenMode
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+sDL_GetWindowFullscreenMode =
+  hs_bindgen_75a4cc980febe857
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowICCProfile@
+foreign import ccall safe "hs_bindgen_7312928923ad5425"
+  hs_bindgen_7312928923ad5425_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowICCProfile@
+hs_bindgen_7312928923ad5425
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_7312928923ad5425 =
+  BG.fromFFIType hs_bindgen_7312928923ad5425_base
+
+-- | Get the raw ICC profile data for the screen the window is currently on.
+--
+--     [Returns]: the raw ICC profile data on success or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowICCProfile@, defined at @SDL3\/SDL_video.h 1065:36@
+sDL_GetWindowICCProfile
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the ICC profile.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetWindowICCProfile = hs_bindgen_7312928923ad5425
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowPixelFormat@
+foreign import ccall safe "hs_bindgen_15580e3d1d0e9b89"
+  hs_bindgen_15580e3d1d0e9b89_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowPixelFormat@
+hs_bindgen_15580e3d1d0e9b89
+  :: BG.Ptr SDL_Window
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+hs_bindgen_15580e3d1d0e9b89 =
+  BG.fromFFIType hs_bindgen_15580e3d1d0e9b89_base
+
+-- | Get the pixel format associated with the window.
+--
+--     [Returns]: the pixel format of the window on success or SDL_PIXELFORMAT_UNKNOWN on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowPixelFormat@, defined at @SDL3\/SDL_video.h 1079:45@
+sDL_GetWindowPixelFormat
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+sDL_GetWindowPixelFormat =
+  hs_bindgen_15580e3d1d0e9b89
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindows@
+foreign import ccall safe "hs_bindgen_6428ebf130092b37"
+  hs_bindgen_6428ebf130092b37_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindows@
+hs_bindgen_6428ebf130092b37
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_Window))
+hs_bindgen_6428ebf130092b37 =
+  BG.fromFFIType hs_bindgen_6428ebf130092b37_base
+
+-- | Get a list of valid windows.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Window' pointers or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindows@, defined at @SDL3\/SDL_video.h 1095:43@
+sDL_GetWindows
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of windows returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Window))
+sDL_GetWindows = hs_bindgen_6428ebf130092b37
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_CreateWindow@
+foreign import ccall safe "hs_bindgen_8e424f740acbd80f"
+  hs_bindgen_8e424f740acbd80f_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_CreateWindow@
+hs_bindgen_8e424f740acbd80f
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL_WindowFlags
+  -> IO (BG.Ptr SDL_Window)
+hs_bindgen_8e424f740acbd80f =
+  BG.fromFFIType hs_bindgen_8e424f740acbd80f_base
+
+-- | Create a window with the specified dimensions and flags.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     @flags@ may be any of the following OR\'d together:
+--
+--     * @SDL_WINDOW_FULLSCREEN@: fullscreen window at desktop resolution
+--
+--     * @SDL_WINDOW_OPENGL@: window usable with an OpenGL context
+--
+--     * @SDL_WINDOW_HIDDEN@: window is not visible
+--
+--     * @SDL_WINDOW_BORDERLESS@: no window decoration
+--
+--     * @SDL_WINDOW_RESIZABLE@: window can be resized
+--
+--     * @SDL_WINDOW_MINIMIZED@: window is minimized
+--
+--     * @SDL_WINDOW_MAXIMIZED@: window is maximized
+--
+--     * @SDL_WINDOW_MOUSE_GRABBED@: window has grabbed mouse focus
+--
+--     * @SDL_WINDOW_INPUT_FOCUS@: window has input focus
+--
+--     * @SDL_WINDOW_MOUSE_FOCUS@: window has mouse focus
+--
+--     * @SDL_WINDOW_EXTERNAL@: window not created by SDL
+--
+--     * @SDL_WINDOW_MODAL@: window is modal
+--
+--     * @SDL_WINDOW_HIGH_PIXEL_DENSITY@: window uses high pixel density back buffer if possible
+--
+--     * @SDL_WINDOW_MOUSE_CAPTURE@: window has mouse captured (unrelated to MOUSE_GRABBED)
+--
+--     * @SDL_WINDOW_ALWAYS_ON_TOP@: window should always be above others
+--
+--     * @SDL_WINDOW_UTILITY@: window should be treated as a utility window, not showing in the task bar and window list
+--
+--     * @SDL_WINDOW_TOOLTIP@: window should be treated as a tooltip and does not get mouse or keyboard focus, requires a parent window
+--
+--     * @SDL_WINDOW_POPUP_MENU@: window should be treated as a popup menu, requires a parent window
+--
+--     * @SDL_WINDOW_KEYBOARD_GRABBED@: window has grabbed keyboard input
+--
+--     * @SDL_WINDOW_VULKAN@: window usable with a Vulkan instance
+--
+--     * @SDL_WINDOW_METAL@: window usable with a Metal instance
+--
+--     * @SDL_WINDOW_TRANSPARENT@: window with transparent buffer
+--
+--     * @SDL_WINDOW_NOT_FOCUSABLE@: window should not be focusable
+--
+--     The 'SDL_Window' will be shown if SDL_WINDOW_HIDDEN is not set. If hidden at creation time, @SDL_ShowWindow()@ can be used to show it later.
+--
+--     On Apple\'s macOS, you __must__ set the NSHighResolutionCapable Info.plist property to YES, otherwise you will not receive a High-DPI OpenGL canvas.
+--
+--     The window pixel size may differ from its window coordinate size if the window is on a high pixel density display. Use @SDL_GetWindowSize()@ to query the client area\'s size in window coordinates, and @SDL_GetWindowSizeInPixels()@ or SDL_GetRenderOutputSize() to query the drawable size in pixels. Note that the drawable size can vary after the window is created and should be queried again if you get an SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event.
+--
+--     If the window is created with any of the SDL_WINDOW_OPENGL or SDL_WINDOW_VULKAN flags, then the corresponding LoadLibrary function (SDL_GL_LoadLibrary or SDL_Vulkan_LoadLibrary) is called and the corresponding UnloadLibrary function is called by @SDL_DestroyWindow()@.
+--
+--     If SDL_WINDOW_VULKAN is specified and there isn\'t a working Vulkan driver, @SDL_CreateWindow()@ will fail, because SDL_Vulkan_LoadLibrary() will fail.
+--
+--     If SDL_WINDOW_METAL is specified on an OS that does not support Metal, @SDL_CreateWindow()@ will fail.
+--
+--     If you intend to use this window with an SDL_Renderer, you should use SDL_CreateWindowAndRenderer() instead of this function, to avoid window flicker.
+--
+--     On non-Apple devices, SDL requires you to either not link to the Vulkan loader or link to a dynamic library version. This limitation may be removed in a future version of SDL.
+--
+--     [Returns]: the window that was created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateWindowAndRenderer, 'sDL_CreatePopupWindow', 'sDL_CreateWindowWithProperties', 'sDL_DestroyWindow'
+--
+--     [C declaration]: @SDL_CreateWindow@, defined at @SDL3\/SDL_video.h 1184:42@
+sDL_CreateWindow
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the title of the window, in UTF-8 encoding.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the window.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the window.
+  -> SDL_WindowFlags
+  -- ^
+  --
+  --           [@flags@]: 0, or one or more 'SDL_WindowFlags' OR\'d together.
+  -> IO (BG.Ptr SDL_Window)
+sDL_CreateWindow = hs_bindgen_8e424f740acbd80f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_CreatePopupWindow@
+foreign import ccall safe "hs_bindgen_19b8bc2bc6b5cfae"
+  hs_bindgen_19b8bc2bc6b5cfae_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_CreatePopupWindow@
+hs_bindgen_19b8bc2bc6b5cfae
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL_WindowFlags
+  -> IO (BG.Ptr SDL_Window)
+hs_bindgen_19b8bc2bc6b5cfae =
+  BG.fromFFIType hs_bindgen_19b8bc2bc6b5cfae_base
+
+-- | Create a child popup window of the specified parent window.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     The flags parameter __must__ contain at least one of the following:
+--
+--     * @SDL_WINDOW_TOOLTIP@: The popup window is a tooltip and will not pass any input events.
+--
+--     * @SDL_WINDOW_POPUP_MENU@: The popup window is a popup menu. The topmost popup menu will implicitly gain the keyboard focus.
+--
+--     The following flags are not relevant to popup window creation and will be ignored:
+--
+--     * @SDL_WINDOW_MINIMIZED@
+--
+--     * @SDL_WINDOW_MAXIMIZED@
+--
+--     * @SDL_WINDOW_FULLSCREEN@
+--
+--     * @SDL_WINDOW_BORDERLESS@
+--
+--     The following flags are incompatible with popup window creation and will cause it to fail:
+--
+--     * @SDL_WINDOW_UTILITY@
+--
+--     * @SDL_WINDOW_MODAL@
+--
+--     The parent parameter __must__ be non-null and a valid window. The parent of a popup window can be either a regular, toplevel window, or another popup window.
+--
+--     Popup windows cannot be minimized, maximized, made fullscreen, raised, flash, be made a modal window, be the parent of a toplevel window, or grab the mouse and\/or keyboard. Attempts to do so will fail.
+--
+--     Popup windows implicitly do not have a border\/decorations and do not appear on the taskbar\/dock or in lists of windows such as alt-tab menus.
+--
+--     By default, popup window positions will automatically be constrained to keep the entire window within display bounds. This can be overridden with the @'sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN'@ property.
+--
+--     By default, popup menus will automatically grab keyboard focus from the parent when shown. This behavior can be overridden by setting the @SDL_WINDOW_NOT_FOCUSABLE@ flag, setting the @'sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN'@ property to false, or toggling it after creation via the @SDL_SetWindowFocusable()@ function.
+--
+--     If a parent window is hidden or destroyed, any child popup windows will be recursively hidden or destroyed as well. Child popup windows not explicitly hidden will be restored when the parent is shown.
+--
+--     [Returns]: the window that was created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateWindow', 'sDL_CreateWindowWithProperties', 'sDL_DestroyWindow', 'sDL_GetWindowParent'
+--
+--     [C declaration]: @SDL_CreatePopupWindow@, defined at @SDL3\/SDL_video.h 1260:42@
+sDL_CreatePopupWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@parent@]: the parent of the window, must not be NULL.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@offset_x@]: the x position of the popup window relative to the origin of the parent.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@offset_y@]: the y position of the popup window relative to the origin of the parent window.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the window.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the window.
+  -> SDL_WindowFlags
+  -- ^
+  --
+  --           [@flags@]: SDL_WINDOW_TOOLTIP or SDL_WINDOW_POPUP_MENU, and zero or more additional 'SDL_WindowFlags' OR\'d together.
+  -> IO (BG.Ptr SDL_Window)
+sDL_CreatePopupWindow = hs_bindgen_19b8bc2bc6b5cfae
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_CreateWindowWithProperties@
+foreign import ccall safe "hs_bindgen_a9c16b7c7380ac75"
+  hs_bindgen_a9c16b7c7380ac75_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_CreateWindowWithProperties@
+hs_bindgen_a9c16b7c7380ac75
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Window)
+hs_bindgen_a9c16b7c7380ac75 =
+  BG.fromFFIType hs_bindgen_a9c16b7c7380ac75_base
+
+-- | Create a window with the specified properties.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN'@: true if the window should be always on top
+--
+--     * @'sDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN'@: true if the window has no window decoration
+--
+--     * @'sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN'@: true if the \"tooltip\" and \"menu\" window types should be automatically constrained to be entirely within display bounds (default), false if no constraints on the position are desired.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN'@: true if the window will be used with an externally managed graphics context.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN'@: true if the window should accept keyboard input (defaults true)
+--
+--     * @'sDL_PROP_WINDOW_CREATE_FULLSCREEN_BOOLEAN'@: true if the window should start in fullscreen mode at desktop resolution
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER'@: the height of the window
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN'@: true if the window should start hidden
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HIGH_PIXEL_DENSITY_BOOLEAN'@: true if the window uses a high pixel density buffer if possible
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MAXIMIZED_BOOLEAN'@: true if the window should start maximized
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MENU_BOOLEAN'@: true if the window is a popup menu
+--
+--     * @'sDL_PROP_WINDOW_CREATE_METAL_BOOLEAN'@: true if the window will be used with Metal rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MINIMIZED_BOOLEAN'@: true if the window should start minimized
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MODAL_BOOLEAN'@: true if the window is modal to its parent
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MOUSE_GRABBED_BOOLEAN'@: true if the window starts with grabbed mouse focus
+--
+--     * @'sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN'@: true if the window will be used with OpenGL rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_PARENT_POINTER'@: an 'SDL_Window' that will be the parent of this window, required for windows with the \"tooltip\", \"menu\", and \"modal\" properties
+--
+--     * @'sDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN'@: true if the window should be resizable
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TITLE_STRING'@: the title of the window, in UTF-8 encoding
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TRANSPARENT_BOOLEAN'@: true if the window show transparent in the areas with alpha of 0
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TOOLTIP_BOOLEAN'@: true if the window is a tooltip
+--
+--     * @'sDL_PROP_WINDOW_CREATE_UTILITY_BOOLEAN'@: true if the window is a utility window, not showing in the task bar and window list
+--
+--     * @'sDL_PROP_WINDOW_CREATE_VULKAN_BOOLEAN'@: true if the window will be used with Vulkan rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIDTH_NUMBER'@: the width of the window
+--
+--     * @'sDL_PROP_WINDOW_CREATE_X_NUMBER'@: the x position of the window, or @'sDL_WINDOWPOS_CENTERED'@, defaults to @'sDL_WINDOWPOS_UNDEFINED'@. This is relative to the parent for windows with the \"tooltip\" or \"menu\" property set.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_Y_NUMBER'@: the y position of the window, or @'sDL_WINDOWPOS_CENTERED'@, defaults to @'sDL_WINDOWPOS_UNDEFINED'@. This is relative to the parent for windows with the \"tooltip\" or \"menu\" property set.
+--
+--     These are additional supported properties on macOS:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER'@: the @(__unsafe_unretained)@ NSWindow associated with the window, if you want to wrap an existing window.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER'@: the @(__unsafe_unretained)@ NSView associated with the window, defaults to @[window contentView]@
+--
+--     These are additional supported properties on iOS, tvOS, and visionOS:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER'@: the @(__unsafe_unretained)@ UIWindowScene associated with the window, defaults to the active window scene.
+--
+--     These are additional supported properties on Wayland:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN'@ - true if the application wants to use the Wayland surface for a custom role and does not want it attached to an XDG toplevel window. See [README-wayland](README-wayland) for more information on using custom surfaces.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN'@ - true if the application wants an associated @wl_egl_window@ object to be created and attached to the window, even if the window does not have the OpenGL property or @SDL_WINDOW_OPENGL@ flag set.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER'@ - the wl_surface associated with the window, if you want to wrap an existing window. See [README-wayland](README-wayland) for more information.
+--
+--     These are additional supported properties on Windows:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER'@: the HWND associated with the window, if you want to wrap an existing window.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER'@: optional, another window to share pixel format with, useful for OpenGL windows
+--
+--     These are additional supported properties with X11:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER'@: the X11 Window associated with the window, if you want to wrap an existing window.
+--
+--     The window is implicitly shown if the \"hidden\" property is not set.
+--
+--     These are additional supported properties with Emscripten:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING'@: the id given to the canvas element. This should start with a \'\#\' sign
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING'@: override the binding element for keyboard inputs for this canvas. The variable can be one of:
+--
+--     * \"\#window\": the javascript window object (default)
+--
+--     * \"\#document\": the javascript document object
+--
+--     * \"\#screen\": the javascript window.screen object
+--
+--     * \"\#canvas\": the WebGL canvas element
+--
+--     * \"\#none\": Don\'t bind anything at all
+--
+--     * any other string without a leading \# sign applies to the element on the page with that ID. Windows with the \"tooltip\" and \"menu\" properties are popup windows and have the behaviors and guidelines outlined in @SDL_CreatePopupWindow()@.
+--
+--     If this window is being created to be used with an SDL_Renderer, you should not add a graphics API specific property (@'sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN'@, etc), as SDL will handle that internally when it chooses a renderer. However, SDL might need to recreate your window at that point, which may cause the window to appear briefly, and then flicker as it is recreated. The correct approach to this is to create the window with the @'sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN'@ property set to true, then create the renderer, then show the window with @SDL_ShowWindow()@.
+--
+--     [Returns]: the window that was created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateProperties, 'sDL_CreateWindow', 'sDL_DestroyWindow'
+--
+--     [C declaration]: @SDL_CreateWindowWithProperties@, defined at @SDL3\/SDL_video.h 1409:42@
+sDL_CreateWindowWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Window)
+sDL_CreateWindowWithProperties =
+  hs_bindgen_a9c16b7c7380ac75
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowID@
+foreign import ccall safe "hs_bindgen_667e66cbe1d6489b"
+  hs_bindgen_667e66cbe1d6489b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowID@
+hs_bindgen_667e66cbe1d6489b
+  :: BG.Ptr SDL_Window
+  -> IO SDL_WindowID
+hs_bindgen_667e66cbe1d6489b =
+  BG.fromFFIType hs_bindgen_667e66cbe1d6489b_base
+
+-- | Get the numeric ID of a window.
+--
+--     The numeric ID is what SDL_WindowEvent references, and is necessary to map these events to specific 'SDL_Window' objects.
+--
+--     [Returns]: the ID of the window on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFromID'
+--
+--     [C declaration]: @SDL_GetWindowID@, defined at @SDL3\/SDL_video.h 1466:42@
+sDL_GetWindowID
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_WindowID
+sDL_GetWindowID = hs_bindgen_667e66cbe1d6489b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowFromID@
+foreign import ccall safe "hs_bindgen_18346477e6758df9"
+  hs_bindgen_18346477e6758df9_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowFromID@
+hs_bindgen_18346477e6758df9
+  :: SDL_WindowID
+  -> IO (BG.Ptr SDL_Window)
+hs_bindgen_18346477e6758df9 =
+  BG.fromFFIType hs_bindgen_18346477e6758df9_base
+
+-- | Get a window from a stored ID.
+--
+--     The numeric ID is what SDL_WindowEvent references, and is necessary to map these events to specific 'SDL_Window' objects.
+--
+--     [Returns]: the window associated with @id@ or NULL if it doesn\'t exist; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowID'
+--
+--     [C declaration]: @SDL_GetWindowFromID@, defined at @SDL3\/SDL_video.h 1484:42@
+sDL_GetWindowFromID
+  :: SDL_WindowID
+  -- ^
+  --
+  --           [@id@]: the ID of the window.
+  -> IO (BG.Ptr SDL_Window)
+sDL_GetWindowFromID = hs_bindgen_18346477e6758df9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowParent@
+foreign import ccall safe "hs_bindgen_2d39d8129359a89b"
+  hs_bindgen_2d39d8129359a89b_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowParent@
+hs_bindgen_2d39d8129359a89b
+  :: BG.Ptr SDL_Window
+  -> IO (BG.Ptr SDL_Window)
+hs_bindgen_2d39d8129359a89b =
+  BG.fromFFIType hs_bindgen_2d39d8129359a89b_base
+
+-- | Get parent of a window.
+--
+--     [Returns]: the parent of the window on success or NULL if the window has no parent.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreatePopupWindow'
+--
+--     [C declaration]: @SDL_GetWindowParent@, defined at @SDL3\/SDL_video.h 1499:42@
+sDL_GetWindowParent
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL_Window)
+sDL_GetWindowParent = hs_bindgen_2d39d8129359a89b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowProperties@
+foreign import ccall safe "hs_bindgen_57b7ab5cd9801744"
+  hs_bindgen_57b7ab5cd9801744_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowProperties@
+hs_bindgen_57b7ab5cd9801744
+  :: BG.Ptr SDL_Window
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_57b7ab5cd9801744 =
+  BG.fromFFIType hs_bindgen_57b7ab5cd9801744_base
+
+-- | Get the properties associated with a window.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_WINDOW_SHAPE_POINTER'@: the surface associated with a shaped window
+--
+--     * @'sDL_PROP_WINDOW_HDR_ENABLED_BOOLEAN'@: true if the window has HDR headroom above the SDR white point. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_WINDOW_SDR_WHITE_LEVEL_FLOAT'@: the value of SDR white in the SDL_COLORSPACE_SRGB_LINEAR colorspace. On Windows this corresponds to the SDR white level in scRGB colorspace, and on Apple platforms this is always 1.0 for EDR content. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_WINDOW_HDR_HEADROOM_FLOAT'@: the additional high dynamic range that can be displayed, in terms of the SDR white point. When HDR is not enabled, this will be 1.0. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     On Android:
+--
+--     * @'sDL_PROP_WINDOW_ANDROID_WINDOW_POINTER'@: the ANativeWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_ANDROID_SURFACE_POINTER'@: the EGLSurface associated with the window
+--
+--     On iOS:
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_WINDOW_POINTER'@: the @(__unsafe_unretained)@ UIWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER'@: the NSInteger tag associated with metal views on the window
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER'@: the OpenGL view\'s framebuffer object. It must be bound when rendering to the screen using OpenGL.
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER'@: the OpenGL view\'s renderbuffer object. It must be bound when SDL_GL_SwapWindow is called.
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER'@: the OpenGL view\'s resolve framebuffer, when MSAA is used.
+--
+--     On KMS\/DRM:
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_DEVICE_INDEX_NUMBER'@: the device index associated with the window (e.g. the X in \/dev\/dri\/cardX)
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_DRM_FD_NUMBER'@: the DRM FD associated with the window
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER'@: the GBM device associated with the window
+--
+--     On macOS:
+--
+--     * @'sDL_PROP_WINDOW_COCOA_WINDOW_POINTER'@: the @(__unsafe_unretained)@ NSWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER'@: the NSInteger tag associated with metal views on the window
+--
+--     On OpenVR:
+--
+--     * @'sDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER'@: the OpenVR Overlay Handle ID for the associated overlay window.
+--
+--     On Vivante:
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER'@: the EGLNativeDisplayType associated with the window
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER'@: the EGLNativeWindowType associated with the window
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER'@: the EGLSurface associated with the window
+--
+--     On Windows:
+--
+--     * @'sDL_PROP_WINDOW_WIN32_HWND_POINTER'@: the HWND associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WIN32_HDC_POINTER'@: the HDC associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WIN32_INSTANCE_POINTER'@: the HINSTANCE associated with the window
+--
+--     On Wayland:
+--
+--     Note: The @xdg_*@ window objects do not internally persist across window show\/hide calls. They will be null if the window is hidden and must be queried each time it is shown.
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER'@: the wl_display associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER'@: the wl_surface associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER'@: the wp_viewport associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER'@: the wl_egl_window associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER'@: the xdg_surface associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER'@: the xdg_toplevel role associated with the window
+--
+--     * \'SDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_EXPORT_HANDLE_STRING\': the export handle associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_POPUP_POINTER'@: the xdg_popup role associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_POSITIONER_POINTER'@: the xdg_positioner associated with the window, in popup mode
+--
+--     On X11:
+--
+--     * @'sDL_PROP_WINDOW_X11_DISPLAY_POINTER'@: the X11 Display associated with the window
+--
+--     * @'sDL_PROP_WINDOW_X11_SCREEN_NUMBER'@: the screen number associated with the window
+--
+--     * @'sDL_PROP_WINDOW_X11_WINDOW_NUMBER'@: the X11 Window associated with the window
+--
+--     On Emscripten:
+--
+--     * @'sDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING'@: the id the canvas element will have
+--
+--     * @'sDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING'@: the keyboard element that associates keyboard events to this window
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowProperties@, defined at @SDL3\/SDL_video.h 1628:46@
+sDL_GetWindowProperties
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetWindowProperties = hs_bindgen_57b7ab5cd9801744
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowFlags@
+foreign import ccall safe "hs_bindgen_99baf1d6e8b1ddeb"
+  hs_bindgen_99baf1d6e8b1ddeb_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowFlags@
+hs_bindgen_99baf1d6e8b1ddeb
+  :: BG.Ptr SDL_Window
+  -> IO SDL_WindowFlags
+hs_bindgen_99baf1d6e8b1ddeb =
+  BG.fromFFIType hs_bindgen_99baf1d6e8b1ddeb_base
+
+-- | Get the window flags.
+--
+--     [Returns]: a mask of the 'SDL_WindowFlags' associated with @window@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateWindow', 'sDL_HideWindow', 'sDL_MaximizeWindow', 'sDL_MinimizeWindow', 'sDL_SetWindowFullscreen', 'sDL_SetWindowMouseGrab', 'sDL_SetWindowFillDocument', 'sDL_ShowWindow'
+--
+--     [C declaration]: @SDL_GetWindowFlags@, defined at @SDL3\/SDL_video.h 1687:45@
+sDL_GetWindowFlags
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_WindowFlags
+sDL_GetWindowFlags = hs_bindgen_99baf1d6e8b1ddeb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowTitle@
+foreign import ccall safe "hs_bindgen_54f765221fc62cf4"
+  hs_bindgen_54f765221fc62cf4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowTitle@
+hs_bindgen_54f765221fc62cf4
+  :: BG.Ptr SDL_Window
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_54f765221fc62cf4 =
+  BG.fromFFIType hs_bindgen_54f765221fc62cf4_base
+
+-- | Set the title of a window.
+--
+--     This string is expected to be in UTF-8 encoding.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowTitle'
+--
+--     [C declaration]: @SDL_SetWindowTitle@, defined at @SDL3\/SDL_video.h 1705:34@
+sDL_SetWindowTitle
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the desired window title in UTF-8 format.
+  -> IO BG.CBool
+sDL_SetWindowTitle = hs_bindgen_54f765221fc62cf4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowTitle@
+foreign import ccall safe "hs_bindgen_b3fe38980dd2012e"
+  hs_bindgen_b3fe38980dd2012e_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowTitle@
+hs_bindgen_b3fe38980dd2012e
+  :: BG.Ptr SDL_Window
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_b3fe38980dd2012e =
+  BG.fromFFIType hs_bindgen_b3fe38980dd2012e_base
+
+-- | Get the title of a window.
+--
+--     [Returns]: the title of the window in UTF-8 format or \"\" if there is no title.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowTitle'
+--
+--     [C declaration]: @SDL_GetWindowTitle@, defined at @SDL3\/SDL_video.h 1720:42@
+sDL_GetWindowTitle
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetWindowTitle = hs_bindgen_b3fe38980dd2012e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowIcon@
+foreign import ccall safe "hs_bindgen_3ba2e8e7085b0cc8"
+  hs_bindgen_3ba2e8e7085b0cc8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowIcon@
+hs_bindgen_3ba2e8e7085b0cc8
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_3ba2e8e7085b0cc8 =
+  BG.fromFFIType hs_bindgen_3ba2e8e7085b0cc8_base
+
+-- | Set the icon for a window.
+--
+--     If this function is passed a surface with alternate representations added using SDL_AddSurfaceAlternateImage(), the surface will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations. For example, if the original surface is 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_AddSurfaceAlternateImage
+--
+--     [C declaration]: @SDL_SetWindowIcon@, defined at @SDL3\/SDL_video.h 1747:34@
+sDL_SetWindowIcon
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: an SDL_Surface structure containing the icon for the window.
+  -> IO BG.CBool
+sDL_SetWindowIcon = hs_bindgen_3ba2e8e7085b0cc8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowPosition@
+foreign import ccall safe "hs_bindgen_5267578336028cc0"
+  hs_bindgen_5267578336028cc0_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowPosition@
+hs_bindgen_5267578336028cc0
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_5267578336028cc0 =
+  BG.fromFFIType hs_bindgen_5267578336028cc0_base
+
+-- | Request that the window\'s position be set.
+--
+--     If the window is in an exclusive fullscreen or maximized state, this request has no effect.
+--
+--     This can be used to reposition fullscreen-desktop windows onto a different display, however, as exclusive fullscreen windows are locked to a specific display, they can only be repositioned programmatically via @SDL_SetWindowFullscreenMode()@.
+--
+--     On some windowing systems this request is asynchronous and the new coordinates may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window position changes, an SDL_EVENT_WINDOW_MOVED event will be emitted with the window\'s new coordinates. Note that the new coordinates may not match the exact coordinates requested, as some windowing systems can restrict the position of the window in certain scenarios (e.g. constraining the position so the window is always within desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowPosition', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowPosition@, defined at @SDL3\/SDL_video.h 1788:34@
+sDL_SetWindowPosition
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to reposition.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the window, or @'sDL_WINDOWPOS_CENTERED'@ or @'sDL_WINDOWPOS_UNDEFINED'@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the window, or @'sDL_WINDOWPOS_CENTERED'@ or @'sDL_WINDOWPOS_UNDEFINED'@.
+  -> IO BG.CBool
+sDL_SetWindowPosition = hs_bindgen_5267578336028cc0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowPosition@
+foreign import ccall safe "hs_bindgen_cbc04f11ecff82d4"
+  hs_bindgen_cbc04f11ecff82d4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowPosition@
+hs_bindgen_cbc04f11ecff82d4
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_cbc04f11ecff82d4 =
+  BG.fromFFIType hs_bindgen_cbc04f11ecff82d4_base
+
+-- | Get the position of a window.
+--
+--     This is the current position of the window as last reported by the windowing system.
+--
+--     If you do not need the value for one of the positions a NULL may be passed in the @x@ or @y@ parameter.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowPosition'
+--
+--     [C declaration]: @SDL_GetWindowPosition@, defined at @SDL3\/SDL_video.h 1813:34@
+sDL_GetWindowPosition
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@x@]: a pointer filled in with the x position of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@y@]: a pointer filled in with the y position of the window, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowPosition = hs_bindgen_cbc04f11ecff82d4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowSize@
+foreign import ccall safe "hs_bindgen_463917e130d8e442"
+  hs_bindgen_463917e130d8e442_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowSize@
+hs_bindgen_463917e130d8e442
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_463917e130d8e442 =
+  BG.fromFFIType hs_bindgen_463917e130d8e442_base
+
+-- | Request that the size of a window\'s client area be set.
+--
+--     If the window is in a fullscreen or maximized state, this request has no effect.
+--
+--     To change the exclusive fullscreen mode of a window, use @SDL_SetWindowFullscreenMode()@.
+--
+--     On some windowing systems, this request is asynchronous and the new window size may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window size changes, an SDL_EVENT_WINDOW_RESIZED event will be emitted with the new window dimensions. Note that the new dimensions may not match the exact size requested, as some windowing systems can restrict the window size in certain scenarios (e.g. constraining the size of the content area to remain within the usable desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSize', 'sDL_SetWindowFullscreenMode', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowSize@, defined at @SDL3\/SDL_video.h 1850:34@
+sDL_SetWindowSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the window, must be > 0.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the window, must be > 0.
+  -> IO BG.CBool
+sDL_SetWindowSize = hs_bindgen_463917e130d8e442
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowSize@
+foreign import ccall safe "hs_bindgen_31fa46c3424e203c"
+  hs_bindgen_31fa46c3424e203c_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowSize@
+hs_bindgen_31fa46c3424e203c
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_31fa46c3424e203c =
+  BG.fromFFIType hs_bindgen_31fa46c3424e203c_base
+
+-- | Get the size of a window\'s client area.
+--
+--     The window pixel size may differ from its window coordinate size if the window is on a high pixel density display. Use @SDL_GetWindowSizeInPixels()@ or SDL_GetRenderOutputSize() to get the real client area size in pixels.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetRenderOutputSize, 'sDL_GetWindowSizeInPixels', 'sDL_SetWindowSize', SDL_EVENT_WINDOW_RESIZED
+--
+--     [C declaration]: @SDL_GetWindowSize@, defined at @SDL3\/SDL_video.h 1874:34@
+sDL_GetWindowSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the width and height from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height of the window, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowSize = hs_bindgen_31fa46c3424e203c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowSafeArea@
+foreign import ccall safe "hs_bindgen_b2567486cc8ef384"
+  hs_bindgen_b2567486cc8ef384_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowSafeArea@
+hs_bindgen_b2567486cc8ef384
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_b2567486cc8ef384 =
+  BG.fromFFIType hs_bindgen_b2567486cc8ef384_base
+
+-- | Get the safe area for this window.
+--
+--     Some devices have portions of the screen which are partially obscured or not interactive, possibly due to on-screen controls, curved edges, camera notches, TV overscan, etc. This function provides the area of the window which is safe to have interactable content. You should continue rendering into the rest of the window, but it should not contain visually important or interactable content.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowSafeArea@, defined at @SDL3\/SDL_video.h 1896:34@
+sDL_GetWindowSafeArea
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the client area that is safe for interactive content.
+  -> IO BG.CBool
+sDL_GetWindowSafeArea = hs_bindgen_b2567486cc8ef384
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowAspectRatio@
+foreign import ccall safe "hs_bindgen_4718fa8444201efc"
+  hs_bindgen_4718fa8444201efc_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowAspectRatio@
+hs_bindgen_4718fa8444201efc
+  :: BG.Ptr SDL_Window
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_4718fa8444201efc =
+  BG.fromFFIType hs_bindgen_4718fa8444201efc_base
+
+-- | Request that the aspect ratio of a window\'s client area be set.
+--
+--     The aspect ratio is the ratio of width divided by height, e.g. 2560x1600 would be 1.6. Larger aspect ratios are wider and smaller aspect ratios are narrower.
+--
+--     If, at the time of this request, the window in a fixed-size state, such as maximized or fullscreen, the request will be deferred until the window exits this state and becomes resizable again.
+--
+--     On some windowing systems, this request is asynchronous and the new window aspect ratio may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window size changes, an SDL_EVENT_WINDOW_RESIZED event will be emitted with the new window dimensions. Note that the new dimensions may not match the exact aspect ratio requested, as some windowing systems can restrict the window size in certain scenarios (e.g. constraining the size of the content area to remain within the usable desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowAspectRatio', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowAspectRatio@, defined at @SDL3\/SDL_video.h 1937:34@
+sDL_SetWindowAspectRatio
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@min_aspect@]: the minimum aspect ratio of the window, or 0.0f for no limit.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@max_aspect@]: the maximum aspect ratio of the window, or 0.0f for no limit.
+  -> IO BG.CBool
+sDL_SetWindowAspectRatio =
+  hs_bindgen_4718fa8444201efc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowAspectRatio@
+foreign import ccall safe "hs_bindgen_b91e4ae738b99383"
+  hs_bindgen_b91e4ae738b99383_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowAspectRatio@
+hs_bindgen_b91e4ae738b99383
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_b91e4ae738b99383 =
+  BG.fromFFIType hs_bindgen_b91e4ae738b99383_base
+
+-- | Get the aspect ratio of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowAspectRatio'
+--
+--     [C declaration]: @SDL_GetWindowAspectRatio@, defined at @SDL3\/SDL_video.h 1956:34@
+sDL_GetWindowAspectRatio
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the width and height from.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@min_aspect@]: a pointer filled in with the minimum aspect ratio of the window, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@max_aspect@]: a pointer filled in with the maximum aspect ratio of the window, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowAspectRatio =
+  hs_bindgen_b91e4ae738b99383
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowBordersSize@
+foreign import ccall safe "hs_bindgen_1a0014cc2d5e995b"
+  hs_bindgen_1a0014cc2d5e995b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowBordersSize@
+hs_bindgen_1a0014cc2d5e995b
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_1a0014cc2d5e995b =
+  BG.fromFFIType hs_bindgen_1a0014cc2d5e995b_base
+
+-- | Get the size of a window\'s borders (decorations) around the client area.
+--
+--     Note: If this function fails (returns false), the size values will be initialized to 0, 0, 0, 0 (if a non-NULL pointer is provided), as if the window in question was borderless.
+--
+--     Note: This function may fail on systems where the window has not yet been decorated by the display server (for example, immediately after calling SDL_CreateWindow). It is recommended that you wait at least until the window has been presented and composited, so that the window system has a chance to decorate the window and provide the border dimensions to SDL.
+--
+--     This function also returns false if getting the information is not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSize'
+--
+--     [C declaration]: @SDL_GetWindowBordersSize@, defined at @SDL3\/SDL_video.h 1993:34@
+sDL_GetWindowBordersSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the size values of the border (decorations) from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@top@]: pointer to variable for storing the size of the top border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@left@]: pointer to variable for storing the size of the left border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@bottom@]: pointer to variable for storing the size of the bottom border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@right@]: pointer to variable for storing the size of the right border; NULL is permitted.
+  -> IO BG.CBool
+sDL_GetWindowBordersSize =
+  hs_bindgen_1a0014cc2d5e995b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowSizeInPixels@
+foreign import ccall safe "hs_bindgen_30e760d14c134b4b"
+  hs_bindgen_30e760d14c134b4b_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowSizeInPixels@
+hs_bindgen_30e760d14c134b4b
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_30e760d14c134b4b =
+  BG.fromFFIType hs_bindgen_30e760d14c134b4b_base
+
+-- | Get the size of a window\'s client area, in pixels.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateWindow', 'sDL_GetWindowSize'
+--
+--     [C declaration]: @SDL_GetWindowSizeInPixels@, defined at @SDL3\/SDL_video.h 2013:34@
+sDL_GetWindowSizeInPixels
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window from which the drawable size should be queried.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer to variable for storing the width in pixels, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer to variable for storing the height in pixels, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowSizeInPixels =
+  hs_bindgen_30e760d14c134b4b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowMinimumSize@
+foreign import ccall safe "hs_bindgen_f0719ee9bdadb864"
+  hs_bindgen_f0719ee9bdadb864_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowMinimumSize@
+hs_bindgen_f0719ee9bdadb864
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_f0719ee9bdadb864 =
+  BG.fromFFIType hs_bindgen_f0719ee9bdadb864_base
+
+-- | Set the minimum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMinimumSize', 'sDL_SetWindowMaximumSize'
+--
+--     [C declaration]: @SDL_SetWindowMinimumSize@, defined at @SDL3\/SDL_video.h 2031:34@
+sDL_SetWindowMinimumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@min_w@]: the minimum width of the window, or 0 for no limit.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@min_h@]: the minimum height of the window, or 0 for no limit.
+  -> IO BG.CBool
+sDL_SetWindowMinimumSize =
+  hs_bindgen_f0719ee9bdadb864
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowMinimumSize@
+foreign import ccall safe "hs_bindgen_8673ac2cc36b8fce"
+  hs_bindgen_8673ac2cc36b8fce_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowMinimumSize@
+hs_bindgen_8673ac2cc36b8fce
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_8673ac2cc36b8fce =
+  BG.fromFFIType hs_bindgen_8673ac2cc36b8fce_base
+
+-- | Get the minimum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMaximumSize', 'sDL_SetWindowMinimumSize'
+--
+--     [C declaration]: @SDL_GetWindowMinimumSize@, defined at @SDL3\/SDL_video.h 2051:34@
+sDL_GetWindowMinimumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the minimum width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the minimum height of the window, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowMinimumSize =
+  hs_bindgen_8673ac2cc36b8fce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowMaximumSize@
+foreign import ccall safe "hs_bindgen_8b1eeeed1710ce2d"
+  hs_bindgen_8b1eeeed1710ce2d_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowMaximumSize@
+hs_bindgen_8b1eeeed1710ce2d
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_8b1eeeed1710ce2d =
+  BG.fromFFIType hs_bindgen_8b1eeeed1710ce2d_base
+
+-- | Set the maximum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMaximumSize', 'sDL_SetWindowMinimumSize'
+--
+--     [C declaration]: @SDL_SetWindowMaximumSize@, defined at @SDL3\/SDL_video.h 2069:34@
+sDL_SetWindowMaximumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@max_w@]: the maximum width of the window, or 0 for no limit.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@max_h@]: the maximum height of the window, or 0 for no limit.
+  -> IO BG.CBool
+sDL_SetWindowMaximumSize =
+  hs_bindgen_8b1eeeed1710ce2d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowMaximumSize@
+foreign import ccall safe "hs_bindgen_48e1ff926a106d78"
+  hs_bindgen_48e1ff926a106d78_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowMaximumSize@
+hs_bindgen_48e1ff926a106d78
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_48e1ff926a106d78 =
+  BG.fromFFIType hs_bindgen_48e1ff926a106d78_base
+
+-- | Get the maximum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMinimumSize', 'sDL_SetWindowMaximumSize'
+--
+--     [C declaration]: @SDL_GetWindowMaximumSize@, defined at @SDL3\/SDL_video.h 2089:34@
+sDL_GetWindowMaximumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the maximum width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the maximum height of the window, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowMaximumSize =
+  hs_bindgen_48e1ff926a106d78
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowBordered@
+foreign import ccall safe "hs_bindgen_1fc2a3e35dc5c047"
+  hs_bindgen_1fc2a3e35dc5c047_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowBordered@
+hs_bindgen_1fc2a3e35dc5c047
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_1fc2a3e35dc5c047 =
+  BG.fromFFIType hs_bindgen_1fc2a3e35dc5c047_base
+
+-- | Set the border state of a window.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_BORDERLESS@ flag and add or remove the border from the actual window. This is a no-op if the window\'s border already matches the requested state.
+--
+--     You can\'t change the border state of a fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowBordered@, defined at @SDL3\/SDL_video.h 2111:34@
+sDL_SetWindowBordered
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the border state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@bordered@]: false to remove border, true to add border.
+  -> IO BG.CBool
+sDL_SetWindowBordered = hs_bindgen_1fc2a3e35dc5c047
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowResizable@
+foreign import ccall safe "hs_bindgen_602617d3d8b24265"
+  hs_bindgen_602617d3d8b24265_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowResizable@
+hs_bindgen_602617d3d8b24265
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_602617d3d8b24265 =
+  BG.fromFFIType hs_bindgen_602617d3d8b24265_base
+
+-- | Set the user-resizable state of a window.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_RESIZABLE@ flag and allow\/disallow user resizing of the window. This is a no-op if the window\'s resizable state already matches the requested state.
+--
+--     You can\'t change the resizable state of a fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowResizable@, defined at @SDL3\/SDL_video.h 2133:34@
+sDL_SetWindowResizable
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the resizable state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@resizable@]: true to allow resizing, false to disallow.
+  -> IO BG.CBool
+sDL_SetWindowResizable = hs_bindgen_602617d3d8b24265
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowAlwaysOnTop@
+foreign import ccall safe "hs_bindgen_1ca9fa2de9450921"
+  hs_bindgen_1ca9fa2de9450921_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowAlwaysOnTop@
+hs_bindgen_1ca9fa2de9450921
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_1ca9fa2de9450921 =
+  BG.fromFFIType hs_bindgen_1ca9fa2de9450921_base
+
+-- | Set the window to always be above the others.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_ALWAYS_ON_TOP@ flag. This will bring the window to the front and keep the window above the rest.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowAlwaysOnTop@, defined at @SDL3\/SDL_video.h 2152:34@
+sDL_SetWindowAlwaysOnTop
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the always on top state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@on_top@]: true to set the window always on top, false to disable.
+  -> IO BG.CBool
+sDL_SetWindowAlwaysOnTop =
+  hs_bindgen_1ca9fa2de9450921
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowFillDocument@
+foreign import ccall safe "hs_bindgen_4de8e5711e0b8b35"
+  hs_bindgen_4de8e5711e0b8b35_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowFillDocument@
+hs_bindgen_4de8e5711e0b8b35
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_4de8e5711e0b8b35 =
+  BG.fromFFIType hs_bindgen_4de8e5711e0b8b35_base
+
+-- | Set the window to fill the current document space (Emscripten only).
+--
+--     This will add or remove the window\'s @SDL_WINDOW_FILL_DOCUMENT@ flag.
+--
+--     Currently this flag only applies to the Emscripten target.
+--
+--     When enabled, the canvas element fills the entire document. Resize events will be generated as the browser window is resized, as that will adjust the canvas size as well. The canvas will cover anything else on the page, including any controls provided by Emscripten in its generated HTML file (in fact, any elements on the page that aren\'t the canvas will be moved into a hidden @div@ element).
+--
+--     Often times this is desirable for a browser-based game, but it means several things that we expect of an SDL window on other platforms might not work as expected, such as minimum window sizes and aspect ratios.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowFillDocument@, defined at @SDL3\/SDL_video.h 2183:34@
+sDL_SetWindowFillDocument
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the fill-document state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@fill@]: true to set the window to fill the document, false to disable.
+  -> IO BG.CBool
+sDL_SetWindowFillDocument =
+  hs_bindgen_4de8e5711e0b8b35
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_ShowWindow@
+foreign import ccall safe "hs_bindgen_db90afdec297ac45"
+  hs_bindgen_db90afdec297ac45_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_ShowWindow@
+hs_bindgen_db90afdec297ac45
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_db90afdec297ac45 =
+  BG.fromFFIType hs_bindgen_db90afdec297ac45_base
+
+-- | Show a window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HideWindow', 'sDL_RaiseWindow'
+--
+--     [C declaration]: @SDL_ShowWindow@, defined at @SDL3\/SDL_video.h 2199:34@
+sDL_ShowWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to show.
+  -> IO BG.CBool
+sDL_ShowWindow = hs_bindgen_db90afdec297ac45
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_HideWindow@
+foreign import ccall safe "hs_bindgen_151dd0c79f668116"
+  hs_bindgen_151dd0c79f668116_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_HideWindow@
+hs_bindgen_151dd0c79f668116
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_151dd0c79f668116 =
+  BG.fromFFIType hs_bindgen_151dd0c79f668116_base
+
+-- | Hide a window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShowWindow', @SDL_WINDOW_HIDDEN@
+--
+--     [C declaration]: @SDL_HideWindow@, defined at @SDL3\/SDL_video.h 2215:34@
+sDL_HideWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to hide.
+  -> IO BG.CBool
+sDL_HideWindow = hs_bindgen_151dd0c79f668116
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_RaiseWindow@
+foreign import ccall safe "hs_bindgen_f3eab79ea97d0a96"
+  hs_bindgen_f3eab79ea97d0a96_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_RaiseWindow@
+hs_bindgen_f3eab79ea97d0a96
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_f3eab79ea97d0a96 =
+  BG.fromFFIType hs_bindgen_f3eab79ea97d0a96_base
+
+-- | Request that a window be raised above other windows and gain the input focus.
+--
+--     The result of this request is subject to desktop window manager policy, particularly if raising the requested window would result in stealing focus from another application. If the window is successfully raised and gains input focus, an SDL_EVENT_WINDOW_FOCUS_GAINED event will be emitted, and the window will have the SDL_WINDOW_INPUT_FOCUS flag set.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RaiseWindow@, defined at @SDL3\/SDL_video.h 2235:34@
+sDL_RaiseWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to raise.
+  -> IO BG.CBool
+sDL_RaiseWindow = hs_bindgen_f3eab79ea97d0a96
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_MaximizeWindow@
+foreign import ccall safe "hs_bindgen_4702fc373b7a0194"
+  hs_bindgen_4702fc373b7a0194_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_MaximizeWindow@
+hs_bindgen_4702fc373b7a0194
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_4702fc373b7a0194 =
+  BG.fromFFIType hs_bindgen_4702fc373b7a0194_base
+
+-- | Request that the window be made as large as possible.
+--
+--     Non-resizable windows can\'t be maximized. The window must have the SDL_WINDOW_RESIZABLE flag set, or this will have no effect.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_MAXIMIZED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     When maximizing a window, whether the constraints set via @SDL_SetWindowMaximumSize()@ are honored depends on the policy of the window manager. Win32 and macOS enforce the constraints when maximizing, while X11 and Wayland window managers may vary.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MinimizeWindow', 'sDL_RestoreWindow', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_MaximizeWindow@, defined at @SDL3\/SDL_video.h 2269:34@
+sDL_MaximizeWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to maximize.
+  -> IO BG.CBool
+sDL_MaximizeWindow = hs_bindgen_4702fc373b7a0194
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_MinimizeWindow@
+foreign import ccall safe "hs_bindgen_740052b61f66d8b0"
+  hs_bindgen_740052b61f66d8b0_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_MinimizeWindow@
+hs_bindgen_740052b61f66d8b0
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_740052b61f66d8b0 =
+  BG.fromFFIType hs_bindgen_740052b61f66d8b0_base
+
+-- | Request that the window be minimized to an iconic representation.
+--
+--     If the window is in a fullscreen state, this request has no direct effect. It may alter the state the window is returned to when leaving fullscreen.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_MINIMIZED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MaximizeWindow', 'sDL_RestoreWindow', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_MinimizeWindow@, defined at @SDL3\/SDL_video.h 2298:34@
+sDL_MinimizeWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to minimize.
+  -> IO BG.CBool
+sDL_MinimizeWindow = hs_bindgen_740052b61f66d8b0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_RestoreWindow@
+foreign import ccall safe "hs_bindgen_26d521828ca2c776"
+  hs_bindgen_26d521828ca2c776_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_RestoreWindow@
+hs_bindgen_26d521828ca2c776
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_26d521828ca2c776 =
+  BG.fromFFIType hs_bindgen_26d521828ca2c776_base
+
+-- | Request that the size and position of a minimized or maximized window be restored.
+--
+--     If the window is in a fullscreen state, this request has no direct effect. It may alter the state the window is returned to when leaving fullscreen.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_RESTORED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MaximizeWindow', 'sDL_MinimizeWindow', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_RestoreWindow@, defined at @SDL3\/SDL_video.h 2328:34@
+sDL_RestoreWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to restore.
+  -> IO BG.CBool
+sDL_RestoreWindow = hs_bindgen_26d521828ca2c776
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowFullscreen@
+foreign import ccall safe "hs_bindgen_b364407ada14e440"
+  hs_bindgen_b364407ada14e440_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowFullscreen@
+hs_bindgen_b364407ada14e440
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_b364407ada14e440 =
+  BG.fromFFIType hs_bindgen_b364407ada14e440_base
+
+-- | Request that the window\'s fullscreen state be changed.
+--
+--     By default a window in fullscreen state uses borderless fullscreen desktop mode, but a specific exclusive display mode can be set using @SDL_SetWindowFullscreenMode()@.
+--
+--     On some windowing systems this request is asynchronous and the new fullscreen state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_ENTER_FULLSCREEN or SDL_EVENT_WINDOW_LEAVE_FULLSCREEN event will be emitted. Note that, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFullscreenMode', 'sDL_SetWindowFullscreenMode', 'sDL_SyncWindow', @SDL_WINDOW_FULLSCREEN@
+--
+--     [C declaration]: @SDL_SetWindowFullscreen@, defined at @SDL3\/SDL_video.h 2360:34@
+sDL_SetWindowFullscreen
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@fullscreen@]: true for fullscreen mode, false for windowed mode.
+  -> IO BG.CBool
+sDL_SetWindowFullscreen = hs_bindgen_b364407ada14e440
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SyncWindow@
+foreign import ccall safe "hs_bindgen_5fa6f076247f8fc0"
+  hs_bindgen_5fa6f076247f8fc0_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SyncWindow@
+hs_bindgen_5fa6f076247f8fc0
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_5fa6f076247f8fc0 =
+  BG.fromFFIType hs_bindgen_5fa6f076247f8fc0_base
+
+-- | Block until any pending window state is finalized.
+--
+--     On asynchronous windowing systems, this acts as a synchronization barrier for pending window state. It will attempt to wait until any pending window state has been applied and is guaranteed to return within finite time. Note that for how long it can potentially block depends on the underlying window system, as window state changes may involve somewhat lengthy animations that must complete before the window is in its final requested state.
+--
+--     On windowing systems where changes are immediate, this does nothing.
+--
+--     [Returns]: true on success or false if the operation timed out before the window was in the requested state.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowSize', 'sDL_SetWindowPosition', 'sDL_SetWindowFullscreen', 'sDL_MinimizeWindow', 'sDL_MaximizeWindow', 'sDL_RestoreWindow', SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS
+--
+--     [C declaration]: @SDL_SyncWindow@, defined at @SDL3\/SDL_video.h 2391:34@
+sDL_SyncWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to wait for the pending state to be applied.
+  -> IO BG.CBool
+sDL_SyncWindow = hs_bindgen_5fa6f076247f8fc0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_WindowHasSurface@
+foreign import ccall safe "hs_bindgen_0094e6c8474f41c7"
+  hs_bindgen_0094e6c8474f41c7_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_WindowHasSurface@
+hs_bindgen_0094e6c8474f41c7
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_0094e6c8474f41c7 =
+  BG.fromFFIType hs_bindgen_0094e6c8474f41c7_base
+
+-- | Return whether the window has a surface associated with it.
+--
+--     [Returns]: true if there is a surface associated with the window, or false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface'
+--
+--     [C declaration]: @SDL_WindowHasSurface@, defined at @SDL3\/SDL_video.h 2406:34@
+sDL_WindowHasSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CBool
+sDL_WindowHasSurface = hs_bindgen_0094e6c8474f41c7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowSurface@
+foreign import ccall safe "hs_bindgen_3935adead4d3fc9e"
+  hs_bindgen_3935adead4d3fc9e_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowSurface@
+hs_bindgen_3935adead4d3fc9e
+  :: BG.Ptr SDL_Window
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+hs_bindgen_3935adead4d3fc9e =
+  BG.fromFFIType hs_bindgen_3935adead4d3fc9e_base
+
+-- | Get the SDL surface associated with the window.
+--
+--     A new surface will be created with the optimal format for the window, if necessary. This surface will be freed when the window is destroyed. Do not free this surface.
+--
+--     This surface will be invalidated if the window is resized. After resizing a window this function must be called again to return a valid surface.
+--
+--     You may not combine this with 3D or the rendering API on this window.
+--
+--     This function is affected by @SDL_HINT_FRAMEBUFFER_ACCELERATION@.
+--
+--     [Returns]: the surface associated with the window, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyWindowSurface', 'sDL_WindowHasSurface', 'sDL_UpdateWindowSurface', 'sDL_UpdateWindowSurfaceRects'
+--
+--     [C declaration]: @SDL_GetWindowSurface@, defined at @SDL3\/SDL_video.h 2435:43@
+sDL_GetWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+sDL_GetWindowSurface = hs_bindgen_3935adead4d3fc9e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowSurfaceVSync@
+foreign import ccall safe "hs_bindgen_352d147569a3861c"
+  hs_bindgen_352d147569a3861c_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowSurfaceVSync@
+hs_bindgen_352d147569a3861c
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_352d147569a3861c =
+  BG.fromFFIType hs_bindgen_352d147569a3861c_base
+
+-- | Toggle VSync for the window surface.
+--
+--     When a window surface is created, vsync defaults to SDL_WINDOW_SURFACE_VSYNC_DISABLED.
+--
+--     The @vsync@ parameter can be 1 to synchronize present with every vertical refresh, 2 to synchronize present with every second vertical refresh, etc., SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or SDL_WINDOW_SURFACE_VSYNC_DISABLED to disable. Not every value is supported by every driver, so you should check the return value to see whether the requested setting is supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurfaceVSync'
+--
+--     [C declaration]: @SDL_SetWindowSurfaceVSync@, defined at @SDL3\/SDL_video.h 2461:34@
+sDL_SetWindowSurfaceVSync
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: the vertical refresh sync interval.
+  -> IO BG.CBool
+sDL_SetWindowSurfaceVSync =
+  hs_bindgen_352d147569a3861c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowSurfaceVSync@
+foreign import ccall safe "hs_bindgen_faa1386f6baf8835"
+  hs_bindgen_faa1386f6baf8835_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowSurfaceVSync@
+hs_bindgen_faa1386f6baf8835
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_faa1386f6baf8835 =
+  BG.fromFFIType hs_bindgen_faa1386f6baf8835_base
+
+-- | Get VSync for the window surface.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowSurfaceVSync'
+--
+--     [C declaration]: @SDL_GetWindowSurfaceVSync@, defined at @SDL3\/SDL_video.h 2481:34@
+sDL_GetWindowSurfaceVSync
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: an int filled with the current vertical refresh sync interval. See @SDL_SetWindowSurfaceVSync()@ for the meaning of the value.
+  -> IO BG.CBool
+sDL_GetWindowSurfaceVSync =
+  hs_bindgen_faa1386f6baf8835
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_UpdateWindowSurface@
+foreign import ccall safe "hs_bindgen_2865506d5d1ebc1d"
+  hs_bindgen_2865506d5d1ebc1d_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_UpdateWindowSurface@
+hs_bindgen_2865506d5d1ebc1d
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_2865506d5d1ebc1d =
+  BG.fromFFIType hs_bindgen_2865506d5d1ebc1d_base
+
+-- | Copy the window surface to the screen.
+--
+--     This is the function you use to reflect any changes to the surface on the screen.
+--
+--     This function is equivalent to the SDL 1.2 API SDL_Flip().
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface', 'sDL_UpdateWindowSurfaceRects'
+--
+--     [C declaration]: @SDL_UpdateWindowSurface@, defined at @SDL3\/SDL_video.h 2502:34@
+sDL_UpdateWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> IO BG.CBool
+sDL_UpdateWindowSurface = hs_bindgen_2865506d5d1ebc1d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_UpdateWindowSurfaceRects@
+foreign import ccall safe "hs_bindgen_9f52950557ec570d"
+  hs_bindgen_9f52950557ec570d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_UpdateWindowSurfaceRects@
+hs_bindgen_9f52950557ec570d
+  :: BG.Ptr SDL_Window
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_9f52950557ec570d =
+  BG.fromFFIType hs_bindgen_9f52950557ec570d_base
+
+-- | Copy areas of the window surface to the screen.
+--
+--     This is the function you use to reflect changes to portions of the surface on the screen.
+--
+--     This function is equivalent to the SDL 1.2 API SDL_UpdateRects().
+--
+--     Note that this function will update /at least/ the rectangles specified, but this is only intended as an optimization; in practice, this might update more of the screen (or all of the screen!), depending on what method SDL uses to send pixels to the system.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface', 'sDL_UpdateWindowSurface'
+--
+--     [C declaration]: @SDL_UpdateWindowSurfaceRects@, defined at @SDL3\/SDL_video.h 2531:34@
+sDL_UpdateWindowSurfaceRects
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rects@]: an array of SDL_Rect structures representing areas of the surface to copy, in pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@numrects@]: the number of rectangles.
+  -> IO BG.CBool
+sDL_UpdateWindowSurfaceRects =
+  hs_bindgen_9f52950557ec570d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_DestroyWindowSurface@
+foreign import ccall safe "hs_bindgen_281f842dd1d64c24"
+  hs_bindgen_281f842dd1d64c24_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_DestroyWindowSurface@
+hs_bindgen_281f842dd1d64c24
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_281f842dd1d64c24 =
+  BG.fromFFIType hs_bindgen_281f842dd1d64c24_base
+
+-- | Destroy the surface associated with the window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface', 'sDL_WindowHasSurface'
+--
+--     [C declaration]: @SDL_DestroyWindowSurface@, defined at @SDL3\/SDL_video.h 2547:34@
+sDL_DestroyWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> IO BG.CBool
+sDL_DestroyWindowSurface =
+  hs_bindgen_281f842dd1d64c24
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowKeyboardGrab@
+foreign import ccall safe "hs_bindgen_9810610308d37d7a"
+  hs_bindgen_9810610308d37d7a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowKeyboardGrab@
+hs_bindgen_9810610308d37d7a
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_9810610308d37d7a =
+  BG.fromFFIType hs_bindgen_9810610308d37d7a_base
+
+-- | Set a window\'s keyboard grab mode.
+--
+--     Keyboard grab enables capture of system keyboard shortcuts like Alt+Tab or the Meta\/Super key. Note that not all system keyboard shortcuts can be captured by applications (one example is Ctrl+Alt+Del on Windows).
+--
+--     This is primarily intended for specialized applications such as VNC clients or VM frontends. Normal games should not use keyboard grab.
+--
+--     When keyboard grab is enabled, SDL will continue to handle Alt+Tab when the window is full-screen to ensure the user is not trapped in your application. If you have a custom keyboard shortcut to exit fullscreen mode, you may suppress this behavior with @SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED@.
+--
+--     If the caller enables a grab while another window is currently grabbed, the other window loses its grab in favor of the caller\'s window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowKeyboardGrab', 'sDL_SetWindowMouseGrab'
+--
+--     [C declaration]: @SDL_SetWindowKeyboardGrab@, defined at @SDL3\/SDL_video.h 2580:34@
+sDL_SetWindowKeyboardGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the keyboard grab mode should be set.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@grabbed@]: this is true to grab keyboard, and false to release.
+  -> IO BG.CBool
+sDL_SetWindowKeyboardGrab =
+  hs_bindgen_9810610308d37d7a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowMouseGrab@
+foreign import ccall safe "hs_bindgen_d76ad355e95647e6"
+  hs_bindgen_d76ad355e95647e6_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowMouseGrab@
+hs_bindgen_d76ad355e95647e6
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_d76ad355e95647e6 =
+  BG.fromFFIType hs_bindgen_d76ad355e95647e6_base
+
+-- | Set a window\'s mouse grab mode.
+--
+--     Mouse grab confines the mouse cursor to the window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMouseRect', 'sDL_SetWindowMouseRect', 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_SetWindowMouseGrab@, defined at @SDL3\/SDL_video.h 2600:34@
+sDL_SetWindowMouseGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the mouse grab mode should be set.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@grabbed@]: this is true to grab mouse, and false to release.
+  -> IO BG.CBool
+sDL_SetWindowMouseGrab = hs_bindgen_d76ad355e95647e6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowKeyboardGrab@
+foreign import ccall safe "hs_bindgen_d6cecb629e2e4cf1"
+  hs_bindgen_d6cecb629e2e4cf1_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowKeyboardGrab@
+hs_bindgen_d6cecb629e2e4cf1
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_d6cecb629e2e4cf1 =
+  BG.fromFFIType hs_bindgen_d6cecb629e2e4cf1_base
+
+-- | Get a window\'s keyboard grab mode.
+--
+--     [Returns]: true if keyboard is grabbed, and false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_GetWindowKeyboardGrab@, defined at @SDL3\/SDL_video.h 2614:34@
+sDL_GetWindowKeyboardGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CBool
+sDL_GetWindowKeyboardGrab =
+  hs_bindgen_d6cecb629e2e4cf1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowMouseGrab@
+foreign import ccall safe "hs_bindgen_c4a10336d87afa11"
+  hs_bindgen_c4a10336d87afa11_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowMouseGrab@
+hs_bindgen_c4a10336d87afa11
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_c4a10336d87afa11 =
+  BG.fromFFIType hs_bindgen_c4a10336d87afa11_base
+
+-- | Get a window\'s mouse grab mode.
+--
+--     [Returns]: true if mouse is grabbed, and false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMouseRect', 'sDL_SetWindowMouseRect', 'sDL_SetWindowMouseGrab', 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_GetWindowMouseGrab@, defined at @SDL3\/SDL_video.h 2631:34@
+sDL_GetWindowMouseGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CBool
+sDL_GetWindowMouseGrab = hs_bindgen_c4a10336d87afa11
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetGrabbedWindow@
+foreign import ccall safe "hs_bindgen_dc47f3dead3a7c4c"
+  hs_bindgen_dc47f3dead3a7c4c_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetGrabbedWindow@
+hs_bindgen_dc47f3dead3a7c4c :: IO (BG.Ptr SDL_Window)
+hs_bindgen_dc47f3dead3a7c4c =
+  BG.fromFFIType hs_bindgen_dc47f3dead3a7c4c_base
+
+-- | Get the window that currently has an input grab enabled.
+--
+--     [Returns]: the window if input is grabbed or NULL otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowMouseGrab', 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_GetGrabbedWindow@, defined at @SDL3\/SDL_video.h 2645:42@
+sDL_GetGrabbedWindow :: IO (BG.Ptr SDL_Window)
+sDL_GetGrabbedWindow = hs_bindgen_dc47f3dead3a7c4c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowMouseRect@
+foreign import ccall safe "hs_bindgen_cea803a34ce672ab"
+  hs_bindgen_cea803a34ce672ab_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowMouseRect@
+hs_bindgen_cea803a34ce672ab
+  :: BG.Ptr SDL_Window
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_cea803a34ce672ab =
+  BG.fromFFIType hs_bindgen_cea803a34ce672ab_base
+
+-- | Confines the cursor to the specified area of a window.
+--
+--     Note that this does NOT grab the cursor, it only defines the area a cursor is restricted to when the window has mouse focus.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMouseRect', 'sDL_GetWindowMouseGrab', 'sDL_SetWindowMouseGrab'
+--
+--     [C declaration]: @SDL_SetWindowMouseRect@, defined at @SDL3\/SDL_video.h 2667:34@
+sDL_SetWindowMouseRect
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that will be associated with the barrier.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a rectangle area in window-relative coordinates. If NULL the barrier for the specified window will be destroyed.
+  -> IO BG.CBool
+sDL_SetWindowMouseRect = hs_bindgen_cea803a34ce672ab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowMouseRect@
+foreign import ccall safe "hs_bindgen_20aa207b179a0f01"
+  hs_bindgen_20aa207b179a0f01_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowMouseRect@
+hs_bindgen_20aa207b179a0f01
+  :: BG.Ptr SDL_Window
+  -> IO (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect)
+hs_bindgen_20aa207b179a0f01 =
+  BG.fromFFIType hs_bindgen_20aa207b179a0f01_base
+
+-- | Get the mouse confinement rectangle of a window.
+--
+--     [Returns]: a pointer to the mouse confinement rectangle of a window, or NULL if there isn\'t one.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowMouseRect', 'sDL_GetWindowMouseGrab', 'sDL_SetWindowMouseGrab'
+--
+--     [C declaration]: @SDL_GetWindowMouseRect@, defined at @SDL3\/SDL_video.h 2684:46@
+sDL_GetWindowMouseRect
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect)
+sDL_GetWindowMouseRect = hs_bindgen_20aa207b179a0f01
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowOpacity@
+foreign import ccall safe "hs_bindgen_8604a41f1b752f5d"
+  hs_bindgen_8604a41f1b752f5d_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowOpacity@
+hs_bindgen_8604a41f1b752f5d
+  :: BG.Ptr SDL_Window
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_8604a41f1b752f5d =
+  BG.fromFFIType hs_bindgen_8604a41f1b752f5d_base
+
+-- | Set the opacity for a window.
+--
+--     The parameter @opacity@ will be clamped internally between 0.0f (transparent) and 1.0f (opaque).
+--
+--     This function also returns false if setting the opacity isn\'t supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowOpacity'
+--
+--     [C declaration]: @SDL_SetWindowOpacity@, defined at @SDL3\/SDL_video.h 2705:34@
+sDL_SetWindowOpacity
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window which will be made transparent or opaque.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@opacity@]: the opacity value (0.0f - transparent, 1.0f - opaque).
+  -> IO BG.CBool
+sDL_SetWindowOpacity = hs_bindgen_8604a41f1b752f5d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowOpacity@
+foreign import ccall safe "hs_bindgen_3101cb57bb822dd1"
+  hs_bindgen_3101cb57bb822dd1_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowOpacity@
+hs_bindgen_3101cb57bb822dd1
+  :: BG.Ptr SDL_Window
+  -> IO BG.CFloat
+hs_bindgen_3101cb57bb822dd1 =
+  BG.fromFFIType hs_bindgen_3101cb57bb822dd1_base
+
+-- | Get the opacity of a window.
+--
+--     If transparency isn\'t supported on this platform, opacity will be returned as 1.0f without error.
+--
+--     [Returns]: the opacity, (0.0f - transparent, 1.0f - opaque), or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowOpacity'
+--
+--     [C declaration]: @SDL_GetWindowOpacity@, defined at @SDL3\/SDL_video.h 2723:35@
+sDL_GetWindowOpacity
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current opacity value from.
+  -> IO BG.CFloat
+sDL_GetWindowOpacity = hs_bindgen_3101cb57bb822dd1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowParent@
+foreign import ccall safe "hs_bindgen_1cc8b9ab8edf00bb"
+  hs_bindgen_1cc8b9ab8edf00bb_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowParent@
+hs_bindgen_1cc8b9ab8edf00bb
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_1cc8b9ab8edf00bb =
+  BG.fromFFIType hs_bindgen_1cc8b9ab8edf00bb_base
+
+-- | Set the window as a child of a parent window.
+--
+--     If the window is already the child of an existing window, it will be reparented to the new owner. Setting the parent window to NULL unparents the window and removes child window status.
+--
+--     If a parent window is hidden or destroyed, the operation will be recursively applied to child windows. Child windows hidden with the parent that did not have their hidden status explicitly set will be restored when the parent is shown.
+--
+--     Attempting to set the parent of a window that is currently in the modal state will fail. Use @SDL_SetWindowModal()@ to cancel the modal status before attempting to change the parent.
+--
+--     Popup windows cannot change parents and attempts to do so will fail.
+--
+--     Setting a parent window that is currently the sibling or descendent of the child window results in undefined behavior.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowModal'
+--
+--     [C declaration]: @SDL_SetWindowParent@, defined at @SDL3\/SDL_video.h 2757:34@
+sDL_SetWindowParent
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that should become the child of a parent.
+  -> BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@parent@]: the new parent window for the child window.
+  -> IO BG.CBool
+sDL_SetWindowParent = hs_bindgen_1cc8b9ab8edf00bb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowModal@
+foreign import ccall safe "hs_bindgen_6a6cf75fb3644441"
+  hs_bindgen_6a6cf75fb3644441_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowModal@
+hs_bindgen_6a6cf75fb3644441
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_6a6cf75fb3644441 =
+  BG.fromFFIType hs_bindgen_6a6cf75fb3644441_base
+
+-- | Toggle the state of the window as modal.
+--
+--     To enable modal status on a window, the window must currently be the child window of a parent, or toggling modal status on will fail.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowParent', @SDL_WINDOW_MODAL@
+--
+--     [C declaration]: @SDL_SetWindowModal@, defined at @SDL3\/SDL_video.h 2777:34@
+sDL_SetWindowModal
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window on which to set the modal state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@modal@]: true to toggle modal status on, false to toggle it off.
+  -> IO BG.CBool
+sDL_SetWindowModal = hs_bindgen_6a6cf75fb3644441
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowFocusable@
+foreign import ccall safe "hs_bindgen_b8c33cea6b55cf17"
+  hs_bindgen_b8c33cea6b55cf17_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowFocusable@
+hs_bindgen_b8c33cea6b55cf17
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_b8c33cea6b55cf17 =
+  BG.fromFFIType hs_bindgen_b8c33cea6b55cf17_base
+
+-- | Set whether the window may have input focus.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetWindowFocusable@, defined at @SDL3\/SDL_video.h 2791:34@
+sDL_SetWindowFocusable
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to set focusable state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@focusable@]: true to allow input focus, false to not allow input focus.
+  -> IO BG.CBool
+sDL_SetWindowFocusable = hs_bindgen_b8c33cea6b55cf17
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_ShowWindowSystemMenu@
+foreign import ccall safe "hs_bindgen_ce10733e3b7a4ffa"
+  hs_bindgen_ce10733e3b7a4ffa_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_ShowWindowSystemMenu@
+hs_bindgen_ce10733e3b7a4ffa
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_ce10733e3b7a4ffa =
+  BG.fromFFIType hs_bindgen_ce10733e3b7a4ffa_base
+
+-- | Display the system-level window menu.
+--
+--     This default window menu is provided by the system and on some platforms provides functionality for setting or changing privileged state on the window, such as moving it between workspaces or displays, or toggling the always-on-top property.
+--
+--     On platforms or desktops where this is unsupported, this function does nothing.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ShowWindowSystemMenu@, defined at @SDL3\/SDL_video.h 2817:34@
+sDL_ShowWindowSystemMenu
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the menu will be displayed.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the menu, relative to the origin (top-left) of the client area.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the menu, relative to the origin (top-left) of the client area.
+  -> IO BG.CBool
+sDL_ShowWindowSystemMenu =
+  hs_bindgen_ce10733e3b7a4ffa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowHitTest@
+foreign import ccall safe "hs_bindgen_9639f427d08bb73e"
+  hs_bindgen_9639f427d08bb73e_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowHitTest@
+hs_bindgen_9639f427d08bb73e
+  :: BG.Ptr SDL_Window
+  -> SDL_HitTest
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_9639f427d08bb73e =
+  BG.fromFFIType hs_bindgen_9639f427d08bb73e_base
+
+-- | Provide a callback that decides if a window region has special properties.
+--
+--     Normally windows are dragged and resized by decorations provided by the system window manager (a title bar, borders, etc), but for some apps, it makes sense to drag them from somewhere else inside the window itself; for example, one might have a borderless window that wants to be draggable from any part, or simulate its own title bar, etc.
+--
+--     This function lets the app provide a callback that designates pieces of a given window as special. This callback is run during event processing if we need to tell the OS to treat a region of the window specially; the use of this callback is known as \"hit testing.\"
+--
+--     Mouse input may not be delivered to your application if it is within a special area; the OS will often apply that input to moving the window or resizing the window and not deliver it to the application.
+--
+--     Specifying NULL for a callback disables hit-testing. Hit-testing is disabled by default.
+--
+--     Platforms that don\'t support this functionality will return false unconditionally, even if you\'re attempting to disable hit-testing.
+--
+--     Your callback may fire at any time, and its firing does not indicate any specific behavior (for example, on Windows, this certainly might fire when the OS is deciding whether to drag your window, but it fires for lots of other reasons, too, some unrelated to anything you probably care about /and when the mouse isn\'t actually at the location it is testing/). Since this can fire at any time, you should try to keep your callback efficient, devoid of allocations, etc.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetWindowHitTest@, defined at @SDL3\/SDL_video.h 2898:34@
+sDL_SetWindowHitTest
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to set hit-testing on.
+  -> SDL_HitTest
+  -- ^
+  --
+  --           [@callback@]: the function to call when doing a hit-test.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@callback_data@]: an app-defined void pointer passed to __callback__.
+  -> IO BG.CBool
+sDL_SetWindowHitTest = hs_bindgen_9639f427d08bb73e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowShape@
+foreign import ccall safe "hs_bindgen_ed6846899beda7ab"
+  hs_bindgen_ed6846899beda7ab_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowShape@
+hs_bindgen_ed6846899beda7ab
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_ed6846899beda7ab =
+  BG.fromFFIType hs_bindgen_ed6846899beda7ab_base
+
+-- | Set the shape of a transparent window.
+--
+--     This sets the alpha channel of a transparent window and any fully transparent areas are also transparent to mouse clicks. If you are using something besides the SDL render API, then you are responsible for drawing the alpha channel of the window to match the shape alpha channel to get consistent cross-platform results.
+--
+--     The shape is copied inside this function, so you can free it afterwards. If your shape surface changes, you should call @SDL_SetWindowShape()@ again to update the window. This is an expensive operation, so should be done sparingly.
+--
+--     The window must have been created with the SDL_WINDOW_TRANSPARENT flag.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetWindowShape@, defined at @SDL3\/SDL_video.h 2926:34@
+sDL_SetWindowShape
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@shape@]: the surface representing the shape of the window, or NULL to remove any current shape.
+  -> IO BG.CBool
+sDL_SetWindowShape = hs_bindgen_ed6846899beda7ab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_FlashWindow@
+foreign import ccall safe "hs_bindgen_e1ccf70cb57d0520"
+  hs_bindgen_e1ccf70cb57d0520_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_FlashWindow@
+hs_bindgen_e1ccf70cb57d0520
+  :: BG.Ptr SDL_Window
+  -> SDL_FlashOperation
+  -> IO BG.CBool
+hs_bindgen_e1ccf70cb57d0520 =
+  BG.fromFFIType hs_bindgen_e1ccf70cb57d0520_base
+
+-- | Request a window to demand attention from the user.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_FlashWindow@, defined at @SDL3\/SDL_video.h 2940:34@
+sDL_FlashWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to be flashed.
+  -> SDL_FlashOperation
+  -- ^
+  --
+  --           [@operation@]: the operation to perform.
+  -> IO BG.CBool
+sDL_FlashWindow = hs_bindgen_e1ccf70cb57d0520
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowProgressState@
+foreign import ccall safe "hs_bindgen_5b04ab3d00de3188"
+  hs_bindgen_5b04ab3d00de3188_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowProgressState@
+hs_bindgen_5b04ab3d00de3188
+  :: BG.Ptr SDL_Window
+  -> SDL_ProgressState
+  -> IO BG.CBool
+hs_bindgen_5b04ab3d00de3188 =
+  BG.fromFFIType hs_bindgen_5b04ab3d00de3188_base
+
+-- | Sets the state of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetWindowProgressState@, defined at @SDL3\/SDL_video.h 2955:34@
+sDL_SetWindowProgressState
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window whose progress state is to be modified.
+  -> SDL_ProgressState
+  -- ^
+  --
+  --           [@state@]: the progress state. @SDL_PROGRESS_STATE_NONE@ stops displaying the progress bar.
+  -> IO BG.CBool
+sDL_SetWindowProgressState =
+  hs_bindgen_5b04ab3d00de3188
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowProgressState@
+foreign import ccall safe "hs_bindgen_f0c456909c3f00e4"
+  hs_bindgen_f0c456909c3f00e4_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowProgressState@
+hs_bindgen_f0c456909c3f00e4
+  :: BG.Ptr SDL_Window
+  -> IO SDL_ProgressState
+hs_bindgen_f0c456909c3f00e4 =
+  BG.fromFFIType hs_bindgen_f0c456909c3f00e4_base
+
+-- | Get the state of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: the progress state, or @SDL_PROGRESS_STATE_INVALID@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetWindowProgressState@, defined at @SDL3\/SDL_video.h 2968:47@
+sDL_GetWindowProgressState
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current progress state from.
+  -> IO SDL_ProgressState
+sDL_GetWindowProgressState =
+  hs_bindgen_f0c456909c3f00e4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowProgressValue@
+foreign import ccall safe "hs_bindgen_61b3840500263851"
+  hs_bindgen_61b3840500263851_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_SetWindowProgressValue@
+hs_bindgen_61b3840500263851
+  :: BG.Ptr SDL_Window
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_61b3840500263851 =
+  BG.fromFFIType hs_bindgen_61b3840500263851_base
+
+-- | Sets the value of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetWindowProgressValue@, defined at @SDL3\/SDL_video.h 2983:34@
+sDL_SetWindowProgressValue
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window whose progress value is to be modified.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@value@]: the progress value in the range of [0.0f - 1.0f]. If the value is outside the valid range, it gets clamped.
+  -> IO BG.CBool
+sDL_SetWindowProgressValue =
+  hs_bindgen_61b3840500263851
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowProgressValue@
+foreign import ccall safe "hs_bindgen_11c3352b21aa2799"
+  hs_bindgen_11c3352b21aa2799_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GetWindowProgressValue@
+hs_bindgen_11c3352b21aa2799
+  :: BG.Ptr SDL_Window
+  -> IO BG.CFloat
+hs_bindgen_11c3352b21aa2799 =
+  BG.fromFFIType hs_bindgen_11c3352b21aa2799_base
+
+-- | Get the value of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: the progress value in the range of [0.0f - 1.0f], or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetWindowProgressValue@, defined at @SDL3\/SDL_video.h 2996:35@
+sDL_GetWindowProgressValue
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current progress value from.
+  -> IO BG.CFloat
+sDL_GetWindowProgressValue =
+  hs_bindgen_11c3352b21aa2799
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_DestroyWindow@
+foreign import ccall safe "hs_bindgen_b3962b19443d34da"
+  hs_bindgen_b3962b19443d34da_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_DestroyWindow@
+hs_bindgen_b3962b19443d34da
+  :: BG.Ptr SDL_Window
+  -> IO ()
+hs_bindgen_b3962b19443d34da =
+  BG.fromFFIType hs_bindgen_b3962b19443d34da_base
+
+-- | Destroy a window.
+--
+--     Any child windows owned by the window will be recursively destroyed as well.
+--
+--     Note that on some platforms, the visible window may not actually be removed from the screen until the SDL event loop is pumped again, even though the 'SDL_Window' is no longer valid after this call.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreatePopupWindow', 'sDL_CreateWindow', 'sDL_CreateWindowWithProperties'
+--
+--     [C declaration]: @SDL_DestroyWindow@, defined at @SDL3\/SDL_video.h 3018:34@
+sDL_DestroyWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to destroy.
+  -> IO ()
+sDL_DestroyWindow = hs_bindgen_b3962b19443d34da
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_ScreenSaverEnabled@
+foreign import ccall safe "hs_bindgen_84c0659acf0fe2dc"
+  hs_bindgen_84c0659acf0fe2dc_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_ScreenSaverEnabled@
+hs_bindgen_84c0659acf0fe2dc :: IO BG.CBool
+hs_bindgen_84c0659acf0fe2dc =
+  BG.fromFFIType hs_bindgen_84c0659acf0fe2dc_base
+
+-- | Check whether the screensaver is currently enabled.
+--
+--     The screensaver is disabled by default.
+--
+--     The default can also be changed using @SDL_HINT_VIDEO_ALLOW_SCREENSAVER@.
+--
+--     [Returns]: true if the screensaver is enabled, false if it is disabled.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DisableScreenSaver', 'sDL_EnableScreenSaver'
+--
+--     [C declaration]: @SDL_ScreenSaverEnabled@, defined at @SDL3\/SDL_video.h 3037:34@
+sDL_ScreenSaverEnabled :: IO BG.CBool
+sDL_ScreenSaverEnabled = hs_bindgen_84c0659acf0fe2dc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EnableScreenSaver@
+foreign import ccall safe "hs_bindgen_166142199f6402d0"
+  hs_bindgen_166142199f6402d0_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EnableScreenSaver@
+hs_bindgen_166142199f6402d0 :: IO BG.CBool
+hs_bindgen_166142199f6402d0 =
+  BG.fromFFIType hs_bindgen_166142199f6402d0_base
+
+-- | Allow the screen to be blanked by a screen saver.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DisableScreenSaver', 'sDL_ScreenSaverEnabled'
+--
+--     [C declaration]: @SDL_EnableScreenSaver@, defined at @SDL3\/SDL_video.h 3052:34@
+sDL_EnableScreenSaver :: IO BG.CBool
+sDL_EnableScreenSaver = hs_bindgen_166142199f6402d0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_DisableScreenSaver@
+foreign import ccall safe "hs_bindgen_83a7f8efb2c664c5"
+  hs_bindgen_83a7f8efb2c664c5_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_DisableScreenSaver@
+hs_bindgen_83a7f8efb2c664c5 :: IO BG.CBool
+hs_bindgen_83a7f8efb2c664c5 =
+  BG.fromFFIType hs_bindgen_83a7f8efb2c664c5_base
+
+-- | Prevent the screen from being blanked by a screen saver.
+--
+--     If you disable the screensaver, it is automatically re-enabled when SDL quits.
+--
+--     The screensaver is disabled by default, but this may by changed by SDL_HINT_VIDEO_ALLOW_SCREENSAVER.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EnableScreenSaver', 'sDL_ScreenSaverEnabled'
+--
+--     [C declaration]: @SDL_DisableScreenSaver@, defined at @SDL3\/SDL_video.h 3073:34@
+sDL_DisableScreenSaver :: IO BG.CBool
+sDL_DisableScreenSaver = hs_bindgen_83a7f8efb2c664c5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_LoadLibrary@
+foreign import ccall safe "hs_bindgen_c47d12c66f8cfd5c"
+  hs_bindgen_c47d12c66f8cfd5c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_LoadLibrary@
+hs_bindgen_c47d12c66f8cfd5c
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_c47d12c66f8cfd5c =
+  BG.fromFFIType hs_bindgen_c47d12c66f8cfd5c_base
+
+-- | Dynamically load an OpenGL library.
+--
+--     This should be done after initializing the video driver, but before creating any OpenGL windows. If no OpenGL library is loaded, the default library will be loaded upon creation of the first OpenGL window.
+--
+--     If you do this, you need to retrieve all of the GL functions used in your program from the dynamic library using @SDL_GL_GetProcAddress()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_GetProcAddress', 'sDL_GL_UnloadLibrary'
+--
+--     [C declaration]: @SDL_GL_LoadLibrary@, defined at @SDL3\/SDL_video.h 3103:34@
+sDL_GL_LoadLibrary
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the platform dependent OpenGL library name, or NULL to open the default OpenGL library.
+  -> IO BG.CBool
+sDL_GL_LoadLibrary = hs_bindgen_c47d12c66f8cfd5c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_GetProcAddress@
+foreign import ccall safe "hs_bindgen_e435ceb0289a8035"
+  hs_bindgen_e435ceb0289a8035_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_GetProcAddress@
+hs_bindgen_e435ceb0289a8035
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+hs_bindgen_e435ceb0289a8035 =
+  BG.fromFFIType hs_bindgen_e435ceb0289a8035_base
+
+-- | Get an OpenGL function by name.
+--
+--     If the GL library is loaded at runtime with @SDL_GL_LoadLibrary()@, then all GL functions must be retrieved this way. Usually this is used to retrieve function pointers to OpenGL extensions.
+--
+--     There are some quirks to looking up OpenGL functions that require some extra care from the application. If you code carefully, you can handle these quirks without any platform-specific code, though:
+--
+--     * On Windows, function pointers are specific to the current GL context; this means you need to have created a GL context and made it current before calling @SDL_GL_GetProcAddress()@. If you recreate your context or create a second context, you should assume that any existing function pointers aren\'t valid to use with it. This is (currently) a Windows-specific limitation, and in practice lots of drivers don\'t suffer this limitation, but it is still the way the wgl API is documented to work and you should expect crashes if you don\'t respect it. Store a copy of the function pointers that comes and goes with context lifespan.
+--
+--     * On X11, function pointers returned by this function are valid for any context, and can even be looked up before a context is created at all. This means that, for at least some common OpenGL implementations, if you look up a function that doesn\'t exist, you\'ll get a non-NULL result that is /NOT/ safe to call. You must always make sure the function is actually available for a given GL context before calling it, by checking for the existence of the appropriate extension with @SDL_GL_ExtensionSupported()@, or verifying that the version of OpenGL you\'re using offers the function as core functionality.
+--
+--     * Some OpenGL drivers, on all platforms, /will/ return NULL if a function isn\'t supported, but you can\'t count on this behavior. Check for extensions you use, and if you get a NULL anyway, act as if that extension wasn\'t available. This is probably a bug in the driver, but you can code defensively for this scenario anyhow.
+--
+--     * Just because you\'re on Linux\/Unix, don\'t assume you\'ll be using X11. Next-gen display servers are waiting to replace it, and may or may not make the same promises about function pointers.
+--
+--     * OpenGL function pointers must be declared @APIENTRY@ as in the example code. This will ensure the proper calling convention is followed on platforms where this matters (Win32) thereby avoiding stack corruption.
+--
+--     [Returns]: a pointer to the named OpenGL function. The returned pointer should be cast to the appropriate function signature.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_ExtensionSupported', 'sDL_GL_LoadLibrary', 'sDL_GL_UnloadLibrary'
+--
+--     [C declaration]: @SDL_GL_GetProcAddress@, defined at @SDL3\/SDL_video.h 3158:49@
+sDL_GL_GetProcAddress
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@proc@]: the name of an OpenGL function.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+sDL_GL_GetProcAddress = hs_bindgen_e435ceb0289a8035
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EGL_GetProcAddress@
+foreign import ccall safe "hs_bindgen_894763e4be5fe96f"
+  hs_bindgen_894763e4be5fe96f_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EGL_GetProcAddress@
+hs_bindgen_894763e4be5fe96f
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+hs_bindgen_894763e4be5fe96f =
+  BG.fromFFIType hs_bindgen_894763e4be5fe96f_base
+
+-- | Get an EGL library function by name.
+--
+--     If an EGL library is loaded, this function allows applications to get entry points for EGL functions. This is useful to provide to an EGL API and extension loader.
+--
+--     [Returns]: a pointer to the named EGL function. The returned pointer should be cast to the appropriate function signature.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EGL_GetCurrentDisplay'
+--
+--     [C declaration]: @SDL_EGL_GetProcAddress@, defined at @SDL3\/SDL_video.h 3177:49@
+sDL_EGL_GetProcAddress
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@proc@]: the name of an EGL function.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+sDL_EGL_GetProcAddress = hs_bindgen_894763e4be5fe96f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_UnloadLibrary@
+foreign import ccall safe "hs_bindgen_88c7a6f4d6a9b36e"
+  hs_bindgen_88c7a6f4d6a9b36e_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_UnloadLibrary@
+hs_bindgen_88c7a6f4d6a9b36e :: IO ()
+hs_bindgen_88c7a6f4d6a9b36e =
+  BG.fromFFIType hs_bindgen_88c7a6f4d6a9b36e_base
+
+-- | Unload the OpenGL library previously loaded by @SDL_GL_LoadLibrary()@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_LoadLibrary'
+--
+--     [C declaration]: @SDL_GL_UnloadLibrary@, defined at @SDL3\/SDL_video.h 3188:34@
+sDL_GL_UnloadLibrary :: IO ()
+sDL_GL_UnloadLibrary = hs_bindgen_88c7a6f4d6a9b36e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_ExtensionSupported@
+foreign import ccall safe "hs_bindgen_d8ad3d720e0d97e4"
+  hs_bindgen_d8ad3d720e0d97e4_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_ExtensionSupported@
+hs_bindgen_d8ad3d720e0d97e4
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_d8ad3d720e0d97e4 =
+  BG.fromFFIType hs_bindgen_d8ad3d720e0d97e4_base
+
+-- | Check if an OpenGL extension is supported for the current context.
+--
+--     This function operates on the current GL context; you must have created a context and it must be current before calling this function. Do not assume that all contexts you create will have the same set of extensions available, or that recreating an existing context will offer the same extensions again.
+--
+--     While it\'s probably not a massive overhead, this function is not an O(1) operation. Check the extensions you care about after creating the GL context and save that information somewhere instead of calling the function every time you need to know.
+--
+--     [Returns]: true if the extension is supported, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GL_ExtensionSupported@, defined at @SDL3\/SDL_video.h 3211:34@
+sDL_GL_ExtensionSupported
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@extension@]: the name of the extension to check.
+  -> IO BG.CBool
+sDL_GL_ExtensionSupported =
+  hs_bindgen_d8ad3d720e0d97e4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_ResetAttributes@
+foreign import ccall safe "hs_bindgen_0e89b220270eca27"
+  hs_bindgen_0e89b220270eca27_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_ResetAttributes@
+hs_bindgen_0e89b220270eca27 :: IO ()
+hs_bindgen_0e89b220270eca27 =
+  BG.fromFFIType hs_bindgen_0e89b220270eca27_base
+
+-- | Reset all previously set OpenGL context attributes to their default values.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_GetAttribute', 'sDL_GL_SetAttribute'
+--
+--     [C declaration]: @SDL_GL_ResetAttributes@, defined at @SDL3\/SDL_video.h 3223:34@
+sDL_GL_ResetAttributes :: IO ()
+sDL_GL_ResetAttributes = hs_bindgen_0e89b220270eca27
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_SetAttribute@
+foreign import ccall safe "hs_bindgen_6a7a5b133a68dc0f"
+  hs_bindgen_6a7a5b133a68dc0f_base
+    :: BG.Word32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_SetAttribute@
+hs_bindgen_6a7a5b133a68dc0f
+  :: SDL_GLAttr
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_6a7a5b133a68dc0f =
+  BG.fromFFIType hs_bindgen_6a7a5b133a68dc0f_base
+
+-- | Set an OpenGL window attribute before window creation.
+--
+--     This function sets the OpenGL attribute @attr@ to @value@. The requested attributes should be set before creating an OpenGL window. You should use @SDL_GL_GetAttribute()@ to check the values after creating the OpenGL context, since the values obtained can differ from the requested ones.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_CreateContext', 'sDL_GL_GetAttribute', 'sDL_GL_ResetAttributes'
+--
+--     [C declaration]: @SDL_GL_SetAttribute@, defined at @SDL3\/SDL_video.h 3246:34@
+sDL_GL_SetAttribute
+  :: SDL_GLAttr
+  -- ^
+  --
+  --           [@attr@]: an enum value specifying the OpenGL attribute to set.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@value@]: the desired value for the attribute.
+  -> IO BG.CBool
+sDL_GL_SetAttribute = hs_bindgen_6a7a5b133a68dc0f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_GetAttribute@
+foreign import ccall safe "hs_bindgen_a558edf739642b48"
+  hs_bindgen_a558edf739642b48_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_GetAttribute@
+hs_bindgen_a558edf739642b48
+  :: SDL_GLAttr
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_a558edf739642b48 =
+  BG.fromFFIType hs_bindgen_a558edf739642b48_base
+
+-- | Get the actual value for an attribute from the current context.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_ResetAttributes', 'sDL_GL_SetAttribute'
+--
+--     [C declaration]: @SDL_GL_GetAttribute@, defined at @SDL3\/SDL_video.h 3264:34@
+sDL_GL_GetAttribute
+  :: SDL_GLAttr
+  -- ^
+  --
+  --           [@attr@]: an 'SDL_GLAttr' enum value specifying the OpenGL attribute to get.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the current value of @attr@.
+  -> IO BG.CBool
+sDL_GL_GetAttribute = hs_bindgen_a558edf739642b48
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_CreateContext@
+foreign import ccall safe "hs_bindgen_7a22bf48d0f84507"
+  hs_bindgen_7a22bf48d0f84507_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_CreateContext@
+hs_bindgen_7a22bf48d0f84507
+  :: BG.Ptr SDL_Window
+  -> IO SDL_GLContext
+hs_bindgen_7a22bf48d0f84507 =
+  BG.fromFFIType hs_bindgen_7a22bf48d0f84507_base
+
+-- | Create an OpenGL context for an OpenGL window, and make it current.
+--
+--     The OpenGL context will be created with the current states set through @SDL_GL_SetAttribute()@.
+--
+--     The 'SDL_Window' specified must have been created with the SDL_WINDOW_OPENGL flag, or context creation will fail.
+--
+--     Windows users new to OpenGL should note that, for historical reasons, GL functions added after OpenGL version 1.1 are not available by default. Those functions must be loaded at run-time, either with an OpenGL extension-handling library or with @SDL_GL_GetProcAddress()@ and its related functions.
+--
+--     'SDL_GLContext' is opaque to the application.
+--
+--     [Returns]: the OpenGL context associated with @window@ or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_DestroyContext', 'sDL_GL_MakeCurrent'
+--
+--     [C declaration]: @SDL_GL_CreateContext@, defined at @SDL3\/SDL_video.h 3294:43@
+sDL_GL_CreateContext
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to associate with the context.
+  -> IO SDL_GLContext
+sDL_GL_CreateContext = hs_bindgen_7a22bf48d0f84507
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_MakeCurrent@
+foreign import ccall safe "hs_bindgen_ff7daec2405dfb35"
+  hs_bindgen_ff7daec2405dfb35_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_MakeCurrent@
+hs_bindgen_ff7daec2405dfb35
+  :: BG.Ptr SDL_Window
+  -> SDL_GLContext
+  -> IO BG.CBool
+hs_bindgen_ff7daec2405dfb35 =
+  BG.fromFFIType hs_bindgen_ff7daec2405dfb35_base
+
+-- | Set up an OpenGL context for rendering into an OpenGL window.
+--
+--     The context must have been created with a compatible window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_CreateContext'
+--
+--     [C declaration]: @SDL_GL_MakeCurrent@, defined at @SDL3\/SDL_video.h 3312:34@
+sDL_GL_MakeCurrent
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to associate with the context.
+  -> SDL_GLContext
+  -- ^
+  --
+  --           [@context@]: the OpenGL context to associate with the window.
+  -> IO BG.CBool
+sDL_GL_MakeCurrent = hs_bindgen_ff7daec2405dfb35
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_GetCurrentWindow@
+foreign import ccall safe "hs_bindgen_6eb4d946a4d2ae7b"
+  hs_bindgen_6eb4d946a4d2ae7b_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_GetCurrentWindow@
+hs_bindgen_6eb4d946a4d2ae7b :: IO (BG.Ptr SDL_Window)
+hs_bindgen_6eb4d946a4d2ae7b =
+  BG.fromFFIType hs_bindgen_6eb4d946a4d2ae7b_base
+
+-- | Get the currently active OpenGL window.
+--
+--     [Returns]: the currently active OpenGL window on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GL_GetCurrentWindow@, defined at @SDL3\/SDL_video.h 3324:42@
+sDL_GL_GetCurrentWindow :: IO (BG.Ptr SDL_Window)
+sDL_GL_GetCurrentWindow = hs_bindgen_6eb4d946a4d2ae7b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_GetCurrentContext@
+foreign import ccall safe "hs_bindgen_c32923dac368266d"
+  hs_bindgen_c32923dac368266d_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_GetCurrentContext@
+hs_bindgen_c32923dac368266d :: IO SDL_GLContext
+hs_bindgen_c32923dac368266d =
+  BG.fromFFIType hs_bindgen_c32923dac368266d_base
+
+-- | Get the currently active OpenGL context.
+--
+--     [Returns]: the currently active OpenGL context or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_MakeCurrent'
+--
+--     [C declaration]: @SDL_GL_GetCurrentContext@, defined at @SDL3\/SDL_video.h 3338:43@
+sDL_GL_GetCurrentContext :: IO SDL_GLContext
+sDL_GL_GetCurrentContext =
+  hs_bindgen_c32923dac368266d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EGL_GetCurrentDisplay@
+foreign import ccall safe "hs_bindgen_19cd590b75a39bcc"
+  hs_bindgen_19cd590b75a39bcc_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EGL_GetCurrentDisplay@
+hs_bindgen_19cd590b75a39bcc :: IO SDL_EGLDisplay
+hs_bindgen_19cd590b75a39bcc =
+  BG.fromFFIType hs_bindgen_19cd590b75a39bcc_base
+
+-- | Get the currently active EGL display.
+--
+--     [Returns]: the currently active EGL display or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_GetCurrentDisplay@, defined at @SDL3\/SDL_video.h 3350:44@
+sDL_EGL_GetCurrentDisplay :: IO SDL_EGLDisplay
+sDL_EGL_GetCurrentDisplay =
+  hs_bindgen_19cd590b75a39bcc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EGL_GetCurrentConfig@
+foreign import ccall safe "hs_bindgen_652c87a58c2fcc27"
+  hs_bindgen_652c87a58c2fcc27_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EGL_GetCurrentConfig@
+hs_bindgen_652c87a58c2fcc27 :: IO SDL_EGLConfig
+hs_bindgen_652c87a58c2fcc27 =
+  BG.fromFFIType hs_bindgen_652c87a58c2fcc27_base
+
+-- | Get the currently active EGL config.
+--
+--     [Returns]: the currently active EGL config or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_GetCurrentConfig@, defined at @SDL3\/SDL_video.h 3362:43@
+sDL_EGL_GetCurrentConfig :: IO SDL_EGLConfig
+sDL_EGL_GetCurrentConfig =
+  hs_bindgen_652c87a58c2fcc27
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EGL_GetWindowSurface@
+foreign import ccall safe "hs_bindgen_a7fa1925e88a0d07"
+  hs_bindgen_a7fa1925e88a0d07_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EGL_GetWindowSurface@
+hs_bindgen_a7fa1925e88a0d07
+  :: BG.Ptr SDL_Window
+  -> IO SDL_EGLSurface
+hs_bindgen_a7fa1925e88a0d07 =
+  BG.fromFFIType hs_bindgen_a7fa1925e88a0d07_base
+
+-- | Get the EGL surface associated with the window.
+--
+--     [Returns]: the EGLSurface pointer associated with the window, or NULL on failure.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_GetWindowSurface@, defined at @SDL3\/SDL_video.h 3375:44@
+sDL_EGL_GetWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_EGLSurface
+sDL_EGL_GetWindowSurface =
+  hs_bindgen_a7fa1925e88a0d07
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EGL_SetAttributeCallbacks@
+foreign import ccall safe "hs_bindgen_5095f621e48adf13"
+  hs_bindgen_5095f621e48adf13_base
+    :: BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_EGL_SetAttributeCallbacks@
+hs_bindgen_5095f621e48adf13
+  :: SDL_EGLAttribArrayCallback
+  -> SDL_EGLIntArrayCallback
+  -> SDL_EGLIntArrayCallback
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_5095f621e48adf13 =
+  BG.fromFFIType hs_bindgen_5095f621e48adf13_base
+
+-- | Sets the callbacks for defining custom EGLAttrib arrays for EGL initialization.
+--
+--     Callbacks that aren\'t needed can be set to NULL.
+--
+--     NOTE: These callback pointers will be reset after SDL_GL_ResetAttributes.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_SetAttributeCallbacks@, defined at @SDL3\/SDL_video.h 3397:34@
+sDL_EGL_SetAttributeCallbacks
+  :: SDL_EGLAttribArrayCallback
+  -- ^
+  --
+  --           [@platformAttribCallback@]: callback for attributes to pass to eglGetPlatformDisplay. May be NULL.
+  -> SDL_EGLIntArrayCallback
+  -- ^
+  --
+  --           [@surfaceAttribCallback@]: callback for attributes to pass to eglCreateSurface. May be NULL.
+  -> SDL_EGLIntArrayCallback
+  -- ^
+  --
+  --           [@contextAttribCallback@]: callback for attributes to pass to eglCreateContext. May be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to the callbacks.
+  -> IO ()
+sDL_EGL_SetAttributeCallbacks =
+  hs_bindgen_5095f621e48adf13
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_SetSwapInterval@
+foreign import ccall safe "hs_bindgen_32295faebc369c7a"
+  hs_bindgen_32295faebc369c7a_base
+    :: BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_SetSwapInterval@
+hs_bindgen_32295faebc369c7a
+  :: BG.CInt
+  -> IO BG.CBool
+hs_bindgen_32295faebc369c7a =
+  BG.fromFFIType hs_bindgen_32295faebc369c7a_base
+
+-- | Set the swap interval for the current OpenGL context.
+--
+--     Some systems allow specifying -1 for the interval, to enable adaptive vsync. Adaptive vsync works the same as vsync, but if you\'ve already missed the vertical retrace for a given frame, it swaps buffers immediately, which might be less jarring for the user during occasional framerate drops. If an application requests adaptive vsync and the system does not support it, this function will fail and return false. In such a case, you should probably retry the call with 1 for the interval.
+--
+--     Adaptive vsync is implemented for some glX drivers with GLX_EXT_swap_control_tear, and for some Windows drivers with WGL_EXT_swap_control_tear.
+--
+--     Read more on the Khronos wiki: [https:\/\/www.khronos.org\/opengl\/wiki\/Swap_Interval\#Adaptive_Vsync](https://www.khronos.org/opengl/wiki/Swap_Interval#Adaptive_Vsync)
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_GetSwapInterval'
+--
+--     [C declaration]: @SDL_GL_SetSwapInterval@, defined at @SDL3\/SDL_video.h 3430:34@
+sDL_GL_SetSwapInterval
+  :: BG.CInt
+  -- ^
+  --
+  --           [@interval@]: 0 for immediate updates, 1 for updates synchronized with the vertical retrace, -1 for adaptive vsync.
+  -> IO BG.CBool
+sDL_GL_SetSwapInterval = hs_bindgen_32295faebc369c7a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_GetSwapInterval@
+foreign import ccall safe "hs_bindgen_04719e6e434557d3"
+  hs_bindgen_04719e6e434557d3_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_GetSwapInterval@
+hs_bindgen_04719e6e434557d3
+  :: BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_04719e6e434557d3 =
+  BG.fromFFIType hs_bindgen_04719e6e434557d3_base
+
+-- | Get the swap interval for the current OpenGL context.
+--
+--     If the system can\'t determine the swap interval, or there isn\'t a valid current context, this function will set *interval to 0 as a safe default.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_SetSwapInterval'
+--
+--     [C declaration]: @SDL_GL_GetSwapInterval@, defined at @SDL3\/SDL_video.h 3451:34@
+sDL_GL_GetSwapInterval
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@interval@]: output interval value. 0 if there is no vertical retrace synchronization, 1 if the buffer swap is synchronized with the vertical retrace, and -1 if late swaps happen immediately instead of waiting for the next retrace.
+  -> IO BG.CBool
+sDL_GL_GetSwapInterval = hs_bindgen_04719e6e434557d3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_SwapWindow@
+foreign import ccall safe "hs_bindgen_1d8b57ab49fbefc1"
+  hs_bindgen_1d8b57ab49fbefc1_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_SwapWindow@
+hs_bindgen_1d8b57ab49fbefc1
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_1d8b57ab49fbefc1 =
+  BG.fromFFIType hs_bindgen_1d8b57ab49fbefc1_base
+
+-- | Update a window with OpenGL rendering.
+--
+--     This is used with double-buffered OpenGL contexts, which are the default.
+--
+--     On macOS, make sure you bind 0 to the draw framebuffer before swapping the window, otherwise nothing will happen. If you aren\'t using glBindFramebuffer(), this is the default and you won\'t have to do anything extra.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GL_SwapWindow@, defined at @SDL3\/SDL_video.h 3471:34@
+sDL_GL_SwapWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> IO BG.CBool
+sDL_GL_SwapWindow = hs_bindgen_1d8b57ab49fbefc1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_DestroyContext@
+foreign import ccall safe "hs_bindgen_7da107ca01a650af"
+  hs_bindgen_7da107ca01a650af_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Safe_SDL_GL_DestroyContext@
+hs_bindgen_7da107ca01a650af
+  :: SDL_GLContext
+  -> IO BG.CBool
+hs_bindgen_7da107ca01a650af =
+  BG.fromFFIType hs_bindgen_7da107ca01a650af_base
+
+-- | Delete an OpenGL context.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_CreateContext'
+--
+--     [C declaration]: @SDL_GL_DestroyContext@, defined at @SDL3\/SDL_video.h 3486:34@
+sDL_GL_DestroyContext
+  :: SDL_GLContext
+  -- ^
+  --
+  --           [@context@]: the OpenGL context to be deleted.
+  -> IO BG.CBool
+sDL_GL_DestroyContext = hs_bindgen_7da107ca01a650af
diff --git a/src/SDL3/Sys/Bindgen/Video/Unsafe.hs b/src/SDL3/Sys/Bindgen/Video/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Video/Unsafe.hs
@@ -0,0 +1,5495 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Video.Unsafe (
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetNumVideoDrivers,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetVideoDriver,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetCurrentVideoDriver,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetSystemTheme,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetDisplays,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetPrimaryDisplay,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetDisplayProperties,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetDisplayName,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetDisplayBounds,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetDisplayUsableBounds,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetNaturalDisplayOrientation,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetCurrentDisplayOrientation,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetDisplayContentScale,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetFullscreenDisplayModes,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetClosestFullscreenDisplayMode,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetDesktopDisplayMode,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetCurrentDisplayMode,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetDisplayForPoint,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetDisplayForRect,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetDisplayForWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowPixelDensity,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowDisplayScale,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowFullscreenMode,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowFullscreenMode,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowICCProfile,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowPixelFormat,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindows,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_CreateWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_CreatePopupWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_CreateWindowWithProperties,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowID,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowFromID,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowParent,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowProperties,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowFlags,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowTitle,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowTitle,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowIcon,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowPosition,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowPosition,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowSize,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowSize,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowSafeArea,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowAspectRatio,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowAspectRatio,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowBordersSize,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowSizeInPixels,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowMinimumSize,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowMinimumSize,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowMaximumSize,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowMaximumSize,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowBordered,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowResizable,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowAlwaysOnTop,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowFillDocument,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_ShowWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_HideWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_RaiseWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_MaximizeWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_MinimizeWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_RestoreWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowFullscreen,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SyncWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_WindowHasSurface,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowSurface,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowSurfaceVSync,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowSurfaceVSync,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_UpdateWindowSurface,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_UpdateWindowSurfaceRects,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_DestroyWindowSurface,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowKeyboardGrab,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowMouseGrab,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowKeyboardGrab,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowMouseGrab,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetGrabbedWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowMouseRect,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowMouseRect,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowOpacity,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowOpacity,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowParent,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowModal,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowFocusable,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_ShowWindowSystemMenu,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowHitTest,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowShape,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_FlashWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowProgressState,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowProgressState,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_SetWindowProgressValue,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GetWindowProgressValue,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_DestroyWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_ScreenSaverEnabled,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_EnableScreenSaver,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_DisableScreenSaver,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_LoadLibrary,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_GetProcAddress,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_EGL_GetProcAddress,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_UnloadLibrary,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_ExtensionSupported,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_ResetAttributes,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_SetAttribute,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_GetAttribute,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_CreateContext,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_MakeCurrent,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_GetCurrentWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_GetCurrentContext,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_EGL_GetCurrentDisplay,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_EGL_GetCurrentConfig,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_EGL_GetWindowSurface,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_EGL_SetAttributeCallbacks,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_SetSwapInterval,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_GetSwapInterval,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_SwapWindow,
+  SDL3.Sys.Bindgen.Video.Unsafe.sDL_GL_DestroyContext,
+)
+where
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_video.h>"
+         , "signed int hs_bindgen_5592dffe201a625d (void)"
+         , "{"
+         , "  return (SDL_GetNumVideoDrivers)();"
+         , "}"
+         , "char const *hs_bindgen_85f4e358bde66c9a ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetVideoDriver)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_63fbce696f1ed5a6 (void)"
+         , "{"
+         , "  return (SDL_GetCurrentVideoDriver)();"
+         , "}"
+         , "SDL_SystemTheme hs_bindgen_c80ec935a539ddd8 (void)"
+         , "{"
+         , "  return (SDL_GetSystemTheme)();"
+         , "}"
+         , "SDL_DisplayID *hs_bindgen_d0c686e8303409e7 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplays)(arg1);"
+         , "}"
+         , "SDL_DisplayID hs_bindgen_6b2fa2820b978e45 (void)"
+         , "{"
+         , "  return (SDL_GetPrimaryDisplay)();"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_2811399c7688084b ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayProperties)(arg1);"
+         , "}"
+         , "char const *hs_bindgen_348f75329e6ce8d9 ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayName)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_ef8f0d981192b3f9 ("
+         , "  SDL_DisplayID arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayBounds)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_c49b6c7690711e0a ("
+         , "  SDL_DisplayID arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayUsableBounds)(arg1, arg2);"
+         , "}"
+         , "SDL_DisplayOrientation hs_bindgen_57dcd89da18e0a7a ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetNaturalDisplayOrientation)(arg1);"
+         , "}"
+         , "SDL_DisplayOrientation hs_bindgen_c8c1a7af21e9840d ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCurrentDisplayOrientation)(arg1);"
+         , "}"
+         , "float hs_bindgen_84541dd84a5f8bf5 ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayContentScale)(arg1);"
+         , "}"
+         , "SDL_DisplayMode **hs_bindgen_7fcb2edb01c8f735 ("
+         , "  SDL_DisplayID arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetFullscreenDisplayModes)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_4d4a115b24dc1a8a ("
+         , "  SDL_DisplayID arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  float arg4,"
+         , "  _Bool arg5,"
+         , "  SDL_DisplayMode *arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_GetClosestFullscreenDisplayMode)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "SDL_DisplayMode const *hs_bindgen_f150e56ed07c3071 ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDesktopDisplayMode)(arg1);"
+         , "}"
+         , "SDL_DisplayMode const *hs_bindgen_090c1ea46d46ae35 ("
+         , "  SDL_DisplayID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetCurrentDisplayMode)(arg1);"
+         , "}"
+         , "SDL_DisplayID hs_bindgen_c4ca0071d547fe4e ("
+         , "  SDL_Point const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayForPoint)(arg1);"
+         , "}"
+         , "SDL_DisplayID hs_bindgen_53772eb32f15250a ("
+         , "  SDL_Rect const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayForRect)(arg1);"
+         , "}"
+         , "SDL_DisplayID hs_bindgen_b5e8747042982325 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetDisplayForWindow)(arg1);"
+         , "}"
+         , "float hs_bindgen_37fb7f14d8ab4245 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowPixelDensity)(arg1);"
+         , "}"
+         , "float hs_bindgen_f51393abfbd8d0f1 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowDisplayScale)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_13b017b8b715b141 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_DisplayMode const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowFullscreenMode)(arg1, arg2);"
+         , "}"
+         , "SDL_DisplayMode const *hs_bindgen_3d833d32498da130 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowFullscreenMode)(arg1);"
+         , "}"
+         , "void *hs_bindgen_c8fc95a50e802a12 ("
+         , "  SDL_Window *arg1,"
+         , "  size_t *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowICCProfile)(arg1, arg2);"
+         , "}"
+         , "SDL_PixelFormat hs_bindgen_90e43d0f5b0c1797 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowPixelFormat)(arg1);"
+         , "}"
+         , "SDL_Window **hs_bindgen_37819cd7ef5a283c ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindows)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_c104a86e94d91733 ("
+         , "  char const *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  SDL_WindowFlags arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateWindow)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "SDL_Window *hs_bindgen_f8de823bce00580d ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3,"
+         , "  signed int arg4,"
+         , "  signed int arg5,"
+         , "  SDL_WindowFlags arg6"
+         , ")"
+         , "{"
+         , "  return (SDL_CreatePopupWindow)(arg1, arg2, arg3, arg4, arg5, arg6);"
+         , "}"
+         , "SDL_Window *hs_bindgen_397cd16b0ee4c2c1 ("
+         , "  SDL_PropertiesID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_CreateWindowWithProperties)(arg1);"
+         , "}"
+         , "SDL_WindowID hs_bindgen_4cd31f508a882913 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowID)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_9a86d1e90d48506e ("
+         , "  SDL_WindowID arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowFromID)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_de155dd6392c018c ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowParent)(arg1);"
+         , "}"
+         , "SDL_PropertiesID hs_bindgen_354b9a2ce76470de ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowProperties)(arg1);"
+         , "}"
+         , "SDL_WindowFlags hs_bindgen_c7a6fd0b395c141b ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowFlags)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_fb8782aef9af1e58 ("
+         , "  SDL_Window *arg1,"
+         , "  char const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowTitle)(arg1, arg2);"
+         , "}"
+         , "char const *hs_bindgen_b46de7aa720113f3 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowTitle)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_dcfd86c373d614de ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowIcon)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_2778939bf2a03cc0 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowPosition)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_0dd4bcea36c16a31 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowPosition)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_057ef11fd12bbeb6 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_f812f66416921726 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_212ea87435c7ebb9 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowSafeArea)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_a97676f9d3d5cacb ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2,"
+         , "  float arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowAspectRatio)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_c4fcb6be51b89962 ("
+         , "  SDL_Window *arg1,"
+         , "  float *arg2,"
+         , "  float *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowAspectRatio)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_fe9fa856ca0ad8ba ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3,"
+         , "  signed int *arg4,"
+         , "  signed int *arg5"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowBordersSize)(arg1, arg2, arg3, arg4, arg5);"
+         , "}"
+         , "_Bool hs_bindgen_0bdc369c35af7209 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowSizeInPixels)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_4a83221f1efbc09f ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowMinimumSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_9492964d5df1add3 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowMinimumSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_70ec3985e428bdd2 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowMaximumSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_948d13442e6065ab ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2,"
+         , "  signed int *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowMaximumSize)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_6289af3cb8f93407 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowBordered)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_46aff2e1cb31d53c ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowResizable)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_745fd81846537dd7 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowAlwaysOnTop)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_51036b434b8a9d9a ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetWindowFillDocument)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetWindowFillDocument requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "_Bool hs_bindgen_7fdf198ee1ca7f92 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_ShowWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_2764604bcb0dc3ca ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_HideWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_655550628b940a03 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RaiseWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_080d71419d89f8ac ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_MaximizeWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_e1f35d0dbc3b4400 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_MinimizeWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_e090b304456b95d1 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_RestoreWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_b1dbd6c7bf42bc68 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowFullscreen)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_ce8bade87de24cec ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_SyncWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_60a31e841c25b5c2 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_WindowHasSurface)(arg1);"
+         , "}"
+         , "SDL_Surface *hs_bindgen_b27ac903c03a4dfa ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowSurface)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_507572e10b7f7b5d ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowSurfaceVSync)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b6f4ee5ffa664900 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowSurfaceVSync)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_0647ceba715b9468 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateWindowSurface)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_99ad341567ec7dd7 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect const *arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_UpdateWindowSurfaceRects)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_7c381c64250e8266 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_DestroyWindowSurface)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_088757457073c51d ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowKeyboardGrab)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_fcca3f67a0285f40 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowMouseGrab)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_cda2cd2af79b5ca6 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowKeyboardGrab)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_3d8a4df5806b21ff ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowMouseGrab)(arg1);"
+         , "}"
+         , "SDL_Window *hs_bindgen_63a195963286004a (void)"
+         , "{"
+         , "  return (SDL_GetGrabbedWindow)();"
+         , "}"
+         , "_Bool hs_bindgen_3da85ada2677f1fd ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Rect const *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowMouseRect)(arg1, arg2);"
+         , "}"
+         , "SDL_Rect const *hs_bindgen_45c2c94bf4760d8a ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowMouseRect)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_019c9148c0aa4e8f ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowOpacity)(arg1, arg2);"
+         , "}"
+         , "float hs_bindgen_744325d9009c4077 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GetWindowOpacity)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_effc3e47de752f57 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Window *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowParent)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_d48e7b0b38e32483 ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowModal)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_45029d07ea1d3a4d ("
+         , "  SDL_Window *arg1,"
+         , "  _Bool arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowFocusable)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_839b36668059a297 ("
+         , "  SDL_Window *arg1,"
+         , "  signed int arg2,"
+         , "  signed int arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_ShowWindowSystemMenu)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_b4659f0d8b06588e ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_HitTest arg2,"
+         , "  void *arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowHitTest)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_e671b0b9ca790520 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_Surface *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_SetWindowShape)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_631082dd3b92af79 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_FlashOperation arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_FlashWindow)(arg1, arg2);"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_ProgressState;"
+         , "#endif"
+         , "_Bool hs_bindgen_24d52be2d578e3a6 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_ProgressState arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetWindowProgressState)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetWindowProgressState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "#include <SDL3/SDL_version.h>"
+         , "#if !SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "typedef int SDL_ProgressState;"
+         , "#endif"
+         , "SDL_ProgressState hs_bindgen_d7a642f9cea765c4 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetWindowProgressState)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetWindowProgressState requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "_Bool hs_bindgen_0a7984bb3f923d56 ("
+         , "  SDL_Window *arg1,"
+         , "  float arg2"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_SetWindowProgressValue)(arg1, arg2);"
+         , "#else"
+         , "  (void)arg1; (void)arg2; SDL_SetError(\"SDL_SetWindowProgressValue requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "#include <SDL3/SDL_version.h>"
+         , "#include <SDL3/SDL_error.h>"
+         , "float hs_bindgen_936a487daf968843 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "#if SDL_VERSION_ATLEAST(3, 4, 0)"
+         , "  return (SDL_GetWindowProgressValue)(arg1);"
+         , "#else"
+         , "  (void)arg1; SDL_SetError(\"SDL_GetWindowProgressValue requires SDL >= 3.4.0\"); return 0;"
+         , "#endif"
+         , "}"
+         , "void hs_bindgen_c66377fe72053eef ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  (SDL_DestroyWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_8d4460920f35fe23 (void)"
+         , "{"
+         , "  return (SDL_ScreenSaverEnabled)();"
+         , "}"
+         , "_Bool hs_bindgen_b0634b88ba5dac7b (void)"
+         , "{"
+         , "  return (SDL_EnableScreenSaver)();"
+         , "}"
+         , "_Bool hs_bindgen_2a05f306113c76cb (void)"
+         , "{"
+         , "  return (SDL_DisableScreenSaver)();"
+         , "}"
+         , "_Bool hs_bindgen_80ecb7f912f6a101 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_LoadLibrary)(arg1);"
+         , "}"
+         , "SDL_FunctionPointer hs_bindgen_45ec5c45b7aeecbc ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_GetProcAddress)(arg1);"
+         , "}"
+         , "SDL_FunctionPointer hs_bindgen_fecd43d56eba918e ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_EGL_GetProcAddress)(arg1);"
+         , "}"
+         , "void hs_bindgen_86d08bc666c9f566 (void)"
+         , "{"
+         , "  (SDL_GL_UnloadLibrary)();"
+         , "}"
+         , "_Bool hs_bindgen_8c89c426b6cd15de ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_ExtensionSupported)(arg1);"
+         , "}"
+         , "void hs_bindgen_c0ef2cbb30166af5 (void)"
+         , "{"
+         , "  (SDL_GL_ResetAttributes)();"
+         , "}"
+         , "_Bool hs_bindgen_dfea3fa025830d75 ("
+         , "  SDL_GLAttr arg1,"
+         , "  signed int arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_SetAttribute)(arg1, arg2);"
+         , "}"
+         , "_Bool hs_bindgen_b4ec3aa42353470f ("
+         , "  SDL_GLAttr arg1,"
+         , "  signed int *arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_GetAttribute)(arg1, arg2);"
+         , "}"
+         , "SDL_GLContext hs_bindgen_02589eafe594e5ce ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_CreateContext)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_d986b780d1ccac33 ("
+         , "  SDL_Window *arg1,"
+         , "  SDL_GLContext arg2"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_MakeCurrent)(arg1, arg2);"
+         , "}"
+         , "SDL_Window *hs_bindgen_24a0284995e8a74e (void)"
+         , "{"
+         , "  return (SDL_GL_GetCurrentWindow)();"
+         , "}"
+         , "SDL_GLContext hs_bindgen_cb9ceaede20b4208 (void)"
+         , "{"
+         , "  return (SDL_GL_GetCurrentContext)();"
+         , "}"
+         , "SDL_EGLDisplay hs_bindgen_709f1c4141e36bd4 (void)"
+         , "{"
+         , "  return (SDL_EGL_GetCurrentDisplay)();"
+         , "}"
+         , "SDL_EGLConfig hs_bindgen_1a495e63c24b9e1d (void)"
+         , "{"
+         , "  return (SDL_EGL_GetCurrentConfig)();"
+         , "}"
+         , "SDL_EGLSurface hs_bindgen_2dc2976e346931c2 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_EGL_GetWindowSurface)(arg1);"
+         , "}"
+         , "void hs_bindgen_6f6c52b23bae7a50 ("
+         , "  SDL_EGLAttribArrayCallback arg1,"
+         , "  SDL_EGLIntArrayCallback arg2,"
+         , "  SDL_EGLIntArrayCallback arg3,"
+         , "  void *arg4"
+         , ")"
+         , "{"
+         , "  (SDL_EGL_SetAttributeCallbacks)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "_Bool hs_bindgen_9fcc7f15d61d9182 ("
+         , "  signed int arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_SetSwapInterval)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_d23bd762103b2805 ("
+         , "  signed int *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_GetSwapInterval)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_0142b6de91fcc321 ("
+         , "  SDL_Window *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_SwapWindow)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_efe95fa2c1c2690c ("
+         , "  SDL_GLContext arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_GL_DestroyContext)(arg1);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetNumVideoDrivers@
+foreign import ccall unsafe "hs_bindgen_5592dffe201a625d"
+  hs_bindgen_5592dffe201a625d_base
+    :: IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetNumVideoDrivers@
+hs_bindgen_5592dffe201a625d :: IO BG.CInt
+hs_bindgen_5592dffe201a625d =
+  BG.fromFFIType hs_bindgen_5592dffe201a625d_base
+
+-- | Get the number of video drivers compiled into SDL.
+--
+--     [Returns]: the number of built in video drivers.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetVideoDriver'
+--
+--     [C declaration]: @SDL_GetNumVideoDrivers@, defined at @SDL3\/SDL_video.h 563:33@
+sDL_GetNumVideoDrivers :: IO BG.CInt
+sDL_GetNumVideoDrivers = hs_bindgen_5592dffe201a625d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetVideoDriver@
+foreign import ccall unsafe "hs_bindgen_85f4e358bde66c9a"
+  hs_bindgen_85f4e358bde66c9a_base
+    :: BG.Int32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetVideoDriver@
+hs_bindgen_85f4e358bde66c9a
+  :: BG.CInt
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_85f4e358bde66c9a =
+  BG.fromFFIType hs_bindgen_85f4e358bde66c9a_base
+
+-- | Get the name of a built in video driver.
+--
+--     The video 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 \"cocoa\", \"x11\" or \"windows\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the video driver with the given __index__, or NULL if index is out of bounds.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumVideoDrivers'
+--
+--     [C declaration]: @SDL_GetVideoDriver@, defined at @SDL3\/SDL_video.h 585:42@
+sDL_GetVideoDriver
+  :: BG.CInt
+  -- ^
+  --
+  --           [@index@]: the index of a video driver.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetVideoDriver = hs_bindgen_85f4e358bde66c9a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetCurrentVideoDriver@
+foreign import ccall unsafe "hs_bindgen_63fbce696f1ed5a6"
+  hs_bindgen_63fbce696f1ed5a6_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetCurrentVideoDriver@
+hs_bindgen_63fbce696f1ed5a6 :: IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_63fbce696f1ed5a6 =
+  BG.fromFFIType hs_bindgen_63fbce696f1ed5a6_base
+
+-- | Get the name of the currently initialized video driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"cocoa\", \"x11\" or \"windows\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current video driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetNumVideoDrivers', 'sDL_GetVideoDriver'
+--
+--     [C declaration]: @SDL_GetCurrentVideoDriver@, defined at @SDL3\/SDL_video.h 604:42@
+sDL_GetCurrentVideoDriver :: IO (PtrConst.PtrConst BG.CChar)
+sDL_GetCurrentVideoDriver =
+  hs_bindgen_63fbce696f1ed5a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetSystemTheme@
+foreign import ccall unsafe "hs_bindgen_c80ec935a539ddd8"
+  hs_bindgen_c80ec935a539ddd8_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetSystemTheme@
+hs_bindgen_c80ec935a539ddd8 :: IO SDL_SystemTheme
+hs_bindgen_c80ec935a539ddd8 =
+  BG.fromFFIType hs_bindgen_c80ec935a539ddd8_base
+
+-- | Get the current system theme.
+--
+--     [Returns]: the current system theme, light, dark, or unknown.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetSystemTheme@, defined at @SDL3\/SDL_video.h 615:45@
+sDL_GetSystemTheme :: IO SDL_SystemTheme
+sDL_GetSystemTheme = hs_bindgen_c80ec935a539ddd8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplays@
+foreign import ccall unsafe "hs_bindgen_d0c686e8303409e7"
+  hs_bindgen_d0c686e8303409e7_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplays@
+hs_bindgen_d0c686e8303409e7
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr SDL_DisplayID)
+hs_bindgen_d0c686e8303409e7 =
+  BG.fromFFIType hs_bindgen_d0c686e8303409e7_base
+
+-- | Get a list of currently connected displays.
+--
+--     [Returns]: a 0 terminated array of display instance IDs or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDisplays@, defined at @SDL3\/SDL_video.h 630:45@
+sDL_GetDisplays
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of displays returned, may be NULL.
+  -> IO (BG.Ptr SDL_DisplayID)
+sDL_GetDisplays = hs_bindgen_d0c686e8303409e7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetPrimaryDisplay@
+foreign import ccall unsafe "hs_bindgen_6b2fa2820b978e45"
+  hs_bindgen_6b2fa2820b978e45_base
+    :: IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetPrimaryDisplay@
+hs_bindgen_6b2fa2820b978e45 :: IO SDL_DisplayID
+hs_bindgen_6b2fa2820b978e45 =
+  BG.fromFFIType hs_bindgen_6b2fa2820b978e45_base
+
+-- | Return the primary display.
+--
+--     [Returns]: the instance ID of the primary display on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetPrimaryDisplay@, defined at @SDL3\/SDL_video.h 644:43@
+sDL_GetPrimaryDisplay :: IO SDL_DisplayID
+sDL_GetPrimaryDisplay = hs_bindgen_6b2fa2820b978e45
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayProperties@
+foreign import ccall unsafe "hs_bindgen_2811399c7688084b"
+  hs_bindgen_2811399c7688084b_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayProperties@
+hs_bindgen_2811399c7688084b
+  :: SDL_DisplayID
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_2811399c7688084b =
+  BG.fromFFIType hs_bindgen_2811399c7688084b_base
+
+-- | Get the properties associated with a display.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN'@: true if the display has HDR headroom above the SDR white point. This is for informational and diagnostic purposes only, as not all platforms provide this information at the display level.
+--
+--     On KMS\/DRM:
+--
+--     * @'sDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER'@: the \"panel orientation\" property for the display in degrees of clockwise rotation. Note that this is provided only as a hint, and the application is responsible for any coordinate transformations needed to conform to the requested display orientation.
+--
+--     On Wayland:
+--
+--     * @'sDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER'@: the wl_output associated with the display
+--
+--     On Windows:
+--
+--     * @'sDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER'@: the monitor handle (HMONITOR) associated with the display
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetDisplayProperties@, defined at @SDL3\/SDL_video.h 682:46@
+sDL_GetDisplayProperties
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetDisplayProperties =
+  hs_bindgen_2811399c7688084b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayName@
+foreign import ccall unsafe "hs_bindgen_348f75329e6ce8d9"
+  hs_bindgen_348f75329e6ce8d9_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayName@
+hs_bindgen_348f75329e6ce8d9
+  :: SDL_DisplayID
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_348f75329e6ce8d9 =
+  BG.fromFFIType hs_bindgen_348f75329e6ce8d9_base
+
+-- | Get the name of a display in UTF-8 encoding.
+--
+--     [Returns]: the name of a display or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayName@, defined at @SDL3\/SDL_video.h 702:42@
+sDL_GetDisplayName
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetDisplayName = hs_bindgen_348f75329e6ce8d9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayBounds@
+foreign import ccall unsafe "hs_bindgen_ef8f0d981192b3f9"
+  hs_bindgen_ef8f0d981192b3f9_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayBounds@
+hs_bindgen_ef8f0d981192b3f9
+  :: SDL_DisplayID
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_ef8f0d981192b3f9 =
+  BG.fromFFIType hs_bindgen_ef8f0d981192b3f9_base
+
+-- | Get the desktop area represented by a display.
+--
+--     The primary display is often located at (0,0), but may be placed at a different location depending on monitor layout.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayUsableBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayBounds@, defined at @SDL3\/SDL_video.h 722:34@
+sDL_GetDisplayBounds
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure filled in with the display bounds.
+  -> IO BG.CBool
+sDL_GetDisplayBounds = hs_bindgen_ef8f0d981192b3f9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayUsableBounds@
+foreign import ccall unsafe "hs_bindgen_c49b6c7690711e0a"
+  hs_bindgen_c49b6c7690711e0a_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayUsableBounds@
+hs_bindgen_c49b6c7690711e0a
+  :: SDL_DisplayID
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_c49b6c7690711e0a =
+  BG.fromFFIType hs_bindgen_c49b6c7690711e0a_base
+
+-- | Get the usable desktop area represented by a display, in screen coordinates.
+--
+--     This is the same area as @SDL_GetDisplayBounds()@ reports, but with portions reserved by the system removed. For example, on Apple\'s macOS, this subtracts the area occupied by the menu bar and dock.
+--
+--     Setting a window to be fullscreen generally bypasses these unusable areas, so these are good guidelines for the maximum space available to a non-fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayUsableBounds@, defined at @SDL3\/SDL_video.h 748:34@
+sDL_GetDisplayUsableBounds
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure filled in with the display bounds.
+  -> IO BG.CBool
+sDL_GetDisplayUsableBounds =
+  hs_bindgen_c49b6c7690711e0a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetNaturalDisplayOrientation@
+foreign import ccall unsafe "hs_bindgen_57dcd89da18e0a7a"
+  hs_bindgen_57dcd89da18e0a7a_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetNaturalDisplayOrientation@
+hs_bindgen_57dcd89da18e0a7a
+  :: SDL_DisplayID
+  -> IO SDL_DisplayOrientation
+hs_bindgen_57dcd89da18e0a7a =
+  BG.fromFFIType hs_bindgen_57dcd89da18e0a7a_base
+
+-- | Get the orientation of a display when it is unrotated.
+--
+--     [Returns]: the 'SDL_DisplayOrientation' enum value of the display, or @SDL_ORIENTATION_UNKNOWN@ if it isn\'t available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetNaturalDisplayOrientation@, defined at @SDL3\/SDL_video.h 763:52@
+sDL_GetNaturalDisplayOrientation
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL_DisplayOrientation
+sDL_GetNaturalDisplayOrientation =
+  hs_bindgen_57dcd89da18e0a7a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetCurrentDisplayOrientation@
+foreign import ccall unsafe "hs_bindgen_c8c1a7af21e9840d"
+  hs_bindgen_c8c1a7af21e9840d_base
+    :: BG.Word32
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetCurrentDisplayOrientation@
+hs_bindgen_c8c1a7af21e9840d
+  :: SDL_DisplayID
+  -> IO SDL_DisplayOrientation
+hs_bindgen_c8c1a7af21e9840d =
+  BG.fromFFIType hs_bindgen_c8c1a7af21e9840d_base
+
+-- | Get the orientation of a display.
+--
+--     [Returns]: the 'SDL_DisplayOrientation' enum value of the display, or @SDL_ORIENTATION_UNKNOWN@ if it isn\'t available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetCurrentDisplayOrientation@, defined at @SDL3\/SDL_video.h 778:52@
+sDL_GetCurrentDisplayOrientation
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL_DisplayOrientation
+sDL_GetCurrentDisplayOrientation =
+  hs_bindgen_c8c1a7af21e9840d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayContentScale@
+foreign import ccall unsafe "hs_bindgen_84541dd84a5f8bf5"
+  hs_bindgen_84541dd84a5f8bf5_base
+    :: BG.Word32
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayContentScale@
+hs_bindgen_84541dd84a5f8bf5
+  :: SDL_DisplayID
+  -> IO BG.CFloat
+hs_bindgen_84541dd84a5f8bf5 =
+  BG.fromFFIType hs_bindgen_84541dd84a5f8bf5_base
+
+-- | Get the content scale of a display.
+--
+--     The content scale is the expected scale for content based on the DPI settings of the display. For example, a 4K display might have a 2.0 (200%) display scale, which means that the user expects UI elements to be twice as big on this display, to aid in readability.
+--
+--     After window creation, @SDL_GetWindowDisplayScale()@ should be used to query the content scale factor for individual windows instead of querying the display for a window and calling this function, as the per-window content scale factor may differ from the base value of the display it is on, particularly on high-DPI and\/or multi-monitor desktop configurations.
+--
+--     [Returns]: the content scale of the display, or 0.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowDisplayScale', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayContentScale@, defined at @SDL3\/SDL_video.h 805:35@
+sDL_GetDisplayContentScale
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO BG.CFloat
+sDL_GetDisplayContentScale =
+  hs_bindgen_84541dd84a5f8bf5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetFullscreenDisplayModes@
+foreign import ccall unsafe "hs_bindgen_7fcb2edb01c8f735"
+  hs_bindgen_7fcb2edb01c8f735_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetFullscreenDisplayModes@
+hs_bindgen_7fcb2edb01c8f735
+  :: SDL_DisplayID
+  -> BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_DisplayMode))
+hs_bindgen_7fcb2edb01c8f735 =
+  BG.fromFFIType hs_bindgen_7fcb2edb01c8f735_base
+
+-- | Get a list of fullscreen display modes available on a display.
+--
+--     The display modes are sorted in this priority:
+--
+--     * w -> largest to smallest
+--
+--     * h -> largest to smallest
+--
+--     * bits per pixel -> more colors to fewer colors
+--
+--     * packed pixel layout -> largest to smallest
+--
+--     * refresh rate -> highest to lowest
+--
+--     * pixel density -> lowest to highest
+--
+--     [Returns]: a NULL terminated array of display mode pointers or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetFullscreenDisplayModes@, defined at @SDL3\/SDL_video.h 833:48@
+sDL_GetFullscreenDisplayModes
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of display modes returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_DisplayMode))
+sDL_GetFullscreenDisplayModes =
+  hs_bindgen_7fcb2edb01c8f735
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetClosestFullscreenDisplayMode@
+foreign import ccall unsafe "hs_bindgen_4d4a115b24dc1a8a"
+  hs_bindgen_4d4a115b24dc1a8a_base
+    :: BG.Word32
+    -> BG.Int32
+    -> BG.Int32
+    -> Float
+    -> BG.Word8
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetClosestFullscreenDisplayMode@
+hs_bindgen_4d4a115b24dc1a8a
+  :: SDL_DisplayID
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CFloat
+  -> BG.CBool
+  -> BG.Ptr SDL_DisplayMode
+  -> IO BG.CBool
+hs_bindgen_4d4a115b24dc1a8a =
+  BG.fromFFIType hs_bindgen_4d4a115b24dc1a8a_base
+
+-- | Get the closest match to the requested display mode.
+--
+--     The available display modes are scanned and @closest@ is filled in with the closest mode matching the requested mode and returned. The mode format and refresh rate default to the desktop mode if they are set to 0. The modes are scanned with size being first priority, format being second priority, and finally checking the refresh rate. If all the available modes are too small, then false is returned.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplays', 'sDL_GetFullscreenDisplayModes'
+--
+--     [C declaration]: @SDL_GetClosestFullscreenDisplayMode@, defined at @SDL3\/SDL_video.h 864:34@
+sDL_GetClosestFullscreenDisplayMode
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width in pixels of the desired display mode.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height in pixels of the desired display mode.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@refresh_rate@]: the refresh rate of the desired display mode, or 0.0f for the desktop refresh rate.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@include_high_density_modes@]: boolean to include high density modes in the search.
+  -> BG.Ptr SDL_DisplayMode
+  -- ^
+  --
+  --           [@closest@]: a pointer filled in with the closest display mode equal to or larger than the desired mode.
+  -> IO BG.CBool
+sDL_GetClosestFullscreenDisplayMode =
+  hs_bindgen_4d4a115b24dc1a8a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDesktopDisplayMode@
+foreign import ccall unsafe "hs_bindgen_f150e56ed07c3071"
+  hs_bindgen_f150e56ed07c3071_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDesktopDisplayMode@
+hs_bindgen_f150e56ed07c3071
+  :: SDL_DisplayID
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+hs_bindgen_f150e56ed07c3071 =
+  BG.fromFFIType hs_bindgen_f150e56ed07c3071_base
+
+-- | Get information about the desktop\'s display mode.
+--
+--     There\'s a difference between this function and @SDL_GetCurrentDisplayMode()@ when SDL runs fullscreen and has changed the resolution. In that case this function will return the previous native display mode, and not the current display mode.
+--
+--     [Returns]: a pointer to the desktop display mode or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetCurrentDisplayMode', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDesktopDisplayMode@, defined at @SDL3\/SDL_video.h 885:53@
+sDL_GetDesktopDisplayMode
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+sDL_GetDesktopDisplayMode =
+  hs_bindgen_f150e56ed07c3071
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetCurrentDisplayMode@
+foreign import ccall unsafe "hs_bindgen_090c1ea46d46ae35"
+  hs_bindgen_090c1ea46d46ae35_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetCurrentDisplayMode@
+hs_bindgen_090c1ea46d46ae35
+  :: SDL_DisplayID
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+hs_bindgen_090c1ea46d46ae35 =
+  BG.fromFFIType hs_bindgen_090c1ea46d46ae35_base
+
+-- | Get information about the current display mode.
+--
+--     There\'s a difference between this function and @SDL_GetDesktopDisplayMode()@ when SDL runs fullscreen and has changed the resolution. In that case this function will return the current display mode, and not the previous native display mode.
+--
+--     [Returns]: a pointer to the desktop display mode or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDesktopDisplayMode', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetCurrentDisplayMode@, defined at @SDL3\/SDL_video.h 906:53@
+sDL_GetCurrentDisplayMode
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+sDL_GetCurrentDisplayMode =
+  hs_bindgen_090c1ea46d46ae35
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayForPoint@
+foreign import ccall unsafe "hs_bindgen_c4ca0071d547fe4e"
+  hs_bindgen_c4ca0071d547fe4e_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayForPoint@
+hs_bindgen_c4ca0071d547fe4e
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point
+  -> IO SDL_DisplayID
+hs_bindgen_c4ca0071d547fe4e =
+  BG.fromFFIType hs_bindgen_c4ca0071d547fe4e_base
+
+-- | Get the display containing a point.
+--
+--     [Returns]: the instance ID of the display containing the point or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayForPoint@, defined at @SDL3\/SDL_video.h 922:43@
+sDL_GetDisplayForPoint
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point
+  -- ^
+  --
+  --           [@point@]: the point to query.
+  -> IO SDL_DisplayID
+sDL_GetDisplayForPoint = hs_bindgen_c4ca0071d547fe4e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayForRect@
+foreign import ccall unsafe "hs_bindgen_53772eb32f15250a"
+  hs_bindgen_53772eb32f15250a_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayForRect@
+hs_bindgen_53772eb32f15250a
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO SDL_DisplayID
+hs_bindgen_53772eb32f15250a =
+  BG.fromFFIType hs_bindgen_53772eb32f15250a_base
+
+-- | Get the display primarily containing a rect.
+--
+--     [Returns]: the instance ID of the display entirely containing the rect or closest to the center of the rect on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayForRect@, defined at @SDL3\/SDL_video.h 939:43@
+sDL_GetDisplayForRect
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the rect to query.
+  -> IO SDL_DisplayID
+sDL_GetDisplayForRect = hs_bindgen_53772eb32f15250a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayForWindow@
+foreign import ccall unsafe "hs_bindgen_b5e8747042982325"
+  hs_bindgen_b5e8747042982325_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetDisplayForWindow@
+hs_bindgen_b5e8747042982325
+  :: BG.Ptr SDL_Window
+  -> IO SDL_DisplayID
+hs_bindgen_b5e8747042982325 =
+  BG.fromFFIType hs_bindgen_b5e8747042982325_base
+
+-- | Get the display associated with a window.
+--
+--     [Returns]: the instance ID of the display containing the center of the window on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetDisplayBounds', 'sDL_GetDisplays'
+--
+--     [C declaration]: @SDL_GetDisplayForWindow@, defined at @SDL3\/SDL_video.h 956:43@
+sDL_GetDisplayForWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_DisplayID
+sDL_GetDisplayForWindow = hs_bindgen_b5e8747042982325
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowPixelDensity@
+foreign import ccall unsafe "hs_bindgen_37fb7f14d8ab4245"
+  hs_bindgen_37fb7f14d8ab4245_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowPixelDensity@
+hs_bindgen_37fb7f14d8ab4245
+  :: BG.Ptr SDL_Window
+  -> IO BG.CFloat
+hs_bindgen_37fb7f14d8ab4245 =
+  BG.fromFFIType hs_bindgen_37fb7f14d8ab4245_base
+
+-- | Get the pixel density of a window.
+--
+--     This is a ratio of pixel size to window size. For example, if the window is 1920x1080 and it has a high density back buffer of 3840x2160 pixels, it would have a pixel density of 2.0.
+--
+--     [Returns]: the pixel density or 0.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowDisplayScale'
+--
+--     [C declaration]: @SDL_GetWindowPixelDensity@, defined at @SDL3\/SDL_video.h 975:35@
+sDL_GetWindowPixelDensity
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CFloat
+sDL_GetWindowPixelDensity =
+  hs_bindgen_37fb7f14d8ab4245
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowDisplayScale@
+foreign import ccall unsafe "hs_bindgen_f51393abfbd8d0f1"
+  hs_bindgen_f51393abfbd8d0f1_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowDisplayScale@
+hs_bindgen_f51393abfbd8d0f1
+  :: BG.Ptr SDL_Window
+  -> IO BG.CFloat
+hs_bindgen_f51393abfbd8d0f1 =
+  BG.fromFFIType hs_bindgen_f51393abfbd8d0f1_base
+
+-- | Get the content display scale relative to a window\'s pixel size.
+--
+--     This is a combination of the window pixel density and the display content scale, and is the expected scale for displaying content in this window. For example, if a 3840x2160 window had a display scale of 2.0, the user expects the content to take twice as many pixels and be the same physical size as if it were being displayed in a 1920x1080 window with a display scale of 1.0.
+--
+--     Conceptually this value corresponds to the scale display setting, and is updated when that setting is changed, or the window moves to a display with a different scale setting.
+--
+--     [Returns]: the display scale, or 0.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowDisplayScale@, defined at @SDL3\/SDL_video.h 999:35@
+sDL_GetWindowDisplayScale
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CFloat
+sDL_GetWindowDisplayScale =
+  hs_bindgen_f51393abfbd8d0f1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowFullscreenMode@
+foreign import ccall unsafe "hs_bindgen_13b017b8b715b141"
+  hs_bindgen_13b017b8b715b141_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowFullscreenMode@
+hs_bindgen_13b017b8b715b141
+  :: BG.Ptr SDL_Window
+  -> PtrConst.PtrConst SDL_DisplayMode
+  -> IO BG.CBool
+hs_bindgen_13b017b8b715b141 =
+  BG.fromFFIType hs_bindgen_13b017b8b715b141_base
+
+-- | Set the display mode to use when a window is visible and fullscreen.
+--
+--     This only affects the display mode used when the window is fullscreen. To change the window size when the window is not fullscreen, use @SDL_SetWindowSize()@.
+--
+--     If the window is currently in the fullscreen state, this request is asynchronous on some windowing systems and the new mode dimensions may not be applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the new mode takes effect, an SDL_EVENT_WINDOW_RESIZED and\/or an SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event will be emitted with the new mode dimensions.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFullscreenMode', 'sDL_SetWindowFullscreen', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowFullscreenMode@, defined at @SDL3\/SDL_video.h 1034:34@
+sDL_SetWindowFullscreenMode
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to affect.
+  -> PtrConst.PtrConst SDL_DisplayMode
+  -- ^
+  --
+  --           [@mode@]: a pointer to the display mode to use, which can be NULL for borderless fullscreen desktop mode, or one of the fullscreen modes returned by @SDL_GetFullscreenDisplayModes()@ to set an exclusive fullscreen mode.
+  -> IO BG.CBool
+sDL_SetWindowFullscreenMode =
+  hs_bindgen_13b017b8b715b141
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowFullscreenMode@
+foreign import ccall unsafe "hs_bindgen_3d833d32498da130"
+  hs_bindgen_3d833d32498da130_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowFullscreenMode@
+hs_bindgen_3d833d32498da130
+  :: BG.Ptr SDL_Window
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+hs_bindgen_3d833d32498da130 =
+  BG.fromFFIType hs_bindgen_3d833d32498da130_base
+
+-- | Query the display mode to use when a window is visible at fullscreen.
+--
+--     [Returns]: a pointer to the exclusive fullscreen mode to use or NULL for borderless fullscreen desktop mode.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowFullscreenMode', 'sDL_SetWindowFullscreen'
+--
+--     [C declaration]: @SDL_GetWindowFullscreenMode@, defined at @SDL3\/SDL_video.h 1050:53@
+sDL_GetWindowFullscreenMode
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+sDL_GetWindowFullscreenMode =
+  hs_bindgen_3d833d32498da130
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowICCProfile@
+foreign import ccall unsafe "hs_bindgen_c8fc95a50e802a12"
+  hs_bindgen_c8fc95a50e802a12_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowICCProfile@
+hs_bindgen_c8fc95a50e802a12
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -> IO (BG.Ptr BG.Void)
+hs_bindgen_c8fc95a50e802a12 =
+  BG.fromFFIType hs_bindgen_c8fc95a50e802a12_base
+
+-- | Get the raw ICC profile data for the screen the window is currently on.
+--
+--     [Returns]: the raw ICC profile data on success or NULL on failure; call SDL_GetError() for more information. This should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowICCProfile@, defined at @SDL3\/SDL_video.h 1065:36@
+sDL_GetWindowICCProfile
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the ICC profile.
+  -> IO (BG.Ptr BG.Void)
+sDL_GetWindowICCProfile = hs_bindgen_c8fc95a50e802a12
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowPixelFormat@
+foreign import ccall unsafe "hs_bindgen_90e43d0f5b0c1797"
+  hs_bindgen_90e43d0f5b0c1797_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowPixelFormat@
+hs_bindgen_90e43d0f5b0c1797
+  :: BG.Ptr SDL_Window
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+hs_bindgen_90e43d0f5b0c1797 =
+  BG.fromFFIType hs_bindgen_90e43d0f5b0c1797_base
+
+-- | Get the pixel format associated with the window.
+--
+--     [Returns]: the pixel format of the window on success or SDL_PIXELFORMAT_UNKNOWN on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowPixelFormat@, defined at @SDL3\/SDL_video.h 1079:45@
+sDL_GetWindowPixelFormat
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+sDL_GetWindowPixelFormat =
+  hs_bindgen_90e43d0f5b0c1797
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindows@
+foreign import ccall unsafe "hs_bindgen_37819cd7ef5a283c"
+  hs_bindgen_37819cd7ef5a283c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindows@
+hs_bindgen_37819cd7ef5a283c
+  :: BG.Ptr BG.CInt
+  -> IO (BG.Ptr (BG.Ptr SDL_Window))
+hs_bindgen_37819cd7ef5a283c =
+  BG.fromFFIType hs_bindgen_37819cd7ef5a283c_base
+
+-- | Get a list of valid windows.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Window' pointers or NULL on failure; call SDL_GetError() for more information. This is a single allocation that should be freed with SDL_free() when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindows@, defined at @SDL3\/SDL_video.h 1095:43@
+sDL_GetWindows
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of windows returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Window))
+sDL_GetWindows = hs_bindgen_37819cd7ef5a283c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_CreateWindow@
+foreign import ccall unsafe "hs_bindgen_c104a86e94d91733"
+  hs_bindgen_c104a86e94d91733_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_CreateWindow@
+hs_bindgen_c104a86e94d91733
+  :: PtrConst.PtrConst BG.CChar
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL_WindowFlags
+  -> IO (BG.Ptr SDL_Window)
+hs_bindgen_c104a86e94d91733 =
+  BG.fromFFIType hs_bindgen_c104a86e94d91733_base
+
+-- | Create a window with the specified dimensions and flags.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     @flags@ may be any of the following OR\'d together:
+--
+--     * @SDL_WINDOW_FULLSCREEN@: fullscreen window at desktop resolution
+--
+--     * @SDL_WINDOW_OPENGL@: window usable with an OpenGL context
+--
+--     * @SDL_WINDOW_HIDDEN@: window is not visible
+--
+--     * @SDL_WINDOW_BORDERLESS@: no window decoration
+--
+--     * @SDL_WINDOW_RESIZABLE@: window can be resized
+--
+--     * @SDL_WINDOW_MINIMIZED@: window is minimized
+--
+--     * @SDL_WINDOW_MAXIMIZED@: window is maximized
+--
+--     * @SDL_WINDOW_MOUSE_GRABBED@: window has grabbed mouse focus
+--
+--     * @SDL_WINDOW_INPUT_FOCUS@: window has input focus
+--
+--     * @SDL_WINDOW_MOUSE_FOCUS@: window has mouse focus
+--
+--     * @SDL_WINDOW_EXTERNAL@: window not created by SDL
+--
+--     * @SDL_WINDOW_MODAL@: window is modal
+--
+--     * @SDL_WINDOW_HIGH_PIXEL_DENSITY@: window uses high pixel density back buffer if possible
+--
+--     * @SDL_WINDOW_MOUSE_CAPTURE@: window has mouse captured (unrelated to MOUSE_GRABBED)
+--
+--     * @SDL_WINDOW_ALWAYS_ON_TOP@: window should always be above others
+--
+--     * @SDL_WINDOW_UTILITY@: window should be treated as a utility window, not showing in the task bar and window list
+--
+--     * @SDL_WINDOW_TOOLTIP@: window should be treated as a tooltip and does not get mouse or keyboard focus, requires a parent window
+--
+--     * @SDL_WINDOW_POPUP_MENU@: window should be treated as a popup menu, requires a parent window
+--
+--     * @SDL_WINDOW_KEYBOARD_GRABBED@: window has grabbed keyboard input
+--
+--     * @SDL_WINDOW_VULKAN@: window usable with a Vulkan instance
+--
+--     * @SDL_WINDOW_METAL@: window usable with a Metal instance
+--
+--     * @SDL_WINDOW_TRANSPARENT@: window with transparent buffer
+--
+--     * @SDL_WINDOW_NOT_FOCUSABLE@: window should not be focusable
+--
+--     The 'SDL_Window' will be shown if SDL_WINDOW_HIDDEN is not set. If hidden at creation time, @SDL_ShowWindow()@ can be used to show it later.
+--
+--     On Apple\'s macOS, you __must__ set the NSHighResolutionCapable Info.plist property to YES, otherwise you will not receive a High-DPI OpenGL canvas.
+--
+--     The window pixel size may differ from its window coordinate size if the window is on a high pixel density display. Use @SDL_GetWindowSize()@ to query the client area\'s size in window coordinates, and @SDL_GetWindowSizeInPixels()@ or SDL_GetRenderOutputSize() to query the drawable size in pixels. Note that the drawable size can vary after the window is created and should be queried again if you get an SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event.
+--
+--     If the window is created with any of the SDL_WINDOW_OPENGL or SDL_WINDOW_VULKAN flags, then the corresponding LoadLibrary function (SDL_GL_LoadLibrary or SDL_Vulkan_LoadLibrary) is called and the corresponding UnloadLibrary function is called by @SDL_DestroyWindow()@.
+--
+--     If SDL_WINDOW_VULKAN is specified and there isn\'t a working Vulkan driver, @SDL_CreateWindow()@ will fail, because SDL_Vulkan_LoadLibrary() will fail.
+--
+--     If SDL_WINDOW_METAL is specified on an OS that does not support Metal, @SDL_CreateWindow()@ will fail.
+--
+--     If you intend to use this window with an SDL_Renderer, you should use SDL_CreateWindowAndRenderer() instead of this function, to avoid window flicker.
+--
+--     On non-Apple devices, SDL requires you to either not link to the Vulkan loader or link to a dynamic library version. This limitation may be removed in a future version of SDL.
+--
+--     [Returns]: the window that was created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateWindowAndRenderer, 'sDL_CreatePopupWindow', 'sDL_CreateWindowWithProperties', 'sDL_DestroyWindow'
+--
+--     [C declaration]: @SDL_CreateWindow@, defined at @SDL3\/SDL_video.h 1184:42@
+sDL_CreateWindow
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the title of the window, in UTF-8 encoding.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the window.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the window.
+  -> SDL_WindowFlags
+  -- ^
+  --
+  --           [@flags@]: 0, or one or more 'SDL_WindowFlags' OR\'d together.
+  -> IO (BG.Ptr SDL_Window)
+sDL_CreateWindow = hs_bindgen_c104a86e94d91733
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_CreatePopupWindow@
+foreign import ccall unsafe "hs_bindgen_f8de823bce00580d"
+  hs_bindgen_f8de823bce00580d_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Int32
+    -> BG.Word64
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_CreatePopupWindow@
+hs_bindgen_f8de823bce00580d
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> BG.CInt
+  -> SDL_WindowFlags
+  -> IO (BG.Ptr SDL_Window)
+hs_bindgen_f8de823bce00580d =
+  BG.fromFFIType hs_bindgen_f8de823bce00580d_base
+
+-- | Create a child popup window of the specified parent window.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     The flags parameter __must__ contain at least one of the following:
+--
+--     * @SDL_WINDOW_TOOLTIP@: The popup window is a tooltip and will not pass any input events.
+--
+--     * @SDL_WINDOW_POPUP_MENU@: The popup window is a popup menu. The topmost popup menu will implicitly gain the keyboard focus.
+--
+--     The following flags are not relevant to popup window creation and will be ignored:
+--
+--     * @SDL_WINDOW_MINIMIZED@
+--
+--     * @SDL_WINDOW_MAXIMIZED@
+--
+--     * @SDL_WINDOW_FULLSCREEN@
+--
+--     * @SDL_WINDOW_BORDERLESS@
+--
+--     The following flags are incompatible with popup window creation and will cause it to fail:
+--
+--     * @SDL_WINDOW_UTILITY@
+--
+--     * @SDL_WINDOW_MODAL@
+--
+--     The parent parameter __must__ be non-null and a valid window. The parent of a popup window can be either a regular, toplevel window, or another popup window.
+--
+--     Popup windows cannot be minimized, maximized, made fullscreen, raised, flash, be made a modal window, be the parent of a toplevel window, or grab the mouse and\/or keyboard. Attempts to do so will fail.
+--
+--     Popup windows implicitly do not have a border\/decorations and do not appear on the taskbar\/dock or in lists of windows such as alt-tab menus.
+--
+--     By default, popup window positions will automatically be constrained to keep the entire window within display bounds. This can be overridden with the @'sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN'@ property.
+--
+--     By default, popup menus will automatically grab keyboard focus from the parent when shown. This behavior can be overridden by setting the @SDL_WINDOW_NOT_FOCUSABLE@ flag, setting the @'sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN'@ property to false, or toggling it after creation via the @SDL_SetWindowFocusable()@ function.
+--
+--     If a parent window is hidden or destroyed, any child popup windows will be recursively hidden or destroyed as well. Child popup windows not explicitly hidden will be restored when the parent is shown.
+--
+--     [Returns]: the window that was created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateWindow', 'sDL_CreateWindowWithProperties', 'sDL_DestroyWindow', 'sDL_GetWindowParent'
+--
+--     [C declaration]: @SDL_CreatePopupWindow@, defined at @SDL3\/SDL_video.h 1260:42@
+sDL_CreatePopupWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@parent@]: the parent of the window, must not be NULL.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@offset_x@]: the x position of the popup window relative to the origin of the parent.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@offset_y@]: the y position of the popup window relative to the origin of the parent window.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the window.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the window.
+  -> SDL_WindowFlags
+  -- ^
+  --
+  --           [@flags@]: SDL_WINDOW_TOOLTIP or SDL_WINDOW_POPUP_MENU, and zero or more additional 'SDL_WindowFlags' OR\'d together.
+  -> IO (BG.Ptr SDL_Window)
+sDL_CreatePopupWindow = hs_bindgen_f8de823bce00580d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_CreateWindowWithProperties@
+foreign import ccall unsafe "hs_bindgen_397cd16b0ee4c2c1"
+  hs_bindgen_397cd16b0ee4c2c1_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_CreateWindowWithProperties@
+hs_bindgen_397cd16b0ee4c2c1
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -> IO (BG.Ptr SDL_Window)
+hs_bindgen_397cd16b0ee4c2c1 =
+  BG.fromFFIType hs_bindgen_397cd16b0ee4c2c1_base
+
+-- | Create a window with the specified properties.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN'@: true if the window should be always on top
+--
+--     * @'sDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN'@: true if the window has no window decoration
+--
+--     * @'sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN'@: true if the \"tooltip\" and \"menu\" window types should be automatically constrained to be entirely within display bounds (default), false if no constraints on the position are desired.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN'@: true if the window will be used with an externally managed graphics context.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN'@: true if the window should accept keyboard input (defaults true)
+--
+--     * @'sDL_PROP_WINDOW_CREATE_FULLSCREEN_BOOLEAN'@: true if the window should start in fullscreen mode at desktop resolution
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER'@: the height of the window
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN'@: true if the window should start hidden
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HIGH_PIXEL_DENSITY_BOOLEAN'@: true if the window uses a high pixel density buffer if possible
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MAXIMIZED_BOOLEAN'@: true if the window should start maximized
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MENU_BOOLEAN'@: true if the window is a popup menu
+--
+--     * @'sDL_PROP_WINDOW_CREATE_METAL_BOOLEAN'@: true if the window will be used with Metal rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MINIMIZED_BOOLEAN'@: true if the window should start minimized
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MODAL_BOOLEAN'@: true if the window is modal to its parent
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MOUSE_GRABBED_BOOLEAN'@: true if the window starts with grabbed mouse focus
+--
+--     * @'sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN'@: true if the window will be used with OpenGL rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_PARENT_POINTER'@: an 'SDL_Window' that will be the parent of this window, required for windows with the \"tooltip\", \"menu\", and \"modal\" properties
+--
+--     * @'sDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN'@: true if the window should be resizable
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TITLE_STRING'@: the title of the window, in UTF-8 encoding
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TRANSPARENT_BOOLEAN'@: true if the window show transparent in the areas with alpha of 0
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TOOLTIP_BOOLEAN'@: true if the window is a tooltip
+--
+--     * @'sDL_PROP_WINDOW_CREATE_UTILITY_BOOLEAN'@: true if the window is a utility window, not showing in the task bar and window list
+--
+--     * @'sDL_PROP_WINDOW_CREATE_VULKAN_BOOLEAN'@: true if the window will be used with Vulkan rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIDTH_NUMBER'@: the width of the window
+--
+--     * @'sDL_PROP_WINDOW_CREATE_X_NUMBER'@: the x position of the window, or @'sDL_WINDOWPOS_CENTERED'@, defaults to @'sDL_WINDOWPOS_UNDEFINED'@. This is relative to the parent for windows with the \"tooltip\" or \"menu\" property set.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_Y_NUMBER'@: the y position of the window, or @'sDL_WINDOWPOS_CENTERED'@, defaults to @'sDL_WINDOWPOS_UNDEFINED'@. This is relative to the parent for windows with the \"tooltip\" or \"menu\" property set.
+--
+--     These are additional supported properties on macOS:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER'@: the @(__unsafe_unretained)@ NSWindow associated with the window, if you want to wrap an existing window.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER'@: the @(__unsafe_unretained)@ NSView associated with the window, defaults to @[window contentView]@
+--
+--     These are additional supported properties on iOS, tvOS, and visionOS:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER'@: the @(__unsafe_unretained)@ UIWindowScene associated with the window, defaults to the active window scene.
+--
+--     These are additional supported properties on Wayland:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN'@ - true if the application wants to use the Wayland surface for a custom role and does not want it attached to an XDG toplevel window. See [README-wayland](README-wayland) for more information on using custom surfaces.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN'@ - true if the application wants an associated @wl_egl_window@ object to be created and attached to the window, even if the window does not have the OpenGL property or @SDL_WINDOW_OPENGL@ flag set.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER'@ - the wl_surface associated with the window, if you want to wrap an existing window. See [README-wayland](README-wayland) for more information.
+--
+--     These are additional supported properties on Windows:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER'@: the HWND associated with the window, if you want to wrap an existing window.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER'@: optional, another window to share pixel format with, useful for OpenGL windows
+--
+--     These are additional supported properties with X11:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER'@: the X11 Window associated with the window, if you want to wrap an existing window.
+--
+--     The window is implicitly shown if the \"hidden\" property is not set.
+--
+--     These are additional supported properties with Emscripten:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING'@: the id given to the canvas element. This should start with a \'\#\' sign
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING'@: override the binding element for keyboard inputs for this canvas. The variable can be one of:
+--
+--     * \"\#window\": the javascript window object (default)
+--
+--     * \"\#document\": the javascript document object
+--
+--     * \"\#screen\": the javascript window.screen object
+--
+--     * \"\#canvas\": the WebGL canvas element
+--
+--     * \"\#none\": Don\'t bind anything at all
+--
+--     * any other string without a leading \# sign applies to the element on the page with that ID. Windows with the \"tooltip\" and \"menu\" properties are popup windows and have the behaviors and guidelines outlined in @SDL_CreatePopupWindow()@.
+--
+--     If this window is being created to be used with an SDL_Renderer, you should not add a graphics API specific property (@'sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN'@, etc), as SDL will handle that internally when it chooses a renderer. However, SDL might need to recreate your window at that point, which may cause the window to appear briefly, and then flicker as it is recreated. The correct approach to this is to create the window with the @'sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN'@ property set to true, then create the renderer, then show the window with @SDL_ShowWindow()@.
+--
+--     [Returns]: the window that was created or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_CreateProperties, 'sDL_CreateWindow', 'sDL_DestroyWindow'
+--
+--     [C declaration]: @SDL_CreateWindowWithProperties@, defined at @SDL3\/SDL_video.h 1409:42@
+sDL_CreateWindowWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Window)
+sDL_CreateWindowWithProperties =
+  hs_bindgen_397cd16b0ee4c2c1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowID@
+foreign import ccall unsafe "hs_bindgen_4cd31f508a882913"
+  hs_bindgen_4cd31f508a882913_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowID@
+hs_bindgen_4cd31f508a882913
+  :: BG.Ptr SDL_Window
+  -> IO SDL_WindowID
+hs_bindgen_4cd31f508a882913 =
+  BG.fromFFIType hs_bindgen_4cd31f508a882913_base
+
+-- | Get the numeric ID of a window.
+--
+--     The numeric ID is what SDL_WindowEvent references, and is necessary to map these events to specific 'SDL_Window' objects.
+--
+--     [Returns]: the ID of the window on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFromID'
+--
+--     [C declaration]: @SDL_GetWindowID@, defined at @SDL3\/SDL_video.h 1466:42@
+sDL_GetWindowID
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_WindowID
+sDL_GetWindowID = hs_bindgen_4cd31f508a882913
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowFromID@
+foreign import ccall unsafe "hs_bindgen_9a86d1e90d48506e"
+  hs_bindgen_9a86d1e90d48506e_base
+    :: BG.Word32
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowFromID@
+hs_bindgen_9a86d1e90d48506e
+  :: SDL_WindowID
+  -> IO (BG.Ptr SDL_Window)
+hs_bindgen_9a86d1e90d48506e =
+  BG.fromFFIType hs_bindgen_9a86d1e90d48506e_base
+
+-- | Get a window from a stored ID.
+--
+--     The numeric ID is what SDL_WindowEvent references, and is necessary to map these events to specific 'SDL_Window' objects.
+--
+--     [Returns]: the window associated with @id@ or NULL if it doesn\'t exist; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowID'
+--
+--     [C declaration]: @SDL_GetWindowFromID@, defined at @SDL3\/SDL_video.h 1484:42@
+sDL_GetWindowFromID
+  :: SDL_WindowID
+  -- ^
+  --
+  --           [@id@]: the ID of the window.
+  -> IO (BG.Ptr SDL_Window)
+sDL_GetWindowFromID = hs_bindgen_9a86d1e90d48506e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowParent@
+foreign import ccall unsafe "hs_bindgen_de155dd6392c018c"
+  hs_bindgen_de155dd6392c018c_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowParent@
+hs_bindgen_de155dd6392c018c
+  :: BG.Ptr SDL_Window
+  -> IO (BG.Ptr SDL_Window)
+hs_bindgen_de155dd6392c018c =
+  BG.fromFFIType hs_bindgen_de155dd6392c018c_base
+
+-- | Get parent of a window.
+--
+--     [Returns]: the parent of the window on success or NULL if the window has no parent.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreatePopupWindow'
+--
+--     [C declaration]: @SDL_GetWindowParent@, defined at @SDL3\/SDL_video.h 1499:42@
+sDL_GetWindowParent
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL_Window)
+sDL_GetWindowParent = hs_bindgen_de155dd6392c018c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowProperties@
+foreign import ccall unsafe "hs_bindgen_354b9a2ce76470de"
+  hs_bindgen_354b9a2ce76470de_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowProperties@
+hs_bindgen_354b9a2ce76470de
+  :: BG.Ptr SDL_Window
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hs_bindgen_354b9a2ce76470de =
+  BG.fromFFIType hs_bindgen_354b9a2ce76470de_base
+
+-- | Get the properties associated with a window.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_WINDOW_SHAPE_POINTER'@: the surface associated with a shaped window
+--
+--     * @'sDL_PROP_WINDOW_HDR_ENABLED_BOOLEAN'@: true if the window has HDR headroom above the SDR white point. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_WINDOW_SDR_WHITE_LEVEL_FLOAT'@: the value of SDR white in the SDL_COLORSPACE_SRGB_LINEAR colorspace. On Windows this corresponds to the SDR white level in scRGB colorspace, and on Apple platforms this is always 1.0 for EDR content. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_WINDOW_HDR_HEADROOM_FLOAT'@: the additional high dynamic range that can be displayed, in terms of the SDR white point. When HDR is not enabled, this will be 1.0. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     On Android:
+--
+--     * @'sDL_PROP_WINDOW_ANDROID_WINDOW_POINTER'@: the ANativeWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_ANDROID_SURFACE_POINTER'@: the EGLSurface associated with the window
+--
+--     On iOS:
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_WINDOW_POINTER'@: the @(__unsafe_unretained)@ UIWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER'@: the NSInteger tag associated with metal views on the window
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER'@: the OpenGL view\'s framebuffer object. It must be bound when rendering to the screen using OpenGL.
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER'@: the OpenGL view\'s renderbuffer object. It must be bound when SDL_GL_SwapWindow is called.
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER'@: the OpenGL view\'s resolve framebuffer, when MSAA is used.
+--
+--     On KMS\/DRM:
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_DEVICE_INDEX_NUMBER'@: the device index associated with the window (e.g. the X in \/dev\/dri\/cardX)
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_DRM_FD_NUMBER'@: the DRM FD associated with the window
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER'@: the GBM device associated with the window
+--
+--     On macOS:
+--
+--     * @'sDL_PROP_WINDOW_COCOA_WINDOW_POINTER'@: the @(__unsafe_unretained)@ NSWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER'@: the NSInteger tag associated with metal views on the window
+--
+--     On OpenVR:
+--
+--     * @'sDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER'@: the OpenVR Overlay Handle ID for the associated overlay window.
+--
+--     On Vivante:
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER'@: the EGLNativeDisplayType associated with the window
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER'@: the EGLNativeWindowType associated with the window
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER'@: the EGLSurface associated with the window
+--
+--     On Windows:
+--
+--     * @'sDL_PROP_WINDOW_WIN32_HWND_POINTER'@: the HWND associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WIN32_HDC_POINTER'@: the HDC associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WIN32_INSTANCE_POINTER'@: the HINSTANCE associated with the window
+--
+--     On Wayland:
+--
+--     Note: The @xdg_*@ window objects do not internally persist across window show\/hide calls. They will be null if the window is hidden and must be queried each time it is shown.
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER'@: the wl_display associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER'@: the wl_surface associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER'@: the wp_viewport associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER'@: the wl_egl_window associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER'@: the xdg_surface associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER'@: the xdg_toplevel role associated with the window
+--
+--     * \'SDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_EXPORT_HANDLE_STRING\': the export handle associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_POPUP_POINTER'@: the xdg_popup role associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_POSITIONER_POINTER'@: the xdg_positioner associated with the window, in popup mode
+--
+--     On X11:
+--
+--     * @'sDL_PROP_WINDOW_X11_DISPLAY_POINTER'@: the X11 Display associated with the window
+--
+--     * @'sDL_PROP_WINDOW_X11_SCREEN_NUMBER'@: the screen number associated with the window
+--
+--     * @'sDL_PROP_WINDOW_X11_WINDOW_NUMBER'@: the X11 Window associated with the window
+--
+--     On Emscripten:
+--
+--     * @'sDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING'@: the id the canvas element will have
+--
+--     * @'sDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING'@: the keyboard element that associates keyboard events to this window
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowProperties@, defined at @SDL3\/SDL_video.h 1628:46@
+sDL_GetWindowProperties
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+sDL_GetWindowProperties = hs_bindgen_354b9a2ce76470de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowFlags@
+foreign import ccall unsafe "hs_bindgen_c7a6fd0b395c141b"
+  hs_bindgen_c7a6fd0b395c141b_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowFlags@
+hs_bindgen_c7a6fd0b395c141b
+  :: BG.Ptr SDL_Window
+  -> IO SDL_WindowFlags
+hs_bindgen_c7a6fd0b395c141b =
+  BG.fromFFIType hs_bindgen_c7a6fd0b395c141b_base
+
+-- | Get the window flags.
+--
+--     [Returns]: a mask of the 'SDL_WindowFlags' associated with @window@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateWindow', 'sDL_HideWindow', 'sDL_MaximizeWindow', 'sDL_MinimizeWindow', 'sDL_SetWindowFullscreen', 'sDL_SetWindowMouseGrab', 'sDL_SetWindowFillDocument', 'sDL_ShowWindow'
+--
+--     [C declaration]: @SDL_GetWindowFlags@, defined at @SDL3\/SDL_video.h 1687:45@
+sDL_GetWindowFlags
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_WindowFlags
+sDL_GetWindowFlags = hs_bindgen_c7a6fd0b395c141b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowTitle@
+foreign import ccall unsafe "hs_bindgen_fb8782aef9af1e58"
+  hs_bindgen_fb8782aef9af1e58_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowTitle@
+hs_bindgen_fb8782aef9af1e58
+  :: BG.Ptr SDL_Window
+  -> PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_fb8782aef9af1e58 =
+  BG.fromFFIType hs_bindgen_fb8782aef9af1e58_base
+
+-- | Set the title of a window.
+--
+--     This string is expected to be in UTF-8 encoding.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowTitle'
+--
+--     [C declaration]: @SDL_SetWindowTitle@, defined at @SDL3\/SDL_video.h 1705:34@
+sDL_SetWindowTitle
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the desired window title in UTF-8 format.
+  -> IO BG.CBool
+sDL_SetWindowTitle = hs_bindgen_fb8782aef9af1e58
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowTitle@
+foreign import ccall unsafe "hs_bindgen_b46de7aa720113f3"
+  hs_bindgen_b46de7aa720113f3_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowTitle@
+hs_bindgen_b46de7aa720113f3
+  :: BG.Ptr SDL_Window
+  -> IO (PtrConst.PtrConst BG.CChar)
+hs_bindgen_b46de7aa720113f3 =
+  BG.fromFFIType hs_bindgen_b46de7aa720113f3_base
+
+-- | Get the title of a window.
+--
+--     [Returns]: the title of the window in UTF-8 format or \"\" if there is no title.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowTitle'
+--
+--     [C declaration]: @SDL_GetWindowTitle@, defined at @SDL3\/SDL_video.h 1720:42@
+sDL_GetWindowTitle
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+sDL_GetWindowTitle = hs_bindgen_b46de7aa720113f3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowIcon@
+foreign import ccall unsafe "hs_bindgen_dcfd86c373d614de"
+  hs_bindgen_dcfd86c373d614de_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowIcon@
+hs_bindgen_dcfd86c373d614de
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_dcfd86c373d614de =
+  BG.fromFFIType hs_bindgen_dcfd86c373d614de_base
+
+-- | Set the icon for a window.
+--
+--     If this function is passed a surface with alternate representations added using SDL_AddSurfaceAlternateImage(), the surface will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations. For example, if the original surface is 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_AddSurfaceAlternateImage
+--
+--     [C declaration]: @SDL_SetWindowIcon@, defined at @SDL3\/SDL_video.h 1747:34@
+sDL_SetWindowIcon
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: an SDL_Surface structure containing the icon for the window.
+  -> IO BG.CBool
+sDL_SetWindowIcon = hs_bindgen_dcfd86c373d614de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowPosition@
+foreign import ccall unsafe "hs_bindgen_2778939bf2a03cc0"
+  hs_bindgen_2778939bf2a03cc0_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowPosition@
+hs_bindgen_2778939bf2a03cc0
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_2778939bf2a03cc0 =
+  BG.fromFFIType hs_bindgen_2778939bf2a03cc0_base
+
+-- | Request that the window\'s position be set.
+--
+--     If the window is in an exclusive fullscreen or maximized state, this request has no effect.
+--
+--     This can be used to reposition fullscreen-desktop windows onto a different display, however, as exclusive fullscreen windows are locked to a specific display, they can only be repositioned programmatically via @SDL_SetWindowFullscreenMode()@.
+--
+--     On some windowing systems this request is asynchronous and the new coordinates may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window position changes, an SDL_EVENT_WINDOW_MOVED event will be emitted with the window\'s new coordinates. Note that the new coordinates may not match the exact coordinates requested, as some windowing systems can restrict the position of the window in certain scenarios (e.g. constraining the position so the window is always within desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowPosition', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowPosition@, defined at @SDL3\/SDL_video.h 1788:34@
+sDL_SetWindowPosition
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to reposition.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the window, or @'sDL_WINDOWPOS_CENTERED'@ or @'sDL_WINDOWPOS_UNDEFINED'@.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the window, or @'sDL_WINDOWPOS_CENTERED'@ or @'sDL_WINDOWPOS_UNDEFINED'@.
+  -> IO BG.CBool
+sDL_SetWindowPosition = hs_bindgen_2778939bf2a03cc0
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowPosition@
+foreign import ccall unsafe "hs_bindgen_0dd4bcea36c16a31"
+  hs_bindgen_0dd4bcea36c16a31_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowPosition@
+hs_bindgen_0dd4bcea36c16a31
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_0dd4bcea36c16a31 =
+  BG.fromFFIType hs_bindgen_0dd4bcea36c16a31_base
+
+-- | Get the position of a window.
+--
+--     This is the current position of the window as last reported by the windowing system.
+--
+--     If you do not need the value for one of the positions a NULL may be passed in the @x@ or @y@ parameter.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowPosition'
+--
+--     [C declaration]: @SDL_GetWindowPosition@, defined at @SDL3\/SDL_video.h 1813:34@
+sDL_GetWindowPosition
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@x@]: a pointer filled in with the x position of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@y@]: a pointer filled in with the y position of the window, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowPosition = hs_bindgen_0dd4bcea36c16a31
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowSize@
+foreign import ccall unsafe "hs_bindgen_057ef11fd12bbeb6"
+  hs_bindgen_057ef11fd12bbeb6_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowSize@
+hs_bindgen_057ef11fd12bbeb6
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_057ef11fd12bbeb6 =
+  BG.fromFFIType hs_bindgen_057ef11fd12bbeb6_base
+
+-- | Request that the size of a window\'s client area be set.
+--
+--     If the window is in a fullscreen or maximized state, this request has no effect.
+--
+--     To change the exclusive fullscreen mode of a window, use @SDL_SetWindowFullscreenMode()@.
+--
+--     On some windowing systems, this request is asynchronous and the new window size may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window size changes, an SDL_EVENT_WINDOW_RESIZED event will be emitted with the new window dimensions. Note that the new dimensions may not match the exact size requested, as some windowing systems can restrict the window size in certain scenarios (e.g. constraining the size of the content area to remain within the usable desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSize', 'sDL_SetWindowFullscreenMode', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowSize@, defined at @SDL3\/SDL_video.h 1850:34@
+sDL_SetWindowSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@w@]: the width of the window, must be > 0.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@h@]: the height of the window, must be > 0.
+  -> IO BG.CBool
+sDL_SetWindowSize = hs_bindgen_057ef11fd12bbeb6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowSize@
+foreign import ccall unsafe "hs_bindgen_f812f66416921726"
+  hs_bindgen_f812f66416921726_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowSize@
+hs_bindgen_f812f66416921726
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_f812f66416921726 =
+  BG.fromFFIType hs_bindgen_f812f66416921726_base
+
+-- | Get the size of a window\'s client area.
+--
+--     The window pixel size may differ from its window coordinate size if the window is on a high pixel density display. Use @SDL_GetWindowSizeInPixels()@ or SDL_GetRenderOutputSize() to get the real client area size in pixels.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_GetRenderOutputSize, 'sDL_GetWindowSizeInPixels', 'sDL_SetWindowSize', SDL_EVENT_WINDOW_RESIZED
+--
+--     [C declaration]: @SDL_GetWindowSize@, defined at @SDL3\/SDL_video.h 1874:34@
+sDL_GetWindowSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the width and height from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height of the window, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowSize = hs_bindgen_f812f66416921726
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowSafeArea@
+foreign import ccall unsafe "hs_bindgen_212ea87435c7ebb9"
+  hs_bindgen_212ea87435c7ebb9_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowSafeArea@
+hs_bindgen_212ea87435c7ebb9
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_212ea87435c7ebb9 =
+  BG.fromFFIType hs_bindgen_212ea87435c7ebb9_base
+
+-- | Get the safe area for this window.
+--
+--     Some devices have portions of the screen which are partially obscured or not interactive, possibly due to on-screen controls, curved edges, camera notches, TV overscan, etc. This function provides the area of the window which is safe to have interactable content. You should continue rendering into the rest of the window, but it should not contain visually important or interactable content.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GetWindowSafeArea@, defined at @SDL3\/SDL_video.h 1896:34@
+sDL_GetWindowSafeArea
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the client area that is safe for interactive content.
+  -> IO BG.CBool
+sDL_GetWindowSafeArea = hs_bindgen_212ea87435c7ebb9
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowAspectRatio@
+foreign import ccall unsafe "hs_bindgen_a97676f9d3d5cacb"
+  hs_bindgen_a97676f9d3d5cacb_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowAspectRatio@
+hs_bindgen_a97676f9d3d5cacb
+  :: BG.Ptr SDL_Window
+  -> BG.CFloat
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_a97676f9d3d5cacb =
+  BG.fromFFIType hs_bindgen_a97676f9d3d5cacb_base
+
+-- | Request that the aspect ratio of a window\'s client area be set.
+--
+--     The aspect ratio is the ratio of width divided by height, e.g. 2560x1600 would be 1.6. Larger aspect ratios are wider and smaller aspect ratios are narrower.
+--
+--     If, at the time of this request, the window in a fixed-size state, such as maximized or fullscreen, the request will be deferred until the window exits this state and becomes resizable again.
+--
+--     On some windowing systems, this request is asynchronous and the new window aspect ratio may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window size changes, an SDL_EVENT_WINDOW_RESIZED event will be emitted with the new window dimensions. Note that the new dimensions may not match the exact aspect ratio requested, as some windowing systems can restrict the window size in certain scenarios (e.g. constraining the size of the content area to remain within the usable desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowAspectRatio', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_SetWindowAspectRatio@, defined at @SDL3\/SDL_video.h 1937:34@
+sDL_SetWindowAspectRatio
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@min_aspect@]: the minimum aspect ratio of the window, or 0.0f for no limit.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@max_aspect@]: the maximum aspect ratio of the window, or 0.0f for no limit.
+  -> IO BG.CBool
+sDL_SetWindowAspectRatio =
+  hs_bindgen_a97676f9d3d5cacb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowAspectRatio@
+foreign import ccall unsafe "hs_bindgen_c4fcb6be51b89962"
+  hs_bindgen_c4fcb6be51b89962_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowAspectRatio@
+hs_bindgen_c4fcb6be51b89962
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CFloat
+  -> BG.Ptr BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_c4fcb6be51b89962 =
+  BG.fromFFIType hs_bindgen_c4fcb6be51b89962_base
+
+-- | Get the aspect ratio of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowAspectRatio'
+--
+--     [C declaration]: @SDL_GetWindowAspectRatio@, defined at @SDL3\/SDL_video.h 1956:34@
+sDL_GetWindowAspectRatio
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the width and height from.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@min_aspect@]: a pointer filled in with the minimum aspect ratio of the window, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@max_aspect@]: a pointer filled in with the maximum aspect ratio of the window, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowAspectRatio =
+  hs_bindgen_c4fcb6be51b89962
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowBordersSize@
+foreign import ccall unsafe "hs_bindgen_fe9fa856ca0ad8ba"
+  hs_bindgen_fe9fa856ca0ad8ba_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowBordersSize@
+hs_bindgen_fe9fa856ca0ad8ba
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_fe9fa856ca0ad8ba =
+  BG.fromFFIType hs_bindgen_fe9fa856ca0ad8ba_base
+
+-- | Get the size of a window\'s borders (decorations) around the client area.
+--
+--     Note: If this function fails (returns false), the size values will be initialized to 0, 0, 0, 0 (if a non-NULL pointer is provided), as if the window in question was borderless.
+--
+--     Note: This function may fail on systems where the window has not yet been decorated by the display server (for example, immediately after calling SDL_CreateWindow). It is recommended that you wait at least until the window has been presented and composited, so that the window system has a chance to decorate the window and provide the border dimensions to SDL.
+--
+--     This function also returns false if getting the information is not supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSize'
+--
+--     [C declaration]: @SDL_GetWindowBordersSize@, defined at @SDL3\/SDL_video.h 1993:34@
+sDL_GetWindowBordersSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the size values of the border (decorations) from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@top@]: pointer to variable for storing the size of the top border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@left@]: pointer to variable for storing the size of the left border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@bottom@]: pointer to variable for storing the size of the bottom border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@right@]: pointer to variable for storing the size of the right border; NULL is permitted.
+  -> IO BG.CBool
+sDL_GetWindowBordersSize =
+  hs_bindgen_fe9fa856ca0ad8ba
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowSizeInPixels@
+foreign import ccall unsafe "hs_bindgen_0bdc369c35af7209"
+  hs_bindgen_0bdc369c35af7209_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowSizeInPixels@
+hs_bindgen_0bdc369c35af7209
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_0bdc369c35af7209 =
+  BG.fromFFIType hs_bindgen_0bdc369c35af7209_base
+
+-- | Get the size of a window\'s client area, in pixels.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreateWindow', 'sDL_GetWindowSize'
+--
+--     [C declaration]: @SDL_GetWindowSizeInPixels@, defined at @SDL3\/SDL_video.h 2013:34@
+sDL_GetWindowSizeInPixels
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window from which the drawable size should be queried.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer to variable for storing the width in pixels, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer to variable for storing the height in pixels, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowSizeInPixels =
+  hs_bindgen_0bdc369c35af7209
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowMinimumSize@
+foreign import ccall unsafe "hs_bindgen_4a83221f1efbc09f"
+  hs_bindgen_4a83221f1efbc09f_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowMinimumSize@
+hs_bindgen_4a83221f1efbc09f
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_4a83221f1efbc09f =
+  BG.fromFFIType hs_bindgen_4a83221f1efbc09f_base
+
+-- | Set the minimum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMinimumSize', 'sDL_SetWindowMaximumSize'
+--
+--     [C declaration]: @SDL_SetWindowMinimumSize@, defined at @SDL3\/SDL_video.h 2031:34@
+sDL_SetWindowMinimumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@min_w@]: the minimum width of the window, or 0 for no limit.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@min_h@]: the minimum height of the window, or 0 for no limit.
+  -> IO BG.CBool
+sDL_SetWindowMinimumSize =
+  hs_bindgen_4a83221f1efbc09f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowMinimumSize@
+foreign import ccall unsafe "hs_bindgen_9492964d5df1add3"
+  hs_bindgen_9492964d5df1add3_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowMinimumSize@
+hs_bindgen_9492964d5df1add3
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_9492964d5df1add3 =
+  BG.fromFFIType hs_bindgen_9492964d5df1add3_base
+
+-- | Get the minimum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMaximumSize', 'sDL_SetWindowMinimumSize'
+--
+--     [C declaration]: @SDL_GetWindowMinimumSize@, defined at @SDL3\/SDL_video.h 2051:34@
+sDL_GetWindowMinimumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the minimum width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the minimum height of the window, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowMinimumSize =
+  hs_bindgen_9492964d5df1add3
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowMaximumSize@
+foreign import ccall unsafe "hs_bindgen_70ec3985e428bdd2"
+  hs_bindgen_70ec3985e428bdd2_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowMaximumSize@
+hs_bindgen_70ec3985e428bdd2
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_70ec3985e428bdd2 =
+  BG.fromFFIType hs_bindgen_70ec3985e428bdd2_base
+
+-- | Set the maximum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMaximumSize', 'sDL_SetWindowMinimumSize'
+--
+--     [C declaration]: @SDL_SetWindowMaximumSize@, defined at @SDL3\/SDL_video.h 2069:34@
+sDL_SetWindowMaximumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@max_w@]: the maximum width of the window, or 0 for no limit.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@max_h@]: the maximum height of the window, or 0 for no limit.
+  -> IO BG.CBool
+sDL_SetWindowMaximumSize =
+  hs_bindgen_70ec3985e428bdd2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowMaximumSize@
+foreign import ccall unsafe "hs_bindgen_948d13442e6065ab"
+  hs_bindgen_948d13442e6065ab_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowMaximumSize@
+hs_bindgen_948d13442e6065ab
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_948d13442e6065ab =
+  BG.fromFFIType hs_bindgen_948d13442e6065ab_base
+
+-- | Get the maximum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMinimumSize', 'sDL_SetWindowMaximumSize'
+--
+--     [C declaration]: @SDL_GetWindowMaximumSize@, defined at @SDL3\/SDL_video.h 2089:34@
+sDL_GetWindowMaximumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the maximum width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the maximum height of the window, may be NULL.
+  -> IO BG.CBool
+sDL_GetWindowMaximumSize =
+  hs_bindgen_948d13442e6065ab
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowBordered@
+foreign import ccall unsafe "hs_bindgen_6289af3cb8f93407"
+  hs_bindgen_6289af3cb8f93407_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowBordered@
+hs_bindgen_6289af3cb8f93407
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_6289af3cb8f93407 =
+  BG.fromFFIType hs_bindgen_6289af3cb8f93407_base
+
+-- | Set the border state of a window.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_BORDERLESS@ flag and add or remove the border from the actual window. This is a no-op if the window\'s border already matches the requested state.
+--
+--     You can\'t change the border state of a fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowBordered@, defined at @SDL3\/SDL_video.h 2111:34@
+sDL_SetWindowBordered
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the border state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@bordered@]: false to remove border, true to add border.
+  -> IO BG.CBool
+sDL_SetWindowBordered = hs_bindgen_6289af3cb8f93407
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowResizable@
+foreign import ccall unsafe "hs_bindgen_46aff2e1cb31d53c"
+  hs_bindgen_46aff2e1cb31d53c_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowResizable@
+hs_bindgen_46aff2e1cb31d53c
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_46aff2e1cb31d53c =
+  BG.fromFFIType hs_bindgen_46aff2e1cb31d53c_base
+
+-- | Set the user-resizable state of a window.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_RESIZABLE@ flag and allow\/disallow user resizing of the window. This is a no-op if the window\'s resizable state already matches the requested state.
+--
+--     You can\'t change the resizable state of a fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowResizable@, defined at @SDL3\/SDL_video.h 2133:34@
+sDL_SetWindowResizable
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the resizable state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@resizable@]: true to allow resizing, false to disallow.
+  -> IO BG.CBool
+sDL_SetWindowResizable = hs_bindgen_46aff2e1cb31d53c
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowAlwaysOnTop@
+foreign import ccall unsafe "hs_bindgen_745fd81846537dd7"
+  hs_bindgen_745fd81846537dd7_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowAlwaysOnTop@
+hs_bindgen_745fd81846537dd7
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_745fd81846537dd7 =
+  BG.fromFFIType hs_bindgen_745fd81846537dd7_base
+
+-- | Set the window to always be above the others.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_ALWAYS_ON_TOP@ flag. This will bring the window to the front and keep the window above the rest.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowAlwaysOnTop@, defined at @SDL3\/SDL_video.h 2152:34@
+sDL_SetWindowAlwaysOnTop
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the always on top state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@on_top@]: true to set the window always on top, false to disable.
+  -> IO BG.CBool
+sDL_SetWindowAlwaysOnTop =
+  hs_bindgen_745fd81846537dd7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowFillDocument@
+foreign import ccall unsafe "hs_bindgen_51036b434b8a9d9a"
+  hs_bindgen_51036b434b8a9d9a_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowFillDocument@
+hs_bindgen_51036b434b8a9d9a
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_51036b434b8a9d9a =
+  BG.fromFFIType hs_bindgen_51036b434b8a9d9a_base
+
+-- | Set the window to fill the current document space (Emscripten only).
+--
+--     This will add or remove the window\'s @SDL_WINDOW_FILL_DOCUMENT@ flag.
+--
+--     Currently this flag only applies to the Emscripten target.
+--
+--     When enabled, the canvas element fills the entire document. Resize events will be generated as the browser window is resized, as that will adjust the canvas size as well. The canvas will cover anything else on the page, including any controls provided by Emscripten in its generated HTML file (in fact, any elements on the page that aren\'t the canvas will be moved into a hidden @div@ element).
+--
+--     Often times this is desirable for a browser-based game, but it means several things that we expect of an SDL window on other platforms might not work as expected, such as minimum window sizes and aspect ratios.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'sDL_GetWindowFlags'
+--
+--     [C declaration]: @SDL_SetWindowFillDocument@, defined at @SDL3\/SDL_video.h 2183:34@
+sDL_SetWindowFillDocument
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the fill-document state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@fill@]: true to set the window to fill the document, false to disable.
+  -> IO BG.CBool
+sDL_SetWindowFillDocument =
+  hs_bindgen_51036b434b8a9d9a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_ShowWindow@
+foreign import ccall unsafe "hs_bindgen_7fdf198ee1ca7f92"
+  hs_bindgen_7fdf198ee1ca7f92_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_ShowWindow@
+hs_bindgen_7fdf198ee1ca7f92
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_7fdf198ee1ca7f92 =
+  BG.fromFFIType hs_bindgen_7fdf198ee1ca7f92_base
+
+-- | Show a window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_HideWindow', 'sDL_RaiseWindow'
+--
+--     [C declaration]: @SDL_ShowWindow@, defined at @SDL3\/SDL_video.h 2199:34@
+sDL_ShowWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to show.
+  -> IO BG.CBool
+sDL_ShowWindow = hs_bindgen_7fdf198ee1ca7f92
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_HideWindow@
+foreign import ccall unsafe "hs_bindgen_2764604bcb0dc3ca"
+  hs_bindgen_2764604bcb0dc3ca_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_HideWindow@
+hs_bindgen_2764604bcb0dc3ca
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_2764604bcb0dc3ca =
+  BG.fromFFIType hs_bindgen_2764604bcb0dc3ca_base
+
+-- | Hide a window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ShowWindow', @SDL_WINDOW_HIDDEN@
+--
+--     [C declaration]: @SDL_HideWindow@, defined at @SDL3\/SDL_video.h 2215:34@
+sDL_HideWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to hide.
+  -> IO BG.CBool
+sDL_HideWindow = hs_bindgen_2764604bcb0dc3ca
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_RaiseWindow@
+foreign import ccall unsafe "hs_bindgen_655550628b940a03"
+  hs_bindgen_655550628b940a03_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_RaiseWindow@
+hs_bindgen_655550628b940a03
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_655550628b940a03 =
+  BG.fromFFIType hs_bindgen_655550628b940a03_base
+
+-- | Request that a window be raised above other windows and gain the input focus.
+--
+--     The result of this request is subject to desktop window manager policy, particularly if raising the requested window would result in stealing focus from another application. If the window is successfully raised and gains input focus, an SDL_EVENT_WINDOW_FOCUS_GAINED event will be emitted, and the window will have the SDL_WINDOW_INPUT_FOCUS flag set.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_RaiseWindow@, defined at @SDL3\/SDL_video.h 2235:34@
+sDL_RaiseWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to raise.
+  -> IO BG.CBool
+sDL_RaiseWindow = hs_bindgen_655550628b940a03
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_MaximizeWindow@
+foreign import ccall unsafe "hs_bindgen_080d71419d89f8ac"
+  hs_bindgen_080d71419d89f8ac_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_MaximizeWindow@
+hs_bindgen_080d71419d89f8ac
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_080d71419d89f8ac =
+  BG.fromFFIType hs_bindgen_080d71419d89f8ac_base
+
+-- | Request that the window be made as large as possible.
+--
+--     Non-resizable windows can\'t be maximized. The window must have the SDL_WINDOW_RESIZABLE flag set, or this will have no effect.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_MAXIMIZED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     When maximizing a window, whether the constraints set via @SDL_SetWindowMaximumSize()@ are honored depends on the policy of the window manager. Win32 and macOS enforce the constraints when maximizing, while X11 and Wayland window managers may vary.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MinimizeWindow', 'sDL_RestoreWindow', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_MaximizeWindow@, defined at @SDL3\/SDL_video.h 2269:34@
+sDL_MaximizeWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to maximize.
+  -> IO BG.CBool
+sDL_MaximizeWindow = hs_bindgen_080d71419d89f8ac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_MinimizeWindow@
+foreign import ccall unsafe "hs_bindgen_e1f35d0dbc3b4400"
+  hs_bindgen_e1f35d0dbc3b4400_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_MinimizeWindow@
+hs_bindgen_e1f35d0dbc3b4400
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_e1f35d0dbc3b4400 =
+  BG.fromFFIType hs_bindgen_e1f35d0dbc3b4400_base
+
+-- | Request that the window be minimized to an iconic representation.
+--
+--     If the window is in a fullscreen state, this request has no direct effect. It may alter the state the window is returned to when leaving fullscreen.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_MINIMIZED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MaximizeWindow', 'sDL_RestoreWindow', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_MinimizeWindow@, defined at @SDL3\/SDL_video.h 2298:34@
+sDL_MinimizeWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to minimize.
+  -> IO BG.CBool
+sDL_MinimizeWindow = hs_bindgen_e1f35d0dbc3b4400
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_RestoreWindow@
+foreign import ccall unsafe "hs_bindgen_e090b304456b95d1"
+  hs_bindgen_e090b304456b95d1_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_RestoreWindow@
+hs_bindgen_e090b304456b95d1
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_e090b304456b95d1 =
+  BG.fromFFIType hs_bindgen_e090b304456b95d1_base
+
+-- | Request that the size and position of a minimized or maximized window be restored.
+--
+--     If the window is in a fullscreen state, this request has no direct effect. It may alter the state the window is returned to when leaving fullscreen.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_RESTORED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_MaximizeWindow', 'sDL_MinimizeWindow', 'sDL_SyncWindow'
+--
+--     [C declaration]: @SDL_RestoreWindow@, defined at @SDL3\/SDL_video.h 2328:34@
+sDL_RestoreWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to restore.
+  -> IO BG.CBool
+sDL_RestoreWindow = hs_bindgen_e090b304456b95d1
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowFullscreen@
+foreign import ccall unsafe "hs_bindgen_b1dbd6c7bf42bc68"
+  hs_bindgen_b1dbd6c7bf42bc68_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowFullscreen@
+hs_bindgen_b1dbd6c7bf42bc68
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_b1dbd6c7bf42bc68 =
+  BG.fromFFIType hs_bindgen_b1dbd6c7bf42bc68_base
+
+-- | Request that the window\'s fullscreen state be changed.
+--
+--     By default a window in fullscreen state uses borderless fullscreen desktop mode, but a specific exclusive display mode can be set using @SDL_SetWindowFullscreenMode()@.
+--
+--     On some windowing systems this request is asynchronous and the new fullscreen state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @SDL_SyncWindow()@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_ENTER_FULLSCREEN or SDL_EVENT_WINDOW_LEAVE_FULLSCREEN event will be emitted. Note that, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowFullscreenMode', 'sDL_SetWindowFullscreenMode', 'sDL_SyncWindow', @SDL_WINDOW_FULLSCREEN@
+--
+--     [C declaration]: @SDL_SetWindowFullscreen@, defined at @SDL3\/SDL_video.h 2360:34@
+sDL_SetWindowFullscreen
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@fullscreen@]: true for fullscreen mode, false for windowed mode.
+  -> IO BG.CBool
+sDL_SetWindowFullscreen = hs_bindgen_b1dbd6c7bf42bc68
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SyncWindow@
+foreign import ccall unsafe "hs_bindgen_ce8bade87de24cec"
+  hs_bindgen_ce8bade87de24cec_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SyncWindow@
+hs_bindgen_ce8bade87de24cec
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_ce8bade87de24cec =
+  BG.fromFFIType hs_bindgen_ce8bade87de24cec_base
+
+-- | Block until any pending window state is finalized.
+--
+--     On asynchronous windowing systems, this acts as a synchronization barrier for pending window state. It will attempt to wait until any pending window state has been applied and is guaranteed to return within finite time. Note that for how long it can potentially block depends on the underlying window system, as window state changes may involve somewhat lengthy animations that must complete before the window is in its final requested state.
+--
+--     On windowing systems where changes are immediate, this does nothing.
+--
+--     [Returns]: true on success or false if the operation timed out before the window was in the requested state.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowSize', 'sDL_SetWindowPosition', 'sDL_SetWindowFullscreen', 'sDL_MinimizeWindow', 'sDL_MaximizeWindow', 'sDL_RestoreWindow', SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS
+--
+--     [C declaration]: @SDL_SyncWindow@, defined at @SDL3\/SDL_video.h 2391:34@
+sDL_SyncWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to wait for the pending state to be applied.
+  -> IO BG.CBool
+sDL_SyncWindow = hs_bindgen_ce8bade87de24cec
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_WindowHasSurface@
+foreign import ccall unsafe "hs_bindgen_60a31e841c25b5c2"
+  hs_bindgen_60a31e841c25b5c2_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_WindowHasSurface@
+hs_bindgen_60a31e841c25b5c2
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_60a31e841c25b5c2 =
+  BG.fromFFIType hs_bindgen_60a31e841c25b5c2_base
+
+-- | Return whether the window has a surface associated with it.
+--
+--     [Returns]: true if there is a surface associated with the window, or false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface'
+--
+--     [C declaration]: @SDL_WindowHasSurface@, defined at @SDL3\/SDL_video.h 2406:34@
+sDL_WindowHasSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CBool
+sDL_WindowHasSurface = hs_bindgen_60a31e841c25b5c2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowSurface@
+foreign import ccall unsafe "hs_bindgen_b27ac903c03a4dfa"
+  hs_bindgen_b27ac903c03a4dfa_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowSurface@
+hs_bindgen_b27ac903c03a4dfa
+  :: BG.Ptr SDL_Window
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+hs_bindgen_b27ac903c03a4dfa =
+  BG.fromFFIType hs_bindgen_b27ac903c03a4dfa_base
+
+-- | Get the SDL surface associated with the window.
+--
+--     A new surface will be created with the optimal format for the window, if necessary. This surface will be freed when the window is destroyed. Do not free this surface.
+--
+--     This surface will be invalidated if the window is resized. After resizing a window this function must be called again to return a valid surface.
+--
+--     You may not combine this with 3D or the rendering API on this window.
+--
+--     This function is affected by @SDL_HINT_FRAMEBUFFER_ACCELERATION@.
+--
+--     [Returns]: the surface associated with the window, or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DestroyWindowSurface', 'sDL_WindowHasSurface', 'sDL_UpdateWindowSurface', 'sDL_UpdateWindowSurfaceRects'
+--
+--     [C declaration]: @SDL_GetWindowSurface@, defined at @SDL3\/SDL_video.h 2435:43@
+sDL_GetWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+sDL_GetWindowSurface = hs_bindgen_b27ac903c03a4dfa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowSurfaceVSync@
+foreign import ccall unsafe "hs_bindgen_507572e10b7f7b5d"
+  hs_bindgen_507572e10b7f7b5d_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowSurfaceVSync@
+hs_bindgen_507572e10b7f7b5d
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_507572e10b7f7b5d =
+  BG.fromFFIType hs_bindgen_507572e10b7f7b5d_base
+
+-- | Toggle VSync for the window surface.
+--
+--     When a window surface is created, vsync defaults to SDL_WINDOW_SURFACE_VSYNC_DISABLED.
+--
+--     The @vsync@ parameter can be 1 to synchronize present with every vertical refresh, 2 to synchronize present with every second vertical refresh, etc., SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or SDL_WINDOW_SURFACE_VSYNC_DISABLED to disable. Not every value is supported by every driver, so you should check the return value to see whether the requested setting is supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurfaceVSync'
+--
+--     [C declaration]: @SDL_SetWindowSurfaceVSync@, defined at @SDL3\/SDL_video.h 2461:34@
+sDL_SetWindowSurfaceVSync
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: the vertical refresh sync interval.
+  -> IO BG.CBool
+sDL_SetWindowSurfaceVSync =
+  hs_bindgen_507572e10b7f7b5d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowSurfaceVSync@
+foreign import ccall unsafe "hs_bindgen_b6f4ee5ffa664900"
+  hs_bindgen_b6f4ee5ffa664900_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowSurfaceVSync@
+hs_bindgen_b6f4ee5ffa664900
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_b6f4ee5ffa664900 =
+  BG.fromFFIType hs_bindgen_b6f4ee5ffa664900_base
+
+-- | Get VSync for the window surface.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowSurfaceVSync'
+--
+--     [C declaration]: @SDL_GetWindowSurfaceVSync@, defined at @SDL3\/SDL_video.h 2481:34@
+sDL_GetWindowSurfaceVSync
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: an int filled with the current vertical refresh sync interval. See @SDL_SetWindowSurfaceVSync()@ for the meaning of the value.
+  -> IO BG.CBool
+sDL_GetWindowSurfaceVSync =
+  hs_bindgen_b6f4ee5ffa664900
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_UpdateWindowSurface@
+foreign import ccall unsafe "hs_bindgen_0647ceba715b9468"
+  hs_bindgen_0647ceba715b9468_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_UpdateWindowSurface@
+hs_bindgen_0647ceba715b9468
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_0647ceba715b9468 =
+  BG.fromFFIType hs_bindgen_0647ceba715b9468_base
+
+-- | Copy the window surface to the screen.
+--
+--     This is the function you use to reflect any changes to the surface on the screen.
+--
+--     This function is equivalent to the SDL 1.2 API SDL_Flip().
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface', 'sDL_UpdateWindowSurfaceRects'
+--
+--     [C declaration]: @SDL_UpdateWindowSurface@, defined at @SDL3\/SDL_video.h 2502:34@
+sDL_UpdateWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> IO BG.CBool
+sDL_UpdateWindowSurface = hs_bindgen_0647ceba715b9468
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_UpdateWindowSurfaceRects@
+foreign import ccall unsafe "hs_bindgen_99ad341567ec7dd7"
+  hs_bindgen_99ad341567ec7dd7_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_UpdateWindowSurfaceRects@
+hs_bindgen_99ad341567ec7dd7
+  :: BG.Ptr SDL_Window
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_99ad341567ec7dd7 =
+  BG.fromFFIType hs_bindgen_99ad341567ec7dd7_base
+
+-- | Copy areas of the window surface to the screen.
+--
+--     This is the function you use to reflect changes to portions of the surface on the screen.
+--
+--     This function is equivalent to the SDL 1.2 API SDL_UpdateRects().
+--
+--     Note that this function will update /at least/ the rectangles specified, but this is only intended as an optimization; in practice, this might update more of the screen (or all of the screen!), depending on what method SDL uses to send pixels to the system.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface', 'sDL_UpdateWindowSurface'
+--
+--     [C declaration]: @SDL_UpdateWindowSurfaceRects@, defined at @SDL3\/SDL_video.h 2531:34@
+sDL_UpdateWindowSurfaceRects
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rects@]: an array of SDL_Rect structures representing areas of the surface to copy, in pixels.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@numrects@]: the number of rectangles.
+  -> IO BG.CBool
+sDL_UpdateWindowSurfaceRects =
+  hs_bindgen_99ad341567ec7dd7
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_DestroyWindowSurface@
+foreign import ccall unsafe "hs_bindgen_7c381c64250e8266"
+  hs_bindgen_7c381c64250e8266_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_DestroyWindowSurface@
+hs_bindgen_7c381c64250e8266
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_7c381c64250e8266 =
+  BG.fromFFIType hs_bindgen_7c381c64250e8266_base
+
+-- | Destroy the surface associated with the window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowSurface', 'sDL_WindowHasSurface'
+--
+--     [C declaration]: @SDL_DestroyWindowSurface@, defined at @SDL3\/SDL_video.h 2547:34@
+sDL_DestroyWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> IO BG.CBool
+sDL_DestroyWindowSurface =
+  hs_bindgen_7c381c64250e8266
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowKeyboardGrab@
+foreign import ccall unsafe "hs_bindgen_088757457073c51d"
+  hs_bindgen_088757457073c51d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowKeyboardGrab@
+hs_bindgen_088757457073c51d
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_088757457073c51d =
+  BG.fromFFIType hs_bindgen_088757457073c51d_base
+
+-- | Set a window\'s keyboard grab mode.
+--
+--     Keyboard grab enables capture of system keyboard shortcuts like Alt+Tab or the Meta\/Super key. Note that not all system keyboard shortcuts can be captured by applications (one example is Ctrl+Alt+Del on Windows).
+--
+--     This is primarily intended for specialized applications such as VNC clients or VM frontends. Normal games should not use keyboard grab.
+--
+--     When keyboard grab is enabled, SDL will continue to handle Alt+Tab when the window is full-screen to ensure the user is not trapped in your application. If you have a custom keyboard shortcut to exit fullscreen mode, you may suppress this behavior with @SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED@.
+--
+--     If the caller enables a grab while another window is currently grabbed, the other window loses its grab in favor of the caller\'s window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowKeyboardGrab', 'sDL_SetWindowMouseGrab'
+--
+--     [C declaration]: @SDL_SetWindowKeyboardGrab@, defined at @SDL3\/SDL_video.h 2580:34@
+sDL_SetWindowKeyboardGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the keyboard grab mode should be set.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@grabbed@]: this is true to grab keyboard, and false to release.
+  -> IO BG.CBool
+sDL_SetWindowKeyboardGrab =
+  hs_bindgen_088757457073c51d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowMouseGrab@
+foreign import ccall unsafe "hs_bindgen_fcca3f67a0285f40"
+  hs_bindgen_fcca3f67a0285f40_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowMouseGrab@
+hs_bindgen_fcca3f67a0285f40
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_fcca3f67a0285f40 =
+  BG.fromFFIType hs_bindgen_fcca3f67a0285f40_base
+
+-- | Set a window\'s mouse grab mode.
+--
+--     Mouse grab confines the mouse cursor to the window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMouseRect', 'sDL_SetWindowMouseRect', 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_SetWindowMouseGrab@, defined at @SDL3\/SDL_video.h 2600:34@
+sDL_SetWindowMouseGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the mouse grab mode should be set.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@grabbed@]: this is true to grab mouse, and false to release.
+  -> IO BG.CBool
+sDL_SetWindowMouseGrab = hs_bindgen_fcca3f67a0285f40
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowKeyboardGrab@
+foreign import ccall unsafe "hs_bindgen_cda2cd2af79b5ca6"
+  hs_bindgen_cda2cd2af79b5ca6_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowKeyboardGrab@
+hs_bindgen_cda2cd2af79b5ca6
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_cda2cd2af79b5ca6 =
+  BG.fromFFIType hs_bindgen_cda2cd2af79b5ca6_base
+
+-- | Get a window\'s keyboard grab mode.
+--
+--     [Returns]: true if keyboard is grabbed, and false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_GetWindowKeyboardGrab@, defined at @SDL3\/SDL_video.h 2614:34@
+sDL_GetWindowKeyboardGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CBool
+sDL_GetWindowKeyboardGrab =
+  hs_bindgen_cda2cd2af79b5ca6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowMouseGrab@
+foreign import ccall unsafe "hs_bindgen_3d8a4df5806b21ff"
+  hs_bindgen_3d8a4df5806b21ff_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowMouseGrab@
+hs_bindgen_3d8a4df5806b21ff
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_3d8a4df5806b21ff =
+  BG.fromFFIType hs_bindgen_3d8a4df5806b21ff_base
+
+-- | Get a window\'s mouse grab mode.
+--
+--     [Returns]: true if mouse is grabbed, and false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMouseRect', 'sDL_SetWindowMouseRect', 'sDL_SetWindowMouseGrab', 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_GetWindowMouseGrab@, defined at @SDL3\/SDL_video.h 2631:34@
+sDL_GetWindowMouseGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO BG.CBool
+sDL_GetWindowMouseGrab = hs_bindgen_3d8a4df5806b21ff
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetGrabbedWindow@
+foreign import ccall unsafe "hs_bindgen_63a195963286004a"
+  hs_bindgen_63a195963286004a_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetGrabbedWindow@
+hs_bindgen_63a195963286004a :: IO (BG.Ptr SDL_Window)
+hs_bindgen_63a195963286004a =
+  BG.fromFFIType hs_bindgen_63a195963286004a_base
+
+-- | Get the window that currently has an input grab enabled.
+--
+--     [Returns]: the window if input is grabbed or NULL otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowMouseGrab', 'sDL_SetWindowKeyboardGrab'
+--
+--     [C declaration]: @SDL_GetGrabbedWindow@, defined at @SDL3\/SDL_video.h 2645:42@
+sDL_GetGrabbedWindow :: IO (BG.Ptr SDL_Window)
+sDL_GetGrabbedWindow = hs_bindgen_63a195963286004a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowMouseRect@
+foreign import ccall unsafe "hs_bindgen_3da85ada2677f1fd"
+  hs_bindgen_3da85ada2677f1fd_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowMouseRect@
+hs_bindgen_3da85ada2677f1fd
+  :: BG.Ptr SDL_Window
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -> IO BG.CBool
+hs_bindgen_3da85ada2677f1fd =
+  BG.fromFFIType hs_bindgen_3da85ada2677f1fd_base
+
+-- | Confines the cursor to the specified area of a window.
+--
+--     Note that this does NOT grab the cursor, it only defines the area a cursor is restricted to when the window has mouse focus.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowMouseRect', 'sDL_GetWindowMouseGrab', 'sDL_SetWindowMouseGrab'
+--
+--     [C declaration]: @SDL_SetWindowMouseRect@, defined at @SDL3\/SDL_video.h 2667:34@
+sDL_SetWindowMouseRect
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that will be associated with the barrier.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a rectangle area in window-relative coordinates. If NULL the barrier for the specified window will be destroyed.
+  -> IO BG.CBool
+sDL_SetWindowMouseRect = hs_bindgen_3da85ada2677f1fd
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowMouseRect@
+foreign import ccall unsafe "hs_bindgen_45c2c94bf4760d8a"
+  hs_bindgen_45c2c94bf4760d8a_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowMouseRect@
+hs_bindgen_45c2c94bf4760d8a
+  :: BG.Ptr SDL_Window
+  -> IO (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect)
+hs_bindgen_45c2c94bf4760d8a =
+  BG.fromFFIType hs_bindgen_45c2c94bf4760d8a_base
+
+-- | Get the mouse confinement rectangle of a window.
+--
+--     [Returns]: a pointer to the mouse confinement rectangle of a window, or NULL if there isn\'t one.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowMouseRect', 'sDL_GetWindowMouseGrab', 'sDL_SetWindowMouseGrab'
+--
+--     [C declaration]: @SDL_GetWindowMouseRect@, defined at @SDL3\/SDL_video.h 2684:46@
+sDL_GetWindowMouseRect
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect)
+sDL_GetWindowMouseRect = hs_bindgen_45c2c94bf4760d8a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowOpacity@
+foreign import ccall unsafe "hs_bindgen_019c9148c0aa4e8f"
+  hs_bindgen_019c9148c0aa4e8f_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowOpacity@
+hs_bindgen_019c9148c0aa4e8f
+  :: BG.Ptr SDL_Window
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_019c9148c0aa4e8f =
+  BG.fromFFIType hs_bindgen_019c9148c0aa4e8f_base
+
+-- | Set the opacity for a window.
+--
+--     The parameter @opacity@ will be clamped internally between 0.0f (transparent) and 1.0f (opaque).
+--
+--     This function also returns false if setting the opacity isn\'t supported.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GetWindowOpacity'
+--
+--     [C declaration]: @SDL_SetWindowOpacity@, defined at @SDL3\/SDL_video.h 2705:34@
+sDL_SetWindowOpacity
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window which will be made transparent or opaque.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@opacity@]: the opacity value (0.0f - transparent, 1.0f - opaque).
+  -> IO BG.CBool
+sDL_SetWindowOpacity = hs_bindgen_019c9148c0aa4e8f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowOpacity@
+foreign import ccall unsafe "hs_bindgen_744325d9009c4077"
+  hs_bindgen_744325d9009c4077_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowOpacity@
+hs_bindgen_744325d9009c4077
+  :: BG.Ptr SDL_Window
+  -> IO BG.CFloat
+hs_bindgen_744325d9009c4077 =
+  BG.fromFFIType hs_bindgen_744325d9009c4077_base
+
+-- | Get the opacity of a window.
+--
+--     If transparency isn\'t supported on this platform, opacity will be returned as 1.0f without error.
+--
+--     [Returns]: the opacity, (0.0f - transparent, 1.0f - opaque), or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowOpacity'
+--
+--     [C declaration]: @SDL_GetWindowOpacity@, defined at @SDL3\/SDL_video.h 2723:35@
+sDL_GetWindowOpacity
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current opacity value from.
+  -> IO BG.CFloat
+sDL_GetWindowOpacity = hs_bindgen_744325d9009c4077
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowParent@
+foreign import ccall unsafe "hs_bindgen_effc3e47de752f57"
+  hs_bindgen_effc3e47de752f57_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowParent@
+hs_bindgen_effc3e47de752f57
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_effc3e47de752f57 =
+  BG.fromFFIType hs_bindgen_effc3e47de752f57_base
+
+-- | Set the window as a child of a parent window.
+--
+--     If the window is already the child of an existing window, it will be reparented to the new owner. Setting the parent window to NULL unparents the window and removes child window status.
+--
+--     If a parent window is hidden or destroyed, the operation will be recursively applied to child windows. Child windows hidden with the parent that did not have their hidden status explicitly set will be restored when the parent is shown.
+--
+--     Attempting to set the parent of a window that is currently in the modal state will fail. Use @SDL_SetWindowModal()@ to cancel the modal status before attempting to change the parent.
+--
+--     Popup windows cannot change parents and attempts to do so will fail.
+--
+--     Setting a parent window that is currently the sibling or descendent of the child window results in undefined behavior.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowModal'
+--
+--     [C declaration]: @SDL_SetWindowParent@, defined at @SDL3\/SDL_video.h 2757:34@
+sDL_SetWindowParent
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that should become the child of a parent.
+  -> BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@parent@]: the new parent window for the child window.
+  -> IO BG.CBool
+sDL_SetWindowParent = hs_bindgen_effc3e47de752f57
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowModal@
+foreign import ccall unsafe "hs_bindgen_d48e7b0b38e32483"
+  hs_bindgen_d48e7b0b38e32483_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowModal@
+hs_bindgen_d48e7b0b38e32483
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_d48e7b0b38e32483 =
+  BG.fromFFIType hs_bindgen_d48e7b0b38e32483_base
+
+-- | Toggle the state of the window as modal.
+--
+--     To enable modal status on a window, the window must currently be the child window of a parent, or toggling modal status on will fail.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_SetWindowParent', @SDL_WINDOW_MODAL@
+--
+--     [C declaration]: @SDL_SetWindowModal@, defined at @SDL3\/SDL_video.h 2777:34@
+sDL_SetWindowModal
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window on which to set the modal state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@modal@]: true to toggle modal status on, false to toggle it off.
+  -> IO BG.CBool
+sDL_SetWindowModal = hs_bindgen_d48e7b0b38e32483
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowFocusable@
+foreign import ccall unsafe "hs_bindgen_45029d07ea1d3a4d"
+  hs_bindgen_45029d07ea1d3a4d_base
+    :: BG.Ptr BG.Void
+    -> BG.Word8
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowFocusable@
+hs_bindgen_45029d07ea1d3a4d
+  :: BG.Ptr SDL_Window
+  -> BG.CBool
+  -> IO BG.CBool
+hs_bindgen_45029d07ea1d3a4d =
+  BG.fromFFIType hs_bindgen_45029d07ea1d3a4d_base
+
+-- | Set whether the window may have input focus.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetWindowFocusable@, defined at @SDL3\/SDL_video.h 2791:34@
+sDL_SetWindowFocusable
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to set focusable state.
+  -> BG.CBool
+  -- ^
+  --
+  --           [@focusable@]: true to allow input focus, false to not allow input focus.
+  -> IO BG.CBool
+sDL_SetWindowFocusable = hs_bindgen_45029d07ea1d3a4d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_ShowWindowSystemMenu@
+foreign import ccall unsafe "hs_bindgen_839b36668059a297"
+  hs_bindgen_839b36668059a297_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_ShowWindowSystemMenu@
+hs_bindgen_839b36668059a297
+  :: BG.Ptr SDL_Window
+  -> BG.CInt
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_839b36668059a297 =
+  BG.fromFFIType hs_bindgen_839b36668059a297_base
+
+-- | Display the system-level window menu.
+--
+--     This default window menu is provided by the system and on some platforms provides functionality for setting or changing privileged state on the window, such as moving it between workspaces or displays, or toggling the always-on-top property.
+--
+--     On platforms or desktops where this is unsupported, this function does nothing.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_ShowWindowSystemMenu@, defined at @SDL3\/SDL_video.h 2817:34@
+sDL_ShowWindowSystemMenu
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the menu will be displayed.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the menu, relative to the origin (top-left) of the client area.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the menu, relative to the origin (top-left) of the client area.
+  -> IO BG.CBool
+sDL_ShowWindowSystemMenu =
+  hs_bindgen_839b36668059a297
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowHitTest@
+foreign import ccall unsafe "hs_bindgen_b4659f0d8b06588e"
+  hs_bindgen_b4659f0d8b06588e_base
+    :: BG.Ptr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowHitTest@
+hs_bindgen_b4659f0d8b06588e
+  :: BG.Ptr SDL_Window
+  -> SDL_HitTest
+  -> BG.Ptr BG.Void
+  -> IO BG.CBool
+hs_bindgen_b4659f0d8b06588e =
+  BG.fromFFIType hs_bindgen_b4659f0d8b06588e_base
+
+-- | Provide a callback that decides if a window region has special properties.
+--
+--     Normally windows are dragged and resized by decorations provided by the system window manager (a title bar, borders, etc), but for some apps, it makes sense to drag them from somewhere else inside the window itself; for example, one might have a borderless window that wants to be draggable from any part, or simulate its own title bar, etc.
+--
+--     This function lets the app provide a callback that designates pieces of a given window as special. This callback is run during event processing if we need to tell the OS to treat a region of the window specially; the use of this callback is known as \"hit testing.\"
+--
+--     Mouse input may not be delivered to your application if it is within a special area; the OS will often apply that input to moving the window or resizing the window and not deliver it to the application.
+--
+--     Specifying NULL for a callback disables hit-testing. Hit-testing is disabled by default.
+--
+--     Platforms that don\'t support this functionality will return false unconditionally, even if you\'re attempting to disable hit-testing.
+--
+--     Your callback may fire at any time, and its firing does not indicate any specific behavior (for example, on Windows, this certainly might fire when the OS is deciding whether to drag your window, but it fires for lots of other reasons, too, some unrelated to anything you probably care about /and when the mouse isn\'t actually at the location it is testing/). Since this can fire at any time, you should try to keep your callback efficient, devoid of allocations, etc.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetWindowHitTest@, defined at @SDL3\/SDL_video.h 2898:34@
+sDL_SetWindowHitTest
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to set hit-testing on.
+  -> SDL_HitTest
+  -- ^
+  --
+  --           [@callback@]: the function to call when doing a hit-test.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@callback_data@]: an app-defined void pointer passed to __callback__.
+  -> IO BG.CBool
+sDL_SetWindowHitTest = hs_bindgen_b4659f0d8b06588e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowShape@
+foreign import ccall unsafe "hs_bindgen_e671b0b9ca790520"
+  hs_bindgen_e671b0b9ca790520_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowShape@
+hs_bindgen_e671b0b9ca790520
+  :: BG.Ptr SDL_Window
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -> IO BG.CBool
+hs_bindgen_e671b0b9ca790520 =
+  BG.fromFFIType hs_bindgen_e671b0b9ca790520_base
+
+-- | Set the shape of a transparent window.
+--
+--     This sets the alpha channel of a transparent window and any fully transparent areas are also transparent to mouse clicks. If you are using something besides the SDL render API, then you are responsible for drawing the alpha channel of the window to match the shape alpha channel to get consistent cross-platform results.
+--
+--     The shape is copied inside this function, so you can free it afterwards. If your shape surface changes, you should call @SDL_SetWindowShape()@ again to update the window. This is an expensive operation, so should be done sparingly.
+--
+--     The window must have been created with the SDL_WINDOW_TRANSPARENT flag.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_SetWindowShape@, defined at @SDL3\/SDL_video.h 2926:34@
+sDL_SetWindowShape
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@shape@]: the surface representing the shape of the window, or NULL to remove any current shape.
+  -> IO BG.CBool
+sDL_SetWindowShape = hs_bindgen_e671b0b9ca790520
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_FlashWindow@
+foreign import ccall unsafe "hs_bindgen_631082dd3b92af79"
+  hs_bindgen_631082dd3b92af79_base
+    :: BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_FlashWindow@
+hs_bindgen_631082dd3b92af79
+  :: BG.Ptr SDL_Window
+  -> SDL_FlashOperation
+  -> IO BG.CBool
+hs_bindgen_631082dd3b92af79 =
+  BG.fromFFIType hs_bindgen_631082dd3b92af79_base
+
+-- | Request a window to demand attention from the user.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_FlashWindow@, defined at @SDL3\/SDL_video.h 2940:34@
+sDL_FlashWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to be flashed.
+  -> SDL_FlashOperation
+  -- ^
+  --
+  --           [@operation@]: the operation to perform.
+  -> IO BG.CBool
+sDL_FlashWindow = hs_bindgen_631082dd3b92af79
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowProgressState@
+foreign import ccall unsafe "hs_bindgen_24d52be2d578e3a6"
+  hs_bindgen_24d52be2d578e3a6_base
+    :: BG.Ptr BG.Void
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowProgressState@
+hs_bindgen_24d52be2d578e3a6
+  :: BG.Ptr SDL_Window
+  -> SDL_ProgressState
+  -> IO BG.CBool
+hs_bindgen_24d52be2d578e3a6 =
+  BG.fromFFIType hs_bindgen_24d52be2d578e3a6_base
+
+-- | Sets the state of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetWindowProgressState@, defined at @SDL3\/SDL_video.h 2955:34@
+sDL_SetWindowProgressState
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window whose progress state is to be modified.
+  -> SDL_ProgressState
+  -- ^
+  --
+  --           [@state@]: the progress state. @SDL_PROGRESS_STATE_NONE@ stops displaying the progress bar.
+  -> IO BG.CBool
+sDL_SetWindowProgressState =
+  hs_bindgen_24d52be2d578e3a6
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowProgressState@
+foreign import ccall unsafe "hs_bindgen_d7a642f9cea765c4"
+  hs_bindgen_d7a642f9cea765c4_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Int32
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowProgressState@
+hs_bindgen_d7a642f9cea765c4
+  :: BG.Ptr SDL_Window
+  -> IO SDL_ProgressState
+hs_bindgen_d7a642f9cea765c4 =
+  BG.fromFFIType hs_bindgen_d7a642f9cea765c4_base
+
+-- | Get the state of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: the progress state, or @SDL_PROGRESS_STATE_INVALID@ on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetWindowProgressState@, defined at @SDL3\/SDL_video.h 2968:47@
+sDL_GetWindowProgressState
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current progress state from.
+  -> IO SDL_ProgressState
+sDL_GetWindowProgressState =
+  hs_bindgen_d7a642f9cea765c4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowProgressValue@
+foreign import ccall unsafe "hs_bindgen_0a7984bb3f923d56"
+  hs_bindgen_0a7984bb3f923d56_base
+    :: BG.Ptr BG.Void
+    -> Float
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_SetWindowProgressValue@
+hs_bindgen_0a7984bb3f923d56
+  :: BG.Ptr SDL_Window
+  -> BG.CFloat
+  -> IO BG.CBool
+hs_bindgen_0a7984bb3f923d56 =
+  BG.fromFFIType hs_bindgen_0a7984bb3f923d56_base
+
+-- | Sets the value of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_SetWindowProgressValue@, defined at @SDL3\/SDL_video.h 2983:34@
+sDL_SetWindowProgressValue
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window whose progress value is to be modified.
+  -> BG.CFloat
+  -- ^
+  --
+  --           [@value@]: the progress value in the range of [0.0f - 1.0f]. If the value is outside the valid range, it gets clamped.
+  -> IO BG.CBool
+sDL_SetWindowProgressValue =
+  hs_bindgen_0a7984bb3f923d56
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowProgressValue@
+foreign import ccall unsafe "hs_bindgen_936a487daf968843"
+  hs_bindgen_936a487daf968843_base
+    :: BG.Ptr BG.Void
+    -> IO Float
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GetWindowProgressValue@
+hs_bindgen_936a487daf968843
+  :: BG.Ptr SDL_Window
+  -> IO BG.CFloat
+hs_bindgen_936a487daf968843 =
+  BG.fromFFIType hs_bindgen_936a487daf968843_base
+
+-- | Get the value of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: the progress value in the range of [0.0f - 1.0f], or -1.0f on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [C declaration]: @SDL_GetWindowProgressValue@, defined at @SDL3\/SDL_video.h 2996:35@
+sDL_GetWindowProgressValue
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current progress value from.
+  -> IO BG.CFloat
+sDL_GetWindowProgressValue =
+  hs_bindgen_936a487daf968843
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_DestroyWindow@
+foreign import ccall unsafe "hs_bindgen_c66377fe72053eef"
+  hs_bindgen_c66377fe72053eef_base
+    :: BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_DestroyWindow@
+hs_bindgen_c66377fe72053eef
+  :: BG.Ptr SDL_Window
+  -> IO ()
+hs_bindgen_c66377fe72053eef =
+  BG.fromFFIType hs_bindgen_c66377fe72053eef_base
+
+-- | Destroy a window.
+--
+--     Any child windows owned by the window will be recursively destroyed as well.
+--
+--     Note that on some platforms, the visible window may not actually be removed from the screen until the SDL event loop is pumped again, even though the 'SDL_Window' is no longer valid after this call.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_CreatePopupWindow', 'sDL_CreateWindow', 'sDL_CreateWindowWithProperties'
+--
+--     [C declaration]: @SDL_DestroyWindow@, defined at @SDL3\/SDL_video.h 3018:34@
+sDL_DestroyWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to destroy.
+  -> IO ()
+sDL_DestroyWindow = hs_bindgen_c66377fe72053eef
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_ScreenSaverEnabled@
+foreign import ccall unsafe "hs_bindgen_8d4460920f35fe23"
+  hs_bindgen_8d4460920f35fe23_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_ScreenSaverEnabled@
+hs_bindgen_8d4460920f35fe23 :: IO BG.CBool
+hs_bindgen_8d4460920f35fe23 =
+  BG.fromFFIType hs_bindgen_8d4460920f35fe23_base
+
+-- | Check whether the screensaver is currently enabled.
+--
+--     The screensaver is disabled by default.
+--
+--     The default can also be changed using @SDL_HINT_VIDEO_ALLOW_SCREENSAVER@.
+--
+--     [Returns]: true if the screensaver is enabled, false if it is disabled.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DisableScreenSaver', 'sDL_EnableScreenSaver'
+--
+--     [C declaration]: @SDL_ScreenSaverEnabled@, defined at @SDL3\/SDL_video.h 3037:34@
+sDL_ScreenSaverEnabled :: IO BG.CBool
+sDL_ScreenSaverEnabled = hs_bindgen_8d4460920f35fe23
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EnableScreenSaver@
+foreign import ccall unsafe "hs_bindgen_b0634b88ba5dac7b"
+  hs_bindgen_b0634b88ba5dac7b_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EnableScreenSaver@
+hs_bindgen_b0634b88ba5dac7b :: IO BG.CBool
+hs_bindgen_b0634b88ba5dac7b =
+  BG.fromFFIType hs_bindgen_b0634b88ba5dac7b_base
+
+-- | Allow the screen to be blanked by a screen saver.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_DisableScreenSaver', 'sDL_ScreenSaverEnabled'
+--
+--     [C declaration]: @SDL_EnableScreenSaver@, defined at @SDL3\/SDL_video.h 3052:34@
+sDL_EnableScreenSaver :: IO BG.CBool
+sDL_EnableScreenSaver = hs_bindgen_b0634b88ba5dac7b
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_DisableScreenSaver@
+foreign import ccall unsafe "hs_bindgen_2a05f306113c76cb"
+  hs_bindgen_2a05f306113c76cb_base
+    :: IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_DisableScreenSaver@
+hs_bindgen_2a05f306113c76cb :: IO BG.CBool
+hs_bindgen_2a05f306113c76cb =
+  BG.fromFFIType hs_bindgen_2a05f306113c76cb_base
+
+-- | Prevent the screen from being blanked by a screen saver.
+--
+--     If you disable the screensaver, it is automatically re-enabled when SDL quits.
+--
+--     The screensaver is disabled by default, but this may by changed by SDL_HINT_VIDEO_ALLOW_SCREENSAVER.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EnableScreenSaver', 'sDL_ScreenSaverEnabled'
+--
+--     [C declaration]: @SDL_DisableScreenSaver@, defined at @SDL3\/SDL_video.h 3073:34@
+sDL_DisableScreenSaver :: IO BG.CBool
+sDL_DisableScreenSaver = hs_bindgen_2a05f306113c76cb
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_LoadLibrary@
+foreign import ccall unsafe "hs_bindgen_80ecb7f912f6a101"
+  hs_bindgen_80ecb7f912f6a101_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_LoadLibrary@
+hs_bindgen_80ecb7f912f6a101
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_80ecb7f912f6a101 =
+  BG.fromFFIType hs_bindgen_80ecb7f912f6a101_base
+
+-- | Dynamically load an OpenGL library.
+--
+--     This should be done after initializing the video driver, but before creating any OpenGL windows. If no OpenGL library is loaded, the default library will be loaded upon creation of the first OpenGL window.
+--
+--     If you do this, you need to retrieve all of the GL functions used in your program from the dynamic library using @SDL_GL_GetProcAddress()@.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_GetProcAddress', 'sDL_GL_UnloadLibrary'
+--
+--     [C declaration]: @SDL_GL_LoadLibrary@, defined at @SDL3\/SDL_video.h 3103:34@
+sDL_GL_LoadLibrary
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the platform dependent OpenGL library name, or NULL to open the default OpenGL library.
+  -> IO BG.CBool
+sDL_GL_LoadLibrary = hs_bindgen_80ecb7f912f6a101
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_GetProcAddress@
+foreign import ccall unsafe "hs_bindgen_45ec5c45b7aeecbc"
+  hs_bindgen_45ec5c45b7aeecbc_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_GetProcAddress@
+hs_bindgen_45ec5c45b7aeecbc
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+hs_bindgen_45ec5c45b7aeecbc =
+  BG.fromFFIType hs_bindgen_45ec5c45b7aeecbc_base
+
+-- | Get an OpenGL function by name.
+--
+--     If the GL library is loaded at runtime with @SDL_GL_LoadLibrary()@, then all GL functions must be retrieved this way. Usually this is used to retrieve function pointers to OpenGL extensions.
+--
+--     There are some quirks to looking up OpenGL functions that require some extra care from the application. If you code carefully, you can handle these quirks without any platform-specific code, though:
+--
+--     * On Windows, function pointers are specific to the current GL context; this means you need to have created a GL context and made it current before calling @SDL_GL_GetProcAddress()@. If you recreate your context or create a second context, you should assume that any existing function pointers aren\'t valid to use with it. This is (currently) a Windows-specific limitation, and in practice lots of drivers don\'t suffer this limitation, but it is still the way the wgl API is documented to work and you should expect crashes if you don\'t respect it. Store a copy of the function pointers that comes and goes with context lifespan.
+--
+--     * On X11, function pointers returned by this function are valid for any context, and can even be looked up before a context is created at all. This means that, for at least some common OpenGL implementations, if you look up a function that doesn\'t exist, you\'ll get a non-NULL result that is /NOT/ safe to call. You must always make sure the function is actually available for a given GL context before calling it, by checking for the existence of the appropriate extension with @SDL_GL_ExtensionSupported()@, or verifying that the version of OpenGL you\'re using offers the function as core functionality.
+--
+--     * Some OpenGL drivers, on all platforms, /will/ return NULL if a function isn\'t supported, but you can\'t count on this behavior. Check for extensions you use, and if you get a NULL anyway, act as if that extension wasn\'t available. This is probably a bug in the driver, but you can code defensively for this scenario anyhow.
+--
+--     * Just because you\'re on Linux\/Unix, don\'t assume you\'ll be using X11. Next-gen display servers are waiting to replace it, and may or may not make the same promises about function pointers.
+--
+--     * OpenGL function pointers must be declared @APIENTRY@ as in the example code. This will ensure the proper calling convention is followed on platforms where this matters (Win32) thereby avoiding stack corruption.
+--
+--     [Returns]: a pointer to the named OpenGL function. The returned pointer should be cast to the appropriate function signature.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_ExtensionSupported', 'sDL_GL_LoadLibrary', 'sDL_GL_UnloadLibrary'
+--
+--     [C declaration]: @SDL_GL_GetProcAddress@, defined at @SDL3\/SDL_video.h 3158:49@
+sDL_GL_GetProcAddress
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@proc@]: the name of an OpenGL function.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+sDL_GL_GetProcAddress = hs_bindgen_45ec5c45b7aeecbc
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EGL_GetProcAddress@
+foreign import ccall unsafe "hs_bindgen_fecd43d56eba918e"
+  hs_bindgen_fecd43d56eba918e_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EGL_GetProcAddress@
+hs_bindgen_fecd43d56eba918e
+  :: PtrConst.PtrConst BG.CChar
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+hs_bindgen_fecd43d56eba918e =
+  BG.fromFFIType hs_bindgen_fecd43d56eba918e_base
+
+-- | Get an EGL library function by name.
+--
+--     If an EGL library is loaded, this function allows applications to get entry points for EGL functions. This is useful to provide to an EGL API and extension loader.
+--
+--     [Returns]: a pointer to the named EGL function. The returned pointer should be cast to the appropriate function signature.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_EGL_GetCurrentDisplay'
+--
+--     [C declaration]: @SDL_EGL_GetProcAddress@, defined at @SDL3\/SDL_video.h 3177:49@
+sDL_EGL_GetProcAddress
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@proc@]: the name of an EGL function.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+sDL_EGL_GetProcAddress = hs_bindgen_fecd43d56eba918e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_UnloadLibrary@
+foreign import ccall unsafe "hs_bindgen_86d08bc666c9f566"
+  hs_bindgen_86d08bc666c9f566_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_UnloadLibrary@
+hs_bindgen_86d08bc666c9f566 :: IO ()
+hs_bindgen_86d08bc666c9f566 =
+  BG.fromFFIType hs_bindgen_86d08bc666c9f566_base
+
+-- | Unload the OpenGL library previously loaded by @SDL_GL_LoadLibrary()@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_LoadLibrary'
+--
+--     [C declaration]: @SDL_GL_UnloadLibrary@, defined at @SDL3\/SDL_video.h 3188:34@
+sDL_GL_UnloadLibrary :: IO ()
+sDL_GL_UnloadLibrary = hs_bindgen_86d08bc666c9f566
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_ExtensionSupported@
+foreign import ccall unsafe "hs_bindgen_8c89c426b6cd15de"
+  hs_bindgen_8c89c426b6cd15de_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_ExtensionSupported@
+hs_bindgen_8c89c426b6cd15de
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_8c89c426b6cd15de =
+  BG.fromFFIType hs_bindgen_8c89c426b6cd15de_base
+
+-- | Check if an OpenGL extension is supported for the current context.
+--
+--     This function operates on the current GL context; you must have created a context and it must be current before calling this function. Do not assume that all contexts you create will have the same set of extensions available, or that recreating an existing context will offer the same extensions again.
+--
+--     While it\'s probably not a massive overhead, this function is not an O(1) operation. Check the extensions you care about after creating the GL context and save that information somewhere instead of calling the function every time you need to know.
+--
+--     [Returns]: true if the extension is supported, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GL_ExtensionSupported@, defined at @SDL3\/SDL_video.h 3211:34@
+sDL_GL_ExtensionSupported
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@extension@]: the name of the extension to check.
+  -> IO BG.CBool
+sDL_GL_ExtensionSupported =
+  hs_bindgen_8c89c426b6cd15de
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_ResetAttributes@
+foreign import ccall unsafe "hs_bindgen_c0ef2cbb30166af5"
+  hs_bindgen_c0ef2cbb30166af5_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_ResetAttributes@
+hs_bindgen_c0ef2cbb30166af5 :: IO ()
+hs_bindgen_c0ef2cbb30166af5 =
+  BG.fromFFIType hs_bindgen_c0ef2cbb30166af5_base
+
+-- | Reset all previously set OpenGL context attributes to their default values.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_GetAttribute', 'sDL_GL_SetAttribute'
+--
+--     [C declaration]: @SDL_GL_ResetAttributes@, defined at @SDL3\/SDL_video.h 3223:34@
+sDL_GL_ResetAttributes :: IO ()
+sDL_GL_ResetAttributes = hs_bindgen_c0ef2cbb30166af5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_SetAttribute@
+foreign import ccall unsafe "hs_bindgen_dfea3fa025830d75"
+  hs_bindgen_dfea3fa025830d75_base
+    :: BG.Word32
+    -> BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_SetAttribute@
+hs_bindgen_dfea3fa025830d75
+  :: SDL_GLAttr
+  -> BG.CInt
+  -> IO BG.CBool
+hs_bindgen_dfea3fa025830d75 =
+  BG.fromFFIType hs_bindgen_dfea3fa025830d75_base
+
+-- | Set an OpenGL window attribute before window creation.
+--
+--     This function sets the OpenGL attribute @attr@ to @value@. The requested attributes should be set before creating an OpenGL window. You should use @SDL_GL_GetAttribute()@ to check the values after creating the OpenGL context, since the values obtained can differ from the requested ones.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_CreateContext', 'sDL_GL_GetAttribute', 'sDL_GL_ResetAttributes'
+--
+--     [C declaration]: @SDL_GL_SetAttribute@, defined at @SDL3\/SDL_video.h 3246:34@
+sDL_GL_SetAttribute
+  :: SDL_GLAttr
+  -- ^
+  --
+  --           [@attr@]: an enum value specifying the OpenGL attribute to set.
+  -> BG.CInt
+  -- ^
+  --
+  --           [@value@]: the desired value for the attribute.
+  -> IO BG.CBool
+sDL_GL_SetAttribute = hs_bindgen_dfea3fa025830d75
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_GetAttribute@
+foreign import ccall unsafe "hs_bindgen_b4ec3aa42353470f"
+  hs_bindgen_b4ec3aa42353470f_base
+    :: BG.Word32
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_GetAttribute@
+hs_bindgen_b4ec3aa42353470f
+  :: SDL_GLAttr
+  -> BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_b4ec3aa42353470f =
+  BG.fromFFIType hs_bindgen_b4ec3aa42353470f_base
+
+-- | Get the actual value for an attribute from the current context.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_ResetAttributes', 'sDL_GL_SetAttribute'
+--
+--     [C declaration]: @SDL_GL_GetAttribute@, defined at @SDL3\/SDL_video.h 3264:34@
+sDL_GL_GetAttribute
+  :: SDL_GLAttr
+  -- ^
+  --
+  --           [@attr@]: an 'SDL_GLAttr' enum value specifying the OpenGL attribute to get.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the current value of @attr@.
+  -> IO BG.CBool
+sDL_GL_GetAttribute = hs_bindgen_b4ec3aa42353470f
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_CreateContext@
+foreign import ccall unsafe "hs_bindgen_02589eafe594e5ce"
+  hs_bindgen_02589eafe594e5ce_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_CreateContext@
+hs_bindgen_02589eafe594e5ce
+  :: BG.Ptr SDL_Window
+  -> IO SDL_GLContext
+hs_bindgen_02589eafe594e5ce =
+  BG.fromFFIType hs_bindgen_02589eafe594e5ce_base
+
+-- | Create an OpenGL context for an OpenGL window, and make it current.
+--
+--     The OpenGL context will be created with the current states set through @SDL_GL_SetAttribute()@.
+--
+--     The 'SDL_Window' specified must have been created with the SDL_WINDOW_OPENGL flag, or context creation will fail.
+--
+--     Windows users new to OpenGL should note that, for historical reasons, GL functions added after OpenGL version 1.1 are not available by default. Those functions must be loaded at run-time, either with an OpenGL extension-handling library or with @SDL_GL_GetProcAddress()@ and its related functions.
+--
+--     'SDL_GLContext' is opaque to the application.
+--
+--     [Returns]: the OpenGL context associated with @window@ or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_DestroyContext', 'sDL_GL_MakeCurrent'
+--
+--     [C declaration]: @SDL_GL_CreateContext@, defined at @SDL3\/SDL_video.h 3294:43@
+sDL_GL_CreateContext
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to associate with the context.
+  -> IO SDL_GLContext
+sDL_GL_CreateContext = hs_bindgen_02589eafe594e5ce
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_MakeCurrent@
+foreign import ccall unsafe "hs_bindgen_d986b780d1ccac33"
+  hs_bindgen_d986b780d1ccac33_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_MakeCurrent@
+hs_bindgen_d986b780d1ccac33
+  :: BG.Ptr SDL_Window
+  -> SDL_GLContext
+  -> IO BG.CBool
+hs_bindgen_d986b780d1ccac33 =
+  BG.fromFFIType hs_bindgen_d986b780d1ccac33_base
+
+-- | Set up an OpenGL context for rendering into an OpenGL window.
+--
+--     The context must have been created with a compatible window.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_CreateContext'
+--
+--     [C declaration]: @SDL_GL_MakeCurrent@, defined at @SDL3\/SDL_video.h 3312:34@
+sDL_GL_MakeCurrent
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to associate with the context.
+  -> SDL_GLContext
+  -- ^
+  --
+  --           [@context@]: the OpenGL context to associate with the window.
+  -> IO BG.CBool
+sDL_GL_MakeCurrent = hs_bindgen_d986b780d1ccac33
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_GetCurrentWindow@
+foreign import ccall unsafe "hs_bindgen_24a0284995e8a74e"
+  hs_bindgen_24a0284995e8a74e_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_GetCurrentWindow@
+hs_bindgen_24a0284995e8a74e :: IO (BG.Ptr SDL_Window)
+hs_bindgen_24a0284995e8a74e =
+  BG.fromFFIType hs_bindgen_24a0284995e8a74e_base
+
+-- | Get the currently active OpenGL window.
+--
+--     [Returns]: the currently active OpenGL window on success or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GL_GetCurrentWindow@, defined at @SDL3\/SDL_video.h 3324:42@
+sDL_GL_GetCurrentWindow :: IO (BG.Ptr SDL_Window)
+sDL_GL_GetCurrentWindow = hs_bindgen_24a0284995e8a74e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_GetCurrentContext@
+foreign import ccall unsafe "hs_bindgen_cb9ceaede20b4208"
+  hs_bindgen_cb9ceaede20b4208_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_GetCurrentContext@
+hs_bindgen_cb9ceaede20b4208 :: IO SDL_GLContext
+hs_bindgen_cb9ceaede20b4208 =
+  BG.fromFFIType hs_bindgen_cb9ceaede20b4208_base
+
+-- | Get the currently active OpenGL context.
+--
+--     [Returns]: the currently active OpenGL context or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_MakeCurrent'
+--
+--     [C declaration]: @SDL_GL_GetCurrentContext@, defined at @SDL3\/SDL_video.h 3338:43@
+sDL_GL_GetCurrentContext :: IO SDL_GLContext
+sDL_GL_GetCurrentContext =
+  hs_bindgen_cb9ceaede20b4208
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EGL_GetCurrentDisplay@
+foreign import ccall unsafe "hs_bindgen_709f1c4141e36bd4"
+  hs_bindgen_709f1c4141e36bd4_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EGL_GetCurrentDisplay@
+hs_bindgen_709f1c4141e36bd4 :: IO SDL_EGLDisplay
+hs_bindgen_709f1c4141e36bd4 =
+  BG.fromFFIType hs_bindgen_709f1c4141e36bd4_base
+
+-- | Get the currently active EGL display.
+--
+--     [Returns]: the currently active EGL display or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_GetCurrentDisplay@, defined at @SDL3\/SDL_video.h 3350:44@
+sDL_EGL_GetCurrentDisplay :: IO SDL_EGLDisplay
+sDL_EGL_GetCurrentDisplay =
+  hs_bindgen_709f1c4141e36bd4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EGL_GetCurrentConfig@
+foreign import ccall unsafe "hs_bindgen_1a495e63c24b9e1d"
+  hs_bindgen_1a495e63c24b9e1d_base
+    :: IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EGL_GetCurrentConfig@
+hs_bindgen_1a495e63c24b9e1d :: IO SDL_EGLConfig
+hs_bindgen_1a495e63c24b9e1d =
+  BG.fromFFIType hs_bindgen_1a495e63c24b9e1d_base
+
+-- | Get the currently active EGL config.
+--
+--     [Returns]: the currently active EGL config or NULL on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_GetCurrentConfig@, defined at @SDL3\/SDL_video.h 3362:43@
+sDL_EGL_GetCurrentConfig :: IO SDL_EGLConfig
+sDL_EGL_GetCurrentConfig =
+  hs_bindgen_1a495e63c24b9e1d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EGL_GetWindowSurface@
+foreign import ccall unsafe "hs_bindgen_2dc2976e346931c2"
+  hs_bindgen_2dc2976e346931c2_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EGL_GetWindowSurface@
+hs_bindgen_2dc2976e346931c2
+  :: BG.Ptr SDL_Window
+  -> IO SDL_EGLSurface
+hs_bindgen_2dc2976e346931c2 =
+  BG.fromFFIType hs_bindgen_2dc2976e346931c2_base
+
+-- | Get the EGL surface associated with the window.
+--
+--     [Returns]: the EGLSurface pointer associated with the window, or NULL on failure.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_GetWindowSurface@, defined at @SDL3\/SDL_video.h 3375:44@
+sDL_EGL_GetWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_EGLSurface
+sDL_EGL_GetWindowSurface =
+  hs_bindgen_2dc2976e346931c2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EGL_SetAttributeCallbacks@
+foreign import ccall unsafe "hs_bindgen_6f6c52b23bae7a50"
+  hs_bindgen_6f6c52b23bae7a50_base
+    :: BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.FunPtr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_EGL_SetAttributeCallbacks@
+hs_bindgen_6f6c52b23bae7a50
+  :: SDL_EGLAttribArrayCallback
+  -> SDL_EGLIntArrayCallback
+  -> SDL_EGLIntArrayCallback
+  -> BG.Ptr BG.Void
+  -> IO ()
+hs_bindgen_6f6c52b23bae7a50 =
+  BG.fromFFIType hs_bindgen_6f6c52b23bae7a50_base
+
+-- | Sets the callbacks for defining custom EGLAttrib arrays for EGL initialization.
+--
+--     Callbacks that aren\'t needed can be set to NULL.
+--
+--     NOTE: These callback pointers will be reset after SDL_GL_ResetAttributes.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_EGL_SetAttributeCallbacks@, defined at @SDL3\/SDL_video.h 3397:34@
+sDL_EGL_SetAttributeCallbacks
+  :: SDL_EGLAttribArrayCallback
+  -- ^
+  --
+  --           [@platformAttribCallback@]: callback for attributes to pass to eglGetPlatformDisplay. May be NULL.
+  -> SDL_EGLIntArrayCallback
+  -- ^
+  --
+  --           [@surfaceAttribCallback@]: callback for attributes to pass to eglCreateSurface. May be NULL.
+  -> SDL_EGLIntArrayCallback
+  -- ^
+  --
+  --           [@contextAttribCallback@]: callback for attributes to pass to eglCreateContext. May be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to the callbacks.
+  -> IO ()
+sDL_EGL_SetAttributeCallbacks =
+  hs_bindgen_6f6c52b23bae7a50
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_SetSwapInterval@
+foreign import ccall unsafe "hs_bindgen_9fcc7f15d61d9182"
+  hs_bindgen_9fcc7f15d61d9182_base
+    :: BG.Int32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_SetSwapInterval@
+hs_bindgen_9fcc7f15d61d9182
+  :: BG.CInt
+  -> IO BG.CBool
+hs_bindgen_9fcc7f15d61d9182 =
+  BG.fromFFIType hs_bindgen_9fcc7f15d61d9182_base
+
+-- | Set the swap interval for the current OpenGL context.
+--
+--     Some systems allow specifying -1 for the interval, to enable adaptive vsync. Adaptive vsync works the same as vsync, but if you\'ve already missed the vertical retrace for a given frame, it swaps buffers immediately, which might be less jarring for the user during occasional framerate drops. If an application requests adaptive vsync and the system does not support it, this function will fail and return false. In such a case, you should probably retry the call with 1 for the interval.
+--
+--     Adaptive vsync is implemented for some glX drivers with GLX_EXT_swap_control_tear, and for some Windows drivers with WGL_EXT_swap_control_tear.
+--
+--     Read more on the Khronos wiki: [https:\/\/www.khronos.org\/opengl\/wiki\/Swap_Interval\#Adaptive_Vsync](https://www.khronos.org/opengl/wiki/Swap_Interval#Adaptive_Vsync)
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_GetSwapInterval'
+--
+--     [C declaration]: @SDL_GL_SetSwapInterval@, defined at @SDL3\/SDL_video.h 3430:34@
+sDL_GL_SetSwapInterval
+  :: BG.CInt
+  -- ^
+  --
+  --           [@interval@]: 0 for immediate updates, 1 for updates synchronized with the vertical retrace, -1 for adaptive vsync.
+  -> IO BG.CBool
+sDL_GL_SetSwapInterval = hs_bindgen_9fcc7f15d61d9182
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_GetSwapInterval@
+foreign import ccall unsafe "hs_bindgen_d23bd762103b2805"
+  hs_bindgen_d23bd762103b2805_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_GetSwapInterval@
+hs_bindgen_d23bd762103b2805
+  :: BG.Ptr BG.CInt
+  -> IO BG.CBool
+hs_bindgen_d23bd762103b2805 =
+  BG.fromFFIType hs_bindgen_d23bd762103b2805_base
+
+-- | Get the swap interval for the current OpenGL context.
+--
+--     If the system can\'t determine the swap interval, or there isn\'t a valid current context, this function will set *interval to 0 as a safe default.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_SetSwapInterval'
+--
+--     [C declaration]: @SDL_GL_GetSwapInterval@, defined at @SDL3\/SDL_video.h 3451:34@
+sDL_GL_GetSwapInterval
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@interval@]: output interval value. 0 if there is no vertical retrace synchronization, 1 if the buffer swap is synchronized with the vertical retrace, and -1 if late swaps happen immediately instead of waiting for the next retrace.
+  -> IO BG.CBool
+sDL_GL_GetSwapInterval = hs_bindgen_d23bd762103b2805
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_SwapWindow@
+foreign import ccall unsafe "hs_bindgen_0142b6de91fcc321"
+  hs_bindgen_0142b6de91fcc321_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_SwapWindow@
+hs_bindgen_0142b6de91fcc321
+  :: BG.Ptr SDL_Window
+  -> IO BG.CBool
+hs_bindgen_0142b6de91fcc321 =
+  BG.fromFFIType hs_bindgen_0142b6de91fcc321_base
+
+-- | Update a window with OpenGL rendering.
+--
+--     This is used with double-buffered OpenGL contexts, which are the default.
+--
+--     On macOS, make sure you bind 0 to the draw framebuffer before swapping the window, otherwise nothing will happen. If you aren\'t using glBindFramebuffer(), this is the default and you won\'t have to do anything extra.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_GL_SwapWindow@, defined at @SDL3\/SDL_video.h 3471:34@
+sDL_GL_SwapWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> IO BG.CBool
+sDL_GL_SwapWindow = hs_bindgen_0142b6de91fcc321
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_DestroyContext@
+foreign import ccall unsafe "hs_bindgen_efe95fa2c1c2690c"
+  hs_bindgen_efe95fa2c1c2690c_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Video_Unsafe_SDL_GL_DestroyContext@
+hs_bindgen_efe95fa2c1c2690c
+  :: SDL_GLContext
+  -> IO BG.CBool
+hs_bindgen_efe95fa2c1c2690c =
+  BG.fromFFIType hs_bindgen_efe95fa2c1c2690c_base
+
+-- | Delete an OpenGL context.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_GL_CreateContext'
+--
+--     [C declaration]: @SDL_GL_DestroyContext@, defined at @SDL3\/SDL_video.h 3486:34@
+sDL_GL_DestroyContext
+  :: SDL_GLContext
+  -- ^
+  --
+  --           [@context@]: the OpenGL context to be deleted.
+  -> IO BG.CBool
+sDL_GL_DestroyContext = hs_bindgen_efe95fa2c1c2690c
diff --git a/src/SDL3/Sys/Bindgen/Vulkan.hs b/src/SDL3/Sys/Bindgen/Vulkan.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Vulkan.hs
@@ -0,0 +1,154 @@
+{-# LANGUAGE DataKinds #-}
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DerivingStrategies #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE EmptyDataDecls #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE GeneralizedNewtypeDeriving #-}
+{-# LANGUAGE MagicHash #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeApplications #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE TypeOperators #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE NoFieldSelectors #-}
+
+module SDL3.Sys.Bindgen.Vulkan (
+  SDL3.Sys.Bindgen.Vulkan.VkInstance (..),
+  SDL3.Sys.Bindgen.Vulkan.VkInstance_T,
+  SDL3.Sys.Bindgen.Vulkan.VkPhysicalDevice (..),
+  SDL3.Sys.Bindgen.Vulkan.VkPhysicalDevice_T,
+  SDL3.Sys.Bindgen.Vulkan.VkSurfaceKHR (..),
+  SDL3.Sys.Bindgen.Vulkan.VkSurfaceKHR_T,
+  SDL3.Sys.Bindgen.Vulkan.VkAllocationCallbacks,
+)
+where
+
+import HsBindgen.Runtime.HasCField qualified as HasCField
+import HsBindgen.Runtime.Marshal qualified as Marshal
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CompatHasField qualified as BG.CompatHasField
+
+-- | [C declaration]: @VkInstance@, defined at @SDL3\/SDL_vulkan.h 67:1@
+newtype VkInstance = VkInstance
+  { unwrap :: BG.Ptr VkInstance_T
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.Ptr VkInstance_T)
+  => BG.CompatHasField.HasField "unwrap" VkInstance ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          VkInstance{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.Ptr VkInstance_T)
+  => BG.HasField "unwrap" (BG.Ptr VkInstance) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField VkInstance "unwrap" where
+  type
+    CFieldType VkInstance "unwrap" =
+      BG.Ptr VkInstance_T
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @struct VkInstance_T@, defined at @SDL3\/SDL_vulkan.h 67:1@
+data VkInstance_T
+
+-- | [C declaration]: @VkPhysicalDevice@, defined at @SDL3\/SDL_vulkan.h 68:1@
+newtype VkPhysicalDevice = VkPhysicalDevice
+  { unwrap :: BG.Ptr VkPhysicalDevice_T
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.Ptr VkPhysicalDevice_T)
+  => BG.CompatHasField.HasField "unwrap" VkPhysicalDevice ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          VkPhysicalDevice{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.Ptr VkPhysicalDevice_T)
+  => BG.HasField "unwrap" (BG.Ptr VkPhysicalDevice) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField VkPhysicalDevice "unwrap" where
+  type
+    CFieldType VkPhysicalDevice "unwrap" =
+      BG.Ptr VkPhysicalDevice_T
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @struct VkPhysicalDevice_T@, defined at @SDL3\/SDL_vulkan.h 68:1@
+data VkPhysicalDevice_T
+
+-- | [C declaration]: @VkSurfaceKHR@, defined at @SDL3\/SDL_vulkan.h 69:1@
+newtype VkSurfaceKHR = VkSurfaceKHR
+  { unwrap :: BG.Ptr VkSurfaceKHR_T
+  }
+  deriving stock (BG.Generic, Eq, Ord, Show)
+  deriving newtype
+    ( BG.HasFFIType
+    , BG.Storable
+    , Marshal.ReadRaw
+    , Marshal.StaticSize
+    , Marshal.WriteRaw
+    )
+
+instance
+  (ty ~ BG.Ptr VkSurfaceKHR_T)
+  => BG.CompatHasField.HasField "unwrap" VkSurfaceKHR ty
+  where
+  hasField =
+    \x0 ->
+      ( \y1 ->
+          VkSurfaceKHR{unwrap = y1}
+      , BG.getField @"unwrap" x0
+      )
+
+instance
+  (ty ~ BG.Ptr VkSurfaceKHR_T)
+  => BG.HasField "unwrap" (BG.Ptr VkSurfaceKHR) (BG.Ptr ty)
+  where
+  getField = HasCField.fromPtr (BG.Proxy @"unwrap")
+
+instance HasCField.HasCField VkSurfaceKHR "unwrap" where
+  type
+    CFieldType VkSurfaceKHR "unwrap" =
+      BG.Ptr VkSurfaceKHR_T
+
+  offset# = \_ -> \_ -> 0
+
+-- | [C declaration]: @struct VkSurfaceKHR_T@, defined at @SDL3\/SDL_vulkan.h 69:1@
+data VkSurfaceKHR_T
+
+-- | [C declaration]: @struct VkAllocationCallbacks@, defined at @SDL3\/SDL_vulkan.h 70:8@
+data VkAllocationCallbacks
diff --git a/src/SDL3/Sys/Bindgen/Vulkan/FunPtr.hs b/src/SDL3/Sys/Bindgen/Vulkan/FunPtr.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Vulkan/FunPtr.hs
@@ -0,0 +1,350 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Vulkan.FunPtr (
+  SDL3.Sys.Bindgen.Vulkan.FunPtr.sDL_Vulkan_LoadLibrary,
+  SDL3.Sys.Bindgen.Vulkan.FunPtr.sDL_Vulkan_GetVkGetInstanceProcAddr,
+  SDL3.Sys.Bindgen.Vulkan.FunPtr.sDL_Vulkan_UnloadLibrary,
+  SDL3.Sys.Bindgen.Vulkan.FunPtr.sDL_Vulkan_GetInstanceExtensions,
+  SDL3.Sys.Bindgen.Vulkan.FunPtr.sDL_Vulkan_CreateSurface,
+  SDL3.Sys.Bindgen.Vulkan.FunPtr.sDL_Vulkan_DestroySurface,
+  SDL3.Sys.Bindgen.Vulkan.FunPtr.sDL_Vulkan_GetPresentationSupport,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+import SDL3.Sys.Bindgen.Vulkan
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_vulkan.h>"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_LoadLibrary */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_d0d596710f473c05 (void)) ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_Vulkan_LoadLibrary;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_GetVkGetInstanceProcAddr */"
+         , "__attribute__ ((const))"
+         , "SDL_FunctionPointer (*hs_bindgen_e561af225e7863f2 (void)) (void)"
+         , "{"
+         , "  return &SDL_Vulkan_GetVkGetInstanceProcAddr;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_UnloadLibrary */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_8dbd3b301be26b64 (void)) (void)"
+         , "{"
+         , "  return &SDL_Vulkan_UnloadLibrary;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_GetInstanceExtensions */"
+         , "__attribute__ ((const))"
+         , "char const *const *(*hs_bindgen_86f751b3ecdfa51d (void)) ("
+         , "  Uint32 *arg1"
+         , ")"
+         , "{"
+         , "  return &SDL_Vulkan_GetInstanceExtensions;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_CreateSurface */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_8ae9a4cb1d4352ac (void)) ("
+         , "  SDL_Window *arg1,"
+         , "  VkInstance arg2,"
+         , "  struct VkAllocationCallbacks const *arg3,"
+         , "  VkSurfaceKHR *arg4"
+         , ")"
+         , "{"
+         , "  return &SDL_Vulkan_CreateSurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_DestroySurface */"
+         , "__attribute__ ((const))"
+         , "void (*hs_bindgen_5ea94b407895c233 (void)) ("
+         , "  VkInstance arg1,"
+         , "  VkSurfaceKHR arg2,"
+         , "  struct VkAllocationCallbacks const *arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_Vulkan_DestroySurface;"
+         , "}"
+         , "/* sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_GetPresentationSupport */"
+         , "__attribute__ ((const))"
+         , "_Bool (*hs_bindgen_e61814e6ac761e26 (void)) ("
+         , "  VkInstance arg1,"
+         , "  VkPhysicalDevice arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return &SDL_Vulkan_GetPresentationSupport;"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_LoadLibrary@
+foreign import ccall unsafe "hs_bindgen_d0d596710f473c05"
+  hs_bindgen_d0d596710f473c05_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_LoadLibrary@
+hs_bindgen_d0d596710f473c05 :: IO (BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool))
+hs_bindgen_d0d596710f473c05 =
+  BG.fromFFIType hs_bindgen_d0d596710f473c05_base
+
+{-# NOINLINE sDL_Vulkan_LoadLibrary #-}
+
+-- | Dynamically load the Vulkan loader library.
+--
+--     This should be called after initializing the video driver, but before creating any Vulkan windows. If no Vulkan loader library is loaded, the default library will be loaded upon creation of the first Vulkan window.
+--
+--     SDL keeps a counter of how many times this function has been successfully called, so it is safe to call this function multiple times, so long as it is eventually paired with an equivalent number of calls to SDL_Vulkan_UnloadLibrary. The @path@ argument is ignored unless there is no library currently loaded, and and the library isn\'t actually unloaded until there have been an equivalent number of calls to SDL_Vulkan_UnloadLibrary.
+--
+--     It is fairly common for Vulkan applications to link with libvulkan instead of explicitly loading it at run time. This will work with SDL provided the application links to a dynamic library and both it and SDL use the same search path.
+--
+--     If you specify a non-NULL @path@, an application should retrieve all of the Vulkan functions it uses from the dynamic library using SDL_Vulkan_GetVkGetInstanceProcAddr unless you can guarantee @path@ points to the same vulkan loader library the application linked to.
+--
+--     On Apple devices, if @path@ is NULL, SDL will attempt to find the @vkGetInstanceProcAddr@ address within all the Mach-O images of the current process. This is because it is fairly common for Vulkan applications to link with libvulkan (and historically MoltenVK was provided as a static library). If it is not found, on macOS, SDL will attempt to load @vulkan.framework\/vulkan@, @libvulkan.1.dylib@, @MoltenVK.framework\/MoltenVK@, and @libMoltenVK.dylib@, in that order. On iOS, SDL will attempt to load @libMoltenVK.dylib@. Applications using a dynamic framework or .dylib must ensure it is included in its application bundle.
+--
+--     On non-Apple devices, application linking with a static libvulkan is not supported. Either do not link to the Vulkan loader or link to a dynamic library version.
+--
+--     [@path@]: the platform dependent Vulkan loader library name or NULL.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetVkGetInstanceProcAddr', 'sDL_Vulkan_UnloadLibrary'
+--
+--     [C declaration]: @SDL_Vulkan_LoadLibrary@, defined at @SDL3\/SDL_vulkan.h 133:34@
+sDL_Vulkan_LoadLibrary :: BG.FunPtr (PtrConst.PtrConst BG.CChar -> IO BG.CBool)
+sDL_Vulkan_LoadLibrary =
+  BG.unsafePerformIO hs_bindgen_d0d596710f473c05
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_GetVkGetInstanceProcAddr@
+foreign import ccall unsafe "hs_bindgen_e561af225e7863f2"
+  hs_bindgen_e561af225e7863f2_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_GetVkGetInstanceProcAddr@
+hs_bindgen_e561af225e7863f2 :: IO (BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer))
+hs_bindgen_e561af225e7863f2 =
+  BG.fromFFIType hs_bindgen_e561af225e7863f2_base
+
+{-# NOINLINE sDL_Vulkan_GetVkGetInstanceProcAddr #-}
+
+-- | Get the address of the @vkGetInstanceProcAddr@ function.
+--
+--     This should be called after either calling @SDL_Vulkan_LoadLibrary()@ or creating an SDL_Window with the @SDL_WINDOW_VULKAN@ flag.
+--
+--     The actual type of the returned function pointer is PFN_vkGetInstanceProcAddr, but that isn\'t available because the Vulkan headers are not included here. You should cast the return value of this function to that type, e.g.
+--
+--     @vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) SDL_Vulkan_GetVkGetInstanceProcAddr();@
+--
+--     [Returns]: the function pointer for @vkGetInstanceProcAddr@ or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_Vulkan_GetVkGetInstanceProcAddr@, defined at @SDL3\/SDL_vulkan.h 154:49@
+sDL_Vulkan_GetVkGetInstanceProcAddr :: BG.FunPtr (IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer)
+sDL_Vulkan_GetVkGetInstanceProcAddr =
+  BG.unsafePerformIO hs_bindgen_e561af225e7863f2
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_UnloadLibrary@
+foreign import ccall unsafe "hs_bindgen_8dbd3b301be26b64"
+  hs_bindgen_8dbd3b301be26b64_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_UnloadLibrary@
+hs_bindgen_8dbd3b301be26b64 :: IO (BG.FunPtr (IO ()))
+hs_bindgen_8dbd3b301be26b64 =
+  BG.fromFFIType hs_bindgen_8dbd3b301be26b64_base
+
+{-# NOINLINE sDL_Vulkan_UnloadLibrary #-}
+
+-- | Unload the Vulkan library previously loaded by @SDL_Vulkan_LoadLibrary()@.
+--
+--     SDL keeps a counter of how many times this function has been called, so it is safe to call this function multiple times, so long as it is paired with an equivalent number of calls to SDL_Vulkan_LoadLibrary. The library isn\'t actually unloaded until there have been an equivalent number of calls to SDL_Vulkan_UnloadLibrary.
+--
+--     Once the library has actually been unloaded, if any Vulkan instances remain, they will likely crash the program. Clean up any existing Vulkan resources, and destroy appropriate windows, renderers and GPU devices before calling this function.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_LoadLibrary'
+--
+--     [C declaration]: @SDL_Vulkan_UnloadLibrary@, defined at @SDL3\/SDL_vulkan.h 176:34@
+sDL_Vulkan_UnloadLibrary :: BG.FunPtr (IO ())
+sDL_Vulkan_UnloadLibrary =
+  BG.unsafePerformIO hs_bindgen_8dbd3b301be26b64
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_GetInstanceExtensions@
+foreign import ccall unsafe "hs_bindgen_86f751b3ecdfa51d"
+  hs_bindgen_86f751b3ecdfa51d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_GetInstanceExtensions@
+hs_bindgen_86f751b3ecdfa51d
+  :: IO
+       ( BG.FunPtr
+           (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO (PtrConst.PtrConst (PtrConst.PtrConst BG.CChar)))
+       )
+hs_bindgen_86f751b3ecdfa51d =
+  BG.fromFFIType hs_bindgen_86f751b3ecdfa51d_base
+
+{-# NOINLINE sDL_Vulkan_GetInstanceExtensions #-}
+
+-- | Get the Vulkan instance extensions needed for vkCreateInstance.
+--
+--     This should be called after either calling @SDL_Vulkan_LoadLibrary()@ or creating an SDL_Window with the @SDL_WINDOW_VULKAN@ flag.
+--
+--     On return, the variable pointed to by @count@ will be set to the number of elements returned, suitable for using with VkInstanceCreateInfo::enabledExtensionCount, and the returned array can be used with VkInstanceCreateInfo::ppEnabledExtensionNames, for calling Vulkan\'s vkCreateInstance API.
+--
+--     You should not free the returned array; it is owned by SDL.
+--
+--     [@count@]: a pointer filled in with the number of extensions returned.
+--
+--     [Returns]: an array of extension name strings on success, NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_CreateSurface'
+--
+--     [C declaration]: @SDL_Vulkan_GetInstanceExtensions@, defined at @SDL3\/SDL_vulkan.h 200:50@
+sDL_Vulkan_GetInstanceExtensions
+  :: BG.FunPtr
+       (BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO (PtrConst.PtrConst (PtrConst.PtrConst BG.CChar)))
+sDL_Vulkan_GetInstanceExtensions =
+  BG.unsafePerformIO hs_bindgen_86f751b3ecdfa51d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_CreateSurface@
+foreign import ccall unsafe "hs_bindgen_8ae9a4cb1d4352ac"
+  hs_bindgen_8ae9a4cb1d4352ac_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_CreateSurface@
+hs_bindgen_8ae9a4cb1d4352ac
+  :: IO
+       ( BG.FunPtr
+           ( BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+             -> VkInstance
+             -> PtrConst.PtrConst VkAllocationCallbacks
+             -> BG.Ptr VkSurfaceKHR
+             -> IO BG.CBool
+           )
+       )
+hs_bindgen_8ae9a4cb1d4352ac =
+  BG.fromFFIType hs_bindgen_8ae9a4cb1d4352ac_base
+
+{-# NOINLINE sDL_Vulkan_CreateSurface #-}
+
+-- | Create a Vulkan rendering surface for a window.
+--
+--     The @window@ must have been created with the @SDL_WINDOW_VULKAN@ flag and @instance@ must have been created with extensions returned by @SDL_Vulkan_GetInstanceExtensions()@ enabled.
+--
+--     If @allocator@ is NULL, Vulkan will use the system default allocator. This argument is passed directly to Vulkan and isn\'t used by SDL itself.
+--
+--     [@window@]: the window to which to attach the Vulkan surface.
+--
+--     [@instance@]: the Vulkan instance handle.
+--
+--     [@allocator@]: a VkAllocationCallbacks struct, which lets the app set the allocator that creates the surface. Can be NULL.
+--
+--     [@surface@]: a pointer to a VkSurfaceKHR handle to output the newly created surface.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetInstanceExtensions', 'sDL_Vulkan_DestroySurface'
+--
+--     [C declaration]: @SDL_Vulkan_CreateSurface@, defined at @SDL3\/SDL_vulkan.h 226:34@
+sDL_Vulkan_CreateSurface
+  :: BG.FunPtr
+       ( BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+         -> VkInstance
+         -> PtrConst.PtrConst VkAllocationCallbacks
+         -> BG.Ptr VkSurfaceKHR
+         -> IO BG.CBool
+       )
+sDL_Vulkan_CreateSurface =
+  BG.unsafePerformIO hs_bindgen_8ae9a4cb1d4352ac
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_DestroySurface@
+foreign import ccall unsafe "hs_bindgen_5ea94b407895c233"
+  hs_bindgen_5ea94b407895c233_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_DestroySurface@
+hs_bindgen_5ea94b407895c233
+  :: IO (BG.FunPtr (VkInstance -> VkSurfaceKHR -> PtrConst.PtrConst VkAllocationCallbacks -> IO ()))
+hs_bindgen_5ea94b407895c233 =
+  BG.fromFFIType hs_bindgen_5ea94b407895c233_base
+
+{-# NOINLINE sDL_Vulkan_DestroySurface #-}
+
+-- | Destroy the Vulkan rendering surface of a window.
+--
+--     This should be called before SDL_DestroyWindow, if SDL_Vulkan_CreateSurface was called after SDL_CreateWindow.
+--
+--     The @instance@ must have been created with extensions returned by @SDL_Vulkan_GetInstanceExtensions()@ enabled and @surface@ must have been created successfully by an @SDL_Vulkan_CreateSurface()@ call.
+--
+--     If @allocator@ is NULL, Vulkan will use the system default allocator. This argument is passed directly to Vulkan and isn\'t used by SDL itself.
+--
+--     [@instance@]: the Vulkan instance handle.
+--
+--     [@surface@]: vkSurfaceKHR handle to destroy.
+--
+--     [@allocator@]: a VkAllocationCallbacks struct, which lets the app set the allocator that destroys the surface. Can be NULL.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetInstanceExtensions', 'sDL_Vulkan_CreateSurface'
+--
+--     [C declaration]: @SDL_Vulkan_DestroySurface@, defined at @SDL3\/SDL_vulkan.h 254:34@
+sDL_Vulkan_DestroySurface
+  :: BG.FunPtr (VkInstance -> VkSurfaceKHR -> PtrConst.PtrConst VkAllocationCallbacks -> IO ())
+sDL_Vulkan_DestroySurface =
+  BG.unsafePerformIO hs_bindgen_5ea94b407895c233
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_GetPresentationSupport@
+foreign import ccall unsafe "hs_bindgen_e61814e6ac761e26"
+  hs_bindgen_e61814e6ac761e26_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_get_SDL_Vulkan_GetPresentationSupport@
+hs_bindgen_e61814e6ac761e26
+  :: IO (BG.FunPtr (VkInstance -> VkPhysicalDevice -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool))
+hs_bindgen_e61814e6ac761e26 =
+  BG.fromFFIType hs_bindgen_e61814e6ac761e26_base
+
+{-# NOINLINE sDL_Vulkan_GetPresentationSupport #-}
+
+-- | Query support for presentation via a given physical device and queue family.
+--
+--     The @instance@ must have been created with extensions returned by @SDL_Vulkan_GetInstanceExtensions()@ enabled.
+--
+--     [@instance@]: the Vulkan instance handle.
+--
+--     [@physicalDevice@]: a valid Vulkan physical device handle.
+--
+--     [@queueFamilyIndex@]: a valid queue family index for the given physical device.
+--
+--     [Returns]: true if supported, false if unsupported or an error occurred.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetInstanceExtensions'
+--
+--     [C declaration]: @SDL_Vulkan_GetPresentationSupport@, defined at @SDL3\/SDL_vulkan.h 275:34@
+sDL_Vulkan_GetPresentationSupport
+  :: BG.FunPtr (VkInstance -> VkPhysicalDevice -> SDL3.Sys.Bindgen.Stdinc.Uint32 -> IO BG.CBool)
+sDL_Vulkan_GetPresentationSupport =
+  BG.unsafePerformIO hs_bindgen_e61814e6ac761e26
diff --git a/src/SDL3/Sys/Bindgen/Vulkan/Safe.hs b/src/SDL3/Sys/Bindgen/Vulkan/Safe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Vulkan/Safe.hs
@@ -0,0 +1,353 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Vulkan.Safe (
+  SDL3.Sys.Bindgen.Vulkan.Safe.sDL_Vulkan_LoadLibrary,
+  SDL3.Sys.Bindgen.Vulkan.Safe.sDL_Vulkan_GetVkGetInstanceProcAddr,
+  SDL3.Sys.Bindgen.Vulkan.Safe.sDL_Vulkan_UnloadLibrary,
+  SDL3.Sys.Bindgen.Vulkan.Safe.sDL_Vulkan_GetInstanceExtensions,
+  SDL3.Sys.Bindgen.Vulkan.Safe.sDL_Vulkan_CreateSurface,
+  SDL3.Sys.Bindgen.Vulkan.Safe.sDL_Vulkan_DestroySurface,
+  SDL3.Sys.Bindgen.Vulkan.Safe.sDL_Vulkan_GetPresentationSupport,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+import SDL3.Sys.Bindgen.Vulkan
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_vulkan.h>"
+         , "_Bool hs_bindgen_ef9e83627c649a75 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_Vulkan_LoadLibrary)(arg1);"
+         , "}"
+         , "SDL_FunctionPointer hs_bindgen_eda99f289265681d (void)"
+         , "{"
+         , "  return (SDL_Vulkan_GetVkGetInstanceProcAddr)();"
+         , "}"
+         , "void hs_bindgen_ba0b6a1db50d1914 (void)"
+         , "{"
+         , "  (SDL_Vulkan_UnloadLibrary)();"
+         , "}"
+         , "char const *const *hs_bindgen_282c9f5ce4ea1600 ("
+         , "  Uint32 *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_Vulkan_GetInstanceExtensions)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_6e90d5d762dab7a4 ("
+         , "  SDL_Window *arg1,"
+         , "  VkInstance arg2,"
+         , "  struct VkAllocationCallbacks const *arg3,"
+         , "  VkSurfaceKHR *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_Vulkan_CreateSurface)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_584b3250cc77055d ("
+         , "  VkInstance arg1,"
+         , "  VkSurfaceKHR arg2,"
+         , "  struct VkAllocationCallbacks const *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_Vulkan_DestroySurface)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_861d49977f9c657e ("
+         , "  VkInstance arg1,"
+         , "  VkPhysicalDevice arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_Vulkan_GetPresentationSupport)(arg1, arg2, arg3);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_LoadLibrary@
+foreign import ccall safe "hs_bindgen_ef9e83627c649a75"
+  hs_bindgen_ef9e83627c649a75_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_LoadLibrary@
+hs_bindgen_ef9e83627c649a75
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_ef9e83627c649a75 =
+  BG.fromFFIType hs_bindgen_ef9e83627c649a75_base
+
+-- | Dynamically load the Vulkan loader library.
+--
+--     This should be called after initializing the video driver, but before creating any Vulkan windows. If no Vulkan loader library is loaded, the default library will be loaded upon creation of the first Vulkan window.
+--
+--     SDL keeps a counter of how many times this function has been successfully called, so it is safe to call this function multiple times, so long as it is eventually paired with an equivalent number of calls to SDL_Vulkan_UnloadLibrary. The @path@ argument is ignored unless there is no library currently loaded, and and the library isn\'t actually unloaded until there have been an equivalent number of calls to SDL_Vulkan_UnloadLibrary.
+--
+--     It is fairly common for Vulkan applications to link with libvulkan instead of explicitly loading it at run time. This will work with SDL provided the application links to a dynamic library and both it and SDL use the same search path.
+--
+--     If you specify a non-NULL @path@, an application should retrieve all of the Vulkan functions it uses from the dynamic library using SDL_Vulkan_GetVkGetInstanceProcAddr unless you can guarantee @path@ points to the same vulkan loader library the application linked to.
+--
+--     On Apple devices, if @path@ is NULL, SDL will attempt to find the @vkGetInstanceProcAddr@ address within all the Mach-O images of the current process. This is because it is fairly common for Vulkan applications to link with libvulkan (and historically MoltenVK was provided as a static library). If it is not found, on macOS, SDL will attempt to load @vulkan.framework\/vulkan@, @libvulkan.1.dylib@, @MoltenVK.framework\/MoltenVK@, and @libMoltenVK.dylib@, in that order. On iOS, SDL will attempt to load @libMoltenVK.dylib@. Applications using a dynamic framework or .dylib must ensure it is included in its application bundle.
+--
+--     On non-Apple devices, application linking with a static libvulkan is not supported. Either do not link to the Vulkan loader or link to a dynamic library version.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetVkGetInstanceProcAddr', 'sDL_Vulkan_UnloadLibrary'
+--
+--     [C declaration]: @SDL_Vulkan_LoadLibrary@, defined at @SDL3\/SDL_vulkan.h 133:34@
+sDL_Vulkan_LoadLibrary
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the platform dependent Vulkan loader library name or NULL.
+  -> IO BG.CBool
+sDL_Vulkan_LoadLibrary = hs_bindgen_ef9e83627c649a75
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_GetVkGetInstanceProcAddr@
+foreign import ccall safe "hs_bindgen_eda99f289265681d"
+  hs_bindgen_eda99f289265681d_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_GetVkGetInstanceProcAddr@
+hs_bindgen_eda99f289265681d :: IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+hs_bindgen_eda99f289265681d =
+  BG.fromFFIType hs_bindgen_eda99f289265681d_base
+
+-- | Get the address of the @vkGetInstanceProcAddr@ function.
+--
+--     This should be called after either calling @SDL_Vulkan_LoadLibrary()@ or creating an SDL_Window with the @SDL_WINDOW_VULKAN@ flag.
+--
+--     The actual type of the returned function pointer is PFN_vkGetInstanceProcAddr, but that isn\'t available because the Vulkan headers are not included here. You should cast the return value of this function to that type, e.g.
+--
+--     @vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) SDL_Vulkan_GetVkGetInstanceProcAddr();@
+--
+--     [Returns]: the function pointer for @vkGetInstanceProcAddr@ or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_Vulkan_GetVkGetInstanceProcAddr@, defined at @SDL3\/SDL_vulkan.h 154:49@
+sDL_Vulkan_GetVkGetInstanceProcAddr :: IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+sDL_Vulkan_GetVkGetInstanceProcAddr =
+  hs_bindgen_eda99f289265681d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_UnloadLibrary@
+foreign import ccall safe "hs_bindgen_ba0b6a1db50d1914"
+  hs_bindgen_ba0b6a1db50d1914_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_UnloadLibrary@
+hs_bindgen_ba0b6a1db50d1914 :: IO ()
+hs_bindgen_ba0b6a1db50d1914 =
+  BG.fromFFIType hs_bindgen_ba0b6a1db50d1914_base
+
+-- | Unload the Vulkan library previously loaded by @SDL_Vulkan_LoadLibrary()@.
+--
+--     SDL keeps a counter of how many times this function has been called, so it is safe to call this function multiple times, so long as it is paired with an equivalent number of calls to SDL_Vulkan_LoadLibrary. The library isn\'t actually unloaded until there have been an equivalent number of calls to SDL_Vulkan_UnloadLibrary.
+--
+--     Once the library has actually been unloaded, if any Vulkan instances remain, they will likely crash the program. Clean up any existing Vulkan resources, and destroy appropriate windows, renderers and GPU devices before calling this function.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_LoadLibrary'
+--
+--     [C declaration]: @SDL_Vulkan_UnloadLibrary@, defined at @SDL3\/SDL_vulkan.h 176:34@
+sDL_Vulkan_UnloadLibrary :: IO ()
+sDL_Vulkan_UnloadLibrary =
+  hs_bindgen_ba0b6a1db50d1914
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_GetInstanceExtensions@
+foreign import ccall safe "hs_bindgen_282c9f5ce4ea1600"
+  hs_bindgen_282c9f5ce4ea1600_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_GetInstanceExtensions@
+hs_bindgen_282c9f5ce4ea1600
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO (PtrConst.PtrConst (PtrConst.PtrConst BG.CChar))
+hs_bindgen_282c9f5ce4ea1600 =
+  BG.fromFFIType hs_bindgen_282c9f5ce4ea1600_base
+
+-- | Get the Vulkan instance extensions needed for vkCreateInstance.
+--
+--     This should be called after either calling @SDL_Vulkan_LoadLibrary()@ or creating an SDL_Window with the @SDL_WINDOW_VULKAN@ flag.
+--
+--     On return, the variable pointed to by @count@ will be set to the number of elements returned, suitable for using with VkInstanceCreateInfo::enabledExtensionCount, and the returned array can be used with VkInstanceCreateInfo::ppEnabledExtensionNames, for calling Vulkan\'s vkCreateInstance API.
+--
+--     You should not free the returned array; it is owned by SDL.
+--
+--     [Returns]: an array of extension name strings on success, NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_CreateSurface'
+--
+--     [C declaration]: @SDL_Vulkan_GetInstanceExtensions@, defined at @SDL3\/SDL_vulkan.h 200:50@
+sDL_Vulkan_GetInstanceExtensions
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of extensions returned.
+  -> IO (PtrConst.PtrConst (PtrConst.PtrConst BG.CChar))
+sDL_Vulkan_GetInstanceExtensions =
+  hs_bindgen_282c9f5ce4ea1600
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_CreateSurface@
+foreign import ccall safe "hs_bindgen_6e90d5d762dab7a4"
+  hs_bindgen_6e90d5d762dab7a4_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_CreateSurface@
+hs_bindgen_6e90d5d762dab7a4
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> VkInstance
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -> BG.Ptr VkSurfaceKHR
+  -> IO BG.CBool
+hs_bindgen_6e90d5d762dab7a4 =
+  BG.fromFFIType hs_bindgen_6e90d5d762dab7a4_base
+
+-- | Create a Vulkan rendering surface for a window.
+--
+--     The @window@ must have been created with the @SDL_WINDOW_VULKAN@ flag and @instance@ must have been created with extensions returned by @SDL_Vulkan_GetInstanceExtensions()@ enabled.
+--
+--     If @allocator@ is NULL, Vulkan will use the system default allocator. This argument is passed directly to Vulkan and isn\'t used by SDL itself.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetInstanceExtensions', 'sDL_Vulkan_DestroySurface'
+--
+--     [C declaration]: @SDL_Vulkan_CreateSurface@, defined at @SDL3\/SDL_vulkan.h 226:34@
+sDL_Vulkan_CreateSurface
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to which to attach the Vulkan surface.
+  -> VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -- ^
+  --
+  --           [@allocator@]: a VkAllocationCallbacks struct, which lets the app set the allocator that creates the surface. Can be NULL.
+  -> BG.Ptr VkSurfaceKHR
+  -- ^
+  --
+  --           [@surface@]: a pointer to a VkSurfaceKHR handle to output the newly created surface.
+  -> IO BG.CBool
+sDL_Vulkan_CreateSurface =
+  hs_bindgen_6e90d5d762dab7a4
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_DestroySurface@
+foreign import ccall safe "hs_bindgen_584b3250cc77055d"
+  hs_bindgen_584b3250cc77055d_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_DestroySurface@
+hs_bindgen_584b3250cc77055d
+  :: VkInstance
+  -> VkSurfaceKHR
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -> IO ()
+hs_bindgen_584b3250cc77055d =
+  BG.fromFFIType hs_bindgen_584b3250cc77055d_base
+
+-- | Destroy the Vulkan rendering surface of a window.
+--
+--     This should be called before SDL_DestroyWindow, if SDL_Vulkan_CreateSurface was called after SDL_CreateWindow.
+--
+--     The @instance@ must have been created with extensions returned by @SDL_Vulkan_GetInstanceExtensions()@ enabled and @surface@ must have been created successfully by an @SDL_Vulkan_CreateSurface()@ call.
+--
+--     If @allocator@ is NULL, Vulkan will use the system default allocator. This argument is passed directly to Vulkan and isn\'t used by SDL itself.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetInstanceExtensions', 'sDL_Vulkan_CreateSurface'
+--
+--     [C declaration]: @SDL_Vulkan_DestroySurface@, defined at @SDL3\/SDL_vulkan.h 254:34@
+sDL_Vulkan_DestroySurface
+  :: VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> VkSurfaceKHR
+  -- ^
+  --
+  --           [@surface@]: vkSurfaceKHR handle to destroy.
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -- ^
+  --
+  --           [@allocator@]: a VkAllocationCallbacks struct, which lets the app set the allocator that destroys the surface. Can be NULL.
+  -> IO ()
+sDL_Vulkan_DestroySurface =
+  hs_bindgen_584b3250cc77055d
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_GetPresentationSupport@
+foreign import ccall safe "hs_bindgen_861d49977f9c657e"
+  hs_bindgen_861d49977f9c657e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Safe_SDL_Vulkan_GetPresentationSupport@
+hs_bindgen_861d49977f9c657e
+  :: VkInstance
+  -> VkPhysicalDevice
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_861d49977f9c657e =
+  BG.fromFFIType hs_bindgen_861d49977f9c657e_base
+
+-- | Query support for presentation via a given physical device and queue family.
+--
+--     The @instance@ must have been created with extensions returned by @SDL_Vulkan_GetInstanceExtensions()@ enabled.
+--
+--     [Returns]: true if supported, false if unsupported or an error occurred.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetInstanceExtensions'
+--
+--     [C declaration]: @SDL_Vulkan_GetPresentationSupport@, defined at @SDL3\/SDL_vulkan.h 275:34@
+sDL_Vulkan_GetPresentationSupport
+  :: VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> VkPhysicalDevice
+  -- ^
+  --
+  --           [@physicalDevice@]: a valid Vulkan physical device handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@queueFamilyIndex@]: a valid queue family index for the given physical device.
+  -> IO BG.CBool
+sDL_Vulkan_GetPresentationSupport =
+  hs_bindgen_861d49977f9c657e
diff --git a/src/SDL3/Sys/Bindgen/Vulkan/Unsafe.hs b/src/SDL3/Sys/Bindgen/Vulkan/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bindgen/Vulkan/Unsafe.hs
@@ -0,0 +1,353 @@
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE NoFieldSelectors #-}
+{-# OPTIONS_HADDOCK prune #-}
+
+module SDL3.Sys.Bindgen.Vulkan.Unsafe (
+  SDL3.Sys.Bindgen.Vulkan.Unsafe.sDL_Vulkan_LoadLibrary,
+  SDL3.Sys.Bindgen.Vulkan.Unsafe.sDL_Vulkan_GetVkGetInstanceProcAddr,
+  SDL3.Sys.Bindgen.Vulkan.Unsafe.sDL_Vulkan_UnloadLibrary,
+  SDL3.Sys.Bindgen.Vulkan.Unsafe.sDL_Vulkan_GetInstanceExtensions,
+  SDL3.Sys.Bindgen.Vulkan.Unsafe.sDL_Vulkan_CreateSurface,
+  SDL3.Sys.Bindgen.Vulkan.Unsafe.sDL_Vulkan_DestroySurface,
+  SDL3.Sys.Bindgen.Vulkan.Unsafe.sDL_Vulkan_GetPresentationSupport,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import HsBindgen.Runtime.Support.CAPI qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+import SDL3.Sys.Bindgen.Vulkan
+
+$( HsBindgen.Runtime.Support.CAPI.addCSource
+     ( HsBindgen.Runtime.Support.CAPI.unlines
+         [ "#include <SDL3/SDL_vulkan.h>"
+         , "_Bool hs_bindgen_a109086f43a5b6e5 ("
+         , "  char const *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_Vulkan_LoadLibrary)(arg1);"
+         , "}"
+         , "SDL_FunctionPointer hs_bindgen_4a040ba0b3ef299e (void)"
+         , "{"
+         , "  return (SDL_Vulkan_GetVkGetInstanceProcAddr)();"
+         , "}"
+         , "void hs_bindgen_37af72574ddcbb1a (void)"
+         , "{"
+         , "  (SDL_Vulkan_UnloadLibrary)();"
+         , "}"
+         , "char const *const *hs_bindgen_2aad81b39a87b1fa ("
+         , "  Uint32 *arg1"
+         , ")"
+         , "{"
+         , "  return (SDL_Vulkan_GetInstanceExtensions)(arg1);"
+         , "}"
+         , "_Bool hs_bindgen_32bf040c7a36881e ("
+         , "  SDL_Window *arg1,"
+         , "  VkInstance arg2,"
+         , "  struct VkAllocationCallbacks const *arg3,"
+         , "  VkSurfaceKHR *arg4"
+         , ")"
+         , "{"
+         , "  return (SDL_Vulkan_CreateSurface)(arg1, arg2, arg3, arg4);"
+         , "}"
+         , "void hs_bindgen_c7debc5633e16c49 ("
+         , "  VkInstance arg1,"
+         , "  VkSurfaceKHR arg2,"
+         , "  struct VkAllocationCallbacks const *arg3"
+         , ")"
+         , "{"
+         , "  (SDL_Vulkan_DestroySurface)(arg1, arg2, arg3);"
+         , "}"
+         , "_Bool hs_bindgen_dfcebfd398bdf0a8 ("
+         , "  VkInstance arg1,"
+         , "  VkPhysicalDevice arg2,"
+         , "  Uint32 arg3"
+         , ")"
+         , "{"
+         , "  return (SDL_Vulkan_GetPresentationSupport)(arg1, arg2, arg3);"
+         , "}"
+         ]
+     )
+ )
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_LoadLibrary@
+foreign import ccall unsafe "hs_bindgen_a109086f43a5b6e5"
+  hs_bindgen_a109086f43a5b6e5_base
+    :: BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_LoadLibrary@
+hs_bindgen_a109086f43a5b6e5
+  :: PtrConst.PtrConst BG.CChar
+  -> IO BG.CBool
+hs_bindgen_a109086f43a5b6e5 =
+  BG.fromFFIType hs_bindgen_a109086f43a5b6e5_base
+
+-- | Dynamically load the Vulkan loader library.
+--
+--     This should be called after initializing the video driver, but before creating any Vulkan windows. If no Vulkan loader library is loaded, the default library will be loaded upon creation of the first Vulkan window.
+--
+--     SDL keeps a counter of how many times this function has been successfully called, so it is safe to call this function multiple times, so long as it is eventually paired with an equivalent number of calls to SDL_Vulkan_UnloadLibrary. The @path@ argument is ignored unless there is no library currently loaded, and and the library isn\'t actually unloaded until there have been an equivalent number of calls to SDL_Vulkan_UnloadLibrary.
+--
+--     It is fairly common for Vulkan applications to link with libvulkan instead of explicitly loading it at run time. This will work with SDL provided the application links to a dynamic library and both it and SDL use the same search path.
+--
+--     If you specify a non-NULL @path@, an application should retrieve all of the Vulkan functions it uses from the dynamic library using SDL_Vulkan_GetVkGetInstanceProcAddr unless you can guarantee @path@ points to the same vulkan loader library the application linked to.
+--
+--     On Apple devices, if @path@ is NULL, SDL will attempt to find the @vkGetInstanceProcAddr@ address within all the Mach-O images of the current process. This is because it is fairly common for Vulkan applications to link with libvulkan (and historically MoltenVK was provided as a static library). If it is not found, on macOS, SDL will attempt to load @vulkan.framework\/vulkan@, @libvulkan.1.dylib@, @MoltenVK.framework\/MoltenVK@, and @libMoltenVK.dylib@, in that order. On iOS, SDL will attempt to load @libMoltenVK.dylib@. Applications using a dynamic framework or .dylib must ensure it is included in its application bundle.
+--
+--     On non-Apple devices, application linking with a static libvulkan is not supported. Either do not link to the Vulkan loader or link to a dynamic library version.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetVkGetInstanceProcAddr', 'sDL_Vulkan_UnloadLibrary'
+--
+--     [C declaration]: @SDL_Vulkan_LoadLibrary@, defined at @SDL3\/SDL_vulkan.h 133:34@
+sDL_Vulkan_LoadLibrary
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the platform dependent Vulkan loader library name or NULL.
+  -> IO BG.CBool
+sDL_Vulkan_LoadLibrary = hs_bindgen_a109086f43a5b6e5
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_GetVkGetInstanceProcAddr@
+foreign import ccall unsafe "hs_bindgen_4a040ba0b3ef299e"
+  hs_bindgen_4a040ba0b3ef299e_base
+    :: IO (BG.FunPtr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_GetVkGetInstanceProcAddr@
+hs_bindgen_4a040ba0b3ef299e :: IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+hs_bindgen_4a040ba0b3ef299e =
+  BG.fromFFIType hs_bindgen_4a040ba0b3ef299e_base
+
+-- | Get the address of the @vkGetInstanceProcAddr@ function.
+--
+--     This should be called after either calling @SDL_Vulkan_LoadLibrary()@ or creating an SDL_Window with the @SDL_WINDOW_VULKAN@ flag.
+--
+--     The actual type of the returned function pointer is PFN_vkGetInstanceProcAddr, but that isn\'t available because the Vulkan headers are not included here. You should cast the return value of this function to that type, e.g.
+--
+--     @vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) SDL_Vulkan_GetVkGetInstanceProcAddr();@
+--
+--     [Returns]: the function pointer for @vkGetInstanceProcAddr@ or NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [C declaration]: @SDL_Vulkan_GetVkGetInstanceProcAddr@, defined at @SDL3\/SDL_vulkan.h 154:49@
+sDL_Vulkan_GetVkGetInstanceProcAddr :: IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+sDL_Vulkan_GetVkGetInstanceProcAddr =
+  hs_bindgen_4a040ba0b3ef299e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_UnloadLibrary@
+foreign import ccall unsafe "hs_bindgen_37af72574ddcbb1a"
+  hs_bindgen_37af72574ddcbb1a_base
+    :: IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_UnloadLibrary@
+hs_bindgen_37af72574ddcbb1a :: IO ()
+hs_bindgen_37af72574ddcbb1a =
+  BG.fromFFIType hs_bindgen_37af72574ddcbb1a_base
+
+-- | Unload the Vulkan library previously loaded by @SDL_Vulkan_LoadLibrary()@.
+--
+--     SDL keeps a counter of how many times this function has been called, so it is safe to call this function multiple times, so long as it is paired with an equivalent number of calls to SDL_Vulkan_LoadLibrary. The library isn\'t actually unloaded until there have been an equivalent number of calls to SDL_Vulkan_UnloadLibrary.
+--
+--     Once the library has actually been unloaded, if any Vulkan instances remain, they will likely crash the program. Clean up any existing Vulkan resources, and destroy appropriate windows, renderers and GPU devices before calling this function.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_LoadLibrary'
+--
+--     [C declaration]: @SDL_Vulkan_UnloadLibrary@, defined at @SDL3\/SDL_vulkan.h 176:34@
+sDL_Vulkan_UnloadLibrary :: IO ()
+sDL_Vulkan_UnloadLibrary =
+  hs_bindgen_37af72574ddcbb1a
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_GetInstanceExtensions@
+foreign import ccall unsafe "hs_bindgen_2aad81b39a87b1fa"
+  hs_bindgen_2aad81b39a87b1fa_base
+    :: BG.Ptr BG.Void
+    -> IO (BG.Ptr BG.Void)
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_GetInstanceExtensions@
+hs_bindgen_2aad81b39a87b1fa
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO (PtrConst.PtrConst (PtrConst.PtrConst BG.CChar))
+hs_bindgen_2aad81b39a87b1fa =
+  BG.fromFFIType hs_bindgen_2aad81b39a87b1fa_base
+
+-- | Get the Vulkan instance extensions needed for vkCreateInstance.
+--
+--     This should be called after either calling @SDL_Vulkan_LoadLibrary()@ or creating an SDL_Window with the @SDL_WINDOW_VULKAN@ flag.
+--
+--     On return, the variable pointed to by @count@ will be set to the number of elements returned, suitable for using with VkInstanceCreateInfo::enabledExtensionCount, and the returned array can be used with VkInstanceCreateInfo::ppEnabledExtensionNames, for calling Vulkan\'s vkCreateInstance API.
+--
+--     You should not free the returned array; it is owned by SDL.
+--
+--     [Returns]: an array of extension name strings on success, NULL on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_CreateSurface'
+--
+--     [C declaration]: @SDL_Vulkan_GetInstanceExtensions@, defined at @SDL3\/SDL_vulkan.h 200:50@
+sDL_Vulkan_GetInstanceExtensions
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of extensions returned.
+  -> IO (PtrConst.PtrConst (PtrConst.PtrConst BG.CChar))
+sDL_Vulkan_GetInstanceExtensions =
+  hs_bindgen_2aad81b39a87b1fa
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_CreateSurface@
+foreign import ccall unsafe "hs_bindgen_32bf040c7a36881e"
+  hs_bindgen_32bf040c7a36881e_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_CreateSurface@
+hs_bindgen_32bf040c7a36881e
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -> VkInstance
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -> BG.Ptr VkSurfaceKHR
+  -> IO BG.CBool
+hs_bindgen_32bf040c7a36881e =
+  BG.fromFFIType hs_bindgen_32bf040c7a36881e_base
+
+-- | Create a Vulkan rendering surface for a window.
+--
+--     The @window@ must have been created with the @SDL_WINDOW_VULKAN@ flag and @instance@ must have been created with extensions returned by @SDL_Vulkan_GetInstanceExtensions()@ enabled.
+--
+--     If @allocator@ is NULL, Vulkan will use the system default allocator. This argument is passed directly to Vulkan and isn\'t used by SDL itself.
+--
+--     [Returns]: true on success or false on failure; call SDL_GetError() for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetInstanceExtensions', 'sDL_Vulkan_DestroySurface'
+--
+--     [C declaration]: @SDL_Vulkan_CreateSurface@, defined at @SDL3\/SDL_vulkan.h 226:34@
+sDL_Vulkan_CreateSurface
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to which to attach the Vulkan surface.
+  -> VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -- ^
+  --
+  --           [@allocator@]: a VkAllocationCallbacks struct, which lets the app set the allocator that creates the surface. Can be NULL.
+  -> BG.Ptr VkSurfaceKHR
+  -- ^
+  --
+  --           [@surface@]: a pointer to a VkSurfaceKHR handle to output the newly created surface.
+  -> IO BG.CBool
+sDL_Vulkan_CreateSurface =
+  hs_bindgen_32bf040c7a36881e
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_DestroySurface@
+foreign import ccall unsafe "hs_bindgen_c7debc5633e16c49"
+  hs_bindgen_c7debc5633e16c49_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> IO ()
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_DestroySurface@
+hs_bindgen_c7debc5633e16c49
+  :: VkInstance
+  -> VkSurfaceKHR
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -> IO ()
+hs_bindgen_c7debc5633e16c49 =
+  BG.fromFFIType hs_bindgen_c7debc5633e16c49_base
+
+-- | Destroy the Vulkan rendering surface of a window.
+--
+--     This should be called before SDL_DestroyWindow, if SDL_Vulkan_CreateSurface was called after SDL_CreateWindow.
+--
+--     The @instance@ must have been created with extensions returned by @SDL_Vulkan_GetInstanceExtensions()@ enabled and @surface@ must have been created successfully by an @SDL_Vulkan_CreateSurface()@ call.
+--
+--     If @allocator@ is NULL, Vulkan will use the system default allocator. This argument is passed directly to Vulkan and isn\'t used by SDL itself.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetInstanceExtensions', 'sDL_Vulkan_CreateSurface'
+--
+--     [C declaration]: @SDL_Vulkan_DestroySurface@, defined at @SDL3\/SDL_vulkan.h 254:34@
+sDL_Vulkan_DestroySurface
+  :: VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> VkSurfaceKHR
+  -- ^
+  --
+  --           [@surface@]: vkSurfaceKHR handle to destroy.
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -- ^
+  --
+  --           [@allocator@]: a VkAllocationCallbacks struct, which lets the app set the allocator that destroys the surface. Can be NULL.
+  -> IO ()
+sDL_Vulkan_DestroySurface =
+  hs_bindgen_c7debc5633e16c49
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_GetPresentationSupport@
+foreign import ccall unsafe "hs_bindgen_dfcebfd398bdf0a8"
+  hs_bindgen_dfcebfd398bdf0a8_base
+    :: BG.Ptr BG.Void
+    -> BG.Ptr BG.Void
+    -> BG.Word32
+    -> IO BG.Word8
+
+-- __unique:__ @sdl3bindgensys_SDL3.Sys.Bindgen.Vulkan_Unsafe_SDL_Vulkan_GetPresentationSupport@
+hs_bindgen_dfcebfd398bdf0a8
+  :: VkInstance
+  -> VkPhysicalDevice
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -> IO BG.CBool
+hs_bindgen_dfcebfd398bdf0a8 =
+  BG.fromFFIType hs_bindgen_dfcebfd398bdf0a8_base
+
+-- | Query support for presentation via a given physical device and queue family.
+--
+--     The @instance@ must have been created with extensions returned by @SDL_Vulkan_GetInstanceExtensions()@ enabled.
+--
+--     [Returns]: true if supported, false if unsupported or an error occurred.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_Vulkan_GetInstanceExtensions'
+--
+--     [C declaration]: @SDL_Vulkan_GetPresentationSupport@, defined at @SDL3\/SDL_vulkan.h 275:34@
+sDL_Vulkan_GetPresentationSupport
+  :: VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> VkPhysicalDevice
+  -- ^
+  --
+  --           [@physicalDevice@]: a valid Vulkan physical device handle.
+  -> SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@queueFamilyIndex@]: a valid queue family index for the given physical device.
+  -> IO BG.CBool
+sDL_Vulkan_GetPresentationSupport =
+  hs_bindgen_dfcebfd398bdf0a8
diff --git a/src/SDL3/Sys/Bits.hs b/src/SDL3/Sys/Bits.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Bits.hs
@@ -0,0 +1,140 @@
+-- | Functions for fiddling with bits and bitmasks. Get the index of the most significant (set) bit in a 32-bit number.
+--
+--     Result is undefined when called with 0. This operation can also be stated as \"count leading zeroes\" and \"log base 2\".
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [@x@]: the 32-bit value to examine.
+--
+--     [Returns]: the index of the most significant bit, or -1 if the value is 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Bits.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Bits (
+  -- * Function aliases
+  SDL3.Sys.Bits.mostSignificantBitIndex32,
+  SDL3.Sys.Bits.mostSignificantBitIndex32Safe,
+  SDL3.Sys.Bits.hasExactlyOneBitSet32,
+  SDL3.Sys.Bits.hasExactlyOneBitSet32Safe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Bits.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Bits.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MostSignificantBitIndex32@.
+--                   The safe flavor is 'mostSignificantBitIndex32Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MostSignificantBitIndex32@, defined at @SDL3\/SDL_bits.h 66:22@
+mostSignificantBitIndex32
+  :: BG.Word32
+  -- ^ [C declaration]: @x@
+  -> IO BG.Int32
+mostSignificantBitIndex32 =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_MostSignificantBitIndex32 (Coerce.coerce x00))
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MostSignificantBitIndex32@.
+--                   The unsafe flavor is 'mostSignificantBitIndex32'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MostSignificantBitIndex32@, defined at @SDL3\/SDL_bits.h 66:22@
+mostSignificantBitIndex32Safe
+  :: BG.Word32
+  -- ^ [C declaration]: @x@
+  -> IO BG.Int32
+mostSignificantBitIndex32Safe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_MostSignificantBitIndex32 (Coerce.coerce x00))
+
+-- | Determine if a unsigned 32-bit value has exactly one bit set.
+--
+--     If there are no bits set (@x@ is zero), or more than one bit set, this returns false. If any one bit is exclusively set, this returns true.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if exactly one bit is set in @x@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasExactlyOneBitSet32@.
+--                   The safe flavor is 'hasExactlyOneBitSet32Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasExactlyOneBitSet32@, defined at @SDL3\/SDL_bits.h 133:23@
+hasExactlyOneBitSet32
+  :: BG.Word32
+  -- ^
+  --
+  --           [@x@]: the 32-bit value to examine.
+  -> IO Bool
+hasExactlyOneBitSet32 =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_HasExactlyOneBitSet32 (Coerce.coerce x00))
+
+-- | Determine if a unsigned 32-bit value has exactly one bit set.
+--
+--     If there are no bits set (@x@ is zero), or more than one bit set, this returns false. If any one bit is exclusively set, this returns true.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if exactly one bit is set in @x@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasExactlyOneBitSet32@.
+--                   The unsafe flavor is 'hasExactlyOneBitSet32'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasExactlyOneBitSet32@, defined at @SDL3\/SDL_bits.h 133:23@
+hasExactlyOneBitSet32Safe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@x@]: the 32-bit value to examine.
+  -> IO Bool
+hasExactlyOneBitSet32Safe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_HasExactlyOneBitSet32 (Coerce.coerce x00))
diff --git a/src/SDL3/Sys/Blendmode.hs b/src/SDL3/Sys/Blendmode.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Blendmode.hs
@@ -0,0 +1,253 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | Blend modes decide how two colors will mix together. There are both standard modes for basic needs and a means to create custom modes, dictating what sort of math to do on what color components. A set of blend modes used in drawing operations.
+--
+--     These predefined blend modes are supported everywhere.
+--
+--     Additional values may be obtained from 'composeCustomBlendMode'.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'composeCustomBlendMode'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Blendmode.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Blendmode (
+  module SDL3.Sys.Bindgen.Blendmode,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Blendmode.SDL_BLENDMODE_NONE,
+  pattern SDL3.Sys.Blendmode.SDL_BLENDMODE_BLEND,
+  pattern SDL3.Sys.Blendmode.SDL_BLENDMODE_BLEND_PREMULTIPLIED,
+  pattern SDL3.Sys.Blendmode.SDL_BLENDMODE_ADD,
+  pattern SDL3.Sys.Blendmode.SDL_BLENDMODE_ADD_PREMULTIPLIED,
+  pattern SDL3.Sys.Blendmode.SDL_BLENDMODE_MOD,
+  pattern SDL3.Sys.Blendmode.SDL_BLENDMODE_MUL,
+  pattern SDL3.Sys.Blendmode.SDL_BLENDMODE_INVALID,
+
+  -- * Function aliases
+  SDL3.Sys.Blendmode.composeCustomBlendMode,
+  SDL3.Sys.Blendmode.composeCustomBlendModeSafe,
+)
+where
+
+import SDL3.Sys.Bindgen.Blendmode
+import SDL3.Sys.Bindgen.Blendmode.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Blendmode.Unsafe qualified as Unsafe
+
+-- | Compose a custom blend mode for renderers.
+--
+--     The functions 'SDL3.Sys.Render.setRenderDrawBlendMode' and 'SDL3.Sys.Render.setTextureBlendMode' accept the 'SDL_BlendMode' returned by this function if the renderer supports it.
+--
+--     A blend mode controls how the pixels from a drawing operation (source) get combined with the pixels from the render target (destination). First, the components of the source and destination pixels get multiplied with their blend factors. Then, the blend operation takes the two products and calculates the result that will get stored in the render target.
+--
+--     Expressed in pseudocode, it would look like this:
+--
+--     @
+--     dstRGB = colorOperation(srcRGB * srcColorFactor, dstRGB * dstColorFactor);
+--     dstA = alphaOperation(srcA * srcAlphaFactor, dstA * dstAlphaFactor);
+--     @
+--
+--     Where the functions @colorOperation(src, dst)@ and @alphaOperation(src, dst)@ can return one of the following:
+--
+--     * @src + dst@
+--
+--     * @src - dst@
+--
+--     * @dst - src@
+--
+--     * @min(src, dst)@
+--
+--     * @max(src, dst)@
+--
+--     The red, green, and blue components are always multiplied with the first, second, and third components of the 'SDL_BlendFactor', respectively. The fourth component is not used.
+--
+--     The alpha component is always multiplied with the fourth component of the 'SDL_BlendFactor'. The other components are not used in the alpha calculation.
+--
+--     Support for these blend modes varies for each renderer. To check if a specific 'SDL_BlendMode' is supported, create a renderer and pass it to either 'SDL3.Sys.Render.setRenderDrawBlendMode' or 'SDL3.Sys.Render.setTextureBlendMode'. They will return with an error if the blend mode is not supported.
+--
+--     This list describes the support of custom blend modes for each renderer. All renderers support the four blend modes listed in the 'SDL_BlendMode' enumeration.
+--
+--     * __direct3d__: Supports all operations with all factors. However, some factors produce unexpected results with @SDL_BLENDOPERATION_MINIMUM@ and @SDL_BLENDOPERATION_MAXIMUM@.
+--
+--     * __direct3d11__: Same as Direct3D 9.
+--
+--     * __opengl__: Supports the @SDL_BLENDOPERATION_ADD@ operation with all factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly here.
+--
+--     * __opengles2__: Supports the @SDL_BLENDOPERATION_ADD@, @SDL_BLENDOPERATION_SUBTRACT@, @SDL_BLENDOPERATION_REV_SUBTRACT@ operations with all factors.
+--
+--     * __psp__: No custom blend mode support.
+--
+--     * __software__: No custom blend mode support.
+--
+--     Some renderers do not provide an alpha component for the default render target. The @SDL_BLENDFACTOR_DST_ALPHA@ and @SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA@ factors do not have an effect in this case.
+--
+--     [Returns]: an 'SDL_BlendMode' that represents the chosen factors and operations.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Render.setRenderDrawBlendMode', 'SDL3.Sys.Render.getRenderDrawBlendMode', 'SDL3.Sys.Render.setTextureBlendMode', 'SDL3.Sys.Render.getTextureBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ComposeCustomBlendMode@.
+--                   The safe flavor is 'composeCustomBlendModeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ComposeCustomBlendMode@, defined at @SDL3\/SDL_blendmode.h 189:43@
+composeCustomBlendMode
+  :: SDL_BlendFactor
+  -- ^
+  --
+  --           [@srcColorFactor@]: the 'SDL_BlendFactor' applied to the red, green, and blue components of the source pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@dstColorFactor@]: the 'SDL_BlendFactor' applied to the red, green, and blue components of the destination pixels.
+  -> SDL_BlendOperation
+  -- ^
+  --
+  --           [@colorOperation@]: the 'SDL_BlendOperation' used to combine the red, green, and blue components of the source and destination pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@srcAlphaFactor@]: the 'SDL_BlendFactor' applied to the alpha component of the source pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@dstAlphaFactor@]: the 'SDL_BlendFactor' applied to the alpha component of the destination pixels.
+  -> SDL_BlendOperation
+  -- ^
+  --
+  --           [@alphaOperation@]: the 'SDL_BlendOperation' used to combine the alpha component of the source and destination pixels.
+  -> IO SDL_BlendMode
+composeCustomBlendMode =
+  Unsafe.sDL_ComposeCustomBlendMode
+
+-- | Compose a custom blend mode for renderers.
+--
+--     The functions 'SDL3.Sys.Render.setRenderDrawBlendMode' and 'SDL3.Sys.Render.setTextureBlendMode' accept the 'SDL_BlendMode' returned by this function if the renderer supports it.
+--
+--     A blend mode controls how the pixels from a drawing operation (source) get combined with the pixels from the render target (destination). First, the components of the source and destination pixels get multiplied with their blend factors. Then, the blend operation takes the two products and calculates the result that will get stored in the render target.
+--
+--     Expressed in pseudocode, it would look like this:
+--
+--     @
+--     dstRGB = colorOperation(srcRGB * srcColorFactor, dstRGB * dstColorFactor);
+--     dstA = alphaOperation(srcA * srcAlphaFactor, dstA * dstAlphaFactor);
+--     @
+--
+--     Where the functions @colorOperation(src, dst)@ and @alphaOperation(src, dst)@ can return one of the following:
+--
+--     * @src + dst@
+--
+--     * @src - dst@
+--
+--     * @dst - src@
+--
+--     * @min(src, dst)@
+--
+--     * @max(src, dst)@
+--
+--     The red, green, and blue components are always multiplied with the first, second, and third components of the 'SDL_BlendFactor', respectively. The fourth component is not used.
+--
+--     The alpha component is always multiplied with the fourth component of the 'SDL_BlendFactor'. The other components are not used in the alpha calculation.
+--
+--     Support for these blend modes varies for each renderer. To check if a specific 'SDL_BlendMode' is supported, create a renderer and pass it to either 'SDL3.Sys.Render.setRenderDrawBlendMode' or 'SDL3.Sys.Render.setTextureBlendMode'. They will return with an error if the blend mode is not supported.
+--
+--     This list describes the support of custom blend modes for each renderer. All renderers support the four blend modes listed in the 'SDL_BlendMode' enumeration.
+--
+--     * __direct3d__: Supports all operations with all factors. However, some factors produce unexpected results with @SDL_BLENDOPERATION_MINIMUM@ and @SDL_BLENDOPERATION_MAXIMUM@.
+--
+--     * __direct3d11__: Same as Direct3D 9.
+--
+--     * __opengl__: Supports the @SDL_BLENDOPERATION_ADD@ operation with all factors. OpenGL versions 1.1, 1.2, and 1.3 do not work correctly here.
+--
+--     * __opengles2__: Supports the @SDL_BLENDOPERATION_ADD@, @SDL_BLENDOPERATION_SUBTRACT@, @SDL_BLENDOPERATION_REV_SUBTRACT@ operations with all factors.
+--
+--     * __psp__: No custom blend mode support.
+--
+--     * __software__: No custom blend mode support.
+--
+--     Some renderers do not provide an alpha component for the default render target. The @SDL_BLENDFACTOR_DST_ALPHA@ and @SDL_BLENDFACTOR_ONE_MINUS_DST_ALPHA@ factors do not have an effect in this case.
+--
+--     [Returns]: an 'SDL_BlendMode' that represents the chosen factors and operations.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Render.setRenderDrawBlendMode', 'SDL3.Sys.Render.getRenderDrawBlendMode', 'SDL3.Sys.Render.setTextureBlendMode', 'SDL3.Sys.Render.getTextureBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ComposeCustomBlendMode@.
+--                   The unsafe flavor is 'composeCustomBlendMode'
+--                   .
+--
+--     [C declaration]: @SDL_ComposeCustomBlendMode@, defined at @SDL3\/SDL_blendmode.h 189:43@
+composeCustomBlendModeSafe
+  :: SDL_BlendFactor
+  -- ^
+  --
+  --           [@srcColorFactor@]: the 'SDL_BlendFactor' applied to the red, green, and blue components of the source pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@dstColorFactor@]: the 'SDL_BlendFactor' applied to the red, green, and blue components of the destination pixels.
+  -> SDL_BlendOperation
+  -- ^
+  --
+  --           [@colorOperation@]: the 'SDL_BlendOperation' used to combine the red, green, and blue components of the source and destination pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@srcAlphaFactor@]: the 'SDL_BlendFactor' applied to the alpha component of the source pixels.
+  -> SDL_BlendFactor
+  -- ^
+  --
+  --           [@dstAlphaFactor@]: the 'SDL_BlendFactor' applied to the alpha component of the destination pixels.
+  -> SDL_BlendOperation
+  -- ^
+  --
+  --           [@alphaOperation@]: the 'SDL_BlendOperation' used to combine the alpha component of the source and destination pixels.
+  -> IO SDL_BlendMode
+composeCustomBlendModeSafe =
+  Safe.sDL_ComposeCustomBlendMode
+
+-- | Typed constant for macro @SDL_BLENDMODE_NONE@.
+pattern SDL_BLENDMODE_NONE :: SDL_BlendMode
+pattern SDL_BLENDMODE_NONE = SDL_BlendMode 0
+
+-- | Typed constant for macro @SDL_BLENDMODE_BLEND@.
+pattern SDL_BLENDMODE_BLEND :: SDL_BlendMode
+pattern SDL_BLENDMODE_BLEND = SDL_BlendMode 1
+
+-- | Typed constant for macro @SDL_BLENDMODE_BLEND_PREMULTIPLIED@.
+pattern SDL_BLENDMODE_BLEND_PREMULTIPLIED :: SDL_BlendMode
+pattern SDL_BLENDMODE_BLEND_PREMULTIPLIED = SDL_BlendMode 16
+
+-- | Typed constant for macro @SDL_BLENDMODE_ADD@.
+pattern SDL_BLENDMODE_ADD :: SDL_BlendMode
+pattern SDL_BLENDMODE_ADD = SDL_BlendMode 2
+
+-- | Typed constant for macro @SDL_BLENDMODE_ADD_PREMULTIPLIED@.
+pattern SDL_BLENDMODE_ADD_PREMULTIPLIED :: SDL_BlendMode
+pattern SDL_BLENDMODE_ADD_PREMULTIPLIED = SDL_BlendMode 32
+
+-- | Typed constant for macro @SDL_BLENDMODE_MOD@.
+pattern SDL_BLENDMODE_MOD :: SDL_BlendMode
+pattern SDL_BLENDMODE_MOD = SDL_BlendMode 4
+
+-- | Typed constant for macro @SDL_BLENDMODE_MUL@.
+pattern SDL_BLENDMODE_MUL :: SDL_BlendMode
+pattern SDL_BLENDMODE_MUL = SDL_BlendMode 8
+
+-- | Typed constant for macro @SDL_BLENDMODE_INVALID@.
+pattern SDL_BLENDMODE_INVALID :: SDL_BlendMode
+pattern SDL_BLENDMODE_INVALID = SDL_BlendMode 2147483647
diff --git a/src/SDL3/Sys/Camera.hs b/src/SDL3/Sys/Camera.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Camera.hs
@@ -0,0 +1,990 @@
+-- | Video capture for the SDL library.
+--
+--     This API lets apps read input from video sources, like webcams. Camera devices can be enumerated, queried, and opened. Once opened, it will provide SDL_Surface objects as new frames of video come in. These surfaces can be uploaded to an SDL_Texture or processed as pixels in memory.
+--
+--     Several platforms will alert the user if an app tries to access a camera, and some will present a UI asking the user if your application should be allowed to obtain images at all, which they can deny. A successfully opened camera will not provide images until permission is granted. Applications, after opening a camera device, can see if they were granted access by either polling with the @'getCameraPermissionState'@ function, or waiting for an SDL_EVENT_CAMERA_DEVICE_APPROVED or SDL_EVENT_CAMERA_DEVICE_DENIED event. Platforms that don\'t have any user approval process will report approval immediately.
+--
+--     Note that SDL cameras only provide video as individual frames; they will not provide full-motion video encoded in a movie file format, although an app is free to encode the acquired frames into any format it likes. It also does not provide audio from the camera hardware through this API; not only do many webcams not have microphones at all, many people from streamers to people on Zoom calls will want to use a separate microphone regardless of the camera. In any case, recorded audio will be available through SDL\'s audio API no matter what hardware provides the microphone.
+--
+--     Camera gotchas
+--
+--     Consumer-level camera hardware tends to take a little while to warm up, once the device has been opened. Generally most camera apps have some sort of UI to take a picture (a button to snap a pic while a preview is showing, some sort of multi-second countdown for the user to pose, like a photo booth), which puts control in the users\' hands, or they are intended to stay on for long times (Pokemon Go, etc).
+--
+--     It\'s not uncommon that a newly-opened camera will provide a couple of completely black frames, maybe followed by some under-exposed images. If taking a single frame automatically, or recording video from a camera\'s input without the user initiating it from a preview, it could be wise to drop the first several frames (if not the first several /seconds/ worth of frames!) before using images from a camera. This is a unique ID for a camera device for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     If the device is disconnected and reconnected, it will get a new ID.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameras'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Camera.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Camera (
+  module SDL3.Sys.Bindgen.Camera,
+
+  -- * Function aliases
+  SDL3.Sys.Camera.getNumCameraDrivers,
+  SDL3.Sys.Camera.getNumCameraDriversSafe,
+  SDL3.Sys.Camera.getCameraDriver,
+  SDL3.Sys.Camera.getCameraDriverSafe,
+  SDL3.Sys.Camera.getCurrentCameraDriver,
+  SDL3.Sys.Camera.getCurrentCameraDriverSafe,
+  SDL3.Sys.Camera.getCameras,
+  SDL3.Sys.Camera.getCamerasSafe,
+  SDL3.Sys.Camera.getCameraSupportedFormats,
+  SDL3.Sys.Camera.getCameraSupportedFormatsSafe,
+  SDL3.Sys.Camera.getCameraName,
+  SDL3.Sys.Camera.getCameraNameSafe,
+  SDL3.Sys.Camera.getCameraPosition,
+  SDL3.Sys.Camera.getCameraPositionSafe,
+  SDL3.Sys.Camera.openCamera,
+  SDL3.Sys.Camera.openCameraSafe,
+  SDL3.Sys.Camera.getCameraPermissionState,
+  SDL3.Sys.Camera.getCameraPermissionStateSafe,
+  SDL3.Sys.Camera.getCameraID,
+  SDL3.Sys.Camera.getCameraIDSafe,
+  SDL3.Sys.Camera.getCameraProperties,
+  SDL3.Sys.Camera.getCameraPropertiesSafe,
+  SDL3.Sys.Camera.getCameraFormat,
+  SDL3.Sys.Camera.getCameraFormatSafe,
+  SDL3.Sys.Camera.acquireCameraFrame,
+  SDL3.Sys.Camera.acquireCameraFrameSafe,
+  SDL3.Sys.Camera.releaseCameraFrame,
+  SDL3.Sys.Camera.releaseCameraFrameSafe,
+  SDL3.Sys.Camera.closeCamera,
+  SDL3.Sys.Camera.closeCameraSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Camera
+import SDL3.Sys.Bindgen.Camera.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Camera.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+
+-- | Use this function to get the number of built-in camera drivers.
+--
+--     This function returns a hardcoded number. This never returns a negative value; if there are no drivers compiled into this build of SDL, this function returns zero. The presence of a driver in this list does not mean it will function, it just means SDL is capable of interacting with that interface. For example, a build of SDL might have v4l2 support, but if there\'s no kernel support available, SDL\'s v4l2 driver would fail if used.
+--
+--     By default, SDL tries all drivers, in its preferred order, until one is found to be usable.
+--
+--     [Returns]: the number of built-in camera drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameraDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumCameraDrivers@.
+--                   The safe flavor is 'getNumCameraDriversSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumCameraDrivers@, defined at @SDL3\/SDL_camera.h 175:33@
+getNumCameraDrivers :: IO BG.Int32
+getNumCameraDrivers =
+  fmap Coerce.coerce Unsafe.sDL_GetNumCameraDrivers
+
+-- | Use this function to get the number of built-in camera drivers.
+--
+--     This function returns a hardcoded number. This never returns a negative value; if there are no drivers compiled into this build of SDL, this function returns zero. The presence of a driver in this list does not mean it will function, it just means SDL is capable of interacting with that interface. For example, a build of SDL might have v4l2 support, but if there\'s no kernel support available, SDL\'s v4l2 driver would fail if used.
+--
+--     By default, SDL tries all drivers, in its preferred order, until one is found to be usable.
+--
+--     [Returns]: the number of built-in camera drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameraDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumCameraDrivers@.
+--                   The unsafe flavor is 'getNumCameraDrivers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumCameraDrivers@, defined at @SDL3\/SDL_camera.h 175:33@
+getNumCameraDriversSafe :: IO BG.Int32
+getNumCameraDriversSafe =
+  fmap Coerce.coerce Safe.sDL_GetNumCameraDrivers
+
+-- | Use this function to get the name of a built in camera driver.
+--
+--     The list of camera drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"v4l2\", \"coremedia\" or \"android\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the camera driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumCameraDrivers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCameraDriver@.
+--                   The safe flavor is 'getCameraDriverSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetCameraDriver@, defined at @SDL3\/SDL_camera.h 199:42@
+getCameraDriver
+  :: BG.Int32
+  -- ^
+  --
+  --           [@index@]: the index of the camera driver; the value ranges from 0 to @'getNumCameraDrivers'@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getCameraDriver =
+  \x00 ->
+    Unsafe.sDL_GetCameraDriver (Coerce.coerce x00)
+
+-- | Use this function to get the name of a built in camera driver.
+--
+--     The list of camera drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"v4l2\", \"coremedia\" or \"android\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the camera driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumCameraDrivers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCameraDriver@.
+--                   The unsafe flavor is 'getCameraDriver'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetCameraDriver@, defined at @SDL3\/SDL_camera.h 199:42@
+getCameraDriverSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@index@]: the index of the camera driver; the value ranges from 0 to @'getNumCameraDrivers'@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getCameraDriverSafe =
+  \x00 -> Safe.sDL_GetCameraDriver (Coerce.coerce x00)
+
+-- | Get the name of the current camera driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"v4l2\", \"coremedia\" or \"android\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current camera driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCurrentCameraDriver@.
+--                   The safe flavor is 'getCurrentCameraDriverSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentCameraDriver@, defined at @SDL3\/SDL_camera.h 215:42@
+getCurrentCameraDriver :: IO (PtrConst.PtrConst BG.CChar)
+getCurrentCameraDriver =
+  Unsafe.sDL_GetCurrentCameraDriver
+
+-- | Get the name of the current camera driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"v4l2\", \"coremedia\" or \"android\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current camera driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCurrentCameraDriver@.
+--                   The unsafe flavor is 'getCurrentCameraDriver'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentCameraDriver@, defined at @SDL3\/SDL_camera.h 215:42@
+getCurrentCameraDriverSafe :: IO (PtrConst.PtrConst BG.CChar)
+getCurrentCameraDriverSafe =
+  Safe.sDL_GetCurrentCameraDriver
+
+-- | Get a list of currently connected camera devices.
+--
+--     [Returns]: a 0 terminated array of camera instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCameras@.
+--                   The safe flavor is 'getCamerasSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameras@, defined at @SDL3\/SDL_camera.h 232:44@
+getCameras
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of cameras returned, may be NULL.
+  -> IO (BG.Ptr SDL_CameraID)
+getCameras = Unsafe.sDL_GetCameras
+
+-- | Get a list of currently connected camera devices.
+--
+--     [Returns]: a 0 terminated array of camera instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCameras@.
+--                   The unsafe flavor is 'getCameras'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameras@, defined at @SDL3\/SDL_camera.h 232:44@
+getCamerasSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of cameras returned, may be NULL.
+  -> IO (BG.Ptr SDL_CameraID)
+getCamerasSafe = Safe.sDL_GetCameras
+
+-- | Get the list of native formats\/sizes a camera supports.
+--
+--     This returns a list of all formats and frame sizes that a specific camera can offer. This is useful if your app can accept a variety of image formats and sizes and so want to find the optimal spec that doesn\'t require conversion.
+--
+--     This function isn\'t strictly required; if you call 'openCamera' with a NULL spec, SDL will choose a native format for you, and if you instead specify a desired format, it will transparently convert to the requested format on your behalf.
+--
+--     If @count@ is not NULL, it will be filled with the number of elements in the returned array.
+--
+--     Note that it\'s legal for a camera to supply an empty list. This is what will happen on Emscripten builds, since that platform won\'t tell /anything/ about available cameras until you\'ve opened one, and won\'t even tell if there /is/ a camera until the user has given you permission to check through a scary warning popup.
+--
+--     [Returns]: a NULL terminated array of pointers to 'SDL_CameraSpec' or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameras', 'openCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCameraSupportedFormats@.
+--                   The safe flavor is 'getCameraSupportedFormatsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraSupportedFormats@, defined at @SDL3\/SDL_camera.h 271:47@
+getCameraSupportedFormats
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of elements in the list, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_CameraSpec))
+getCameraSupportedFormats =
+  Unsafe.sDL_GetCameraSupportedFormats
+
+-- | Get the list of native formats\/sizes a camera supports.
+--
+--     This returns a list of all formats and frame sizes that a specific camera can offer. This is useful if your app can accept a variety of image formats and sizes and so want to find the optimal spec that doesn\'t require conversion.
+--
+--     This function isn\'t strictly required; if you call 'openCamera' with a NULL spec, SDL will choose a native format for you, and if you instead specify a desired format, it will transparently convert to the requested format on your behalf.
+--
+--     If @count@ is not NULL, it will be filled with the number of elements in the returned array.
+--
+--     Note that it\'s legal for a camera to supply an empty list. This is what will happen on Emscripten builds, since that platform won\'t tell /anything/ about available cameras until you\'ve opened one, and won\'t even tell if there /is/ a camera until the user has given you permission to check through a scary warning popup.
+--
+--     [Returns]: a NULL terminated array of pointers to 'SDL_CameraSpec' or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameras', 'openCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCameraSupportedFormats@.
+--                   The unsafe flavor is 'getCameraSupportedFormats'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraSupportedFormats@, defined at @SDL3\/SDL_camera.h 271:47@
+getCameraSupportedFormatsSafe
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of elements in the list, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_CameraSpec))
+getCameraSupportedFormatsSafe =
+  Safe.sDL_GetCameraSupportedFormats
+
+-- | Get the human-readable device name for a camera.
+--
+--     [Returns]: a human-readable device name or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameras'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCameraName@.
+--                   The safe flavor is 'getCameraNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraName@, defined at @SDL3\/SDL_camera.h 286:42@
+getCameraName
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getCameraName = Unsafe.sDL_GetCameraName
+
+-- | Get the human-readable device name for a camera.
+--
+--     [Returns]: a human-readable device name or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameras'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCameraName@.
+--                   The unsafe flavor is 'getCameraName'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraName@, defined at @SDL3\/SDL_camera.h 286:42@
+getCameraNameSafe
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getCameraNameSafe = Safe.sDL_GetCameraName
+
+-- | Get the position of the camera in relation to the system.
+--
+--     Most platforms will report UNKNOWN, but mobile devices, like phones, can often make a distinction between cameras on the front of the device (that points towards the user, for taking \"selfies\") and cameras on the back (for filming in the direction the user is facing).
+--
+--     [Returns]: the position of the camera on the system hardware.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameras'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCameraPosition@.
+--                   The safe flavor is 'getCameraPositionSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraPosition@, defined at @SDL3\/SDL_camera.h 305:48@
+getCameraPosition
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> IO SDL_CameraPosition
+getCameraPosition = Unsafe.sDL_GetCameraPosition
+
+-- | Get the position of the camera in relation to the system.
+--
+--     Most platforms will report UNKNOWN, but mobile devices, like phones, can often make a distinction between cameras on the front of the device (that points towards the user, for taking \"selfies\") and cameras on the back (for filming in the direction the user is facing).
+--
+--     [Returns]: the position of the camera on the system hardware.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameras'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCameraPosition@.
+--                   The unsafe flavor is 'getCameraPosition'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraPosition@, defined at @SDL3\/SDL_camera.h 305:48@
+getCameraPositionSafe
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> IO SDL_CameraPosition
+getCameraPositionSafe = Safe.sDL_GetCameraPosition
+
+-- | Open a video recording device (a \"camera\").
+--
+--     You can open the device with any reasonable spec, and if the hardware can\'t directly support it, it will convert data seamlessly to the requested format. This might incur overhead, including scaling of image data.
+--
+--     If you would rather accept whatever format the device offers, you can pass a NULL spec here and it will choose one for you (and you can use SDL_Surface\'s conversion\/scaling functions directly if necessary).
+--
+--     You can call @'getCameraFormat'@ to get the actual data format if passing a NULL spec here. You can see the exact specs a device can support without conversion with @'getCameraSupportedFormats'@.
+--
+--     SDL will not attempt to emulate framerate; it will try to set the hardware to the rate closest to the requested speed, but it won\'t attempt to limit or duplicate frames artificially; call @'getCameraFormat'@ to see the actual framerate of the opened the device, and check your timestamps if this is crucial to your app!
+--
+--     Note that the camera is not usable until the user approves its use! On some platforms, the operating system will prompt the user to permit access to the camera, and they can choose Yes or No at that point. Until they do, the camera will not be usable. The app should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @'getCameraPermissionState'@ occasionally until it returns non-zero. On platforms that don\'t require explicit user approval (and perhaps in places where the user previously permitted access), the approval event might come immediately, but it might come seconds, minutes, or hours later!
+--
+--     [Returns]: an 'SDL_Camera' object or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameras', 'getCameraFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenCamera@.
+--                   The safe flavor is 'openCameraSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenCamera@, defined at @SDL3\/SDL_camera.h 352:42@
+openCamera
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> PtrConst.PtrConst SDL_CameraSpec
+  -- ^
+  --
+  --           [@spec@]: the desired format for data the device will provide. Can be NULL.
+  -> IO (BG.Ptr SDL_Camera)
+openCamera = Unsafe.sDL_OpenCamera
+
+-- | Open a video recording device (a \"camera\").
+--
+--     You can open the device with any reasonable spec, and if the hardware can\'t directly support it, it will convert data seamlessly to the requested format. This might incur overhead, including scaling of image data.
+--
+--     If you would rather accept whatever format the device offers, you can pass a NULL spec here and it will choose one for you (and you can use SDL_Surface\'s conversion\/scaling functions directly if necessary).
+--
+--     You can call @'getCameraFormat'@ to get the actual data format if passing a NULL spec here. You can see the exact specs a device can support without conversion with @'getCameraSupportedFormats'@.
+--
+--     SDL will not attempt to emulate framerate; it will try to set the hardware to the rate closest to the requested speed, but it won\'t attempt to limit or duplicate frames artificially; call @'getCameraFormat'@ to see the actual framerate of the opened the device, and check your timestamps if this is crucial to your app!
+--
+--     Note that the camera is not usable until the user approves its use! On some platforms, the operating system will prompt the user to permit access to the camera, and they can choose Yes or No at that point. Until they do, the camera will not be usable. The app should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @'getCameraPermissionState'@ occasionally until it returns non-zero. On platforms that don\'t require explicit user approval (and perhaps in places where the user previously permitted access), the approval event might come immediately, but it might come seconds, minutes, or hours later!
+--
+--     [Returns]: an 'SDL_Camera' object or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCameras', 'getCameraFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenCamera@.
+--                   The unsafe flavor is 'openCamera'
+--                   .
+--
+--     [C declaration]: @SDL_OpenCamera@, defined at @SDL3\/SDL_camera.h 352:42@
+openCameraSafe
+  :: SDL_CameraID
+  -- ^
+  --
+  --           [@instance_id@]: the camera device instance ID.
+  -> PtrConst.PtrConst SDL_CameraSpec
+  -- ^
+  --
+  --           [@spec@]: the desired format for data the device will provide. Can be NULL.
+  -> IO (BG.Ptr SDL_Camera)
+openCameraSafe = Safe.sDL_OpenCamera
+
+-- | Query if camera access has been approved by the user.
+--
+--     Cameras will not function between when the device is opened by the app and when the user permits access to the hardware. On some platforms, this presents as a popup dialog where the user has to explicitly approve access; on others the approval might be implicit and not alert the user at all.
+--
+--     This function can be used to check the status of that approval. It will return SDL_CAMERA_PERMISSION_STATE_PENDING if waiting for user response, SDL_CAMERA_PERMISSION_STATE_APPROVED if the camera is approved for use, and SDL_CAMERA_PERMISSION_STATE_DENIED if the user denied access.
+--
+--     Instead of polling with this function, you can wait for a SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event in the standard SDL event loop, which is guaranteed to be sent once when permission to use the camera is decided.
+--
+--     If a camera is declined, there\'s nothing to be done but call @'closeCamera'@ to dispose of it.
+--
+--     [Returns]: an 'SDL_CameraPermissionState' value indicating if access is granted, or @SDL_CAMERA_PERMISSION_STATE_PENDING@ if the decision is still pending.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openCamera', 'closeCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCameraPermissionState@.
+--                   The safe flavor is 'getCameraPermissionStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraPermissionState@, defined at @SDL3\/SDL_camera.h 387:55@
+getCameraPermissionState
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: the opened camera device to query.
+  -> IO SDL_CameraPermissionState
+getCameraPermissionState =
+  Unsafe.sDL_GetCameraPermissionState
+
+-- | Query if camera access has been approved by the user.
+--
+--     Cameras will not function between when the device is opened by the app and when the user permits access to the hardware. On some platforms, this presents as a popup dialog where the user has to explicitly approve access; on others the approval might be implicit and not alert the user at all.
+--
+--     This function can be used to check the status of that approval. It will return SDL_CAMERA_PERMISSION_STATE_PENDING if waiting for user response, SDL_CAMERA_PERMISSION_STATE_APPROVED if the camera is approved for use, and SDL_CAMERA_PERMISSION_STATE_DENIED if the user denied access.
+--
+--     Instead of polling with this function, you can wait for a SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event in the standard SDL event loop, which is guaranteed to be sent once when permission to use the camera is decided.
+--
+--     If a camera is declined, there\'s nothing to be done but call @'closeCamera'@ to dispose of it.
+--
+--     [Returns]: an 'SDL_CameraPermissionState' value indicating if access is granted, or @SDL_CAMERA_PERMISSION_STATE_PENDING@ if the decision is still pending.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openCamera', 'closeCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCameraPermissionState@.
+--                   The unsafe flavor is 'getCameraPermissionState'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraPermissionState@, defined at @SDL3\/SDL_camera.h 387:55@
+getCameraPermissionStateSafe
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: the opened camera device to query.
+  -> IO SDL_CameraPermissionState
+getCameraPermissionStateSafe =
+  Safe.sDL_GetCameraPermissionState
+
+-- | Get the instance ID of an opened camera.
+--
+--     [Returns]: the instance ID of the specified camera on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCameraID@.
+--                   The safe flavor is 'getCameraIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraID@, defined at @SDL3\/SDL_camera.h 402:42@
+getCameraID
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: an 'SDL_Camera' to query.
+  -> IO SDL_CameraID
+getCameraID = Unsafe.sDL_GetCameraID
+
+-- | Get the instance ID of an opened camera.
+--
+--     [Returns]: the instance ID of the specified camera on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCameraID@.
+--                   The unsafe flavor is 'getCameraID'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraID@, defined at @SDL3\/SDL_camera.h 402:42@
+getCameraIDSafe
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: an 'SDL_Camera' to query.
+  -> IO SDL_CameraID
+getCameraIDSafe = Safe.sDL_GetCameraID
+
+-- | Get the properties associated with an opened camera.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCameraProperties@.
+--                   The safe flavor is 'getCameraPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraProperties@, defined at @SDL3\/SDL_camera.h 415:46@
+getCameraProperties
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: the 'SDL_Camera' obtained from @'openCamera'@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getCameraProperties = Unsafe.sDL_GetCameraProperties
+
+-- | Get the properties associated with an opened camera.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCameraProperties@.
+--                   The unsafe flavor is 'getCameraProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetCameraProperties@, defined at @SDL3\/SDL_camera.h 415:46@
+getCameraPropertiesSafe
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: the 'SDL_Camera' obtained from @'openCamera'@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getCameraPropertiesSafe =
+  Safe.sDL_GetCameraProperties
+
+-- | Get the spec that a camera is using when generating images.
+--
+--     Note that this might not be the native format of the hardware, as SDL might be converting to this format behind the scenes.
+--
+--     If the system is waiting for the user to approve access to the camera, as some platforms require, this will return false, but this isn\'t necessarily a fatal error; you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @'getCameraPermissionState'@ occasionally until it returns non-zero.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCameraFormat@.
+--                   The safe flavor is 'getCameraFormatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetCameraFormat@, defined at @SDL3\/SDL_camera.h 441:34@
+getCameraFormat
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL_CameraSpec
+  -- ^
+  --
+  --           [@spec@]: the 'SDL_CameraSpec' to be initialized by this function.
+  -> IO Bool
+getCameraFormat =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetCameraFormat x00 x11)
+
+-- | Get the spec that a camera is using when generating images.
+--
+--     Note that this might not be the native format of the hardware, as SDL might be converting to this format behind the scenes.
+--
+--     If the system is waiting for the user to approve access to the camera, as some platforms require, this will return false, but this isn\'t necessarily a fatal error; you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @'getCameraPermissionState'@ occasionally until it returns non-zero.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCameraFormat@.
+--                   The unsafe flavor is 'getCameraFormat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetCameraFormat@, defined at @SDL3\/SDL_camera.h 441:34@
+getCameraFormatSafe
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL_CameraSpec
+  -- ^
+  --
+  --           [@spec@]: the 'SDL_CameraSpec' to be initialized by this function.
+  -> IO Bool
+getCameraFormatSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetCameraFormat x00 x11)
+
+-- | Acquire a frame.
+--
+--     The frame is a memory pointer to the image data, whose size and format are given by the spec requested when opening the device.
+--
+--     This is a non blocking API. If there is a frame available, a non-NULL surface is returned, and timestampNS will be filled with a non-zero value.
+--
+--     Note that an error case can also return NULL, but a NULL by itself is normal and just signifies that a new frame is not yet available. Note that even if a camera device fails outright (a USB camera is unplugged while in use, etc), SDL will send an event separately to notify the app, but continue to provide blank frames at ongoing intervals until @'closeCamera'@ is called, so real failure here is almost always an out of memory condition.
+--
+--     After use, the frame should be released with @'releaseCameraFrame'@. If you don\'t do this, the system may stop providing more video!
+--
+--     Do not call 'SDL3.Sys.Surface.destroySurface' on the returned surface! It must be given back to the camera subsystem with 'releaseCameraFrame'!
+--
+--     If the system is waiting for the user to approve access to the camera, as some platforms require, this will return NULL (no frames available); you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @'getCameraPermissionState'@ occasionally until it returns non-zero.
+--
+--     [Returns]: a new frame of video on success, NULL if none is currently available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'releaseCameraFrame'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AcquireCameraFrame@.
+--                   The safe flavor is 'acquireCameraFrameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_AcquireCameraFrame@, defined at @SDL3\/SDL_camera.h 484:43@
+acquireCameraFrame
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@timestampNS@]: a pointer filled in with the frame\'s timestamp, or 0 on error. Can be NULL.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+acquireCameraFrame = Unsafe.sDL_AcquireCameraFrame
+
+-- | Acquire a frame.
+--
+--     The frame is a memory pointer to the image data, whose size and format are given by the spec requested when opening the device.
+--
+--     This is a non blocking API. If there is a frame available, a non-NULL surface is returned, and timestampNS will be filled with a non-zero value.
+--
+--     Note that an error case can also return NULL, but a NULL by itself is normal and just signifies that a new frame is not yet available. Note that even if a camera device fails outright (a USB camera is unplugged while in use, etc), SDL will send an event separately to notify the app, but continue to provide blank frames at ongoing intervals until @'closeCamera'@ is called, so real failure here is almost always an out of memory condition.
+--
+--     After use, the frame should be released with @'releaseCameraFrame'@. If you don\'t do this, the system may stop providing more video!
+--
+--     Do not call 'SDL3.Sys.Surface.destroySurface' on the returned surface! It must be given back to the camera subsystem with 'releaseCameraFrame'!
+--
+--     If the system is waiting for the user to approve access to the camera, as some platforms require, this will return NULL (no frames available); you should either wait for an SDL_EVENT_CAMERA_DEVICE_APPROVED (or SDL_EVENT_CAMERA_DEVICE_DENIED) event, or poll @'getCameraPermissionState'@ occasionally until it returns non-zero.
+--
+--     [Returns]: a new frame of video on success, NULL if none is currently available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'releaseCameraFrame'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AcquireCameraFrame@.
+--                   The unsafe flavor is 'acquireCameraFrame'
+--                   .
+--
+--     [C declaration]: @SDL_AcquireCameraFrame@, defined at @SDL3\/SDL_camera.h 484:43@
+acquireCameraFrameSafe
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@timestampNS@]: a pointer filled in with the frame\'s timestamp, or 0 on error. Can be NULL.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+acquireCameraFrameSafe = Safe.sDL_AcquireCameraFrame
+
+-- | Release a frame of video acquired from a camera.
+--
+--     Let the back-end re-use the internal buffer for camera.
+--
+--     This function /must/ be called only on surface objects returned by @'acquireCameraFrame'@. This function should be called as quickly as possible after acquisition, as SDL keeps a small FIFO queue of surfaces for video frames; if surfaces aren\'t released in a timely manner, SDL may drop upcoming video frames from the camera.
+--
+--     If the app needs to keep the surface for a significant time, they should make a copy of it and release the original.
+--
+--     The app should not use the surface again after calling this function; assume the surface is freed and the pointer is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'acquireCameraFrame'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReleaseCameraFrame@.
+--                   The safe flavor is 'releaseCameraFrameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseCameraFrame@, defined at @SDL3\/SDL_camera.h 512:34@
+releaseCameraFrame
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@frame@]: the video frame surface to release.
+  -> IO ()
+releaseCameraFrame = Unsafe.sDL_ReleaseCameraFrame
+
+-- | Release a frame of video acquired from a camera.
+--
+--     Let the back-end re-use the internal buffer for camera.
+--
+--     This function /must/ be called only on surface objects returned by @'acquireCameraFrame'@. This function should be called as quickly as possible after acquisition, as SDL keeps a small FIFO queue of surfaces for video frames; if surfaces aren\'t released in a timely manner, SDL may drop upcoming video frames from the camera.
+--
+--     If the app needs to keep the surface for a significant time, they should make a copy of it and release the original.
+--
+--     The app should not use the surface again after calling this function; assume the surface is freed and the pointer is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'acquireCameraFrame'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReleaseCameraFrame@.
+--                   The unsafe flavor is 'releaseCameraFrame'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseCameraFrame@, defined at @SDL3\/SDL_camera.h 512:34@
+releaseCameraFrameSafe
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@frame@]: the video frame surface to release.
+  -> IO ()
+releaseCameraFrameSafe = Safe.sDL_ReleaseCameraFrame
+
+-- | Use this function to shut down camera processing and close the camera device.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but no thread may reference @device@ once this function is called.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CloseCamera@.
+--                   The safe flavor is 'closeCameraSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CloseCamera@, defined at @SDL3\/SDL_camera.h 527:34@
+closeCamera
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> IO ()
+closeCamera = Unsafe.sDL_CloseCamera
+
+-- | Use this function to shut down camera processing and close the camera device.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but no thread may reference @device@ once this function is called.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openCamera'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CloseCamera@.
+--                   The unsafe flavor is 'closeCamera'
+--                   .
+--
+--     [C declaration]: @SDL_CloseCamera@, defined at @SDL3\/SDL_camera.h 527:34@
+closeCameraSafe
+  :: BG.Ptr SDL_Camera
+  -- ^
+  --
+  --           [@camera@]: opened camera device.
+  -> IO ()
+closeCameraSafe = Safe.sDL_CloseCamera
diff --git a/src/SDL3/Sys/Clipboard.hs b/src/SDL3/Sys/Clipboard.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Clipboard.hs
@@ -0,0 +1,638 @@
+-- | SDL provides access to the system clipboard, both for reading information from other processes and publishing information of its own.
+--
+--     This is not just text! SDL apps can access and publish data by mimetype.
+--
+--     Basic use (text)
+--
+--     Obtaining and publishing simple text to the system clipboard is as easy as calling @'getClipboardText'@ and @'setClipboardText'@, respectively. These deal with C strings in UTF-8 encoding. Data transmission and encoding conversion is completely managed by SDL.
+--
+--     Clipboard callbacks (data other than text)
+--
+--     Things get more complicated when the clipboard contains something other than text. Not only can the system clipboard contain data of any type, in some cases it can contain the same data in different formats! For example, an image painting app might let the user copy a graphic to the clipboard, and offers it in .BMP, .JPG, or .PNG format for other apps to consume.
+--
+--     Obtaining clipboard data (\"pasting\") like this is a matter of calling @'getClipboardData'@ and telling it the mimetype of the data you want. But how does one know if that format is available? @'hasClipboardData'@ can report if a specific mimetype is offered, and @'getClipboardMimeTypes'@ can provide the entire list of mimetypes available, so the app can decide what to do with the data and what formats it can support.
+--
+--     Setting the clipboard (\"copying\") to arbitrary data is done with 'setClipboardDataSafe'. The app does not provide the data in this call, but rather the mimetypes it is willing to provide and a callback function. During the callback, the app will generate the data. This allows massive data sets to be provided to the clipboard, without any data being copied before it is explicitly requested. More specifically, it allows an app to offer data in multiple formats without providing a copy of all of them upfront. If the app has an image that it could provide in PNG or JPG format, it doesn\'t have to encode it to either of those unless and until something tries to paste it.
+--
+--     Primary Selection
+--
+--     The X11 and Wayland video targets have a concept of the \"primary selection\" in addition to the usual clipboard. This is generally highlighted (but not explicitly copied) text from various apps. SDL offers APIs for this through @'getPrimarySelectionText'@ and @'setPrimarySelectionText'@. SDL offers these APIs on platforms without this concept, too, but only so far that it will keep a copy of a string that the app sets for later retrieval; the operating system will not ever attempt to change the string externally if it doesn\'t support a primary selection. Put UTF-8 text into the clipboard.
+--
+--     [@text@]: the text to store in the clipboard.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getClipboardText'
+--
+--     [See also]: 'hasClipboardText'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Clipboard.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Clipboard (
+  module SDL3.Sys.Bindgen.Clipboard,
+
+  -- * Function aliases
+  SDL3.Sys.Clipboard.setClipboardText,
+  SDL3.Sys.Clipboard.setClipboardTextSafe,
+  SDL3.Sys.Clipboard.getClipboardText,
+  SDL3.Sys.Clipboard.getClipboardTextSafe,
+  SDL3.Sys.Clipboard.hasClipboardText,
+  SDL3.Sys.Clipboard.hasClipboardTextSafe,
+  SDL3.Sys.Clipboard.setPrimarySelectionText,
+  SDL3.Sys.Clipboard.setPrimarySelectionTextSafe,
+  SDL3.Sys.Clipboard.getPrimarySelectionText,
+  SDL3.Sys.Clipboard.getPrimarySelectionTextSafe,
+  SDL3.Sys.Clipboard.hasPrimarySelectionText,
+  SDL3.Sys.Clipboard.hasPrimarySelectionTextSafe,
+  SDL3.Sys.Clipboard.setClipboardDataSafe,
+  SDL3.Sys.Clipboard.clearClipboardData,
+  SDL3.Sys.Clipboard.clearClipboardDataSafe,
+  SDL3.Sys.Clipboard.getClipboardData,
+  SDL3.Sys.Clipboard.getClipboardDataSafe,
+  SDL3.Sys.Clipboard.hasClipboardData,
+  SDL3.Sys.Clipboard.hasClipboardDataSafe,
+  SDL3.Sys.Clipboard.getClipboardMimeTypes,
+  SDL3.Sys.Clipboard.getClipboardMimeTypesSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Clipboard
+import SDL3.Sys.Bindgen.Clipboard.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Clipboard.Unsafe qualified as Unsafe
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetClipboardText@.
+--                   The safe flavor is 'setClipboardTextSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetClipboardText@, defined at @SDL3\/SDL_clipboard.h 104:34@
+setClipboardText
+  :: PtrConst.PtrConst BG.CChar
+  -- ^ [C declaration]: @text@
+  -> IO Bool
+setClipboardText =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_SetClipboardText x00)
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetClipboardText@.
+--                   The unsafe flavor is 'setClipboardText'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetClipboardText@, defined at @SDL3\/SDL_clipboard.h 104:34@
+setClipboardTextSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^ [C declaration]: @text@
+  -> IO Bool
+setClipboardTextSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_SetClipboardText x00)
+
+-- | Get UTF-8 text from the clipboard.
+--
+--     This function returns an empty string if there is not enough memory left for a copy of the clipboard\'s content.
+--
+--     [Returns]: the clipboard text on success or an empty string on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasClipboardText', 'setClipboardText'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetClipboardText@.
+--                   The safe flavor is 'getClipboardTextSafe'
+--                   : when this app owns the clipboard, its data-provider callback runs synchronously.
+--
+--     [C declaration]: @SDL_GetClipboardText@, defined at @SDL3\/SDL_clipboard.h 123:36@
+getClipboardText :: IO (BG.Ptr BG.CChar)
+getClipboardText = Unsafe.sDL_GetClipboardText
+
+-- | Get UTF-8 text from the clipboard.
+--
+--     This function returns an empty string if there is not enough memory left for a copy of the clipboard\'s content.
+--
+--     [Returns]: the clipboard text on success or an empty string on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasClipboardText', 'setClipboardText'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetClipboardText@.
+--                   The unsafe flavor is 'getClipboardText'
+--                   : when this app owns the clipboard, its data-provider callback runs synchronously.
+--
+--     [C declaration]: @SDL_GetClipboardText@, defined at @SDL3\/SDL_clipboard.h 123:36@
+getClipboardTextSafe :: IO (BG.Ptr BG.CChar)
+getClipboardTextSafe = Safe.sDL_GetClipboardText
+
+-- | Query whether the clipboard exists and contains a non-empty text string.
+--
+--     [Returns]: true if the clipboard has text, or false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getClipboardText', 'setClipboardText'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasClipboardText@.
+--                   The safe flavor is 'hasClipboardTextSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasClipboardText@, defined at @SDL3\/SDL_clipboard.h 137:34@
+hasClipboardText :: IO Bool
+hasClipboardText =
+  fmap CBool.toBool Unsafe.sDL_HasClipboardText
+
+-- | Query whether the clipboard exists and contains a non-empty text string.
+--
+--     [Returns]: true if the clipboard has text, or false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getClipboardText', 'setClipboardText'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasClipboardText@.
+--                   The unsafe flavor is 'hasClipboardText'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasClipboardText@, defined at @SDL3\/SDL_clipboard.h 137:34@
+hasClipboardTextSafe :: IO Bool
+hasClipboardTextSafe =
+  fmap CBool.toBool Safe.sDL_HasClipboardText
+
+-- | Put UTF-8 text into the primary selection.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPrimarySelectionText', 'hasPrimarySelectionText'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetPrimarySelectionText@.
+--                   The safe flavor is 'setPrimarySelectionTextSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 153:34@
+setPrimarySelectionText
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: the text to store in the primary selection.
+  -> IO Bool
+setPrimarySelectionText =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_SetPrimarySelectionText x00)
+
+-- | Put UTF-8 text into the primary selection.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPrimarySelectionText', 'hasPrimarySelectionText'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetPrimarySelectionText@.
+--                   The unsafe flavor is 'setPrimarySelectionText'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 153:34@
+setPrimarySelectionTextSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: the text to store in the primary selection.
+  -> IO Bool
+setPrimarySelectionTextSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_SetPrimarySelectionText x00)
+
+-- | Get UTF-8 text from the primary selection.
+--
+--     This function returns an empty string if there is not enough memory left for a copy of the primary selection\'s content.
+--
+--     [Returns]: the primary selection text on success or an empty string on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasPrimarySelectionText', 'setPrimarySelectionText'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPrimarySelectionText@.
+--                   The safe flavor is 'getPrimarySelectionTextSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 172:36@
+getPrimarySelectionText :: IO (BG.Ptr BG.CChar)
+getPrimarySelectionText =
+  Unsafe.sDL_GetPrimarySelectionText
+
+-- | Get UTF-8 text from the primary selection.
+--
+--     This function returns an empty string if there is not enough memory left for a copy of the primary selection\'s content.
+--
+--     [Returns]: the primary selection text on success or an empty string on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasPrimarySelectionText', 'setPrimarySelectionText'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPrimarySelectionText@.
+--                   The unsafe flavor is 'getPrimarySelectionText'
+--                   .
+--
+--     [C declaration]: @SDL_GetPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 172:36@
+getPrimarySelectionTextSafe :: IO (BG.Ptr BG.CChar)
+getPrimarySelectionTextSafe =
+  Safe.sDL_GetPrimarySelectionText
+
+-- | Query whether the primary selection exists and contains a non-empty text string.
+--
+--     [Returns]: true if the primary selection has text, or false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPrimarySelectionText', 'setPrimarySelectionText'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasPrimarySelectionText@.
+--                   The safe flavor is 'hasPrimarySelectionTextSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 187:34@
+hasPrimarySelectionText :: IO Bool
+hasPrimarySelectionText =
+  fmap CBool.toBool Unsafe.sDL_HasPrimarySelectionText
+
+-- | Query whether the primary selection exists and contains a non-empty text string.
+--
+--     [Returns]: true if the primary selection has text, or false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPrimarySelectionText', 'setPrimarySelectionText'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasPrimarySelectionText@.
+--                   The unsafe flavor is 'hasPrimarySelectionText'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasPrimarySelectionText@, defined at @SDL3\/SDL_clipboard.h 187:34@
+hasPrimarySelectionTextSafe :: IO Bool
+hasPrimarySelectionTextSafe =
+  fmap CBool.toBool Safe.sDL_HasPrimarySelectionText
+
+-- | Offer clipboard data to the OS.
+--
+--     Tell the operating system that the application is offering clipboard data for each of the provided mime-types. Once another application requests the data the callback function will be called, allowing it to generate and respond with the data for the requested mime-type.
+--
+--     The size of text data does not include any terminator, and the text does not need to be null-terminated (e.g., you can directly copy a portion of a document).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'clearClipboardData', 'getClipboardData', 'hasClipboardData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetClipboardData@.
+--                   The unsafe import is not exported
+--                   : may invoke the previous cleanup callback synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Clipboard.Unsafe.sDL_SetClipboardData@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetClipboardData@, defined at @SDL3\/SDL_clipboard.h 255:34@
+setClipboardDataSafe
+  :: SDL_ClipboardDataCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to the function that provides the clipboard data.
+  -> SDL_ClipboardCleanupCallback
+  -- ^
+  --
+  --           [@cleanup@]: a function pointer to the function that cleans up the clipboard data.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an opaque pointer that will be forwarded to the callbacks.
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@mime_types@]: a list of mime-types that are being offered. SDL copies the given list.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@num_mime_types@]: the number of mime-types in the mime_types list.
+  -> IO Bool
+setClipboardDataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_SetClipboardData x00 x11 x22 x33 (Coerce.coerce x44))
+
+-- | Clear the clipboard data.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setClipboardDataSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ClearClipboardData@.
+--                   The safe flavor is 'clearClipboardDataSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearClipboardData@, defined at @SDL3\/SDL_clipboard.h 269:34@
+clearClipboardData :: IO Bool
+clearClipboardData =
+  fmap CBool.toBool Unsafe.sDL_ClearClipboardData
+
+-- | Clear the clipboard data.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setClipboardDataSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ClearClipboardData@.
+--                   The unsafe flavor is 'clearClipboardData'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearClipboardData@, defined at @SDL3\/SDL_clipboard.h 269:34@
+clearClipboardDataSafe :: IO Bool
+clearClipboardDataSafe =
+  fmap CBool.toBool Safe.sDL_ClearClipboardData
+
+-- | Get the data from the clipboard for a given mime type.
+--
+--     The size of text data does not include the terminator, but the text is guaranteed to be null-terminated.
+--
+--     [Returns]: the retrieved data buffer or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasClipboardData', 'setClipboardDataSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetClipboardData@.
+--                   The safe flavor is 'getClipboardDataSafe'
+--                   : when this app owns the clipboard, its data-provider callback runs synchronously.
+--
+--     [C declaration]: @SDL_GetClipboardData@, defined at @SDL3\/SDL_clipboard.h 290:36@
+getClipboardData
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mime_type@]: the mime type to read from the clipboard.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: a pointer filled in with the length of the returned data.
+  -> IO (BG.Ptr BG.Void)
+getClipboardData = Unsafe.sDL_GetClipboardData
+
+-- | Get the data from the clipboard for a given mime type.
+--
+--     The size of text data does not include the terminator, but the text is guaranteed to be null-terminated.
+--
+--     [Returns]: the retrieved data buffer or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasClipboardData', 'setClipboardDataSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetClipboardData@.
+--                   The unsafe flavor is 'getClipboardData'
+--                   : when this app owns the clipboard, its data-provider callback runs synchronously.
+--
+--     [C declaration]: @SDL_GetClipboardData@, defined at @SDL3\/SDL_clipboard.h 290:36@
+getClipboardDataSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mime_type@]: the mime type to read from the clipboard.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: a pointer filled in with the length of the returned data.
+  -> IO (BG.Ptr BG.Void)
+getClipboardDataSafe = Safe.sDL_GetClipboardData
+
+-- | Query whether there is data in the clipboard for the provided mime type.
+--
+--     [Returns]: true if data exists in the clipboard for the provided mime type, false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setClipboardDataSafe', 'getClipboardData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasClipboardData@.
+--                   The safe flavor is 'hasClipboardDataSafe'
+--                   : when this app owns the clipboard, its data-provider callback runs synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasClipboardData@, defined at @SDL3\/SDL_clipboard.h 306:34@
+hasClipboardData
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mime_type@]: the mime type to check for data.
+  -> IO Bool
+hasClipboardData =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_HasClipboardData x00)
+
+-- | Query whether there is data in the clipboard for the provided mime type.
+--
+--     [Returns]: true if data exists in the clipboard for the provided mime type, false if it does not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setClipboardDataSafe', 'getClipboardData'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasClipboardData@.
+--                   The unsafe flavor is 'hasClipboardData'
+--                   : when this app owns the clipboard, its data-provider callback runs synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasClipboardData@, defined at @SDL3\/SDL_clipboard.h 306:34@
+hasClipboardDataSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mime_type@]: the mime type to check for data.
+  -> IO Bool
+hasClipboardDataSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_HasClipboardData x00)
+
+-- | Retrieve the list of mime types available in the clipboard.
+--
+--     [Returns]: a null-terminated array of strings with mime types, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setClipboardDataSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetClipboardMimeTypes@.
+--                   The safe flavor is 'getClipboardMimeTypesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetClipboardMimeTypes@, defined at @SDL3\/SDL_clipboard.h 323:37@
+getClipboardMimeTypes
+  :: BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@num_mime_types@]: a pointer filled with the number of mime types, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+getClipboardMimeTypes =
+  Unsafe.sDL_GetClipboardMimeTypes
+
+-- | Retrieve the list of mime types available in the clipboard.
+--
+--     [Returns]: a null-terminated array of strings with mime types, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setClipboardDataSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetClipboardMimeTypes@.
+--                   The unsafe flavor is 'getClipboardMimeTypes'
+--                   .
+--
+--     [C declaration]: @SDL_GetClipboardMimeTypes@, defined at @SDL3\/SDL_clipboard.h 323:37@
+getClipboardMimeTypesSafe
+  :: BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@num_mime_types@]: a pointer filled with the number of mime types, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+getClipboardMimeTypesSafe =
+  Safe.sDL_GetClipboardMimeTypes
diff --git a/src/SDL3/Sys/Cpuinfo.hs b/src/SDL3/Sys/Cpuinfo.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Cpuinfo.hs
@@ -0,0 +1,995 @@
+-- | CPU feature detection for SDL.
+--
+--     These functions are largely concerned with reporting if the system has access to various SIMD instruction sets, but also has other important info to share, such as system RAM size and number of logical CPU cores.
+--
+--     CPU instruction set checks, like @'hasSSE'@ and @'hasNEON'@, are available on all platforms, even if they don\'t make sense (an ARM processor will never have SSE and an x86 processor will never have NEON, for example, but these functions still exist and will simply return false in these cases). A guess for the cacheline size used for padding.
+--
+--     Most x86 processors have a 64 byte cache line. The 64-bit PowerPC processors have a 128 byte cache line. We use the larger value to be generally safe.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Cpuinfo.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Cpuinfo (
+  module SDL3.Sys.Bindgen.Cpuinfo,
+
+  -- * Function aliases
+  SDL3.Sys.Cpuinfo.getNumLogicalCPUCores,
+  SDL3.Sys.Cpuinfo.getNumLogicalCPUCoresSafe,
+  SDL3.Sys.Cpuinfo.getCPUCacheLineSize,
+  SDL3.Sys.Cpuinfo.getCPUCacheLineSizeSafe,
+  SDL3.Sys.Cpuinfo.hasAltiVec,
+  SDL3.Sys.Cpuinfo.hasAltiVecSafe,
+  SDL3.Sys.Cpuinfo.hasMMX,
+  SDL3.Sys.Cpuinfo.hasMMXSafe,
+  SDL3.Sys.Cpuinfo.hasSSE,
+  SDL3.Sys.Cpuinfo.hasSSESafe,
+  SDL3.Sys.Cpuinfo.hasSSE2,
+  SDL3.Sys.Cpuinfo.hasSSE2Safe,
+  SDL3.Sys.Cpuinfo.hasSSE3,
+  SDL3.Sys.Cpuinfo.hasSSE3Safe,
+  SDL3.Sys.Cpuinfo.hasSSE41,
+  SDL3.Sys.Cpuinfo.hasSSE41Safe,
+  SDL3.Sys.Cpuinfo.hasSSE42,
+  SDL3.Sys.Cpuinfo.hasSSE42Safe,
+  SDL3.Sys.Cpuinfo.hasAVX,
+  SDL3.Sys.Cpuinfo.hasAVXSafe,
+  SDL3.Sys.Cpuinfo.hasAVX2,
+  SDL3.Sys.Cpuinfo.hasAVX2Safe,
+  SDL3.Sys.Cpuinfo.hasAVX512F,
+  SDL3.Sys.Cpuinfo.hasAVX512FSafe,
+  SDL3.Sys.Cpuinfo.hasARMSIMD,
+  SDL3.Sys.Cpuinfo.hasARMSIMDSafe,
+  SDL3.Sys.Cpuinfo.hasNEON,
+  SDL3.Sys.Cpuinfo.hasNEONSafe,
+  SDL3.Sys.Cpuinfo.hasLSX,
+  SDL3.Sys.Cpuinfo.hasLSXSafe,
+  SDL3.Sys.Cpuinfo.hasLASX,
+  SDL3.Sys.Cpuinfo.hasLASXSafe,
+  SDL3.Sys.Cpuinfo.getSystemRAM,
+  SDL3.Sys.Cpuinfo.getSystemRAMSafe,
+  SDL3.Sys.Cpuinfo.getSIMDAlignment,
+  SDL3.Sys.Cpuinfo.getSIMDAlignmentSafe,
+  SDL3.Sys.Cpuinfo.getSystemPageSize,
+  SDL3.Sys.Cpuinfo.getSystemPageSizeSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Cpuinfo
+import SDL3.Sys.Bindgen.Cpuinfo.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Cpuinfo.Unsafe qualified as Unsafe
+
+-- | Get the number of logical CPU cores available.
+--
+--     [Returns]: the total number of logical CPU cores. On CPUs that include technologies such as hyperthreading, the number of logical cores may be more than the number of physical cores.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumLogicalCPUCores@.
+--                   The safe flavor is 'getNumLogicalCPUCoresSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumLogicalCPUCores@, defined at @SDL3\/SDL_cpuinfo.h 73:33@
+getNumLogicalCPUCores :: IO BG.Int32
+getNumLogicalCPUCores =
+  fmap Coerce.coerce Unsafe.sDL_GetNumLogicalCPUCores
+
+-- | Get the number of logical CPU cores available.
+--
+--     [Returns]: the total number of logical CPU cores. On CPUs that include technologies such as hyperthreading, the number of logical cores may be more than the number of physical cores.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumLogicalCPUCores@.
+--                   The unsafe flavor is 'getNumLogicalCPUCores'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumLogicalCPUCores@, defined at @SDL3\/SDL_cpuinfo.h 73:33@
+getNumLogicalCPUCoresSafe :: IO BG.Int32
+getNumLogicalCPUCoresSafe =
+  fmap Coerce.coerce Safe.sDL_GetNumLogicalCPUCores
+
+-- | Determine the L1 cache line size of the CPU.
+--
+--     This is useful for determining multi-threaded structure padding or SIMD prefetch sizes.
+--
+--     [Returns]: the L1 cache line size of the CPU, in bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCPUCacheLineSize@.
+--                   The safe flavor is 'getCPUCacheLineSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetCPUCacheLineSize@, defined at @SDL3\/SDL_cpuinfo.h 87:33@
+getCPUCacheLineSize :: IO BG.Int32
+getCPUCacheLineSize =
+  fmap Coerce.coerce Unsafe.sDL_GetCPUCacheLineSize
+
+-- | Determine the L1 cache line size of the CPU.
+--
+--     This is useful for determining multi-threaded structure padding or SIMD prefetch sizes.
+--
+--     [Returns]: the L1 cache line size of the CPU, in bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCPUCacheLineSize@.
+--                   The unsafe flavor is 'getCPUCacheLineSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetCPUCacheLineSize@, defined at @SDL3\/SDL_cpuinfo.h 87:33@
+getCPUCacheLineSizeSafe :: IO BG.Int32
+getCPUCacheLineSizeSafe =
+  fmap Coerce.coerce Safe.sDL_GetCPUCacheLineSize
+
+-- | Determine whether the CPU has AltiVec features.
+--
+--     This always returns false on CPUs that aren\'t using PowerPC instruction sets.
+--
+--     [Returns]: true if the CPU has AltiVec features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasAltiVec@.
+--                   The safe flavor is 'hasAltiVecSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasAltiVec@, defined at @SDL3\/SDL_cpuinfo.h 101:34@
+hasAltiVec :: IO Bool
+hasAltiVec = fmap CBool.toBool Unsafe.sDL_HasAltiVec
+
+-- | Determine whether the CPU has AltiVec features.
+--
+--     This always returns false on CPUs that aren\'t using PowerPC instruction sets.
+--
+--     [Returns]: true if the CPU has AltiVec features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasAltiVec@.
+--                   The unsafe flavor is 'hasAltiVec'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasAltiVec@, defined at @SDL3\/SDL_cpuinfo.h 101:34@
+hasAltiVecSafe :: IO Bool
+hasAltiVecSafe =
+  fmap CBool.toBool Safe.sDL_HasAltiVec
+
+-- | Determine whether the CPU has MMX features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has MMX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasMMX@.
+--                   The safe flavor is 'hasMMXSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasMMX@, defined at @SDL3\/SDL_cpuinfo.h 114:34@
+hasMMX :: IO Bool
+hasMMX = fmap CBool.toBool Unsafe.sDL_HasMMX
+
+-- | Determine whether the CPU has MMX features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has MMX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasMMX@.
+--                   The unsafe flavor is 'hasMMX'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasMMX@, defined at @SDL3\/SDL_cpuinfo.h 114:34@
+hasMMXSafe :: IO Bool
+hasMMXSafe = fmap CBool.toBool Safe.sDL_HasMMX
+
+-- | Determine whether the CPU has SSE features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasSSE2', 'hasSSE3', 'hasSSE41', 'hasSSE42'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasSSE@.
+--                   The safe flavor is 'hasSSESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasSSE@, defined at @SDL3\/SDL_cpuinfo.h 132:34@
+hasSSE :: IO Bool
+hasSSE = fmap CBool.toBool Unsafe.sDL_HasSSE
+
+-- | Determine whether the CPU has SSE features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasSSE2', 'hasSSE3', 'hasSSE41', 'hasSSE42'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasSSE@.
+--                   The unsafe flavor is 'hasSSE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasSSE@, defined at @SDL3\/SDL_cpuinfo.h 132:34@
+hasSSESafe :: IO Bool
+hasSSESafe = fmap CBool.toBool Safe.sDL_HasSSE
+
+-- | Determine whether the CPU has SSE2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasSSE', 'hasSSE3', 'hasSSE41', 'hasSSE42'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasSSE2@.
+--                   The safe flavor is 'hasSSE2Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasSSE2@, defined at @SDL3\/SDL_cpuinfo.h 150:34@
+hasSSE2 :: IO Bool
+hasSSE2 = fmap CBool.toBool Unsafe.sDL_HasSSE2
+
+-- | Determine whether the CPU has SSE2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasSSE', 'hasSSE3', 'hasSSE41', 'hasSSE42'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasSSE2@.
+--                   The unsafe flavor is 'hasSSE2'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasSSE2@, defined at @SDL3\/SDL_cpuinfo.h 150:34@
+hasSSE2Safe :: IO Bool
+hasSSE2Safe = fmap CBool.toBool Safe.sDL_HasSSE2
+
+-- | Determine whether the CPU has SSE3 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE3 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasSSE', 'hasSSE2', 'hasSSE41', 'hasSSE42'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasSSE3@.
+--                   The safe flavor is 'hasSSE3Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasSSE3@, defined at @SDL3\/SDL_cpuinfo.h 168:34@
+hasSSE3 :: IO Bool
+hasSSE3 = fmap CBool.toBool Unsafe.sDL_HasSSE3
+
+-- | Determine whether the CPU has SSE3 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE3 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasSSE', 'hasSSE2', 'hasSSE41', 'hasSSE42'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasSSE3@.
+--                   The unsafe flavor is 'hasSSE3'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasSSE3@, defined at @SDL3\/SDL_cpuinfo.h 168:34@
+hasSSE3Safe :: IO Bool
+hasSSE3Safe = fmap CBool.toBool Safe.sDL_HasSSE3
+
+-- | Determine whether the CPU has SSE4.1 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE4.1 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasSSE', 'hasSSE2', 'hasSSE3', 'hasSSE42'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasSSE41@.
+--                   The safe flavor is 'hasSSE41Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasSSE41@, defined at @SDL3\/SDL_cpuinfo.h 186:34@
+hasSSE41 :: IO Bool
+hasSSE41 = fmap CBool.toBool Unsafe.sDL_HasSSE41
+
+-- | Determine whether the CPU has SSE4.1 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE4.1 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasSSE', 'hasSSE2', 'hasSSE3', 'hasSSE42'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasSSE41@.
+--                   The unsafe flavor is 'hasSSE41'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasSSE41@, defined at @SDL3\/SDL_cpuinfo.h 186:34@
+hasSSE41Safe :: IO Bool
+hasSSE41Safe = fmap CBool.toBool Safe.sDL_HasSSE41
+
+-- | Determine whether the CPU has SSE4.2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE4.2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasSSE', 'hasSSE2', 'hasSSE3', 'hasSSE41'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasSSE42@.
+--                   The safe flavor is 'hasSSE42Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasSSE42@, defined at @SDL3\/SDL_cpuinfo.h 204:34@
+hasSSE42 :: IO Bool
+hasSSE42 = fmap CBool.toBool Unsafe.sDL_HasSSE42
+
+-- | Determine whether the CPU has SSE4.2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has SSE4.2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasSSE', 'hasSSE2', 'hasSSE3', 'hasSSE41'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasSSE42@.
+--                   The unsafe flavor is 'hasSSE42'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasSSE42@, defined at @SDL3\/SDL_cpuinfo.h 204:34@
+hasSSE42Safe :: IO Bool
+hasSSE42Safe = fmap CBool.toBool Safe.sDL_HasSSE42
+
+-- | Determine whether the CPU has AVX features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasAVX2', 'hasAVX512F'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasAVX@.
+--                   The safe flavor is 'hasAVXSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasAVX@, defined at @SDL3\/SDL_cpuinfo.h 220:34@
+hasAVX :: IO Bool
+hasAVX = fmap CBool.toBool Unsafe.sDL_HasAVX
+
+-- | Determine whether the CPU has AVX features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasAVX2', 'hasAVX512F'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasAVX@.
+--                   The unsafe flavor is 'hasAVX'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasAVX@, defined at @SDL3\/SDL_cpuinfo.h 220:34@
+hasAVXSafe :: IO Bool
+hasAVXSafe = fmap CBool.toBool Safe.sDL_HasAVX
+
+-- | Determine whether the CPU has AVX2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasAVX', 'hasAVX512F'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasAVX2@.
+--                   The safe flavor is 'hasAVX2Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasAVX2@, defined at @SDL3\/SDL_cpuinfo.h 236:34@
+hasAVX2 :: IO Bool
+hasAVX2 = fmap CBool.toBool Unsafe.sDL_HasAVX2
+
+-- | Determine whether the CPU has AVX2 features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX2 features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasAVX', 'hasAVX512F'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasAVX2@.
+--                   The unsafe flavor is 'hasAVX2'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasAVX2@, defined at @SDL3\/SDL_cpuinfo.h 236:34@
+hasAVX2Safe :: IO Bool
+hasAVX2Safe = fmap CBool.toBool Safe.sDL_HasAVX2
+
+-- | Determine whether the CPU has AVX-512F (foundation) features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX-512F features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasAVX', 'hasAVX2'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasAVX512F@.
+--                   The safe flavor is 'hasAVX512FSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasAVX512F@, defined at @SDL3\/SDL_cpuinfo.h 252:34@
+hasAVX512F :: IO Bool
+hasAVX512F = fmap CBool.toBool Unsafe.sDL_HasAVX512F
+
+-- | Determine whether the CPU has AVX-512F (foundation) features.
+--
+--     This always returns false on CPUs that aren\'t using Intel instruction sets.
+--
+--     [Returns]: true if the CPU has AVX-512F features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasAVX', 'hasAVX2'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasAVX512F@.
+--                   The unsafe flavor is 'hasAVX512F'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasAVX512F@, defined at @SDL3\/SDL_cpuinfo.h 252:34@
+hasAVX512FSafe :: IO Bool
+hasAVX512FSafe =
+  fmap CBool.toBool Safe.sDL_HasAVX512F
+
+-- | Determine whether the CPU has ARM SIMD (ARMv6) features.
+--
+--     This is different from ARM NEON, which is a different instruction set.
+--
+--     This always returns false on CPUs that aren\'t using ARM instruction sets.
+--
+--     [Returns]: true if the CPU has ARM SIMD features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasNEON'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasARMSIMD@.
+--                   The safe flavor is 'hasARMSIMDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasARMSIMD@, defined at @SDL3\/SDL_cpuinfo.h 269:34@
+hasARMSIMD :: IO Bool
+hasARMSIMD = fmap CBool.toBool Unsafe.sDL_HasARMSIMD
+
+-- | Determine whether the CPU has ARM SIMD (ARMv6) features.
+--
+--     This is different from ARM NEON, which is a different instruction set.
+--
+--     This always returns false on CPUs that aren\'t using ARM instruction sets.
+--
+--     [Returns]: true if the CPU has ARM SIMD features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasNEON'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasARMSIMD@.
+--                   The unsafe flavor is 'hasARMSIMD'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasARMSIMD@, defined at @SDL3\/SDL_cpuinfo.h 269:34@
+hasARMSIMDSafe :: IO Bool
+hasARMSIMDSafe =
+  fmap CBool.toBool Safe.sDL_HasARMSIMD
+
+-- | Determine whether the CPU has NEON (ARM SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using ARM instruction sets.
+--
+--     [Returns]: true if the CPU has ARM NEON features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasNEON@.
+--                   The safe flavor is 'hasNEONSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasNEON@, defined at @SDL3\/SDL_cpuinfo.h 282:34@
+hasNEON :: IO Bool
+hasNEON = fmap CBool.toBool Unsafe.sDL_HasNEON
+
+-- | Determine whether the CPU has NEON (ARM SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using ARM instruction sets.
+--
+--     [Returns]: true if the CPU has ARM NEON features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasNEON@.
+--                   The unsafe flavor is 'hasNEON'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasNEON@, defined at @SDL3\/SDL_cpuinfo.h 282:34@
+hasNEONSafe :: IO Bool
+hasNEONSafe = fmap CBool.toBool Safe.sDL_HasNEON
+
+-- | Determine whether the CPU has LSX (LOONGARCH SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using LOONGARCH instruction sets.
+--
+--     [Returns]: true if the CPU has LOONGARCH LSX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasLSX@.
+--                   The safe flavor is 'hasLSXSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasLSX@, defined at @SDL3\/SDL_cpuinfo.h 296:34@
+hasLSX :: IO Bool
+hasLSX = fmap CBool.toBool Unsafe.sDL_HasLSX
+
+-- | Determine whether the CPU has LSX (LOONGARCH SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using LOONGARCH instruction sets.
+--
+--     [Returns]: true if the CPU has LOONGARCH LSX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasLSX@.
+--                   The unsafe flavor is 'hasLSX'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasLSX@, defined at @SDL3\/SDL_cpuinfo.h 296:34@
+hasLSXSafe :: IO Bool
+hasLSXSafe = fmap CBool.toBool Safe.sDL_HasLSX
+
+-- | Determine whether the CPU has LASX (LOONGARCH SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using LOONGARCH instruction sets.
+--
+--     [Returns]: true if the CPU has LOONGARCH LASX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasLASX@.
+--                   The safe flavor is 'hasLASXSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasLASX@, defined at @SDL3\/SDL_cpuinfo.h 310:34@
+hasLASX :: IO Bool
+hasLASX = fmap CBool.toBool Unsafe.sDL_HasLASX
+
+-- | Determine whether the CPU has LASX (LOONGARCH SIMD) features.
+--
+--     This always returns false on CPUs that aren\'t using LOONGARCH instruction sets.
+--
+--     [Returns]: true if the CPU has LOONGARCH LASX features or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasLASX@.
+--                   The unsafe flavor is 'hasLASX'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasLASX@, defined at @SDL3\/SDL_cpuinfo.h 310:34@
+hasLASXSafe :: IO Bool
+hasLASXSafe = fmap CBool.toBool Safe.sDL_HasLASX
+
+-- | Get the amount of RAM configured in the system.
+--
+--     [Returns]: the amount of RAM configured in the system in MiB.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSystemRAM@.
+--                   The safe flavor is 'getSystemRAMSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSystemRAM@, defined at @SDL3\/SDL_cpuinfo.h 321:33@
+getSystemRAM :: IO BG.Int32
+getSystemRAM =
+  fmap Coerce.coerce Unsafe.sDL_GetSystemRAM
+
+-- | Get the amount of RAM configured in the system.
+--
+--     [Returns]: the amount of RAM configured in the system in MiB.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSystemRAM@.
+--                   The unsafe flavor is 'getSystemRAM'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSystemRAM@, defined at @SDL3\/SDL_cpuinfo.h 321:33@
+getSystemRAMSafe :: IO BG.Int32
+getSystemRAMSafe =
+  fmap Coerce.coerce Safe.sDL_GetSystemRAM
+
+-- | Report the alignment this system needs for SIMD allocations.
+--
+--     This will return the minimum number of bytes to which a pointer must be aligned to be compatible with SIMD instructions on the current machine. For example, if the machine supports SSE only, it will return 16, but if it supports AVX-512F, it\'ll return 64 (etc). This only reports values for instruction sets SDL knows about, so if your SDL build doesn\'t have @'hasAVX512F'@, then it might return 16 for the SSE support it sees and not 64 for the AVX-512 instructions that exist but SDL doesn\'t know about. Plan accordingly.
+--
+--     [Returns]: the alignment in bytes needed for available, known SIMD instructions.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Stdinc.alignedAlloc', 'SDL3.Sys.Stdinc.alignedFree'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSIMDAlignment@.
+--                   The safe flavor is 'getSIMDAlignmentSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSIMDAlignment@, defined at @SDL3\/SDL_cpuinfo.h 345:36@
+getSIMDAlignment :: IO BG.Word64
+getSIMDAlignment =
+  fmap Coerce.coerce Unsafe.sDL_GetSIMDAlignment
+
+-- | Report the alignment this system needs for SIMD allocations.
+--
+--     This will return the minimum number of bytes to which a pointer must be aligned to be compatible with SIMD instructions on the current machine. For example, if the machine supports SSE only, it will return 16, but if it supports AVX-512F, it\'ll return 64 (etc). This only reports values for instruction sets SDL knows about, so if your SDL build doesn\'t have @'hasAVX512F'@, then it might return 16 for the SSE support it sees and not 64 for the AVX-512 instructions that exist but SDL doesn\'t know about. Plan accordingly.
+--
+--     [Returns]: the alignment in bytes needed for available, known SIMD instructions.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Stdinc.alignedAlloc', 'SDL3.Sys.Stdinc.alignedFree'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSIMDAlignment@.
+--                   The unsafe flavor is 'getSIMDAlignment'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSIMDAlignment@, defined at @SDL3\/SDL_cpuinfo.h 345:36@
+getSIMDAlignmentSafe :: IO BG.Word64
+getSIMDAlignmentSafe =
+  fmap Coerce.coerce Safe.sDL_GetSIMDAlignment
+
+-- | Report the size of a page of memory.
+--
+--     Different platforms might have different memory page sizes. In current times, 4 kilobytes is not unusual, but newer systems are moving to larger page sizes, and esoteric platforms might have any unexpected size.
+--
+--     Note that this function can return 0, which means SDL can\'t determine the page size on this platform. It will /not/ set an error string to be retrieved with 'SDL3.Sys.Error.getError' in this case! In this case, defaulting to 4096 is often a reasonable option.
+--
+--     [Returns]: the size of a single page of memory, in bytes, or 0 if SDL can\'t determine this information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSystemPageSize@.
+--                   The safe flavor is 'getSystemPageSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSystemPageSize@, defined at @SDL3\/SDL_cpuinfo.h 366:33@
+getSystemPageSize :: IO BG.Int32
+getSystemPageSize =
+  fmap Coerce.coerce Unsafe.sDL_GetSystemPageSize
+
+-- | Report the size of a page of memory.
+--
+--     Different platforms might have different memory page sizes. In current times, 4 kilobytes is not unusual, but newer systems are moving to larger page sizes, and esoteric platforms might have any unexpected size.
+--
+--     Note that this function can return 0, which means SDL can\'t determine the page size on this platform. It will /not/ set an error string to be retrieved with 'SDL3.Sys.Error.getError' in this case! In this case, defaulting to 4096 is often a reasonable option.
+--
+--     [Returns]: the size of a single page of memory, in bytes, or 0 if SDL can\'t determine this information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSystemPageSize@.
+--                   The unsafe flavor is 'getSystemPageSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSystemPageSize@, defined at @SDL3\/SDL_cpuinfo.h 366:33@
+getSystemPageSizeSafe :: IO BG.Int32
+getSystemPageSizeSafe =
+  fmap Coerce.coerce Safe.sDL_GetSystemPageSize
diff --git a/src/SDL3/Sys/Dialog.hs b/src/SDL3/Sys/Dialog.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Dialog.hs
@@ -0,0 +1,293 @@
+-- | File dialog support.
+--
+--     SDL offers file dialogs, to let users select files with native GUI interfaces. There are \"open\" dialogs, \"save\" dialogs, and folder selection dialogs. The app can control some details, such as filtering to specific files, or whether multiple files can be selected by the user.
+--
+--     Note that launching a file dialog is a non-blocking operation; control returns to the app immediately, and a callback is called later (possibly in another thread) when the user makes a choice. An entry for filters for file dialogs.
+--
+--     @name@ is a user-readable label for the filter (for example, \"Office document\").
+--
+--     @pattern@ is a semicolon-separated list of file extensions (for example, \"doc;docx\"). File extensions may only contain alphanumeric characters, hyphens, underscores and periods. Alternatively, the whole string can be a single asterisk (\"*\"), which serves as an \"All files\" filter.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'showOpenFileDialogSafe', 'showSaveFileDialogSafe', 'showOpenFolderDialogSafe', 'showFileDialogWithPropertiesSafe'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Dialog.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Dialog (
+  module SDL3.Sys.Bindgen.Dialog,
+
+  -- * Function aliases
+  SDL3.Sys.Dialog.showOpenFileDialogSafe,
+  SDL3.Sys.Dialog.showSaveFileDialogSafe,
+  SDL3.Sys.Dialog.showOpenFolderDialogSafe,
+  SDL3.Sys.Dialog.showFileDialogWithPropertiesSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Dialog
+import SDL3.Sys.Bindgen.Dialog.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | Displays a dialog that lets the user select a file on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     Depending on the platform, the user may be allowed to input paths that don\'t yet exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to 'SDL3.Sys.Events.pumpEvents' in their main loop.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'showSaveFileDialogSafe', 'showOpenFolderDialogSafe', 'showFileDialogWithPropertiesSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShowOpenFileDialog@.
+--                   The unsafe import is not exported
+--                   : may invoke the callback synchronously on validation failure.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Dialog.Unsafe.sDL_ShowOpenFileDialog@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowOpenFileDialog@, defined at @SDL3\/SDL_dialog.h 166:34@
+showOpenFileDialogSafe
+  :: SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+  -> PtrConst.PtrConst SDL_DialogFileFilter
+  -- ^
+  --
+  --           [@filters@]: a list of filters, may be NULL. See the [@SDL_DialogFileFilter@](https://wiki.libsdl.org/SDL3/SDL_DialogFileFilter#code-examples) documentation for examples]. Not all platforms support this option, and platforms that do support it may allow the user to ignore the filters. If non-NULL, it must remain valid at least until the callback is invoked.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@nfilters@]: the number of filters. Ignored if filters is NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+  -> Bool
+  -- ^
+  --
+  --           [@allow_many@]: if non-zero, the user will be allowed to select multiple entries. Not all platforms support this option.
+  -> IO ()
+showOpenFileDialogSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                Safe.sDL_ShowOpenFileDialog x00 x11 x22 x33 (Coerce.coerce x44) x55 (CBool.fromBool x66)
+
+-- | Displays a dialog that lets the user choose a new or existing file on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     The chosen file may or may not already exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to 'SDL3.Sys.Events.pumpEvents' in their main loop.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'showOpenFileDialogSafe', 'showOpenFolderDialogSafe', 'showFileDialogWithPropertiesSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShowSaveFileDialog@.
+--                   The unsafe import is not exported
+--                   : may invoke the callback synchronously on validation failure.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Dialog.Unsafe.sDL_ShowSaveFileDialog@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowSaveFileDialog@, defined at @SDL3\/SDL_dialog.h 215:34@
+showSaveFileDialogSafe
+  :: SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+  -> PtrConst.PtrConst SDL_DialogFileFilter
+  -- ^
+  --
+  --           [@filters@]: a list of filters, may be NULL. Not all platforms support this option, and platforms that do support it may allow the user to ignore the filters. If non-NULL, it must remain valid at least until the callback is invoked.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@nfilters@]: the number of filters. Ignored if filters is NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+  -> IO ()
+showSaveFileDialogSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              Safe.sDL_ShowSaveFileDialog x00 x11 x22 x33 (Coerce.coerce x44) x55
+
+-- | Displays a dialog that lets the user select a folder on their filesystem.
+--
+--     This is an asynchronous function; it will return immediately, and the result will be passed to the callback.
+--
+--     The callback will be invoked with a null-terminated list of files the user chose. The list will be empty if the user canceled the dialog, and it will be NULL if an error occurred.
+--
+--     Note that the callback may be called from a different thread than the one the function was invoked on.
+--
+--     Depending on the platform, the user may be allowed to input paths that don\'t yet exist.
+--
+--     On Linux, dialogs may require XDG Portals, which requires DBus, which requires an event-handling loop. Apps that do not use SDL to handle events should add a call to 'SDL3.Sys.Events.pumpEvents' in their main loop.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_DialogFileCallback', 'showOpenFileDialogSafe', 'showSaveFileDialogSafe', 'showFileDialogWithPropertiesSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShowOpenFolderDialog@.
+--                   The unsafe import is not exported
+--                   : may invoke the callback synchronously on validation failure.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Dialog.Unsafe.sDL_ShowOpenFolderDialog@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowOpenFolderDialog@, defined at @SDL3\/SDL_dialog.h 260:34@
+showOpenFolderDialogSafe
+  :: SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that the dialog should be modal for, may be NULL. Not all platforms support this option.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_location@]: the default folder or file to start the dialog at, may be NULL. Not all platforms support this option.
+  -> Bool
+  -- ^
+  --
+  --           [@allow_many@]: if non-zero, the user will be allowed to select multiple entries. Not all platforms support this option.
+  -> IO ()
+showOpenFolderDialogSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Safe.sDL_ShowOpenFolderDialog x00 x11 x22 x33 (CBool.fromBool x44)
+
+-- | Create and launch a file dialog with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_FILE_DIALOG_FILTERS_POINTER'@: a pointer to a list of 'SDL_DialogFileFilter' structs, which will be used as filters for file-based selections. Ignored if the dialog is an \"Open Folder\" dialog. If non-NULL, the array of filters must remain valid at least until the callback is invoked.
+--
+--     * @'sDL_PROP_FILE_DIALOG_NFILTERS_NUMBER'@: the number of filters in the array of filters, if it exists.
+--
+--     * @'sDL_PROP_FILE_DIALOG_WINDOW_POINTER'@: the window that the dialog should be modal for.
+--
+--     * @'sDL_PROP_FILE_DIALOG_LOCATION_STRING'@: the default folder or file to start the dialog at.
+--
+--     * @'sDL_PROP_FILE_DIALOG_MANY_BOOLEAN'@: true to allow the user to select more than one entry.
+--
+--     * @'sDL_PROP_FILE_DIALOG_TITLE_STRING'@: the title for the dialog.
+--
+--     * @'sDL_PROP_FILE_DIALOG_ACCEPT_STRING'@: the label that the accept button should have.
+--
+--     * @'sDL_PROP_FILE_DIALOG_CANCEL_STRING'@: the label that the cancel button should have.
+--
+--     Note that each platform may or may not support any of the properties.
+--
+--     [Thread safety]: This function should be called only from the main thread. The callback may be invoked from the same thread or from a different one, depending on the OS\'s constraints.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_FileDialogType', 'SDL_DialogFileCallback', 'SDL_DialogFileFilter', 'showOpenFileDialogSafe', 'showSaveFileDialogSafe', 'showOpenFolderDialogSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShowFileDialogWithProperties@.
+--                   The unsafe import is not exported
+--                   : may invoke the callback synchronously on validation failure.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Dialog.Unsafe.sDL_ShowFileDialogWithProperties@.
+--
+--     [C declaration]: @SDL_ShowFileDialogWithProperties@, defined at @SDL3\/SDL_dialog.h 326:34@
+showFileDialogWithPropertiesSafe
+  :: SDL_FileDialogType
+  -- ^
+  --
+  --           [@type@]: the type of file dialog.
+  -> SDL_DialogFileCallback
+  -- ^
+  --
+  --           [@callback@]: a function pointer to be invoked when the user selects a file and accepts, or cancels the dialog, or an error occurs.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO ()
+showFileDialogWithPropertiesSafe =
+  Safe.sDL_ShowFileDialogWithProperties
diff --git a/src/SDL3/Sys/Dlopennote.hs b/src/SDL3/Sys/Dlopennote.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Dlopennote.hs
@@ -0,0 +1,43 @@
+-- | This header allows you to annotate your code so external tools know about dynamic shared library dependencies.
+--
+--     If you determine that your toolchain doesn\'t support dlopen notes, you can disable this feature by defining @SDL_DISABLE_DLOPEN_NOTES@. You can use this CMake snippet to check for support:
+--
+--     Use this macro with @SDL_ELF_NOTE_DLOPEN()@ to note that a dynamic shared library dependency is optional.
+--
+--     @
+--     include(CheckCSourceCompiles)
+--     find_package(SDL3 REQUIRED CONFIG COMPONENTS Headers)
+--     list(APPEND CMAKE_REQUIRED_LIBRARIES SDL3::Headers)
+--     check_c_source_compiles([==[
+--       \#include \<SDL3\/SDL_dlopennote.h>
+--       SDL_ELF_NOTE_DLOPEN(\"sdl-video\",
+--         \"Support for video through SDL\",
+--         SDL_ELF_NOTE_DLOPEN_PRIORITY_SUGGESTED,
+--         \"libSDL-1.2.so.0\", \"libSDL-2.0.so.0\", \"libSDL3.so.0\"
+--       )
+--       int main(int argc, char *argv[]) {
+--         return argc + argv[0][1];
+--       }
+--     ]==] COMPILER_SUPPORTS_SDL_ELF_NOTE_DLOPEN)
+--     if(NOT COMPILER_SUPPORTS_SDL_ELF_NOTE_DLOPEN)
+--       add_compile_definitions(-DSDL_DISABLE_DLOPEN_NOTE)
+--     endif()
+--     @
+--
+--     Optional functionality uses the dependency, the binary will work and the dependency is only needed for full-featured installations.
+--
+--     @since 3.4.0
+--
+--     [See also]: @SDL_ELF_NOTE_DLOPEN@, 'sDL_ELF_NOTE_DLOPEN_PRIORITY_RECOMMENDED', 'sDL_ELF_NOTE_DLOPEN_PRIORITY_REQUIRED'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Dlopennote.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Dlopennote (
+  module SDL3.Sys.Bindgen.Dlopennote,
+)
+where
+
+import SDL3.Sys.Bindgen.Dlopennote
diff --git a/src/SDL3/Sys/Endian.hs b/src/SDL3/Sys/Endian.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Endian.hs
@@ -0,0 +1,52 @@
+-- | Functions for reading and writing endian-specific values.
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Endian.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Endian (
+  module SDL3.Sys.Bindgen.Endian,
+
+  -- * Function aliases
+  SDL3.Sys.Endian.swapFloat,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.LibC qualified
+import SDL3.Sys.Bindgen.Endian
+import SDL3.Sys.Bindgen.Endian.Unsafe qualified as Unsafe
+
+-- | Byte-swap a floating point number.
+--
+--     This will always byte-swap the value, whether it\'s currently in the native byteorder of the system or not. You should use SDL_SwapFloatLE or SDL_SwapFloatBE instead, in most cases.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: x, with its bytes in the opposite endian order.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SwapFloat@.
+--                   The safe import is not exported
+--                   : pure bit manipulation on an immediate value; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SwapFloat@, defined at @SDL3\/SDL_endian.h 408:24@
+swapFloat
+  :: Float
+  -- ^
+  --
+  --           [@x@]: the value to byte-swap.
+  -> IO Float
+swapFloat =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_SwapFloat (Coerce.coerce x00))
diff --git a/src/SDL3/Sys/Error.hs b/src/SDL3/Sys/Error.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Error.hs
@@ -0,0 +1,96 @@
+-- | Simple error message routines for SDL.
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Error.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Error (
+  -- * Function aliases
+  SDL3.Sys.Error.outOfMemory,
+  SDL3.Sys.Error.getError,
+  SDL3.Sys.Error.clearError,
+)
+where
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Error.Unsafe qualified as Unsafe
+
+-- | Set an error indicating that memory allocation failed.
+--
+--     This function does not do any memory allocation.
+--
+--     [Returns]: false.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OutOfMemory@.
+--                   The safe import is not exported
+--                   : touches only the thread-local error buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_OutOfMemory@, defined at @SDL3\/SDL_error.h 121:34@
+outOfMemory :: IO Bool
+outOfMemory =
+  fmap CBool.toBool Unsafe.sDL_OutOfMemory
+
+-- | Retrieve a message about the last error that occurred on the current thread.
+--
+--     It is possible for multiple errors to occur before calling @'getError'@. Only the last error is returned.
+--
+--     The message is only applicable when an SDL function has signaled an error. You must check the return values of SDL function calls to determine when to appropriately call @'getError'@. You should /not/ use the results of @'getError'@ to decide if an error has occurred! Sometimes SDL will set an error string even when reporting success.
+--
+--     SDL will /not/ clear the error string for successful API calls. You /must/ check return values for failure cases before you can assume the error string applies.
+--
+--     Error strings are set per-thread, so an error set in a different thread will not interfere with the current thread\'s operation.
+--
+--     The returned value is a thread-local string which will remain valid until the current thread\'s error string is changed. The caller should make a copy if the value is needed after the next SDL API call.
+--
+--     [Returns]: a message with information about the specific error that occurred, or an empty string if there hasn\'t been an error message set since the last call to @'clearError'@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'clearError', @SDL_SetError@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetError@.
+--                   The safe import is not exported
+--                   : touches only the thread-local error buffer; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_GetError@, defined at @SDL3\/SDL_error.h 158:42@
+getError :: IO (PtrConst.PtrConst BG.CChar)
+getError = Unsafe.sDL_GetError
+
+-- | Clear any previous error message for this thread.
+--
+--     [Returns]: true.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getError', @SDL_SetError@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ClearError@.
+--                   The safe import is not exported
+--                   : touches only the thread-local error buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearError@, defined at @SDL3\/SDL_error.h 172:34@
+clearError :: IO Bool
+clearError = fmap CBool.toBool Unsafe.sDL_ClearError
diff --git a/src/SDL3/Sys/Events.hs b/src/SDL3/Sys/Events.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Events.hs
@@ -0,0 +1,1521 @@
+-- | Event queue management.
+--
+--     It\'s extremely common often required that an app deal with SDL\'s event queue. Almost all useful information about interactions with the real world flow through here: the user interacting with the computer and app, hardware coming and going, the system changing in some way, etc.
+--
+--     An app generally takes a moment, perhaps at the start of a new frame, to examine any events that have occurred since the last time and process or ignore them. This is generally done by calling @'pollEvent'@ in a loop until it returns false (or, if using the main callbacks, events are provided one at a time in calls to SDL_AppEvent() before the next call to SDL_AppIterate(); in this scenario, the app does not call @'pollEvent'@ at all).
+--
+--     There is other forms of control, too: @'peepEvents'@ has more functionality at the cost of more complexity, and @'waitEvent'@ can block the process until something interesting happens, which might be beneficial for certain types of programs on low-power hardware. One may also call @'addEventWatch'@ to set a callback when new events arrive.
+--
+--     The app is free to generate their own events, too: 'pushEvent' allows the app to put events onto the queue for later retrieval; 'registerEvents' can guarantee that these events have a type that isn\'t in use by other parts of the system. The types of events that can be delivered.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Events.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+--
+--     == Reading events
+--
+--     @SDL_Event@ is a C union: poll into an @alloca@ buffer, read the event-type discriminant first, then peek the payload member for that type. The @sdl3-raw@ example in the repository shows the full idiom; 'pollEvent' and the @SDL_EVENT_*@ patterns live in this module.
+module SDL3.Sys.Events (
+  module SDL3.Sys.Bindgen.Events,
+
+  -- * Function aliases
+  SDL3.Sys.Events.pumpEvents,
+  SDL3.Sys.Events.pumpEventsSafe,
+  SDL3.Sys.Events.peepEvents,
+  SDL3.Sys.Events.peepEventsSafe,
+  SDL3.Sys.Events.hasEvent,
+  SDL3.Sys.Events.hasEventSafe,
+  SDL3.Sys.Events.hasEvents,
+  SDL3.Sys.Events.hasEventsSafe,
+  SDL3.Sys.Events.flushEvent,
+  SDL3.Sys.Events.flushEventSafe,
+  SDL3.Sys.Events.flushEvents,
+  SDL3.Sys.Events.flushEventsSafe,
+  SDL3.Sys.Events.pollEvent,
+  SDL3.Sys.Events.pollEventSafe,
+  SDL3.Sys.Events.waitEvent,
+  SDL3.Sys.Events.waitEventSafe,
+  SDL3.Sys.Events.waitEventTimeout,
+  SDL3.Sys.Events.waitEventTimeoutSafe,
+  SDL3.Sys.Events.pushEvent,
+  SDL3.Sys.Events.pushEventSafe,
+  SDL3.Sys.Events.setEventFilter,
+  SDL3.Sys.Events.setEventFilterSafe,
+  SDL3.Sys.Events.getEventFilter,
+  SDL3.Sys.Events.getEventFilterSafe,
+  SDL3.Sys.Events.addEventWatch,
+  SDL3.Sys.Events.addEventWatchSafe,
+  SDL3.Sys.Events.removeEventWatch,
+  SDL3.Sys.Events.removeEventWatchSafe,
+  SDL3.Sys.Events.filterEventsSafe,
+  SDL3.Sys.Events.setEventEnabled,
+  SDL3.Sys.Events.setEventEnabledSafe,
+  SDL3.Sys.Events.eventEnabled,
+  SDL3.Sys.Events.eventEnabledSafe,
+  SDL3.Sys.Events.registerEvents,
+  SDL3.Sys.Events.registerEventsSafe,
+  SDL3.Sys.Events.getWindowFromEvent,
+  SDL3.Sys.Events.getWindowFromEventSafe,
+  SDL3.Sys.Events.getEventDescription,
+  SDL3.Sys.Events.getEventDescriptionSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Events
+import SDL3.Sys.Bindgen.Events.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Events.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | Pump the event loop, gathering events from the input devices.
+--
+--     This function updates the event queue and internal input device state.
+--
+--     @'pumpEvents'@ gathers all the pending input information from devices and places it in the event queue. Without calls to @'pumpEvents'@ no events would ever be placed on the queue. Often the need for calls to @'pumpEvents'@ is hidden from the user since @'pollEvent'@ and @'waitEvent'@ implicitly call @'pumpEvents'@. However, if you are not polling or waiting for events (e.g. you are filtering them), then you must call @'pumpEvents'@ to force an event queue update.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pollEvent', 'waitEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PumpEvents@.
+--                   The safe flavor is 'pumpEventsSafe'
+--                   : may re-enter registered watchers\/filters\/hit tests.
+--
+--     [C declaration]: @SDL_PumpEvents@, defined at @SDL3\/SDL_events.h 1100:34@
+pumpEvents :: IO ()
+pumpEvents = Unsafe.sDL_PumpEvents
+
+-- | Pump the event loop, gathering events from the input devices.
+--
+--     This function updates the event queue and internal input device state.
+--
+--     @'pumpEvents'@ gathers all the pending input information from devices and places it in the event queue. Without calls to @'pumpEvents'@ no events would ever be placed on the queue. Often the need for calls to @'pumpEvents'@ is hidden from the user since @'pollEvent'@ and @'waitEvent'@ implicitly call @'pumpEvents'@. However, if you are not polling or waiting for events (e.g. you are filtering them), then you must call @'pumpEvents'@ to force an event queue update.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pollEvent', 'waitEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PumpEvents@.
+--                   The unsafe flavor is 'pumpEvents'
+--                   : may re-enter registered watchers\/filters\/hit tests.
+--
+--     [C declaration]: @SDL_PumpEvents@, defined at @SDL3\/SDL_events.h 1100:34@
+pumpEventsSafe :: IO ()
+pumpEventsSafe = Safe.sDL_PumpEvents
+
+-- | Check the event queue for messages and optionally return them.
+--
+--     @action@ may be any of the following:
+--
+--     * @SDL_ADDEVENT@: up to @numevents@ events will be added to the back of the event queue.
+--
+--     * @SDL_PEEKEVENT@: @numevents@ events at the front of the event queue, within the specified minimum and maximum type, will be returned to the caller and will /not/ be removed from the queue. If you pass NULL for @events@, then @numevents@ is ignored and the total number of matching events will be returned.
+--
+--     * @SDL_GETEVENT@: up to @numevents@ events at the front of the event queue, within the specified minimum and maximum type, will be returned to the caller and will be removed from the queue.
+--
+--     You may have to call @'pumpEvents'@ before calling this function. Otherwise, the events may not be ready to be filtered when you call @'peepEvents'@.
+--
+--     [Returns]: the number of events actually stored or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pollEvent', 'pumpEvents', 'pushEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PeepEvents@.
+--                   The safe flavor is 'peepEventsSafe'
+--                   : SDL_ADDEVENT runs registered event filters\/watchers synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PeepEvents@, defined at @SDL3\/SDL_events.h 1158:33@
+peepEvents
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@events@]: destination buffer for the retrieved events, may be NULL to leave the events in the queue and return the number of events that would have been stored.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@numevents@]: if action is SDL_ADDEVENT, the number of events to add back to the event queue; if action is SDL_PEEKEVENT or SDL_GETEVENT, the maximum number of events to retrieve.
+  -> SDL_EventAction
+  -- ^
+  --
+  --           [@action@]: action to take; see Remarks for details.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@minType@]: minimum value of the event type to be considered; SDL_EVENT_FIRST is a safe choice.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@maxType@]: maximum value of the event type to be considered; SDL_EVENT_LAST is a safe choice.
+  -> IO BG.Int32
+peepEvents =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              Coerce.coerce
+              (Unsafe.sDL_PeepEvents x00 (Coerce.coerce x11) x22 (Coerce.coerce x33) (Coerce.coerce x44))
+
+-- | Check the event queue for messages and optionally return them.
+--
+--     @action@ may be any of the following:
+--
+--     * @SDL_ADDEVENT@: up to @numevents@ events will be added to the back of the event queue.
+--
+--     * @SDL_PEEKEVENT@: @numevents@ events at the front of the event queue, within the specified minimum and maximum type, will be returned to the caller and will /not/ be removed from the queue. If you pass NULL for @events@, then @numevents@ is ignored and the total number of matching events will be returned.
+--
+--     * @SDL_GETEVENT@: up to @numevents@ events at the front of the event queue, within the specified minimum and maximum type, will be returned to the caller and will be removed from the queue.
+--
+--     You may have to call @'pumpEvents'@ before calling this function. Otherwise, the events may not be ready to be filtered when you call @'peepEvents'@.
+--
+--     [Returns]: the number of events actually stored or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pollEvent', 'pumpEvents', 'pushEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PeepEvents@.
+--                   The unsafe flavor is 'peepEvents'
+--                   : SDL_ADDEVENT runs registered event filters\/watchers synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PeepEvents@, defined at @SDL3\/SDL_events.h 1158:33@
+peepEventsSafe
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@events@]: destination buffer for the retrieved events, may be NULL to leave the events in the queue and return the number of events that would have been stored.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@numevents@]: if action is SDL_ADDEVENT, the number of events to add back to the event queue; if action is SDL_PEEKEVENT or SDL_GETEVENT, the maximum number of events to retrieve.
+  -> SDL_EventAction
+  -- ^
+  --
+  --           [@action@]: action to take; see Remarks for details.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@minType@]: minimum value of the event type to be considered; SDL_EVENT_FIRST is a safe choice.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@maxType@]: maximum value of the event type to be considered; SDL_EVENT_LAST is a safe choice.
+  -> IO BG.Int32
+peepEventsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              Coerce.coerce
+              (Safe.sDL_PeepEvents x00 (Coerce.coerce x11) x22 (Coerce.coerce x33) (Coerce.coerce x44))
+
+-- | Check for the existence of a certain event type in the event queue.
+--
+--     If you need to check for a range of event types, use @'hasEvents'@ instead.
+--
+--     [Returns]: true if events matching @type@ are present, or false if events matching @type@ are not present.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasEvents'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasEvent@.
+--                   The safe flavor is 'hasEventSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasEvent@, defined at @SDL3\/SDL_events.h 1177:34@
+hasEvent
+  :: BG.Word32
+  -- ^
+  --
+  --           [@type@]: the type of event to be queried; see 'SDL_EventType' for details.
+  -> IO Bool
+hasEvent =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_HasEvent (Coerce.coerce x00))
+
+-- | Check for the existence of a certain event type in the event queue.
+--
+--     If you need to check for a range of event types, use @'hasEvents'@ instead.
+--
+--     [Returns]: true if events matching @type@ are present, or false if events matching @type@ are not present.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasEvents'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasEvent@.
+--                   The unsafe flavor is 'hasEvent'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasEvent@, defined at @SDL3\/SDL_events.h 1177:34@
+hasEventSafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@type@]: the type of event to be queried; see 'SDL_EventType' for details.
+  -> IO Bool
+hasEventSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_HasEvent (Coerce.coerce x00))
+
+-- | Check for the existence of certain event types in the event queue.
+--
+--     If you need to check for a single event type, use @'hasEvent'@ instead.
+--
+--     [Returns]: true if events with type >= @minType@ and \<= @maxType@ are present, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasEvents'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasEvents@.
+--                   The safe flavor is 'hasEventsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasEvents@, defined at @SDL3\/SDL_events.h 1198:34@
+hasEvents
+  :: BG.Word32
+  -- ^
+  --
+  --           [@minType@]: the low end of event type to be queried, inclusive; see 'SDL_EventType' for details.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@maxType@]: the high end of event type to be queried, inclusive; see 'SDL_EventType' for details.
+  -> IO Bool
+hasEvents =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_HasEvents (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Check for the existence of certain event types in the event queue.
+--
+--     If you need to check for a single event type, use @'hasEvent'@ instead.
+--
+--     [Returns]: true if events with type >= @minType@ and \<= @maxType@ are present, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasEvents'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasEvents@.
+--                   The unsafe flavor is 'hasEvents'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasEvents@, defined at @SDL3\/SDL_events.h 1198:34@
+hasEventsSafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@minType@]: the low end of event type to be queried, inclusive; see 'SDL_EventType' for details.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@maxType@]: the high end of event type to be queried, inclusive; see 'SDL_EventType' for details.
+  -> IO Bool
+hasEventsSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_HasEvents (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Clear events of a specific type from the event queue.
+--
+--     This will unconditionally remove any events from the queue that match @type@. If you need to remove a range of event types, use @'flushEvents'@ instead.
+--
+--     It\'s also normal to just ignore events you don\'t care about in your event loop without calling this function.
+--
+--     This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call @'pumpEvents'@ on the main thread immediately before the flush call.
+--
+--     If you have user events with custom data that needs to be freed, you should use @'peepEvents'@ to remove and clean up those events before calling this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'flushEvents'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_FlushEvent@.
+--                   The safe flavor is 'flushEventSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlushEvent@, defined at @SDL3\/SDL_events.h 1226:34@
+flushEvent
+  :: BG.Word32
+  -- ^
+  --
+  --           [@type@]: the type of event to be cleared; see 'SDL_EventType' for details.
+  -> IO ()
+flushEvent =
+  \x00 -> Unsafe.sDL_FlushEvent (Coerce.coerce x00)
+
+-- | Clear events of a specific type from the event queue.
+--
+--     This will unconditionally remove any events from the queue that match @type@. If you need to remove a range of event types, use @'flushEvents'@ instead.
+--
+--     It\'s also normal to just ignore events you don\'t care about in your event loop without calling this function.
+--
+--     This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call @'pumpEvents'@ on the main thread immediately before the flush call.
+--
+--     If you have user events with custom data that needs to be freed, you should use @'peepEvents'@ to remove and clean up those events before calling this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'flushEvents'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_FlushEvent@.
+--                   The unsafe flavor is 'flushEvent'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlushEvent@, defined at @SDL3\/SDL_events.h 1226:34@
+flushEventSafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@type@]: the type of event to be cleared; see 'SDL_EventType' for details.
+  -> IO ()
+flushEventSafe =
+  \x00 -> Safe.sDL_FlushEvent (Coerce.coerce x00)
+
+-- | Clear events of a range of types from the event queue.
+--
+--     This will unconditionally remove any events from the queue that are in the range of @minType@ to @maxType@, inclusive. If you need to remove a single event type, use @'flushEvent'@ instead.
+--
+--     It\'s also normal to just ignore events you don\'t care about in your event loop without calling this function.
+--
+--     This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call @'pumpEvents'@ on the main thread immediately before the flush call.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'flushEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_FlushEvents@.
+--                   The safe flavor is 'flushEventsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlushEvents@, defined at @SDL3\/SDL_events.h 1253:34@
+flushEvents
+  :: BG.Word32
+  -- ^
+  --
+  --           [@minType@]: the low end of event type to be cleared, inclusive; see 'SDL_EventType' for details.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@maxType@]: the high end of event type to be cleared, inclusive; see 'SDL_EventType' for details.
+  -> IO ()
+flushEvents =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_FlushEvents (Coerce.coerce x00) (Coerce.coerce x11)
+
+-- | Clear events of a range of types from the event queue.
+--
+--     This will unconditionally remove any events from the queue that are in the range of @minType@ to @maxType@, inclusive. If you need to remove a single event type, use @'flushEvent'@ instead.
+--
+--     It\'s also normal to just ignore events you don\'t care about in your event loop without calling this function.
+--
+--     This function only affects currently queued events. If you want to make sure that all pending OS events are flushed, you can call @'pumpEvents'@ on the main thread immediately before the flush call.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'flushEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_FlushEvents@.
+--                   The unsafe flavor is 'flushEvents'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlushEvents@, defined at @SDL3\/SDL_events.h 1253:34@
+flushEventsSafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@minType@]: the low end of event type to be cleared, inclusive; see 'SDL_EventType' for details.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@maxType@]: the high end of event type to be cleared, inclusive; see 'SDL_EventType' for details.
+  -> IO ()
+flushEventsSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_FlushEvents (Coerce.coerce x00) (Coerce.coerce x11)
+
+-- | Poll for currently pending events.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     If @event@ is NULL, it simply returns true if there is an event in the queue, but will not remove it from the queue.
+--
+--     As this function may implicitly call @'pumpEvents'@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     @'pollEvent'@ is the favored way of receiving system events since it can be done from the main loop and does not suspend the main loop while waiting on an event to be posted.
+--
+--     The common practice is to fully process the event queue once every frame, usually as a first step before updating the game\'s state:
+--
+--     @
+--     while (game_is_still_running) {
+--         SDL_Event event;
+--         while (SDL_PollEvent(&event)) {  \/\/ poll until all events are handled!
+--             \/\/ decide what to do with this event.
+--         }
+--
+--         \/\/ update game state, draw the current frame
+--     }
+--     @
+--
+--     Note that Windows (and possibly other platforms) has a quirk about how it handles events while dragging\/resizing a window, which can cause this function to block for significant amounts of time. Technical explanations and solutions are discussed on the wiki:
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/AppFreezeDuringDrag](https://wiki.libsdl.org/SDL3/AppFreezeDuringDrag)
+--
+--     [Returns]: true if this got an event or false if there are none available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pushEvent', 'waitEvent', 'waitEventTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PollEvent@.
+--                   The safe flavor is 'pollEventSafe'
+--                   : pumps events; may re-enter registered watchers\/filters\/hit tests.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PollEvent@, defined at @SDL3\/SDL_events.h 1304:34@
+pollEvent
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled with the next event from the queue, or NULL.
+  -> IO Bool
+pollEvent =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_PollEvent x00)
+
+-- | Poll for currently pending events.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     If @event@ is NULL, it simply returns true if there is an event in the queue, but will not remove it from the queue.
+--
+--     As this function may implicitly call @'pumpEvents'@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     @'pollEvent'@ is the favored way of receiving system events since it can be done from the main loop and does not suspend the main loop while waiting on an event to be posted.
+--
+--     The common practice is to fully process the event queue once every frame, usually as a first step before updating the game\'s state:
+--
+--     @
+--     while (game_is_still_running) {
+--         SDL_Event event;
+--         while (SDL_PollEvent(&event)) {  \/\/ poll until all events are handled!
+--             \/\/ decide what to do with this event.
+--         }
+--
+--         \/\/ update game state, draw the current frame
+--     }
+--     @
+--
+--     Note that Windows (and possibly other platforms) has a quirk about how it handles events while dragging\/resizing a window, which can cause this function to block for significant amounts of time. Technical explanations and solutions are discussed on the wiki:
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/AppFreezeDuringDrag](https://wiki.libsdl.org/SDL3/AppFreezeDuringDrag)
+--
+--     [Returns]: true if this got an event or false if there are none available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pushEvent', 'waitEvent', 'waitEventTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PollEvent@.
+--                   The unsafe flavor is 'pollEvent'
+--                   : pumps events; may re-enter registered watchers\/filters\/hit tests.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PollEvent@, defined at @SDL3\/SDL_events.h 1304:34@
+pollEventSafe
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled with the next event from the queue, or NULL.
+  -> IO Bool
+pollEventSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_PollEvent x00)
+
+-- | Wait indefinitely for the next available event.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     As this function may implicitly call @'pumpEvents'@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     [Returns]: true on success or false if there was an error while waiting for events; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pollEvent', 'pushEvent', 'waitEventTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitEvent@.
+--                   The safe flavor is 'waitEventSafe'
+--                   : blocks the calling capability; a blocking unsafe call stalls GC program-wide.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitEvent@, defined at @SDL3\/SDL_events.h 1328:34@
+waitEvent
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled in with the next event from the queue, or NULL.
+  -> IO Bool
+waitEvent =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_WaitEvent x00)
+
+-- | Wait indefinitely for the next available event.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     As this function may implicitly call @'pumpEvents'@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     [Returns]: true on success or false if there was an error while waiting for events; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pollEvent', 'pushEvent', 'waitEventTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitEvent@.
+--                   The unsafe flavor is 'waitEvent'
+--                   : blocks the calling capability; a blocking unsafe call stalls GC program-wide.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitEvent@, defined at @SDL3\/SDL_events.h 1328:34@
+waitEventSafe
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled in with the next event from the queue, or NULL.
+  -> IO Bool
+waitEventSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_WaitEvent x00)
+
+-- | Wait until the specified timeout (in milliseconds) for the next available event.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     As this function may implicitly call @'pumpEvents'@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     The timeout is not guaranteed, the actual wait time could be longer due to system scheduling.
+--
+--     [Returns]: true if this got an event or false if the timeout elapsed without any events available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pollEvent', 'pushEvent', 'waitEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitEventTimeout@.
+--                   The safe flavor is 'waitEventTimeoutSafe'
+--                   : blocks up to the timeout.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitEventTimeout@, defined at @SDL3\/SDL_events.h 1358:34@
+waitEventTimeout
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled in with the next event from the queue, or NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum number of milliseconds to wait for the next available event.
+  -> IO Bool
+waitEventTimeout =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WaitEventTimeout x00 (Coerce.coerce x11))
+
+-- | Wait until the specified timeout (in milliseconds) for the next available event.
+--
+--     If @event@ is not NULL, the next event is removed from the queue and stored in the 'SDL_Event' structure pointed to by @event@.
+--
+--     As this function may implicitly call @'pumpEvents'@, you can only call this function in the thread that initialized the video subsystem.
+--
+--     The timeout is not guaranteed, the actual wait time could be longer due to system scheduling.
+--
+--     [Returns]: true if this got an event or false if the timeout elapsed without any events available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pollEvent', 'pushEvent', 'waitEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitEventTimeout@.
+--                   The unsafe flavor is 'waitEventTimeout'
+--                   : blocks up to the timeout.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitEventTimeout@, defined at @SDL3\/SDL_events.h 1358:34@
+waitEventTimeoutSafe
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' structure to be filled in with the next event from the queue, or NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum number of milliseconds to wait for the next available event.
+  -> IO Bool
+waitEventTimeoutSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WaitEventTimeout x00 (Coerce.coerce x11))
+
+-- | Add an event to the event queue.
+--
+--     The event queue can actually be used as a two way communication channel. Not only can events be read from the queue, but the user can also push their own events onto it. @event@ is a pointer to the event structure you wish to push onto the queue. The event is copied into the queue, and the caller may dispose of the memory pointed to after @'pushEvent'@ returns.
+--
+--     Note: Pushing device input events onto the queue doesn\'t modify the state of the device within SDL.
+--
+--     Note: Events pushed onto the queue with @'pushEvent'@ get passed through the event filter but events added with @'peepEvents'@ do not.
+--
+--     For pushing application-specific events, please use @'registerEvents'@ to get an event type that does not conflict with other code that also wants its own custom event types.
+--
+--     [Returns]: true on success, false if the event was filtered or on failure; call 'SDL3.Sys.Error.getError' for more information. A common reason for error is the event queue being full.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'peepEvents', 'pollEvent', 'registerEvents'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PushEvent@.
+--                   The safe flavor is 'pushEventSafe'
+--                   : runs registered event filters\/watchers synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PushEvent@, defined at @SDL3\/SDL_events.h 1392:34@
+pushEvent
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' to be added to the queue.
+  -> IO Bool
+pushEvent =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_PushEvent x00)
+
+-- | Add an event to the event queue.
+--
+--     The event queue can actually be used as a two way communication channel. Not only can events be read from the queue, but the user can also push their own events onto it. @event@ is a pointer to the event structure you wish to push onto the queue. The event is copied into the queue, and the caller may dispose of the memory pointed to after @'pushEvent'@ returns.
+--
+--     Note: Pushing device input events onto the queue doesn\'t modify the state of the device within SDL.
+--
+--     Note: Events pushed onto the queue with @'pushEvent'@ get passed through the event filter but events added with @'peepEvents'@ do not.
+--
+--     For pushing application-specific events, please use @'registerEvents'@ to get an event type that does not conflict with other code that also wants its own custom event types.
+--
+--     [Returns]: true on success, false if the event was filtered or on failure; call 'SDL3.Sys.Error.getError' for more information. A common reason for error is the event queue being full.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'peepEvents', 'pollEvent', 'registerEvents'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PushEvent@.
+--                   The unsafe flavor is 'pushEvent'
+--                   : runs registered event filters\/watchers synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PushEvent@, defined at @SDL3\/SDL_events.h 1392:34@
+pushEventSafe
+  :: BG.Ptr SDL_Event
+  -- ^
+  --
+  --           [@event@]: the 'SDL_Event' to be added to the queue.
+  -> IO Bool
+pushEventSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_PushEvent x00)
+
+-- | Set up a filter to process all events before they are added to the internal event queue.
+--
+--     If you just want to see events without modifying them or preventing them from being queued, you should use @'addEventWatch'@ instead.
+--
+--     If the filter function returns true when called, then the event will be added to the internal queue. If it returns false, then the event will be dropped from the queue, but the internal state will still be updated. This allows selective filtering of dynamically arriving events.
+--
+--     __WARNING__: Be very careful of what you do in the event filter function, as it may run in a different thread! The exception is handling of SDL_EVENT_WINDOW_EXPOSED, which is guaranteed to be sent from the OS on the main thread and you are expected to redraw your window in response to this event.
+--
+--     On platforms that support it, if the quit event is generated by an interrupt signal (e.g. pressing Ctrl-C), it will be delivered to the application at the next event poll.
+--
+--     Note: Disabled events never make it to the event filter function; see @'setEventEnabled'@.
+--
+--     Note: Events pushed onto the queue with @'pushEvent'@ get passed through the event filter, but events pushed onto the queue with @'peepEvents'@ do not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addEventWatch', 'setEventEnabled', 'getEventFilter', 'peepEvents', 'pushEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetEventFilter@.
+--                   The safe flavor is 'setEventFilterSafe'
+--                   : registration; the filter runs from later event calls.
+--
+--     [C declaration]: @SDL_SetEventFilter@, defined at @SDL3\/SDL_events.h 1457:34@
+setEventFilter
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: a function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO ()
+setEventFilter = Unsafe.sDL_SetEventFilter
+
+-- | Set up a filter to process all events before they are added to the internal event queue.
+--
+--     If you just want to see events without modifying them or preventing them from being queued, you should use @'addEventWatch'@ instead.
+--
+--     If the filter function returns true when called, then the event will be added to the internal queue. If it returns false, then the event will be dropped from the queue, but the internal state will still be updated. This allows selective filtering of dynamically arriving events.
+--
+--     __WARNING__: Be very careful of what you do in the event filter function, as it may run in a different thread! The exception is handling of SDL_EVENT_WINDOW_EXPOSED, which is guaranteed to be sent from the OS on the main thread and you are expected to redraw your window in response to this event.
+--
+--     On platforms that support it, if the quit event is generated by an interrupt signal (e.g. pressing Ctrl-C), it will be delivered to the application at the next event poll.
+--
+--     Note: Disabled events never make it to the event filter function; see @'setEventEnabled'@.
+--
+--     Note: Events pushed onto the queue with @'pushEvent'@ get passed through the event filter, but events pushed onto the queue with @'peepEvents'@ do not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addEventWatch', 'setEventEnabled', 'getEventFilter', 'peepEvents', 'pushEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetEventFilter@.
+--                   The unsafe flavor is 'setEventFilter'
+--                   : registration; the filter runs from later event calls.
+--
+--     [C declaration]: @SDL_SetEventFilter@, defined at @SDL3\/SDL_events.h 1457:34@
+setEventFilterSafe
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: a function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO ()
+setEventFilterSafe = Safe.sDL_SetEventFilter
+
+-- | Query the current event filter.
+--
+--     This function can be used to \"chain\" filters, by saving the existing filter before replacing it with a function that will call that saved filter.
+--
+--     [Returns]: true on success or false if there is no event filter set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setEventFilter'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetEventFilter@.
+--                   The safe flavor is 'getEventFilterSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetEventFilter@, defined at @SDL3\/SDL_events.h 1476:34@
+getEventFilter
+  :: BG.Ptr SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the current callback function will be stored here.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@userdata@]: the pointer that is passed to the current event filter will be stored here.
+  -> IO Bool
+getEventFilter =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetEventFilter x00 x11)
+
+-- | Query the current event filter.
+--
+--     This function can be used to \"chain\" filters, by saving the existing filter before replacing it with a function that will call that saved filter.
+--
+--     [Returns]: true on success or false if there is no event filter set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setEventFilter'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetEventFilter@.
+--                   The unsafe flavor is 'getEventFilter'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetEventFilter@, defined at @SDL3\/SDL_events.h 1476:34@
+getEventFilterSafe
+  :: BG.Ptr SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the current callback function will be stored here.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@userdata@]: the pointer that is passed to the current event filter will be stored here.
+  -> IO Bool
+getEventFilterSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetEventFilter x00 x11)
+
+-- | Add a callback to be triggered when an event is added to the event queue.
+--
+--     @filter@ will be called when an event happens, and its return value is ignored.
+--
+--     __WARNING__: Be very careful of what you do in the event filter function, as it may run in a different thread!
+--
+--     If the quit event is generated by a signal (e.g. SIGINT), it will bypass the internal queue and be delivered to the watch callback immediately, and arrive at the next event poll.
+--
+--     Note: the callback is called for events posted by the user through @'pushEvent'@, but not for disabled events, nor for events by a filter callback set with @'setEventFilter'@, nor for events posted by the user through @'peepEvents'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'removeEventWatch', 'setEventFilter'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AddEventWatch@.
+--                   The safe flavor is 'addEventWatchSafe'
+--                   : registration; the watch runs from later event pumping.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddEventWatch@, defined at @SDL3\/SDL_events.h 1508:34@
+addEventWatch
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: an 'SDL_EventFilter' function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO Bool
+addEventWatch =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_AddEventWatch x00 x11)
+
+-- | Add a callback to be triggered when an event is added to the event queue.
+--
+--     @filter@ will be called when an event happens, and its return value is ignored.
+--
+--     __WARNING__: Be very careful of what you do in the event filter function, as it may run in a different thread!
+--
+--     If the quit event is generated by a signal (e.g. SIGINT), it will bypass the internal queue and be delivered to the watch callback immediately, and arrive at the next event poll.
+--
+--     Note: the callback is called for events posted by the user through @'pushEvent'@, but not for disabled events, nor for events by a filter callback set with @'setEventFilter'@, nor for events posted by the user through @'peepEvents'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'removeEventWatch', 'setEventFilter'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddEventWatch@.
+--                   The unsafe flavor is 'addEventWatch'
+--                   : registration; the watch runs from later event pumping.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddEventWatch@, defined at @SDL3\/SDL_events.h 1508:34@
+addEventWatchSafe
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: an 'SDL_EventFilter' function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO Bool
+addEventWatchSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_AddEventWatch x00 x11)
+
+-- | Remove an event watch callback added with @'addEventWatch'@.
+--
+--     This function takes the same input as @'addEventWatch'@ to identify and delete the corresponding callback.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addEventWatch'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RemoveEventWatch@.
+--                   The safe flavor is 'removeEventWatchSafe'
+--                   : deregistration only.
+--
+--     [C declaration]: @SDL_RemoveEventWatch@, defined at @SDL3\/SDL_events.h 1525:34@
+removeEventWatch
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the function originally passed to @'addEventWatch'@.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer originally passed to @'addEventWatch'@.
+  -> IO ()
+removeEventWatch = Unsafe.sDL_RemoveEventWatch
+
+-- | Remove an event watch callback added with @'addEventWatch'@.
+--
+--     This function takes the same input as @'addEventWatch'@ to identify and delete the corresponding callback.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addEventWatch'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RemoveEventWatch@.
+--                   The unsafe flavor is 'removeEventWatch'
+--                   : deregistration only.
+--
+--     [C declaration]: @SDL_RemoveEventWatch@, defined at @SDL3\/SDL_events.h 1525:34@
+removeEventWatchSafe
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the function originally passed to @'addEventWatch'@.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer originally passed to @'addEventWatch'@.
+  -> IO ()
+removeEventWatchSafe = Safe.sDL_RemoveEventWatch
+
+-- | Run a specific filter function on the current event queue, removing any events for which the filter returns false.
+--
+--     See @'setEventFilter'@ for more information. Unlike @'setEventFilter'@, this function does not change the filter permanently, it only uses the supplied filter until this function returns.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEventFilter', 'setEventFilter'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_FilterEvents@.
+--                   The unsafe import is not exported
+--                   : runs the filter over the queue synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Events.Unsafe.sDL_FilterEvents@.
+--
+--     [C declaration]: @SDL_FilterEvents@, defined at @SDL3\/SDL_events.h 1545:34@
+filterEventsSafe
+  :: SDL_EventFilter
+  -- ^
+  --
+  --           [@filter@]: the 'SDL_EventFilter' function to call when an event happens.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @filter@.
+  -> IO ()
+filterEventsSafe = Safe.sDL_FilterEvents
+
+-- | Set the state of processing events by type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'eventEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetEventEnabled@.
+--                   The safe flavor is 'setEventEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetEventEnabled@, defined at @SDL3\/SDL_events.h 1559:34@
+setEventEnabled
+  :: BG.Word32
+  -- ^
+  --
+  --           [@type@]: the type of event; see 'SDL_EventType' for details.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: whether to process the event or not.
+  -> IO ()
+setEventEnabled =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_SetEventEnabled (Coerce.coerce x00) (CBool.fromBool x11)
+
+-- | Set the state of processing events by type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'eventEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetEventEnabled@.
+--                   The unsafe flavor is 'setEventEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetEventEnabled@, defined at @SDL3\/SDL_events.h 1559:34@
+setEventEnabledSafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@type@]: the type of event; see 'SDL_EventType' for details.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: whether to process the event or not.
+  -> IO ()
+setEventEnabledSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_SetEventEnabled (Coerce.coerce x00) (CBool.fromBool x11)
+
+-- | Query the state of processing events by type.
+--
+--     [Returns]: true if the event is being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setEventEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_EventEnabled@.
+--                   The safe flavor is 'eventEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_EventEnabled@, defined at @SDL3\/SDL_events.h 1573:34@
+eventEnabled
+  :: BG.Word32
+  -- ^
+  --
+  --           [@type@]: the type of event; see 'SDL_EventType' for details.
+  -> IO Bool
+eventEnabled =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_EventEnabled (Coerce.coerce x00))
+
+-- | Query the state of processing events by type.
+--
+--     [Returns]: true if the event is being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setEventEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EventEnabled@.
+--                   The unsafe flavor is 'eventEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_EventEnabled@, defined at @SDL3\/SDL_events.h 1573:34@
+eventEnabledSafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@type@]: the type of event; see 'SDL_EventType' for details.
+  -> IO Bool
+eventEnabledSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_EventEnabled (Coerce.coerce x00))
+
+-- | Allocate a set of user-defined events, and return the beginning event number for that set of events.
+--
+--     [Returns]: the beginning event number, or 0 if numevents is invalid or if there are not enough user-defined events left.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pushEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RegisterEvents@.
+--                   The safe flavor is 'registerEventsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RegisterEvents@, defined at @SDL3\/SDL_events.h 1589:36@
+registerEvents
+  :: BG.Int32
+  -- ^
+  --
+  --           [@numevents@]: the number of events to be allocated.
+  -> IO BG.Word32
+registerEvents =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_RegisterEvents (Coerce.coerce x00))
+
+-- | Allocate a set of user-defined events, and return the beginning event number for that set of events.
+--
+--     [Returns]: the beginning event number, or 0 if numevents is invalid or if there are not enough user-defined events left.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pushEvent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RegisterEvents@.
+--                   The unsafe flavor is 'registerEvents'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RegisterEvents@, defined at @SDL3\/SDL_events.h 1589:36@
+registerEventsSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@numevents@]: the number of events to be allocated.
+  -> IO BG.Word32
+registerEventsSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_RegisterEvents (Coerce.coerce x00))
+
+-- | Get window associated with an event.
+--
+--     [Returns]: the associated window on success or NULL if there is none.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pollEvent', 'waitEvent', 'waitEventTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowFromEvent@.
+--                   The safe flavor is 'getWindowFromEventSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowFromEvent@, defined at @SDL3\/SDL_events.h 1605:42@
+getWindowFromEvent
+  :: PtrConst.PtrConst SDL_Event
+  -- ^
+  --
+  --           [@event@]: an event containing a @windowID@.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+getWindowFromEvent = Unsafe.sDL_GetWindowFromEvent
+
+-- | Get window associated with an event.
+--
+--     [Returns]: the associated window on success or NULL if there is none.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pollEvent', 'waitEvent', 'waitEventTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowFromEvent@.
+--                   The unsafe flavor is 'getWindowFromEvent'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowFromEvent@, defined at @SDL3\/SDL_events.h 1605:42@
+getWindowFromEventSafe
+  :: PtrConst.PtrConst SDL_Event
+  -- ^
+  --
+  --           [@event@]: an event containing a @windowID@.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+getWindowFromEventSafe = Safe.sDL_GetWindowFromEvent
+
+-- | Generate an English description of an event.
+--
+--     This will fill @buf@ with a null-terminated string that might look something like this:
+--
+--     @
+--     SDL_EVENT_MOUSE_MOTION (timestamp=1140256324 windowid=2 which=0 state=0 x=492.99 y=139.09 xrel=52 yrel=6)
+--     @
+--
+--     The exact format of the string is not guaranteed; it is intended for logging purposes, to be read by a human, and not parsed by a computer.
+--
+--     The returned value follows the same rules as SDL_snprintf(): @buf@ will always be NULL-terminated (unless @buflen@ is zero), and will be truncated if @buflen@ is too small. The return code is the number of bytes needed for the complete string, not counting the NULL-terminator, whether the string was truncated or not. Unlike SDL_snprintf(), though, this function never returns -1.
+--
+--     [Returns]: number of bytes needed for the full string, not counting the null-terminator byte.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetEventDescription@.
+--                   The safe flavor is 'getEventDescriptionSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetEventDescription@, defined at @SDL3\/SDL_events.h 1637:33@
+getEventDescription
+  :: PtrConst.PtrConst SDL_Event
+  -- ^
+  --
+  --           [@event@]: an event to describe. May be NULL.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@buf@]: the buffer to fill with the description string. May be NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@buflen@]: the maximum bytes that can be written to @buf@.
+  -> IO BG.Int32
+getEventDescription =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_GetEventDescription x00 x11 (Coerce.coerce x22))
+
+-- | Generate an English description of an event.
+--
+--     This will fill @buf@ with a null-terminated string that might look something like this:
+--
+--     @
+--     SDL_EVENT_MOUSE_MOTION (timestamp=1140256324 windowid=2 which=0 state=0 x=492.99 y=139.09 xrel=52 yrel=6)
+--     @
+--
+--     The exact format of the string is not guaranteed; it is intended for logging purposes, to be read by a human, and not parsed by a computer.
+--
+--     The returned value follows the same rules as SDL_snprintf(): @buf@ will always be NULL-terminated (unless @buflen@ is zero), and will be truncated if @buflen@ is too small. The return code is the number of bytes needed for the complete string, not counting the NULL-terminator, whether the string was truncated or not. Unlike SDL_snprintf(), though, this function never returns -1.
+--
+--     [Returns]: number of bytes needed for the full string, not counting the null-terminator byte.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetEventDescription@.
+--                   The unsafe flavor is 'getEventDescription'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetEventDescription@, defined at @SDL3\/SDL_events.h 1637:33@
+getEventDescriptionSafe
+  :: PtrConst.PtrConst SDL_Event
+  -- ^
+  --
+  --           [@event@]: an event to describe. May be NULL.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@buf@]: the buffer to fill with the description string. May be NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@buflen@]: the maximum bytes that can be written to @buf@.
+  -> IO BG.Int32
+getEventDescriptionSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_GetEventDescription x00 x11 (Coerce.coerce x22))
diff --git a/src/SDL3/Sys/Filesystem.hs b/src/SDL3/Sys/Filesystem.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Filesystem.hs
@@ -0,0 +1,832 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | SDL offers an API for examining and manipulating the system\'s filesystem. This covers most things one would need to do with directories, except for actual file I\/O (which is covered by [CategoryIOStream](https:\/\/wiki.libsdl.org\/SDL3\/CategoryIOStream) and [CategoryAsyncIO](https:\/\/wiki.libsdl.org\/SDL3\/CategoryAsyncIO) instead).
+--
+--     There are functions to answer necessary path questions:
+--
+--     * Where is my app\'s data? @'getBasePath'@.
+--
+--     * Where can I safely write files? @'getPrefPath'@.
+--
+--     * Where are paths like Downloads, Desktop, Music? @'getUserFolder'@.
+--
+--     * What is this thing at this location? @'getPathInfo'@.
+--
+--     * What items live in this folder? @'enumerateDirectorySafe'@.
+--
+--     * What items live in this folder by wildcard? @'globDirectory'@.
+--
+--     * What is my current working directory? @'getCurrentDirectory'@.
+--
+--     SDL also offers functions to manipulate the directory tree: renaming, removing, copying files. Get the directory where the application was run from.
+--
+--     SDL caches the result of this call internally, but the first call to this function is not necessarily fast, so plan accordingly.
+--
+--     __macOS and iOS Specific Functionality__: If the application is in a \".app\" bundle, this function returns the Resource directory (e.g. MyApp.app\/Contents\/Resources\/). This behaviour can be overridden by adding a property to the Info.plist file. Adding a string key with the name SDL_FILESYSTEM_BASE_DIR_TYPE with a supported value will change the behaviour.
+--
+--     Supported values for the SDL_FILESYSTEM_BASE_DIR_TYPE property (Given an application in \/Applications\/SDLApp\/MyApp.app):
+--
+--     * @resource@: bundle resource directory (the default). For example: @\/Applications\/SDLApp\/MyApp.app\/Contents\/Resources@
+--
+--     * @bundle@: the Bundle directory. For example: @\/Applications\/SDLApp\/MyApp.app\/@
+--
+--     * @parent@: the containing directory of the bundle. For example: @\/Applications\/SDLApp\/@
+--
+--     __Android Specific Functionality__: This function returns \".\/\", which allows filesystem operations to use internal storage and the asset system.
+--
+--     __Nintendo 3DS Specific Functionality__: This function returns \"romfs\" directory of the application as it is uncommon to store resources outside the executable. As such it is not a writable directory.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: an absolute path in UTF-8 encoding to the application data directory. NULL will be returned on error or when the platform doesn\'t implement this functionality, call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPrefPath'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Filesystem.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Filesystem (
+  module SDL3.Sys.Bindgen.Filesystem,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Filesystem.SDL_GLOB_CASEINSENSITIVE,
+
+  -- * Function aliases
+  SDL3.Sys.Filesystem.getBasePath,
+  SDL3.Sys.Filesystem.getBasePathSafe,
+  SDL3.Sys.Filesystem.getPrefPath,
+  SDL3.Sys.Filesystem.getPrefPathSafe,
+  SDL3.Sys.Filesystem.getUserFolder,
+  SDL3.Sys.Filesystem.getUserFolderSafe,
+  SDL3.Sys.Filesystem.createDirectory,
+  SDL3.Sys.Filesystem.createDirectorySafe,
+  SDL3.Sys.Filesystem.enumerateDirectorySafe,
+  SDL3.Sys.Filesystem.removePath,
+  SDL3.Sys.Filesystem.removePathSafe,
+  SDL3.Sys.Filesystem.renamePath,
+  SDL3.Sys.Filesystem.renamePathSafe,
+  SDL3.Sys.Filesystem.copyFile,
+  SDL3.Sys.Filesystem.copyFileSafe,
+  SDL3.Sys.Filesystem.getPathInfo,
+  SDL3.Sys.Filesystem.getPathInfoSafe,
+  SDL3.Sys.Filesystem.globDirectory,
+  SDL3.Sys.Filesystem.globDirectorySafe,
+  SDL3.Sys.Filesystem.getCurrentDirectory,
+  SDL3.Sys.Filesystem.getCurrentDirectorySafe,
+)
+where
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Filesystem
+import SDL3.Sys.Bindgen.Filesystem.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Filesystem.Unsafe qualified as Unsafe
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetBasePath@.
+--                   The safe flavor is 'getBasePathSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetBasePath@, defined at @SDL3\/SDL_filesystem.h 101:42@
+getBasePath :: IO (PtrConst.PtrConst BG.CChar)
+getBasePath = Unsafe.sDL_GetBasePath
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetBasePath@.
+--                   The unsafe flavor is 'getBasePath'
+--                   .
+--
+--     [C declaration]: @SDL_GetBasePath@, defined at @SDL3\/SDL_filesystem.h 101:42@
+getBasePathSafe :: IO (PtrConst.PtrConst BG.CChar)
+getBasePathSafe = Safe.sDL_GetBasePath
+
+-- | Get the user-and-app-specific path where files can be written.
+--
+--     Get the \"pref dir\". This is meant to be where users can write personal files (preferences and save games, etc) that are specific to your application. This directory is unique per user, per application.
+--
+--     This function will decide the appropriate location in the native filesystem, create the directory if necessary, and return a string of the absolute path to the directory in UTF-8 encoding.
+--
+--     On Windows, the string might look like:
+--
+--     @C:\\\\Users\\\\bob\\\\AppData\\\\Roaming\\\\My Company\\\\My Program Name\\\\@
+--
+--     On Linux, the string might look like:
+--
+--     @\/home\/bob\/.local\/share\/My Program Name\/@
+--
+--     On macOS, the string might look like:
+--
+--     @\/Users\/bob\/Library\/Application Support\/My Program Name\/@
+--
+--     You should assume the path returned by this function is the only safe place to write files (and that @'getBasePath'@, while it might be writable, or even the parent of the returned path, isn\'t where you should be writing things).
+--
+--     Both the org and app strings may become part of a directory name, so please follow these rules:
+--
+--     * Try to use the same org string (/including case-sensitivity/) for all your applications that use this function.
+--
+--     * Always use a unique app string for each one, and make sure it never changes for an app once you\'ve decided on it.
+--
+--     * Unicode characters are legal, as long as they are UTF-8 encoded, but...
+--
+--     * ...only use letters, numbers, and spaces. Avoid punctuation like \"Game Name 2: Bad Guy\'s Revenge!\" ... \"Game Name 2\" is sufficient.
+--
+--     Due to historical mistakes, @org@ is allowed to be NULL or \"\". In such cases, SDL will omit the org subdirectory, including on platforms where it shouldn\'t, and including on platforms where this would make your app fail certification for an app store. New apps should definitely specify a real string for @org@.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: a UTF-8 string of the user directory in platform-dependent notation. NULL if there\'s a problem (creating directory failed, etc.). This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getBasePath'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPrefPath@.
+--                   The safe flavor is 'getPrefPathSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPrefPath@, defined at @SDL3\/SDL_filesystem.h 164:36@
+getPrefPath
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@org@]: the name of your organization.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@app@]: the name of your application.
+  -> IO (BG.Ptr BG.CChar)
+getPrefPath = Unsafe.sDL_GetPrefPath
+
+-- | Get the user-and-app-specific path where files can be written.
+--
+--     Get the \"pref dir\". This is meant to be where users can write personal files (preferences and save games, etc) that are specific to your application. This directory is unique per user, per application.
+--
+--     This function will decide the appropriate location in the native filesystem, create the directory if necessary, and return a string of the absolute path to the directory in UTF-8 encoding.
+--
+--     On Windows, the string might look like:
+--
+--     @C:\\\\Users\\\\bob\\\\AppData\\\\Roaming\\\\My Company\\\\My Program Name\\\\@
+--
+--     On Linux, the string might look like:
+--
+--     @\/home\/bob\/.local\/share\/My Program Name\/@
+--
+--     On macOS, the string might look like:
+--
+--     @\/Users\/bob\/Library\/Application Support\/My Program Name\/@
+--
+--     You should assume the path returned by this function is the only safe place to write files (and that @'getBasePath'@, while it might be writable, or even the parent of the returned path, isn\'t where you should be writing things).
+--
+--     Both the org and app strings may become part of a directory name, so please follow these rules:
+--
+--     * Try to use the same org string (/including case-sensitivity/) for all your applications that use this function.
+--
+--     * Always use a unique app string for each one, and make sure it never changes for an app once you\'ve decided on it.
+--
+--     * Unicode characters are legal, as long as they are UTF-8 encoded, but...
+--
+--     * ...only use letters, numbers, and spaces. Avoid punctuation like \"Game Name 2: Bad Guy\'s Revenge!\" ... \"Game Name 2\" is sufficient.
+--
+--     Due to historical mistakes, @org@ is allowed to be NULL or \"\". In such cases, SDL will omit the org subdirectory, including on platforms where it shouldn\'t, and including on platforms where this would make your app fail certification for an app store. New apps should definitely specify a real string for @org@.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: a UTF-8 string of the user directory in platform-dependent notation. NULL if there\'s a problem (creating directory failed, etc.). This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getBasePath'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPrefPath@.
+--                   The unsafe flavor is 'getPrefPath'
+--                   .
+--
+--     [C declaration]: @SDL_GetPrefPath@, defined at @SDL3\/SDL_filesystem.h 164:36@
+getPrefPathSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@org@]: the name of your organization.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@app@]: the name of your application.
+  -> IO (BG.Ptr BG.CChar)
+getPrefPathSafe = Safe.sDL_GetPrefPath
+
+-- | Finds the most suitable user folder for a specific purpose.
+--
+--     Many OSes provide certain standard folders for certain purposes, such as storing pictures, music or videos for a certain user. This function gives the path for many of those special locations.
+--
+--     This function is specifically for /user/ folders, which are meant for the user to access and manage. For application-specific folders, meant to hold data for the application to manage, see @'getBasePath'@ and @'getPrefPath'@.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     If NULL is returned, the error may be obtained with 'SDL3.Sys.Error.getError'.
+--
+--     [Returns]: either a null-terminated C string containing the full path to the folder, or NULL if an error happened.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetUserFolder@.
+--                   The safe flavor is 'getUserFolderSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetUserFolder@, defined at @SDL3\/SDL_filesystem.h 236:42@
+getUserFolder
+  :: SDL_Folder
+  -- ^
+  --
+  --           [@folder@]: the type of folder to find.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getUserFolder = Unsafe.sDL_GetUserFolder
+
+-- | Finds the most suitable user folder for a specific purpose.
+--
+--     Many OSes provide certain standard folders for certain purposes, such as storing pictures, music or videos for a certain user. This function gives the path for many of those special locations.
+--
+--     This function is specifically for /user/ folders, which are meant for the user to access and manage. For application-specific folders, meant to hold data for the application to manage, see @'getBasePath'@ and @'getPrefPath'@.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     If NULL is returned, the error may be obtained with 'SDL3.Sys.Error.getError'.
+--
+--     [Returns]: either a null-terminated C string containing the full path to the folder, or NULL if an error happened.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetUserFolder@.
+--                   The unsafe flavor is 'getUserFolder'
+--                   .
+--
+--     [C declaration]: @SDL_GetUserFolder@, defined at @SDL3\/SDL_filesystem.h 236:42@
+getUserFolderSafe
+  :: SDL_Folder
+  -- ^
+  --
+  --           [@folder@]: the type of folder to find.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getUserFolderSafe = Safe.sDL_GetUserFolder
+
+-- | Create a directory, and any missing parent directories.
+--
+--     This reports success if @path@ already exists as a directory.
+--
+--     If parent directories are missing, it will also create them. Note that if this fails, it will not remove any parent directories it already made.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateDirectory@.
+--                   The safe flavor is 'createDirectorySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateDirectory@, defined at @SDL3\/SDL_filesystem.h 304:34@
+createDirectory
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to create.
+  -> IO Bool
+createDirectory =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_CreateDirectory x00)
+
+-- | Create a directory, and any missing parent directories.
+--
+--     This reports success if @path@ already exists as a directory.
+--
+--     If parent directories are missing, it will also create them. Note that if this fails, it will not remove any parent directories it already made.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateDirectory@.
+--                   The unsafe flavor is 'createDirectory'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateDirectory@, defined at @SDL3\/SDL_filesystem.h 304:34@
+createDirectorySafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to create.
+  -> IO Bool
+createDirectorySafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_CreateDirectory x00)
+
+-- | Enumerate a directory through a callback function.
+--
+--     This function provides every directory entry through an app-provided callback, called once for each directory entry, until all results have been provided or the callback returns either SDL_ENUM_SUCCESS or SDL_ENUM_FAILURE.
+--
+--     This will return false if there was a system problem in general, or if a callback returns SDL_ENUM_FAILURE. A successful return means a callback returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries were enumerated.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EnumerateDirectory@.
+--                   The unsafe import is not exported
+--                   : invokes the callback per entry synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Filesystem.Unsafe.sDL_EnumerateDirectory@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_EnumerateDirectory@, defined at @SDL3\/SDL_filesystem.h 369:34@
+enumerateDirectorySafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> SDL_EnumerateDirectoryCallback
+  -- ^
+  --
+  --           [@callback@]: a function that is called for each entry in the directory.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO Bool
+enumerateDirectorySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_EnumerateDirectory x00 x11 x22)
+
+-- | Remove a file or an empty directory.
+--
+--     Directories that are not empty will fail; this function will not recursely delete directory trees.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RemovePath@.
+--                   The safe flavor is 'removePathSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RemovePath@, defined at @SDL3\/SDL_filesystem.h 385:34@
+removePath
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to remove from the filesystem.
+  -> IO Bool
+removePath =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_RemovePath x00)
+
+-- | Remove a file or an empty directory.
+--
+--     Directories that are not empty will fail; this function will not recursely delete directory trees.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RemovePath@.
+--                   The unsafe flavor is 'removePath'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RemovePath@, defined at @SDL3\/SDL_filesystem.h 385:34@
+removePathSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to remove from the filesystem.
+  -> IO Bool
+removePathSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_RemovePath x00)
+
+-- | Rename a file or directory.
+--
+--     If the file at @newpath@ already exists, it will be replaced.
+--
+--     Note that this will not copy files across filesystems\/drives\/volumes, as that is a much more complicated (and possibly time-consuming) operation.
+--
+--     Which is to say, if this function fails, @'copyFile'@ to a temporary file in the same directory as @newpath@, then @'renamePath'@ from the temporary file to @newpath@ and @'removePath'@ on @oldpath@ might work for files. Renaming a non-empty directory across filesystems is dramatically more complex, however.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenamePath@.
+--                   The safe flavor is 'renamePathSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenamePath@, defined at @SDL3\/SDL_filesystem.h 410:34@
+renamePath
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO Bool
+renamePath =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_RenamePath x00 x11)
+
+-- | Rename a file or directory.
+--
+--     If the file at @newpath@ already exists, it will be replaced.
+--
+--     Note that this will not copy files across filesystems\/drives\/volumes, as that is a much more complicated (and possibly time-consuming) operation.
+--
+--     Which is to say, if this function fails, @'copyFile'@ to a temporary file in the same directory as @newpath@, then @'renamePath'@ from the temporary file to @newpath@ and @'removePath'@ on @oldpath@ might work for files. Renaming a non-empty directory across filesystems is dramatically more complex, however.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenamePath@.
+--                   The unsafe flavor is 'renamePath'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenamePath@, defined at @SDL3\/SDL_filesystem.h 410:34@
+renamePathSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO Bool
+renamePathSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_RenamePath x00 x11)
+
+-- | Copy a file.
+--
+--     If the file at @newpath@ already exists, it will be overwritten with the contents of the file at @oldpath@.
+--
+--     This function will block until the copy is complete, which might be a significant time for large files on slow disks. On some platforms, the copy can be handed off to the OS itself, but on others SDL might just open both paths, and read from one and write to the other.
+--
+--     Note that this is not an atomic operation! If something tries to read from @newpath@ while the copy is in progress, it will see an incomplete copy of the data, and if the calling thread terminates (or the power goes out) during the copy, @newpath@ \'s previous contents will be gone, replaced with an incomplete copy of the data. To avoid this risk, it is recommended that the app copy to a temporary file in the same directory as @newpath@, and if the copy is successful, use @'renamePath'@ to replace @newpath@ with the temporary file. This will ensure that reads of @newpath@ will either see a complete copy of the data, or it will see the pre-copy state of @newpath@.
+--
+--     This function attempts to synchronize the newly-copied data to disk before returning, if the platform allows it, so that the renaming trick will not have a problem in a system crash or power failure, where the file could be renamed but the contents never made it from the system file cache to the physical disk.
+--
+--     If the copy fails for any reason, the state of @newpath@ is undefined. It might be half a copy, it might be the untouched data of what was already there, or it might be a zero-byte file, etc.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but this operation is not atomic, so the app might need to protect access to specific paths from other threads if appropriate.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CopyFile@.
+--                   The safe flavor is 'copyFileSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CopyFile@, defined at @SDL3\/SDL_filesystem.h 454:34@
+copyFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO Bool
+copyFile =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_CopyFile x00 x11)
+
+-- | Copy a file.
+--
+--     If the file at @newpath@ already exists, it will be overwritten with the contents of the file at @oldpath@.
+--
+--     This function will block until the copy is complete, which might be a significant time for large files on slow disks. On some platforms, the copy can be handed off to the OS itself, but on others SDL might just open both paths, and read from one and write to the other.
+--
+--     Note that this is not an atomic operation! If something tries to read from @newpath@ while the copy is in progress, it will see an incomplete copy of the data, and if the calling thread terminates (or the power goes out) during the copy, @newpath@ \'s previous contents will be gone, replaced with an incomplete copy of the data. To avoid this risk, it is recommended that the app copy to a temporary file in the same directory as @newpath@, and if the copy is successful, use @'renamePath'@ to replace @newpath@ with the temporary file. This will ensure that reads of @newpath@ will either see a complete copy of the data, or it will see the pre-copy state of @newpath@.
+--
+--     This function attempts to synchronize the newly-copied data to disk before returning, if the platform allows it, so that the renaming trick will not have a problem in a system crash or power failure, where the file could be renamed but the contents never made it from the system file cache to the physical disk.
+--
+--     If the copy fails for any reason, the state of @newpath@ is undefined. It might be half a copy, it might be the untouched data of what was already there, or it might be a zero-byte file, etc.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but this operation is not atomic, so the app might need to protect access to specific paths from other threads if appropriate.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CopyFile@.
+--                   The unsafe flavor is 'copyFile'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CopyFile@, defined at @SDL3\/SDL_filesystem.h 454:34@
+copyFileSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO Bool
+copyFileSafe =
+  \x00 ->
+    \x11 -> fmap CBool.toBool (Safe.sDL_CopyFile x00 x11)
+
+-- | Get information about a filesystem path.
+--
+--     Symlinks, on filesystems that support them, are always followed, so you will always get information on what the symlink eventually points to, and not the symlink itself.
+--
+--     [Returns]: true on success or false if the file doesn\'t exist, or another failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPathInfo@.
+--                   The safe flavor is 'getPathInfoSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetPathInfo@, defined at @SDL3\/SDL_filesystem.h 473:34@
+getPathInfo
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to query.
+  -> BG.Ptr SDL_PathInfo
+  -- ^
+  --
+  --           [@info@]: a pointer filled in with information about the path, or NULL to check for the existence of a file.
+  -> IO Bool
+getPathInfo =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetPathInfo x00 x11)
+
+-- | Get information about a filesystem path.
+--
+--     Symlinks, on filesystems that support them, are always followed, so you will always get information on what the symlink eventually points to, and not the symlink itself.
+--
+--     [Returns]: true on success or false if the file doesn\'t exist, or another failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPathInfo@.
+--                   The unsafe flavor is 'getPathInfo'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetPathInfo@, defined at @SDL3\/SDL_filesystem.h 473:34@
+getPathInfoSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to query.
+  -> BG.Ptr SDL_PathInfo
+  -- ^
+  --
+  --           [@info@]: a pointer filled in with information about the path, or NULL to check for the existence of a file.
+  -> IO Bool
+getPathInfoSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetPathInfo x00 x11)
+
+-- | Enumerate a directory tree, filtered by pattern, and return a list.
+--
+--     Files are filtered out if they don\'t match the string in @pattern@, which may contain wildcard characters @*@ (match everything) and @?@ (match one character). If pattern is NULL, no filtering is done and all results are returned. Subdirectories are permitted, and are specified with a path separator of @\/@. Wildcard characters @*@ and @?@ never match a path separator.
+--
+--     @flags@ may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching case-insensitive.
+--
+--     The returned array is always NULL-terminated, for your iterating convenience, but if @count@ is non-NULL, on return it will contain the number of items in the array, not counting the NULL terminator.
+--
+--     [Returns]: an array of strings on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GlobDirectory@.
+--                   The safe flavor is 'globDirectorySafe'
+--                   : blocks on directory traversal.
+--
+--     [C declaration]: @SDL_GlobDirectory@, defined at @SDL3\/SDL_filesystem.h 506:37@
+globDirectory
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pattern@]: the pattern that files in the directory must match. Can be NULL.
+  -> SDL_GlobFlags
+  -- ^
+  --
+  --           [@flags@]: @SDL_GLOB_*@ bitflags that affect this search.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: on return, will be set to the number of items in the returned array. Can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+globDirectory = Unsafe.sDL_GlobDirectory
+
+-- | Enumerate a directory tree, filtered by pattern, and return a list.
+--
+--     Files are filtered out if they don\'t match the string in @pattern@, which may contain wildcard characters @*@ (match everything) and @?@ (match one character). If pattern is NULL, no filtering is done and all results are returned. Subdirectories are permitted, and are specified with a path separator of @\/@. Wildcard characters @*@ and @?@ never match a path separator.
+--
+--     @flags@ may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching case-insensitive.
+--
+--     The returned array is always NULL-terminated, for your iterating convenience, but if @count@ is non-NULL, on return it will contain the number of items in the array, not counting the NULL terminator.
+--
+--     [Returns]: an array of strings on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GlobDirectory@.
+--                   The unsafe flavor is 'globDirectory'
+--                   : blocks on directory traversal.
+--
+--     [C declaration]: @SDL_GlobDirectory@, defined at @SDL3\/SDL_filesystem.h 506:37@
+globDirectorySafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pattern@]: the pattern that files in the directory must match. Can be NULL.
+  -> SDL_GlobFlags
+  -- ^
+  --
+  --           [@flags@]: @SDL_GLOB_*@ bitflags that affect this search.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: on return, will be set to the number of items in the returned array. Can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+globDirectorySafe = Safe.sDL_GlobDirectory
+
+-- | Get what the system believes is the \"current working directory.\"
+--
+--     For systems without a concept of a current working directory, this will still attempt to provide something reasonable.
+--
+--     SDL does not provide a means to /change/ the current working directory; for platforms without this concept, this would cause surprises with file access outside of SDL.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: a UTF-8 string of the current working directory in platform-dependent notation. NULL if there\'s a problem. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCurrentDirectory@.
+--                   The safe flavor is 'getCurrentDirectorySafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentDirectory@, defined at @SDL3\/SDL_filesystem.h 529:36@
+getCurrentDirectory :: IO (BG.Ptr BG.CChar)
+getCurrentDirectory = Unsafe.sDL_GetCurrentDirectory
+
+-- | Get what the system believes is the \"current working directory.\"
+--
+--     For systems without a concept of a current working directory, this will still attempt to provide something reasonable.
+--
+--     SDL does not provide a means to /change/ the current working directory; for platforms without this concept, this would cause surprises with file access outside of SDL.
+--
+--     The returned path is guaranteed to end with a path separator (\'\\\' on Windows, \'\/\' on most other platforms).
+--
+--     [Returns]: a UTF-8 string of the current working directory in platform-dependent notation. NULL if there\'s a problem. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCurrentDirectory@.
+--                   The unsafe flavor is 'getCurrentDirectory'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentDirectory@, defined at @SDL3\/SDL_filesystem.h 529:36@
+getCurrentDirectorySafe :: IO (BG.Ptr BG.CChar)
+getCurrentDirectorySafe =
+  Safe.sDL_GetCurrentDirectory
+
+-- | Typed constant for macro @SDL_GLOB_CASEINSENSITIVE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GLOB_CASEINSENSITIVE :: SDL_GlobFlags
+pattern SDL_GLOB_CASEINSENSITIVE = SDL_GlobFlags 0x00000001
diff --git a/src/SDL3/Sys/Gamepad.hs b/src/SDL3/Sys/Gamepad.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Gamepad.hs
@@ -0,0 +1,4794 @@
+-- | SDL provides a low-level joystick API, which just treats joysticks as an arbitrary pile of buttons, axes, and hat switches. If you\'re planning to write your own control configuration screen, this can give you a lot of flexibility, but that\'s a lot of work, and most things that we consider \"joysticks\" now are actually console-style gamepads. So SDL provides the gamepad API on top of the lower-level joystick functionality.
+--
+--     The difference between a joystick and a gamepad is that a gamepad tells you /where/ a button or axis is on the device. You don\'t speak to gamepads in terms of arbitrary numbers like \"button 3\" or \"axis 2\" but in standard locations: the d-pad, the shoulder buttons, triggers, A\/B\/X\/Y (or X\/O\/Square\/Triangle, if you will).
+--
+--     One turns a joystick into a gamepad by providing a magic configuration string, which tells SDL the details of a specific device: when you see this specific hardware, if button 2 gets pressed, this is actually D-Pad Up, etc.
+--
+--     SDL has many popular controllers configured out of the box, and users can add their own controller details through an environment variable if it\'s otherwise unknown to SDL.
+--
+--     In order to use these functions, 'SDL3.Sys.Init.init' must have been called with the SDL_INIT_GAMEPAD flag. This causes SDL to scan the system for gamepads, and load appropriate drivers.
+--
+--     If you\'re using SDL gamepad support in a Steam game, you must call SteamAPI_InitEx() before calling 'SDL3.Sys.Init.init'.
+--
+--     If you would like to receive gamepad updates while the application is in the background, you should set the following hint before calling 'SDL3.Sys.Init.init': SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
+--
+--     Gamepads support various optional features such as rumble, color LEDs, touchpad, gyro, etc. The support for these features varies depending on the controller and OS support available. You can check for LED and rumble capabilities at runtime by calling @'getGamepadProperties'@ and checking the various capability properties. You can check for touchpad by calling @'getNumGamepadTouchpads'@ and check for gyro and accelerometer by calling @'gamepadHasSensor'@.
+--
+--     By default SDL will try to use the most capable driver available, but you can tune which OS drivers to use with the various joystick hints in SDL_hints.h.
+--
+--     Your application should always support gamepad hotplugging. On some platforms like Xbox, Steam Deck, etc., this is a requirement for certification. On other platforms, like macOS and Windows when using Windows.Gaming.Input, controllers may not be available at startup and will come in at some point after you\'ve started processing events. The structure used to identify an SDL gamepad
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Gamepad.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Gamepad (
+  module SDL3.Sys.Bindgen.Gamepad,
+
+  -- * Function aliases
+  SDL3.Sys.Gamepad.addGamepadMapping,
+  SDL3.Sys.Gamepad.addGamepadMappingSafe,
+  SDL3.Sys.Gamepad.addGamepadMappingsFromIO,
+  SDL3.Sys.Gamepad.addGamepadMappingsFromIOSafe,
+  SDL3.Sys.Gamepad.addGamepadMappingsFromFile,
+  SDL3.Sys.Gamepad.addGamepadMappingsFromFileSafe,
+  SDL3.Sys.Gamepad.reloadGamepadMappings,
+  SDL3.Sys.Gamepad.reloadGamepadMappingsSafe,
+  SDL3.Sys.Gamepad.getGamepadMappings,
+  SDL3.Sys.Gamepad.getGamepadMappingsSafe,
+  SDL3.Sys.Gamepad.getGamepadMappingForGUID,
+  SDL3.Sys.Gamepad.getGamepadMappingForGUIDSafe,
+  SDL3.Sys.Gamepad.getGamepadMapping,
+  SDL3.Sys.Gamepad.getGamepadMappingSafe,
+  SDL3.Sys.Gamepad.setGamepadMapping,
+  SDL3.Sys.Gamepad.setGamepadMappingSafe,
+  SDL3.Sys.Gamepad.hasGamepad,
+  SDL3.Sys.Gamepad.hasGamepadSafe,
+  SDL3.Sys.Gamepad.getGamepads,
+  SDL3.Sys.Gamepad.getGamepadsSafe,
+  SDL3.Sys.Gamepad.isGamepad,
+  SDL3.Sys.Gamepad.isGamepadSafe,
+  SDL3.Sys.Gamepad.getGamepadNameForID,
+  SDL3.Sys.Gamepad.getGamepadNameForIDSafe,
+  SDL3.Sys.Gamepad.getGamepadPathForID,
+  SDL3.Sys.Gamepad.getGamepadPathForIDSafe,
+  SDL3.Sys.Gamepad.getGamepadPlayerIndexForID,
+  SDL3.Sys.Gamepad.getGamepadPlayerIndexForIDSafe,
+  SDL3.Sys.Gamepad.getGamepadGUIDForID,
+  SDL3.Sys.Gamepad.getGamepadGUIDForIDSafe,
+  SDL3.Sys.Gamepad.getGamepadVendorForID,
+  SDL3.Sys.Gamepad.getGamepadVendorForIDSafe,
+  SDL3.Sys.Gamepad.getGamepadProductForID,
+  SDL3.Sys.Gamepad.getGamepadProductForIDSafe,
+  SDL3.Sys.Gamepad.getGamepadProductVersionForID,
+  SDL3.Sys.Gamepad.getGamepadProductVersionForIDSafe,
+  SDL3.Sys.Gamepad.getGamepadTypeForID,
+  SDL3.Sys.Gamepad.getGamepadTypeForIDSafe,
+  SDL3.Sys.Gamepad.getRealGamepadTypeForID,
+  SDL3.Sys.Gamepad.getRealGamepadTypeForIDSafe,
+  SDL3.Sys.Gamepad.getGamepadMappingForID,
+  SDL3.Sys.Gamepad.getGamepadMappingForIDSafe,
+  SDL3.Sys.Gamepad.openGamepad,
+  SDL3.Sys.Gamepad.openGamepadSafe,
+  SDL3.Sys.Gamepad.getGamepadFromID,
+  SDL3.Sys.Gamepad.getGamepadFromIDSafe,
+  SDL3.Sys.Gamepad.getGamepadFromPlayerIndex,
+  SDL3.Sys.Gamepad.getGamepadFromPlayerIndexSafe,
+  SDL3.Sys.Gamepad.getGamepadProperties,
+  SDL3.Sys.Gamepad.getGamepadPropertiesSafe,
+  SDL3.Sys.Gamepad.getGamepadID,
+  SDL3.Sys.Gamepad.getGamepadIDSafe,
+  SDL3.Sys.Gamepad.getGamepadName,
+  SDL3.Sys.Gamepad.getGamepadNameSafe,
+  SDL3.Sys.Gamepad.getGamepadPath,
+  SDL3.Sys.Gamepad.getGamepadPathSafe,
+  SDL3.Sys.Gamepad.getGamepadType,
+  SDL3.Sys.Gamepad.getGamepadTypeSafe,
+  SDL3.Sys.Gamepad.getRealGamepadType,
+  SDL3.Sys.Gamepad.getRealGamepadTypeSafe,
+  SDL3.Sys.Gamepad.getGamepadPlayerIndex,
+  SDL3.Sys.Gamepad.getGamepadPlayerIndexSafe,
+  SDL3.Sys.Gamepad.setGamepadPlayerIndex,
+  SDL3.Sys.Gamepad.setGamepadPlayerIndexSafe,
+  SDL3.Sys.Gamepad.getGamepadVendor,
+  SDL3.Sys.Gamepad.getGamepadVendorSafe,
+  SDL3.Sys.Gamepad.getGamepadProduct,
+  SDL3.Sys.Gamepad.getGamepadProductSafe,
+  SDL3.Sys.Gamepad.getGamepadProductVersion,
+  SDL3.Sys.Gamepad.getGamepadProductVersionSafe,
+  SDL3.Sys.Gamepad.getGamepadFirmwareVersion,
+  SDL3.Sys.Gamepad.getGamepadFirmwareVersionSafe,
+  SDL3.Sys.Gamepad.getGamepadSerial,
+  SDL3.Sys.Gamepad.getGamepadSerialSafe,
+  SDL3.Sys.Gamepad.getGamepadSteamHandle,
+  SDL3.Sys.Gamepad.getGamepadSteamHandleSafe,
+  SDL3.Sys.Gamepad.getGamepadConnectionState,
+  SDL3.Sys.Gamepad.getGamepadConnectionStateSafe,
+  SDL3.Sys.Gamepad.getGamepadPowerInfo,
+  SDL3.Sys.Gamepad.getGamepadPowerInfoSafe,
+  SDL3.Sys.Gamepad.gamepadConnected,
+  SDL3.Sys.Gamepad.gamepadConnectedSafe,
+  SDL3.Sys.Gamepad.getGamepadJoystick,
+  SDL3.Sys.Gamepad.getGamepadJoystickSafe,
+  SDL3.Sys.Gamepad.setGamepadEventsEnabled,
+  SDL3.Sys.Gamepad.setGamepadEventsEnabledSafe,
+  SDL3.Sys.Gamepad.gamepadEventsEnabled,
+  SDL3.Sys.Gamepad.gamepadEventsEnabledSafe,
+  SDL3.Sys.Gamepad.getGamepadBindings,
+  SDL3.Sys.Gamepad.getGamepadBindingsSafe,
+  SDL3.Sys.Gamepad.updateGamepads,
+  SDL3.Sys.Gamepad.updateGamepadsSafe,
+  SDL3.Sys.Gamepad.getGamepadTypeFromString,
+  SDL3.Sys.Gamepad.getGamepadTypeFromStringSafe,
+  SDL3.Sys.Gamepad.getGamepadStringForType,
+  SDL3.Sys.Gamepad.getGamepadStringForTypeSafe,
+  SDL3.Sys.Gamepad.getGamepadAxisFromString,
+  SDL3.Sys.Gamepad.getGamepadAxisFromStringSafe,
+  SDL3.Sys.Gamepad.getGamepadStringForAxis,
+  SDL3.Sys.Gamepad.getGamepadStringForAxisSafe,
+  SDL3.Sys.Gamepad.gamepadHasAxis,
+  SDL3.Sys.Gamepad.gamepadHasAxisSafe,
+  SDL3.Sys.Gamepad.getGamepadAxis,
+  SDL3.Sys.Gamepad.getGamepadAxisSafe,
+  SDL3.Sys.Gamepad.getGamepadButtonFromString,
+  SDL3.Sys.Gamepad.getGamepadButtonFromStringSafe,
+  SDL3.Sys.Gamepad.getGamepadStringForButton,
+  SDL3.Sys.Gamepad.getGamepadStringForButtonSafe,
+  SDL3.Sys.Gamepad.gamepadHasButton,
+  SDL3.Sys.Gamepad.gamepadHasButtonSafe,
+  SDL3.Sys.Gamepad.getGamepadButton,
+  SDL3.Sys.Gamepad.getGamepadButtonSafe,
+  SDL3.Sys.Gamepad.getGamepadButtonLabelForType,
+  SDL3.Sys.Gamepad.getGamepadButtonLabelForTypeSafe,
+  SDL3.Sys.Gamepad.getGamepadButtonLabel,
+  SDL3.Sys.Gamepad.getGamepadButtonLabelSafe,
+  SDL3.Sys.Gamepad.getNumGamepadTouchpads,
+  SDL3.Sys.Gamepad.getNumGamepadTouchpadsSafe,
+  SDL3.Sys.Gamepad.getNumGamepadTouchpadFingers,
+  SDL3.Sys.Gamepad.getNumGamepadTouchpadFingersSafe,
+  SDL3.Sys.Gamepad.getGamepadTouchpadFinger,
+  SDL3.Sys.Gamepad.getGamepadTouchpadFingerSafe,
+  SDL3.Sys.Gamepad.gamepadHasSensor,
+  SDL3.Sys.Gamepad.gamepadHasSensorSafe,
+  SDL3.Sys.Gamepad.setGamepadSensorEnabled,
+  SDL3.Sys.Gamepad.setGamepadSensorEnabledSafe,
+  SDL3.Sys.Gamepad.gamepadSensorEnabled,
+  SDL3.Sys.Gamepad.gamepadSensorEnabledSafe,
+  SDL3.Sys.Gamepad.getGamepadSensorDataRate,
+  SDL3.Sys.Gamepad.getGamepadSensorDataRateSafe,
+  SDL3.Sys.Gamepad.getGamepadSensorData,
+  SDL3.Sys.Gamepad.getGamepadSensorDataSafe,
+  SDL3.Sys.Gamepad.rumbleGamepad,
+  SDL3.Sys.Gamepad.rumbleGamepadSafe,
+  SDL3.Sys.Gamepad.rumbleGamepadTriggers,
+  SDL3.Sys.Gamepad.rumbleGamepadTriggersSafe,
+  SDL3.Sys.Gamepad.setGamepadLED,
+  SDL3.Sys.Gamepad.setGamepadLEDSafe,
+  SDL3.Sys.Gamepad.sendGamepadEffect,
+  SDL3.Sys.Gamepad.sendGamepadEffectSafe,
+  SDL3.Sys.Gamepad.closeGamepad,
+  SDL3.Sys.Gamepad.closeGamepadSafe,
+  SDL3.Sys.Gamepad.getGamepadAppleSFSymbolsNameForButton,
+  SDL3.Sys.Gamepad.getGamepadAppleSFSymbolsNameForButtonSafe,
+  SDL3.Sys.Gamepad.getGamepadAppleSFSymbolsNameForAxis,
+  SDL3.Sys.Gamepad.getGamepadAppleSFSymbolsNameForAxisSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Gamepad
+import SDL3.Sys.Bindgen.Gamepad.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Gamepad.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Guid qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Joystick qualified
+import SDL3.Sys.Bindgen.Power qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Add support for gamepads that SDL is unaware of or change the binding of an existing gamepad.
+--
+--     The mapping string has the format \"GUID,name,mapping\", where GUID is the string value from 'SDL3.Sys.Guid.guidToString', name is the human readable string for the device and mappings are gamepad mappings to joystick ones. Under Windows there is a reserved GUID of \"xinput\" that covers all XInput devices. The mapping format for joystick is:
+--
+--     * @bX@: a joystick button, index X
+--
+--     * @hX.Y@: hat X with value Y
+--
+--     * @aX@: axis X of the joystick
+--
+--     Buttons can be used as a gamepad axes and vice versa.
+--
+--     If a device with this GUID is already plugged in, SDL will generate an SDL_EVENT_GAMEPAD_ADDED event.
+--
+--     This string shows an example of a valid mapping for a gamepad:
+--
+--     @
+--     \"341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\"
+--     @
+--
+--     [Returns]: 1 if a new mapping is added, 0 if an existing mapping is updated, -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addGamepadMappingsFromFile', 'addGamepadMappingsFromIO', 'getGamepadMapping', 'getGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AddGamepadMapping@.
+--                   The safe flavor is 'addGamepadMappingSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 346:33@
+addGamepadMapping
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mapping@]: the mapping string.
+  -> IO BG.Int32
+addGamepadMapping =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_AddGamepadMapping x00)
+
+-- | Add support for gamepads that SDL is unaware of or change the binding of an existing gamepad.
+--
+--     The mapping string has the format \"GUID,name,mapping\", where GUID is the string value from 'SDL3.Sys.Guid.guidToString', name is the human readable string for the device and mappings are gamepad mappings to joystick ones. Under Windows there is a reserved GUID of \"xinput\" that covers all XInput devices. The mapping format for joystick is:
+--
+--     * @bX@: a joystick button, index X
+--
+--     * @hX.Y@: hat X with value Y
+--
+--     * @aX@: axis X of the joystick
+--
+--     Buttons can be used as a gamepad axes and vice versa.
+--
+--     If a device with this GUID is already plugged in, SDL will generate an SDL_EVENT_GAMEPAD_ADDED event.
+--
+--     This string shows an example of a valid mapping for a gamepad:
+--
+--     @
+--     \"341a3608000000000000504944564944,Afterglow PS3 Controller,a:b1,b:b2,y:b3,x:b0,start:b9,guide:b12,back:b8,dpup:h0.1,dpleft:h0.8,dpdown:h0.4,dpright:h0.2,leftshoulder:b4,rightshoulder:b5,leftstick:b10,rightstick:b11,leftx:a0,lefty:a1,rightx:a2,righty:a3,lefttrigger:b6,righttrigger:b7\"
+--     @
+--
+--     [Returns]: 1 if a new mapping is added, 0 if an existing mapping is updated, -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addGamepadMappingsFromFile', 'addGamepadMappingsFromIO', 'getGamepadMapping', 'getGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddGamepadMapping@.
+--                   The unsafe flavor is 'addGamepadMapping'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 346:33@
+addGamepadMappingSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mapping@]: the mapping string.
+  -> IO BG.Int32
+addGamepadMappingSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_AddGamepadMapping x00)
+
+-- | Load a set of gamepad mappings from an SDL_IOStream.
+--
+--     You can call this function several times, if needed, to load different database files.
+--
+--     If a new mapping is loaded for an already known gamepad GUID, the later version will overwrite the one currently loaded.
+--
+--     Any new mappings for already plugged in controllers will generate SDL_EVENT_GAMEPAD_ADDED events.
+--
+--     Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).
+--
+--     This function will load the text database entirely in memory before processing it, so take this into consideration if you are in a memory constrained environment.
+--
+--     [Returns]: the number of mappings added or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addGamepadMapping', 'addGamepadMappingsFromFile', 'getGamepadMapping', 'getGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AddGamepadMappingsFromIO@.
+--                   The safe flavor is 'addGamepadMappingsFromIOSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddGamepadMappingsFromIO@, defined at @SDL3\/SDL_gamepad.h 386:33@
+addGamepadMappingsFromIO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the mappings to be added.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @src@ before returning, even in the case of an error.
+  -> IO BG.Int32
+addGamepadMappingsFromIO =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_AddGamepadMappingsFromIO x00 (CBool.fromBool x11))
+
+-- | Load a set of gamepad mappings from an SDL_IOStream.
+--
+--     You can call this function several times, if needed, to load different database files.
+--
+--     If a new mapping is loaded for an already known gamepad GUID, the later version will overwrite the one currently loaded.
+--
+--     Any new mappings for already plugged in controllers will generate SDL_EVENT_GAMEPAD_ADDED events.
+--
+--     Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).
+--
+--     This function will load the text database entirely in memory before processing it, so take this into consideration if you are in a memory constrained environment.
+--
+--     [Returns]: the number of mappings added or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addGamepadMapping', 'addGamepadMappingsFromFile', 'getGamepadMapping', 'getGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddGamepadMappingsFromIO@.
+--                   The unsafe flavor is 'addGamepadMappingsFromIO'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddGamepadMappingsFromIO@, defined at @SDL3\/SDL_gamepad.h 386:33@
+addGamepadMappingsFromIOSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the mappings to be added.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @src@ before returning, even in the case of an error.
+  -> IO BG.Int32
+addGamepadMappingsFromIOSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_AddGamepadMappingsFromIO x00 (CBool.fromBool x11))
+
+-- | Load a set of gamepad mappings from a file.
+--
+--     You can call this function several times, if needed, to load different database files.
+--
+--     If a new mapping is loaded for an already known gamepad GUID, the later version will overwrite the one currently loaded.
+--
+--     Any new mappings for already plugged in controllers will generate SDL_EVENT_GAMEPAD_ADDED events.
+--
+--     Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).
+--
+--     [Returns]: the number of mappings added or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addGamepadMapping', 'addGamepadMappingsFromIO', 'getGamepadMapping', 'getGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AddGamepadMappingsFromFile@.
+--                   The safe flavor is 'addGamepadMappingsFromFileSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddGamepadMappingsFromFile@, defined at @SDL3\/SDL_gamepad.h 420:33@
+addGamepadMappingsFromFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the mappings file to load.
+  -> IO BG.Int32
+addGamepadMappingsFromFile =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_AddGamepadMappingsFromFile x00)
+
+-- | Load a set of gamepad mappings from a file.
+--
+--     You can call this function several times, if needed, to load different database files.
+--
+--     If a new mapping is loaded for an already known gamepad GUID, the later version will overwrite the one currently loaded.
+--
+--     Any new mappings for already plugged in controllers will generate SDL_EVENT_GAMEPAD_ADDED events.
+--
+--     Mappings not belonging to the current platform or with no platform field specified will be ignored (i.e. mappings for Linux will be ignored in Windows, etc).
+--
+--     [Returns]: the number of mappings added or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addGamepadMapping', 'addGamepadMappingsFromIO', 'getGamepadMapping', 'getGamepadMappingForGUID', SDL_HINT_GAMECONTROLLERCONFIG, SDL_HINT_GAMECONTROLLERCONFIG_FILE, SDL_EVENT_GAMEPAD_ADDED
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddGamepadMappingsFromFile@.
+--                   The unsafe flavor is 'addGamepadMappingsFromFile'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddGamepadMappingsFromFile@, defined at @SDL3\/SDL_gamepad.h 420:33@
+addGamepadMappingsFromFileSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the mappings file to load.
+  -> IO BG.Int32
+addGamepadMappingsFromFileSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_AddGamepadMappingsFromFile x00)
+
+-- | Reinitialize the SDL mapping database to its initial state.
+--
+--     This will generate gamepad events as needed if device mappings change.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReloadGamepadMappings@.
+--                   The safe flavor is 'reloadGamepadMappingsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReloadGamepadMappings@, defined at @SDL3\/SDL_gamepad.h 434:34@
+reloadGamepadMappings :: IO Bool
+reloadGamepadMappings =
+  fmap CBool.toBool Unsafe.sDL_ReloadGamepadMappings
+
+-- | Reinitialize the SDL mapping database to its initial state.
+--
+--     This will generate gamepad events as needed if device mappings change.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReloadGamepadMappings@.
+--                   The unsafe flavor is 'reloadGamepadMappings'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReloadGamepadMappings@, defined at @SDL3\/SDL_gamepad.h 434:34@
+reloadGamepadMappingsSafe :: IO Bool
+reloadGamepadMappingsSafe =
+  fmap CBool.toBool Safe.sDL_ReloadGamepadMappings
+
+-- | Get the current gamepad mappings.
+--
+--     [Returns]: an array of the mapping strings, NULL-terminated, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadMappings@.
+--                   The safe flavor is 'getGamepadMappingsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadMappings@, defined at @SDL3\/SDL_gamepad.h 450:37@
+getGamepadMappings
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of mappings returned, can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+getGamepadMappings = Unsafe.sDL_GetGamepadMappings
+
+-- | Get the current gamepad mappings.
+--
+--     [Returns]: an array of the mapping strings, NULL-terminated, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadMappings@.
+--                   The unsafe flavor is 'getGamepadMappings'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadMappings@, defined at @SDL3\/SDL_gamepad.h 450:37@
+getGamepadMappingsSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of mappings returned, can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+getGamepadMappingsSafe = Safe.sDL_GetGamepadMappings
+
+-- | Get the gamepad mapping string for a given GUID.
+--
+--     [Returns]: a mapping string or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Joystick.getJoystickGUIDForID', 'SDL3.Sys.Joystick.getJoystickGUID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadMappingForGUID@.
+--                   The safe flavor is 'getGamepadMappingForGUIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadMappingForGUID@, defined at @SDL3\/SDL_gamepad.h 467:36@
+getGamepadMappingForGUID
+  :: SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: a structure containing the GUID for which a mapping is desired.
+  -> IO (BG.Ptr BG.CChar)
+getGamepadMappingForGUID =
+  Unsafe.sDL_GetGamepadMappingForGUID
+
+-- | Get the gamepad mapping string for a given GUID.
+--
+--     [Returns]: a mapping string or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Joystick.getJoystickGUIDForID', 'SDL3.Sys.Joystick.getJoystickGUID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadMappingForGUID@.
+--                   The unsafe flavor is 'getGamepadMappingForGUID'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadMappingForGUID@, defined at @SDL3\/SDL_gamepad.h 467:36@
+getGamepadMappingForGUIDSafe
+  :: SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: a structure containing the GUID for which a mapping is desired.
+  -> IO (BG.Ptr BG.CChar)
+getGamepadMappingForGUIDSafe =
+  Safe.sDL_GetGamepadMappingForGUID
+
+-- | Get the current mapping of a gamepad.
+--
+--     Details about mappings are discussed with @'addGamepadMapping'@.
+--
+--     [Returns]: a string that has the gamepad\'s mapping or NULL if no mapping is available; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addGamepadMapping', 'getGamepadMappingForID', 'getGamepadMappingForGUID', 'setGamepadMapping'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadMapping@.
+--                   The safe flavor is 'getGamepadMappingSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 488:36@
+getGamepadMapping
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad you want to get the current mapping for.
+  -> IO (BG.Ptr BG.CChar)
+getGamepadMapping = Unsafe.sDL_GetGamepadMapping
+
+-- | Get the current mapping of a gamepad.
+--
+--     Details about mappings are discussed with @'addGamepadMapping'@.
+--
+--     [Returns]: a string that has the gamepad\'s mapping or NULL if no mapping is available; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addGamepadMapping', 'getGamepadMappingForID', 'getGamepadMappingForGUID', 'setGamepadMapping'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadMapping@.
+--                   The unsafe flavor is 'getGamepadMapping'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 488:36@
+getGamepadMappingSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad you want to get the current mapping for.
+  -> IO (BG.Ptr BG.CChar)
+getGamepadMappingSafe = Safe.sDL_GetGamepadMapping
+
+-- | Set the current mapping of a joystick or gamepad.
+--
+--     Details about mappings are discussed with @'addGamepadMapping'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addGamepadMapping', 'getGamepadMapping'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGamepadMapping@.
+--                   The safe flavor is 'setGamepadMappingSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 508:34@
+setGamepadMapping
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mapping@]: the mapping to use for this device, or NULL to clear the mapping.
+  -> IO Bool
+setGamepadMapping =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetGamepadMapping x00 x11)
+
+-- | Set the current mapping of a joystick or gamepad.
+--
+--     Details about mappings are discussed with @'addGamepadMapping'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addGamepadMapping', 'getGamepadMapping'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGamepadMapping@.
+--                   The unsafe flavor is 'setGamepadMapping'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGamepadMapping@, defined at @SDL3\/SDL_gamepad.h 508:34@
+setGamepadMappingSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mapping@]: the mapping to use for this device, or NULL to clear the mapping.
+  -> IO Bool
+setGamepadMappingSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetGamepadMapping x00 x11)
+
+-- | Return whether a gamepad is currently connected.
+--
+--     [Returns]: true if a gamepad is connected, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasGamepad@.
+--                   The safe flavor is 'hasGamepadSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasGamepad@, defined at @SDL3\/SDL_gamepad.h 521:34@
+hasGamepad :: IO Bool
+hasGamepad = fmap CBool.toBool Unsafe.sDL_HasGamepad
+
+-- | Return whether a gamepad is currently connected.
+--
+--     [Returns]: true if a gamepad is connected, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasGamepad@.
+--                   The unsafe flavor is 'hasGamepad'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasGamepad@, defined at @SDL3\/SDL_gamepad.h 521:34@
+hasGamepadSafe :: IO Bool
+hasGamepadSafe =
+  fmap CBool.toBool Safe.sDL_HasGamepad
+
+-- | Get a list of currently connected gamepads.
+--
+--     [Returns]: a 0 terminated array of joystick instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasGamepad', 'openGamepad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepads@.
+--                   The safe flavor is 'getGamepadsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepads@, defined at @SDL3\/SDL_gamepad.h 539:46@
+getGamepads
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of gamepads returned, may be NULL.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+getGamepads = Unsafe.sDL_GetGamepads
+
+-- | Get a list of currently connected gamepads.
+--
+--     [Returns]: a 0 terminated array of joystick instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasGamepad', 'openGamepad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepads@.
+--                   The unsafe flavor is 'getGamepads'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepads@, defined at @SDL3\/SDL_gamepad.h 539:46@
+getGamepadsSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of gamepads returned, may be NULL.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_JoystickID)
+getGamepadsSafe = Safe.sDL_GetGamepads
+
+-- | Check if the given joystick is supported by the gamepad interface.
+--
+--     [Returns]: true if the given joystick is supported by the gamepad interface, false if it isn\'t or it\'s an invalid index.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Joystick.getJoysticks', 'openGamepad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IsGamepad@.
+--                   The safe flavor is 'isGamepadSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsGamepad@, defined at @SDL3\/SDL_gamepad.h 555:34@
+isGamepad
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO Bool
+isGamepad =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_IsGamepad x00)
+
+-- | Check if the given joystick is supported by the gamepad interface.
+--
+--     [Returns]: true if the given joystick is supported by the gamepad interface, false if it isn\'t or it\'s an invalid index.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Joystick.getJoysticks', 'openGamepad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IsGamepad@.
+--                   The unsafe flavor is 'isGamepad'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsGamepad@, defined at @SDL3\/SDL_gamepad.h 555:34@
+isGamepadSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO Bool
+isGamepadSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_IsGamepad x00)
+
+-- | Get the implementation dependent name of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the name of the selected gamepad. If no name can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadName', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadNameForID@.
+--                   The safe flavor is 'getGamepadNameForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadNameForID@, defined at @SDL3\/SDL_gamepad.h 573:42@
+getGamepadNameForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadNameForID = Unsafe.sDL_GetGamepadNameForID
+
+-- | Get the implementation dependent name of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the name of the selected gamepad. If no name can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadName', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadNameForID@.
+--                   The unsafe flavor is 'getGamepadNameForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadNameForID@, defined at @SDL3\/SDL_gamepad.h 573:42@
+getGamepadNameForIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadNameForIDSafe =
+  Safe.sDL_GetGamepadNameForID
+
+-- | Get the implementation dependent path of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the path of the selected gamepad. If no path can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadPath', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadPathForID@.
+--                   The safe flavor is 'getGamepadPathForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadPathForID@, defined at @SDL3\/SDL_gamepad.h 591:42@
+getGamepadPathForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadPathForID = Unsafe.sDL_GetGamepadPathForID
+
+-- | Get the implementation dependent path of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the path of the selected gamepad. If no path can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadPath', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadPathForID@.
+--                   The unsafe flavor is 'getGamepadPathForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadPathForID@, defined at @SDL3\/SDL_gamepad.h 591:42@
+getGamepadPathForIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadPathForIDSafe =
+  Safe.sDL_GetGamepadPathForID
+
+-- | Get the player index of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the player index of a gamepad, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadPlayerIndex', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadPlayerIndexForID@.
+--                   The safe flavor is 'getGamepadPlayerIndexForIDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadPlayerIndexForID@, defined at @SDL3\/SDL_gamepad.h 608:33@
+getGamepadPlayerIndexForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Int32
+getGamepadPlayerIndexForID =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetGamepadPlayerIndexForID x00)
+
+-- | Get the player index of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the player index of a gamepad, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadPlayerIndex', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadPlayerIndexForID@.
+--                   The unsafe flavor is 'getGamepadPlayerIndexForID'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadPlayerIndexForID@, defined at @SDL3\/SDL_gamepad.h 608:33@
+getGamepadPlayerIndexForIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Int32
+getGamepadPlayerIndexForIDSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetGamepadPlayerIndexForID x00)
+
+-- | Get the implementation-dependent GUID of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the GUID of the selected gamepad. If called on an invalid index, this function returns a zero GUID.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Guid.guidToString', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadGUIDForID@.
+--                   The safe flavor is 'getGamepadGUIDForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadGUIDForID@, defined at @SDL3\/SDL_gamepad.h 626:38@
+getGamepadGUIDForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+getGamepadGUIDForID = Unsafe.sDL_GetGamepadGUIDForID
+
+-- | Get the implementation-dependent GUID of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the GUID of the selected gamepad. If called on an invalid index, this function returns a zero GUID.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Guid.guidToString', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadGUIDForID@.
+--                   The unsafe flavor is 'getGamepadGUIDForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadGUIDForID@, defined at @SDL3\/SDL_gamepad.h 626:38@
+getGamepadGUIDForIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+getGamepadGUIDForIDSafe =
+  Safe.sDL_GetGamepadGUIDForID
+
+-- | Get the USB vendor ID of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadVendor', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadVendorForID@.
+--                   The safe flavor is 'getGamepadVendorForIDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadVendorForID@, defined at @SDL3\/SDL_gamepad.h 645:36@
+getGamepadVendorForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getGamepadVendorForID =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetGamepadVendorForID x00)
+
+-- | Get the USB vendor ID of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadVendor', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadVendorForID@.
+--                   The unsafe flavor is 'getGamepadVendorForID'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadVendorForID@, defined at @SDL3\/SDL_gamepad.h 645:36@
+getGamepadVendorForIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getGamepadVendorForIDSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetGamepadVendorForID x00)
+
+-- | Get the USB product ID of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadProduct', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadProductForID@.
+--                   The safe flavor is 'getGamepadProductForIDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadProductForID@, defined at @SDL3\/SDL_gamepad.h 664:36@
+getGamepadProductForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getGamepadProductForID =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetGamepadProductForID x00)
+
+-- | Get the USB product ID of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadProduct', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadProductForID@.
+--                   The unsafe flavor is 'getGamepadProductForID'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadProductForID@, defined at @SDL3\/SDL_gamepad.h 664:36@
+getGamepadProductForIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getGamepadProductForIDSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetGamepadProductForID x00)
+
+-- | Get the product version of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadProductVersion', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadProductVersionForID@.
+--                   The safe flavor is 'getGamepadProductVersionForIDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadProductVersionForID@, defined at @SDL3\/SDL_gamepad.h 683:36@
+getGamepadProductVersionForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getGamepadProductVersionForID =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetGamepadProductVersionForID x00)
+
+-- | Get the product version of a gamepad, if available.
+--
+--     This can be called before any gamepads are opened. If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected gamepad. If called on an invalid index, this function returns zero.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadProductVersion', 'getGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadProductVersionForID@.
+--                   The unsafe flavor is 'getGamepadProductVersionForID'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadProductVersionForID@, defined at @SDL3\/SDL_gamepad.h 683:36@
+getGamepadProductVersionForIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getGamepadProductVersionForIDSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetGamepadProductVersionForID x00)
+
+-- | Get the type of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the gamepad type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadType', 'getGamepads', 'getRealGamepadTypeForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadTypeForID@.
+--                   The safe flavor is 'getGamepadTypeForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadTypeForID@, defined at @SDL3\/SDL_gamepad.h 701:45@
+getGamepadTypeForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_GamepadType
+getGamepadTypeForID = Unsafe.sDL_GetGamepadTypeForID
+
+-- | Get the type of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the gamepad type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadType', 'getGamepads', 'getRealGamepadTypeForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadTypeForID@.
+--                   The unsafe flavor is 'getGamepadTypeForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadTypeForID@, defined at @SDL3\/SDL_gamepad.h 701:45@
+getGamepadTypeForIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_GamepadType
+getGamepadTypeForIDSafe =
+  Safe.sDL_GetGamepadTypeForID
+
+-- | Get the type of a gamepad, ignoring any mapping override.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the gamepad type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadTypeForID', 'getGamepads', 'getRealGamepadType'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRealGamepadTypeForID@.
+--                   The safe flavor is 'getRealGamepadTypeForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRealGamepadTypeForID@, defined at @SDL3\/SDL_gamepad.h 719:45@
+getRealGamepadTypeForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_GamepadType
+getRealGamepadTypeForID =
+  Unsafe.sDL_GetRealGamepadTypeForID
+
+-- | Get the type of a gamepad, ignoring any mapping override.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the gamepad type.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadTypeForID', 'getGamepads', 'getRealGamepadType'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRealGamepadTypeForID@.
+--                   The unsafe flavor is 'getRealGamepadTypeForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetRealGamepadTypeForID@, defined at @SDL3\/SDL_gamepad.h 719:45@
+getRealGamepadTypeForIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_GamepadType
+getRealGamepadTypeForIDSafe =
+  Safe.sDL_GetRealGamepadTypeForID
+
+-- | Get the mapping of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the mapping string. Returns NULL if no mapping is available. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepads', 'getGamepadMapping'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadMappingForID@.
+--                   The safe flavor is 'getGamepadMappingForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadMappingForID@, defined at @SDL3\/SDL_gamepad.h 737:36@
+getGamepadMappingForID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr BG.CChar)
+getGamepadMappingForID =
+  Unsafe.sDL_GetGamepadMappingForID
+
+-- | Get the mapping of a gamepad.
+--
+--     This can be called before any gamepads are opened.
+--
+--     [Returns]: the mapping string. Returns NULL if no mapping is available. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepads', 'getGamepadMapping'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadMappingForID@.
+--                   The unsafe flavor is 'getGamepadMappingForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadMappingForID@, defined at @SDL3\/SDL_gamepad.h 737:36@
+getGamepadMappingForIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr BG.CChar)
+getGamepadMappingForIDSafe =
+  Safe.sDL_GetGamepadMappingForID
+
+-- | Open a gamepad for use.
+--
+--     [Returns]: a gamepad identifier or NULL if an error occurred; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeGamepad', 'isGamepad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenGamepad@.
+--                   The safe flavor is 'openGamepadSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenGamepad@, defined at @SDL3\/SDL_gamepad.h 753:43@
+openGamepad
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr SDL_Gamepad)
+openGamepad = Unsafe.sDL_OpenGamepad
+
+-- | Open a gamepad for use.
+--
+--     [Returns]: a gamepad identifier or NULL if an error occurred; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeGamepad', 'isGamepad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenGamepad@.
+--                   The unsafe flavor is 'openGamepad'
+--                   .
+--
+--     [C declaration]: @SDL_OpenGamepad@, defined at @SDL3\/SDL_gamepad.h 753:43@
+openGamepadSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr SDL_Gamepad)
+openGamepadSafe = Safe.sDL_OpenGamepad
+
+-- | Get the 'SDL_Gamepad' associated with a joystick instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Gamepad' on success or NULL on failure or if it hasn\'t been opened yet; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadFromID@.
+--                   The safe flavor is 'getGamepadFromIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadFromID@, defined at @SDL3\/SDL_gamepad.h 767:43@
+getGamepadFromID
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID of the gamepad.
+  -> IO (BG.Ptr SDL_Gamepad)
+getGamepadFromID = Unsafe.sDL_GetGamepadFromID
+
+-- | Get the 'SDL_Gamepad' associated with a joystick instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Gamepad' on success or NULL on failure or if it hasn\'t been opened yet; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadFromID@.
+--                   The unsafe flavor is 'getGamepadFromID'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadFromID@, defined at @SDL3\/SDL_gamepad.h 767:43@
+getGamepadFromIDSafe
+  :: SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID of the gamepad.
+  -> IO (BG.Ptr SDL_Gamepad)
+getGamepadFromIDSafe = Safe.sDL_GetGamepadFromID
+
+-- | Get the 'SDL_Gamepad' associated with a player index.
+--
+--     [Returns]: the 'SDL_Gamepad' associated with a player index.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadPlayerIndex', 'setGamepadPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadFromPlayerIndex@.
+--                   The safe flavor is 'getGamepadFromPlayerIndexSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadFromPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 782:43@
+getGamepadFromPlayerIndex
+  :: BG.Int32
+  -- ^
+  --
+  --           [@player_index@]: the player index, which different from the instance ID.
+  -> IO (BG.Ptr SDL_Gamepad)
+getGamepadFromPlayerIndex =
+  \x00 ->
+    Unsafe.sDL_GetGamepadFromPlayerIndex (Coerce.coerce x00)
+
+-- | Get the 'SDL_Gamepad' associated with a player index.
+--
+--     [Returns]: the 'SDL_Gamepad' associated with a player index.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadPlayerIndex', 'setGamepadPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadFromPlayerIndex@.
+--                   The unsafe flavor is 'getGamepadFromPlayerIndex'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadFromPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 782:43@
+getGamepadFromPlayerIndexSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@player_index@]: the player index, which different from the instance ID.
+  -> IO (BG.Ptr SDL_Gamepad)
+getGamepadFromPlayerIndexSafe =
+  \x00 ->
+    Safe.sDL_GetGamepadFromPlayerIndex (Coerce.coerce x00)
+
+-- | Get the properties associated with an opened gamepad.
+--
+--     These properties are shared with the underlying joystick object.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_MONO_LED_BOOLEAN'@: true if this gamepad has an LED that has adjustable brightness
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_RGB_LED_BOOLEAN'@: true if this gamepad has an LED that has adjustable color
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_PLAYER_LED_BOOLEAN'@: true if this gamepad has a player LED
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_RUMBLE_BOOLEAN'@: true if this gamepad has left\/right rumble
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_TRIGGER_RUMBLE_BOOLEAN'@: true if this gamepad has simple trigger rumble
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadProperties@.
+--                   The safe flavor is 'getGamepadPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadProperties@, defined at @SDL3\/SDL_gamepad.h 811:46@
+getGamepadProperties
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getGamepadProperties =
+  Unsafe.sDL_GetGamepadProperties
+
+-- | Get the properties associated with an opened gamepad.
+--
+--     These properties are shared with the underlying joystick object.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_MONO_LED_BOOLEAN'@: true if this gamepad has an LED that has adjustable brightness
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_RGB_LED_BOOLEAN'@: true if this gamepad has an LED that has adjustable color
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_PLAYER_LED_BOOLEAN'@: true if this gamepad has a player LED
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_RUMBLE_BOOLEAN'@: true if this gamepad has left\/right rumble
+--
+--     * @'sDL_PROP_GAMEPAD_CAP_TRIGGER_RUMBLE_BOOLEAN'@: true if this gamepad has simple trigger rumble
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadProperties@.
+--                   The unsafe flavor is 'getGamepadProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadProperties@, defined at @SDL3\/SDL_gamepad.h 811:46@
+getGamepadPropertiesSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getGamepadPropertiesSafe =
+  Safe.sDL_GetGamepadProperties
+
+-- | Get the instance ID of an opened gamepad.
+--
+--     [Returns]: the instance ID of the specified gamepad on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadID@.
+--                   The safe flavor is 'getGamepadIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadID@, defined at @SDL3\/SDL_gamepad.h 831:44@
+getGamepadID
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+getGamepadID = Unsafe.sDL_GetGamepadID
+
+-- | Get the instance ID of an opened gamepad.
+--
+--     [Returns]: the instance ID of the specified gamepad on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadID@.
+--                   The unsafe flavor is 'getGamepadID'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadID@, defined at @SDL3\/SDL_gamepad.h 831:44@
+getGamepadIDSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickID
+getGamepadIDSafe = Safe.sDL_GetGamepadID
+
+-- | Get the implementation-dependent name for an opened gamepad.
+--
+--     [Returns]: the implementation dependent name for the gamepad, or NULL if there is no name or the identifier passed is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadNameForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadName@.
+--                   The safe flavor is 'getGamepadNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadName@, defined at @SDL3\/SDL_gamepad.h 847:42@
+getGamepadName
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadName = Unsafe.sDL_GetGamepadName
+
+-- | Get the implementation-dependent name for an opened gamepad.
+--
+--     [Returns]: the implementation dependent name for the gamepad, or NULL if there is no name or the identifier passed is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadNameForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadName@.
+--                   The unsafe flavor is 'getGamepadName'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadName@, defined at @SDL3\/SDL_gamepad.h 847:42@
+getGamepadNameSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadNameSafe = Safe.sDL_GetGamepadName
+
+-- | Get the implementation-dependent path for an opened gamepad.
+--
+--     [Returns]: the implementation dependent path for the gamepad, or NULL if there is no path or the identifier passed is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadPathForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadPath@.
+--                   The safe flavor is 'getGamepadPathSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadPath@, defined at @SDL3\/SDL_gamepad.h 863:42@
+getGamepadPath
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadPath = Unsafe.sDL_GetGamepadPath
+
+-- | Get the implementation-dependent path for an opened gamepad.
+--
+--     [Returns]: the implementation dependent path for the gamepad, or NULL if there is no path or the identifier passed is invalid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadPathForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadPath@.
+--                   The unsafe flavor is 'getGamepadPath'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadPath@, defined at @SDL3\/SDL_gamepad.h 863:42@
+getGamepadPathSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadPathSafe = Safe.sDL_GetGamepadPath
+
+-- | Get the type of an opened gamepad.
+--
+--     [Returns]: the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadTypeForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadType@.
+--                   The safe flavor is 'getGamepadTypeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadType@, defined at @SDL3\/SDL_gamepad.h 878:45@
+getGamepadType
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL_GamepadType
+getGamepadType = Unsafe.sDL_GetGamepadType
+
+-- | Get the type of an opened gamepad.
+--
+--     [Returns]: the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadTypeForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadType@.
+--                   The unsafe flavor is 'getGamepadType'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadType@, defined at @SDL3\/SDL_gamepad.h 878:45@
+getGamepadTypeSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL_GamepadType
+getGamepadTypeSafe = Safe.sDL_GetGamepadType
+
+-- | Get the type of an opened gamepad, ignoring any mapping override.
+--
+--     [Returns]: the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRealGamepadTypeForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRealGamepadType@.
+--                   The safe flavor is 'getRealGamepadTypeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRealGamepadType@, defined at @SDL3\/SDL_gamepad.h 893:45@
+getRealGamepadType
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL_GamepadType
+getRealGamepadType = Unsafe.sDL_GetRealGamepadType
+
+-- | Get the type of an opened gamepad, ignoring any mapping override.
+--
+--     [Returns]: the gamepad type, or SDL_GAMEPAD_TYPE_UNKNOWN if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRealGamepadTypeForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRealGamepadType@.
+--                   The unsafe flavor is 'getRealGamepadType'
+--                   .
+--
+--     [C declaration]: @SDL_GetRealGamepadType@, defined at @SDL3\/SDL_gamepad.h 893:45@
+getRealGamepadTypeSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL_GamepadType
+getRealGamepadTypeSafe = Safe.sDL_GetRealGamepadType
+
+-- | Get the player index of an opened gamepad.
+--
+--     For XInput gamepads this returns the XInput user index.
+--
+--     [Returns]: the player index for gamepad, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setGamepadPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadPlayerIndex@.
+--                   The safe flavor is 'getGamepadPlayerIndexSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 909:33@
+getGamepadPlayerIndex
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Int32
+getGamepadPlayerIndex =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetGamepadPlayerIndex x00)
+
+-- | Get the player index of an opened gamepad.
+--
+--     For XInput gamepads this returns the XInput user index.
+--
+--     [Returns]: the player index for gamepad, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setGamepadPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadPlayerIndex@.
+--                   The unsafe flavor is 'getGamepadPlayerIndex'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 909:33@
+getGamepadPlayerIndexSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Int32
+getGamepadPlayerIndexSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetGamepadPlayerIndex x00)
+
+-- | Set the player index of an opened gamepad.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGamepadPlayerIndex@.
+--                   The safe flavor is 'setGamepadPlayerIndexSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGamepadPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 926:34@
+setGamepadPlayerIndex
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to adjust.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@player_index@]: player index to assign to this gamepad, or -1 to clear the player index and turn off player LEDs.
+  -> IO Bool
+setGamepadPlayerIndex =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetGamepadPlayerIndex x00 (Coerce.coerce x11))
+
+-- | Set the player index of an opened gamepad.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGamepadPlayerIndex@.
+--                   The unsafe flavor is 'setGamepadPlayerIndex'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGamepadPlayerIndex@, defined at @SDL3\/SDL_gamepad.h 926:34@
+setGamepadPlayerIndexSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to adjust.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@player_index@]: player index to assign to this gamepad, or -1 to clear the player index and turn off player LEDs.
+  -> IO Bool
+setGamepadPlayerIndexSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetGamepadPlayerIndex x00 (Coerce.coerce x11))
+
+-- | Get the USB vendor ID of an opened gamepad, if available.
+--
+--     If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadVendorForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadVendor@.
+--                   The safe flavor is 'getGamepadVendorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadVendor@, defined at @SDL3\/SDL_gamepad.h 942:36@
+getGamepadVendor
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Word16
+getGamepadVendor =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetGamepadVendor x00)
+
+-- | Get the USB vendor ID of an opened gamepad, if available.
+--
+--     If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadVendorForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadVendor@.
+--                   The unsafe flavor is 'getGamepadVendor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadVendor@, defined at @SDL3\/SDL_gamepad.h 942:36@
+getGamepadVendorSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Word16
+getGamepadVendorSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetGamepadVendor x00)
+
+-- | Get the USB product ID of an opened gamepad, if available.
+--
+--     If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadProductForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadProduct@.
+--                   The safe flavor is 'getGamepadProductSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadProduct@, defined at @SDL3\/SDL_gamepad.h 958:36@
+getGamepadProduct
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Word16
+getGamepadProduct =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetGamepadProduct x00)
+
+-- | Get the USB product ID of an opened gamepad, if available.
+--
+--     If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadProductForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadProduct@.
+--                   The unsafe flavor is 'getGamepadProduct'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadProduct@, defined at @SDL3\/SDL_gamepad.h 958:36@
+getGamepadProductSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Word16
+getGamepadProductSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetGamepadProduct x00)
+
+-- | Get the product version of an opened gamepad, if available.
+--
+--     If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product version, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadProductVersionForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadProductVersion@.
+--                   The safe flavor is 'getGamepadProductVersionSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadProductVersion@, defined at @SDL3\/SDL_gamepad.h 974:36@
+getGamepadProductVersion
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Word16
+getGamepadProductVersion =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetGamepadProductVersion x00)
+
+-- | Get the product version of an opened gamepad, if available.
+--
+--     If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product version, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadProductVersionForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadProductVersion@.
+--                   The unsafe flavor is 'getGamepadProductVersion'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadProductVersion@, defined at @SDL3\/SDL_gamepad.h 974:36@
+getGamepadProductVersionSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Word16
+getGamepadProductVersionSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetGamepadProductVersion x00)
+
+-- | Get the firmware version of an opened gamepad, if available.
+--
+--     If the firmware version isn\'t available this function returns 0.
+--
+--     [Returns]: the gamepad firmware version, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadFirmwareVersion@.
+--                   The safe flavor is 'getGamepadFirmwareVersionSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadFirmwareVersion@, defined at @SDL3\/SDL_gamepad.h 988:36@
+getGamepadFirmwareVersion
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Word16
+getGamepadFirmwareVersion =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetGamepadFirmwareVersion x00)
+
+-- | Get the firmware version of an opened gamepad, if available.
+--
+--     If the firmware version isn\'t available this function returns 0.
+--
+--     [Returns]: the gamepad firmware version, or zero if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadFirmwareVersion@.
+--                   The unsafe flavor is 'getGamepadFirmwareVersion'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadFirmwareVersion@, defined at @SDL3\/SDL_gamepad.h 988:36@
+getGamepadFirmwareVersionSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Word16
+getGamepadFirmwareVersionSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetGamepadFirmwareVersion x00)
+
+-- | Get the serial number of an opened gamepad, if available.
+--
+--     Returns the serial number of the gamepad, or NULL if it is not available.
+--
+--     [Returns]: the serial number, or NULL if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadSerial@.
+--                   The safe flavor is 'getGamepadSerialSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadSerial@, defined at @SDL3\/SDL_gamepad.h 1002:42@
+getGamepadSerial
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadSerial = Unsafe.sDL_GetGamepadSerial
+
+-- | Get the serial number of an opened gamepad, if available.
+--
+--     Returns the serial number of the gamepad, or NULL if it is not available.
+--
+--     [Returns]: the serial number, or NULL if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadSerial@.
+--                   The unsafe flavor is 'getGamepadSerial'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadSerial@, defined at @SDL3\/SDL_gamepad.h 1002:42@
+getGamepadSerialSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadSerialSafe = Safe.sDL_GetGamepadSerial
+
+-- | Get the Steam Input handle of an opened gamepad, if available.
+--
+--     Returns an InputHandle_t for the gamepad that can be used with Steam Input API: [https:\/\/partner.steamgames.com\/doc\/api\/ISteamInput](https://partner.steamgames.com/doc/api/ISteamInput)
+--
+--     [Returns]: the gamepad handle, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadSteamHandle@.
+--                   The safe flavor is 'getGamepadSteamHandleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadSteamHandle@, defined at @SDL3\/SDL_gamepad.h 1017:36@
+getGamepadSteamHandle
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Word64
+getGamepadSteamHandle =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetGamepadSteamHandle x00)
+
+-- | Get the Steam Input handle of an opened gamepad, if available.
+--
+--     Returns an InputHandle_t for the gamepad that can be used with Steam Input API: [https:\/\/partner.steamgames.com\/doc\/api\/ISteamInput](https://partner.steamgames.com/doc/api/ISteamInput)
+--
+--     [Returns]: the gamepad handle, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadSteamHandle@.
+--                   The unsafe flavor is 'getGamepadSteamHandle'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadSteamHandle@, defined at @SDL3\/SDL_gamepad.h 1017:36@
+getGamepadSteamHandleSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO BG.Word64
+getGamepadSteamHandleSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetGamepadSteamHandle x00)
+
+-- | Get the connection state of a gamepad.
+--
+--     [Returns]: the connection state on success or @SDL_JOYSTICK_CONNECTION_INVALID@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadConnectionState@.
+--                   The safe flavor is 'getGamepadConnectionStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadConnectionState@, defined at @SDL3\/SDL_gamepad.h 1031:57@
+getGamepadConnectionState
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickConnectionState
+getGamepadConnectionState =
+  Unsafe.sDL_GetGamepadConnectionState
+
+-- | Get the connection state of a gamepad.
+--
+--     [Returns]: the connection state on success or @SDL_JOYSTICK_CONNECTION_INVALID@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadConnectionState@.
+--                   The unsafe flavor is 'getGamepadConnectionState'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadConnectionState@, defined at @SDL3\/SDL_gamepad.h 1031:57@
+getGamepadConnectionStateSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> IO SDL3.Sys.Bindgen.Joystick.SDL_JoystickConnectionState
+getGamepadConnectionStateSafe =
+  Safe.sDL_GetGamepadConnectionState
+
+-- | Get the battery state of a gamepad.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     [Returns]: the current battery state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadPowerInfo@.
+--                   The safe flavor is 'getGamepadPowerInfoSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadPowerInfo@, defined at @SDL3\/SDL_gamepad.h 1053:44@
+getGamepadPowerInfo
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 we can\'t determine a value or there is no battery.
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+getGamepadPowerInfo = Unsafe.sDL_GetGamepadPowerInfo
+
+-- | Get the battery state of a gamepad.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     [Returns]: the current battery state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadPowerInfo@.
+--                   The unsafe flavor is 'getGamepadPowerInfo'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadPowerInfo@, defined at @SDL3\/SDL_gamepad.h 1053:44@
+getGamepadPowerInfoSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 we can\'t determine a value or there is no battery.
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+getGamepadPowerInfoSafe =
+  Safe.sDL_GetGamepadPowerInfo
+
+-- | Check if a gamepad has been opened and is currently connected.
+--
+--     [Returns]: true if the gamepad has been opened and is currently connected, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GamepadConnected@.
+--                   The safe flavor is 'gamepadConnectedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadConnected@, defined at @SDL3\/SDL_gamepad.h 1067:34@
+gamepadConnected
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO Bool
+gamepadConnected =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GamepadConnected x00)
+
+-- | Check if a gamepad has been opened and is currently connected.
+--
+--     [Returns]: true if the gamepad has been opened and is currently connected, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GamepadConnected@.
+--                   The unsafe flavor is 'gamepadConnected'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadConnected@, defined at @SDL3\/SDL_gamepad.h 1067:34@
+gamepadConnectedSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO Bool
+gamepadConnectedSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GamepadConnected x00)
+
+-- | Get the underlying joystick from a gamepad.
+--
+--     This function will give you a SDL_Joystick object, which allows you to use the SDL_Joystick functions with a 'SDL_Gamepad' object. This would be useful for getting a joystick\'s position at any given time, even if it hasn\'t moved (moving it would produce an event, which would have the axis\' value).
+--
+--     The pointer returned is owned by the 'SDL_Gamepad'. You should not call 'SDL3.Sys.Joystick.closeJoystick' on it, for example, since doing so will likely cause SDL to crash.
+--
+--     [Returns]: an SDL_Joystick object, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadJoystick@.
+--                   The safe flavor is 'getGamepadJoystickSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadJoystick@, defined at @SDL3\/SDL_gamepad.h 1089:44@
+getGamepadJoystick
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object that you want to get a joystick from.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick)
+getGamepadJoystick = Unsafe.sDL_GetGamepadJoystick
+
+-- | Get the underlying joystick from a gamepad.
+--
+--     This function will give you a SDL_Joystick object, which allows you to use the SDL_Joystick functions with a 'SDL_Gamepad' object. This would be useful for getting a joystick\'s position at any given time, even if it hasn\'t moved (moving it would produce an event, which would have the axis\' value).
+--
+--     The pointer returned is owned by the 'SDL_Gamepad'. You should not call 'SDL3.Sys.Joystick.closeJoystick' on it, for example, since doing so will likely cause SDL to crash.
+--
+--     [Returns]: an SDL_Joystick object, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadJoystick@.
+--                   The unsafe flavor is 'getGamepadJoystick'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadJoystick@, defined at @SDL3\/SDL_gamepad.h 1089:44@
+getGamepadJoystickSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad object that you want to get a joystick from.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick)
+getGamepadJoystickSafe = Safe.sDL_GetGamepadJoystick
+
+-- | Set the state of gamepad event processing.
+--
+--     If gamepad events are disabled, you must call @'updateGamepads'@ yourself and check the state of the gamepad when you want gamepad information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadEventsEnabled', 'updateGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGamepadEventsEnabled@.
+--                   The safe flavor is 'setGamepadEventsEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGamepadEventsEnabled@, defined at @SDL3\/SDL_gamepad.h 1106:34@
+setGamepadEventsEnabled
+  :: Bool
+  -- ^
+  --
+  --           [@enabled@]: whether to process gamepad events or not.
+  -> IO ()
+setGamepadEventsEnabled =
+  \x00 ->
+    Unsafe.sDL_SetGamepadEventsEnabled (CBool.fromBool x00)
+
+-- | Set the state of gamepad event processing.
+--
+--     If gamepad events are disabled, you must call @'updateGamepads'@ yourself and check the state of the gamepad when you want gamepad information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadEventsEnabled', 'updateGamepads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGamepadEventsEnabled@.
+--                   The unsafe flavor is 'setGamepadEventsEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGamepadEventsEnabled@, defined at @SDL3\/SDL_gamepad.h 1106:34@
+setGamepadEventsEnabledSafe
+  :: Bool
+  -- ^
+  --
+  --           [@enabled@]: whether to process gamepad events or not.
+  -> IO ()
+setGamepadEventsEnabledSafe =
+  \x00 ->
+    Safe.sDL_SetGamepadEventsEnabled (CBool.fromBool x00)
+
+-- | Query the state of gamepad event processing.
+--
+--     If gamepad events are disabled, you must call @'updateGamepads'@ yourself and check the state of the gamepad when you want gamepad information.
+--
+--     [Returns]: true if gamepad events are being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setGamepadEventsEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GamepadEventsEnabled@.
+--                   The safe flavor is 'gamepadEventsEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadEventsEnabled@, defined at @SDL3\/SDL_gamepad.h 1122:34@
+gamepadEventsEnabled :: IO Bool
+gamepadEventsEnabled =
+  fmap CBool.toBool Unsafe.sDL_GamepadEventsEnabled
+
+-- | Query the state of gamepad event processing.
+--
+--     If gamepad events are disabled, you must call @'updateGamepads'@ yourself and check the state of the gamepad when you want gamepad information.
+--
+--     [Returns]: true if gamepad events are being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setGamepadEventsEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GamepadEventsEnabled@.
+--                   The unsafe flavor is 'gamepadEventsEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadEventsEnabled@, defined at @SDL3\/SDL_gamepad.h 1122:34@
+gamepadEventsEnabledSafe :: IO Bool
+gamepadEventsEnabledSafe =
+  fmap CBool.toBool Safe.sDL_GamepadEventsEnabled
+
+-- | Get the SDL joystick layer bindings for a gamepad.
+--
+--     [Returns]: a NULL terminated array of pointers to bindings or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadBindings@.
+--                   The safe flavor is 'getGamepadBindingsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadBindings@, defined at @SDL3\/SDL_gamepad.h 1138:51@
+getGamepadBindings
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of bindings returned.
+  -> IO (BG.Ptr (BG.Ptr SDL_GamepadBinding))
+getGamepadBindings = Unsafe.sDL_GetGamepadBindings
+
+-- | Get the SDL joystick layer bindings for a gamepad.
+--
+--     [Returns]: a NULL terminated array of pointers to bindings or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadBindings@.
+--                   The unsafe flavor is 'getGamepadBindings'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadBindings@, defined at @SDL3\/SDL_gamepad.h 1138:51@
+getGamepadBindingsSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of bindings returned.
+  -> IO (BG.Ptr (BG.Ptr SDL_GamepadBinding))
+getGamepadBindingsSafe = Safe.sDL_GetGamepadBindings
+
+-- | Manually pump gamepad updates if not using the loop.
+--
+--     This function is called automatically by the event loop if events are enabled. Under such circumstances, it will not be necessary to call this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UpdateGamepads@.
+--                   The safe flavor is 'updateGamepadsSafe'
+--                   : routes through joystick update; virtual-device callbacks run synchronously.
+--
+--     [C declaration]: @SDL_UpdateGamepads@, defined at @SDL3\/SDL_gamepad.h 1151:34@
+updateGamepads :: IO ()
+updateGamepads = Unsafe.sDL_UpdateGamepads
+
+-- | Manually pump gamepad updates if not using the loop.
+--
+--     This function is called automatically by the event loop if events are enabled. Under such circumstances, it will not be necessary to call this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UpdateGamepads@.
+--                   The unsafe flavor is 'updateGamepads'
+--                   : routes through joystick update; virtual-device callbacks run synchronously.
+--
+--     [C declaration]: @SDL_UpdateGamepads@, defined at @SDL3\/SDL_gamepad.h 1151:34@
+updateGamepadsSafe :: IO ()
+updateGamepadsSafe = Safe.sDL_UpdateGamepads
+
+-- | Convert a string into 'SDL_GamepadType' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     [Returns]: the 'SDL_GamepadType' enum corresponding to the input string, or @SDL_GAMEPAD_TYPE_UNKNOWN@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadStringForType'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadTypeFromString@.
+--                   The safe flavor is 'getGamepadTypeFromStringSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadTypeFromString@, defined at @SDL3\/SDL_gamepad.h 1171:45@
+getGamepadTypeFromString
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_GamepadType' type.
+  -> IO SDL_GamepadType
+getGamepadTypeFromString =
+  Unsafe.sDL_GetGamepadTypeFromString
+
+-- | Convert a string into 'SDL_GamepadType' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     [Returns]: the 'SDL_GamepadType' enum corresponding to the input string, or @SDL_GAMEPAD_TYPE_UNKNOWN@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadStringForType'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadTypeFromString@.
+--                   The unsafe flavor is 'getGamepadTypeFromString'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadTypeFromString@, defined at @SDL3\/SDL_gamepad.h 1171:45@
+getGamepadTypeFromStringSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_GamepadType' type.
+  -> IO SDL_GamepadType
+getGamepadTypeFromStringSafe =
+  Safe.sDL_GetGamepadTypeFromString
+
+-- | Convert from an 'SDL_GamepadType' enum to a string.
+--
+--     [Returns]: a string for the given type, or NULL if an invalid type is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadTypeFromString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadStringForType@.
+--                   The safe flavor is 'getGamepadStringForTypeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadStringForType@, defined at @SDL3\/SDL_gamepad.h 1187:42@
+getGamepadStringForType
+  :: SDL_GamepadType
+  -- ^
+  --
+  --           [@type@]: an enum value for a given 'SDL_GamepadType'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadStringForType =
+  Unsafe.sDL_GetGamepadStringForType
+
+-- | Convert from an 'SDL_GamepadType' enum to a string.
+--
+--     [Returns]: a string for the given type, or NULL if an invalid type is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadTypeFromString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadStringForType@.
+--                   The unsafe flavor is 'getGamepadStringForType'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadStringForType@, defined at @SDL3\/SDL_gamepad.h 1187:42@
+getGamepadStringForTypeSafe
+  :: SDL_GamepadType
+  -- ^
+  --
+  --           [@type@]: an enum value for a given 'SDL_GamepadType'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadStringForTypeSafe =
+  Safe.sDL_GetGamepadStringForType
+
+-- | Convert a string into 'SDL_GamepadAxis' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     Note specially that \"righttrigger\" and \"lefttrigger\" map to @SDL_GAMEPAD_AXIS_RIGHT_TRIGGER@ and @SDL_GAMEPAD_AXIS_LEFT_TRIGGER@, respectively.
+--
+--     [Returns]: the 'SDL_GamepadAxis' enum corresponding to the input string, or @SDL_GAMEPAD_AXIS_INVALID@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadStringForAxis'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadAxisFromString@.
+--                   The safe flavor is 'getGamepadAxisFromStringSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadAxisFromString@, defined at @SDL3\/SDL_gamepad.h 1211:45@
+getGamepadAxisFromString
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_Gamepad' axis.
+  -> IO SDL_GamepadAxis
+getGamepadAxisFromString =
+  Unsafe.sDL_GetGamepadAxisFromString
+
+-- | Convert a string into 'SDL_GamepadAxis' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     Note specially that \"righttrigger\" and \"lefttrigger\" map to @SDL_GAMEPAD_AXIS_RIGHT_TRIGGER@ and @SDL_GAMEPAD_AXIS_LEFT_TRIGGER@, respectively.
+--
+--     [Returns]: the 'SDL_GamepadAxis' enum corresponding to the input string, or @SDL_GAMEPAD_AXIS_INVALID@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadStringForAxis'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadAxisFromString@.
+--                   The unsafe flavor is 'getGamepadAxisFromString'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadAxisFromString@, defined at @SDL3\/SDL_gamepad.h 1211:45@
+getGamepadAxisFromStringSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_Gamepad' axis.
+  -> IO SDL_GamepadAxis
+getGamepadAxisFromStringSafe =
+  Safe.sDL_GetGamepadAxisFromString
+
+-- | Convert from an 'SDL_GamepadAxis' enum to a string.
+--
+--     [Returns]: a string for the given axis, or NULL if an invalid axis is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadAxisFromString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadStringForAxis@.
+--                   The safe flavor is 'getGamepadStringForAxisSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadStringForAxis@, defined at @SDL3\/SDL_gamepad.h 1227:42@
+getGamepadStringForAxis
+  :: SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an enum value for a given 'SDL_GamepadAxis'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadStringForAxis =
+  Unsafe.sDL_GetGamepadStringForAxis
+
+-- | Convert from an 'SDL_GamepadAxis' enum to a string.
+--
+--     [Returns]: a string for the given axis, or NULL if an invalid axis is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadAxisFromString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadStringForAxis@.
+--                   The unsafe flavor is 'getGamepadStringForAxis'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadStringForAxis@, defined at @SDL3\/SDL_gamepad.h 1227:42@
+getGamepadStringForAxisSafe
+  :: SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an enum value for a given 'SDL_GamepadAxis'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadStringForAxisSafe =
+  Safe.sDL_GetGamepadStringForAxis
+
+-- | Query whether a gamepad has a given axis.
+--
+--     This merely reports whether the gamepad\'s mapping defined this axis, as that is all the information SDL has about the physical device.
+--
+--     [Returns]: true if the gamepad has this axis, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadHasButton', 'getGamepadAxis'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GamepadHasAxis@.
+--                   The safe flavor is 'gamepadHasAxisSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadHasAxis@, defined at @SDL3\/SDL_gamepad.h 1246:34@
+gamepadHasAxis
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis enum value (an 'SDL_GamepadAxis' value).
+  -> IO Bool
+gamepadHasAxis =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GamepadHasAxis x00 x11)
+
+-- | Query whether a gamepad has a given axis.
+--
+--     This merely reports whether the gamepad\'s mapping defined this axis, as that is all the information SDL has about the physical device.
+--
+--     [Returns]: true if the gamepad has this axis, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadHasButton', 'getGamepadAxis'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GamepadHasAxis@.
+--                   The unsafe flavor is 'gamepadHasAxis'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadHasAxis@, defined at @SDL3\/SDL_gamepad.h 1246:34@
+gamepadHasAxisSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis enum value (an 'SDL_GamepadAxis' value).
+  -> IO Bool
+gamepadHasAxisSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GamepadHasAxis x00 x11)
+
+-- | Get the current state of an axis control on a gamepad.
+--
+--     The axis indices start at index 0.
+--
+--     For thumbsticks, the state is a value ranging from -32768 (up\/left) to 32767 (down\/right).
+--
+--     Triggers range from 0 when released to 32767 when fully pressed, and never return a negative value. Note that this differs from the value reported by the lower-level 'SDL3.Sys.Joystick.getJoystickAxis', which normally uses the full range.
+--
+--     Note that for invalid gamepads or axes, this will return 0. Zero is also a valid value in normal operation; usually it means a centered axis.
+--
+--     [Returns]: axis state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadHasAxis', 'getGamepadButton'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadAxis@.
+--                   The safe flavor is 'getGamepadAxisSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadAxis@, defined at @SDL3\/SDL_gamepad.h 1274:36@
+getGamepadAxis
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis index (one of the 'SDL_GamepadAxis' values).
+  -> IO BG.Int16
+getGamepadAxis =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_GetGamepadAxis x00 x11)
+
+-- | Get the current state of an axis control on a gamepad.
+--
+--     The axis indices start at index 0.
+--
+--     For thumbsticks, the state is a value ranging from -32768 (up\/left) to 32767 (down\/right).
+--
+--     Triggers range from 0 when released to 32767 when fully pressed, and never return a negative value. Note that this differs from the value reported by the lower-level 'SDL3.Sys.Joystick.getJoystickAxis', which normally uses the full range.
+--
+--     Note that for invalid gamepads or axes, this will return 0. Zero is also a valid value in normal operation; usually it means a centered axis.
+--
+--     [Returns]: axis state.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadHasAxis', 'getGamepadButton'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadAxis@.
+--                   The unsafe flavor is 'getGamepadAxis'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadAxis@, defined at @SDL3\/SDL_gamepad.h 1274:36@
+getGamepadAxisSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis index (one of the 'SDL_GamepadAxis' values).
+  -> IO BG.Int16
+getGamepadAxisSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_GetGamepadAxis x00 x11)
+
+-- | Convert a string into an 'SDL_GamepadButton' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     [Returns]: the 'SDL_GamepadButton' enum corresponding to the input string, or @SDL_GAMEPAD_BUTTON_INVALID@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadStringForButton'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadButtonFromString@.
+--                   The safe flavor is 'getGamepadButtonFromStringSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadButtonFromString@, defined at @SDL3\/SDL_gamepad.h 1294:47@
+getGamepadButtonFromString
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_Gamepad' button.
+  -> IO SDL_GamepadButton
+getGamepadButtonFromString =
+  Unsafe.sDL_GetGamepadButtonFromString
+
+-- | Convert a string into an 'SDL_GamepadButton' enum.
+--
+--     This function is called internally to translate 'SDL_Gamepad' mapping strings for the underlying joystick device into the consistent 'SDL_Gamepad' mapping. You do not normally need to call this function unless you are parsing 'SDL_Gamepad' mappings in your own code.
+--
+--     [Returns]: the 'SDL_GamepadButton' enum corresponding to the input string, or @SDL_GAMEPAD_BUTTON_INVALID@ if no match was found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadStringForButton'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadButtonFromString@.
+--                   The unsafe flavor is 'getGamepadButtonFromString'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadButtonFromString@, defined at @SDL3\/SDL_gamepad.h 1294:47@
+getGamepadButtonFromStringSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: string representing a 'SDL_Gamepad' button.
+  -> IO SDL_GamepadButton
+getGamepadButtonFromStringSafe =
+  Safe.sDL_GetGamepadButtonFromString
+
+-- | Convert from an 'SDL_GamepadButton' enum to a string.
+--
+--     [Returns]: a string for the given button, or NULL if an invalid button is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadButtonFromString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadStringForButton@.
+--                   The safe flavor is 'getGamepadStringForButtonSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadStringForButton@, defined at @SDL3\/SDL_gamepad.h 1310:42@
+getGamepadStringForButton
+  :: SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: an enum value for a given 'SDL_GamepadButton'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadStringForButton =
+  Unsafe.sDL_GetGamepadStringForButton
+
+-- | Convert from an 'SDL_GamepadButton' enum to a string.
+--
+--     [Returns]: a string for the given button, or NULL if an invalid button is specified. The string returned is of the format used by 'SDL_Gamepad' mapping strings.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadButtonFromString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadStringForButton@.
+--                   The unsafe flavor is 'getGamepadStringForButton'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadStringForButton@, defined at @SDL3\/SDL_gamepad.h 1310:42@
+getGamepadStringForButtonSafe
+  :: SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: an enum value for a given 'SDL_GamepadButton'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadStringForButtonSafe =
+  Safe.sDL_GetGamepadStringForButton
+
+-- | Query whether a gamepad has a given button.
+--
+--     This merely reports whether the gamepad\'s mapping defined this button, as that is all the information SDL has about the physical device.
+--
+--     [Returns]: true if the gamepad has this button, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadHasAxis'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GamepadHasButton@.
+--                   The safe flavor is 'gamepadHasButtonSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadHasButton@, defined at @SDL3\/SDL_gamepad.h 1328:34@
+gamepadHasButton
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button enum value (an 'SDL_GamepadButton' value).
+  -> IO Bool
+gamepadHasButton =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GamepadHasButton x00 x11)
+
+-- | Query whether a gamepad has a given button.
+--
+--     This merely reports whether the gamepad\'s mapping defined this button, as that is all the information SDL has about the physical device.
+--
+--     [Returns]: true if the gamepad has this button, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadHasAxis'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GamepadHasButton@.
+--                   The unsafe flavor is 'gamepadHasButton'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadHasButton@, defined at @SDL3\/SDL_gamepad.h 1328:34@
+gamepadHasButtonSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button enum value (an 'SDL_GamepadButton' value).
+  -> IO Bool
+gamepadHasButtonSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GamepadHasButton x00 x11)
+
+-- | Get the current state of a button on a gamepad.
+--
+--     [Returns]: true if the button is pressed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadHasButton', 'getGamepadAxis'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadButton@.
+--                   The safe flavor is 'getGamepadButtonSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadButton@, defined at @SDL3\/SDL_gamepad.h 1344:34@
+getGamepadButton
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO Bool
+getGamepadButton =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetGamepadButton x00 x11)
+
+-- | Get the current state of a button on a gamepad.
+--
+--     [Returns]: true if the button is pressed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadHasButton', 'getGamepadAxis'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadButton@.
+--                   The unsafe flavor is 'getGamepadButton'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadButton@, defined at @SDL3\/SDL_gamepad.h 1344:34@
+getGamepadButtonSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO Bool
+getGamepadButtonSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetGamepadButton x00 x11)
+
+-- | Get the label of a button on a gamepad.
+--
+--     [Returns]: the 'SDL_GamepadButtonLabel' enum corresponding to the button label.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadButtonLabel'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadButtonLabelForType@.
+--                   The safe flavor is 'getGamepadButtonLabelForTypeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadButtonLabelForType@, defined at @SDL3\/SDL_gamepad.h 1359:52@
+getGamepadButtonLabelForType
+  :: SDL_GamepadType
+  -- ^
+  --
+  --           [@type@]: the type of gamepad to check.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO SDL_GamepadButtonLabel
+getGamepadButtonLabelForType =
+  Unsafe.sDL_GetGamepadButtonLabelForType
+
+-- | Get the label of a button on a gamepad.
+--
+--     [Returns]: the 'SDL_GamepadButtonLabel' enum corresponding to the button label.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadButtonLabel'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadButtonLabelForType@.
+--                   The unsafe flavor is 'getGamepadButtonLabelForType'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadButtonLabelForType@, defined at @SDL3\/SDL_gamepad.h 1359:52@
+getGamepadButtonLabelForTypeSafe
+  :: SDL_GamepadType
+  -- ^
+  --
+  --           [@type@]: the type of gamepad to check.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO SDL_GamepadButtonLabel
+getGamepadButtonLabelForTypeSafe =
+  Safe.sDL_GetGamepadButtonLabelForType
+
+-- | Get the label of a button on a gamepad.
+--
+--     [Returns]: the 'SDL_GamepadButtonLabel' enum corresponding to the button label.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadButtonLabelForType'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadButtonLabel@.
+--                   The safe flavor is 'getGamepadButtonLabelSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadButtonLabel@, defined at @SDL3\/SDL_gamepad.h 1374:52@
+getGamepadButtonLabel
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO SDL_GamepadButtonLabel
+getGamepadButtonLabel =
+  Unsafe.sDL_GetGamepadButtonLabel
+
+-- | Get the label of a button on a gamepad.
+--
+--     [Returns]: the 'SDL_GamepadButtonLabel' enum corresponding to the button label.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadButtonLabelForType'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadButtonLabel@.
+--                   The unsafe flavor is 'getGamepadButtonLabel'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadButtonLabel@, defined at @SDL3\/SDL_gamepad.h 1374:52@
+getGamepadButtonLabelSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button index (one of the 'SDL_GamepadButton' values).
+  -> IO SDL_GamepadButtonLabel
+getGamepadButtonLabelSafe =
+  Safe.sDL_GetGamepadButtonLabel
+
+-- | Get the number of touchpads on a gamepad.
+--
+--     [Returns]: number of touchpads.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumGamepadTouchpadFingers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumGamepadTouchpads@.
+--                   The safe flavor is 'getNumGamepadTouchpadsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumGamepadTouchpads@, defined at @SDL3\/SDL_gamepad.h 1388:33@
+getNumGamepadTouchpads
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> IO BG.Int32
+getNumGamepadTouchpads =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetNumGamepadTouchpads x00)
+
+-- | Get the number of touchpads on a gamepad.
+--
+--     [Returns]: number of touchpads.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumGamepadTouchpadFingers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumGamepadTouchpads@.
+--                   The unsafe flavor is 'getNumGamepadTouchpads'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumGamepadTouchpads@, defined at @SDL3\/SDL_gamepad.h 1388:33@
+getNumGamepadTouchpadsSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> IO BG.Int32
+getNumGamepadTouchpadsSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetNumGamepadTouchpads x00)
+
+-- | Get the number of supported simultaneous fingers on a touchpad on a game gamepad.
+--
+--     [Returns]: number of supported simultaneous fingers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadTouchpadFinger', 'getNumGamepadTouchpads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumGamepadTouchpadFingers@.
+--                   The safe flavor is 'getNumGamepadTouchpadFingersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumGamepadTouchpadFingers@, defined at @SDL3\/SDL_gamepad.h 1405:33@
+getNumGamepadTouchpadFingers
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@touchpad@]: a touchpad.
+  -> IO BG.Int32
+getNumGamepadTouchpadFingers =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_GetNumGamepadTouchpadFingers x00 (Coerce.coerce x11))
+
+-- | Get the number of supported simultaneous fingers on a touchpad on a game gamepad.
+--
+--     [Returns]: number of supported simultaneous fingers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadTouchpadFinger', 'getNumGamepadTouchpads'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumGamepadTouchpadFingers@.
+--                   The unsafe flavor is 'getNumGamepadTouchpadFingers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumGamepadTouchpadFingers@, defined at @SDL3\/SDL_gamepad.h 1405:33@
+getNumGamepadTouchpadFingersSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@touchpad@]: a touchpad.
+  -> IO BG.Int32
+getNumGamepadTouchpadFingersSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_GetNumGamepadTouchpadFingers x00 (Coerce.coerce x11))
+
+-- | Get the current state of a finger on a touchpad on a gamepad.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumGamepadTouchpadFingers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadTouchpadFinger@.
+--                   The safe flavor is 'getGamepadTouchpadFingerSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadTouchpadFinger@, defined at @SDL3\/SDL_gamepad.h 1429:34@
+getGamepadTouchpadFinger
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@touchpad@]: a touchpad.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@finger@]: a finger.
+  -> BG.Ptr BG.CBool
+  -- ^
+  --
+  --           [@down@]: a pointer filled with true if the finger is down, false otherwise, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer filled with the x position, normalized 0 to 1, with the origin in the upper left, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer filled with the y position, normalized 0 to 1, with the origin in the upper left, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@pressure@]: a pointer filled with pressure value, may be NULL.
+  -> IO Bool
+getGamepadTouchpadFinger =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  (Unsafe.sDL_GetGamepadTouchpadFinger x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44 x55 x66)
+
+-- | Get the current state of a finger on a touchpad on a gamepad.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumGamepadTouchpadFingers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadTouchpadFinger@.
+--                   The unsafe flavor is 'getGamepadTouchpadFinger'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadTouchpadFinger@, defined at @SDL3\/SDL_gamepad.h 1429:34@
+getGamepadTouchpadFingerSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@touchpad@]: a touchpad.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@finger@]: a finger.
+  -> BG.Ptr BG.CBool
+  -- ^
+  --
+  --           [@down@]: a pointer filled with true if the finger is down, false otherwise, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer filled with the x position, normalized 0 to 1, with the origin in the upper left, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer filled with the y position, normalized 0 to 1, with the origin in the upper left, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@pressure@]: a pointer filled with pressure value, may be NULL.
+  -> IO Bool
+getGamepadTouchpadFingerSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  (Safe.sDL_GetGamepadTouchpadFinger x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44 x55 x66)
+
+-- | Return whether a gamepad has a particular sensor.
+--
+--     [Returns]: true if the sensor exists, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadSensorData', 'getGamepadSensorDataRate', 'setGamepadSensorEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GamepadHasSensor@.
+--                   The safe flavor is 'gamepadHasSensorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadHasSensor@, defined at @SDL3\/SDL_gamepad.h 1446:34@
+gamepadHasSensor
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO Bool
+gamepadHasSensor =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GamepadHasSensor x00 x11)
+
+-- | Return whether a gamepad has a particular sensor.
+--
+--     [Returns]: true if the sensor exists, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadSensorData', 'getGamepadSensorDataRate', 'setGamepadSensorEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GamepadHasSensor@.
+--                   The unsafe flavor is 'gamepadHasSensor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadHasSensor@, defined at @SDL3\/SDL_gamepad.h 1446:34@
+gamepadHasSensorSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO Bool
+gamepadHasSensorSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GamepadHasSensor x00 x11)
+
+-- | Set whether data reporting for a gamepad sensor is enabled.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadHasSensor', 'gamepadSensorEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGamepadSensorEnabled@.
+--                   The safe flavor is 'setGamepadSensorEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGamepadSensorEnabled@, defined at @SDL3\/SDL_gamepad.h 1464:34@
+setGamepadSensorEnabled
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to update.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to enable\/disable.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: whether data reporting should be enabled.
+  -> IO Bool
+setGamepadSensorEnabled =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetGamepadSensorEnabled x00 x11 (CBool.fromBool x22))
+
+-- | Set whether data reporting for a gamepad sensor is enabled.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'gamepadHasSensor', 'gamepadSensorEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGamepadSensorEnabled@.
+--                   The unsafe flavor is 'setGamepadSensorEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGamepadSensorEnabled@, defined at @SDL3\/SDL_gamepad.h 1464:34@
+setGamepadSensorEnabledSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to update.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to enable\/disable.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: whether data reporting should be enabled.
+  -> IO Bool
+setGamepadSensorEnabledSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetGamepadSensorEnabled x00 x11 (CBool.fromBool x22))
+
+-- | Query whether sensor data reporting is enabled for a gamepad.
+--
+--     [Returns]: true if the sensor is enabled, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setGamepadSensorEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GamepadSensorEnabled@.
+--                   The safe flavor is 'gamepadSensorEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadSensorEnabled@, defined at @SDL3\/SDL_gamepad.h 1479:34@
+gamepadSensorEnabled
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO Bool
+gamepadSensorEnabled =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GamepadSensorEnabled x00 x11)
+
+-- | Query whether sensor data reporting is enabled for a gamepad.
+--
+--     [Returns]: true if the sensor is enabled, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setGamepadSensorEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GamepadSensorEnabled@.
+--                   The unsafe flavor is 'gamepadSensorEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GamepadSensorEnabled@, defined at @SDL3\/SDL_gamepad.h 1479:34@
+gamepadSensorEnabledSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO Bool
+gamepadSensorEnabledSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GamepadSensorEnabled x00 x11)
+
+-- | Get the data rate (number of events per second) of a gamepad sensor.
+--
+--     [Returns]: the data rate, or 0.0f if the data rate is not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadSensorDataRate@.
+--                   The safe flavor is 'getGamepadSensorDataRateSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadSensorDataRate@, defined at @SDL3\/SDL_gamepad.h 1492:35@
+getGamepadSensorDataRate
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO Float
+getGamepadSensorDataRate =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_GetGamepadSensorDataRate x00 x11)
+
+-- | Get the data rate (number of events per second) of a gamepad sensor.
+--
+--     [Returns]: the data rate, or 0.0f if the data rate is not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadSensorDataRate@.
+--                   The unsafe flavor is 'getGamepadSensorDataRate'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadSensorDataRate@, defined at @SDL3\/SDL_gamepad.h 1492:35@
+getGamepadSensorDataRateSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> IO Float
+getGamepadSensorDataRateSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_GetGamepadSensorDataRate x00 x11)
+
+-- | Get the current state of a gamepad sensor.
+--
+--     The number of values and interpretation of the data is sensor dependent. See the remarks in SDL_SensorType for details for each type of sensor.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadSensorData@.
+--                   The safe flavor is 'getGamepadSensorDataSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadSensorData@, defined at @SDL3\/SDL_gamepad.h 1511:34@
+getGamepadSensorData
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@data@]: a pointer filled with the current sensor state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_values@]: the number of values to write to data.
+  -> IO Bool
+getGamepadSensorData =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_GetGamepadSensorData x00 x11 x22 (Coerce.coerce x33))
+
+-- | Get the current state of a gamepad sensor.
+--
+--     The number of values and interpretation of the data is sensor dependent. See the remarks in SDL_SensorType for details for each type of sensor.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadSensorData@.
+--                   The unsafe flavor is 'getGamepadSensorData'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGamepadSensorData@, defined at @SDL3\/SDL_gamepad.h 1511:34@
+getGamepadSensorDataSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of sensor to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@data@]: a pointer filled with the current sensor state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_values@]: the number of values to write to data.
+  -> IO Bool
+getGamepadSensorDataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_GetGamepadSensorData x00 x11 x22 (Coerce.coerce x33))
+
+-- | Start a rumble effect on a gamepad.
+--
+--     Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     This function requires you to process SDL events or call 'SDL3.Sys.Joystick.updateJoysticks' to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RumbleGamepad@.
+--                   The safe flavor is 'rumbleGamepadSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RumbleGamepad@, defined at @SDL3\/SDL_gamepad.h 1535:34@
+rumbleGamepad
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to vibrate.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@low_frequency_rumble@]: the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@high_frequency_rumble@]: the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO Bool
+rumbleGamepad =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_RumbleGamepad x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Start a rumble effect on a gamepad.
+--
+--     Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     This function requires you to process SDL events or call 'SDL3.Sys.Joystick.updateJoysticks' to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RumbleGamepad@.
+--                   The unsafe flavor is 'rumbleGamepad'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RumbleGamepad@, defined at @SDL3\/SDL_gamepad.h 1535:34@
+rumbleGamepadSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to vibrate.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@low_frequency_rumble@]: the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@high_frequency_rumble@]: the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO Bool
+rumbleGamepadSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_RumbleGamepad x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Start a rumble effect in the gamepad\'s triggers.
+--
+--     Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     Note that this is rumbling of the /triggers/ and not the gamepad as a whole. This is currently only supported on Xbox One gamepads. If you want the (more common) whole-gamepad rumble, use @'rumbleGamepad'@ instead.
+--
+--     This function requires you to process SDL events or call 'SDL3.Sys.Joystick.updateJoysticks' to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rumbleGamepad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RumbleGamepadTriggers@.
+--                   The safe flavor is 'rumbleGamepadTriggersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RumbleGamepadTriggers@, defined at @SDL3\/SDL_gamepad.h 1565:34@
+rumbleGamepadTriggers
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to vibrate.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@left_rumble@]: the intensity of the left trigger rumble motor, from 0 to 0xFFFF.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@right_rumble@]: the intensity of the right trigger rumble motor, from 0 to 0xFFFF.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO Bool
+rumbleGamepadTriggers =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_RumbleGamepadTriggers x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Start a rumble effect in the gamepad\'s triggers.
+--
+--     Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     Note that this is rumbling of the /triggers/ and not the gamepad as a whole. This is currently only supported on Xbox One gamepads. If you want the (more common) whole-gamepad rumble, use @'rumbleGamepad'@ instead.
+--
+--     This function requires you to process SDL events or call 'SDL3.Sys.Joystick.updateJoysticks' to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rumbleGamepad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RumbleGamepadTriggers@.
+--                   The unsafe flavor is 'rumbleGamepadTriggers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RumbleGamepadTriggers@, defined at @SDL3\/SDL_gamepad.h 1565:34@
+rumbleGamepadTriggersSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to vibrate.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@left_rumble@]: the intensity of the left trigger rumble motor, from 0 to 0xFFFF.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@right_rumble@]: the intensity of the right trigger rumble motor, from 0 to 0xFFFF.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO Bool
+rumbleGamepadTriggersSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_RumbleGamepadTriggers x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Update a gamepad\'s LED color.
+--
+--     An example of a joystick LED is the light on the back of a PlayStation 4\'s DualShock 4 controller.
+--
+--     For gamepads with a single color LED, the maximum of the RGB values will be used as the LED brightness.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGamepadLED@.
+--                   The safe flavor is 'setGamepadLEDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGamepadLED@, defined at @SDL3\/SDL_gamepad.h 1587:34@
+setGamepadLED
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@red@]: the intensity of the red LED.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@green@]: the intensity of the green LED.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@blue@]: the intensity of the blue LED.
+  -> IO Bool
+setGamepadLED =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_SetGamepadLED x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Update a gamepad\'s LED color.
+--
+--     An example of a joystick LED is the light on the back of a PlayStation 4\'s DualShock 4 controller.
+--
+--     For gamepads with a single color LED, the maximum of the RGB values will be used as the LED brightness.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGamepadLED@.
+--                   The unsafe flavor is 'setGamepadLED'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGamepadLED@, defined at @SDL3\/SDL_gamepad.h 1587:34@
+setGamepadLEDSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@red@]: the intensity of the red LED.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@green@]: the intensity of the green LED.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@blue@]: the intensity of the blue LED.
+  -> IO Bool
+setGamepadLEDSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_SetGamepadLED x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Send a gamepad specific effect packet.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SendGamepadEffect@.
+--                   The safe flavor is 'sendGamepadEffectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SendGamepadEffect@, defined at @SDL3\/SDL_gamepad.h 1602:34@
+sendGamepadEffect
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to affect.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to send to the gamepad.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@size@]: the size of the data to send to the gamepad.
+  -> IO Bool
+sendGamepadEffect =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SendGamepadEffect x00 x11 (Coerce.coerce x22))
+
+-- | Send a gamepad specific effect packet.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SendGamepadEffect@.
+--                   The unsafe flavor is 'sendGamepadEffect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SendGamepadEffect@, defined at @SDL3\/SDL_gamepad.h 1602:34@
+sendGamepadEffectSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to affect.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to send to the gamepad.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@size@]: the size of the data to send to the gamepad.
+  -> IO Bool
+sendGamepadEffectSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SendGamepadEffect x00 x11 (Coerce.coerce x22))
+
+-- | Close a gamepad previously opened with @'openGamepad'@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openGamepad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CloseGamepad@.
+--                   The safe flavor is 'closeGamepadSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CloseGamepad@, defined at @SDL3\/SDL_gamepad.h 1616:34@
+closeGamepad
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO ()
+closeGamepad = Unsafe.sDL_CloseGamepad
+
+-- | Close a gamepad previously opened with @'openGamepad'@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openGamepad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CloseGamepad@.
+--                   The unsafe flavor is 'closeGamepad'
+--                   .
+--
+--     [C declaration]: @SDL_CloseGamepad@, defined at @SDL3\/SDL_gamepad.h 1616:34@
+closeGamepadSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: a gamepad identifier previously returned by @'openGamepad'@.
+  -> IO ()
+closeGamepadSafe = Safe.sDL_CloseGamepad
+
+-- | Return the sfSymbolsName for a given button on a gamepad on Apple platforms.
+--
+--     [Returns]: the sfSymbolsName or NULL if the name can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadAppleSFSymbolsNameForAxis'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadAppleSFSymbolsNameForButton@.
+--                   The safe flavor is 'getGamepadAppleSFSymbolsNameForButtonSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadAppleSFSymbolsNameForButton@, defined at @SDL3\/SDL_gamepad.h 1632:42@
+getGamepadAppleSFSymbolsNameForButton
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button on the gamepad.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadAppleSFSymbolsNameForButton =
+  Unsafe.sDL_GetGamepadAppleSFSymbolsNameForButton
+
+-- | Return the sfSymbolsName for a given button on a gamepad on Apple platforms.
+--
+--     [Returns]: the sfSymbolsName or NULL if the name can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadAppleSFSymbolsNameForAxis'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadAppleSFSymbolsNameForButton@.
+--                   The unsafe flavor is 'getGamepadAppleSFSymbolsNameForButton'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadAppleSFSymbolsNameForButton@, defined at @SDL3\/SDL_gamepad.h 1632:42@
+getGamepadAppleSFSymbolsNameForButtonSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL_GamepadButton
+  -- ^
+  --
+  --           [@button@]: a button on the gamepad.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadAppleSFSymbolsNameForButtonSafe =
+  Safe.sDL_GetGamepadAppleSFSymbolsNameForButton
+
+-- | Return the sfSymbolsName for a given axis on a gamepad on Apple platforms.
+--
+--     [Returns]: the sfSymbolsName or NULL if the name can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadAppleSFSymbolsNameForButton'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGamepadAppleSFSymbolsNameForAxis@.
+--                   The safe flavor is 'getGamepadAppleSFSymbolsNameForAxisSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadAppleSFSymbolsNameForAxis@, defined at @SDL3\/SDL_gamepad.h 1647:42@
+getGamepadAppleSFSymbolsNameForAxis
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis on the gamepad.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadAppleSFSymbolsNameForAxis =
+  Unsafe.sDL_GetGamepadAppleSFSymbolsNameForAxis
+
+-- | Return the sfSymbolsName for a given axis on a gamepad on Apple platforms.
+--
+--     [Returns]: the sfSymbolsName or NULL if the name can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGamepadAppleSFSymbolsNameForButton'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGamepadAppleSFSymbolsNameForAxis@.
+--                   The unsafe flavor is 'getGamepadAppleSFSymbolsNameForAxis'
+--                   .
+--
+--     [C declaration]: @SDL_GetGamepadAppleSFSymbolsNameForAxis@, defined at @SDL3\/SDL_gamepad.h 1647:42@
+getGamepadAppleSFSymbolsNameForAxisSafe
+  :: BG.Ptr SDL_Gamepad
+  -- ^
+  --
+  --           [@gamepad@]: the gamepad to query.
+  -> SDL_GamepadAxis
+  -- ^
+  --
+  --           [@axis@]: an axis on the gamepad.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGamepadAppleSFSymbolsNameForAxisSafe =
+  Safe.sDL_GetGamepadAppleSFSymbolsNameForAxis
diff --git a/src/SDL3/Sys/Gpu.hs b/src/SDL3/Sys/Gpu.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Gpu.hs
@@ -0,0 +1,7586 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | The GPU API offers a cross-platform way for apps to talk to modern graphics hardware. It offers both 3D graphics and compute support, in the style of Metal, Vulkan, and Direct3D 12.
+--
+--     A basic workflow might be something like this:
+--
+--     The app creates a GPU device with @'createGPUDevice'@, and assigns it to a window with @'claimWindowForGPUDevice'@ although strictly speaking you can render offscreen entirely, perhaps for image processing, and not use a window at all.
+--
+--     Next, the app prepares static data (things that are created once and used over and over). For example:
+--
+--     * Shaders (programs that run on the GPU): use @'createGPUShader'@.
+--
+--     * Vertex buffers (arrays of geometry data) and other rendering data: use @'createGPUBuffer'@ and @'uploadToGPUBuffer'@.
+--
+--     * Textures (images): use @'createGPUTexture'@ and @'uploadToGPUTexture'@.
+--
+--     * Samplers (how textures should be read from): use @'createGPUSampler'@.
+--
+--     * Render pipelines (precalculated rendering state): use @'createGPUGraphicsPipeline'@
+--
+--     To render, the app creates one or more command buffers, with @'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.
+--
+--     Rendering can happen to a texture (what other APIs call a \"render target\") or it can happen to the swapchain texture (which is just a special texture that represents a window\'s contents). The app can use @'waitAndAcquireGPUSwapchainTexture'@ to render to the window.
+--
+--     Rendering actually happens in a Render Pass, which is encoded into a 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.
+--
+--     The app calls @'beginGPURenderPass'@. Then it sets states it needs for each draw:
+--
+--     * @'bindGPUGraphicsPipeline'@
+--
+--     * @'setGPUViewport'@
+--
+--     * @'bindGPUVertexBuffers'@
+--
+--     * @'bindGPUVertexSamplers'@
+--
+--     * etc
+--
+--     Then, make the actual draw commands with these states:
+--
+--     * @'drawGPUPrimitives'@
+--
+--     * @'drawGPUPrimitivesIndirect'@
+--
+--     * @'drawGPUIndexedPrimitivesIndirect'@
+--
+--     * etc
+--
+--     After all the drawing commands for a pass are complete, the app should call @'endGPURenderPass'@. Once a render pass ends all render-related state is reset.
+--
+--     The app can begin new Render Passes and make new draws in the same command buffer until the entire scene is rendered.
+--
+--     Once all of the render commands for the scene are complete, the app calls @'submitGPUCommandBuffer'@ to send it to the GPU for processing.
+--
+--     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 some latency. When the app uses @'downloadFromGPUTexture'@ or @'downloadFromGPUBuffer'@, submitting the command buffer with @'submitGPUCommandBufferAndAcquireFence'@ will return a fence handle that the app can poll or wait on in a thread. Once the fence indicates that the command buffer is done processing, it is safe to read the downloaded data. Make sure to call @'releaseGPUFence'@ when done with the fence.
+--
+--     The API also has \"compute\" support. The app calls @'beginGPUComputePass'@ 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:
+--
+--     * @'bindGPUComputePipeline'@
+--
+--     * @'bindGPUComputeStorageBuffers'@
+--
+--     * @'bindGPUComputeStorageTextures'@
+--
+--     Then, dispatch compute work:
+--
+--     * @'dispatchGPUCompute'@
+--
+--     For advanced users, this opens up powerful GPU-driven workflows.
+--
+--     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. 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 [blog post](https://moonside.games/posts/layers-all-the-way-down/) explaining this situation.
+--
+--     It is optimal for apps to pre-compile the shader formats they might use, but for ease of use SDL provides a separate project, [SDL_shadercross](https://github.com/libsdl-org/SDL_shadercross), for performing runtime shader cross-compilation. It also has a CLI interface for offline precompilation as well.
+--
+--     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 2D graphics, the [Render API](https://wiki.libsdl.org/SDL3/CategoryRender) is much easier to use but still hardware-accelerated. That said, even for 2D 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.
+--
+--     Examples demonstrating proper usage of this API can be found [here](https://github.com/TheSpydog/SDL_gpu_examples)
+--
+--     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!
+--
+--     FAQ
+--
+--     __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.
+--
+--     __Question: Why is my shader not working?__
+--
+--     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 automatically validate shaders to see if they have a compatible layout. See the documentation for @'createGPUShader'@ and @'createGPUComputePipeline'@ for information on the expected layout.
+--
+--     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.
+--
+--     __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 make sure you are following them. Additionally, tools like [RenderDoc](https://renderdoc.org/) can be very helpful for diagnosing incorrect behavior and performance issues.
+--
+--     System Requirements
+--
+--     Vulkan
+--
+--     SDL driver name: \"vulkan\" (for use in @'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:
+--
+--     * @VK_KHR_swapchain@
+--
+--     * @VK_KHR_maintenance1@
+--
+--     * @independentBlend@
+--
+--     * @imageCubeArray@
+--
+--     * @depthClamp@
+--
+--     * @shaderClipDistance@
+--
+--     * @drawIndirectFirstInstance@
+--
+--     * @sampleRateShading@
+--
+--     You can remove some of these requirements to increase compatibility with Android devices by using these properties when creating the GPU device with @'createGPUDeviceWithProperties'@:
+--
+--     * 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
+--
+--     D3D12
+--
+--     SDL driver name: \"direct3d12\"
+--
+--     Supported on Windows 10 or newer, Xbox One (GDK), and Xbox Series X|S (GDK). Requires a GPU that supports DirectX 12 Feature Level 11_0 and Resource Binding Tier 2 or above.
+--
+--     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 @'createGPUDeviceWithProperties'@:
+--
+--     * SDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN
+--
+--     Metal
+--
+--     SDL driver name: \"metal\"
+--
+--     Supported on macOS 10.14+ and iOS\/tvOS 13.0+. Hardware requirements vary by operating system:
+--
+--     * 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
+--
+--     Coordinate System
+--
+--     The GPU API uses a left-handed coordinate system, following the convention of D3D12 and Metal. Specifically:
+--
+--     * __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.
+--
+--     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.
+--
+--     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.
+--
+--     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.
+--
+--     It is valid to push uniform data during a render or compute pass.
+--
+--     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.
+--
+--     A Note On Cycling
+--
+--     When using a command buffer, operations do not occur immediately - they occur some time after the command buffer is submitted.
+--
+--     When a resource is used in a pending or active command buffer, it is considered to be \"bound\". When a resource is no longer used in any pending or active command buffers, it is considered to be \"unbound\".
+--
+--     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.
+--
+--     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 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.
+--
+--     For example: you can call @'mapGPUTransferBuffer'@, write texture data, @'unmapGPUTransferBuffer'@, and then @'uploadToGPUTexture'@. The next time you write texture data to the transfer buffer, if you set the cycle param to true, you don\'t have to worry about overwriting any data that is not yet uploaded.
+--
+--     Another example: If you are using a texture in a render pass every frame, 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.
+--
+--     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.
+--
+--     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.
+--
+--     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.
+--
+--     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. An opaque handle representing the SDL_GPU context.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Gpu.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Gpu (
+  module SDL3.Sys.Bindgen.Gpu,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Gpu.SDL_GPU_BUFFERUSAGE_VERTEX,
+  pattern SDL3.Sys.Gpu.SDL_GPU_BUFFERUSAGE_INDEX,
+  pattern SDL3.Sys.Gpu.SDL_GPU_BUFFERUSAGE_INDIRECT,
+  pattern SDL3.Sys.Gpu.SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ,
+  pattern SDL3.Sys.Gpu.SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ,
+  pattern SDL3.Sys.Gpu.SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE,
+  pattern SDL3.Sys.Gpu.SDL_GPU_COLORCOMPONENT_R,
+  pattern SDL3.Sys.Gpu.SDL_GPU_COLORCOMPONENT_G,
+  pattern SDL3.Sys.Gpu.SDL_GPU_COLORCOMPONENT_B,
+  pattern SDL3.Sys.Gpu.SDL_GPU_COLORCOMPONENT_A,
+  pattern SDL3.Sys.Gpu.SDL_GPU_SHADERFORMAT_INVALID,
+  pattern SDL3.Sys.Gpu.SDL_GPU_SHADERFORMAT_PRIVATE,
+  pattern SDL3.Sys.Gpu.SDL_GPU_SHADERFORMAT_SPIRV,
+  pattern SDL3.Sys.Gpu.SDL_GPU_SHADERFORMAT_DXBC,
+  pattern SDL3.Sys.Gpu.SDL_GPU_SHADERFORMAT_DXIL,
+  pattern SDL3.Sys.Gpu.SDL_GPU_SHADERFORMAT_MSL,
+  pattern SDL3.Sys.Gpu.SDL_GPU_SHADERFORMAT_METALLIB,
+  pattern SDL3.Sys.Gpu.SDL_GPU_TEXTUREUSAGE_SAMPLER,
+  pattern SDL3.Sys.Gpu.SDL_GPU_TEXTUREUSAGE_COLOR_TARGET,
+  pattern SDL3.Sys.Gpu.SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET,
+  pattern SDL3.Sys.Gpu.SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ,
+  pattern SDL3.Sys.Gpu.SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ,
+  pattern SDL3.Sys.Gpu.SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE,
+  pattern SDL3.Sys.Gpu.SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE,
+
+  -- * Function aliases
+  SDL3.Sys.Gpu.gpuSupportsShaderFormats,
+  SDL3.Sys.Gpu.gpuSupportsShaderFormatsSafe,
+  SDL3.Sys.Gpu.gpuSupportsProperties,
+  SDL3.Sys.Gpu.gpuSupportsPropertiesSafe,
+  SDL3.Sys.Gpu.createGPUDevice,
+  SDL3.Sys.Gpu.createGPUDeviceSafe,
+  SDL3.Sys.Gpu.createGPUDeviceWithProperties,
+  SDL3.Sys.Gpu.createGPUDeviceWithPropertiesSafe,
+  SDL3.Sys.Gpu.destroyGPUDevice,
+  SDL3.Sys.Gpu.destroyGPUDeviceSafe,
+  SDL3.Sys.Gpu.getNumGPUDrivers,
+  SDL3.Sys.Gpu.getNumGPUDriversSafe,
+  SDL3.Sys.Gpu.getGPUDriver,
+  SDL3.Sys.Gpu.getGPUDriverSafe,
+  SDL3.Sys.Gpu.getGPUDeviceDriver,
+  SDL3.Sys.Gpu.getGPUDeviceDriverSafe,
+  SDL3.Sys.Gpu.getGPUShaderFormats,
+  SDL3.Sys.Gpu.getGPUShaderFormatsSafe,
+  SDL3.Sys.Gpu.getGPUDeviceProperties,
+  SDL3.Sys.Gpu.getGPUDevicePropertiesSafe,
+  SDL3.Sys.Gpu.createGPUComputePipeline,
+  SDL3.Sys.Gpu.createGPUComputePipelineSafe,
+  SDL3.Sys.Gpu.createGPUGraphicsPipeline,
+  SDL3.Sys.Gpu.createGPUGraphicsPipelineSafe,
+  SDL3.Sys.Gpu.createGPUSampler,
+  SDL3.Sys.Gpu.createGPUSamplerSafe,
+  SDL3.Sys.Gpu.createGPUShader,
+  SDL3.Sys.Gpu.createGPUShaderSafe,
+  SDL3.Sys.Gpu.createGPUTexture,
+  SDL3.Sys.Gpu.createGPUTextureSafe,
+  SDL3.Sys.Gpu.createGPUBuffer,
+  SDL3.Sys.Gpu.createGPUBufferSafe,
+  SDL3.Sys.Gpu.createGPUTransferBuffer,
+  SDL3.Sys.Gpu.createGPUTransferBufferSafe,
+  SDL3.Sys.Gpu.setGPUBufferName,
+  SDL3.Sys.Gpu.setGPUBufferNameSafe,
+  SDL3.Sys.Gpu.setGPUTextureName,
+  SDL3.Sys.Gpu.setGPUTextureNameSafe,
+  SDL3.Sys.Gpu.insertGPUDebugLabel,
+  SDL3.Sys.Gpu.insertGPUDebugLabelSafe,
+  SDL3.Sys.Gpu.pushGPUDebugGroup,
+  SDL3.Sys.Gpu.pushGPUDebugGroupSafe,
+  SDL3.Sys.Gpu.popGPUDebugGroup,
+  SDL3.Sys.Gpu.popGPUDebugGroupSafe,
+  SDL3.Sys.Gpu.releaseGPUTexture,
+  SDL3.Sys.Gpu.releaseGPUTextureSafe,
+  SDL3.Sys.Gpu.releaseGPUSampler,
+  SDL3.Sys.Gpu.releaseGPUSamplerSafe,
+  SDL3.Sys.Gpu.releaseGPUBuffer,
+  SDL3.Sys.Gpu.releaseGPUBufferSafe,
+  SDL3.Sys.Gpu.releaseGPUTransferBuffer,
+  SDL3.Sys.Gpu.releaseGPUTransferBufferSafe,
+  SDL3.Sys.Gpu.releaseGPUComputePipeline,
+  SDL3.Sys.Gpu.releaseGPUComputePipelineSafe,
+  SDL3.Sys.Gpu.releaseGPUShader,
+  SDL3.Sys.Gpu.releaseGPUShaderSafe,
+  SDL3.Sys.Gpu.releaseGPUGraphicsPipeline,
+  SDL3.Sys.Gpu.releaseGPUGraphicsPipelineSafe,
+  SDL3.Sys.Gpu.acquireGPUCommandBuffer,
+  SDL3.Sys.Gpu.acquireGPUCommandBufferSafe,
+  SDL3.Sys.Gpu.pushGPUVertexUniformData,
+  SDL3.Sys.Gpu.pushGPUVertexUniformDataSafe,
+  SDL3.Sys.Gpu.pushGPUFragmentUniformData,
+  SDL3.Sys.Gpu.pushGPUFragmentUniformDataSafe,
+  SDL3.Sys.Gpu.pushGPUComputeUniformData,
+  SDL3.Sys.Gpu.pushGPUComputeUniformDataSafe,
+  SDL3.Sys.Gpu.beginGPURenderPass,
+  SDL3.Sys.Gpu.beginGPURenderPassSafe,
+  SDL3.Sys.Gpu.bindGPUGraphicsPipeline,
+  SDL3.Sys.Gpu.bindGPUGraphicsPipelineSafe,
+  SDL3.Sys.Gpu.setGPUViewport,
+  SDL3.Sys.Gpu.setGPUViewportSafe,
+  SDL3.Sys.Gpu.setGPUScissor,
+  SDL3.Sys.Gpu.setGPUScissorSafe,
+  SDL3.Sys.Gpu.setGPUBlendConstants,
+  SDL3.Sys.Gpu.setGPUBlendConstantsSafe,
+  SDL3.Sys.Gpu.setGPUStencilReference,
+  SDL3.Sys.Gpu.setGPUStencilReferenceSafe,
+  SDL3.Sys.Gpu.bindGPUVertexBuffers,
+  SDL3.Sys.Gpu.bindGPUVertexBuffersSafe,
+  SDL3.Sys.Gpu.bindGPUIndexBuffer,
+  SDL3.Sys.Gpu.bindGPUIndexBufferSafe,
+  SDL3.Sys.Gpu.bindGPUVertexSamplers,
+  SDL3.Sys.Gpu.bindGPUVertexSamplersSafe,
+  SDL3.Sys.Gpu.bindGPUVertexStorageTextures,
+  SDL3.Sys.Gpu.bindGPUVertexStorageTexturesSafe,
+  SDL3.Sys.Gpu.bindGPUVertexStorageBuffers,
+  SDL3.Sys.Gpu.bindGPUVertexStorageBuffersSafe,
+  SDL3.Sys.Gpu.bindGPUFragmentSamplers,
+  SDL3.Sys.Gpu.bindGPUFragmentSamplersSafe,
+  SDL3.Sys.Gpu.bindGPUFragmentStorageTextures,
+  SDL3.Sys.Gpu.bindGPUFragmentStorageTexturesSafe,
+  SDL3.Sys.Gpu.bindGPUFragmentStorageBuffers,
+  SDL3.Sys.Gpu.bindGPUFragmentStorageBuffersSafe,
+  SDL3.Sys.Gpu.drawGPUIndexedPrimitives,
+  SDL3.Sys.Gpu.drawGPUIndexedPrimitivesSafe,
+  SDL3.Sys.Gpu.drawGPUPrimitives,
+  SDL3.Sys.Gpu.drawGPUPrimitivesSafe,
+  SDL3.Sys.Gpu.drawGPUPrimitivesIndirect,
+  SDL3.Sys.Gpu.drawGPUPrimitivesIndirectSafe,
+  SDL3.Sys.Gpu.drawGPUIndexedPrimitivesIndirect,
+  SDL3.Sys.Gpu.drawGPUIndexedPrimitivesIndirectSafe,
+  SDL3.Sys.Gpu.endGPURenderPass,
+  SDL3.Sys.Gpu.endGPURenderPassSafe,
+  SDL3.Sys.Gpu.beginGPUComputePass,
+  SDL3.Sys.Gpu.beginGPUComputePassSafe,
+  SDL3.Sys.Gpu.bindGPUComputePipeline,
+  SDL3.Sys.Gpu.bindGPUComputePipelineSafe,
+  SDL3.Sys.Gpu.bindGPUComputeSamplers,
+  SDL3.Sys.Gpu.bindGPUComputeSamplersSafe,
+  SDL3.Sys.Gpu.bindGPUComputeStorageTextures,
+  SDL3.Sys.Gpu.bindGPUComputeStorageTexturesSafe,
+  SDL3.Sys.Gpu.bindGPUComputeStorageBuffers,
+  SDL3.Sys.Gpu.bindGPUComputeStorageBuffersSafe,
+  SDL3.Sys.Gpu.dispatchGPUCompute,
+  SDL3.Sys.Gpu.dispatchGPUComputeSafe,
+  SDL3.Sys.Gpu.dispatchGPUComputeIndirect,
+  SDL3.Sys.Gpu.dispatchGPUComputeIndirectSafe,
+  SDL3.Sys.Gpu.endGPUComputePass,
+  SDL3.Sys.Gpu.endGPUComputePassSafe,
+  SDL3.Sys.Gpu.mapGPUTransferBuffer,
+  SDL3.Sys.Gpu.mapGPUTransferBufferSafe,
+  SDL3.Sys.Gpu.unmapGPUTransferBuffer,
+  SDL3.Sys.Gpu.unmapGPUTransferBufferSafe,
+  SDL3.Sys.Gpu.beginGPUCopyPass,
+  SDL3.Sys.Gpu.beginGPUCopyPassSafe,
+  SDL3.Sys.Gpu.uploadToGPUTexture,
+  SDL3.Sys.Gpu.uploadToGPUTextureSafe,
+  SDL3.Sys.Gpu.uploadToGPUBuffer,
+  SDL3.Sys.Gpu.uploadToGPUBufferSafe,
+  SDL3.Sys.Gpu.copyGPUTextureToTexture,
+  SDL3.Sys.Gpu.copyGPUTextureToTextureSafe,
+  SDL3.Sys.Gpu.copyGPUBufferToBuffer,
+  SDL3.Sys.Gpu.copyGPUBufferToBufferSafe,
+  SDL3.Sys.Gpu.downloadFromGPUTexture,
+  SDL3.Sys.Gpu.downloadFromGPUTextureSafe,
+  SDL3.Sys.Gpu.downloadFromGPUBuffer,
+  SDL3.Sys.Gpu.downloadFromGPUBufferSafe,
+  SDL3.Sys.Gpu.endGPUCopyPass,
+  SDL3.Sys.Gpu.endGPUCopyPassSafe,
+  SDL3.Sys.Gpu.generateMipmapsForGPUTexture,
+  SDL3.Sys.Gpu.generateMipmapsForGPUTextureSafe,
+  SDL3.Sys.Gpu.blitGPUTexture,
+  SDL3.Sys.Gpu.blitGPUTextureSafe,
+  SDL3.Sys.Gpu.windowSupportsGPUSwapchainComposition,
+  SDL3.Sys.Gpu.windowSupportsGPUSwapchainCompositionSafe,
+  SDL3.Sys.Gpu.windowSupportsGPUPresentMode,
+  SDL3.Sys.Gpu.windowSupportsGPUPresentModeSafe,
+  SDL3.Sys.Gpu.claimWindowForGPUDevice,
+  SDL3.Sys.Gpu.claimWindowForGPUDeviceSafe,
+  SDL3.Sys.Gpu.releaseWindowFromGPUDevice,
+  SDL3.Sys.Gpu.releaseWindowFromGPUDeviceSafe,
+  SDL3.Sys.Gpu.setGPUSwapchainParameters,
+  SDL3.Sys.Gpu.setGPUSwapchainParametersSafe,
+  SDL3.Sys.Gpu.setGPUAllowedFramesInFlight,
+  SDL3.Sys.Gpu.setGPUAllowedFramesInFlightSafe,
+  SDL3.Sys.Gpu.getGPUSwapchainTextureFormat,
+  SDL3.Sys.Gpu.getGPUSwapchainTextureFormatSafe,
+  SDL3.Sys.Gpu.acquireGPUSwapchainTexture,
+  SDL3.Sys.Gpu.acquireGPUSwapchainTextureSafe,
+  SDL3.Sys.Gpu.waitForGPUSwapchain,
+  SDL3.Sys.Gpu.waitForGPUSwapchainSafe,
+  SDL3.Sys.Gpu.waitAndAcquireGPUSwapchainTexture,
+  SDL3.Sys.Gpu.waitAndAcquireGPUSwapchainTextureSafe,
+  SDL3.Sys.Gpu.submitGPUCommandBuffer,
+  SDL3.Sys.Gpu.submitGPUCommandBufferSafe,
+  SDL3.Sys.Gpu.submitGPUCommandBufferAndAcquireFence,
+  SDL3.Sys.Gpu.submitGPUCommandBufferAndAcquireFenceSafe,
+  SDL3.Sys.Gpu.cancelGPUCommandBuffer,
+  SDL3.Sys.Gpu.cancelGPUCommandBufferSafe,
+  SDL3.Sys.Gpu.waitForGPUIdle,
+  SDL3.Sys.Gpu.waitForGPUIdleSafe,
+  SDL3.Sys.Gpu.waitForGPUFences,
+  SDL3.Sys.Gpu.waitForGPUFencesSafe,
+  SDL3.Sys.Gpu.queryGPUFence,
+  SDL3.Sys.Gpu.queryGPUFenceSafe,
+  SDL3.Sys.Gpu.releaseGPUFence,
+  SDL3.Sys.Gpu.releaseGPUFenceSafe,
+  SDL3.Sys.Gpu.gpuTextureFormatTexelBlockSize,
+  SDL3.Sys.Gpu.gpuTextureFormatTexelBlockSizeSafe,
+  SDL3.Sys.Gpu.gpuTextureSupportsFormat,
+  SDL3.Sys.Gpu.gpuTextureSupportsFormatSafe,
+  SDL3.Sys.Gpu.gpuTextureSupportsSampleCount,
+  SDL3.Sys.Gpu.gpuTextureSupportsSampleCountSafe,
+  SDL3.Sys.Gpu.calculateGPUTextureFormatSize,
+  SDL3.Sys.Gpu.calculateGPUTextureFormatSizeSafe,
+  SDL3.Sys.Gpu.getPixelFormatFromGPUTextureFormat,
+  SDL3.Sys.Gpu.getPixelFormatFromGPUTextureFormatSafe,
+  SDL3.Sys.Gpu.getGPUTextureFormatFromPixelFormat,
+  SDL3.Sys.Gpu.getGPUTextureFormatFromPixelFormatSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Gpu
+import SDL3.Sys.Bindgen.Gpu.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Gpu.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | Checks for GPU runtime support.
+--
+--     [Returns]: true if supported, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GPUSupportsShaderFormats@.
+--                   The safe flavor is 'gpuSupportsShaderFormatsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GPUSupportsShaderFormats@, defined at @SDL3\/SDL_gpu.h 2200:34@
+gpuSupportsShaderFormats
+  :: SDL_GPUShaderFormat
+  -- ^
+  --
+  --           [@format_flags@]: a bitflag indicating which shader formats the app is able to provide.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the preferred GPU driver, or NULL to let SDL pick the optimal driver.
+  -> IO Bool
+gpuSupportsShaderFormats =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GPUSupportsShaderFormats x00 x11)
+
+-- | Checks for GPU runtime support.
+--
+--     [Returns]: true if supported, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GPUSupportsShaderFormats@.
+--                   The unsafe flavor is 'gpuSupportsShaderFormats'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GPUSupportsShaderFormats@, defined at @SDL3\/SDL_gpu.h 2200:34@
+gpuSupportsShaderFormatsSafe
+  :: SDL_GPUShaderFormat
+  -- ^
+  --
+  --           [@format_flags@]: a bitflag indicating which shader formats the app is able to provide.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the preferred GPU driver, or NULL to let SDL pick the optimal driver.
+  -> IO Bool
+gpuSupportsShaderFormatsSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GPUSupportsShaderFormats x00 x11)
+
+-- | Checks for GPU runtime support.
+--
+--     [Returns]: true if supported, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUDeviceWithProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GPUSupportsProperties@.
+--                   The safe flavor is 'gpuSupportsPropertiesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GPUSupportsProperties@, defined at @SDL3\/SDL_gpu.h 2214:34@
+gpuSupportsProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO Bool
+gpuSupportsProperties =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GPUSupportsProperties x00)
+
+-- | Checks for GPU runtime support.
+--
+--     [Returns]: true if supported, false otherwise.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUDeviceWithProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GPUSupportsProperties@.
+--                   The unsafe flavor is 'gpuSupportsProperties'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GPUSupportsProperties@, defined at @SDL3\/SDL_gpu.h 2214:34@
+gpuSupportsPropertiesSafe
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO Bool
+gpuSupportsPropertiesSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GPUSupportsProperties x00)
+
+-- | Creates a GPU context.
+--
+--     The GPU driver name can be one of the following:
+--
+--     * \"vulkan\": [Vulkan](https://wiki.libsdl.org/SDL3/CategoryGPU#vulkan)
+--
+--     * \"direct3d12\": [D3D12](https://wiki.libsdl.org/SDL3/CategoryGPU#d3d12)
+--
+--     * \"metal\": [Metal](https://wiki.libsdl.org/SDL3/CategoryGPU#metal)
+--
+--     * NULL: let SDL pick the optimal driver
+--
+--     [Returns]: a GPU context on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUDeviceWithProperties', 'getGPUShaderFormats', 'getGPUDeviceDriver', 'destroyGPUDevice', 'gpuSupportsShaderFormats'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPUDevice@.
+--                   The safe flavor is 'createGPUDeviceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateGPUDevice@, defined at @SDL3\/SDL_gpu.h 2243:45@
+createGPUDevice
+  :: SDL_GPUShaderFormat
+  -- ^
+  --
+  --           [@format_flags@]: a bitflag indicating which shader formats the app is able to provide.
+  -> Bool
+  -- ^
+  --
+  --           [@debug_mode@]: enable debug mode properties and validations.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the preferred GPU driver, or NULL to let SDL pick the optimal driver.
+  -> IO (BG.Ptr SDL_GPUDevice)
+createGPUDevice =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_CreateGPUDevice x00 (CBool.fromBool x11) x22
+
+-- | Creates a GPU context.
+--
+--     The GPU driver name can be one of the following:
+--
+--     * \"vulkan\": [Vulkan](https://wiki.libsdl.org/SDL3/CategoryGPU#vulkan)
+--
+--     * \"direct3d12\": [D3D12](https://wiki.libsdl.org/SDL3/CategoryGPU#d3d12)
+--
+--     * \"metal\": [Metal](https://wiki.libsdl.org/SDL3/CategoryGPU#metal)
+--
+--     * NULL: let SDL pick the optimal driver
+--
+--     [Returns]: a GPU context on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUDeviceWithProperties', 'getGPUShaderFormats', 'getGPUDeviceDriver', 'destroyGPUDevice', 'gpuSupportsShaderFormats'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPUDevice@.
+--                   The unsafe flavor is 'createGPUDevice'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateGPUDevice@, defined at @SDL3\/SDL_gpu.h 2243:45@
+createGPUDeviceSafe
+  :: SDL_GPUShaderFormat
+  -- ^
+  --
+  --           [@format_flags@]: a bitflag indicating which shader formats the app is able to provide.
+  -> Bool
+  -- ^
+  --
+  --           [@debug_mode@]: enable debug mode properties and validations.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the preferred GPU driver, or NULL to let SDL pick the optimal driver.
+  -> IO (BG.Ptr SDL_GPUDevice)
+createGPUDeviceSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_CreateGPUDevice x00 (CBool.fromBool x11) x22
+
+-- | Creates a GPU context.
+--
+--     These are the supported properties:
+--
+--     * @'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.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN'@: enable to automatically log useful debug information on device creation, defaults to true.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_NAME_STRING'@: the name of the GPU driver to use, if a specific one is desired.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN'@: Enable Vulkan device feature shaderClipDistance. If disabled, clip distances are not supported in shader code: gl_ClipDistance[] built-ins of GLSL, SV_ClipDistance0\/1 semantics of HLSL and [[clip_distance]] attribute of 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.
+--
+--     These are the current shader format properties:
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN'@: The app is able to provide shaders for an NDA platform.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN'@: The app is able to provide SPIR-V shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN'@: The app is able to provide DXBC shaders if applicable
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN'@: The app is able to provide DXIL shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN'@: The app is able to provide MSL shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN'@: The app is able to provide Metal shader libraries if applicable.
+--
+--     With the D3D12 backend:
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING'@: the prefix to use for all vertex semantics, default is \"TEXCOORD\".
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN'@: By default, Resourcing Binding Tier 2 is required for D3D12 support. However, an application can set this property to true to enable Tier 1 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 capacity. Defaults to false.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER'@: Certain feature checks are only possible on Windows 11 by default. By setting this alongside @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING'@ and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those feature checks possible on older platforms. The version you provide must match the one given in the DLL.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING'@: Certain feature checks are only possible on Windows 11 by default. By setting this alongside @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER'@ and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those feature checks possible on older platforms. The path you provide must be relative to the executable path of your app. Be sure not to put the DLL in the same directory as the exe; Microsoft strongly advises against this!
+--
+--     With the Vulkan backend:
+--
+--     * @'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.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER'@: a pointer to an '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 minimal set SDL requires.
+--
+--     With the Metal backend: - @'sDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN'@: By default, macOS support requires what Apple calls \"MTLGPUFamilyMac2\" hardware or newer. However, an application can set this property to true to enable support for \"MTLGPUFamilyMac1\" hardware, if (and only if) the application does not write to sRGB textures. (For history\'s sake: MacFamily1 also does not support indirect command buffers, MSAA depth resolve, and stencil resolve\/feedback, but these are not exposed features in SDL_GPU.)
+--
+--     [Returns]: a GPU context on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGPUShaderFormats', 'getGPUDeviceDriver', 'destroyGPUDevice', 'gpuSupportsProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPUDeviceWithProperties@.
+--                   The safe flavor is 'createGPUDeviceWithPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUDeviceWithProperties@, defined at @SDL3\/SDL_gpu.h 2360:45@
+createGPUDeviceWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_GPUDevice)
+createGPUDeviceWithProperties =
+  Unsafe.sDL_CreateGPUDeviceWithProperties
+
+-- | Creates a GPU context.
+--
+--     These are the supported properties:
+--
+--     * @'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.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_VERBOSE_BOOLEAN'@: enable to automatically log useful debug information on device creation, defaults to true.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_NAME_STRING'@: the name of the GPU driver to use, if a specific one is desired.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_FEATURE_CLIP_DISTANCE_BOOLEAN'@: Enable Vulkan device feature shaderClipDistance. If disabled, clip distances are not supported in shader code: gl_ClipDistance[] built-ins of GLSL, SV_ClipDistance0\/1 semantics of HLSL and [[clip_distance]] attribute of 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.
+--
+--     These are the current shader format properties:
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_PRIVATE_BOOLEAN'@: The app is able to provide shaders for an NDA platform.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_SPIRV_BOOLEAN'@: The app is able to provide SPIR-V shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXBC_BOOLEAN'@: The app is able to provide DXBC shaders if applicable
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_DXIL_BOOLEAN'@: The app is able to provide DXIL shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_MSL_BOOLEAN'@: The app is able to provide MSL shaders if applicable.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_SHADERS_METALLIB_BOOLEAN'@: The app is able to provide Metal shader libraries if applicable.
+--
+--     With the D3D12 backend:
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING'@: the prefix to use for all vertex semantics, default is \"TEXCOORD\".
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_ALLOW_FEWER_RESOURCE_SLOTS_BOOLEAN'@: By default, Resourcing Binding Tier 2 is required for D3D12 support. However, an application can set this property to true to enable Tier 1 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 capacity. Defaults to false.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER'@: Certain feature checks are only possible on Windows 11 by default. By setting this alongside @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING'@ and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those feature checks possible on older platforms. The version you provide must match the one given in the DLL.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_PATH_STRING'@: Certain feature checks are only possible on Windows 11 by default. By setting this alongside @'sDL_PROP_GPU_DEVICE_CREATE_D3D12_AGILITY_SDK_VERSION_NUMBER'@ and vendoring D3D12Core.dll from the D3D12 Agility SDK, you can make those feature checks possible on older platforms. The path you provide must be relative to the executable path of your app. Be sure not to put the DLL in the same directory as the exe; Microsoft strongly advises against this!
+--
+--     With the Vulkan backend:
+--
+--     * @'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.
+--
+--     * @'sDL_PROP_GPU_DEVICE_CREATE_VULKAN_OPTIONS_POINTER'@: a pointer to an '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 minimal set SDL requires.
+--
+--     With the Metal backend: - @'sDL_PROP_GPU_DEVICE_CREATE_METAL_ALLOW_MACFAMILY1_BOOLEAN'@: By default, macOS support requires what Apple calls \"MTLGPUFamilyMac2\" hardware or newer. However, an application can set this property to true to enable support for \"MTLGPUFamilyMac1\" hardware, if (and only if) the application does not write to sRGB textures. (For history\'s sake: MacFamily1 also does not support indirect command buffers, MSAA depth resolve, and stencil resolve\/feedback, but these are not exposed features in SDL_GPU.)
+--
+--     [Returns]: a GPU context on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGPUShaderFormats', 'getGPUDeviceDriver', 'destroyGPUDevice', 'gpuSupportsProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPUDeviceWithProperties@.
+--                   The unsafe flavor is 'createGPUDeviceWithProperties'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUDeviceWithProperties@, defined at @SDL3\/SDL_gpu.h 2360:45@
+createGPUDeviceWithPropertiesSafe
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_GPUDevice)
+createGPUDeviceWithPropertiesSafe =
+  Safe.sDL_CreateGPUDeviceWithProperties
+
+-- | Destroys a GPU context previously returned by 'createGPUDevice'.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyGPUDevice@.
+--                   The safe flavor is 'destroyGPUDeviceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyGPUDevice@, defined at @SDL3\/SDL_gpu.h 2422:34@
+destroyGPUDevice
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context to destroy.
+  -> IO ()
+destroyGPUDevice = Unsafe.sDL_DestroyGPUDevice
+
+-- | Destroys a GPU context previously returned by 'createGPUDevice'.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyGPUDevice@.
+--                   The unsafe flavor is 'destroyGPUDevice'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyGPUDevice@, defined at @SDL3\/SDL_gpu.h 2422:34@
+destroyGPUDeviceSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context to destroy.
+  -> IO ()
+destroyGPUDeviceSafe = Safe.sDL_DestroyGPUDevice
+
+-- | Get the number of GPU drivers compiled into SDL.
+--
+--     [Returns]: the number of built in GPU drivers.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGPUDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumGPUDrivers@.
+--                   The safe flavor is 'getNumGPUDriversSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumGPUDrivers@, defined at @SDL3\/SDL_gpu.h 2433:33@
+getNumGPUDrivers :: IO BG.Int32
+getNumGPUDrivers =
+  fmap Coerce.coerce Unsafe.sDL_GetNumGPUDrivers
+
+-- | Get the number of GPU drivers compiled into SDL.
+--
+--     [Returns]: the number of built in GPU drivers.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGPUDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumGPUDrivers@.
+--                   The unsafe flavor is 'getNumGPUDrivers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumGPUDrivers@, defined at @SDL3\/SDL_gpu.h 2433:33@
+getNumGPUDriversSafe :: IO BG.Int32
+getNumGPUDriversSafe =
+  fmap Coerce.coerce Safe.sDL_GetNumGPUDrivers
+
+-- | 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.
+--
+--     [Returns]: the name of the GPU driver with the given __index__.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumGPUDrivers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGPUDriver@.
+--                   The safe flavor is 'getGPUDriverSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGPUDriver@, defined at @SDL3\/SDL_gpu.h 2452:42@
+getGPUDriver
+  :: BG.Int32
+  -- ^
+  --
+  --           [@index@]: the index of a GPU driver.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGPUDriver =
+  \x00 -> Unsafe.sDL_GetGPUDriver (Coerce.coerce x00)
+
+-- | 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.
+--
+--     [Returns]: the name of the GPU driver with the given __index__.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumGPUDrivers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGPUDriver@.
+--                   The unsafe flavor is 'getGPUDriver'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetGPUDriver@, defined at @SDL3\/SDL_gpu.h 2452:42@
+getGPUDriverSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@index@]: the index of a GPU driver.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGPUDriverSafe =
+  \x00 -> Safe.sDL_GetGPUDriver (Coerce.coerce x00)
+
+-- | Returns the name of the backend used to create this GPU context.
+--
+--     [Returns]: the name of the device\'s driver, or NULL on error.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGPUDeviceDriver@.
+--                   The safe flavor is 'getGPUDeviceDriverSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPUDeviceDriver@, defined at @SDL3\/SDL_gpu.h 2462:42@
+getGPUDeviceDriver
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGPUDeviceDriver = Unsafe.sDL_GetGPUDeviceDriver
+
+-- | Returns the name of the backend used to create this GPU context.
+--
+--     [Returns]: the name of the device\'s driver, or NULL on error.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGPUDeviceDriver@.
+--                   The unsafe flavor is 'getGPUDeviceDriver'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPUDeviceDriver@, defined at @SDL3\/SDL_gpu.h 2462:42@
+getGPUDeviceDriverSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getGPUDeviceDriverSafe = Safe.sDL_GetGPUDeviceDriver
+
+-- | Returns the supported shader formats for this GPU context.
+--
+--     [Returns]: a bitflag indicating which shader formats the driver is able to consume.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGPUShaderFormats@.
+--                   The safe flavor is 'getGPUShaderFormatsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPUShaderFormats@, defined at @SDL3\/SDL_gpu.h 2473:49@
+getGPUShaderFormats
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO SDL_GPUShaderFormat
+getGPUShaderFormats = Unsafe.sDL_GetGPUShaderFormats
+
+-- | Returns the supported shader formats for this GPU context.
+--
+--     [Returns]: a bitflag indicating which shader formats the driver is able to consume.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGPUShaderFormats@.
+--                   The unsafe flavor is 'getGPUShaderFormats'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPUShaderFormats@, defined at @SDL3\/SDL_gpu.h 2473:49@
+getGPUShaderFormatsSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO SDL_GPUShaderFormat
+getGPUShaderFormatsSafe =
+  Safe.sDL_GetGPUShaderFormats
+
+-- | Get the properties associated with a GPU device.
+--
+--     All properties are optional and may differ between GPU backends and SDL versions.
+--
+--     The following properties are provided by SDL:
+--
+--     @'sDL_PROP_GPU_DEVICE_NAME_STRING'@: Contains the name of the underlying device as reported by the system driver. This string has no standardized 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.
+--
+--     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 15D8: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 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.
+--
+--     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-00eac0.824c4f31403fb1fbf8ee1042422c2129
+--
+--     This string has also been observed to be a multiline string (which has a trailing newline):
+--
+--     @
+--     Driver Build: 85da404, I46ff5fc46f, 1606794520
+--     Date: 11\/30\/20
+--     Compiler Version: EV031.31.04.01
+--     Driver Branch: promo490_3_Google
+--     @
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGPUDeviceProperties@.
+--                   The safe flavor is 'getGPUDevicePropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPUDeviceProperties@, defined at @SDL3\/SDL_gpu.h 2577:46@
+getGPUDeviceProperties
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getGPUDeviceProperties =
+  Unsafe.sDL_GetGPUDeviceProperties
+
+-- | Get the properties associated with a GPU device.
+--
+--     All properties are optional and may differ between GPU backends and SDL versions.
+--
+--     The following properties are provided by SDL:
+--
+--     @'sDL_PROP_GPU_DEVICE_NAME_STRING'@: Contains the name of the underlying device as reported by the system driver. This string has no standardized 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.
+--
+--     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 15D8: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 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.
+--
+--     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-00eac0.824c4f31403fb1fbf8ee1042422c2129
+--
+--     This string has also been observed to be a multiline string (which has a trailing newline):
+--
+--     @
+--     Driver Build: 85da404, I46ff5fc46f, 1606794520
+--     Date: 11\/30\/20
+--     Compiler Version: EV031.31.04.01
+--     Driver Branch: promo490_3_Google
+--     @
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGPUDeviceProperties@.
+--                   The unsafe flavor is 'getGPUDeviceProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPUDeviceProperties@, defined at @SDL3\/SDL_gpu.h 2577:46@
+getGPUDevicePropertiesSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getGPUDevicePropertiesSafe =
+  Safe.sDL_GetGPUDeviceProperties
+
+-- | Creates a pipeline object to be used in a compute workflow.
+--
+--     Shader resource bindings must be authored to follow a particular order depending on the shader format.
+--
+--     For SPIR-V shaders, use the following resource sets:
+--
+--     * 0: Sampled textures, followed by read-only storage textures, followed by read-only storage buffers
+--
+--     * 1: Read-write storage textures, followed by read-write storage buffers
+--
+--     * 2: Uniform buffers
+--
+--     For DXBC and DXIL shaders, use the following register order:
+--
+--     * (t[n], space0): Sampled textures, followed by read-only storage textures, followed by read-only storage buffers
+--
+--     * (u[n], space1): Read-write storage textures, followed by read-write storage buffers
+--
+--     * (b[n], space2): Uniform buffers
+--
+--     For MSL\/metallib, use the following order:
+--
+--     * [[buffer]]: Uniform buffers, followed by read-only storage buffers, followed by read-write storage buffers
+--
+--     * [[texture]]: Sampled textures, followed by read-only storage textures, followed by read-write storage textures
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a compute pipeline object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindGPUComputePipeline', 'releaseGPUComputePipeline'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPUComputePipeline@.
+--                   The safe flavor is 'createGPUComputePipelineSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 2632:54@
+createGPUComputePipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUComputePipelineCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the compute pipeline to create.
+  -> IO (BG.Ptr SDL_GPUComputePipeline)
+createGPUComputePipeline =
+  Unsafe.sDL_CreateGPUComputePipeline
+
+-- | Creates a pipeline object to be used in a compute workflow.
+--
+--     Shader resource bindings must be authored to follow a particular order depending on the shader format.
+--
+--     For SPIR-V shaders, use the following resource sets:
+--
+--     * 0: Sampled textures, followed by read-only storage textures, followed by read-only storage buffers
+--
+--     * 1: Read-write storage textures, followed by read-write storage buffers
+--
+--     * 2: Uniform buffers
+--
+--     For DXBC and DXIL shaders, use the following register order:
+--
+--     * (t[n], space0): Sampled textures, followed by read-only storage textures, followed by read-only storage buffers
+--
+--     * (u[n], space1): Read-write storage textures, followed by read-write storage buffers
+--
+--     * (b[n], space2): Uniform buffers
+--
+--     For MSL\/metallib, use the following order:
+--
+--     * [[buffer]]: Uniform buffers, followed by read-only storage buffers, followed by read-write storage buffers
+--
+--     * [[texture]]: Sampled textures, followed by read-only storage textures, followed by read-write storage textures
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_COMPUTEPIPELINE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a compute pipeline object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindGPUComputePipeline', 'releaseGPUComputePipeline'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPUComputePipeline@.
+--                   The unsafe flavor is 'createGPUComputePipeline'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 2632:54@
+createGPUComputePipelineSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUComputePipelineCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the compute pipeline to create.
+  -> IO (BG.Ptr SDL_GPUComputePipeline)
+createGPUComputePipelineSafe =
+  Safe.sDL_CreateGPUComputePipeline
+
+-- | Creates a pipeline object to be used in a graphics workflow.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a graphics pipeline object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader', 'bindGPUGraphicsPipeline', 'releaseGPUGraphicsPipeline'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPUGraphicsPipeline@.
+--                   The safe flavor is 'createGPUGraphicsPipelineSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 2659:55@
+createGPUGraphicsPipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUGraphicsPipelineCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the graphics pipeline to create.
+  -> IO (BG.Ptr SDL_GPUGraphicsPipeline)
+createGPUGraphicsPipeline =
+  Unsafe.sDL_CreateGPUGraphicsPipeline
+
+-- | Creates a pipeline object to be used in a graphics workflow.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_GRAPHICSPIPELINE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a graphics pipeline object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader', 'bindGPUGraphicsPipeline', 'releaseGPUGraphicsPipeline'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPUGraphicsPipeline@.
+--                   The unsafe flavor is 'createGPUGraphicsPipeline'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 2659:55@
+createGPUGraphicsPipelineSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUGraphicsPipelineCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the graphics pipeline to create.
+  -> IO (BG.Ptr SDL_GPUGraphicsPipeline)
+createGPUGraphicsPipelineSafe =
+  Safe.sDL_CreateGPUGraphicsPipeline
+
+-- | Creates a sampler object to be used when binding textures in a graphics workflow.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a sampler object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindGPUVertexSamplers', 'bindGPUFragmentSamplers', 'releaseGPUSampler'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPUSampler@.
+--                   The safe flavor is 'createGPUSamplerSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUSampler@, defined at @SDL3\/SDL_gpu.h 2686:46@
+createGPUSampler
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUSamplerCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the sampler to create.
+  -> IO (BG.Ptr SDL_GPUSampler)
+createGPUSampler = Unsafe.sDL_CreateGPUSampler
+
+-- | Creates a sampler object to be used when binding textures in a graphics workflow.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_SAMPLER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a sampler object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bindGPUVertexSamplers', 'bindGPUFragmentSamplers', 'releaseGPUSampler'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPUSampler@.
+--                   The unsafe flavor is 'createGPUSampler'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUSampler@, defined at @SDL3\/SDL_gpu.h 2686:46@
+createGPUSamplerSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUSamplerCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the sampler to create.
+  -> IO (BG.Ptr SDL_GPUSampler)
+createGPUSamplerSafe = Safe.sDL_CreateGPUSampler
+
+-- | Creates a shader to be used when creating a graphics pipeline.
+--
+--     Shader resource bindings must be authored to follow a particular order depending on the shader format.
+--
+--     For SPIR-V shaders, use the following resource sets:
+--
+--     For vertex shaders:
+--
+--     * 0: Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * 1: Uniform buffers
+--
+--     For fragment shaders:
+--
+--     * 2: Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * 3: Uniform buffers
+--
+--     For DXBC and DXIL shaders, use the following register order:
+--
+--     For vertex shaders:
+--
+--     * (t[n], space0): Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * (s[n], space0): Samplers with indices corresponding to the sampled textures
+--
+--     * (b[n], space1): Uniform buffers
+--
+--     For pixel shaders:
+--
+--     * (t[n], space2): Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * (s[n], space2): Samplers with indices corresponding to the sampled textures
+--
+--     * (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
+--
+--     * [[buffer]]: Uniform buffers, followed by storage buffers. Vertex buffer 0 is bound at [[buffer(14)]], vertex buffer 1 at [[buffer(15)]], and so on. Rather than manually authoring vertex buffer indices, use the [[stage_in]] attribute which will automatically use the vertex input information from the 'SDL_GPUGraphicsPipeline'.
+--
+--     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 SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING with @'createGPUDeviceWithProperties'@.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_SHADER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a shader object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUGraphicsPipeline', 'releaseGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPUShader@.
+--                   The safe flavor is 'createGPUShaderSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUShader@, defined at @SDL3\/SDL_gpu.h 2765:45@
+createGPUShader
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUShaderCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the shader to create.
+  -> IO (BG.Ptr SDL_GPUShader)
+createGPUShader = Unsafe.sDL_CreateGPUShader
+
+-- | Creates a shader to be used when creating a graphics pipeline.
+--
+--     Shader resource bindings must be authored to follow a particular order depending on the shader format.
+--
+--     For SPIR-V shaders, use the following resource sets:
+--
+--     For vertex shaders:
+--
+--     * 0: Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * 1: Uniform buffers
+--
+--     For fragment shaders:
+--
+--     * 2: Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * 3: Uniform buffers
+--
+--     For DXBC and DXIL shaders, use the following register order:
+--
+--     For vertex shaders:
+--
+--     * (t[n], space0): Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * (s[n], space0): Samplers with indices corresponding to the sampled textures
+--
+--     * (b[n], space1): Uniform buffers
+--
+--     For pixel shaders:
+--
+--     * (t[n], space2): Sampled textures, followed by storage textures, followed by storage buffers
+--
+--     * (s[n], space2): Samplers with indices corresponding to the sampled textures
+--
+--     * (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
+--
+--     * [[buffer]]: Uniform buffers, followed by storage buffers. Vertex buffer 0 is bound at [[buffer(14)]], vertex buffer 1 at [[buffer(15)]], and so on. Rather than manually authoring vertex buffer indices, use the [[stage_in]] attribute which will automatically use the vertex input information from the 'SDL_GPUGraphicsPipeline'.
+--
+--     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 SDL_PROP_GPU_DEVICE_CREATE_D3D12_SEMANTIC_NAME_STRING with @'createGPUDeviceWithProperties'@.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_SHADER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a shader object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUGraphicsPipeline', 'releaseGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPUShader@.
+--                   The unsafe flavor is 'createGPUShader'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUShader@, defined at @SDL3\/SDL_gpu.h 2765:45@
+createGPUShaderSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUShaderCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the shader to create.
+  -> IO (BG.Ptr SDL_GPUShader)
+createGPUShaderSafe = Safe.sDL_CreateGPUShader
+
+-- | Creates a texture object to be used in graphics or compute workflows.
+--
+--     The contents of this texture are undefined until data is written to the texture, either via 'uploadToGPUTexture' or by performing a render or compute pass with this texture as a target.
+--
+--     Note that certain combinations of usage flags are invalid. For example, a texture cannot have both the SAMPLER and GRAPHICS_STORAGE_READ flags.
+--
+--     If you request a sample count higher than the hardware supports, the implementation will automatically fall back to the highest available sample count.
+--
+--     There are optional properties that can be provided through 'SDL_GPUTextureCreateInfo' \'s @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this red intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this green intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this blue intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this alpha intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear the texture to a depth of this value. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear the texture to a stencil of this Uint8 value. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a texture object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'uploadToGPUTexture', 'downloadFromGPUTexture', 'beginGPURenderPass', 'beginGPUComputePass', 'bindGPUVertexSamplers', 'bindGPUVertexStorageTextures', 'bindGPUFragmentSamplers', 'bindGPUFragmentStorageTextures', 'bindGPUComputeStorageTextures', 'blitGPUTexture', 'releaseGPUTexture', 'gpuTextureSupportsFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPUTexture@.
+--                   The safe flavor is 'createGPUTextureSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUTexture@, defined at @SDL3\/SDL_gpu.h 2829:46@
+createGPUTexture
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUTextureCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the texture to create.
+  -> IO (BG.Ptr SDL_GPUTexture)
+createGPUTexture = Unsafe.sDL_CreateGPUTexture
+
+-- | Creates a texture object to be used in graphics or compute workflows.
+--
+--     The contents of this texture are undefined until data is written to the texture, either via 'uploadToGPUTexture' or by performing a render or compute pass with this texture as a target.
+--
+--     Note that certain combinations of usage flags are invalid. For example, a texture cannot have both the SAMPLER and GRAPHICS_STORAGE_READ flags.
+--
+--     If you request a sample count higher than the hardware supports, the implementation will automatically fall back to the highest available sample count.
+--
+--     There are optional properties that can be provided through 'SDL_GPUTextureCreateInfo' \'s @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_R_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this red intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_G_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this green intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_B_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this blue intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_A_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_COLOR_TARGET, clear the texture to a color with this alpha intensity. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_DEPTH_FLOAT'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear the texture to a depth of this value. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_D3D12_CLEAR_STENCIL_NUMBER'@: (Direct3D 12 only) if the texture usage is SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET, clear the texture to a stencil of this Uint8 value. Defaults to zero.
+--
+--     * @'sDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a texture object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'uploadToGPUTexture', 'downloadFromGPUTexture', 'beginGPURenderPass', 'beginGPUComputePass', 'bindGPUVertexSamplers', 'bindGPUVertexStorageTextures', 'bindGPUFragmentSamplers', 'bindGPUFragmentStorageTextures', 'bindGPUComputeStorageTextures', 'blitGPUTexture', 'releaseGPUTexture', 'gpuTextureSupportsFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPUTexture@.
+--                   The unsafe flavor is 'createGPUTexture'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUTexture@, defined at @SDL3\/SDL_gpu.h 2829:46@
+createGPUTextureSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUTextureCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the texture to create.
+  -> IO (BG.Ptr SDL_GPUTexture)
+createGPUTextureSafe = Safe.sDL_CreateGPUTexture
+
+-- | Creates a buffer object to be used in graphics or compute workflows.
+--
+--     The contents of this buffer are undefined until data is written to the buffer.
+--
+--     Note that certain combinations of usage flags are invalid. For example, a buffer cannot have both the VERTEX and INDEX flags.
+--
+--     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.
+--
+--     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/) There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_BUFFER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a buffer object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'uploadToGPUBuffer', 'downloadFromGPUBuffer', 'copyGPUBufferToBuffer', 'bindGPUVertexBuffers', 'bindGPUIndexBuffer', 'bindGPUVertexStorageBuffers', 'bindGPUFragmentStorageBuffers', 'drawGPUPrimitivesIndirect', 'drawGPUIndexedPrimitivesIndirect', 'bindGPUComputeStorageBuffers', 'dispatchGPUComputeIndirect', 'releaseGPUBuffer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPUBuffer@.
+--                   The safe flavor is 'createGPUBufferSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUBuffer@, defined at @SDL3\/SDL_gpu.h 2885:45@
+createGPUBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUBufferCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the buffer to create.
+  -> IO (BG.Ptr SDL_GPUBuffer)
+createGPUBuffer = Unsafe.sDL_CreateGPUBuffer
+
+-- | Creates a buffer object to be used in graphics or compute workflows.
+--
+--     The contents of this buffer are undefined until data is written to the buffer.
+--
+--     Note that certain combinations of usage flags are invalid. For example, a buffer cannot have both the VERTEX and INDEX flags.
+--
+--     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.
+--
+--     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/) There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_BUFFER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a buffer object on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'uploadToGPUBuffer', 'downloadFromGPUBuffer', 'copyGPUBufferToBuffer', 'bindGPUVertexBuffers', 'bindGPUIndexBuffer', 'bindGPUVertexStorageBuffers', 'bindGPUFragmentStorageBuffers', 'drawGPUPrimitivesIndirect', 'drawGPUIndexedPrimitivesIndirect', 'bindGPUComputeStorageBuffers', 'dispatchGPUComputeIndirect', 'releaseGPUBuffer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPUBuffer@.
+--                   The unsafe flavor is 'createGPUBuffer'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUBuffer@, defined at @SDL3\/SDL_gpu.h 2885:45@
+createGPUBufferSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUBufferCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the buffer to create.
+  -> IO (BG.Ptr SDL_GPUBuffer)
+createGPUBufferSafe = Safe.sDL_CreateGPUBuffer
+
+-- | Creates a transfer buffer to be used when uploading to or downloading from graphics resources.
+--
+--     Download buffers can be particularly expensive to create, so it is good practice to reuse them if data will be downloaded regularly.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a transfer buffer on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'uploadToGPUBuffer', 'downloadFromGPUBuffer', 'uploadToGPUTexture', 'downloadFromGPUTexture', 'releaseGPUTransferBuffer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPUTransferBuffer@.
+--                   The safe flavor is 'createGPUTransferBufferSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 2918:53@
+createGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the transfer buffer to create.
+  -> IO (BG.Ptr SDL_GPUTransferBuffer)
+createGPUTransferBuffer =
+  Unsafe.sDL_CreateGPUTransferBuffer
+
+-- | Creates a transfer buffer to be used when uploading to or downloading from graphics resources.
+--
+--     Download buffers can be particularly expensive to create, so it is good practice to reuse them if data will be downloaded regularly.
+--
+--     There are optional properties that can be provided through @props@. These are the supported properties:
+--
+--     * @'sDL_PROP_GPU_TRANSFERBUFFER_CREATE_NAME_STRING'@: a name that can be displayed in debugging tools.
+--
+--     [Returns]: a transfer buffer on success, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'uploadToGPUBuffer', 'downloadFromGPUBuffer', 'uploadToGPUTexture', 'downloadFromGPUTexture', 'releaseGPUTransferBuffer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPUTransferBuffer@.
+--                   The unsafe flavor is 'createGPUTransferBuffer'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 2918:53@
+createGPUTransferBufferSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the state of the transfer buffer to create.
+  -> IO (BG.Ptr SDL_GPUTransferBuffer)
+createGPUTransferBufferSafe =
+  Safe.sDL_CreateGPUTransferBuffer
+
+-- | Sets an arbitrary string constant to label a buffer.
+--
+--     You should use SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING with 'createGPUBuffer' instead of this function to avoid thread safety issues.
+--
+--     [Thread safety]: This function is not thread safe, you must make sure the buffer is not simultaneously used by any other thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUBuffer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGPUBufferName@.
+--                   The safe flavor is 'setGPUBufferNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetGPUBufferName@, defined at @SDL3\/SDL_gpu.h 2943:34@
+setGPUBufferName
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer to attach the name to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to mark as the name of the buffer.
+  -> IO ()
+setGPUBufferName = Unsafe.sDL_SetGPUBufferName
+
+-- | Sets an arbitrary string constant to label a buffer.
+--
+--     You should use SDL_PROP_GPU_BUFFER_CREATE_NAME_STRING with 'createGPUBuffer' instead of this function to avoid thread safety issues.
+--
+--     [Thread safety]: This function is not thread safe, you must make sure the buffer is not simultaneously used by any other thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUBuffer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGPUBufferName@.
+--                   The unsafe flavor is 'setGPUBufferName'
+--                   .
+--
+--     [C declaration]: @SDL_SetGPUBufferName@, defined at @SDL3\/SDL_gpu.h 2943:34@
+setGPUBufferNameSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer to attach the name to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to mark as the name of the buffer.
+  -> IO ()
+setGPUBufferNameSafe = Safe.sDL_SetGPUBufferName
+
+-- | Sets an arbitrary string constant to label a texture.
+--
+--     You should use SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING with 'createGPUTexture' instead of this function to avoid thread safety issues.
+--
+--     [Thread safety]: This function is not thread safe, you must make sure the texture is not simultaneously used by any other thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGPUTextureName@.
+--                   The safe flavor is 'setGPUTextureNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetGPUTextureName@, defined at @SDL3\/SDL_gpu.h 2966:34@
+setGPUTextureName
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture to attach the name to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to mark as the name of the texture.
+  -> IO ()
+setGPUTextureName = Unsafe.sDL_SetGPUTextureName
+
+-- | Sets an arbitrary string constant to label a texture.
+--
+--     You should use SDL_PROP_GPU_TEXTURE_CREATE_NAME_STRING with 'createGPUTexture' instead of this function to avoid thread safety issues.
+--
+--     [Thread safety]: This function is not thread safe, you must make sure the texture is not simultaneously used by any other thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGPUTextureName@.
+--                   The unsafe flavor is 'setGPUTextureName'
+--                   .
+--
+--     [C declaration]: @SDL_SetGPUTextureName@, defined at @SDL3\/SDL_gpu.h 2966:34@
+setGPUTextureNameSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU Context.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture to attach the name to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to mark as the name of the texture.
+  -> IO ()
+setGPUTextureNameSafe = Safe.sDL_SetGPUTextureName
+
+-- | Inserts an arbitrary string label into the command buffer callstream.
+--
+--     Useful for debugging.
+--
+--     On Direct3D 12, using '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/) for instructions on how to obtain it.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_InsertGPUDebugLabel@.
+--                   The safe flavor is 'insertGPUDebugLabelSafe'
+--                   .
+--
+--     [C declaration]: @SDL_InsertGPUDebugLabel@, defined at @SDL3\/SDL_gpu.h 2987:34@
+insertGPUDebugLabel
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to insert as the label.
+  -> IO ()
+insertGPUDebugLabel = Unsafe.sDL_InsertGPUDebugLabel
+
+-- | Inserts an arbitrary string label into the command buffer callstream.
+--
+--     Useful for debugging.
+--
+--     On Direct3D 12, using '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/) for instructions on how to obtain it.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_InsertGPUDebugLabel@.
+--                   The unsafe flavor is 'insertGPUDebugLabel'
+--                   .
+--
+--     [C declaration]: @SDL_InsertGPUDebugLabel@, defined at @SDL3\/SDL_gpu.h 2987:34@
+insertGPUDebugLabelSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@text@]: a UTF-8 string constant to insert as the label.
+  -> IO ()
+insertGPUDebugLabelSafe =
+  Safe.sDL_InsertGPUDebugLabel
+
+-- | Begins a debug group with an arbitrary name.
+--
+--     Used for denoting groups of calls when viewing the command buffer callstream in a graphics debugging tool.
+--
+--     Each call to 'pushGPUDebugGroup' must have a corresponding call to 'popGPUDebugGroup'.
+--
+--     On Direct3D 12, using 'pushGPUDebugGroup' requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable. See [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) for instructions on how to obtain it.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'popGPUDebugGroup'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PushGPUDebugGroup@.
+--                   The safe flavor is 'pushGPUDebugGroupSafe'
+--                   .
+--
+--     [C declaration]: @SDL_PushGPUDebugGroup@, defined at @SDL3\/SDL_gpu.h 3017:34@
+pushGPUDebugGroup
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: a UTF-8 string constant that names the group.
+  -> IO ()
+pushGPUDebugGroup = Unsafe.sDL_PushGPUDebugGroup
+
+-- | Begins a debug group with an arbitrary name.
+--
+--     Used for denoting groups of calls when viewing the command buffer callstream in a graphics debugging tool.
+--
+--     Each call to 'pushGPUDebugGroup' must have a corresponding call to 'popGPUDebugGroup'.
+--
+--     On Direct3D 12, using 'pushGPUDebugGroup' requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable. See [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) for instructions on how to obtain it.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'popGPUDebugGroup'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PushGPUDebugGroup@.
+--                   The unsafe flavor is 'pushGPUDebugGroup'
+--                   .
+--
+--     [C declaration]: @SDL_PushGPUDebugGroup@, defined at @SDL3\/SDL_gpu.h 3017:34@
+pushGPUDebugGroupSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: a UTF-8 string constant that names the group.
+  -> IO ()
+pushGPUDebugGroupSafe = Safe.sDL_PushGPUDebugGroup
+
+-- | Ends the most-recently pushed debug group.
+--
+--     On Direct3D 12, using 'popGPUDebugGroup' requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable. See [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) for instructions on how to obtain it.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pushGPUDebugGroup'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PopGPUDebugGroup@.
+--                   The safe flavor is 'popGPUDebugGroupSafe'
+--                   .
+--
+--     [C declaration]: @SDL_PopGPUDebugGroup@, defined at @SDL3\/SDL_gpu.h 3035:34@
+popGPUDebugGroup
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO ()
+popGPUDebugGroup = Unsafe.sDL_PopGPUDebugGroup
+
+-- | Ends the most-recently pushed debug group.
+--
+--     On Direct3D 12, using 'popGPUDebugGroup' requires WinPixEventRuntime.dll to be in your PATH or in the same directory as your executable. See [here](https://devblogs.microsoft.com/pix/winpixeventruntime/) for instructions on how to obtain it.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pushGPUDebugGroup'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PopGPUDebugGroup@.
+--                   The unsafe flavor is 'popGPUDebugGroup'
+--                   .
+--
+--     [C declaration]: @SDL_PopGPUDebugGroup@, defined at @SDL3\/SDL_gpu.h 3035:34@
+popGPUDebugGroupSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO ()
+popGPUDebugGroupSafe = Safe.sDL_PopGPUDebugGroup
+
+-- | Frees the given texture as soon as it is safe to do so.
+--
+--     You must not reference the texture after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReleaseGPUTexture@.
+--                   The safe flavor is 'releaseGPUTextureSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUTexture@, defined at @SDL3\/SDL_gpu.h 3050:34@
+releaseGPUTexture
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture to be destroyed.
+  -> IO ()
+releaseGPUTexture = Unsafe.sDL_ReleaseGPUTexture
+
+-- | Frees the given texture as soon as it is safe to do so.
+--
+--     You must not reference the texture after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReleaseGPUTexture@.
+--                   The unsafe flavor is 'releaseGPUTexture'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUTexture@, defined at @SDL3\/SDL_gpu.h 3050:34@
+releaseGPUTextureSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture to be destroyed.
+  -> IO ()
+releaseGPUTextureSafe = Safe.sDL_ReleaseGPUTexture
+
+-- | Frees the given sampler as soon as it is safe to do so.
+--
+--     You must not reference the sampler after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReleaseGPUSampler@.
+--                   The safe flavor is 'releaseGPUSamplerSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUSampler@, defined at @SDL3\/SDL_gpu.h 3064:34@
+releaseGPUSampler
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUSampler
+  -- ^
+  --
+  --           [@sampler@]: a sampler to be destroyed.
+  -> IO ()
+releaseGPUSampler = Unsafe.sDL_ReleaseGPUSampler
+
+-- | Frees the given sampler as soon as it is safe to do so.
+--
+--     You must not reference the sampler after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReleaseGPUSampler@.
+--                   The unsafe flavor is 'releaseGPUSampler'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUSampler@, defined at @SDL3\/SDL_gpu.h 3064:34@
+releaseGPUSamplerSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUSampler
+  -- ^
+  --
+  --           [@sampler@]: a sampler to be destroyed.
+  -> IO ()
+releaseGPUSamplerSafe = Safe.sDL_ReleaseGPUSampler
+
+-- | Frees the given buffer as soon as it is safe to do so.
+--
+--     You must not reference the buffer after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReleaseGPUBuffer@.
+--                   The safe flavor is 'releaseGPUBufferSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUBuffer@, defined at @SDL3\/SDL_gpu.h 3078:34@
+releaseGPUBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer to be destroyed.
+  -> IO ()
+releaseGPUBuffer = Unsafe.sDL_ReleaseGPUBuffer
+
+-- | Frees the given buffer as soon as it is safe to do so.
+--
+--     You must not reference the buffer after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReleaseGPUBuffer@.
+--                   The unsafe flavor is 'releaseGPUBuffer'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUBuffer@, defined at @SDL3\/SDL_gpu.h 3078:34@
+releaseGPUBufferSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer to be destroyed.
+  -> IO ()
+releaseGPUBufferSafe = Safe.sDL_ReleaseGPUBuffer
+
+-- | Frees the given transfer buffer as soon as it is safe to do so.
+--
+--     You must not reference the transfer buffer after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReleaseGPUTransferBuffer@.
+--                   The safe flavor is 'releaseGPUTransferBufferSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3092:34@
+releaseGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a transfer buffer to be destroyed.
+  -> IO ()
+releaseGPUTransferBuffer =
+  Unsafe.sDL_ReleaseGPUTransferBuffer
+
+-- | Frees the given transfer buffer as soon as it is safe to do so.
+--
+--     You must not reference the transfer buffer after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReleaseGPUTransferBuffer@.
+--                   The unsafe flavor is 'releaseGPUTransferBuffer'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3092:34@
+releaseGPUTransferBufferSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a transfer buffer to be destroyed.
+  -> IO ()
+releaseGPUTransferBufferSafe =
+  Safe.sDL_ReleaseGPUTransferBuffer
+
+-- | Frees the given compute pipeline as soon as it is safe to do so.
+--
+--     You must not reference the compute pipeline after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReleaseGPUComputePipeline@.
+--                   The safe flavor is 'releaseGPUComputePipelineSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 3106:34@
+releaseGPUComputePipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUComputePipeline
+  -- ^
+  --
+  --           [@compute_pipeline@]: a compute pipeline to be destroyed.
+  -> IO ()
+releaseGPUComputePipeline =
+  Unsafe.sDL_ReleaseGPUComputePipeline
+
+-- | Frees the given compute pipeline as soon as it is safe to do so.
+--
+--     You must not reference the compute pipeline after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReleaseGPUComputePipeline@.
+--                   The unsafe flavor is 'releaseGPUComputePipeline'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 3106:34@
+releaseGPUComputePipelineSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUComputePipeline
+  -- ^
+  --
+  --           [@compute_pipeline@]: a compute pipeline to be destroyed.
+  -> IO ()
+releaseGPUComputePipelineSafe =
+  Safe.sDL_ReleaseGPUComputePipeline
+
+-- | Frees the given shader as soon as it is safe to do so.
+--
+--     You must not reference the shader after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReleaseGPUShader@.
+--                   The safe flavor is 'releaseGPUShaderSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUShader@, defined at @SDL3\/SDL_gpu.h 3120:34@
+releaseGPUShader
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUShader
+  -- ^
+  --
+  --           [@shader@]: a shader to be destroyed.
+  -> IO ()
+releaseGPUShader = Unsafe.sDL_ReleaseGPUShader
+
+-- | Frees the given shader as soon as it is safe to do so.
+--
+--     You must not reference the shader after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReleaseGPUShader@.
+--                   The unsafe flavor is 'releaseGPUShader'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUShader@, defined at @SDL3\/SDL_gpu.h 3120:34@
+releaseGPUShaderSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUShader
+  -- ^
+  --
+  --           [@shader@]: a shader to be destroyed.
+  -> IO ()
+releaseGPUShaderSafe = Safe.sDL_ReleaseGPUShader
+
+-- | Frees the given graphics pipeline as soon as it is safe to do so.
+--
+--     You must not reference the graphics pipeline after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReleaseGPUGraphicsPipeline@.
+--                   The safe flavor is 'releaseGPUGraphicsPipelineSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 3134:34@
+releaseGPUGraphicsPipeline
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -- ^
+  --
+  --           [@graphics_pipeline@]: a graphics pipeline to be destroyed.
+  -> IO ()
+releaseGPUGraphicsPipeline =
+  Unsafe.sDL_ReleaseGPUGraphicsPipeline
+
+-- | Frees the given graphics pipeline as soon as it is safe to do so.
+--
+--     You must not reference the graphics pipeline after calling this function.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReleaseGPUGraphicsPipeline@.
+--                   The unsafe flavor is 'releaseGPUGraphicsPipeline'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 3134:34@
+releaseGPUGraphicsPipelineSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -- ^
+  --
+  --           [@graphics_pipeline@]: a graphics pipeline to be destroyed.
+  -> IO ()
+releaseGPUGraphicsPipelineSafe =
+  Safe.sDL_ReleaseGPUGraphicsPipeline
+
+-- | Acquire a command buffer.
+--
+--     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.
+--
+--     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.
+--
+--     [Returns]: a command buffer, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'submitGPUCommandBuffer', 'submitGPUCommandBufferAndAcquireFence'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AcquireGPUCommandBuffer@.
+--                   The safe flavor is 'acquireGPUCommandBufferSafe'
+--                   .
+--
+--     [C declaration]: @SDL_AcquireGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 3162:52@
+acquireGPUCommandBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> IO (BG.Ptr SDL_GPUCommandBuffer)
+acquireGPUCommandBuffer =
+  Unsafe.sDL_AcquireGPUCommandBuffer
+
+-- | Acquire a command buffer.
+--
+--     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.
+--
+--     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.
+--
+--     [Returns]: a command buffer, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'submitGPUCommandBuffer', 'submitGPUCommandBufferAndAcquireFence'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AcquireGPUCommandBuffer@.
+--                   The unsafe flavor is 'acquireGPUCommandBuffer'
+--                   .
+--
+--     [C declaration]: @SDL_AcquireGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 3162:52@
+acquireGPUCommandBufferSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> IO (BG.Ptr SDL_GPUCommandBuffer)
+acquireGPUCommandBufferSafe =
+  Safe.sDL_AcquireGPUCommandBuffer
+
+-- | Pushes data to a vertex uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     For detailed information about accessing uniform data from a shader, please refer to 'createGPUShader'.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PushGPUVertexUniformData@.
+--                   The safe flavor is 'pushGPUVertexUniformDataSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PushGPUVertexUniformData@, defined at @SDL3\/SDL_gpu.h 3186:34@
+pushGPUVertexUniformData
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@slot_index@]: the vertex uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+pushGPUVertexUniformData =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_PushGPUVertexUniformData x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Pushes data to a vertex uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     For detailed information about accessing uniform data from a shader, please refer to 'createGPUShader'.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PushGPUVertexUniformData@.
+--                   The unsafe flavor is 'pushGPUVertexUniformData'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PushGPUVertexUniformData@, defined at @SDL3\/SDL_gpu.h 3186:34@
+pushGPUVertexUniformDataSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@slot_index@]: the vertex uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+pushGPUVertexUniformDataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_PushGPUVertexUniformData x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Pushes data to a fragment uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PushGPUFragmentUniformData@.
+--                   The safe flavor is 'pushGPUFragmentUniformDataSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PushGPUFragmentUniformData@, defined at @SDL3\/SDL_gpu.h 3208:34@
+pushGPUFragmentUniformData
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@slot_index@]: the fragment uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+pushGPUFragmentUniformData =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_PushGPUFragmentUniformData x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Pushes data to a fragment uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PushGPUFragmentUniformData@.
+--                   The unsafe flavor is 'pushGPUFragmentUniformData'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PushGPUFragmentUniformData@, defined at @SDL3\/SDL_gpu.h 3208:34@
+pushGPUFragmentUniformDataSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@slot_index@]: the fragment uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+pushGPUFragmentUniformDataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_PushGPUFragmentUniformData x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Pushes data to a uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PushGPUComputeUniformData@.
+--                   The safe flavor is 'pushGPUComputeUniformDataSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PushGPUComputeUniformData@, defined at @SDL3\/SDL_gpu.h 3230:34@
+pushGPUComputeUniformData
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@slot_index@]: the uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+pushGPUComputeUniformData =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_PushGPUComputeUniformData x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Pushes data to a uniform slot on the command buffer.
+--
+--     Subsequent draw calls in this command buffer will use this uniform data.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PushGPUComputeUniformData@.
+--                   The unsafe flavor is 'pushGPUComputeUniformData'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PushGPUComputeUniformData@, defined at @SDL3\/SDL_gpu.h 3230:34@
+pushGPUComputeUniformDataSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@slot_index@]: the uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO ()
+pushGPUComputeUniformDataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_PushGPUComputeUniformData x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Begins a render pass on a command buffer.
+--
+--     A render pass consists of a set of texture subresources (or depth slices in the 3D 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.
+--
+--     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.
+--
+--     [Returns]: a render pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'endGPURenderPass'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BeginGPURenderPass@.
+--                   The safe flavor is 'beginGPURenderPassSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BeginGPURenderPass@, defined at @SDL3\/SDL_gpu.h 3271:49@
+beginGPURenderPass
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUColorTargetInfo
+  -- ^
+  --
+  --           [@color_target_infos@]: an array of texture subresources with corresponding clear values and load\/store ops.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_color_targets@]: the number of color targets in the color_target_infos array.
+  -> PtrConst.PtrConst SDL_GPUDepthStencilTargetInfo
+  -- ^
+  --
+  --           [@depth_stencil_target_info@]: a texture subresource with corresponding clear value and load\/store ops, may be NULL.
+  -> IO (BG.Ptr SDL_GPURenderPass)
+beginGPURenderPass =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BeginGPURenderPass x00 x11 (Coerce.coerce x22) x33
+
+-- | Begins a render pass on a command buffer.
+--
+--     A render pass consists of a set of texture subresources (or depth slices in the 3D 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.
+--
+--     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.
+--
+--     [Returns]: a render pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'endGPURenderPass'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BeginGPURenderPass@.
+--                   The unsafe flavor is 'beginGPURenderPass'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BeginGPURenderPass@, defined at @SDL3\/SDL_gpu.h 3271:49@
+beginGPURenderPassSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUColorTargetInfo
+  -- ^
+  --
+  --           [@color_target_infos@]: an array of texture subresources with corresponding clear values and load\/store ops.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_color_targets@]: the number of color targets in the color_target_infos array.
+  -> PtrConst.PtrConst SDL_GPUDepthStencilTargetInfo
+  -- ^
+  --
+  --           [@depth_stencil_target_info@]: a texture subresource with corresponding clear value and load\/store ops, may be NULL.
+  -> IO (BG.Ptr SDL_GPURenderPass)
+beginGPURenderPassSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BeginGPURenderPass x00 x11 (Coerce.coerce x22) x33
+
+-- | Binds a graphics pipeline on a render pass to be used in rendering.
+--
+--     A graphics pipeline must be bound before making any draw calls.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUGraphicsPipeline@.
+--                   The safe flavor is 'bindGPUGraphicsPipelineSafe'
+--                   .
+--
+--     [C declaration]: @SDL_BindGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 3287:34@
+bindGPUGraphicsPipeline
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -- ^
+  --
+  --           [@graphics_pipeline@]: the graphics pipeline to bind.
+  -> IO ()
+bindGPUGraphicsPipeline =
+  Unsafe.sDL_BindGPUGraphicsPipeline
+
+-- | Binds a graphics pipeline on a render pass to be used in rendering.
+--
+--     A graphics pipeline must be bound before making any draw calls.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUGraphicsPipeline@.
+--                   The unsafe flavor is 'bindGPUGraphicsPipeline'
+--                   .
+--
+--     [C declaration]: @SDL_BindGPUGraphicsPipeline@, defined at @SDL3\/SDL_gpu.h 3287:34@
+bindGPUGraphicsPipelineSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUGraphicsPipeline
+  -- ^
+  --
+  --           [@graphics_pipeline@]: the graphics pipeline to bind.
+  -> IO ()
+bindGPUGraphicsPipelineSafe =
+  Safe.sDL_BindGPUGraphicsPipeline
+
+-- | Sets the current viewport state on a command buffer.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGPUViewport@.
+--                   The safe flavor is 'setGPUViewportSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetGPUViewport@, defined at @SDL3\/SDL_gpu.h 3299:34@
+setGPUViewport
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL_GPUViewport
+  -- ^
+  --
+  --           [@viewport@]: the viewport to set.
+  -> IO ()
+setGPUViewport = Unsafe.sDL_SetGPUViewport
+
+-- | Sets the current viewport state on a command buffer.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGPUViewport@.
+--                   The unsafe flavor is 'setGPUViewport'
+--                   .
+--
+--     [C declaration]: @SDL_SetGPUViewport@, defined at @SDL3\/SDL_gpu.h 3299:34@
+setGPUViewportSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL_GPUViewport
+  -- ^
+  --
+  --           [@viewport@]: the viewport to set.
+  -> IO ()
+setGPUViewportSafe = Safe.sDL_SetGPUViewport
+
+-- | Sets the current scissor state on a command buffer.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGPUScissor@.
+--                   The safe flavor is 'setGPUScissorSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetGPUScissor@, defined at @SDL3\/SDL_gpu.h 3311:34@
+setGPUScissor
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@scissor@]: the scissor area to set.
+  -> IO ()
+setGPUScissor = Unsafe.sDL_SetGPUScissor
+
+-- | Sets the current scissor state on a command buffer.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGPUScissor@.
+--                   The unsafe flavor is 'setGPUScissor'
+--                   .
+--
+--     [C declaration]: @SDL_SetGPUScissor@, defined at @SDL3\/SDL_gpu.h 3311:34@
+setGPUScissorSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@scissor@]: the scissor area to set.
+  -> IO ()
+setGPUScissorSafe = Safe.sDL_SetGPUScissor
+
+-- | Sets the current blend constants on a command buffer.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_GPU_BLENDFACTOR_CONSTANT_COLOR@, @SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGPUBlendConstants@.
+--                   The safe flavor is 'setGPUBlendConstantsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetGPUBlendConstants@, defined at @SDL3\/SDL_gpu.h 3326:34@
+setGPUBlendConstants
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^
+  --
+  --           [@blend_constants@]: the blend constant color.
+  -> IO ()
+setGPUBlendConstants =
+  Unsafe.sDL_SetGPUBlendConstants
+
+-- | Sets the current blend constants on a command buffer.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_GPU_BLENDFACTOR_CONSTANT_COLOR@, @SDL_GPU_BLENDFACTOR_ONE_MINUS_CONSTANT_COLOR@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGPUBlendConstants@.
+--                   The unsafe flavor is 'setGPUBlendConstants'
+--                   .
+--
+--     [C declaration]: @SDL_SetGPUBlendConstants@, defined at @SDL3\/SDL_gpu.h 3326:34@
+setGPUBlendConstantsSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^
+  --
+  --           [@blend_constants@]: the blend constant color.
+  -> IO ()
+setGPUBlendConstantsSafe =
+  Safe.sDL_SetGPUBlendConstants
+
+-- | Sets the current stencil reference value on a command buffer.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGPUStencilReference@.
+--                   The safe flavor is 'setGPUStencilReferenceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGPUStencilReference@, defined at @SDL3\/SDL_gpu.h 3338:34@
+setGPUStencilReference
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@reference@]: the stencil reference value to set.
+  -> IO ()
+setGPUStencilReference =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_SetGPUStencilReference x00 (Coerce.coerce x11)
+
+-- | Sets the current stencil reference value on a command buffer.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGPUStencilReference@.
+--                   The unsafe flavor is 'setGPUStencilReference'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGPUStencilReference@, defined at @SDL3\/SDL_gpu.h 3338:34@
+setGPUStencilReferenceSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@reference@]: the stencil reference value to set.
+  -> IO ()
+setGPUStencilReferenceSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_SetGPUStencilReference x00 (Coerce.coerce x11)
+
+-- | Binds vertex buffers on a command buffer for use with subsequent draw calls.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUVertexBuffers@.
+--                   The safe flavor is 'bindGPUVertexBuffersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUVertexBuffers@, defined at @SDL3\/SDL_gpu.h 3354:34@
+bindGPUVertexBuffers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex buffer slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -- ^
+  --
+  --           [@bindings@]: an array of 'SDL_GPUBufferBinding' structs containing vertex buffers and offset values.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of bindings in the bindings array.
+  -> IO ()
+bindGPUVertexBuffers =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BindGPUVertexBuffers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds vertex buffers on a command buffer for use with subsequent draw calls.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUVertexBuffers@.
+--                   The unsafe flavor is 'bindGPUVertexBuffers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUVertexBuffers@, defined at @SDL3\/SDL_gpu.h 3354:34@
+bindGPUVertexBuffersSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex buffer slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -- ^
+  --
+  --           [@bindings@]: an array of 'SDL_GPUBufferBinding' structs containing vertex buffers and offset values.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of bindings in the bindings array.
+  -> IO ()
+bindGPUVertexBuffersSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BindGPUVertexBuffers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds an index buffer on a command buffer for use with subsequent draw calls.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUIndexBuffer@.
+--                   The safe flavor is 'bindGPUIndexBufferSafe'
+--                   .
+--
+--     [C declaration]: @SDL_BindGPUIndexBuffer@, defined at @SDL3\/SDL_gpu.h 3371:34@
+bindGPUIndexBuffer
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -- ^
+  --
+  --           [@binding@]: a pointer to a struct containing an index buffer and offset.
+  -> SDL_GPUIndexElementSize
+  -- ^
+  --
+  --           [@index_element_size@]: whether the index values in the buffer are 16- or 32-bit.
+  -> IO ()
+bindGPUIndexBuffer = Unsafe.sDL_BindGPUIndexBuffer
+
+-- | Binds an index buffer on a command buffer for use with subsequent draw calls.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUIndexBuffer@.
+--                   The unsafe flavor is 'bindGPUIndexBuffer'
+--                   .
+--
+--     [C declaration]: @SDL_BindGPUIndexBuffer@, defined at @SDL3\/SDL_gpu.h 3371:34@
+bindGPUIndexBufferSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferBinding
+  -- ^
+  --
+  --           [@binding@]: a pointer to a struct containing an index buffer and offset.
+  -> SDL_GPUIndexElementSize
+  -- ^
+  --
+  --           [@index_element_size@]: whether the index values in the buffer are 16- or 32-bit.
+  -> IO ()
+bindGPUIndexBufferSafe = Safe.sDL_BindGPUIndexBuffer
+
+-- | Binds texture-sampler pairs for use on the vertex shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUVertexSamplers@.
+--                   The safe flavor is 'bindGPUVertexSamplersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUVertexSamplers@, defined at @SDL3\/SDL_gpu.h 3395:34@
+bindGPUVertexSamplers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler pairs to bind from the array.
+  -> IO ()
+bindGPUVertexSamplers =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BindGPUVertexSamplers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds texture-sampler pairs for use on the vertex shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUVertexSamplers@.
+--                   The unsafe flavor is 'bindGPUVertexSamplers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUVertexSamplers@, defined at @SDL3\/SDL_gpu.h 3395:34@
+bindGPUVertexSamplersSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler pairs to bind from the array.
+  -> IO ()
+bindGPUVertexSamplersSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BindGPUVertexSamplers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage textures for use on the vertex shader.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUVertexStorageTextures@.
+--                   The safe flavor is 'bindGPUVertexStorageTexturesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUVertexStorageTextures@, defined at @SDL3\/SDL_gpu.h 3419:34@
+bindGPUVertexStorageTextures
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage texture to bind from the array.
+  -> IO ()
+bindGPUVertexStorageTextures =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BindGPUVertexStorageTextures x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage textures for use on the vertex shader.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUVertexStorageTextures@.
+--                   The unsafe flavor is 'bindGPUVertexStorageTextures'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUVertexStorageTextures@, defined at @SDL3\/SDL_gpu.h 3419:34@
+bindGPUVertexStorageTexturesSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage texture to bind from the array.
+  -> IO ()
+bindGPUVertexStorageTexturesSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BindGPUVertexStorageTextures x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage buffers for use on the vertex shader.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUVertexStorageBuffers@.
+--                   The safe flavor is 'bindGPUVertexStorageBuffersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUVertexStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3443:34@
+bindGPUVertexStorageBuffers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of buffers.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of buffers to bind from the array.
+  -> IO ()
+bindGPUVertexStorageBuffers =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BindGPUVertexStorageBuffers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage buffers for use on the vertex shader.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUVertexStorageBuffers@.
+--                   The unsafe flavor is 'bindGPUVertexStorageBuffers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUVertexStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3443:34@
+bindGPUVertexStorageBuffersSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the vertex storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of buffers.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of buffers to bind from the array.
+  -> IO ()
+bindGPUVertexStorageBuffersSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BindGPUVertexStorageBuffers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds texture-sampler pairs for use on the fragment shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUFragmentSamplers@.
+--                   The safe flavor is 'bindGPUFragmentSamplersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUFragmentSamplers@, defined at @SDL3\/SDL_gpu.h 3468:34@
+bindGPUFragmentSamplers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler pairs to bind from the array.
+  -> IO ()
+bindGPUFragmentSamplers =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BindGPUFragmentSamplers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds texture-sampler pairs for use on the fragment shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUFragmentSamplers@.
+--                   The unsafe flavor is 'bindGPUFragmentSamplers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUFragmentSamplers@, defined at @SDL3\/SDL_gpu.h 3468:34@
+bindGPUFragmentSamplersSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler pairs to bind from the array.
+  -> IO ()
+bindGPUFragmentSamplersSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BindGPUFragmentSamplers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage textures for use on the fragment shader.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUFragmentStorageTextures@.
+--                   The safe flavor is 'bindGPUFragmentStorageTexturesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUFragmentStorageTextures@, defined at @SDL3\/SDL_gpu.h 3492:34@
+bindGPUFragmentStorageTextures
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage textures to bind from the array.
+  -> IO ()
+bindGPUFragmentStorageTextures =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BindGPUFragmentStorageTextures x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage textures for use on the fragment shader.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUFragmentStorageTextures@.
+--                   The unsafe flavor is 'bindGPUFragmentStorageTextures'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUFragmentStorageTextures@, defined at @SDL3\/SDL_gpu.h 3492:34@
+bindGPUFragmentStorageTexturesSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage textures to bind from the array.
+  -> IO ()
+bindGPUFragmentStorageTexturesSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BindGPUFragmentStorageTextures x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage buffers for use on the fragment shader.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUFragmentStorageBuffers@.
+--                   The safe flavor is 'bindGPUFragmentStorageBuffersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUFragmentStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3516:34@
+bindGPUFragmentStorageBuffers
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of storage buffers.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage buffers to bind from the array.
+  -> IO ()
+bindGPUFragmentStorageBuffers =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BindGPUFragmentStorageBuffers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage buffers for use on the fragment shader.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUShader'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUShader'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUFragmentStorageBuffers@.
+--                   The unsafe flavor is 'bindGPUFragmentStorageBuffers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUFragmentStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3516:34@
+bindGPUFragmentStorageBuffersSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the fragment storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of storage buffers.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage buffers to bind from the array.
+  -> IO ()
+bindGPUFragmentStorageBuffersSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BindGPUFragmentStorageBuffers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Draws data using bound graphics state with an index buffer and instancing enabled.
+--
+--     You must not call this function before binding a graphics pipeline.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DrawGPUIndexedPrimitives@.
+--                   The safe flavor is 'drawGPUIndexedPrimitivesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DrawGPUIndexedPrimitives@, defined at @SDL3\/SDL_gpu.h 3547:34@
+drawGPUIndexedPrimitives
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_indices@]: the number of indices to draw per instance.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_instances@]: the number of instances to draw.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_index@]: the starting index within the index buffer.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@vertex_offset@]: value added to vertex index before indexing into the vertex buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_instance@]: the ID of the first instance to draw.
+  -> IO ()
+drawGPUIndexedPrimitives =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              Unsafe.sDL_DrawGPUIndexedPrimitives
+                x00
+                (Coerce.coerce x11)
+                (Coerce.coerce x22)
+                (Coerce.coerce x33)
+                (Coerce.coerce x44)
+                (Coerce.coerce x55)
+
+-- | Draws data using bound graphics state with an index buffer and instancing enabled.
+--
+--     You must not call this function before binding a graphics pipeline.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DrawGPUIndexedPrimitives@.
+--                   The unsafe flavor is 'drawGPUIndexedPrimitives'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DrawGPUIndexedPrimitives@, defined at @SDL3\/SDL_gpu.h 3547:34@
+drawGPUIndexedPrimitivesSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_indices@]: the number of indices to draw per instance.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_instances@]: the number of instances to draw.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_index@]: the starting index within the index buffer.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@vertex_offset@]: value added to vertex index before indexing into the vertex buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_instance@]: the ID of the first instance to draw.
+  -> IO ()
+drawGPUIndexedPrimitivesSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              Safe.sDL_DrawGPUIndexedPrimitives
+                x00
+                (Coerce.coerce x11)
+                (Coerce.coerce x22)
+                (Coerce.coerce x33)
+                (Coerce.coerce x44)
+                (Coerce.coerce x55)
+
+-- | Draws data using bound graphics state.
+--
+--     You must not call this function before binding a graphics pipeline.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DrawGPUPrimitives@.
+--                   The safe flavor is 'drawGPUPrimitivesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DrawGPUPrimitives@, defined at @SDL3\/SDL_gpu.h 3575:34@
+drawGPUPrimitives
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_vertices@]: the number of vertices to draw.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_instances@]: the number of instances that will be drawn.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_vertex@]: the index of the first vertex to draw.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_instance@]: the ID of the first instance to draw.
+  -> IO ()
+drawGPUPrimitives =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Unsafe.sDL_DrawGPUPrimitives
+              x00
+              (Coerce.coerce x11)
+              (Coerce.coerce x22)
+              (Coerce.coerce x33)
+              (Coerce.coerce x44)
+
+-- | Draws data using bound graphics state.
+--
+--     You must not call this function before binding a graphics pipeline.
+--
+--     Note that the @first_vertex@ and @first_instance@ parameters are NOT compatible with built-in vertex\/instance ID variables in shaders (for example, SV_VertexID); GPU APIs and shader languages do not define these 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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DrawGPUPrimitives@.
+--                   The unsafe flavor is 'drawGPUPrimitives'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DrawGPUPrimitives@, defined at @SDL3\/SDL_gpu.h 3575:34@
+drawGPUPrimitivesSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_vertices@]: the number of vertices to draw.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_instances@]: the number of instances that will be drawn.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_vertex@]: the index of the first vertex to draw.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_instance@]: the ID of the first instance to draw.
+  -> IO ()
+drawGPUPrimitivesSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Safe.sDL_DrawGPUPrimitives
+              x00
+              (Coerce.coerce x11)
+              (Coerce.coerce x22)
+              (Coerce.coerce x33)
+              (Coerce.coerce x44)
+
+-- | Draws data using bound graphics state and with draw parameters set from a buffer.
+--
+--     The buffer must consist of tightly-packed draw parameter sets that each match the layout of 'SDL_GPUIndirectDrawCommand'. You must not call this function before binding a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DrawGPUPrimitivesIndirect@.
+--                   The safe flavor is 'drawGPUPrimitivesIndirectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DrawGPUPrimitivesIndirect@, defined at @SDL3\/SDL_gpu.h 3598:34@
+drawGPUPrimitivesIndirect
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing draw parameters.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the draw buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@draw_count@]: the number of draw parameter sets that should be read from the draw buffer.
+  -> IO ()
+drawGPUPrimitivesIndirect =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_DrawGPUPrimitivesIndirect x00 x11 (Coerce.coerce x22) (Coerce.coerce x33)
+
+-- | Draws data using bound graphics state and with draw parameters set from a buffer.
+--
+--     The buffer must consist of tightly-packed draw parameter sets that each match the layout of 'SDL_GPUIndirectDrawCommand'. You must not call this function before binding a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DrawGPUPrimitivesIndirect@.
+--                   The unsafe flavor is 'drawGPUPrimitivesIndirect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DrawGPUPrimitivesIndirect@, defined at @SDL3\/SDL_gpu.h 3598:34@
+drawGPUPrimitivesIndirectSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing draw parameters.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the draw buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@draw_count@]: the number of draw parameter sets that should be read from the draw buffer.
+  -> IO ()
+drawGPUPrimitivesIndirectSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_DrawGPUPrimitivesIndirect x00 x11 (Coerce.coerce x22) (Coerce.coerce x33)
+
+-- | Draws data using bound graphics state with an index buffer enabled and with draw parameters set from a buffer.
+--
+--     The buffer must consist of tightly-packed draw parameter sets that each match the layout of 'SDL_GPUIndexedIndirectDrawCommand'. You must not call this function before binding a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DrawGPUIndexedPrimitivesIndirect@.
+--                   The safe flavor is 'drawGPUIndexedPrimitivesIndirectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DrawGPUIndexedPrimitivesIndirect@, defined at @SDL3\/SDL_gpu.h 3620:34@
+drawGPUIndexedPrimitivesIndirect
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing draw parameters.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the draw buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@draw_count@]: the number of draw parameter sets that should be read from the draw buffer.
+  -> IO ()
+drawGPUIndexedPrimitivesIndirect =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_DrawGPUIndexedPrimitivesIndirect x00 x11 (Coerce.coerce x22) (Coerce.coerce x33)
+
+-- | Draws data using bound graphics state with an index buffer enabled and with draw parameters set from a buffer.
+--
+--     The buffer must consist of tightly-packed draw parameter sets that each match the layout of 'SDL_GPUIndexedIndirectDrawCommand'. You must not call this function before binding a graphics pipeline.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DrawGPUIndexedPrimitivesIndirect@.
+--                   The unsafe flavor is 'drawGPUIndexedPrimitivesIndirect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DrawGPUIndexedPrimitivesIndirect@, defined at @SDL3\/SDL_gpu.h 3620:34@
+drawGPUIndexedPrimitivesIndirectSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing draw parameters.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the draw buffer.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@draw_count@]: the number of draw parameter sets that should be read from the draw buffer.
+  -> IO ()
+drawGPUIndexedPrimitivesIndirectSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_DrawGPUIndexedPrimitivesIndirect x00 x11 (Coerce.coerce x22) (Coerce.coerce x33)
+
+-- | Ends the given render pass.
+--
+--     All bound graphics state on the render pass command buffer is unset. The render pass handle is now invalid.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_EndGPURenderPass@.
+--                   The safe flavor is 'endGPURenderPassSafe'
+--                   .
+--
+--     [C declaration]: @SDL_EndGPURenderPass@, defined at @SDL3\/SDL_gpu.h 3636:34@
+endGPURenderPass
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> IO ()
+endGPURenderPass = Unsafe.sDL_EndGPURenderPass
+
+-- | Ends the given render pass.
+--
+--     All bound graphics state on the render pass command buffer is unset. The render pass handle is now invalid.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EndGPURenderPass@.
+--                   The unsafe flavor is 'endGPURenderPass'
+--                   .
+--
+--     [C declaration]: @SDL_EndGPURenderPass@, defined at @SDL3\/SDL_gpu.h 3636:34@
+endGPURenderPassSafe
+  :: BG.Ptr SDL_GPURenderPass
+  -- ^
+  --
+  --           [@render_pass@]: a render pass handle.
+  -> IO ()
+endGPURenderPassSafe = Safe.sDL_EndGPURenderPass
+
+-- | Begins a compute pass on a command buffer.
+--
+--     A compute pass is defined by a set of texture subresources and buffers that may be written to by compute pipelines. These textures and buffers must 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!
+--
+--     [Returns]: a compute pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'endGPUComputePass'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BeginGPUComputePass@.
+--                   The safe flavor is 'beginGPUComputePassSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BeginGPUComputePass@, defined at @SDL3\/SDL_gpu.h 3678:50@
+beginGPUComputePass
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUStorageTextureReadWriteBinding
+  -- ^
+  --
+  --           [@storage_texture_bindings@]: an array of writeable storage texture binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_storage_texture_bindings@]: the number of storage textures to bind from the array.
+  -> PtrConst.PtrConst SDL_GPUStorageBufferReadWriteBinding
+  -- ^
+  --
+  --           [@storage_buffer_bindings@]: an array of writeable storage buffer binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_storage_buffer_bindings@]: the number of storage buffers to bind from the array.
+  -> IO (BG.Ptr SDL_GPUComputePass)
+beginGPUComputePass =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Unsafe.sDL_BeginGPUComputePass x00 x11 (Coerce.coerce x22) x33 (Coerce.coerce x44)
+
+-- | Begins a compute pass on a command buffer.
+--
+--     A compute pass is defined by a set of texture subresources and buffers that may be written to by compute pipelines. These textures and buffers must 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!
+--
+--     [Returns]: a compute pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'endGPUComputePass'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BeginGPUComputePass@.
+--                   The unsafe flavor is 'beginGPUComputePass'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BeginGPUComputePass@, defined at @SDL3\/SDL_gpu.h 3678:50@
+beginGPUComputePassSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUStorageTextureReadWriteBinding
+  -- ^
+  --
+  --           [@storage_texture_bindings@]: an array of writeable storage texture binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_storage_texture_bindings@]: the number of storage textures to bind from the array.
+  -> PtrConst.PtrConst SDL_GPUStorageBufferReadWriteBinding
+  -- ^
+  --
+  --           [@storage_buffer_bindings@]: an array of writeable storage buffer binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_storage_buffer_bindings@]: the number of storage buffers to bind from the array.
+  -> IO (BG.Ptr SDL_GPUComputePass)
+beginGPUComputePassSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Safe.sDL_BeginGPUComputePass x00 x11 (Coerce.coerce x22) x33 (Coerce.coerce x44)
+
+-- | Binds a compute pipeline on a command buffer for use in compute dispatch.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUComputePipeline@.
+--                   The safe flavor is 'bindGPUComputePipelineSafe'
+--                   .
+--
+--     [C declaration]: @SDL_BindGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 3693:34@
+bindGPUComputePipeline
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Ptr SDL_GPUComputePipeline
+  -- ^
+  --
+  --           [@compute_pipeline@]: a compute pipeline to bind.
+  -> IO ()
+bindGPUComputePipeline =
+  Unsafe.sDL_BindGPUComputePipeline
+
+-- | Binds a compute pipeline on a command buffer for use in compute dispatch.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUComputePipeline@.
+--                   The unsafe flavor is 'bindGPUComputePipeline'
+--                   .
+--
+--     [C declaration]: @SDL_BindGPUComputePipeline@, defined at @SDL3\/SDL_gpu.h 3693:34@
+bindGPUComputePipelineSafe
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Ptr SDL_GPUComputePipeline
+  -- ^
+  --
+  --           [@compute_pipeline@]: a compute pipeline to bind.
+  -> IO ()
+bindGPUComputePipelineSafe =
+  Safe.sDL_BindGPUComputePipeline
+
+-- | Binds texture-sampler pairs for use on the compute shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUComputePipeline'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUComputePipeline'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUComputeSamplers@.
+--                   The safe flavor is 'bindGPUComputeSamplersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUComputeSamplers@, defined at @SDL3\/SDL_gpu.h 3716:34@
+bindGPUComputeSamplers
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the compute sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler bindings to bind from the array.
+  -> IO ()
+bindGPUComputeSamplers =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BindGPUComputeSamplers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds texture-sampler pairs for use on the compute shader.
+--
+--     The textures must have been created with SDL_GPU_TEXTUREUSAGE_SAMPLER.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUComputePipeline'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUComputePipeline'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUComputeSamplers@.
+--                   The unsafe flavor is 'bindGPUComputeSamplers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUComputeSamplers@, defined at @SDL3\/SDL_gpu.h 3716:34@
+bindGPUComputeSamplersSafe
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the compute sampler slot to begin binding from.
+  -> PtrConst.PtrConst SDL_GPUTextureSamplerBinding
+  -- ^
+  --
+  --           [@texture_sampler_bindings@]: an array of texture-sampler binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of texture-sampler bindings to bind from the array.
+  -> IO ()
+bindGPUComputeSamplersSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BindGPUComputeSamplers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage textures as readonly for use on the compute pipeline.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUComputePipeline'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUComputePipeline'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUComputeStorageTextures@.
+--                   The safe flavor is 'bindGPUComputeStorageTexturesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUComputeStorageTextures@, defined at @SDL3\/SDL_gpu.h 3740:34@
+bindGPUComputeStorageTextures
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the compute storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage textures to bind from the array.
+  -> IO ()
+bindGPUComputeStorageTextures =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BindGPUComputeStorageTextures x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage textures as readonly for use on the compute pipeline.
+--
+--     These textures must have been created with SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUComputePipeline'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUComputePipeline'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUComputeStorageTextures@.
+--                   The unsafe flavor is 'bindGPUComputeStorageTextures'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUComputeStorageTextures@, defined at @SDL3\/SDL_gpu.h 3740:34@
+bindGPUComputeStorageTexturesSafe
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the compute storage texture slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@storage_textures@]: an array of storage textures.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage textures to bind from the array.
+  -> IO ()
+bindGPUComputeStorageTexturesSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BindGPUComputeStorageTextures x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage buffers as readonly for use on the compute pipeline.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUComputePipeline'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUComputePipeline'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BindGPUComputeStorageBuffers@.
+--                   The safe flavor is 'bindGPUComputeStorageBuffersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUComputeStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3764:34@
+bindGPUComputeStorageBuffers
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the compute storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of storage buffer binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage buffers to bind from the array.
+  -> IO ()
+bindGPUComputeStorageBuffers =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_BindGPUComputeStorageBuffers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Binds storage buffers as readonly for use on the compute pipeline.
+--
+--     These buffers must have been created with SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ.
+--
+--     Be sure your shader is set up according to the requirements documented in @'createGPUComputePipeline'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createGPUComputePipeline'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BindGPUComputeStorageBuffers@.
+--                   The unsafe flavor is 'bindGPUComputeStorageBuffers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BindGPUComputeStorageBuffers@, defined at @SDL3\/SDL_gpu.h 3764:34@
+bindGPUComputeStorageBuffersSafe
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@first_slot@]: the compute storage buffer slot to begin binding from.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUBuffer)
+  -- ^
+  --
+  --           [@storage_buffers@]: an array of storage buffer binding structs.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_bindings@]: the number of storage buffers to bind from the array.
+  -> IO ()
+bindGPUComputeStorageBuffersSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_BindGPUComputeStorageBuffers x00 (Coerce.coerce x11) x22 (Coerce.coerce x33)
+
+-- | Dispatches compute work.
+--
+--     You must not call this function before binding a compute pipeline.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DispatchGPUCompute@.
+--                   The safe flavor is 'dispatchGPUComputeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DispatchGPUCompute@, defined at @SDL3\/SDL_gpu.h 3790:34@
+dispatchGPUCompute
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@groupcount_x@]: number of local workgroups to dispatch in the X dimension.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@groupcount_y@]: number of local workgroups to dispatch in the Y dimension.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@groupcount_z@]: number of local workgroups to dispatch in the Z dimension.
+  -> IO ()
+dispatchGPUCompute =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_DispatchGPUCompute x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33)
+
+-- | Dispatches compute work.
+--
+--     You must not call this function before binding a compute pipeline.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DispatchGPUCompute@.
+--                   The unsafe flavor is 'dispatchGPUCompute'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DispatchGPUCompute@, defined at @SDL3\/SDL_gpu.h 3790:34@
+dispatchGPUComputeSafe
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@groupcount_x@]: number of local workgroups to dispatch in the X dimension.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@groupcount_y@]: number of local workgroups to dispatch in the Y dimension.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@groupcount_z@]: number of local workgroups to dispatch in the Z dimension.
+  -> IO ()
+dispatchGPUComputeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_DispatchGPUCompute x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33)
+
+-- | Dispatches compute work with parameters set from a buffer.
+--
+--     The buffer layout should match the layout of 'SDL_GPUIndirectDispatchCommand'. You must not call this function before binding a compute pipeline.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DispatchGPUComputeIndirect@.
+--                   The safe flavor is 'dispatchGPUComputeIndirectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DispatchGPUComputeIndirect@, defined at @SDL3\/SDL_gpu.h 3814:34@
+dispatchGPUComputeIndirect
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing dispatch parameters.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the dispatch buffer.
+  -> IO ()
+dispatchGPUComputeIndirect =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_DispatchGPUComputeIndirect x00 x11 (Coerce.coerce x22)
+
+-- | Dispatches compute work with parameters set from a buffer.
+--
+--     The buffer layout should match the layout of 'SDL_GPUIndirectDispatchCommand'. You must not call this function before binding a compute pipeline.
+--
+--     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.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DispatchGPUComputeIndirect@.
+--                   The unsafe flavor is 'dispatchGPUComputeIndirect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DispatchGPUComputeIndirect@, defined at @SDL3\/SDL_gpu.h 3814:34@
+dispatchGPUComputeIndirectSafe
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> BG.Ptr SDL_GPUBuffer
+  -- ^
+  --
+  --           [@buffer@]: a buffer containing dispatch parameters.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@offset@]: the offset to start reading from the dispatch buffer.
+  -> IO ()
+dispatchGPUComputeIndirectSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_DispatchGPUComputeIndirect x00 x11 (Coerce.coerce x22)
+
+-- | Ends the current compute pass.
+--
+--     All bound compute state on the command buffer is unset. The compute pass handle is now invalid.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_EndGPUComputePass@.
+--                   The safe flavor is 'endGPUComputePassSafe'
+--                   .
+--
+--     [C declaration]: @SDL_EndGPUComputePass@, defined at @SDL3\/SDL_gpu.h 3829:34@
+endGPUComputePass
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> IO ()
+endGPUComputePass = Unsafe.sDL_EndGPUComputePass
+
+-- | Ends the current compute pass.
+--
+--     All bound compute state on the command buffer is unset. The compute pass handle is now invalid.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EndGPUComputePass@.
+--                   The unsafe flavor is 'endGPUComputePass'
+--                   .
+--
+--     [C declaration]: @SDL_EndGPUComputePass@, defined at @SDL3\/SDL_gpu.h 3829:34@
+endGPUComputePassSafe
+  :: BG.Ptr SDL_GPUComputePass
+  -- ^
+  --
+  --           [@compute_pass@]: a compute pass handle.
+  -> IO ()
+endGPUComputePassSafe = Safe.sDL_EndGPUComputePass
+
+-- | Maps a transfer buffer into application address space.
+--
+--     You must unmap the transfer buffer before encoding upload commands. The memory is owned by the graphics driver - do NOT call 'SDL3.Sys.Stdinc.free' on the returned pointer.
+--
+--     [Returns]: the address of the mapped transfer buffer memory, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MapGPUTransferBuffer@.
+--                   The safe flavor is 'mapGPUTransferBufferSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MapGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3849:36@
+mapGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a transfer buffer.
+  -> Bool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the transfer buffer if it is already bound.
+  -> IO (BG.Ptr BG.Void)
+mapGPUTransferBuffer =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_MapGPUTransferBuffer x00 x11 (CBool.fromBool x22)
+
+-- | Maps a transfer buffer into application address space.
+--
+--     You must unmap the transfer buffer before encoding upload commands. The memory is owned by the graphics driver - do NOT call 'SDL3.Sys.Stdinc.free' on the returned pointer.
+--
+--     [Returns]: the address of the mapped transfer buffer memory, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MapGPUTransferBuffer@.
+--                   The unsafe flavor is 'mapGPUTransferBuffer'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MapGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3849:36@
+mapGPUTransferBufferSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a transfer buffer.
+  -> Bool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the transfer buffer if it is already bound.
+  -> IO (BG.Ptr BG.Void)
+mapGPUTransferBufferSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_MapGPUTransferBuffer x00 x11 (CBool.fromBool x22)
+
+-- | Unmaps a previously mapped transfer buffer.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnmapGPUTransferBuffer@.
+--                   The safe flavor is 'unmapGPUTransferBufferSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UnmapGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3862:34@
+unmapGPUTransferBuffer
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a previously mapped transfer buffer.
+  -> IO ()
+unmapGPUTransferBuffer =
+  Unsafe.sDL_UnmapGPUTransferBuffer
+
+-- | Unmaps a previously mapped transfer buffer.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnmapGPUTransferBuffer@.
+--                   The unsafe flavor is 'unmapGPUTransferBuffer'
+--                   .
+--
+--     [C declaration]: @SDL_UnmapGPUTransferBuffer@, defined at @SDL3\/SDL_gpu.h 3862:34@
+unmapGPUTransferBufferSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUTransferBuffer
+  -- ^
+  --
+  --           [@transfer_buffer@]: a previously mapped transfer buffer.
+  -> IO ()
+unmapGPUTransferBufferSafe =
+  Safe.sDL_UnmapGPUTransferBuffer
+
+-- | Begins a copy pass on a command buffer.
+--
+--     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.
+--
+--     [Returns]: a copy pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'endGPUCopyPass'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BeginGPUCopyPass@.
+--                   The safe flavor is 'beginGPUCopyPassSafe'
+--                   .
+--
+--     [C declaration]: @SDL_BeginGPUCopyPass@, defined at @SDL3\/SDL_gpu.h 3882:47@
+beginGPUCopyPass
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO (BG.Ptr SDL_GPUCopyPass)
+beginGPUCopyPass = Unsafe.sDL_BeginGPUCopyPass
+
+-- | Begins a copy pass on a command buffer.
+--
+--     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.
+--
+--     [Returns]: a copy pass handle.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'endGPUCopyPass'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BeginGPUCopyPass@.
+--                   The unsafe flavor is 'beginGPUCopyPass'
+--                   .
+--
+--     [C declaration]: @SDL_BeginGPUCopyPass@, defined at @SDL3\/SDL_gpu.h 3882:47@
+beginGPUCopyPassSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO (BG.Ptr SDL_GPUCopyPass)
+beginGPUCopyPassSafe = Safe.sDL_BeginGPUCopyPass
+
+-- | Uploads data from a transfer buffer to a texture.
+--
+--     The upload occurs on the GPU timeline. You may assume that the upload has finished in subsequent commands.
+--
+--     You must align the data in the transfer buffer to a multiple of the texel size of the texture format.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UploadToGPUTexture@.
+--                   The safe flavor is 'uploadToGPUTextureSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UploadToGPUTexture@, defined at @SDL3\/SDL_gpu.h 3902:34@
+uploadToGPUTexture
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -- ^
+  --
+  --           [@source@]: the source transfer buffer with image layout information.
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -- ^
+  --
+  --           [@destination@]: the destination texture region.
+  -> Bool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the texture if the texture is bound, otherwise overwrites the data.
+  -> IO ()
+uploadToGPUTexture =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_UploadToGPUTexture x00 x11 x22 (CBool.fromBool x33)
+
+-- | Uploads data from a transfer buffer to a texture.
+--
+--     The upload occurs on the GPU timeline. You may assume that the upload has finished in subsequent commands.
+--
+--     You must align the data in the transfer buffer to a multiple of the texel size of the texture format.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UploadToGPUTexture@.
+--                   The unsafe flavor is 'uploadToGPUTexture'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UploadToGPUTexture@, defined at @SDL3\/SDL_gpu.h 3902:34@
+uploadToGPUTextureSafe
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -- ^
+  --
+  --           [@source@]: the source transfer buffer with image layout information.
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -- ^
+  --
+  --           [@destination@]: the destination texture region.
+  -> Bool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the texture if the texture is bound, otherwise overwrites the data.
+  -> IO ()
+uploadToGPUTextureSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_UploadToGPUTexture x00 x11 x22 (CBool.fromBool x33)
+
+-- | Uploads data from a transfer buffer to a buffer.
+--
+--     The upload occurs on the GPU timeline. You may assume that the upload has finished in subsequent commands.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UploadToGPUBuffer@.
+--                   The safe flavor is 'uploadToGPUBufferSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UploadToGPUBuffer@, defined at @SDL3\/SDL_gpu.h 3922:34@
+uploadToGPUBuffer
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -- ^
+  --
+  --           [@source@]: the source transfer buffer with offset.
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -- ^
+  --
+  --           [@destination@]: the destination buffer with offset and size.
+  -> Bool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the buffer if it is already bound, otherwise overwrites the data.
+  -> IO ()
+uploadToGPUBuffer =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_UploadToGPUBuffer x00 x11 x22 (CBool.fromBool x33)
+
+-- | Uploads data from a transfer buffer to a buffer.
+--
+--     The upload occurs on the GPU timeline. You may assume that the upload has finished in subsequent commands.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UploadToGPUBuffer@.
+--                   The unsafe flavor is 'uploadToGPUBuffer'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UploadToGPUBuffer@, defined at @SDL3\/SDL_gpu.h 3922:34@
+uploadToGPUBufferSafe
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -- ^
+  --
+  --           [@source@]: the source transfer buffer with offset.
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -- ^
+  --
+  --           [@destination@]: the destination buffer with offset and size.
+  -> Bool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the buffer if it is already bound, otherwise overwrites the data.
+  -> IO ()
+uploadToGPUBufferSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_UploadToGPUBuffer x00 x11 x22 (CBool.fromBool x33)
+
+-- | Performs a texture-to-texture copy.
+--
+--     This copy occurs on the GPU timeline. You may assume the copy has finished in subsequent commands.
+--
+--     This function does not support copying between depth and color textures. For those, copy the texture to a buffer and then to the destination texture.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CopyGPUTextureToTexture@.
+--                   The safe flavor is 'copyGPUTextureToTextureSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CopyGPUTextureToTexture@, defined at @SDL3\/SDL_gpu.h 3949:34@
+copyGPUTextureToTexture
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -- ^
+  --
+  --           [@source@]: a source texture region.
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -- ^
+  --
+  --           [@destination@]: a destination texture region.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@w@]: the width of the region to copy.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@h@]: the height of the region to copy.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@d@]: the depth of the region to copy.
+  -> Bool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the destination texture if the destination texture is bound, otherwise overwrites the data.
+  -> IO ()
+copyGPUTextureToTexture =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                Unsafe.sDL_CopyGPUTextureToTexture
+                  x00
+                  x11
+                  x22
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+                  (Coerce.coerce x55)
+                  (CBool.fromBool x66)
+
+-- | Performs a texture-to-texture copy.
+--
+--     This copy occurs on the GPU timeline. You may assume the copy has finished in subsequent commands.
+--
+--     This function does not support copying between depth and color textures. For those, copy the texture to a buffer and then to the destination texture.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CopyGPUTextureToTexture@.
+--                   The unsafe flavor is 'copyGPUTextureToTexture'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CopyGPUTextureToTexture@, defined at @SDL3\/SDL_gpu.h 3949:34@
+copyGPUTextureToTextureSafe
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -- ^
+  --
+  --           [@source@]: a source texture region.
+  -> PtrConst.PtrConst SDL_GPUTextureLocation
+  -- ^
+  --
+  --           [@destination@]: a destination texture region.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@w@]: the width of the region to copy.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@h@]: the height of the region to copy.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@d@]: the depth of the region to copy.
+  -> Bool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the destination texture if the destination texture is bound, otherwise overwrites the data.
+  -> IO ()
+copyGPUTextureToTextureSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                Safe.sDL_CopyGPUTextureToTexture
+                  x00
+                  x11
+                  x22
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+                  (Coerce.coerce x55)
+                  (CBool.fromBool x66)
+
+-- | Performs a buffer-to-buffer copy.
+--
+--     This copy occurs on the GPU timeline. You may assume the copy has finished in subsequent commands.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CopyGPUBufferToBuffer@.
+--                   The safe flavor is 'copyGPUBufferToBufferSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CopyGPUBufferToBuffer@, defined at @SDL3\/SDL_gpu.h 3973:34@
+copyGPUBufferToBuffer
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -- ^
+  --
+  --           [@source@]: the buffer and offset to copy from.
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -- ^
+  --
+  --           [@destination@]: the buffer and offset to copy to.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@size@]: the length of the buffer to copy.
+  -> Bool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the destination buffer if it is already bound, otherwise overwrites the data.
+  -> IO ()
+copyGPUBufferToBuffer =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Unsafe.sDL_CopyGPUBufferToBuffer x00 x11 x22 (Coerce.coerce x33) (CBool.fromBool x44)
+
+-- | Performs a buffer-to-buffer copy.
+--
+--     This copy occurs on the GPU timeline. You may assume the copy has finished in subsequent commands.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CopyGPUBufferToBuffer@.
+--                   The unsafe flavor is 'copyGPUBufferToBuffer'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CopyGPUBufferToBuffer@, defined at @SDL3\/SDL_gpu.h 3973:34@
+copyGPUBufferToBufferSafe
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -- ^
+  --
+  --           [@source@]: the buffer and offset to copy from.
+  -> PtrConst.PtrConst SDL_GPUBufferLocation
+  -- ^
+  --
+  --           [@destination@]: the buffer and offset to copy to.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@size@]: the length of the buffer to copy.
+  -> Bool
+  -- ^
+  --
+  --           [@cycle@]: if true, cycles the destination buffer if it is already bound, otherwise overwrites the data.
+  -> IO ()
+copyGPUBufferToBufferSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Safe.sDL_CopyGPUBufferToBuffer x00 x11 x22 (Coerce.coerce x33) (CBool.fromBool x44)
+
+-- | Copies data from a texture to a transfer buffer on the GPU timeline.
+--
+--     This data is not guaranteed to be copied until the command buffer fence is signaled.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DownloadFromGPUTexture@.
+--                   The safe flavor is 'downloadFromGPUTextureSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DownloadFromGPUTexture@, defined at @SDL3\/SDL_gpu.h 3993:34@
+downloadFromGPUTexture
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -- ^
+  --
+  --           [@source@]: the source texture region.
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -- ^
+  --
+  --           [@destination@]: the destination transfer buffer with image layout information.
+  -> IO ()
+downloadFromGPUTexture =
+  Unsafe.sDL_DownloadFromGPUTexture
+
+-- | Copies data from a texture to a transfer buffer on the GPU timeline.
+--
+--     This data is not guaranteed to be copied until the command buffer fence is signaled.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DownloadFromGPUTexture@.
+--                   The unsafe flavor is 'downloadFromGPUTexture'
+--                   .
+--
+--     [C declaration]: @SDL_DownloadFromGPUTexture@, defined at @SDL3\/SDL_gpu.h 3993:34@
+downloadFromGPUTextureSafe
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUTextureRegion
+  -- ^
+  --
+  --           [@source@]: the source texture region.
+  -> PtrConst.PtrConst SDL_GPUTextureTransferInfo
+  -- ^
+  --
+  --           [@destination@]: the destination transfer buffer with image layout information.
+  -> IO ()
+downloadFromGPUTextureSafe =
+  Safe.sDL_DownloadFromGPUTexture
+
+-- | Copies data from a buffer to a transfer buffer on the GPU timeline.
+--
+--     This data is not guaranteed to be copied until the command buffer fence is signaled.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DownloadFromGPUBuffer@.
+--                   The safe flavor is 'downloadFromGPUBufferSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DownloadFromGPUBuffer@, defined at @SDL3\/SDL_gpu.h 4010:34@
+downloadFromGPUBuffer
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -- ^
+  --
+  --           [@source@]: the source buffer with offset and size.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -- ^
+  --
+  --           [@destination@]: the destination transfer buffer with offset.
+  -> IO ()
+downloadFromGPUBuffer =
+  Unsafe.sDL_DownloadFromGPUBuffer
+
+-- | Copies data from a buffer to a transfer buffer on the GPU timeline.
+--
+--     This data is not guaranteed to be copied until the command buffer fence is signaled.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DownloadFromGPUBuffer@.
+--                   The unsafe flavor is 'downloadFromGPUBuffer'
+--                   .
+--
+--     [C declaration]: @SDL_DownloadFromGPUBuffer@, defined at @SDL3\/SDL_gpu.h 4010:34@
+downloadFromGPUBufferSafe
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> PtrConst.PtrConst SDL_GPUBufferRegion
+  -- ^
+  --
+  --           [@source@]: the source buffer with offset and size.
+  -> PtrConst.PtrConst SDL_GPUTransferBufferLocation
+  -- ^
+  --
+  --           [@destination@]: the destination transfer buffer with offset.
+  -> IO ()
+downloadFromGPUBufferSafe =
+  Safe.sDL_DownloadFromGPUBuffer
+
+-- | Ends the current copy pass.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_EndGPUCopyPass@.
+--                   The safe flavor is 'endGPUCopyPassSafe'
+--                   .
+--
+--     [C declaration]: @SDL_EndGPUCopyPass@, defined at @SDL3\/SDL_gpu.h 4022:34@
+endGPUCopyPass
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> IO ()
+endGPUCopyPass = Unsafe.sDL_EndGPUCopyPass
+
+-- | Ends the current copy pass.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EndGPUCopyPass@.
+--                   The unsafe flavor is 'endGPUCopyPass'
+--                   .
+--
+--     [C declaration]: @SDL_EndGPUCopyPass@, defined at @SDL3\/SDL_gpu.h 4022:34@
+endGPUCopyPassSafe
+  :: BG.Ptr SDL_GPUCopyPass
+  -- ^
+  --
+  --           [@copy_pass@]: a copy pass handle.
+  -> IO ()
+endGPUCopyPassSafe = Safe.sDL_EndGPUCopyPass
+
+-- | Generates mipmaps for the given texture.
+--
+--     This function must not be called inside of any pass.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GenerateMipmapsForGPUTexture@.
+--                   The safe flavor is 'generateMipmapsForGPUTextureSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GenerateMipmapsForGPUTexture@, defined at @SDL3\/SDL_gpu.h 4035:34@
+generateMipmapsForGPUTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command_buffer.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture with more than 1 mip level.
+  -> IO ()
+generateMipmapsForGPUTexture =
+  Unsafe.sDL_GenerateMipmapsForGPUTexture
+
+-- | Generates mipmaps for the given texture.
+--
+--     This function must not be called inside of any pass.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GenerateMipmapsForGPUTexture@.
+--                   The unsafe flavor is 'generateMipmapsForGPUTexture'
+--                   .
+--
+--     [C declaration]: @SDL_GenerateMipmapsForGPUTexture@, defined at @SDL3\/SDL_gpu.h 4035:34@
+generateMipmapsForGPUTextureSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command_buffer.
+  -> BG.Ptr SDL_GPUTexture
+  -- ^
+  --
+  --           [@texture@]: a texture with more than 1 mip level.
+  -> IO ()
+generateMipmapsForGPUTextureSafe =
+  Safe.sDL_GenerateMipmapsForGPUTexture
+
+-- | Blits from a source texture region to a destination texture region.
+--
+--     This function must not be called inside of any pass.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BlitGPUTexture@.
+--                   The safe flavor is 'blitGPUTextureSafe'
+--                   .
+--
+--     [C declaration]: @SDL_BlitGPUTexture@, defined at @SDL3\/SDL_gpu.h 4049:34@
+blitGPUTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUBlitInfo
+  -- ^
+  --
+  --           [@info@]: the blit info struct containing the blit parameters.
+  -> IO ()
+blitGPUTexture = Unsafe.sDL_BlitGPUTexture
+
+-- | Blits from a source texture region to a destination texture region.
+--
+--     This function must not be called inside of any pass.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BlitGPUTexture@.
+--                   The unsafe flavor is 'blitGPUTexture'
+--                   .
+--
+--     [C declaration]: @SDL_BlitGPUTexture@, defined at @SDL3\/SDL_gpu.h 4049:34@
+blitGPUTextureSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> PtrConst.PtrConst SDL_GPUBlitInfo
+  -- ^
+  --
+  --           [@info@]: the blit info struct containing the blit parameters.
+  -> IO ()
+blitGPUTextureSafe = Safe.sDL_BlitGPUTexture
+
+-- | Determines whether a swapchain composition is supported by the window.
+--
+--     The window must be claimed before calling this function.
+--
+--     [Returns]: true if supported, false if unsupported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'claimWindowForGPUDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WindowSupportsGPUSwapchainComposition@.
+--                   The safe flavor is 'windowSupportsGPUSwapchainCompositionSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WindowSupportsGPUSwapchainComposition@, defined at @SDL3\/SDL_gpu.h 4069:34@
+windowSupportsGPUSwapchainComposition
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> SDL_GPUSwapchainComposition
+  -- ^
+  --
+  --           [@swapchain_composition@]: the swapchain composition to check.
+  -> IO Bool
+windowSupportsGPUSwapchainComposition =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_WindowSupportsGPUSwapchainComposition x00 x11 x22)
+
+-- | Determines whether a swapchain composition is supported by the window.
+--
+--     The window must be claimed before calling this function.
+--
+--     [Returns]: true if supported, false if unsupported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'claimWindowForGPUDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WindowSupportsGPUSwapchainComposition@.
+--                   The unsafe flavor is 'windowSupportsGPUSwapchainComposition'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WindowSupportsGPUSwapchainComposition@, defined at @SDL3\/SDL_gpu.h 4069:34@
+windowSupportsGPUSwapchainCompositionSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> SDL_GPUSwapchainComposition
+  -- ^
+  --
+  --           [@swapchain_composition@]: the swapchain composition to check.
+  -> IO Bool
+windowSupportsGPUSwapchainCompositionSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_WindowSupportsGPUSwapchainComposition x00 x11 x22)
+
+-- | Determines whether a presentation mode is supported by the window.
+--
+--     The window must be claimed before calling this function.
+--
+--     [Returns]: true if supported, false if unsupported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'claimWindowForGPUDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WindowSupportsGPUPresentMode@.
+--                   The safe flavor is 'windowSupportsGPUPresentModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WindowSupportsGPUPresentMode@, defined at @SDL3\/SDL_gpu.h 4088:34@
+windowSupportsGPUPresentMode
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> SDL_GPUPresentMode
+  -- ^
+  --
+  --           [@present_mode@]: the presentation mode to check.
+  -> IO Bool
+windowSupportsGPUPresentMode =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_WindowSupportsGPUPresentMode x00 x11 x22)
+
+-- | Determines whether a presentation mode is supported by the window.
+--
+--     The window must be claimed before calling this function.
+--
+--     [Returns]: true if supported, false if unsupported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'claimWindowForGPUDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WindowSupportsGPUPresentMode@.
+--                   The unsafe flavor is 'windowSupportsGPUPresentMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WindowSupportsGPUPresentMode@, defined at @SDL3\/SDL_gpu.h 4088:34@
+windowSupportsGPUPresentModeSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> SDL_GPUPresentMode
+  -- ^
+  --
+  --           [@present_mode@]: the presentation mode to check.
+  -> IO Bool
+windowSupportsGPUPresentModeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_WindowSupportsGPUPresentMode x00 x11 x22)
+
+-- | Claims a window, creating a swapchain structure for it.
+--
+--     This must be called before 'acquireGPUSwapchainTexture' is called using the window. You should only call this function from the thread that created the window.
+--
+--     The swapchain will be created with SDL_GPU_SWAPCHAINCOMPOSITION_SDR and SDL_GPU_PRESENTMODE_VSYNC. If you want to have different swapchain parameters, you must call 'setGPUSwapchainParameters' after claiming the window.
+--
+--     [Returns]: true on success, or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'waitAndAcquireGPUSwapchainTexture', 'releaseWindowFromGPUDevice', 'windowSupportsGPUPresentMode', 'windowSupportsGPUSwapchainComposition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ClaimWindowForGPUDevice@.
+--                   The safe flavor is 'claimWindowForGPUDeviceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClaimWindowForGPUDevice@, defined at @SDL3\/SDL_gpu.h 4120:34@
+claimWindowForGPUDevice
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> IO Bool
+claimWindowForGPUDevice =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ClaimWindowForGPUDevice x00 x11)
+
+-- | Claims a window, creating a swapchain structure for it.
+--
+--     This must be called before 'acquireGPUSwapchainTexture' is called using the window. You should only call this function from the thread that created the window.
+--
+--     The swapchain will be created with SDL_GPU_SWAPCHAINCOMPOSITION_SDR and SDL_GPU_PRESENTMODE_VSYNC. If you want to have different swapchain parameters, you must call 'setGPUSwapchainParameters' after claiming the window.
+--
+--     [Returns]: true on success, or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'waitAndAcquireGPUSwapchainTexture', 'releaseWindowFromGPUDevice', 'windowSupportsGPUPresentMode', 'windowSupportsGPUSwapchainComposition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ClaimWindowForGPUDevice@.
+--                   The unsafe flavor is 'claimWindowForGPUDevice'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClaimWindowForGPUDevice@, defined at @SDL3\/SDL_gpu.h 4120:34@
+claimWindowForGPUDeviceSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window.
+  -> IO Bool
+claimWindowForGPUDeviceSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ClaimWindowForGPUDevice x00 x11)
+
+-- | Unclaims a window, destroying its swapchain structure.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'claimWindowForGPUDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReleaseWindowFromGPUDevice@.
+--                   The safe flavor is 'releaseWindowFromGPUDeviceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseWindowFromGPUDevice@, defined at @SDL3\/SDL_gpu.h 4134:34@
+releaseWindowFromGPUDevice
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> IO ()
+releaseWindowFromGPUDevice =
+  Unsafe.sDL_ReleaseWindowFromGPUDevice
+
+-- | Unclaims a window, destroying its swapchain structure.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'claimWindowForGPUDevice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReleaseWindowFromGPUDevice@.
+--                   The unsafe flavor is 'releaseWindowFromGPUDevice'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseWindowFromGPUDevice@, defined at @SDL3\/SDL_gpu.h 4134:34@
+releaseWindowFromGPUDeviceSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> IO ()
+releaseWindowFromGPUDeviceSafe =
+  Safe.sDL_ReleaseWindowFromGPUDevice
+
+-- | Changes the swapchain parameters for the given claimed window.
+--
+--     This function will fail if the requested present mode or swapchain composition are unsupported by the device. Check if the parameters are supported via 'windowSupportsGPUPresentMode' \/ 'windowSupportsGPUSwapchainComposition' prior to calling this function.
+--
+--     SDL_GPU_PRESENTMODE_VSYNC with SDL_GPU_SWAPCHAINCOMPOSITION_SDR is always supported.
+--
+--     [Returns]: true if successful, false on error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'windowSupportsGPUPresentMode', 'windowSupportsGPUSwapchainComposition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGPUSwapchainParameters@.
+--                   The safe flavor is 'setGPUSwapchainParametersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGPUSwapchainParameters@, defined at @SDL3\/SDL_gpu.h 4161:34@
+setGPUSwapchainParameters
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> SDL_GPUSwapchainComposition
+  -- ^
+  --
+  --           [@swapchain_composition@]: the desired composition of the swapchain.
+  -> SDL_GPUPresentMode
+  -- ^
+  --
+  --           [@present_mode@]: the desired present mode for the swapchain.
+  -> IO Bool
+setGPUSwapchainParameters =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_SetGPUSwapchainParameters x00 x11 x22 x33)
+
+-- | Changes the swapchain parameters for the given claimed window.
+--
+--     This function will fail if the requested present mode or swapchain composition are unsupported by the device. Check if the parameters are supported via 'windowSupportsGPUPresentMode' \/ 'windowSupportsGPUSwapchainComposition' prior to calling this function.
+--
+--     SDL_GPU_PRESENTMODE_VSYNC with SDL_GPU_SWAPCHAINCOMPOSITION_SDR is always supported.
+--
+--     [Returns]: true if successful, false on error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'windowSupportsGPUPresentMode', 'windowSupportsGPUSwapchainComposition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGPUSwapchainParameters@.
+--                   The unsafe flavor is 'setGPUSwapchainParameters'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGPUSwapchainParameters@, defined at @SDL3\/SDL_gpu.h 4161:34@
+setGPUSwapchainParametersSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> SDL_GPUSwapchainComposition
+  -- ^
+  --
+  --           [@swapchain_composition@]: the desired composition of the swapchain.
+  -> SDL_GPUPresentMode
+  -- ^
+  --
+  --           [@present_mode@]: the desired present mode for the swapchain.
+  -> IO Bool
+setGPUSwapchainParametersSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_SetGPUSwapchainParameters x00 x11 x22 x33)
+
+-- | Configures the maximum allowed number of frames in flight.
+--
+--     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 working on the first frame, @'acquireGPUSwapchainTexture'@ will fill the swapchain texture pointer with NULL, and @'waitAndAcquireGPUSwapchainTexture'@ will block.
+--
+--     Higher values increase throughput at the expense of visual latency. Lower values decrease visual latency at the expense of throughput.
+--
+--     Note that calling this function will stall and flush the command queue to prevent synchronization issues.
+--
+--     The minimum value of allowed frames in flight is 1, and the maximum is 3.
+--
+--     [Returns]: true if successful, false on error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGPUAllowedFramesInFlight@.
+--                   The safe flavor is 'setGPUAllowedFramesInFlightSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGPUAllowedFramesInFlight@, defined at @SDL3\/SDL_gpu.h 4192:34@
+setGPUAllowedFramesInFlight
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@allowed_frames_in_flight@]: the maximum number of frames that can be pending on the GPU.
+  -> IO Bool
+setGPUAllowedFramesInFlight =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetGPUAllowedFramesInFlight x00 (Coerce.coerce x11))
+
+-- | Configures the maximum allowed number of frames in flight.
+--
+--     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 working on the first frame, @'acquireGPUSwapchainTexture'@ will fill the swapchain texture pointer with NULL, and @'waitAndAcquireGPUSwapchainTexture'@ will block.
+--
+--     Higher values increase throughput at the expense of visual latency. Lower values decrease visual latency at the expense of throughput.
+--
+--     Note that calling this function will stall and flush the command queue to prevent synchronization issues.
+--
+--     The minimum value of allowed frames in flight is 1, and the maximum is 3.
+--
+--     [Returns]: true if successful, false on error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGPUAllowedFramesInFlight@.
+--                   The unsafe flavor is 'setGPUAllowedFramesInFlight'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGPUAllowedFramesInFlight@, defined at @SDL3\/SDL_gpu.h 4192:34@
+setGPUAllowedFramesInFlightSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@allowed_frames_in_flight@]: the maximum number of frames that can be pending on the GPU.
+  -> IO Bool
+setGPUAllowedFramesInFlightSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetGPUAllowedFramesInFlight x00 (Coerce.coerce x11))
+
+-- | Obtains the texture format of the swapchain for the given window.
+--
+--     Note that this format can change if the swapchain parameters change.
+--
+--     [Returns]: the texture format of the swapchain.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGPUSwapchainTextureFormat@.
+--                   The safe flavor is 'getGPUSwapchainTextureFormatSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPUSwapchainTextureFormat@, defined at @SDL3\/SDL_gpu.h 4207:50@
+getGPUSwapchainTextureFormat
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> IO SDL_GPUTextureFormat
+getGPUSwapchainTextureFormat =
+  Unsafe.sDL_GetGPUSwapchainTextureFormat
+
+-- | Obtains the texture format of the swapchain for the given window.
+--
+--     Note that this format can change if the swapchain parameters change.
+--
+--     [Returns]: the texture format of the swapchain.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGPUSwapchainTextureFormat@.
+--                   The unsafe flavor is 'getGPUSwapchainTextureFormat'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPUSwapchainTextureFormat@, defined at @SDL3\/SDL_gpu.h 4207:50@
+getGPUSwapchainTextureFormatSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: an SDL_Window that has been claimed.
+  -> IO SDL_GPUTextureFormat
+getGPUSwapchainTextureFormatSafe =
+  Safe.sDL_GetGPUSwapchainTextureFormat
+
+-- | Acquire a texture to use in presentation.
+--
+--     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 buffer used to acquire it.
+--
+--     This function will fill the swapchain texture handle with NULL if too many 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.
+--
+--     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 @'waitAndAcquireGPUSwapchainTexture'@ unless you know what you are doing with timing.
+--
+--     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.
+--
+--     [Returns]: true on success, false on error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'claimWindowForGPUDevice', 'submitGPUCommandBuffer', 'submitGPUCommandBufferAndAcquireFence', 'cancelGPUCommandBuffer', 'SDL3.Sys.Video.getWindowSizeInPixels', 'waitForGPUSwapchain', 'waitAndAcquireGPUSwapchainTexture', 'setGPUAllowedFramesInFlight'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AcquireGPUSwapchainTexture@.
+--                   The safe flavor is 'acquireGPUSwapchainTextureSafe'
+--                   : can block on swapchain availability.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AcquireGPUSwapchainTexture@, defined at @SDL3\/SDL_gpu.h 4259:34@
+acquireGPUSwapchainTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@swapchain_texture@]: a pointer filled in with a swapchain texture handle.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_width@]: a pointer filled in with the swapchain texture width, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_height@]: a pointer filled in with the swapchain texture height, may be NULL.
+  -> IO Bool
+acquireGPUSwapchainTexture =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_AcquireGPUSwapchainTexture x00 x11 x22 x33 x44)
+
+-- | Acquire a texture to use in presentation.
+--
+--     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 buffer used to acquire it.
+--
+--     This function will fill the swapchain texture handle with NULL if too many 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.
+--
+--     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 @'waitAndAcquireGPUSwapchainTexture'@ unless you know what you are doing with timing.
+--
+--     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.
+--
+--     [Returns]: true on success, false on error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'claimWindowForGPUDevice', 'submitGPUCommandBuffer', 'submitGPUCommandBufferAndAcquireFence', 'cancelGPUCommandBuffer', 'SDL3.Sys.Video.getWindowSizeInPixels', 'waitForGPUSwapchain', 'waitAndAcquireGPUSwapchainTexture', 'setGPUAllowedFramesInFlight'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AcquireGPUSwapchainTexture@.
+--                   The unsafe flavor is 'acquireGPUSwapchainTexture'
+--                   : can block on swapchain availability.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AcquireGPUSwapchainTexture@, defined at @SDL3\/SDL_gpu.h 4259:34@
+acquireGPUSwapchainTextureSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@swapchain_texture@]: a pointer filled in with a swapchain texture handle.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_width@]: a pointer filled in with the swapchain texture width, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_height@]: a pointer filled in with the swapchain texture height, may be NULL.
+  -> IO Bool
+acquireGPUSwapchainTextureSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_AcquireGPUSwapchainTexture x00 x11 x22 x33 x44)
+
+-- | Blocks the thread until a swapchain texture is available to be acquired.
+--
+--     [Returns]: true on success, false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'acquireGPUSwapchainTexture', 'waitAndAcquireGPUSwapchainTexture', 'setGPUAllowedFramesInFlight'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitForGPUSwapchain@.
+--                   The safe flavor is 'waitForGPUSwapchainSafe'
+--                   : blocks until the swapchain is available.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitForGPUSwapchain@, defined at @SDL3\/SDL_gpu.h 4283:34@
+waitForGPUSwapchain
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> IO Bool
+waitForGPUSwapchain =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WaitForGPUSwapchain x00 x11)
+
+-- | Blocks the thread until a swapchain texture is available to be acquired.
+--
+--     [Returns]: true on success, false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'acquireGPUSwapchainTexture', 'waitAndAcquireGPUSwapchainTexture', 'setGPUAllowedFramesInFlight'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitForGPUSwapchain@.
+--                   The unsafe flavor is 'waitForGPUSwapchain'
+--                   : blocks until the swapchain is available.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitForGPUSwapchain@, defined at @SDL3\/SDL_gpu.h 4283:34@
+waitForGPUSwapchainSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> IO Bool
+waitForGPUSwapchainSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WaitForGPUSwapchain x00 x11)
+
+-- | Blocks the thread until a swapchain texture is available to be acquired, and then acquires it.
+--
+--     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 buffer used to acquire it. It is an error to call @'cancelGPUCommandBuffer'@ after a swapchain texture is acquired.
+--
+--     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.
+--
+--     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.
+--
+--     The swapchain texture is write-only and cannot be used as a sampler or for another reading operation.
+--
+--     [Returns]: true on success, false on error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'submitGPUCommandBuffer', 'submitGPUCommandBufferAndAcquireFence', 'acquireGPUSwapchainTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitAndAcquireGPUSwapchainTexture@.
+--                   The safe flavor is 'waitAndAcquireGPUSwapchainTextureSafe'
+--                   : blocks until a swapchain texture is available.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitAndAcquireGPUSwapchainTexture@, defined at @SDL3\/SDL_gpu.h 4329:34@
+waitAndAcquireGPUSwapchainTexture
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@swapchain_texture@]: a pointer filled in with a swapchain texture handle.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_width@]: a pointer filled in with the swapchain texture width, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_height@]: a pointer filled in with the swapchain texture height, may be NULL.
+  -> IO Bool
+waitAndAcquireGPUSwapchainTexture =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_WaitAndAcquireGPUSwapchainTexture x00 x11 x22 x33 x44)
+
+-- | Blocks the thread until a swapchain texture is available to be acquired, and then acquires it.
+--
+--     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 buffer used to acquire it. It is an error to call @'cancelGPUCommandBuffer'@ after a swapchain texture is acquired.
+--
+--     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.
+--
+--     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.
+--
+--     The swapchain texture is write-only and cannot be used as a sampler or for another reading operation.
+--
+--     [Returns]: true on success, false on error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called from the thread that created the window.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'submitGPUCommandBuffer', 'submitGPUCommandBufferAndAcquireFence', 'acquireGPUSwapchainTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitAndAcquireGPUSwapchainTexture@.
+--                   The unsafe flavor is 'waitAndAcquireGPUSwapchainTexture'
+--                   : blocks until a swapchain texture is available.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitAndAcquireGPUSwapchainTexture@, defined at @SDL3\/SDL_gpu.h 4329:34@
+waitAndAcquireGPUSwapchainTextureSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: a window that has been claimed.
+  -> BG.Ptr (BG.Ptr SDL_GPUTexture)
+  -- ^
+  --
+  --           [@swapchain_texture@]: a pointer filled in with a swapchain texture handle.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_width@]: a pointer filled in with the swapchain texture width, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@swapchain_texture_height@]: a pointer filled in with the swapchain texture height, may be NULL.
+  -> IO Bool
+waitAndAcquireGPUSwapchainTextureSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_WaitAndAcquireGPUSwapchainTexture x00 x11 x22 x33 x44)
+
+-- | Submits a command buffer so its commands can be processed on the GPU.
+--
+--     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.
+--
+--     All commands in the submission are guaranteed to begin executing before any command in a subsequent submission begins executing.
+--
+--     [Returns]: true on success, false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'acquireGPUCommandBuffer', 'waitAndAcquireGPUSwapchainTexture', 'acquireGPUSwapchainTexture', 'submitGPUCommandBufferAndAcquireFence'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SubmitGPUCommandBuffer@.
+--                   The safe flavor is 'submitGPUCommandBufferSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SubmitGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 4357:34@
+submitGPUCommandBuffer
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO Bool
+submitGPUCommandBuffer =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_SubmitGPUCommandBuffer x00)
+
+-- | Submits a command buffer so its commands can be processed on the GPU.
+--
+--     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.
+--
+--     All commands in the submission are guaranteed to begin executing before any command in a subsequent submission begins executing.
+--
+--     [Returns]: true on success, false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'acquireGPUCommandBuffer', 'waitAndAcquireGPUSwapchainTexture', 'acquireGPUSwapchainTexture', 'submitGPUCommandBufferAndAcquireFence'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SubmitGPUCommandBuffer@.
+--                   The unsafe flavor is 'submitGPUCommandBuffer'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SubmitGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 4357:34@
+submitGPUCommandBufferSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO Bool
+submitGPUCommandBufferSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_SubmitGPUCommandBuffer x00)
+
+-- | 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.
+--
+--     This must be called from the thread the command buffer was acquired on.
+--
+--     All commands in the submission are guaranteed to begin executing before any command in a subsequent submission begins executing.
+--
+--     [Returns]: a fence associated with the command buffer, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'acquireGPUCommandBuffer', 'waitAndAcquireGPUSwapchainTexture', 'acquireGPUSwapchainTexture', 'submitGPUCommandBuffer', 'releaseGPUFence'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SubmitGPUCommandBufferAndAcquireFence@.
+--                   The safe flavor is 'submitGPUCommandBufferAndAcquireFenceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SubmitGPUCommandBufferAndAcquireFence@, defined at @SDL3\/SDL_gpu.h 4384:44@
+submitGPUCommandBufferAndAcquireFence
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO (BG.Ptr SDL_GPUFence)
+submitGPUCommandBufferAndAcquireFence =
+  Unsafe.sDL_SubmitGPUCommandBufferAndAcquireFence
+
+-- | 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.
+--
+--     This must be called from the thread the command buffer was acquired on.
+--
+--     All commands in the submission are guaranteed to begin executing before any command in a subsequent submission begins executing.
+--
+--     [Returns]: a fence associated with the command buffer, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'acquireGPUCommandBuffer', 'waitAndAcquireGPUSwapchainTexture', 'acquireGPUSwapchainTexture', 'submitGPUCommandBuffer', 'releaseGPUFence'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SubmitGPUCommandBufferAndAcquireFence@.
+--                   The unsafe flavor is 'submitGPUCommandBufferAndAcquireFence'
+--                   .
+--
+--     [C declaration]: @SDL_SubmitGPUCommandBufferAndAcquireFence@, defined at @SDL3\/SDL_gpu.h 4384:44@
+submitGPUCommandBufferAndAcquireFenceSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO (BG.Ptr SDL_GPUFence)
+submitGPUCommandBufferAndAcquireFenceSafe =
+  Safe.sDL_SubmitGPUCommandBufferAndAcquireFence
+
+-- | Cancels a command buffer.
+--
+--     None of the enqueued commands are executed.
+--
+--     It is an error to call this function after a swapchain texture has been acquired.
+--
+--     This must be called from the thread the command buffer was acquired on.
+--
+--     You must not reference the command buffer after calling this function.
+--
+--     [Returns]: true on success, false on error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'waitAndAcquireGPUSwapchainTexture', 'acquireGPUCommandBuffer', 'acquireGPUSwapchainTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CancelGPUCommandBuffer@.
+--                   The safe flavor is 'cancelGPUCommandBufferSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CancelGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 4409:34@
+cancelGPUCommandBuffer
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO Bool
+cancelGPUCommandBuffer =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_CancelGPUCommandBuffer x00)
+
+-- | Cancels a command buffer.
+--
+--     None of the enqueued commands are executed.
+--
+--     It is an error to call this function after a swapchain texture has been acquired.
+--
+--     This must be called from the thread the command buffer was acquired on.
+--
+--     You must not reference the command buffer after calling this function.
+--
+--     [Returns]: true on success, false on error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'waitAndAcquireGPUSwapchainTexture', 'acquireGPUCommandBuffer', 'acquireGPUSwapchainTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CancelGPUCommandBuffer@.
+--                   The unsafe flavor is 'cancelGPUCommandBuffer'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CancelGPUCommandBuffer@, defined at @SDL3\/SDL_gpu.h 4409:34@
+cancelGPUCommandBufferSafe
+  :: BG.Ptr SDL_GPUCommandBuffer
+  -- ^
+  --
+  --           [@command_buffer@]: a command buffer.
+  -> IO Bool
+cancelGPUCommandBufferSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_CancelGPUCommandBuffer x00)
+
+-- | Blocks the thread until the GPU is completely idle.
+--
+--     [Returns]: true on success, false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'waitForGPUFences'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitForGPUIdle@.
+--                   The safe flavor is 'waitForGPUIdleSafe'
+--                   : blocks until the GPU is idle.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitForGPUIdle@, defined at @SDL3\/SDL_gpu.h 4423:34@
+waitForGPUIdle
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> IO Bool
+waitForGPUIdle =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_WaitForGPUIdle x00)
+
+-- | Blocks the thread until the GPU is completely idle.
+--
+--     [Returns]: true on success, false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'waitForGPUFences'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitForGPUIdle@.
+--                   The unsafe flavor is 'waitForGPUIdle'
+--                   : blocks until the GPU is idle.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitForGPUIdle@, defined at @SDL3\/SDL_gpu.h 4423:34@
+waitForGPUIdleSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> IO Bool
+waitForGPUIdleSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_WaitForGPUIdle x00)
+
+-- | Blocks the thread until the given fences are signaled.
+--
+--     [Returns]: true on success, false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'submitGPUCommandBufferAndAcquireFence', 'waitForGPUIdle'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitForGPUFences@.
+--                   The safe flavor is 'waitForGPUFencesSafe'
+--                   : blocks on fences.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitForGPUFences@, defined at @SDL3\/SDL_gpu.h 4442:34@
+waitForGPUFences
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> Bool
+  -- ^
+  --
+  --           [@wait_all@]: if 0, wait for any fence to be signaled, if 1, wait for all fences to be signaled.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUFence)
+  -- ^
+  --
+  --           [@fences@]: an array of fences to wait on.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_fences@]: the number of fences in the fences array.
+  -> IO Bool
+waitForGPUFences =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_WaitForGPUFences x00 (CBool.fromBool x11) x22 (Coerce.coerce x33))
+
+-- | Blocks the thread until the given fences are signaled.
+--
+--     [Returns]: true on success, false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'submitGPUCommandBufferAndAcquireFence', 'waitForGPUIdle'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitForGPUFences@.
+--                   The unsafe flavor is 'waitForGPUFences'
+--                   : blocks on fences.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitForGPUFences@, defined at @SDL3\/SDL_gpu.h 4442:34@
+waitForGPUFencesSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> Bool
+  -- ^
+  --
+  --           [@wait_all@]: if 0, wait for any fence to be signaled, if 1, wait for all fences to be signaled.
+  -> PtrConst.PtrConst (BG.Ptr SDL_GPUFence)
+  -- ^
+  --
+  --           [@fences@]: an array of fences to wait on.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@num_fences@]: the number of fences in the fences array.
+  -> IO Bool
+waitForGPUFencesSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_WaitForGPUFences x00 (CBool.fromBool x11) x22 (Coerce.coerce x33))
+
+-- | Checks the status of a fence.
+--
+--     [Returns]: true if the fence is signaled, false if it is not.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'submitGPUCommandBufferAndAcquireFence'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_QueryGPUFence@.
+--                   The safe flavor is 'queryGPUFenceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_QueryGPUFence@, defined at @SDL3\/SDL_gpu.h 4459:34@
+queryGPUFence
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUFence
+  -- ^
+  --
+  --           [@fence@]: a fence.
+  -> IO Bool
+queryGPUFence =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_QueryGPUFence x00 x11)
+
+-- | Checks the status of a fence.
+--
+--     [Returns]: true if the fence is signaled, false if it is not.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'submitGPUCommandBufferAndAcquireFence'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_QueryGPUFence@.
+--                   The unsafe flavor is 'queryGPUFence'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_QueryGPUFence@, defined at @SDL3\/SDL_gpu.h 4459:34@
+queryGPUFenceSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUFence
+  -- ^
+  --
+  --           [@fence@]: a fence.
+  -> IO Bool
+queryGPUFenceSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_QueryGPUFence x00 x11)
+
+-- | Releases a fence obtained from 'submitGPUCommandBufferAndAcquireFence'.
+--
+--     You must not reference the fence after calling this function.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'submitGPUCommandBufferAndAcquireFence'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReleaseGPUFence@.
+--                   The safe flavor is 'releaseGPUFenceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUFence@, defined at @SDL3\/SDL_gpu.h 4475:34@
+releaseGPUFence
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUFence
+  -- ^
+  --
+  --           [@fence@]: a fence.
+  -> IO ()
+releaseGPUFence = Unsafe.sDL_ReleaseGPUFence
+
+-- | Releases a fence obtained from 'submitGPUCommandBufferAndAcquireFence'.
+--
+--     You must not reference the fence after calling this function.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'submitGPUCommandBufferAndAcquireFence'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReleaseGPUFence@.
+--                   The unsafe flavor is 'releaseGPUFence'
+--                   .
+--
+--     [C declaration]: @SDL_ReleaseGPUFence@, defined at @SDL3\/SDL_gpu.h 4475:34@
+releaseGPUFenceSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> BG.Ptr SDL_GPUFence
+  -- ^
+  --
+  --           [@fence@]: a fence.
+  -> IO ()
+releaseGPUFenceSafe = Safe.sDL_ReleaseGPUFence
+
+-- | Obtains the texel block size for a texture format.
+--
+--     [Returns]: the texel block size of the texture format.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'uploadToGPUTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GPUTextureFormatTexelBlockSize@.
+--                   The safe flavor is 'gpuTextureFormatTexelBlockSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GPUTextureFormatTexelBlockSize@, defined at @SDL3\/SDL_gpu.h 4491:36@
+gpuTextureFormatTexelBlockSize
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format you want to know the texel size of.
+  -> IO BG.Word32
+gpuTextureFormatTexelBlockSize =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GPUTextureFormatTexelBlockSize x00)
+
+-- | Obtains the texel block size for a texture format.
+--
+--     [Returns]: the texel block size of the texture format.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'uploadToGPUTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GPUTextureFormatTexelBlockSize@.
+--                   The unsafe flavor is 'gpuTextureFormatTexelBlockSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GPUTextureFormatTexelBlockSize@, defined at @SDL3\/SDL_gpu.h 4491:36@
+gpuTextureFormatTexelBlockSizeSafe
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format you want to know the texel size of.
+  -> IO BG.Word32
+gpuTextureFormatTexelBlockSizeSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GPUTextureFormatTexelBlockSize x00)
+
+-- | Determines whether a texture format is supported for a given type and usage.
+--
+--     [Returns]: whether the texture format is supported for this type and usage.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GPUTextureSupportsFormat@.
+--                   The safe flavor is 'gpuTextureSupportsFormatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GPUTextureSupportsFormat@, defined at @SDL3\/SDL_gpu.h 4506:34@
+gpuTextureSupportsFormat
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format to check.
+  -> SDL_GPUTextureType
+  -- ^
+  --
+  --           [@type@]: the type of texture (2D, 3D, Cube).
+  -> SDL_GPUTextureUsageFlags
+  -- ^
+  --
+  --           [@usage@]: a bitmask of all usage scenarios to check.
+  -> IO Bool
+gpuTextureSupportsFormat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_GPUTextureSupportsFormat x00 x11 x22 x33)
+
+-- | Determines whether a texture format is supported for a given type and usage.
+--
+--     [Returns]: whether the texture format is supported for this type and usage.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GPUTextureSupportsFormat@.
+--                   The unsafe flavor is 'gpuTextureSupportsFormat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GPUTextureSupportsFormat@, defined at @SDL3\/SDL_gpu.h 4506:34@
+gpuTextureSupportsFormatSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format to check.
+  -> SDL_GPUTextureType
+  -- ^
+  --
+  --           [@type@]: the type of texture (2D, 3D, Cube).
+  -> SDL_GPUTextureUsageFlags
+  -- ^
+  --
+  --           [@usage@]: a bitmask of all usage scenarios to check.
+  -> IO Bool
+gpuTextureSupportsFormatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_GPUTextureSupportsFormat x00 x11 x22 x33)
+
+-- | Determines if a sample count for a texture format is supported.
+--
+--     [Returns]: whether the sample count is supported for this texture format.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GPUTextureSupportsSampleCount@.
+--                   The safe flavor is 'gpuTextureSupportsSampleCountSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GPUTextureSupportsSampleCount@, defined at @SDL3\/SDL_gpu.h 4522:34@
+gpuTextureSupportsSampleCount
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format to check.
+  -> SDL_GPUSampleCount
+  -- ^
+  --
+  --           [@sample_count@]: the sample count to check.
+  -> IO Bool
+gpuTextureSupportsSampleCount =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GPUTextureSupportsSampleCount x00 x11 x22)
+
+-- | Determines if a sample count for a texture format is supported.
+--
+--     [Returns]: whether the sample count is supported for this texture format.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GPUTextureSupportsSampleCount@.
+--                   The unsafe flavor is 'gpuTextureSupportsSampleCount'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GPUTextureSupportsSampleCount@, defined at @SDL3\/SDL_gpu.h 4522:34@
+gpuTextureSupportsSampleCountSafe
+  :: BG.Ptr SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: a GPU context.
+  -> SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: the texture format to check.
+  -> SDL_GPUSampleCount
+  -- ^
+  --
+  --           [@sample_count@]: the sample count to check.
+  -> IO Bool
+gpuTextureSupportsSampleCountSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GPUTextureSupportsSampleCount x00 x11 x22)
+
+-- | Calculate the size in bytes of a texture format with dimensions.
+--
+--     [Returns]: the size of a texture with this format and dimensions.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CalculateGPUTextureFormatSize@.
+--                   The safe flavor is 'calculateGPUTextureFormatSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CalculateGPUTextureFormatSize@, defined at @SDL3\/SDL_gpu.h 4538:36@
+calculateGPUTextureFormatSize
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: a texture format.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@width@]: width in pixels.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@height@]: height in pixels.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@depth_or_layer_count@]: depth for 3D textures or layer count otherwise.
+  -> IO BG.Word32
+calculateGPUTextureFormatSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            Coerce.coerce
+            ( Unsafe.sDL_CalculateGPUTextureFormatSize
+                x00
+                (Coerce.coerce x11)
+                (Coerce.coerce x22)
+                (Coerce.coerce x33)
+            )
+
+-- | Calculate the size in bytes of a texture format with dimensions.
+--
+--     [Returns]: the size of a texture with this format and dimensions.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CalculateGPUTextureFormatSize@.
+--                   The unsafe flavor is 'calculateGPUTextureFormatSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CalculateGPUTextureFormatSize@, defined at @SDL3\/SDL_gpu.h 4538:36@
+calculateGPUTextureFormatSizeSafe
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: a texture format.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@width@]: width in pixels.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@height@]: height in pixels.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@depth_or_layer_count@]: depth for 3D textures or layer count otherwise.
+  -> IO BG.Word32
+calculateGPUTextureFormatSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            Coerce.coerce
+            ( Safe.sDL_CalculateGPUTextureFormatSize
+                x00
+                (Coerce.coerce x11)
+                (Coerce.coerce x22)
+                (Coerce.coerce x33)
+            )
+
+-- | Get the SDL pixel format corresponding to a GPU texture format.
+--
+--     [Returns]: the corresponding pixel format, or SDL_PIXELFORMAT_UNKNOWN if there is no corresponding pixel format.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPixelFormatFromGPUTextureFormat@.
+--                   The safe flavor is 'getPixelFormatFromGPUTextureFormatSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPixelFormatFromGPUTextureFormat@, defined at @SDL3\/SDL_gpu.h 4553:45@
+getPixelFormatFromGPUTextureFormat
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: a texture format.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+getPixelFormatFromGPUTextureFormat =
+  Unsafe.sDL_GetPixelFormatFromGPUTextureFormat
+
+-- | Get the SDL pixel format corresponding to a GPU texture format.
+--
+--     [Returns]: the corresponding pixel format, or SDL_PIXELFORMAT_UNKNOWN if there is no corresponding pixel format.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPixelFormatFromGPUTextureFormat@.
+--                   The unsafe flavor is 'getPixelFormatFromGPUTextureFormat'
+--                   .
+--
+--     [C declaration]: @SDL_GetPixelFormatFromGPUTextureFormat@, defined at @SDL3\/SDL_gpu.h 4553:45@
+getPixelFormatFromGPUTextureFormatSafe
+  :: SDL_GPUTextureFormat
+  -- ^
+  --
+  --           [@format@]: a texture format.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+getPixelFormatFromGPUTextureFormatSafe =
+  Safe.sDL_GetPixelFormatFromGPUTextureFormat
+
+-- | Get the GPU texture format corresponding to an SDL pixel format.
+--
+--     [Returns]: the corresponding GPU texture format, or SDL_GPU_TEXTUREFORMAT_INVALID if there is no corresponding GPU texture format.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGPUTextureFormatFromPixelFormat@.
+--                   The safe flavor is 'getGPUTextureFormatFromPixelFormatSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPUTextureFormatFromPixelFormat@, defined at @SDL3\/SDL_gpu.h 4565:50@
+getGPUTextureFormatFromPixelFormat
+  :: SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: a pixel format.
+  -> IO SDL_GPUTextureFormat
+getGPUTextureFormatFromPixelFormat =
+  Unsafe.sDL_GetGPUTextureFormatFromPixelFormat
+
+-- | Get the GPU texture format corresponding to an SDL pixel format.
+--
+--     [Returns]: the corresponding GPU texture format, or SDL_GPU_TEXTUREFORMAT_INVALID if there is no corresponding GPU texture format.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGPUTextureFormatFromPixelFormat@.
+--                   The unsafe flavor is 'getGPUTextureFormatFromPixelFormat'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPUTextureFormatFromPixelFormat@, defined at @SDL3\/SDL_gpu.h 4565:50@
+getGPUTextureFormatFromPixelFormatSafe
+  :: SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: a pixel format.
+  -> IO SDL_GPUTextureFormat
+getGPUTextureFormatFromPixelFormatSafe =
+  Safe.sDL_GetGPUTextureFormatFromPixelFormat
+
+-- | Typed constant for macro @SDL_GPU_BUFFERUSAGE_VERTEX@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_BUFFERUSAGE_VERTEX :: SDL_GPUBufferUsageFlags
+pattern SDL_GPU_BUFFERUSAGE_VERTEX = SDL_GPUBufferUsageFlags 0x00000001
+
+-- | Typed constant for macro @SDL_GPU_BUFFERUSAGE_INDEX@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_BUFFERUSAGE_INDEX :: SDL_GPUBufferUsageFlags
+pattern SDL_GPU_BUFFERUSAGE_INDEX = SDL_GPUBufferUsageFlags 0x00000002
+
+-- | Typed constant for macro @SDL_GPU_BUFFERUSAGE_INDIRECT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_BUFFERUSAGE_INDIRECT :: SDL_GPUBufferUsageFlags
+pattern SDL_GPU_BUFFERUSAGE_INDIRECT = SDL_GPUBufferUsageFlags 0x00000004
+
+-- | Typed constant for macro @SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ :: SDL_GPUBufferUsageFlags
+pattern SDL_GPU_BUFFERUSAGE_GRAPHICS_STORAGE_READ = SDL_GPUBufferUsageFlags 0x00000008
+
+-- | Typed constant for macro @SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ :: SDL_GPUBufferUsageFlags
+pattern SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_READ = SDL_GPUBufferUsageFlags 0x00000010
+
+-- | Typed constant for macro @SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE :: SDL_GPUBufferUsageFlags
+pattern SDL_GPU_BUFFERUSAGE_COMPUTE_STORAGE_WRITE = SDL_GPUBufferUsageFlags 0x00000020
+
+-- | Typed constant for macro @SDL_GPU_COLORCOMPONENT_R@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_COLORCOMPONENT_R :: SDL_GPUColorComponentFlags
+pattern SDL_GPU_COLORCOMPONENT_R = SDL_GPUColorComponentFlags 0x01
+
+-- | Typed constant for macro @SDL_GPU_COLORCOMPONENT_G@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_COLORCOMPONENT_G :: SDL_GPUColorComponentFlags
+pattern SDL_GPU_COLORCOMPONENT_G = SDL_GPUColorComponentFlags 0x02
+
+-- | Typed constant for macro @SDL_GPU_COLORCOMPONENT_B@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_COLORCOMPONENT_B :: SDL_GPUColorComponentFlags
+pattern SDL_GPU_COLORCOMPONENT_B = SDL_GPUColorComponentFlags 0x04
+
+-- | Typed constant for macro @SDL_GPU_COLORCOMPONENT_A@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_COLORCOMPONENT_A :: SDL_GPUColorComponentFlags
+pattern SDL_GPU_COLORCOMPONENT_A = SDL_GPUColorComponentFlags 0x08
+
+-- | Typed constant for macro @SDL_GPU_SHADERFORMAT_INVALID@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_SHADERFORMAT_INVALID :: SDL_GPUShaderFormat
+pattern SDL_GPU_SHADERFORMAT_INVALID = SDL_GPUShaderFormat 0x00000000
+
+-- | Typed constant for macro @SDL_GPU_SHADERFORMAT_PRIVATE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_SHADERFORMAT_PRIVATE :: SDL_GPUShaderFormat
+pattern SDL_GPU_SHADERFORMAT_PRIVATE = SDL_GPUShaderFormat 0x00000001
+
+-- | Typed constant for macro @SDL_GPU_SHADERFORMAT_SPIRV@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_SHADERFORMAT_SPIRV :: SDL_GPUShaderFormat
+pattern SDL_GPU_SHADERFORMAT_SPIRV = SDL_GPUShaderFormat 0x00000002
+
+-- | Typed constant for macro @SDL_GPU_SHADERFORMAT_DXBC@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_SHADERFORMAT_DXBC :: SDL_GPUShaderFormat
+pattern SDL_GPU_SHADERFORMAT_DXBC = SDL_GPUShaderFormat 0x00000004
+
+-- | Typed constant for macro @SDL_GPU_SHADERFORMAT_DXIL@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_SHADERFORMAT_DXIL :: SDL_GPUShaderFormat
+pattern SDL_GPU_SHADERFORMAT_DXIL = SDL_GPUShaderFormat 0x00000008
+
+-- | Typed constant for macro @SDL_GPU_SHADERFORMAT_MSL@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_SHADERFORMAT_MSL :: SDL_GPUShaderFormat
+pattern SDL_GPU_SHADERFORMAT_MSL = SDL_GPUShaderFormat 0x00000010
+
+-- | Typed constant for macro @SDL_GPU_SHADERFORMAT_METALLIB@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_SHADERFORMAT_METALLIB :: SDL_GPUShaderFormat
+pattern SDL_GPU_SHADERFORMAT_METALLIB = SDL_GPUShaderFormat 0x00000020
+
+-- | Typed constant for macro @SDL_GPU_TEXTUREUSAGE_SAMPLER@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_TEXTUREUSAGE_SAMPLER :: SDL_GPUTextureUsageFlags
+pattern SDL_GPU_TEXTUREUSAGE_SAMPLER = SDL_GPUTextureUsageFlags 0x00000001
+
+-- | Typed constant for macro @SDL_GPU_TEXTUREUSAGE_COLOR_TARGET@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_TEXTUREUSAGE_COLOR_TARGET :: SDL_GPUTextureUsageFlags
+pattern SDL_GPU_TEXTUREUSAGE_COLOR_TARGET = SDL_GPUTextureUsageFlags 0x00000002
+
+-- | Typed constant for macro @SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET :: SDL_GPUTextureUsageFlags
+pattern SDL_GPU_TEXTUREUSAGE_DEPTH_STENCIL_TARGET = SDL_GPUTextureUsageFlags 0x00000004
+
+-- | Typed constant for macro @SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ :: SDL_GPUTextureUsageFlags
+pattern SDL_GPU_TEXTUREUSAGE_GRAPHICS_STORAGE_READ = SDL_GPUTextureUsageFlags 0x00000008
+
+-- | Typed constant for macro @SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ :: SDL_GPUTextureUsageFlags
+pattern SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_READ = SDL_GPUTextureUsageFlags 0x00000010
+
+-- | Typed constant for macro @SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE :: SDL_GPUTextureUsageFlags
+pattern SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_WRITE = SDL_GPUTextureUsageFlags 0x00000020
+
+-- | Typed constant for macro @SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE :: SDL_GPUTextureUsageFlags
+pattern SDL_GPU_TEXTUREUSAGE_COMPUTE_STORAGE_SIMULTANEOUS_READ_WRITE = SDL_GPUTextureUsageFlags 0x00000040
diff --git a/src/SDL3/Sys/Guid.hs b/src/SDL3/Sys/Guid.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Guid.hs
@@ -0,0 +1,166 @@
+-- | A GUID is a 128-bit value that represents something that is uniquely identifiable by this value: \"globally unique.\"
+--
+--     SDL provides functions to convert a GUID to\/from a string. An 'SDL_GUID' is a 128-bit identifier for an input device that identifies that device across runs of SDL programs on the same platform.
+--
+--     If the device is detached and then re-attached to a different port, or if the base system is rebooted, the device should still report the same GUID.
+--
+--     GUIDs are as precise as possible but are not guaranteed to distinguish physically distinct but equivalent devices. For example, two game controllers from the same vendor with the same product ID and revision may have the same GUID.
+--
+--     GUIDs may be platform-dependent (i.e., the same device may report different GUIDs on different operating systems).
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Guid.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Guid (
+  module SDL3.Sys.Bindgen.Guid,
+
+  -- * Function aliases
+  SDL3.Sys.Guid.guidToString,
+  SDL3.Sys.Guid.guidToStringSafe,
+  SDL3.Sys.Guid.stringToGUID,
+  SDL3.Sys.Guid.stringToGUIDSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Guid
+import SDL3.Sys.Bindgen.Guid.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Guid.Unsafe qualified as Unsafe
+
+-- | Get an ASCII string representation for a given 'SDL_GUID'.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'stringToGUID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GUIDToString@.
+--                   The safe flavor is 'guidToStringSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GUIDToString@, defined at @SDL3\/SDL_guid.h 80:34@
+guidToString
+  :: SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: the 'SDL_GUID' you wish to convert to string.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@pszGUID@]: buffer in which to write the ASCII string.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@cbGUID@]: the size of pszGUID, should be at least 33 bytes.
+  -> IO ()
+guidToString =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_GUIDToString x00 x11 (Coerce.coerce x22)
+
+-- | Get an ASCII string representation for a given 'SDL_GUID'.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'stringToGUID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GUIDToString@.
+--                   The unsafe flavor is 'guidToString'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GUIDToString@, defined at @SDL3\/SDL_guid.h 80:34@
+guidToStringSafe
+  :: SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: the 'SDL_GUID' you wish to convert to string.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@pszGUID@]: buffer in which to write the ASCII string.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@cbGUID@]: the size of pszGUID, should be at least 33 bytes.
+  -> IO ()
+guidToStringSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_GUIDToString x00 x11 (Coerce.coerce x22)
+
+-- | Convert a GUID string into a 'SDL_GUID' structure.
+--
+--     Performs no error checking. If this function is given a string containing an invalid GUID, the function will silently succeed, but the GUID generated will not be useful.
+--
+--     [Returns]: a 'SDL_GUID' structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'guidToString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StringToGUID@.
+--                   The safe flavor is 'stringToGUIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_StringToGUID@, defined at @SDL3\/SDL_guid.h 98:38@
+stringToGUID
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pchGUID@]: string containing an ASCII representation of a GUID.
+  -> IO SDL_GUID
+stringToGUID = Unsafe.sDL_StringToGUID
+
+-- | Convert a GUID string into a 'SDL_GUID' structure.
+--
+--     Performs no error checking. If this function is given a string containing an invalid GUID, the function will silently succeed, but the GUID generated will not be useful.
+--
+--     [Returns]: a 'SDL_GUID' structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'guidToString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_StringToGUID@.
+--                   The unsafe flavor is 'stringToGUID'
+--                   .
+--
+--     [C declaration]: @SDL_StringToGUID@, defined at @SDL3\/SDL_guid.h 98:38@
+stringToGUIDSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pchGUID@]: string containing an ASCII representation of a GUID.
+  -> IO SDL_GUID
+stringToGUIDSafe = Safe.sDL_StringToGUID
diff --git a/src/SDL3/Sys/Haptic.hs b/src/SDL3/Sys/Haptic.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Haptic.hs
@@ -0,0 +1,2079 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | The SDL haptic subsystem manages haptic (force feedback) devices.
+--
+--     The basic usage is as follows:
+--
+--     * Initialize the subsystem (SDL_INIT_HAPTIC).
+--
+--     * Open a haptic device.
+--
+--     * @'openHaptic'@ to open from index.
+--
+--     * @'openHapticFromJoystick'@ to open from an existing joystick.
+--
+--     * Create an effect ('SDL_HapticEffect').
+--
+--     * Upload the effect with @'createHapticEffect'@.
+--
+--     * Run the effect with @'runHapticEffect'@.
+--
+--     * (optional) Free the effect with @'destroyHapticEffect'@.
+--
+--     * Close the haptic device with @'closeHaptic'@.
+--
+--     Simple rumble example:
+--
+--     @
+--     SDL_Haptic *haptic = NULL;
+--
+--     \/\/ Open the device
+--     SDL_HapticID *haptics = SDL_GetHaptics(NULL);
+--     if (haptics) {
+--         haptic = SDL_OpenHaptic(haptics[0]);
+--         SDL_free(haptics);
+--     }
+--     if (haptic == NULL)
+--        return;
+--
+--     \/\/ Initialize simple rumble
+--     if (!SDL_InitHapticRumble(haptic))
+--        return;
+--
+--     \/\/ Play effect at 50% strength for 2 seconds
+--     if (!SDL_PlayHapticRumble(haptic, 0.5, 2000))
+--        return;
+--     SDL_Delay(2000);
+--
+--     \/\/ Clean up
+--     SDL_CloseHaptic(haptic);
+--     @
+--
+--     Complete example:
+--
+--     @
+--     bool test_haptic(SDL_Joystick *joystick)
+--     {
+--        SDL_Haptic *haptic;
+--        SDL_HapticEffect effect;
+--        SDL_HapticEffectID effect_id;
+--
+--        \/\/ Open the device
+--        haptic = SDL_OpenHapticFromJoystick(joystick);
+--        if (haptic == NULL) return false; \/\/ Most likely joystick isn\'t haptic
+--
+--        \/\/ See if it can do sine waves
+--        if ((SDL_GetHapticFeatures(haptic) & SDL_HAPTIC_SINE)==0) {
+--           SDL_CloseHaptic(haptic); \/\/ No sine effect
+--           return false;
+--        }
+--
+--        \/\/ Create the effect
+--        SDL_memset(&effect, 0, sizeof(SDL_HapticEffect)); \/\/ 0 is safe default
+--        effect.type = SDL_HAPTIC_SINE;
+--        effect.periodic.direction.type = SDL_HAPTIC_POLAR; \/\/ Polar coordinates
+--        effect.periodic.direction.dir[0] = 18000; \/\/ Force comes from south
+--        effect.periodic.period = 1000; \/\/ 1000 ms
+--        effect.periodic.magnitude = 20000; \/\/ 20000\/32767 strength
+--        effect.periodic.length = 5000; \/\/ 5 seconds long
+--        effect.periodic.attack_length = 1000; \/\/ Takes 1 second to get max strength
+--        effect.periodic.fade_length = 1000; \/\/ Takes 1 second to fade away
+--
+--        \/\/ Upload the effect
+--        effect_id = SDL_CreateHapticEffect(haptic, &effect);
+--
+--        \/\/ Test the effect
+--        SDL_RunHapticEffect(haptic, effect_id, 1);
+--        SDL_Delay(5000); \/\/ Wait for the effect to finish
+--
+--        \/\/ We destroy the effect, although closing the device also does this
+--        SDL_DestroyHapticEffect(haptic, effect_id);
+--
+--        \/\/ Close the device
+--        SDL_CloseHaptic(haptic);
+--
+--        return true; \/\/ Success
+--     }
+--     @
+--
+--     Note that the SDL haptic subsystem is not thread-safe. The haptic structure used to identify an SDL haptic.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openHaptic', 'openHapticFromJoystick', 'closeHaptic'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Haptic.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Haptic (
+  module SDL3.Sys.Bindgen.Haptic,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_POLAR,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_CARTESIAN,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_SPHERICAL,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_STEERING_AXIS,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_CONSTANT,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_SINE,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_SQUARE,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_TRIANGLE,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_SAWTOOTHUP,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_SAWTOOTHDOWN,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_RAMP,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_SPRING,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_DAMPER,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_INERTIA,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_FRICTION,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_LEFTRIGHT,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_RESERVED1,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_RESERVED2,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_RESERVED3,
+  pattern SDL3.Sys.Haptic.SDL_HAPTIC_CUSTOM,
+
+  -- * Function aliases
+  SDL3.Sys.Haptic.getHaptics,
+  SDL3.Sys.Haptic.getHapticsSafe,
+  SDL3.Sys.Haptic.getHapticNameForID,
+  SDL3.Sys.Haptic.getHapticNameForIDSafe,
+  SDL3.Sys.Haptic.openHaptic,
+  SDL3.Sys.Haptic.openHapticSafe,
+  SDL3.Sys.Haptic.getHapticFromID,
+  SDL3.Sys.Haptic.getHapticFromIDSafe,
+  SDL3.Sys.Haptic.getHapticID,
+  SDL3.Sys.Haptic.getHapticIDSafe,
+  SDL3.Sys.Haptic.getHapticName,
+  SDL3.Sys.Haptic.getHapticNameSafe,
+  SDL3.Sys.Haptic.isMouseHaptic,
+  SDL3.Sys.Haptic.isMouseHapticSafe,
+  SDL3.Sys.Haptic.openHapticFromMouse,
+  SDL3.Sys.Haptic.openHapticFromMouseSafe,
+  SDL3.Sys.Haptic.isJoystickHaptic,
+  SDL3.Sys.Haptic.isJoystickHapticSafe,
+  SDL3.Sys.Haptic.openHapticFromJoystick,
+  SDL3.Sys.Haptic.openHapticFromJoystickSafe,
+  SDL3.Sys.Haptic.closeHaptic,
+  SDL3.Sys.Haptic.closeHapticSafe,
+  SDL3.Sys.Haptic.getMaxHapticEffects,
+  SDL3.Sys.Haptic.getMaxHapticEffectsSafe,
+  SDL3.Sys.Haptic.getMaxHapticEffectsPlaying,
+  SDL3.Sys.Haptic.getMaxHapticEffectsPlayingSafe,
+  SDL3.Sys.Haptic.getHapticFeatures,
+  SDL3.Sys.Haptic.getHapticFeaturesSafe,
+  SDL3.Sys.Haptic.getNumHapticAxes,
+  SDL3.Sys.Haptic.getNumHapticAxesSafe,
+  SDL3.Sys.Haptic.hapticEffectSupported,
+  SDL3.Sys.Haptic.hapticEffectSupportedSafe,
+  SDL3.Sys.Haptic.createHapticEffect,
+  SDL3.Sys.Haptic.createHapticEffectSafe,
+  SDL3.Sys.Haptic.updateHapticEffect,
+  SDL3.Sys.Haptic.updateHapticEffectSafe,
+  SDL3.Sys.Haptic.runHapticEffect,
+  SDL3.Sys.Haptic.runHapticEffectSafe,
+  SDL3.Sys.Haptic.stopHapticEffect,
+  SDL3.Sys.Haptic.stopHapticEffectSafe,
+  SDL3.Sys.Haptic.destroyHapticEffect,
+  SDL3.Sys.Haptic.destroyHapticEffectSafe,
+  SDL3.Sys.Haptic.getHapticEffectStatus,
+  SDL3.Sys.Haptic.getHapticEffectStatusSafe,
+  SDL3.Sys.Haptic.setHapticGain,
+  SDL3.Sys.Haptic.setHapticGainSafe,
+  SDL3.Sys.Haptic.setHapticAutocenter,
+  SDL3.Sys.Haptic.setHapticAutocenterSafe,
+  SDL3.Sys.Haptic.pauseHaptic,
+  SDL3.Sys.Haptic.pauseHapticSafe,
+  SDL3.Sys.Haptic.resumeHaptic,
+  SDL3.Sys.Haptic.resumeHapticSafe,
+  SDL3.Sys.Haptic.stopHapticEffects,
+  SDL3.Sys.Haptic.stopHapticEffectsSafe,
+  SDL3.Sys.Haptic.hapticRumbleSupported,
+  SDL3.Sys.Haptic.hapticRumbleSupportedSafe,
+  SDL3.Sys.Haptic.initHapticRumble,
+  SDL3.Sys.Haptic.initHapticRumbleSafe,
+  SDL3.Sys.Haptic.playHapticRumble,
+  SDL3.Sys.Haptic.playHapticRumbleSafe,
+  SDL3.Sys.Haptic.stopHapticRumble,
+  SDL3.Sys.Haptic.stopHapticRumbleSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Haptic
+import SDL3.Sys.Bindgen.Haptic.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Haptic.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Joystick qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Get a list of currently connected haptic devices.
+--
+--     [Returns]: a 0 terminated array of haptic device instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetHaptics@.
+--                   The safe flavor is 'getHapticsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetHaptics@, defined at @SDL3\/SDL_haptic.h 975:44@
+getHaptics
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of haptic devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_HapticID)
+getHaptics = Unsafe.sDL_GetHaptics
+
+-- | Get a list of currently connected haptic devices.
+--
+--     [Returns]: a 0 terminated array of haptic device instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetHaptics@.
+--                   The unsafe flavor is 'getHaptics'
+--                   .
+--
+--     [C declaration]: @SDL_GetHaptics@, defined at @SDL3\/SDL_haptic.h 975:44@
+getHapticsSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of haptic devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_HapticID)
+getHapticsSafe = Safe.sDL_GetHaptics
+
+-- | Get the implementation dependent name of a haptic device.
+--
+--     This can be called before any haptic devices are opened.
+--
+--     [Returns]: the name of the selected haptic device. If no name can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticName', 'openHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetHapticNameForID@.
+--                   The safe flavor is 'getHapticNameForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetHapticNameForID@, defined at @SDL3\/SDL_haptic.h 992:42@
+getHapticNameForID
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the haptic device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getHapticNameForID = Unsafe.sDL_GetHapticNameForID
+
+-- | Get the implementation dependent name of a haptic device.
+--
+--     This can be called before any haptic devices are opened.
+--
+--     [Returns]: the name of the selected haptic device. If no name can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticName', 'openHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetHapticNameForID@.
+--                   The unsafe flavor is 'getHapticNameForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetHapticNameForID@, defined at @SDL3\/SDL_haptic.h 992:42@
+getHapticNameForIDSafe
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the haptic device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getHapticNameForIDSafe = Safe.sDL_GetHapticNameForID
+
+-- | Open a haptic device for use.
+--
+--     The index passed as an argument refers to the N\'th haptic device on this system.
+--
+--     When opening a haptic device, its gain will be set to maximum and autocenter will be disabled. To modify these values use @'setHapticGain'@ and @'setHapticAutocenter'@.
+--
+--     [Returns]: the device identifier or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeHaptic', 'getHaptics', 'openHapticFromJoystick', 'openHapticFromMouse', 'setHapticAutocenter', 'setHapticGain'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenHaptic@.
+--                   The safe flavor is 'openHapticSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenHaptic@, defined at @SDL3\/SDL_haptic.h 1017:42@
+openHaptic
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the haptic device instance ID.
+  -> IO (BG.Ptr SDL_Haptic)
+openHaptic = Unsafe.sDL_OpenHaptic
+
+-- | Open a haptic device for use.
+--
+--     The index passed as an argument refers to the N\'th haptic device on this system.
+--
+--     When opening a haptic device, its gain will be set to maximum and autocenter will be disabled. To modify these values use @'setHapticGain'@ and @'setHapticAutocenter'@.
+--
+--     [Returns]: the device identifier or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeHaptic', 'getHaptics', 'openHapticFromJoystick', 'openHapticFromMouse', 'setHapticAutocenter', 'setHapticGain'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenHaptic@.
+--                   The unsafe flavor is 'openHaptic'
+--                   .
+--
+--     [C declaration]: @SDL_OpenHaptic@, defined at @SDL3\/SDL_haptic.h 1017:42@
+openHapticSafe
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the haptic device instance ID.
+  -> IO (BG.Ptr SDL_Haptic)
+openHapticSafe = Safe.sDL_OpenHaptic
+
+-- | Get the 'SDL_Haptic' associated with an instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Haptic' on success or NULL on failure or if it hasn\'t been opened yet; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetHapticFromID@.
+--                   The safe flavor is 'getHapticFromIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetHapticFromID@, defined at @SDL3\/SDL_haptic.h 1029:42@
+getHapticFromID
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the instance ID to get the 'SDL_Haptic' for.
+  -> IO (BG.Ptr SDL_Haptic)
+getHapticFromID = Unsafe.sDL_GetHapticFromID
+
+-- | Get the 'SDL_Haptic' associated with an instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Haptic' on success or NULL on failure or if it hasn\'t been opened yet; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetHapticFromID@.
+--                   The unsafe flavor is 'getHapticFromID'
+--                   .
+--
+--     [C declaration]: @SDL_GetHapticFromID@, defined at @SDL3\/SDL_haptic.h 1029:42@
+getHapticFromIDSafe
+  :: SDL_HapticID
+  -- ^
+  --
+  --           [@instance_id@]: the instance ID to get the 'SDL_Haptic' for.
+  -> IO (BG.Ptr SDL_Haptic)
+getHapticFromIDSafe = Safe.sDL_GetHapticFromID
+
+-- | Get the instance ID of an opened haptic device.
+--
+--     [Returns]: the instance ID of the specified haptic device on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetHapticID@.
+--                   The safe flavor is 'getHapticIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetHapticID@, defined at @SDL3\/SDL_haptic.h 1040:42@
+getHapticID
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO SDL_HapticID
+getHapticID = Unsafe.sDL_GetHapticID
+
+-- | Get the instance ID of an opened haptic device.
+--
+--     [Returns]: the instance ID of the specified haptic device on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetHapticID@.
+--                   The unsafe flavor is 'getHapticID'
+--                   .
+--
+--     [C declaration]: @SDL_GetHapticID@, defined at @SDL3\/SDL_haptic.h 1040:42@
+getHapticIDSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO SDL_HapticID
+getHapticIDSafe = Safe.sDL_GetHapticID
+
+-- | Get the implementation dependent name of a haptic device.
+--
+--     [Returns]: the name of the selected haptic device. If no name can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticNameForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetHapticName@.
+--                   The safe flavor is 'getHapticNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetHapticName@, defined at @SDL3\/SDL_haptic.h 1054:42@
+getHapticName
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' obtained from 'SDL3.Sys.Joystick.openJoystick'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getHapticName = Unsafe.sDL_GetHapticName
+
+-- | Get the implementation dependent name of a haptic device.
+--
+--     [Returns]: the name of the selected haptic device. If no name can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticNameForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetHapticName@.
+--                   The unsafe flavor is 'getHapticName'
+--                   .
+--
+--     [C declaration]: @SDL_GetHapticName@, defined at @SDL3\/SDL_haptic.h 1054:42@
+getHapticNameSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' obtained from 'SDL3.Sys.Joystick.openJoystick'.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getHapticNameSafe = Safe.sDL_GetHapticName
+
+-- | Query whether or not the current mouse has haptic capabilities.
+--
+--     [Returns]: true if the mouse is haptic or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openHapticFromMouse'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IsMouseHaptic@.
+--                   The safe flavor is 'isMouseHapticSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsMouseHaptic@, defined at @SDL3\/SDL_haptic.h 1065:34@
+isMouseHaptic :: IO Bool
+isMouseHaptic =
+  fmap CBool.toBool Unsafe.sDL_IsMouseHaptic
+
+-- | Query whether or not the current mouse has haptic capabilities.
+--
+--     [Returns]: true if the mouse is haptic or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openHapticFromMouse'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IsMouseHaptic@.
+--                   The unsafe flavor is 'isMouseHaptic'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsMouseHaptic@, defined at @SDL3\/SDL_haptic.h 1065:34@
+isMouseHapticSafe :: IO Bool
+isMouseHapticSafe =
+  fmap CBool.toBool Safe.sDL_IsMouseHaptic
+
+-- | Try to open a haptic device from the current mouse.
+--
+--     [Returns]: the haptic device identifier or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeHaptic', 'isMouseHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenHapticFromMouse@.
+--                   The safe flavor is 'openHapticFromMouseSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenHapticFromMouse@, defined at @SDL3\/SDL_haptic.h 1078:42@
+openHapticFromMouse :: IO (BG.Ptr SDL_Haptic)
+openHapticFromMouse = Unsafe.sDL_OpenHapticFromMouse
+
+-- | Try to open a haptic device from the current mouse.
+--
+--     [Returns]: the haptic device identifier or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeHaptic', 'isMouseHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenHapticFromMouse@.
+--                   The unsafe flavor is 'openHapticFromMouse'
+--                   .
+--
+--     [C declaration]: @SDL_OpenHapticFromMouse@, defined at @SDL3\/SDL_haptic.h 1078:42@
+openHapticFromMouseSafe :: IO (BG.Ptr SDL_Haptic)
+openHapticFromMouseSafe =
+  Safe.sDL_OpenHapticFromMouse
+
+-- | Query if a joystick has haptic features.
+--
+--     [Returns]: true if the joystick is haptic or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openHapticFromJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IsJoystickHaptic@.
+--                   The safe flavor is 'isJoystickHapticSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsJoystickHaptic@, defined at @SDL3\/SDL_haptic.h 1090:34@
+isJoystickHaptic
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the SDL_Joystick to test for haptic capabilities.
+  -> IO Bool
+isJoystickHaptic =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_IsJoystickHaptic x00)
+
+-- | Query if a joystick has haptic features.
+--
+--     [Returns]: true if the joystick is haptic or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openHapticFromJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IsJoystickHaptic@.
+--                   The unsafe flavor is 'isJoystickHaptic'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsJoystickHaptic@, defined at @SDL3\/SDL_haptic.h 1090:34@
+isJoystickHapticSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the SDL_Joystick to test for haptic capabilities.
+  -> IO Bool
+isJoystickHapticSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_IsJoystickHaptic x00)
+
+-- | Open a haptic device for use from a joystick device.
+--
+--     You must still close the haptic device separately. It will not be closed with the joystick.
+--
+--     When opened from a joystick you should first close the haptic device before closing the joystick device. If not, on some implementations the haptic device will also get unallocated and you\'ll be unable to use force feedback on that device.
+--
+--     [Returns]: a valid haptic device identifier on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeHaptic', 'isJoystickHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenHapticFromJoystick@.
+--                   The safe flavor is 'openHapticFromJoystickSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenHapticFromJoystick@, defined at @SDL3\/SDL_haptic.h 1112:42@
+openHapticFromJoystick
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the SDL_Joystick to create a haptic device from.
+  -> IO (BG.Ptr SDL_Haptic)
+openHapticFromJoystick =
+  Unsafe.sDL_OpenHapticFromJoystick
+
+-- | Open a haptic device for use from a joystick device.
+--
+--     You must still close the haptic device separately. It will not be closed with the joystick.
+--
+--     When opened from a joystick you should first close the haptic device before closing the joystick device. If not, on some implementations the haptic device will also get unallocated and you\'ll be unable to use force feedback on that device.
+--
+--     [Returns]: a valid haptic device identifier on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeHaptic', 'isJoystickHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenHapticFromJoystick@.
+--                   The unsafe flavor is 'openHapticFromJoystick'
+--                   .
+--
+--     [C declaration]: @SDL_OpenHapticFromJoystick@, defined at @SDL3\/SDL_haptic.h 1112:42@
+openHapticFromJoystickSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Joystick.SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the SDL_Joystick to create a haptic device from.
+  -> IO (BG.Ptr SDL_Haptic)
+openHapticFromJoystickSafe =
+  Safe.sDL_OpenHapticFromJoystick
+
+-- | Close a haptic device previously opened with @'openHaptic'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CloseHaptic@.
+--                   The safe flavor is 'closeHapticSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CloseHaptic@, defined at @SDL3\/SDL_haptic.h 1123:34@
+closeHaptic
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to close.
+  -> IO ()
+closeHaptic = Unsafe.sDL_CloseHaptic
+
+-- | Close a haptic device previously opened with @'openHaptic'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CloseHaptic@.
+--                   The unsafe flavor is 'closeHaptic'
+--                   .
+--
+--     [C declaration]: @SDL_CloseHaptic@, defined at @SDL3\/SDL_haptic.h 1123:34@
+closeHapticSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to close.
+  -> IO ()
+closeHapticSafe = Safe.sDL_CloseHaptic
+
+-- | Get the number of effects a haptic device can store.
+--
+--     On some platforms this isn\'t fully supported, and therefore is an approximation. Always check to see if your created effect was actually created and do not rely solely on @'getMaxHapticEffects'@.
+--
+--     [Returns]: the number of effects the haptic device can store or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMaxHapticEffectsPlaying', 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetMaxHapticEffects@.
+--                   The safe flavor is 'getMaxHapticEffectsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetMaxHapticEffects@, defined at @SDL3\/SDL_haptic.h 1141:33@
+getMaxHapticEffects
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO BG.Int32
+getMaxHapticEffects =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetMaxHapticEffects x00)
+
+-- | Get the number of effects a haptic device can store.
+--
+--     On some platforms this isn\'t fully supported, and therefore is an approximation. Always check to see if your created effect was actually created and do not rely solely on @'getMaxHapticEffects'@.
+--
+--     [Returns]: the number of effects the haptic device can store or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMaxHapticEffectsPlaying', 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetMaxHapticEffects@.
+--                   The unsafe flavor is 'getMaxHapticEffects'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetMaxHapticEffects@, defined at @SDL3\/SDL_haptic.h 1141:33@
+getMaxHapticEffectsSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO BG.Int32
+getMaxHapticEffectsSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetMaxHapticEffects x00)
+
+-- | Get the number of effects a haptic device can play at the same time.
+--
+--     This is not supported on all platforms, but will always return a value.
+--
+--     [Returns]: the number of effects the haptic device can play at the same time or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMaxHapticEffects', 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetMaxHapticEffectsPlaying@.
+--                   The safe flavor is 'getMaxHapticEffectsPlayingSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetMaxHapticEffectsPlaying@, defined at @SDL3\/SDL_haptic.h 1157:33@
+getMaxHapticEffectsPlaying
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query maximum playing effects.
+  -> IO BG.Int32
+getMaxHapticEffectsPlaying =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetMaxHapticEffectsPlaying x00)
+
+-- | Get the number of effects a haptic device can play at the same time.
+--
+--     This is not supported on all platforms, but will always return a value.
+--
+--     [Returns]: the number of effects the haptic device can play at the same time or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMaxHapticEffects', 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetMaxHapticEffectsPlaying@.
+--                   The unsafe flavor is 'getMaxHapticEffectsPlaying'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetMaxHapticEffectsPlaying@, defined at @SDL3\/SDL_haptic.h 1157:33@
+getMaxHapticEffectsPlayingSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query maximum playing effects.
+  -> IO BG.Int32
+getMaxHapticEffectsPlayingSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetMaxHapticEffectsPlaying x00)
+
+-- | Get the haptic device\'s supported features in bitwise manner.
+--
+--     [Returns]: a list of supported haptic features in bitwise manner (OR\'d), or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hapticEffectSupported', 'getMaxHapticEffects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetHapticFeatures@.
+--                   The safe flavor is 'getHapticFeaturesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetHapticFeatures@, defined at @SDL3\/SDL_haptic.h 1171:36@
+getHapticFeatures
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO BG.Word32
+getHapticFeatures =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetHapticFeatures x00)
+
+-- | Get the haptic device\'s supported features in bitwise manner.
+--
+--     [Returns]: a list of supported haptic features in bitwise manner (OR\'d), or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hapticEffectSupported', 'getMaxHapticEffects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetHapticFeatures@.
+--                   The unsafe flavor is 'getHapticFeatures'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetHapticFeatures@, defined at @SDL3\/SDL_haptic.h 1171:36@
+getHapticFeaturesSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO BG.Word32
+getHapticFeaturesSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetHapticFeatures x00)
+
+-- | Get the number of haptic axes the device has.
+--
+--     The number of haptic axes might be useful if working with the 'SDL_HapticDirection' effect.
+--
+--     [Returns]: the number of axes on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumHapticAxes@.
+--                   The safe flavor is 'getNumHapticAxesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumHapticAxes@, defined at @SDL3\/SDL_haptic.h 1185:33@
+getNumHapticAxes
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO BG.Int32
+getNumHapticAxes =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetNumHapticAxes x00)
+
+-- | Get the number of haptic axes the device has.
+--
+--     The number of haptic axes might be useful if working with the 'SDL_HapticDirection' effect.
+--
+--     [Returns]: the number of axes on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumHapticAxes@.
+--                   The unsafe flavor is 'getNumHapticAxes'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumHapticAxes@, defined at @SDL3\/SDL_haptic.h 1185:33@
+getNumHapticAxesSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> IO BG.Int32
+getNumHapticAxesSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetNumHapticAxes x00)
+
+-- | Check to see if an effect is supported by a haptic device.
+--
+--     [Returns]: true if the effect is supported or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createHapticEffect', 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HapticEffectSupported@.
+--                   The safe flavor is 'hapticEffectSupportedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HapticEffectSupported@, defined at @SDL3\/SDL_haptic.h 1199:34@
+hapticEffectSupported
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@effect@]: the desired effect to query.
+  -> IO Bool
+hapticEffectSupported =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_HapticEffectSupported x00 x11)
+
+-- | Check to see if an effect is supported by a haptic device.
+--
+--     [Returns]: true if the effect is supported or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createHapticEffect', 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HapticEffectSupported@.
+--                   The unsafe flavor is 'hapticEffectSupported'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HapticEffectSupported@, defined at @SDL3\/SDL_haptic.h 1199:34@
+hapticEffectSupportedSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@effect@]: the desired effect to query.
+  -> IO Bool
+hapticEffectSupportedSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_HapticEffectSupported x00 x11)
+
+-- | Create a new haptic effect on a specified device.
+--
+--     [Returns]: the ID of the effect on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyHapticEffect', 'runHapticEffect', 'updateHapticEffect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateHapticEffect@.
+--                   The safe flavor is 'createHapticEffectSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateHapticEffect@, defined at @SDL3\/SDL_haptic.h 1216:48@
+createHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: an 'SDL_Haptic' device to create the effect on.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@effect@]: an 'SDL_HapticEffect' structure containing the properties of the effect to create.
+  -> IO SDL_HapticEffectID
+createHapticEffect = Unsafe.sDL_CreateHapticEffect
+
+-- | Create a new haptic effect on a specified device.
+--
+--     [Returns]: the ID of the effect on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyHapticEffect', 'runHapticEffect', 'updateHapticEffect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateHapticEffect@.
+--                   The unsafe flavor is 'createHapticEffect'
+--                   .
+--
+--     [C declaration]: @SDL_CreateHapticEffect@, defined at @SDL3\/SDL_haptic.h 1216:48@
+createHapticEffectSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: an 'SDL_Haptic' device to create the effect on.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@effect@]: an 'SDL_HapticEffect' structure containing the properties of the effect to create.
+  -> IO SDL_HapticEffectID
+createHapticEffectSafe = Safe.sDL_CreateHapticEffect
+
+-- | Update the properties of an effect.
+--
+--     Can be used dynamically, although behavior when dynamically changing direction may be strange. Specifically the effect may re-upload itself and start playing from the start. You also cannot change the type either when running @'updateHapticEffect'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createHapticEffect', 'runHapticEffect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UpdateHapticEffect@.
+--                   The safe flavor is 'updateHapticEffectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateHapticEffect@, defined at @SDL3\/SDL_haptic.h 1238:34@
+updateHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device that has the effect.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the identifier of the effect to update.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@data@]: an 'SDL_HapticEffect' structure containing the new effect properties to use.
+  -> IO Bool
+updateHapticEffect =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_UpdateHapticEffect x00 x11 x22)
+
+-- | Update the properties of an effect.
+--
+--     Can be used dynamically, although behavior when dynamically changing direction may be strange. Specifically the effect may re-upload itself and start playing from the start. You also cannot change the type either when running @'updateHapticEffect'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createHapticEffect', 'runHapticEffect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UpdateHapticEffect@.
+--                   The unsafe flavor is 'updateHapticEffect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateHapticEffect@, defined at @SDL3\/SDL_haptic.h 1238:34@
+updateHapticEffectSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device that has the effect.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the identifier of the effect to update.
+  -> PtrConst.PtrConst SDL_HapticEffect
+  -- ^
+  --
+  --           [@data@]: an 'SDL_HapticEffect' structure containing the new effect properties to use.
+  -> IO Bool
+updateHapticEffectSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_UpdateHapticEffect x00 x11 x22)
+
+-- | Run the haptic effect on its associated haptic device.
+--
+--     To repeat the effect over and over indefinitely, set @iterations@ to @'sDL_HAPTIC_INFINITY'@. (Repeats the envelope - attack and fade.) To make one instance of the effect last indefinitely (so the effect does not fade), set the effect\'s @length@ in its structure\/union to @'sDL_HAPTIC_INFINITY'@ instead.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticEffectStatus', 'stopHapticEffect', 'stopHapticEffects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RunHapticEffect@.
+--                   The safe flavor is 'runHapticEffectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RunHapticEffect@, defined at @SDL3\/SDL_haptic.h 1262:34@
+runHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to run the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to run.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@iterations@]: the number of iterations to run the effect; use @'sDL_HAPTIC_INFINITY'@ to repeat forever.
+  -> IO Bool
+runHapticEffect =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_RunHapticEffect x00 x11 (Coerce.coerce x22))
+
+-- | Run the haptic effect on its associated haptic device.
+--
+--     To repeat the effect over and over indefinitely, set @iterations@ to @'sDL_HAPTIC_INFINITY'@. (Repeats the envelope - attack and fade.) To make one instance of the effect last indefinitely (so the effect does not fade), set the effect\'s @length@ in its structure\/union to @'sDL_HAPTIC_INFINITY'@ instead.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticEffectStatus', 'stopHapticEffect', 'stopHapticEffects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RunHapticEffect@.
+--                   The unsafe flavor is 'runHapticEffect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RunHapticEffect@, defined at @SDL3\/SDL_haptic.h 1262:34@
+runHapticEffectSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to run the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to run.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@iterations@]: the number of iterations to run the effect; use @'sDL_HAPTIC_INFINITY'@ to repeat forever.
+  -> IO Bool
+runHapticEffectSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_RunHapticEffect x00 x11 (Coerce.coerce x22))
+
+-- | Stop the haptic effect on its associated haptic device.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'runHapticEffect', 'stopHapticEffects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StopHapticEffect@.
+--                   The safe flavor is 'stopHapticEffectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StopHapticEffect@, defined at @SDL3\/SDL_haptic.h 1277:34@
+stopHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to stop the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to stop.
+  -> IO Bool
+stopHapticEffect =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_StopHapticEffect x00 x11)
+
+-- | Stop the haptic effect on its associated haptic device.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'runHapticEffect', 'stopHapticEffects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_StopHapticEffect@.
+--                   The unsafe flavor is 'stopHapticEffect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StopHapticEffect@, defined at @SDL3\/SDL_haptic.h 1277:34@
+stopHapticEffectSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to stop the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to stop.
+  -> IO Bool
+stopHapticEffectSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_StopHapticEffect x00 x11)
+
+-- | Destroy a haptic effect on the device.
+--
+--     This will stop the effect if it\'s running. Effects are automatically destroyed when the device is closed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createHapticEffect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyHapticEffect@.
+--                   The safe flavor is 'destroyHapticEffectSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyHapticEffect@, defined at @SDL3\/SDL_haptic.h 1292:34@
+destroyHapticEffect
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to destroy the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to destroy.
+  -> IO ()
+destroyHapticEffect = Unsafe.sDL_DestroyHapticEffect
+
+-- | Destroy a haptic effect on the device.
+--
+--     This will stop the effect if it\'s running. Effects are automatically destroyed when the device is closed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createHapticEffect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyHapticEffect@.
+--                   The unsafe flavor is 'destroyHapticEffect'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyHapticEffect@, defined at @SDL3\/SDL_haptic.h 1292:34@
+destroyHapticEffectSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to destroy the effect on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to destroy.
+  -> IO ()
+destroyHapticEffectSafe =
+  Safe.sDL_DestroyHapticEffect
+
+-- | Get the status of the current effect on the specified haptic device.
+--
+--     Device must support the SDL_HAPTIC_STATUS feature.
+--
+--     [Returns]: true if it is playing, false if it isn\'t playing or haptic status isn\'t supported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetHapticEffectStatus@.
+--                   The safe flavor is 'getHapticEffectStatusSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetHapticEffectStatus@, defined at @SDL3\/SDL_haptic.h 1308:34@
+getHapticEffectStatus
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query for the effect status on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to query its status.
+  -> IO Bool
+getHapticEffectStatus =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetHapticEffectStatus x00 x11)
+
+-- | Get the status of the current effect on the specified haptic device.
+--
+--     Device must support the SDL_HAPTIC_STATUS feature.
+--
+--     [Returns]: true if it is playing, false if it isn\'t playing or haptic status isn\'t supported.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetHapticEffectStatus@.
+--                   The unsafe flavor is 'getHapticEffectStatus'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetHapticEffectStatus@, defined at @SDL3\/SDL_haptic.h 1308:34@
+getHapticEffectStatusSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to query for the effect status on.
+  -> SDL_HapticEffectID
+  -- ^
+  --
+  --           [@effect@]: the ID of the haptic effect to query its status.
+  -> IO Bool
+getHapticEffectStatusSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetHapticEffectStatus x00 x11)
+
+-- | Set the global gain of the specified haptic device.
+--
+--     Device must support the SDL_HAPTIC_GAIN feature.
+--
+--     The user may specify the maximum gain by setting the environment variable @SDL_HAPTIC_GAIN_MAX@ which should be between 0 and 100. All calls to @'setHapticGain'@ will scale linearly using @SDL_HAPTIC_GAIN_MAX@ as the maximum.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetHapticGain@.
+--                   The safe flavor is 'setHapticGainSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetHapticGain@, defined at @SDL3\/SDL_haptic.h 1330:34@
+setHapticGain
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to set the gain on.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@gain@]: value to set the gain to, should be between 0 and 100 (0 - 100).
+  -> IO Bool
+setHapticGain =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetHapticGain x00 (Coerce.coerce x11))
+
+-- | Set the global gain of the specified haptic device.
+--
+--     Device must support the SDL_HAPTIC_GAIN feature.
+--
+--     The user may specify the maximum gain by setting the environment variable @SDL_HAPTIC_GAIN_MAX@ which should be between 0 and 100. All calls to @'setHapticGain'@ will scale linearly using @SDL_HAPTIC_GAIN_MAX@ as the maximum.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetHapticGain@.
+--                   The unsafe flavor is 'setHapticGain'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetHapticGain@, defined at @SDL3\/SDL_haptic.h 1330:34@
+setHapticGainSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to set the gain on.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@gain@]: value to set the gain to, should be between 0 and 100 (0 - 100).
+  -> IO Bool
+setHapticGainSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetHapticGain x00 (Coerce.coerce x11))
+
+-- | Set the global autocenter of the device.
+--
+--     Autocenter should be between 0 and 100. Setting it to 0 will disable autocentering.
+--
+--     Device must support the SDL_HAPTIC_AUTOCENTER feature.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetHapticAutocenter@.
+--                   The safe flavor is 'setHapticAutocenterSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetHapticAutocenter@, defined at @SDL3\/SDL_haptic.h 1349:34@
+setHapticAutocenter
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to set autocentering on.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@autocenter@]: value to set autocenter to (0-100).
+  -> IO Bool
+setHapticAutocenter =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetHapticAutocenter x00 (Coerce.coerce x11))
+
+-- | Set the global autocenter of the device.
+--
+--     Autocenter should be between 0 and 100. Setting it to 0 will disable autocentering.
+--
+--     Device must support the SDL_HAPTIC_AUTOCENTER feature.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHapticFeatures'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetHapticAutocenter@.
+--                   The unsafe flavor is 'setHapticAutocenter'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetHapticAutocenter@, defined at @SDL3\/SDL_haptic.h 1349:34@
+setHapticAutocenterSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to set autocentering on.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@autocenter@]: value to set autocenter to (0-100).
+  -> IO Bool
+setHapticAutocenterSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetHapticAutocenter x00 (Coerce.coerce x11))
+
+-- | Pause a haptic device.
+--
+--     Device must support the @'sDL_HAPTIC_PAUSE'@ feature. Call @'resumeHaptic'@ to resume playback.
+--
+--     Do not modify the effects nor add new ones while the device is paused. That can cause all sorts of weird errors.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resumeHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PauseHaptic@.
+--                   The safe flavor is 'pauseHapticSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PauseHaptic@, defined at @SDL3\/SDL_haptic.h 1368:34@
+pauseHaptic
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to pause.
+  -> IO Bool
+pauseHaptic =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_PauseHaptic x00)
+
+-- | Pause a haptic device.
+--
+--     Device must support the @'sDL_HAPTIC_PAUSE'@ feature. Call @'resumeHaptic'@ to resume playback.
+--
+--     Do not modify the effects nor add new ones while the device is paused. That can cause all sorts of weird errors.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resumeHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PauseHaptic@.
+--                   The unsafe flavor is 'pauseHaptic'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PauseHaptic@, defined at @SDL3\/SDL_haptic.h 1368:34@
+pauseHapticSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to pause.
+  -> IO Bool
+pauseHapticSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_PauseHaptic x00)
+
+-- | Resume a haptic device.
+--
+--     Call to unpause after @'pauseHaptic'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pauseHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ResumeHaptic@.
+--                   The safe flavor is 'resumeHapticSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ResumeHaptic@, defined at @SDL3\/SDL_haptic.h 1383:34@
+resumeHaptic
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to unpause.
+  -> IO Bool
+resumeHaptic =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_ResumeHaptic x00)
+
+-- | Resume a haptic device.
+--
+--     Call to unpause after @'pauseHaptic'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pauseHaptic'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ResumeHaptic@.
+--                   The unsafe flavor is 'resumeHaptic'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ResumeHaptic@, defined at @SDL3\/SDL_haptic.h 1383:34@
+resumeHapticSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to unpause.
+  -> IO Bool
+resumeHapticSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_ResumeHaptic x00)
+
+-- | Stop all the currently playing effects on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'runHapticEffect', 'stopHapticEffects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StopHapticEffects@.
+--                   The safe flavor is 'stopHapticEffectsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StopHapticEffects@, defined at @SDL3\/SDL_haptic.h 1397:34@
+stopHapticEffects
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to stop.
+  -> IO Bool
+stopHapticEffects =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_StopHapticEffects x00)
+
+-- | Stop all the currently playing effects on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'runHapticEffect', 'stopHapticEffects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_StopHapticEffects@.
+--                   The unsafe flavor is 'stopHapticEffects'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StopHapticEffects@, defined at @SDL3\/SDL_haptic.h 1397:34@
+stopHapticEffectsSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the 'SDL_Haptic' device to stop.
+  -> IO Bool
+stopHapticEffectsSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_StopHapticEffects x00)
+
+-- | Check whether rumble is supported on a haptic device.
+--
+--     [Returns]: true if the effect is supported or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'initHapticRumble'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HapticRumbleSupported@.
+--                   The safe flavor is 'hapticRumbleSupportedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HapticRumbleSupported@, defined at @SDL3\/SDL_haptic.h 1409:34@
+hapticRumbleSupported
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: haptic device to check for rumble support.
+  -> IO Bool
+hapticRumbleSupported =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_HapticRumbleSupported x00)
+
+-- | Check whether rumble is supported on a haptic device.
+--
+--     [Returns]: true if the effect is supported or false if it isn\'t.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'initHapticRumble'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HapticRumbleSupported@.
+--                   The unsafe flavor is 'hapticRumbleSupported'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HapticRumbleSupported@, defined at @SDL3\/SDL_haptic.h 1409:34@
+hapticRumbleSupportedSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: haptic device to check for rumble support.
+  -> IO Bool
+hapticRumbleSupportedSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_HapticRumbleSupported x00)
+
+-- | Initialize a haptic device for simple rumble playback.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'playHapticRumble', 'stopHapticRumble', 'hapticRumbleSupported'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_InitHapticRumble@.
+--                   The safe flavor is 'initHapticRumbleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_InitHapticRumble@, defined at @SDL3\/SDL_haptic.h 1424:34@
+initHapticRumble
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to initialize for simple rumble playback.
+  -> IO Bool
+initHapticRumble =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_InitHapticRumble x00)
+
+-- | Initialize a haptic device for simple rumble playback.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'playHapticRumble', 'stopHapticRumble', 'hapticRumbleSupported'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_InitHapticRumble@.
+--                   The unsafe flavor is 'initHapticRumble'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_InitHapticRumble@, defined at @SDL3\/SDL_haptic.h 1424:34@
+initHapticRumbleSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to initialize for simple rumble playback.
+  -> IO Bool
+initHapticRumbleSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_InitHapticRumble x00)
+
+-- | Run a simple rumble effect on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'initHapticRumble', 'stopHapticRumble'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PlayHapticRumble@.
+--                   The safe flavor is 'playHapticRumbleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PlayHapticRumble@, defined at @SDL3\/SDL_haptic.h 1440:34@
+playHapticRumble
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to play the rumble effect on.
+  -> Float
+  -- ^
+  --
+  --           [@strength@]: strength of the rumble to play as a 0-1 float value.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@length@]: length of the rumble to play in milliseconds.
+  -> IO Bool
+playHapticRumble =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_PlayHapticRumble x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Run a simple rumble effect on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'initHapticRumble', 'stopHapticRumble'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PlayHapticRumble@.
+--                   The unsafe flavor is 'playHapticRumble'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PlayHapticRumble@, defined at @SDL3\/SDL_haptic.h 1440:34@
+playHapticRumbleSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to play the rumble effect on.
+  -> Float
+  -- ^
+  --
+  --           [@strength@]: strength of the rumble to play as a 0-1 float value.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@length@]: length of the rumble to play in milliseconds.
+  -> IO Bool
+playHapticRumbleSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_PlayHapticRumble x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Stop the simple rumble on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'playHapticRumble'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StopHapticRumble@.
+--                   The safe flavor is 'stopHapticRumbleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StopHapticRumble@, defined at @SDL3\/SDL_haptic.h 1453:34@
+stopHapticRumble
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to stop the rumble effect on.
+  -> IO Bool
+stopHapticRumble =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_StopHapticRumble x00)
+
+-- | Stop the simple rumble on a haptic device.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'playHapticRumble'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_StopHapticRumble@.
+--                   The unsafe flavor is 'stopHapticRumble'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StopHapticRumble@, defined at @SDL3\/SDL_haptic.h 1453:34@
+stopHapticRumbleSafe
+  :: BG.Ptr SDL_Haptic
+  -- ^
+  --
+  --           [@haptic@]: the haptic device to stop the rumble effect on.
+  -> IO Bool
+stopHapticRumbleSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_StopHapticRumble x00)
+
+-- | Typed constant for macro @SDL_HAPTIC_POLAR@.
+pattern SDL_HAPTIC_POLAR :: SDL_HapticDirectionType
+pattern SDL_HAPTIC_POLAR = SDL_HapticDirectionType 0
+
+-- | Typed constant for macro @SDL_HAPTIC_CARTESIAN@.
+pattern SDL_HAPTIC_CARTESIAN :: SDL_HapticDirectionType
+pattern SDL_HAPTIC_CARTESIAN = SDL_HapticDirectionType 1
+
+-- | Typed constant for macro @SDL_HAPTIC_SPHERICAL@.
+pattern SDL_HAPTIC_SPHERICAL :: SDL_HapticDirectionType
+pattern SDL_HAPTIC_SPHERICAL = SDL_HapticDirectionType 2
+
+-- | Typed constant for macro @SDL_HAPTIC_STEERING_AXIS@.
+pattern SDL_HAPTIC_STEERING_AXIS :: SDL_HapticDirectionType
+pattern SDL_HAPTIC_STEERING_AXIS = SDL_HapticDirectionType 3
+
+-- | Typed constant for macro @SDL_HAPTIC_CONSTANT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_CONSTANT :: SDL_HapticEffectType
+pattern SDL_HAPTIC_CONSTANT = SDL_HapticEffectType 0x0001
+
+-- | Typed constant for macro @SDL_HAPTIC_SINE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_SINE :: SDL_HapticEffectType
+pattern SDL_HAPTIC_SINE = SDL_HapticEffectType 0x0002
+
+-- | Typed constant for macro @SDL_HAPTIC_SQUARE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_SQUARE :: SDL_HapticEffectType
+pattern SDL_HAPTIC_SQUARE = SDL_HapticEffectType 0x0004
+
+-- | Typed constant for macro @SDL_HAPTIC_TRIANGLE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_TRIANGLE :: SDL_HapticEffectType
+pattern SDL_HAPTIC_TRIANGLE = SDL_HapticEffectType 0x0008
+
+-- | Typed constant for macro @SDL_HAPTIC_SAWTOOTHUP@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_SAWTOOTHUP :: SDL_HapticEffectType
+pattern SDL_HAPTIC_SAWTOOTHUP = SDL_HapticEffectType 0x0010
+
+-- | Typed constant for macro @SDL_HAPTIC_SAWTOOTHDOWN@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_SAWTOOTHDOWN :: SDL_HapticEffectType
+pattern SDL_HAPTIC_SAWTOOTHDOWN = SDL_HapticEffectType 0x0020
+
+-- | Typed constant for macro @SDL_HAPTIC_RAMP@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_RAMP :: SDL_HapticEffectType
+pattern SDL_HAPTIC_RAMP = SDL_HapticEffectType 0x0040
+
+-- | Typed constant for macro @SDL_HAPTIC_SPRING@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_SPRING :: SDL_HapticEffectType
+pattern SDL_HAPTIC_SPRING = SDL_HapticEffectType 0x0080
+
+-- | Typed constant for macro @SDL_HAPTIC_DAMPER@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_DAMPER :: SDL_HapticEffectType
+pattern SDL_HAPTIC_DAMPER = SDL_HapticEffectType 0x0100
+
+-- | Typed constant for macro @SDL_HAPTIC_INERTIA@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_INERTIA :: SDL_HapticEffectType
+pattern SDL_HAPTIC_INERTIA = SDL_HapticEffectType 0x0200
+
+-- | Typed constant for macro @SDL_HAPTIC_FRICTION@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_FRICTION :: SDL_HapticEffectType
+pattern SDL_HAPTIC_FRICTION = SDL_HapticEffectType 0x0400
+
+-- | Typed constant for macro @SDL_HAPTIC_LEFTRIGHT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_LEFTRIGHT :: SDL_HapticEffectType
+pattern SDL_HAPTIC_LEFTRIGHT = SDL_HapticEffectType 0x0800
+
+-- | Typed constant for macro @SDL_HAPTIC_RESERVED1@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_RESERVED1 :: SDL_HapticEffectType
+pattern SDL_HAPTIC_RESERVED1 = SDL_HapticEffectType 0x1000
+
+-- | Typed constant for macro @SDL_HAPTIC_RESERVED2@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_RESERVED2 :: SDL_HapticEffectType
+pattern SDL_HAPTIC_RESERVED2 = SDL_HapticEffectType 0x2000
+
+-- | Typed constant for macro @SDL_HAPTIC_RESERVED3@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_RESERVED3 :: SDL_HapticEffectType
+pattern SDL_HAPTIC_RESERVED3 = SDL_HapticEffectType 0x4000
+
+-- | Typed constant for macro @SDL_HAPTIC_CUSTOM@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_HAPTIC_CUSTOM :: SDL_HapticEffectType
+pattern SDL_HAPTIC_CUSTOM = SDL_HapticEffectType 0x8000
diff --git a/src/SDL3/Sys/Hidapi.hs b/src/SDL3/Sys/Hidapi.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Hidapi.hs
@@ -0,0 +1,1582 @@
+-- | Header file for SDL HIDAPI functions.
+--
+--     This is an adaptation of the original HIDAPI interface by Alan Ott, and includes source code licensed under the following license:
+--
+--     @
+--     HIDAPI - Multi-Platform library for
+--     communication with HID devices.
+--
+--     Copyright 2009, Alan Ott, Signal 11 Software.
+--     All Rights Reserved.
+--
+--     This software may be used by anyone for any reason so
+--     long as the copyright notice in the source files
+--     remains intact.
+--     @
+--
+--     (Note that this license is the same as item three of SDL\'s zlib license, so it adds no new requirements on the user.)
+--
+--     If you would like a version of SDL without this code, you can build SDL with SDL_HIDAPI_DISABLED defined to 1. You might want to do this for example on iOS or tvOS to avoid a dependency on the CoreBluetooth framework. An opaque handle representing an open HID device.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Hidapi.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Hidapi (
+  module SDL3.Sys.Bindgen.Hidapi,
+
+  -- * Function aliases
+  SDL3.Sys.Hidapi.hidInit,
+  SDL3.Sys.Hidapi.hidInitSafe,
+  SDL3.Sys.Hidapi.hidExit,
+  SDL3.Sys.Hidapi.hidExitSafe,
+  SDL3.Sys.Hidapi.hidDeviceChangeCount,
+  SDL3.Sys.Hidapi.hidDeviceChangeCountSafe,
+  SDL3.Sys.Hidapi.hidEnumerate,
+  SDL3.Sys.Hidapi.hidEnumerateSafe,
+  SDL3.Sys.Hidapi.hidFreeEnumeration,
+  SDL3.Sys.Hidapi.hidFreeEnumerationSafe,
+  SDL3.Sys.Hidapi.hidOpen,
+  SDL3.Sys.Hidapi.hidOpenSafe,
+  SDL3.Sys.Hidapi.hidOpenPath,
+  SDL3.Sys.Hidapi.hidOpenPathSafe,
+  SDL3.Sys.Hidapi.hidGetProperties,
+  SDL3.Sys.Hidapi.hidGetPropertiesSafe,
+  SDL3.Sys.Hidapi.hidWrite,
+  SDL3.Sys.Hidapi.hidWriteSafe,
+  SDL3.Sys.Hidapi.hidReadTimeout,
+  SDL3.Sys.Hidapi.hidReadTimeoutSafe,
+  SDL3.Sys.Hidapi.hidRead,
+  SDL3.Sys.Hidapi.hidReadSafe,
+  SDL3.Sys.Hidapi.hidSetNonblocking,
+  SDL3.Sys.Hidapi.hidSetNonblockingSafe,
+  SDL3.Sys.Hidapi.hidSendFeatureReport,
+  SDL3.Sys.Hidapi.hidSendFeatureReportSafe,
+  SDL3.Sys.Hidapi.hidGetFeatureReport,
+  SDL3.Sys.Hidapi.hidGetFeatureReportSafe,
+  SDL3.Sys.Hidapi.hidGetInputReport,
+  SDL3.Sys.Hidapi.hidGetInputReportSafe,
+  SDL3.Sys.Hidapi.hidClose,
+  SDL3.Sys.Hidapi.hidCloseSafe,
+  SDL3.Sys.Hidapi.hidGetManufacturerString,
+  SDL3.Sys.Hidapi.hidGetManufacturerStringSafe,
+  SDL3.Sys.Hidapi.hidGetProductString,
+  SDL3.Sys.Hidapi.hidGetProductStringSafe,
+  SDL3.Sys.Hidapi.hidGetSerialNumberString,
+  SDL3.Sys.Hidapi.hidGetSerialNumberStringSafe,
+  SDL3.Sys.Hidapi.hidGetIndexedString,
+  SDL3.Sys.Hidapi.hidGetIndexedStringSafe,
+  SDL3.Sys.Hidapi.hidGetDeviceInfo,
+  SDL3.Sys.Hidapi.hidGetDeviceInfoSafe,
+  SDL3.Sys.Hidapi.hidGetReportDescriptor,
+  SDL3.Sys.Hidapi.hidGetReportDescriptorSafe,
+  SDL3.Sys.Hidapi.hidBleScan,
+  SDL3.Sys.Hidapi.hidBleScanSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Hidapi
+import SDL3.Sys.Bindgen.Hidapi.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Hidapi.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Initialize the HIDAPI library.
+--
+--     This function initializes the HIDAPI library. Calling it is not strictly necessary, as it will be called automatically by @'hidEnumerate'@ and any of the SDL_hid_open_*() functions if it is needed. This function should be called at the beginning of execution however, if there is a chance of HIDAPI handles being opened by different threads simultaneously.
+--
+--     Each call to this function should have a matching call to @'hidExit'@
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hidExit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_init@.
+--                   The safe flavor is 'hidInitSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_init@, defined at @SDL3\/SDL_hidapi.h 177:33@
+hidInit :: IO BG.Int32
+hidInit = fmap Coerce.coerce Unsafe.sDL_hid_init
+
+-- | Initialize the HIDAPI library.
+--
+--     This function initializes the HIDAPI library. Calling it is not strictly necessary, as it will be called automatically by @'hidEnumerate'@ and any of the SDL_hid_open_*() functions if it is needed. This function should be called at the beginning of execution however, if there is a chance of HIDAPI handles being opened by different threads simultaneously.
+--
+--     Each call to this function should have a matching call to @'hidExit'@
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hidExit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_init@.
+--                   The unsafe flavor is 'hidInit'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_init@, defined at @SDL3\/SDL_hidapi.h 177:33@
+hidInitSafe :: IO BG.Int32
+hidInitSafe = fmap Coerce.coerce Safe.sDL_hid_init
+
+-- | Finalize the HIDAPI library.
+--
+--     This function frees all of the static data associated with HIDAPI. It should be called at the end of execution to avoid memory leaks.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hidInit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_exit@.
+--                   The safe flavor is 'hidExitSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_exit@, defined at @SDL3\/SDL_hidapi.h 192:33@
+hidExit :: IO BG.Int32
+hidExit = fmap Coerce.coerce Unsafe.sDL_hid_exit
+
+-- | Finalize the HIDAPI library.
+--
+--     This function frees all of the static data associated with HIDAPI. It should be called at the end of execution to avoid memory leaks.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hidInit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_exit@.
+--                   The unsafe flavor is 'hidExit'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_exit@, defined at @SDL3\/SDL_hidapi.h 192:33@
+hidExitSafe :: IO BG.Int32
+hidExitSafe = fmap Coerce.coerce Safe.sDL_hid_exit
+
+-- | Check to see if devices may have been added or removed.
+--
+--     Enumerating the HID devices is an expensive operation, so you can call this to see if there have been any system device changes since the last call to this function. A change in the counter returned doesn\'t necessarily mean that anything has changed, but you can call @'hidEnumerate'@ to get an updated device list.
+--
+--     Calling this function for the first time may cause a thread or other system resource to be allocated to track device change notifications.
+--
+--     [Returns]: a change counter that is incremented with each potential device change, or 0 if device change detection isn\'t available.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hidEnumerate'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_device_change_count@.
+--                   The safe flavor is 'hidDeviceChangeCountSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_device_change_count@, defined at @SDL3\/SDL_hidapi.h 213:36@
+hidDeviceChangeCount :: IO BG.Word32
+hidDeviceChangeCount =
+  fmap Coerce.coerce Unsafe.sDL_hid_device_change_count
+
+-- | Check to see if devices may have been added or removed.
+--
+--     Enumerating the HID devices is an expensive operation, so you can call this to see if there have been any system device changes since the last call to this function. A change in the counter returned doesn\'t necessarily mean that anything has changed, but you can call @'hidEnumerate'@ to get an updated device list.
+--
+--     Calling this function for the first time may cause a thread or other system resource to be allocated to track device change notifications.
+--
+--     [Returns]: a change counter that is incremented with each potential device change, or 0 if device change detection isn\'t available.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hidEnumerate'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_device_change_count@.
+--                   The unsafe flavor is 'hidDeviceChangeCount'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_device_change_count@, defined at @SDL3\/SDL_hidapi.h 213:36@
+hidDeviceChangeCountSafe :: IO BG.Word32
+hidDeviceChangeCountSafe =
+  fmap Coerce.coerce Safe.sDL_hid_device_change_count
+
+-- | Enumerate the HID Devices.
+--
+--     This function returns a linked list of all the HID devices attached to the system which match vendor_id and product_id. If @vendor_id@ is set to 0 then any vendor matches. If @product_id@ is set to 0 then any product matches. If @vendor_id@ and @product_id@ are both set to 0, then all HID devices will be returned.
+--
+--     By default SDL will only enumerate controllers, to reduce risk of hanging or crashing on bad drivers, but SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS can be set to \"0\" to enumerate all HID devices.
+--
+--     [Returns]: a pointer to a linked list of type 'SDL_hid_device_info', containing information about the HID devices attached to the system, or NULL in the case of failure. Free this linked list by calling @'hidFreeEnumeration'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hidDeviceChangeCount'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_enumerate@.
+--                   The safe flavor is 'hidEnumerateSafe'
+--                   : USB round-trip; blocks on device enumeration.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_enumerate@, defined at @SDL3\/SDL_hidapi.h 241:51@
+hidEnumerate
+  :: BG.Word16
+  -- ^
+  --
+  --           [@vendor_id@]: the Vendor ID (VID) of the types of device to open, or 0 to match any vendor.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@product_id@]: the Product ID (PID) of the types of device to open, or 0 to match any product.
+  -> IO (BG.Ptr SDL_hid_device_info)
+hidEnumerate =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_hid_enumerate (Coerce.coerce x00) (Coerce.coerce x11)
+
+-- | Enumerate the HID Devices.
+--
+--     This function returns a linked list of all the HID devices attached to the system which match vendor_id and product_id. If @vendor_id@ is set to 0 then any vendor matches. If @product_id@ is set to 0 then any product matches. If @vendor_id@ and @product_id@ are both set to 0, then all HID devices will be returned.
+--
+--     By default SDL will only enumerate controllers, to reduce risk of hanging or crashing on bad drivers, but SDL_HINT_HIDAPI_ENUMERATE_ONLY_CONTROLLERS can be set to \"0\" to enumerate all HID devices.
+--
+--     [Returns]: a pointer to a linked list of type 'SDL_hid_device_info', containing information about the HID devices attached to the system, or NULL in the case of failure. Free this linked list by calling @'hidFreeEnumeration'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hidDeviceChangeCount'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_enumerate@.
+--                   The unsafe flavor is 'hidEnumerate'
+--                   : USB round-trip; blocks on device enumeration.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_enumerate@, defined at @SDL3\/SDL_hidapi.h 241:51@
+hidEnumerateSafe
+  :: BG.Word16
+  -- ^
+  --
+  --           [@vendor_id@]: the Vendor ID (VID) of the types of device to open, or 0 to match any vendor.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@product_id@]: the Product ID (PID) of the types of device to open, or 0 to match any product.
+  -> IO (BG.Ptr SDL_hid_device_info)
+hidEnumerateSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_hid_enumerate (Coerce.coerce x00) (Coerce.coerce x11)
+
+-- | Free an enumeration linked list.
+--
+--     This function frees a linked list created by @'hidEnumerate'@.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_free_enumeration@.
+--                   The safe flavor is 'hidFreeEnumerationSafe'
+--                   .
+--
+--     [C declaration]: @SDL_hid_free_enumeration@, defined at @SDL3\/SDL_hidapi.h 253:34@
+hidFreeEnumeration
+  :: BG.Ptr SDL_hid_device_info
+  -- ^
+  --
+  --           [@devs@]: pointer to a list of struct_device returned from @'hidEnumerate'@.
+  -> IO ()
+hidFreeEnumeration = Unsafe.sDL_hid_free_enumeration
+
+-- | Free an enumeration linked list.
+--
+--     This function frees a linked list created by @'hidEnumerate'@.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_free_enumeration@.
+--                   The unsafe flavor is 'hidFreeEnumeration'
+--                   .
+--
+--     [C declaration]: @SDL_hid_free_enumeration@, defined at @SDL3\/SDL_hidapi.h 253:34@
+hidFreeEnumerationSafe
+  :: BG.Ptr SDL_hid_device_info
+  -- ^
+  --
+  --           [@devs@]: pointer to a list of struct_device returned from @'hidEnumerate'@.
+  -> IO ()
+hidFreeEnumerationSafe =
+  Safe.sDL_hid_free_enumeration
+
+-- | Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally a serial number.
+--
+--     If @serial_number@ is NULL, the first device with the specified VID and PID is opened.
+--
+--     [Returns]: a pointer to a 'SDL_hid_device' object on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_open@.
+--                   The safe flavor is 'hidOpenSafe'
+--                   : USB round-trip; blocks on the device.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_open@, defined at @SDL3\/SDL_hidapi.h 271:46@
+hidOpen
+  :: BG.Word16
+  -- ^
+  --
+  --           [@vendor_id@]: the Vendor ID (VID) of the device to open.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@product_id@]: the Product ID (PID) of the device to open.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@serial_number@]: the Serial Number of the device to open (Optionally NULL).
+  -> IO (BG.Ptr SDL_hid_device)
+hidOpen =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_hid_open (Coerce.coerce x00) (Coerce.coerce x11) x22
+
+-- | Open a HID device using a Vendor ID (VID), Product ID (PID) and optionally a serial number.
+--
+--     If @serial_number@ is NULL, the first device with the specified VID and PID is opened.
+--
+--     [Returns]: a pointer to a 'SDL_hid_device' object on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_open@.
+--                   The unsafe flavor is 'hidOpen'
+--                   : USB round-trip; blocks on the device.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_open@, defined at @SDL3\/SDL_hidapi.h 271:46@
+hidOpenSafe
+  :: BG.Word16
+  -- ^
+  --
+  --           [@vendor_id@]: the Vendor ID (VID) of the device to open.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@product_id@]: the Product ID (PID) of the device to open.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@serial_number@]: the Serial Number of the device to open (Optionally NULL).
+  -> IO (BG.Ptr SDL_hid_device)
+hidOpenSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_hid_open (Coerce.coerce x00) (Coerce.coerce x11) x22
+
+-- | Open a HID device by its path name.
+--
+--     The path name be determined by calling @'hidEnumerate'@, or a platform-specific path name can be used (eg: \/dev\/hidraw0 on Linux).
+--
+--     [Returns]: a pointer to a 'SDL_hid_device' object on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_open_path@.
+--                   The safe flavor is 'hidOpenPathSafe'
+--                   .
+--
+--     [C declaration]: @SDL_hid_open_path@, defined at @SDL3\/SDL_hidapi.h 285:46@
+hidOpenPath
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path name of the device to open.
+  -> IO (BG.Ptr SDL_hid_device)
+hidOpenPath = Unsafe.sDL_hid_open_path
+
+-- | Open a HID device by its path name.
+--
+--     The path name be determined by calling @'hidEnumerate'@, or a platform-specific path name can be used (eg: \/dev\/hidraw0 on Linux).
+--
+--     [Returns]: a pointer to a 'SDL_hid_device' object on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_open_path@.
+--                   The unsafe flavor is 'hidOpenPath'
+--                   .
+--
+--     [C declaration]: @SDL_hid_open_path@, defined at @SDL3\/SDL_hidapi.h 285:46@
+hidOpenPathSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path name of the device to open.
+  -> IO (BG.Ptr SDL_hid_device)
+hidOpenPathSafe = Safe.sDL_hid_open_path
+
+-- | Get the properties associated with an 'SDL_hid_device'.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER'@: the libusb_device_handle associated with the device, if it was opened using libusb.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_get_properties@.
+--                   The safe flavor is 'hidGetPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_hid_get_properties@, defined at @SDL3\/SDL_hidapi.h 301:46@
+hidGetProperties
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hidGetProperties = Unsafe.sDL_hid_get_properties
+
+-- | Get the properties associated with an 'SDL_hid_device'.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_HIDAPI_LIBUSB_DEVICE_HANDLE_POINTER'@: the libusb_device_handle associated with the device, if it was opened using libusb.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_get_properties@.
+--                   The unsafe flavor is 'hidGetProperties'
+--                   .
+--
+--     [C declaration]: @SDL_hid_get_properties@, defined at @SDL3\/SDL_hidapi.h 301:46@
+hidGetPropertiesSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+hidGetPropertiesSafe = Safe.sDL_hid_get_properties
+
+-- | Write an Output report to a HID device.
+--
+--     The first byte of @data@ must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to @'hidWrite'@ will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to @'hidWrite'@, the Report ID (or 0x0, for devices with a single report), followed by the report data (16 bytes). In this example, the length passed in would be 17.
+--
+--     @'hidWrite'@ will send the data on the first OUT endpoint, if one exists. If it does not, it will send the data through the Control Endpoint (Endpoint 0).
+--
+--     [Returns]: the actual number of bytes written and -1 on on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_write@.
+--                   The safe flavor is 'hidWriteSafe'
+--                   : USB round-trip; blocks on the device.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_write@, defined at @SDL3\/SDL_hidapi.h 330:33@
+hidWrite
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> PtrConst.PtrConst BG.CUChar
+  -- ^
+  --
+  --           [@data@]: the data to send, including the report number as the first byte.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the length in bytes of the data to send.
+  -> IO BG.Int32
+hidWrite =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_hid_write x00 x11 (Coerce.coerce x22))
+
+-- | Write an Output report to a HID device.
+--
+--     The first byte of @data@ must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to @'hidWrite'@ will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to @'hidWrite'@, the Report ID (or 0x0, for devices with a single report), followed by the report data (16 bytes). In this example, the length passed in would be 17.
+--
+--     @'hidWrite'@ will send the data on the first OUT endpoint, if one exists. If it does not, it will send the data through the Control Endpoint (Endpoint 0).
+--
+--     [Returns]: the actual number of bytes written and -1 on on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_write@.
+--                   The unsafe flavor is 'hidWrite'
+--                   : USB round-trip; blocks on the device.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_write@, defined at @SDL3\/SDL_hidapi.h 330:33@
+hidWriteSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> PtrConst.PtrConst BG.CUChar
+  -- ^
+  --
+  --           [@data@]: the data to send, including the report number as the first byte.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the length in bytes of the data to send.
+  -> IO BG.Int32
+hidWriteSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_hid_write x00 x11 (Coerce.coerce x22))
+
+-- | Read an Input report from a HID device with timeout.
+--
+--     Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports.
+--
+--     [Returns]: the actual number of bytes read and -1 on on failure; call 'SDL3.Sys.Error.getError' for more information. If no packet was available to be read within the timeout period, this function returns 0.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_read_timeout@.
+--                   The safe flavor is 'hidReadTimeoutSafe'
+--                   : blocks up to the timeout.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_read_timeout@, defined at @SDL3\/SDL_hidapi.h 351:33@
+hidReadTimeout
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@milliseconds@]: timeout in milliseconds or -1 for blocking wait.
+  -> IO BG.Int32
+hidReadTimeout =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap Coerce.coerce (Unsafe.sDL_hid_read_timeout x00 x11 (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Read an Input report from a HID device with timeout.
+--
+--     Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports.
+--
+--     [Returns]: the actual number of bytes read and -1 on on failure; call 'SDL3.Sys.Error.getError' for more information. If no packet was available to be read within the timeout period, this function returns 0.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_read_timeout@.
+--                   The unsafe flavor is 'hidReadTimeout'
+--                   : blocks up to the timeout.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_read_timeout@, defined at @SDL3\/SDL_hidapi.h 351:33@
+hidReadTimeoutSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@milliseconds@]: timeout in milliseconds or -1 for blocking wait.
+  -> IO BG.Int32
+hidReadTimeoutSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap Coerce.coerce (Safe.sDL_hid_read_timeout x00 x11 (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Read an Input report from a HID device.
+--
+--     Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports.
+--
+--     [Returns]: the actual number of bytes read and -1 on failure; call 'SDL3.Sys.Error.getError' for more information. If no packet was available to be read and the handle is in non-blocking mode, this function returns 0.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_read@.
+--                   The safe flavor is 'hidReadSafe'
+--                   : blocks in the device\'s blocking mode (the default); an unsafe call stalls every capability and GC.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_read@, defined at @SDL3\/SDL_hidapi.h 372:33@
+hidRead
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number.
+  -> IO BG.Int32
+hidRead =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_hid_read x00 x11 (Coerce.coerce x22))
+
+-- | Read an Input report from a HID device.
+--
+--     Input reports are returned to the host through the INTERRUPT IN endpoint. The first byte will contain the Report number if the device uses numbered reports.
+--
+--     [Returns]: the actual number of bytes read and -1 on failure; call 'SDL3.Sys.Error.getError' for more information. If no packet was available to be read and the handle is in non-blocking mode, this function returns 0.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_read@.
+--                   The unsafe flavor is 'hidRead'
+--                   : blocks in the device\'s blocking mode (the default); an unsafe call stalls every capability and GC.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_read@, defined at @SDL3\/SDL_hidapi.h 372:33@
+hidReadSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read. For devices with multiple reports, make sure to read an extra byte for the report number.
+  -> IO BG.Int32
+hidReadSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_hid_read x00 x11 (Coerce.coerce x22))
+
+-- | Set the device handle to be non-blocking.
+--
+--     In non-blocking mode calls to @'hidRead'@ will return immediately with a value of 0 if there is no data to be read. In blocking mode, @'hidRead'@ will wait (block) until there is data to read before returning.
+--
+--     Nonblocking can be turned on and off at any time.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_set_nonblocking@.
+--                   The safe flavor is 'hidSetNonblockingSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_set_nonblocking@, defined at @SDL3\/SDL_hidapi.h 391:33@
+hidSetNonblocking
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@nonblock@]: enable or not the nonblocking reads - 1 to enable nonblocking - 0 to disable nonblocking.
+  -> IO BG.Int32
+hidSetNonblocking =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_hid_set_nonblocking x00 (Coerce.coerce x11))
+
+-- | Set the device handle to be non-blocking.
+--
+--     In non-blocking mode calls to @'hidRead'@ will return immediately with a value of 0 if there is no data to be read. In blocking mode, @'hidRead'@ will wait (block) until there is data to read before returning.
+--
+--     Nonblocking can be turned on and off at any time.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_set_nonblocking@.
+--                   The unsafe flavor is 'hidSetNonblocking'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_set_nonblocking@, defined at @SDL3\/SDL_hidapi.h 391:33@
+hidSetNonblockingSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@nonblock@]: enable or not the nonblocking reads - 1 to enable nonblocking - 0 to disable nonblocking.
+  -> IO BG.Int32
+hidSetNonblockingSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_hid_set_nonblocking x00 (Coerce.coerce x11))
+
+-- | Send a Feature report to the device.
+--
+--     Feature reports are sent over the Control endpoint as a Set_Report transfer. The first byte of @data@ must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to @'hidSendFeatureReport'@ will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to @'hidSendFeatureReport'@: the Report ID (or 0x0, for devices which do not use numbered reports), followed by the report data (16 bytes). In this example, the length passed in would be 17.
+--
+--     [Returns]: the actual number of bytes written and -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_send_feature_report@.
+--                   The safe flavor is 'hidSendFeatureReportSafe'
+--                   : USB round-trip; blocks on the device.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_send_feature_report@, defined at @SDL3\/SDL_hidapi.h 416:33@
+hidSendFeatureReport
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> PtrConst.PtrConst BG.CUChar
+  -- ^
+  --
+  --           [@data@]: the data to send, including the report number as the first byte.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the length in bytes of the data to send, including the report number.
+  -> IO BG.Int32
+hidSendFeatureReport =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_hid_send_feature_report x00 x11 (Coerce.coerce x22))
+
+-- | Send a Feature report to the device.
+--
+--     Feature reports are sent over the Control endpoint as a Set_Report transfer. The first byte of @data@ must contain the Report ID. For devices which only support a single report, this must be set to 0x0. The remaining bytes contain the report data. Since the Report ID is mandatory, calls to @'hidSendFeatureReport'@ will always contain one more byte than the report contains. For example, if a hid report is 16 bytes long, 17 bytes must be passed to @'hidSendFeatureReport'@: the Report ID (or 0x0, for devices which do not use numbered reports), followed by the report data (16 bytes). In this example, the length passed in would be 17.
+--
+--     [Returns]: the actual number of bytes written and -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_send_feature_report@.
+--                   The unsafe flavor is 'hidSendFeatureReport'
+--                   : USB round-trip; blocks on the device.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_send_feature_report@, defined at @SDL3\/SDL_hidapi.h 416:33@
+hidSendFeatureReportSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> PtrConst.PtrConst BG.CUChar
+  -- ^
+  --
+  --           [@data@]: the data to send, including the report number as the first byte.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the length in bytes of the data to send, including the report number.
+  -> IO BG.Int32
+hidSendFeatureReportSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_hid_send_feature_report x00 x11 (Coerce.coerce x22))
+
+-- | Get a feature report from a HID device.
+--
+--     Set the first byte of @data@ to the Report ID of the report to be read. Make sure to allow space for this extra byte in @data@. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1].
+--
+--     [Returns]: the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_get_feature_report@.
+--                   The safe flavor is 'hidGetFeatureReportSafe'
+--                   : USB round-trip; blocks on the device.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_feature_report@, defined at @SDL3\/SDL_hidapi.h 439:33@
+hidGetFeatureReport
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into, including the Report ID. Set the first byte of @data@ to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report.
+  -> IO BG.Int32
+hidGetFeatureReport =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_hid_get_feature_report x00 x11 (Coerce.coerce x22))
+
+-- | Get a feature report from a HID device.
+--
+--     Set the first byte of @data@ to the Report ID of the report to be read. Make sure to allow space for this extra byte in @data@. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1].
+--
+--     [Returns]: the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_get_feature_report@.
+--                   The unsafe flavor is 'hidGetFeatureReport'
+--                   : USB round-trip; blocks on the device.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_feature_report@, defined at @SDL3\/SDL_hidapi.h 439:33@
+hidGetFeatureReportSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into, including the Report ID. Set the first byte of @data@ to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report.
+  -> IO BG.Int32
+hidGetFeatureReportSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_hid_get_feature_report x00 x11 (Coerce.coerce x22))
+
+-- | Get an input report from a HID device.
+--
+--     Set the first byte of @data@ to the Report ID of the report to be read. Make sure to allow space for this extra byte in @data@. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1].
+--
+--     [Returns]: the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_get_input_report@.
+--                   The safe flavor is 'hidGetInputReportSafe'
+--                   : USB round-trip; blocks on the device.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_input_report@, defined at @SDL3\/SDL_hidapi.h 462:33@
+hidGetInputReport
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into, including the Report ID. Set the first byte of @data@ to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report.
+  -> IO BG.Int32
+hidGetInputReport =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_hid_get_input_report x00 x11 (Coerce.coerce x22))
+
+-- | Get an input report from a HID device.
+--
+--     Set the first byte of @data@ to the Report ID of the report to be read. Make sure to allow space for this extra byte in @data@. Upon return, the first byte will still contain the Report ID, and the report data will start in data[1].
+--
+--     [Returns]: the number of bytes read plus one for the report ID (which is still in the first byte), or -1 on on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_get_input_report@.
+--                   The unsafe flavor is 'hidGetInputReport'
+--                   : USB round-trip; blocks on the device.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_input_report@, defined at @SDL3\/SDL_hidapi.h 462:33@
+hidGetInputReportSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@data@]: a buffer to put the read data into, including the Report ID. Set the first byte of @data@ to the Report ID of the report to be read, or set it to zero if your device does not use numbered reports.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the number of bytes to read, including an extra byte for the report ID. The buffer can be longer than the actual report.
+  -> IO BG.Int32
+hidGetInputReportSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_hid_get_input_report x00 x11 (Coerce.coerce x22))
+
+-- | Close a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_close@.
+--                   The safe flavor is 'hidCloseSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_close@, defined at @SDL3\/SDL_hidapi.h 473:33@
+hidClose
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> IO BG.Int32
+hidClose =
+  \x00 -> fmap Coerce.coerce (Unsafe.sDL_hid_close x00)
+
+-- | Close a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_close@.
+--                   The unsafe flavor is 'hidClose'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_close@, defined at @SDL3\/SDL_hidapi.h 473:33@
+hidCloseSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> IO BG.Int32
+hidCloseSafe =
+  \x00 -> fmap Coerce.coerce (Safe.sDL_hid_close x00)
+
+-- | Get The Manufacturer String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_get_manufacturer_string@.
+--                   The safe flavor is 'hidGetManufacturerStringSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_manufacturer_string@, defined at @SDL3\/SDL_hidapi.h 486:33@
+hidGetManufacturerString
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.Int32
+hidGetManufacturerString =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_hid_get_manufacturer_string x00 x11 (Coerce.coerce x22))
+
+-- | Get The Manufacturer String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_get_manufacturer_string@.
+--                   The unsafe flavor is 'hidGetManufacturerString'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_manufacturer_string@, defined at @SDL3\/SDL_hidapi.h 486:33@
+hidGetManufacturerStringSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.Int32
+hidGetManufacturerStringSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_hid_get_manufacturer_string x00 x11 (Coerce.coerce x22))
+
+-- | Get The Product String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_get_product_string@.
+--                   The safe flavor is 'hidGetProductStringSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_product_string@, defined at @SDL3\/SDL_hidapi.h 499:33@
+hidGetProductString
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.Int32
+hidGetProductString =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_hid_get_product_string x00 x11 (Coerce.coerce x22))
+
+-- | Get The Product String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_get_product_string@.
+--                   The unsafe flavor is 'hidGetProductString'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_product_string@, defined at @SDL3\/SDL_hidapi.h 499:33@
+hidGetProductStringSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.Int32
+hidGetProductStringSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_hid_get_product_string x00 x11 (Coerce.coerce x22))
+
+-- | Get The Serial Number String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_get_serial_number_string@.
+--                   The safe flavor is 'hidGetSerialNumberStringSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_serial_number_string@, defined at @SDL3\/SDL_hidapi.h 512:33@
+hidGetSerialNumberString
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.Int32
+hidGetSerialNumberString =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_hid_get_serial_number_string x00 x11 (Coerce.coerce x22))
+
+-- | Get The Serial Number String from a HID device.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_get_serial_number_string@.
+--                   The unsafe flavor is 'hidGetSerialNumberString'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_serial_number_string@, defined at @SDL3\/SDL_hidapi.h 512:33@
+hidGetSerialNumberStringSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.Int32
+hidGetSerialNumberStringSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_hid_get_serial_number_string x00 x11 (Coerce.coerce x22))
+
+-- | Get a string from a HID device, based on its string index.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_get_indexed_string@.
+--                   The safe flavor is 'hidGetIndexedStringSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_indexed_string@, defined at @SDL3\/SDL_hidapi.h 526:33@
+hidGetIndexedString
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@string_index@]: the index of the string to get.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.Int32
+hidGetIndexedString =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            Coerce.coerce
+            (Unsafe.sDL_hid_get_indexed_string x00 (Coerce.coerce x11) x22 (Coerce.coerce x33))
+
+-- | Get a string from a HID device, based on its string index.
+--
+--     [Returns]: 0 on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_get_indexed_string@.
+--                   The unsafe flavor is 'hidGetIndexedString'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_indexed_string@, defined at @SDL3\/SDL_hidapi.h 526:33@
+hidGetIndexedStringSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@string_index@]: the index of the string to get.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@string@]: a wide string buffer to put the data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the length of the buffer in multiples of wchar_t.
+  -> IO BG.Int32
+hidGetIndexedStringSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap Coerce.coerce (Safe.sDL_hid_get_indexed_string x00 (Coerce.coerce x11) x22 (Coerce.coerce x33))
+
+-- | Get the device info from a HID device.
+--
+--     [Returns]: a pointer to the 'SDL_hid_device_info' for this hid_device or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This struct is valid until the device is closed with @'hidClose'@.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_get_device_info@.
+--                   The safe flavor is 'hidGetDeviceInfoSafe'
+--                   .
+--
+--     [C declaration]: @SDL_hid_get_device_info@, defined at @SDL3\/SDL_hidapi.h 538:51@
+hidGetDeviceInfo
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> IO (BG.Ptr SDL_hid_device_info)
+hidGetDeviceInfo = Unsafe.sDL_hid_get_device_info
+
+-- | Get the device info from a HID device.
+--
+--     [Returns]: a pointer to the 'SDL_hid_device_info' for this hid_device or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This struct is valid until the device is closed with @'hidClose'@.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_get_device_info@.
+--                   The unsafe flavor is 'hidGetDeviceInfo'
+--                   .
+--
+--     [C declaration]: @SDL_hid_get_device_info@, defined at @SDL3\/SDL_hidapi.h 538:51@
+hidGetDeviceInfoSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> IO (BG.Ptr SDL_hid_device_info)
+hidGetDeviceInfoSafe = Safe.sDL_hid_get_device_info
+
+-- | Get a report descriptor from a HID device.
+--
+--     User has to provide a preallocated buffer where descriptor will be copied to. The recommended size for a preallocated buffer is 4096 bytes.
+--
+--     [Returns]: the number of bytes actually copied or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_get_report_descriptor@.
+--                   The safe flavor is 'hidGetReportDescriptorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_report_descriptor@, defined at @SDL3\/SDL_hidapi.h 554:33@
+hidGetReportDescriptor
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@buf@]: the buffer to copy descriptor into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@buf_size@]: the size of the buffer in bytes.
+  -> IO BG.Int32
+hidGetReportDescriptor =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_hid_get_report_descriptor x00 x11 (Coerce.coerce x22))
+
+-- | Get a report descriptor from a HID device.
+--
+--     User has to provide a preallocated buffer where descriptor will be copied to. The recommended size for a preallocated buffer is 4096 bytes.
+--
+--     [Returns]: the number of bytes actually copied or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_get_report_descriptor@.
+--                   The unsafe flavor is 'hidGetReportDescriptor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_get_report_descriptor@, defined at @SDL3\/SDL_hidapi.h 554:33@
+hidGetReportDescriptorSafe
+  :: BG.Ptr SDL_hid_device
+  -- ^
+  --
+  --           [@dev@]: a device handle returned from @'hidOpen'@.
+  -> BG.Ptr BG.CUChar
+  -- ^
+  --
+  --           [@buf@]: the buffer to copy descriptor into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@buf_size@]: the size of the buffer in bytes.
+  -> IO BG.Int32
+hidGetReportDescriptorSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_hid_get_report_descriptor x00 x11 (Coerce.coerce x22))
+
+-- | Start or stop a BLE scan on iOS and tvOS to pair Steam Controllers.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_hid_ble_scan@.
+--                   The safe flavor is 'hidBleScanSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_ble_scan@, defined at @SDL3\/SDL_hidapi.h 563:34@
+hidBleScan
+  :: Bool
+  -- ^
+  --
+  --           [@active@]: true to start the scan, false to stop the scan.
+  -> IO ()
+hidBleScan =
+  \x00 -> Unsafe.sDL_hid_ble_scan (CBool.fromBool x00)
+
+-- | Start or stop a BLE scan on iOS and tvOS to pair Steam Controllers.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_hid_ble_scan@.
+--                   The unsafe flavor is 'hidBleScan'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_hid_ble_scan@, defined at @SDL3\/SDL_hidapi.h 563:34@
+hidBleScanSafe
+  :: Bool
+  -- ^
+  --
+  --           [@active@]: true to start the scan, false to stop the scan.
+  -> IO ()
+hidBleScanSafe =
+  \x00 -> Safe.sDL_hid_ble_scan (CBool.fromBool x00)
diff --git a/src/SDL3/Sys/Hints.hs b/src/SDL3/Sys/Hints.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Hints.hs
@@ -0,0 +1,536 @@
+-- | This file contains functions to set and get configuration hints, as well as listing each of them alphabetically.
+--
+--     The convention for naming hints is SDL_HINT_X, where \"SDL_X\" is the environment variable that can be used to override the default.
+--
+--     In general these hints are just that - they may or may not be supported or applicable on any given platform, but they provide a way for an application or user to give the library a hint as to how they would like the library to work. Specify the behavior of Alt+Tab while the keyboard is grabbed.
+--
+--     By default, SDL emulates Alt+Tab functionality while the keyboard is grabbed and your window is full-screen. This prevents the user from getting stuck in your application if you\'ve enabled keyboard grab.
+--
+--     The variable can be set to the following values:
+--
+--     * \"0\": SDL will not handle Alt+Tab. Your application is responsible for handling Alt+Tab while the keyboard is grabbed.
+--
+--     * \"1\": SDL will minimize your window when Alt+Tab is pressed (default)
+--
+--     This hint can be set anytime.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Hints.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Hints (
+  module SDL3.Sys.Bindgen.Hints,
+
+  -- * Function aliases
+  SDL3.Sys.Hints.setHintWithPriority,
+  SDL3.Sys.Hints.setHintWithPrioritySafe,
+  SDL3.Sys.Hints.setHint,
+  SDL3.Sys.Hints.setHintSafe,
+  SDL3.Sys.Hints.resetHint,
+  SDL3.Sys.Hints.resetHintSafe,
+  SDL3.Sys.Hints.resetHints,
+  SDL3.Sys.Hints.resetHintsSafe,
+  SDL3.Sys.Hints.getHint,
+  SDL3.Sys.Hints.getHintSafe,
+  SDL3.Sys.Hints.getHintBoolean,
+  SDL3.Sys.Hints.getHintBooleanSafe,
+  SDL3.Sys.Hints.addHintCallbackSafe,
+  SDL3.Sys.Hints.removeHintCallback,
+  SDL3.Sys.Hints.removeHintCallbackSafe,
+)
+where
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Hints
+import SDL3.Sys.Bindgen.Hints.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Hints.Unsafe qualified as Unsafe
+
+-- | Set a hint with a specific priority.
+--
+--     The priority controls the behavior when setting a hint that already has a value. Hints will replace existing hints of their priority and lower. Environment variables are considered to have override priority.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHint', 'resetHint', 'setHint'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetHintWithPriority@.
+--                   The safe flavor is 'setHintWithPrioritySafe'
+--                   : runs registered hint callbacks synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetHintWithPriority@, defined at @SDL3\/SDL_hints.h 4756:34@
+setHintWithPriority
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the hint variable.
+  -> SDL_HintPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_HintPriority' level for the hint.
+  -> IO Bool
+setHintWithPriority =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetHintWithPriority x00 x11 x22)
+
+-- | Set a hint with a specific priority.
+--
+--     The priority controls the behavior when setting a hint that already has a value. Hints will replace existing hints of their priority and lower. Environment variables are considered to have override priority.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHint', 'resetHint', 'setHint'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetHintWithPriority@.
+--                   The unsafe flavor is 'setHintWithPriority'
+--                   : runs registered hint callbacks synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetHintWithPriority@, defined at @SDL3\/SDL_hints.h 4756:34@
+setHintWithPrioritySafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the hint variable.
+  -> SDL_HintPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_HintPriority' level for the hint.
+  -> IO Bool
+setHintWithPrioritySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetHintWithPriority x00 x11 x22)
+
+-- | Set a hint with normal priority.
+--
+--     Hints will not be set if there is an existing override hint or environment variable that takes precedence. You can use @'setHintWithPriority'@ to set the hint with override priority instead.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHint', 'resetHint', 'setHintWithPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetHint@.
+--                   The safe flavor is 'setHintSafe'
+--                   : runs registered hint callbacks synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetHint@, defined at @SDL3\/SDL_hints.h 4778:34@
+setHint
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the hint variable.
+  -> IO Bool
+setHint =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetHint x00 x11)
+
+-- | Set a hint with normal priority.
+--
+--     Hints will not be set if there is an existing override hint or environment variable that takes precedence. You can use @'setHintWithPriority'@ to set the hint with override priority instead.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHint', 'resetHint', 'setHintWithPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetHint@.
+--                   The unsafe flavor is 'setHint'
+--                   : runs registered hint callbacks synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetHint@, defined at @SDL3\/SDL_hints.h 4778:34@
+setHintSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the hint variable.
+  -> IO Bool
+setHintSafe =
+  \x00 ->
+    \x11 -> fmap CBool.toBool (Safe.sDL_SetHint x00 x11)
+
+-- | Reset a hint to the default value.
+--
+--     This will reset a hint to the value of the environment variable, or NULL if the environment isn\'t set. Callbacks will be called normally with this change.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setHint', 'resetHints'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ResetHint@.
+--                   The safe flavor is 'resetHintSafe'
+--                   : runs registered hint callbacks synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ResetHint@, defined at @SDL3\/SDL_hints.h 4798:34@
+resetHint
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> IO Bool
+resetHint =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_ResetHint x00)
+
+-- | Reset a hint to the default value.
+--
+--     This will reset a hint to the value of the environment variable, or NULL if the environment isn\'t set. Callbacks will be called normally with this change.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setHint', 'resetHints'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ResetHint@.
+--                   The unsafe flavor is 'resetHint'
+--                   : runs registered hint callbacks synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ResetHint@, defined at @SDL3\/SDL_hints.h 4798:34@
+resetHintSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to set.
+  -> IO Bool
+resetHintSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_ResetHint x00)
+
+-- | Reset all hints to the default values.
+--
+--     This will reset all hints to the value of the associated environment variable, or NULL if the environment isn\'t set. Callbacks will be called normally with this change.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resetHint'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ResetHints@.
+--                   The safe flavor is 'resetHintsSafe'
+--                   : runs registered hint callbacks synchronously.
+--
+--     [C declaration]: @SDL_ResetHints@, defined at @SDL3\/SDL_hints.h 4813:34@
+resetHints :: IO ()
+resetHints = Unsafe.sDL_ResetHints
+
+-- | Reset all hints to the default values.
+--
+--     This will reset all hints to the value of the associated environment variable, or NULL if the environment isn\'t set. Callbacks will be called normally with this change.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resetHint'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ResetHints@.
+--                   The unsafe flavor is 'resetHints'
+--                   : runs registered hint callbacks synchronously.
+--
+--     [C declaration]: @SDL_ResetHints@, defined at @SDL3\/SDL_hints.h 4813:34@
+resetHintsSafe :: IO ()
+resetHintsSafe = Safe.sDL_ResetHints
+
+-- | Get the value of a hint.
+--
+--     [Returns]: the string value of a hint or NULL if the hint isn\'t set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setHint', 'setHintWithPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetHint@.
+--                   The safe flavor is 'getHintSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetHint@, defined at @SDL3\/SDL_hints.h 4828:41@
+getHint
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getHint = Unsafe.sDL_GetHint
+
+-- | Get the value of a hint.
+--
+--     [Returns]: the string value of a hint or NULL if the hint isn\'t set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setHint', 'setHintWithPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetHint@.
+--                   The unsafe flavor is 'getHint'
+--                   .
+--
+--     [C declaration]: @SDL_GetHint@, defined at @SDL3\/SDL_hints.h 4828:41@
+getHintSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getHintSafe = Safe.sDL_GetHint
+
+-- | Get the boolean value of a hint variable.
+--
+--     [Returns]: the boolean value of a hint or the provided default value if the hint does not exist.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHint', 'setHint'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetHintBoolean@.
+--                   The safe flavor is 'getHintBooleanSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetHintBoolean@, defined at @SDL3\/SDL_hints.h 4845:34@
+getHintBoolean
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the hint to get the boolean value from.
+  -> Bool
+  -- ^
+  --
+  --           [@default_value@]: the value to return if the hint does not exist.
+  -> IO Bool
+getHintBoolean =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetHintBoolean x00 (CBool.fromBool x11))
+
+-- | Get the boolean value of a hint variable.
+--
+--     [Returns]: the boolean value of a hint or the provided default value if the hint does not exist.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getHint', 'setHint'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetHintBoolean@.
+--                   The unsafe flavor is 'getHintBoolean'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetHintBoolean@, defined at @SDL3\/SDL_hints.h 4845:34@
+getHintBooleanSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the hint to get the boolean value from.
+  -> Bool
+  -- ^
+  --
+  --           [@default_value@]: the value to return if the hint does not exist.
+  -> IO Bool
+getHintBooleanSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetHintBoolean x00 (CBool.fromBool x11))
+
+-- | Add a function to watch a particular hint.
+--
+--     The callback function is called /during/ this function, to provide it an initial value, and again each time the hint\'s value changes.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'removeHintCallback'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddHintCallback@.
+--                   The unsafe import is not exported
+--                   : invokes the callback once immediately with the current hint value.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Hints.Unsafe.sDL_AddHintCallback@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddHintCallback@, defined at @SDL3\/SDL_hints.h 4887:34@
+addHintCallbackSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint to watch.
+  -> SDL_HintCallback
+  -- ^
+  --
+  --           [@callback@]: An 'SDL_HintCallback' function that will be called when the hint value changes.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to the callback function.
+  -> IO Bool
+addHintCallbackSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_AddHintCallback x00 x11 x22)
+
+-- | Remove a function watching a particular hint.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addHintCallbackSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RemoveHintCallback@.
+--                   The safe flavor is 'removeHintCallbackSafe'
+--                   : deregistration only.
+--
+--     [C declaration]: @SDL_RemoveHintCallback@, defined at @SDL3\/SDL_hints.h 4903:34@
+removeHintCallback
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint being watched.
+  -> SDL_HintCallback
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_HintCallback' function that will be called when the hint value changes.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer being passed to the callback function.
+  -> IO ()
+removeHintCallback = Unsafe.sDL_RemoveHintCallback
+
+-- | Remove a function watching a particular hint.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addHintCallbackSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RemoveHintCallback@.
+--                   The unsafe flavor is 'removeHintCallback'
+--                   : deregistration only.
+--
+--     [C declaration]: @SDL_RemoveHintCallback@, defined at @SDL3\/SDL_hints.h 4903:34@
+removeHintCallbackSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the hint being watched.
+  -> SDL_HintCallback
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_HintCallback' function that will be called when the hint value changes.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer being passed to the callback function.
+  -> IO ()
+removeHintCallbackSafe = Safe.sDL_RemoveHintCallback
diff --git a/src/SDL3/Sys/Init.hs b/src/SDL3/Sys/Init.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Init.hs
@@ -0,0 +1,789 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | All SDL programs need to initialize the library before starting to work with it.
+--
+--     Almost everything can simply call @'init'@ near startup, with a handful of flags to specify subsystems to touch. These are here to make sure SDL does not even attempt to touch low-level pieces of the operating system that you don\'t intend to use. For example, you might be using SDL for video and input but chose an external library for audio, and in this case you would just need to leave off the @'sDL_INIT_AUDIO'@ flag to make sure that external library has complete control.
+--
+--     Most apps, when terminating, should call @'quit'@. This will clean up (nearly) everything that SDL might have allocated, and crucially, it\'ll make sure that the display\'s resolution is back to what the user expects if you had previously changed it for your game.
+--
+--     SDL3 apps are strongly encouraged to call @'setAppMetadata'@ at startup to fill in details about the program. This is completely optional, but it helps in small ways (we can provide an About dialog box for the macOS menu, we can name the app in the system\'s audio mixer, etc). Those that want to provide a /lot/ of information should look at the more-detailed @'setAppMetadataProperty'@. Initialization flags for 'init' and\/or 'initSubSystem'
+--
+--     These are the flags which may be passed to @'init'@. You should specify the subsystems which you will be using in your application.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'init', 'quit', 'initSubSystem', 'quitSubSystem', 'wasInit'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Init.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Init (
+  module SDL3.Sys.Bindgen.Init,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Init.SDL_INIT_AUDIO,
+  pattern SDL3.Sys.Init.SDL_INIT_VIDEO,
+  pattern SDL3.Sys.Init.SDL_INIT_JOYSTICK,
+  pattern SDL3.Sys.Init.SDL_INIT_HAPTIC,
+  pattern SDL3.Sys.Init.SDL_INIT_GAMEPAD,
+  pattern SDL3.Sys.Init.SDL_INIT_EVENTS,
+  pattern SDL3.Sys.Init.SDL_INIT_SENSOR,
+  pattern SDL3.Sys.Init.SDL_INIT_CAMERA,
+
+  -- * Function aliases
+  SDL3.Sys.Init.init,
+  SDL3.Sys.Init.initSafe,
+  SDL3.Sys.Init.initSubSystem,
+  SDL3.Sys.Init.initSubSystemSafe,
+  SDL3.Sys.Init.quitSubSystem,
+  SDL3.Sys.Init.quitSubSystemSafe,
+  SDL3.Sys.Init.wasInit,
+  SDL3.Sys.Init.wasInitSafe,
+  SDL3.Sys.Init.quit,
+  SDL3.Sys.Init.quitSafe,
+  SDL3.Sys.Init.isMainThread,
+  SDL3.Sys.Init.isMainThreadSafe,
+  SDL3.Sys.Init.runOnMainThreadSafe,
+  SDL3.Sys.Init.setAppMetadata,
+  SDL3.Sys.Init.setAppMetadataSafe,
+  SDL3.Sys.Init.setAppMetadataProperty,
+  SDL3.Sys.Init.setAppMetadataPropertySafe,
+  SDL3.Sys.Init.getAppMetadataProperty,
+  SDL3.Sys.Init.getAppMetadataPropertySafe,
+)
+where
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Init
+import SDL3.Sys.Bindgen.Init.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Init.Unsafe qualified as Unsafe
+
+-- | Initialize the SDL library.
+--
+--     @'init'@ simply forwards to calling @'initSubSystem'@. Therefore, the two may be used interchangeably. Though for readability of your code @'initSubSystem'@ might be preferred.
+--
+--     The file I\/O (for example: SDL_IOFromFile) and threading (SDL_CreateThread) subsystems are initialized by default. Message boxes (SDL_ShowSimpleMessageBox) also attempt to work without initializing the video subsystem, in hopes of being useful in showing an error dialog when 'init' fails. You must specifically initialize other subsystems if you use them in your application.
+--
+--     Logging (such as SDL_Log) works without initialization, too.
+--
+--     @flags@ may be any of the following OR\'d together:
+--
+--     * @'sDL_INIT_AUDIO'@: audio subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_VIDEO'@: video subsystem; automatically initializes the events subsystem, should be initialized on the main thread.
+--
+--     * @'sDL_INIT_JOYSTICK'@: joystick subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_HAPTIC'@: haptic (force feedback) subsystem
+--
+--     * @'sDL_INIT_GAMEPAD'@: gamepad subsystem; automatically initializes the joystick subsystem
+--
+--     * @'sDL_INIT_EVENTS'@: events subsystem
+--
+--     * @'sDL_INIT_SENSOR'@: sensor subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_CAMERA'@: camera subsystem; automatically initializes the events subsystem
+--
+--     Subsystem initialization is ref-counted, you must call @'quitSubSystem'@ for each @'initSubSystem'@ to correctly shutdown a subsystem manually (or call @'quit'@ to force shutdown). If a subsystem is already loaded then this call will increase the ref-count and return.
+--
+--     Consider reporting some basic metadata about your application before calling 'init', using either @'setAppMetadata'@ or @'setAppMetadataProperty'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAppMetadata', 'setAppMetadataProperty', 'initSubSystem', 'quit', 'SDL3.Sys.Main.setMainReady', 'wasInit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Init@.
+--                   The safe flavor is 'initSafe'
+--                   : driver loading can take hundreds of milliseconds.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_Init@, defined at @SDL3\/SDL_init.h 238:34@
+init
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: subsystem initialization flags.
+  -> IO Bool
+init =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_Init x00)
+
+-- | Initialize the SDL library.
+--
+--     @'init'@ simply forwards to calling @'initSubSystem'@. Therefore, the two may be used interchangeably. Though for readability of your code @'initSubSystem'@ might be preferred.
+--
+--     The file I\/O (for example: SDL_IOFromFile) and threading (SDL_CreateThread) subsystems are initialized by default. Message boxes (SDL_ShowSimpleMessageBox) also attempt to work without initializing the video subsystem, in hopes of being useful in showing an error dialog when 'init' fails. You must specifically initialize other subsystems if you use them in your application.
+--
+--     Logging (such as SDL_Log) works without initialization, too.
+--
+--     @flags@ may be any of the following OR\'d together:
+--
+--     * @'sDL_INIT_AUDIO'@: audio subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_VIDEO'@: video subsystem; automatically initializes the events subsystem, should be initialized on the main thread.
+--
+--     * @'sDL_INIT_JOYSTICK'@: joystick subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_HAPTIC'@: haptic (force feedback) subsystem
+--
+--     * @'sDL_INIT_GAMEPAD'@: gamepad subsystem; automatically initializes the joystick subsystem
+--
+--     * @'sDL_INIT_EVENTS'@: events subsystem
+--
+--     * @'sDL_INIT_SENSOR'@: sensor subsystem; automatically initializes the events subsystem
+--
+--     * @'sDL_INIT_CAMERA'@: camera subsystem; automatically initializes the events subsystem
+--
+--     Subsystem initialization is ref-counted, you must call @'quitSubSystem'@ for each @'initSubSystem'@ to correctly shutdown a subsystem manually (or call @'quit'@ to force shutdown). If a subsystem is already loaded then this call will increase the ref-count and return.
+--
+--     Consider reporting some basic metadata about your application before calling 'init', using either @'setAppMetadata'@ or @'setAppMetadataProperty'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAppMetadata', 'setAppMetadataProperty', 'initSubSystem', 'quit', 'SDL3.Sys.Main.setMainReady', 'wasInit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Init@.
+--                   The unsafe flavor is 'init'
+--                   : driver loading can take hundreds of milliseconds.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_Init@, defined at @SDL3\/SDL_init.h 238:34@
+initSafe
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: subsystem initialization flags.
+  -> IO Bool
+initSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_Init x00)
+
+-- | Compatibility function to initialize the SDL library.
+--
+--     This function and @'init'@ are interchangeable.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'init', 'quit', 'quitSubSystem'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_InitSubSystem@.
+--                   The safe flavor is 'initSubSystemSafe'
+--                   : driver loading can take hundreds of milliseconds.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_InitSubSystem@, defined at @SDL3\/SDL_init.h 257:34@
+initSubSystem
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @'init'@; see 'init' for details.
+  -> IO Bool
+initSubSystem =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_InitSubSystem x00)
+
+-- | Compatibility function to initialize the SDL library.
+--
+--     This function and @'init'@ are interchangeable.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'init', 'quit', 'quitSubSystem'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_InitSubSystem@.
+--                   The unsafe flavor is 'initSubSystem'
+--                   : driver loading can take hundreds of milliseconds.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_InitSubSystem@, defined at @SDL3\/SDL_init.h 257:34@
+initSubSystemSafe
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @'init'@; see 'init' for details.
+  -> IO Bool
+initSubSystemSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_InitSubSystem x00)
+
+-- | Shut down specific SDL subsystems.
+--
+--     You still need to call @'quit'@ even if you close all open subsystems with @'quitSubSystem'@.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'initSubSystem', 'quit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_QuitSubSystem@.
+--                   The safe flavor is 'quitSubSystemSafe'
+--                   : video quit invokes the clipboard cleanup callback synchronously.
+--
+--     [C declaration]: @SDL_QuitSubSystem@, defined at @SDL3\/SDL_init.h 274:34@
+quitSubSystem
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @'init'@; see 'init' for details.
+  -> IO ()
+quitSubSystem = Unsafe.sDL_QuitSubSystem
+
+-- | Shut down specific SDL subsystems.
+--
+--     You still need to call @'quit'@ even if you close all open subsystems with @'quitSubSystem'@.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'initSubSystem', 'quit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_QuitSubSystem@.
+--                   The unsafe flavor is 'quitSubSystem'
+--                   : video quit invokes the clipboard cleanup callback synchronously.
+--
+--     [C declaration]: @SDL_QuitSubSystem@, defined at @SDL3\/SDL_init.h 274:34@
+quitSubSystemSafe
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @'init'@; see 'init' for details.
+  -> IO ()
+quitSubSystemSafe = Safe.sDL_QuitSubSystem
+
+-- | Get a mask of the specified subsystems which are currently initialized.
+--
+--     [Returns]: a mask of all initialized subsystems if @flags@ is 0, otherwise it returns the initialization status of the specified subsystems.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'init', 'initSubSystem'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WasInit@.
+--                   The safe flavor is 'wasInitSafe'
+--                   .
+--
+--     [C declaration]: @SDL_WasInit@, defined at @SDL3\/SDL_init.h 290:43@
+wasInit
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @'init'@; see 'init' for details.
+  -> IO SDL_InitFlags
+wasInit = Unsafe.sDL_WasInit
+
+-- | Get a mask of the specified subsystems which are currently initialized.
+--
+--     [Returns]: a mask of all initialized subsystems if @flags@ is 0, otherwise it returns the initialization status of the specified subsystems.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'init', 'initSubSystem'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WasInit@.
+--                   The unsafe flavor is 'wasInit'
+--                   .
+--
+--     [C declaration]: @SDL_WasInit@, defined at @SDL3\/SDL_init.h 290:43@
+wasInitSafe
+  :: SDL_InitFlags
+  -- ^
+  --
+  --           [@flags@]: any of the flags used by @'init'@; see 'init' for details.
+  -> IO SDL_InitFlags
+wasInitSafe = Safe.sDL_WasInit
+
+-- | Clean up all initialized subsystems.
+--
+--     You should call this function even if you have already shutdown each initialized subsystem with @'quitSubSystem'@. It is safe to call this function even in the case of errors in initialization.
+--
+--     You can use this function with atexit() to ensure that it is run when your application is shutdown, but it is not wise to do this from a library or other dynamically loaded code.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'init', 'quitSubSystem'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Quit@.
+--                   The safe flavor is 'quitSafe'
+--                   : video quit invokes the clipboard cleanup callback synchronously.
+--
+--     [C declaration]: @SDL_Quit@, defined at @SDL3\/SDL_init.h 310:34@
+quit :: IO ()
+quit = Unsafe.sDL_Quit
+
+-- | Clean up all initialized subsystems.
+--
+--     You should call this function even if you have already shutdown each initialized subsystem with @'quitSubSystem'@. It is safe to call this function even in the case of errors in initialization.
+--
+--     You can use this function with atexit() to ensure that it is run when your application is shutdown, but it is not wise to do this from a library or other dynamically loaded code.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'init', 'quitSubSystem'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Quit@.
+--                   The unsafe flavor is 'quit'
+--                   : video quit invokes the clipboard cleanup callback synchronously.
+--
+--     [C declaration]: @SDL_Quit@, defined at @SDL3\/SDL_init.h 310:34@
+quitSafe :: IO ()
+quitSafe = Safe.sDL_Quit
+
+-- | Return whether this is the main thread.
+--
+--     On Apple platforms, the main thread is the thread that runs your program\'s main() entry point. On other platforms, the main thread is the one that calls SDL_Init(SDL_INIT_VIDEO), which should usually be the one that runs your program\'s main() entry point. If you are using the main callbacks, SDL_AppInit(), SDL_AppIterate(), and SDL_AppQuit() are all called on the main thread.
+--
+--     [Returns]: true if this thread is the main thread, or false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'runOnMainThreadSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IsMainThread@.
+--                   The safe flavor is 'isMainThreadSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsMainThread@, defined at @SDL3\/SDL_init.h 330:34@
+isMainThread :: IO Bool
+isMainThread =
+  fmap CBool.toBool Unsafe.sDL_IsMainThread
+
+-- | Return whether this is the main thread.
+--
+--     On Apple platforms, the main thread is the thread that runs your program\'s main() entry point. On other platforms, the main thread is the one that calls SDL_Init(SDL_INIT_VIDEO), which should usually be the one that runs your program\'s main() entry point. If you are using the main callbacks, SDL_AppInit(), SDL_AppIterate(), and SDL_AppQuit() are all called on the main thread.
+--
+--     [Returns]: true if this thread is the main thread, or false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'runOnMainThreadSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IsMainThread@.
+--                   The unsafe flavor is 'isMainThread'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsMainThread@, defined at @SDL3\/SDL_init.h 330:34@
+isMainThreadSafe :: IO Bool
+isMainThreadSafe =
+  fmap CBool.toBool Safe.sDL_IsMainThread
+
+-- | Call a function on the main thread during event processing.
+--
+--     If this is called on the main thread, the callback is executed immediately. If this is called on another thread, this callback is queued for execution on the main thread during event processing.
+--
+--     Be careful of deadlocks when using this functionality. You should not have the main thread wait for the current thread while this function is being called with @wait_complete@ true.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'isMainThread'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RunOnMainThread@.
+--                   The unsafe import is not exported
+--                   : invokes synchronously on the main thread, or blocks until the main thread runs it.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Init.Unsafe.sDL_RunOnMainThread@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RunOnMainThread@, defined at @SDL3\/SDL_init.h 367:34@
+runOnMainThreadSafe
+  :: SDL_MainThreadCallback
+  -- ^
+  --
+  --           [@callback@]: the callback to call on the main thread.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> Bool
+  -- ^
+  --
+  --           [@wait_complete@]: true to wait for the callback to complete, false to return immediately.
+  -> IO Bool
+runOnMainThreadSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_RunOnMainThread x00 x11 (CBool.fromBool x22))
+
+-- | Specify basic metadata about your app.
+--
+--     You can optionally provide metadata about your app to SDL. This is not required, but strongly encouraged.
+--
+--     There are several locations where SDL can make use of metadata (an \"About\" box in the macOS menu bar, the name of the app can be shown on some audio mixers, etc). Any piece of metadata can be left as NULL, if a specific detail doesn\'t make sense for the app.
+--
+--     This function should be called as early as possible, before 'init'. Multiple calls to this function are allowed, but various state might not change once it has been set up with a previous call to this function.
+--
+--     Passing a NULL removes any previous metadata.
+--
+--     This is a simplified interface for the most important information. You can supply significantly more detailed metadata with @'setAppMetadataProperty'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAppMetadataProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAppMetadata@.
+--                   The safe flavor is 'setAppMetadataSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAppMetadata@, defined at @SDL3\/SDL_init.h 405:34@
+setAppMetadata
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appname@]: The name of the application (\"My Game 2: Bad Guy\'s Revenge!\").
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appversion@]: The version of the application (\"1.0.0beta5\" or a git hash, or whatever makes sense).
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appidentifier@]: A unique string in reverse-domain format that identifies this app (\"com.example.mygame2\").
+  -> IO Bool
+setAppMetadata =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetAppMetadata x00 x11 x22)
+
+-- | Specify basic metadata about your app.
+--
+--     You can optionally provide metadata about your app to SDL. This is not required, but strongly encouraged.
+--
+--     There are several locations where SDL can make use of metadata (an \"About\" box in the macOS menu bar, the name of the app can be shown on some audio mixers, etc). Any piece of metadata can be left as NULL, if a specific detail doesn\'t make sense for the app.
+--
+--     This function should be called as early as possible, before 'init'. Multiple calls to this function are allowed, but various state might not change once it has been set up with a previous call to this function.
+--
+--     Passing a NULL removes any previous metadata.
+--
+--     This is a simplified interface for the most important information. You can supply significantly more detailed metadata with @'setAppMetadataProperty'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAppMetadataProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAppMetadata@.
+--                   The unsafe flavor is 'setAppMetadata'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAppMetadata@, defined at @SDL3\/SDL_init.h 405:34@
+setAppMetadataSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appname@]: The name of the application (\"My Game 2: Bad Guy\'s Revenge!\").
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appversion@]: The version of the application (\"1.0.0beta5\" or a git hash, or whatever makes sense).
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@appidentifier@]: A unique string in reverse-domain format that identifies this app (\"com.example.mygame2\").
+  -> IO Bool
+setAppMetadataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetAppMetadata x00 x11 x22)
+
+-- | Specify metadata about your app through a set of properties.
+--
+--     You can optionally provide metadata about your app to SDL. This is not required, but strongly encouraged.
+--
+--     There are several locations where SDL can make use of metadata (an \"About\" box in the macOS menu bar, the name of the app can be shown on some audio mixers, etc). Any piece of metadata can be left out, if a specific detail doesn\'t make sense for the app.
+--
+--     This function should be called as early as possible, before 'init'. Multiple calls to this function are allowed, but various state might not change once it has been set up with a previous call to this function.
+--
+--     Once set, this metadata can be read using @'getAppMetadataProperty'@.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_APP_METADATA_NAME_STRING'@: The human-readable name of the application, like \"My Game 2: Bad Guy\'s Revenge!\". This will show up anywhere the OS shows the name of the application separately from window titles, such as volume control applets, etc. This defaults to \"SDL Application\".
+--
+--     * @'sDL_PROP_APP_METADATA_VERSION_STRING'@: The version of the app that is running; there are no rules on format, so \"1.0.3beta2\" and \"April 22nd, 2024\" and a git hash are all valid options. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_IDENTIFIER_STRING'@: A unique string that identifies this app. This must be in reverse-domain format, like \"com.example.mygame2\". This string is used by desktop compositors to identify and group windows together, as well as match applications with associated desktop settings and icons. If you plan to package your application in a container such as Flatpak, the app ID should match the name of your Flatpak container as well. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_CREATOR_STRING'@: The human-readable name of the creator\/developer\/maker of this app, like \"MojoWorkshop, LLC\"
+--
+--     * @'sDL_PROP_APP_METADATA_COPYRIGHT_STRING'@: The human-readable copyright notice, like \"Copyright (c) 2024 MojoWorkshop, LLC\" or whatnot. Keep this to one line, don\'t paste a copy of a whole software license in here. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_URL_STRING'@: A URL to the app on the web. Maybe a product page, or a storefront, or even a GitHub repository, for user\'s further information This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_TYPE_STRING'@: The type of application this is. Currently this string can be \"game\" for a video game, \"mediaplayer\" for a media player, or generically \"application\" if nothing else applies. Future versions of SDL might add new types. This defaults to \"application\".
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAppMetadataProperty', 'setAppMetadata'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetAppMetadataProperty@.
+--                   The safe flavor is 'setAppMetadataPropertySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAppMetadataProperty@, defined at @SDL3\/SDL_init.h 468:34@
+setAppMetadataProperty
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the metadata property to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the property, or NULL to remove that property.
+  -> IO Bool
+setAppMetadataProperty =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetAppMetadataProperty x00 x11)
+
+-- | Specify metadata about your app through a set of properties.
+--
+--     You can optionally provide metadata about your app to SDL. This is not required, but strongly encouraged.
+--
+--     There are several locations where SDL can make use of metadata (an \"About\" box in the macOS menu bar, the name of the app can be shown on some audio mixers, etc). Any piece of metadata can be left out, if a specific detail doesn\'t make sense for the app.
+--
+--     This function should be called as early as possible, before 'init'. Multiple calls to this function are allowed, but various state might not change once it has been set up with a previous call to this function.
+--
+--     Once set, this metadata can be read using @'getAppMetadataProperty'@.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_APP_METADATA_NAME_STRING'@: The human-readable name of the application, like \"My Game 2: Bad Guy\'s Revenge!\". This will show up anywhere the OS shows the name of the application separately from window titles, such as volume control applets, etc. This defaults to \"SDL Application\".
+--
+--     * @'sDL_PROP_APP_METADATA_VERSION_STRING'@: The version of the app that is running; there are no rules on format, so \"1.0.3beta2\" and \"April 22nd, 2024\" and a git hash are all valid options. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_IDENTIFIER_STRING'@: A unique string that identifies this app. This must be in reverse-domain format, like \"com.example.mygame2\". This string is used by desktop compositors to identify and group windows together, as well as match applications with associated desktop settings and icons. If you plan to package your application in a container such as Flatpak, the app ID should match the name of your Flatpak container as well. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_CREATOR_STRING'@: The human-readable name of the creator\/developer\/maker of this app, like \"MojoWorkshop, LLC\"
+--
+--     * @'sDL_PROP_APP_METADATA_COPYRIGHT_STRING'@: The human-readable copyright notice, like \"Copyright (c) 2024 MojoWorkshop, LLC\" or whatnot. Keep this to one line, don\'t paste a copy of a whole software license in here. This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_URL_STRING'@: A URL to the app on the web. Maybe a product page, or a storefront, or even a GitHub repository, for user\'s further information This has no default.
+--
+--     * @'sDL_PROP_APP_METADATA_TYPE_STRING'@: The type of application this is. Currently this string can be \"game\" for a video game, \"mediaplayer\" for a media player, or generically \"application\" if nothing else applies. Future versions of SDL might add new types. This defaults to \"application\".
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getAppMetadataProperty', 'setAppMetadata'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetAppMetadataProperty@.
+--                   The unsafe flavor is 'setAppMetadataProperty'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetAppMetadataProperty@, defined at @SDL3\/SDL_init.h 468:34@
+setAppMetadataPropertySafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the metadata property to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the property, or NULL to remove that property.
+  -> IO Bool
+setAppMetadataPropertySafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetAppMetadataProperty x00 x11)
+
+-- | Get metadata about your app.
+--
+--     This returns metadata previously set using @'setAppMetadata'@ or @'setAppMetadataProperty'@. See @'setAppMetadataProperty'@ for the list of available properties and their meanings.
+--
+--     [Returns]: the current value of the metadata property, or the default if it is not set, NULL for properties with no default.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the string returned is not protected and could potentially be freed if you call @'setAppMetadataProperty'@ to set that property from another thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAppMetadata', 'setAppMetadataProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetAppMetadataProperty@.
+--                   The safe flavor is 'getAppMetadataPropertySafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetAppMetadataProperty@, defined at @SDL3\/SDL_init.h 499:42@
+getAppMetadataProperty
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the metadata property to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getAppMetadataProperty =
+  Unsafe.sDL_GetAppMetadataProperty
+
+-- | Get metadata about your app.
+--
+--     This returns metadata previously set using @'setAppMetadata'@ or @'setAppMetadataProperty'@. See @'setAppMetadataProperty'@ for the list of available properties and their meanings.
+--
+--     [Returns]: the current value of the metadata property, or the default if it is not set, NULL for properties with no default.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the string returned is not protected and could potentially be freed if you call @'setAppMetadataProperty'@ to set that property from another thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setAppMetadata', 'setAppMetadataProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetAppMetadataProperty@.
+--                   The unsafe flavor is 'getAppMetadataProperty'
+--                   .
+--
+--     [C declaration]: @SDL_GetAppMetadataProperty@, defined at @SDL3\/SDL_init.h 499:42@
+getAppMetadataPropertySafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the metadata property to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getAppMetadataPropertySafe =
+  Safe.sDL_GetAppMetadataProperty
+
+-- | Typed constant for macro @SDL_INIT_AUDIO@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_INIT_AUDIO :: SDL_InitFlags
+pattern SDL_INIT_AUDIO = SDL_InitFlags 0x00000010
+
+-- | Typed constant for macro @SDL_INIT_VIDEO@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_INIT_VIDEO :: SDL_InitFlags
+pattern SDL_INIT_VIDEO = SDL_InitFlags 0x00000020
+
+-- | Typed constant for macro @SDL_INIT_JOYSTICK@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_INIT_JOYSTICK :: SDL_InitFlags
+pattern SDL_INIT_JOYSTICK = SDL_InitFlags 0x00000200
+
+-- | Typed constant for macro @SDL_INIT_HAPTIC@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_INIT_HAPTIC :: SDL_InitFlags
+pattern SDL_INIT_HAPTIC = SDL_InitFlags 0x00001000
+
+-- | Typed constant for macro @SDL_INIT_GAMEPAD@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_INIT_GAMEPAD :: SDL_InitFlags
+pattern SDL_INIT_GAMEPAD = SDL_InitFlags 0x00002000
+
+-- | Typed constant for macro @SDL_INIT_EVENTS@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_INIT_EVENTS :: SDL_InitFlags
+pattern SDL_INIT_EVENTS = SDL_InitFlags 0x00004000
+
+-- | Typed constant for macro @SDL_INIT_SENSOR@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_INIT_SENSOR :: SDL_InitFlags
+pattern SDL_INIT_SENSOR = SDL_InitFlags 0x00008000
+
+-- | Typed constant for macro @SDL_INIT_CAMERA@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_INIT_CAMERA :: SDL_InitFlags
+pattern SDL_INIT_CAMERA = SDL_InitFlags 0x00010000
diff --git a/src/SDL3/Sys/Iostream.hs b/src/SDL3/Sys/Iostream.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Iostream.hs
@@ -0,0 +1,3539 @@
+-- | SDL provides an abstract interface for reading and writing data streams. It offers implementations for files, memory, etc, and the app can provide their own implementations, too.
+--
+--     'SDL_IOStream' is not related to the standard C++ iostream class, other than both are abstract interfaces to read\/write data. 'SDL_IOStream' status, set by a read or write operation.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Iostream.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Iostream (
+  module SDL3.Sys.Bindgen.Iostream,
+
+  -- * Function aliases
+  SDL3.Sys.Iostream.ioFromFile,
+  SDL3.Sys.Iostream.ioFromFileSafe,
+  SDL3.Sys.Iostream.ioFromMem,
+  SDL3.Sys.Iostream.ioFromMemSafe,
+  SDL3.Sys.Iostream.ioFromConstMem,
+  SDL3.Sys.Iostream.ioFromConstMemSafe,
+  SDL3.Sys.Iostream.ioFromDynamicMem,
+  SDL3.Sys.Iostream.ioFromDynamicMemSafe,
+  SDL3.Sys.Iostream.openIO,
+  SDL3.Sys.Iostream.openIOSafe,
+  SDL3.Sys.Iostream.closeIO,
+  SDL3.Sys.Iostream.closeIOSafe,
+  SDL3.Sys.Iostream.getIOProperties,
+  SDL3.Sys.Iostream.getIOPropertiesSafe,
+  SDL3.Sys.Iostream.getIOStatus,
+  SDL3.Sys.Iostream.getIOStatusSafe,
+  SDL3.Sys.Iostream.getIOSize,
+  SDL3.Sys.Iostream.getIOSizeSafe,
+  SDL3.Sys.Iostream.seekIO,
+  SDL3.Sys.Iostream.seekIOSafe,
+  SDL3.Sys.Iostream.tellIO,
+  SDL3.Sys.Iostream.tellIOSafe,
+  SDL3.Sys.Iostream.readIO,
+  SDL3.Sys.Iostream.readIOSafe,
+  SDL3.Sys.Iostream.writeIO,
+  SDL3.Sys.Iostream.writeIOSafe,
+  SDL3.Sys.Iostream.flushIO,
+  SDL3.Sys.Iostream.flushIOSafe,
+  SDL3.Sys.Iostream.loadFileIO,
+  SDL3.Sys.Iostream.loadFileIOSafe,
+  SDL3.Sys.Iostream.loadFile,
+  SDL3.Sys.Iostream.loadFileSafe,
+  SDL3.Sys.Iostream.saveFileIO,
+  SDL3.Sys.Iostream.saveFileIOSafe,
+  SDL3.Sys.Iostream.saveFile,
+  SDL3.Sys.Iostream.saveFileSafe,
+  SDL3.Sys.Iostream.readU8,
+  SDL3.Sys.Iostream.readU8Safe,
+  SDL3.Sys.Iostream.readS8,
+  SDL3.Sys.Iostream.readS8Safe,
+  SDL3.Sys.Iostream.readU16LE,
+  SDL3.Sys.Iostream.readU16LESafe,
+  SDL3.Sys.Iostream.readS16LE,
+  SDL3.Sys.Iostream.readS16LESafe,
+  SDL3.Sys.Iostream.readU16BE,
+  SDL3.Sys.Iostream.readU16BESafe,
+  SDL3.Sys.Iostream.readS16BE,
+  SDL3.Sys.Iostream.readS16BESafe,
+  SDL3.Sys.Iostream.readU32LE,
+  SDL3.Sys.Iostream.readU32LESafe,
+  SDL3.Sys.Iostream.readS32LE,
+  SDL3.Sys.Iostream.readS32LESafe,
+  SDL3.Sys.Iostream.readU32BE,
+  SDL3.Sys.Iostream.readU32BESafe,
+  SDL3.Sys.Iostream.readS32BE,
+  SDL3.Sys.Iostream.readS32BESafe,
+  SDL3.Sys.Iostream.readU64LE,
+  SDL3.Sys.Iostream.readU64LESafe,
+  SDL3.Sys.Iostream.readS64LE,
+  SDL3.Sys.Iostream.readS64LESafe,
+  SDL3.Sys.Iostream.readU64BE,
+  SDL3.Sys.Iostream.readU64BESafe,
+  SDL3.Sys.Iostream.readS64BE,
+  SDL3.Sys.Iostream.readS64BESafe,
+  SDL3.Sys.Iostream.writeU8,
+  SDL3.Sys.Iostream.writeU8Safe,
+  SDL3.Sys.Iostream.writeS8,
+  SDL3.Sys.Iostream.writeS8Safe,
+  SDL3.Sys.Iostream.writeU16LE,
+  SDL3.Sys.Iostream.writeU16LESafe,
+  SDL3.Sys.Iostream.writeS16LE,
+  SDL3.Sys.Iostream.writeS16LESafe,
+  SDL3.Sys.Iostream.writeU16BE,
+  SDL3.Sys.Iostream.writeU16BESafe,
+  SDL3.Sys.Iostream.writeS16BE,
+  SDL3.Sys.Iostream.writeS16BESafe,
+  SDL3.Sys.Iostream.writeU32LE,
+  SDL3.Sys.Iostream.writeU32LESafe,
+  SDL3.Sys.Iostream.writeS32LE,
+  SDL3.Sys.Iostream.writeS32LESafe,
+  SDL3.Sys.Iostream.writeU32BE,
+  SDL3.Sys.Iostream.writeU32BESafe,
+  SDL3.Sys.Iostream.writeS32BE,
+  SDL3.Sys.Iostream.writeS32BESafe,
+  SDL3.Sys.Iostream.writeU64LE,
+  SDL3.Sys.Iostream.writeU64LESafe,
+  SDL3.Sys.Iostream.writeS64LE,
+  SDL3.Sys.Iostream.writeS64LESafe,
+  SDL3.Sys.Iostream.writeU64BE,
+  SDL3.Sys.Iostream.writeU64BESafe,
+  SDL3.Sys.Iostream.writeS64BE,
+  SDL3.Sys.Iostream.writeS64BESafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Iostream
+import SDL3.Sys.Bindgen.Iostream.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Iostream.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Use this function to create a new 'SDL_IOStream' structure for reading from and\/or writing to a named file.
+--
+--     The @mode@ string is treated roughly the same as in a call to the C library\'s fopen(), even if SDL doesn\'t happen to use fopen() behind the scenes.
+--
+--     Available @mode@ strings:
+--
+--     * \"r\": Open a file for reading. The file must exist.
+--
+--     * \"w\": Create an empty file for writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     * \"wx\": Create an empty file for writing. If a file with the same name already exists, the call fails.
+--
+--     * \"a\": Append to a file. Writing operations append data at the end of the file. The file is created if it does not exist.
+--
+--     * \"r+\": Open a file for update both reading and writing. The file must exist.
+--
+--     * \"w+\": Create an empty file for both reading and writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     * \"w+x\": Create an empty file for both reading and writing. If a file with the same name already exists, the call fails.
+--
+--     * \"a+\": Open a file for reading and appending. All writing operations are performed at the end of the file, protecting the previous content to be overwritten. You can reposition (fseek, rewind) the internal pointer to anywhere in the file for reading, but writing operations will move it back to the end of file. The file is created if it does not exist.
+--
+--     __NOTE__: In order to open a file as a binary file, a \"b\" character has to be included in the @mode@ string. This additional \"b\" character can either be appended at the end of the string (thus making the following compound modes: \"rb\", \"wb\", \"ab\", \"r+b\", \"w+b\", \"a+b\") or be inserted between the letter and the \"+\" sign for the mixed modes (\"rb+\", \"wb+\", \"ab+\"). Additional characters may follow the sequence, although they should have no effect. For example, \"t\" is sometimes appended to make explicit the file is a text file.
+--
+--     This function supports Unicode filenames, but they must be encoded in UTF-8 format, regardless of the underlying operating system.
+--
+--     In Android, @'ioFromFile'@ can be used to open content:\/\/ URIs. As a fallback, @'ioFromFile'@ will transparently open a matching filename in the app\'s @assets@.
+--
+--     Closing the 'SDL_IOStream' will close SDL\'s internal file handle.
+--
+--     The following properties may be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER'@: a pointer, that can be cast to a win32 @HANDLE@, that this 'SDL_IOStream' is using to access the filesystem. If the program isn\'t running on Windows, or SDL used some other method to access the filesystem, this property will not be set.
+--
+--     * @'sDL_PROP_IOSTREAM_STDIO_FILE_POINTER'@: a pointer, that can be cast to a stdio @FILE *@, that this 'SDL_IOStream' is using to access the filesystem. If SDL used some other method to access the filesystem, this property will not be set. PLEASE NOTE that if SDL is using a different C runtime than your app, trying to use this pointer will almost certainly result in a crash! This is mostly a problem on Windows; make sure you build SDL and your app with the same compiler and settings to avoid it.
+--
+--     * @'sDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER'@: a file descriptor that this 'SDL_IOStream' is using to access the filesystem.
+--
+--     * @'sDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER'@: a pointer, that can be cast to an Android NDK @AAsset *@, that this 'SDL_IOStream' is using to access the filesystem. If SDL used some other method to access the filesystem, this property will not be set.
+--
+--     [Returns]: a pointer to the 'SDL_IOStream' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeIO', 'flushIO', 'readIO', 'seekIO', 'tellIO', 'writeIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IOFromFile@.
+--                   The safe flavor is 'ioFromFileSafe'
+--                   .
+--
+--     [C declaration]: @SDL_IOFromFile@, defined at @SDL3\/SDL_iostream.h 278:44@
+ioFromFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a UTF-8 string representing the filename to open.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mode@]: an ASCII string representing the mode to be used for opening the file.
+  -> IO (BG.Ptr SDL_IOStream)
+ioFromFile = Unsafe.sDL_IOFromFile
+
+-- | Use this function to create a new 'SDL_IOStream' structure for reading from and\/or writing to a named file.
+--
+--     The @mode@ string is treated roughly the same as in a call to the C library\'s fopen(), even if SDL doesn\'t happen to use fopen() behind the scenes.
+--
+--     Available @mode@ strings:
+--
+--     * \"r\": Open a file for reading. The file must exist.
+--
+--     * \"w\": Create an empty file for writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     * \"wx\": Create an empty file for writing. If a file with the same name already exists, the call fails.
+--
+--     * \"a\": Append to a file. Writing operations append data at the end of the file. The file is created if it does not exist.
+--
+--     * \"r+\": Open a file for update both reading and writing. The file must exist.
+--
+--     * \"w+\": Create an empty file for both reading and writing. If a file with the same name already exists its content is erased and the file is treated as a new empty file.
+--
+--     * \"w+x\": Create an empty file for both reading and writing. If a file with the same name already exists, the call fails.
+--
+--     * \"a+\": Open a file for reading and appending. All writing operations are performed at the end of the file, protecting the previous content to be overwritten. You can reposition (fseek, rewind) the internal pointer to anywhere in the file for reading, but writing operations will move it back to the end of file. The file is created if it does not exist.
+--
+--     __NOTE__: In order to open a file as a binary file, a \"b\" character has to be included in the @mode@ string. This additional \"b\" character can either be appended at the end of the string (thus making the following compound modes: \"rb\", \"wb\", \"ab\", \"r+b\", \"w+b\", \"a+b\") or be inserted between the letter and the \"+\" sign for the mixed modes (\"rb+\", \"wb+\", \"ab+\"). Additional characters may follow the sequence, although they should have no effect. For example, \"t\" is sometimes appended to make explicit the file is a text file.
+--
+--     This function supports Unicode filenames, but they must be encoded in UTF-8 format, regardless of the underlying operating system.
+--
+--     In Android, @'ioFromFile'@ can be used to open content:\/\/ URIs. As a fallback, @'ioFromFile'@ will transparently open a matching filename in the app\'s @assets@.
+--
+--     Closing the 'SDL_IOStream' will close SDL\'s internal file handle.
+--
+--     The following properties may be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_WINDOWS_HANDLE_POINTER'@: a pointer, that can be cast to a win32 @HANDLE@, that this 'SDL_IOStream' is using to access the filesystem. If the program isn\'t running on Windows, or SDL used some other method to access the filesystem, this property will not be set.
+--
+--     * @'sDL_PROP_IOSTREAM_STDIO_FILE_POINTER'@: a pointer, that can be cast to a stdio @FILE *@, that this 'SDL_IOStream' is using to access the filesystem. If SDL used some other method to access the filesystem, this property will not be set. PLEASE NOTE that if SDL is using a different C runtime than your app, trying to use this pointer will almost certainly result in a crash! This is mostly a problem on Windows; make sure you build SDL and your app with the same compiler and settings to avoid it.
+--
+--     * @'sDL_PROP_IOSTREAM_FILE_DESCRIPTOR_NUMBER'@: a file descriptor that this 'SDL_IOStream' is using to access the filesystem.
+--
+--     * @'sDL_PROP_IOSTREAM_ANDROID_AASSET_POINTER'@: a pointer, that can be cast to an Android NDK @AAsset *@, that this 'SDL_IOStream' is using to access the filesystem. If SDL used some other method to access the filesystem, this property will not be set.
+--
+--     [Returns]: a pointer to the 'SDL_IOStream' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeIO', 'flushIO', 'readIO', 'seekIO', 'tellIO', 'writeIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IOFromFile@.
+--                   The unsafe flavor is 'ioFromFile'
+--                   .
+--
+--     [C declaration]: @SDL_IOFromFile@, defined at @SDL3\/SDL_iostream.h 278:44@
+ioFromFileSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a UTF-8 string representing the filename to open.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@mode@]: an ASCII string representing the mode to be used for opening the file.
+  -> IO (BG.Ptr SDL_IOStream)
+ioFromFileSafe = Safe.sDL_IOFromFile
+
+-- | Use this function to prepare a read-write memory buffer for use with 'SDL_IOStream'.
+--
+--     This function sets up an 'SDL_IOStream' struct based on a memory area of a certain size, for both read and write access.
+--
+--     This memory buffer is not copied by the 'SDL_IOStream'; the pointer you provide must remain valid until you close the stream.
+--
+--     If you need to make sure the 'SDL_IOStream' never writes to the memory buffer, you should use @'ioFromConstMem'@ with a read-only buffer of memory instead.
+--
+--     The following properties will be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_POINTER'@: this will be the @mem@ parameter that was passed to this function.
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER'@: this will be the @size@ parameter that was passed to this function.
+--
+--     Additionally, the following properties are recognized:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER'@: if this property is set to a non-NULL value it will be interpreted as a function of SDL_free_func type and called with the passed @mem@ pointer when closing the stream. By default it is unset, i.e., the memory will not be freed.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'ioFromConstMem', 'closeIO', 'flushIO', 'readIO', 'seekIO', 'tellIO', 'writeIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IOFromMem@.
+--                   The safe flavor is 'ioFromMemSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IOFromMem@, defined at @SDL3\/SDL_iostream.h 330:44@
+ioFromMem
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to a buffer to feed an 'SDL_IOStream' stream.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the buffer size, in bytes.
+  -> IO (BG.Ptr SDL_IOStream)
+ioFromMem =
+  \x00 ->
+    \x11 -> Unsafe.sDL_IOFromMem x00 (Coerce.coerce x11)
+
+-- | Use this function to prepare a read-write memory buffer for use with 'SDL_IOStream'.
+--
+--     This function sets up an 'SDL_IOStream' struct based on a memory area of a certain size, for both read and write access.
+--
+--     This memory buffer is not copied by the 'SDL_IOStream'; the pointer you provide must remain valid until you close the stream.
+--
+--     If you need to make sure the 'SDL_IOStream' never writes to the memory buffer, you should use @'ioFromConstMem'@ with a read-only buffer of memory instead.
+--
+--     The following properties will be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_POINTER'@: this will be the @mem@ parameter that was passed to this function.
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER'@: this will be the @size@ parameter that was passed to this function.
+--
+--     Additionally, the following properties are recognized:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER'@: if this property is set to a non-NULL value it will be interpreted as a function of SDL_free_func type and called with the passed @mem@ pointer when closing the stream. By default it is unset, i.e., the memory will not be freed.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'ioFromConstMem', 'closeIO', 'flushIO', 'readIO', 'seekIO', 'tellIO', 'writeIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IOFromMem@.
+--                   The unsafe flavor is 'ioFromMem'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IOFromMem@, defined at @SDL3\/SDL_iostream.h 330:44@
+ioFromMemSafe
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to a buffer to feed an 'SDL_IOStream' stream.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the buffer size, in bytes.
+  -> IO (BG.Ptr SDL_IOStream)
+ioFromMemSafe =
+  \x00 ->
+    \x11 -> Safe.sDL_IOFromMem x00 (Coerce.coerce x11)
+
+-- | Use this function to prepare a read-only memory buffer for use with 'SDL_IOStream'.
+--
+--     This function sets up an 'SDL_IOStream' struct based on a memory area of a certain size. It assumes the memory area is not writable.
+--
+--     Attempting to write to this 'SDL_IOStream' stream will report an error without writing to the memory buffer.
+--
+--     This memory buffer is not copied by the 'SDL_IOStream'; the pointer you provide must remain valid until you close the stream.
+--
+--     If you need to write to a memory buffer, you should use @'ioFromMem'@ with a writable buffer of memory instead.
+--
+--     The following properties will be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_POINTER'@: this will be the @mem@ parameter that was passed to this function.
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER'@: this will be the @size@ parameter that was passed to this function.
+--
+--     Additionally, the following properties are recognized:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER'@: if this property is set to a non-NULL value it will be interpreted as a function of SDL_free_func type and called with the passed @mem@ pointer when closing the stream. By default it is unset, i.e., the memory will not be freed.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'ioFromMem', 'closeIO', 'readIO', 'seekIO', 'tellIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IOFromConstMem@.
+--                   The safe flavor is 'ioFromConstMemSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IOFromConstMem@, defined at @SDL3\/SDL_iostream.h 381:44@
+ioFromConstMem
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to a read-only buffer to feed an 'SDL_IOStream' stream.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the buffer size, in bytes.
+  -> IO (BG.Ptr SDL_IOStream)
+ioFromConstMem =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_IOFromConstMem x00 (Coerce.coerce x11)
+
+-- | Use this function to prepare a read-only memory buffer for use with 'SDL_IOStream'.
+--
+--     This function sets up an 'SDL_IOStream' struct based on a memory area of a certain size. It assumes the memory area is not writable.
+--
+--     Attempting to write to this 'SDL_IOStream' stream will report an error without writing to the memory buffer.
+--
+--     This memory buffer is not copied by the 'SDL_IOStream'; the pointer you provide must remain valid until you close the stream.
+--
+--     If you need to write to a memory buffer, you should use @'ioFromMem'@ with a writable buffer of memory instead.
+--
+--     The following properties will be set at creation time by SDL:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_POINTER'@: this will be the @mem@ parameter that was passed to this function.
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_SIZE_NUMBER'@: this will be the @size@ parameter that was passed to this function.
+--
+--     Additionally, the following properties are recognized:
+--
+--     * @'sDL_PROP_IOSTREAM_MEMORY_FREE_FUNC_POINTER'@: if this property is set to a non-NULL value it will be interpreted as a function of SDL_free_func type and called with the passed @mem@ pointer when closing the stream. By default it is unset, i.e., the memory will not be freed.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'ioFromMem', 'closeIO', 'readIO', 'seekIO', 'tellIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IOFromConstMem@.
+--                   The unsafe flavor is 'ioFromConstMem'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IOFromConstMem@, defined at @SDL3\/SDL_iostream.h 381:44@
+ioFromConstMemSafe
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to a read-only buffer to feed an 'SDL_IOStream' stream.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the buffer size, in bytes.
+  -> IO (BG.Ptr SDL_IOStream)
+ioFromConstMemSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_IOFromConstMem x00 (Coerce.coerce x11)
+
+-- | Use this function to create an 'SDL_IOStream' that is backed by dynamically allocated memory.
+--
+--     This supports the following properties to provide access to the memory and control over allocations:
+--
+--     * @'sDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER'@: a pointer to the internal memory of the stream. This can be set to NULL to transfer ownership of the memory to the application, which should free the memory with 'SDL3.Sys.Stdinc.free'. If this is done, the next operation on the stream must be @'closeIO'@.
+--
+--     * @'sDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER'@: memory will be allocated in multiples of this size, defaulting to 1024.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeIO', 'readIO', 'seekIO', 'tellIO', 'writeIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IOFromDynamicMem@.
+--                   The safe flavor is 'ioFromDynamicMemSafe'
+--                   .
+--
+--     [C declaration]: @SDL_IOFromDynamicMem@, defined at @SDL3\/SDL_iostream.h 411:44@
+ioFromDynamicMem :: IO (BG.Ptr SDL_IOStream)
+ioFromDynamicMem = Unsafe.sDL_IOFromDynamicMem
+
+-- | Use this function to create an 'SDL_IOStream' that is backed by dynamically allocated memory.
+--
+--     This supports the following properties to provide access to the memory and control over allocations:
+--
+--     * @'sDL_PROP_IOSTREAM_DYNAMIC_MEMORY_POINTER'@: a pointer to the internal memory of the stream. This can be set to NULL to transfer ownership of the memory to the application, which should free the memory with 'SDL3.Sys.Stdinc.free'. If this is done, the next operation on the stream must be @'closeIO'@.
+--
+--     * @'sDL_PROP_IOSTREAM_DYNAMIC_CHUNKSIZE_NUMBER'@: memory will be allocated in multiples of this size, defaulting to 1024.
+--
+--     [Returns]: a pointer to a new 'SDL_IOStream' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeIO', 'readIO', 'seekIO', 'tellIO', 'writeIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IOFromDynamicMem@.
+--                   The unsafe flavor is 'ioFromDynamicMem'
+--                   .
+--
+--     [C declaration]: @SDL_IOFromDynamicMem@, defined at @SDL3\/SDL_iostream.h 411:44@
+ioFromDynamicMemSafe :: IO (BG.Ptr SDL_IOStream)
+ioFromDynamicMemSafe = Safe.sDL_IOFromDynamicMem
+
+-- | Create a custom 'SDL_IOStream'.
+--
+--     Applications do not need to use this function unless they are providing their own 'SDL_IOStream' implementation. If you just need an 'SDL_IOStream' to read\/write a common data source, you should use the built-in implementations in SDL, like @'ioFromFile'@ or @'ioFromMem'@, etc.
+--
+--     This function makes a copy of @iface@ and the caller does not need to keep it around after this call.
+--
+--     [Returns]: a pointer to the allocated memory on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeIO', SDL_INIT_INTERFACE, 'ioFromConstMem', 'ioFromFile', 'ioFromMem'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenIO@.
+--                   The safe flavor is 'openIOSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenIO@, defined at @SDL3\/SDL_iostream.h 446:44@
+openIO
+  :: PtrConst.PtrConst SDL_IOStreamInterface
+  -- ^
+  --
+  --           [@iface@]: the interface that implements this 'SDL_IOStream', initialized using SDL_INIT_INTERFACE().
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer that will be passed to the interface functions.
+  -> IO (BG.Ptr SDL_IOStream)
+openIO = Unsafe.sDL_OpenIO
+
+-- | Create a custom 'SDL_IOStream'.
+--
+--     Applications do not need to use this function unless they are providing their own 'SDL_IOStream' implementation. If you just need an 'SDL_IOStream' to read\/write a common data source, you should use the built-in implementations in SDL, like @'ioFromFile'@ or @'ioFromMem'@, etc.
+--
+--     This function makes a copy of @iface@ and the caller does not need to keep it around after this call.
+--
+--     [Returns]: a pointer to the allocated memory on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeIO', SDL_INIT_INTERFACE, 'ioFromConstMem', 'ioFromFile', 'ioFromMem'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenIO@.
+--                   The unsafe flavor is 'openIO'
+--                   .
+--
+--     [C declaration]: @SDL_OpenIO@, defined at @SDL3\/SDL_iostream.h 446:44@
+openIOSafe
+  :: PtrConst.PtrConst SDL_IOStreamInterface
+  -- ^
+  --
+  --           [@iface@]: the interface that implements this 'SDL_IOStream', initialized using SDL_INIT_INTERFACE().
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer that will be passed to the interface functions.
+  -> IO (BG.Ptr SDL_IOStream)
+openIOSafe = Safe.sDL_OpenIO
+
+-- | Close and free an allocated 'SDL_IOStream' structure.
+--
+--     @'closeIO'@ closes and cleans up the 'SDL_IOStream' stream. It releases any resources used by the stream and frees the 'SDL_IOStream' itself. This returns true on success, or false if the stream failed to flush to its output (e.g. to disk).
+--
+--     Note that if this fails to flush the stream for any reason, this function reports an error, but the 'SDL_IOStream' is still invalid once this function returns.
+--
+--     This call flushes any buffered writes to the operating system, but there are no guarantees that those writes have gone to physical media; they might be in the OS\'s file cache, waiting to go to disk later. If it\'s absolutely crucial that writes go to disk immediately, so they are definitely stored even if the power fails before the file cache would have caught up, one should call @'flushIO'@ before closing. Note that flushing takes time and makes the system and your app operate less efficiently, so do so sparingly.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CloseIO@.
+--                   The safe flavor is 'closeIOSafe'
+--                   : flushes and closes through the stream\'s SDL_IOStreamInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CloseIO@, defined at @SDL3\/SDL_iostream.h 478:34@
+closeIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: 'SDL_IOStream' structure to close.
+  -> IO Bool
+closeIO =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_CloseIO x00)
+
+-- | Close and free an allocated 'SDL_IOStream' structure.
+--
+--     @'closeIO'@ closes and cleans up the 'SDL_IOStream' stream. It releases any resources used by the stream and frees the 'SDL_IOStream' itself. This returns true on success, or false if the stream failed to flush to its output (e.g. to disk).
+--
+--     Note that if this fails to flush the stream for any reason, this function reports an error, but the 'SDL_IOStream' is still invalid once this function returns.
+--
+--     This call flushes any buffered writes to the operating system, but there are no guarantees that those writes have gone to physical media; they might be in the OS\'s file cache, waiting to go to disk later. If it\'s absolutely crucial that writes go to disk immediately, so they are definitely stored even if the power fails before the file cache would have caught up, one should call @'flushIO'@ before closing. Note that flushing takes time and makes the system and your app operate less efficiently, so do so sparingly.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CloseIO@.
+--                   The unsafe flavor is 'closeIO'
+--                   : flushes and closes through the stream\'s SDL_IOStreamInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CloseIO@, defined at @SDL3\/SDL_iostream.h 478:34@
+closeIOSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: 'SDL_IOStream' structure to close.
+  -> IO Bool
+closeIOSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_CloseIO x00)
+
+-- | Get the properties associated with an 'SDL_IOStream'.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetIOProperties@.
+--                   The safe flavor is 'getIOPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetIOProperties@, defined at @SDL3\/SDL_iostream.h 491:46@
+getIOProperties
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getIOProperties = Unsafe.sDL_GetIOProperties
+
+-- | Get the properties associated with an 'SDL_IOStream'.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetIOProperties@.
+--                   The unsafe flavor is 'getIOProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetIOProperties@, defined at @SDL3\/SDL_iostream.h 491:46@
+getIOPropertiesSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getIOPropertiesSafe = Safe.sDL_GetIOProperties
+
+-- | Query the stream status of an 'SDL_IOStream'.
+--
+--     This information can be useful to decide if a short read or write was due to an error, an EOF, or a non-blocking operation that isn\'t yet ready to complete.
+--
+--     An 'SDL_IOStream' \'s status is only expected to change after a 'readIO' or 'writeIO' call; don\'t expect it to change if you just call this query function in a tight loop.
+--
+--     [Returns]: an 'SDL_IOStatus' enum with the current state.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetIOStatus@.
+--                   The safe flavor is 'getIOStatusSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetIOStatus@, defined at @SDL3\/SDL_iostream.h 511:42@
+getIOStatus
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: the 'SDL_IOStream' to query.
+  -> IO SDL_IOStatus
+getIOStatus = Unsafe.sDL_GetIOStatus
+
+-- | Query the stream status of an 'SDL_IOStream'.
+--
+--     This information can be useful to decide if a short read or write was due to an error, an EOF, or a non-blocking operation that isn\'t yet ready to complete.
+--
+--     An 'SDL_IOStream' \'s status is only expected to change after a 'readIO' or 'writeIO' call; don\'t expect it to change if you just call this query function in a tight loop.
+--
+--     [Returns]: an 'SDL_IOStatus' enum with the current state.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetIOStatus@.
+--                   The unsafe flavor is 'getIOStatus'
+--                   .
+--
+--     [C declaration]: @SDL_GetIOStatus@, defined at @SDL3\/SDL_iostream.h 511:42@
+getIOStatusSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: the 'SDL_IOStream' to query.
+  -> IO SDL_IOStatus
+getIOStatusSafe = Safe.sDL_GetIOStatus
+
+-- | Use this function to get the size of the data stream in an 'SDL_IOStream'.
+--
+--     [Returns]: the size of the data stream in the 'SDL_IOStream' on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetIOSize@.
+--                   The safe flavor is 'getIOSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetIOSize@, defined at @SDL3\/SDL_iostream.h 525:36@
+getIOSize
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: the 'SDL_IOStream' to get the size of the data stream from.
+  -> IO BG.Int64
+getIOSize =
+  \x00 -> fmap Coerce.coerce (Unsafe.sDL_GetIOSize x00)
+
+-- | Use this function to get the size of the data stream in an 'SDL_IOStream'.
+--
+--     [Returns]: the size of the data stream in the 'SDL_IOStream' on success or a negative error code on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetIOSize@.
+--                   The unsafe flavor is 'getIOSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetIOSize@, defined at @SDL3\/SDL_iostream.h 525:36@
+getIOSizeSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: the 'SDL_IOStream' to get the size of the data stream from.
+  -> IO BG.Int64
+getIOSizeSafe =
+  \x00 -> fmap Coerce.coerce (Safe.sDL_GetIOSize x00)
+
+-- | Seek within an 'SDL_IOStream' data stream.
+--
+--     This function seeks to byte @offset@, relative to @whence@.
+--
+--     @whence@ may be any of the following values:
+--
+--     * @SDL_IO_SEEK_SET@: seek from the beginning of data
+--
+--     * @SDL_IO_SEEK_CUR@: seek relative to current read point
+--
+--     * @SDL_IO_SEEK_END@: seek relative to the end of data
+--
+--     If this stream can not seek, it will return -1.
+--
+--     [Returns]: the final offset in the data stream after the seek or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'tellIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SeekIO@.
+--                   The safe flavor is 'seekIOSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SeekIO@, defined at @SDL3\/SDL_iostream.h 554:36@
+seekIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@offset@]: an offset in bytes, relative to @whence@ location; can be negative.
+  -> SDL_IOWhence
+  -- ^
+  --
+  --           [@whence@]: any of @SDL_IO_SEEK_SET@, @SDL_IO_SEEK_CUR@, @SDL_IO_SEEK_END@.
+  -> IO BG.Int64
+seekIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_SeekIO x00 (Coerce.coerce x11) x22)
+
+-- | Seek within an 'SDL_IOStream' data stream.
+--
+--     This function seeks to byte @offset@, relative to @whence@.
+--
+--     @whence@ may be any of the following values:
+--
+--     * @SDL_IO_SEEK_SET@: seek from the beginning of data
+--
+--     * @SDL_IO_SEEK_CUR@: seek relative to current read point
+--
+--     * @SDL_IO_SEEK_END@: seek relative to the end of data
+--
+--     If this stream can not seek, it will return -1.
+--
+--     [Returns]: the final offset in the data stream after the seek or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'tellIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SeekIO@.
+--                   The unsafe flavor is 'seekIO'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SeekIO@, defined at @SDL3\/SDL_iostream.h 554:36@
+seekIOSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@offset@]: an offset in bytes, relative to @whence@ location; can be negative.
+  -> SDL_IOWhence
+  -- ^
+  --
+  --           [@whence@]: any of @SDL_IO_SEEK_SET@, @SDL_IO_SEEK_CUR@, @SDL_IO_SEEK_END@.
+  -> IO BG.Int64
+seekIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_SeekIO x00 (Coerce.coerce x11) x22)
+
+-- | Determine the current read\/write offset in an 'SDL_IOStream' data stream.
+--
+--     'tellIO' is actually a wrapper function that calls the 'SDL_IOStream' \'s @seek@ method, with an offset of 0 bytes from @SDL_IO_SEEK_CUR@, to simplify application development.
+--
+--     [Returns]: the current offset in the stream, or -1 if the information can not be determined.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'seekIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_TellIO@.
+--                   The safe flavor is 'tellIOSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TellIO@, defined at @SDL3\/SDL_iostream.h 574:36@
+tellIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: an 'SDL_IOStream' data stream object from which to get the current offset.
+  -> IO BG.Int64
+tellIO =
+  \x00 -> fmap Coerce.coerce (Unsafe.sDL_TellIO x00)
+
+-- | Determine the current read\/write offset in an 'SDL_IOStream' data stream.
+--
+--     'tellIO' is actually a wrapper function that calls the 'SDL_IOStream' \'s @seek@ method, with an offset of 0 bytes from @SDL_IO_SEEK_CUR@, to simplify application development.
+--
+--     [Returns]: the current offset in the stream, or -1 if the information can not be determined.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'seekIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_TellIO@.
+--                   The unsafe flavor is 'tellIO'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TellIO@, defined at @SDL3\/SDL_iostream.h 574:36@
+tellIOSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: an 'SDL_IOStream' data stream object from which to get the current offset.
+  -> IO BG.Int64
+tellIOSafe =
+  \x00 -> fmap Coerce.coerce (Safe.sDL_TellIO x00)
+
+-- | Read from a data source.
+--
+--     This function reads up @size@ bytes from the data source to the area pointed at by @ptr@. This function may read less bytes than requested.
+--
+--     This function will return zero when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If zero is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     A request for zero bytes on a valid stream will return zero immediately without accessing the stream, so the stream status (EOF, err, etc) will not change.
+--
+--     [Returns]: the number of bytes read, or 0 on end of file or other failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'writeIO', 'getIOStatus'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadIO@.
+--                   The safe flavor is 'readIOSafe'
+--                   : dispatches through the stream\'s SDL_IOStreamInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadIO@, defined at @SDL3\/SDL_iostream.h 604:36@
+readIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to read data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to read from the data source.
+  -> IO BG.Word64
+readIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_ReadIO x00 x11 (Coerce.coerce x22))
+
+-- | Read from a data source.
+--
+--     This function reads up @size@ bytes from the data source to the area pointed at by @ptr@. This function may read less bytes than requested.
+--
+--     This function will return zero when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If zero is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     A request for zero bytes on a valid stream will return zero immediately without accessing the stream, so the stream status (EOF, err, etc) will not change.
+--
+--     [Returns]: the number of bytes read, or 0 on end of file or other failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'writeIO', 'getIOStatus'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadIO@.
+--                   The unsafe flavor is 'readIO'
+--                   : dispatches through the stream\'s SDL_IOStreamInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadIO@, defined at @SDL3\/SDL_iostream.h 604:36@
+readIOSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer to read data into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to read from the data source.
+  -> IO BG.Word64
+readIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_ReadIO x00 x11 (Coerce.coerce x22))
+
+-- | Write to an 'SDL_IOStream' data stream.
+--
+--     This function writes exactly @size@ bytes from the area pointed at by @ptr@ to the stream. If this fails for any reason, it\'ll return less than @size@ to demonstrate how far the write progressed. On success, it returns @size@.
+--
+--     On error, this function still attempts to write as much as possible, so it might return a positive value less than the requested write size.
+--
+--     The caller can use @'getIOStatus'@ to determine if the problem is recoverable, such as a non-blocking write that can simply be retried later, or a fatal error.
+--
+--     A request for zero bytes on a valid stream will return zero immediately without accessing the stream, so the stream status (EOF, err, etc) will not change.
+--
+--     [Returns]: the number of bytes written, which will be less than @size@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_IOprintf@, 'readIO', 'seekIO', 'flushIO', 'getIOStatus'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteIO@.
+--                   The safe flavor is 'writeIOSafe'
+--                   : dispatches through the stream\'s SDL_IOStreamInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteIO@, defined at @SDL3\/SDL_iostream.h 640:36@
+writeIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer containing data to write.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to write.
+  -> IO BG.Word64
+writeIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_WriteIO x00 x11 (Coerce.coerce x22))
+
+-- | Write to an 'SDL_IOStream' data stream.
+--
+--     This function writes exactly @size@ bytes from the area pointed at by @ptr@ to the stream. If this fails for any reason, it\'ll return less than @size@ to demonstrate how far the write progressed. On success, it returns @size@.
+--
+--     On error, this function still attempts to write as much as possible, so it might return a positive value less than the requested write size.
+--
+--     The caller can use @'getIOStatus'@ to determine if the problem is recoverable, such as a non-blocking write that can simply be retried later, or a fatal error.
+--
+--     A request for zero bytes on a valid stream will return zero immediately without accessing the stream, so the stream status (EOF, err, etc) will not change.
+--
+--     [Returns]: the number of bytes written, which will be less than @size@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_IOprintf@, 'readIO', 'seekIO', 'flushIO', 'getIOStatus'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteIO@.
+--                   The unsafe flavor is 'writeIO'
+--                   : dispatches through the stream\'s SDL_IOStreamInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteIO@, defined at @SDL3\/SDL_iostream.h 640:36@
+writeIOSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: a pointer to an 'SDL_IOStream' structure.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@ptr@]: a pointer to a buffer containing data to write.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the number of bytes to write.
+  -> IO BG.Word64
+writeIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_WriteIO x00 x11 (Coerce.coerce x22))
+
+-- | Flush any buffered data in the stream.
+--
+--     This function makes sure that any buffered data is written to the stream. Normally this isn\'t necessary but if the stream is a pipe or socket it guarantees that any pending data is sent.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openIO', 'writeIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_FlushIO@.
+--                   The safe flavor is 'flushIOSafe'
+--                   : dispatches through the stream\'s SDL_IOStreamInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlushIO@, defined at @SDL3\/SDL_iostream.h 701:34@
+flushIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: 'SDL_IOStream' structure to flush.
+  -> IO Bool
+flushIO =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_FlushIO x00)
+
+-- | Flush any buffered data in the stream.
+--
+--     This function makes sure that any buffered data is written to the stream. Normally this isn\'t necessary but if the stream is a pipe or socket it guarantees that any pending data is sent.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openIO', 'writeIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_FlushIO@.
+--                   The unsafe flavor is 'flushIO'
+--                   : dispatches through the stream\'s SDL_IOStreamInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlushIO@, defined at @SDL3\/SDL_iostream.h 701:34@
+flushIOSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@context@]: 'SDL_IOStream' structure to flush.
+  -> IO Bool
+flushIOSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_FlushIO x00)
+
+-- | Load all the data from an SDL data stream.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with 'SDL3.Sys.Stdinc.free'.
+--
+--     [Returns]: the data or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadFile', 'saveFileIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadFile_IO@.
+--                   The safe flavor is 'loadFileIOSafe'
+--                   : reads the whole stream; a Haskell SDL_IOStreamInterface re-enters synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadFile_IO@, defined at @SDL3\/SDL_iostream.h 727:36@
+loadFileIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read all available data from.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: a pointer filled in with the number of bytes read, may be NULL.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls @'closeIO'@ on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr BG.Void)
+loadFileIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_LoadFile_IO x00 x11 (CBool.fromBool x22)
+
+-- | Load all the data from an SDL data stream.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with 'SDL3.Sys.Stdinc.free'.
+--
+--     [Returns]: the data or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadFile', 'saveFileIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadFile_IO@.
+--                   The unsafe flavor is 'loadFileIO'
+--                   : reads the whole stream; a Haskell SDL_IOStreamInterface re-enters synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadFile_IO@, defined at @SDL3\/SDL_iostream.h 727:36@
+loadFileIOSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read all available data from.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: a pointer filled in with the number of bytes read, may be NULL.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls @'closeIO'@ on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr BG.Void)
+loadFileIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_LoadFile_IO x00 x11 (CBool.fromBool x22)
+
+-- | Load all the data from a file path.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with 'SDL3.Sys.Stdinc.free'.
+--
+--     [Returns]: the data or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadFileIO', 'saveFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadFile@.
+--                   The safe flavor is 'loadFileSafe'
+--                   : blocks on whole-file I\/O; an unsafe call stalls every capability and GC for the duration.
+--
+--     [C declaration]: @SDL_LoadFile@, defined at @SDL3\/SDL_iostream.h 750:36@
+loadFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to read all available data from.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: if not NULL, will store the number of bytes read.
+  -> IO (BG.Ptr BG.Void)
+loadFile = Unsafe.sDL_LoadFile
+
+-- | Load all the data from a file path.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with 'SDL3.Sys.Stdinc.free'.
+--
+--     [Returns]: the data or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadFileIO', 'saveFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadFile@.
+--                   The unsafe flavor is 'loadFile'
+--                   : blocks on whole-file I\/O; an unsafe call stalls every capability and GC for the duration.
+--
+--     [C declaration]: @SDL_LoadFile@, defined at @SDL3\/SDL_iostream.h 750:36@
+loadFileSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to read all available data from.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: if not NULL, will store the number of bytes read.
+  -> IO (BG.Ptr BG.Void)
+loadFileSafe = Safe.sDL_LoadFile
+
+-- | Save all the data into an SDL data stream.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'saveFile', 'loadFileIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SaveFile_IO@.
+--                   The safe flavor is 'saveFileIOSafe'
+--                   : writes the whole stream; a Haskell SDL_IOStreamInterface re-enters synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SaveFile_IO@, defined at @SDL3\/SDL_iostream.h 771:34@
+saveFileIO
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to write all data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be written. If datasize is 0, may be NULL or a invalid pointer.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@datasize@]: the number of bytes to be written.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls @'closeIO'@ on @src@ before returning, even in the case of an error.
+  -> IO Bool
+saveFileIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_SaveFile_IO x00 x11 (Coerce.coerce x22) (CBool.fromBool x33))
+
+-- | Save all the data into an SDL data stream.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'saveFile', 'loadFileIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SaveFile_IO@.
+--                   The unsafe flavor is 'saveFileIO'
+--                   : writes the whole stream; a Haskell SDL_IOStreamInterface re-enters synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SaveFile_IO@, defined at @SDL3\/SDL_iostream.h 771:34@
+saveFileIOSafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to write all data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be written. If datasize is 0, may be NULL or a invalid pointer.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@datasize@]: the number of bytes to be written.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls @'closeIO'@ on @src@ before returning, even in the case of an error.
+  -> IO Bool
+saveFileIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_SaveFile_IO x00 x11 (Coerce.coerce x22) (CBool.fromBool x33))
+
+-- | Save all the data into a file path.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'saveFileIO', 'loadFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SaveFile@.
+--                   The safe flavor is 'saveFileSafe'
+--                   : blocks on whole-file I\/O.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SaveFile@, defined at @SDL3\/SDL_iostream.h 790:34@
+saveFile
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to write all available data into.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be written. If datasize is 0, may be NULL or a invalid pointer.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@datasize@]: the number of bytes to be written.
+  -> IO Bool
+saveFile =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SaveFile x00 x11 (Coerce.coerce x22))
+
+-- | Save all the data into a file path.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'saveFileIO', 'loadFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SaveFile@.
+--                   The unsafe flavor is 'saveFile'
+--                   : blocks on whole-file I\/O.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SaveFile@, defined at @SDL3\/SDL_iostream.h 790:34@
+saveFileSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the path to write all available data into.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be written. If datasize is 0, may be NULL or a invalid pointer.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@datasize@]: the number of bytes to be written.
+  -> IO Bool
+saveFileSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SaveFile x00 x11 (Coerce.coerce x22))
+
+-- | Use this function to read a byte from an 'SDL_IOStream'.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on success or false on failure or EOF; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadU8@.
+--                   The safe flavor is 'readU8Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU8@, defined at @SDL3\/SDL_iostream.h 816:34@
+readU8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU8 =
+  \x00 ->
+    \x11 -> fmap CBool.toBool (Unsafe.sDL_ReadU8 x00 x11)
+
+-- | Use this function to read a byte from an 'SDL_IOStream'.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on success or false on failure or EOF; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadU8@.
+--                   The unsafe flavor is 'readU8'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU8@, defined at @SDL3\/SDL_iostream.h 816:34@
+readU8Safe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU8Safe =
+  \x00 ->
+    \x11 -> fmap CBool.toBool (Safe.sDL_ReadU8 x00 x11)
+
+-- | Use this function to read a signed byte from an 'SDL_IOStream'.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadS8@.
+--                   The safe flavor is 'readS8Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS8@, defined at @SDL3\/SDL_iostream.h 835:34@
+readS8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint8
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS8 =
+  \x00 ->
+    \x11 -> fmap CBool.toBool (Unsafe.sDL_ReadS8 x00 x11)
+
+-- | Use this function to read a signed byte from an 'SDL_IOStream'.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadS8@.
+--                   The unsafe flavor is 'readS8'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS8@, defined at @SDL3\/SDL_iostream.h 835:34@
+readS8Safe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the 'SDL_IOStream' to read from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint8
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS8Safe =
+  \x00 ->
+    \x11 -> fmap CBool.toBool (Safe.sDL_ReadS8 x00 x11)
+
+-- | Use this function to read 16 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadU16LE@.
+--                   The safe flavor is 'readU16LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU16LE@, defined at @SDL3\/SDL_iostream.h 858:34@
+readU16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU16LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadU16LE x00 x11)
+
+-- | Use this function to read 16 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadU16LE@.
+--                   The unsafe flavor is 'readU16LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU16LE@, defined at @SDL3\/SDL_iostream.h 858:34@
+readU16LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU16LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadU16LE x00 x11)
+
+-- | Use this function to read 16 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadS16LE@.
+--                   The safe flavor is 'readS16LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS16LE@, defined at @SDL3\/SDL_iostream.h 881:34@
+readS16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS16LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadS16LE x00 x11)
+
+-- | Use this function to read 16 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadS16LE@.
+--                   The unsafe flavor is 'readS16LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS16LE@, defined at @SDL3\/SDL_iostream.h 881:34@
+readS16LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS16LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadS16LE x00 x11)
+
+-- | Use this function to read 16 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadU16BE@.
+--                   The safe flavor is 'readU16BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU16BE@, defined at @SDL3\/SDL_iostream.h 904:34@
+readU16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU16BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadU16BE x00 x11)
+
+-- | Use this function to read 16 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadU16BE@.
+--                   The unsafe flavor is 'readU16BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU16BE@, defined at @SDL3\/SDL_iostream.h 904:34@
+readU16BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU16BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadU16BE x00 x11)
+
+-- | Use this function to read 16 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadS16BE@.
+--                   The safe flavor is 'readS16BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS16BE@, defined at @SDL3\/SDL_iostream.h 927:34@
+readS16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS16BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadS16BE x00 x11)
+
+-- | Use this function to read 16 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadS16BE@.
+--                   The unsafe flavor is 'readS16BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS16BE@, defined at @SDL3\/SDL_iostream.h 927:34@
+readS16BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS16BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadS16BE x00 x11)
+
+-- | Use this function to read 32 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadU32LE@.
+--                   The safe flavor is 'readU32LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU32LE@, defined at @SDL3\/SDL_iostream.h 950:34@
+readU32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU32LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadU32LE x00 x11)
+
+-- | Use this function to read 32 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadU32LE@.
+--                   The unsafe flavor is 'readU32LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU32LE@, defined at @SDL3\/SDL_iostream.h 950:34@
+readU32LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU32LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadU32LE x00 x11)
+
+-- | Use this function to read 32 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadS32LE@.
+--                   The safe flavor is 'readS32LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS32LE@, defined at @SDL3\/SDL_iostream.h 973:34@
+readS32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS32LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadS32LE x00 x11)
+
+-- | Use this function to read 32 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadS32LE@.
+--                   The unsafe flavor is 'readS32LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS32LE@, defined at @SDL3\/SDL_iostream.h 973:34@
+readS32LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS32LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadS32LE x00 x11)
+
+-- | Use this function to read 32 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadU32BE@.
+--                   The safe flavor is 'readU32BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU32BE@, defined at @SDL3\/SDL_iostream.h 996:34@
+readU32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU32BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadU32BE x00 x11)
+
+-- | Use this function to read 32 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadU32BE@.
+--                   The unsafe flavor is 'readU32BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU32BE@, defined at @SDL3\/SDL_iostream.h 996:34@
+readU32BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU32BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadU32BE x00 x11)
+
+-- | Use this function to read 32 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadS32BE@.
+--                   The safe flavor is 'readS32BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS32BE@, defined at @SDL3\/SDL_iostream.h 1019:34@
+readS32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS32BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadS32BE x00 x11)
+
+-- | Use this function to read 32 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadS32BE@.
+--                   The unsafe flavor is 'readS32BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS32BE@, defined at @SDL3\/SDL_iostream.h 1019:34@
+readS32BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint32
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS32BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadS32BE x00 x11)
+
+-- | Use this function to read 64 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadU64LE@.
+--                   The safe flavor is 'readU64LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU64LE@, defined at @SDL3\/SDL_iostream.h 1042:34@
+readU64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU64LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadU64LE x00 x11)
+
+-- | Use this function to read 64 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadU64LE@.
+--                   The unsafe flavor is 'readU64LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU64LE@, defined at @SDL3\/SDL_iostream.h 1042:34@
+readU64LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU64LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadU64LE x00 x11)
+
+-- | Use this function to read 64 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadS64LE@.
+--                   The safe flavor is 'readS64LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS64LE@, defined at @SDL3\/SDL_iostream.h 1065:34@
+readS64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS64LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadS64LE x00 x11)
+
+-- | Use this function to read 64 bits of little-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadS64LE@.
+--                   The unsafe flavor is 'readS64LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS64LE@, defined at @SDL3\/SDL_iostream.h 1065:34@
+readS64LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS64LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadS64LE x00 x11)
+
+-- | Use this function to read 64 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadU64BE@.
+--                   The safe flavor is 'readU64BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU64BE@, defined at @SDL3\/SDL_iostream.h 1088:34@
+readU64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU64BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadU64BE x00 x11)
+
+-- | Use this function to read 64 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadU64BE@.
+--                   The unsafe flavor is 'readU64BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadU64BE@, defined at @SDL3\/SDL_iostream.h 1088:34@
+readU64BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readU64BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadU64BE x00 x11)
+
+-- | Use this function to read 64 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadS64BE@.
+--                   The safe flavor is 'readS64BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS64BE@, defined at @SDL3\/SDL_iostream.h 1111:34@
+readS64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS64BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ReadS64BE x00 x11)
+
+-- | Use this function to read 64 bits of big-endian data from an 'SDL_IOStream' and return in native format.
+--
+--     SDL byteswaps the data only if necessary, so the data returned will be in the native byte order.
+--
+--     This function will return false when the data stream is completely read, and @'getIOStatus'@ will return SDL_IO_STATUS_EOF. If false is returned and the stream is not at EOF, @'getIOStatus'@ will return a different error value and 'SDL3.Sys.Error.getError' will offer a human-readable message.
+--
+--     [Returns]: true on successful read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadS64BE@.
+--                   The unsafe flavor is 'readS64BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadS64BE@, defined at @SDL3\/SDL_iostream.h 1111:34@
+readS64BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the stream from which to read data.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint64
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the data read.
+  -> IO Bool
+readS64BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ReadS64BE x00 x11)
+
+-- | Use this function to write a byte to an 'SDL_IOStream'.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteU8@.
+--                   The safe flavor is 'writeU8Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU8@, defined at @SDL3\/SDL_iostream.h 1133:34@
+writeU8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_IOStream' to write to.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@value@]: the byte value to write.
+  -> IO Bool
+writeU8 =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteU8 x00 (Coerce.coerce x11))
+
+-- | Use this function to write a byte to an 'SDL_IOStream'.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteU8@.
+--                   The unsafe flavor is 'writeU8'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU8@, defined at @SDL3\/SDL_iostream.h 1133:34@
+writeU8Safe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_IOStream' to write to.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@value@]: the byte value to write.
+  -> IO Bool
+writeU8Safe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteU8 x00 (Coerce.coerce x11))
+
+-- | Use this function to write a signed byte to an 'SDL_IOStream'.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteS8@.
+--                   The safe flavor is 'writeS8Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS8@, defined at @SDL3\/SDL_iostream.h 1147:34@
+writeS8
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_IOStream' to write to.
+  -> BG.Int8
+  -- ^
+  --
+  --           [@value@]: the byte value to write.
+  -> IO Bool
+writeS8 =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteS8 x00 (Coerce.coerce x11))
+
+-- | Use this function to write a signed byte to an 'SDL_IOStream'.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteS8@.
+--                   The unsafe flavor is 'writeS8'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS8@, defined at @SDL3\/SDL_iostream.h 1147:34@
+writeS8Safe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_IOStream' to write to.
+  -> BG.Int8
+  -- ^
+  --
+  --           [@value@]: the byte value to write.
+  -> IO Bool
+writeS8Safe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteS8 x00 (Coerce.coerce x11))
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteU16LE@.
+--                   The safe flavor is 'writeU16LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU16LE@, defined at @SDL3\/SDL_iostream.h 1166:34@
+writeU16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU16LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteU16LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteU16LE@.
+--                   The unsafe flavor is 'writeU16LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU16LE@, defined at @SDL3\/SDL_iostream.h 1166:34@
+writeU16LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU16LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteU16LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteS16LE@.
+--                   The safe flavor is 'writeS16LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS16LE@, defined at @SDL3\/SDL_iostream.h 1185:34@
+writeS16LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS16LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteS16LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteS16LE@.
+--                   The unsafe flavor is 'writeS16LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS16LE@, defined at @SDL3\/SDL_iostream.h 1185:34@
+writeS16LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS16LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteS16LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteU16BE@.
+--                   The safe flavor is 'writeU16BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU16BE@, defined at @SDL3\/SDL_iostream.h 1203:34@
+writeU16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU16BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteU16BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteU16BE@.
+--                   The unsafe flavor is 'writeU16BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU16BE@, defined at @SDL3\/SDL_iostream.h 1203:34@
+writeU16BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU16BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteU16BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteS16BE@.
+--                   The safe flavor is 'writeS16BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS16BE@, defined at @SDL3\/SDL_iostream.h 1221:34@
+writeS16BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS16BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteS16BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 16 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteS16BE@.
+--                   The unsafe flavor is 'writeS16BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS16BE@, defined at @SDL3\/SDL_iostream.h 1221:34@
+writeS16BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int16
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS16BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteS16BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteU32LE@.
+--                   The safe flavor is 'writeU32LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU32LE@, defined at @SDL3\/SDL_iostream.h 1240:34@
+writeU32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU32LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteU32LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteU32LE@.
+--                   The unsafe flavor is 'writeU32LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU32LE@, defined at @SDL3\/SDL_iostream.h 1240:34@
+writeU32LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU32LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteU32LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteS32LE@.
+--                   The safe flavor is 'writeS32LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS32LE@, defined at @SDL3\/SDL_iostream.h 1259:34@
+writeS32LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS32LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteS32LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteS32LE@.
+--                   The unsafe flavor is 'writeS32LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS32LE@, defined at @SDL3\/SDL_iostream.h 1259:34@
+writeS32LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS32LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteS32LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteU32BE@.
+--                   The safe flavor is 'writeU32BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU32BE@, defined at @SDL3\/SDL_iostream.h 1277:34@
+writeU32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU32BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteU32BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteU32BE@.
+--                   The unsafe flavor is 'writeU32BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU32BE@, defined at @SDL3\/SDL_iostream.h 1277:34@
+writeU32BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU32BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteU32BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteS32BE@.
+--                   The safe flavor is 'writeS32BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS32BE@, defined at @SDL3\/SDL_iostream.h 1295:34@
+writeS32BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS32BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteS32BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 32 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteS32BE@.
+--                   The unsafe flavor is 'writeS32BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS32BE@, defined at @SDL3\/SDL_iostream.h 1295:34@
+writeS32BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS32BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteS32BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteU64LE@.
+--                   The safe flavor is 'writeU64LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU64LE@, defined at @SDL3\/SDL_iostream.h 1314:34@
+writeU64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU64LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteU64LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteU64LE@.
+--                   The unsafe flavor is 'writeU64LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU64LE@, defined at @SDL3\/SDL_iostream.h 1314:34@
+writeU64LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU64LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteU64LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteS64LE@.
+--                   The safe flavor is 'writeS64LESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS64LE@, defined at @SDL3\/SDL_iostream.h 1333:34@
+writeS64LE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS64LE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteS64LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as little-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in little-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteS64LE@.
+--                   The unsafe flavor is 'writeS64LE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS64LE@, defined at @SDL3\/SDL_iostream.h 1333:34@
+writeS64LESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS64LESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteS64LE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteU64BE@.
+--                   The safe flavor is 'writeU64BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU64BE@, defined at @SDL3\/SDL_iostream.h 1351:34@
+writeU64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU64BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteU64BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteU64BE@.
+--                   The unsafe flavor is 'writeU64BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteU64BE@, defined at @SDL3\/SDL_iostream.h 1351:34@
+writeU64BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeU64BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteU64BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteS64BE@.
+--                   The safe flavor is 'writeS64BESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS64BE@, defined at @SDL3\/SDL_iostream.h 1369:34@
+writeS64BE
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS64BE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WriteS64BE x00 (Coerce.coerce x11))
+
+-- | Use this function to write 64 bits in native format to an 'SDL_IOStream' as big-endian data.
+--
+--     SDL byteswaps the data only if necessary, so the application always specifies native format, and the data written will be in big-endian format.
+--
+--     [Returns]: true on successful write or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Do not use the same 'SDL_IOStream' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteS64BE@.
+--                   The unsafe flavor is 'writeS64BE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteS64BE@, defined at @SDL3\/SDL_iostream.h 1369:34@
+writeS64BESafe
+  :: BG.Ptr SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: the stream to which data will be written.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@value@]: the data to be written, in native format.
+  -> IO Bool
+writeS64BESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WriteS64BE x00 (Coerce.coerce x11))
diff --git a/src/SDL3/Sys/Joystick.hs b/src/SDL3/Sys/Joystick.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Joystick.hs
@@ -0,0 +1,3983 @@
+-- | SDL joystick support.
+--
+--     This is the lower-level joystick handling. If you want the simpler option, where what each button does is well-defined, you should use the gamepad API instead.
+--
+--     The term \"instance_id\" is the current instantiation of a joystick device in the system. If the joystick is removed and then re-inserted then it will get a new instance_id. instance_id\'s are monotonically increasing identifiers of a joystick plugged in.
+--
+--     The term \"player_index\" is the number assigned to a player on a specific controller. For XInput controllers this returns the XInput user index. Many joysticks will not be able to supply this information.
+--
+--     SDL_GUID is used as a stable 128-bit identifier for a joystick device that does not change over time. It identifies class of the device (a X360 wired controller for example). This identifier is platform dependent.
+--
+--     In order to use these functions, 'SDL3.Sys.Init.init' must have been called with the SDL_INIT_JOYSTICK flag. This causes SDL to scan the system for joysticks, and load appropriate drivers.
+--
+--     If you would like to receive joystick updates while the application is in the background, you should set the following hint before calling 'SDL3.Sys.Init.init': SDL_HINT_JOYSTICK_ALLOW_BACKGROUND_EVENTS
+--
+--     SDL can provide virtual joysticks as well: the app defines an imaginary controller with @'attachVirtualJoystick'@, and then can provide inputs for it via @'setJoystickVirtualAxis'@, @'setJoystickVirtualButton'@, etc. As this data is supplied, it will look like a normal joystick to SDL, just not backed by a hardware driver. This has been used to make unusual devices, like VR headset controllers, look like normal joysticks, or provide recording\/playback of game inputs, etc. The joystick structure used to identify an SDL joystick.
+--
+--     This is opaque data.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Joystick.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Joystick (
+  module SDL3.Sys.Bindgen.Joystick,
+
+  -- * Function aliases
+  SDL3.Sys.Joystick.lockJoysticks,
+  SDL3.Sys.Joystick.lockJoysticksSafe,
+  SDL3.Sys.Joystick.unlockJoysticks,
+  SDL3.Sys.Joystick.unlockJoysticksSafe,
+  SDL3.Sys.Joystick.hasJoystick,
+  SDL3.Sys.Joystick.hasJoystickSafe,
+  SDL3.Sys.Joystick.getJoysticks,
+  SDL3.Sys.Joystick.getJoysticksSafe,
+  SDL3.Sys.Joystick.getJoystickNameForID,
+  SDL3.Sys.Joystick.getJoystickNameForIDSafe,
+  SDL3.Sys.Joystick.getJoystickPathForID,
+  SDL3.Sys.Joystick.getJoystickPathForIDSafe,
+  SDL3.Sys.Joystick.getJoystickPlayerIndexForID,
+  SDL3.Sys.Joystick.getJoystickPlayerIndexForIDSafe,
+  SDL3.Sys.Joystick.getJoystickGUIDForID,
+  SDL3.Sys.Joystick.getJoystickGUIDForIDSafe,
+  SDL3.Sys.Joystick.getJoystickVendorForID,
+  SDL3.Sys.Joystick.getJoystickVendorForIDSafe,
+  SDL3.Sys.Joystick.getJoystickProductForID,
+  SDL3.Sys.Joystick.getJoystickProductForIDSafe,
+  SDL3.Sys.Joystick.getJoystickProductVersionForID,
+  SDL3.Sys.Joystick.getJoystickProductVersionForIDSafe,
+  SDL3.Sys.Joystick.getJoystickTypeForID,
+  SDL3.Sys.Joystick.getJoystickTypeForIDSafe,
+  SDL3.Sys.Joystick.openJoystick,
+  SDL3.Sys.Joystick.openJoystickSafe,
+  SDL3.Sys.Joystick.getJoystickFromID,
+  SDL3.Sys.Joystick.getJoystickFromIDSafe,
+  SDL3.Sys.Joystick.getJoystickFromPlayerIndex,
+  SDL3.Sys.Joystick.getJoystickFromPlayerIndexSafe,
+  SDL3.Sys.Joystick.attachVirtualJoystick,
+  SDL3.Sys.Joystick.attachVirtualJoystickSafe,
+  SDL3.Sys.Joystick.detachVirtualJoystick,
+  SDL3.Sys.Joystick.detachVirtualJoystickSafe,
+  SDL3.Sys.Joystick.isJoystickVirtual,
+  SDL3.Sys.Joystick.isJoystickVirtualSafe,
+  SDL3.Sys.Joystick.setJoystickVirtualAxis,
+  SDL3.Sys.Joystick.setJoystickVirtualAxisSafe,
+  SDL3.Sys.Joystick.setJoystickVirtualBall,
+  SDL3.Sys.Joystick.setJoystickVirtualBallSafe,
+  SDL3.Sys.Joystick.setJoystickVirtualButton,
+  SDL3.Sys.Joystick.setJoystickVirtualButtonSafe,
+  SDL3.Sys.Joystick.setJoystickVirtualHat,
+  SDL3.Sys.Joystick.setJoystickVirtualHatSafe,
+  SDL3.Sys.Joystick.setJoystickVirtualTouchpad,
+  SDL3.Sys.Joystick.setJoystickVirtualTouchpadSafe,
+  SDL3.Sys.Joystick.sendJoystickVirtualSensorData,
+  SDL3.Sys.Joystick.sendJoystickVirtualSensorDataSafe,
+  SDL3.Sys.Joystick.getJoystickProperties,
+  SDL3.Sys.Joystick.getJoystickPropertiesSafe,
+  SDL3.Sys.Joystick.getJoystickName,
+  SDL3.Sys.Joystick.getJoystickNameSafe,
+  SDL3.Sys.Joystick.getJoystickPath,
+  SDL3.Sys.Joystick.getJoystickPathSafe,
+  SDL3.Sys.Joystick.getJoystickPlayerIndex,
+  SDL3.Sys.Joystick.getJoystickPlayerIndexSafe,
+  SDL3.Sys.Joystick.setJoystickPlayerIndex,
+  SDL3.Sys.Joystick.setJoystickPlayerIndexSafe,
+  SDL3.Sys.Joystick.getJoystickGUID,
+  SDL3.Sys.Joystick.getJoystickGUIDSafe,
+  SDL3.Sys.Joystick.getJoystickVendor,
+  SDL3.Sys.Joystick.getJoystickVendorSafe,
+  SDL3.Sys.Joystick.getJoystickProduct,
+  SDL3.Sys.Joystick.getJoystickProductSafe,
+  SDL3.Sys.Joystick.getJoystickProductVersion,
+  SDL3.Sys.Joystick.getJoystickProductVersionSafe,
+  SDL3.Sys.Joystick.getJoystickFirmwareVersion,
+  SDL3.Sys.Joystick.getJoystickFirmwareVersionSafe,
+  SDL3.Sys.Joystick.getJoystickSerial,
+  SDL3.Sys.Joystick.getJoystickSerialSafe,
+  SDL3.Sys.Joystick.getJoystickType,
+  SDL3.Sys.Joystick.getJoystickTypeSafe,
+  SDL3.Sys.Joystick.getJoystickGUIDInfo,
+  SDL3.Sys.Joystick.getJoystickGUIDInfoSafe,
+  SDL3.Sys.Joystick.joystickConnected,
+  SDL3.Sys.Joystick.joystickConnectedSafe,
+  SDL3.Sys.Joystick.getJoystickID,
+  SDL3.Sys.Joystick.getJoystickIDSafe,
+  SDL3.Sys.Joystick.getNumJoystickAxes,
+  SDL3.Sys.Joystick.getNumJoystickAxesSafe,
+  SDL3.Sys.Joystick.getNumJoystickBalls,
+  SDL3.Sys.Joystick.getNumJoystickBallsSafe,
+  SDL3.Sys.Joystick.getNumJoystickHats,
+  SDL3.Sys.Joystick.getNumJoystickHatsSafe,
+  SDL3.Sys.Joystick.getNumJoystickButtons,
+  SDL3.Sys.Joystick.getNumJoystickButtonsSafe,
+  SDL3.Sys.Joystick.setJoystickEventsEnabled,
+  SDL3.Sys.Joystick.setJoystickEventsEnabledSafe,
+  SDL3.Sys.Joystick.joystickEventsEnabled,
+  SDL3.Sys.Joystick.joystickEventsEnabledSafe,
+  SDL3.Sys.Joystick.updateJoysticks,
+  SDL3.Sys.Joystick.updateJoysticksSafe,
+  SDL3.Sys.Joystick.getJoystickAxis,
+  SDL3.Sys.Joystick.getJoystickAxisSafe,
+  SDL3.Sys.Joystick.getJoystickAxisInitialState,
+  SDL3.Sys.Joystick.getJoystickAxisInitialStateSafe,
+  SDL3.Sys.Joystick.getJoystickBall,
+  SDL3.Sys.Joystick.getJoystickBallSafe,
+  SDL3.Sys.Joystick.getJoystickHat,
+  SDL3.Sys.Joystick.getJoystickHatSafe,
+  SDL3.Sys.Joystick.getJoystickButton,
+  SDL3.Sys.Joystick.getJoystickButtonSafe,
+  SDL3.Sys.Joystick.rumbleJoystick,
+  SDL3.Sys.Joystick.rumbleJoystickSafe,
+  SDL3.Sys.Joystick.rumbleJoystickTriggers,
+  SDL3.Sys.Joystick.rumbleJoystickTriggersSafe,
+  SDL3.Sys.Joystick.setJoystickLED,
+  SDL3.Sys.Joystick.setJoystickLEDSafe,
+  SDL3.Sys.Joystick.sendJoystickEffect,
+  SDL3.Sys.Joystick.sendJoystickEffectSafe,
+  SDL3.Sys.Joystick.closeJoystick,
+  SDL3.Sys.Joystick.closeJoystickSafe,
+  SDL3.Sys.Joystick.getJoystickConnectionState,
+  SDL3.Sys.Joystick.getJoystickConnectionStateSafe,
+  SDL3.Sys.Joystick.getJoystickPowerInfo,
+  SDL3.Sys.Joystick.getJoystickPowerInfoSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Guid qualified
+import SDL3.Sys.Bindgen.Joystick
+import SDL3.Sys.Bindgen.Joystick.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Joystick.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Power qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Locking for atomic access to the joystick API.
+--
+--     The SDL joystick functions are thread-safe, however you can lock the joysticks while processing to guarantee that the joystick list won\'t change and joystick and gamepad events will not be delivered.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LockJoysticks@.
+--                   The safe flavor is 'lockJoysticksSafe'
+--                   .
+--
+--     [C declaration]: @SDL_LockJoysticks@, defined at @SDL3\/SDL_joystick.h 189:34@
+lockJoysticks :: IO ()
+lockJoysticks = Unsafe.sDL_LockJoysticks
+
+-- | Locking for atomic access to the joystick API.
+--
+--     The SDL joystick functions are thread-safe, however you can lock the joysticks while processing to guarantee that the joystick list won\'t change and joystick and gamepad events will not be delivered.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LockJoysticks@.
+--                   The unsafe flavor is 'lockJoysticks'
+--                   .
+--
+--     [C declaration]: @SDL_LockJoysticks@, defined at @SDL3\/SDL_joystick.h 189:34@
+lockJoysticksSafe :: IO ()
+lockJoysticksSafe = Safe.sDL_LockJoysticks
+
+-- | Unlocking for atomic access to the joystick API.
+--
+--     [Thread safety]: This should be called from the same thread that called @'lockJoysticks'@.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnlockJoysticks@.
+--                   The safe flavor is 'unlockJoysticksSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockJoysticks@, defined at @SDL3\/SDL_joystick.h 199:34@
+unlockJoysticks :: IO ()
+unlockJoysticks = Unsafe.sDL_UnlockJoysticks
+
+-- | Unlocking for atomic access to the joystick API.
+--
+--     [Thread safety]: This should be called from the same thread that called @'lockJoysticks'@.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnlockJoysticks@.
+--                   The unsafe flavor is 'unlockJoysticks'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockJoysticks@, defined at @SDL3\/SDL_joystick.h 199:34@
+unlockJoysticksSafe :: IO ()
+unlockJoysticksSafe = Safe.sDL_UnlockJoysticks
+
+-- | Return whether a joystick is currently connected.
+--
+--     [Returns]: true if a joystick is connected, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasJoystick@.
+--                   The safe flavor is 'hasJoystickSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasJoystick@, defined at @SDL3\/SDL_joystick.h 212:34@
+hasJoystick :: IO Bool
+hasJoystick =
+  fmap CBool.toBool Unsafe.sDL_HasJoystick
+
+-- | Return whether a joystick is currently connected.
+--
+--     [Returns]: true if a joystick is connected, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasJoystick@.
+--                   The unsafe flavor is 'hasJoystick'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasJoystick@, defined at @SDL3\/SDL_joystick.h 212:34@
+hasJoystickSafe :: IO Bool
+hasJoystickSafe =
+  fmap CBool.toBool Safe.sDL_HasJoystick
+
+-- | Get a list of currently connected joysticks.
+--
+--     [Returns]: a 0 terminated array of joystick instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasJoystick', 'openJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoysticks@.
+--                   The safe flavor is 'getJoysticksSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoysticks@, defined at @SDL3\/SDL_joystick.h 230:46@
+getJoysticks
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of joysticks returned, may be NULL.
+  -> IO (BG.Ptr SDL_JoystickID)
+getJoysticks = Unsafe.sDL_GetJoysticks
+
+-- | Get a list of currently connected joysticks.
+--
+--     [Returns]: a 0 terminated array of joystick instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasJoystick', 'openJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoysticks@.
+--                   The unsafe flavor is 'getJoysticks'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoysticks@, defined at @SDL3\/SDL_joystick.h 230:46@
+getJoysticksSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of joysticks returned, may be NULL.
+  -> IO (BG.Ptr SDL_JoystickID)
+getJoysticksSafe = Safe.sDL_GetJoysticks
+
+-- | Get the implementation dependent name of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the name of the selected joystick. If no name can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickName', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickNameForID@.
+--                   The safe flavor is 'getJoystickNameForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickNameForID@, defined at @SDL3\/SDL_joystick.h 248:42@
+getJoystickNameForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getJoystickNameForID =
+  Unsafe.sDL_GetJoystickNameForID
+
+-- | Get the implementation dependent name of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the name of the selected joystick. If no name can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickName', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickNameForID@.
+--                   The unsafe flavor is 'getJoystickNameForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickNameForID@, defined at @SDL3\/SDL_joystick.h 248:42@
+getJoystickNameForIDSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getJoystickNameForIDSafe =
+  Safe.sDL_GetJoystickNameForID
+
+-- | Get the implementation dependent path of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the path of the selected joystick. If no path can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickPath', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickPathForID@.
+--                   The safe flavor is 'getJoystickPathForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickPathForID@, defined at @SDL3\/SDL_joystick.h 266:42@
+getJoystickPathForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getJoystickPathForID =
+  Unsafe.sDL_GetJoystickPathForID
+
+-- | Get the implementation dependent path of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the path of the selected joystick. If no path can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickPath', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickPathForID@.
+--                   The unsafe flavor is 'getJoystickPathForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickPathForID@, defined at @SDL3\/SDL_joystick.h 266:42@
+getJoystickPathForIDSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getJoystickPathForIDSafe =
+  Safe.sDL_GetJoystickPathForID
+
+-- | Get the player index of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the player index of a joystick, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickPlayerIndex', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickPlayerIndexForID@.
+--                   The safe flavor is 'getJoystickPlayerIndexForIDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickPlayerIndexForID@, defined at @SDL3\/SDL_joystick.h 283:33@
+getJoystickPlayerIndexForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Int32
+getJoystickPlayerIndexForID =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetJoystickPlayerIndexForID x00)
+
+-- | Get the player index of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the player index of a joystick, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickPlayerIndex', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickPlayerIndexForID@.
+--                   The unsafe flavor is 'getJoystickPlayerIndexForID'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickPlayerIndexForID@, defined at @SDL3\/SDL_joystick.h 283:33@
+getJoystickPlayerIndexForIDSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Int32
+getJoystickPlayerIndexForIDSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetJoystickPlayerIndexForID x00)
+
+-- | Get the implementation-dependent GUID of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the GUID of the selected joystick. If called with an invalid instance_id, this function returns a zero GUID.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickGUID', 'SDL3.Sys.Guid.guidToString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickGUIDForID@.
+--                   The safe flavor is 'getJoystickGUIDForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickGUIDForID@, defined at @SDL3\/SDL_joystick.h 301:38@
+getJoystickGUIDForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+getJoystickGUIDForID =
+  Unsafe.sDL_GetJoystickGUIDForID
+
+-- | Get the implementation-dependent GUID of a joystick.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the GUID of the selected joystick. If called with an invalid instance_id, this function returns a zero GUID.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickGUID', 'SDL3.Sys.Guid.guidToString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickGUIDForID@.
+--                   The unsafe flavor is 'getJoystickGUIDForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickGUIDForID@, defined at @SDL3\/SDL_joystick.h 301:38@
+getJoystickGUIDForIDSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+getJoystickGUIDForIDSafe =
+  Safe.sDL_GetJoystickGUIDForID
+
+-- | Get the USB vendor ID of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickVendor', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickVendorForID@.
+--                   The safe flavor is 'getJoystickVendorForIDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickVendorForID@, defined at @SDL3\/SDL_joystick.h 320:36@
+getJoystickVendorForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getJoystickVendorForID =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetJoystickVendorForID x00)
+
+-- | Get the USB vendor ID of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickVendor', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickVendorForID@.
+--                   The unsafe flavor is 'getJoystickVendorForID'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickVendorForID@, defined at @SDL3\/SDL_joystick.h 320:36@
+getJoystickVendorForIDSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getJoystickVendorForIDSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetJoystickVendorForID x00)
+
+-- | Get the USB product ID of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickProduct', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickProductForID@.
+--                   The safe flavor is 'getJoystickProductForIDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickProductForID@, defined at @SDL3\/SDL_joystick.h 339:36@
+getJoystickProductForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getJoystickProductForID =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetJoystickProductForID x00)
+
+-- | Get the USB product ID of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickProduct', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickProductForID@.
+--                   The unsafe flavor is 'getJoystickProductForID'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickProductForID@, defined at @SDL3\/SDL_joystick.h 339:36@
+getJoystickProductForIDSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getJoystickProductForIDSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetJoystickProductForID x00)
+
+-- | Get the product version of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickProductVersion', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickProductVersionForID@.
+--                   The safe flavor is 'getJoystickProductVersionForIDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickProductVersionForID@, defined at @SDL3\/SDL_joystick.h 358:36@
+getJoystickProductVersionForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getJoystickProductVersionForID =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetJoystickProductVersionForID x00)
+
+-- | Get the product version of a joystick, if available.
+--
+--     This can be called before any joysticks are opened. If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected joystick. If called with an invalid instance_id, this function returns 0.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickProductVersion', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickProductVersionForID@.
+--                   The unsafe flavor is 'getJoystickProductVersionForID'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickProductVersionForID@, defined at @SDL3\/SDL_joystick.h 358:36@
+getJoystickProductVersionForIDSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO BG.Word16
+getJoystickProductVersionForIDSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetJoystickProductVersionForID x00)
+
+-- | Get the type of a joystick, if available.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the 'SDL_JoystickType' of the selected joystick. If called with an invalid instance_id, this function returns @SDL_JOYSTICK_TYPE_UNKNOWN@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickType', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickTypeForID@.
+--                   The safe flavor is 'getJoystickTypeForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickTypeForID@, defined at @SDL3\/SDL_joystick.h 377:46@
+getJoystickTypeForID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_JoystickType
+getJoystickTypeForID =
+  Unsafe.sDL_GetJoystickTypeForID
+
+-- | Get the type of a joystick, if available.
+--
+--     This can be called before any joysticks are opened.
+--
+--     [Returns]: the 'SDL_JoystickType' of the selected joystick. If called with an invalid instance_id, this function returns @SDL_JOYSTICK_TYPE_UNKNOWN@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickType', 'getJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickTypeForID@.
+--                   The unsafe flavor is 'getJoystickTypeForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickTypeForID@, defined at @SDL3\/SDL_joystick.h 377:46@
+getJoystickTypeForIDSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO SDL_JoystickType
+getJoystickTypeForIDSafe =
+  Safe.sDL_GetJoystickTypeForID
+
+-- | Open a joystick for use.
+--
+--     The joystick subsystem must be initialized before a joystick can be opened for use.
+--
+--     [Returns]: a joystick identifier or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenJoystick@.
+--                   The safe flavor is 'openJoystickSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenJoystick@, defined at @SDL3\/SDL_joystick.h 395:44@
+openJoystick
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr SDL_Joystick)
+openJoystick = Unsafe.sDL_OpenJoystick
+
+-- | Open a joystick for use.
+--
+--     The joystick subsystem must be initialized before a joystick can be opened for use.
+--
+--     [Returns]: a joystick identifier or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenJoystick@.
+--                   The unsafe flavor is 'openJoystick'
+--                   .
+--
+--     [C declaration]: @SDL_OpenJoystick@, defined at @SDL3\/SDL_joystick.h 395:44@
+openJoystickSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO (BG.Ptr SDL_Joystick)
+openJoystickSafe = Safe.sDL_OpenJoystick
+
+-- | Get the 'SDL_Joystick' associated with an instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Joystick' on success or NULL on failure or if it hasn\'t been opened yet; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickFromID@.
+--                   The safe flavor is 'getJoystickFromIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickFromID@, defined at @SDL3\/SDL_joystick.h 408:44@
+getJoystickFromID
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the instance ID to get the 'SDL_Joystick' for.
+  -> IO (BG.Ptr SDL_Joystick)
+getJoystickFromID = Unsafe.sDL_GetJoystickFromID
+
+-- | Get the 'SDL_Joystick' associated with an instance ID, if it has been opened.
+--
+--     [Returns]: an 'SDL_Joystick' on success or NULL on failure or if it hasn\'t been opened yet; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickFromID@.
+--                   The unsafe flavor is 'getJoystickFromID'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickFromID@, defined at @SDL3\/SDL_joystick.h 408:44@
+getJoystickFromIDSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the instance ID to get the 'SDL_Joystick' for.
+  -> IO (BG.Ptr SDL_Joystick)
+getJoystickFromIDSafe = Safe.sDL_GetJoystickFromID
+
+-- | Get the 'SDL_Joystick' associated with a player index.
+--
+--     [Returns]: an 'SDL_Joystick' on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickPlayerIndex', 'setJoystickPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickFromPlayerIndex@.
+--                   The safe flavor is 'getJoystickFromPlayerIndexSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickFromPlayerIndex@, defined at @SDL3\/SDL_joystick.h 424:44@
+getJoystickFromPlayerIndex
+  :: BG.Int32
+  -- ^
+  --
+  --           [@player_index@]: the player index to get the 'SDL_Joystick' for.
+  -> IO (BG.Ptr SDL_Joystick)
+getJoystickFromPlayerIndex =
+  \x00 ->
+    Unsafe.sDL_GetJoystickFromPlayerIndex (Coerce.coerce x00)
+
+-- | Get the 'SDL_Joystick' associated with a player index.
+--
+--     [Returns]: an 'SDL_Joystick' on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickPlayerIndex', 'setJoystickPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickFromPlayerIndex@.
+--                   The unsafe flavor is 'getJoystickFromPlayerIndex'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickFromPlayerIndex@, defined at @SDL3\/SDL_joystick.h 424:44@
+getJoystickFromPlayerIndexSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@player_index@]: the player index to get the 'SDL_Joystick' for.
+  -> IO (BG.Ptr SDL_Joystick)
+getJoystickFromPlayerIndexSafe =
+  \x00 ->
+    Safe.sDL_GetJoystickFromPlayerIndex (Coerce.coerce x00)
+
+-- | Attach a new virtual joystick.
+--
+--     Apps can create virtual joysticks, that exist without hardware directly backing them, and have program-supplied inputs. Once attached, a virtual joystick looks like any other joystick that SDL can access. These can be used to make other things look like joysticks, or provide pre-recorded input, etc.
+--
+--     Once attached, the app can send joystick inputs to the new virtual joystick using @'setJoystickVirtualAxis'@, etc.
+--
+--     When no longer needed, the virtual joystick can be removed by calling @'detachVirtualJoystick'@.
+--
+--     [Returns]: the joystick instance ID, or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'detachVirtualJoystick', 'setJoystickVirtualAxis', 'setJoystickVirtualButton', 'setJoystickVirtualBall', 'setJoystickVirtualHat', 'setJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AttachVirtualJoystick@.
+--                   The safe flavor is 'attachVirtualJoystickSafe'
+--                   .
+--
+--     [C declaration]: @SDL_AttachVirtualJoystick@, defined at @SDL3\/SDL_joystick.h 539:44@
+attachVirtualJoystick
+  :: PtrConst.PtrConst SDL_VirtualJoystickDesc
+  -- ^
+  --
+  --           [@desc@]: joystick description, initialized using SDL_INIT_INTERFACE().
+  -> IO SDL_JoystickID
+attachVirtualJoystick =
+  Unsafe.sDL_AttachVirtualJoystick
+
+-- | Attach a new virtual joystick.
+--
+--     Apps can create virtual joysticks, that exist without hardware directly backing them, and have program-supplied inputs. Once attached, a virtual joystick looks like any other joystick that SDL can access. These can be used to make other things look like joysticks, or provide pre-recorded input, etc.
+--
+--     Once attached, the app can send joystick inputs to the new virtual joystick using @'setJoystickVirtualAxis'@, etc.
+--
+--     When no longer needed, the virtual joystick can be removed by calling @'detachVirtualJoystick'@.
+--
+--     [Returns]: the joystick instance ID, or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'detachVirtualJoystick', 'setJoystickVirtualAxis', 'setJoystickVirtualButton', 'setJoystickVirtualBall', 'setJoystickVirtualHat', 'setJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AttachVirtualJoystick@.
+--                   The unsafe flavor is 'attachVirtualJoystick'
+--                   .
+--
+--     [C declaration]: @SDL_AttachVirtualJoystick@, defined at @SDL3\/SDL_joystick.h 539:44@
+attachVirtualJoystickSafe
+  :: PtrConst.PtrConst SDL_VirtualJoystickDesc
+  -- ^
+  --
+  --           [@desc@]: joystick description, initialized using SDL_INIT_INTERFACE().
+  -> IO SDL_JoystickID
+attachVirtualJoystickSafe =
+  Safe.sDL_AttachVirtualJoystick
+
+-- | Detach a virtual joystick.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'attachVirtualJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DetachVirtualJoystick@.
+--                   The safe flavor is 'detachVirtualJoystickSafe'
+--                   : a virtual joystick\'s cleanup callback runs synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DetachVirtualJoystick@, defined at @SDL3\/SDL_joystick.h 555:34@
+detachVirtualJoystick
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID, previously returned from @'attachVirtualJoystick'@.
+  -> IO Bool
+detachVirtualJoystick =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_DetachVirtualJoystick x00)
+
+-- | Detach a virtual joystick.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'attachVirtualJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DetachVirtualJoystick@.
+--                   The unsafe flavor is 'detachVirtualJoystick'
+--                   : a virtual joystick\'s cleanup callback runs synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DetachVirtualJoystick@, defined at @SDL3\/SDL_joystick.h 555:34@
+detachVirtualJoystickSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID, previously returned from @'attachVirtualJoystick'@.
+  -> IO Bool
+detachVirtualJoystickSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_DetachVirtualJoystick x00)
+
+-- | Query whether or not a joystick is virtual.
+--
+--     [Returns]: true if the joystick is virtual, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IsJoystickVirtual@.
+--                   The safe flavor is 'isJoystickVirtualSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsJoystickVirtual@, defined at @SDL3\/SDL_joystick.h 567:34@
+isJoystickVirtual
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO Bool
+isJoystickVirtual =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_IsJoystickVirtual x00)
+
+-- | Query whether or not a joystick is virtual.
+--
+--     [Returns]: true if the joystick is virtual, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IsJoystickVirtual@.
+--                   The unsafe flavor is 'isJoystickVirtual'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsJoystickVirtual@, defined at @SDL3\/SDL_joystick.h 567:34@
+isJoystickVirtualSafe
+  :: SDL_JoystickID
+  -- ^
+  --
+  --           [@instance_id@]: the joystick instance ID.
+  -> IO Bool
+isJoystickVirtualSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_IsJoystickVirtual x00)
+
+-- | Set the state of an axis on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     Note that when sending trigger axes, you should scale the value to the full range of Sint16. For example, a trigger at rest would have the value of @'sDL_JOYSTICK_AXIS_MIN'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualButton', 'setJoystickVirtualBall', 'setJoystickVirtualHat', 'setJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetJoystickVirtualAxis@.
+--                   The safe flavor is 'setJoystickVirtualAxisSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickVirtualAxis@, defined at @SDL3\/SDL_joystick.h 598:34@
+setJoystickVirtualAxis
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@axis@]: the index of the axis on the virtual joystick to update.
+  -> BG.Int16
+  -- ^
+  --
+  --           [@value@]: the new value for the specified axis.
+  -> IO Bool
+setJoystickVirtualAxis =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetJoystickVirtualAxis x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Set the state of an axis on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     Note that when sending trigger axes, you should scale the value to the full range of Sint16. For example, a trigger at rest would have the value of @'sDL_JOYSTICK_AXIS_MIN'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualButton', 'setJoystickVirtualBall', 'setJoystickVirtualHat', 'setJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetJoystickVirtualAxis@.
+--                   The unsafe flavor is 'setJoystickVirtualAxis'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickVirtualAxis@, defined at @SDL3\/SDL_joystick.h 598:34@
+setJoystickVirtualAxisSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@axis@]: the index of the axis on the virtual joystick to update.
+  -> BG.Int16
+  -- ^
+  --
+  --           [@value@]: the new value for the specified axis.
+  -> IO Bool
+setJoystickVirtualAxisSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetJoystickVirtualAxis x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Generate ball motion on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualAxis', 'setJoystickVirtualButton', 'setJoystickVirtualHat', 'setJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetJoystickVirtualBall@.
+--                   The safe flavor is 'setJoystickVirtualBallSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickVirtualBall@, defined at @SDL3\/SDL_joystick.h 626:34@
+setJoystickVirtualBall
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@ball@]: the index of the ball on the virtual joystick to update.
+  -> BG.Int16
+  -- ^
+  --
+  --           [@xrel@]: the relative motion on the X axis.
+  -> BG.Int16
+  -- ^
+  --
+  --           [@yrel@]: the relative motion on the Y axis.
+  -> IO Bool
+setJoystickVirtualBall =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_SetJoystickVirtualBall x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Generate ball motion on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualAxis', 'setJoystickVirtualButton', 'setJoystickVirtualHat', 'setJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetJoystickVirtualBall@.
+--                   The unsafe flavor is 'setJoystickVirtualBall'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickVirtualBall@, defined at @SDL3\/SDL_joystick.h 626:34@
+setJoystickVirtualBallSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@ball@]: the index of the ball on the virtual joystick to update.
+  -> BG.Int16
+  -- ^
+  --
+  --           [@xrel@]: the relative motion on the X axis.
+  -> BG.Int16
+  -- ^
+  --
+  --           [@yrel@]: the relative motion on the Y axis.
+  -> IO Bool
+setJoystickVirtualBallSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_SetJoystickVirtualBall x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Set the state of a button on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualAxis', 'setJoystickVirtualBall', 'setJoystickVirtualHat', 'setJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetJoystickVirtualButton@.
+--                   The safe flavor is 'setJoystickVirtualButtonSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickVirtualButton@, defined at @SDL3\/SDL_joystick.h 653:34@
+setJoystickVirtualButton
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@button@]: the index of the button on the virtual joystick to update.
+  -> Bool
+  -- ^
+  --
+  --           [@down@]: true if the button is pressed, false otherwise.
+  -> IO Bool
+setJoystickVirtualButton =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetJoystickVirtualButton x00 (Coerce.coerce x11) (CBool.fromBool x22))
+
+-- | Set the state of a button on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualAxis', 'setJoystickVirtualBall', 'setJoystickVirtualHat', 'setJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetJoystickVirtualButton@.
+--                   The unsafe flavor is 'setJoystickVirtualButton'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickVirtualButton@, defined at @SDL3\/SDL_joystick.h 653:34@
+setJoystickVirtualButtonSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@button@]: the index of the button on the virtual joystick to update.
+  -> Bool
+  -- ^
+  --
+  --           [@down@]: true if the button is pressed, false otherwise.
+  -> IO Bool
+setJoystickVirtualButtonSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetJoystickVirtualButton x00 (Coerce.coerce x11) (CBool.fromBool x22))
+
+-- | Set the state of a hat on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualAxis', 'setJoystickVirtualButton', 'setJoystickVirtualBall', 'setJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetJoystickVirtualHat@.
+--                   The safe flavor is 'setJoystickVirtualHatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickVirtualHat@, defined at @SDL3\/SDL_joystick.h 680:34@
+setJoystickVirtualHat
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hat@]: the index of the hat on the virtual joystick to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@value@]: the new value for the specified hat.
+  -> IO Bool
+setJoystickVirtualHat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetJoystickVirtualHat x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Set the state of a hat on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualAxis', 'setJoystickVirtualButton', 'setJoystickVirtualBall', 'setJoystickVirtualTouchpad', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetJoystickVirtualHat@.
+--                   The unsafe flavor is 'setJoystickVirtualHat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickVirtualHat@, defined at @SDL3\/SDL_joystick.h 680:34@
+setJoystickVirtualHatSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hat@]: the index of the hat on the virtual joystick to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@value@]: the new value for the specified hat.
+  -> IO Bool
+setJoystickVirtualHatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetJoystickVirtualHat x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Set touchpad finger state on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualAxis', 'setJoystickVirtualButton', 'setJoystickVirtualBall', 'setJoystickVirtualHat', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetJoystickVirtualTouchpad@.
+--                   The safe flavor is 'setJoystickVirtualTouchpadSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickVirtualTouchpad@, defined at @SDL3\/SDL_joystick.h 714:34@
+setJoystickVirtualTouchpad
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@touchpad@]: the index of the touchpad on the virtual joystick to update.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@finger@]: the index of the finger on the touchpad to set.
+  -> Bool
+  -- ^
+  --
+  --           [@down@]: true if the finger is pressed, false if the finger is released.
+  -> Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the finger on the touchpad, normalized 0 to 1, with the origin in the upper left.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the finger on the touchpad, normalized 0 to 1, with the origin in the upper left.
+  -> Float
+  -- ^
+  --
+  --           [@pressure@]: the pressure of the finger.
+  -> IO Bool
+setJoystickVirtualTouchpad =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  ( Unsafe.sDL_SetJoystickVirtualTouchpad
+                      x00
+                      (Coerce.coerce x11)
+                      (Coerce.coerce x22)
+                      (CBool.fromBool x33)
+                      (Coerce.coerce x44)
+                      (Coerce.coerce x55)
+                      (Coerce.coerce x66)
+                  )
+
+-- | Set touchpad finger state on an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualAxis', 'setJoystickVirtualButton', 'setJoystickVirtualBall', 'setJoystickVirtualHat', SDL_SetJoystickVirtualSensorData
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetJoystickVirtualTouchpad@.
+--                   The unsafe flavor is 'setJoystickVirtualTouchpad'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickVirtualTouchpad@, defined at @SDL3\/SDL_joystick.h 714:34@
+setJoystickVirtualTouchpadSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@touchpad@]: the index of the touchpad on the virtual joystick to update.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@finger@]: the index of the finger on the touchpad to set.
+  -> Bool
+  -- ^
+  --
+  --           [@down@]: true if the finger is pressed, false if the finger is released.
+  -> Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the finger on the touchpad, normalized 0 to 1, with the origin in the upper left.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the finger on the touchpad, normalized 0 to 1, with the origin in the upper left.
+  -> Float
+  -- ^
+  --
+  --           [@pressure@]: the pressure of the finger.
+  -> IO Bool
+setJoystickVirtualTouchpadSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  ( Safe.sDL_SetJoystickVirtualTouchpad
+                      x00
+                      (Coerce.coerce x11)
+                      (Coerce.coerce x22)
+                      (CBool.fromBool x33)
+                      (Coerce.coerce x44)
+                      (Coerce.coerce x55)
+                      (Coerce.coerce x66)
+                  )
+
+-- | Send a sensor update for an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualAxis', 'setJoystickVirtualButton', 'setJoystickVirtualBall', 'setJoystickVirtualHat', 'setJoystickVirtualTouchpad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SendJoystickVirtualSensorData@.
+--                   The safe flavor is 'sendJoystickVirtualSensorDataSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SendJoystickVirtualSensorData@, defined at @SDL3\/SDL_joystick.h 744:34@
+sendJoystickVirtualSensorData
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of the sensor on the virtual joystick to update.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@sensor_timestamp@]: a 64-bit timestamp in nanoseconds associated with the sensor reading.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@data@]: the data associated with the sensor reading.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_values@]: the number of values pointed to by @data@.
+  -> IO Bool
+sendJoystickVirtualSensorData =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              (Unsafe.sDL_SendJoystickVirtualSensorData x00 x11 (Coerce.coerce x22) x33 (Coerce.coerce x44))
+
+-- | Send a sensor update for an opened virtual joystick.
+--
+--     Please note that values set here will not be applied until the next call to 'updateJoysticks', which can either be called directly, or can be called indirectly through various other SDL APIs, including, but not limited to the following: 'SDL3.Sys.Events.pollEvent', 'SDL3.Sys.Events.pumpEvents', 'SDL3.Sys.Events.waitEventTimeout', 'SDL3.Sys.Events.waitEvent'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickVirtualAxis', 'setJoystickVirtualButton', 'setJoystickVirtualBall', 'setJoystickVirtualHat', 'setJoystickVirtualTouchpad'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SendJoystickVirtualSensorData@.
+--                   The unsafe flavor is 'sendJoystickVirtualSensorData'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SendJoystickVirtualSensorData@, defined at @SDL3\/SDL_joystick.h 744:34@
+sendJoystickVirtualSensorDataSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the virtual joystick on which to set state.
+  -> SDL3.Sys.Bindgen.Sensor.SDL_SensorType
+  -- ^
+  --
+  --           [@type@]: the type of the sensor on the virtual joystick to update.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@sensor_timestamp@]: a 64-bit timestamp in nanoseconds associated with the sensor reading.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@data@]: the data associated with the sensor reading.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_values@]: the number of values pointed to by @data@.
+  -> IO Bool
+sendJoystickVirtualSensorDataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              (Safe.sDL_SendJoystickVirtualSensorData x00 x11 (Coerce.coerce x22) x33 (Coerce.coerce x44))
+
+-- | Get the properties associated with a joystick.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN'@: true if this joystick has an LED that has adjustable brightness
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN'@: true if this joystick has an LED that has adjustable color
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN'@: true if this joystick has a player LED
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN'@: true if this joystick has left\/right rumble
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN'@: true if this joystick has simple trigger rumble
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickProperties@.
+--                   The safe flavor is 'getJoystickPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickProperties@, defined at @SDL3\/SDL_joystick.h 770:46@
+getJoystickProperties
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getJoystickProperties =
+  Unsafe.sDL_GetJoystickProperties
+
+-- | Get the properties associated with a joystick.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_MONO_LED_BOOLEAN'@: true if this joystick has an LED that has adjustable brightness
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_RGB_LED_BOOLEAN'@: true if this joystick has an LED that has adjustable color
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_PLAYER_LED_BOOLEAN'@: true if this joystick has a player LED
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_RUMBLE_BOOLEAN'@: true if this joystick has left\/right rumble
+--
+--     * @'sDL_PROP_JOYSTICK_CAP_TRIGGER_RUMBLE_BOOLEAN'@: true if this joystick has simple trigger rumble
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickProperties@.
+--                   The unsafe flavor is 'getJoystickProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickProperties@, defined at @SDL3\/SDL_joystick.h 770:46@
+getJoystickPropertiesSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getJoystickPropertiesSafe =
+  Safe.sDL_GetJoystickProperties
+
+-- | Get the implementation dependent name of a joystick.
+--
+--     [Returns]: the name of the selected joystick. If no name can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickNameForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickName@.
+--                   The safe flavor is 'getJoystickNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickName@, defined at @SDL3\/SDL_joystick.h 791:42@
+getJoystickName
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getJoystickName = Unsafe.sDL_GetJoystickName
+
+-- | Get the implementation dependent name of a joystick.
+--
+--     [Returns]: the name of the selected joystick. If no name can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickNameForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickName@.
+--                   The unsafe flavor is 'getJoystickName'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickName@, defined at @SDL3\/SDL_joystick.h 791:42@
+getJoystickNameSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getJoystickNameSafe = Safe.sDL_GetJoystickName
+
+-- | Get the implementation dependent path of a joystick.
+--
+--     [Returns]: the path of the selected joystick. If no path can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickPathForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickPath@.
+--                   The safe flavor is 'getJoystickPathSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickPath@, defined at @SDL3\/SDL_joystick.h 806:42@
+getJoystickPath
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getJoystickPath = Unsafe.sDL_GetJoystickPath
+
+-- | Get the implementation dependent path of a joystick.
+--
+--     [Returns]: the path of the selected joystick. If no path can be found, this function returns NULL; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickPathForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickPath@.
+--                   The unsafe flavor is 'getJoystickPath'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickPath@, defined at @SDL3\/SDL_joystick.h 806:42@
+getJoystickPathSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getJoystickPathSafe = Safe.sDL_GetJoystickPath
+
+-- | Get the player index of an opened joystick.
+--
+--     For XInput controllers this returns the XInput user index. Many joysticks will not be able to supply this information.
+--
+--     [Returns]: the player index, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickPlayerIndex@.
+--                   The safe flavor is 'getJoystickPlayerIndexSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickPlayerIndex@, defined at @SDL3\/SDL_joystick.h 823:33@
+getJoystickPlayerIndex
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO BG.Int32
+getJoystickPlayerIndex =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetJoystickPlayerIndex x00)
+
+-- | Get the player index of an opened joystick.
+--
+--     For XInput controllers this returns the XInput user index. Many joysticks will not be able to supply this information.
+--
+--     [Returns]: the player index, or -1 if it\'s not available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickPlayerIndex@.
+--                   The unsafe flavor is 'getJoystickPlayerIndex'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickPlayerIndex@, defined at @SDL3\/SDL_joystick.h 823:33@
+getJoystickPlayerIndexSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO BG.Int32
+getJoystickPlayerIndexSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetJoystickPlayerIndex x00)
+
+-- | Set the player index of an opened joystick.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetJoystickPlayerIndex@.
+--                   The safe flavor is 'setJoystickPlayerIndexSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickPlayerIndex@, defined at @SDL3\/SDL_joystick.h 840:34@
+setJoystickPlayerIndex
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@player_index@]: player index to assign to this joystick, or -1 to clear the player index and turn off player LEDs.
+  -> IO Bool
+setJoystickPlayerIndex =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetJoystickPlayerIndex x00 (Coerce.coerce x11))
+
+-- | Set the player index of an opened joystick.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickPlayerIndex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetJoystickPlayerIndex@.
+--                   The unsafe flavor is 'setJoystickPlayerIndex'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickPlayerIndex@, defined at @SDL3\/SDL_joystick.h 840:34@
+setJoystickPlayerIndexSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@player_index@]: player index to assign to this joystick, or -1 to clear the player index and turn off player LEDs.
+  -> IO Bool
+setJoystickPlayerIndexSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetJoystickPlayerIndex x00 (Coerce.coerce x11))
+
+-- | Get the implementation-dependent GUID for the joystick.
+--
+--     This function requires an open joystick.
+--
+--     [Returns]: the GUID of the given joystick. If called on an invalid index, this function returns a zero GUID; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickGUIDForID', 'SDL3.Sys.Guid.guidToString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickGUID@.
+--                   The safe flavor is 'getJoystickGUIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickGUID@, defined at @SDL3\/SDL_joystick.h 859:38@
+getJoystickGUID
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+getJoystickGUID = Unsafe.sDL_GetJoystickGUID
+
+-- | Get the implementation-dependent GUID for the joystick.
+--
+--     This function requires an open joystick.
+--
+--     [Returns]: the GUID of the given joystick. If called on an invalid index, this function returns a zero GUID; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickGUIDForID', 'SDL3.Sys.Guid.guidToString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickGUID@.
+--                   The unsafe flavor is 'getJoystickGUID'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickGUID@, defined at @SDL3\/SDL_joystick.h 859:38@
+getJoystickGUIDSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO SDL3.Sys.Bindgen.Guid.SDL_GUID
+getJoystickGUIDSafe = Safe.sDL_GetJoystickGUID
+
+-- | Get the USB vendor ID of an opened joystick, if available.
+--
+--     If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickVendorForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickVendor@.
+--                   The safe flavor is 'getJoystickVendorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickVendor@, defined at @SDL3\/SDL_joystick.h 875:36@
+getJoystickVendor
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO BG.Word16
+getJoystickVendor =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetJoystickVendor x00)
+
+-- | Get the USB vendor ID of an opened joystick, if available.
+--
+--     If the vendor ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB vendor ID of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickVendorForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickVendor@.
+--                   The unsafe flavor is 'getJoystickVendor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickVendor@, defined at @SDL3\/SDL_joystick.h 875:36@
+getJoystickVendorSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO BG.Word16
+getJoystickVendorSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetJoystickVendor x00)
+
+-- | Get the USB product ID of an opened joystick, if available.
+--
+--     If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickProductForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickProduct@.
+--                   The safe flavor is 'getJoystickProductSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickProduct@, defined at @SDL3\/SDL_joystick.h 891:36@
+getJoystickProduct
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO BG.Word16
+getJoystickProduct =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetJoystickProduct x00)
+
+-- | Get the USB product ID of an opened joystick, if available.
+--
+--     If the product ID isn\'t available this function returns 0.
+--
+--     [Returns]: the USB product ID of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickProductForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickProduct@.
+--                   The unsafe flavor is 'getJoystickProduct'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickProduct@, defined at @SDL3\/SDL_joystick.h 891:36@
+getJoystickProductSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO BG.Word16
+getJoystickProductSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetJoystickProduct x00)
+
+-- | Get the product version of an opened joystick, if available.
+--
+--     If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickProductVersionForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickProductVersion@.
+--                   The safe flavor is 'getJoystickProductVersionSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickProductVersion@, defined at @SDL3\/SDL_joystick.h 907:36@
+getJoystickProductVersion
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO BG.Word16
+getJoystickProductVersion =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetJoystickProductVersion x00)
+
+-- | Get the product version of an opened joystick, if available.
+--
+--     If the product version isn\'t available this function returns 0.
+--
+--     [Returns]: the product version of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickProductVersionForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickProductVersion@.
+--                   The unsafe flavor is 'getJoystickProductVersion'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickProductVersion@, defined at @SDL3\/SDL_joystick.h 907:36@
+getJoystickProductVersionSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO BG.Word16
+getJoystickProductVersionSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetJoystickProductVersion x00)
+
+-- | Get the firmware version of an opened joystick, if available.
+--
+--     If the firmware version isn\'t available this function returns 0.
+--
+--     [Returns]: the firmware version of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickFirmwareVersion@.
+--                   The safe flavor is 'getJoystickFirmwareVersionSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickFirmwareVersion@, defined at @SDL3\/SDL_joystick.h 922:36@
+getJoystickFirmwareVersion
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO BG.Word16
+getJoystickFirmwareVersion =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetJoystickFirmwareVersion x00)
+
+-- | Get the firmware version of an opened joystick, if available.
+--
+--     If the firmware version isn\'t available this function returns 0.
+--
+--     [Returns]: the firmware version of the selected joystick, or 0 if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickFirmwareVersion@.
+--                   The unsafe flavor is 'getJoystickFirmwareVersion'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickFirmwareVersion@, defined at @SDL3\/SDL_joystick.h 922:36@
+getJoystickFirmwareVersionSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO BG.Word16
+getJoystickFirmwareVersionSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetJoystickFirmwareVersion x00)
+
+-- | Get the serial number of an opened joystick, if available.
+--
+--     Returns the serial number of the joystick, or NULL if it is not available.
+--
+--     [Returns]: the serial number of the selected joystick, or NULL if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickSerial@.
+--                   The safe flavor is 'getJoystickSerialSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickSerial@, defined at @SDL3\/SDL_joystick.h 937:42@
+getJoystickSerial
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getJoystickSerial = Unsafe.sDL_GetJoystickSerial
+
+-- | Get the serial number of an opened joystick, if available.
+--
+--     Returns the serial number of the joystick, or NULL if it is not available.
+--
+--     [Returns]: the serial number of the selected joystick, or NULL if unavailable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickSerial@.
+--                   The unsafe flavor is 'getJoystickSerial'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickSerial@, defined at @SDL3\/SDL_joystick.h 937:42@
+getJoystickSerialSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getJoystickSerialSafe = Safe.sDL_GetJoystickSerial
+
+-- | Get the type of an opened joystick.
+--
+--     [Returns]: the 'SDL_JoystickType' of the selected joystick.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickTypeForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickType@.
+--                   The safe flavor is 'getJoystickTypeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickType@, defined at @SDL3\/SDL_joystick.h 951:46@
+getJoystickType
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO SDL_JoystickType
+getJoystickType = Unsafe.sDL_GetJoystickType
+
+-- | Get the type of an opened joystick.
+--
+--     [Returns]: the 'SDL_JoystickType' of the selected joystick.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickTypeForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickType@.
+--                   The unsafe flavor is 'getJoystickType'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickType@, defined at @SDL3\/SDL_joystick.h 951:46@
+getJoystickTypeSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' obtained from @'openJoystick'@.
+  -> IO SDL_JoystickType
+getJoystickTypeSafe = Safe.sDL_GetJoystickType
+
+-- | Get the device information encoded in a SDL_GUID structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickGUIDForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickGUIDInfo@.
+--                   The safe flavor is 'getJoystickGUIDInfoSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickGUIDInfo@, defined at @SDL3\/SDL_joystick.h 972:34@
+getJoystickGUIDInfo
+  :: SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: the SDL_GUID you wish to get info about.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@vendor@]: a pointer filled in with the device VID, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@product@]: a pointer filled in with the device PID, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@version@]: a pointer filled in with the device version, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@crc16@]: a pointer filled in with a CRC used to distinguish different products with the same VID\/PID, or 0 if not available.
+  -> IO ()
+getJoystickGUIDInfo = Unsafe.sDL_GetJoystickGUIDInfo
+
+-- | Get the device information encoded in a SDL_GUID structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickGUIDForID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickGUIDInfo@.
+--                   The unsafe flavor is 'getJoystickGUIDInfo'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickGUIDInfo@, defined at @SDL3\/SDL_joystick.h 972:34@
+getJoystickGUIDInfoSafe
+  :: SDL3.Sys.Bindgen.Guid.SDL_GUID
+  -- ^
+  --
+  --           [@guid@]: the SDL_GUID you wish to get info about.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@vendor@]: a pointer filled in with the device VID, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@product@]: a pointer filled in with the device PID, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@version@]: a pointer filled in with the device version, or 0 if not available.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint16
+  -- ^
+  --
+  --           [@crc16@]: a pointer filled in with a CRC used to distinguish different products with the same VID\/PID, or 0 if not available.
+  -> IO ()
+getJoystickGUIDInfoSafe =
+  Safe.sDL_GetJoystickGUIDInfo
+
+-- | Get the status of a specified joystick.
+--
+--     [Returns]: true if the joystick has been opened, false if it has not; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_JoystickConnected@.
+--                   The safe flavor is 'joystickConnectedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_JoystickConnected@, defined at @SDL3\/SDL_joystick.h 985:34@
+joystickConnected
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> IO Bool
+joystickConnected =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_JoystickConnected x00)
+
+-- | Get the status of a specified joystick.
+--
+--     [Returns]: true if the joystick has been opened, false if it has not; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_JoystickConnected@.
+--                   The unsafe flavor is 'joystickConnected'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_JoystickConnected@, defined at @SDL3\/SDL_joystick.h 985:34@
+joystickConnectedSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> IO Bool
+joystickConnectedSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_JoystickConnected x00)
+
+-- | Get the instance ID of an opened joystick.
+--
+--     [Returns]: the instance ID of the specified joystick on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickID@.
+--                   The safe flavor is 'getJoystickIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickID@, defined at @SDL3\/SDL_joystick.h 998:44@
+getJoystickID
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO SDL_JoystickID
+getJoystickID = Unsafe.sDL_GetJoystickID
+
+-- | Get the instance ID of an opened joystick.
+--
+--     [Returns]: the instance ID of the specified joystick on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickID@.
+--                   The unsafe flavor is 'getJoystickID'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickID@, defined at @SDL3\/SDL_joystick.h 998:44@
+getJoystickIDSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO SDL_JoystickID
+getJoystickIDSafe = Safe.sDL_GetJoystickID
+
+-- | Get the number of general axis controls on a joystick.
+--
+--     Often, the directional pad on a game controller will either look like 4 separate buttons or a POV hat, and not axes, but all of this is up to the device and platform.
+--
+--     [Returns]: the number of axis controls\/number of axes on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickAxis', 'getNumJoystickBalls', 'getNumJoystickButtons', 'getNumJoystickHats'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumJoystickAxes@.
+--                   The safe flavor is 'getNumJoystickAxesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumJoystickAxes@, defined at @SDL3\/SDL_joystick.h 1020:33@
+getNumJoystickAxes
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.Int32
+getNumJoystickAxes =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetNumJoystickAxes x00)
+
+-- | Get the number of general axis controls on a joystick.
+--
+--     Often, the directional pad on a game controller will either look like 4 separate buttons or a POV hat, and not axes, but all of this is up to the device and platform.
+--
+--     [Returns]: the number of axis controls\/number of axes on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickAxis', 'getNumJoystickBalls', 'getNumJoystickButtons', 'getNumJoystickHats'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumJoystickAxes@.
+--                   The unsafe flavor is 'getNumJoystickAxes'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumJoystickAxes@, defined at @SDL3\/SDL_joystick.h 1020:33@
+getNumJoystickAxesSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.Int32
+getNumJoystickAxesSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetNumJoystickAxes x00)
+
+-- | Get the number of trackballs on a joystick.
+--
+--     Joystick trackballs have only relative motion events associated with them and their state cannot be polled.
+--
+--     Most joysticks do not have trackballs.
+--
+--     [Returns]: the number of trackballs on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickBall', 'getNumJoystickAxes', 'getNumJoystickButtons', 'getNumJoystickHats'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumJoystickBalls@.
+--                   The safe flavor is 'getNumJoystickBallsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumJoystickBalls@, defined at @SDL3\/SDL_joystick.h 1043:33@
+getNumJoystickBalls
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.Int32
+getNumJoystickBalls =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetNumJoystickBalls x00)
+
+-- | Get the number of trackballs on a joystick.
+--
+--     Joystick trackballs have only relative motion events associated with them and their state cannot be polled.
+--
+--     Most joysticks do not have trackballs.
+--
+--     [Returns]: the number of trackballs on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickBall', 'getNumJoystickAxes', 'getNumJoystickButtons', 'getNumJoystickHats'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumJoystickBalls@.
+--                   The unsafe flavor is 'getNumJoystickBalls'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumJoystickBalls@, defined at @SDL3\/SDL_joystick.h 1043:33@
+getNumJoystickBallsSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.Int32
+getNumJoystickBallsSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetNumJoystickBalls x00)
+
+-- | Get the number of POV hats on a joystick.
+--
+--     [Returns]: the number of POV hats on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickHat', 'getNumJoystickAxes', 'getNumJoystickBalls', 'getNumJoystickButtons'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumJoystickHats@.
+--                   The safe flavor is 'getNumJoystickHatsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumJoystickHats@, defined at @SDL3\/SDL_joystick.h 1061:33@
+getNumJoystickHats
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.Int32
+getNumJoystickHats =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetNumJoystickHats x00)
+
+-- | Get the number of POV hats on a joystick.
+--
+--     [Returns]: the number of POV hats on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickHat', 'getNumJoystickAxes', 'getNumJoystickBalls', 'getNumJoystickButtons'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumJoystickHats@.
+--                   The unsafe flavor is 'getNumJoystickHats'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumJoystickHats@, defined at @SDL3\/SDL_joystick.h 1061:33@
+getNumJoystickHatsSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.Int32
+getNumJoystickHatsSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetNumJoystickHats x00)
+
+-- | Get the number of buttons on a joystick.
+--
+--     [Returns]: the number of buttons on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickButton', 'getNumJoystickAxes', 'getNumJoystickBalls', 'getNumJoystickHats'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumJoystickButtons@.
+--                   The safe flavor is 'getNumJoystickButtonsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumJoystickButtons@, defined at @SDL3\/SDL_joystick.h 1079:33@
+getNumJoystickButtons
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.Int32
+getNumJoystickButtons =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetNumJoystickButtons x00)
+
+-- | Get the number of buttons on a joystick.
+--
+--     [Returns]: the number of buttons on success or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getJoystickButton', 'getNumJoystickAxes', 'getNumJoystickBalls', 'getNumJoystickHats'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumJoystickButtons@.
+--                   The unsafe flavor is 'getNumJoystickButtons'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumJoystickButtons@, defined at @SDL3\/SDL_joystick.h 1079:33@
+getNumJoystickButtonsSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> IO BG.Int32
+getNumJoystickButtonsSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetNumJoystickButtons x00)
+
+-- | Set the state of joystick event processing.
+--
+--     If joystick events are disabled, you must call @'updateJoysticks'@ yourself and check the state of the joystick when you want joystick information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'joystickEventsEnabled', 'updateJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetJoystickEventsEnabled@.
+--                   The safe flavor is 'setJoystickEventsEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickEventsEnabled@, defined at @SDL3\/SDL_joystick.h 1097:34@
+setJoystickEventsEnabled
+  :: Bool
+  -- ^
+  --
+  --           [@enabled@]: whether to process joystick events or not.
+  -> IO ()
+setJoystickEventsEnabled =
+  \x00 ->
+    Unsafe.sDL_SetJoystickEventsEnabled (CBool.fromBool x00)
+
+-- | Set the state of joystick event processing.
+--
+--     If joystick events are disabled, you must call @'updateJoysticks'@ yourself and check the state of the joystick when you want joystick information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'joystickEventsEnabled', 'updateJoysticks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetJoystickEventsEnabled@.
+--                   The unsafe flavor is 'setJoystickEventsEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickEventsEnabled@, defined at @SDL3\/SDL_joystick.h 1097:34@
+setJoystickEventsEnabledSafe
+  :: Bool
+  -- ^
+  --
+  --           [@enabled@]: whether to process joystick events or not.
+  -> IO ()
+setJoystickEventsEnabledSafe =
+  \x00 ->
+    Safe.sDL_SetJoystickEventsEnabled (CBool.fromBool x00)
+
+-- | Query the state of joystick event processing.
+--
+--     If joystick events are disabled, you must call @'updateJoysticks'@ yourself and check the state of the joystick when you want joystick information.
+--
+--     [Returns]: true if joystick events are being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickEventsEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_JoystickEventsEnabled@.
+--                   The safe flavor is 'joystickEventsEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_JoystickEventsEnabled@, defined at @SDL3\/SDL_joystick.h 1114:34@
+joystickEventsEnabled :: IO Bool
+joystickEventsEnabled =
+  fmap CBool.toBool Unsafe.sDL_JoystickEventsEnabled
+
+-- | Query the state of joystick event processing.
+--
+--     If joystick events are disabled, you must call @'updateJoysticks'@ yourself and check the state of the joystick when you want joystick information.
+--
+--     [Returns]: true if joystick events are being processed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setJoystickEventsEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_JoystickEventsEnabled@.
+--                   The unsafe flavor is 'joystickEventsEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_JoystickEventsEnabled@, defined at @SDL3\/SDL_joystick.h 1114:34@
+joystickEventsEnabledSafe :: IO Bool
+joystickEventsEnabledSafe =
+  fmap CBool.toBool Safe.sDL_JoystickEventsEnabled
+
+-- | Update the current state of the open joysticks.
+--
+--     This is called automatically by the event loop if any joystick events are enabled.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UpdateJoysticks@.
+--                   The safe flavor is 'updateJoysticksSafe'
+--                   : virtual-device callbacks run synchronously.
+--
+--     [C declaration]: @SDL_UpdateJoysticks@, defined at @SDL3\/SDL_joystick.h 1126:34@
+updateJoysticks :: IO ()
+updateJoysticks = Unsafe.sDL_UpdateJoysticks
+
+-- | Update the current state of the open joysticks.
+--
+--     This is called automatically by the event loop if any joystick events are enabled.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UpdateJoysticks@.
+--                   The unsafe flavor is 'updateJoysticks'
+--                   : virtual-device callbacks run synchronously.
+--
+--     [C declaration]: @SDL_UpdateJoysticks@, defined at @SDL3\/SDL_joystick.h 1126:34@
+updateJoysticksSafe :: IO ()
+updateJoysticksSafe = Safe.sDL_UpdateJoysticks
+
+-- | Get the current state of an axis control on a joystick.
+--
+--     SDL makes no promises about what part of the joystick any given axis refers to. Your game should have some sort of configuration UI to let users specify what each axis should be bound to. Alternately, SDL\'s higher-level Game Controller API makes a great effort to apply order to this lower-level interface, so you know that a specific axis is the \"left thumb stick,\" etc.
+--
+--     The value returned by @'getJoystickAxis'@ is a signed integer (-32768 to 32767) representing the current position of the axis. It may be necessary to impose certain tolerances on these values to account for jitter.
+--
+--     [Returns]: a 16-bit signed integer representing the current position of the axis or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumJoystickAxes'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickAxis@.
+--                   The safe flavor is 'getJoystickAxisSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickAxis@, defined at @SDL3\/SDL_joystick.h 1152:36@
+getJoystickAxis
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@axis@]: the axis to query; the axis indices start at index 0.
+  -> IO BG.Int16
+getJoystickAxis =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_GetJoystickAxis x00 (Coerce.coerce x11))
+
+-- | Get the current state of an axis control on a joystick.
+--
+--     SDL makes no promises about what part of the joystick any given axis refers to. Your game should have some sort of configuration UI to let users specify what each axis should be bound to. Alternately, SDL\'s higher-level Game Controller API makes a great effort to apply order to this lower-level interface, so you know that a specific axis is the \"left thumb stick,\" etc.
+--
+--     The value returned by @'getJoystickAxis'@ is a signed integer (-32768 to 32767) representing the current position of the axis. It may be necessary to impose certain tolerances on these values to account for jitter.
+--
+--     [Returns]: a 16-bit signed integer representing the current position of the axis or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumJoystickAxes'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickAxis@.
+--                   The unsafe flavor is 'getJoystickAxis'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickAxis@, defined at @SDL3\/SDL_joystick.h 1152:36@
+getJoystickAxisSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@axis@]: the axis to query; the axis indices start at index 0.
+  -> IO BG.Int16
+getJoystickAxisSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_GetJoystickAxis x00 (Coerce.coerce x11))
+
+-- | Get the initial state of an axis control on a joystick.
+--
+--     The state is a value ranging from -32768 to 32767.
+--
+--     The axis indices start at index 0.
+--
+--     [Returns]: true if this axis has any initial value, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickAxisInitialState@.
+--                   The safe flavor is 'getJoystickAxisInitialStateSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickAxisInitialState@, defined at @SDL3\/SDL_joystick.h 1170:34@
+getJoystickAxisInitialState
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@axis@]: the axis to query; the axis indices start at index 0.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@state@]: upon return, the initial value is supplied here.
+  -> IO Bool
+getJoystickAxisInitialState =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetJoystickAxisInitialState x00 (Coerce.coerce x11) x22)
+
+-- | Get the initial state of an axis control on a joystick.
+--
+--     The state is a value ranging from -32768 to 32767.
+--
+--     The axis indices start at index 0.
+--
+--     [Returns]: true if this axis has any initial value, or false if not.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickAxisInitialState@.
+--                   The unsafe flavor is 'getJoystickAxisInitialState'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickAxisInitialState@, defined at @SDL3\/SDL_joystick.h 1170:34@
+getJoystickAxisInitialStateSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@axis@]: the axis to query; the axis indices start at index 0.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Sint16
+  -- ^
+  --
+  --           [@state@]: upon return, the initial value is supplied here.
+  -> IO Bool
+getJoystickAxisInitialStateSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetJoystickAxisInitialState x00 (Coerce.coerce x11) x22)
+
+-- | Get the ball axis change since the last poll.
+--
+--     Trackballs can only return relative motion since the last call to @'getJoystickBall'@, these motion deltas are placed into @dx@ and @dy@.
+--
+--     Most joysticks do not have trackballs.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumJoystickBalls'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickBall@.
+--                   The safe flavor is 'getJoystickBallSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickBall@, defined at @SDL3\/SDL_joystick.h 1193:34@
+getJoystickBall
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' to query.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@ball@]: the ball index to query; ball indices start at index 0.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dx@]: stores the difference in the x axis position since the last poll.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dy@]: stores the difference in the y axis position since the last poll.
+  -> IO Bool
+getJoystickBall =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_GetJoystickBall x00 (Coerce.coerce x11) x22 x33)
+
+-- | Get the ball axis change since the last poll.
+--
+--     Trackballs can only return relative motion since the last call to @'getJoystickBall'@, these motion deltas are placed into @dx@ and @dy@.
+--
+--     Most joysticks do not have trackballs.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumJoystickBalls'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickBall@.
+--                   The unsafe flavor is 'getJoystickBall'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickBall@, defined at @SDL3\/SDL_joystick.h 1193:34@
+getJoystickBallSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the 'SDL_Joystick' to query.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@ball@]: the ball index to query; ball indices start at index 0.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dx@]: stores the difference in the x axis position since the last poll.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@dy@]: stores the difference in the y axis position since the last poll.
+  -> IO Bool
+getJoystickBallSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_GetJoystickBall x00 (Coerce.coerce x11) x22 x33)
+
+-- | Get the current state of a POV hat on a joystick.
+--
+--     The returned value will be one of the @SDL_HAT_*@ values.
+--
+--     [Returns]: the current hat position.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumJoystickHats'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickHat@.
+--                   The safe flavor is 'getJoystickHatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickHat@, defined at @SDL3\/SDL_joystick.h 1210:35@
+getJoystickHat
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hat@]: the hat index to get the state from; indices start at index 0.
+  -> IO BG.Word8
+getJoystickHat =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_GetJoystickHat x00 (Coerce.coerce x11))
+
+-- | Get the current state of a POV hat on a joystick.
+--
+--     The returned value will be one of the @SDL_HAT_*@ values.
+--
+--     [Returns]: the current hat position.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumJoystickHats'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickHat@.
+--                   The unsafe flavor is 'getJoystickHat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickHat@, defined at @SDL3\/SDL_joystick.h 1210:35@
+getJoystickHatSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hat@]: the hat index to get the state from; indices start at index 0.
+  -> IO BG.Word8
+getJoystickHatSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_GetJoystickHat x00 (Coerce.coerce x11))
+
+-- | Get the current state of a button on a joystick.
+--
+--     [Returns]: true if the button is pressed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumJoystickButtons'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickButton@.
+--                   The safe flavor is 'getJoystickButtonSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickButton@, defined at @SDL3\/SDL_joystick.h 1236:34@
+getJoystickButton
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@button@]: the button index to get the state from; indices start at index 0.
+  -> IO Bool
+getJoystickButton =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetJoystickButton x00 (Coerce.coerce x11))
+
+-- | Get the current state of a button on a joystick.
+--
+--     [Returns]: true if the button is pressed, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumJoystickButtons'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickButton@.
+--                   The unsafe flavor is 'getJoystickButton'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetJoystickButton@, defined at @SDL3\/SDL_joystick.h 1236:34@
+getJoystickButtonSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: an 'SDL_Joystick' structure containing joystick information.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@button@]: the button index to get the state from; indices start at index 0.
+  -> IO Bool
+getJoystickButtonSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetJoystickButton x00 (Coerce.coerce x11))
+
+-- | Start a rumble effect.
+--
+--     Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     This function requires you to process SDL events or call @'updateJoysticks'@ to update rumble state.
+--
+--     [Returns]: true, or false if rumble isn\'t supported on this joystick.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RumbleJoystick@.
+--                   The safe flavor is 'rumbleJoystickSafe'
+--                   : a virtual joystick\'s rumble callback runs synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RumbleJoystick@, defined at @SDL3\/SDL_joystick.h 1259:34@
+rumbleJoystick
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to vibrate.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@low_frequency_rumble@]: the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@high_frequency_rumble@]: the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO Bool
+rumbleJoystick =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_RumbleJoystick x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Start a rumble effect.
+--
+--     Each call to this function cancels any previous rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     This function requires you to process SDL events or call @'updateJoysticks'@ to update rumble state.
+--
+--     [Returns]: true, or false if rumble isn\'t supported on this joystick.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RumbleJoystick@.
+--                   The unsafe flavor is 'rumbleJoystick'
+--                   : a virtual joystick\'s rumble callback runs synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RumbleJoystick@, defined at @SDL3\/SDL_joystick.h 1259:34@
+rumbleJoystickSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to vibrate.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@low_frequency_rumble@]: the intensity of the low frequency (left) rumble motor, from 0 to 0xFFFF.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@high_frequency_rumble@]: the intensity of the high frequency (right) rumble motor, from 0 to 0xFFFF.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO Bool
+rumbleJoystickSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_RumbleJoystick x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Start a rumble effect in the joystick\'s triggers.
+--
+--     Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     Note that this is rumbling of the /triggers/ and not the game controller as a whole. This is currently only supported on Xbox One controllers. If you want the (more common) whole-controller rumble, use @'rumbleJoystick'@ instead.
+--
+--     This function requires you to process SDL events or call @'updateJoysticks'@ to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rumbleJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RumbleJoystickTriggers@.
+--                   The safe flavor is 'rumbleJoystickTriggersSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RumbleJoystickTriggers@, defined at @SDL3\/SDL_joystick.h 1290:34@
+rumbleJoystickTriggers
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to vibrate.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@left_rumble@]: the intensity of the left trigger rumble motor, from 0 to 0xFFFF.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@right_rumble@]: the intensity of the right trigger rumble motor, from 0 to 0xFFFF.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO Bool
+rumbleJoystickTriggers =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_RumbleJoystickTriggers x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Start a rumble effect in the joystick\'s triggers.
+--
+--     Each call to this function cancels any previous trigger rumble effect, and calling it with 0 intensity stops any rumbling.
+--
+--     Note that this is rumbling of the /triggers/ and not the game controller as a whole. This is currently only supported on Xbox One controllers. If you want the (more common) whole-controller rumble, use @'rumbleJoystick'@ instead.
+--
+--     This function requires you to process SDL events or call @'updateJoysticks'@ to update rumble state.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rumbleJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RumbleJoystickTriggers@.
+--                   The unsafe flavor is 'rumbleJoystickTriggers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RumbleJoystickTriggers@, defined at @SDL3\/SDL_joystick.h 1290:34@
+rumbleJoystickTriggersSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to vibrate.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@left_rumble@]: the intensity of the left trigger rumble motor, from 0 to 0xFFFF.
+  -> BG.Word16
+  -- ^
+  --
+  --           [@right_rumble@]: the intensity of the right trigger rumble motor, from 0 to 0xFFFF.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@duration_ms@]: the duration of the rumble effect, in milliseconds.
+  -> IO Bool
+rumbleJoystickTriggersSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_RumbleJoystickTriggers x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Update a joystick\'s LED color.
+--
+--     An example of a joystick LED is the light on the back of a PlayStation 4\'s DualShock 4 controller.
+--
+--     For joysticks with a single color LED, the maximum of the RGB values will be used as the LED brightness.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetJoystickLED@.
+--                   The safe flavor is 'setJoystickLEDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickLED@, defined at @SDL3\/SDL_joystick.h 1312:34@
+setJoystickLED
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@red@]: the intensity of the red LED.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@green@]: the intensity of the green LED.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@blue@]: the intensity of the blue LED.
+  -> IO Bool
+setJoystickLED =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_SetJoystickLED x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Update a joystick\'s LED color.
+--
+--     An example of a joystick LED is the light on the back of a PlayStation 4\'s DualShock 4 controller.
+--
+--     For joysticks with a single color LED, the maximum of the RGB values will be used as the LED brightness.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetJoystickLED@.
+--                   The unsafe flavor is 'setJoystickLED'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetJoystickLED@, defined at @SDL3\/SDL_joystick.h 1312:34@
+setJoystickLEDSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@red@]: the intensity of the red LED.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@green@]: the intensity of the green LED.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@blue@]: the intensity of the blue LED.
+  -> IO Bool
+setJoystickLEDSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_SetJoystickLED x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Send a joystick specific effect packet.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SendJoystickEffect@.
+--                   The safe flavor is 'sendJoystickEffectSafe'
+--                   : a virtual joystick\'s effect callback runs synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SendJoystickEffect@, defined at @SDL3\/SDL_joystick.h 1327:34@
+sendJoystickEffect
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to affect.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to send to the joystick.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@size@]: the size of the data to send to the joystick.
+  -> IO Bool
+sendJoystickEffect =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SendJoystickEffect x00 x11 (Coerce.coerce x22))
+
+-- | Send a joystick specific effect packet.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SendJoystickEffect@.
+--                   The unsafe flavor is 'sendJoystickEffect'
+--                   : a virtual joystick\'s effect callback runs synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SendJoystickEffect@, defined at @SDL3\/SDL_joystick.h 1327:34@
+sendJoystickEffectSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to affect.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to send to the joystick.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@size@]: the size of the data to send to the joystick.
+  -> IO Bool
+sendJoystickEffectSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SendJoystickEffect x00 x11 (Coerce.coerce x22))
+
+-- | Close a joystick previously opened with @'openJoystick'@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CloseJoystick@.
+--                   The safe flavor is 'closeJoystickSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CloseJoystick@, defined at @SDL3\/SDL_joystick.h 1340:34@
+closeJoystick
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick device to close.
+  -> IO ()
+closeJoystick = Unsafe.sDL_CloseJoystick
+
+-- | Close a joystick previously opened with @'openJoystick'@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openJoystick'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CloseJoystick@.
+--                   The unsafe flavor is 'closeJoystick'
+--                   .
+--
+--     [C declaration]: @SDL_CloseJoystick@, defined at @SDL3\/SDL_joystick.h 1340:34@
+closeJoystickSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick device to close.
+  -> IO ()
+closeJoystickSafe = Safe.sDL_CloseJoystick
+
+-- | Get the connection state of a joystick.
+--
+--     [Returns]: the connection state on success or @SDL_JOYSTICK_CONNECTION_INVALID@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickConnectionState@.
+--                   The safe flavor is 'getJoystickConnectionStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickConnectionState@, defined at @SDL3\/SDL_joystick.h 1354:57@
+getJoystickConnectionState
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> IO SDL_JoystickConnectionState
+getJoystickConnectionState =
+  Unsafe.sDL_GetJoystickConnectionState
+
+-- | Get the connection state of a joystick.
+--
+--     [Returns]: the connection state on success or @SDL_JOYSTICK_CONNECTION_INVALID@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickConnectionState@.
+--                   The unsafe flavor is 'getJoystickConnectionState'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickConnectionState@, defined at @SDL3\/SDL_joystick.h 1354:57@
+getJoystickConnectionStateSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> IO SDL_JoystickConnectionState
+getJoystickConnectionStateSafe =
+  Safe.sDL_GetJoystickConnectionState
+
+-- | Get the battery state of a joystick.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     [Returns]: the current battery state or @SDL_POWERSTATE_ERROR@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetJoystickPowerInfo@.
+--                   The safe flavor is 'getJoystickPowerInfoSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickPowerInfo@, defined at @SDL3\/SDL_joystick.h 1377:44@
+getJoystickPowerInfo
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 we can\'t determine a value or there is no battery.
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+getJoystickPowerInfo =
+  Unsafe.sDL_GetJoystickPowerInfo
+
+-- | Get the battery state of a joystick.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     [Returns]: the current battery state or @SDL_POWERSTATE_ERROR@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetJoystickPowerInfo@.
+--                   The unsafe flavor is 'getJoystickPowerInfo'
+--                   .
+--
+--     [C declaration]: @SDL_GetJoystickPowerInfo@, defined at @SDL3\/SDL_joystick.h 1377:44@
+getJoystickPowerInfoSafe
+  :: BG.Ptr SDL_Joystick
+  -- ^
+  --
+  --           [@joystick@]: the joystick to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 we can\'t determine a value or there is no battery.
+  -> IO SDL3.Sys.Bindgen.Power.SDL_PowerState
+getJoystickPowerInfoSafe =
+  Safe.sDL_GetJoystickPowerInfo
diff --git a/src/SDL3/Sys/Keyboard.hs b/src/SDL3/Sys/Keyboard.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Keyboard.hs
@@ -0,0 +1,1555 @@
+-- | SDL keyboard management.
+--
+--     Please refer to the Best Keyboard Practices document for details on how best to accept keyboard input in various types of programs:
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/BestKeyboardPractices](https://wiki.libsdl.org/SDL3/BestKeyboardPractices) This is a unique ID for a keyboard for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     If the keyboard is disconnected and reconnected, it will get a new ID.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Keyboard.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Keyboard (
+  module SDL3.Sys.Bindgen.Keyboard,
+
+  -- * Function aliases
+  SDL3.Sys.Keyboard.hasKeyboard,
+  SDL3.Sys.Keyboard.hasKeyboardSafe,
+  SDL3.Sys.Keyboard.getKeyboards,
+  SDL3.Sys.Keyboard.getKeyboardsSafe,
+  SDL3.Sys.Keyboard.getKeyboardNameForID,
+  SDL3.Sys.Keyboard.getKeyboardNameForIDSafe,
+  SDL3.Sys.Keyboard.getKeyboardFocus,
+  SDL3.Sys.Keyboard.getKeyboardFocusSafe,
+  SDL3.Sys.Keyboard.getKeyboardState,
+  SDL3.Sys.Keyboard.getKeyboardStateSafe,
+  SDL3.Sys.Keyboard.resetKeyboard,
+  SDL3.Sys.Keyboard.resetKeyboardSafe,
+  SDL3.Sys.Keyboard.getModState,
+  SDL3.Sys.Keyboard.getModStateSafe,
+  SDL3.Sys.Keyboard.setModState,
+  SDL3.Sys.Keyboard.setModStateSafe,
+  SDL3.Sys.Keyboard.getKeyFromScancode,
+  SDL3.Sys.Keyboard.getKeyFromScancodeSafe,
+  SDL3.Sys.Keyboard.getScancodeFromKey,
+  SDL3.Sys.Keyboard.getScancodeFromKeySafe,
+  SDL3.Sys.Keyboard.setScancodeName,
+  SDL3.Sys.Keyboard.setScancodeNameSafe,
+  SDL3.Sys.Keyboard.getScancodeName,
+  SDL3.Sys.Keyboard.getScancodeNameSafe,
+  SDL3.Sys.Keyboard.getScancodeFromName,
+  SDL3.Sys.Keyboard.getScancodeFromNameSafe,
+  SDL3.Sys.Keyboard.getKeyName,
+  SDL3.Sys.Keyboard.getKeyNameSafe,
+  SDL3.Sys.Keyboard.getKeyFromName,
+  SDL3.Sys.Keyboard.getKeyFromNameSafe,
+  SDL3.Sys.Keyboard.startTextInput,
+  SDL3.Sys.Keyboard.startTextInputSafe,
+  SDL3.Sys.Keyboard.startTextInputWithProperties,
+  SDL3.Sys.Keyboard.startTextInputWithPropertiesSafe,
+  SDL3.Sys.Keyboard.textInputActive,
+  SDL3.Sys.Keyboard.textInputActiveSafe,
+  SDL3.Sys.Keyboard.stopTextInput,
+  SDL3.Sys.Keyboard.stopTextInputSafe,
+  SDL3.Sys.Keyboard.clearComposition,
+  SDL3.Sys.Keyboard.clearCompositionSafe,
+  SDL3.Sys.Keyboard.setTextInputArea,
+  SDL3.Sys.Keyboard.setTextInputAreaSafe,
+  SDL3.Sys.Keyboard.getTextInputArea,
+  SDL3.Sys.Keyboard.getTextInputAreaSafe,
+  SDL3.Sys.Keyboard.hasScreenKeyboardSupport,
+  SDL3.Sys.Keyboard.hasScreenKeyboardSupportSafe,
+  SDL3.Sys.Keyboard.screenKeyboardShown,
+  SDL3.Sys.Keyboard.screenKeyboardShownSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Keyboard
+import SDL3.Sys.Bindgen.Keyboard.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Keyboard.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Keycode qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Scancode qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | Return whether a keyboard is currently connected.
+--
+--     [Returns]: true if a keyboard is connected, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyboards'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasKeyboard@.
+--                   The safe flavor is 'hasKeyboardSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasKeyboard@, defined at @SDL3\/SDL_keyboard.h 75:34@
+hasKeyboard :: IO Bool
+hasKeyboard =
+  fmap CBool.toBool Unsafe.sDL_HasKeyboard
+
+-- | Return whether a keyboard is currently connected.
+--
+--     [Returns]: true if a keyboard is connected, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyboards'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasKeyboard@.
+--                   The unsafe flavor is 'hasKeyboard'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasKeyboard@, defined at @SDL3\/SDL_keyboard.h 75:34@
+hasKeyboardSafe :: IO Bool
+hasKeyboardSafe =
+  fmap CBool.toBool Safe.sDL_HasKeyboard
+
+-- | Get a list of currently connected keyboards.
+--
+--     Note that this will include any device or virtual driver that includes keyboard functionality, including some mice, KVM switches, motherboard power buttons, etc. You should wait for input from a device before you consider it actively in use.
+--
+--     [Returns]: a 0 terminated array of keyboards instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyboardNameForID', 'hasKeyboard'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetKeyboards@.
+--                   The safe flavor is 'getKeyboardsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyboards@, defined at @SDL3\/SDL_keyboard.h 98:46@
+getKeyboards
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of keyboards returned, may be NULL.
+  -> IO (BG.Ptr SDL_KeyboardID)
+getKeyboards = Unsafe.sDL_GetKeyboards
+
+-- | Get a list of currently connected keyboards.
+--
+--     Note that this will include any device or virtual driver that includes keyboard functionality, including some mice, KVM switches, motherboard power buttons, etc. You should wait for input from a device before you consider it actively in use.
+--
+--     [Returns]: a 0 terminated array of keyboards instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyboardNameForID', 'hasKeyboard'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetKeyboards@.
+--                   The unsafe flavor is 'getKeyboards'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyboards@, defined at @SDL3\/SDL_keyboard.h 98:46@
+getKeyboardsSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of keyboards returned, may be NULL.
+  -> IO (BG.Ptr SDL_KeyboardID)
+getKeyboardsSafe = Safe.sDL_GetKeyboards
+
+-- | Get the name of a keyboard.
+--
+--     This function returns \"\" if the keyboard doesn\'t have a name.
+--
+--     [Returns]: the name of the selected keyboard or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyboards'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetKeyboardNameForID@.
+--                   The safe flavor is 'getKeyboardNameForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyboardNameForID@, defined at @SDL3\/SDL_keyboard.h 115:42@
+getKeyboardNameForID
+  :: SDL_KeyboardID
+  -- ^
+  --
+  --           [@instance_id@]: the keyboard instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getKeyboardNameForID =
+  Unsafe.sDL_GetKeyboardNameForID
+
+-- | Get the name of a keyboard.
+--
+--     This function returns \"\" if the keyboard doesn\'t have a name.
+--
+--     [Returns]: the name of the selected keyboard or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyboards'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetKeyboardNameForID@.
+--                   The unsafe flavor is 'getKeyboardNameForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyboardNameForID@, defined at @SDL3\/SDL_keyboard.h 115:42@
+getKeyboardNameForIDSafe
+  :: SDL_KeyboardID
+  -- ^
+  --
+  --           [@instance_id@]: the keyboard instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getKeyboardNameForIDSafe =
+  Safe.sDL_GetKeyboardNameForID
+
+-- | Query the window which currently has keyboard focus.
+--
+--     [Returns]: the window with keyboard focus.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetKeyboardFocus@.
+--                   The safe flavor is 'getKeyboardFocusSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyboardFocus@, defined at @SDL3\/SDL_keyboard.h 126:42@
+getKeyboardFocus :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+getKeyboardFocus = Unsafe.sDL_GetKeyboardFocus
+
+-- | Query the window which currently has keyboard focus.
+--
+--     [Returns]: the window with keyboard focus.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetKeyboardFocus@.
+--                   The unsafe flavor is 'getKeyboardFocus'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyboardFocus@, defined at @SDL3\/SDL_keyboard.h 126:42@
+getKeyboardFocusSafe :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+getKeyboardFocusSafe = Safe.sDL_GetKeyboardFocus
+
+-- | Get a snapshot of the current state of the keyboard.
+--
+--     The pointer returned is a pointer to an internal SDL array. It will be valid for the whole lifetime of the application and should not be freed by the caller.
+--
+--     A array element with a value of true means that the key is pressed and a value of false means that it is not. Indexes into this array are obtained by using SDL_Scancode values.
+--
+--     Use 'SDL3.Sys.Events.pumpEvents' to update the state array.
+--
+--     This function gives you the current state after all events have been processed, so if a key or button has been pressed and released before you process events, then the pressed state will never show up in the @'getKeyboardState'@ calls.
+--
+--     Note: This function doesn\'t take into account whether shift has been pressed or not.
+--
+--     [Returns]: a pointer to an array of key states.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Events.pumpEvents', 'resetKeyboard'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetKeyboardState@.
+--                   The safe flavor is 'getKeyboardStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyboardState@, defined at @SDL3\/SDL_keyboard.h 159:42@
+getKeyboardState
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@numkeys@]: if non-NULL, receives the length of the returned array.
+  -> IO (PtrConst.PtrConst BG.CBool)
+getKeyboardState = Unsafe.sDL_GetKeyboardState
+
+-- | Get a snapshot of the current state of the keyboard.
+--
+--     The pointer returned is a pointer to an internal SDL array. It will be valid for the whole lifetime of the application and should not be freed by the caller.
+--
+--     A array element with a value of true means that the key is pressed and a value of false means that it is not. Indexes into this array are obtained by using SDL_Scancode values.
+--
+--     Use 'SDL3.Sys.Events.pumpEvents' to update the state array.
+--
+--     This function gives you the current state after all events have been processed, so if a key or button has been pressed and released before you process events, then the pressed state will never show up in the @'getKeyboardState'@ calls.
+--
+--     Note: This function doesn\'t take into account whether shift has been pressed or not.
+--
+--     [Returns]: a pointer to an array of key states.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Events.pumpEvents', 'resetKeyboard'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetKeyboardState@.
+--                   The unsafe flavor is 'getKeyboardState'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyboardState@, defined at @SDL3\/SDL_keyboard.h 159:42@
+getKeyboardStateSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@numkeys@]: if non-NULL, receives the length of the returned array.
+  -> IO (PtrConst.PtrConst BG.CBool)
+getKeyboardStateSafe = Safe.sDL_GetKeyboardState
+
+-- | Clear the state of the keyboard.
+--
+--     This function will generate key up events for all pressed keys.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyboardState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ResetKeyboard@.
+--                   The safe flavor is 'resetKeyboardSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ResetKeyboard@, defined at @SDL3\/SDL_keyboard.h 172:34@
+resetKeyboard :: IO ()
+resetKeyboard = Unsafe.sDL_ResetKeyboard
+
+-- | Clear the state of the keyboard.
+--
+--     This function will generate key up events for all pressed keys.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyboardState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ResetKeyboard@.
+--                   The unsafe flavor is 'resetKeyboard'
+--                   .
+--
+--     [C declaration]: @SDL_ResetKeyboard@, defined at @SDL3\/SDL_keyboard.h 172:34@
+resetKeyboardSafe :: IO ()
+resetKeyboardSafe = Safe.sDL_ResetKeyboard
+
+-- | Get the current key modifier state for the keyboard.
+--
+--     [Returns]: an OR\'d combination of the modifier keys for the keyboard.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyboardState', 'setModState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetModState@.
+--                   The safe flavor is 'getModStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetModState@, defined at @SDL3\/SDL_keyboard.h 186:40@
+getModState :: IO SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+getModState = Unsafe.sDL_GetModState
+
+-- | Get the current key modifier state for the keyboard.
+--
+--     [Returns]: an OR\'d combination of the modifier keys for the keyboard.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyboardState', 'setModState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetModState@.
+--                   The unsafe flavor is 'getModState'
+--                   .
+--
+--     [C declaration]: @SDL_GetModState@, defined at @SDL3\/SDL_keyboard.h 186:40@
+getModStateSafe :: IO SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+getModStateSafe = Safe.sDL_GetModState
+
+-- | Set the current key modifier state for the keyboard.
+--
+--     The inverse of @'getModState'@, @'setModState'@ allows you to impose modifier key states on your application. Simply pass your desired modifier states into @modstate@. This value may be a bitwise, OR\'d combination of SDL_Keymod values.
+--
+--     This does not change the keyboard state, only the key modifier flags that SDL reports.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getModState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetModState@.
+--                   The safe flavor is 'setModStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetModState@, defined at @SDL3\/SDL_keyboard.h 207:34@
+setModState
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: the desired SDL_Keymod for the keyboard.
+  -> IO ()
+setModState = Unsafe.sDL_SetModState
+
+-- | Set the current key modifier state for the keyboard.
+--
+--     The inverse of @'getModState'@, @'setModState'@ allows you to impose modifier key states on your application. Simply pass your desired modifier states into @modstate@. This value may be a bitwise, OR\'d combination of SDL_Keymod values.
+--
+--     This does not change the keyboard state, only the key modifier flags that SDL reports.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getModState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetModState@.
+--                   The unsafe flavor is 'setModState'
+--                   .
+--
+--     [C declaration]: @SDL_SetModState@, defined at @SDL3\/SDL_keyboard.h 207:34@
+setModStateSafe
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: the desired SDL_Keymod for the keyboard.
+  -> IO ()
+setModStateSafe = Safe.sDL_SetModState
+
+-- | Get the key code corresponding to the given scancode according to the current keyboard layout.
+--
+--     If you want to get the keycode as it would be delivered in key events, including options specified in SDL_HINT_KEYCODE_OPTIONS, then you should pass @key_event@ as true. Otherwise this function simply translates the scancode based on the given modifier state.
+--
+--     [Returns]: the SDL_Keycode that corresponds to the given SDL_Scancode.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyName', 'getScancodeFromKey'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetKeyFromScancode@.
+--                   The safe flavor is 'getKeyFromScancodeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetKeyFromScancode@, defined at @SDL3\/SDL_keyboard.h 231:41@
+getKeyFromScancode
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode to query.
+  -> SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: the modifier state to use when translating the scancode to a keycode.
+  -> Bool
+  -- ^
+  --
+  --           [@key_event@]: true if the keycode will be used in key events.
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+getKeyFromScancode =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_GetKeyFromScancode x00 x11 (CBool.fromBool x22)
+
+-- | Get the key code corresponding to the given scancode according to the current keyboard layout.
+--
+--     If you want to get the keycode as it would be delivered in key events, including options specified in SDL_HINT_KEYCODE_OPTIONS, then you should pass @key_event@ as true. Otherwise this function simply translates the scancode based on the given modifier state.
+--
+--     [Returns]: the SDL_Keycode that corresponds to the given SDL_Scancode.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyName', 'getScancodeFromKey'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetKeyFromScancode@.
+--                   The unsafe flavor is 'getKeyFromScancode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetKeyFromScancode@, defined at @SDL3\/SDL_keyboard.h 231:41@
+getKeyFromScancodeSafe
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode to query.
+  -> SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: the modifier state to use when translating the scancode to a keycode.
+  -> Bool
+  -- ^
+  --
+  --           [@key_event@]: true if the keycode will be used in key events.
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+getKeyFromScancodeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_GetKeyFromScancode x00 x11 (CBool.fromBool x22)
+
+-- | Get the scancode corresponding to the given key code according to the current keyboard layout.
+--
+--     Note that there may be multiple scancode+modifier states that can generate this keycode, this will just return the first one found.
+--
+--     [Returns]: the SDL_Scancode that corresponds to the given SDL_Keycode.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyFromScancode', 'getScancodeName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetScancodeFromKey@.
+--                   The safe flavor is 'getScancodeFromKeySafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetScancodeFromKey@, defined at @SDL3\/SDL_keyboard.h 252:42@
+getScancodeFromKey
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -- ^
+  --
+  --           [@key@]: the desired SDL_Keycode to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: a pointer to the modifier state that would be used when the scancode generates this key, may be NULL.
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+getScancodeFromKey = Unsafe.sDL_GetScancodeFromKey
+
+-- | Get the scancode corresponding to the given key code according to the current keyboard layout.
+--
+--     Note that there may be multiple scancode+modifier states that can generate this keycode, this will just return the first one found.
+--
+--     [Returns]: the SDL_Scancode that corresponds to the given SDL_Keycode.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyFromScancode', 'getScancodeName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetScancodeFromKey@.
+--                   The unsafe flavor is 'getScancodeFromKey'
+--                   .
+--
+--     [C declaration]: @SDL_GetScancodeFromKey@, defined at @SDL3\/SDL_keyboard.h 252:42@
+getScancodeFromKeySafe
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -- ^
+  --
+  --           [@key@]: the desired SDL_Keycode to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Keycode.SDL_Keymod
+  -- ^
+  --
+  --           [@modstate@]: a pointer to the modifier state that would be used when the scancode generates this key, may be NULL.
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+getScancodeFromKeySafe = Safe.sDL_GetScancodeFromKey
+
+-- | Set a human-readable name for a scancode.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getScancodeName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetScancodeName@.
+--                   The safe flavor is 'setScancodeNameSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetScancodeName@, defined at @SDL3\/SDL_keyboard.h 270:34@
+setScancodeName
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name to use for the scancode, encoded as UTF-8. The string is not copied, so the pointer given to this function must stay valid while SDL is being used.
+  -> IO Bool
+setScancodeName =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetScancodeName x00 x11)
+
+-- | Set a human-readable name for a scancode.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getScancodeName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetScancodeName@.
+--                   The unsafe flavor is 'setScancodeName'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetScancodeName@, defined at @SDL3\/SDL_keyboard.h 270:34@
+setScancodeNameSafe
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name to use for the scancode, encoded as UTF-8. The string is not copied, so the pointer given to this function must stay valid while SDL is being used.
+  -> IO Bool
+setScancodeNameSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetScancodeName x00 x11)
+
+-- | Get a human-readable name for a scancode.
+--
+--     __Warning__: The returned name is by design not stable across platforms, e.g. the name for @SDL_SCANCODE_LGUI@ is \"Left GUI\" under Linux but \"Left Windows\" under Microsoft Windows, and some scancodes like @SDL_SCANCODE_NONUSBACKSLASH@ don\'t have any name at all. There are even scancodes that share names, e.g. @SDL_SCANCODE_RETURN@ and @SDL_SCANCODE_RETURN2@ (both called \"Return\"). This function is therefore unsuitable for creating a stable cross-platform two-way mapping between strings and scancodes.
+--
+--     [Returns]: a pointer to the name for the scancode. If the scancode doesn\'t have a name this function returns an empty string (\"\").
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getScancodeFromKey', 'getScancodeFromName', 'setScancodeName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetScancodeName@.
+--                   The safe flavor is 'getScancodeNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetScancodeName@, defined at @SDL3\/SDL_keyboard.h 296:42@
+getScancodeName
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getScancodeName = Unsafe.sDL_GetScancodeName
+
+-- | Get a human-readable name for a scancode.
+--
+--     __Warning__: The returned name is by design not stable across platforms, e.g. the name for @SDL_SCANCODE_LGUI@ is \"Left GUI\" under Linux but \"Left Windows\" under Microsoft Windows, and some scancodes like @SDL_SCANCODE_NONUSBACKSLASH@ don\'t have any name at all. There are even scancodes that share names, e.g. @SDL_SCANCODE_RETURN@ and @SDL_SCANCODE_RETURN2@ (both called \"Return\"). This function is therefore unsuitable for creating a stable cross-platform two-way mapping between strings and scancodes.
+--
+--     [Returns]: a pointer to the name for the scancode. If the scancode doesn\'t have a name this function returns an empty string (\"\").
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getScancodeFromKey', 'getScancodeFromName', 'setScancodeName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetScancodeName@.
+--                   The unsafe flavor is 'getScancodeName'
+--                   .
+--
+--     [C declaration]: @SDL_GetScancodeName@, defined at @SDL3\/SDL_keyboard.h 296:42@
+getScancodeNameSafe
+  :: SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+  -- ^
+  --
+  --           [@scancode@]: the desired SDL_Scancode to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getScancodeNameSafe = Safe.sDL_GetScancodeName
+
+-- | Get a scancode from a human-readable name.
+--
+--     [Returns]: the SDL_Scancode, or @SDL_SCANCODE_UNKNOWN@ if the name wasn\'t recognized; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyFromName', 'getScancodeFromKey', 'getScancodeName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetScancodeFromName@.
+--                   The safe flavor is 'getScancodeFromNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetScancodeFromName@, defined at @SDL3\/SDL_keyboard.h 313:42@
+getScancodeFromName
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the human-readable scancode name.
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+getScancodeFromName = Unsafe.sDL_GetScancodeFromName
+
+-- | Get a scancode from a human-readable name.
+--
+--     [Returns]: the SDL_Scancode, or @SDL_SCANCODE_UNKNOWN@ if the name wasn\'t recognized; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyFromName', 'getScancodeFromKey', 'getScancodeName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetScancodeFromName@.
+--                   The unsafe flavor is 'getScancodeFromName'
+--                   .
+--
+--     [C declaration]: @SDL_GetScancodeFromName@, defined at @SDL3\/SDL_keyboard.h 313:42@
+getScancodeFromNameSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the human-readable scancode name.
+  -> IO SDL3.Sys.Bindgen.Scancode.SDL_Scancode
+getScancodeFromNameSafe =
+  Safe.sDL_GetScancodeFromName
+
+-- | Get a human-readable name for a key.
+--
+--     If the key doesn\'t have a name, this function returns an empty string (\"\").
+--
+--     Letters will be presented in their uppercase form, if applicable.
+--
+--     [Returns]: a UTF-8 encoded string of the key name.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyFromName', 'getKeyFromScancode', 'getScancodeFromKey'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetKeyName@.
+--                   The safe flavor is 'getKeyNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyName@, defined at @SDL3\/SDL_keyboard.h 333:42@
+getKeyName
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -- ^
+  --
+  --           [@key@]: the desired SDL_Keycode to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getKeyName = Unsafe.sDL_GetKeyName
+
+-- | Get a human-readable name for a key.
+--
+--     If the key doesn\'t have a name, this function returns an empty string (\"\").
+--
+--     Letters will be presented in their uppercase form, if applicable.
+--
+--     [Returns]: a UTF-8 encoded string of the key name.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyFromName', 'getKeyFromScancode', 'getScancodeFromKey'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetKeyName@.
+--                   The unsafe flavor is 'getKeyName'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyName@, defined at @SDL3\/SDL_keyboard.h 333:42@
+getKeyNameSafe
+  :: SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+  -- ^
+  --
+  --           [@key@]: the desired SDL_Keycode to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getKeyNameSafe = Safe.sDL_GetKeyName
+
+-- | Get a key code from a human-readable name.
+--
+--     [Returns]: key code, or @SDLK_UNKNOWN@ if the name wasn\'t recognized; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyFromScancode', 'getKeyName', 'getScancodeFromName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetKeyFromName@.
+--                   The safe flavor is 'getKeyFromNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyFromName@, defined at @SDL3\/SDL_keyboard.h 350:41@
+getKeyFromName
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the human-readable key name.
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+getKeyFromName = Unsafe.sDL_GetKeyFromName
+
+-- | Get a key code from a human-readable name.
+--
+--     [Returns]: key code, or @SDLK_UNKNOWN@ if the name wasn\'t recognized; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getKeyFromScancode', 'getKeyName', 'getScancodeFromName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetKeyFromName@.
+--                   The unsafe flavor is 'getKeyFromName'
+--                   .
+--
+--     [C declaration]: @SDL_GetKeyFromName@, defined at @SDL3\/SDL_keyboard.h 350:41@
+getKeyFromNameSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the human-readable key name.
+  -> IO SDL3.Sys.Bindgen.Keycode.SDL_Keycode
+getKeyFromNameSafe = Safe.sDL_GetKeyFromName
+
+-- | Start accepting Unicode text input events in a window.
+--
+--     This function will enable text input (SDL_EVENT_TEXT_INPUT and SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this function paired with @'stopTextInput'@.
+--
+--     Text input events are not received by default.
+--
+--     On some platforms using this function shows the screen keyboard and\/or activates an IME, which can prevent some key press events from being passed through.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTextInputArea', 'startTextInputWithProperties', 'stopTextInput', 'textInputActive'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StartTextInput@.
+--                   The safe flavor is 'startTextInputSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StartTextInput@, defined at @SDL3\/SDL_keyboard.h 378:34@
+startTextInput
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to enable text input.
+  -> IO Bool
+startTextInput =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_StartTextInput x00)
+
+-- | Start accepting Unicode text input events in a window.
+--
+--     This function will enable text input (SDL_EVENT_TEXT_INPUT and SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this function paired with @'stopTextInput'@.
+--
+--     Text input events are not received by default.
+--
+--     On some platforms using this function shows the screen keyboard and\/or activates an IME, which can prevent some key press events from being passed through.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTextInputArea', 'startTextInputWithProperties', 'stopTextInput', 'textInputActive'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_StartTextInput@.
+--                   The unsafe flavor is 'startTextInput'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StartTextInput@, defined at @SDL3\/SDL_keyboard.h 378:34@
+startTextInputSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to enable text input.
+  -> IO Bool
+startTextInputSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_StartTextInput x00)
+
+-- | Start accepting Unicode text input events in a window, with properties describing the input.
+--
+--     This function will enable text input (SDL_EVENT_TEXT_INPUT and SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this function paired with @'stopTextInput'@.
+--
+--     Text input events are not received by default.
+--
+--     On some platforms using this function shows the screen keyboard and\/or activates an IME, which can prevent some key press events from being passed through.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_TEXTINPUT_TYPE_NUMBER'@ - an 'SDL_TextInputType' value that describes text being input, defaults to SDL_TEXTINPUT_TYPE_TEXT.
+--
+--     * @'sDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER'@ - an 'SDL_Capitalization' value that describes how text should be capitalized, defaults to SDL_CAPITALIZE_SENTENCES for normal text entry, SDL_CAPITALIZE_WORDS for SDL_TEXTINPUT_TYPE_TEXT_NAME, and SDL_CAPITALIZE_NONE for e-mail addresses, usernames, and passwords.
+--
+--     * @'sDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN'@ - true to enable auto completion and auto correction, defaults to true.
+--
+--     * @'sDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN'@ - true if multiple lines of text are allowed. This defaults to true if SDL_HINT_RETURN_KEY_HIDES_IME is \"0\" or is not set, and defaults to false if SDL_HINT_RETURN_KEY_HIDES_IME is \"1\".
+--
+--     On Android you can directly specify the input type:
+--
+--     * @'sDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER'@ - the text input type to use, overriding other properties. This is documented at [https:\/\/developer.android.com\/reference\/android\/text\/InputType](https://developer.android.com/reference/android/text/InputType)
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTextInputArea', 'startTextInput', 'stopTextInput', 'textInputActive'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StartTextInputWithProperties@.
+--                   The safe flavor is 'startTextInputWithPropertiesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StartTextInputWithProperties@, defined at @SDL3\/SDL_keyboard.h 473:34@
+startTextInputWithProperties
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to enable text input.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO Bool
+startTextInputWithProperties =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_StartTextInputWithProperties x00 x11)
+
+-- | Start accepting Unicode text input events in a window, with properties describing the input.
+--
+--     This function will enable text input (SDL_EVENT_TEXT_INPUT and SDL_EVENT_TEXT_EDITING events) in the specified window. Please use this function paired with @'stopTextInput'@.
+--
+--     Text input events are not received by default.
+--
+--     On some platforms using this function shows the screen keyboard and\/or activates an IME, which can prevent some key press events from being passed through.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_TEXTINPUT_TYPE_NUMBER'@ - an 'SDL_TextInputType' value that describes text being input, defaults to SDL_TEXTINPUT_TYPE_TEXT.
+--
+--     * @'sDL_PROP_TEXTINPUT_CAPITALIZATION_NUMBER'@ - an 'SDL_Capitalization' value that describes how text should be capitalized, defaults to SDL_CAPITALIZE_SENTENCES for normal text entry, SDL_CAPITALIZE_WORDS for SDL_TEXTINPUT_TYPE_TEXT_NAME, and SDL_CAPITALIZE_NONE for e-mail addresses, usernames, and passwords.
+--
+--     * @'sDL_PROP_TEXTINPUT_AUTOCORRECT_BOOLEAN'@ - true to enable auto completion and auto correction, defaults to true.
+--
+--     * @'sDL_PROP_TEXTINPUT_MULTILINE_BOOLEAN'@ - true if multiple lines of text are allowed. This defaults to true if SDL_HINT_RETURN_KEY_HIDES_IME is \"0\" or is not set, and defaults to false if SDL_HINT_RETURN_KEY_HIDES_IME is \"1\".
+--
+--     On Android you can directly specify the input type:
+--
+--     * @'sDL_PROP_TEXTINPUT_ANDROID_INPUTTYPE_NUMBER'@ - the text input type to use, overriding other properties. This is documented at [https:\/\/developer.android.com\/reference\/android\/text\/InputType](https://developer.android.com/reference/android/text/InputType)
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTextInputArea', 'startTextInput', 'stopTextInput', 'textInputActive'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_StartTextInputWithProperties@.
+--                   The unsafe flavor is 'startTextInputWithProperties'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StartTextInputWithProperties@, defined at @SDL3\/SDL_keyboard.h 473:34@
+startTextInputWithPropertiesSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to enable text input.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO Bool
+startTextInputWithPropertiesSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_StartTextInputWithProperties x00 x11)
+
+-- | Check whether or not Unicode text input events are enabled for a window.
+--
+--     [Returns]: true if text input events are enabled else false.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'startTextInput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_TextInputActive@.
+--                   The safe flavor is 'textInputActiveSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TextInputActive@, defined at @SDL3\/SDL_keyboard.h 493:34@
+textInputActive
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to check.
+  -> IO Bool
+textInputActive =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_TextInputActive x00)
+
+-- | Check whether or not Unicode text input events are enabled for a window.
+--
+--     [Returns]: true if text input events are enabled else false.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'startTextInput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_TextInputActive@.
+--                   The unsafe flavor is 'textInputActive'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TextInputActive@, defined at @SDL3\/SDL_keyboard.h 493:34@
+textInputActiveSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to check.
+  -> IO Bool
+textInputActiveSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_TextInputActive x00)
+
+-- | Stop receiving any text input events in a window.
+--
+--     If @'startTextInput'@ showed the screen keyboard, this function will hide it.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'startTextInput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StopTextInput@.
+--                   The safe flavor is 'stopTextInputSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StopTextInput@, defined at @SDL3\/SDL_keyboard.h 511:34@
+stopTextInput
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to disable text input.
+  -> IO Bool
+stopTextInput =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_StopTextInput x00)
+
+-- | Stop receiving any text input events in a window.
+--
+--     If @'startTextInput'@ showed the screen keyboard, this function will hide it.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'startTextInput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_StopTextInput@.
+--                   The unsafe flavor is 'stopTextInput'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StopTextInput@, defined at @SDL3\/SDL_keyboard.h 511:34@
+stopTextInputSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to disable text input.
+  -> IO Bool
+stopTextInputSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_StopTextInput x00)
+
+-- | Dismiss the composition window\/IME without disabling the subsystem.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'startTextInput', 'stopTextInput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ClearComposition@.
+--                   The safe flavor is 'clearCompositionSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearComposition@, defined at @SDL3\/SDL_keyboard.h 527:34@
+clearComposition
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to affect.
+  -> IO Bool
+clearComposition =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_ClearComposition x00)
+
+-- | Dismiss the composition window\/IME without disabling the subsystem.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'startTextInput', 'stopTextInput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ClearComposition@.
+--                   The unsafe flavor is 'clearComposition'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearComposition@, defined at @SDL3\/SDL_keyboard.h 527:34@
+clearCompositionSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to affect.
+  -> IO Bool
+clearCompositionSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_ClearComposition x00)
+
+-- | Set the area used to type Unicode text input.
+--
+--     Native input methods may place a window with word suggestions near the cursor, without covering the text being entered.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextInputArea', 'startTextInput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTextInputArea@.
+--                   The safe flavor is 'setTextInputAreaSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextInputArea@, defined at @SDL3\/SDL_keyboard.h 550:34@
+setTextInputArea
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to set the text input area.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect representing the text input area, in window coordinates, or NULL to clear it.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@cursor@]: the offset of the current cursor location relative to @rect->x@, in window coordinates.
+  -> IO Bool
+setTextInputArea =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetTextInputArea x00 x11 (Coerce.coerce x22))
+
+-- | Set the area used to type Unicode text input.
+--
+--     Native input methods may place a window with word suggestions near the cursor, without covering the text being entered.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextInputArea', 'startTextInput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTextInputArea@.
+--                   The unsafe flavor is 'setTextInputArea'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextInputArea@, defined at @SDL3\/SDL_keyboard.h 550:34@
+setTextInputAreaSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to set the text input area.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect representing the text input area, in window coordinates, or NULL to clear it.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@cursor@]: the offset of the current cursor location relative to @rect->x@, in window coordinates.
+  -> IO Bool
+setTextInputAreaSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetTextInputArea x00 x11 (Coerce.coerce x22))
+
+-- | Get the area used to type Unicode text input.
+--
+--     This returns the values previously set by @'setTextInputArea'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTextInputArea'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTextInputArea@.
+--                   The safe flavor is 'getTextInputAreaSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextInputArea@, defined at @SDL3\/SDL_keyboard.h 571:34@
+getTextInputArea
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to query the text input area.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to an SDL_Rect filled in with the text input area, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@cursor@]: a pointer to the offset of the current cursor location relative to @rect->x@, may be NULL.
+  -> IO Bool
+getTextInputArea =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetTextInputArea x00 x11 x22)
+
+-- | Get the area used to type Unicode text input.
+--
+--     This returns the values previously set by @'setTextInputArea'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTextInputArea'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTextInputArea@.
+--                   The unsafe flavor is 'getTextInputArea'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextInputArea@, defined at @SDL3\/SDL_keyboard.h 571:34@
+getTextInputAreaSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to query the text input area.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to an SDL_Rect filled in with the text input area, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@cursor@]: a pointer to the offset of the current cursor location relative to @rect->x@, may be NULL.
+  -> IO Bool
+getTextInputAreaSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetTextInputArea x00 x11 x22)
+
+-- | Check whether the platform has screen keyboard support.
+--
+--     [Returns]: true if the platform has some screen keyboard support or false if not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'startTextInput', 'screenKeyboardShown'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasScreenKeyboardSupport@.
+--                   The safe flavor is 'hasScreenKeyboardSupportSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasScreenKeyboardSupport@, defined at @SDL3\/SDL_keyboard.h 586:34@
+hasScreenKeyboardSupport :: IO Bool
+hasScreenKeyboardSupport =
+  fmap CBool.toBool Unsafe.sDL_HasScreenKeyboardSupport
+
+-- | Check whether the platform has screen keyboard support.
+--
+--     [Returns]: true if the platform has some screen keyboard support or false if not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'startTextInput', 'screenKeyboardShown'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasScreenKeyboardSupport@.
+--                   The unsafe flavor is 'hasScreenKeyboardSupport'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasScreenKeyboardSupport@, defined at @SDL3\/SDL_keyboard.h 586:34@
+hasScreenKeyboardSupportSafe :: IO Bool
+hasScreenKeyboardSupportSafe =
+  fmap CBool.toBool Safe.sDL_HasScreenKeyboardSupport
+
+-- | Check whether the screen keyboard is shown for given window.
+--
+--     [Returns]: true if screen keyboard is shown or false if not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasScreenKeyboardSupport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ScreenKeyboardShown@.
+--                   The safe flavor is 'screenKeyboardShownSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ScreenKeyboardShown@, defined at @SDL3\/SDL_keyboard.h 600:34@
+screenKeyboardShown
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which screen keyboard should be queried.
+  -> IO Bool
+screenKeyboardShown =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_ScreenKeyboardShown x00)
+
+-- | Check whether the screen keyboard is shown for given window.
+--
+--     [Returns]: true if screen keyboard is shown or false if not.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasScreenKeyboardSupport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ScreenKeyboardShown@.
+--                   The unsafe flavor is 'screenKeyboardShown'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ScreenKeyboardShown@, defined at @SDL3\/SDL_keyboard.h 600:34@
+screenKeyboardShownSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which screen keyboard should be queried.
+  -> IO Bool
+screenKeyboardShownSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_ScreenKeyboardShown x00)
diff --git a/src/SDL3/Sys/Keycode.hs b/src/SDL3/Sys/Keycode.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Keycode.hs
@@ -0,0 +1,123 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | Defines constants which identify keyboard keys and modifiers.
+--
+--     Please refer to the Best Keyboard Practices document for details on what this information means and how best to use it.
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/BestKeyboardPractices](https://wiki.libsdl.org/SDL3/BestKeyboardPractices) The SDL virtual key representation.
+--
+--     Values of this type are used to represent keyboard keys using the current layout of the keyboard. These values include Unicode values representing the unmodified character that would be generated by pressing the key, or an @SDLK_*@ constant for those keys that do not generate characters.
+--
+--     A special exception is the number keys at the top of the keyboard which map by default to SDLK_0...SDLK_9 on AZERTY layouts.
+--
+--     Keys with the @'sDLK_EXTENDED_MASK'@ bit set do not map to a scancode or Unicode code point.
+--
+--     Many common keycodes are listed below, but this list is not exhaustive.
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_HINT_KEYCODE_OPTIONS
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Keycode.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Keycode (
+  module SDL3.Sys.Bindgen.Keycode,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Keycode.SDL_KMOD_NONE,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_LSHIFT,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_RSHIFT,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_LEVEL5,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_LCTRL,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_RCTRL,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_LALT,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_RALT,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_LGUI,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_RGUI,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_NUM,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_CAPS,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_MODE,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_SCROLL,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_CTRL,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_SHIFT,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_ALT,
+  pattern SDL3.Sys.Keycode.SDL_KMOD_GUI,
+)
+where
+
+import SDL3.Sys.Bindgen.Keycode
+
+-- | Typed constant for macro @SDL_KMOD_NONE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_NONE :: SDL_Keymod
+pattern SDL_KMOD_NONE = SDL_Keymod 0x0000
+
+-- | Typed constant for macro @SDL_KMOD_LSHIFT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_LSHIFT :: SDL_Keymod
+pattern SDL_KMOD_LSHIFT = SDL_Keymod 0x0001
+
+-- | Typed constant for macro @SDL_KMOD_RSHIFT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_RSHIFT :: SDL_Keymod
+pattern SDL_KMOD_RSHIFT = SDL_Keymod 0x0002
+
+-- | Typed constant for macro @SDL_KMOD_LEVEL5@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_LEVEL5 :: SDL_Keymod
+pattern SDL_KMOD_LEVEL5 = SDL_Keymod 0x0004
+
+-- | Typed constant for macro @SDL_KMOD_LCTRL@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_LCTRL :: SDL_Keymod
+pattern SDL_KMOD_LCTRL = SDL_Keymod 0x0040
+
+-- | Typed constant for macro @SDL_KMOD_RCTRL@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_RCTRL :: SDL_Keymod
+pattern SDL_KMOD_RCTRL = SDL_Keymod 0x0080
+
+-- | Typed constant for macro @SDL_KMOD_LALT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_LALT :: SDL_Keymod
+pattern SDL_KMOD_LALT = SDL_Keymod 0x0100
+
+-- | Typed constant for macro @SDL_KMOD_RALT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_RALT :: SDL_Keymod
+pattern SDL_KMOD_RALT = SDL_Keymod 0x0200
+
+-- | Typed constant for macro @SDL_KMOD_LGUI@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_LGUI :: SDL_Keymod
+pattern SDL_KMOD_LGUI = SDL_Keymod 0x0400
+
+-- | Typed constant for macro @SDL_KMOD_RGUI@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_RGUI :: SDL_Keymod
+pattern SDL_KMOD_RGUI = SDL_Keymod 0x0800
+
+-- | Typed constant for macro @SDL_KMOD_NUM@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_NUM :: SDL_Keymod
+pattern SDL_KMOD_NUM = SDL_Keymod 0x1000
+
+-- | Typed constant for macro @SDL_KMOD_CAPS@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_CAPS :: SDL_Keymod
+pattern SDL_KMOD_CAPS = SDL_Keymod 0x2000
+
+-- | Typed constant for macro @SDL_KMOD_MODE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_MODE :: SDL_Keymod
+pattern SDL_KMOD_MODE = SDL_Keymod 0x4000
+
+-- | Typed constant for macro @SDL_KMOD_SCROLL@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_SCROLL :: SDL_Keymod
+pattern SDL_KMOD_SCROLL = SDL_Keymod 0x8000
+
+-- | Typed constant for macro @SDL_KMOD_CTRL@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_CTRL :: SDL_Keymod
+pattern SDL_KMOD_CTRL = SDL_Keymod 0x00c0
+
+-- | Typed constant for macro @SDL_KMOD_SHIFT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_SHIFT :: SDL_Keymod
+pattern SDL_KMOD_SHIFT = SDL_Keymod 0x0003
+
+-- | Typed constant for macro @SDL_KMOD_ALT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_ALT :: SDL_Keymod
+pattern SDL_KMOD_ALT = SDL_Keymod 0x0300
+
+-- | Typed constant for macro @SDL_KMOD_GUI@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_KMOD_GUI :: SDL_Keymod
+pattern SDL_KMOD_GUI = SDL_Keymod 0x0c00
diff --git a/src/SDL3/Sys/Loadso.hs b/src/SDL3/Sys/Loadso.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Loadso.hs
@@ -0,0 +1,218 @@
+-- | System-dependent library loading routines.
+--
+--     Shared objects are code that is programmatically loadable at runtime. Windows calls these \"DLLs\", Linux calls them \"shared libraries\", etc.
+--
+--     To use them, build such a library, then call @'loadObject'@ on it. Once loaded, you can use @'loadFunction'@ on that object to find the address of its exported symbols. When done with the object, call @'unloadObject'@ to dispose of it.
+--
+--     Some things to keep in mind:
+--
+--     * These functions only work on C function names. Other languages may have name mangling and intrinsic language support that varies from compiler to compiler.
+--
+--     * Make sure you declare your function pointers with the same calling convention as the actual library function. Your code will crash mysteriously if you do not do this.
+--
+--     * Avoid namespace collisions. If you load a symbol from the library, it is not defined whether or not it goes into the global symbol namespace for the application. If it does and it conflicts with symbols in your code or other shared libraries, you will not get the results you expect. :)
+--
+--     * Once a library is unloaded, all pointers into it obtained through @'loadFunction'@ become invalid, even if the library is later reloaded. Don\'t unload a library if you plan to use these pointers in the future. Notably: beware of giving one of these pointers to atexit(), since it may call that pointer after the library unloads. An opaque datatype that represents a loaded shared object.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadObject', 'loadFunction', 'unloadObject'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Loadso.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Loadso (
+  module SDL3.Sys.Bindgen.Loadso,
+
+  -- * Function aliases
+  SDL3.Sys.Loadso.loadObject,
+  SDL3.Sys.Loadso.loadObjectSafe,
+  SDL3.Sys.Loadso.loadFunction,
+  SDL3.Sys.Loadso.loadFunctionSafe,
+  SDL3.Sys.Loadso.unloadObject,
+  SDL3.Sys.Loadso.unloadObjectSafe,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Loadso
+import SDL3.Sys.Bindgen.Loadso.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Loadso.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Dynamically load a shared object.
+--
+--     [Returns]: an opaque pointer to the object handle or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadFunction', 'unloadObject'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadObject@.
+--                   The safe flavor is 'loadObjectSafe'
+--                   .
+--
+--     [C declaration]: @SDL_LoadObject@, defined at @SDL3\/SDL_loadso.h 93:48@
+loadObject
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@sofile@]: a system-dependent name of the object file.
+  -> IO (BG.Ptr SDL_SharedObject)
+loadObject = Unsafe.sDL_LoadObject
+
+-- | Dynamically load a shared object.
+--
+--     [Returns]: an opaque pointer to the object handle or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadFunction', 'unloadObject'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadObject@.
+--                   The unsafe flavor is 'loadObject'
+--                   .
+--
+--     [C declaration]: @SDL_LoadObject@, defined at @SDL3\/SDL_loadso.h 93:48@
+loadObjectSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@sofile@]: a system-dependent name of the object file.
+  -> IO (BG.Ptr SDL_SharedObject)
+loadObjectSafe = Safe.sDL_LoadObject
+
+-- | Look up the address of the named function in a shared object.
+--
+--     This function pointer is no longer valid after calling @'unloadObject'@.
+--
+--     This function can only look up C function names. Other languages may have name mangling and intrinsic language support that varies from compiler to compiler.
+--
+--     Make sure you declare your function pointers with the same calling convention as the actual library function. Your code will crash mysteriously if you do not do this.
+--
+--     If the requested function doesn\'t exist, NULL is returned.
+--
+--     [Returns]: a pointer to the function or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadObject'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadFunction@.
+--                   The safe flavor is 'loadFunctionSafe'
+--                   .
+--
+--     [C declaration]: @SDL_LoadFunction@, defined at @SDL3\/SDL_loadso.h 121:49@
+loadFunction
+  :: BG.Ptr SDL_SharedObject
+  -- ^
+  --
+  --           [@handle@]: a valid shared object handle returned by @'loadObject'@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the function to look up.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+loadFunction = Unsafe.sDL_LoadFunction
+
+-- | Look up the address of the named function in a shared object.
+--
+--     This function pointer is no longer valid after calling @'unloadObject'@.
+--
+--     This function can only look up C function names. Other languages may have name mangling and intrinsic language support that varies from compiler to compiler.
+--
+--     Make sure you declare your function pointers with the same calling convention as the actual library function. Your code will crash mysteriously if you do not do this.
+--
+--     If the requested function doesn\'t exist, NULL is returned.
+--
+--     [Returns]: a pointer to the function or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadObject'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadFunction@.
+--                   The unsafe flavor is 'loadFunction'
+--                   .
+--
+--     [C declaration]: @SDL_LoadFunction@, defined at @SDL3\/SDL_loadso.h 121:49@
+loadFunctionSafe
+  :: BG.Ptr SDL_SharedObject
+  -- ^
+  --
+  --           [@handle@]: a valid shared object handle returned by @'loadObject'@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the function to look up.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+loadFunctionSafe = Safe.sDL_LoadFunction
+
+-- | Unload a shared object from memory.
+--
+--     Note that any pointers from this object looked up through @'loadFunction'@ will no longer be valid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadObject'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnloadObject@.
+--                   The safe flavor is 'unloadObjectSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UnloadObject@, defined at @SDL3\/SDL_loadso.h 137:34@
+unloadObject
+  :: BG.Ptr SDL_SharedObject
+  -- ^
+  --
+  --           [@handle@]: a valid shared object handle returned by @'loadObject'@.
+  -> IO ()
+unloadObject = Unsafe.sDL_UnloadObject
+
+-- | Unload a shared object from memory.
+--
+--     Note that any pointers from this object looked up through @'loadFunction'@ will no longer be valid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadObject'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnloadObject@.
+--                   The unsafe flavor is 'unloadObject'
+--                   .
+--
+--     [C declaration]: @SDL_UnloadObject@, defined at @SDL3\/SDL_loadso.h 137:34@
+unloadObjectSafe
+  :: BG.Ptr SDL_SharedObject
+  -- ^
+  --
+  --           [@handle@]: a valid shared object handle returned by @'loadObject'@.
+  -> IO ()
+unloadObjectSafe = Safe.sDL_UnloadObject
diff --git a/src/SDL3/Sys/Locale.hs b/src/SDL3/Sys/Locale.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Locale.hs
@@ -0,0 +1,95 @@
+-- | SDL locale services.
+--
+--     This provides a way to get a list of preferred locales (language plus country) for the user. There is exactly one function: @'getPreferredLocales'@, which handles all the heavy lifting, and offers documentation on all the strange ways humans might have configured their language settings. A struct to provide locale data.
+--
+--     Locale data is split into a spoken language, like English, and an optional country, like Canada. The language will be in ISO-639 format (so English would be \"en\"), and the country, if not NULL, will be an ISO-3166 country code (so Canada would be \"CA\").
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPreferredLocales'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Locale.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Locale (
+  module SDL3.Sys.Bindgen.Locale,
+
+  -- * Function aliases
+  SDL3.Sys.Locale.getPreferredLocales,
+  SDL3.Sys.Locale.getPreferredLocalesSafe,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Locale
+import SDL3.Sys.Bindgen.Locale.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Locale.Unsafe qualified as Unsafe
+
+-- | Report the user\'s preferred locale.
+--
+--     Returned language strings are in the format xx, where \'xx\' is an ISO-639 language specifier (such as \"en\" for English, \"de\" for German, etc). Country strings are in the format YY, where \"YY\" is an ISO-3166 country code (such as \"US\" for the United States, \"CA\" for Canada, etc). Country might be NULL if there\'s no specific guidance on them (so you might get { \"en\", \"US\" } for American English, but { \"en\", NULL } means \"English language, generically\"). Language strings are never NULL, except to terminate the array.
+--
+--     Please note that not all of these strings are 2 characters; some are three or more.
+--
+--     The returned list of locales are in the order of the user\'s preference. For example, a German citizen that is fluent in US English and knows enough Japanese to navigate around Tokyo might have a list like: { \"de\", \"en_US\", \"jp\", NULL }. Someone from England might prefer British English (where \"color\" is spelled \"colour\", etc), but will settle for anything like it: { \"en_GB\", \"en\", NULL }.
+--
+--     This function returns NULL on error, including when the platform does not supply this information at all.
+--
+--     This might be a \"slow\" call that has to query the operating system. It\'s best to ask for this once and save the results. However, this list can change, usually because the user has changed a system preference outside of your program; SDL will send an SDL_EVENT_LOCALE_CHANGED event in this case, if possible, and you can call this function again to get an updated copy of preferred locales.
+--
+--     [Returns]: a NULL terminated array of locale pointers, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPreferredLocales@.
+--                   The safe flavor is 'getPreferredLocalesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPreferredLocales@, defined at @SDL3\/SDL_locale.h 109:43@
+getPreferredLocales
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of locales returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Locale))
+getPreferredLocales = Unsafe.sDL_GetPreferredLocales
+
+-- | Report the user\'s preferred locale.
+--
+--     Returned language strings are in the format xx, where \'xx\' is an ISO-639 language specifier (such as \"en\" for English, \"de\" for German, etc). Country strings are in the format YY, where \"YY\" is an ISO-3166 country code (such as \"US\" for the United States, \"CA\" for Canada, etc). Country might be NULL if there\'s no specific guidance on them (so you might get { \"en\", \"US\" } for American English, but { \"en\", NULL } means \"English language, generically\"). Language strings are never NULL, except to terminate the array.
+--
+--     Please note that not all of these strings are 2 characters; some are three or more.
+--
+--     The returned list of locales are in the order of the user\'s preference. For example, a German citizen that is fluent in US English and knows enough Japanese to navigate around Tokyo might have a list like: { \"de\", \"en_US\", \"jp\", NULL }. Someone from England might prefer British English (where \"color\" is spelled \"colour\", etc), but will settle for anything like it: { \"en_GB\", \"en\", NULL }.
+--
+--     This function returns NULL on error, including when the platform does not supply this information at all.
+--
+--     This might be a \"slow\" call that has to query the operating system. It\'s best to ask for this once and save the results. However, this list can change, usually because the user has changed a system preference outside of your program; SDL will send an SDL_EVENT_LOCALE_CHANGED event in this case, if possible, and you can call this function again to get an updated copy of preferred locales.
+--
+--     [Returns]: a NULL terminated array of locale pointers, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPreferredLocales@.
+--                   The unsafe flavor is 'getPreferredLocales'
+--                   .
+--
+--     [C declaration]: @SDL_GetPreferredLocales@, defined at @SDL3\/SDL_locale.h 109:43@
+getPreferredLocalesSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of locales returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Locale))
+getPreferredLocalesSafe =
+  Safe.sDL_GetPreferredLocales
diff --git a/src/SDL3/Sys/Log.hs b/src/SDL3/Sys/Log.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Log.hs
@@ -0,0 +1,511 @@
+-- | Simple log messages with priorities and categories. A message\'s 'SDL_LogPriority' signifies how important the message is. A message\'s 'SDL_LogCategory' signifies from what domain it belongs to. Every category has a minimum priority specified: when a message belongs to that category, it will only be sent out if it has that minimum priority or higher.
+--
+--     SDL\'s own logs are sent below the default priority threshold, so they are quiet by default.
+--
+--     You can change the log verbosity programmatically using @'setLogPriority'@ or with SDL_SetHint(SDL_HINT_LOGGING, ...), or with the \"SDL_LOGGING\" environment variable. This variable is a comma separated set of category=level tokens that define the default logging levels for SDL applications.
+--
+--     The category can be a numeric category, one of \"app\", \"error\", \"assert\", \"system\", \"audio\", \"video\", \"render\", \"input\", \"test\", or @*@ for any unspecified category.
+--
+--     The level can be a numeric level, one of \"trace\", \"verbose\", \"debug\", \"info\", \"warn\", \"error\", \"critical\", or \"quiet\" to disable that category.
+--
+--     You can omit the category if you want to set the logging level for all categories.
+--
+--     If this hint isn\'t set, the default log levels are equivalent to:
+--
+--     @app=info,assert=warn,test=verbose,*=error@
+--
+--     Here\'s where the messages go on different platforms:
+--
+--     * Windows: debug output stream
+--
+--     * Android: log output
+--
+--     * Others: standard error output (stderr)
+--
+--     You don\'t need to have a newline (@\\n@) on the end of messages, the functions will do that for you. For consistent behavior cross-platform, you shouldn\'t have any newlines in messages, such as to log multiple lines in one call; unusual platform-specific behavior can be observed in such usage. Do one log call per line instead, with no newlines in messages.
+--
+--     Each log call is atomic, so you won\'t see log messages cut off one another when logging from multiple threads. The predefined log categories
+--
+--     By default the application and gpu categories are enabled at the INFO level, the assert category is enabled at the WARN level, test is enabled at the VERBOSE level and all other categories are enabled at the ERROR level.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Log.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Log (
+  module SDL3.Sys.Bindgen.Log,
+
+  -- * Function aliases
+  SDL3.Sys.Log.setLogPriorities,
+  SDL3.Sys.Log.setLogPrioritiesSafe,
+  SDL3.Sys.Log.setLogPriority,
+  SDL3.Sys.Log.setLogPrioritySafe,
+  SDL3.Sys.Log.getLogPriority,
+  SDL3.Sys.Log.getLogPrioritySafe,
+  SDL3.Sys.Log.resetLogPriorities,
+  SDL3.Sys.Log.resetLogPrioritiesSafe,
+  SDL3.Sys.Log.setLogPriorityPrefix,
+  SDL3.Sys.Log.setLogPriorityPrefixSafe,
+  SDL3.Sys.Log.getDefaultLogOutputFunction,
+  SDL3.Sys.Log.getDefaultLogOutputFunctionSafe,
+  SDL3.Sys.Log.getLogOutputFunction,
+  SDL3.Sys.Log.getLogOutputFunctionSafe,
+  SDL3.Sys.Log.setLogOutputFunction,
+  SDL3.Sys.Log.setLogOutputFunctionSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Log
+import SDL3.Sys.Bindgen.Log.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Log.Unsafe qualified as Unsafe
+
+-- | Set the priority of all log categories.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resetLogPriorities', 'setLogPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetLogPriorities@.
+--                   The safe flavor is 'setLogPrioritiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetLogPriorities@, defined at @SDL3\/SDL_log.h 156:34@
+setLogPriorities
+  :: SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to assign.
+  -> IO ()
+setLogPriorities = Unsafe.sDL_SetLogPriorities
+
+-- | Set the priority of all log categories.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'resetLogPriorities', 'setLogPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetLogPriorities@.
+--                   The unsafe flavor is 'setLogPriorities'
+--                   .
+--
+--     [C declaration]: @SDL_SetLogPriorities@, defined at @SDL3\/SDL_log.h 156:34@
+setLogPrioritiesSafe
+  :: SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to assign.
+  -> IO ()
+setLogPrioritiesSafe = Safe.sDL_SetLogPriorities
+
+-- | Set the priority of a particular log category.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getLogPriority', 'resetLogPriorities', 'setLogPriorities'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetLogPriority@.
+--                   The safe flavor is 'setLogPrioritySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetLogPriority@, defined at @SDL3\/SDL_log.h 172:34@
+setLogPriority
+  :: BG.Int32
+  -- ^
+  --
+  --           [@category@]: the category to assign a priority to.
+  -> SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to assign.
+  -> IO ()
+setLogPriority =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_SetLogPriority (Coerce.coerce x00) x11
+
+-- | Set the priority of a particular log category.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getLogPriority', 'resetLogPriorities', 'setLogPriorities'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetLogPriority@.
+--                   The unsafe flavor is 'setLogPriority'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetLogPriority@, defined at @SDL3\/SDL_log.h 172:34@
+setLogPrioritySafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@category@]: the category to assign a priority to.
+  -> SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to assign.
+  -> IO ()
+setLogPrioritySafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_SetLogPriority (Coerce.coerce x00) x11
+
+-- | Get the priority of a particular log category.
+--
+--     [Returns]: the 'SDL_LogPriority' for the requested category.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setLogPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetLogPriority@.
+--                   The safe flavor is 'getLogPrioritySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetLogPriority@, defined at @SDL3\/SDL_log.h 186:45@
+getLogPriority
+  :: BG.Int32
+  -- ^
+  --
+  --           [@category@]: the category to query.
+  -> IO SDL_LogPriority
+getLogPriority =
+  \x00 -> Unsafe.sDL_GetLogPriority (Coerce.coerce x00)
+
+-- | Get the priority of a particular log category.
+--
+--     [Returns]: the 'SDL_LogPriority' for the requested category.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setLogPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetLogPriority@.
+--                   The unsafe flavor is 'getLogPriority'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetLogPriority@, defined at @SDL3\/SDL_log.h 186:45@
+getLogPrioritySafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@category@]: the category to query.
+  -> IO SDL_LogPriority
+getLogPrioritySafe =
+  \x00 -> Safe.sDL_GetLogPriority (Coerce.coerce x00)
+
+-- | Reset all priorities to default.
+--
+--     This is called by 'SDL3.Sys.Init.quit'.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setLogPriorities', 'setLogPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ResetLogPriorities@.
+--                   The safe flavor is 'resetLogPrioritiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ResetLogPriorities@, defined at @SDL3\/SDL_log.h 200:34@
+resetLogPriorities :: IO ()
+resetLogPriorities = Unsafe.sDL_ResetLogPriorities
+
+-- | Reset all priorities to default.
+--
+--     This is called by 'SDL3.Sys.Init.quit'.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setLogPriorities', 'setLogPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ResetLogPriorities@.
+--                   The unsafe flavor is 'resetLogPriorities'
+--                   .
+--
+--     [C declaration]: @SDL_ResetLogPriorities@, defined at @SDL3\/SDL_log.h 200:34@
+resetLogPrioritiesSafe :: IO ()
+resetLogPrioritiesSafe = Safe.sDL_ResetLogPriorities
+
+-- | Set the text prepended to log messages of a given priority.
+--
+--     By default SDL_LOG_PRIORITY_INFO and below have no prefix, and SDL_LOG_PRIORITY_WARN and higher have a prefix showing their priority, e.g. \"WARNING: \".
+--
+--     This function makes a copy of its string argument, __prefix__, so it is not necessary to keep the value of __prefix__ alive after the call returns.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setLogPriorities', 'setLogPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetLogPriorityPrefix@.
+--                   The safe flavor is 'setLogPriorityPrefixSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetLogPriorityPrefix@, defined at @SDL3\/SDL_log.h 225:34@
+setLogPriorityPrefix
+  :: SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@prefix@]: the prefix to use for that log priority, or NULL to use no prefix.
+  -> IO Bool
+setLogPriorityPrefix =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetLogPriorityPrefix x00 x11)
+
+-- | Set the text prepended to log messages of a given priority.
+--
+--     By default SDL_LOG_PRIORITY_INFO and below have no prefix, and SDL_LOG_PRIORITY_WARN and higher have a prefix showing their priority, e.g. \"WARNING: \".
+--
+--     This function makes a copy of its string argument, __prefix__, so it is not necessary to keep the value of __prefix__ alive after the call returns.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setLogPriorities', 'setLogPriority'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetLogPriorityPrefix@.
+--                   The unsafe flavor is 'setLogPriorityPrefix'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetLogPriorityPrefix@, defined at @SDL3\/SDL_log.h 225:34@
+setLogPriorityPrefixSafe
+  :: SDL_LogPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_LogPriority' to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@prefix@]: the prefix to use for that log priority, or NULL to use no prefix.
+  -> IO Bool
+setLogPriorityPrefixSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetLogPriorityPrefix x00 x11)
+
+-- | Get the default log output function.
+--
+--     [Returns]: the default log output callback.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setLogOutputFunction', 'getLogOutputFunction'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDefaultLogOutputFunction@.
+--                   The safe flavor is 'getDefaultLogOutputFunctionSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetDefaultLogOutputFunction@, defined at @SDL3\/SDL_log.h 499:51@
+getDefaultLogOutputFunction :: IO SDL_LogOutputFunction
+getDefaultLogOutputFunction =
+  Unsafe.sDL_GetDefaultLogOutputFunction
+
+-- | Get the default log output function.
+--
+--     [Returns]: the default log output callback.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setLogOutputFunction', 'getLogOutputFunction'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDefaultLogOutputFunction@.
+--                   The unsafe flavor is 'getDefaultLogOutputFunction'
+--                   .
+--
+--     [C declaration]: @SDL_GetDefaultLogOutputFunction@, defined at @SDL3\/SDL_log.h 499:51@
+getDefaultLogOutputFunctionSafe :: IO SDL_LogOutputFunction
+getDefaultLogOutputFunctionSafe =
+  Safe.sDL_GetDefaultLogOutputFunction
+
+-- | Get the current log output function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDefaultLogOutputFunction', 'setLogOutputFunction'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetLogOutputFunction@.
+--                   The safe flavor is 'getLogOutputFunctionSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetLogOutputFunction@, defined at @SDL3\/SDL_log.h 516:34@
+getLogOutputFunction
+  :: BG.Ptr SDL_LogOutputFunction
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_LogOutputFunction' filled in with the current log callback.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@userdata@]: a pointer filled in with the pointer that is passed to @callback@.
+  -> IO ()
+getLogOutputFunction =
+  Unsafe.sDL_GetLogOutputFunction
+
+-- | Get the current log output function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDefaultLogOutputFunction', 'setLogOutputFunction'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetLogOutputFunction@.
+--                   The unsafe flavor is 'getLogOutputFunction'
+--                   .
+--
+--     [C declaration]: @SDL_GetLogOutputFunction@, defined at @SDL3\/SDL_log.h 516:34@
+getLogOutputFunctionSafe
+  :: BG.Ptr SDL_LogOutputFunction
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_LogOutputFunction' filled in with the current log callback.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@userdata@]: a pointer filled in with the pointer that is passed to @callback@.
+  -> IO ()
+getLogOutputFunctionSafe =
+  Safe.sDL_GetLogOutputFunction
+
+-- | Replace the default log output function with one of your own.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDefaultLogOutputFunction', 'getLogOutputFunction'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetLogOutputFunction@.
+--                   The safe flavor is 'setLogOutputFunctionSafe'
+--                   : registration; the output function runs from later logging calls.
+--
+--     [C declaration]: @SDL_SetLogOutputFunction@, defined at @SDL3\/SDL_log.h 531:34@
+setLogOutputFunction
+  :: SDL_LogOutputFunction
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_LogOutputFunction' to call instead of the default.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO ()
+setLogOutputFunction =
+  Unsafe.sDL_SetLogOutputFunction
+
+-- | Replace the default log output function with one of your own.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDefaultLogOutputFunction', 'getLogOutputFunction'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetLogOutputFunction@.
+--                   The unsafe flavor is 'setLogOutputFunction'
+--                   : registration; the output function runs from later logging calls.
+--
+--     [C declaration]: @SDL_SetLogOutputFunction@, defined at @SDL3\/SDL_log.h 531:34@
+setLogOutputFunctionSafe
+  :: SDL_LogOutputFunction
+  -- ^
+  --
+  --           [@callback@]: an 'SDL_LogOutputFunction' to call instead of the default.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO ()
+setLogOutputFunctionSafe =
+  Safe.sDL_SetLogOutputFunction
diff --git a/src/SDL3/Sys/Main.hs b/src/SDL3/Sys/Main.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Main.hs
@@ -0,0 +1,214 @@
+-- | App entry-point handling; SDL_main is not bound here.
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Main.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Main (
+  module SDL3.Sys.Bindgen.Main,
+
+  -- * Function aliases
+  SDL3.Sys.Main.setMainReady,
+  SDL3.Sys.Main.setMainReadySafe,
+  SDL3.Sys.Main.runAppSafe,
+  SDL3.Sys.Main.enterAppMainCallbacksSafe,
+  SDL3.Sys.Main.gdkSuspendComplete,
+  SDL3.Sys.Main.gdkSuspendCompleteSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.IncompleteArray qualified as IA
+import HsBindgen.Runtime.IsArray qualified as IsA
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Init qualified
+import SDL3.Sys.Bindgen.Main
+import SDL3.Sys.Bindgen.Main.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Main.Unsafe qualified as Unsafe
+
+-- | Circumvent failure of 'SDL3.Sys.Init.init' when not using @SDL_main()@ as an entry point.
+--
+--     This function is defined in @SDL_main.h@, along with the preprocessor rule to redefine main() as @SDL_main()@. Thus to ensure that your main() function will not be changed it is necessary to define SDL_MAIN_HANDLED before including SDL.h.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Init.init'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetMainReady@.
+--                   The safe flavor is 'setMainReadySafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetMainReady@, defined at @SDL3\/SDL_main.h 548:34@
+setMainReady :: IO ()
+setMainReady = Unsafe.sDL_SetMainReady
+
+-- | Circumvent failure of 'SDL3.Sys.Init.init' when not using @SDL_main()@ as an entry point.
+--
+--     This function is defined in @SDL_main.h@, along with the preprocessor rule to redefine main() as @SDL_main()@. Thus to ensure that your main() function will not be changed it is necessary to define SDL_MAIN_HANDLED before including SDL.h.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Init.init'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetMainReady@.
+--                   The unsafe flavor is 'setMainReady'
+--                   .
+--
+--     [C declaration]: @SDL_SetMainReady@, defined at @SDL3\/SDL_main.h 548:34@
+setMainReadySafe :: IO ()
+setMainReadySafe = Safe.sDL_SetMainReady
+
+-- | Initializes and launches an SDL application, by doing platform-specific initialization before calling your mainFunction and cleanups after it returns, if that is needed for a specific platform, otherwise it just calls mainFunction.
+--
+--     You can use this if you want to use your own main() implementation without using SDL_main (like when using SDL_MAIN_HANDLED). When using this, you do /not/ need @'setMainReady'@.
+--
+--     If @argv@ is NULL, SDL will provide command line arguments, either by querying the OS for them if possible, or supplying a filler array if not.
+--
+--     [Returns]: the return value from mainFunction: 0 on success, otherwise failure; 'SDL3.Sys.Error.getError' might have more information on the failure.
+--
+--     [Thread safety]: Generally this is called once, near startup, from the process\'s initial thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RunApp@.
+--                   The unsafe import is not exported
+--                   : runs the provided main function synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Main.Unsafe.sDL_RunApp@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RunApp@, defined at @SDL3\/SDL_main.h 581:33@
+runAppSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@argc@]: the argc parameter from the application\'s main() function, or 0 if the platform\'s main-equivalent has no argc.
+  -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+  -- ^
+  --
+  --           [@argv@]: the argv parameter from the application\'s main() function, or NULL if the platform\'s main-equivalent has no argv.
+  -> SDL_main_func
+  -- ^
+  --
+  --           [@mainFunction@]: your SDL app\'s C-style main(). NOT the function you\'re calling this from! Its name doesn\'t matter; it doesn\'t literally have to be @main@.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@reserved@]: should be NULL (reserved for future use, will probably be platform-specific then).
+  -> IO BG.Int32
+runAppSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap Coerce.coerce (Safe.sDL_RunApp (Coerce.coerce x00) x11 x22 x33)
+
+-- | An entry point for SDL\'s use in SDL_MAIN_USE_CALLBACKS.
+--
+--     Generally, you should not call this function directly. This only exists to hand off work into SDL as soon as possible, where it has a lot more control and functionality available, and make the inline code in @SDL_main.h@ as small as possible.
+--
+--     Not all platforms use this, it\'s actual use is hidden in a magic header-only library, and you should not call this directly unless you /really/ know what you\'re doing.
+--
+--     [Returns]: standard Unix main return value.
+--
+--     [Thread safety]: It is not safe to call this anywhere except as the only function call in SDL_main.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EnterAppMainCallbacks@.
+--                   The unsafe import is not exported
+--                   : runs the whole app main loop through the callbacks synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Main.Unsafe.sDL_EnterAppMainCallbacks@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_EnterAppMainCallbacks@, defined at @SDL3\/SDL_main.h 608:33@
+enterAppMainCallbacksSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@argc@]: standard Unix main argc.
+  -> BG.Ptr (IsA.Elem (IA.IncompleteArray (BG.Ptr BG.CChar)))
+  -- ^
+  --
+  --           [@argv@]: standard Unix main argv.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppInit_func
+  -- ^
+  --
+  --           [@appinit@]: the application\'s SDL_AppInit function.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppIterate_func
+  -- ^
+  --
+  --           [@appiter@]: the application\'s SDL_AppIterate function.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppEvent_func
+  -- ^
+  --
+  --           [@appevent@]: the application\'s SDL_AppEvent function.
+  -> SDL3.Sys.Bindgen.Init.SDL_AppQuit_func
+  -- ^
+  --
+  --           [@appquit@]: the application\'s SDL_AppQuit function.
+  -> IO BG.Int32
+enterAppMainCallbacksSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap Coerce.coerce (Safe.sDL_EnterAppMainCallbacks (Coerce.coerce x00) x11 x22 x33 x44 x55)
+
+-- | Callback from the application to let the suspend continue.
+--
+--     This function is only needed for Xbox GDK support; all other platforms will do nothing and set an \"unsupported\" error message.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GDKSuspendComplete@.
+--                   The safe flavor is 'gdkSuspendCompleteSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GDKSuspendComplete@, defined at @SDL3\/SDL_main.h 673:34@
+gdkSuspendComplete :: IO ()
+gdkSuspendComplete = Unsafe.sDL_GDKSuspendComplete
+
+-- | Callback from the application to let the suspend continue.
+--
+--     This function is only needed for Xbox GDK support; all other platforms will do nothing and set an \"unsupported\" error message.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GDKSuspendComplete@.
+--                   The unsafe flavor is 'gdkSuspendComplete'
+--                   .
+--
+--     [C declaration]: @SDL_GDKSuspendComplete@, defined at @SDL3\/SDL_main.h 673:34@
+gdkSuspendCompleteSafe :: IO ()
+gdkSuspendCompleteSafe = Safe.sDL_GDKSuspendComplete
diff --git a/src/SDL3/Sys/Messagebox.hs b/src/SDL3/Sys/Messagebox.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Messagebox.hs
@@ -0,0 +1,288 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | SDL offers a simple message box API, which is useful for simple alerts, such as informing the user when something fatal happens at startup without the need to build a UI for it (or informing the user /before/ your UI is ready).
+--
+--     These message boxes are native system dialogs where possible.
+--
+--     There is both a customizable function (@'showMessageBox'@) that offers lots of options for what to display and reports on what choice the user made, and also a much-simplified version (@'showSimpleMessageBox'@), merely takes a text message and title, and waits until the user presses a single \"OK\" UI button. Often, this is all that is necessary. Message box flags.
+--
+--     If supported will display warning icon, etc.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Messagebox.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Messagebox (
+  module SDL3.Sys.Bindgen.Messagebox,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Messagebox.SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT,
+  pattern SDL3.Sys.Messagebox.SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT,
+  pattern SDL3.Sys.Messagebox.SDL_MESSAGEBOX_ERROR,
+  pattern SDL3.Sys.Messagebox.SDL_MESSAGEBOX_WARNING,
+  pattern SDL3.Sys.Messagebox.SDL_MESSAGEBOX_INFORMATION,
+  pattern SDL3.Sys.Messagebox.SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT,
+  pattern SDL3.Sys.Messagebox.SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT,
+
+  -- * Function aliases
+  SDL3.Sys.Messagebox.showMessageBox,
+  SDL3.Sys.Messagebox.showMessageBoxSafe,
+  SDL3.Sys.Messagebox.showSimpleMessageBox,
+  SDL3.Sys.Messagebox.showSimpleMessageBoxSafe,
+)
+where
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Messagebox
+import SDL3.Sys.Bindgen.Messagebox.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Messagebox.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | Create a modal message box.
+--
+--     If your needs aren\'t complex, it might be easier to use 'showSimpleMessageBox'.
+--
+--     This function should be called on the thread that created the parent window, or on the main thread if the messagebox has no parent. It will block execution of that thread until the user clicks a button or closes the messagebox.
+--
+--     This function may be called at any time, even before 'SDL3.Sys.Init.init'. This makes it useful for reporting errors like a failure to create a renderer or OpenGL context.
+--
+--     On X11, SDL rolls its own dialog box with X11 primitives instead of a formal toolkit like GTK+ or Qt.
+--
+--     Note that if 'SDL3.Sys.Init.init' would fail because there isn\'t any available video target, this function is likely to fail for the same reasons. If this is a concern, check the return value from this function and fall back to writing to stderr if you can.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'showSimpleMessageBox'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ShowMessageBox@.
+--                   The safe flavor is 'showMessageBoxSafe'
+--                   : modal; blocks until dismissed.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowMessageBox@, defined at @SDL3\/SDL_messagebox.h 177:34@
+showMessageBox
+  :: PtrConst.PtrConst SDL_MessageBoxData
+  -- ^
+  --
+  --           [@messageboxdata@]: the 'SDL_MessageBoxData' structure with title, text and other options.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@buttonid@]: the pointer to which user id of hit button should be copied.
+  -> IO Bool
+showMessageBox =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ShowMessageBox x00 x11)
+
+-- | Create a modal message box.
+--
+--     If your needs aren\'t complex, it might be easier to use 'showSimpleMessageBox'.
+--
+--     This function should be called on the thread that created the parent window, or on the main thread if the messagebox has no parent. It will block execution of that thread until the user clicks a button or closes the messagebox.
+--
+--     This function may be called at any time, even before 'SDL3.Sys.Init.init'. This makes it useful for reporting errors like a failure to create a renderer or OpenGL context.
+--
+--     On X11, SDL rolls its own dialog box with X11 primitives instead of a formal toolkit like GTK+ or Qt.
+--
+--     Note that if 'SDL3.Sys.Init.init' would fail because there isn\'t any available video target, this function is likely to fail for the same reasons. If this is a concern, check the return value from this function and fall back to writing to stderr if you can.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'showSimpleMessageBox'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShowMessageBox@.
+--                   The unsafe flavor is 'showMessageBox'
+--                   : modal; blocks until dismissed.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowMessageBox@, defined at @SDL3\/SDL_messagebox.h 177:34@
+showMessageBoxSafe
+  :: PtrConst.PtrConst SDL_MessageBoxData
+  -- ^
+  --
+  --           [@messageboxdata@]: the 'SDL_MessageBoxData' structure with title, text and other options.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@buttonid@]: the pointer to which user id of hit button should be copied.
+  -> IO Bool
+showMessageBoxSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ShowMessageBox x00 x11)
+
+-- | Display a simple modal message box.
+--
+--     If your needs aren\'t complex, this function is preferred over 'showMessageBox'.
+--
+--     @flags@ may be any of the following:
+--
+--     * @'sDL_MESSAGEBOX_ERROR'@: error dialog
+--
+--     * @'sDL_MESSAGEBOX_WARNING'@: warning dialog
+--
+--     * @'sDL_MESSAGEBOX_INFORMATION'@: informational dialog
+--
+--     This function should be called on the thread that created the parent window, or on the main thread if the messagebox has no parent. It will block execution of that thread until the user clicks a button or closes the messagebox.
+--
+--     This function may be called at any time, even before 'SDL3.Sys.Init.init'. This makes it useful for reporting errors like a failure to create a renderer or OpenGL context.
+--
+--     On X11, SDL rolls its own dialog box with X11 primitives instead of a formal toolkit like GTK+ or Qt.
+--
+--     Note that if 'SDL3.Sys.Init.init' would fail because there isn\'t any available video target, this function is likely to fail for the same reasons. If this is a concern, check the return value from this function and fall back to writing to stderr if you can.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'showMessageBox'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ShowSimpleMessageBox@.
+--                   The safe flavor is 'showSimpleMessageBoxSafe'
+--                   : modal; blocks until dismissed.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowSimpleMessageBox@, defined at @SDL3\/SDL_messagebox.h 221:34@
+showSimpleMessageBox
+  :: SDL_MessageBoxFlags
+  -- ^
+  --
+  --           [@flags@]: an 'SDL_MessageBoxFlags' value.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: UTF-8 title text.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@message@]: UTF-8 message text.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the parent window, or NULL for no parent.
+  -> IO Bool
+showSimpleMessageBox =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_ShowSimpleMessageBox x00 x11 x22 x33)
+
+-- | Display a simple modal message box.
+--
+--     If your needs aren\'t complex, this function is preferred over 'showMessageBox'.
+--
+--     @flags@ may be any of the following:
+--
+--     * @'sDL_MESSAGEBOX_ERROR'@: error dialog
+--
+--     * @'sDL_MESSAGEBOX_WARNING'@: warning dialog
+--
+--     * @'sDL_MESSAGEBOX_INFORMATION'@: informational dialog
+--
+--     This function should be called on the thread that created the parent window, or on the main thread if the messagebox has no parent. It will block execution of that thread until the user clicks a button or closes the messagebox.
+--
+--     This function may be called at any time, even before 'SDL3.Sys.Init.init'. This makes it useful for reporting errors like a failure to create a renderer or OpenGL context.
+--
+--     On X11, SDL rolls its own dialog box with X11 primitives instead of a formal toolkit like GTK+ or Qt.
+--
+--     Note that if 'SDL3.Sys.Init.init' would fail because there isn\'t any available video target, this function is likely to fail for the same reasons. If this is a concern, check the return value from this function and fall back to writing to stderr if you can.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'showMessageBox'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShowSimpleMessageBox@.
+--                   The unsafe flavor is 'showSimpleMessageBox'
+--                   : modal; blocks until dismissed.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowSimpleMessageBox@, defined at @SDL3\/SDL_messagebox.h 221:34@
+showSimpleMessageBoxSafe
+  :: SDL_MessageBoxFlags
+  -- ^
+  --
+  --           [@flags@]: an 'SDL_MessageBoxFlags' value.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: UTF-8 title text.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@message@]: UTF-8 message text.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the parent window, or NULL for no parent.
+  -> IO Bool
+showSimpleMessageBoxSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_ShowSimpleMessageBox x00 x11 x22 x33)
+
+-- | Typed constant for macro @SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT :: SDL_MessageBoxButtonFlags
+pattern SDL_MESSAGEBOX_BUTTON_RETURNKEY_DEFAULT = SDL_MessageBoxButtonFlags 0x00000001
+
+-- | Typed constant for macro @SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT :: SDL_MessageBoxButtonFlags
+pattern SDL_MESSAGEBOX_BUTTON_ESCAPEKEY_DEFAULT = SDL_MessageBoxButtonFlags 0x00000002
+
+-- | Typed constant for macro @SDL_MESSAGEBOX_ERROR@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_MESSAGEBOX_ERROR :: SDL_MessageBoxFlags
+pattern SDL_MESSAGEBOX_ERROR = SDL_MessageBoxFlags 0x00000010
+
+-- | Typed constant for macro @SDL_MESSAGEBOX_WARNING@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_MESSAGEBOX_WARNING :: SDL_MessageBoxFlags
+pattern SDL_MESSAGEBOX_WARNING = SDL_MessageBoxFlags 0x00000020
+
+-- | Typed constant for macro @SDL_MESSAGEBOX_INFORMATION@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_MESSAGEBOX_INFORMATION :: SDL_MessageBoxFlags
+pattern SDL_MESSAGEBOX_INFORMATION = SDL_MessageBoxFlags 0x00000040
+
+-- | Typed constant for macro @SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT :: SDL_MessageBoxFlags
+pattern SDL_MESSAGEBOX_BUTTONS_LEFT_TO_RIGHT = SDL_MessageBoxFlags 0x00000080
+
+-- | Typed constant for macro @SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT :: SDL_MessageBoxFlags
+pattern SDL_MESSAGEBOX_BUTTONS_RIGHT_TO_LEFT = SDL_MessageBoxFlags 0x00000100
diff --git a/src/SDL3/Sys/Metal.hs b/src/SDL3/Sys/Metal.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Metal.hs
@@ -0,0 +1,183 @@
+-- | Functions to creating Metal layers and views on SDL windows.
+--
+--     This provides some platform-specific glue for Apple platforms. Most macOS and iOS apps can use SDL without these functions, but this API they can be useful for specific OS-level integration tasks. A handle to a CAMetalLayer-backed NSView (macOS) or UIView (iOS\/tvOS).
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Metal.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Metal (
+  module SDL3.Sys.Bindgen.Metal,
+
+  -- * Function aliases
+  SDL3.Sys.Metal.metalCreateView,
+  SDL3.Sys.Metal.metalCreateViewSafe,
+  SDL3.Sys.Metal.metalDestroyView,
+  SDL3.Sys.Metal.metalDestroyViewSafe,
+  SDL3.Sys.Metal.metalGetLayer,
+  SDL3.Sys.Metal.metalGetLayerSafe,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Metal
+import SDL3.Sys.Bindgen.Metal.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Metal.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | Create a CAMetalLayer-backed NSView\/UIView and attach it to the specified window.
+--
+--     On macOS, this does /not/ associate a MTLDevice with the CAMetalLayer on its own. It is up to user code to do that.
+--
+--     The returned handle can be casted directly to a NSView or UIView. To access the backing CAMetalLayer, call @'metalGetLayer'@.
+--
+--     [Returns]: handle NSView or UIView.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'metalDestroyView', 'metalGetLayer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Metal_CreateView@.
+--                   The safe flavor is 'metalCreateViewSafe'
+--                   .
+--
+--     [C declaration]: @SDL_Metal_CreateView@, defined at @SDL3\/SDL_metal.h 75:43@
+metalCreateView
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> IO SDL_MetalView
+metalCreateView = Unsafe.sDL_Metal_CreateView
+
+-- | Create a CAMetalLayer-backed NSView\/UIView and attach it to the specified window.
+--
+--     On macOS, this does /not/ associate a MTLDevice with the CAMetalLayer on its own. It is up to user code to do that.
+--
+--     The returned handle can be casted directly to a NSView or UIView. To access the backing CAMetalLayer, call @'metalGetLayer'@.
+--
+--     [Returns]: handle NSView or UIView.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'metalDestroyView', 'metalGetLayer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Metal_CreateView@.
+--                   The unsafe flavor is 'metalCreateView'
+--                   .
+--
+--     [C declaration]: @SDL_Metal_CreateView@, defined at @SDL3\/SDL_metal.h 75:43@
+metalCreateViewSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> IO SDL_MetalView
+metalCreateViewSafe = Safe.sDL_Metal_CreateView
+
+-- | Destroy an existing 'SDL_MetalView' object.
+--
+--     This should be called before 'SDL3.Sys.Video.destroyWindow', if 'metalCreateView' was called after 'SDL3.Sys.Video.createWindow'.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'metalCreateView'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Metal_DestroyView@.
+--                   The safe flavor is 'metalDestroyViewSafe'
+--                   .
+--
+--     [C declaration]: @SDL_Metal_DestroyView@, defined at @SDL3\/SDL_metal.h 91:34@
+metalDestroyView
+  :: SDL_MetalView
+  -- ^
+  --
+  --           [@view@]: the 'SDL_MetalView' object.
+  -> IO ()
+metalDestroyView = Unsafe.sDL_Metal_DestroyView
+
+-- | Destroy an existing 'SDL_MetalView' object.
+--
+--     This should be called before 'SDL3.Sys.Video.destroyWindow', if 'metalCreateView' was called after 'SDL3.Sys.Video.createWindow'.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'metalCreateView'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Metal_DestroyView@.
+--                   The unsafe flavor is 'metalDestroyView'
+--                   .
+--
+--     [C declaration]: @SDL_Metal_DestroyView@, defined at @SDL3\/SDL_metal.h 91:34@
+metalDestroyViewSafe
+  :: SDL_MetalView
+  -- ^
+  --
+  --           [@view@]: the 'SDL_MetalView' object.
+  -> IO ()
+metalDestroyViewSafe = Safe.sDL_Metal_DestroyView
+
+-- | Get a pointer to the backing CAMetalLayer for the given view.
+--
+--     [Returns]: a pointer.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Metal_GetLayer@.
+--                   The safe flavor is 'metalGetLayerSafe'
+--                   .
+--
+--     [C declaration]: @SDL_Metal_GetLayer@, defined at @SDL3\/SDL_metal.h 103:36@
+metalGetLayer
+  :: SDL_MetalView
+  -- ^
+  --
+  --           [@view@]: the 'SDL_MetalView' object.
+  -> IO (BG.Ptr BG.Void)
+metalGetLayer = Unsafe.sDL_Metal_GetLayer
+
+-- | Get a pointer to the backing CAMetalLayer for the given view.
+--
+--     [Returns]: a pointer.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Metal_GetLayer@.
+--                   The unsafe flavor is 'metalGetLayer'
+--                   .
+--
+--     [C declaration]: @SDL_Metal_GetLayer@, defined at @SDL3\/SDL_metal.h 103:36@
+metalGetLayerSafe
+  :: SDL_MetalView
+  -- ^
+  --
+  --           [@view@]: the 'SDL_MetalView' object.
+  -> IO (BG.Ptr BG.Void)
+metalGetLayerSafe = Safe.sDL_Metal_GetLayer
diff --git a/src/SDL3/Sys/Misc.hs b/src/SDL3/Sys/Misc.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Misc.hs
@@ -0,0 +1,73 @@
+-- | SDL API functions that don\'t fit elsewhere. Open a URL\/URI in the browser or other appropriate external application.
+--
+--     Open a URL in a separate, system-provided application. How this works will vary wildly depending on the platform. This will likely launch what makes sense to handle a specific URL\'s protocol (a web browser for @[http:\/\/](http://)@, etc), but it might also be able to launch file managers for directories and other things.
+--
+--     What happens when you open a URL varies wildly as well: your game window may lose focus (and may or may not lose focus if your game was fullscreen or grabbing input at the time). On mobile devices, your app will likely move to the background or your process might be paused. Any given platform may or may not handle a given URL.
+--
+--     If this is unimplemented (or simply unavailable) for a platform, this will fail with an error. A successful result does not mean the URL loaded, just that we launched /something/ to handle it (or at least believe we did).
+--
+--     All this to say: this function can be useful, but you should definitely test it on every platform you target.
+--
+--     [@url@]: a valid URL\/URI to open. Use @[file:\/\/\/full\/path\/to\/file](file:///full/path/to/file)@ for local files, if supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Misc.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Misc (
+  -- * Function aliases
+  SDL3.Sys.Misc.openURL,
+  SDL3.Sys.Misc.openURLSafe,
+)
+where
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Misc.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Misc.Unsafe qualified as Unsafe
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenURL@.
+--                   The safe flavor is 'openURLSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_OpenURL@, defined at @SDL3\/SDL_misc.h 72:34@
+openURL
+  :: PtrConst.PtrConst BG.CChar
+  -- ^ [C declaration]: @url@
+  -> IO Bool
+openURL =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_OpenURL x00)
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenURL@.
+--                   The unsafe flavor is 'openURL'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_OpenURL@, defined at @SDL3\/SDL_misc.h 72:34@
+openURLSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^ [C declaration]: @url@
+  -> IO Bool
+openURLSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_OpenURL x00)
diff --git a/src/SDL3/Sys/Mouse.hs b/src/SDL3/Sys/Mouse.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Mouse.hs
@@ -0,0 +1,1732 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | Any GUI application has to deal with the mouse, and SDL provides functions to manage mouse input and the displayed cursor.
+--
+--     Most interactions with the mouse will come through the event subsystem. Moving a mouse generates an SDL_EVENT_MOUSE_MOTION event, pushing a button generates SDL_EVENT_MOUSE_BUTTON_DOWN, etc, but one can also query the current state of the mouse at any time with @'getMouseState'@.
+--
+--     For certain games, it\'s useful to disassociate the mouse cursor from mouse input. An FPS, for example, would not want the player\'s motion to stop as the mouse hits the edge of the window. For these scenarios, use @'setWindowRelativeMouseMode'@, which hides the cursor, grabs mouse input to the window, and reads mouse input no matter how far it moves.
+--
+--     Games that want the system to track the mouse but want to draw their own cursor can use @'hideCursor'@ and @'showCursor'@. It might be more efficient to let the system manage the cursor, if possible, using @'setCursor'@ with a custom image made through @'createColorCursor'@, or perhaps just a specific system cursor from @'createSystemCursor'@.
+--
+--     SDL can, on many platforms, differentiate between multiple connected mice, allowing for interesting input scenarios and multiplayer games. They can be enumerated with @'getMice'@, and SDL will send SDL_EVENT_MOUSE_ADDED and SDL_EVENT_MOUSE_REMOVED events as they are connected and unplugged.
+--
+--     Since many apps only care about basic mouse input, SDL offers a virtual mouse device for touch and pen input, which often can make a desktop application work on a touchscreen phone without any code changes. Apps that care about touch\/pen separately from mouse input should filter out events with a @which@ field of SDL_TOUCH_MOUSEID\/SDL_PEN_MOUSEID. This is a unique ID for a mouse for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     If the mouse is disconnected and reconnected, it will get a new ID.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Mouse.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Mouse (
+  module SDL3.Sys.Bindgen.Mouse,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Mouse.SDL_BUTTON_LMASK,
+  pattern SDL3.Sys.Mouse.SDL_BUTTON_MMASK,
+  pattern SDL3.Sys.Mouse.SDL_BUTTON_RMASK,
+  pattern SDL3.Sys.Mouse.SDL_BUTTON_X1MASK,
+  pattern SDL3.Sys.Mouse.SDL_BUTTON_X2MASK,
+
+  -- * Function aliases
+  SDL3.Sys.Mouse.hasMouse,
+  SDL3.Sys.Mouse.hasMouseSafe,
+  SDL3.Sys.Mouse.getMice,
+  SDL3.Sys.Mouse.getMiceSafe,
+  SDL3.Sys.Mouse.getMouseNameForID,
+  SDL3.Sys.Mouse.getMouseNameForIDSafe,
+  SDL3.Sys.Mouse.getMouseFocus,
+  SDL3.Sys.Mouse.getMouseFocusSafe,
+  SDL3.Sys.Mouse.getMouseState,
+  SDL3.Sys.Mouse.getMouseStateSafe,
+  SDL3.Sys.Mouse.getGlobalMouseState,
+  SDL3.Sys.Mouse.getGlobalMouseStateSafe,
+  SDL3.Sys.Mouse.getRelativeMouseState,
+  SDL3.Sys.Mouse.getRelativeMouseStateSafe,
+  SDL3.Sys.Mouse.warpMouseInWindow,
+  SDL3.Sys.Mouse.warpMouseInWindowSafe,
+  SDL3.Sys.Mouse.warpMouseGlobal,
+  SDL3.Sys.Mouse.warpMouseGlobalSafe,
+  SDL3.Sys.Mouse.setRelativeMouseTransform,
+  SDL3.Sys.Mouse.setRelativeMouseTransformSafe,
+  SDL3.Sys.Mouse.setWindowRelativeMouseMode,
+  SDL3.Sys.Mouse.setWindowRelativeMouseModeSafe,
+  SDL3.Sys.Mouse.getWindowRelativeMouseMode,
+  SDL3.Sys.Mouse.getWindowRelativeMouseModeSafe,
+  SDL3.Sys.Mouse.captureMouse,
+  SDL3.Sys.Mouse.captureMouseSafe,
+  SDL3.Sys.Mouse.createCursor,
+  SDL3.Sys.Mouse.createCursorSafe,
+  SDL3.Sys.Mouse.createColorCursor,
+  SDL3.Sys.Mouse.createColorCursorSafe,
+  SDL3.Sys.Mouse.createAnimatedCursor,
+  SDL3.Sys.Mouse.createAnimatedCursorSafe,
+  SDL3.Sys.Mouse.createSystemCursor,
+  SDL3.Sys.Mouse.createSystemCursorSafe,
+  SDL3.Sys.Mouse.setCursor,
+  SDL3.Sys.Mouse.setCursorSafe,
+  SDL3.Sys.Mouse.getCursor,
+  SDL3.Sys.Mouse.getCursorSafe,
+  SDL3.Sys.Mouse.getDefaultCursor,
+  SDL3.Sys.Mouse.getDefaultCursorSafe,
+  SDL3.Sys.Mouse.destroyCursor,
+  SDL3.Sys.Mouse.destroyCursorSafe,
+  SDL3.Sys.Mouse.showCursor,
+  SDL3.Sys.Mouse.showCursorSafe,
+  SDL3.Sys.Mouse.hideCursor,
+  SDL3.Sys.Mouse.hideCursorSafe,
+  SDL3.Sys.Mouse.cursorVisible,
+  SDL3.Sys.Mouse.cursorVisibleSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Mouse
+import SDL3.Sys.Bindgen.Mouse.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Mouse.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | Return whether a mouse is currently connected.
+--
+--     [Returns]: true if a mouse is connected, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasMouse@.
+--                   The safe flavor is 'hasMouseSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasMouse@, defined at @SDL3\/SDL_mouse.h 226:34@
+hasMouse :: IO Bool
+hasMouse = fmap CBool.toBool Unsafe.sDL_HasMouse
+
+-- | Return whether a mouse is currently connected.
+--
+--     [Returns]: true if a mouse is connected, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasMouse@.
+--                   The unsafe flavor is 'hasMouse'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasMouse@, defined at @SDL3\/SDL_mouse.h 226:34@
+hasMouseSafe :: IO Bool
+hasMouseSafe = fmap CBool.toBool Safe.sDL_HasMouse
+
+-- | Get a list of currently connected mice.
+--
+--     Note that this will include any device or virtual driver that includes mouse functionality, including some game controllers, KVM switches, etc. You should wait for input from a device before you consider it actively in use.
+--
+--     [Returns]: a 0 terminated array of mouse instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMouseNameForID', 'hasMouse'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetMice@.
+--                   The safe flavor is 'getMiceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetMice@, defined at @SDL3\/SDL_mouse.h 249:43@
+getMice
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of mice returned, may be NULL.
+  -> IO (BG.Ptr SDL_MouseID)
+getMice = Unsafe.sDL_GetMice
+
+-- | Get a list of currently connected mice.
+--
+--     Note that this will include any device or virtual driver that includes mouse functionality, including some game controllers, KVM switches, etc. You should wait for input from a device before you consider it actively in use.
+--
+--     [Returns]: a 0 terminated array of mouse instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMouseNameForID', 'hasMouse'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetMice@.
+--                   The unsafe flavor is 'getMice'
+--                   .
+--
+--     [C declaration]: @SDL_GetMice@, defined at @SDL3\/SDL_mouse.h 249:43@
+getMiceSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of mice returned, may be NULL.
+  -> IO (BG.Ptr SDL_MouseID)
+getMiceSafe = Safe.sDL_GetMice
+
+-- | Get the name of a mouse.
+--
+--     This function returns \"\" if the mouse doesn\'t have a name.
+--
+--     [Returns]: the name of the selected mouse, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetMouseNameForID@.
+--                   The safe flavor is 'getMouseNameForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetMouseNameForID@, defined at @SDL3\/SDL_mouse.h 266:42@
+getMouseNameForID
+  :: SDL_MouseID
+  -- ^
+  --
+  --           [@instance_id@]: the mouse instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getMouseNameForID = Unsafe.sDL_GetMouseNameForID
+
+-- | Get the name of a mouse.
+--
+--     This function returns \"\" if the mouse doesn\'t have a name.
+--
+--     [Returns]: the name of the selected mouse, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMice'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetMouseNameForID@.
+--                   The unsafe flavor is 'getMouseNameForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetMouseNameForID@, defined at @SDL3\/SDL_mouse.h 266:42@
+getMouseNameForIDSafe
+  :: SDL_MouseID
+  -- ^
+  --
+  --           [@instance_id@]: the mouse instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getMouseNameForIDSafe = Safe.sDL_GetMouseNameForID
+
+-- | Get the window which currently has mouse focus.
+--
+--     [Returns]: the window with mouse focus.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetMouseFocus@.
+--                   The safe flavor is 'getMouseFocusSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetMouseFocus@, defined at @SDL3\/SDL_mouse.h 277:42@
+getMouseFocus :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+getMouseFocus = Unsafe.sDL_GetMouseFocus
+
+-- | Get the window which currently has mouse focus.
+--
+--     [Returns]: the window with mouse focus.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetMouseFocus@.
+--                   The unsafe flavor is 'getMouseFocus'
+--                   .
+--
+--     [C declaration]: @SDL_GetMouseFocus@, defined at @SDL3\/SDL_mouse.h 277:42@
+getMouseFocusSafe :: IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+getMouseFocusSafe = Safe.sDL_GetMouseFocus
+
+-- | Query SDL\'s cache for the synchronous mouse button state and the window-relative SDL-cursor position.
+--
+--     This function returns the cached synchronous state as SDL understands it from the last pump of the event queue.
+--
+--     To query the platform for immediate asynchronous state, use 'getGlobalMouseState'.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y coordinates relative to the focused window.
+--
+--     In Relative Mode, the SDL-cursor\'s position usually contradicts the platform-cursor\'s position as manually calculated from @'getGlobalMouseState'@ and 'SDL3.Sys.Video.getWindowPosition'.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGlobalMouseState', 'getRelativeMouseState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetMouseState@.
+--                   The safe flavor is 'getMouseStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetMouseState@, defined at @SDL3\/SDL_mouse.h 310:50@
+getMouseState
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the SDL-cursor\'s x-position from the focused window\'s top left corner, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the SDL-cursor\'s y-position from the focused window\'s top left corner, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+getMouseState = Unsafe.sDL_GetMouseState
+
+-- | Query SDL\'s cache for the synchronous mouse button state and the window-relative SDL-cursor position.
+--
+--     This function returns the cached synchronous state as SDL understands it from the last pump of the event queue.
+--
+--     To query the platform for immediate asynchronous state, use 'getGlobalMouseState'.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y coordinates relative to the focused window.
+--
+--     In Relative Mode, the SDL-cursor\'s position usually contradicts the platform-cursor\'s position as manually calculated from @'getGlobalMouseState'@ and 'SDL3.Sys.Video.getWindowPosition'.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGlobalMouseState', 'getRelativeMouseState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetMouseState@.
+--                   The unsafe flavor is 'getMouseState'
+--                   .
+--
+--     [C declaration]: @SDL_GetMouseState@, defined at @SDL3\/SDL_mouse.h 310:50@
+getMouseStateSafe
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the SDL-cursor\'s x-position from the focused window\'s top left corner, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the SDL-cursor\'s y-position from the focused window\'s top left corner, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+getMouseStateSafe = Safe.sDL_GetMouseState
+
+-- | Query the platform for the asynchronous mouse button state and the desktop-relative platform-cursor position.
+--
+--     This function immediately queries the platform for the most recent asynchronous state, more costly than retrieving SDL\'s cached state in @'getMouseState'@.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y coordinates relative to the desktop.
+--
+--     In Relative Mode, the platform-cursor\'s position usually contradicts the SDL-cursor\'s position as manually calculated from @'getMouseState'@ and 'SDL3.Sys.Video.getWindowPosition'.
+--
+--     This function can be useful if you need to track the mouse outside of a specific window and @'captureMouse'@ doesn\'t fit your needs. For example, it could be useful if you need to track the mouse while dragging a window, where coordinates relative to a window might not be in sync at all times.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'captureMouse', 'getMouseState', 'getGlobalMouseState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGlobalMouseState@.
+--                   The safe flavor is 'getGlobalMouseStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGlobalMouseState@, defined at @SDL3\/SDL_mouse.h 347:50@
+getGlobalMouseState
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the platform-cursor\'s x-position from the desktop\'s top left corner, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the platform-cursor\'s y-position from the desktop\'s top left corner, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+getGlobalMouseState = Unsafe.sDL_GetGlobalMouseState
+
+-- | Query the platform for the asynchronous mouse button state and the desktop-relative platform-cursor position.
+--
+--     This function immediately queries the platform for the most recent asynchronous state, more costly than retrieving SDL\'s cached state in @'getMouseState'@.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y coordinates relative to the desktop.
+--
+--     In Relative Mode, the platform-cursor\'s position usually contradicts the SDL-cursor\'s position as manually calculated from @'getMouseState'@ and 'SDL3.Sys.Video.getWindowPosition'.
+--
+--     This function can be useful if you need to track the mouse outside of a specific window and @'captureMouse'@ doesn\'t fit your needs. For example, it could be useful if you need to track the mouse while dragging a window, where coordinates relative to a window might not be in sync at all times.
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'captureMouse', 'getMouseState', 'getGlobalMouseState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGlobalMouseState@.
+--                   The unsafe flavor is 'getGlobalMouseState'
+--                   .
+--
+--     [C declaration]: @SDL_GetGlobalMouseState@, defined at @SDL3\/SDL_mouse.h 347:50@
+getGlobalMouseStateSafe
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the platform-cursor\'s x-position from the desktop\'s top left corner, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the platform-cursor\'s y-position from the desktop\'s top left corner, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+getGlobalMouseStateSafe =
+  Safe.sDL_GetGlobalMouseState
+
+-- | Query SDL\'s cache for the synchronous mouse button state and accumulated mouse delta since last call.
+--
+--     This function returns the cached synchronous state as SDL understands it from the last pump of the event queue.
+--
+--     To query the platform for immediate asynchronous state, use 'getGlobalMouseState'.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y deltas accumulated since the last call to this function (or since event initialization).
+--
+--     This function is useful for reducing overhead by processing relative mouse inputs in one go per-frame instead of individually per-event, at the expense of losing the order between events within the frame (e.g. quickly pressing and releasing a button within the same frame).
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMouseState', 'getGlobalMouseState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRelativeMouseState@.
+--                   The safe flavor is 'getRelativeMouseStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRelativeMouseState@, defined at @SDL3\/SDL_mouse.h 382:50@
+getRelativeMouseState
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the x mouse delta accumulated since last call, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the y mouse delta accumulated since last call, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+getRelativeMouseState =
+  Unsafe.sDL_GetRelativeMouseState
+
+-- | Query SDL\'s cache for the synchronous mouse button state and accumulated mouse delta since last call.
+--
+--     This function returns the cached synchronous state as SDL understands it from the last pump of the event queue.
+--
+--     To query the platform for immediate asynchronous state, use 'getGlobalMouseState'.
+--
+--     Passing non-NULL pointers to @x@ or @y@ will write the destination with respective x or y deltas accumulated since the last call to this function (or since event initialization).
+--
+--     This function is useful for reducing overhead by processing relative mouse inputs in one go per-frame instead of individually per-event, at the expense of losing the order between events within the frame (e.g. quickly pressing and releasing a button within the same frame).
+--
+--     [Returns]: a 32-bit bitmask of the button state that can be bitwise-compared against the @SDL_BUTTON_MASK(X)@ macro.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMouseState', 'getGlobalMouseState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRelativeMouseState@.
+--                   The unsafe flavor is 'getRelativeMouseState'
+--                   .
+--
+--     [C declaration]: @SDL_GetRelativeMouseState@, defined at @SDL3\/SDL_mouse.h 382:50@
+getRelativeMouseStateSafe
+  :: BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer to receive the x mouse delta accumulated since last call, can be NULL if unused.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer to receive the y mouse delta accumulated since last call, can be NULL if unused.
+  -> IO SDL_MouseButtonFlags
+getRelativeMouseStateSafe =
+  Safe.sDL_GetRelativeMouseState
+
+-- | Move the mouse cursor to the given position within the window.
+--
+--     This function generates a mouse motion event if relative mode is not enabled. If relative mode is enabled, you can force mouse events for the warp by setting the SDL_HINT_MOUSE_RELATIVE_WARP_MOTION hint.
+--
+--     Note that this function will appear to succeed, but not actually move the mouse when used over Microsoft Remote Desktop.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'warpMouseGlobal'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WarpMouseInWindow@.
+--                   The safe flavor is 'warpMouseInWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WarpMouseInWindow@, defined at @SDL3\/SDL_mouse.h 405:34@
+warpMouseInWindow
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to move the mouse into, or NULL for the current mouse focus.
+  -> Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate within the window.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate within the window.
+  -> IO ()
+warpMouseInWindow =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_WarpMouseInWindow x00 (Coerce.coerce x11) (Coerce.coerce x22)
+
+-- | Move the mouse cursor to the given position within the window.
+--
+--     This function generates a mouse motion event if relative mode is not enabled. If relative mode is enabled, you can force mouse events for the warp by setting the SDL_HINT_MOUSE_RELATIVE_WARP_MOTION hint.
+--
+--     Note that this function will appear to succeed, but not actually move the mouse when used over Microsoft Remote Desktop.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'warpMouseGlobal'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WarpMouseInWindow@.
+--                   The unsafe flavor is 'warpMouseInWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WarpMouseInWindow@, defined at @SDL3\/SDL_mouse.h 405:34@
+warpMouseInWindowSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to move the mouse into, or NULL for the current mouse focus.
+  -> Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate within the window.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate within the window.
+  -> IO ()
+warpMouseInWindowSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_WarpMouseInWindow x00 (Coerce.coerce x11) (Coerce.coerce x22)
+
+-- | Move the mouse to the given position in global screen space.
+--
+--     This function generates a mouse motion event.
+--
+--     A failure of this function usually means that it is unsupported by a platform.
+--
+--     Note that this function will appear to succeed, but not actually move the mouse when used over Microsoft Remote Desktop.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'warpMouseInWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WarpMouseGlobal@.
+--                   The safe flavor is 'warpMouseGlobalSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WarpMouseGlobal@, defined at @SDL3\/SDL_mouse.h 430:34@
+warpMouseGlobal
+  :: Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate.
+  -> IO Bool
+warpMouseGlobal =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WarpMouseGlobal (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Move the mouse to the given position in global screen space.
+--
+--     This function generates a mouse motion event.
+--
+--     A failure of this function usually means that it is unsupported by a platform.
+--
+--     Note that this function will appear to succeed, but not actually move the mouse when used over Microsoft Remote Desktop.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'warpMouseInWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WarpMouseGlobal@.
+--                   The unsafe flavor is 'warpMouseGlobal'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WarpMouseGlobal@, defined at @SDL3\/SDL_mouse.h 430:34@
+warpMouseGlobalSafe
+  :: Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate.
+  -> IO Bool
+warpMouseGlobalSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WarpMouseGlobal (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Set a user-defined function by which to transform relative mouse inputs.
+--
+--     This overrides the relative system scale and relative speed scale hints. Should be called prior to enabling relative mouse mode, fails otherwise.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRelativeMouseTransform@.
+--                   The safe flavor is 'setRelativeMouseTransformSafe'
+--                   : registration; the transform runs during event pumping.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRelativeMouseTransform@, defined at @SDL3\/SDL_mouse.h 448:34@
+setRelativeMouseTransform
+  :: SDL_MouseMotionTransformCallback
+  -- ^
+  --
+  --           [@callback@]: a callback used to transform relative mouse motion, or NULL for default behavior.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that will be passed to @callback@.
+  -> IO Bool
+setRelativeMouseTransform =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetRelativeMouseTransform x00 x11)
+
+-- | Set a user-defined function by which to transform relative mouse inputs.
+--
+--     This overrides the relative system scale and relative speed scale hints. Should be called prior to enabling relative mouse mode, fails otherwise.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRelativeMouseTransform@.
+--                   The unsafe flavor is 'setRelativeMouseTransform'
+--                   : registration; the transform runs during event pumping.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRelativeMouseTransform@, defined at @SDL3\/SDL_mouse.h 448:34@
+setRelativeMouseTransformSafe
+  :: SDL_MouseMotionTransformCallback
+  -- ^
+  --
+  --           [@callback@]: a callback used to transform relative mouse motion, or NULL for default behavior.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that will be passed to @callback@.
+  -> IO Bool
+setRelativeMouseTransformSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetRelativeMouseTransform x00 x11)
+
+-- | Set relative mouse mode for a window.
+--
+--     While the window has focus and relative mouse mode is enabled, the cursor is hidden, the mouse position is constrained to the window, and SDL will report continuous relative mouse motion even if the mouse is at the edge of the window.
+--
+--     If you\'d like to keep the mouse position fixed while in relative mode you can use 'SDL3.Sys.Video.setWindowMouseRect'. If you\'d like the cursor to be at a specific location when relative mode ends, you should use @'warpMouseInWindow'@ before disabling relative mode.
+--
+--     This function will flush any pending mouse motion for this window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowRelativeMouseMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowRelativeMouseMode@.
+--                   The safe flavor is 'setWindowRelativeMouseModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowRelativeMouseMode@, defined at @SDL3\/SDL_mouse.h 476:34@
+setWindowRelativeMouseMode
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: true to enable relative mode, false to disable.
+  -> IO Bool
+setWindowRelativeMouseMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowRelativeMouseMode x00 (CBool.fromBool x11))
+
+-- | Set relative mouse mode for a window.
+--
+--     While the window has focus and relative mouse mode is enabled, the cursor is hidden, the mouse position is constrained to the window, and SDL will report continuous relative mouse motion even if the mouse is at the edge of the window.
+--
+--     If you\'d like to keep the mouse position fixed while in relative mode you can use 'SDL3.Sys.Video.setWindowMouseRect'. If you\'d like the cursor to be at a specific location when relative mode ends, you should use @'warpMouseInWindow'@ before disabling relative mode.
+--
+--     This function will flush any pending mouse motion for this window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowRelativeMouseMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowRelativeMouseMode@.
+--                   The unsafe flavor is 'setWindowRelativeMouseMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowRelativeMouseMode@, defined at @SDL3\/SDL_mouse.h 476:34@
+setWindowRelativeMouseModeSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: true to enable relative mode, false to disable.
+  -> IO Bool
+setWindowRelativeMouseModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowRelativeMouseMode x00 (CBool.fromBool x11))
+
+-- | Query whether relative mouse mode is enabled for a window.
+--
+--     [Returns]: true if relative mode is enabled for a window or false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowRelativeMouseMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowRelativeMouseMode@.
+--                   The safe flavor is 'getWindowRelativeMouseModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowRelativeMouseMode@, defined at @SDL3\/SDL_mouse.h 490:34@
+getWindowRelativeMouseMode
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Bool
+getWindowRelativeMouseMode =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GetWindowRelativeMouseMode x00)
+
+-- | Query whether relative mouse mode is enabled for a window.
+--
+--     [Returns]: true if relative mode is enabled for a window or false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowRelativeMouseMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowRelativeMouseMode@.
+--                   The unsafe flavor is 'getWindowRelativeMouseMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowRelativeMouseMode@, defined at @SDL3\/SDL_mouse.h 490:34@
+getWindowRelativeMouseModeSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Bool
+getWindowRelativeMouseModeSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GetWindowRelativeMouseMode x00)
+
+-- | Capture the mouse and to track input outside an SDL window.
+--
+--     Capturing enables your app to obtain mouse events globally, instead of just within your window. Not all video targets support this function. When capturing is enabled, the current window will get all mouse events, but unlike relative mode, no change is made to the cursor and it is not restrained to your window.
+--
+--     This function may also deny mouse input to other windows both those in your application and others on the system so you should use this function sparingly, and in small bursts. For example, you might want to track the mouse while the user is dragging something, until the user releases a mouse button. It is not recommended that you capture the mouse for long periods of time, such as the entire time your app is running. For that, you should probably use @'setWindowRelativeMouseMode'@ or 'SDL3.Sys.Video.setWindowMouseGrab', depending on your goals.
+--
+--     While captured, mouse events still report coordinates relative to the current (foreground) window, but those coordinates may be outside the bounds of the window (including negative values). Capturing is only allowed for the foreground window. If the window loses focus while capturing, the capture will be disabled automatically.
+--
+--     While capturing is enabled, the current window will have the @SDL_WINDOW_MOUSE_CAPTURE@ flag set.
+--
+--     Please note that SDL will attempt to \"auto capture\" the mouse while the user is pressing a button; this is to try and make mouse behavior more consistent between platforms, and deal with the common case of a user dragging the mouse outside of the window. This means that if you are calling @'captureMouse'@ only to deal with this situation, you do not have to (although it is safe to do so). If this causes problems for your app, you can disable auto capture by setting the @SDL_HINT_MOUSE_AUTO_CAPTURE@ hint to zero.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGlobalMouseState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CaptureMouse@.
+--                   The safe flavor is 'captureMouseSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CaptureMouse@, defined at @SDL3\/SDL_mouse.h 538:34@
+captureMouse
+  :: Bool
+  -- ^
+  --
+  --           [@enabled@]: true to enable capturing, false to disable.
+  -> IO Bool
+captureMouse =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_CaptureMouse (CBool.fromBool x00))
+
+-- | Capture the mouse and to track input outside an SDL window.
+--
+--     Capturing enables your app to obtain mouse events globally, instead of just within your window. Not all video targets support this function. When capturing is enabled, the current window will get all mouse events, but unlike relative mode, no change is made to the cursor and it is not restrained to your window.
+--
+--     This function may also deny mouse input to other windows both those in your application and others on the system so you should use this function sparingly, and in small bursts. For example, you might want to track the mouse while the user is dragging something, until the user releases a mouse button. It is not recommended that you capture the mouse for long periods of time, such as the entire time your app is running. For that, you should probably use @'setWindowRelativeMouseMode'@ or 'SDL3.Sys.Video.setWindowMouseGrab', depending on your goals.
+--
+--     While captured, mouse events still report coordinates relative to the current (foreground) window, but those coordinates may be outside the bounds of the window (including negative values). Capturing is only allowed for the foreground window. If the window loses focus while capturing, the capture will be disabled automatically.
+--
+--     While capturing is enabled, the current window will have the @SDL_WINDOW_MOUSE_CAPTURE@ flag set.
+--
+--     Please note that SDL will attempt to \"auto capture\" the mouse while the user is pressing a button; this is to try and make mouse behavior more consistent between platforms, and deal with the common case of a user dragging the mouse outside of the window. This means that if you are calling @'captureMouse'@ only to deal with this situation, you do not have to (although it is safe to do so). If this causes problems for your app, you can disable auto capture by setting the @SDL_HINT_MOUSE_AUTO_CAPTURE@ hint to zero.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getGlobalMouseState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CaptureMouse@.
+--                   The unsafe flavor is 'captureMouse'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CaptureMouse@, defined at @SDL3\/SDL_mouse.h 538:34@
+captureMouseSafe
+  :: Bool
+  -- ^
+  --
+  --           [@enabled@]: true to enable capturing, false to disable.
+  -> IO Bool
+captureMouseSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_CaptureMouse (CBool.fromBool x00))
+
+-- | Create a cursor using the specified bitmap data and mask (in MSB format).
+--
+--     @mask@ has to be in MSB (Most Significant Bit) format.
+--
+--     The cursor width (@w@) must be a multiple of 8 bits.
+--
+--     The cursor is created in black and white according to the following:
+--
+--     * data=0, mask=1: white
+--
+--     * data=1, mask=1: black
+--
+--     * data=0, mask=0: transparent
+--
+--     * data=1, mask=0: inverted color if possible, black if not.
+--
+--     Cursors created with this function must be freed with @'destroyCursor'@.
+--
+--     If you want to have a color cursor, or create your cursor from an SDL_Surface, you should use @'createColorCursor'@. Alternately, you can hide the cursor and draw your own as part of your game\'s rendering, but it will be bound to the framerate.
+--
+--     Also, @'createSystemCursor'@ is available, which provides several readily-available system cursors to pick from.
+--
+--     [Returns]: a new cursor with the specified parameters on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createAnimatedCursor', 'createColorCursor', 'createSystemCursor', 'destroyCursor', 'setCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateCursor@.
+--                   The safe flavor is 'createCursorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateCursor@, defined at @SDL3\/SDL_mouse.h 585:42@
+createCursor
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@data@]: the color value for each pixel of the cursor.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@mask@]: the mask value for each pixel of the cursor.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the cursor.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the cursor.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_x@]: the x-axis offset from the left of the cursor image to the mouse x position, in the range of 0 to @w@ - 1.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_y@]: the y-axis offset from the top of the cursor image to the mouse y position, in the range of 0 to @h@ - 1.
+  -> IO (BG.Ptr SDL_Cursor)
+createCursor =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              Unsafe.sDL_CreateCursor
+                x00
+                x11
+                (Coerce.coerce x22)
+                (Coerce.coerce x33)
+                (Coerce.coerce x44)
+                (Coerce.coerce x55)
+
+-- | Create a cursor using the specified bitmap data and mask (in MSB format).
+--
+--     @mask@ has to be in MSB (Most Significant Bit) format.
+--
+--     The cursor width (@w@) must be a multiple of 8 bits.
+--
+--     The cursor is created in black and white according to the following:
+--
+--     * data=0, mask=1: white
+--
+--     * data=1, mask=1: black
+--
+--     * data=0, mask=0: transparent
+--
+--     * data=1, mask=0: inverted color if possible, black if not.
+--
+--     Cursors created with this function must be freed with @'destroyCursor'@.
+--
+--     If you want to have a color cursor, or create your cursor from an SDL_Surface, you should use @'createColorCursor'@. Alternately, you can hide the cursor and draw your own as part of your game\'s rendering, but it will be bound to the framerate.
+--
+--     Also, @'createSystemCursor'@ is available, which provides several readily-available system cursors to pick from.
+--
+--     [Returns]: a new cursor with the specified parameters on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createAnimatedCursor', 'createColorCursor', 'createSystemCursor', 'destroyCursor', 'setCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateCursor@.
+--                   The unsafe flavor is 'createCursor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateCursor@, defined at @SDL3\/SDL_mouse.h 585:42@
+createCursorSafe
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@data@]: the color value for each pixel of the cursor.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@mask@]: the mask value for each pixel of the cursor.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the cursor.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the cursor.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_x@]: the x-axis offset from the left of the cursor image to the mouse x position, in the range of 0 to @w@ - 1.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_y@]: the y-axis offset from the top of the cursor image to the mouse y position, in the range of 0 to @h@ - 1.
+  -> IO (BG.Ptr SDL_Cursor)
+createCursorSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              Safe.sDL_CreateCursor
+                x00
+                x11
+                (Coerce.coerce x22)
+                (Coerce.coerce x33)
+                (Coerce.coerce x44)
+                (Coerce.coerce x55)
+
+-- | Create a color cursor.
+--
+--     If this function is passed a surface with alternate representations added with 'SDL3.Sys.Surface.addSurfaceAlternateImage', the surface will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations if SDL_HINT_MOUSE_DPI_SCALE_CURSORS is enabled. For example, if the original surface is 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     [Returns]: the new cursor on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Surface.addSurfaceAlternateImage', 'createAnimatedCursor', 'createCursor', 'createSystemCursor', 'destroyCursor', 'setCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateColorCursor@.
+--                   The safe flavor is 'createColorCursorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateColorCursor@, defined at @SDL3\/SDL_mouse.h 622:42@
+createColorCursor
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: an SDL_Surface structure representing the cursor image.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_x@]: the x position of the cursor hot spot.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_y@]: the y position of the cursor hot spot.
+  -> IO (BG.Ptr SDL_Cursor)
+createColorCursor =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_CreateColorCursor x00 (Coerce.coerce x11) (Coerce.coerce x22)
+
+-- | Create a color cursor.
+--
+--     If this function is passed a surface with alternate representations added with 'SDL3.Sys.Surface.addSurfaceAlternateImage', the surface will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations if SDL_HINT_MOUSE_DPI_SCALE_CURSORS is enabled. For example, if the original surface is 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     [Returns]: the new cursor on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Surface.addSurfaceAlternateImage', 'createAnimatedCursor', 'createCursor', 'createSystemCursor', 'destroyCursor', 'setCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateColorCursor@.
+--                   The unsafe flavor is 'createColorCursor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateColorCursor@, defined at @SDL3\/SDL_mouse.h 622:42@
+createColorCursorSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: an SDL_Surface structure representing the cursor image.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_x@]: the x position of the cursor hot spot.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_y@]: the y position of the cursor hot spot.
+  -> IO (BG.Ptr SDL_Cursor)
+createColorCursorSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_CreateColorCursor x00 (Coerce.coerce x11) (Coerce.coerce x22)
+
+-- | Create an animated color cursor.
+--
+--     Animated cursors are composed of a sequential array of frames, specified as surfaces and durations in an array of 'SDL_CursorFrameInfo' structs. The hot spot coordinates are universal to all frames, and all frames must have the same dimensions.
+--
+--     Frame durations are specified in milliseconds. A duration of 0 implies an infinite frame time, and the animation will stop on that frame. To create a one-shot animation, set the duration of the last frame in the sequence to 0.
+--
+--     If this function is passed surfaces with alternate representations added with 'SDL3.Sys.Surface.addSurfaceAlternateImage', the surfaces will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations. For example, if the original surfaces are 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     If the underlying platform does not support animated cursors, this function will fall back to creating a static color cursor using the first frame in the sequence.
+--
+--     [Returns]: the new cursor on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'SDL3.Sys.Surface.addSurfaceAlternateImage', 'createCursor', 'createColorCursor', 'createSystemCursor', 'destroyCursor', 'setCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateAnimatedCursor@.
+--                   The safe flavor is 'createAnimatedCursorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateAnimatedCursor@, defined at @SDL3\/SDL_mouse.h 672:41@
+createAnimatedCursor
+  :: BG.Ptr SDL_CursorFrameInfo
+  -- ^
+  --
+  --           [@frames@]: an array of cursor images composing the animation.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@frame_count@]: the number of frames in the sequence.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_x@]: the x position of the cursor hot spot.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_y@]: the y position of the cursor hot spot.
+  -> IO (BG.Ptr SDL_Cursor)
+createAnimatedCursor =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_CreateAnimatedCursor x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33)
+
+-- | Create an animated color cursor.
+--
+--     Animated cursors are composed of a sequential array of frames, specified as surfaces and durations in an array of 'SDL_CursorFrameInfo' structs. The hot spot coordinates are universal to all frames, and all frames must have the same dimensions.
+--
+--     Frame durations are specified in milliseconds. A duration of 0 implies an infinite frame time, and the animation will stop on that frame. To create a one-shot animation, set the duration of the last frame in the sequence to 0.
+--
+--     If this function is passed surfaces with alternate representations added with 'SDL3.Sys.Surface.addSurfaceAlternateImage', the surfaces will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations. For example, if the original surfaces are 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     If the underlying platform does not support animated cursors, this function will fall back to creating a static color cursor using the first frame in the sequence.
+--
+--     [Returns]: the new cursor on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'SDL3.Sys.Surface.addSurfaceAlternateImage', 'createCursor', 'createColorCursor', 'createSystemCursor', 'destroyCursor', 'setCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateAnimatedCursor@.
+--                   The unsafe flavor is 'createAnimatedCursor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateAnimatedCursor@, defined at @SDL3\/SDL_mouse.h 672:41@
+createAnimatedCursorSafe
+  :: BG.Ptr SDL_CursorFrameInfo
+  -- ^
+  --
+  --           [@frames@]: an array of cursor images composing the animation.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@frame_count@]: the number of frames in the sequence.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_x@]: the x position of the cursor hot spot.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@hot_y@]: the y position of the cursor hot spot.
+  -> IO (BG.Ptr SDL_Cursor)
+createAnimatedCursorSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_CreateAnimatedCursor x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33)
+
+-- | Create a system cursor.
+--
+--     [Returns]: a cursor on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateSystemCursor@.
+--                   The safe flavor is 'createSystemCursorSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateSystemCursor@, defined at @SDL3\/SDL_mouse.h 690:42@
+createSystemCursor
+  :: SDL_SystemCursor
+  -- ^
+  --
+  --           [@id@]: an 'SDL_SystemCursor' enum value.
+  -> IO (BG.Ptr SDL_Cursor)
+createSystemCursor = Unsafe.sDL_CreateSystemCursor
+
+-- | Create a system cursor.
+--
+--     [Returns]: a cursor on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateSystemCursor@.
+--                   The unsafe flavor is 'createSystemCursor'
+--                   .
+--
+--     [C declaration]: @SDL_CreateSystemCursor@, defined at @SDL3\/SDL_mouse.h 690:42@
+createSystemCursorSafe
+  :: SDL_SystemCursor
+  -- ^
+  --
+  --           [@id@]: an 'SDL_SystemCursor' enum value.
+  -> IO (BG.Ptr SDL_Cursor)
+createSystemCursorSafe = Safe.sDL_CreateSystemCursor
+
+-- | Set the active cursor.
+--
+--     This function sets the currently active cursor to the specified one. If the cursor is currently visible, the change will be immediately represented on the display. SDL_SetCursor(NULL) can be used to force cursor redraw, if this is desired for any reason.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetCursor@.
+--                   The safe flavor is 'setCursorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetCursor@, defined at @SDL3\/SDL_mouse.h 710:34@
+setCursor
+  :: BG.Ptr SDL_Cursor
+  -- ^
+  --
+  --           [@cursor@]: a cursor to make active.
+  -> IO Bool
+setCursor =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_SetCursor x00)
+
+-- | Set the active cursor.
+--
+--     This function sets the currently active cursor to the specified one. If the cursor is currently visible, the change will be immediately represented on the display. SDL_SetCursor(NULL) can be used to force cursor redraw, if this is desired for any reason.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetCursor@.
+--                   The unsafe flavor is 'setCursor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetCursor@, defined at @SDL3\/SDL_mouse.h 710:34@
+setCursorSafe
+  :: BG.Ptr SDL_Cursor
+  -- ^
+  --
+  --           [@cursor@]: a cursor to make active.
+  -> IO Bool
+setCursorSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_SetCursor x00)
+
+-- | Get the active cursor.
+--
+--     This function returns a pointer to the current cursor which is owned by the library. It is not necessary to free the cursor with @'destroyCursor'@.
+--
+--     [Returns]: the active cursor or NULL if there is no mouse.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCursor@.
+--                   The safe flavor is 'getCursorSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCursor@, defined at @SDL3\/SDL_mouse.h 726:42@
+getCursor :: IO (BG.Ptr SDL_Cursor)
+getCursor = Unsafe.sDL_GetCursor
+
+-- | Get the active cursor.
+--
+--     This function returns a pointer to the current cursor which is owned by the library. It is not necessary to free the cursor with @'destroyCursor'@.
+--
+--     [Returns]: the active cursor or NULL if there is no mouse.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCursor@.
+--                   The unsafe flavor is 'getCursor'
+--                   .
+--
+--     [C declaration]: @SDL_GetCursor@, defined at @SDL3\/SDL_mouse.h 726:42@
+getCursorSafe :: IO (BG.Ptr SDL_Cursor)
+getCursorSafe = Safe.sDL_GetCursor
+
+-- | Get the default cursor.
+--
+--     You do not have to call @'destroyCursor'@ on the return value, but it is safe to do so.
+--
+--     [Returns]: the default cursor on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDefaultCursor@.
+--                   The safe flavor is 'getDefaultCursorSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetDefaultCursor@, defined at @SDL3\/SDL_mouse.h 741:42@
+getDefaultCursor :: IO (BG.Ptr SDL_Cursor)
+getDefaultCursor = Unsafe.sDL_GetDefaultCursor
+
+-- | Get the default cursor.
+--
+--     You do not have to call @'destroyCursor'@ on the return value, but it is safe to do so.
+--
+--     [Returns]: the default cursor on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDefaultCursor@.
+--                   The unsafe flavor is 'getDefaultCursor'
+--                   .
+--
+--     [C declaration]: @SDL_GetDefaultCursor@, defined at @SDL3\/SDL_mouse.h 741:42@
+getDefaultCursorSafe :: IO (BG.Ptr SDL_Cursor)
+getDefaultCursorSafe = Safe.sDL_GetDefaultCursor
+
+-- | Free a previously-created cursor.
+--
+--     Use this function to free cursor resources created with @'createCursor'@, @'createColorCursor'@ or @'createSystemCursor'@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createAnimatedCursor', 'createColorCursor', 'createCursor', 'createSystemCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyCursor@.
+--                   The safe flavor is 'destroyCursorSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyCursor@, defined at @SDL3\/SDL_mouse.h 760:34@
+destroyCursor
+  :: BG.Ptr SDL_Cursor
+  -- ^
+  --
+  --           [@cursor@]: the cursor to free.
+  -> IO ()
+destroyCursor = Unsafe.sDL_DestroyCursor
+
+-- | Free a previously-created cursor.
+--
+--     Use this function to free cursor resources created with @'createCursor'@, @'createColorCursor'@ or @'createSystemCursor'@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createAnimatedCursor', 'createColorCursor', 'createCursor', 'createSystemCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyCursor@.
+--                   The unsafe flavor is 'destroyCursor'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyCursor@, defined at @SDL3\/SDL_mouse.h 760:34@
+destroyCursorSafe
+  :: BG.Ptr SDL_Cursor
+  -- ^
+  --
+  --           [@cursor@]: the cursor to free.
+  -> IO ()
+destroyCursorSafe = Safe.sDL_DestroyCursor
+
+-- | Show the cursor.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'cursorVisible', 'hideCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ShowCursor@.
+--                   The safe flavor is 'showCursorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowCursor@, defined at @SDL3\/SDL_mouse.h 775:34@
+showCursor :: IO Bool
+showCursor = fmap CBool.toBool Unsafe.sDL_ShowCursor
+
+-- | Show the cursor.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'cursorVisible', 'hideCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShowCursor@.
+--                   The unsafe flavor is 'showCursor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowCursor@, defined at @SDL3\/SDL_mouse.h 775:34@
+showCursorSafe :: IO Bool
+showCursorSafe =
+  fmap CBool.toBool Safe.sDL_ShowCursor
+
+-- | Hide the cursor.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'cursorVisible', 'showCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HideCursor@.
+--                   The safe flavor is 'hideCursorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HideCursor@, defined at @SDL3\/SDL_mouse.h 790:34@
+hideCursor :: IO Bool
+hideCursor = fmap CBool.toBool Unsafe.sDL_HideCursor
+
+-- | Hide the cursor.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'cursorVisible', 'showCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HideCursor@.
+--                   The unsafe flavor is 'hideCursor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HideCursor@, defined at @SDL3\/SDL_mouse.h 790:34@
+hideCursorSafe :: IO Bool
+hideCursorSafe =
+  fmap CBool.toBool Safe.sDL_HideCursor
+
+-- | Return whether the cursor is currently being shown.
+--
+--     [Returns]: @true@ if the cursor is being shown, or @false@ if the cursor is hidden.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hideCursor', 'showCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CursorVisible@.
+--                   The safe flavor is 'cursorVisibleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CursorVisible@, defined at @SDL3\/SDL_mouse.h 805:34@
+cursorVisible :: IO Bool
+cursorVisible =
+  fmap CBool.toBool Unsafe.sDL_CursorVisible
+
+-- | Return whether the cursor is currently being shown.
+--
+--     [Returns]: @true@ if the cursor is being shown, or @false@ if the cursor is hidden.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hideCursor', 'showCursor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CursorVisible@.
+--                   The unsafe flavor is 'cursorVisible'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CursorVisible@, defined at @SDL3\/SDL_mouse.h 805:34@
+cursorVisibleSafe :: IO Bool
+cursorVisibleSafe =
+  fmap CBool.toBool Safe.sDL_CursorVisible
+
+-- | Typed constant for macro @SDL_BUTTON_LMASK@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_BUTTON_LMASK :: SDL_MouseButtonFlags
+pattern SDL_BUTTON_LMASK = SDL_MouseButtonFlags 0x00000001
+
+-- | Typed constant for macro @SDL_BUTTON_MMASK@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_BUTTON_MMASK :: SDL_MouseButtonFlags
+pattern SDL_BUTTON_MMASK = SDL_MouseButtonFlags 0x00000002
+
+-- | Typed constant for macro @SDL_BUTTON_RMASK@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_BUTTON_RMASK :: SDL_MouseButtonFlags
+pattern SDL_BUTTON_RMASK = SDL_MouseButtonFlags 0x00000004
+
+-- | Typed constant for macro @SDL_BUTTON_X1MASK@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_BUTTON_X1MASK :: SDL_MouseButtonFlags
+pattern SDL_BUTTON_X1MASK = SDL_MouseButtonFlags 0x00000008
+
+-- | Typed constant for macro @SDL_BUTTON_X2MASK@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_BUTTON_X2MASK :: SDL_MouseButtonFlags
+pattern SDL_BUTTON_X2MASK = SDL_MouseButtonFlags 0x00000010
diff --git a/src/SDL3/Sys/Mutex.hs b/src/SDL3/Sys/Mutex.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Mutex.hs
@@ -0,0 +1,1760 @@
+-- | Thread synchronization primitives: mutexes, semaphores, condition variables, and read\/write locks.
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Mutex.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Mutex (
+  module SDL3.Sys.Bindgen.Mutex,
+
+  -- * Function aliases
+  SDL3.Sys.Mutex.createMutex,
+  SDL3.Sys.Mutex.createMutexSafe,
+  SDL3.Sys.Mutex.lockMutex,
+  SDL3.Sys.Mutex.lockMutexSafe,
+  SDL3.Sys.Mutex.tryLockMutex,
+  SDL3.Sys.Mutex.tryLockMutexSafe,
+  SDL3.Sys.Mutex.unlockMutex,
+  SDL3.Sys.Mutex.unlockMutexSafe,
+  SDL3.Sys.Mutex.destroyMutex,
+  SDL3.Sys.Mutex.destroyMutexSafe,
+  SDL3.Sys.Mutex.createRWLock,
+  SDL3.Sys.Mutex.createRWLockSafe,
+  SDL3.Sys.Mutex.lockRWLockForReading,
+  SDL3.Sys.Mutex.lockRWLockForReadingSafe,
+  SDL3.Sys.Mutex.lockRWLockForWriting,
+  SDL3.Sys.Mutex.lockRWLockForWritingSafe,
+  SDL3.Sys.Mutex.tryLockRWLockForReading,
+  SDL3.Sys.Mutex.tryLockRWLockForReadingSafe,
+  SDL3.Sys.Mutex.tryLockRWLockForWriting,
+  SDL3.Sys.Mutex.tryLockRWLockForWritingSafe,
+  SDL3.Sys.Mutex.unlockRWLock,
+  SDL3.Sys.Mutex.unlockRWLockSafe,
+  SDL3.Sys.Mutex.destroyRWLock,
+  SDL3.Sys.Mutex.destroyRWLockSafe,
+  SDL3.Sys.Mutex.createSemaphore,
+  SDL3.Sys.Mutex.createSemaphoreSafe,
+  SDL3.Sys.Mutex.destroySemaphore,
+  SDL3.Sys.Mutex.destroySemaphoreSafe,
+  SDL3.Sys.Mutex.waitSemaphore,
+  SDL3.Sys.Mutex.waitSemaphoreSafe,
+  SDL3.Sys.Mutex.tryWaitSemaphore,
+  SDL3.Sys.Mutex.tryWaitSemaphoreSafe,
+  SDL3.Sys.Mutex.waitSemaphoreTimeout,
+  SDL3.Sys.Mutex.waitSemaphoreTimeoutSafe,
+  SDL3.Sys.Mutex.signalSemaphore,
+  SDL3.Sys.Mutex.signalSemaphoreSafe,
+  SDL3.Sys.Mutex.getSemaphoreValue,
+  SDL3.Sys.Mutex.getSemaphoreValueSafe,
+  SDL3.Sys.Mutex.createCondition,
+  SDL3.Sys.Mutex.createConditionSafe,
+  SDL3.Sys.Mutex.destroyCondition,
+  SDL3.Sys.Mutex.destroyConditionSafe,
+  SDL3.Sys.Mutex.signalCondition,
+  SDL3.Sys.Mutex.signalConditionSafe,
+  SDL3.Sys.Mutex.broadcastCondition,
+  SDL3.Sys.Mutex.broadcastConditionSafe,
+  SDL3.Sys.Mutex.waitCondition,
+  SDL3.Sys.Mutex.waitConditionSafe,
+  SDL3.Sys.Mutex.waitConditionTimeout,
+  SDL3.Sys.Mutex.waitConditionTimeoutSafe,
+  SDL3.Sys.Mutex.shouldInit,
+  SDL3.Sys.Mutex.shouldInitSafe,
+  SDL3.Sys.Mutex.shouldQuit,
+  SDL3.Sys.Mutex.shouldQuitSafe,
+  SDL3.Sys.Mutex.setInitialized,
+  SDL3.Sys.Mutex.setInitializedSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Mutex
+import SDL3.Sys.Bindgen.Mutex.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Mutex.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Create a new mutex.
+--
+--     All newly-created mutexes begin in the /unlocked/ state.
+--
+--     Calls to @'lockMutex'@ will not return while the mutex is locked by another thread. See @'tryLockMutex'@ to attempt to lock without blocking.
+--
+--     SDL mutexes are reentrant.
+--
+--     [Returns]: the initialized and unlocked mutex or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyMutex', 'lockMutex', 'tryLockMutex', 'unlockMutex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateMutex@.
+--                   The safe flavor is 'createMutexSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateMutex@, defined at @SDL3\/SDL_mutex.h 320:41@
+createMutex :: IO (BG.Ptr SDL_Mutex)
+createMutex = Unsafe.sDL_CreateMutex
+
+-- | Create a new mutex.
+--
+--     All newly-created mutexes begin in the /unlocked/ state.
+--
+--     Calls to @'lockMutex'@ will not return while the mutex is locked by another thread. See @'tryLockMutex'@ to attempt to lock without blocking.
+--
+--     SDL mutexes are reentrant.
+--
+--     [Returns]: the initialized and unlocked mutex or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyMutex', 'lockMutex', 'tryLockMutex', 'unlockMutex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateMutex@.
+--                   The unsafe flavor is 'createMutex'
+--                   .
+--
+--     [C declaration]: @SDL_CreateMutex@, defined at @SDL3\/SDL_mutex.h 320:41@
+createMutexSafe :: IO (BG.Ptr SDL_Mutex)
+createMutexSafe = Safe.sDL_CreateMutex
+
+-- | Lock the mutex.
+--
+--     This will block until the mutex is available, which is to say it is in the unlocked state and the OS has chosen the caller as the next thread to lock it. Of all threads waiting to lock the mutex, only one may do so at a time.
+--
+--     It is legal for the owning thread to lock an already-locked mutex. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive mutex\").
+--
+--     This function does not fail; if mutex is NULL, it will return immediately having locked nothing. If the mutex is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'tryLockMutex', 'unlockMutex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LockMutex@.
+--                   The safe flavor is 'lockMutexSafe'
+--                   : blocks on contention.
+--
+--     [C declaration]: @SDL_LockMutex@, defined at @SDL3\/SDL_mutex.h 346:34@
+lockMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to lock.
+  -> IO ()
+lockMutex = Unsafe.sDL_LockMutex
+
+-- | Lock the mutex.
+--
+--     This will block until the mutex is available, which is to say it is in the unlocked state and the OS has chosen the caller as the next thread to lock it. Of all threads waiting to lock the mutex, only one may do so at a time.
+--
+--     It is legal for the owning thread to lock an already-locked mutex. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive mutex\").
+--
+--     This function does not fail; if mutex is NULL, it will return immediately having locked nothing. If the mutex is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'tryLockMutex', 'unlockMutex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LockMutex@.
+--                   The unsafe flavor is 'lockMutex'
+--                   : blocks on contention.
+--
+--     [C declaration]: @SDL_LockMutex@, defined at @SDL3\/SDL_mutex.h 346:34@
+lockMutexSafe
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to lock.
+  -> IO ()
+lockMutexSafe = Safe.sDL_LockMutex
+
+-- | Try to lock a mutex without blocking.
+--
+--     This works just like @'lockMutex'@, but if the mutex is not available, this function returns false immediately.
+--
+--     This technique is useful if you need exclusive access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     This function returns true if passed a NULL mutex.
+--
+--     [Returns]: true on success, false if the mutex would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockMutex', 'unlockMutex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_TryLockMutex@.
+--                   The safe flavor is 'tryLockMutexSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TryLockMutex@, defined at @SDL3\/SDL_mutex.h 369:34@
+tryLockMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to try to lock.
+  -> IO Bool
+tryLockMutex =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_TryLockMutex x00)
+
+-- | Try to lock a mutex without blocking.
+--
+--     This works just like @'lockMutex'@, but if the mutex is not available, this function returns false immediately.
+--
+--     This technique is useful if you need exclusive access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     This function returns true if passed a NULL mutex.
+--
+--     [Returns]: true on success, false if the mutex would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockMutex', 'unlockMutex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_TryLockMutex@.
+--                   The unsafe flavor is 'tryLockMutex'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TryLockMutex@, defined at @SDL3\/SDL_mutex.h 369:34@
+tryLockMutexSafe
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to try to lock.
+  -> IO Bool
+tryLockMutexSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_TryLockMutex x00)
+
+-- | Unlock the mutex.
+--
+--     It is legal for the owning thread to lock an already-locked mutex. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive mutex\").
+--
+--     It is illegal to unlock a mutex that has not been locked by the current thread, and doing so results in undefined behavior.
+--
+--     [Thread safety]: This call must be paired with a previous locking call on the same thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockMutex', 'tryLockMutex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnlockMutex@.
+--                   The safe flavor is 'unlockMutexSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockMutex@, defined at @SDL3\/SDL_mutex.h 390:34@
+unlockMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to unlock.
+  -> IO ()
+unlockMutex = Unsafe.sDL_UnlockMutex
+
+-- | Unlock the mutex.
+--
+--     It is legal for the owning thread to lock an already-locked mutex. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive mutex\").
+--
+--     It is illegal to unlock a mutex that has not been locked by the current thread, and doing so results in undefined behavior.
+--
+--     [Thread safety]: This call must be paired with a previous locking call on the same thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockMutex', 'tryLockMutex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnlockMutex@.
+--                   The unsafe flavor is 'unlockMutex'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockMutex@, defined at @SDL3\/SDL_mutex.h 390:34@
+unlockMutexSafe
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to unlock.
+  -> IO ()
+unlockMutexSafe = Safe.sDL_UnlockMutex
+
+-- | Destroy a mutex created with @'createMutex'@.
+--
+--     This function must be called on any mutex that is no longer needed. Failure to destroy a mutex will result in a system memory or resource leak. While it is safe to destroy a mutex that is /unlocked/, it is not safe to attempt to destroy a locked mutex, and may result in undefined behavior depending on the platform.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createMutex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyMutex@.
+--                   The safe flavor is 'destroyMutexSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyMutex@, defined at @SDL3\/SDL_mutex.h 409:34@
+destroyMutex
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to destroy.
+  -> IO ()
+destroyMutex = Unsafe.sDL_DestroyMutex
+
+-- | Destroy a mutex created with @'createMutex'@.
+--
+--     This function must be called on any mutex that is no longer needed. Failure to destroy a mutex will result in a system memory or resource leak. While it is safe to destroy a mutex that is /unlocked/, it is not safe to attempt to destroy a locked mutex, and may result in undefined behavior depending on the platform.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createMutex'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyMutex@.
+--                   The unsafe flavor is 'destroyMutex'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyMutex@, defined at @SDL3\/SDL_mutex.h 409:34@
+destroyMutexSafe
+  :: BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex to destroy.
+  -> IO ()
+destroyMutexSafe = Safe.sDL_DestroyMutex
+
+-- | Create a new read\/write lock.
+--
+--     A read\/write lock is useful for situations where you have multiple threads trying to access a resource that is rarely updated. All threads requesting a read-only lock will be allowed to run in parallel; if a thread requests a write lock, it will be provided exclusive access. This makes it safe for multiple threads to use a resource at the same time if they promise not to change it, and when it has to be changed, the rwlock will serve as a gateway to make sure those changes can be made safely.
+--
+--     In the right situation, a rwlock can be more efficient than a mutex, which only lets a single thread proceed at a time, even if it won\'t be modifying the data.
+--
+--     All newly-created read\/write locks begin in the /unlocked/ state.
+--
+--     Calls to @'lockRWLockForReading'@ and 'lockRWLockForWriting' will not return while the rwlock is locked /for writing/ by another thread. See @'tryLockRWLockForReading'@ and @'tryLockRWLockForWriting'@ to attempt to lock without blocking.
+--
+--     SDL read\/write locks are only recursive for read-only locks! They are not guaranteed to be fair, or provide access in a FIFO manner! They are not guaranteed to favor writers. You may not lock a rwlock for both read-only and write access at the same time from the same thread (so you can\'t promote your read-only lock to a write lock without unlocking first).
+--
+--     [Returns]: the initialized and unlocked read\/write lock or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyRWLock', 'lockRWLockForReading', 'lockRWLockForWriting', 'tryLockRWLockForReading', 'tryLockRWLockForWriting', 'unlockRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateRWLock@.
+--                   The safe flavor is 'createRWLockSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateRWLock@, defined at @SDL3\/SDL_mutex.h 481:42@
+createRWLock :: IO (BG.Ptr SDL_RWLock)
+createRWLock = Unsafe.sDL_CreateRWLock
+
+-- | Create a new read\/write lock.
+--
+--     A read\/write lock is useful for situations where you have multiple threads trying to access a resource that is rarely updated. All threads requesting a read-only lock will be allowed to run in parallel; if a thread requests a write lock, it will be provided exclusive access. This makes it safe for multiple threads to use a resource at the same time if they promise not to change it, and when it has to be changed, the rwlock will serve as a gateway to make sure those changes can be made safely.
+--
+--     In the right situation, a rwlock can be more efficient than a mutex, which only lets a single thread proceed at a time, even if it won\'t be modifying the data.
+--
+--     All newly-created read\/write locks begin in the /unlocked/ state.
+--
+--     Calls to @'lockRWLockForReading'@ and 'lockRWLockForWriting' will not return while the rwlock is locked /for writing/ by another thread. See @'tryLockRWLockForReading'@ and @'tryLockRWLockForWriting'@ to attempt to lock without blocking.
+--
+--     SDL read\/write locks are only recursive for read-only locks! They are not guaranteed to be fair, or provide access in a FIFO manner! They are not guaranteed to favor writers. You may not lock a rwlock for both read-only and write access at the same time from the same thread (so you can\'t promote your read-only lock to a write lock without unlocking first).
+--
+--     [Returns]: the initialized and unlocked read\/write lock or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyRWLock', 'lockRWLockForReading', 'lockRWLockForWriting', 'tryLockRWLockForReading', 'tryLockRWLockForWriting', 'unlockRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateRWLock@.
+--                   The unsafe flavor is 'createRWLock'
+--                   .
+--
+--     [C declaration]: @SDL_CreateRWLock@, defined at @SDL3\/SDL_mutex.h 481:42@
+createRWLockSafe :: IO (BG.Ptr SDL_RWLock)
+createRWLockSafe = Safe.sDL_CreateRWLock
+
+-- | Lock the read\/write lock for /read only/ operations.
+--
+--     This will block until the rwlock is available, which is to say it is not locked for writing by any other thread. Of all threads waiting to lock the rwlock, all may do so at the same time as long as they are requesting read-only access; if a thread wants to lock for writing, only one may do so at a time, and no other threads, read-only or not, may hold the lock at the same time.
+--
+--     It is legal for the owning thread to lock an already-locked rwlock for reading. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive rwlock\").
+--
+--     Note that locking for writing is not recursive (this is only available to read-only locks).
+--
+--     It is illegal to request a read-only lock from a thread that already holds the write lock. Doing so results in undefined behavior. Unlock the write lock before requesting a read-only lock. (But, of course, if you have the write lock, you don\'t need further locks to read in any case.)
+--
+--     This function does not fail; if rwlock is NULL, it will return immediately having locked nothing. If the rwlock is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockRWLockForWriting', 'tryLockRWLockForReading', 'unlockRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LockRWLockForReading@.
+--                   The safe flavor is 'lockRWLockForReadingSafe'
+--                   : blocks on contention.
+--
+--     [C declaration]: @SDL_LockRWLockForReading@, defined at @SDL3\/SDL_mutex.h 520:34@
+lockRWLockForReading
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the read\/write lock to lock.
+  -> IO ()
+lockRWLockForReading =
+  Unsafe.sDL_LockRWLockForReading
+
+-- | Lock the read\/write lock for /read only/ operations.
+--
+--     This will block until the rwlock is available, which is to say it is not locked for writing by any other thread. Of all threads waiting to lock the rwlock, all may do so at the same time as long as they are requesting read-only access; if a thread wants to lock for writing, only one may do so at a time, and no other threads, read-only or not, may hold the lock at the same time.
+--
+--     It is legal for the owning thread to lock an already-locked rwlock for reading. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive rwlock\").
+--
+--     Note that locking for writing is not recursive (this is only available to read-only locks).
+--
+--     It is illegal to request a read-only lock from a thread that already holds the write lock. Doing so results in undefined behavior. Unlock the write lock before requesting a read-only lock. (But, of course, if you have the write lock, you don\'t need further locks to read in any case.)
+--
+--     This function does not fail; if rwlock is NULL, it will return immediately having locked nothing. If the rwlock is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockRWLockForWriting', 'tryLockRWLockForReading', 'unlockRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LockRWLockForReading@.
+--                   The unsafe flavor is 'lockRWLockForReading'
+--                   : blocks on contention.
+--
+--     [C declaration]: @SDL_LockRWLockForReading@, defined at @SDL3\/SDL_mutex.h 520:34@
+lockRWLockForReadingSafe
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the read\/write lock to lock.
+  -> IO ()
+lockRWLockForReadingSafe =
+  Safe.sDL_LockRWLockForReading
+
+-- | Lock the read\/write lock for /write/ operations.
+--
+--     This will block until the rwlock is available, which is to say it is not locked for reading or writing by any other thread. Only one thread may hold the lock when it requests write access; all other threads, whether they also want to write or only want read-only access, must wait until the writer thread has released the lock.
+--
+--     It is illegal for the owning thread to lock an already-locked rwlock for writing (read-only may be locked recursively, writing can not). Doing so results in undefined behavior.
+--
+--     It is illegal to request a write lock from a thread that already holds a read-only lock. Doing so results in undefined behavior. Unlock the read-only lock before requesting a write lock.
+--
+--     This function does not fail; if rwlock is NULL, it will return immediately having locked nothing. If the rwlock is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockRWLockForReading', 'tryLockRWLockForWriting', 'unlockRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LockRWLockForWriting@.
+--                   The safe flavor is 'lockRWLockForWritingSafe'
+--                   : blocks on contention.
+--
+--     [C declaration]: @SDL_LockRWLockForWriting@, defined at @SDL3\/SDL_mutex.h 553:34@
+lockRWLockForWriting
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the read\/write lock to lock.
+  -> IO ()
+lockRWLockForWriting =
+  Unsafe.sDL_LockRWLockForWriting
+
+-- | Lock the read\/write lock for /write/ operations.
+--
+--     This will block until the rwlock is available, which is to say it is not locked for reading or writing by any other thread. Only one thread may hold the lock when it requests write access; all other threads, whether they also want to write or only want read-only access, must wait until the writer thread has released the lock.
+--
+--     It is illegal for the owning thread to lock an already-locked rwlock for writing (read-only may be locked recursively, writing can not). Doing so results in undefined behavior.
+--
+--     It is illegal to request a write lock from a thread that already holds a read-only lock. Doing so results in undefined behavior. Unlock the read-only lock before requesting a write lock.
+--
+--     This function does not fail; if rwlock is NULL, it will return immediately having locked nothing. If the rwlock is valid, this function will always block until it can lock the mutex, and return with it locked.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockRWLockForReading', 'tryLockRWLockForWriting', 'unlockRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LockRWLockForWriting@.
+--                   The unsafe flavor is 'lockRWLockForWriting'
+--                   : blocks on contention.
+--
+--     [C declaration]: @SDL_LockRWLockForWriting@, defined at @SDL3\/SDL_mutex.h 553:34@
+lockRWLockForWritingSafe
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the read\/write lock to lock.
+  -> IO ()
+lockRWLockForWritingSafe =
+  Safe.sDL_LockRWLockForWriting
+
+-- | Try to lock a read\/write lock /for reading/ without blocking.
+--
+--     This works just like @'lockRWLockForReading'@, but if the rwlock is not available, then this function returns false immediately.
+--
+--     This technique is useful if you need access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     Trying to lock for read-only access can succeed if other threads are holding read-only locks, as this won\'t prevent access.
+--
+--     This function returns true if passed a NULL rwlock.
+--
+--     [Returns]: true on success, false if the lock would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockRWLockForReading', 'tryLockRWLockForWriting', 'unlockRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_TryLockRWLockForReading@.
+--                   The safe flavor is 'tryLockRWLockForReadingSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TryLockRWLockForReading@, defined at @SDL3\/SDL_mutex.h 580:34@
+tryLockRWLockForReading
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to try to lock.
+  -> IO Bool
+tryLockRWLockForReading =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_TryLockRWLockForReading x00)
+
+-- | Try to lock a read\/write lock /for reading/ without blocking.
+--
+--     This works just like @'lockRWLockForReading'@, but if the rwlock is not available, then this function returns false immediately.
+--
+--     This technique is useful if you need access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     Trying to lock for read-only access can succeed if other threads are holding read-only locks, as this won\'t prevent access.
+--
+--     This function returns true if passed a NULL rwlock.
+--
+--     [Returns]: true on success, false if the lock would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockRWLockForReading', 'tryLockRWLockForWriting', 'unlockRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_TryLockRWLockForReading@.
+--                   The unsafe flavor is 'tryLockRWLockForReading'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TryLockRWLockForReading@, defined at @SDL3\/SDL_mutex.h 580:34@
+tryLockRWLockForReadingSafe
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to try to lock.
+  -> IO Bool
+tryLockRWLockForReadingSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_TryLockRWLockForReading x00)
+
+-- | Try to lock a read\/write lock /for writing/ without blocking.
+--
+--     This works just like @'lockRWLockForWriting'@, but if the rwlock is not available, then this function returns false immediately.
+--
+--     This technique is useful if you need exclusive access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     It is illegal for the owning thread to lock an already-locked rwlock for writing (read-only may be locked recursively, writing can not). Doing so results in undefined behavior.
+--
+--     It is illegal to request a write lock from a thread that already holds a read-only lock. Doing so results in undefined behavior. Unlock the read-only lock before requesting a write lock.
+--
+--     This function returns true if passed a NULL rwlock.
+--
+--     [Returns]: true on success, false if the lock would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockRWLockForWriting', 'tryLockRWLockForReading', 'unlockRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_TryLockRWLockForWriting@.
+--                   The safe flavor is 'tryLockRWLockForWritingSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TryLockRWLockForWriting@, defined at @SDL3\/SDL_mutex.h 612:34@
+tryLockRWLockForWriting
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to try to lock.
+  -> IO Bool
+tryLockRWLockForWriting =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_TryLockRWLockForWriting x00)
+
+-- | Try to lock a read\/write lock /for writing/ without blocking.
+--
+--     This works just like @'lockRWLockForWriting'@, but if the rwlock is not available, then this function returns false immediately.
+--
+--     This technique is useful if you need exclusive access to a resource but don\'t want to wait for it, and will return to it to try again later.
+--
+--     It is illegal for the owning thread to lock an already-locked rwlock for writing (read-only may be locked recursively, writing can not). Doing so results in undefined behavior.
+--
+--     It is illegal to request a write lock from a thread that already holds a read-only lock. Doing so results in undefined behavior. Unlock the read-only lock before requesting a write lock.
+--
+--     This function returns true if passed a NULL rwlock.
+--
+--     [Returns]: true on success, false if the lock would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockRWLockForWriting', 'tryLockRWLockForReading', 'unlockRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_TryLockRWLockForWriting@.
+--                   The unsafe flavor is 'tryLockRWLockForWriting'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TryLockRWLockForWriting@, defined at @SDL3\/SDL_mutex.h 612:34@
+tryLockRWLockForWritingSafe
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to try to lock.
+  -> IO Bool
+tryLockRWLockForWritingSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_TryLockRWLockForWriting x00)
+
+-- | Unlock the read\/write lock.
+--
+--     Use this function to unlock the rwlock, whether it was locked for read-only or write operations.
+--
+--     It is legal for the owning thread to lock an already-locked read-only lock. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive rwlock\").
+--
+--     It is illegal to unlock a rwlock that has not been locked by the current thread, and doing so results in undefined behavior.
+--
+--     [Thread safety]: This call must be paired with a previous locking call on the same thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockRWLockForReading', 'lockRWLockForWriting', 'tryLockRWLockForReading', 'tryLockRWLockForWriting'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnlockRWLock@.
+--                   The safe flavor is 'unlockRWLockSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockRWLock@, defined at @SDL3\/SDL_mutex.h 639:34@
+unlockRWLock
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to unlock.
+  -> IO ()
+unlockRWLock = Unsafe.sDL_UnlockRWLock
+
+-- | Unlock the read\/write lock.
+--
+--     Use this function to unlock the rwlock, whether it was locked for read-only or write operations.
+--
+--     It is legal for the owning thread to lock an already-locked read-only lock. It must unlock it the same number of times before it is actually made available for other threads in the system (this is known as a \"recursive rwlock\").
+--
+--     It is illegal to unlock a rwlock that has not been locked by the current thread, and doing so results in undefined behavior.
+--
+--     [Thread safety]: This call must be paired with a previous locking call on the same thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockRWLockForReading', 'lockRWLockForWriting', 'tryLockRWLockForReading', 'tryLockRWLockForWriting'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnlockRWLock@.
+--                   The unsafe flavor is 'unlockRWLock'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockRWLock@, defined at @SDL3\/SDL_mutex.h 639:34@
+unlockRWLockSafe
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to unlock.
+  -> IO ()
+unlockRWLockSafe = Safe.sDL_UnlockRWLock
+
+-- | Destroy a read\/write lock created with @'createRWLock'@.
+--
+--     This function must be called on any read\/write lock that is no longer needed. Failure to destroy a rwlock will result in a system memory or resource leak. While it is safe to destroy a rwlock that is /unlocked/, it is not safe to attempt to destroy a locked rwlock, and may result in undefined behavior depending on the platform.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyRWLock@.
+--                   The safe flavor is 'destroyRWLockSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyRWLock@, defined at @SDL3\/SDL_mutex.h 658:34@
+destroyRWLock
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to destroy.
+  -> IO ()
+destroyRWLock = Unsafe.sDL_DestroyRWLock
+
+-- | Destroy a read\/write lock created with @'createRWLock'@.
+--
+--     This function must be called on any read\/write lock that is no longer needed. Failure to destroy a rwlock will result in a system memory or resource leak. While it is safe to destroy a rwlock that is /unlocked/, it is not safe to attempt to destroy a locked rwlock, and may result in undefined behavior depending on the platform.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRWLock'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyRWLock@.
+--                   The unsafe flavor is 'destroyRWLock'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyRWLock@, defined at @SDL3\/SDL_mutex.h 658:34@
+destroyRWLockSafe
+  :: BG.Ptr SDL_RWLock
+  -- ^
+  --
+  --           [@rwlock@]: the rwlock to destroy.
+  -> IO ()
+destroyRWLockSafe = Safe.sDL_DestroyRWLock
+
+-- | Create a semaphore.
+--
+--     This function creates a new semaphore and initializes it with the value @initial_value@. Each wait operation on the semaphore will atomically decrement the semaphore value and potentially block if the semaphore value is 0. Each post operation will atomically increment the semaphore value and wake waiting threads and allow them to retry the wait operation.
+--
+--     [Returns]: a new semaphore or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroySemaphore', 'signalSemaphore', 'tryWaitSemaphore', 'getSemaphoreValue', 'waitSemaphore', 'waitSemaphoreTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateSemaphore@.
+--                   The safe flavor is 'createSemaphoreSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateSemaphore@, defined at @SDL3\/SDL_mutex.h 708:45@
+createSemaphore
+  :: BG.Word32
+  -- ^
+  --
+  --           [@initial_value@]: the starting value of the semaphore.
+  -> IO (BG.Ptr SDL_Semaphore)
+createSemaphore =
+  \x00 ->
+    Unsafe.sDL_CreateSemaphore (Coerce.coerce x00)
+
+-- | Create a semaphore.
+--
+--     This function creates a new semaphore and initializes it with the value @initial_value@. Each wait operation on the semaphore will atomically decrement the semaphore value and potentially block if the semaphore value is 0. Each post operation will atomically increment the semaphore value and wake waiting threads and allow them to retry the wait operation.
+--
+--     [Returns]: a new semaphore or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroySemaphore', 'signalSemaphore', 'tryWaitSemaphore', 'getSemaphoreValue', 'waitSemaphore', 'waitSemaphoreTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateSemaphore@.
+--                   The unsafe flavor is 'createSemaphore'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateSemaphore@, defined at @SDL3\/SDL_mutex.h 708:45@
+createSemaphoreSafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@initial_value@]: the starting value of the semaphore.
+  -> IO (BG.Ptr SDL_Semaphore)
+createSemaphoreSafe =
+  \x00 -> Safe.sDL_CreateSemaphore (Coerce.coerce x00)
+
+-- | Destroy a semaphore.
+--
+--     It is not safe to destroy a semaphore if there are threads currently waiting on it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createSemaphore'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroySemaphore@.
+--                   The safe flavor is 'destroySemaphoreSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroySemaphore@, defined at @SDL3\/SDL_mutex.h 724:34@
+destroySemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to destroy.
+  -> IO ()
+destroySemaphore = Unsafe.sDL_DestroySemaphore
+
+-- | Destroy a semaphore.
+--
+--     It is not safe to destroy a semaphore if there are threads currently waiting on it.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createSemaphore'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroySemaphore@.
+--                   The unsafe flavor is 'destroySemaphore'
+--                   .
+--
+--     [C declaration]: @SDL_DestroySemaphore@, defined at @SDL3\/SDL_mutex.h 724:34@
+destroySemaphoreSafe
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to destroy.
+  -> IO ()
+destroySemaphoreSafe = Safe.sDL_DestroySemaphore
+
+-- | Wait until a semaphore has a positive value and then decrements it.
+--
+--     This function suspends the calling thread until the semaphore pointed to by @sem@ has a positive value, and then atomically decrement the semaphore value.
+--
+--     This function is the equivalent of calling @'waitSemaphoreTimeout'@ with a time length of -1.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'signalSemaphore', 'tryWaitSemaphore', 'waitSemaphoreTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitSemaphore@.
+--                   The safe flavor is 'waitSemaphoreSafe'
+--                   : blocks indefinitely.
+--
+--     [C declaration]: @SDL_WaitSemaphore@, defined at @SDL3\/SDL_mutex.h 746:34@
+waitSemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore wait on.
+  -> IO ()
+waitSemaphore = Unsafe.sDL_WaitSemaphore
+
+-- | Wait until a semaphore has a positive value and then decrements it.
+--
+--     This function suspends the calling thread until the semaphore pointed to by @sem@ has a positive value, and then atomically decrement the semaphore value.
+--
+--     This function is the equivalent of calling @'waitSemaphoreTimeout'@ with a time length of -1.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'signalSemaphore', 'tryWaitSemaphore', 'waitSemaphoreTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitSemaphore@.
+--                   The unsafe flavor is 'waitSemaphore'
+--                   : blocks indefinitely.
+--
+--     [C declaration]: @SDL_WaitSemaphore@, defined at @SDL3\/SDL_mutex.h 746:34@
+waitSemaphoreSafe
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore wait on.
+  -> IO ()
+waitSemaphoreSafe = Safe.sDL_WaitSemaphore
+
+-- | See if a semaphore has a positive value and decrement it if it does.
+--
+--     This function checks to see if the semaphore pointed to by @sem@ has a positive value and atomically decrements the semaphore value if it does. If the semaphore doesn\'t have a positive value, the function immediately returns false.
+--
+--     [Returns]: true if the wait succeeds, false if the wait would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'signalSemaphore', 'waitSemaphore', 'waitSemaphoreTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_TryWaitSemaphore@.
+--                   The safe flavor is 'tryWaitSemaphoreSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TryWaitSemaphore@, defined at @SDL3\/SDL_mutex.h 767:34@
+tryWaitSemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to wait on.
+  -> IO Bool
+tryWaitSemaphore =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_TryWaitSemaphore x00)
+
+-- | See if a semaphore has a positive value and decrement it if it does.
+--
+--     This function checks to see if the semaphore pointed to by @sem@ has a positive value and atomically decrements the semaphore value if it does. If the semaphore doesn\'t have a positive value, the function immediately returns false.
+--
+--     [Returns]: true if the wait succeeds, false if the wait would block.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'signalSemaphore', 'waitSemaphore', 'waitSemaphoreTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_TryWaitSemaphore@.
+--                   The unsafe flavor is 'tryWaitSemaphore'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TryWaitSemaphore@, defined at @SDL3\/SDL_mutex.h 767:34@
+tryWaitSemaphoreSafe
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to wait on.
+  -> IO Bool
+tryWaitSemaphoreSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_TryWaitSemaphore x00)
+
+-- | Wait until a semaphore has a positive value and then decrements it.
+--
+--     This function suspends the calling thread until either the semaphore pointed to by @sem@ has a positive value or the specified time has elapsed. If the call is successful it will atomically decrement the semaphore value.
+--
+--     [Returns]: true if the wait succeeds or false if the wait times out.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'signalSemaphore', 'tryWaitSemaphore', 'waitSemaphore'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitSemaphoreTimeout@.
+--                   The safe flavor is 'waitSemaphoreTimeoutSafe'
+--                   : blocks up to the timeout.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitSemaphoreTimeout@, defined at @SDL3\/SDL_mutex.h 789:34@
+waitSemaphoreTimeout
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to wait on.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@timeoutMS@]: the length of the timeout, in milliseconds, or -1 to wait indefinitely.
+  -> IO Bool
+waitSemaphoreTimeout =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_WaitSemaphoreTimeout x00 (Coerce.coerce x11))
+
+-- | Wait until a semaphore has a positive value and then decrements it.
+--
+--     This function suspends the calling thread until either the semaphore pointed to by @sem@ has a positive value or the specified time has elapsed. If the call is successful it will atomically decrement the semaphore value.
+--
+--     [Returns]: true if the wait succeeds or false if the wait times out.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'signalSemaphore', 'tryWaitSemaphore', 'waitSemaphore'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitSemaphoreTimeout@.
+--                   The unsafe flavor is 'waitSemaphoreTimeout'
+--                   : blocks up to the timeout.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitSemaphoreTimeout@, defined at @SDL3\/SDL_mutex.h 789:34@
+waitSemaphoreTimeoutSafe
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to wait on.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@timeoutMS@]: the length of the timeout, in milliseconds, or -1 to wait indefinitely.
+  -> IO Bool
+waitSemaphoreTimeoutSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_WaitSemaphoreTimeout x00 (Coerce.coerce x11))
+
+-- | Atomically increment a semaphore\'s value and wake waiting threads.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'tryWaitSemaphore', 'waitSemaphore', 'waitSemaphoreTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SignalSemaphore@.
+--                   The safe flavor is 'signalSemaphoreSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SignalSemaphore@, defined at @SDL3\/SDL_mutex.h 804:34@
+signalSemaphore
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to increment.
+  -> IO ()
+signalSemaphore = Unsafe.sDL_SignalSemaphore
+
+-- | Atomically increment a semaphore\'s value and wake waiting threads.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'tryWaitSemaphore', 'waitSemaphore', 'waitSemaphoreTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SignalSemaphore@.
+--                   The unsafe flavor is 'signalSemaphore'
+--                   .
+--
+--     [C declaration]: @SDL_SignalSemaphore@, defined at @SDL3\/SDL_mutex.h 804:34@
+signalSemaphoreSafe
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to increment.
+  -> IO ()
+signalSemaphoreSafe = Safe.sDL_SignalSemaphore
+
+-- | Get the current value of a semaphore.
+--
+--     [Returns]: the current value of the semaphore.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSemaphoreValue@.
+--                   The safe flavor is 'getSemaphoreValueSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSemaphoreValue@, defined at @SDL3\/SDL_mutex.h 816:36@
+getSemaphoreValue
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to query.
+  -> IO BG.Word32
+getSemaphoreValue =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetSemaphoreValue x00)
+
+-- | Get the current value of a semaphore.
+--
+--     [Returns]: the current value of the semaphore.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSemaphoreValue@.
+--                   The unsafe flavor is 'getSemaphoreValue'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSemaphoreValue@, defined at @SDL3\/SDL_mutex.h 816:36@
+getSemaphoreValueSafe
+  :: BG.Ptr SDL_Semaphore
+  -- ^
+  --
+  --           [@sem@]: the semaphore to query.
+  -> IO BG.Word32
+getSemaphoreValueSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetSemaphoreValue x00)
+
+-- | Create a condition variable.
+--
+--     [Returns]: a new condition variable or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'broadcastCondition', 'signalCondition', 'waitCondition', 'waitConditionTimeout', 'destroyCondition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateCondition@.
+--                   The safe flavor is 'createConditionSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateCondition@, defined at @SDL3\/SDL_mutex.h 857:45@
+createCondition :: IO (BG.Ptr SDL_Condition)
+createCondition = Unsafe.sDL_CreateCondition
+
+-- | Create a condition variable.
+--
+--     [Returns]: a new condition variable or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'broadcastCondition', 'signalCondition', 'waitCondition', 'waitConditionTimeout', 'destroyCondition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateCondition@.
+--                   The unsafe flavor is 'createCondition'
+--                   .
+--
+--     [C declaration]: @SDL_CreateCondition@, defined at @SDL3\/SDL_mutex.h 857:45@
+createConditionSafe :: IO (BG.Ptr SDL_Condition)
+createConditionSafe = Safe.sDL_CreateCondition
+
+-- | Destroy a condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createCondition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyCondition@.
+--                   The safe flavor is 'destroyConditionSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyCondition@, defined at @SDL3\/SDL_mutex.h 870:34@
+destroyCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to destroy.
+  -> IO ()
+destroyCondition = Unsafe.sDL_DestroyCondition
+
+-- | Destroy a condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createCondition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyCondition@.
+--                   The unsafe flavor is 'destroyCondition'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyCondition@, defined at @SDL3\/SDL_mutex.h 870:34@
+destroyConditionSafe
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to destroy.
+  -> IO ()
+destroyConditionSafe = Safe.sDL_DestroyCondition
+
+-- | Restart one of the threads that are waiting on the condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'broadcastCondition', 'waitCondition', 'waitConditionTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SignalCondition@.
+--                   The safe flavor is 'signalConditionSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SignalCondition@, defined at @SDL3\/SDL_mutex.h 885:34@
+signalCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to signal.
+  -> IO ()
+signalCondition = Unsafe.sDL_SignalCondition
+
+-- | Restart one of the threads that are waiting on the condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'broadcastCondition', 'waitCondition', 'waitConditionTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SignalCondition@.
+--                   The unsafe flavor is 'signalCondition'
+--                   .
+--
+--     [C declaration]: @SDL_SignalCondition@, defined at @SDL3\/SDL_mutex.h 885:34@
+signalConditionSafe
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to signal.
+  -> IO ()
+signalConditionSafe = Safe.sDL_SignalCondition
+
+-- | Restart all threads that are waiting on the condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'signalCondition', 'waitCondition', 'waitConditionTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BroadcastCondition@.
+--                   The safe flavor is 'broadcastConditionSafe'
+--                   .
+--
+--     [C declaration]: @SDL_BroadcastCondition@, defined at @SDL3\/SDL_mutex.h 900:34@
+broadcastCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to signal.
+  -> IO ()
+broadcastCondition = Unsafe.sDL_BroadcastCondition
+
+-- | Restart all threads that are waiting on the condition variable.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'signalCondition', 'waitCondition', 'waitConditionTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BroadcastCondition@.
+--                   The unsafe flavor is 'broadcastCondition'
+--                   .
+--
+--     [C declaration]: @SDL_BroadcastCondition@, defined at @SDL3\/SDL_mutex.h 900:34@
+broadcastConditionSafe
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to signal.
+  -> IO ()
+broadcastConditionSafe = Safe.sDL_BroadcastCondition
+
+-- | Wait until a condition variable is signaled.
+--
+--     This function unlocks the specified @mutex@ and waits for another thread to call @'signalCondition'@ or @'broadcastCondition'@ on the condition variable @cond@. Once the condition variable is signaled, the mutex is re-locked and the function returns.
+--
+--     The mutex must be locked before calling this function. Locking the mutex recursively (more than once) is not supported and leads to undefined behavior.
+--
+--     This function is the equivalent of calling @'waitConditionTimeout'@ with a time length of -1.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'broadcastCondition', 'signalCondition', 'waitConditionTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitCondition@.
+--                   The safe flavor is 'waitConditionSafe'
+--                   : blocks indefinitely.
+--
+--     [C declaration]: @SDL_WaitCondition@, defined at @SDL3\/SDL_mutex.h 928:34@
+waitCondition
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to wait on.
+  -> BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex used to coordinate thread access.
+  -> IO ()
+waitCondition = Unsafe.sDL_WaitCondition
+
+-- | Wait until a condition variable is signaled.
+--
+--     This function unlocks the specified @mutex@ and waits for another thread to call @'signalCondition'@ or @'broadcastCondition'@ on the condition variable @cond@. Once the condition variable is signaled, the mutex is re-locked and the function returns.
+--
+--     The mutex must be locked before calling this function. Locking the mutex recursively (more than once) is not supported and leads to undefined behavior.
+--
+--     This function is the equivalent of calling @'waitConditionTimeout'@ with a time length of -1.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'broadcastCondition', 'signalCondition', 'waitConditionTimeout'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitCondition@.
+--                   The unsafe flavor is 'waitCondition'
+--                   : blocks indefinitely.
+--
+--     [C declaration]: @SDL_WaitCondition@, defined at @SDL3\/SDL_mutex.h 928:34@
+waitConditionSafe
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to wait on.
+  -> BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex used to coordinate thread access.
+  -> IO ()
+waitConditionSafe = Safe.sDL_WaitCondition
+
+-- | Wait until a condition variable is signaled or a certain time has passed.
+--
+--     This function unlocks the specified @mutex@ and waits for another thread to call @'signalCondition'@ or @'broadcastCondition'@ on the condition variable @cond@, or for the specified time to elapse. Once the condition variable is signaled or the time elapsed, the mutex is re-locked and the function returns.
+--
+--     The mutex must be locked before calling this function. Locking the mutex recursively (more than once) is not supported and leads to undefined behavior.
+--
+--     [Returns]: true if the condition variable is signaled, false if the condition is not signaled in the allotted time.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'broadcastCondition', 'signalCondition', 'waitCondition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitConditionTimeout@.
+--                   The safe flavor is 'waitConditionTimeoutSafe'
+--                   : blocks up to the timeout.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitConditionTimeout@, defined at @SDL3\/SDL_mutex.h 958:34@
+waitConditionTimeout
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to wait on.
+  -> BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex used to coordinate thread access.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum time to wait, in milliseconds, or -1 to wait indefinitely.
+  -> IO Bool
+waitConditionTimeout =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_WaitConditionTimeout x00 x11 (Coerce.coerce x22))
+
+-- | Wait until a condition variable is signaled or a certain time has passed.
+--
+--     This function unlocks the specified @mutex@ and waits for another thread to call @'signalCondition'@ or @'broadcastCondition'@ on the condition variable @cond@, or for the specified time to elapse. Once the condition variable is signaled or the time elapsed, the mutex is re-locked and the function returns.
+--
+--     The mutex must be locked before calling this function. Locking the mutex recursively (more than once) is not supported and leads to undefined behavior.
+--
+--     [Returns]: true if the condition variable is signaled, false if the condition is not signaled in the allotted time.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'broadcastCondition', 'signalCondition', 'waitCondition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitConditionTimeout@.
+--                   The unsafe flavor is 'waitConditionTimeout'
+--                   : blocks up to the timeout.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitConditionTimeout@, defined at @SDL3\/SDL_mutex.h 958:34@
+waitConditionTimeoutSafe
+  :: BG.Ptr SDL_Condition
+  -- ^
+  --
+  --           [@cond@]: the condition variable to wait on.
+  -> BG.Ptr SDL_Mutex
+  -- ^
+  --
+  --           [@mutex@]: the mutex used to coordinate thread access.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@timeoutMS@]: the maximum time to wait, in milliseconds, or -1 to wait indefinitely.
+  -> IO Bool
+waitConditionTimeoutSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_WaitConditionTimeout x00 x11 (Coerce.coerce x22))
+
+-- | Return whether initialization should be done.
+--
+--     This function checks the passed in state and if initialization should be done, sets the status to @SDL_INIT_STATUS_INITIALIZING@ and returns true. If another thread is already modifying this state, it will wait until that\'s done before returning.
+--
+--     If this function returns true, the calling code must call @'setInitialized'@ to complete the initialization.
+--
+--     [Returns]: true if initialization needs to be done, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setInitialized', 'shouldQuit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ShouldInit@.
+--                   The safe flavor is 'shouldInitSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShouldInit@, defined at @SDL3\/SDL_mutex.h 1065:34@
+shouldInit
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> IO Bool
+shouldInit =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_ShouldInit x00)
+
+-- | Return whether initialization should be done.
+--
+--     This function checks the passed in state and if initialization should be done, sets the status to @SDL_INIT_STATUS_INITIALIZING@ and returns true. If another thread is already modifying this state, it will wait until that\'s done before returning.
+--
+--     If this function returns true, the calling code must call @'setInitialized'@ to complete the initialization.
+--
+--     [Returns]: true if initialization needs to be done, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setInitialized', 'shouldQuit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShouldInit@.
+--                   The unsafe flavor is 'shouldInit'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShouldInit@, defined at @SDL3\/SDL_mutex.h 1065:34@
+shouldInitSafe
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> IO Bool
+shouldInitSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_ShouldInit x00)
+
+-- | Return whether cleanup should be done.
+--
+--     This function checks the passed in state and if cleanup should be done, sets the status to @SDL_INIT_STATUS_UNINITIALIZING@ and returns true.
+--
+--     If this function returns true, the calling code must call @'setInitialized'@ to complete the cleanup.
+--
+--     [Returns]: true if cleanup needs to be done, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setInitialized', 'shouldInit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ShouldQuit@.
+--                   The safe flavor is 'shouldQuitSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShouldQuit@, defined at @SDL3\/SDL_mutex.h 1086:34@
+shouldQuit
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> IO Bool
+shouldQuit =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_ShouldQuit x00)
+
+-- | Return whether cleanup should be done.
+--
+--     This function checks the passed in state and if cleanup should be done, sets the status to @SDL_INIT_STATUS_UNINITIALIZING@ and returns true.
+--
+--     If this function returns true, the calling code must call @'setInitialized'@ to complete the cleanup.
+--
+--     [Returns]: true if cleanup needs to be done, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setInitialized', 'shouldInit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShouldQuit@.
+--                   The unsafe flavor is 'shouldQuit'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShouldQuit@, defined at @SDL3\/SDL_mutex.h 1086:34@
+shouldQuitSafe
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> IO Bool
+shouldQuitSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_ShouldQuit x00)
+
+-- | Finish an initialization state transition.
+--
+--     This function sets the status of the passed in state to @SDL_INIT_STATUS_INITIALIZED@ or @SDL_INIT_STATUS_UNINITIALIZED@ and allows any threads waiting for the status to proceed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'shouldInit', 'shouldQuit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetInitialized@.
+--                   The safe flavor is 'setInitializedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetInitialized@, defined at @SDL3\/SDL_mutex.h 1105:34@
+setInitialized
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> Bool
+  -- ^
+  --
+  --           [@initialized@]: the new initialization state.
+  -> IO ()
+setInitialized =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_SetInitialized x00 (CBool.fromBool x11)
+
+-- | Finish an initialization state transition.
+--
+--     This function sets the status of the passed in state to @SDL_INIT_STATUS_INITIALIZED@ or @SDL_INIT_STATUS_UNINITIALIZED@ and allows any threads waiting for the status to proceed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'shouldInit', 'shouldQuit'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetInitialized@.
+--                   The unsafe flavor is 'setInitialized'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetInitialized@, defined at @SDL3\/SDL_mutex.h 1105:34@
+setInitializedSafe
+  :: BG.Ptr SDL_InitState
+  -- ^
+  --
+  --           [@state@]: the initialization state to check.
+  -> Bool
+  -- ^
+  --
+  --           [@initialized@]: the new initialization state.
+  -> IO ()
+setInitializedSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_SetInitialized x00 (CBool.fromBool x11)
diff --git a/src/SDL3/Sys/Pen.hs b/src/SDL3/Sys/Pen.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Pen.hs
@@ -0,0 +1,141 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | SDL pen event handling.
+--
+--     SDL provides an API for pressure-sensitive pen (stylus and\/or eraser) handling, e.g., for input and drawing tablets or suitably equipped mobile \/ tablet devices.
+--
+--     To get started with pens, simply handle pen events:
+--
+--     * SDL_EVENT_PEN_PROXIMITY_IN, SDL_EVENT_PEN_PROXIMITY_OUT (SDL_PenProximityEvent)
+--
+--     * SDL_EVENT_PEN_DOWN, SDL_EVENT_PEN_UP (SDL_PenTouchEvent)
+--
+--     * SDL_EVENT_PEN_MOTION (SDL_PenMotionEvent)
+--
+--     * SDL_EVENT_PEN_BUTTON_DOWN, SDL_EVENT_PEN_BUTTON_UP (SDL_PenButtonEvent)
+--
+--     * SDL_EVENT_PEN_AXIS (SDL_PenAxisEvent)
+--
+--     Pens may provide more than simple touch input; they might have other axes, such as pressure, tilt, rotation, etc.
+--
+--     When a pen starts providing input, SDL will assign it a unique 'SDL_PenID', which will remain for the life of the process, as long as the pen stays connected. A pen leaving proximity (being taken far enough away from the digitizer tablet that it no longer reponds) and then coming back should fire proximity events, but the 'SDL_PenID' should remain consistent. Unplugging the digitizer and reconnecting may cause future input to have a new 'SDL_PenID', as SDL may not know that this is the same hardware.
+--
+--     Please note that various platforms vary wildly in how (and how well) they support pen input. If your pen supports some piece of functionality but SDL doesn\'t seem to, it might actually be the operating system\'s fault. For example, some platforms can manage multiple devices at the same time, but others will make any connected pens look like a single logical device, much how all USB mice connected to a computer will move the same system cursor. cursor. Other platforms might not support pen buttons, or the distance axis, etc. Very few platforms can even report /what/ functionality the pen supports in the first place, so best practices is to either build UI to let the user configure their pens, or be prepared to handle new functionality for a pen the first time an event is reported. SDL pen instance IDs.
+--
+--     Zero is used to signify an invalid\/null device.
+--
+--     These show up in pen events when SDL sees input from them. They remain consistent as long as SDL can recognize a tool to be the same pen; but if a pen\'s digitizer table is physically detached from the computer, it might get a new ID when reconnected, as SDL won\'t know it\'s the same device.
+--
+--     These IDs are only stable within a single run of a program; the next time a program is run, the pen\'s ID will likely be different, even if the hardware hasn\'t been disconnected, etc.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Pen.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Pen (
+  module SDL3.Sys.Bindgen.Pen,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Pen.SDL_PEN_INPUT_DOWN,
+  pattern SDL3.Sys.Pen.SDL_PEN_INPUT_BUTTON_1,
+  pattern SDL3.Sys.Pen.SDL_PEN_INPUT_BUTTON_2,
+  pattern SDL3.Sys.Pen.SDL_PEN_INPUT_BUTTON_3,
+  pattern SDL3.Sys.Pen.SDL_PEN_INPUT_BUTTON_4,
+  pattern SDL3.Sys.Pen.SDL_PEN_INPUT_BUTTON_5,
+  pattern SDL3.Sys.Pen.SDL_PEN_INPUT_ERASER_TIP,
+  pattern SDL3.Sys.Pen.SDL_PEN_INPUT_IN_PROXIMITY,
+
+  -- * Function aliases
+  SDL3.Sys.Pen.getPenDeviceType,
+  SDL3.Sys.Pen.getPenDeviceTypeSafe,
+)
+where
+
+import SDL3.Sys.Bindgen.Pen
+import SDL3.Sys.Bindgen.Pen.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Pen.Unsafe qualified as Unsafe
+
+-- | Get the device type of the given pen.
+--
+--     Many platforms do not supply this information, so an app must always be prepared to get an SDL_PEN_DEVICE_TYPE_UNKNOWN result.
+--
+--     [Returns]: the device type of the given pen, or SDL_PEN_DEVICE_TYPE_INVALID on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPenDeviceType@.
+--                   The safe flavor is 'getPenDeviceTypeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPenDeviceType@, defined at @SDL3\/SDL_pen.h 189:47@
+getPenDeviceType
+  :: SDL_PenID
+  -- ^
+  --
+  --           [@instance_id@]: the pen instance ID.
+  -> IO SDL_PenDeviceType
+getPenDeviceType = Unsafe.sDL_GetPenDeviceType
+
+-- | Get the device type of the given pen.
+--
+--     Many platforms do not supply this information, so an app must always be prepared to get an SDL_PEN_DEVICE_TYPE_UNKNOWN result.
+--
+--     [Returns]: the device type of the given pen, or SDL_PEN_DEVICE_TYPE_INVALID on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPenDeviceType@.
+--                   The unsafe flavor is 'getPenDeviceType'
+--                   .
+--
+--     [C declaration]: @SDL_GetPenDeviceType@, defined at @SDL3\/SDL_pen.h 189:47@
+getPenDeviceTypeSafe
+  :: SDL_PenID
+  -- ^
+  --
+  --           [@instance_id@]: the pen instance ID.
+  -> IO SDL_PenDeviceType
+getPenDeviceTypeSafe = Safe.sDL_GetPenDeviceType
+
+-- | Typed constant for macro @SDL_PEN_INPUT_DOWN@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_PEN_INPUT_DOWN :: SDL_PenInputFlags
+pattern SDL_PEN_INPUT_DOWN = SDL_PenInputFlags 0x00000001
+
+-- | Typed constant for macro @SDL_PEN_INPUT_BUTTON_1@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_PEN_INPUT_BUTTON_1 :: SDL_PenInputFlags
+pattern SDL_PEN_INPUT_BUTTON_1 = SDL_PenInputFlags 0x00000002
+
+-- | Typed constant for macro @SDL_PEN_INPUT_BUTTON_2@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_PEN_INPUT_BUTTON_2 :: SDL_PenInputFlags
+pattern SDL_PEN_INPUT_BUTTON_2 = SDL_PenInputFlags 0x00000004
+
+-- | Typed constant for macro @SDL_PEN_INPUT_BUTTON_3@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_PEN_INPUT_BUTTON_3 :: SDL_PenInputFlags
+pattern SDL_PEN_INPUT_BUTTON_3 = SDL_PenInputFlags 0x00000008
+
+-- | Typed constant for macro @SDL_PEN_INPUT_BUTTON_4@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_PEN_INPUT_BUTTON_4 :: SDL_PenInputFlags
+pattern SDL_PEN_INPUT_BUTTON_4 = SDL_PenInputFlags 0x00000010
+
+-- | Typed constant for macro @SDL_PEN_INPUT_BUTTON_5@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_PEN_INPUT_BUTTON_5 :: SDL_PenInputFlags
+pattern SDL_PEN_INPUT_BUTTON_5 = SDL_PenInputFlags 0x00000020
+
+-- | Typed constant for macro @SDL_PEN_INPUT_ERASER_TIP@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_PEN_INPUT_ERASER_TIP :: SDL_PenInputFlags
+pattern SDL_PEN_INPUT_ERASER_TIP = SDL_PenInputFlags 0x40000000
+
+-- | Typed constant for macro @SDL_PEN_INPUT_IN_PROXIMITY@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_PEN_INPUT_IN_PROXIMITY :: SDL_PenInputFlags
+pattern SDL_PEN_INPUT_IN_PROXIMITY = SDL_PenInputFlags 0x80000000
diff --git a/src/SDL3/Sys/Pixels.hs b/src/SDL3/Sys/Pixels.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Pixels.hs
@@ -0,0 +1,1096 @@
+-- | SDL offers facilities for pixel management.
+--
+--     Largely these facilities deal with pixel /format/: what does this set of bits represent?
+--
+--     If you mostly want to think of a pixel as some combination of red, green, blue, and maybe alpha intensities, this is all pretty straightforward, and in many cases, is enough information to build a perfectly fine game.
+--
+--     However, the actual definition of a pixel is more complex than that:
+--
+--     Pixels are a representation of a color in a particular color space.
+--
+--     The first characteristic of a color space is the color type. SDL understands two different color types, RGB and YCbCr, or in SDL also referred to as YUV.
+--
+--     RGB colors consist of red, green, and blue channels of color that are added together to represent the colors we see on the screen.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/RGB_color_model](https://en.wikipedia.org/wiki/RGB_color_model)
+--
+--     YCbCr colors represent colors as a Y luma brightness component and red and blue chroma color offsets. This color representation takes advantage of the fact that the human eye is more sensitive to brightness than the color in an image. The Cb and Cr components are often compressed and have lower resolution than the luma component.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/YCbCr](https://en.wikipedia.org/wiki/YCbCr)
+--
+--     When the color information in YCbCr is compressed, the Y pixels are left at full resolution and each Cr and Cb pixel represents an average of the color information in a block of Y pixels. The chroma location determines where in that block of pixels the color information is coming from.
+--
+--     The color range defines how much of the pixel to use when converting a pixel into a color on the display. When the full color range is used, the entire numeric range of the pixel bits is significant. When narrow color range is used, for historical reasons, the pixel uses only a portion of the numeric range to represent colors.
+--
+--     The color primaries and white point are a definition of the colors in the color space relative to the standard XYZ color space.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/CIE_1931_color_space](https://en.wikipedia.org/wiki/CIE_1931_color_space)
+--
+--     The transfer characteristic, or opto-electrical transfer function (OETF), is the way a color is converted from mathematically linear space into a non-linear output signals.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Rec._709\#Transfer_characteristics](https://en.wikipedia.org/wiki/Rec._709#Transfer_characteristics)
+--
+--     The matrix coefficients are used to convert between YCbCr and RGB colors. A fully opaque 8-bit alpha value.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sDL_ALPHA_TRANSPARENT'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Pixels.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Pixels (
+  module SDL3.Sys.Bindgen.Pixels,
+
+  -- * Function aliases
+  SDL3.Sys.Pixels.getPixelFormatName,
+  SDL3.Sys.Pixels.getPixelFormatNameSafe,
+  SDL3.Sys.Pixels.getMasksForPixelFormat,
+  SDL3.Sys.Pixels.getMasksForPixelFormatSafe,
+  SDL3.Sys.Pixels.getPixelFormatForMasks,
+  SDL3.Sys.Pixels.getPixelFormatForMasksSafe,
+  SDL3.Sys.Pixels.getPixelFormatDetails,
+  SDL3.Sys.Pixels.getPixelFormatDetailsSafe,
+  SDL3.Sys.Pixels.createPalette,
+  SDL3.Sys.Pixels.createPaletteSafe,
+  SDL3.Sys.Pixels.setPaletteColors,
+  SDL3.Sys.Pixels.setPaletteColorsSafe,
+  SDL3.Sys.Pixels.destroyPalette,
+  SDL3.Sys.Pixels.destroyPaletteSafe,
+  SDL3.Sys.Pixels.mapRGB,
+  SDL3.Sys.Pixels.mapRGBSafe,
+  SDL3.Sys.Pixels.mapRGBA,
+  SDL3.Sys.Pixels.mapRGBASafe,
+  SDL3.Sys.Pixels.getRGB,
+  SDL3.Sys.Pixels.getRGBSafe,
+  SDL3.Sys.Pixels.getRGBA,
+  SDL3.Sys.Pixels.getRGBASafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Pixels
+import SDL3.Sys.Bindgen.Pixels.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Pixels.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Get the human readable name of a pixel format.
+--
+--     [Returns]: the human readable name of the specified pixel format or \"SDL_PIXELFORMAT_UNKNOWN\" if the format isn\'t recognized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPixelFormatName@.
+--                   The safe flavor is 'getPixelFormatNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPixelFormatName@, defined at @SDL3\/SDL_pixels.h 1185:42@
+getPixelFormatName
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the pixel format to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getPixelFormatName = Unsafe.sDL_GetPixelFormatName
+
+-- | Get the human readable name of a pixel format.
+--
+--     [Returns]: the human readable name of the specified pixel format or \"SDL_PIXELFORMAT_UNKNOWN\" if the format isn\'t recognized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPixelFormatName@.
+--                   The unsafe flavor is 'getPixelFormatName'
+--                   .
+--
+--     [C declaration]: @SDL_GetPixelFormatName@, defined at @SDL3\/SDL_pixels.h 1185:42@
+getPixelFormatNameSafe
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the pixel format to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getPixelFormatNameSafe = Safe.sDL_GetPixelFormatName
+
+-- | Convert one of the enumerated pixel formats to a bpp value and RGBA masks.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPixelFormatForMasks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetMasksForPixelFormat@.
+--                   The safe flavor is 'getMasksForPixelFormatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetMasksForPixelFormat@, defined at @SDL3\/SDL_pixels.h 1205:34@
+getMasksForPixelFormat
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the 'SDL_PixelFormat' values.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@bpp@]: a bits per pixel value; usually 15, 16, or 32.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Rmask@]: a pointer filled in with the red mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Gmask@]: a pointer filled in with the green mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Bmask@]: a pointer filled in with the blue mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Amask@]: a pointer filled in with the alpha mask for the format.
+  -> IO Bool
+getMasksForPixelFormat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Unsafe.sDL_GetMasksForPixelFormat x00 x11 x22 x33 x44 x55)
+
+-- | Convert one of the enumerated pixel formats to a bpp value and RGBA masks.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPixelFormatForMasks'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetMasksForPixelFormat@.
+--                   The unsafe flavor is 'getMasksForPixelFormat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetMasksForPixelFormat@, defined at @SDL3\/SDL_pixels.h 1205:34@
+getMasksForPixelFormatSafe
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the 'SDL_PixelFormat' values.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@bpp@]: a bits per pixel value; usually 15, 16, or 32.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Rmask@]: a pointer filled in with the red mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Gmask@]: a pointer filled in with the green mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Bmask@]: a pointer filled in with the blue mask for the format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@Amask@]: a pointer filled in with the alpha mask for the format.
+  -> IO Bool
+getMasksForPixelFormatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Safe.sDL_GetMasksForPixelFormat x00 x11 x22 x33 x44 x55)
+
+-- | Convert a bpp value and RGBA masks to an enumerated pixel format.
+--
+--     This will return @SDL_PIXELFORMAT_UNKNOWN@ if the conversion wasn\'t possible.
+--
+--     [Returns]: the 'SDL_PixelFormat' value corresponding to the format masks, or SDL_PIXELFORMAT_UNKNOWN if there isn\'t a match.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMasksForPixelFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPixelFormatForMasks@.
+--                   The safe flavor is 'getPixelFormatForMasksSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetPixelFormatForMasks@, defined at @SDL3\/SDL_pixels.h 1227:45@
+getPixelFormatForMasks
+  :: BG.Int32
+  -- ^
+  --
+  --           [@bpp@]: a bits per pixel value; usually 15, 16, or 32.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@Rmask@]: the red mask for the format.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@Gmask@]: the green mask for the format.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@Bmask@]: the blue mask for the format.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@Amask@]: the alpha mask for the format.
+  -> IO SDL_PixelFormat
+getPixelFormatForMasks =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Unsafe.sDL_GetPixelFormatForMasks
+              (Coerce.coerce x00)
+              (Coerce.coerce x11)
+              (Coerce.coerce x22)
+              (Coerce.coerce x33)
+              (Coerce.coerce x44)
+
+-- | Convert a bpp value and RGBA masks to an enumerated pixel format.
+--
+--     This will return @SDL_PIXELFORMAT_UNKNOWN@ if the conversion wasn\'t possible.
+--
+--     [Returns]: the 'SDL_PixelFormat' value corresponding to the format masks, or SDL_PIXELFORMAT_UNKNOWN if there isn\'t a match.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMasksForPixelFormat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPixelFormatForMasks@.
+--                   The unsafe flavor is 'getPixelFormatForMasks'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetPixelFormatForMasks@, defined at @SDL3\/SDL_pixels.h 1227:45@
+getPixelFormatForMasksSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@bpp@]: a bits per pixel value; usually 15, 16, or 32.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@Rmask@]: the red mask for the format.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@Gmask@]: the green mask for the format.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@Bmask@]: the blue mask for the format.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@Amask@]: the alpha mask for the format.
+  -> IO SDL_PixelFormat
+getPixelFormatForMasksSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Safe.sDL_GetPixelFormatForMasks
+              (Coerce.coerce x00)
+              (Coerce.coerce x11)
+              (Coerce.coerce x22)
+              (Coerce.coerce x33)
+              (Coerce.coerce x44)
+
+-- | Create an 'SDL_PixelFormatDetails' structure corresponding to a pixel format.
+--
+--     Returned structure may come from a shared global cache (i.e. not newly allocated), and hence should not be modified, especially the palette. Weird errors such as @Blit combination not supported@ may occur.
+--
+--     [Returns]: a pointer to a 'SDL_PixelFormatDetails' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPixelFormatDetails@.
+--                   The safe flavor is 'getPixelFormatDetailsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPixelFormatDetails@, defined at @SDL3\/SDL_pixels.h 1244:60@
+getPixelFormatDetails
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the 'SDL_PixelFormat' values.
+  -> IO (PtrConst.PtrConst SDL_PixelFormatDetails)
+getPixelFormatDetails =
+  Unsafe.sDL_GetPixelFormatDetails
+
+-- | Create an 'SDL_PixelFormatDetails' structure corresponding to a pixel format.
+--
+--     Returned structure may come from a shared global cache (i.e. not newly allocated), and hence should not be modified, especially the palette. Weird errors such as @Blit combination not supported@ may occur.
+--
+--     [Returns]: a pointer to a 'SDL_PixelFormatDetails' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPixelFormatDetails@.
+--                   The unsafe flavor is 'getPixelFormatDetails'
+--                   .
+--
+--     [C declaration]: @SDL_GetPixelFormatDetails@, defined at @SDL3\/SDL_pixels.h 1244:60@
+getPixelFormatDetailsSafe
+  :: SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the 'SDL_PixelFormat' values.
+  -> IO (PtrConst.PtrConst SDL_PixelFormatDetails)
+getPixelFormatDetailsSafe =
+  Safe.sDL_GetPixelFormatDetails
+
+-- | Create a palette structure with the specified number of color entries.
+--
+--     The palette entries are initialized to white.
+--
+--     [Returns]: a new 'SDL_Palette' structure on success or NULL on failure (e.g. if there wasn\'t enough memory); call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyPalette', 'setPaletteColors', 'SDL3.Sys.Surface.setSurfacePalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreatePalette@.
+--                   The safe flavor is 'createPaletteSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreatePalette@, defined at @SDL3\/SDL_pixels.h 1264:43@
+createPalette
+  :: BG.Int32
+  -- ^
+  --
+  --           [@ncolors@]: represents the number of color entries in the color palette.
+  -> IO (BG.Ptr SDL_Palette)
+createPalette =
+  \x00 -> Unsafe.sDL_CreatePalette (Coerce.coerce x00)
+
+-- | Create a palette structure with the specified number of color entries.
+--
+--     The palette entries are initialized to white.
+--
+--     [Returns]: a new 'SDL_Palette' structure on success or NULL on failure (e.g. if there wasn\'t enough memory); call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyPalette', 'setPaletteColors', 'SDL3.Sys.Surface.setSurfacePalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreatePalette@.
+--                   The unsafe flavor is 'createPalette'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreatePalette@, defined at @SDL3\/SDL_pixels.h 1264:43@
+createPaletteSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@ncolors@]: represents the number of color entries in the color palette.
+  -> IO (BG.Ptr SDL_Palette)
+createPaletteSafe =
+  \x00 -> Safe.sDL_CreatePalette (Coerce.coerce x00)
+
+-- | Set a range of colors in a palette.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified or destroyed in another thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetPaletteColors@.
+--                   The safe flavor is 'setPaletteColorsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetPaletteColors@, defined at @SDL3\/SDL_pixels.h 1281:34@
+setPaletteColors
+  :: BG.Ptr SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the 'SDL_Palette' structure to modify.
+  -> PtrConst.PtrConst SDL_Color
+  -- ^
+  --
+  --           [@colors@]: an array of 'SDL_Color' structures to copy into the palette.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@firstcolor@]: the index of the first palette entry to modify.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@ncolors@]: the number of entries to modify.
+  -> IO Bool
+setPaletteColors =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_SetPaletteColors x00 x11 (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Set a range of colors in a palette.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified or destroyed in another thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetPaletteColors@.
+--                   The unsafe flavor is 'setPaletteColors'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetPaletteColors@, defined at @SDL3\/SDL_pixels.h 1281:34@
+setPaletteColorsSafe
+  :: BG.Ptr SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the 'SDL_Palette' structure to modify.
+  -> PtrConst.PtrConst SDL_Color
+  -- ^
+  --
+  --           [@colors@]: an array of 'SDL_Color' structures to copy into the palette.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@firstcolor@]: the index of the first palette entry to modify.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@ncolors@]: the number of entries to modify.
+  -> IO Bool
+setPaletteColorsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_SetPaletteColors x00 x11 (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Free a palette created with @'createPalette'@.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified or destroyed in another thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createPalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyPalette@.
+--                   The safe flavor is 'destroyPaletteSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyPalette@, defined at @SDL3\/SDL_pixels.h 1295:34@
+destroyPalette
+  :: BG.Ptr SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the 'SDL_Palette' structure to be freed.
+  -> IO ()
+destroyPalette = Unsafe.sDL_DestroyPalette
+
+-- | Free a palette created with @'createPalette'@.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified or destroyed in another thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createPalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyPalette@.
+--                   The unsafe flavor is 'destroyPalette'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyPalette@, defined at @SDL3\/SDL_pixels.h 1295:34@
+destroyPaletteSafe
+  :: BG.Ptr SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the 'SDL_Palette' structure to be freed.
+  -> IO ()
+destroyPaletteSafe = Safe.sDL_DestroyPalette
+
+-- | Map an RGB triple to an opaque pixel value for a given pixel format.
+--
+--     This function maps the RGB color value to the specified pixel format and returns the pixel value best approximating the given RGB color value for the given pixel format.
+--
+--     If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.
+--
+--     If the specified pixel format has an alpha component it will be returned as all 1 bits (fully opaque).
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPixelFormatDetails', 'getRGB', 'mapRGBA', 'SDL3.Sys.Surface.mapSurfaceRGB'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MapRGB@.
+--                   The safe flavor is 'mapRGBSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MapRGB@, defined at @SDL3\/SDL_pixels.h 1333:36@
+mapRGB
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> IO BG.Word32
+mapRGB =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              Coerce.coerce
+              (Unsafe.sDL_MapRGB x00 x11 (Coerce.coerce x22) (Coerce.coerce x33) (Coerce.coerce x44))
+
+-- | Map an RGB triple to an opaque pixel value for a given pixel format.
+--
+--     This function maps the RGB color value to the specified pixel format and returns the pixel value best approximating the given RGB color value for the given pixel format.
+--
+--     If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.
+--
+--     If the specified pixel format has an alpha component it will be returned as all 1 bits (fully opaque).
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPixelFormatDetails', 'getRGB', 'mapRGBA', 'SDL3.Sys.Surface.mapSurfaceRGB'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MapRGB@.
+--                   The unsafe flavor is 'mapRGB'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MapRGB@, defined at @SDL3\/SDL_pixels.h 1333:36@
+mapRGBSafe
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> IO BG.Word32
+mapRGBSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              Coerce.coerce
+              (Safe.sDL_MapRGB x00 x11 (Coerce.coerce x22) (Coerce.coerce x33) (Coerce.coerce x44))
+
+-- | Map an RGBA quadruple to a pixel value for a given pixel format.
+--
+--     This function maps the RGBA color value to the specified pixel format and returns the pixel value best approximating the given RGBA color value for the given pixel format.
+--
+--     If the specified pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).
+--
+--     If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPixelFormatDetails', 'getRGBA', 'mapRGB', 'SDL3.Sys.Surface.mapSurfaceRGBA'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MapRGBA@.
+--                   The safe flavor is 'mapRGBASafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MapRGBA@, defined at @SDL3\/SDL_pixels.h 1372:36@
+mapRGBA
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel in the range 0-255.
+  -> IO BG.Word32
+mapRGBA =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap
+                Coerce.coerce
+                ( Unsafe.sDL_MapRGBA
+                    x00
+                    x11
+                    (Coerce.coerce x22)
+                    (Coerce.coerce x33)
+                    (Coerce.coerce x44)
+                    (Coerce.coerce x55)
+                )
+
+-- | Map an RGBA quadruple to a pixel value for a given pixel format.
+--
+--     This function maps the RGBA color value to the specified pixel format and returns the pixel value best approximating the given RGBA color value for the given pixel format.
+--
+--     If the specified pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).
+--
+--     If the format has a palette (8-bit) the index of the closest matching color in the palette will be returned.
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPixelFormatDetails', 'getRGBA', 'mapRGB', 'SDL3.Sys.Surface.mapSurfaceRGBA'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MapRGBA@.
+--                   The unsafe flavor is 'mapRGBA'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MapRGBA@, defined at @SDL3\/SDL_pixels.h 1372:36@
+mapRGBASafe
+  :: PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel in the range 0-255.
+  -> IO BG.Word32
+mapRGBASafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap
+                Coerce.coerce
+                ( Safe.sDL_MapRGBA
+                    x00
+                    x11
+                    (Coerce.coerce x22)
+                    (Coerce.coerce x33)
+                    (Coerce.coerce x44)
+                    (Coerce.coerce x55)
+                )
+
+-- | Get RGB values from a pixel in the specified format.
+--
+--     This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPixelFormatDetails', 'getRGBA', 'mapRGB', 'mapRGBA'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRGB@.
+--                   The safe flavor is 'getRGBSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRGB@, defined at @SDL3\/SDL_pixels.h 1400:34@
+getRGB
+  :: BG.Word32
+  -- ^
+  --
+  --           [@pixelvalue@]: a pixel value.
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue component, may be NULL.
+  -> IO ()
+getRGB =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              Unsafe.sDL_GetRGB (Coerce.coerce x00) x11 x22 x33 x44 x55
+
+-- | Get RGB values from a pixel in the specified format.
+--
+--     This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPixelFormatDetails', 'getRGBA', 'mapRGB', 'mapRGBA'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRGB@.
+--                   The unsafe flavor is 'getRGB'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRGB@, defined at @SDL3\/SDL_pixels.h 1400:34@
+getRGBSafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@pixelvalue@]: a pixel value.
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue component, may be NULL.
+  -> IO ()
+getRGBSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              Safe.sDL_GetRGB (Coerce.coerce x00) x11 x22 x33 x44 x55
+
+-- | Get RGBA values from a pixel in the specified format.
+--
+--     This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).
+--
+--     If the surface has no alpha component, the alpha will be returned as 0xff (100% opaque).
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPixelFormatDetails', 'getRGB', 'mapRGB', 'mapRGBA'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRGBA@.
+--                   The safe flavor is 'getRGBASafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRGBA@, defined at @SDL3\/SDL_pixels.h 1432:34@
+getRGBA
+  :: BG.Word32
+  -- ^
+  --
+  --           [@pixelvalue@]: a pixel value.
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha component, may be NULL.
+  -> IO ()
+getRGBA =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                Unsafe.sDL_GetRGBA (Coerce.coerce x00) x11 x22 x33 x44 x55 x66
+
+-- | Get RGBA values from a pixel in the specified format.
+--
+--     This function uses the entire 8-bit [0..255] range when converting color components from pixel formats with less than 8-bits per RGB component (e.g., a completely white pixel in 16-bit RGB565 format would return [0xff, 0xff, 0xff] not [0xf8, 0xfc, 0xf8]).
+--
+--     If the surface has no alpha component, the alpha will be returned as 0xff (100% opaque).
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the palette is not modified.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPixelFormatDetails', 'getRGB', 'mapRGB', 'mapRGBA'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRGBA@.
+--                   The unsafe flavor is 'getRGBA'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRGBA@, defined at @SDL3\/SDL_pixels.h 1432:34@
+getRGBASafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@pixelvalue@]: a pixel value.
+  -> PtrConst.PtrConst SDL_PixelFormatDetails
+  -- ^
+  --
+  --           [@format@]: a pointer to 'SDL_PixelFormatDetails' describing the pixel format.
+  -> PtrConst.PtrConst SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette for indexed formats, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue component, may be NULL.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha component, may be NULL.
+  -> IO ()
+getRGBASafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                Safe.sDL_GetRGBA (Coerce.coerce x00) x11 x22 x33 x44 x55 x66
diff --git a/src/SDL3/Sys/Platform.hs b/src/SDL3/Sys/Platform.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Platform.hs
@@ -0,0 +1,46 @@
+-- | SDL provides a means to identify the app\'s platform, both at compile time and runtime. Get the name of the platform.
+--
+--     Here are the names returned for some (but not all) supported platforms:
+--
+--     * \"Windows\"
+--
+--     * \"macOS\"
+--
+--     * \"Linux\"
+--
+--     * \"iOS\"
+--
+--     * \"Android\"
+--
+--     [Returns]: the name of the platform. If the correct platform name is not available, returns a string beginning with the text \"Unknown\".
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Platform.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Platform (
+  -- * Function aliases
+  SDL3.Sys.Platform.getPlatform,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Platform.Unsafe qualified as Unsafe
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPlatform@.
+--                   The safe import is not exported
+--                   : returns a compiled-in constant; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_GetPlatform@, defined at @SDL3\/SDL_platform.h 58:42@
+getPlatform :: IO (PtrConst.PtrConst BG.CChar)
+getPlatform = Unsafe.sDL_GetPlatform
diff --git a/src/SDL3/Sys/PlatformDefines.hs b/src/SDL3/Sys/PlatformDefines.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/PlatformDefines.hs
@@ -0,0 +1,13 @@
+-- | Platform-detection defines, baked at generation time.
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.PlatformDefines.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.PlatformDefines (
+  module SDL3.Sys.Bindgen.PlatformDefines,
+)
+where
+
+import SDL3.Sys.Bindgen.PlatformDefines
diff --git a/src/SDL3/Sys/Power.hs b/src/SDL3/Sys/Power.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Power.hs
@@ -0,0 +1,98 @@
+-- | SDL power management routines.
+--
+--     There is a single function in this category: @'getPowerInfo'@.
+--
+--     This function is useful for games on the go. This allows an app to know if it\'s running on a draining battery, which can be useful if the app wants to reduce processing, or perhaps framerate, to extend the duration of the battery\'s charge. Perhaps the app just wants to show a battery meter when fullscreen, or alert the user when the power is getting extremely low, so they can save their game. The basic state for the system\'s power supply.
+--
+--     These are results returned by @'getPowerInfo'@.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Power.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Power (
+  module SDL3.Sys.Bindgen.Power,
+
+  -- * Function aliases
+  SDL3.Sys.Power.getPowerInfo,
+  SDL3.Sys.Power.getPowerInfoSafe,
+)
+where
+
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Power
+import SDL3.Sys.Bindgen.Power.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Power.Unsafe qualified as Unsafe
+
+-- | Get the current power supply details.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     Battery status can change at any time; if you are concerned with power state, you should call this function frequently, and perhaps ignore changes until they seem to be stable for a few seconds.
+--
+--     It\'s possible a platform can only report battery percentage or time left but not both.
+--
+--     On some platforms, retrieving power supply details might be expensive. If you want to display continuous status you could call this function every minute or so.
+--
+--     [Returns]: the current battery state or @SDL_POWERSTATE_ERROR@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPowerInfo@.
+--                   The safe flavor is 'getPowerInfoSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPowerInfo@, defined at @SDL3\/SDL_power.h 100:44@
+getPowerInfo
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@seconds@]: a pointer filled in with the seconds of battery life left, or NULL to ignore. This will be filled in with -1 if we can\'t determine a value or there is no battery.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 when we can\'t determine a value or there is no battery.
+  -> IO SDL_PowerState
+getPowerInfo = Unsafe.sDL_GetPowerInfo
+
+-- | Get the current power supply details.
+--
+--     You should never take a battery status as absolute truth. Batteries (especially failing batteries) are delicate hardware, and the values reported here are best estimates based on what that hardware reports. It\'s not uncommon for older batteries to lose stored power much faster than it reports, or completely drain when reporting it has 20 percent left, etc.
+--
+--     Battery status can change at any time; if you are concerned with power state, you should call this function frequently, and perhaps ignore changes until they seem to be stable for a few seconds.
+--
+--     It\'s possible a platform can only report battery percentage or time left but not both.
+--
+--     On some platforms, retrieving power supply details might be expensive. If you want to display continuous status you could call this function every minute or so.
+--
+--     [Returns]: the current battery state or @SDL_POWERSTATE_ERROR@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPowerInfo@.
+--                   The unsafe flavor is 'getPowerInfo'
+--                   .
+--
+--     [C declaration]: @SDL_GetPowerInfo@, defined at @SDL3\/SDL_power.h 100:44@
+getPowerInfoSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@seconds@]: a pointer filled in with the seconds of battery life left, or NULL to ignore. This will be filled in with -1 if we can\'t determine a value or there is no battery.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@percent@]: a pointer filled in with the percentage of battery life left, between 0 and 100, or NULL to ignore. This will be filled in with -1 when we can\'t determine a value or there is no battery.
+  -> IO SDL_PowerState
+getPowerInfoSafe = Safe.sDL_GetPowerInfo
diff --git a/src/SDL3/Sys/Process.hs b/src/SDL3/Sys/Process.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Process.hs
@@ -0,0 +1,733 @@
+-- | Process control support.
+--
+--     These functions provide a cross-platform way to spawn and manage OS-level processes.
+--
+--     You can create a new subprocess with @'createProcess'@ and optionally read and write to it using @'readProcess'@ or @'getProcessInput'@ and @'getProcessOutput'@. If more advanced functionality like chaining input between processes is necessary, you can use @'createProcessWithProperties'@.
+--
+--     You can get the status of a created process with @'waitProcess'@, or terminate the process with @'killProcess'@.
+--
+--     Don\'t forget to call @'destroyProcess'@ to clean up, whether the process process was killed, terminated on its own, or is still running! An opaque handle representing a system process.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Process.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Process (
+  module SDL3.Sys.Bindgen.Process,
+
+  -- * Function aliases
+  SDL3.Sys.Process.createProcess,
+  SDL3.Sys.Process.createProcessSafe,
+  SDL3.Sys.Process.createProcessWithProperties,
+  SDL3.Sys.Process.createProcessWithPropertiesSafe,
+  SDL3.Sys.Process.getProcessProperties,
+  SDL3.Sys.Process.getProcessPropertiesSafe,
+  SDL3.Sys.Process.readProcess,
+  SDL3.Sys.Process.readProcessSafe,
+  SDL3.Sys.Process.getProcessInput,
+  SDL3.Sys.Process.getProcessInputSafe,
+  SDL3.Sys.Process.getProcessOutput,
+  SDL3.Sys.Process.getProcessOutputSafe,
+  SDL3.Sys.Process.killProcess,
+  SDL3.Sys.Process.killProcessSafe,
+  SDL3.Sys.Process.waitProcess,
+  SDL3.Sys.Process.waitProcessSafe,
+  SDL3.Sys.Process.destroyProcess,
+  SDL3.Sys.Process.destroyProcessSafe,
+)
+where
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Process
+import SDL3.Sys.Bindgen.Process.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Process.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Properties qualified
+
+-- | Create a new process.
+--
+--     The path to the executable is supplied in args[0]. args[1..N] are additional arguments passed on the command line of the new process, and the argument list should be terminated with a NULL, e.g.:
+--
+--     @
+--     const char *args[] = { \"myprogram\", \"argument\", NULL };
+--     @
+--
+--     Setting pipe_stdio to true is equivalent to setting @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ and @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ to @SDL_PROCESS_STDIO_APP@, and will allow the use of @'readProcess'@ or @'getProcessInput'@ and @'getProcessOutput'@.
+--
+--     See @'createProcessWithProperties'@ for more details.
+--
+--     [Returns]: the newly created and running process, or NULL if the process couldn\'t be created.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcessWithProperties', 'getProcessProperties', 'readProcess', 'getProcessInput', 'getProcessOutput', 'killProcess', 'waitProcess', 'destroyProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateProcess@.
+--                   The safe flavor is 'createProcessSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateProcess@, defined at @SDL3\/SDL_process.h 106:43@
+createProcess
+  :: PtrConst.PtrConst (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@args@]: the path and arguments for the new process.
+  -> Bool
+  -- ^
+  --
+  --           [@pipe_stdio@]: true to create pipes to the process\'s standard input and from the process\'s standard output, false for the process to have no input and inherit the application\'s standard output.
+  -> IO (BG.Ptr SDL_Process)
+createProcess =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_CreateProcess x00 (CBool.fromBool x11)
+
+-- | Create a new process.
+--
+--     The path to the executable is supplied in args[0]. args[1..N] are additional arguments passed on the command line of the new process, and the argument list should be terminated with a NULL, e.g.:
+--
+--     @
+--     const char *args[] = { \"myprogram\", \"argument\", NULL };
+--     @
+--
+--     Setting pipe_stdio to true is equivalent to setting @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ and @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ to @SDL_PROCESS_STDIO_APP@, and will allow the use of @'readProcess'@ or @'getProcessInput'@ and @'getProcessOutput'@.
+--
+--     See @'createProcessWithProperties'@ for more details.
+--
+--     [Returns]: the newly created and running process, or NULL if the process couldn\'t be created.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcessWithProperties', 'getProcessProperties', 'readProcess', 'getProcessInput', 'getProcessOutput', 'killProcess', 'waitProcess', 'destroyProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateProcess@.
+--                   The unsafe flavor is 'createProcess'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateProcess@, defined at @SDL3\/SDL_process.h 106:43@
+createProcessSafe
+  :: PtrConst.PtrConst (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@args@]: the path and arguments for the new process.
+  -> Bool
+  -- ^
+  --
+  --           [@pipe_stdio@]: true to create pipes to the process\'s standard input and from the process\'s standard output, false for the process to have no input and inherit the application\'s standard output.
+  -> IO (BG.Ptr SDL_Process)
+createProcessSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_CreateProcess x00 (CBool.fromBool x11)
+
+-- | Create a new process with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_PROCESS_CREATE_ARGS_POINTER'@: an array of strings containing the program to run, any arguments, and a NULL pointer, e.g. const char *args[] = { \"myprogram\", \"argument\", NULL }. This is a required property.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER'@: an SDL_Environment pointer. If this property is set, it will be the entire environment for the process, otherwise the current environment is used.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING'@: a UTF-8 encoded string representing the working directory for the process, defaults to the current working directory.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@: an 'SDL_ProcessIO' value describing where standard input for the process comes from, defaults to @SDL_PROCESS_STDIO_NULL@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDIN_POINTER'@: an SDL_IOStream pointer used for standard input when @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@: an 'SDL_ProcessIO' value describing where standard output for the process goes to, defaults to @SDL_PROCESS_STDIO_INHERITED@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDOUT_POINTER'@: an SDL_IOStream pointer used for standard output when @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@: an 'SDL_ProcessIO' value describing where standard error for the process goes to, defaults to @SDL_PROCESS_STDIO_INHERITED@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_POINTER'@: an SDL_IOStream pointer used for standard error when @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN'@: true if the error output of the process should be redirected into the standard output of the process. This property has no effect if @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ is set.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN'@: true if the process should run in the background. In this case the default input and output is @SDL_PROCESS_STDIO_NULL@ and the exitcode of the process is not available, and will always be 0.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_CMDLINE_STRING'@: a string containing the program to run and any parameters. This string is passed directly to @CreateProcess@ on Windows, and does nothing on other platforms. This property is only important if you want to start programs that does non-standard command-line processing, and in most cases using @'sDL_PROP_PROCESS_CREATE_ARGS_POINTER'@ is sufficient.
+--
+--     On POSIX platforms, wait() and waitpid(-1, ...) should not be called, and SIGCHLD should not be ignored or handled because those would prevent SDL from properly tracking the lifetime of the underlying process. You should use @'waitProcess'@ instead.
+--
+--     [Returns]: the newly created and running process, or NULL if the process couldn\'t be created.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'getProcessProperties', 'readProcess', 'getProcessInput', 'getProcessOutput', 'killProcess', 'waitProcess', 'destroyProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateProcessWithProperties@.
+--                   The safe flavor is 'createProcessWithPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateProcessWithProperties@, defined at @SDL3\/SDL_process.h 227:43@
+createProcessWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Process)
+createProcessWithProperties =
+  Unsafe.sDL_CreateProcessWithProperties
+
+-- | Create a new process with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_PROCESS_CREATE_ARGS_POINTER'@: an array of strings containing the program to run, any arguments, and a NULL pointer, e.g. const char *args[] = { \"myprogram\", \"argument\", NULL }. This is a required property.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_ENVIRONMENT_POINTER'@: an SDL_Environment pointer. If this property is set, it will be the entire environment for the process, otherwise the current environment is used.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_WORKING_DIRECTORY_STRING'@: a UTF-8 encoded string representing the working directory for the process, defaults to the current working directory.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@: an 'SDL_ProcessIO' value describing where standard input for the process comes from, defaults to @SDL_PROCESS_STDIO_NULL@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDIN_POINTER'@: an SDL_IOStream pointer used for standard input when @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@: an 'SDL_ProcessIO' value describing where standard output for the process goes to, defaults to @SDL_PROCESS_STDIO_INHERITED@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDOUT_POINTER'@: an SDL_IOStream pointer used for standard output when @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@: an 'SDL_ProcessIO' value describing where standard error for the process goes to, defaults to @SDL_PROCESS_STDIO_INHERITED@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_POINTER'@: an SDL_IOStream pointer used for standard error when @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ is set to @SDL_PROCESS_STDIO_REDIRECT@.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_STDERR_TO_STDOUT_BOOLEAN'@: true if the error output of the process should be redirected into the standard output of the process. This property has no effect if @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ is set.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_BACKGROUND_BOOLEAN'@: true if the process should run in the background. In this case the default input and output is @SDL_PROCESS_STDIO_NULL@ and the exitcode of the process is not available, and will always be 0.
+--
+--     * @'sDL_PROP_PROCESS_CREATE_CMDLINE_STRING'@: a string containing the program to run and any parameters. This string is passed directly to @CreateProcess@ on Windows, and does nothing on other platforms. This property is only important if you want to start programs that does non-standard command-line processing, and in most cases using @'sDL_PROP_PROCESS_CREATE_ARGS_POINTER'@ is sufficient.
+--
+--     On POSIX platforms, wait() and waitpid(-1, ...) should not be called, and SIGCHLD should not be ignored or handled because those would prevent SDL from properly tracking the lifetime of the underlying process. You should use @'waitProcess'@ instead.
+--
+--     [Returns]: the newly created and running process, or NULL if the process couldn\'t be created.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'getProcessProperties', 'readProcess', 'getProcessInput', 'getProcessOutput', 'killProcess', 'waitProcess', 'destroyProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateProcessWithProperties@.
+--                   The unsafe flavor is 'createProcessWithProperties'
+--                   .
+--
+--     [C declaration]: @SDL_CreateProcessWithProperties@, defined at @SDL3\/SDL_process.h 227:43@
+createProcessWithPropertiesSafe
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Process)
+createProcessWithPropertiesSafe =
+  Safe.sDL_CreateProcessWithProperties
+
+-- | Get the properties associated with a process.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_PROCESS_PID_NUMBER'@: the process ID of the process.
+--
+--     * @'sDL_PROP_PROCESS_STDIN_POINTER'@: an SDL_IOStream that can be used to write input to the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_STDOUT_POINTER'@: a non-blocking SDL_IOStream that can be used to read output from the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_STDERR_POINTER'@: a non-blocking SDL_IOStream that can be used to read error output from the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_BACKGROUND_BOOLEAN'@: true if the process is running in the background.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetProcessProperties@.
+--                   The safe flavor is 'getProcessPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetProcessProperties@, defined at @SDL3\/SDL_process.h 271:46@
+getProcessProperties
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: the process to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getProcessProperties =
+  Unsafe.sDL_GetProcessProperties
+
+-- | Get the properties associated with a process.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_PROCESS_PID_NUMBER'@: the process ID of the process.
+--
+--     * @'sDL_PROP_PROCESS_STDIN_POINTER'@: an SDL_IOStream that can be used to write input to the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_STDOUT_POINTER'@: a non-blocking SDL_IOStream that can be used to read output from the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_STDERR_POINTER'@: a non-blocking SDL_IOStream that can be used to read error output from the process, if it was created with @'sDL_PROP_PROCESS_CREATE_STDERR_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     * @'sDL_PROP_PROCESS_BACKGROUND_BOOLEAN'@: true if the process is running in the background.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetProcessProperties@.
+--                   The unsafe flavor is 'getProcessProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetProcessProperties@, defined at @SDL3\/SDL_process.h 271:46@
+getProcessPropertiesSafe
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: the process to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getProcessPropertiesSafe =
+  Safe.sDL_GetProcessProperties
+
+-- | Read all the output from a process.
+--
+--     If a process was created with I\/O enabled, you can use this function to read the output. This function blocks until the process is complete, capturing all output, and providing the process exit code.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with 'SDL3.Sys.Stdinc.free'.
+--
+--     [Returns]: the data or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'destroyProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadProcess@.
+--                   The safe flavor is 'readProcessSafe'
+--                   : blocks until the process closes its output.
+--
+--     [C declaration]: @SDL_ReadProcess@, defined at @SDL3\/SDL_process.h 308:36@
+readProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to read.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: a pointer filled in with the number of bytes read, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@exitcode@]: a pointer filled in with the process exit code if the process has exited, may be NULL.
+  -> IO (BG.Ptr BG.Void)
+readProcess = Unsafe.sDL_ReadProcess
+
+-- | Read all the output from a process.
+--
+--     If a process was created with I\/O enabled, you can use this function to read the output. This function blocks until the process is complete, capturing all output, and providing the process exit code.
+--
+--     The data is allocated with a zero byte at the end (null terminated) for convenience. This extra byte is not included in the value reported via @datasize@.
+--
+--     The data should be freed with 'SDL3.Sys.Stdinc.free'.
+--
+--     [Returns]: the data or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'destroyProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadProcess@.
+--                   The unsafe flavor is 'readProcess'
+--                   : blocks until the process closes its output.
+--
+--     [C declaration]: @SDL_ReadProcess@, defined at @SDL3\/SDL_process.h 308:36@
+readProcessSafe
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to read.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@datasize@]: a pointer filled in with the number of bytes read, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@exitcode@]: a pointer filled in with the process exit code if the process has exited, may be NULL.
+  -> IO (BG.Ptr BG.Void)
+readProcessSafe = Safe.sDL_ReadProcess
+
+-- | Get the SDL_IOStream associated with process standard input.
+--
+--     The process must have been created with @'createProcess'@ and pipe_stdio set to true, or with @'createProcessWithProperties'@ and @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     Writing to this stream can return less data than expected if the process hasn\'t read its input. It may be blocked waiting for its output to be read, if so you may need to call @'getProcessOutput'@ and read the output in parallel with writing input.
+--
+--     [Returns]: the input stream or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'getProcessOutput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetProcessInput@.
+--                   The safe flavor is 'getProcessInputSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetProcessInput@, defined at @SDL3\/SDL_process.h 334:44@
+getProcessInput
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to get the input stream for.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+getProcessInput = Unsafe.sDL_GetProcessInput
+
+-- | Get the SDL_IOStream associated with process standard input.
+--
+--     The process must have been created with @'createProcess'@ and pipe_stdio set to true, or with @'createProcessWithProperties'@ and @'sDL_PROP_PROCESS_CREATE_STDIN_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     Writing to this stream can return less data than expected if the process hasn\'t read its input. It may be blocked waiting for its output to be read, if so you may need to call @'getProcessOutput'@ and read the output in parallel with writing input.
+--
+--     [Returns]: the input stream or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'getProcessOutput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetProcessInput@.
+--                   The unsafe flavor is 'getProcessInput'
+--                   .
+--
+--     [C declaration]: @SDL_GetProcessInput@, defined at @SDL3\/SDL_process.h 334:44@
+getProcessInputSafe
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to get the input stream for.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+getProcessInputSafe = Safe.sDL_GetProcessInput
+
+-- | Get the SDL_IOStream associated with process standard output.
+--
+--     The process must have been created with @'createProcess'@ and pipe_stdio set to true, or with @'createProcessWithProperties'@ and @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     Reading from this stream can return 0 with 'SDL3.Sys.Iostream.getIOStatus' returning SDL_IO_STATUS_NOT_READY if no output is available yet.
+--
+--     [Returns]: the output stream or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'getProcessInput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetProcessOutput@.
+--                   The safe flavor is 'getProcessOutputSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetProcessOutput@, defined at @SDL3\/SDL_process.h 358:44@
+getProcessOutput
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to get the output stream for.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+getProcessOutput = Unsafe.sDL_GetProcessOutput
+
+-- | Get the SDL_IOStream associated with process standard output.
+--
+--     The process must have been created with @'createProcess'@ and pipe_stdio set to true, or with @'createProcessWithProperties'@ and @'sDL_PROP_PROCESS_CREATE_STDOUT_NUMBER'@ set to @SDL_PROCESS_STDIO_APP@.
+--
+--     Reading from this stream can return 0 with 'SDL3.Sys.Iostream.getIOStatus' returning SDL_IO_STATUS_NOT_READY if no output is available yet.
+--
+--     [Returns]: the output stream or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'getProcessInput'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetProcessOutput@.
+--                   The unsafe flavor is 'getProcessOutput'
+--                   .
+--
+--     [C declaration]: @SDL_GetProcessOutput@, defined at @SDL3\/SDL_process.h 358:44@
+getProcessOutputSafe
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to get the output stream for.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream)
+getProcessOutputSafe = Safe.sDL_GetProcessOutput
+
+-- | Stop a process.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'waitProcess', 'destroyProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_KillProcess@.
+--                   The safe flavor is 'killProcessSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_KillProcess@, defined at @SDL3\/SDL_process.h 381:34@
+killProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to stop.
+  -> Bool
+  -- ^
+  --
+  --           [@force@]: true to terminate the process immediately, false to try to stop the process gracefully. In general you should try to stop the process gracefully first as terminating a process may leave it with half-written data or in some other unstable state.
+  -> IO Bool
+killProcess =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_KillProcess x00 (CBool.fromBool x11))
+
+-- | Stop a process.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'waitProcess', 'destroyProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_KillProcess@.
+--                   The unsafe flavor is 'killProcess'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_KillProcess@, defined at @SDL3\/SDL_process.h 381:34@
+killProcessSafe
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to stop.
+  -> Bool
+  -- ^
+  --
+  --           [@force@]: true to terminate the process immediately, false to try to stop the process gracefully. In general you should try to stop the process gracefully first as terminating a process may leave it with half-written data or in some other unstable state.
+  -> IO Bool
+killProcessSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_KillProcess x00 (CBool.fromBool x11))
+
+-- | Wait for a process to finish.
+--
+--     This can be called multiple times to get the status of a process.
+--
+--     The exit code will be the exit code of the process if it terminates normally, a negative signal if it terminated due to a signal, or -255 otherwise. It will not be changed if the process is still running.
+--
+--     If you create a process with standard output piped to the application (@pipe_stdio@ being true) then you should read all of the process output before calling @'waitProcess'@. If you don\'t do this the process might be blocked indefinitely waiting for output to be read and @'waitProcess'@ will never return true;
+--
+--     [Returns]: true if the process exited, false otherwise.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'killProcess', 'destroyProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitProcess@.
+--                   The safe flavor is 'waitProcessSafe'
+--                   : blocks until the process exits.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitProcess@, defined at @SDL3\/SDL_process.h 414:34@
+waitProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to wait for.
+  -> Bool
+  -- ^
+  --
+  --           [@block@]: If true, block until the process finishes; otherwise, report on the process\' status.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@exitcode@]: a pointer filled in with the process exit code if the process has exited, may be NULL.
+  -> IO Bool
+waitProcess =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_WaitProcess x00 (CBool.fromBool x11) x22)
+
+-- | Wait for a process to finish.
+--
+--     This can be called multiple times to get the status of a process.
+--
+--     The exit code will be the exit code of the process if it terminates normally, a negative signal if it terminated due to a signal, or -255 otherwise. It will not be changed if the process is still running.
+--
+--     If you create a process with standard output piped to the application (@pipe_stdio@ being true) then you should read all of the process output before calling @'waitProcess'@. If you don\'t do this the process might be blocked indefinitely waiting for output to be read and @'waitProcess'@ will never return true;
+--
+--     [Returns]: true if the process exited, false otherwise.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'killProcess', 'destroyProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitProcess@.
+--                   The unsafe flavor is 'waitProcess'
+--                   : blocks until the process exits.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WaitProcess@, defined at @SDL3\/SDL_process.h 414:34@
+waitProcessSafe
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process to wait for.
+  -> Bool
+  -- ^
+  --
+  --           [@block@]: If true, block until the process finishes; otherwise, report on the process\' status.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@exitcode@]: a pointer filled in with the process exit code if the process has exited, may be NULL.
+  -> IO Bool
+waitProcessSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_WaitProcess x00 (CBool.fromBool x11) x22)
+
+-- | Destroy a previously created process object.
+--
+--     Note that this does not stop the process, just destroys the SDL object used to track it. If you want to stop the process you should use @'killProcess'@.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'killProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyProcess@.
+--                   The safe flavor is 'destroyProcessSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyProcess@, defined at @SDL3\/SDL_process.h 433:34@
+destroyProcess
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process object to destroy.
+  -> IO ()
+destroyProcess = Unsafe.sDL_DestroyProcess
+
+-- | Destroy a previously created process object.
+--
+--     Note that this does not stop the process, just destroys the SDL object used to track it. If you want to stop the process you should use @'killProcess'@.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProcess', 'createProcessWithProperties', 'killProcess'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyProcess@.
+--                   The unsafe flavor is 'destroyProcess'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyProcess@, defined at @SDL3\/SDL_process.h 433:34@
+destroyProcessSafe
+  :: BG.Ptr SDL_Process
+  -- ^
+  --
+  --           [@process@]: The process object to destroy.
+  -> IO ()
+destroyProcessSafe = Safe.sDL_DestroyProcess
diff --git a/src/SDL3/Sys/Properties.hs b/src/SDL3/Sys/Properties.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Properties.hs
@@ -0,0 +1,1481 @@
+-- | A property is a variable that can be created and retrieved by name at runtime.
+--
+--     All properties are part of a property group ('SDL_PropertiesID'). A property group can be created with the 'createProperties' function and destroyed with the 'destroyProperties' function.
+--
+--     Properties can be added to and retrieved from a property group through the following functions:
+--
+--     * 'setPointerProperty' and 'getPointerProperty' operate on @void*@ pointer types.
+--
+--     * 'setStringProperty' and 'getStringProperty' operate on string types.
+--
+--     * 'setNumberProperty' and 'getNumberProperty' operate on signed 64-bit integer types.
+--
+--     * 'setFloatProperty' and 'getFloatProperty' operate on floating point types.
+--
+--     * 'setBooleanProperty' and 'getBooleanProperty' operate on boolean types.
+--
+--     Properties can be removed from a group by using 'clearProperty'. An ID that represents a properties set.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Properties.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Properties (
+  module SDL3.Sys.Bindgen.Properties,
+
+  -- * Function aliases
+  SDL3.Sys.Properties.getGlobalProperties,
+  SDL3.Sys.Properties.getGlobalPropertiesSafe,
+  SDL3.Sys.Properties.createProperties,
+  SDL3.Sys.Properties.createPropertiesSafe,
+  SDL3.Sys.Properties.copyProperties,
+  SDL3.Sys.Properties.copyPropertiesSafe,
+  SDL3.Sys.Properties.lockProperties,
+  SDL3.Sys.Properties.lockPropertiesSafe,
+  SDL3.Sys.Properties.unlockProperties,
+  SDL3.Sys.Properties.unlockPropertiesSafe,
+  SDL3.Sys.Properties.setPointerPropertyWithCleanupSafe,
+  SDL3.Sys.Properties.setPointerProperty,
+  SDL3.Sys.Properties.setPointerPropertySafe,
+  SDL3.Sys.Properties.setStringProperty,
+  SDL3.Sys.Properties.setStringPropertySafe,
+  SDL3.Sys.Properties.setNumberProperty,
+  SDL3.Sys.Properties.setNumberPropertySafe,
+  SDL3.Sys.Properties.setFloatProperty,
+  SDL3.Sys.Properties.setFloatPropertySafe,
+  SDL3.Sys.Properties.setBooleanProperty,
+  SDL3.Sys.Properties.setBooleanPropertySafe,
+  SDL3.Sys.Properties.hasProperty,
+  SDL3.Sys.Properties.hasPropertySafe,
+  SDL3.Sys.Properties.getPropertyType,
+  SDL3.Sys.Properties.getPropertyTypeSafe,
+  SDL3.Sys.Properties.getPointerProperty,
+  SDL3.Sys.Properties.getPointerPropertySafe,
+  SDL3.Sys.Properties.getStringProperty,
+  SDL3.Sys.Properties.getStringPropertySafe,
+  SDL3.Sys.Properties.getNumberProperty,
+  SDL3.Sys.Properties.getNumberPropertySafe,
+  SDL3.Sys.Properties.getFloatProperty,
+  SDL3.Sys.Properties.getFloatPropertySafe,
+  SDL3.Sys.Properties.getBooleanProperty,
+  SDL3.Sys.Properties.getBooleanPropertySafe,
+  SDL3.Sys.Properties.clearProperty,
+  SDL3.Sys.Properties.clearPropertySafe,
+  SDL3.Sys.Properties.enumeratePropertiesSafe,
+  SDL3.Sys.Properties.destroyProperties,
+  SDL3.Sys.Properties.destroyPropertiesSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Properties
+import SDL3.Sys.Bindgen.Properties.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Properties.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Stdinc qualified
+
+-- | Get the global SDL properties.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGlobalProperties@.
+--                   The safe flavor is 'getGlobalPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGlobalProperties@, defined at @SDL3\/SDL_properties.h 118:46@
+getGlobalProperties :: IO SDL_PropertiesID
+getGlobalProperties = Unsafe.sDL_GetGlobalProperties
+
+-- | Get the global SDL properties.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGlobalProperties@.
+--                   The unsafe flavor is 'getGlobalProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetGlobalProperties@, defined at @SDL3\/SDL_properties.h 118:46@
+getGlobalPropertiesSafe :: IO SDL_PropertiesID
+getGlobalPropertiesSafe =
+  Safe.sDL_GetGlobalProperties
+
+-- | Create a group of properties.
+--
+--     All properties are automatically destroyed when 'SDL3.Sys.Init.quit' is called.
+--
+--     [Returns]: an ID for a new group of properties, or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateProperties@.
+--                   The safe flavor is 'createPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateProperties@, defined at @SDL3\/SDL_properties.h 134:46@
+createProperties :: IO SDL_PropertiesID
+createProperties = Unsafe.sDL_CreateProperties
+
+-- | Create a group of properties.
+--
+--     All properties are automatically destroyed when 'SDL3.Sys.Init.quit' is called.
+--
+--     [Returns]: an ID for a new group of properties, or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateProperties@.
+--                   The unsafe flavor is 'createProperties'
+--                   .
+--
+--     [C declaration]: @SDL_CreateProperties@, defined at @SDL3\/SDL_properties.h 134:46@
+createPropertiesSafe :: IO SDL_PropertiesID
+createPropertiesSafe = Safe.sDL_CreateProperties
+
+-- | Copy a group of properties.
+--
+--     Copy all the properties from one group of properties to another, with the exception of properties requiring cleanup (set using @'setPointerPropertyWithCleanupSafe'@), which will not be copied. Any property that already exists on @dst@ will be overwritten.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread. This function acquires simultaneous mutex locks on both the source and destination property sets.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CopyProperties@.
+--                   The safe flavor is 'copyPropertiesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CopyProperties@, defined at @SDL3\/SDL_properties.h 155:34@
+copyProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@src@]: the properties to copy.
+  -> SDL_PropertiesID
+  -- ^
+  --
+  --           [@dst@]: the destination properties.
+  -> IO Bool
+copyProperties =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_CopyProperties x00 x11)
+
+-- | Copy a group of properties.
+--
+--     Copy all the properties from one group of properties to another, with the exception of properties requiring cleanup (set using @'setPointerPropertyWithCleanupSafe'@), which will not be copied. Any property that already exists on @dst@ will be overwritten.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread. This function acquires simultaneous mutex locks on both the source and destination property sets.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CopyProperties@.
+--                   The unsafe flavor is 'copyProperties'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CopyProperties@, defined at @SDL3\/SDL_properties.h 155:34@
+copyPropertiesSafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@src@]: the properties to copy.
+  -> SDL_PropertiesID
+  -- ^
+  --
+  --           [@dst@]: the destination properties.
+  -> IO Bool
+copyPropertiesSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_CopyProperties x00 x11)
+
+-- | Lock a group of properties.
+--
+--     Obtain a multi-threaded lock for these properties. Other threads will wait while trying to lock these properties until they are unlocked. Properties must be unlocked before they are destroyed.
+--
+--     The lock is automatically taken when setting individual properties, this function is only needed when you want to set several properties atomically or want to guarantee that properties being queried aren\'t freed in another thread.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'unlockProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LockProperties@.
+--                   The safe flavor is 'lockPropertiesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LockProperties@, defined at @SDL3\/SDL_properties.h 179:34@
+lockProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to lock.
+  -> IO Bool
+lockProperties =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_LockProperties x00)
+
+-- | Lock a group of properties.
+--
+--     Obtain a multi-threaded lock for these properties. Other threads will wait while trying to lock these properties until they are unlocked. Properties must be unlocked before they are destroyed.
+--
+--     The lock is automatically taken when setting individual properties, this function is only needed when you want to set several properties atomically or want to guarantee that properties being queried aren\'t freed in another thread.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'unlockProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LockProperties@.
+--                   The unsafe flavor is 'lockProperties'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LockProperties@, defined at @SDL3\/SDL_properties.h 179:34@
+lockPropertiesSafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to lock.
+  -> IO Bool
+lockPropertiesSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_LockProperties x00)
+
+-- | Unlock a group of properties.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnlockProperties@.
+--                   The safe flavor is 'unlockPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockProperties@, defined at @SDL3\/SDL_properties.h 192:34@
+unlockProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to unlock.
+  -> IO ()
+unlockProperties = Unsafe.sDL_UnlockProperties
+
+-- | Unlock a group of properties.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnlockProperties@.
+--                   The unsafe flavor is 'unlockProperties'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockProperties@, defined at @SDL3\/SDL_properties.h 192:34@
+unlockPropertiesSafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to unlock.
+  -> IO ()
+unlockPropertiesSafe = Safe.sDL_UnlockProperties
+
+-- | Set a pointer property in a group of properties with a cleanup function that is called when the property is deleted.
+--
+--     The cleanup function is also called if setting the property fails for any reason.
+--
+--     For simply setting basic data types, like numbers, bools, or strings, use 'setNumberProperty', 'setBooleanProperty', or 'setStringProperty' instead, as those functions will handle cleanup on your behalf. This function is only for more complex, custom data.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPointerProperty', 'setPointerProperty', 'SDL_CleanupPropertyCallback'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetPointerPropertyWithCleanup@.
+--                   The unsafe import is not exported
+--                   : invokes the cleanup callback synchronously on failure or overwrite.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Properties.Unsafe.sDL_SetPointerPropertyWithCleanup@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetPointerPropertyWithCleanup@, defined at @SDL3\/SDL_properties.h 247:34@
+setPointerPropertyWithCleanupSafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> SDL_CleanupPropertyCallback
+  -- ^
+  --
+  --           [@cleanup@]: the function to call when this property is deleted, or NULL if no cleanup is necessary.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to the cleanup function.
+  -> IO Bool
+setPointerPropertyWithCleanupSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_SetPointerPropertyWithCleanup x00 x11 x22 x33 x44)
+
+-- | Set a pointer property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPointerProperty', 'hasProperty', 'setBooleanProperty', 'setFloatProperty', 'setNumberProperty', 'setPointerPropertyWithCleanupSafe', 'setStringProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetPointerProperty@.
+--                   The safe flavor is 'setPointerPropertySafe'
+--                   : overwriting a cleanup property invokes its cleanup synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetPointerProperty@, defined at @SDL3\/SDL_properties.h 270:34@
+setPointerProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> IO Bool
+setPointerProperty =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetPointerProperty x00 x11 x22)
+
+-- | Set a pointer property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPointerProperty', 'hasProperty', 'setBooleanProperty', 'setFloatProperty', 'setNumberProperty', 'setPointerPropertyWithCleanupSafe', 'setStringProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetPointerProperty@.
+--                   The unsafe flavor is 'setPointerProperty'
+--                   : overwriting a cleanup property invokes its cleanup synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetPointerProperty@, defined at @SDL3\/SDL_properties.h 270:34@
+setPointerPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> IO Bool
+setPointerPropertySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetPointerProperty x00 x11 x22)
+
+-- | Set a string property in a group of properties.
+--
+--     This function makes a copy of the string; the caller does not have to preserve the data after this call completes.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getStringProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetStringProperty@.
+--                   The safe flavor is 'setStringPropertySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetStringProperty@, defined at @SDL3\/SDL_properties.h 290:34@
+setStringProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> IO Bool
+setStringProperty =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetStringProperty x00 x11 x22)
+
+-- | Set a string property in a group of properties.
+--
+--     This function makes a copy of the string; the caller does not have to preserve the data after this call completes.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getStringProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetStringProperty@.
+--                   The unsafe flavor is 'setStringProperty'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetStringProperty@, defined at @SDL3\/SDL_properties.h 290:34@
+setStringPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the new value of the property, or NULL to delete the property.
+  -> IO Bool
+setStringPropertySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetStringProperty x00 x11 x22)
+
+-- | Set an integer property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumberProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetNumberProperty@.
+--                   The safe flavor is 'setNumberPropertySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetNumberProperty@, defined at @SDL3\/SDL_properties.h 307:34@
+setNumberProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO Bool
+setNumberProperty =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetNumberProperty x00 x11 (Coerce.coerce x22))
+
+-- | Set an integer property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumberProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetNumberProperty@.
+--                   The unsafe flavor is 'setNumberProperty'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetNumberProperty@, defined at @SDL3\/SDL_properties.h 307:34@
+setNumberPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO Bool
+setNumberPropertySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetNumberProperty x00 x11 (Coerce.coerce x22))
+
+-- | Set a floating point property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getFloatProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetFloatProperty@.
+--                   The safe flavor is 'setFloatPropertySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetFloatProperty@, defined at @SDL3\/SDL_properties.h 324:34@
+setFloatProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> Float
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO Bool
+setFloatProperty =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetFloatProperty x00 x11 (Coerce.coerce x22))
+
+-- | Set a floating point property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getFloatProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetFloatProperty@.
+--                   The unsafe flavor is 'setFloatProperty'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetFloatProperty@, defined at @SDL3\/SDL_properties.h 324:34@
+setFloatPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> Float
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO Bool
+setFloatPropertySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetFloatProperty x00 x11 (Coerce.coerce x22))
+
+-- | Set a boolean property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getBooleanProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetBooleanProperty@.
+--                   The safe flavor is 'setBooleanPropertySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetBooleanProperty@, defined at @SDL3\/SDL_properties.h 341:34@
+setBooleanProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> Bool
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO Bool
+setBooleanProperty =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetBooleanProperty x00 x11 (CBool.fromBool x22))
+
+-- | Set a boolean property in a group of properties.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getBooleanProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetBooleanProperty@.
+--                   The unsafe flavor is 'setBooleanProperty'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetBooleanProperty@, defined at @SDL3\/SDL_properties.h 341:34@
+setBooleanPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to modify.
+  -> Bool
+  -- ^
+  --
+  --           [@value@]: the new value of the property.
+  -> IO Bool
+setBooleanPropertySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetBooleanProperty x00 x11 (CBool.fromBool x22))
+
+-- | Return whether a property exists in a group of properties.
+--
+--     [Returns]: true if the property exists, or false if it doesn\'t.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPropertyType'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasProperty@.
+--                   The safe flavor is 'hasPropertySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasProperty@, defined at @SDL3\/SDL_properties.h 356:34@
+hasProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> IO Bool
+hasProperty =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_HasProperty x00 x11)
+
+-- | Return whether a property exists in a group of properties.
+--
+--     [Returns]: true if the property exists, or false if it doesn\'t.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPropertyType'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HasProperty@.
+--                   The unsafe flavor is 'hasProperty'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasProperty@, defined at @SDL3\/SDL_properties.h 356:34@
+hasPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> IO Bool
+hasPropertySafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_HasProperty x00 x11)
+
+-- | Get the type of a property in a group of properties.
+--
+--     [Returns]: the type of the property, or SDL_PROPERTY_TYPE_INVALID if it is not set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPropertyType@.
+--                   The safe flavor is 'getPropertyTypeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPropertyType@, defined at @SDL3\/SDL_properties.h 372:46@
+getPropertyType
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> IO SDL_PropertyType
+getPropertyType = Unsafe.sDL_GetPropertyType
+
+-- | Get the type of a property in a group of properties.
+--
+--     [Returns]: the type of the property, or SDL_PROPERTY_TYPE_INVALID if it is not set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPropertyType@.
+--                   The unsafe flavor is 'getPropertyType'
+--                   .
+--
+--     [C declaration]: @SDL_GetPropertyType@, defined at @SDL3\/SDL_properties.h 372:46@
+getPropertyTypeSafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> IO SDL_PropertyType
+getPropertyTypeSafe = Safe.sDL_GetPropertyType
+
+-- | Get a pointer property from a group of properties.
+--
+--     By convention, the names of properties that SDL exposes on objects will start with \"SDL.\", and properties that SDL uses internally will start with \"SDL.internal.\". These should be considered read-only and should not be modified by applications.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a pointer property.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the data returned is not protected and could potentially be freed if you call @'setPointerProperty'@ or @'clearProperty'@ on these properties from another thread. If you need to avoid this, use @'lockProperties'@ and @'unlockProperties'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getBooleanProperty', 'getFloatProperty', 'getNumberProperty', 'getPropertyType', 'getStringProperty', 'hasProperty', 'setPointerProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPointerProperty@.
+--                   The safe flavor is 'getPointerPropertySafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPointerProperty@, defined at @SDL3\/SDL_properties.h 405:36@
+getPointerProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO (BG.Ptr BG.Void)
+getPointerProperty = Unsafe.sDL_GetPointerProperty
+
+-- | Get a pointer property from a group of properties.
+--
+--     By convention, the names of properties that SDL exposes on objects will start with \"SDL.\", and properties that SDL uses internally will start with \"SDL.internal.\". These should be considered read-only and should not be modified by applications.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a pointer property.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the data returned is not protected and could potentially be freed if you call @'setPointerProperty'@ or @'clearProperty'@ on these properties from another thread. If you need to avoid this, use @'lockProperties'@ and @'unlockProperties'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getBooleanProperty', 'getFloatProperty', 'getNumberProperty', 'getPropertyType', 'getStringProperty', 'hasProperty', 'setPointerProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPointerProperty@.
+--                   The unsafe flavor is 'getPointerProperty'
+--                   .
+--
+--     [C declaration]: @SDL_GetPointerProperty@, defined at @SDL3\/SDL_properties.h 405:36@
+getPointerPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO (BG.Ptr BG.Void)
+getPointerPropertySafe = Safe.sDL_GetPointerProperty
+
+-- | Get a string property from a group of properties.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a string property.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the data returned is not protected and could potentially be freed if you call @'setStringProperty'@ or @'clearProperty'@ on these properties from another thread. If you need to avoid this, use @'lockProperties'@ and @'unlockProperties'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPropertyType', 'hasProperty', 'setStringProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetStringProperty@.
+--                   The safe flavor is 'getStringPropertySafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetStringProperty@, defined at @SDL3\/SDL_properties.h 429:42@
+getStringProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getStringProperty = Unsafe.sDL_GetStringProperty
+
+-- | Get a string property from a group of properties.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a string property.
+--
+--     [Thread safety]: It is safe to call this function from any thread, although the data returned is not protected and could potentially be freed if you call @'setStringProperty'@ or @'clearProperty'@ on these properties from another thread. If you need to avoid this, use @'lockProperties'@ and @'unlockProperties'@.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPropertyType', 'hasProperty', 'setStringProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetStringProperty@.
+--                   The unsafe flavor is 'getStringProperty'
+--                   .
+--
+--     [C declaration]: @SDL_GetStringProperty@, defined at @SDL3\/SDL_properties.h 429:42@
+getStringPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getStringPropertySafe = Safe.sDL_GetStringProperty
+
+-- | Get a number property from a group of properties.
+--
+--     You can use @'getPropertyType'@ to query whether the property exists and is a number property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a number property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPropertyType', 'hasProperty', 'setNumberProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumberProperty@.
+--                   The safe flavor is 'getNumberPropertySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumberProperty@, defined at @SDL3\/SDL_properties.h 451:36@
+getNumberProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO BG.Int64
+getNumberProperty =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_GetNumberProperty x00 x11 (Coerce.coerce x22))
+
+-- | Get a number property from a group of properties.
+--
+--     You can use @'getPropertyType'@ to query whether the property exists and is a number property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a number property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPropertyType', 'hasProperty', 'setNumberProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumberProperty@.
+--                   The unsafe flavor is 'getNumberProperty'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumberProperty@, defined at @SDL3\/SDL_properties.h 451:36@
+getNumberPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO BG.Int64
+getNumberPropertySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_GetNumberProperty x00 x11 (Coerce.coerce x22))
+
+-- | Get a floating point property from a group of properties.
+--
+--     You can use @'getPropertyType'@ to query whether the property exists and is a floating point property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a float property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPropertyType', 'hasProperty', 'setFloatProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetFloatProperty@.
+--                   The safe flavor is 'getFloatPropertySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetFloatProperty@, defined at @SDL3\/SDL_properties.h 473:35@
+getFloatProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> Float
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO Float
+getFloatProperty =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_GetFloatProperty x00 x11 (Coerce.coerce x22))
+
+-- | Get a floating point property from a group of properties.
+--
+--     You can use @'getPropertyType'@ to query whether the property exists and is a floating point property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a float property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPropertyType', 'hasProperty', 'setFloatProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetFloatProperty@.
+--                   The unsafe flavor is 'getFloatProperty'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetFloatProperty@, defined at @SDL3\/SDL_properties.h 473:35@
+getFloatPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> Float
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO Float
+getFloatPropertySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_GetFloatProperty x00 x11 (Coerce.coerce x22))
+
+-- | Get a boolean property from a group of properties.
+--
+--     You can use @'getPropertyType'@ to query whether the property exists and is a boolean property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a boolean property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPropertyType', 'hasProperty', 'setBooleanProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetBooleanProperty@.
+--                   The safe flavor is 'getBooleanPropertySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetBooleanProperty@, defined at @SDL3\/SDL_properties.h 495:34@
+getBooleanProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> Bool
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO Bool
+getBooleanProperty =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetBooleanProperty x00 x11 (CBool.fromBool x22))
+
+-- | Get a boolean property from a group of properties.
+--
+--     You can use @'getPropertyType'@ to query whether the property exists and is a boolean property.
+--
+--     [Returns]: the value of the property, or @default_value@ if it is not set or not a boolean property.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPropertyType', 'hasProperty', 'setBooleanProperty'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetBooleanProperty@.
+--                   The unsafe flavor is 'getBooleanProperty'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetBooleanProperty@, defined at @SDL3\/SDL_properties.h 495:34@
+getBooleanPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to query.
+  -> Bool
+  -- ^
+  --
+  --           [@default_value@]: the default value of the property.
+  -> IO Bool
+getBooleanPropertySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetBooleanProperty x00 x11 (CBool.fromBool x22))
+
+-- | Clear a property from a group of properties.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ClearProperty@.
+--                   The safe flavor is 'clearPropertySafe'
+--                   : clearing a cleanup property invokes its cleanup synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearProperty@, defined at @SDL3\/SDL_properties.h 509:34@
+clearProperty
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to clear.
+  -> IO Bool
+clearProperty =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ClearProperty x00 x11)
+
+-- | Clear a property from a group of properties.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ClearProperty@.
+--                   The unsafe flavor is 'clearProperty'
+--                   : clearing a cleanup property invokes its cleanup synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearProperty@, defined at @SDL3\/SDL_properties.h 509:34@
+clearPropertySafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the property to clear.
+  -> IO Bool
+clearPropertySafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ClearProperty x00 x11)
+
+-- | Enumerate the properties contained in a group of properties.
+--
+--     The callback function is called for each property in the group of properties. The properties are locked during enumeration.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EnumerateProperties@.
+--                   The unsafe import is not exported
+--                   : invokes the callback per property synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Properties.Unsafe.sDL_EnumerateProperties@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_EnumerateProperties@, defined at @SDL3\/SDL_properties.h 546:34@
+enumeratePropertiesSafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to query.
+  -> SDL_EnumeratePropertiesCallback
+  -- ^
+  --
+  --           [@callback@]: the function to call for each property.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO Bool
+enumeratePropertiesSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_EnumerateProperties x00 x11 x22)
+
+-- | Destroy a group of properties.
+--
+--     All properties are deleted and their cleanup functions will be called, if any.
+--
+--     [Thread safety]: This function should not be called while these properties are locked or other threads might be setting or getting values from these properties.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyProperties@.
+--                   The safe flavor is 'destroyPropertiesSafe'
+--                   : invokes cleanup callbacks synchronously.
+--
+--     [C declaration]: @SDL_DestroyProperties@, defined at @SDL3\/SDL_properties.h 564:34@
+destroyProperties
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to destroy.
+  -> IO ()
+destroyProperties = Unsafe.sDL_DestroyProperties
+
+-- | Destroy a group of properties.
+--
+--     All properties are deleted and their cleanup functions will be called, if any.
+--
+--     [Thread safety]: This function should not be called while these properties are locked or other threads might be setting or getting values from these properties.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyProperties@.
+--                   The unsafe flavor is 'destroyProperties'
+--                   : invokes cleanup callbacks synchronously.
+--
+--     [C declaration]: @SDL_DestroyProperties@, defined at @SDL3\/SDL_properties.h 564:34@
+destroyPropertiesSafe
+  :: SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to destroy.
+  -> IO ()
+destroyPropertiesSafe = Safe.sDL_DestroyProperties
diff --git a/src/SDL3/Sys/Rect.hs b/src/SDL3/Sys/Rect.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Rect.hs
@@ -0,0 +1,750 @@
+-- | Some helper functions for managing rectangles and 2D points, in both integer and floating point versions. The structure that defines a point (using integers).
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRectEnclosingPoints', 'pointInRect'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Rect.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Rect (
+  module SDL3.Sys.Bindgen.Rect,
+
+  -- * Function aliases
+  SDL3.Sys.Rect.rectToFRect,
+  SDL3.Sys.Rect.pointInRect,
+  SDL3.Sys.Rect.rectEmpty,
+  SDL3.Sys.Rect.rectsEqual,
+  SDL3.Sys.Rect.hasRectIntersection,
+  SDL3.Sys.Rect.getRectIntersection,
+  SDL3.Sys.Rect.getRectUnion,
+  SDL3.Sys.Rect.getRectEnclosingPoints,
+  SDL3.Sys.Rect.getRectAndLineIntersection,
+  SDL3.Sys.Rect.pointInRectFloat,
+  SDL3.Sys.Rect.rectEmptyFloat,
+  SDL3.Sys.Rect.rectsEqualEpsilon,
+  SDL3.Sys.Rect.rectsEqualFloat,
+  SDL3.Sys.Rect.hasRectIntersectionFloat,
+  SDL3.Sys.Rect.getRectIntersectionFloat,
+  SDL3.Sys.Rect.getRectUnionFloat,
+  SDL3.Sys.Rect.getRectEnclosingPointsFloat,
+  SDL3.Sys.Rect.getRectAndLineIntersectionFloat,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Rect
+import SDL3.Sys.Bindgen.Rect.Unsafe qualified as Unsafe
+
+-- | Convert an 'SDL_Rect' to 'SDL_FRect'
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RectToFRect@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_RectToFRect@, defined at @SDL3\/SDL_rect.h 129:23@
+rectToFRect
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to an 'SDL_Rect'.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@frect@]: a pointer filled in with the floating point representation of @rect@.
+  -> IO ()
+rectToFRect = Unsafe.sDL_RectToFRect
+
+-- | Determine whether a point resides inside a rectangle.
+--
+--     A point is considered part of a rectangle if both @p@ and @r@ are not NULL, and @p@ \'s x and y coordinates are >= to the rectangle\'s top left corner, and \< the rectangle\'s x+w and y+h. So a 1x1 rectangle considers point (0,0) as \"inside\" and (0,1) as not.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if @p@ is contained by @r@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PointInRect@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PointInRect@, defined at @SDL3\/SDL_rect.h 158:23@
+pointInRect
+  :: PtrConst.PtrConst SDL_Point
+  -- ^
+  --
+  --           [@p@]: the point to test.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO Bool
+pointInRect =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_PointInRect x00 x11)
+
+-- | Determine whether a rectangle has no area.
+--
+--     A rectangle is considered \"empty\" for this function if @r@ is NULL, or if @r@ \'s width and\/or height are \<= 0.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangle is \"empty\", false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RectEmpty@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RectEmpty@, defined at @SDL3\/SDL_rect.h 182:23@
+rectEmpty
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO Bool
+rectEmpty =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_RectEmpty x00)
+
+-- | Determine whether two rectangles are equal.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height match.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RectsEqual@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RectsEqual@, defined at @SDL3\/SDL_rect.h 206:23@
+rectsEqual
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@a@]: the first rectangle to test.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@b@]: the second rectangle to test.
+  -> IO Bool
+rectsEqual =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_RectsEqual x00 x11)
+
+-- | Determine whether two rectangles intersect.
+--
+--     If either pointer is NULL the function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRectIntersection'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasRectIntersection@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasRectIntersection@, defined at @SDL3\/SDL_rect.h 227:34@
+hasRectIntersection
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+  -> IO Bool
+hasRectIntersection =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_HasRectIntersection x00 x11)
+
+-- | Calculate the intersection of two rectangles.
+--
+--     If @result@ is NULL then this function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasRectIntersection'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRectIntersection@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRectIntersection@, defined at @SDL3\/SDL_rect.h 246:34@
+getRectIntersection
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+  -> BG.Ptr SDL_Rect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_Rect' structure filled in with the intersection of rectangles @A@ and @B@.
+  -> IO Bool
+getRectIntersection =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetRectIntersection x00 x11 x22)
+
+-- | Calculate the union of two rectangles.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRectUnion@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRectUnion@, defined at @SDL3\/SDL_rect.h 262:34@
+getRectUnion
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_Rect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_Rect' structure representing the second rectangle.
+  -> BG.Ptr SDL_Rect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_Rect' structure filled in with the union of rectangles @A@ and @B@.
+  -> IO Bool
+getRectUnion =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetRectUnion x00 x11 x22)
+
+-- | Calculate a minimal rectangle enclosing a set of points.
+--
+--     If @clip@ is not NULL then only points inside of the clipping rectangle are considered.
+--
+--     [Returns]: true if any points were enclosed or false if all the points were outside of the clipping rectangle.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRectEnclosingPoints@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRectEnclosingPoints@, defined at @SDL3\/SDL_rect.h 283:34@
+getRectEnclosingPoints
+  :: PtrConst.PtrConst SDL_Point
+  -- ^
+  --
+  --           [@points@]: an array of 'SDL_Point' structures representing points to be enclosed.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of structures in the @points@ array.
+  -> PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@clip@]: an 'SDL_Rect' used for clipping or NULL to enclose all points.
+  -> BG.Ptr SDL_Rect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_Rect' structure filled in with the minimal enclosing rectangle.
+  -> IO Bool
+getRectEnclosingPoints =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_GetRectEnclosingPoints x00 (Coerce.coerce x11) x22 x33)
+
+-- | Calculate the intersection of a rectangle and line segment.
+--
+--     This function is used to clip a line segment to a rectangle. A line segment contained entirely within the rectangle or that does not intersect will remain unchanged. A line segment that crosses the rectangle at either or both ends will be clipped to the boundary of the rectangle and the new coordinates saved in @X1@, @Y1@, @X2@, and\/or @Y2@ as necessary.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRectAndLineIntersection@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRectAndLineIntersection@, defined at @SDL3\/SDL_rect.h 305:34@
+getRectAndLineIntersection
+  :: PtrConst.PtrConst SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an 'SDL_Rect' structure representing the rectangle to intersect.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@X1@]: a pointer to the starting X-coordinate of the line.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@Y1@]: a pointer to the starting Y-coordinate of the line.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@X2@]: a pointer to the ending X-coordinate of the line.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@Y2@]: a pointer to the ending Y-coordinate of the line.
+  -> IO Bool
+getRectAndLineIntersection =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_GetRectAndLineIntersection x00 x11 x22 x33 x44)
+
+-- | Determine whether a point resides inside a floating point rectangle.
+--
+--     A point is considered part of a rectangle if both @p@ and @r@ are not NULL, and @p@ \'s x and y coordinates are >= to the rectangle\'s top left corner, and \<= the rectangle\'s x+w and y+h. So a 1x1 rectangle considers point (0,0) and (0,1) as \"inside\" and (0,2) as not.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if @p@ is contained by @r@, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PointInRectFloat@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PointInRectFloat@, defined at @SDL3\/SDL_rect.h 331:23@
+pointInRectFloat
+  :: PtrConst.PtrConst SDL_FPoint
+  -- ^
+  --
+  --           [@p@]: the point to test.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO Bool
+pointInRectFloat =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_PointInRectFloat x00 x11)
+
+-- | Determine whether a floating point rectangle takes no space.
+--
+--     A rectangle is considered \"empty\" for this function if @r@ is NULL, or if @r@ \'s width and\/or height are \< 0.0f.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangle is \"empty\", false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RectEmptyFloat@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RectEmptyFloat@, defined at @SDL3\/SDL_rect.h 355:23@
+rectEmptyFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@r@]: the rectangle to test.
+  -> IO Bool
+rectEmptyFloat =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_RectEmptyFloat x00)
+
+-- | Determine whether two floating point rectangles are equal, within some given epsilon.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height are within @epsilon@ of each other. If you don\'t know what value to use for @epsilon@, you should call the 'rectsEqualFloat' function instead.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rectsEqualFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RectsEqualEpsilon@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RectsEqualEpsilon@, defined at @SDL3\/SDL_rect.h 385:23@
+rectsEqualEpsilon
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@a@]: the first rectangle to test.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@b@]: the second rectangle to test.
+  -> Float
+  -- ^
+  --
+  --           [@epsilon@]: the epsilon value for comparison.
+  -> IO Bool
+rectsEqualEpsilon =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_RectsEqualEpsilon x00 x11 (Coerce.coerce x22))
+
+-- | Determine whether two floating point rectangles are equal, within a default epsilon.
+--
+--     Rectangles are considered equal if both are not NULL and each of their x, y, width and height are within SDL_FLT_EPSILON of each other. This is often a reasonable way to compare two floating point rectangles and deal with the slight precision variations in floating point calculations that tend to pop up.
+--
+--     Note that this is a forced-inline function in a header, and not a public API function available in the SDL library (which is to say, the code is embedded in the calling program and the linker and dynamic loader will not be able to find this function inside SDL itself).
+--
+--     [Returns]: true if the rectangles are equal, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rectsEqualEpsilon'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RectsEqualFloat@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RectsEqualFloat@, defined at @SDL3\/SDL_rect.h 420:23@
+rectsEqualFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@a@]: the first rectangle to test.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@b@]: the second rectangle to test.
+  -> IO Bool
+rectsEqualFloat =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_RectsEqualFloat x00 x11)
+
+-- | Determine whether two rectangles intersect with float precision.
+--
+--     If either pointer is NULL the function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRectIntersection'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HasRectIntersectionFloat@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HasRectIntersectionFloat@, defined at @SDL3\/SDL_rect.h 440:34@
+hasRectIntersectionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+  -> IO Bool
+hasRectIntersectionFloat =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_HasRectIntersectionFloat x00 x11)
+
+-- | Calculate the intersection of two rectangles with float precision.
+--
+--     If @result@ is NULL then this function will return false.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hasRectIntersectionFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRectIntersectionFloat@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRectIntersectionFloat@, defined at @SDL3\/SDL_rect.h 459:34@
+getRectIntersectionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_FRect' structure filled in with the intersection of rectangles @A@ and @B@.
+  -> IO Bool
+getRectIntersectionFloat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetRectIntersectionFloat x00 x11 x22)
+
+-- | Calculate the union of two rectangles with float precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRectUnionFloat@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRectUnionFloat@, defined at @SDL3\/SDL_rect.h 475:34@
+getRectUnionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@A@]: an 'SDL_FRect' structure representing the first rectangle.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@B@]: an 'SDL_FRect' structure representing the second rectangle.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_FRect' structure filled in with the union of rectangles @A@ and @B@.
+  -> IO Bool
+getRectUnionFloat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetRectUnionFloat x00 x11 x22)
+
+-- | Calculate a minimal rectangle enclosing a set of points with float precision.
+--
+--     If @clip@ is not NULL then only points inside of the clipping rectangle are considered.
+--
+--     [Returns]: true if any points were enclosed or false if all the points were outside of the clipping rectangle.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRectEnclosingPointsFloat@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRectEnclosingPointsFloat@, defined at @SDL3\/SDL_rect.h 497:34@
+getRectEnclosingPointsFloat
+  :: PtrConst.PtrConst SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: an array of 'SDL_FPoint' structures representing points to be enclosed.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of structures in the @points@ array.
+  -> PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@clip@]: an 'SDL_FRect' used for clipping or NULL to enclose all points.
+  -> BG.Ptr SDL_FRect
+  -- ^
+  --
+  --           [@result@]: an 'SDL_FRect' structure filled in with the minimal enclosing rectangle.
+  -> IO Bool
+getRectEnclosingPointsFloat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_GetRectEnclosingPointsFloat x00 (Coerce.coerce x11) x22 x33)
+
+-- | Calculate the intersection of a rectangle and line segment with float precision.
+--
+--     This function is used to clip a line segment to a rectangle. A line segment contained entirely within the rectangle or that does not intersect will remain unchanged. A line segment that crosses the rectangle at either or both ends will be clipped to the boundary of the rectangle and the new coordinates saved in @X1@, @Y1@, @X2@, and\/or @Y2@ as necessary.
+--
+--     [Returns]: true if there is an intersection, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRectAndLineIntersectionFloat@.
+--                   The safe import is not exported
+--                   : pure geometry on caller-supplied structs; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRectAndLineIntersectionFloat@, defined at @SDL3\/SDL_rect.h 520:34@
+getRectAndLineIntersectionFloat
+  :: PtrConst.PtrConst SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: an 'SDL_FRect' structure representing the rectangle to intersect.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@X1@]: a pointer to the starting X-coordinate of the line.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@Y1@]: a pointer to the starting Y-coordinate of the line.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@X2@]: a pointer to the ending X-coordinate of the line.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@Y2@]: a pointer to the ending Y-coordinate of the line.
+  -> IO Bool
+getRectAndLineIntersectionFloat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_GetRectAndLineIntersectionFloat x00 x11 x22 x33 x44)
diff --git a/src/SDL3/Sys/Render.hs b/src/SDL3/Sys/Render.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Render.hs
@@ -0,0 +1,9167 @@
+-- | Header file for SDL 2D rendering functions.
+--
+--     This API supports the following features:
+--
+--     * single pixel points
+--
+--     * single pixel lines
+--
+--     * filled rectangles
+--
+--     * texture images
+--
+--     * 2D polygons
+--
+--     The primitives may be drawn in opaque, blended, or additive modes.
+--
+--     The texture images may be drawn in opaque, blended, or additive modes. They can have an additional color tint or alpha modulation applied to them, and may also be stretched with linear interpolation.
+--
+--     This API is designed to accelerate simple 2D operations. You may want more functionality such as 3D polygons and particle effects, and in that case you should use SDL\'s OpenGL\/Direct3D support, the SDL3 GPU API, or one of the many good 3D engines.
+--
+--     These functions must be called from the main thread. See this bug for details: [https:\/\/github.com\/libsdl-org\/SDL\/issues\/986](https://github.com/libsdl-org/SDL/issues/986) The name of the software renderer.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Render.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Render (
+  module SDL3.Sys.Bindgen.Render,
+
+  -- * Function aliases
+  SDL3.Sys.Render.getNumRenderDrivers,
+  SDL3.Sys.Render.getNumRenderDriversSafe,
+  SDL3.Sys.Render.getRenderDriver,
+  SDL3.Sys.Render.getRenderDriverSafe,
+  SDL3.Sys.Render.createWindowAndRenderer,
+  SDL3.Sys.Render.createWindowAndRendererSafe,
+  SDL3.Sys.Render.createRenderer,
+  SDL3.Sys.Render.createRendererSafe,
+  SDL3.Sys.Render.createRendererWithProperties,
+  SDL3.Sys.Render.createRendererWithPropertiesSafe,
+  SDL3.Sys.Render.createGPURenderer,
+  SDL3.Sys.Render.createGPURendererSafe,
+  SDL3.Sys.Render.getGPURendererDevice,
+  SDL3.Sys.Render.getGPURendererDeviceSafe,
+  SDL3.Sys.Render.createSoftwareRenderer,
+  SDL3.Sys.Render.createSoftwareRendererSafe,
+  SDL3.Sys.Render.getRenderer,
+  SDL3.Sys.Render.getRendererSafe,
+  SDL3.Sys.Render.getRenderWindow,
+  SDL3.Sys.Render.getRenderWindowSafe,
+  SDL3.Sys.Render.getRendererName,
+  SDL3.Sys.Render.getRendererNameSafe,
+  SDL3.Sys.Render.getRendererProperties,
+  SDL3.Sys.Render.getRendererPropertiesSafe,
+  SDL3.Sys.Render.getRenderOutputSize,
+  SDL3.Sys.Render.getRenderOutputSizeSafe,
+  SDL3.Sys.Render.getCurrentRenderOutputSize,
+  SDL3.Sys.Render.getCurrentRenderOutputSizeSafe,
+  SDL3.Sys.Render.createTexture,
+  SDL3.Sys.Render.createTextureSafe,
+  SDL3.Sys.Render.createTextureFromSurface,
+  SDL3.Sys.Render.createTextureFromSurfaceSafe,
+  SDL3.Sys.Render.createTextureWithProperties,
+  SDL3.Sys.Render.createTextureWithPropertiesSafe,
+  SDL3.Sys.Render.getTextureProperties,
+  SDL3.Sys.Render.getTexturePropertiesSafe,
+  SDL3.Sys.Render.getRendererFromTexture,
+  SDL3.Sys.Render.getRendererFromTextureSafe,
+  SDL3.Sys.Render.getTextureSize,
+  SDL3.Sys.Render.getTextureSizeSafe,
+  SDL3.Sys.Render.setTexturePalette,
+  SDL3.Sys.Render.setTexturePaletteSafe,
+  SDL3.Sys.Render.getTexturePalette,
+  SDL3.Sys.Render.getTexturePaletteSafe,
+  SDL3.Sys.Render.setTextureColorMod,
+  SDL3.Sys.Render.setTextureColorModSafe,
+  SDL3.Sys.Render.setTextureColorModFloat,
+  SDL3.Sys.Render.setTextureColorModFloatSafe,
+  SDL3.Sys.Render.getTextureColorMod,
+  SDL3.Sys.Render.getTextureColorModSafe,
+  SDL3.Sys.Render.getTextureColorModFloat,
+  SDL3.Sys.Render.getTextureColorModFloatSafe,
+  SDL3.Sys.Render.setTextureAlphaMod,
+  SDL3.Sys.Render.setTextureAlphaModSafe,
+  SDL3.Sys.Render.setTextureAlphaModFloat,
+  SDL3.Sys.Render.setTextureAlphaModFloatSafe,
+  SDL3.Sys.Render.getTextureAlphaMod,
+  SDL3.Sys.Render.getTextureAlphaModSafe,
+  SDL3.Sys.Render.getTextureAlphaModFloat,
+  SDL3.Sys.Render.getTextureAlphaModFloatSafe,
+  SDL3.Sys.Render.setTextureBlendMode,
+  SDL3.Sys.Render.setTextureBlendModeSafe,
+  SDL3.Sys.Render.getTextureBlendMode,
+  SDL3.Sys.Render.getTextureBlendModeSafe,
+  SDL3.Sys.Render.setTextureScaleMode,
+  SDL3.Sys.Render.setTextureScaleModeSafe,
+  SDL3.Sys.Render.getTextureScaleMode,
+  SDL3.Sys.Render.getTextureScaleModeSafe,
+  SDL3.Sys.Render.updateTexture,
+  SDL3.Sys.Render.updateTextureSafe,
+  SDL3.Sys.Render.updateYUVTexture,
+  SDL3.Sys.Render.updateYUVTextureSafe,
+  SDL3.Sys.Render.updateNVTexture,
+  SDL3.Sys.Render.updateNVTextureSafe,
+  SDL3.Sys.Render.lockTexture,
+  SDL3.Sys.Render.lockTextureSafe,
+  SDL3.Sys.Render.lockTextureToSurface,
+  SDL3.Sys.Render.lockTextureToSurfaceSafe,
+  SDL3.Sys.Render.unlockTexture,
+  SDL3.Sys.Render.unlockTextureSafe,
+  SDL3.Sys.Render.setRenderTarget,
+  SDL3.Sys.Render.setRenderTargetSafe,
+  SDL3.Sys.Render.getRenderTarget,
+  SDL3.Sys.Render.getRenderTargetSafe,
+  SDL3.Sys.Render.setRenderLogicalPresentation,
+  SDL3.Sys.Render.setRenderLogicalPresentationSafe,
+  SDL3.Sys.Render.getRenderLogicalPresentation,
+  SDL3.Sys.Render.getRenderLogicalPresentationSafe,
+  SDL3.Sys.Render.getRenderLogicalPresentationRect,
+  SDL3.Sys.Render.getRenderLogicalPresentationRectSafe,
+  SDL3.Sys.Render.renderCoordinatesFromWindow,
+  SDL3.Sys.Render.renderCoordinatesFromWindowSafe,
+  SDL3.Sys.Render.renderCoordinatesToWindow,
+  SDL3.Sys.Render.renderCoordinatesToWindowSafe,
+  SDL3.Sys.Render.convertEventToRenderCoordinates,
+  SDL3.Sys.Render.convertEventToRenderCoordinatesSafe,
+  SDL3.Sys.Render.setRenderViewport,
+  SDL3.Sys.Render.setRenderViewportSafe,
+  SDL3.Sys.Render.getRenderViewport,
+  SDL3.Sys.Render.getRenderViewportSafe,
+  SDL3.Sys.Render.renderViewportSet,
+  SDL3.Sys.Render.renderViewportSetSafe,
+  SDL3.Sys.Render.getRenderSafeArea,
+  SDL3.Sys.Render.getRenderSafeAreaSafe,
+  SDL3.Sys.Render.setRenderClipRect,
+  SDL3.Sys.Render.setRenderClipRectSafe,
+  SDL3.Sys.Render.getRenderClipRect,
+  SDL3.Sys.Render.getRenderClipRectSafe,
+  SDL3.Sys.Render.renderClipEnabled,
+  SDL3.Sys.Render.renderClipEnabledSafe,
+  SDL3.Sys.Render.setRenderScale,
+  SDL3.Sys.Render.setRenderScaleSafe,
+  SDL3.Sys.Render.getRenderScale,
+  SDL3.Sys.Render.getRenderScaleSafe,
+  SDL3.Sys.Render.setRenderDrawColor,
+  SDL3.Sys.Render.setRenderDrawColorSafe,
+  SDL3.Sys.Render.setRenderDrawColorFloat,
+  SDL3.Sys.Render.setRenderDrawColorFloatSafe,
+  SDL3.Sys.Render.getRenderDrawColor,
+  SDL3.Sys.Render.getRenderDrawColorSafe,
+  SDL3.Sys.Render.getRenderDrawColorFloat,
+  SDL3.Sys.Render.getRenderDrawColorFloatSafe,
+  SDL3.Sys.Render.setRenderColorScale,
+  SDL3.Sys.Render.setRenderColorScaleSafe,
+  SDL3.Sys.Render.getRenderColorScale,
+  SDL3.Sys.Render.getRenderColorScaleSafe,
+  SDL3.Sys.Render.setRenderDrawBlendMode,
+  SDL3.Sys.Render.setRenderDrawBlendModeSafe,
+  SDL3.Sys.Render.getRenderDrawBlendMode,
+  SDL3.Sys.Render.getRenderDrawBlendModeSafe,
+  SDL3.Sys.Render.renderClear,
+  SDL3.Sys.Render.renderClearSafe,
+  SDL3.Sys.Render.renderPoint,
+  SDL3.Sys.Render.renderPointSafe,
+  SDL3.Sys.Render.renderPoints,
+  SDL3.Sys.Render.renderPointsSafe,
+  SDL3.Sys.Render.renderLine,
+  SDL3.Sys.Render.renderLineSafe,
+  SDL3.Sys.Render.renderLines,
+  SDL3.Sys.Render.renderLinesSafe,
+  SDL3.Sys.Render.renderRect,
+  SDL3.Sys.Render.renderRectSafe,
+  SDL3.Sys.Render.renderRects,
+  SDL3.Sys.Render.renderRectsSafe,
+  SDL3.Sys.Render.renderFillRect,
+  SDL3.Sys.Render.renderFillRectSafe,
+  SDL3.Sys.Render.renderFillRects,
+  SDL3.Sys.Render.renderFillRectsSafe,
+  SDL3.Sys.Render.renderTexture,
+  SDL3.Sys.Render.renderTextureSafe,
+  SDL3.Sys.Render.renderTextureRotated,
+  SDL3.Sys.Render.renderTextureRotatedSafe,
+  SDL3.Sys.Render.renderTextureAffine,
+  SDL3.Sys.Render.renderTextureAffineSafe,
+  SDL3.Sys.Render.renderTextureTiled,
+  SDL3.Sys.Render.renderTextureTiledSafe,
+  SDL3.Sys.Render.renderTexture9Grid,
+  SDL3.Sys.Render.renderTexture9GridSafe,
+  SDL3.Sys.Render.renderTexture9GridTiled,
+  SDL3.Sys.Render.renderTexture9GridTiledSafe,
+  SDL3.Sys.Render.renderGeometry,
+  SDL3.Sys.Render.renderGeometrySafe,
+  SDL3.Sys.Render.renderGeometryRaw,
+  SDL3.Sys.Render.renderGeometryRawSafe,
+  SDL3.Sys.Render.setRenderTextureAddressMode,
+  SDL3.Sys.Render.setRenderTextureAddressModeSafe,
+  SDL3.Sys.Render.getRenderTextureAddressMode,
+  SDL3.Sys.Render.getRenderTextureAddressModeSafe,
+  SDL3.Sys.Render.renderReadPixels,
+  SDL3.Sys.Render.renderReadPixelsSafe,
+  SDL3.Sys.Render.renderPresent,
+  SDL3.Sys.Render.renderPresentSafe,
+  SDL3.Sys.Render.destroyTexture,
+  SDL3.Sys.Render.destroyTextureSafe,
+  SDL3.Sys.Render.destroyRenderer,
+  SDL3.Sys.Render.destroyRendererSafe,
+  SDL3.Sys.Render.flushRenderer,
+  SDL3.Sys.Render.flushRendererSafe,
+  SDL3.Sys.Render.getRenderMetalLayer,
+  SDL3.Sys.Render.getRenderMetalLayerSafe,
+  SDL3.Sys.Render.getRenderMetalCommandEncoder,
+  SDL3.Sys.Render.getRenderMetalCommandEncoderSafe,
+  SDL3.Sys.Render.addVulkanRenderSemaphores,
+  SDL3.Sys.Render.addVulkanRenderSemaphoresSafe,
+  SDL3.Sys.Render.setRenderVSync,
+  SDL3.Sys.Render.setRenderVSyncSafe,
+  SDL3.Sys.Render.getRenderVSync,
+  SDL3.Sys.Render.getRenderVSyncSafe,
+  SDL3.Sys.Render.renderDebugText,
+  SDL3.Sys.Render.renderDebugTextSafe,
+  SDL3.Sys.Render.setDefaultTextureScaleMode,
+  SDL3.Sys.Render.setDefaultTextureScaleModeSafe,
+  SDL3.Sys.Render.getDefaultTextureScaleMode,
+  SDL3.Sys.Render.getDefaultTextureScaleModeSafe,
+  SDL3.Sys.Render.createGPURenderState,
+  SDL3.Sys.Render.createGPURenderStateSafe,
+  SDL3.Sys.Render.setGPURenderStateFragmentUniforms,
+  SDL3.Sys.Render.setGPURenderStateFragmentUniformsSafe,
+  SDL3.Sys.Render.setGPURenderState,
+  SDL3.Sys.Render.setGPURenderStateSafe,
+  SDL3.Sys.Render.destroyGPURenderState,
+  SDL3.Sys.Render.destroyGPURenderStateSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Blendmode qualified
+import SDL3.Sys.Bindgen.Events qualified
+import SDL3.Sys.Bindgen.Gpu qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Render
+import SDL3.Sys.Bindgen.Render.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Render.Unsafe qualified as Unsafe
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video qualified
+
+-- | Get the number of 2D rendering drivers available for the current display.
+--
+--     A render driver is a set of code that handles rendering and texture management on a particular display. Normally there is only one, but some drivers may have several available with different capabilities.
+--
+--     There may be none if SDL was compiled without render support.
+--
+--     [Returns]: the number of built in render drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRenderer', 'getRenderDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumRenderDrivers@.
+--                   The safe flavor is 'getNumRenderDriversSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumRenderDrivers@, defined at @SDL3\/SDL_render.h 192:33@
+getNumRenderDrivers :: IO BG.Int32
+getNumRenderDrivers =
+  fmap Coerce.coerce Unsafe.sDL_GetNumRenderDrivers
+
+-- | Get the number of 2D rendering drivers available for the current display.
+--
+--     A render driver is a set of code that handles rendering and texture management on a particular display. Normally there is only one, but some drivers may have several available with different capabilities.
+--
+--     There may be none if SDL was compiled without render support.
+--
+--     [Returns]: the number of built in render drivers.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRenderer', 'getRenderDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumRenderDrivers@.
+--                   The unsafe flavor is 'getNumRenderDrivers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumRenderDrivers@, defined at @SDL3\/SDL_render.h 192:33@
+getNumRenderDriversSafe :: IO BG.Int32
+getNumRenderDriversSafe =
+  fmap Coerce.coerce Safe.sDL_GetNumRenderDrivers
+
+-- | Use this function to get the name of a built in 2D rendering driver.
+--
+--     The list of rendering drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"opengl\", \"direct3d12\" or \"metal\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the rendering driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumRenderDrivers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderDriver@.
+--                   The safe flavor is 'getRenderDriverSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderDriver@, defined at @SDL3\/SDL_render.h 216:42@
+getRenderDriver
+  :: BG.Int32
+  -- ^
+  --
+  --           [@index@]: the index of the rendering driver; the value ranges from 0 to @'getNumRenderDrivers'@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getRenderDriver =
+  \x00 ->
+    Unsafe.sDL_GetRenderDriver (Coerce.coerce x00)
+
+-- | Use this function to get the name of a built in 2D rendering driver.
+--
+--     The list of rendering drivers is given in the order that they are normally initialized by default; the drivers that seem more reasonable to choose first (as far as the SDL developers believe) are earlier in the list.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"opengl\", \"direct3d12\" or \"metal\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the rendering driver at the requested index, or NULL if an invalid index was specified.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumRenderDrivers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderDriver@.
+--                   The unsafe flavor is 'getRenderDriver'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderDriver@, defined at @SDL3\/SDL_render.h 216:42@
+getRenderDriverSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@index@]: the index of the rendering driver; the value ranges from 0 to @'getNumRenderDrivers'@ - 1.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getRenderDriverSafe =
+  \x00 -> Safe.sDL_GetRenderDriver (Coerce.coerce x00)
+
+-- | Create a window and default renderer.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRenderer', 'SDL3.Sys.Video.createWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateWindowAndRenderer@.
+--                   The safe flavor is 'createWindowAndRendererSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateWindowAndRenderer@, defined at @SDL3\/SDL_render.h 238:34@
+createWindowAndRenderer
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the title of the window, in UTF-8 encoding.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the window.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the window.
+  -> SDL3.Sys.Bindgen.Video.SDL_WindowFlags
+  -- ^
+  --
+  --           [@window_flags@]: the flags used to create the window (see SDL_CreateWindow()).
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+  -- ^
+  --
+  --           [@window@]: a pointer filled with the window, or NULL on error.
+  -> BG.Ptr (BG.Ptr SDL_Renderer)
+  -- ^
+  --
+  --           [@renderer@]: a pointer filled with the renderer, or NULL on error.
+  -> IO Bool
+createWindowAndRenderer =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap
+                CBool.toBool
+                (Unsafe.sDL_CreateWindowAndRenderer x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44 x55)
+
+-- | Create a window and default renderer.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRenderer', 'SDL3.Sys.Video.createWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateWindowAndRenderer@.
+--                   The unsafe flavor is 'createWindowAndRenderer'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateWindowAndRenderer@, defined at @SDL3\/SDL_render.h 238:34@
+createWindowAndRendererSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the title of the window, in UTF-8 encoding.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the window.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the window.
+  -> SDL3.Sys.Bindgen.Video.SDL_WindowFlags
+  -- ^
+  --
+  --           [@window_flags@]: the flags used to create the window (see SDL_CreateWindow()).
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+  -- ^
+  --
+  --           [@window@]: a pointer filled with the window, or NULL on error.
+  -> BG.Ptr (BG.Ptr SDL_Renderer)
+  -- ^
+  --
+  --           [@renderer@]: a pointer filled with the renderer, or NULL on error.
+  -> IO Bool
+createWindowAndRendererSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap
+                CBool.toBool
+                (Safe.sDL_CreateWindowAndRenderer x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44 x55)
+
+-- | Create a 2D rendering context for a window.
+--
+--     If you want a specific renderer, you can specify its name here. A list of available renderers can be obtained by calling @'getRenderDriver'@ multiple times, with indices from 0 to @'getNumRenderDrivers'@ -1. If you don\'t need a specific renderer, specify NULL and SDL will attempt to choose the best option for you, based on what is available on the user\'s system.
+--
+--     If @name@ is a comma-separated list, SDL will try each name, in the order listed, until one succeeds or all of them fail.
+--
+--     By default the rendering size matches the window size in pixels, but you can call @'setRenderLogicalPresentation'@ to change the content size and scaling options.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRendererWithProperties', 'createSoftwareRenderer', 'destroyRenderer', 'getNumRenderDrivers', 'getRenderDriver', 'getRendererName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateRenderer@.
+--                   The safe flavor is 'createRendererSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateRenderer@, defined at @SDL3\/SDL_render.h 273:44@
+createRenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window where rendering is displayed.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the rendering driver to initialize, or NULL to let SDL choose one.
+  -> IO (BG.Ptr SDL_Renderer)
+createRenderer = Unsafe.sDL_CreateRenderer
+
+-- | Create a 2D rendering context for a window.
+--
+--     If you want a specific renderer, you can specify its name here. A list of available renderers can be obtained by calling @'getRenderDriver'@ multiple times, with indices from 0 to @'getNumRenderDrivers'@ -1. If you don\'t need a specific renderer, specify NULL and SDL will attempt to choose the best option for you, based on what is available on the user\'s system.
+--
+--     If @name@ is a comma-separated list, SDL will try each name, in the order listed, until one succeeds or all of them fail.
+--
+--     By default the rendering size matches the window size in pixels, but you can call @'setRenderLogicalPresentation'@ to change the content size and scaling options.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRendererWithProperties', 'createSoftwareRenderer', 'destroyRenderer', 'getNumRenderDrivers', 'getRenderDriver', 'getRendererName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateRenderer@.
+--                   The unsafe flavor is 'createRenderer'
+--                   .
+--
+--     [C declaration]: @SDL_CreateRenderer@, defined at @SDL3\/SDL_render.h 273:44@
+createRendererSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window where rendering is displayed.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the rendering driver to initialize, or NULL to let SDL choose one.
+  -> IO (BG.Ptr SDL_Renderer)
+createRendererSafe = Safe.sDL_CreateRenderer
+
+-- | Create a 2D rendering context for a window, with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_RENDERER_CREATE_NAME_STRING'@: the name of the rendering driver to use, if a specific one is desired
+--
+--     * @'sDL_PROP_RENDERER_CREATE_WINDOW_POINTER'@: the window where rendering is displayed, required if this isn\'t a software renderer using a surface
+--
+--     * @'sDL_PROP_RENDERER_CREATE_SURFACE_POINTER'@: the surface where rendering is displayed, if you want a software renderer without a window
+--
+--     * @'sDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the colorspace for output to the display, defaults to SDL_COLORSPACE_SRGB. The direct3d11, direct3d12, and metal renderers support SDL_COLORSPACE_SRGB_LINEAR, which is a linear color space and supports HDR output. If you select SDL_COLORSPACE_SRGB_LINEAR, drawing still uses the sRGB colorspace, but values can go beyond 1.0 and float (linear) format textures can be used for HDR content.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER'@: non-zero if you want present synchronized with the refresh rate. This property can take any value that is supported by @'setRenderVSync'@ for the renderer.
+--
+--     With the SDL GPU renderer (since SDL 3.4.0):
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER'@: the device to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN'@: the app is able to provide SPIR-V shaders to 'SDL_GPURenderState', optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN'@: the app is able to provide DXIL shaders to 'SDL_GPURenderState', optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN'@: the app is able to provide MSL shaders to 'SDL_GPURenderState', optional.
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER'@: the VkInstance to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER'@: the VkSurfaceKHR to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER'@: the VkPhysicalDevice to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_DEVICE_POINTER'@: the VkDevice to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for rendering.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for presentation.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Properties.createProperties', 'createRenderer', 'createSoftwareRenderer', 'destroyRenderer', 'getRendererName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateRendererWithProperties@.
+--                   The safe flavor is 'createRendererWithPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateRendererWithProperties@, defined at @SDL3\/SDL_render.h 337:44@
+createRendererWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Renderer)
+createRendererWithProperties =
+  Unsafe.sDL_CreateRendererWithProperties
+
+-- | Create a 2D rendering context for a window, with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_RENDERER_CREATE_NAME_STRING'@: the name of the rendering driver to use, if a specific one is desired
+--
+--     * @'sDL_PROP_RENDERER_CREATE_WINDOW_POINTER'@: the window where rendering is displayed, required if this isn\'t a software renderer using a surface
+--
+--     * @'sDL_PROP_RENDERER_CREATE_SURFACE_POINTER'@: the surface where rendering is displayed, if you want a software renderer without a window
+--
+--     * @'sDL_PROP_RENDERER_CREATE_OUTPUT_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the colorspace for output to the display, defaults to SDL_COLORSPACE_SRGB. The direct3d11, direct3d12, and metal renderers support SDL_COLORSPACE_SRGB_LINEAR, which is a linear color space and supports HDR output. If you select SDL_COLORSPACE_SRGB_LINEAR, drawing still uses the sRGB colorspace, but values can go beyond 1.0 and float (linear) format textures can be used for HDR content.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_PRESENT_VSYNC_NUMBER'@: non-zero if you want present synchronized with the refresh rate. This property can take any value that is supported by @'setRenderVSync'@ for the renderer.
+--
+--     With the SDL GPU renderer (since SDL 3.4.0):
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_DEVICE_POINTER'@: the device to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_SPIRV_BOOLEAN'@: the app is able to provide SPIR-V shaders to 'SDL_GPURenderState', optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_DXIL_BOOLEAN'@: the app is able to provide DXIL shaders to 'SDL_GPURenderState', optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_GPU_SHADERS_MSL_BOOLEAN'@: the app is able to provide MSL shaders to 'SDL_GPURenderState', optional.
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_INSTANCE_POINTER'@: the VkInstance to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_SURFACE_NUMBER'@: the VkSurfaceKHR to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_PHYSICAL_DEVICE_POINTER'@: the VkPhysicalDevice to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_DEVICE_POINTER'@: the VkDevice to use with the renderer, optional.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for rendering.
+--
+--     * @'sDL_PROP_RENDERER_CREATE_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for presentation.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Properties.createProperties', 'createRenderer', 'createSoftwareRenderer', 'destroyRenderer', 'getRendererName'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateRendererWithProperties@.
+--                   The unsafe flavor is 'createRendererWithProperties'
+--                   .
+--
+--     [C declaration]: @SDL_CreateRendererWithProperties@, defined at @SDL3\/SDL_render.h 337:44@
+createRendererWithPropertiesSafe
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Renderer)
+createRendererWithPropertiesSafe =
+  Safe.sDL_CreateRendererWithProperties
+
+-- | Create a 2D GPU rendering context.
+--
+--     The GPU device to use is passed in as a parameter. If this is NULL, then a device will be created normally and can be retrieved using @'getGPURendererDevice'@.
+--
+--     The window to use is passed in as a parameter. If this is NULL, then this will become an offscreen renderer. In that case, you should call @'setRenderTarget'@ to setup rendering to a texture, and then call @'renderPresent'@ normally to complete drawing a frame.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: If this function is called with a valid GPU device, it should be called on the thread that created the device. If this function is called with a valid window, it should be called on the thread that created the window.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'createRendererWithProperties', 'getGPURendererDevice', 'SDL3.Sys.Gpu.createGPUShader', 'createGPURenderState', 'setGPURenderState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPURenderer@.
+--                   The safe flavor is 'createGPURendererSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPURenderer@, defined at @SDL3\/SDL_render.h 387:44@
+createGPURenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: the GPU device to use with the renderer, or NULL to create a device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window where rendering is displayed, or NULL to create an offscreen renderer.
+  -> IO (BG.Ptr SDL_Renderer)
+createGPURenderer = Unsafe.sDL_CreateGPURenderer
+
+-- | Create a 2D GPU rendering context.
+--
+--     The GPU device to use is passed in as a parameter. If this is NULL, then a device will be created normally and can be retrieved using @'getGPURendererDevice'@.
+--
+--     The window to use is passed in as a parameter. If this is NULL, then this will become an offscreen renderer. In that case, you should call @'setRenderTarget'@ to setup rendering to a texture, and then call @'renderPresent'@ normally to complete drawing a frame.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: If this function is called with a valid GPU device, it should be called on the thread that created the device. If this function is called with a valid window, it should be called on the thread that created the window.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'createRendererWithProperties', 'getGPURendererDevice', 'SDL3.Sys.Gpu.createGPUShader', 'createGPURenderState', 'setGPURenderState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPURenderer@.
+--                   The unsafe flavor is 'createGPURenderer'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPURenderer@, defined at @SDL3\/SDL_render.h 387:44@
+createGPURendererSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice
+  -- ^
+  --
+  --           [@device@]: the GPU device to use with the renderer, or NULL to create a device.
+  -> BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window where rendering is displayed, or NULL to create an offscreen renderer.
+  -> IO (BG.Ptr SDL_Renderer)
+createGPURendererSafe = Safe.sDL_CreateGPURenderer
+
+-- | Return the GPU device used by a renderer.
+--
+--     [Returns]: the GPU device used by the renderer, or NULL if the renderer is not a GPU renderer; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGPURendererDevice@.
+--                   The safe flavor is 'getGPURendererDeviceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPURendererDevice@, defined at @SDL3\/SDL_render.h 400:45@
+getGPURendererDevice
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice)
+getGPURendererDevice =
+  Unsafe.sDL_GetGPURendererDevice
+
+-- | Return the GPU device used by a renderer.
+--
+--     [Returns]: the GPU device used by the renderer, or NULL if the renderer is not a GPU renderer; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGPURendererDevice@.
+--                   The unsafe flavor is 'getGPURendererDevice'
+--                   .
+--
+--     [C declaration]: @SDL_GetGPURendererDevice@, defined at @SDL3\/SDL_render.h 400:45@
+getGPURendererDeviceSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Gpu.SDL_GPUDevice)
+getGPURendererDeviceSafe =
+  Safe.sDL_GetGPURendererDevice
+
+-- | Create a 2D software rendering context for a surface.
+--
+--     Two other API which can be used to create 'SDL_Renderer': @'createRenderer'@ and @'createWindowAndRenderer'@. These can /also/ create a software renderer, but they are intended to be used with an SDL_Window as the final destination and not an SDL_Surface.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyRenderer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateSoftwareRenderer@.
+--                   The safe flavor is 'createSoftwareRendererSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateSoftwareRenderer@, defined at @SDL3\/SDL_render.h 421:44@
+createSoftwareRenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the SDL_Surface structure representing the surface where rendering is done.
+  -> IO (BG.Ptr SDL_Renderer)
+createSoftwareRenderer =
+  Unsafe.sDL_CreateSoftwareRenderer
+
+-- | Create a 2D software rendering context for a surface.
+--
+--     Two other API which can be used to create 'SDL_Renderer': @'createRenderer'@ and @'createWindowAndRenderer'@. These can /also/ create a software renderer, but they are intended to be used with an SDL_Window as the final destination and not an SDL_Surface.
+--
+--     [Returns]: a valid rendering context or NULL if there was an error; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyRenderer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateSoftwareRenderer@.
+--                   The unsafe flavor is 'createSoftwareRenderer'
+--                   .
+--
+--     [C declaration]: @SDL_CreateSoftwareRenderer@, defined at @SDL3\/SDL_render.h 421:44@
+createSoftwareRendererSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the SDL_Surface structure representing the surface where rendering is done.
+  -> IO (BG.Ptr SDL_Renderer)
+createSoftwareRendererSafe =
+  Safe.sDL_CreateSoftwareRenderer
+
+-- | Get the renderer associated with a window.
+--
+--     [Returns]: the rendering context on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderer@.
+--                   The safe flavor is 'getRendererSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRenderer@, defined at @SDL3\/SDL_render.h 434:44@
+getRenderer
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL_Renderer)
+getRenderer = Unsafe.sDL_GetRenderer
+
+-- | Get the renderer associated with a window.
+--
+--     [Returns]: the rendering context on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderer@.
+--                   The unsafe flavor is 'getRenderer'
+--                   .
+--
+--     [C declaration]: @SDL_GetRenderer@, defined at @SDL3\/SDL_render.h 434:44@
+getRendererSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL_Renderer)
+getRendererSafe = Safe.sDL_GetRenderer
+
+-- | Get the window associated with a renderer.
+--
+--     [Returns]: the window on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderWindow@.
+--                   The safe flavor is 'getRenderWindowSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRenderWindow@, defined at @SDL3\/SDL_render.h 447:42@
+getRenderWindow
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+getRenderWindow = Unsafe.sDL_GetRenderWindow
+
+-- | Get the window associated with a renderer.
+--
+--     [Returns]: the window on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderWindow@.
+--                   The unsafe flavor is 'getRenderWindow'
+--                   .
+--
+--     [C declaration]: @SDL_GetRenderWindow@, defined at @SDL3\/SDL_render.h 447:42@
+getRenderWindowSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window)
+getRenderWindowSafe = Safe.sDL_GetRenderWindow
+
+-- | Get the name of a renderer.
+--
+--     [Returns]: the name of the selected renderer, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRenderer', 'createRendererWithProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRendererName@.
+--                   The safe flavor is 'getRendererNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRendererName@, defined at @SDL3\/SDL_render.h 463:42@
+getRendererName
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getRendererName = Unsafe.sDL_GetRendererName
+
+-- | Get the name of a renderer.
+--
+--     [Returns]: the name of the selected renderer, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRenderer', 'createRendererWithProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRendererName@.
+--                   The unsafe flavor is 'getRendererName'
+--                   .
+--
+--     [C declaration]: @SDL_GetRendererName@, defined at @SDL3\/SDL_render.h 463:42@
+getRendererNameSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getRendererNameSafe = Safe.sDL_GetRendererName
+
+-- | Get the properties associated with a renderer.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_RENDERER_NAME_STRING'@: the name of the rendering driver
+--
+--     * @'sDL_PROP_RENDERER_WINDOW_POINTER'@: the window where rendering is displayed, if any
+--
+--     * @'sDL_PROP_RENDERER_SURFACE_POINTER'@: the surface where rendering is displayed, if this is a software renderer without a window
+--
+--     * @'sDL_PROP_RENDERER_VSYNC_NUMBER'@: the current vsync setting
+--
+--     * @'sDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER'@: the maximum texture width and height
+--
+--     * @'sDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER'@: a (const SDL_PixelFormat *) array of pixel formats, terminated with SDL_PIXELFORMAT_UNKNOWN, representing the available texture formats for this renderer.
+--
+--     * @'sDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN'@: true if the renderer supports SDL_TEXTURE_ADDRESS_WRAP on non-power-of-two textures.
+--
+--     * @'sDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the colorspace for output to the display, defaults to SDL_COLORSPACE_SRGB.
+--
+--     * @'sDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN'@: true if the output colorspace is SDL_COLORSPACE_SRGB_LINEAR and the renderer is showing on a display with HDR enabled. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT'@: the value of SDR white in the SDL_COLORSPACE_SRGB_LINEAR colorspace. When HDR is enabled, this value is automatically multiplied into the color scale. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_RENDERER_HDR_HEADROOM_FLOAT'@: the additional high dynamic range that can be displayed, in terms of the SDR white point. When HDR is not enabled, this will be 1.0. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     With the direct3d renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D9_DEVICE_POINTER'@: the IDirect3DDevice9 associated with the renderer
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D11_DEVICE_POINTER'@: the ID3D11Device associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_D3D11_SWAPCHAIN_POINTER'@: the IDXGISwapChain1 associated with the renderer. This may change when the window is resized.
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D12_DEVICE_POINTER'@: the ID3D12Device associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_D3D12_SWAPCHAIN_POINTER'@: the IDXGISwapChain4 associated with the renderer.
+--
+--     * @'sDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER'@: the ID3D12CommandQueue associated with the renderer
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_INSTANCE_POINTER'@: the VkInstance associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_SURFACE_NUMBER'@: the VkSurfaceKHR associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_PHYSICAL_DEVICE_POINTER'@: the VkPhysicalDevice associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_DEVICE_POINTER'@: the VkDevice associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for rendering
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for presentation
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER'@: the number of swapchain images, or potential frames in flight, used by the Vulkan renderer
+--
+--     With the gpu renderer:
+--
+--     * @'sDL_PROP_RENDERER_GPU_DEVICE_POINTER'@: the SDL_GPUDevice associated with the renderer
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRendererProperties@.
+--                   The safe flavor is 'getRendererPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRendererProperties@, defined at @SDL3\/SDL_render.h 551:46@
+getRendererProperties
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getRendererProperties =
+  Unsafe.sDL_GetRendererProperties
+
+-- | Get the properties associated with a renderer.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_RENDERER_NAME_STRING'@: the name of the rendering driver
+--
+--     * @'sDL_PROP_RENDERER_WINDOW_POINTER'@: the window where rendering is displayed, if any
+--
+--     * @'sDL_PROP_RENDERER_SURFACE_POINTER'@: the surface where rendering is displayed, if this is a software renderer without a window
+--
+--     * @'sDL_PROP_RENDERER_VSYNC_NUMBER'@: the current vsync setting
+--
+--     * @'sDL_PROP_RENDERER_MAX_TEXTURE_SIZE_NUMBER'@: the maximum texture width and height
+--
+--     * @'sDL_PROP_RENDERER_TEXTURE_FORMATS_POINTER'@: a (const SDL_PixelFormat *) array of pixel formats, terminated with SDL_PIXELFORMAT_UNKNOWN, representing the available texture formats for this renderer.
+--
+--     * @'sDL_PROP_RENDERER_TEXTURE_WRAPPING_BOOLEAN'@: true if the renderer supports SDL_TEXTURE_ADDRESS_WRAP on non-power-of-two textures.
+--
+--     * @'sDL_PROP_RENDERER_OUTPUT_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the colorspace for output to the display, defaults to SDL_COLORSPACE_SRGB.
+--
+--     * @'sDL_PROP_RENDERER_HDR_ENABLED_BOOLEAN'@: true if the output colorspace is SDL_COLORSPACE_SRGB_LINEAR and the renderer is showing on a display with HDR enabled. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_RENDERER_SDR_WHITE_POINT_FLOAT'@: the value of SDR white in the SDL_COLORSPACE_SRGB_LINEAR colorspace. When HDR is enabled, this value is automatically multiplied into the color scale. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_RENDERER_HDR_HEADROOM_FLOAT'@: the additional high dynamic range that can be displayed, in terms of the SDR white point. When HDR is not enabled, this will be 1.0. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     With the direct3d renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D9_DEVICE_POINTER'@: the IDirect3DDevice9 associated with the renderer
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D11_DEVICE_POINTER'@: the ID3D11Device associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_D3D11_SWAPCHAIN_POINTER'@: the IDXGISwapChain1 associated with the renderer. This may change when the window is resized.
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_RENDERER_D3D12_DEVICE_POINTER'@: the ID3D12Device associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_D3D12_SWAPCHAIN_POINTER'@: the IDXGISwapChain4 associated with the renderer.
+--
+--     * @'sDL_PROP_RENDERER_D3D12_COMMAND_QUEUE_POINTER'@: the ID3D12CommandQueue associated with the renderer
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_INSTANCE_POINTER'@: the VkInstance associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_SURFACE_NUMBER'@: the VkSurfaceKHR associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_PHYSICAL_DEVICE_POINTER'@: the VkPhysicalDevice associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_DEVICE_POINTER'@: the VkDevice associated with the renderer
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_GRAPHICS_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for rendering
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_PRESENT_QUEUE_FAMILY_INDEX_NUMBER'@: the queue family index used for presentation
+--
+--     * @'sDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER'@: the number of swapchain images, or potential frames in flight, used by the Vulkan renderer
+--
+--     With the gpu renderer:
+--
+--     * @'sDL_PROP_RENDERER_GPU_DEVICE_POINTER'@: the SDL_GPUDevice associated with the renderer
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRendererProperties@.
+--                   The unsafe flavor is 'getRendererProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetRendererProperties@, defined at @SDL3\/SDL_render.h 551:46@
+getRendererPropertiesSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getRendererPropertiesSafe =
+  Safe.sDL_GetRendererProperties
+
+-- | Get the output size in pixels of a rendering context.
+--
+--     This returns the true output size in pixels, ignoring any render targets or logical size and presentation.
+--
+--     For the output size of the current rendering target, with logical size adjustments, use @'getCurrentRenderOutputSize'@ instead.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCurrentRenderOutputSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderOutputSize@.
+--                   The safe flavor is 'getRenderOutputSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderOutputSize@, defined at @SDL3\/SDL_render.h 600:34@
+getRenderOutputSize
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width in pixels.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height in pixels.
+  -> IO Bool
+getRenderOutputSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetRenderOutputSize x00 x11 x22)
+
+-- | Get the output size in pixels of a rendering context.
+--
+--     This returns the true output size in pixels, ignoring any render targets or logical size and presentation.
+--
+--     For the output size of the current rendering target, with logical size adjustments, use @'getCurrentRenderOutputSize'@ instead.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCurrentRenderOutputSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderOutputSize@.
+--                   The unsafe flavor is 'getRenderOutputSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderOutputSize@, defined at @SDL3\/SDL_render.h 600:34@
+getRenderOutputSizeSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width in pixels.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height in pixels.
+  -> IO Bool
+getRenderOutputSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetRenderOutputSize x00 x11 x22)
+
+-- | Get the current output size in pixels of a rendering context.
+--
+--     If a rendering target is active, this will return the size of the rendering target in pixels, otherwise return the value of @'getRenderOutputSize'@.
+--
+--     Rendering target or not, the output will be adjusted by the current logical presentation state, dictated by @'setRenderLogicalPresentation'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderOutputSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCurrentRenderOutputSize@.
+--                   The safe flavor is 'getCurrentRenderOutputSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetCurrentRenderOutputSize@, defined at @SDL3\/SDL_render.h 623:34@
+getCurrentRenderOutputSize
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the current width.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the current height.
+  -> IO Bool
+getCurrentRenderOutputSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetCurrentRenderOutputSize x00 x11 x22)
+
+-- | Get the current output size in pixels of a rendering context.
+--
+--     If a rendering target is active, this will return the size of the rendering target in pixels, otherwise return the value of @'getRenderOutputSize'@.
+--
+--     Rendering target or not, the output will be adjusted by the current logical presentation state, dictated by @'setRenderLogicalPresentation'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderOutputSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCurrentRenderOutputSize@.
+--                   The unsafe flavor is 'getCurrentRenderOutputSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetCurrentRenderOutputSize@, defined at @SDL3\/SDL_render.h 623:34@
+getCurrentRenderOutputSizeSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the current width.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the current height.
+  -> IO Bool
+getCurrentRenderOutputSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetCurrentRenderOutputSize x00 x11 x22)
+
+-- | Create a texture for a rendering context.
+--
+--     The contents of a texture when first created are not defined.
+--
+--     [Returns]: the created texture or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTextureFromSurface', 'createTextureWithProperties', 'destroyTexture', 'getTextureSize', 'updateTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateTexture@.
+--                   The safe flavor is 'createTextureSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateTexture@, defined at @SDL3\/SDL_render.h 648:43@
+createTexture
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the enumerated values in SDL_PixelFormat.
+  -> SDL_TextureAccess
+  -- ^
+  --
+  --           [@access@]: one of the enumerated values in 'SDL_TextureAccess'.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the texture in pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the texture in pixels.
+  -> IO (BG.Ptr SDL_Texture)
+createTexture =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Unsafe.sDL_CreateTexture x00 x11 x22 (Coerce.coerce x33) (Coerce.coerce x44)
+
+-- | Create a texture for a rendering context.
+--
+--     The contents of a texture when first created are not defined.
+--
+--     [Returns]: the created texture or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTextureFromSurface', 'createTextureWithProperties', 'destroyTexture', 'getTextureSize', 'updateTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateTexture@.
+--                   The unsafe flavor is 'createTexture'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateTexture@, defined at @SDL3\/SDL_render.h 648:43@
+createTextureSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: one of the enumerated values in SDL_PixelFormat.
+  -> SDL_TextureAccess
+  -- ^
+  --
+  --           [@access@]: one of the enumerated values in 'SDL_TextureAccess'.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the texture in pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the texture in pixels.
+  -> IO (BG.Ptr SDL_Texture)
+createTextureSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Safe.sDL_CreateTexture x00 x11 x22 (Coerce.coerce x33) (Coerce.coerce x44)
+
+-- | Create a texture from an existing surface.
+--
+--     The surface is not modified or freed by this function.
+--
+--     The 'SDL_TextureAccess' hint for the created texture is @SDL_TEXTUREACCESS_STATIC@.
+--
+--     The pixel format of the created texture may be different from the pixel format of the surface, and can be queried using the SDL_PROP_TEXTURE_FORMAT_NUMBER property.
+--
+--     [Returns]: the created texture or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTexture', 'createTextureWithProperties', 'destroyTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateTextureFromSurface@.
+--                   The safe flavor is 'createTextureFromSurfaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateTextureFromSurface@, defined at @SDL3\/SDL_render.h 676:43@
+createTextureFromSurface
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the SDL_Surface structure containing pixel data used to fill the texture.
+  -> IO (BG.Ptr SDL_Texture)
+createTextureFromSurface =
+  Unsafe.sDL_CreateTextureFromSurface
+
+-- | Create a texture from an existing surface.
+--
+--     The surface is not modified or freed by this function.
+--
+--     The 'SDL_TextureAccess' hint for the created texture is @SDL_TEXTUREACCESS_STATIC@.
+--
+--     The pixel format of the created texture may be different from the pixel format of the surface, and can be queried using the SDL_PROP_TEXTURE_FORMAT_NUMBER property.
+--
+--     [Returns]: the created texture or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTexture', 'createTextureWithProperties', 'destroyTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateTextureFromSurface@.
+--                   The unsafe flavor is 'createTextureFromSurface'
+--                   .
+--
+--     [C declaration]: @SDL_CreateTextureFromSurface@, defined at @SDL3\/SDL_render.h 676:43@
+createTextureFromSurfaceSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the SDL_Surface structure containing pixel data used to fill the texture.
+  -> IO (BG.Ptr SDL_Texture)
+createTextureFromSurfaceSafe =
+  Safe.sDL_CreateTextureFromSurface
+
+-- | Create a texture for a rendering context with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the texture colorspace, defaults to SDL_COLORSPACE_SRGB_LINEAR for floating point textures, SDL_COLORSPACE_HDR10 for 10-bit textures, SDL_COLORSPACE_SRGB for other RGB textures and SDL_COLORSPACE_JPEG for YUV textures.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER'@: one of the enumerated values in SDL_PixelFormat, defaults to the best RGBA format for the renderer
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER'@: one of the enumerated values in 'SDL_TextureAccess', defaults to SDL_TEXTUREACCESS_STATIC
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER'@: the width of the texture in pixels, required
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER'@: the height of the texture in pixels, required
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_PALETTE_POINTER'@: an SDL_Palette to use with palettized texture formats. This can be set later with @'setTexturePalette'@
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point textures, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 100 for HDR10 textures and 1.0 for floating point textures.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point textures, this defines the maximum dynamic range used by the content, in terms of the SDR white point. This would be equivalent to maxCLL \/ SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT for HDR10 content. If this is defined, any values outside the range supported by the display will be scaled into the available HDR headroom, otherwise they are clipped.
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER'@: the ID3D11Texture2D associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER'@: the ID3D11Texture2D associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER'@: the ID3D11Texture2D associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER'@: the ID3D12Resource associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER'@: the ID3D12Resource associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER'@: the ID3D12Resource associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the metal renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER'@: the CVPixelBufferRef associated with the texture, if you want to create a texture from an existing pixel buffer.
+--
+--     With the opengl renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the opengles2 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER'@: the VkImage associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER'@: the VkImageLayout for the VkImage, defaults to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
+--
+--     With the GPU renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER'@: the SDL_GPUTexture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_NUMBER@: the SDL_GPUTexture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_NUMBER@: the SDL_GPUTexture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_NUMBER@: the SDL_GPUTexture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     [Returns]: the created texture or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Properties.createProperties', 'createTexture', 'createTextureFromSurface', 'destroyTexture', 'getTextureSize', 'updateTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateTextureWithProperties@.
+--                   The safe flavor is 'createTextureWithPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateTextureWithProperties@, defined at @SDL3\/SDL_render.h 806:43@
+createTextureWithProperties
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Texture)
+createTextureWithProperties =
+  Unsafe.sDL_CreateTextureWithProperties
+
+-- | Create a texture for a rendering context with the specified properties.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the texture colorspace, defaults to SDL_COLORSPACE_SRGB_LINEAR for floating point textures, SDL_COLORSPACE_HDR10 for 10-bit textures, SDL_COLORSPACE_SRGB for other RGB textures and SDL_COLORSPACE_JPEG for YUV textures.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_FORMAT_NUMBER'@: one of the enumerated values in SDL_PixelFormat, defaults to the best RGBA format for the renderer
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_ACCESS_NUMBER'@: one of the enumerated values in 'SDL_TextureAccess', defaults to SDL_TEXTUREACCESS_STATIC
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_WIDTH_NUMBER'@: the width of the texture in pixels, required
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_HEIGHT_NUMBER'@: the height of the texture in pixels, required
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_PALETTE_POINTER'@: an SDL_Palette to use with palettized texture formats. This can be set later with @'setTexturePalette'@
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point textures, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 100 for HDR10 textures and 1.0 for floating point textures.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point textures, this defines the maximum dynamic range used by the content, in terms of the SDR white point. This would be equivalent to maxCLL \/ SDL_PROP_TEXTURE_CREATE_SDR_WHITE_POINT_FLOAT for HDR10 content. If this is defined, any values outside the range supported by the display will be scaled into the available HDR headroom, otherwise they are clipped.
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_POINTER'@: the ID3D11Texture2D associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_U_POINTER'@: the ID3D11Texture2D associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D11_TEXTURE_V_POINTER'@: the ID3D11Texture2D associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_POINTER'@: the ID3D12Resource associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_U_POINTER'@: the ID3D12Resource associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_D3D12_TEXTURE_V_POINTER'@: the ID3D12Resource associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the metal renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_METAL_PIXELBUFFER_POINTER'@: the CVPixelBufferRef associated with the texture, if you want to create a texture from an existing pixel buffer.
+--
+--     With the opengl renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGL_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the opengles2 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_OPENGLES2_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_VULKAN_TEXTURE_NUMBER'@: the VkImage associated with the texture, if you want to wrap an existing texture.
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_VULKAN_LAYOUT_NUMBER'@: the VkImageLayout for the VkImage, defaults to VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL.
+--
+--     With the GPU renderer:
+--
+--     * @'sDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_POINTER'@: the SDL_GPUTexture associated with the texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_UV_NUMBER@: the SDL_GPUTexture associated with the UV plane of an NV12 texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_U_NUMBER@: the SDL_GPUTexture associated with the U plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     * @SDL_PROP_TEXTURE_CREATE_GPU_TEXTURE_V_NUMBER@: the SDL_GPUTexture associated with the V plane of a YUV texture, if you want to wrap an existing texture.
+--
+--     [Returns]: the created texture or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Properties.createProperties', 'createTexture', 'createTextureFromSurface', 'destroyTexture', 'getTextureSize', 'updateTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateTextureWithProperties@.
+--                   The unsafe flavor is 'createTextureWithProperties'
+--                   .
+--
+--     [C declaration]: @SDL_CreateTextureWithProperties@, defined at @SDL3\/SDL_render.h 806:43@
+createTextureWithPropertiesSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Texture)
+createTextureWithPropertiesSafe =
+  Safe.sDL_CreateTextureWithProperties
+
+-- | Get the properties associated with a texture.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_TEXTURE_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the texture colorspace.
+--
+--     * @'sDL_PROP_TEXTURE_FORMAT_NUMBER'@: one of the enumerated values in SDL_PixelFormat.
+--
+--     * @'sDL_PROP_TEXTURE_ACCESS_NUMBER'@: one of the enumerated values in 'SDL_TextureAccess'.
+--
+--     * @'sDL_PROP_TEXTURE_WIDTH_NUMBER'@: the width of the texture in pixels.
+--
+--     * @'sDL_PROP_TEXTURE_HEIGHT_NUMBER'@: the height of the texture in pixels.
+--
+--     * @'sDL_PROP_TEXTURE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point textures, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 100 for HDR10 textures and 1.0 for other textures.
+--
+--     * @'sDL_PROP_TEXTURE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point textures, this defines the maximum dynamic range used by the content, in terms of the SDR white point. If this is defined, any values outside the range supported by the display will be scaled into the available HDR headroom, otherwise they are clipped. This defaults to 1.0 for SDR textures, 4.0 for HDR10 textures, and no default for floating point textures.
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER'@: the ID3D11Texture2D associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_U_POINTER'@: the ID3D11Texture2D associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_V_POINTER'@: the ID3D11Texture2D associated with the V plane of a YUV texture
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER'@: the ID3D12Resource associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_U_POINTER'@: the ID3D12Resource associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_V_POINTER'@: the ID3D12Resource associated with the V plane of a YUV texture
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER'@: the VkImage associated with the texture
+--
+--     With the opengl renderer:
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER'@: the GLuint texture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_TARGET_NUMBER'@: the GLenum for the texture target (@GL_TEXTURE_2D@, @GL_TEXTURE_RECTANGLE_ARB@, etc)
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEX_W_FLOAT'@: the texture coordinate width of the texture (0.0 - 1.0)
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEX_H_FLOAT'@: the texture coordinate height of the texture (0.0 - 1.0)
+--
+--     With the opengles2 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER'@: the GLenum for the texture target (@GL_TEXTURE_2D@, @GL_TEXTURE_EXTERNAL_OES@, etc)
+--
+--     With the gpu renderer:
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_POINTER'@: the SDL_GPUTexture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER'@: the SDL_GPUTexture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER'@: the SDL_GPUTexture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER'@: the SDL_GPUTexture associated with the V plane of a YUV texture
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTextureProperties@.
+--                   The safe flavor is 'getTexturePropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTextureProperties@, defined at @SDL3\/SDL_render.h 935:46@
+getTextureProperties
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getTextureProperties =
+  Unsafe.sDL_GetTextureProperties
+
+-- | Get the properties associated with a texture.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_TEXTURE_COLORSPACE_NUMBER'@: an SDL_Colorspace value describing the texture colorspace.
+--
+--     * @'sDL_PROP_TEXTURE_FORMAT_NUMBER'@: one of the enumerated values in SDL_PixelFormat.
+--
+--     * @'sDL_PROP_TEXTURE_ACCESS_NUMBER'@: one of the enumerated values in 'SDL_TextureAccess'.
+--
+--     * @'sDL_PROP_TEXTURE_WIDTH_NUMBER'@: the width of the texture in pixels.
+--
+--     * @'sDL_PROP_TEXTURE_HEIGHT_NUMBER'@: the height of the texture in pixels.
+--
+--     * @'sDL_PROP_TEXTURE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point textures, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 100 for HDR10 textures and 1.0 for other textures.
+--
+--     * @'sDL_PROP_TEXTURE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point textures, this defines the maximum dynamic range used by the content, in terms of the SDR white point. If this is defined, any values outside the range supported by the display will be scaled into the available HDR headroom, otherwise they are clipped. This defaults to 1.0 for SDR textures, 4.0 for HDR10 textures, and no default for floating point textures.
+--
+--     With the direct3d11 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_POINTER'@: the ID3D11Texture2D associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_U_POINTER'@: the ID3D11Texture2D associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D11_TEXTURE_V_POINTER'@: the ID3D11Texture2D associated with the V plane of a YUV texture
+--
+--     With the direct3d12 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_POINTER'@: the ID3D12Resource associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_U_POINTER'@: the ID3D12Resource associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_D3D12_TEXTURE_V_POINTER'@: the ID3D12Resource associated with the V plane of a YUV texture
+--
+--     With the vulkan renderer:
+--
+--     * @'sDL_PROP_TEXTURE_VULKAN_TEXTURE_NUMBER'@: the VkImage associated with the texture
+--
+--     With the opengl renderer:
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_NUMBER'@: the GLuint texture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEXTURE_TARGET_NUMBER'@: the GLenum for the texture target (@GL_TEXTURE_2D@, @GL_TEXTURE_RECTANGLE_ARB@, etc)
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEX_W_FLOAT'@: the texture coordinate width of the texture (0.0 - 1.0)
+--
+--     * @'sDL_PROP_TEXTURE_OPENGL_TEX_H_FLOAT'@: the texture coordinate height of the texture (0.0 - 1.0)
+--
+--     With the opengles2 renderer:
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_NUMBER'@: the GLuint texture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_UV_NUMBER'@: the GLuint texture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_U_NUMBER'@: the GLuint texture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_V_NUMBER'@: the GLuint texture associated with the V plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_OPENGLES2_TEXTURE_TARGET_NUMBER'@: the GLenum for the texture target (@GL_TEXTURE_2D@, @GL_TEXTURE_EXTERNAL_OES@, etc)
+--
+--     With the gpu renderer:
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_POINTER'@: the SDL_GPUTexture associated with the texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_UV_POINTER'@: the SDL_GPUTexture associated with the UV plane of an NV12 texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_U_POINTER'@: the SDL_GPUTexture associated with the U plane of a YUV texture
+--
+--     * @'sDL_PROP_TEXTURE_GPU_TEXTURE_V_POINTER'@: the SDL_GPUTexture associated with the V plane of a YUV texture
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTextureProperties@.
+--                   The unsafe flavor is 'getTextureProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetTextureProperties@, defined at @SDL3\/SDL_render.h 935:46@
+getTexturePropertiesSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getTexturePropertiesSafe =
+  Safe.sDL_GetTextureProperties
+
+-- | Get the renderer that created an 'SDL_Texture'.
+--
+--     [Returns]: a pointer to the 'SDL_Renderer' that created the texture, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRendererFromTexture@.
+--                   The safe flavor is 'getRendererFromTextureSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRendererFromTexture@, defined at @SDL3\/SDL_render.h 979:44@
+getRendererFromTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO (BG.Ptr SDL_Renderer)
+getRendererFromTexture =
+  Unsafe.sDL_GetRendererFromTexture
+
+-- | Get the renderer that created an 'SDL_Texture'.
+--
+--     [Returns]: a pointer to the 'SDL_Renderer' that created the texture, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRendererFromTexture@.
+--                   The unsafe flavor is 'getRendererFromTexture'
+--                   .
+--
+--     [C declaration]: @SDL_GetRendererFromTexture@, defined at @SDL3\/SDL_render.h 979:44@
+getRendererFromTextureSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO (BG.Ptr SDL_Renderer)
+getRendererFromTextureSafe =
+  Safe.sDL_GetRendererFromTexture
+
+-- | Get the size of a texture, as floating point values.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTextureSize@.
+--                   The safe flavor is 'getTextureSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureSize@, defined at @SDL3\/SDL_render.h 996:34@
+getTextureSize
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width of the texture in pixels. This argument can be NULL if you don\'t need this information.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height of the texture in pixels. This argument can be NULL if you don\'t need this information.
+  -> IO Bool
+getTextureSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetTextureSize x00 x11 x22)
+
+-- | Get the size of a texture, as floating point values.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTextureSize@.
+--                   The unsafe flavor is 'getTextureSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureSize@, defined at @SDL3\/SDL_render.h 996:34@
+getTextureSizeSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width of the texture in pixels. This argument can be NULL if you don\'t need this information.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height of the texture in pixels. This argument can be NULL if you don\'t need this information.
+  -> IO Bool
+getTextureSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetTextureSize x00 x11 x22)
+
+-- | Set the palette used by a texture.
+--
+--     Setting the palette keeps an internal reference to the palette, which can be safely destroyed afterwards.
+--
+--     A single palette can be shared with many textures.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'SDL3.Sys.Pixels.createPalette', 'getTexturePalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTexturePalette@.
+--                   The safe flavor is 'setTexturePaletteSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTexturePalette@, defined at @SDL3\/SDL_render.h 1018:34@
+setTexturePalette
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the SDL_Palette structure to use.
+  -> IO Bool
+setTexturePalette =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetTexturePalette x00 x11)
+
+-- | Set the palette used by a texture.
+--
+--     Setting the palette keeps an internal reference to the palette, which can be safely destroyed afterwards.
+--
+--     A single palette can be shared with many textures.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'SDL3.Sys.Pixels.createPalette', 'getTexturePalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTexturePalette@.
+--                   The unsafe flavor is 'setTexturePalette'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTexturePalette@, defined at @SDL3\/SDL_render.h 1018:34@
+setTexturePaletteSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the SDL_Palette structure to use.
+  -> IO Bool
+setTexturePaletteSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetTexturePalette x00 x11)
+
+-- | Get the palette used by a texture.
+--
+--     [Returns]: a pointer to the palette used by the texture, or NULL if there is no palette used.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'setTexturePalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTexturePalette@.
+--                   The safe flavor is 'getTexturePaletteSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTexturePalette@, defined at @SDL3\/SDL_render.h 1033:43@
+getTexturePalette
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+getTexturePalette = Unsafe.sDL_GetTexturePalette
+
+-- | Get the palette used by a texture.
+--
+--     [Returns]: a pointer to the palette used by the texture, or NULL if there is no palette used.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'setTexturePalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTexturePalette@.
+--                   The unsafe flavor is 'getTexturePalette'
+--                   .
+--
+--     [C declaration]: @SDL_GetTexturePalette@, defined at @SDL3\/SDL_render.h 1033:43@
+getTexturePaletteSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+getTexturePaletteSafe = Safe.sDL_GetTexturePalette
+
+-- | Set an additional color value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * (color \/ 255)@
+--
+--     Color modulation is not always supported by the renderer; it will return false if color modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureColorMod', 'setTextureAlphaMod', 'setTextureColorModFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTextureColorMod@.
+--                   The safe flavor is 'setTextureColorModSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureColorMod@, defined at @SDL3\/SDL_render.h 1062:34@
+setTextureColorMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into copy operations.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into copy operations.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into copy operations.
+  -> IO Bool
+setTextureColorMod =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_SetTextureColorMod x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Set an additional color value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * (color \/ 255)@
+--
+--     Color modulation is not always supported by the renderer; it will return false if color modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureColorMod', 'setTextureAlphaMod', 'setTextureColorModFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTextureColorMod@.
+--                   The unsafe flavor is 'setTextureColorMod'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureColorMod@, defined at @SDL3\/SDL_render.h 1062:34@
+setTextureColorModSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into copy operations.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into copy operations.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into copy operations.
+  -> IO Bool
+setTextureColorModSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_SetTextureColorMod x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Set an additional color value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * color@
+--
+--     Color modulation is not always supported by the renderer; it will return false if color modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureColorModFloat', 'setTextureAlphaModFloat', 'setTextureColorMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTextureColorModFloat@.
+--                   The safe flavor is 'setTextureColorModFloatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureColorModFloat@, defined at @SDL3\/SDL_render.h 1092:34@
+setTextureColorModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> Float
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into copy operations.
+  -> Float
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into copy operations.
+  -> Float
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into copy operations.
+  -> IO Bool
+setTextureColorModFloat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_SetTextureColorModFloat x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Set an additional color value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * color@
+--
+--     Color modulation is not always supported by the renderer; it will return false if color modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureColorModFloat', 'setTextureAlphaModFloat', 'setTextureColorMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTextureColorModFloat@.
+--                   The unsafe flavor is 'setTextureColorModFloat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureColorModFloat@, defined at @SDL3\/SDL_render.h 1092:34@
+setTextureColorModFloatSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> Float
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into copy operations.
+  -> Float
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into copy operations.
+  -> Float
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into copy operations.
+  -> IO Bool
+setTextureColorModFloatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_SetTextureColorModFloat x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Get the additional color value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaMod', 'getTextureColorModFloat', 'setTextureColorMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTextureColorMod@.
+--                   The safe flavor is 'getTextureColorModSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureColorMod@, defined at @SDL3\/SDL_render.h 1113:34@
+getTextureColorMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO Bool
+getTextureColorMod =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_GetTextureColorMod x00 x11 x22 x33)
+
+-- | Get the additional color value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaMod', 'getTextureColorModFloat', 'setTextureColorMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTextureColorMod@.
+--                   The unsafe flavor is 'getTextureColorMod'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureColorMod@, defined at @SDL3\/SDL_render.h 1113:34@
+getTextureColorModSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO Bool
+getTextureColorModSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_GetTextureColorMod x00 x11 x22 x33)
+
+-- | Get the additional color value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaModFloat', 'getTextureColorMod', 'setTextureColorModFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTextureColorModFloat@.
+--                   The safe flavor is 'getTextureColorModFloatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureColorModFloat@, defined at @SDL3\/SDL_render.h 1133:34@
+getTextureColorModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO Bool
+getTextureColorModFloat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_GetTextureColorModFloat x00 x11 x22 x33)
+
+-- | Get the additional color value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaModFloat', 'getTextureColorMod', 'setTextureColorModFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTextureColorModFloat@.
+--                   The unsafe flavor is 'getTextureColorModFloat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureColorModFloat@, defined at @SDL3\/SDL_render.h 1133:34@
+getTextureColorModFloatSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO Bool
+getTextureColorModFloatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_GetTextureColorModFloat x00 x11 x22 x33)
+
+-- | Set an additional alpha value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * (alpha \/ 255)@
+--
+--     Alpha modulation is not always supported by the renderer; it will return false if alpha modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaMod', 'setTextureAlphaModFloat', 'setTextureColorMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTextureAlphaMod@.
+--                   The safe flavor is 'setTextureAlphaModSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureAlphaMod@, defined at @SDL3\/SDL_render.h 1159:34@
+setTextureAlphaMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@alpha@]: the source alpha value multiplied into copy operations.
+  -> IO Bool
+setTextureAlphaMod =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetTextureAlphaMod x00 (Coerce.coerce x11))
+
+-- | Set an additional alpha value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * (alpha \/ 255)@
+--
+--     Alpha modulation is not always supported by the renderer; it will return false if alpha modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaMod', 'setTextureAlphaModFloat', 'setTextureColorMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTextureAlphaMod@.
+--                   The unsafe flavor is 'setTextureAlphaMod'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureAlphaMod@, defined at @SDL3\/SDL_render.h 1159:34@
+setTextureAlphaModSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@alpha@]: the source alpha value multiplied into copy operations.
+  -> IO Bool
+setTextureAlphaModSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetTextureAlphaMod x00 (Coerce.coerce x11))
+
+-- | Set an additional alpha value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * alpha@
+--
+--     Alpha modulation is not always supported by the renderer; it will return false if alpha modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaModFloat', 'setTextureAlphaMod', 'setTextureColorModFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTextureAlphaModFloat@.
+--                   The safe flavor is 'setTextureAlphaModFloatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureAlphaModFloat@, defined at @SDL3\/SDL_render.h 1185:34@
+setTextureAlphaModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> Float
+  -- ^
+  --
+  --           [@alpha@]: the source alpha value multiplied into copy operations.
+  -> IO Bool
+setTextureAlphaModFloat =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetTextureAlphaModFloat x00 (Coerce.coerce x11))
+
+-- | Set an additional alpha value multiplied into render copy operations.
+--
+--     When this texture is rendered, during the copy operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * alpha@
+--
+--     Alpha modulation is not always supported by the renderer; it will return false if alpha modulation is not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaModFloat', 'setTextureAlphaMod', 'setTextureColorModFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTextureAlphaModFloat@.
+--                   The unsafe flavor is 'setTextureAlphaModFloat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureAlphaModFloat@, defined at @SDL3\/SDL_render.h 1185:34@
+setTextureAlphaModFloatSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> Float
+  -- ^
+  --
+  --           [@alpha@]: the source alpha value multiplied into copy operations.
+  -> IO Bool
+setTextureAlphaModFloatSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetTextureAlphaModFloat x00 (Coerce.coerce x11))
+
+-- | Get the additional alpha value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaModFloat', 'getTextureColorMod', 'setTextureAlphaMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTextureAlphaMod@.
+--                   The safe flavor is 'getTextureAlphaModSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureAlphaMod@, defined at @SDL3\/SDL_render.h 1203:34@
+getTextureAlphaMod
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO Bool
+getTextureAlphaMod =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetTextureAlphaMod x00 x11)
+
+-- | Get the additional alpha value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaModFloat', 'getTextureColorMod', 'setTextureAlphaMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTextureAlphaMod@.
+--                   The unsafe flavor is 'getTextureAlphaMod'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureAlphaMod@, defined at @SDL3\/SDL_render.h 1203:34@
+getTextureAlphaModSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO Bool
+getTextureAlphaModSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetTextureAlphaMod x00 x11)
+
+-- | Get the additional alpha value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaMod', 'getTextureColorModFloat', 'setTextureAlphaModFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTextureAlphaModFloat@.
+--                   The safe flavor is 'getTextureAlphaModFloatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureAlphaModFloat@, defined at @SDL3\/SDL_render.h 1221:34@
+getTextureAlphaModFloat
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO Bool
+getTextureAlphaModFloat =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetTextureAlphaModFloat x00 x11)
+
+-- | Get the additional alpha value multiplied into render copy operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureAlphaMod', 'getTextureColorModFloat', 'setTextureAlphaModFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTextureAlphaModFloat@.
+--                   The unsafe flavor is 'getTextureAlphaModFloat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureAlphaModFloat@, defined at @SDL3\/SDL_render.h 1221:34@
+getTextureAlphaModFloatSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO Bool
+getTextureAlphaModFloatSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetTextureAlphaModFloat x00 x11)
+
+-- | Set the blend mode for a texture, used by @'renderTexture'@.
+--
+--     If the blend mode is not supported, the closest supported mode is chosen and this function returns false.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTextureBlendMode@.
+--                   The safe flavor is 'setTextureBlendModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureBlendMode@, defined at @SDL3\/SDL_render.h 1240:34@
+setTextureBlendMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for texture blending.
+  -> IO Bool
+setTextureBlendMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetTextureBlendMode x00 x11)
+
+-- | Set the blend mode for a texture, used by @'renderTexture'@.
+--
+--     If the blend mode is not supported, the closest supported mode is chosen and this function returns false.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTextureBlendMode@.
+--                   The unsafe flavor is 'setTextureBlendMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureBlendMode@, defined at @SDL3\/SDL_render.h 1240:34@
+setTextureBlendModeSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for texture blending.
+  -> IO Bool
+setTextureBlendModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetTextureBlendMode x00 x11)
+
+-- | Get the blend mode used for texture copy operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTextureBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTextureBlendMode@.
+--                   The safe flavor is 'getTextureBlendModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureBlendMode@, defined at @SDL3\/SDL_render.h 1256:34@
+getTextureBlendMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO Bool
+getTextureBlendMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetTextureBlendMode x00 x11)
+
+-- | Get the blend mode used for texture copy operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTextureBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTextureBlendMode@.
+--                   The unsafe flavor is 'getTextureBlendMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureBlendMode@, defined at @SDL3\/SDL_render.h 1256:34@
+getTextureBlendModeSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO Bool
+getTextureBlendModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetTextureBlendMode x00 x11)
+
+-- | Set the scale mode used for texture scale operations.
+--
+--     The default texture scale mode is SDL_SCALEMODE_LINEAR.
+--
+--     If the scale mode is not supported, the closest supported mode is chosen.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureScaleMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTextureScaleMode@.
+--                   The safe flavor is 'setTextureScaleModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureScaleMode@, defined at @SDL3\/SDL_render.h 1276:34@
+setTextureScaleMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the SDL_ScaleMode to use for texture scaling.
+  -> IO Bool
+setTextureScaleMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetTextureScaleMode x00 x11)
+
+-- | Set the scale mode used for texture scale operations.
+--
+--     The default texture scale mode is SDL_SCALEMODE_LINEAR.
+--
+--     If the scale mode is not supported, the closest supported mode is chosen.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTextureScaleMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTextureScaleMode@.
+--                   The unsafe flavor is 'setTextureScaleMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTextureScaleMode@, defined at @SDL3\/SDL_render.h 1276:34@
+setTextureScaleModeSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the SDL_ScaleMode to use for texture scaling.
+  -> IO Bool
+setTextureScaleModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetTextureScaleMode x00 x11)
+
+-- | Get the scale mode used for texture scale operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTextureScaleMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTextureScaleMode@.
+--                   The safe flavor is 'getTextureScaleModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureScaleMode@, defined at @SDL3\/SDL_render.h 1292:34@
+getTextureScaleMode
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: a pointer filled in with the current scale mode.
+  -> IO Bool
+getTextureScaleMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetTextureScaleMode x00 x11)
+
+-- | Get the scale mode used for texture scale operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTextureScaleMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTextureScaleMode@.
+--                   The unsafe flavor is 'getTextureScaleMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTextureScaleMode@, defined at @SDL3\/SDL_render.h 1292:34@
+getTextureScaleModeSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: a pointer filled in with the current scale mode.
+  -> IO Bool
+getTextureScaleModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetTextureScaleMode x00 x11)
+
+-- | Update the given texture rectangle with new pixel data.
+--
+--     The pixel data must be in the pixel format of the texture, which can be queried using the SDL_PROP_TEXTURE_FORMAT_NUMBER property.
+--
+--     This is a fairly slow function, intended for use with static textures that do not change often.
+--
+--     If the texture is intended to be updated often, it is preferred to create the texture as streaming and use the locking functions referenced below. While this function will work with streaming textures, for optimization reasons you may not get the pixels back if you lock the texture afterward.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockTexture', 'unlockTexture', 'updateNVTexture', 'updateYUVTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UpdateTexture@.
+--                   The safe flavor is 'updateTextureSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateTexture@, defined at @SDL3\/SDL_render.h 1326:34@
+updateTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@pixels@]: the raw pixel data in the format of the texture.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@pitch@]: the number of bytes in a row of pixel data, including padding between lines.
+  -> IO Bool
+updateTexture =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_UpdateTexture x00 x11 x22 (Coerce.coerce x33))
+
+-- | Update the given texture rectangle with new pixel data.
+--
+--     The pixel data must be in the pixel format of the texture, which can be queried using the SDL_PROP_TEXTURE_FORMAT_NUMBER property.
+--
+--     This is a fairly slow function, intended for use with static textures that do not change often.
+--
+--     If the texture is intended to be updated often, it is preferred to create the texture as streaming and use the locking functions referenced below. While this function will work with streaming textures, for optimization reasons you may not get the pixels back if you lock the texture afterward.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockTexture', 'unlockTexture', 'updateNVTexture', 'updateYUVTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UpdateTexture@.
+--                   The unsafe flavor is 'updateTexture'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateTexture@, defined at @SDL3\/SDL_render.h 1326:34@
+updateTextureSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@pixels@]: the raw pixel data in the format of the texture.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@pitch@]: the number of bytes in a row of pixel data, including padding between lines.
+  -> IO Bool
+updateTextureSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_UpdateTexture x00 x11 x22 (Coerce.coerce x33))
+
+-- | Update a rectangle within a planar YV12 or IYUV texture with new pixel data.
+--
+--     You can use @'updateTexture'@ as long as your pixel data is a contiguous block of Y and U\/V planes in the proper order, but this function is available if your pixel data is not contiguous.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'updateNVTexture', 'updateTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UpdateYUVTexture@.
+--                   The safe flavor is 'updateYUVTextureSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateYUVTexture@, defined at @SDL3\/SDL_render.h 1358:34@
+updateYUVTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Yplane@]: the raw pixel data for the Y plane.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@Ypitch@]: the number of bytes between rows of pixel data for the Y plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Uplane@]: the raw pixel data for the U plane.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@Upitch@]: the number of bytes between rows of pixel data for the U plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Vplane@]: the raw pixel data for the V plane.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@Vpitch@]: the number of bytes between rows of pixel data for the V plane.
+  -> IO Bool
+updateYUVTexture =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  fmap
+                    CBool.toBool
+                    ( Unsafe.sDL_UpdateYUVTexture
+                        x00
+                        x11
+                        x22
+                        (Coerce.coerce x33)
+                        x44
+                        (Coerce.coerce x55)
+                        x66
+                        (Coerce.coerce x77)
+                    )
+
+-- | Update a rectangle within a planar YV12 or IYUV texture with new pixel data.
+--
+--     You can use @'updateTexture'@ as long as your pixel data is a contiguous block of Y and U\/V planes in the proper order, but this function is available if your pixel data is not contiguous.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'updateNVTexture', 'updateTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UpdateYUVTexture@.
+--                   The unsafe flavor is 'updateYUVTexture'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateYUVTexture@, defined at @SDL3\/SDL_render.h 1358:34@
+updateYUVTextureSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Yplane@]: the raw pixel data for the Y plane.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@Ypitch@]: the number of bytes between rows of pixel data for the Y plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Uplane@]: the raw pixel data for the U plane.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@Upitch@]: the number of bytes between rows of pixel data for the U plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Vplane@]: the raw pixel data for the V plane.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@Vpitch@]: the number of bytes between rows of pixel data for the V plane.
+  -> IO Bool
+updateYUVTextureSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  fmap
+                    CBool.toBool
+                    ( Safe.sDL_UpdateYUVTexture
+                        x00
+                        x11
+                        x22
+                        (Coerce.coerce x33)
+                        x44
+                        (Coerce.coerce x55)
+                        x66
+                        (Coerce.coerce x77)
+                    )
+
+-- | Update a rectangle within a planar NV12 or NV21 texture with new pixels.
+--
+--     You can use @'updateTexture'@ as long as your pixel data is a contiguous block of NV12\/21 planes in the proper order, but this function is available if your pixel data is not contiguous.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'updateTexture', 'updateYUVTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UpdateNVTexture@.
+--                   The safe flavor is 'updateNVTextureSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateNVTexture@, defined at @SDL3\/SDL_render.h 1390:34@
+updateNVTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Yplane@]: the raw pixel data for the Y plane.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@Ypitch@]: the number of bytes between rows of pixel data for the Y plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@UVplane@]: the raw pixel data for the UV plane.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@UVpitch@]: the number of bytes between rows of pixel data for the UV plane.
+  -> IO Bool
+updateNVTexture =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap
+                CBool.toBool
+                (Unsafe.sDL_UpdateNVTexture x00 x11 x22 (Coerce.coerce x33) x44 (Coerce.coerce x55))
+
+-- | Update a rectangle within a planar NV12 or NV21 texture with new pixels.
+--
+--     You can use @'updateTexture'@ as long as your pixel data is a contiguous block of NV12\/21 planes in the proper order, but this function is available if your pixel data is not contiguous.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'updateTexture', 'updateYUVTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UpdateNVTexture@.
+--                   The unsafe flavor is 'updateNVTexture'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateNVTexture@, defined at @SDL3\/SDL_render.h 1390:34@
+updateNVTextureSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle of pixels to update, or NULL to update the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@Yplane@]: the raw pixel data for the Y plane.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@Ypitch@]: the number of bytes between rows of pixel data for the Y plane.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@UVplane@]: the raw pixel data for the UV plane.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@UVpitch@]: the number of bytes between rows of pixel data for the UV plane.
+  -> IO Bool
+updateNVTextureSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Safe.sDL_UpdateNVTexture x00 x11 x22 (Coerce.coerce x33) x44 (Coerce.coerce x55))
+
+-- | Lock a portion of the texture for __write-only__ pixel access.
+--
+--     As an optimization, the pixels made available for editing don\'t necessarily contain the old texture data. This is a write-only operation, and if you need to keep a copy of the texture data you should do that at the application level.
+--
+--     You must use @'unlockTexture'@ to unlock the pixels and apply any changes.
+--
+--     [Returns]: true on success or false if the texture is not valid or was not created with @SDL_TEXTUREACCESS_STREAMING@; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockTextureToSurface', 'unlockTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LockTexture@.
+--                   The safe flavor is 'lockTextureSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LockTexture@, defined at @SDL3\/SDL_render.h 1425:34@
+lockTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to lock for access, which was created with @SDL_TEXTUREACCESS_STREAMING@.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to lock for access; NULL to lock the entire texture.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@pixels@]: this is filled in with a pointer to the locked pixels, appropriately offset by the locked area.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@pitch@]: this is filled in with the pitch of the locked pixels; the pitch is the length of one row in bytes.
+  -> IO Bool
+lockTexture =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_LockTexture x00 x11 x22 x33)
+
+-- | Lock a portion of the texture for __write-only__ pixel access.
+--
+--     As an optimization, the pixels made available for editing don\'t necessarily contain the old texture data. This is a write-only operation, and if you need to keep a copy of the texture data you should do that at the application level.
+--
+--     You must use @'unlockTexture'@ to unlock the pixels and apply any changes.
+--
+--     [Returns]: true on success or false if the texture is not valid or was not created with @SDL_TEXTUREACCESS_STREAMING@; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockTextureToSurface', 'unlockTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LockTexture@.
+--                   The unsafe flavor is 'lockTexture'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LockTexture@, defined at @SDL3\/SDL_render.h 1425:34@
+lockTextureSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to lock for access, which was created with @SDL_TEXTUREACCESS_STREAMING@.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to lock for access; NULL to lock the entire texture.
+  -> BG.Ptr (BG.Ptr BG.Void)
+  -- ^
+  --
+  --           [@pixels@]: this is filled in with a pointer to the locked pixels, appropriately offset by the locked area.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@pitch@]: this is filled in with the pitch of the locked pixels; the pitch is the length of one row in bytes.
+  -> IO Bool
+lockTextureSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_LockTexture x00 x11 x22 x33)
+
+-- | Lock a portion of the texture for __write-only__ pixel access, and expose it as a SDL surface.
+--
+--     Besides providing an SDL_Surface instead of raw pixel data, this function operates like 'lockTexture'.
+--
+--     As an optimization, the pixels made available for editing don\'t necessarily contain the old texture data. This is a write-only operation, and if you need to keep a copy of the texture data you should do that at the application level.
+--
+--     You must use @'unlockTexture'@ to unlock the pixels and apply any changes.
+--
+--     The returned surface is freed internally after calling @'unlockTexture'@ or @'destroyTexture'@. The caller should not free it.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockTexture', 'unlockTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LockTextureToSurface@.
+--                   The safe flavor is 'lockTextureToSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LockTextureToSurface@, defined at @SDL3\/SDL_render.h 1463:34@
+lockTextureToSurface
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to lock for access, which must be created with @SDL_TEXTUREACCESS_STREAMING@.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle to lock for access. If the rect is NULL, the entire texture will be locked.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+  -- ^
+  --
+  --           [@surface@]: a pointer to an SDL surface of size __rect__. Don\'t assume any specific pixel content.
+  -> IO Bool
+lockTextureToSurface =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_LockTextureToSurface x00 x11 x22)
+
+-- | Lock a portion of the texture for __write-only__ pixel access, and expose it as a SDL surface.
+--
+--     Besides providing an SDL_Surface instead of raw pixel data, this function operates like 'lockTexture'.
+--
+--     As an optimization, the pixels made available for editing don\'t necessarily contain the old texture data. This is a write-only operation, and if you need to keep a copy of the texture data you should do that at the application level.
+--
+--     You must use @'unlockTexture'@ to unlock the pixels and apply any changes.
+--
+--     The returned surface is freed internally after calling @'unlockTexture'@ or @'destroyTexture'@. The caller should not free it.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockTexture', 'unlockTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LockTextureToSurface@.
+--                   The unsafe flavor is 'lockTextureToSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LockTextureToSurface@, defined at @SDL3\/SDL_render.h 1463:34@
+lockTextureToSurfaceSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to lock for access, which must be created with @SDL_TEXTUREACCESS_STREAMING@.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the rectangle to lock for access. If the rect is NULL, the entire texture will be locked.
+  -> BG.Ptr (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+  -- ^
+  --
+  --           [@surface@]: a pointer to an SDL surface of size __rect__. Don\'t assume any specific pixel content.
+  -> IO Bool
+lockTextureToSurfaceSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_LockTextureToSurface x00 x11 x22)
+
+-- | Unlock a texture, uploading the changes to video memory, if needed.
+--
+--     __Warning__: Please note that @'lockTexture'@ is intended to be write-only; it will not guarantee the previous contents of the texture will be provided. You must fully initialize any area of a texture that you lock before unlocking it, as the pixels might otherwise be uninitialized memory.
+--
+--     Which is to say: locking and immediately unlocking a texture can result in corrupted textures, depending on the renderer in use.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnlockTexture@.
+--                   The safe flavor is 'unlockTextureSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockTexture@, defined at @SDL3\/SDL_render.h 1484:34@
+unlockTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: a texture locked by @'lockTexture'@.
+  -> IO ()
+unlockTexture = Unsafe.sDL_UnlockTexture
+
+-- | Unlock a texture, uploading the changes to video memory, if needed.
+--
+--     __Warning__: Please note that @'lockTexture'@ is intended to be write-only; it will not guarantee the previous contents of the texture will be provided. You must fully initialize any area of a texture that you lock before unlocking it, as the pixels might otherwise be uninitialized memory.
+--
+--     Which is to say: locking and immediately unlocking a texture can result in corrupted textures, depending on the renderer in use.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnlockTexture@.
+--                   The unsafe flavor is 'unlockTexture'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockTexture@, defined at @SDL3\/SDL_render.h 1484:34@
+unlockTextureSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: a texture locked by @'lockTexture'@.
+  -> IO ()
+unlockTextureSafe = Safe.sDL_UnlockTexture
+
+-- | Set a texture as the current rendering target.
+--
+--     The default render target is the window for which the renderer was created. To stop rendering to a texture and render to the window again, call this function with a NULL @texture@.
+--
+--     Viewport, cliprect, scale, and logical presentation are unique to each render target. Get and set functions for these states apply to the current render target set by this function, and those states persist on each target when the current render target changes.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderTarget'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderTarget@.
+--                   The safe flavor is 'setRenderTargetSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderTarget@, defined at @SDL3\/SDL_render.h 1511:34@
+setRenderTarget
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the targeted texture, which must be created with the @SDL_TEXTUREACCESS_TARGET@ flag, or NULL to render to the window instead of a texture.
+  -> IO Bool
+setRenderTarget =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetRenderTarget x00 x11)
+
+-- | Set a texture as the current rendering target.
+--
+--     The default render target is the window for which the renderer was created. To stop rendering to a texture and render to the window again, call this function with a NULL @texture@.
+--
+--     Viewport, cliprect, scale, and logical presentation are unique to each render target. Get and set functions for these states apply to the current render target set by this function, and those states persist on each target when the current render target changes.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderTarget'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderTarget@.
+--                   The unsafe flavor is 'setRenderTarget'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderTarget@, defined at @SDL3\/SDL_render.h 1511:34@
+setRenderTargetSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the targeted texture, which must be created with the @SDL_TEXTUREACCESS_TARGET@ flag, or NULL to render to the window instead of a texture.
+  -> IO Bool
+setRenderTargetSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetRenderTarget x00 x11)
+
+-- | Get the current render target.
+--
+--     The default render target is the window for which the renderer was created, and is reported a NULL here.
+--
+--     [Returns]: the current render target or NULL for the default render target.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderTarget'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderTarget@.
+--                   The safe flavor is 'getRenderTargetSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRenderTarget@, defined at @SDL3\/SDL_render.h 1528:43@
+getRenderTarget
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (BG.Ptr SDL_Texture)
+getRenderTarget = Unsafe.sDL_GetRenderTarget
+
+-- | Get the current render target.
+--
+--     The default render target is the window for which the renderer was created, and is reported a NULL here.
+--
+--     [Returns]: the current render target or NULL for the default render target.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderTarget'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderTarget@.
+--                   The unsafe flavor is 'getRenderTarget'
+--                   .
+--
+--     [C declaration]: @SDL_GetRenderTarget@, defined at @SDL3\/SDL_render.h 1528:43@
+getRenderTargetSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO (BG.Ptr SDL_Texture)
+getRenderTargetSafe = Safe.sDL_GetRenderTarget
+
+-- | Set a device-independent resolution and presentation mode for rendering.
+--
+--     This function sets the width and height of the logical rendering output. The renderer will act as if the current render target is always the requested dimensions, scaling to the actual resolution as necessary.
+--
+--     This can be useful for games that expect a fixed size, but would like to scale the output to whatever is available, regardless of how a user resizes a window, or if the display is high DPI.
+--
+--     Logical presentation can be used with both render target textures and the renderer\'s window; the state is unique to each render target, and this function sets the state for the current render target. It might be useful to draw to a texture that matches the window dimensions with logical presentation enabled, and then draw that texture across the entire window with logical presentation disabled. Be careful not to render both with logical presentation enabled, however, as this could produce double-letterboxing, etc.
+--
+--     You can disable logical coordinates by setting the mode to SDL_LOGICAL_PRESENTATION_DISABLED, and in that case you get the full pixel resolution of the render target; it is safe to toggle logical presentation during the rendering of a frame: perhaps most of the rendering is done to specific dimensions but to make fonts look sharp, the app turns off logical presentation while drawing text, for example.
+--
+--     You can convert coordinates in an event into rendering coordinates using @'convertEventToRenderCoordinates'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'convertEventToRenderCoordinates', 'getRenderLogicalPresentation', 'getRenderLogicalPresentationRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderLogicalPresentation@.
+--                   The safe flavor is 'setRenderLogicalPresentationSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderLogicalPresentation@, defined at @SDL3\/SDL_render.h 1575:34@
+setRenderLogicalPresentation
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the logical resolution.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the logical resolution.
+  -> SDL_RendererLogicalPresentation
+  -- ^
+  --
+  --           [@mode@]: the presentation mode used.
+  -> IO Bool
+setRenderLogicalPresentation =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_SetRenderLogicalPresentation x00 (Coerce.coerce x11) (Coerce.coerce x22) x33)
+
+-- | Set a device-independent resolution and presentation mode for rendering.
+--
+--     This function sets the width and height of the logical rendering output. The renderer will act as if the current render target is always the requested dimensions, scaling to the actual resolution as necessary.
+--
+--     This can be useful for games that expect a fixed size, but would like to scale the output to whatever is available, regardless of how a user resizes a window, or if the display is high DPI.
+--
+--     Logical presentation can be used with both render target textures and the renderer\'s window; the state is unique to each render target, and this function sets the state for the current render target. It might be useful to draw to a texture that matches the window dimensions with logical presentation enabled, and then draw that texture across the entire window with logical presentation disabled. Be careful not to render both with logical presentation enabled, however, as this could produce double-letterboxing, etc.
+--
+--     You can disable logical coordinates by setting the mode to SDL_LOGICAL_PRESENTATION_DISABLED, and in that case you get the full pixel resolution of the render target; it is safe to toggle logical presentation during the rendering of a frame: perhaps most of the rendering is done to specific dimensions but to make fonts look sharp, the app turns off logical presentation while drawing text, for example.
+--
+--     You can convert coordinates in an event into rendering coordinates using @'convertEventToRenderCoordinates'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'convertEventToRenderCoordinates', 'getRenderLogicalPresentation', 'getRenderLogicalPresentationRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderLogicalPresentation@.
+--                   The unsafe flavor is 'setRenderLogicalPresentation'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderLogicalPresentation@, defined at @SDL3\/SDL_render.h 1575:34@
+setRenderLogicalPresentationSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the logical resolution.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the logical resolution.
+  -> SDL_RendererLogicalPresentation
+  -- ^
+  --
+  --           [@mode@]: the presentation mode used.
+  -> IO Bool
+setRenderLogicalPresentationSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_SetRenderLogicalPresentation x00 (Coerce.coerce x11) (Coerce.coerce x22) x33)
+
+-- | Get device independent resolution and presentation mode for rendering.
+--
+--     This function gets the width and height of the logical rendering output, or 0 if a logical resolution is not enabled.
+--
+--     Each render target has its own logical presentation state. This function gets the state for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderLogicalPresentation'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderLogicalPresentation@.
+--                   The safe flavor is 'getRenderLogicalPresentationSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderLogicalPresentation@, defined at @SDL3\/SDL_render.h 1600:34@
+getRenderLogicalPresentation
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: an int filled with the logical presentation width.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: an int filled with the logical presentation height.
+  -> BG.Ptr SDL_RendererLogicalPresentation
+  -- ^
+  --
+  --           [@mode@]: a variable filled with the logical presentation mode being used.
+  -> IO Bool
+getRenderLogicalPresentation =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_GetRenderLogicalPresentation x00 x11 x22 x33)
+
+-- | Get device independent resolution and presentation mode for rendering.
+--
+--     This function gets the width and height of the logical rendering output, or 0 if a logical resolution is not enabled.
+--
+--     Each render target has its own logical presentation state. This function gets the state for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderLogicalPresentation'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderLogicalPresentation@.
+--                   The unsafe flavor is 'getRenderLogicalPresentation'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderLogicalPresentation@, defined at @SDL3\/SDL_render.h 1600:34@
+getRenderLogicalPresentationSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: an int filled with the logical presentation width.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: an int filled with the logical presentation height.
+  -> BG.Ptr SDL_RendererLogicalPresentation
+  -- ^
+  --
+  --           [@mode@]: a variable filled with the logical presentation mode being used.
+  -> IO Bool
+getRenderLogicalPresentationSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_GetRenderLogicalPresentation x00 x11 x22 x33)
+
+-- | Get the final presentation rectangle for rendering.
+--
+--     This function returns the calculated rectangle used for logical presentation, based on the presentation mode and output size. If logical presentation is disabled, it will fill the rectangle with the output size, in pixels.
+--
+--     Each render target has its own logical presentation state. This function gets the rectangle for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderLogicalPresentation'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderLogicalPresentationRect@.
+--                   The safe flavor is 'getRenderLogicalPresentationRectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderLogicalPresentationRect@, defined at @SDL3\/SDL_render.h 1625:34@
+getRenderLogicalPresentationRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the final presentation rectangle, may be NULL.
+  -> IO Bool
+getRenderLogicalPresentationRect =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetRenderLogicalPresentationRect x00 x11)
+
+-- | Get the final presentation rectangle for rendering.
+--
+--     This function returns the calculated rectangle used for logical presentation, based on the presentation mode and output size. If logical presentation is disabled, it will fill the rectangle with the output size, in pixels.
+--
+--     Each render target has its own logical presentation state. This function gets the rectangle for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderLogicalPresentation'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderLogicalPresentationRect@.
+--                   The unsafe flavor is 'getRenderLogicalPresentationRect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderLogicalPresentationRect@, defined at @SDL3\/SDL_render.h 1625:34@
+getRenderLogicalPresentationRectSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the final presentation rectangle, may be NULL.
+  -> IO Bool
+getRenderLogicalPresentationRectSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetRenderLogicalPresentationRect x00 x11)
+
+-- | Get a point in render coordinates when given a point in window coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderLogicalPresentation', 'setRenderScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderCoordinatesFromWindow@.
+--                   The safe flavor is 'renderCoordinatesFromWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderCoordinatesFromWindow@, defined at @SDL3\/SDL_render.h 1652:34@
+renderCoordinatesFromWindow
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> Float
+  -- ^
+  --
+  --           [@window_x@]: the x coordinate in window coordinates.
+  -> Float
+  -- ^
+  --
+  --           [@window_y@]: the y coordinate in window coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer filled with the x coordinate in render coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer filled with the y coordinate in render coordinates.
+  -> IO Bool
+renderCoordinatesFromWindow =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              (Unsafe.sDL_RenderCoordinatesFromWindow x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44)
+
+-- | Get a point in render coordinates when given a point in window coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderLogicalPresentation', 'setRenderScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderCoordinatesFromWindow@.
+--                   The unsafe flavor is 'renderCoordinatesFromWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderCoordinatesFromWindow@, defined at @SDL3\/SDL_render.h 1652:34@
+renderCoordinatesFromWindowSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> Float
+  -- ^
+  --
+  --           [@window_x@]: the x coordinate in window coordinates.
+  -> Float
+  -- ^
+  --
+  --           [@window_y@]: the y coordinate in window coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@x@]: a pointer filled with the x coordinate in render coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: a pointer filled with the y coordinate in render coordinates.
+  -> IO Bool
+renderCoordinatesFromWindowSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              (Safe.sDL_RenderCoordinatesFromWindow x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44)
+
+-- | Get a point in window coordinates when given a point in render coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderLogicalPresentation', 'setRenderScale', 'setRenderViewport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderCoordinatesToWindow@.
+--                   The safe flavor is 'renderCoordinatesToWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderCoordinatesToWindow@, defined at @SDL3\/SDL_render.h 1682:34@
+renderCoordinatesToWindow
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate in render coordinates.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate in render coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@window_x@]: a pointer filled with the x coordinate in window coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@window_y@]: a pointer filled with the y coordinate in window coordinates.
+  -> IO Bool
+renderCoordinatesToWindow =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              (Unsafe.sDL_RenderCoordinatesToWindow x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44)
+
+-- | Get a point in window coordinates when given a point in render coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderLogicalPresentation', 'setRenderScale', 'setRenderViewport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderCoordinatesToWindow@.
+--                   The unsafe flavor is 'renderCoordinatesToWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderCoordinatesToWindow@, defined at @SDL3\/SDL_render.h 1682:34@
+renderCoordinatesToWindowSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate in render coordinates.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate in render coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@window_x@]: a pointer filled with the x coordinate in window coordinates.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@window_y@]: a pointer filled with the y coordinate in window coordinates.
+  -> IO Bool
+renderCoordinatesToWindowSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              (Safe.sDL_RenderCoordinatesToWindow x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44)
+
+-- | Convert the coordinates in an event to render coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     Various event types are converted with this function: mouse, touch, pen, etc.
+--
+--     Touch coordinates are converted from normalized coordinates in the window to non-normalized rendering coordinates.
+--
+--     Relative mouse coordinates (xrel and yrel event fields) are /also/ converted. Applications that do not want these fields converted should use @'renderCoordinatesFromWindow'@ on the specific event fields instead of converting the entire event structure.
+--
+--     Once converted, coordinates may be outside the rendering area.
+--
+--     [Returns]: true if the event is converted or doesn\'t need conversion, or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderCoordinatesFromWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ConvertEventToRenderCoordinates@.
+--                   The safe flavor is 'convertEventToRenderCoordinatesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ConvertEventToRenderCoordinates@, defined at @SDL3\/SDL_render.h 1718:34@
+convertEventToRenderCoordinates
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event
+  -- ^
+  --
+  --           [@event@]: the event to modify.
+  -> IO Bool
+convertEventToRenderCoordinates =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_ConvertEventToRenderCoordinates x00 x11)
+
+-- | Convert the coordinates in an event to render coordinates.
+--
+--     This takes into account several states:
+--
+--     * The window dimensions.
+--
+--     * The logical presentation settings (SDL_SetRenderLogicalPresentation)
+--
+--     * The scale (SDL_SetRenderScale)
+--
+--     * The viewport (SDL_SetRenderViewport)
+--
+--     Various event types are converted with this function: mouse, touch, pen, etc.
+--
+--     Touch coordinates are converted from normalized coordinates in the window to non-normalized rendering coordinates.
+--
+--     Relative mouse coordinates (xrel and yrel event fields) are /also/ converted. Applications that do not want these fields converted should use @'renderCoordinatesFromWindow'@ on the specific event fields instead of converting the entire event structure.
+--
+--     Once converted, coordinates may be outside the rendering area.
+--
+--     [Returns]: true if the event is converted or doesn\'t need conversion, or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderCoordinatesFromWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ConvertEventToRenderCoordinates@.
+--                   The unsafe flavor is 'convertEventToRenderCoordinates'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ConvertEventToRenderCoordinates@, defined at @SDL3\/SDL_render.h 1718:34@
+convertEventToRenderCoordinatesSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Events.SDL_Event
+  -- ^
+  --
+  --           [@event@]: the event to modify.
+  -> IO Bool
+convertEventToRenderCoordinatesSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_ConvertEventToRenderCoordinates x00 x11)
+
+-- | Set the drawing area for rendering on the current target.
+--
+--     Drawing will clip to this area (separately from any clipping done with SDL_SetRenderClipRect), and the top left of the area will become coordinate (0, 0) for future drawing commands.
+--
+--     The area\'s width and height must be >= 0.
+--
+--     Each render target has its own viewport. This function sets the viewport for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderViewport', 'renderViewportSet'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderViewport@.
+--                   The safe flavor is 'setRenderViewportSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderViewport@, defined at @SDL3\/SDL_render.h 1745:34@
+setRenderViewport
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the drawing area, or NULL to set the viewport to the entire target.
+  -> IO Bool
+setRenderViewport =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetRenderViewport x00 x11)
+
+-- | Set the drawing area for rendering on the current target.
+--
+--     Drawing will clip to this area (separately from any clipping done with SDL_SetRenderClipRect), and the top left of the area will become coordinate (0, 0) for future drawing commands.
+--
+--     The area\'s width and height must be >= 0.
+--
+--     Each render target has its own viewport. This function sets the viewport for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderViewport', 'renderViewportSet'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderViewport@.
+--                   The unsafe flavor is 'setRenderViewport'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderViewport@, defined at @SDL3\/SDL_render.h 1745:34@
+setRenderViewportSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the drawing area, or NULL to set the viewport to the entire target.
+  -> IO Bool
+setRenderViewportSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetRenderViewport x00 x11)
+
+-- | Get the drawing area for the current target.
+--
+--     Each render target has its own viewport. This function gets the viewport for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderViewportSet', 'setRenderViewport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderViewport@.
+--                   The safe flavor is 'getRenderViewportSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderViewport@, defined at @SDL3\/SDL_render.h 1765:34@
+getRenderViewport
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the current drawing area.
+  -> IO Bool
+getRenderViewport =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetRenderViewport x00 x11)
+
+-- | Get the drawing area for the current target.
+--
+--     Each render target has its own viewport. This function gets the viewport for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderViewportSet', 'setRenderViewport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderViewport@.
+--                   The unsafe flavor is 'getRenderViewport'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderViewport@, defined at @SDL3\/SDL_render.h 1765:34@
+getRenderViewportSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the current drawing area.
+  -> IO Bool
+getRenderViewportSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetRenderViewport x00 x11)
+
+-- | Return whether an explicit rectangle was set as the viewport.
+--
+--     This is useful if you\'re saving and restoring the viewport and want to know whether you should restore a specific rectangle or NULL.
+--
+--     Each render target has its own viewport. This function checks the viewport for the current render target.
+--
+--     [Returns]: true if the viewport was set to a specific rectangle, or false if it was set to NULL (the entire target).
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderViewport', 'setRenderViewport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderViewportSet@.
+--                   The safe flavor is 'renderViewportSetSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderViewportSet@, defined at @SDL3\/SDL_render.h 1787:34@
+renderViewportSet
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO Bool
+renderViewportSet =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_RenderViewportSet x00)
+
+-- | Return whether an explicit rectangle was set as the viewport.
+--
+--     This is useful if you\'re saving and restoring the viewport and want to know whether you should restore a specific rectangle or NULL.
+--
+--     Each render target has its own viewport. This function checks the viewport for the current render target.
+--
+--     [Returns]: true if the viewport was set to a specific rectangle, or false if it was set to NULL (the entire target).
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderViewport', 'setRenderViewport'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderViewportSet@.
+--                   The unsafe flavor is 'renderViewportSet'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderViewportSet@, defined at @SDL3\/SDL_render.h 1787:34@
+renderViewportSetSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO Bool
+renderViewportSetSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_RenderViewportSet x00)
+
+-- | Get the safe area for rendering within the current viewport.
+--
+--     Some devices have portions of the screen which are partially obscured or not interactive, possibly due to on-screen controls, curved edges, camera notches, TV overscan, etc. This function provides the area of the current viewport which is safe to have interactible content. You should continue rendering into the rest of the render target, but it should not contain visually important or interactible content.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderSafeArea@.
+--                   The safe flavor is 'getRenderSafeAreaSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderSafeArea@, defined at @SDL3\/SDL_render.h 1809:34@
+getRenderSafeArea
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the area that is safe for interactive content.
+  -> IO Bool
+getRenderSafeArea =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetRenderSafeArea x00 x11)
+
+-- | Get the safe area for rendering within the current viewport.
+--
+--     Some devices have portions of the screen which are partially obscured or not interactive, possibly due to on-screen controls, curved edges, camera notches, TV overscan, etc. This function provides the area of the current viewport which is safe to have interactible content. You should continue rendering into the rest of the render target, but it should not contain visually important or interactible content.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderSafeArea@.
+--                   The unsafe flavor is 'getRenderSafeArea'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderSafeArea@, defined at @SDL3\/SDL_render.h 1809:34@
+getRenderSafeAreaSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the area that is safe for interactive content.
+  -> IO Bool
+getRenderSafeAreaSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetRenderSafeArea x00 x11)
+
+-- | Set the clip rectangle for rendering on the specified target.
+--
+--     Each render target has its own clip rectangle. This function sets the cliprect for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderClipRect', 'renderClipEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderClipRect@.
+--                   The safe flavor is 'setRenderClipRectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderClipRect@, defined at @SDL3\/SDL_render.h 1830:34@
+setRenderClipRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the clip area, relative to the viewport, or NULL to disable clipping.
+  -> IO Bool
+setRenderClipRect =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetRenderClipRect x00 x11)
+
+-- | Set the clip rectangle for rendering on the specified target.
+--
+--     Each render target has its own clip rectangle. This function sets the cliprect for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderClipRect', 'renderClipEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderClipRect@.
+--                   The unsafe flavor is 'setRenderClipRect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderClipRect@, defined at @SDL3\/SDL_render.h 1830:34@
+setRenderClipRectSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the clip area, relative to the viewport, or NULL to disable clipping.
+  -> IO Bool
+setRenderClipRectSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetRenderClipRect x00 x11)
+
+-- | Get the clip rectangle for the current target.
+--
+--     Each render target has its own clip rectangle. This function gets the cliprect for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderClipEnabled', 'setRenderClipRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderClipRect@.
+--                   The safe flavor is 'getRenderClipRectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderClipRect@, defined at @SDL3\/SDL_render.h 1851:34@
+getRenderClipRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the current clipping area or an empty rectangle if clipping is disabled.
+  -> IO Bool
+getRenderClipRect =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetRenderClipRect x00 x11)
+
+-- | Get the clip rectangle for the current target.
+--
+--     Each render target has its own clip rectangle. This function gets the cliprect for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderClipEnabled', 'setRenderClipRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderClipRect@.
+--                   The unsafe flavor is 'getRenderClipRect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderClipRect@, defined at @SDL3\/SDL_render.h 1851:34@
+getRenderClipRectSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the current clipping area or an empty rectangle if clipping is disabled.
+  -> IO Bool
+getRenderClipRectSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetRenderClipRect x00 x11)
+
+-- | Get whether clipping is enabled on the given render target.
+--
+--     Each render target has its own clip rectangle. This function checks the cliprect for the current render target.
+--
+--     [Returns]: true if clipping is enabled or false if not; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderClipRect', 'setRenderClipRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderClipEnabled@.
+--                   The safe flavor is 'renderClipEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderClipEnabled@, defined at @SDL3\/SDL_render.h 1870:34@
+renderClipEnabled
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO Bool
+renderClipEnabled =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_RenderClipEnabled x00)
+
+-- | Get whether clipping is enabled on the given render target.
+--
+--     Each render target has its own clip rectangle. This function checks the cliprect for the current render target.
+--
+--     [Returns]: true if clipping is enabled or false if not; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderClipRect', 'setRenderClipRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderClipEnabled@.
+--                   The unsafe flavor is 'renderClipEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderClipEnabled@, defined at @SDL3\/SDL_render.h 1870:34@
+renderClipEnabledSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO Bool
+renderClipEnabledSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_RenderClipEnabled x00)
+
+-- | Set the drawing scale for rendering on the current target.
+--
+--     The drawing coordinates are scaled by the x\/y scaling factors before they are used by the renderer. This allows resolution independent drawing with a single coordinate system.
+--
+--     If this results in scaling or subpixel drawing by the rendering backend, it will be handled using the appropriate quality hints. For best results use integer scaling factors.
+--
+--     Each render target has its own scale. This function sets the scale for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderScale@.
+--                   The safe flavor is 'setRenderScaleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderScale@, defined at @SDL3\/SDL_render.h 1898:34@
+setRenderScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> Float
+  -- ^
+  --
+  --           [@scaleX@]: the horizontal scaling factor.
+  -> Float
+  -- ^
+  --
+  --           [@scaleY@]: the vertical scaling factor.
+  -> IO Bool
+setRenderScale =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetRenderScale x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Set the drawing scale for rendering on the current target.
+--
+--     The drawing coordinates are scaled by the x\/y scaling factors before they are used by the renderer. This allows resolution independent drawing with a single coordinate system.
+--
+--     If this results in scaling or subpixel drawing by the rendering backend, it will be handled using the appropriate quality hints. For best results use integer scaling factors.
+--
+--     Each render target has its own scale. This function sets the scale for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderScale@.
+--                   The unsafe flavor is 'setRenderScale'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderScale@, defined at @SDL3\/SDL_render.h 1898:34@
+setRenderScaleSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> Float
+  -- ^
+  --
+  --           [@scaleX@]: the horizontal scaling factor.
+  -> Float
+  -- ^
+  --
+  --           [@scaleY@]: the vertical scaling factor.
+  -> IO Bool
+setRenderScaleSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetRenderScale x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Get the drawing scale for the current target.
+--
+--     Each render target has its own scale. This function gets the scale for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderScale@.
+--                   The safe flavor is 'getRenderScaleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderScale@, defined at @SDL3\/SDL_render.h 1918:34@
+getRenderScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scaleX@]: a pointer filled in with the horizontal scaling factor.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scaleY@]: a pointer filled in with the vertical scaling factor.
+  -> IO Bool
+getRenderScale =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetRenderScale x00 x11 x22)
+
+-- | Get the drawing scale for the current target.
+--
+--     Each render target has its own scale. This function gets the scale for the current render target.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderScale@.
+--                   The unsafe flavor is 'getRenderScale'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderScale@, defined at @SDL3\/SDL_render.h 1918:34@
+getRenderScaleSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scaleX@]: a pointer filled in with the horizontal scaling factor.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scaleY@]: a pointer filled in with the vertical scaling factor.
+  -> IO Bool
+getRenderScaleSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetRenderScale x00 x11 x22)
+
+-- | Set the color used for drawing operations.
+--
+--     Set the color for drawing or filling rectangles, lines, and points, and for @'renderClear'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderDrawColor', 'setRenderDrawColorFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderDrawColor@.
+--                   The safe flavor is 'setRenderDrawColorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderDrawColor@, defined at @SDL3\/SDL_render.h 1943:34@
+setRenderDrawColor
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red value used to draw on the rendering target.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green value used to draw on the rendering target.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue value used to draw on the rendering target.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@a@]: the alpha value used to draw on the rendering target; usually @SDL_ALPHA_OPAQUE@ (255). Use 'setRenderDrawBlendMode' to specify how the alpha channel is used.
+  -> IO Bool
+setRenderDrawColor =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              ( Unsafe.sDL_SetRenderDrawColor
+                  x00
+                  (Coerce.coerce x11)
+                  (Coerce.coerce x22)
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+              )
+
+-- | Set the color used for drawing operations.
+--
+--     Set the color for drawing or filling rectangles, lines, and points, and for @'renderClear'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderDrawColor', 'setRenderDrawColorFloat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderDrawColor@.
+--                   The unsafe flavor is 'setRenderDrawColor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderDrawColor@, defined at @SDL3\/SDL_render.h 1943:34@
+setRenderDrawColorSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red value used to draw on the rendering target.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green value used to draw on the rendering target.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue value used to draw on the rendering target.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@a@]: the alpha value used to draw on the rendering target; usually @SDL_ALPHA_OPAQUE@ (255). Use 'setRenderDrawBlendMode' to specify how the alpha channel is used.
+  -> IO Bool
+setRenderDrawColorSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              ( Safe.sDL_SetRenderDrawColor
+                  x00
+                  (Coerce.coerce x11)
+                  (Coerce.coerce x22)
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+              )
+
+-- | Set the color used for drawing operations (Rect, Line and Clear).
+--
+--     Set the color for drawing or filling rectangles, lines, and points, and for @'renderClear'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderDrawColorFloat', 'setRenderDrawColor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderDrawColorFloat@.
+--                   The safe flavor is 'setRenderDrawColorFloatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderDrawColorFloat@, defined at @SDL3\/SDL_render.h 1968:34@
+setRenderDrawColorFloat
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> Float
+  -- ^
+  --
+  --           [@r@]: the red value used to draw on the rendering target.
+  -> Float
+  -- ^
+  --
+  --           [@g@]: the green value used to draw on the rendering target.
+  -> Float
+  -- ^
+  --
+  --           [@b@]: the blue value used to draw on the rendering target.
+  -> Float
+  -- ^
+  --
+  --           [@a@]: the alpha value used to draw on the rendering target. Use 'setRenderDrawBlendMode' to specify how the alpha channel is used.
+  -> IO Bool
+setRenderDrawColorFloat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              ( Unsafe.sDL_SetRenderDrawColorFloat
+                  x00
+                  (Coerce.coerce x11)
+                  (Coerce.coerce x22)
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+              )
+
+-- | Set the color used for drawing operations (Rect, Line and Clear).
+--
+--     Set the color for drawing or filling rectangles, lines, and points, and for @'renderClear'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderDrawColorFloat', 'setRenderDrawColor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderDrawColorFloat@.
+--                   The unsafe flavor is 'setRenderDrawColorFloat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderDrawColorFloat@, defined at @SDL3\/SDL_render.h 1968:34@
+setRenderDrawColorFloatSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> Float
+  -- ^
+  --
+  --           [@r@]: the red value used to draw on the rendering target.
+  -> Float
+  -- ^
+  --
+  --           [@g@]: the green value used to draw on the rendering target.
+  -> Float
+  -- ^
+  --
+  --           [@b@]: the blue value used to draw on the rendering target.
+  -> Float
+  -- ^
+  --
+  --           [@a@]: the alpha value used to draw on the rendering target. Use 'setRenderDrawBlendMode' to specify how the alpha channel is used.
+  -> IO Bool
+setRenderDrawColorFloatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              ( Safe.sDL_SetRenderDrawColorFloat
+                  x00
+                  (Coerce.coerce x11)
+                  (Coerce.coerce x22)
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+              )
+
+-- | Get the color used for drawing operations (Rect, Line and Clear).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderDrawColorFloat', 'setRenderDrawColor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderDrawColor@.
+--                   The safe flavor is 'getRenderDrawColorSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderDrawColor@, defined at @SDL3\/SDL_render.h 1992:34@
+getRenderDrawColor
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha value used to draw on the rendering target; usually @SDL_ALPHA_OPAQUE@ (255).
+  -> IO Bool
+getRenderDrawColor =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_GetRenderDrawColor x00 x11 x22 x33 x44)
+
+-- | Get the color used for drawing operations (Rect, Line and Clear).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderDrawColorFloat', 'setRenderDrawColor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderDrawColor@.
+--                   The unsafe flavor is 'getRenderDrawColor'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderDrawColor@, defined at @SDL3\/SDL_render.h 1992:34@
+getRenderDrawColorSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue value used to draw on the rendering target.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha value used to draw on the rendering target; usually @SDL_ALPHA_OPAQUE@ (255).
+  -> IO Bool
+getRenderDrawColorSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_GetRenderDrawColor x00 x11 x22 x33 x44)
+
+-- | Get the color used for drawing operations (Rect, Line and Clear).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderDrawColorFloat', 'getRenderDrawColor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderDrawColorFloat@.
+--                   The safe flavor is 'getRenderDrawColorFloatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderDrawColorFloat@, defined at @SDL3\/SDL_render.h 2016:34@
+getRenderDrawColorFloat
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha value used to draw on the rendering target.
+  -> IO Bool
+getRenderDrawColorFloat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_GetRenderDrawColorFloat x00 x11 x22 x33 x44)
+
+-- | Get the color used for drawing operations (Rect, Line and Clear).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderDrawColorFloat', 'getRenderDrawColor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderDrawColorFloat@.
+--                   The unsafe flavor is 'getRenderDrawColorFloat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderDrawColorFloat@, defined at @SDL3\/SDL_render.h 2016:34@
+getRenderDrawColorFloatSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue value used to draw on the rendering target.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha value used to draw on the rendering target.
+  -> IO Bool
+getRenderDrawColorFloatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_GetRenderDrawColorFloat x00 x11 x22 x33 x44)
+
+-- | Set the color scale used for render operations.
+--
+--     The color scale is an additional scale multiplied into the pixel color value while rendering. This can be used to adjust the brightness of colors during HDR rendering, or changing HDR video brightness when playing on an SDR display.
+--
+--     The color scale does not affect the alpha channel, only the color brightness.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderColorScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderColorScale@.
+--                   The safe flavor is 'setRenderColorScaleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderColorScale@, defined at @SDL3\/SDL_render.h 2040:34@
+setRenderColorScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the color scale value.
+  -> IO Bool
+setRenderColorScale =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetRenderColorScale x00 (Coerce.coerce x11))
+
+-- | Set the color scale used for render operations.
+--
+--     The color scale is an additional scale multiplied into the pixel color value while rendering. This can be used to adjust the brightness of colors during HDR rendering, or changing HDR video brightness when playing on an SDR display.
+--
+--     The color scale does not affect the alpha channel, only the color brightness.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderColorScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderColorScale@.
+--                   The unsafe flavor is 'setRenderColorScale'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderColorScale@, defined at @SDL3\/SDL_render.h 2040:34@
+setRenderColorScaleSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the color scale value.
+  -> IO Bool
+setRenderColorScaleSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetRenderColorScale x00 (Coerce.coerce x11))
+
+-- | Get the color scale used for render operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderColorScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderColorScale@.
+--                   The safe flavor is 'getRenderColorScaleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderColorScale@, defined at @SDL3\/SDL_render.h 2056:34@
+getRenderColorScale
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: a pointer filled in with the current color scale value.
+  -> IO Bool
+getRenderColorScale =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetRenderColorScale x00 x11)
+
+-- | Get the color scale used for render operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderColorScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderColorScale@.
+--                   The unsafe flavor is 'getRenderColorScale'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderColorScale@, defined at @SDL3\/SDL_render.h 2056:34@
+getRenderColorScaleSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@scale@]: a pointer filled in with the current color scale value.
+  -> IO Bool
+getRenderColorScaleSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetRenderColorScale x00 x11)
+
+-- | Set the blend mode used for drawing operations (Fill and Line).
+--
+--     If the blend mode is not supported, the closest supported mode is chosen.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderDrawBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderDrawBlendMode@.
+--                   The safe flavor is 'setRenderDrawBlendModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderDrawBlendMode@, defined at @SDL3\/SDL_render.h 2074:34@
+setRenderDrawBlendMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for blending.
+  -> IO Bool
+setRenderDrawBlendMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetRenderDrawBlendMode x00 x11)
+
+-- | Set the blend mode used for drawing operations (Fill and Line).
+--
+--     If the blend mode is not supported, the closest supported mode is chosen.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderDrawBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderDrawBlendMode@.
+--                   The unsafe flavor is 'setRenderDrawBlendMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderDrawBlendMode@, defined at @SDL3\/SDL_render.h 2074:34@
+setRenderDrawBlendModeSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for blending.
+  -> IO Bool
+setRenderDrawBlendModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetRenderDrawBlendMode x00 x11)
+
+-- | Get the blend mode used for drawing operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderDrawBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderDrawBlendMode@.
+--                   The safe flavor is 'getRenderDrawBlendModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderDrawBlendMode@, defined at @SDL3\/SDL_render.h 2090:34@
+getRenderDrawBlendMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO Bool
+getRenderDrawBlendMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetRenderDrawBlendMode x00 x11)
+
+-- | Get the blend mode used for drawing operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderDrawBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderDrawBlendMode@.
+--                   The unsafe flavor is 'getRenderDrawBlendMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderDrawBlendMode@, defined at @SDL3\/SDL_render.h 2090:34@
+getRenderDrawBlendModeSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO Bool
+getRenderDrawBlendModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetRenderDrawBlendMode x00 x11)
+
+-- | Clear the current rendering target with the drawing color.
+--
+--     This function clears the entire rendering target, ignoring the viewport and the clip rectangle. Note, that clearing will also set\/fill all pixels of the rendering target to current renderer draw color, so make sure to invoke @'setRenderDrawColor'@ when needed.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderDrawColor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderClear@.
+--                   The safe flavor is 'renderClearSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderClear@, defined at @SDL3\/SDL_render.h 2110:34@
+renderClear
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO Bool
+renderClear =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_RenderClear x00)
+
+-- | Clear the current rendering target with the drawing color.
+--
+--     This function clears the entire rendering target, ignoring the viewport and the clip rectangle. Note, that clearing will also set\/fill all pixels of the rendering target to current renderer draw color, so make sure to invoke @'setRenderDrawColor'@ when needed.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderDrawColor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderClear@.
+--                   The unsafe flavor is 'renderClear'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderClear@, defined at @SDL3\/SDL_render.h 2110:34@
+renderClearSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO Bool
+renderClearSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_RenderClear x00)
+
+-- | Draw a point on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderPoints'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderPoint@.
+--                   The safe flavor is 'renderPointSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderPoint@, defined at @SDL3\/SDL_render.h 2127:34@
+renderPoint
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a point.
+  -> Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the point.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the point.
+  -> IO Bool
+renderPoint =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_RenderPoint x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Draw a point on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderPoints'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderPoint@.
+--                   The unsafe flavor is 'renderPoint'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderPoint@, defined at @SDL3\/SDL_render.h 2127:34@
+renderPointSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a point.
+  -> Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the point.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the point.
+  -> IO Bool
+renderPointSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_RenderPoint x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Draw multiple points on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderPoint'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderPoints@.
+--                   The safe flavor is 'renderPointsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderPoints@, defined at @SDL3\/SDL_render.h 2144:34@
+renderPoints
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple points.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: the points to draw.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of points to draw.
+  -> IO Bool
+renderPoints =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_RenderPoints x00 x11 (Coerce.coerce x22))
+
+-- | Draw multiple points on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderPoint'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderPoints@.
+--                   The unsafe flavor is 'renderPoints'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderPoints@, defined at @SDL3\/SDL_render.h 2144:34@
+renderPointsSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple points.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: the points to draw.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of points to draw.
+  -> IO Bool
+renderPointsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_RenderPoints x00 x11 (Coerce.coerce x22))
+
+-- | Draw a line on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderLines'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderLine@.
+--                   The safe flavor is 'renderLineSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderLine@, defined at @SDL3\/SDL_render.h 2163:34@
+renderLine
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a line.
+  -> Float
+  -- ^
+  --
+  --           [@x1@]: the x coordinate of the start point.
+  -> Float
+  -- ^
+  --
+  --           [@y1@]: the y coordinate of the start point.
+  -> Float
+  -- ^
+  --
+  --           [@x2@]: the x coordinate of the end point.
+  -> Float
+  -- ^
+  --
+  --           [@y2@]: the y coordinate of the end point.
+  -> IO Bool
+renderLine =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              ( Unsafe.sDL_RenderLine
+                  x00
+                  (Coerce.coerce x11)
+                  (Coerce.coerce x22)
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+              )
+
+-- | Draw a line on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderLines'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderLine@.
+--                   The unsafe flavor is 'renderLine'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderLine@, defined at @SDL3\/SDL_render.h 2163:34@
+renderLineSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a line.
+  -> Float
+  -- ^
+  --
+  --           [@x1@]: the x coordinate of the start point.
+  -> Float
+  -- ^
+  --
+  --           [@y1@]: the y coordinate of the start point.
+  -> Float
+  -- ^
+  --
+  --           [@x2@]: the x coordinate of the end point.
+  -> Float
+  -- ^
+  --
+  --           [@y2@]: the y coordinate of the end point.
+  -> IO Bool
+renderLineSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              ( Safe.sDL_RenderLine
+                  x00
+                  (Coerce.coerce x11)
+                  (Coerce.coerce x22)
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+              )
+
+-- | Draw a series of connected lines on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderLine'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderLines@.
+--                   The safe flavor is 'renderLinesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderLines@, defined at @SDL3\/SDL_render.h 2181:34@
+renderLines
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple lines.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: the points along the lines.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of points, drawing count-1 lines.
+  -> IO Bool
+renderLines =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_RenderLines x00 x11 (Coerce.coerce x22))
+
+-- | Draw a series of connected lines on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderLine'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderLines@.
+--                   The unsafe flavor is 'renderLines'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderLines@, defined at @SDL3\/SDL_render.h 2181:34@
+renderLinesSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple lines.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@points@]: the points along the lines.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of points, drawing count-1 lines.
+  -> IO Bool
+renderLinesSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_RenderLines x00 x11 (Coerce.coerce x22))
+
+-- | Draw a rectangle on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderRects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderRect@.
+--                   The safe flavor is 'renderRectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderRect@, defined at @SDL3\/SDL_render.h 2198:34@
+renderRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a rectangle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the destination rectangle, or NULL to outline the entire rendering target.
+  -> IO Bool
+renderRect =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_RenderRect x00 x11)
+
+-- | Draw a rectangle on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderRects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderRect@.
+--                   The unsafe flavor is 'renderRect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderRect@, defined at @SDL3\/SDL_render.h 2198:34@
+renderRectSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a rectangle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the destination rectangle, or NULL to outline the entire rendering target.
+  -> IO Bool
+renderRectSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_RenderRect x00 x11)
+
+-- | Draw some number of rectangles on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderRects@.
+--                   The safe flavor is 'renderRectsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderRects@, defined at @SDL3\/SDL_render.h 2216:34@
+renderRects
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple rectangles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rects@]: a pointer to an array of destination rectangles.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of rectangles.
+  -> IO Bool
+renderRects =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_RenderRects x00 x11 (Coerce.coerce x22))
+
+-- | Draw some number of rectangles on the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderRects@.
+--                   The unsafe flavor is 'renderRects'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderRects@, defined at @SDL3\/SDL_render.h 2216:34@
+renderRectsSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw multiple rectangles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rects@]: a pointer to an array of destination rectangles.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of rectangles.
+  -> IO Bool
+renderRectsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_RenderRects x00 x11 (Coerce.coerce x22))
+
+-- | Fill a rectangle on the current rendering target with the drawing color at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderFillRects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderFillRect@.
+--                   The safe flavor is 'renderFillRectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderFillRect@, defined at @SDL3\/SDL_render.h 2234:34@
+renderFillRect
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should fill a rectangle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO Bool
+renderFillRect =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_RenderFillRect x00 x11)
+
+-- | Fill a rectangle on the current rendering target with the drawing color at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderFillRects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderFillRect@.
+--                   The unsafe flavor is 'renderFillRect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderFillRect@, defined at @SDL3\/SDL_render.h 2234:34@
+renderFillRectSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should fill a rectangle.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO Bool
+renderFillRectSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_RenderFillRect x00 x11)
+
+-- | Fill some number of rectangles on the current rendering target with the drawing color at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderFillRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderFillRects@.
+--                   The safe flavor is 'renderFillRectsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderFillRects@, defined at @SDL3\/SDL_render.h 2252:34@
+renderFillRects
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should fill multiple rectangles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rects@]: a pointer to an array of destination rectangles.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of rectangles.
+  -> IO Bool
+renderFillRects =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_RenderFillRects x00 x11 (Coerce.coerce x22))
+
+-- | Fill some number of rectangles on the current rendering target with the drawing color at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderFillRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderFillRects@.
+--                   The unsafe flavor is 'renderFillRects'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderFillRects@, defined at @SDL3\/SDL_render.h 2252:34@
+renderFillRectsSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should fill multiple rectangles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@rects@]: a pointer to an array of destination rectangles.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of rectangles.
+  -> IO Bool
+renderFillRectsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_RenderFillRects x00 x11 (Coerce.coerce x22))
+
+-- | Copy a portion of the texture to the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderTextureRotated', 'renderTextureTiled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderTexture@.
+--                   The safe flavor is 'renderTextureSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTexture@, defined at @SDL3\/SDL_render.h 2274:34@
+renderTexture
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO Bool
+renderTexture =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_RenderTexture x00 x11 x22 x33)
+
+-- | Copy a portion of the texture to the current rendering target at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderTextureRotated', 'renderTextureTiled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderTexture@.
+--                   The unsafe flavor is 'renderTexture'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTexture@, defined at @SDL3\/SDL_render.h 2274:34@
+renderTextureSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO Bool
+renderTextureSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_RenderTexture x00 x11 x22 x33)
+
+-- | Copy a portion of the source texture to the current rendering target, with rotation and flipping, at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderTextureRotated@.
+--                   The safe flavor is 'renderTextureRotatedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTextureRotated@, defined at @SDL3\/SDL_render.h 2302:34@
+renderTextureRotated
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> Double
+  -- ^
+  --
+  --           [@angle@]: an angle in degrees that indicates the rotation that will be applied to dstrect, rotating it in a clockwise direction.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@center@]: a pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done around dstrect.w\/2, dstrect.h\/2).
+  -> SDL3.Sys.Bindgen.Surface.SDL_FlipMode
+  -- ^
+  --
+  --           [@flip@]: an SDL_FlipMode value stating which flipping actions should be performed on the texture.
+  -> IO Bool
+renderTextureRotated =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap CBool.toBool (Unsafe.sDL_RenderTextureRotated x00 x11 x22 x33 (Coerce.coerce x44) x55 x66)
+
+-- | Copy a portion of the source texture to the current rendering target, with rotation and flipping, at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderTextureRotated@.
+--                   The unsafe flavor is 'renderTextureRotated'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTextureRotated@, defined at @SDL3\/SDL_render.h 2302:34@
+renderTextureRotatedSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> Double
+  -- ^
+  --
+  --           [@angle@]: an angle in degrees that indicates the rotation that will be applied to dstrect, rotating it in a clockwise direction.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@center@]: a pointer to a point indicating the point around which dstrect will be rotated (if NULL, rotation will be done around dstrect.w\/2, dstrect.h\/2).
+  -> SDL3.Sys.Bindgen.Surface.SDL_FlipMode
+  -- ^
+  --
+  --           [@flip@]: an SDL_FlipMode value stating which flipping actions should be performed on the texture.
+  -> IO Bool
+renderTextureRotatedSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap CBool.toBool (Safe.sDL_RenderTextureRotated x00 x11 x22 x33 (Coerce.coerce x44) x55 x66)
+
+-- | Copy a portion of the source texture to the current rendering target, with affine transform, at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: You may only call this function from the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderTextureAffine@.
+--                   The safe flavor is 'renderTextureAffineSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTextureAffine@, defined at @SDL3\/SDL_render.h 2333:34@
+renderTextureAffine
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@origin@]: a pointer to a point indicating where the top-left corner of srcrect should be mapped to, or NULL for the rendering target\'s origin.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@right@]: a pointer to a point indicating where the top-right corner of srcrect should be mapped to, or NULL for the rendering target\'s top-right corner.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@down@]: a pointer to a point indicating where the bottom-left corner of srcrect should be mapped to, or NULL for the rendering target\'s bottom-left corner.
+  -> IO Bool
+renderTextureAffine =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Unsafe.sDL_RenderTextureAffine x00 x11 x22 x33 x44 x55)
+
+-- | Copy a portion of the source texture to the current rendering target, with affine transform, at subpixel precision.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: You may only call this function from the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderTextureAffine@.
+--                   The unsafe flavor is 'renderTextureAffine'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTextureAffine@, defined at @SDL3\/SDL_render.h 2333:34@
+renderTextureAffineSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@origin@]: a pointer to a point indicating where the top-left corner of srcrect should be mapped to, or NULL for the rendering target\'s origin.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@right@]: a pointer to a point indicating where the top-right corner of srcrect should be mapped to, or NULL for the rendering target\'s top-right corner.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FPoint
+  -- ^
+  --
+  --           [@down@]: a pointer to a point indicating where the bottom-left corner of srcrect should be mapped to, or NULL for the rendering target\'s bottom-left corner.
+  -> IO Bool
+renderTextureAffineSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Safe.sDL_RenderTextureAffine x00 x11 x22 x33 x44 x55)
+
+-- | Tile a portion of the texture to the current rendering target at subpixel precision.
+--
+--     The pixels in @srcrect@ will be repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderTextureTiled@.
+--                   The safe flavor is 'renderTextureTiledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTextureTiled@, defined at @SDL3\/SDL_render.h 2362:34@
+renderTextureTiled
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform srcrect into the destination rectangle, e.g. a 32x32 texture with a scale of 2 would fill 64x64 tiles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO Bool
+renderTextureTiled =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_RenderTextureTiled x00 x11 x22 (Coerce.coerce x33) x44)
+
+-- | Tile a portion of the texture to the current rendering target at subpixel precision.
+--
+--     The pixels in @srcrect@ will be repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderTexture'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderTextureTiled@.
+--                   The unsafe flavor is 'renderTextureTiled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTextureTiled@, defined at @SDL3\/SDL_render.h 2362:34@
+renderTextureTiledSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: a pointer to the source rectangle, or NULL for the entire texture.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform srcrect into the destination rectangle, e.g. a 32x32 texture with a scale of 2 would fill 64x64 tiles.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO Bool
+renderTextureTiledSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_RenderTextureTiled x00 x11 x22 (Coerce.coerce x33) x44)
+
+-- | Perform a scaled copy using the 9-grid algorithm to the current rendering target at subpixel precision.
+--
+--     The pixels in the texture are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then stretched into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderTexture', 'renderTexture9GridTiled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderTexture9Grid@.
+--                   The safe flavor is 'renderTexture9GridSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTexture9Grid@, defined at @SDL3\/SDL_render.h 2397:34@
+renderTexture9Grid
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire texture.
+  -> Float
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled copy.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO Bool
+renderTexture9Grid =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    fmap
+                      CBool.toBool
+                      ( Unsafe.sDL_RenderTexture9Grid
+                          x00
+                          x11
+                          x22
+                          (Coerce.coerce x33)
+                          (Coerce.coerce x44)
+                          (Coerce.coerce x55)
+                          (Coerce.coerce x66)
+                          (Coerce.coerce x77)
+                          x88
+                      )
+
+-- | Perform a scaled copy using the 9-grid algorithm to the current rendering target at subpixel precision.
+--
+--     The pixels in the texture are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then stretched into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderTexture', 'renderTexture9GridTiled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderTexture9Grid@.
+--                   The unsafe flavor is 'renderTexture9Grid'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTexture9Grid@, defined at @SDL3\/SDL_render.h 2397:34@
+renderTexture9GridSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire texture.
+  -> Float
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled copy.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> IO Bool
+renderTexture9GridSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    fmap
+                      CBool.toBool
+                      ( Safe.sDL_RenderTexture9Grid
+                          x00
+                          x11
+                          x22
+                          (Coerce.coerce x33)
+                          (Coerce.coerce x44)
+                          (Coerce.coerce x55)
+                          (Coerce.coerce x66)
+                          (Coerce.coerce x77)
+                          x88
+                      )
+
+-- | Perform a scaled copy using the 9-grid algorithm to the current rendering target at subpixel precision.
+--
+--     The pixels in the texture are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then tiled into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'renderTexture', 'renderTexture9Grid'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderTexture9GridTiled@.
+--                   The safe flavor is 'renderTexture9GridTiledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTexture9GridTiled@, defined at @SDL3\/SDL_render.h 2435:34@
+renderTexture9GridTiled
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire texture.
+  -> Float
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled copy.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> Float
+  -- ^
+  --
+  --           [@tileScale@]: the scale used to transform the borders and center of @srcrect@ into the borders and middle of @dstrect@, or 1.0f for an unscaled copy.
+  -> IO Bool
+renderTexture9GridTiled =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    \x99 ->
+                      fmap
+                        CBool.toBool
+                        ( Unsafe.sDL_RenderTexture9GridTiled
+                            x00
+                            x11
+                            x22
+                            (Coerce.coerce x33)
+                            (Coerce.coerce x44)
+                            (Coerce.coerce x55)
+                            (Coerce.coerce x66)
+                            (Coerce.coerce x77)
+                            x88
+                            (Coerce.coerce x99)
+                        )
+
+-- | Perform a scaled copy using the 9-grid algorithm to the current rendering target at subpixel precision.
+--
+--     The pixels in the texture are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then tiled into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'renderTexture', 'renderTexture9Grid'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderTexture9GridTiled@.
+--                   The unsafe flavor is 'renderTexture9GridTiled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderTexture9GridTiled@, defined at @SDL3\/SDL_render.h 2435:34@
+renderTexture9GridTiledSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should copy parts of a texture.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the source texture.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire texture.
+  -> Float
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled copy.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_FRect
+  -- ^
+  --
+  --           [@dstrect@]: a pointer to the destination rectangle, or NULL for the entire rendering target.
+  -> Float
+  -- ^
+  --
+  --           [@tileScale@]: the scale used to transform the borders and center of @srcrect@ into the borders and middle of @dstrect@, or 1.0f for an unscaled copy.
+  -> IO Bool
+renderTexture9GridTiledSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    \x99 ->
+                      fmap
+                        CBool.toBool
+                        ( Safe.sDL_RenderTexture9GridTiled
+                            x00
+                            x11
+                            x22
+                            (Coerce.coerce x33)
+                            (Coerce.coerce x44)
+                            (Coerce.coerce x55)
+                            (Coerce.coerce x66)
+                            (Coerce.coerce x77)
+                            x88
+                            (Coerce.coerce x99)
+                        )
+
+-- | Render a list of triangles, optionally using a texture and indices into the vertex array Color and alpha modulation is done per vertex (SDL_SetTextureColorMod and 'setTextureAlphaMod' are ignored).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderGeometryRaw', 'setRenderTextureAddressMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderGeometry@.
+--                   The safe flavor is 'renderGeometrySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderGeometry@, defined at @SDL3\/SDL_render.h 2460:34@
+renderGeometry
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: (optional) The SDL texture to use.
+  -> PtrConst.PtrConst SDL_Vertex
+  -- ^
+  --
+  --           [@vertices@]: vertices.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_vertices@]: number of vertices.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@indices@]: (optional) An array of integer indices into the \'vertices\' array, if NULL all vertices will be rendered in sequential order.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_indices@]: number of indices.
+  -> IO Bool
+renderGeometry =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap
+                CBool.toBool
+                (Unsafe.sDL_RenderGeometry x00 x11 x22 (Coerce.coerce x33) x44 (Coerce.coerce x55))
+
+-- | Render a list of triangles, optionally using a texture and indices into the vertex array Color and alpha modulation is done per vertex (SDL_SetTextureColorMod and 'setTextureAlphaMod' are ignored).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderGeometryRaw', 'setRenderTextureAddressMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderGeometry@.
+--                   The unsafe flavor is 'renderGeometry'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderGeometry@, defined at @SDL3\/SDL_render.h 2460:34@
+renderGeometrySafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: (optional) The SDL texture to use.
+  -> PtrConst.PtrConst SDL_Vertex
+  -- ^
+  --
+  --           [@vertices@]: vertices.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_vertices@]: number of vertices.
+  -> PtrConst.PtrConst BG.CInt
+  -- ^
+  --
+  --           [@indices@]: (optional) An array of integer indices into the \'vertices\' array, if NULL all vertices will be rendered in sequential order.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_indices@]: number of indices.
+  -> IO Bool
+renderGeometrySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Safe.sDL_RenderGeometry x00 x11 x22 (Coerce.coerce x33) x44 (Coerce.coerce x55))
+
+-- | Render a list of triangles, optionally using a texture and indices into the vertex arrays Color and alpha modulation is done per vertex (SDL_SetTextureColorMod and 'setTextureAlphaMod' are ignored).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderGeometry', 'setRenderTextureAddressMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderGeometryRaw@.
+--                   The safe flavor is 'renderGeometryRawSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderGeometryRaw@, defined at @SDL3\/SDL_render.h 2493:34@
+renderGeometryRaw
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: (optional) The SDL texture to use.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@xy@]: vertex positions.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@xy_stride@]: byte size to move from one element to the next element.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^
+  --
+  --           [@color@]: vertex colors (as SDL_FColor).
+  -> BG.Int32
+  -- ^
+  --
+  --           [@color_stride@]: byte size to move from one element to the next element.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@uv@]: vertex normalized texture coordinates.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@uv_stride@]: byte size to move from one element to the next element.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_vertices@]: number of vertices.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@indices@]: (optional) An array of indices into the \'vertices\' arrays, if NULL all vertices will be rendered in sequential order.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_indices@]: number of indices.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@size_indices@]: index size: 1 (byte), 2 (short), 4 (int).
+  -> IO Bool
+renderGeometryRaw =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    \x99 ->
+                      \x1010 ->
+                        \x1111 ->
+                          fmap
+                            CBool.toBool
+                            ( Unsafe.sDL_RenderGeometryRaw
+                                x00
+                                x11
+                                x22
+                                (Coerce.coerce x33)
+                                x44
+                                (Coerce.coerce x55)
+                                x66
+                                (Coerce.coerce x77)
+                                (Coerce.coerce x88)
+                                x99
+                                (Coerce.coerce x1010)
+                                (Coerce.coerce x1111)
+                            )
+
+-- | Render a list of triangles, optionally using a texture and indices into the vertex arrays Color and alpha modulation is done per vertex (SDL_SetTextureColorMod and 'setTextureAlphaMod' are ignored).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'renderGeometry', 'setRenderTextureAddressMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderGeometryRaw@.
+--                   The unsafe flavor is 'renderGeometryRaw'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderGeometryRaw@, defined at @SDL3\/SDL_render.h 2493:34@
+renderGeometryRawSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: (optional) The SDL texture to use.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@xy@]: vertex positions.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@xy_stride@]: byte size to move from one element to the next element.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Pixels.SDL_FColor
+  -- ^
+  --
+  --           [@color@]: vertex colors (as SDL_FColor).
+  -> BG.Int32
+  -- ^
+  --
+  --           [@color_stride@]: byte size to move from one element to the next element.
+  -> PtrConst.PtrConst BG.CFloat
+  -- ^
+  --
+  --           [@uv@]: vertex normalized texture coordinates.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@uv_stride@]: byte size to move from one element to the next element.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_vertices@]: number of vertices.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@indices@]: (optional) An array of indices into the \'vertices\' arrays, if NULL all vertices will be rendered in sequential order.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_indices@]: number of indices.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@size_indices@]: index size: 1 (byte), 2 (short), 4 (int).
+  -> IO Bool
+renderGeometryRawSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    \x99 ->
+                      \x1010 ->
+                        \x1111 ->
+                          fmap
+                            CBool.toBool
+                            ( Safe.sDL_RenderGeometryRaw
+                                x00
+                                x11
+                                x22
+                                (Coerce.coerce x33)
+                                x44
+                                (Coerce.coerce x55)
+                                x66
+                                (Coerce.coerce x77)
+                                (Coerce.coerce x88)
+                                x99
+                                (Coerce.coerce x1010)
+                                (Coerce.coerce x1111)
+                            )
+
+-- | Set the texture addressing mode used in @'renderGeometry'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'renderGeometry', 'renderGeometryRaw', 'getRenderTextureAddressMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderTextureAddressMode@.
+--                   The safe flavor is 'setRenderTextureAddressModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderTextureAddressMode@, defined at @SDL3\/SDL_render.h 2520:34@
+setRenderTextureAddressMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@u_mode@]: the 'SDL_TextureAddressMode' to use for horizontal texture coordinates in @'renderGeometry'@.
+  -> SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@v_mode@]: the 'SDL_TextureAddressMode' to use for vertical texture coordinates in @'renderGeometry'@.
+  -> IO Bool
+setRenderTextureAddressMode =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetRenderTextureAddressMode x00 x11 x22)
+
+-- | Set the texture addressing mode used in @'renderGeometry'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'renderGeometry', 'renderGeometryRaw', 'getRenderTextureAddressMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderTextureAddressMode@.
+--                   The unsafe flavor is 'setRenderTextureAddressMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderTextureAddressMode@, defined at @SDL3\/SDL_render.h 2520:34@
+setRenderTextureAddressModeSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@u_mode@]: the 'SDL_TextureAddressMode' to use for horizontal texture coordinates in @'renderGeometry'@.
+  -> SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@v_mode@]: the 'SDL_TextureAddressMode' to use for vertical texture coordinates in @'renderGeometry'@.
+  -> IO Bool
+setRenderTextureAddressModeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetRenderTextureAddressMode x00 x11 x22)
+
+-- | Get the texture addressing mode used in @'renderGeometry'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'setRenderTextureAddressMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderTextureAddressMode@.
+--                   The safe flavor is 'getRenderTextureAddressModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderTextureAddressMode@, defined at @SDL3\/SDL_render.h 2541:34@
+getRenderTextureAddressMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@u_mode@]: a pointer filled in with the 'SDL_TextureAddressMode' to use for horizontal texture coordinates in @'renderGeometry'@, may be NULL.
+  -> BG.Ptr SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@v_mode@]: a pointer filled in with the 'SDL_TextureAddressMode' to use for vertical texture coordinates in @'renderGeometry'@, may be NULL.
+  -> IO Bool
+getRenderTextureAddressMode =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetRenderTextureAddressMode x00 x11 x22)
+
+-- | Get the texture addressing mode used in @'renderGeometry'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'setRenderTextureAddressMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderTextureAddressMode@.
+--                   The unsafe flavor is 'getRenderTextureAddressMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderTextureAddressMode@, defined at @SDL3\/SDL_render.h 2541:34@
+getRenderTextureAddressModeSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Ptr SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@u_mode@]: a pointer filled in with the 'SDL_TextureAddressMode' to use for horizontal texture coordinates in @'renderGeometry'@, may be NULL.
+  -> BG.Ptr SDL_TextureAddressMode
+  -- ^
+  --
+  --           [@v_mode@]: a pointer filled in with the 'SDL_TextureAddressMode' to use for vertical texture coordinates in @'renderGeometry'@, may be NULL.
+  -> IO Bool
+getRenderTextureAddressModeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetRenderTextureAddressMode x00 x11 x22)
+
+-- | Read pixels from the current rendering target.
+--
+--     The returned surface contains pixels inside the desired area clipped to the current viewport, and should be freed with 'SDL3.Sys.Surface.destroySurface'.
+--
+--     Note that this returns the actual pixels on the screen, so if you are using logical presentation you should use @'getRenderLogicalPresentationRect'@ to get the area containing your content.
+--
+--     __WARNING__: This is a very slow operation, and should not be used frequently. If you\'re using this on the main rendering target, it should be called after rendering and before @'renderPresent'@.
+--
+--     [Returns]: a new SDL_Surface on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderReadPixels@.
+--                   The safe flavor is 'renderReadPixelsSafe'
+--                   : full GPU sync plus readback; a very slow operation.
+--
+--     [C declaration]: @SDL_RenderReadPixels@, defined at @SDL3\/SDL_render.h 2568:43@
+renderReadPixels
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to read, which will be clipped to the current viewport, or NULL for the entire viewport.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+renderReadPixels = Unsafe.sDL_RenderReadPixels
+
+-- | Read pixels from the current rendering target.
+--
+--     The returned surface contains pixels inside the desired area clipped to the current viewport, and should be freed with 'SDL3.Sys.Surface.destroySurface'.
+--
+--     Note that this returns the actual pixels on the screen, so if you are using logical presentation you should use @'getRenderLogicalPresentationRect'@ to get the area containing your content.
+--
+--     __WARNING__: This is a very slow operation, and should not be used frequently. If you\'re using this on the main rendering target, it should be called after rendering and before @'renderPresent'@.
+--
+--     [Returns]: a new SDL_Surface on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderReadPixels@.
+--                   The unsafe flavor is 'renderReadPixels'
+--                   : full GPU sync plus readback; a very slow operation.
+--
+--     [C declaration]: @SDL_RenderReadPixels@, defined at @SDL3\/SDL_render.h 2568:43@
+renderReadPixelsSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure representing the area to read, which will be clipped to the current viewport, or NULL for the entire viewport.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+renderReadPixelsSafe = Safe.sDL_RenderReadPixels
+
+-- | Update the screen with any rendering performed since the previous call.
+--
+--     SDL\'s rendering functions operate on a backbuffer; that is, calling a rendering function such as @'renderLine'@ does not directly put a line on the screen, but rather updates the backbuffer. As such, you compose your entire scene and /present/ the composed backbuffer to the screen as a complete picture.
+--
+--     Therefore, when using SDL\'s rendering API, one does all drawing intended for the frame, and then calls this function once per frame to present the final drawing to the user.
+--
+--     The backbuffer should be considered invalidated after each present; do not assume that previous contents will exist between frames. You are strongly encouraged to call @'renderClear'@ to initialize the backbuffer before starting each new frame\'s drawing, even if you plan to overwrite every pixel.
+--
+--     Please note, that in case of rendering to a texture - there is __no need__ to call @'renderPresent'@ after drawing needed objects to a texture, and should not be done; you are only required to change back the rendering target to default via @SDL_SetRenderTarget(renderer, NULL)@ afterwards, as textures by themselves do not have a concept of backbuffers. Calling 'renderPresent' while rendering to a texture will fail.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRenderer', 'renderClear', 'renderFillRect', 'renderFillRects', 'renderLine', 'renderLines', 'renderPoint', 'renderPoints', 'renderRect', 'renderRects', 'setRenderDrawBlendMode', 'setRenderDrawColor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderPresent@.
+--                   The safe flavor is 'renderPresentSafe'
+--                   : can block on vsync.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderPresent@, defined at @SDL3\/SDL_render.h 2617:34@
+renderPresent
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO Bool
+renderPresent =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_RenderPresent x00)
+
+-- | Update the screen with any rendering performed since the previous call.
+--
+--     SDL\'s rendering functions operate on a backbuffer; that is, calling a rendering function such as @'renderLine'@ does not directly put a line on the screen, but rather updates the backbuffer. As such, you compose your entire scene and /present/ the composed backbuffer to the screen as a complete picture.
+--
+--     Therefore, when using SDL\'s rendering API, one does all drawing intended for the frame, and then calls this function once per frame to present the final drawing to the user.
+--
+--     The backbuffer should be considered invalidated after each present; do not assume that previous contents will exist between frames. You are strongly encouraged to call @'renderClear'@ to initialize the backbuffer before starting each new frame\'s drawing, even if you plan to overwrite every pixel.
+--
+--     Please note, that in case of rendering to a texture - there is __no need__ to call @'renderPresent'@ after drawing needed objects to a texture, and should not be done; you are only required to change back the rendering target to default via @SDL_SetRenderTarget(renderer, NULL)@ afterwards, as textures by themselves do not have a concept of backbuffers. Calling 'renderPresent' while rendering to a texture will fail.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRenderer', 'renderClear', 'renderFillRect', 'renderFillRects', 'renderLine', 'renderLines', 'renderPoint', 'renderPoints', 'renderRect', 'renderRects', 'setRenderDrawBlendMode', 'setRenderDrawColor'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderPresent@.
+--                   The unsafe flavor is 'renderPresent'
+--                   : can block on vsync.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderPresent@, defined at @SDL3\/SDL_render.h 2617:34@
+renderPresentSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO Bool
+renderPresentSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_RenderPresent x00)
+
+-- | Destroy the specified texture.
+--
+--     Passing NULL or an otherwise invalid texture will set the SDL error message to \"Invalid texture\".
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTexture', 'createTextureFromSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyTexture@.
+--                   The safe flavor is 'destroyTextureSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyTexture@, defined at @SDL3\/SDL_render.h 2634:34@
+destroyTexture
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to destroy.
+  -> IO ()
+destroyTexture = Unsafe.sDL_DestroyTexture
+
+-- | Destroy the specified texture.
+--
+--     Passing NULL or an otherwise invalid texture will set the SDL error message to \"Invalid texture\".
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTexture', 'createTextureFromSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyTexture@.
+--                   The unsafe flavor is 'destroyTexture'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyTexture@, defined at @SDL3\/SDL_render.h 2634:34@
+destroyTextureSafe
+  :: BG.Ptr SDL_Texture
+  -- ^
+  --
+  --           [@texture@]: the texture to destroy.
+  -> IO ()
+destroyTextureSafe = Safe.sDL_DestroyTexture
+
+-- | Destroy the rendering context for a window and free all associated textures.
+--
+--     This should be called before destroying the associated window.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRenderer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyRenderer@.
+--                   The safe flavor is 'destroyRendererSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyRenderer@, defined at @SDL3\/SDL_render.h 2650:34@
+destroyRenderer
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO ()
+destroyRenderer = Unsafe.sDL_DestroyRenderer
+
+-- | Destroy the rendering context for a window and free all associated textures.
+--
+--     This should be called before destroying the associated window.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createRenderer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyRenderer@.
+--                   The unsafe flavor is 'destroyRenderer'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyRenderer@, defined at @SDL3\/SDL_render.h 2650:34@
+destroyRendererSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO ()
+destroyRendererSafe = Safe.sDL_DestroyRenderer
+
+-- | Force the rendering context to flush any pending commands and state.
+--
+--     You do not need to (and in fact, shouldn\'t) call this function unless you are planning to call into OpenGL\/Direct3D\/Metal\/whatever directly, in addition to using an 'SDL_Renderer'.
+--
+--     This is for a very-specific case: if you are using SDL\'s render API, and you plan to make OpenGL\/D3D\/whatever calls in addition to SDL render API calls. If this applies, you should call this function between calls to SDL\'s render API and the low-level API you\'re using in cooperation.
+--
+--     In all other cases, you can ignore this function.
+--
+--     This call makes SDL flush any pending rendering work it was queueing up to do later in a single batch, and marks any internal cached state as invalid, so it\'ll prepare all its state again later, from scratch.
+--
+--     This means you do not need to save state in your rendering code to protect the SDL renderer. However, there lots of arbitrary pieces of Direct3D and OpenGL state that can confuse things; you should use your best judgment and be prepared to make changes if specific state needs to be protected.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_FlushRenderer@.
+--                   The safe flavor is 'flushRendererSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlushRenderer@, defined at @SDL3\/SDL_render.h 2683:34@
+flushRenderer
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO Bool
+flushRenderer =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_FlushRenderer x00)
+
+-- | Force the rendering context to flush any pending commands and state.
+--
+--     You do not need to (and in fact, shouldn\'t) call this function unless you are planning to call into OpenGL\/Direct3D\/Metal\/whatever directly, in addition to using an 'SDL_Renderer'.
+--
+--     This is for a very-specific case: if you are using SDL\'s render API, and you plan to make OpenGL\/D3D\/whatever calls in addition to SDL render API calls. If this applies, you should call this function between calls to SDL\'s render API and the low-level API you\'re using in cooperation.
+--
+--     In all other cases, you can ignore this function.
+--
+--     This call makes SDL flush any pending rendering work it was queueing up to do later in a single batch, and marks any internal cached state as invalid, so it\'ll prepare all its state again later, from scratch.
+--
+--     This means you do not need to save state in your rendering code to protect the SDL renderer. However, there lots of arbitrary pieces of Direct3D and OpenGL state that can confuse things; you should use your best judgment and be prepared to make changes if specific state needs to be protected.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_FlushRenderer@.
+--                   The unsafe flavor is 'flushRenderer'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlushRenderer@, defined at @SDL3\/SDL_render.h 2683:34@
+flushRendererSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> IO Bool
+flushRendererSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_FlushRenderer x00)
+
+-- | Get the CAMetalLayer associated with the given Metal renderer.
+--
+--     This function returns @void *@, so SDL doesn\'t have to include Metal\'s headers, but it can be safely cast to a @CAMetalLayer *@.
+--
+--     [Returns]: a @CAMetalLayer *@ on success, or NULL if the renderer isn\'t a Metal renderer.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderMetalCommandEncoder'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderMetalLayer@.
+--                   The safe flavor is 'getRenderMetalLayerSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRenderMetalLayer@, defined at @SDL3\/SDL_render.h 2701:36@
+getRenderMetalLayer
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr BG.Void)
+getRenderMetalLayer = Unsafe.sDL_GetRenderMetalLayer
+
+-- | Get the CAMetalLayer associated with the given Metal renderer.
+--
+--     This function returns @void *@, so SDL doesn\'t have to include Metal\'s headers, but it can be safely cast to a @CAMetalLayer *@.
+--
+--     [Returns]: a @CAMetalLayer *@ on success, or NULL if the renderer isn\'t a Metal renderer.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderMetalCommandEncoder'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderMetalLayer@.
+--                   The unsafe flavor is 'getRenderMetalLayer'
+--                   .
+--
+--     [C declaration]: @SDL_GetRenderMetalLayer@, defined at @SDL3\/SDL_render.h 2701:36@
+getRenderMetalLayerSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr BG.Void)
+getRenderMetalLayerSafe =
+  Safe.sDL_GetRenderMetalLayer
+
+-- | Get the Metal command encoder for the current frame.
+--
+--     This function returns @void *@, so SDL doesn\'t have to include Metal\'s headers, but it can be safely cast to an @id\<MTLRenderCommandEncoder>@.
+--
+--     This will return NULL if Metal refuses to give SDL a drawable to render to, which might happen if the window is hidden\/minimized\/offscreen. This doesn\'t apply to command encoders for render targets, just the window\'s backbuffer. Check your return values!
+--
+--     [Returns]: an @id\<MTLRenderCommandEncoder>@ on success, or NULL if the renderer isn\'t a Metal renderer or there was an error.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderMetalLayer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderMetalCommandEncoder@.
+--                   The safe flavor is 'getRenderMetalCommandEncoderSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetRenderMetalCommandEncoder@, defined at @SDL3\/SDL_render.h 2724:36@
+getRenderMetalCommandEncoder
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr BG.Void)
+getRenderMetalCommandEncoder =
+  Unsafe.sDL_GetRenderMetalCommandEncoder
+
+-- | Get the Metal command encoder for the current frame.
+--
+--     This function returns @void *@, so SDL doesn\'t have to include Metal\'s headers, but it can be safely cast to an @id\<MTLRenderCommandEncoder>@.
+--
+--     This will return NULL if Metal refuses to give SDL a drawable to render to, which might happen if the window is hidden\/minimized\/offscreen. This doesn\'t apply to command encoders for render targets, just the window\'s backbuffer. Check your return values!
+--
+--     [Returns]: an @id\<MTLRenderCommandEncoder>@ on success, or NULL if the renderer isn\'t a Metal renderer or there was an error.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderMetalLayer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderMetalCommandEncoder@.
+--                   The unsafe flavor is 'getRenderMetalCommandEncoder'
+--                   .
+--
+--     [C declaration]: @SDL_GetRenderMetalCommandEncoder@, defined at @SDL3\/SDL_render.h 2724:36@
+getRenderMetalCommandEncoderSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to query.
+  -> IO (BG.Ptr BG.Void)
+getRenderMetalCommandEncoderSafe =
+  Safe.sDL_GetRenderMetalCommandEncoder
+
+-- | Add a set of synchronization semaphores for the current frame.
+--
+--     The Vulkan renderer will wait for @wait_semaphore@ before submitting rendering commands and signal @signal_semaphore@ after rendering commands are complete for this frame.
+--
+--     This should be called each frame that you want semaphore synchronization. The Vulkan renderer may have multiple frames in flight on the GPU, so you should have multiple semaphores that are used for synchronization. Querying SDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER will give you the maximum number of semaphores you\'ll need.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is __NOT__ safe to call this function from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AddVulkanRenderSemaphores@.
+--                   The safe flavor is 'addVulkanRenderSemaphoresSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddVulkanRenderSemaphores@, defined at @SDL3\/SDL_render.h 2755:34@
+addVulkanRenderSemaphores
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@wait_stage_mask@]: the VkPipelineStageFlags for the wait.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@wait_semaphore@]: a VkSempahore to wait on before rendering the current frame, or 0 if not needed.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@signal_semaphore@]: a VkSempahore that SDL will signal when rendering for the current frame is complete, or 0 if not needed.
+  -> IO Bool
+addVulkanRenderSemaphores =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_AddVulkanRenderSemaphores x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Add a set of synchronization semaphores for the current frame.
+--
+--     The Vulkan renderer will wait for @wait_semaphore@ before submitting rendering commands and signal @signal_semaphore@ after rendering commands are complete for this frame.
+--
+--     This should be called each frame that you want semaphore synchronization. The Vulkan renderer may have multiple frames in flight on the GPU, so you should have multiple semaphores that are used for synchronization. Querying SDL_PROP_RENDERER_VULKAN_SWAPCHAIN_IMAGE_COUNT_NUMBER will give you the maximum number of semaphores you\'ll need.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is __NOT__ safe to call this function from two threads at once.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddVulkanRenderSemaphores@.
+--                   The unsafe flavor is 'addVulkanRenderSemaphores'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddVulkanRenderSemaphores@, defined at @SDL3\/SDL_render.h 2755:34@
+addVulkanRenderSemaphoresSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the rendering context.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@wait_stage_mask@]: the VkPipelineStageFlags for the wait.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@wait_semaphore@]: a VkSempahore to wait on before rendering the current frame, or 0 if not needed.
+  -> BG.Int64
+  -- ^
+  --
+  --           [@signal_semaphore@]: a VkSempahore that SDL will signal when rendering for the current frame is complete, or 0 if not needed.
+  -> IO Bool
+addVulkanRenderSemaphoresSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_AddVulkanRenderSemaphores x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Toggle VSync of the given renderer.
+--
+--     When a renderer is created, vsync defaults to SDL_RENDERER_VSYNC_DISABLED.
+--
+--     The @vsync@ parameter can be 1 to synchronize present with every vertical refresh, 2 to synchronize present with every second vertical refresh, etc., SDL_RENDERER_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or SDL_RENDERER_VSYNC_DISABLED to disable. Not every value is supported by every driver, so you should check the return value to see whether the requested setting is supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderVSync'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetRenderVSync@.
+--                   The safe flavor is 'setRenderVSyncSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderVSync@, defined at @SDL3\/SDL_render.h 2780:34@
+setRenderVSync
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to toggle.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@vsync@]: the vertical refresh sync interval.
+  -> IO Bool
+setRenderVSync =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetRenderVSync x00 (Coerce.coerce x11))
+
+-- | Toggle VSync of the given renderer.
+--
+--     When a renderer is created, vsync defaults to SDL_RENDERER_VSYNC_DISABLED.
+--
+--     The @vsync@ parameter can be 1 to synchronize present with every vertical refresh, 2 to synchronize present with every second vertical refresh, etc., SDL_RENDERER_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or SDL_RENDERER_VSYNC_DISABLED to disable. Not every value is supported by every driver, so you should check the return value to see whether the requested setting is supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRenderVSync'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetRenderVSync@.
+--                   The unsafe flavor is 'setRenderVSync'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetRenderVSync@, defined at @SDL3\/SDL_render.h 2780:34@
+setRenderVSyncSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to toggle.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@vsync@]: the vertical refresh sync interval.
+  -> IO Bool
+setRenderVSyncSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetRenderVSync x00 (Coerce.coerce x11))
+
+-- | Get VSync of the given renderer.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderVSync'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRenderVSync@.
+--                   The safe flavor is 'getRenderVSyncSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderVSync@, defined at @SDL3\/SDL_render.h 2800:34@
+getRenderVSync
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to toggle.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: an int filled with the current vertical refresh sync interval. See @'setRenderVSync'@ for the meaning of the value.
+  -> IO Bool
+getRenderVSync =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetRenderVSync x00 x11)
+
+-- | Get VSync of the given renderer.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setRenderVSync'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetRenderVSync@.
+--                   The unsafe flavor is 'getRenderVSync'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetRenderVSync@, defined at @SDL3\/SDL_render.h 2800:34@
+getRenderVSyncSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to toggle.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: an int filled with the current vertical refresh sync interval. See @'setRenderVSync'@ for the meaning of the value.
+  -> IO Bool
+getRenderVSyncSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetRenderVSync x00 x11)
+
+-- | Draw debug text to an 'SDL_Renderer'.
+--
+--     This function will render a string of text to an 'SDL_Renderer'. Note that this is a convenience function for debugging, with severe limitations, and not intended to be used for production apps and games.
+--
+--     Among these limitations:
+--
+--     * It accepts UTF-8 strings, but will only renders ASCII characters.
+--
+--     * It has a single, tiny size (8x8 pixels). You can use logical presentation or @'setRenderScale'@ to adjust it.
+--
+--     * It uses a simple, hardcoded bitmap font. It does not allow different font selections and it does not support truetype, for proper scaling.
+--
+--     * It does no word-wrapping and does not treat newline characters as a line break. If the text goes out of the window, it\'s gone.
+--
+--     For serious text rendering, there are several good options, such as SDL_ttf, stb_truetype, or other external libraries.
+--
+--     On first use, this will create an internal texture for rendering glyphs. This texture will live until the renderer is destroyed.
+--
+--     The text is drawn in the color specified by @'setRenderDrawColor'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_RenderDebugTextFormat@, 'sDL_DEBUG_TEXT_FONT_CHARACTER_SIZE'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenderDebugText@.
+--                   The safe flavor is 'renderDebugTextSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderDebugText@, defined at @SDL3\/SDL_render.h 2852:34@
+renderDebugText
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a line of text.
+  -> Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate where the top-left corner of the text will draw.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate where the top-left corner of the text will draw.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to render.
+  -> IO Bool
+renderDebugText =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_RenderDebugText x00 (Coerce.coerce x11) (Coerce.coerce x22) x33)
+
+-- | Draw debug text to an 'SDL_Renderer'.
+--
+--     This function will render a string of text to an 'SDL_Renderer'. Note that this is a convenience function for debugging, with severe limitations, and not intended to be used for production apps and games.
+--
+--     Among these limitations:
+--
+--     * It accepts UTF-8 strings, but will only renders ASCII characters.
+--
+--     * It has a single, tiny size (8x8 pixels). You can use logical presentation or @'setRenderScale'@ to adjust it.
+--
+--     * It uses a simple, hardcoded bitmap font. It does not allow different font selections and it does not support truetype, for proper scaling.
+--
+--     * It does no word-wrapping and does not treat newline characters as a line break. If the text goes out of the window, it\'s gone.
+--
+--     For serious text rendering, there are several good options, such as SDL_ttf, stb_truetype, or other external libraries.
+--
+--     On first use, this will create an internal texture for rendering glyphs. This texture will live until the renderer is destroyed.
+--
+--     The text is drawn in the color specified by @'setRenderDrawColor'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_RenderDebugTextFormat@, 'sDL_DEBUG_TEXT_FONT_CHARACTER_SIZE'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenderDebugText@.
+--                   The unsafe flavor is 'renderDebugText'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenderDebugText@, defined at @SDL3\/SDL_render.h 2852:34@
+renderDebugTextSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer which should draw a line of text.
+  -> Float
+  -- ^
+  --
+  --           [@x@]: the x coordinate where the top-left corner of the text will draw.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the y coordinate where the top-left corner of the text will draw.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to render.
+  -> IO Bool
+renderDebugTextSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_RenderDebugText x00 (Coerce.coerce x11) (Coerce.coerce x22) x33)
+
+-- | Set default scale mode for new textures for given renderer.
+--
+--     When a renderer is created, scale_mode defaults to SDL_SCALEMODE_LINEAR.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'getDefaultTextureScaleMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetDefaultTextureScaleMode@.
+--                   The safe flavor is 'setDefaultTextureScaleModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetDefaultTextureScaleMode@, defined at @SDL3\/SDL_render.h 2898:34@
+setDefaultTextureScaleMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to update.
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scale_mode@]: the scale mode to change to for new textures.
+  -> IO Bool
+setDefaultTextureScaleMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetDefaultTextureScaleMode x00 x11)
+
+-- | Set default scale mode for new textures for given renderer.
+--
+--     When a renderer is created, scale_mode defaults to SDL_SCALEMODE_LINEAR.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'getDefaultTextureScaleMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetDefaultTextureScaleMode@.
+--                   The unsafe flavor is 'setDefaultTextureScaleMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetDefaultTextureScaleMode@, defined at @SDL3\/SDL_render.h 2898:34@
+setDefaultTextureScaleModeSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to update.
+  -> SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scale_mode@]: the scale mode to change to for new textures.
+  -> IO Bool
+setDefaultTextureScaleModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetDefaultTextureScaleMode x00 x11)
+
+-- | Get default texture scale mode of the given renderer.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'setDefaultTextureScaleMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDefaultTextureScaleMode@.
+--                   The safe flavor is 'getDefaultTextureScaleModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDefaultTextureScaleMode@, defined at @SDL3\/SDL_render.h 2916:34@
+getDefaultTextureScaleMode
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to get data from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scale_mode@]: a SDL_ScaleMode filled with current default scale mode. See @'setDefaultTextureScaleMode'@ for the meaning of the value.
+  -> IO Bool
+getDefaultTextureScaleMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetDefaultTextureScaleMode x00 x11)
+
+-- | Get default texture scale mode of the given renderer.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'setDefaultTextureScaleMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDefaultTextureScaleMode@.
+--                   The unsafe flavor is 'getDefaultTextureScaleMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDefaultTextureScaleMode@, defined at @SDL3\/SDL_render.h 2916:34@
+getDefaultTextureScaleModeSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to get data from.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_ScaleMode
+  -- ^
+  --
+  --           [@scale_mode@]: a SDL_ScaleMode filled with current default scale mode. See @'setDefaultTextureScaleMode'@ for the meaning of the value.
+  -> IO Bool
+getDefaultTextureScaleModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetDefaultTextureScaleMode x00 x11)
+
+-- | Create custom GPU render state.
+--
+--     [Returns]: a custom GPU render state or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'setGPURenderStateFragmentUniforms', 'setGPURenderState', 'destroyGPURenderState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateGPURenderState@.
+--                   The safe flavor is 'createGPURenderStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPURenderState@, defined at @SDL3\/SDL_render.h 2970:50@
+createGPURenderState
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to use.
+  -> PtrConst.PtrConst SDL_GPURenderStateCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the GPU render state to create.
+  -> IO (BG.Ptr SDL_GPURenderState)
+createGPURenderState =
+  Unsafe.sDL_CreateGPURenderState
+
+-- | Create custom GPU render state.
+--
+--     [Returns]: a custom GPU render state or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'setGPURenderStateFragmentUniforms', 'setGPURenderState', 'destroyGPURenderState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateGPURenderState@.
+--                   The unsafe flavor is 'createGPURenderState'
+--                   .
+--
+--     [C declaration]: @SDL_CreateGPURenderState@, defined at @SDL3\/SDL_render.h 2970:50@
+createGPURenderStateSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to use.
+  -> PtrConst.PtrConst SDL_GPURenderStateCreateInfo
+  -- ^
+  --
+  --           [@createinfo@]: a struct describing the GPU render state to create.
+  -> IO (BG.Ptr SDL_GPURenderState)
+createGPURenderStateSafe =
+  Safe.sDL_CreateGPURenderState
+
+-- | Set fragment shader uniform variables in a custom GPU render state.
+--
+--     The data is copied and will be pushed using 'SDL3.Sys.Gpu.pushGPUFragmentUniformData' during draw call execution.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGPURenderStateFragmentUniforms@.
+--                   The safe flavor is 'setGPURenderStateFragmentUniformsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGPURenderStateFragmentUniforms@, defined at @SDL3\/SDL_render.h 2990:34@
+setGPURenderStateFragmentUniforms
+  :: BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to modify.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@slot_index@]: the fragment uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO Bool
+setGPURenderStateFragmentUniforms =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_SetGPURenderStateFragmentUniforms x00 (Coerce.coerce x11) x22 (Coerce.coerce x33))
+
+-- | Set fragment shader uniform variables in a custom GPU render state.
+--
+--     The data is copied and will be pushed using 'SDL3.Sys.Gpu.pushGPUFragmentUniformData' during draw call execution.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGPURenderStateFragmentUniforms@.
+--                   The unsafe flavor is 'setGPURenderStateFragmentUniforms'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGPURenderStateFragmentUniforms@, defined at @SDL3\/SDL_render.h 2990:34@
+setGPURenderStateFragmentUniformsSafe
+  :: BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to modify.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@slot_index@]: the fragment uniform slot to push data to.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: client data to write.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@length@]: the length of the data to write.
+  -> IO Bool
+setGPURenderStateFragmentUniformsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_SetGPURenderStateFragmentUniforms x00 (Coerce.coerce x11) x22 (Coerce.coerce x33))
+
+-- | Set custom GPU render state.
+--
+--     This function sets custom GPU render state for subsequent draw calls. This allows using custom shaders with the GPU renderer.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetGPURenderState@.
+--                   The safe flavor is 'setGPURenderStateSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGPURenderState@, defined at @SDL3\/SDL_render.h 3008:34@
+setGPURenderState
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to use.
+  -> BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to to use, or NULL to clear custom GPU render state.
+  -> IO Bool
+setGPURenderState =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetGPURenderState x00 x11)
+
+-- | Set custom GPU render state.
+--
+--     This function sets custom GPU render state for subsequent draw calls. This allows using custom shaders with the GPU renderer.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetGPURenderState@.
+--                   The unsafe flavor is 'setGPURenderState'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetGPURenderState@, defined at @SDL3\/SDL_render.h 3008:34@
+setGPURenderStateSafe
+  :: BG.Ptr SDL_Renderer
+  -- ^
+  --
+  --           [@renderer@]: the renderer to use.
+  -> BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to to use, or NULL to clear custom GPU render state.
+  -> IO Bool
+setGPURenderStateSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetGPURenderState x00 x11)
+
+-- | Destroy custom GPU render state.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'createGPURenderState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyGPURenderState@.
+--                   The safe flavor is 'destroyGPURenderStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyGPURenderState@, defined at @SDL3\/SDL_render.h 3022:34@
+destroyGPURenderState
+  :: BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to destroy.
+  -> IO ()
+destroyGPURenderState =
+  Unsafe.sDL_DestroyGPURenderState
+
+-- | Destroy custom GPU render state.
+--
+--     [Thread safety]: This function should be called on the thread that created the renderer.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'createGPURenderState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyGPURenderState@.
+--                   The unsafe flavor is 'destroyGPURenderState'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyGPURenderState@, defined at @SDL3\/SDL_render.h 3022:34@
+destroyGPURenderStateSafe
+  :: BG.Ptr SDL_GPURenderState
+  -- ^
+  --
+  --           [@state@]: the state to destroy.
+  -> IO ()
+destroyGPURenderStateSafe =
+  Safe.sDL_DestroyGPURenderState
diff --git a/src/SDL3/Sys/Runtime.hs b/src/SDL3/Sys/Runtime.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Runtime.hs
@@ -0,0 +1,27 @@
+-- | Bridge vocabulary for the curated layer: C99 bool conversions and
+-- the C enum classes, curated from the vendored hs-bindgen runtime.
+--
+-- Struct fields deliberately keep their C types (a keyboard event's
+-- @repeat@ field is a @CBool@; a rect's @x@ is a C @int@); 'toBool'
+-- bridges the bool case, and plain 'Prelude.fromIntegral' or
+-- 'Data.Coerce.coerce' the fixed-width integer typedefs. The full
+-- runtime surface — including the lifted 'Prelude'-shadowing
+-- combinators these exports leave behind — stays available under
+-- "SDL3.Sys.Bindgen.Runtime" and its submodules.
+module SDL3.Sys.Runtime (
+  -- * C99 bool
+  CBool.toBool,
+  CBool.fromBool,
+  CBool.true,
+  CBool.false,
+  CBool.isTrue,
+  CBool.isFalse,
+
+  -- * C enums
+  CEnum.CEnum (CEnumZ, toCEnum, fromCEnum, isDeclared, mkDeclared, declaredValues),
+  CEnum.SequentialCEnum (minDeclaredValue, maxDeclaredValue),
+  CEnum.getNames,
+) where
+
+import SDL3.Sys.Bindgen.Runtime.CBool qualified as CBool
+import SDL3.Sys.Bindgen.Runtime.CEnum qualified as CEnum
diff --git a/src/SDL3/Sys/Scancode.hs b/src/SDL3/Sys/Scancode.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Scancode.hs
@@ -0,0 +1,25 @@
+-- | Defines keyboard scancodes.
+--
+--     Please refer to the Best Keyboard Practices document for details on what this information means and how best to use it.
+--
+--     [https:\/\/wiki.libsdl.org\/SDL3\/BestKeyboardPractices](https://wiki.libsdl.org/SDL3/BestKeyboardPractices) The SDL keyboard scancode representation.
+--
+--     An SDL scancode is the physical representation of a key on the keyboard, independent of language and keyboard mapping.
+--
+--     Values of this type are used to represent keyboard keys, among other places in the @scancode@ field of the SDL_KeyboardEvent structure.
+--
+--     The values in this enumeration are based on the USB usage page standard: [https:\/\/usb.org\/sites\/default\/files\/hut1_5.pdf](https://usb.org/sites/default/files/hut1_5.pdf)
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Scancode.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Scancode (
+  module SDL3.Sys.Bindgen.Scancode,
+)
+where
+
+import SDL3.Sys.Bindgen.Scancode
diff --git a/src/SDL3/Sys/Sensor.hs b/src/SDL3/Sys/Sensor.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Sensor.hs
@@ -0,0 +1,703 @@
+-- | SDL sensor management.
+--
+--     These APIs grant access to gyros and accelerometers on various platforms.
+--
+--     In order to use these functions, 'SDL3.Sys.Init.init' must have been called with the SDL_INIT_SENSOR flag. This causes SDL to scan the system for sensors, and load appropriate drivers. The opaque structure used to identify an opened SDL sensor.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Sensor.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Sensor (
+  module SDL3.Sys.Bindgen.Sensor,
+
+  -- * Function aliases
+  SDL3.Sys.Sensor.getSensors,
+  SDL3.Sys.Sensor.getSensorsSafe,
+  SDL3.Sys.Sensor.getSensorNameForID,
+  SDL3.Sys.Sensor.getSensorNameForIDSafe,
+  SDL3.Sys.Sensor.getSensorTypeForID,
+  SDL3.Sys.Sensor.getSensorTypeForIDSafe,
+  SDL3.Sys.Sensor.getSensorNonPortableTypeForID,
+  SDL3.Sys.Sensor.getSensorNonPortableTypeForIDSafe,
+  SDL3.Sys.Sensor.openSensor,
+  SDL3.Sys.Sensor.openSensorSafe,
+  SDL3.Sys.Sensor.getSensorFromID,
+  SDL3.Sys.Sensor.getSensorFromIDSafe,
+  SDL3.Sys.Sensor.getSensorProperties,
+  SDL3.Sys.Sensor.getSensorPropertiesSafe,
+  SDL3.Sys.Sensor.getSensorName,
+  SDL3.Sys.Sensor.getSensorNameSafe,
+  SDL3.Sys.Sensor.getSensorType,
+  SDL3.Sys.Sensor.getSensorTypeSafe,
+  SDL3.Sys.Sensor.getSensorNonPortableType,
+  SDL3.Sys.Sensor.getSensorNonPortableTypeSafe,
+  SDL3.Sys.Sensor.getSensorID,
+  SDL3.Sys.Sensor.getSensorIDSafe,
+  SDL3.Sys.Sensor.getSensorData,
+  SDL3.Sys.Sensor.getSensorDataSafe,
+  SDL3.Sys.Sensor.closeSensor,
+  SDL3.Sys.Sensor.closeSensorSafe,
+  SDL3.Sys.Sensor.updateSensors,
+  SDL3.Sys.Sensor.updateSensorsSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Sensor
+import SDL3.Sys.Bindgen.Sensor.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Sensor.Unsafe qualified as Unsafe
+
+-- | Get a list of currently connected sensors.
+--
+--     [Returns]: a 0 terminated array of sensor instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensors@.
+--                   The safe flavor is 'getSensorsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensors@, defined at @SDL3\/SDL_sensor.h 159:44@
+getSensors
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of sensors returned, may be NULL.
+  -> IO (BG.Ptr SDL_SensorID)
+getSensors = Unsafe.sDL_GetSensors
+
+-- | Get a list of currently connected sensors.
+--
+--     [Returns]: a 0 terminated array of sensor instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensors@.
+--                   The unsafe flavor is 'getSensors'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensors@, defined at @SDL3\/SDL_sensor.h 159:44@
+getSensorsSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of sensors returned, may be NULL.
+  -> IO (BG.Ptr SDL_SensorID)
+getSensorsSafe = Safe.sDL_GetSensors
+
+-- | Get the implementation dependent name of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the sensor name, or NULL if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensorNameForID@.
+--                   The safe flavor is 'getSensorNameForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorNameForID@, defined at @SDL3\/SDL_sensor.h 171:42@
+getSensorNameForID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getSensorNameForID = Unsafe.sDL_GetSensorNameForID
+
+-- | Get the implementation dependent name of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the sensor name, or NULL if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensorNameForID@.
+--                   The unsafe flavor is 'getSensorNameForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorNameForID@, defined at @SDL3\/SDL_sensor.h 171:42@
+getSensorNameForIDSafe
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getSensorNameForIDSafe = Safe.sDL_GetSensorNameForID
+
+-- | Get the type of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the 'SDL_SensorType', or @SDL_SENSOR_INVALID@ if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensorTypeForID@.
+--                   The safe flavor is 'getSensorTypeForIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorTypeForID@, defined at @SDL3\/SDL_sensor.h 184:44@
+getSensorTypeForID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO SDL_SensorType
+getSensorTypeForID = Unsafe.sDL_GetSensorTypeForID
+
+-- | Get the type of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the 'SDL_SensorType', or @SDL_SENSOR_INVALID@ if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensorTypeForID@.
+--                   The unsafe flavor is 'getSensorTypeForID'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorTypeForID@, defined at @SDL3\/SDL_sensor.h 184:44@
+getSensorTypeForIDSafe
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO SDL_SensorType
+getSensorTypeForIDSafe = Safe.sDL_GetSensorTypeForID
+
+-- | Get the platform dependent type of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the sensor platform dependent type, or -1 if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensorNonPortableTypeForID@.
+--                   The safe flavor is 'getSensorNonPortableTypeForIDSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSensorNonPortableTypeForID@, defined at @SDL3\/SDL_sensor.h 197:33@
+getSensorNonPortableTypeForID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO BG.Int32
+getSensorNonPortableTypeForID =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetSensorNonPortableTypeForID x00)
+
+-- | Get the platform dependent type of a sensor.
+--
+--     This can be called before any sensors are opened.
+--
+--     [Returns]: the sensor platform dependent type, or -1 if @instance_id@ is not valid.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensorNonPortableTypeForID@.
+--                   The unsafe flavor is 'getSensorNonPortableTypeForID'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSensorNonPortableTypeForID@, defined at @SDL3\/SDL_sensor.h 197:33@
+getSensorNonPortableTypeForIDSafe
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO BG.Int32
+getSensorNonPortableTypeForIDSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetSensorNonPortableTypeForID x00)
+
+-- | Open a sensor for use.
+--
+--     [Returns]: an 'SDL_Sensor' object or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenSensor@.
+--                   The safe flavor is 'openSensorSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenSensor@, defined at @SDL3\/SDL_sensor.h 208:42@
+openSensor
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (BG.Ptr SDL_Sensor)
+openSensor = Unsafe.sDL_OpenSensor
+
+-- | Open a sensor for use.
+--
+--     [Returns]: an 'SDL_Sensor' object or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenSensor@.
+--                   The unsafe flavor is 'openSensor'
+--                   .
+--
+--     [C declaration]: @SDL_OpenSensor@, defined at @SDL3\/SDL_sensor.h 208:42@
+openSensorSafe
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (BG.Ptr SDL_Sensor)
+openSensorSafe = Safe.sDL_OpenSensor
+
+-- | Return the 'SDL_Sensor' associated with an instance ID.
+--
+--     [Returns]: an 'SDL_Sensor' object or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensorFromID@.
+--                   The safe flavor is 'getSensorFromIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorFromID@, defined at @SDL3\/SDL_sensor.h 219:42@
+getSensorFromID
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (BG.Ptr SDL_Sensor)
+getSensorFromID = Unsafe.sDL_GetSensorFromID
+
+-- | Return the 'SDL_Sensor' associated with an instance ID.
+--
+--     [Returns]: an 'SDL_Sensor' object or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensorFromID@.
+--                   The unsafe flavor is 'getSensorFromID'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorFromID@, defined at @SDL3\/SDL_sensor.h 219:42@
+getSensorFromIDSafe
+  :: SDL_SensorID
+  -- ^
+  --
+  --           [@instance_id@]: the sensor instance ID.
+  -> IO (BG.Ptr SDL_Sensor)
+getSensorFromIDSafe = Safe.sDL_GetSensorFromID
+
+-- | Get the properties associated with a sensor.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensorProperties@.
+--                   The safe flavor is 'getSensorPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorProperties@, defined at @SDL3\/SDL_sensor.h 230:46@
+getSensorProperties
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getSensorProperties = Unsafe.sDL_GetSensorProperties
+
+-- | Get the properties associated with a sensor.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensorProperties@.
+--                   The unsafe flavor is 'getSensorProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorProperties@, defined at @SDL3\/SDL_sensor.h 230:46@
+getSensorPropertiesSafe
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getSensorPropertiesSafe =
+  Safe.sDL_GetSensorProperties
+
+-- | Get the implementation dependent name of a sensor.
+--
+--     [Returns]: the sensor name or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensorName@.
+--                   The safe flavor is 'getSensorNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorName@, defined at @SDL3\/SDL_sensor.h 241:42@
+getSensorName
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getSensorName = Unsafe.sDL_GetSensorName
+
+-- | Get the implementation dependent name of a sensor.
+--
+--     [Returns]: the sensor name or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensorName@.
+--                   The unsafe flavor is 'getSensorName'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorName@, defined at @SDL3\/SDL_sensor.h 241:42@
+getSensorNameSafe
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getSensorNameSafe = Safe.sDL_GetSensorName
+
+-- | Get the type of a sensor.
+--
+--     [Returns]: the 'SDL_SensorType' type, or @SDL_SENSOR_INVALID@ if @sensor@ is NULL.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensorType@.
+--                   The safe flavor is 'getSensorTypeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorType@, defined at @SDL3\/SDL_sensor.h 252:44@
+getSensorType
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO SDL_SensorType
+getSensorType = Unsafe.sDL_GetSensorType
+
+-- | Get the type of a sensor.
+--
+--     [Returns]: the 'SDL_SensorType' type, or @SDL_SENSOR_INVALID@ if @sensor@ is NULL.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensorType@.
+--                   The unsafe flavor is 'getSensorType'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorType@, defined at @SDL3\/SDL_sensor.h 252:44@
+getSensorTypeSafe
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO SDL_SensorType
+getSensorTypeSafe = Safe.sDL_GetSensorType
+
+-- | Get the platform dependent type of a sensor.
+--
+--     [Returns]: the sensor platform dependent type, or -1 if @sensor@ is NULL.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensorNonPortableType@.
+--                   The safe flavor is 'getSensorNonPortableTypeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSensorNonPortableType@, defined at @SDL3\/SDL_sensor.h 262:33@
+getSensorNonPortableType
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO BG.Int32
+getSensorNonPortableType =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetSensorNonPortableType x00)
+
+-- | Get the platform dependent type of a sensor.
+--
+--     [Returns]: the sensor platform dependent type, or -1 if @sensor@ is NULL.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensorNonPortableType@.
+--                   The unsafe flavor is 'getSensorNonPortableType'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSensorNonPortableType@, defined at @SDL3\/SDL_sensor.h 262:33@
+getSensorNonPortableTypeSafe
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO BG.Int32
+getSensorNonPortableTypeSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetSensorNonPortableType x00)
+
+-- | Get the instance ID of a sensor.
+--
+--     [Returns]: the sensor instance ID, or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensorID@.
+--                   The safe flavor is 'getSensorIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorID@, defined at @SDL3\/SDL_sensor.h 273:42@
+getSensorID
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO SDL_SensorID
+getSensorID = Unsafe.sDL_GetSensorID
+
+-- | Get the instance ID of a sensor.
+--
+--     [Returns]: the sensor instance ID, or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensorID@.
+--                   The unsafe flavor is 'getSensorID'
+--                   .
+--
+--     [C declaration]: @SDL_GetSensorID@, defined at @SDL3\/SDL_sensor.h 273:42@
+getSensorIDSafe
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to inspect.
+  -> IO SDL_SensorID
+getSensorIDSafe = Safe.sDL_GetSensorID
+
+-- | Get the current state of an opened sensor.
+--
+--     The number of values and interpretation of the data is sensor dependent.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSensorData@.
+--                   The safe flavor is 'getSensorDataSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSensorData@, defined at @SDL3\/SDL_sensor.h 288:34@
+getSensorData
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@data@]: a pointer filled with the current sensor state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_values@]: the number of values to write to data.
+  -> IO Bool
+getSensorData =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetSensorData x00 x11 (Coerce.coerce x22))
+
+-- | Get the current state of an opened sensor.
+--
+--     The number of values and interpretation of the data is sensor dependent.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSensorData@.
+--                   The unsafe flavor is 'getSensorData'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSensorData@, defined at @SDL3\/SDL_sensor.h 288:34@
+getSensorDataSafe
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to query.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@data@]: a pointer filled with the current sensor state.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@num_values@]: the number of values to write to data.
+  -> IO Bool
+getSensorDataSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetSensorData x00 x11 (Coerce.coerce x22))
+
+-- | Close a sensor previously opened with @'openSensor'@.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CloseSensor@.
+--                   The safe flavor is 'closeSensorSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CloseSensor@, defined at @SDL3\/SDL_sensor.h 297:34@
+closeSensor
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to close.
+  -> IO ()
+closeSensor = Unsafe.sDL_CloseSensor
+
+-- | Close a sensor previously opened with @'openSensor'@.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CloseSensor@.
+--                   The unsafe flavor is 'closeSensor'
+--                   .
+--
+--     [C declaration]: @SDL_CloseSensor@, defined at @SDL3\/SDL_sensor.h 297:34@
+closeSensorSafe
+  :: BG.Ptr SDL_Sensor
+  -- ^
+  --
+  --           [@sensor@]: the 'SDL_Sensor' object to close.
+  -> IO ()
+closeSensorSafe = Safe.sDL_CloseSensor
+
+-- | Update the current state of the open sensors.
+--
+--     This is called automatically by the event loop if sensor events are enabled.
+--
+--     This needs to be called from the thread that initialized the sensor subsystem.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UpdateSensors@.
+--                   The safe flavor is 'updateSensorsSafe'
+--                   : routes through joystick update; virtual-device callbacks run synchronously.
+--
+--     [C declaration]: @SDL_UpdateSensors@, defined at @SDL3\/SDL_sensor.h 310:34@
+updateSensors :: IO ()
+updateSensors = Unsafe.sDL_UpdateSensors
+
+-- | Update the current state of the open sensors.
+--
+--     This is called automatically by the event loop if sensor events are enabled.
+--
+--     This needs to be called from the thread that initialized the sensor subsystem.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UpdateSensors@.
+--                   The unsafe flavor is 'updateSensors'
+--                   : routes through joystick update; virtual-device callbacks run synchronously.
+--
+--     [C declaration]: @SDL_UpdateSensors@, defined at @SDL3\/SDL_sensor.h 310:34@
+updateSensorsSafe :: IO ()
+updateSensorsSafe = Safe.sDL_UpdateSensors
diff --git a/src/SDL3/Sys/Stdinc.hs b/src/SDL3/Sys/Stdinc.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Stdinc.hs
@@ -0,0 +1,7328 @@
+-- | SDL\'s C-library replacements: memory, strings, math, and conversions.
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Stdinc.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Stdinc (
+  module SDL3.Sys.Bindgen.Stdinc,
+
+  -- * Function aliases
+  SDL3.Sys.Stdinc.malloc,
+  SDL3.Sys.Stdinc.mallocSafe,
+  SDL3.Sys.Stdinc.calloc,
+  SDL3.Sys.Stdinc.callocSafe,
+  SDL3.Sys.Stdinc.realloc,
+  SDL3.Sys.Stdinc.reallocSafe,
+  SDL3.Sys.Stdinc.free,
+  SDL3.Sys.Stdinc.freeSafe,
+  SDL3.Sys.Stdinc.getOriginalMemoryFunctions,
+  SDL3.Sys.Stdinc.getOriginalMemoryFunctionsSafe,
+  SDL3.Sys.Stdinc.getMemoryFunctions,
+  SDL3.Sys.Stdinc.getMemoryFunctionsSafe,
+  SDL3.Sys.Stdinc.setMemoryFunctions,
+  SDL3.Sys.Stdinc.setMemoryFunctionsSafe,
+  SDL3.Sys.Stdinc.alignedAlloc,
+  SDL3.Sys.Stdinc.alignedAllocSafe,
+  SDL3.Sys.Stdinc.alignedFree,
+  SDL3.Sys.Stdinc.alignedFreeSafe,
+  SDL3.Sys.Stdinc.getNumAllocations,
+  SDL3.Sys.Stdinc.getNumAllocationsSafe,
+  SDL3.Sys.Stdinc.getEnvironment,
+  SDL3.Sys.Stdinc.getEnvironmentSafe,
+  SDL3.Sys.Stdinc.createEnvironment,
+  SDL3.Sys.Stdinc.createEnvironmentSafe,
+  SDL3.Sys.Stdinc.getEnvironmentVariable,
+  SDL3.Sys.Stdinc.getEnvironmentVariableSafe,
+  SDL3.Sys.Stdinc.getEnvironmentVariables,
+  SDL3.Sys.Stdinc.getEnvironmentVariablesSafe,
+  SDL3.Sys.Stdinc.setEnvironmentVariable,
+  SDL3.Sys.Stdinc.setEnvironmentVariableSafe,
+  SDL3.Sys.Stdinc.unsetEnvironmentVariable,
+  SDL3.Sys.Stdinc.unsetEnvironmentVariableSafe,
+  SDL3.Sys.Stdinc.destroyEnvironment,
+  SDL3.Sys.Stdinc.destroyEnvironmentSafe,
+  SDL3.Sys.Stdinc.getenv,
+  SDL3.Sys.Stdinc.getenvSafe,
+  SDL3.Sys.Stdinc.getenvUnsafe,
+  SDL3.Sys.Stdinc.getenvUnsafeSafe,
+  SDL3.Sys.Stdinc.setenvUnsafe,
+  SDL3.Sys.Stdinc.setenvUnsafeSafe,
+  SDL3.Sys.Stdinc.unsetenvUnsafe,
+  SDL3.Sys.Stdinc.unsetenvUnsafeSafe,
+  SDL3.Sys.Stdinc.qsortSafe,
+  SDL3.Sys.Stdinc.bsearchSafe,
+  SDL3.Sys.Stdinc.qsortRSafe,
+  SDL3.Sys.Stdinc.bsearchRSafe,
+  SDL3.Sys.Stdinc.abs,
+  SDL3.Sys.Stdinc.isalpha,
+  SDL3.Sys.Stdinc.isalnum,
+  SDL3.Sys.Stdinc.isblank,
+  SDL3.Sys.Stdinc.iscntrl,
+  SDL3.Sys.Stdinc.isdigit,
+  SDL3.Sys.Stdinc.isxdigit,
+  SDL3.Sys.Stdinc.ispunct,
+  SDL3.Sys.Stdinc.isspace,
+  SDL3.Sys.Stdinc.isupper,
+  SDL3.Sys.Stdinc.islower,
+  SDL3.Sys.Stdinc.isprint,
+  SDL3.Sys.Stdinc.isgraph,
+  SDL3.Sys.Stdinc.toupper,
+  SDL3.Sys.Stdinc.tolower,
+  SDL3.Sys.Stdinc.crc16,
+  SDL3.Sys.Stdinc.crc16Safe,
+  SDL3.Sys.Stdinc.crc32,
+  SDL3.Sys.Stdinc.crc32Safe,
+  SDL3.Sys.Stdinc.murmur3_32,
+  SDL3.Sys.Stdinc.murmur3_32Safe,
+  SDL3.Sys.Stdinc.memset4,
+  SDL3.Sys.Stdinc.memset4Safe,
+  SDL3.Sys.Stdinc.memcmp,
+  SDL3.Sys.Stdinc.memcmpSafe,
+  SDL3.Sys.Stdinc.wcslen,
+  SDL3.Sys.Stdinc.wcsnlen,
+  SDL3.Sys.Stdinc.wcslcpy,
+  SDL3.Sys.Stdinc.wcslcat,
+  SDL3.Sys.Stdinc.wcsdup,
+  SDL3.Sys.Stdinc.wcsdupSafe,
+  SDL3.Sys.Stdinc.wcsstr,
+  SDL3.Sys.Stdinc.wcsnstr,
+  SDL3.Sys.Stdinc.wcscmp,
+  SDL3.Sys.Stdinc.wcsncmp,
+  SDL3.Sys.Stdinc.wcscasecmp,
+  SDL3.Sys.Stdinc.wcsncasecmp,
+  SDL3.Sys.Stdinc.strlen,
+  SDL3.Sys.Stdinc.strnlen,
+  SDL3.Sys.Stdinc.strlcpy,
+  SDL3.Sys.Stdinc.utf8strlcpy,
+  SDL3.Sys.Stdinc.strlcat,
+  SDL3.Sys.Stdinc.strdup,
+  SDL3.Sys.Stdinc.strdupSafe,
+  SDL3.Sys.Stdinc.strndup,
+  SDL3.Sys.Stdinc.strndupSafe,
+  SDL3.Sys.Stdinc.strrev,
+  SDL3.Sys.Stdinc.strupr,
+  SDL3.Sys.Stdinc.strlwr,
+  SDL3.Sys.Stdinc.strchr,
+  SDL3.Sys.Stdinc.strrchr,
+  SDL3.Sys.Stdinc.strstr,
+  SDL3.Sys.Stdinc.strnstr,
+  SDL3.Sys.Stdinc.strcasestr,
+  SDL3.Sys.Stdinc.strtokR,
+  SDL3.Sys.Stdinc.utf8strlen,
+  SDL3.Sys.Stdinc.utf8strnlen,
+  SDL3.Sys.Stdinc.itoa,
+  SDL3.Sys.Stdinc.uitoa,
+  SDL3.Sys.Stdinc.lltoa,
+  SDL3.Sys.Stdinc.ulltoa,
+  SDL3.Sys.Stdinc.atoi,
+  SDL3.Sys.Stdinc.atof,
+  SDL3.Sys.Stdinc.strtoll,
+  SDL3.Sys.Stdinc.strtoull,
+  SDL3.Sys.Stdinc.strtod,
+  SDL3.Sys.Stdinc.strcmp,
+  SDL3.Sys.Stdinc.strncmp,
+  SDL3.Sys.Stdinc.strcasecmp,
+  SDL3.Sys.Stdinc.strncasecmp,
+  SDL3.Sys.Stdinc.strpbrk,
+  SDL3.Sys.Stdinc.stepUTF8,
+  SDL3.Sys.Stdinc.stepBackUTF8,
+  SDL3.Sys.Stdinc.ucs4ToUTF8,
+  SDL3.Sys.Stdinc.srand,
+  SDL3.Sys.Stdinc.srandSafe,
+  SDL3.Sys.Stdinc.rand,
+  SDL3.Sys.Stdinc.randSafe,
+  SDL3.Sys.Stdinc.randf,
+  SDL3.Sys.Stdinc.randfSafe,
+  SDL3.Sys.Stdinc.randBits,
+  SDL3.Sys.Stdinc.randBitsSafe,
+  SDL3.Sys.Stdinc.randR,
+  SDL3.Sys.Stdinc.randRSafe,
+  SDL3.Sys.Stdinc.randfR,
+  SDL3.Sys.Stdinc.randfRSafe,
+  SDL3.Sys.Stdinc.randBitsR,
+  SDL3.Sys.Stdinc.randBitsRSafe,
+  SDL3.Sys.Stdinc.acos,
+  SDL3.Sys.Stdinc.acosf,
+  SDL3.Sys.Stdinc.asin,
+  SDL3.Sys.Stdinc.asinf,
+  SDL3.Sys.Stdinc.atan,
+  SDL3.Sys.Stdinc.atanf,
+  SDL3.Sys.Stdinc.atan2,
+  SDL3.Sys.Stdinc.atan2f,
+  SDL3.Sys.Stdinc.ceil,
+  SDL3.Sys.Stdinc.ceilf,
+  SDL3.Sys.Stdinc.copysign,
+  SDL3.Sys.Stdinc.copysignf,
+  SDL3.Sys.Stdinc.cos,
+  SDL3.Sys.Stdinc.cosf,
+  SDL3.Sys.Stdinc.exp,
+  SDL3.Sys.Stdinc.expf,
+  SDL3.Sys.Stdinc.fabs,
+  SDL3.Sys.Stdinc.fabsf,
+  SDL3.Sys.Stdinc.floor,
+  SDL3.Sys.Stdinc.floorf,
+  SDL3.Sys.Stdinc.trunc,
+  SDL3.Sys.Stdinc.truncf,
+  SDL3.Sys.Stdinc.fmod,
+  SDL3.Sys.Stdinc.fmodf,
+  SDL3.Sys.Stdinc.isinf,
+  SDL3.Sys.Stdinc.isinff,
+  SDL3.Sys.Stdinc.isnan,
+  SDL3.Sys.Stdinc.isnanf,
+  SDL3.Sys.Stdinc.log,
+  SDL3.Sys.Stdinc.logf,
+  SDL3.Sys.Stdinc.log10,
+  SDL3.Sys.Stdinc.log10f,
+  SDL3.Sys.Stdinc.modf,
+  SDL3.Sys.Stdinc.modff,
+  SDL3.Sys.Stdinc.pow,
+  SDL3.Sys.Stdinc.powf,
+  SDL3.Sys.Stdinc.round,
+  SDL3.Sys.Stdinc.roundf,
+  SDL3.Sys.Stdinc.scalbn,
+  SDL3.Sys.Stdinc.scalbnf,
+  SDL3.Sys.Stdinc.sin,
+  SDL3.Sys.Stdinc.sinf,
+  SDL3.Sys.Stdinc.sqrt,
+  SDL3.Sys.Stdinc.sqrtf,
+  SDL3.Sys.Stdinc.tan,
+  SDL3.Sys.Stdinc.tanf,
+  SDL3.Sys.Stdinc.iconvOpen,
+  SDL3.Sys.Stdinc.iconvOpenSafe,
+  SDL3.Sys.Stdinc.iconvClose,
+  SDL3.Sys.Stdinc.iconvCloseSafe,
+  SDL3.Sys.Stdinc.iconv,
+  SDL3.Sys.Stdinc.iconvSafe,
+  SDL3.Sys.Stdinc.iconvString,
+  SDL3.Sys.Stdinc.iconvStringSafe,
+  SDL3.Sys.Stdinc.sizeMulCheckOverflowBuiltin,
+  SDL3.Sys.Stdinc.sizeMulCheckOverflowBuiltinSafe,
+  SDL3.Sys.Stdinc.sizeAddCheckOverflowBuiltin,
+  SDL3.Sys.Stdinc.sizeAddCheckOverflowBuiltinSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Stdinc
+import SDL3.Sys.Bindgen.Stdinc.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Stdinc.Unsafe qualified as Unsafe
+
+-- | Allocate uninitialized memory.
+--
+--     The allocated memory returned by this function must be freed with @'free'@.
+--
+--     If @size@ is 0, it will be set to 1.
+--
+--     If the allocation is successful, the returned pointer is guaranteed to be aligned to either the /fundamental alignment/ (@alignof(max_align_t)@ in C11 and later) or @2 * sizeof(void *)@, whichever is smaller. Use @'alignedAlloc'@ if you need to allocate memory aligned to an alignment greater than this guarantee.
+--
+--     [Returns]: a pointer to the allocated memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'free', 'calloc', 'realloc', 'alignedAlloc'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_malloc@.
+--                   The safe flavor is 'mallocSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_malloc@, defined at @SDL3\/SDL_stdinc.h 1341:47@
+malloc
+  :: BG.Word64
+  -- ^
+  --
+  --           [@size@]: the size to allocate.
+  -> IO (BG.Ptr BG.Void)
+malloc =
+  \x00 -> Unsafe.sDL_malloc (Coerce.coerce x00)
+
+-- | Allocate uninitialized memory.
+--
+--     The allocated memory returned by this function must be freed with @'free'@.
+--
+--     If @size@ is 0, it will be set to 1.
+--
+--     If the allocation is successful, the returned pointer is guaranteed to be aligned to either the /fundamental alignment/ (@alignof(max_align_t)@ in C11 and later) or @2 * sizeof(void *)@, whichever is smaller. Use @'alignedAlloc'@ if you need to allocate memory aligned to an alignment greater than this guarantee.
+--
+--     [Returns]: a pointer to the allocated memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'free', 'calloc', 'realloc', 'alignedAlloc'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_malloc@.
+--                   The unsafe flavor is 'malloc'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_malloc@, defined at @SDL3\/SDL_stdinc.h 1341:47@
+mallocSafe
+  :: BG.Word64
+  -- ^
+  --
+  --           [@size@]: the size to allocate.
+  -> IO (BG.Ptr BG.Void)
+mallocSafe =
+  \x00 -> Safe.sDL_malloc (Coerce.coerce x00)
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_calloc@.
+--                   The safe flavor is 'callocSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_calloc@, defined at @SDL3\/SDL_stdinc.h 1366:69@
+calloc
+  :: BG.Word64
+  -- ^ [C declaration]: @nmemb@
+  -> BG.Word64
+  -- ^ [C declaration]: @size@
+  -> IO (BG.Ptr BG.Void)
+calloc =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_calloc (Coerce.coerce x00) (Coerce.coerce x11)
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_calloc@.
+--                   The unsafe flavor is 'calloc'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_calloc@, defined at @SDL3\/SDL_stdinc.h 1366:69@
+callocSafe
+  :: BG.Word64
+  -- ^ [C declaration]: @nmemb@
+  -> BG.Word64
+  -- ^ [C declaration]: @size@
+  -> IO (BG.Ptr BG.Void)
+callocSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_calloc (Coerce.coerce x00) (Coerce.coerce x11)
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_realloc@.
+--                   The safe flavor is 'reallocSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_realloc@, defined at @SDL3\/SDL_stdinc.h 1406:54@
+realloc
+  :: BG.Ptr BG.Void
+  -- ^ [C declaration]: @mem@
+  -> BG.Word64
+  -- ^ [C declaration]: @size@
+  -> IO (BG.Ptr BG.Void)
+realloc =
+  \x00 ->
+    \x11 -> Unsafe.sDL_realloc x00 (Coerce.coerce x11)
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_realloc@.
+--                   The unsafe flavor is 'realloc'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_realloc@, defined at @SDL3\/SDL_stdinc.h 1406:54@
+reallocSafe
+  :: BG.Ptr BG.Void
+  -- ^ [C declaration]: @mem@
+  -> BG.Word64
+  -- ^ [C declaration]: @size@
+  -> IO (BG.Ptr BG.Void)
+reallocSafe =
+  \x00 ->
+    \x11 -> Safe.sDL_realloc x00 (Coerce.coerce x11)
+
+-- | Free allocated memory.
+--
+--     The pointer is no longer valid after this call and cannot be dereferenced anymore.
+--
+--     If @mem@ is NULL, this function does nothing.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'malloc', 'calloc', 'realloc'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_free@.
+--                   The safe flavor is 'freeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_free@, defined at @SDL3\/SDL_stdinc.h 1426:34@
+free
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to allocated memory, or NULL.
+  -> IO ()
+free = Unsafe.sDL_free
+
+-- | Free allocated memory.
+--
+--     The pointer is no longer valid after this call and cannot be dereferenced anymore.
+--
+--     If @mem@ is NULL, this function does nothing.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'malloc', 'calloc', 'realloc'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_free@.
+--                   The unsafe flavor is 'free'
+--                   .
+--
+--     [C declaration]: @SDL_free@, defined at @SDL3\/SDL_stdinc.h 1426:34@
+freeSafe
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer to allocated memory, or NULL.
+  -> IO ()
+freeSafe = Safe.sDL_free
+
+-- | Get the original set of SDL memory functions.
+--
+--     This is what 'malloc' and friends will use by default, if there has been no call to 'setMemoryFunctions'. This is not necessarily using the C runtime\'s @malloc@ functions behind the scenes! Different platforms and build configurations might do any number of unexpected things.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetOriginalMemoryFunctions@.
+--                   The safe flavor is 'getOriginalMemoryFunctionsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetOriginalMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1524:34@
+getOriginalMemoryFunctions
+  :: BG.Ptr SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: filled with malloc function.
+  -> BG.Ptr SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: filled with calloc function.
+  -> BG.Ptr SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: filled with realloc function.
+  -> BG.Ptr SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: filled with free function.
+  -> IO ()
+getOriginalMemoryFunctions =
+  Unsafe.sDL_GetOriginalMemoryFunctions
+
+-- | Get the original set of SDL memory functions.
+--
+--     This is what 'malloc' and friends will use by default, if there has been no call to 'setMemoryFunctions'. This is not necessarily using the C runtime\'s @malloc@ functions behind the scenes! Different platforms and build configurations might do any number of unexpected things.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetOriginalMemoryFunctions@.
+--                   The unsafe flavor is 'getOriginalMemoryFunctions'
+--                   .
+--
+--     [C declaration]: @SDL_GetOriginalMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1524:34@
+getOriginalMemoryFunctionsSafe
+  :: BG.Ptr SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: filled with malloc function.
+  -> BG.Ptr SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: filled with calloc function.
+  -> BG.Ptr SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: filled with realloc function.
+  -> BG.Ptr SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: filled with free function.
+  -> IO ()
+getOriginalMemoryFunctionsSafe =
+  Safe.sDL_GetOriginalMemoryFunctions
+
+-- | Get the current set of SDL memory functions.
+--
+--     [Thread safety]: This does not hold a lock, so do not call this in the unlikely event of a background thread calling 'setMemoryFunctions' simultaneously.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setMemoryFunctions', 'getOriginalMemoryFunctions'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetMemoryFunctions@.
+--                   The safe flavor is 'getMemoryFunctionsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1546:34@
+getMemoryFunctions
+  :: BG.Ptr SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: filled with malloc function.
+  -> BG.Ptr SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: filled with calloc function.
+  -> BG.Ptr SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: filled with realloc function.
+  -> BG.Ptr SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: filled with free function.
+  -> IO ()
+getMemoryFunctions = Unsafe.sDL_GetMemoryFunctions
+
+-- | Get the current set of SDL memory functions.
+--
+--     [Thread safety]: This does not hold a lock, so do not call this in the unlikely event of a background thread calling 'setMemoryFunctions' simultaneously.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setMemoryFunctions', 'getOriginalMemoryFunctions'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetMemoryFunctions@.
+--                   The unsafe flavor is 'getMemoryFunctions'
+--                   .
+--
+--     [C declaration]: @SDL_GetMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1546:34@
+getMemoryFunctionsSafe
+  :: BG.Ptr SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: filled with malloc function.
+  -> BG.Ptr SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: filled with calloc function.
+  -> BG.Ptr SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: filled with realloc function.
+  -> BG.Ptr SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: filled with free function.
+  -> IO ()
+getMemoryFunctionsSafe = Safe.sDL_GetMemoryFunctions
+
+-- | Replace SDL\'s memory allocation functions with a custom set.
+--
+--     It is not safe to call this function once any allocations have been made, as future calls to 'free' will use the new allocator, even if they came from an 'malloc' made with the old one!
+--
+--     If used, usually this needs to be the first call made into the SDL library, if not the very first thing done at program startup time.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but one should not replace the memory functions once any allocations are made!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMemoryFunctions', 'getOriginalMemoryFunctions'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetMemoryFunctions@.
+--                   The safe flavor is 'setMemoryFunctionsSafe'
+--                   : registration; replacement allocators run inside every later SDL call.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1577:34@
+setMemoryFunctions
+  :: SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: custom malloc function.
+  -> SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: custom calloc function.
+  -> SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: custom realloc function.
+  -> SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: custom free function.
+  -> IO Bool
+setMemoryFunctions =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_SetMemoryFunctions x00 x11 x22 x33)
+
+-- | Replace SDL\'s memory allocation functions with a custom set.
+--
+--     It is not safe to call this function once any allocations have been made, as future calls to 'free' will use the new allocator, even if they came from an 'malloc' made with the old one!
+--
+--     If used, usually this needs to be the first call made into the SDL library, if not the very first thing done at program startup time.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but one should not replace the memory functions once any allocations are made!
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getMemoryFunctions', 'getOriginalMemoryFunctions'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetMemoryFunctions@.
+--                   The unsafe flavor is 'setMemoryFunctions'
+--                   : registration; replacement allocators run inside every later SDL call.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetMemoryFunctions@, defined at @SDL3\/SDL_stdinc.h 1577:34@
+setMemoryFunctionsSafe
+  :: SDL_malloc_func
+  -- ^
+  --
+  --           [@malloc_func@]: custom malloc function.
+  -> SDL_calloc_func
+  -- ^
+  --
+  --           [@calloc_func@]: custom calloc function.
+  -> SDL_realloc_func
+  -- ^
+  --
+  --           [@realloc_func@]: custom realloc function.
+  -> SDL_free_func
+  -- ^
+  --
+  --           [@free_func@]: custom free function.
+  -> IO Bool
+setMemoryFunctionsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_SetMemoryFunctions x00 x11 x22 x33)
+
+-- | Allocate memory aligned to a specific alignment.
+--
+--     The memory returned by this function must be freed with @'alignedFree'@, /not/ @'free'@.
+--
+--     If @alignment@ is less than the size of @void *@, it will be increased to match that.
+--
+--     The returned memory address will be a multiple of the alignment value, and the size of the memory allocated will be a multiple of the alignment value.
+--
+--     [Returns]: a pointer to the aligned memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'alignedFree'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_aligned_alloc@.
+--                   The safe flavor is 'alignedAllocSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_aligned_alloc@, defined at @SDL3\/SDL_stdinc.h 1604:47@
+alignedAlloc
+  :: BG.Word64
+  -- ^
+  --
+  --           [@alignment@]: the alignment of the memory.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the size to allocate.
+  -> IO (BG.Ptr BG.Void)
+alignedAlloc =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_aligned_alloc (Coerce.coerce x00) (Coerce.coerce x11)
+
+-- | Allocate memory aligned to a specific alignment.
+--
+--     The memory returned by this function must be freed with @'alignedFree'@, /not/ @'free'@.
+--
+--     If @alignment@ is less than the size of @void *@, it will be increased to match that.
+--
+--     The returned memory address will be a multiple of the alignment value, and the size of the memory allocated will be a multiple of the alignment value.
+--
+--     [Returns]: a pointer to the aligned memory, or NULL if allocation failed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'alignedFree'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_aligned_alloc@.
+--                   The unsafe flavor is 'alignedAlloc'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_aligned_alloc@, defined at @SDL3\/SDL_stdinc.h 1604:47@
+alignedAllocSafe
+  :: BG.Word64
+  -- ^
+  --
+  --           [@alignment@]: the alignment of the memory.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the size to allocate.
+  -> IO (BG.Ptr BG.Void)
+alignedAllocSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_aligned_alloc (Coerce.coerce x00) (Coerce.coerce x11)
+
+-- | Free memory allocated by @'alignedAlloc'@.
+--
+--     The pointer is no longer valid after this call and cannot be dereferenced anymore.
+--
+--     If @mem@ is NULL, this function does nothing.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'alignedAlloc'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_aligned_free@.
+--                   The safe flavor is 'alignedFreeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_aligned_free@, defined at @SDL3\/SDL_stdinc.h 1622:34@
+alignedFree
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer previously returned by @'alignedAlloc'@, or NULL.
+  -> IO ()
+alignedFree = Unsafe.sDL_aligned_free
+
+-- | Free memory allocated by @'alignedAlloc'@.
+--
+--     The pointer is no longer valid after this call and cannot be dereferenced anymore.
+--
+--     If @mem@ is NULL, this function does nothing.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'alignedAlloc'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_aligned_free@.
+--                   The unsafe flavor is 'alignedFree'
+--                   .
+--
+--     [C declaration]: @SDL_aligned_free@, defined at @SDL3\/SDL_stdinc.h 1622:34@
+alignedFreeSafe
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@mem@]: a pointer previously returned by @'alignedAlloc'@, or NULL.
+  -> IO ()
+alignedFreeSafe = Safe.sDL_aligned_free
+
+-- | Get the number of outstanding (unfreed) allocations.
+--
+--     [Returns]: the number of allocations or -1 if allocation counting is disabled.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumAllocations@.
+--                   The safe flavor is 'getNumAllocationsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumAllocations@, defined at @SDL3\/SDL_stdinc.h 1634:33@
+getNumAllocations :: IO BG.Int32
+getNumAllocations =
+  fmap Coerce.coerce Unsafe.sDL_GetNumAllocations
+
+-- | Get the number of outstanding (unfreed) allocations.
+--
+--     [Returns]: the number of allocations or -1 if allocation counting is disabled.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumAllocations@.
+--                   The unsafe flavor is 'getNumAllocations'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumAllocations@, defined at @SDL3\/SDL_stdinc.h 1634:33@
+getNumAllocationsSafe :: IO BG.Int32
+getNumAllocationsSafe =
+  fmap Coerce.coerce Safe.sDL_GetNumAllocations
+
+-- | Get the process environment.
+--
+--     This is initialized at application start and is not affected by setenv() and unsetenv() calls after that point. Use @'setEnvironmentVariable'@ and @'unsetEnvironmentVariable'@ if you want to modify this environment, or @'setenvUnsafe'@ or @'unsetenvUnsafe'@ if you want changes to persist in the C runtime environment after 'SDL3.Sys.Init.quit'.
+--
+--     [Returns]: a pointer to the environment for the process or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironmentVariable', 'getEnvironmentVariables', 'setEnvironmentVariable', 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetEnvironment@.
+--                   The safe flavor is 'getEnvironmentSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetEnvironment@, defined at @SDL3\/SDL_stdinc.h 1672:47@
+getEnvironment :: IO (BG.Ptr SDL_Environment)
+getEnvironment = Unsafe.sDL_GetEnvironment
+
+-- | Get the process environment.
+--
+--     This is initialized at application start and is not affected by setenv() and unsetenv() calls after that point. Use @'setEnvironmentVariable'@ and @'unsetEnvironmentVariable'@ if you want to modify this environment, or @'setenvUnsafe'@ or @'unsetenvUnsafe'@ if you want changes to persist in the C runtime environment after 'SDL3.Sys.Init.quit'.
+--
+--     [Returns]: a pointer to the environment for the process or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironmentVariable', 'getEnvironmentVariables', 'setEnvironmentVariable', 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetEnvironment@.
+--                   The unsafe flavor is 'getEnvironment'
+--                   .
+--
+--     [C declaration]: @SDL_GetEnvironment@, defined at @SDL3\/SDL_stdinc.h 1672:47@
+getEnvironmentSafe :: IO (BG.Ptr SDL_Environment)
+getEnvironmentSafe = Safe.sDL_GetEnvironment
+
+-- | Create a set of environment variables
+--
+--     [Returns]: a pointer to the new environment or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: If @populated@ is false, it is safe to call this function from any thread, otherwise it is safe if no other threads are calling setenv() or unsetenv()
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironmentVariable', 'getEnvironmentVariables', 'setEnvironmentVariable', 'unsetEnvironmentVariable', 'destroyEnvironment'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateEnvironment@.
+--                   The safe flavor is 'createEnvironmentSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateEnvironment@, defined at @SDL3\/SDL_stdinc.h 1694:47@
+createEnvironment
+  :: Bool
+  -- ^
+  --
+  --           [@populated@]: true to initialize it from the C runtime environment, false to create an empty environment.
+  -> IO (BG.Ptr SDL_Environment)
+createEnvironment =
+  \x00 ->
+    Unsafe.sDL_CreateEnvironment (CBool.fromBool x00)
+
+-- | Create a set of environment variables
+--
+--     [Returns]: a pointer to the new environment or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: If @populated@ is false, it is safe to call this function from any thread, otherwise it is safe if no other threads are calling setenv() or unsetenv()
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironmentVariable', 'getEnvironmentVariables', 'setEnvironmentVariable', 'unsetEnvironmentVariable', 'destroyEnvironment'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateEnvironment@.
+--                   The unsafe flavor is 'createEnvironment'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateEnvironment@, defined at @SDL3\/SDL_stdinc.h 1694:47@
+createEnvironmentSafe
+  :: Bool
+  -- ^
+  --
+  --           [@populated@]: true to initialize it from the C runtime environment, false to create an empty environment.
+  -> IO (BG.Ptr SDL_Environment)
+createEnvironmentSafe =
+  \x00 ->
+    Safe.sDL_CreateEnvironment (CBool.fromBool x00)
+
+-- | Get the value of a variable in the environment.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironment', 'createEnvironment', 'getEnvironmentVariables', 'setEnvironmentVariable', 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetEnvironmentVariable@.
+--                   The safe flavor is 'getEnvironmentVariableSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1714:42@
+getEnvironmentVariable
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getEnvironmentVariable =
+  Unsafe.sDL_GetEnvironmentVariable
+
+-- | Get the value of a variable in the environment.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironment', 'createEnvironment', 'getEnvironmentVariables', 'setEnvironmentVariable', 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetEnvironmentVariable@.
+--                   The unsafe flavor is 'getEnvironmentVariable'
+--                   .
+--
+--     [C declaration]: @SDL_GetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1714:42@
+getEnvironmentVariableSafe
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getEnvironmentVariableSafe =
+  Safe.sDL_GetEnvironmentVariable
+
+-- | Get all variables in the environment.
+--
+--     [Returns]: a NULL terminated array of pointers to environment variables in the form \"variable=value\" or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with @'free'@ when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironment', 'createEnvironment', 'getEnvironmentVariables', 'setEnvironmentVariable', 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetEnvironmentVariables@.
+--                   The safe flavor is 'getEnvironmentVariablesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetEnvironmentVariables@, defined at @SDL3\/SDL_stdinc.h 1735:37@
+getEnvironmentVariables
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to query.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+getEnvironmentVariables =
+  Unsafe.sDL_GetEnvironmentVariables
+
+-- | Get all variables in the environment.
+--
+--     [Returns]: a NULL terminated array of pointers to environment variables in the form \"variable=value\" or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with @'free'@ when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironment', 'createEnvironment', 'getEnvironmentVariables', 'setEnvironmentVariable', 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetEnvironmentVariables@.
+--                   The unsafe flavor is 'getEnvironmentVariables'
+--                   .
+--
+--     [C declaration]: @SDL_GetEnvironmentVariables@, defined at @SDL3\/SDL_stdinc.h 1735:37@
+getEnvironmentVariablesSafe
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to query.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+getEnvironmentVariablesSafe =
+  Safe.sDL_GetEnvironmentVariables
+
+-- | Set the value of a variable in the environment.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironment', 'createEnvironment', 'getEnvironmentVariable', 'getEnvironmentVariables', 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetEnvironmentVariable@.
+--                   The safe flavor is 'setEnvironmentVariableSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1759:34@
+setEnvironmentVariable
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the variable to set.
+  -> Bool
+  -- ^
+  --
+  --           [@overwrite@]: true to overwrite the variable if it exists, false to return success without setting the variable if it already exists.
+  -> IO Bool
+setEnvironmentVariable =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_SetEnvironmentVariable x00 x11 x22 (CBool.fromBool x33))
+
+-- | Set the value of a variable in the environment.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironment', 'createEnvironment', 'getEnvironmentVariable', 'getEnvironmentVariables', 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetEnvironmentVariable@.
+--                   The unsafe flavor is 'setEnvironmentVariable'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1759:34@
+setEnvironmentVariableSafe
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the variable to set.
+  -> Bool
+  -- ^
+  --
+  --           [@overwrite@]: true to overwrite the variable if it exists, false to return success without setting the variable if it already exists.
+  -> IO Bool
+setEnvironmentVariableSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_SetEnvironmentVariable x00 x11 x22 (CBool.fromBool x33))
+
+-- | Clear a variable from the environment.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironment', 'createEnvironment', 'getEnvironmentVariable', 'getEnvironmentVariables', 'setEnvironmentVariable', 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnsetEnvironmentVariable@.
+--                   The safe flavor is 'unsetEnvironmentVariableSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UnsetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1780:34@
+unsetEnvironmentVariable
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to unset.
+  -> IO Bool
+unsetEnvironmentVariable =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_UnsetEnvironmentVariable x00 x11)
+
+-- | Clear a variable from the environment.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getEnvironment', 'createEnvironment', 'getEnvironmentVariable', 'getEnvironmentVariables', 'setEnvironmentVariable', 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnsetEnvironmentVariable@.
+--                   The unsafe flavor is 'unsetEnvironmentVariable'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UnsetEnvironmentVariable@, defined at @SDL3\/SDL_stdinc.h 1780:34@
+unsetEnvironmentVariableSafe
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to modify.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to unset.
+  -> IO Bool
+unsetEnvironmentVariableSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_UnsetEnvironmentVariable x00 x11)
+
+-- | Destroy a set of environment variables.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the environment is no longer in use.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createEnvironment'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyEnvironment@.
+--                   The safe flavor is 'destroyEnvironmentSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyEnvironment@, defined at @SDL3\/SDL_stdinc.h 1794:34@
+destroyEnvironment
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to destroy.
+  -> IO ()
+destroyEnvironment = Unsafe.sDL_DestroyEnvironment
+
+-- | Destroy a set of environment variables.
+--
+--     [Thread safety]: It is safe to call this function from any thread, as long as the environment is no longer in use.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createEnvironment'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyEnvironment@.
+--                   The unsafe flavor is 'destroyEnvironment'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyEnvironment@, defined at @SDL3\/SDL_stdinc.h 1794:34@
+destroyEnvironmentSafe
+  :: BG.Ptr SDL_Environment
+  -- ^
+  --
+  --           [@env@]: the environment to destroy.
+  -> IO ()
+destroyEnvironmentSafe = Safe.sDL_DestroyEnvironment
+
+-- | Get the value of a variable in the environment.
+--
+--     This function uses SDL\'s cached copy of the environment and is thread-safe.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_getenv@.
+--                   The safe flavor is 'getenvSafe'
+--                   .
+--
+--     [C declaration]: @SDL_getenv@, defined at @SDL3\/SDL_stdinc.h 1809:42@
+getenv
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getenv = Unsafe.sDL_getenv
+
+-- | Get the value of a variable in the environment.
+--
+--     This function uses SDL\'s cached copy of the environment and is thread-safe.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_getenv@.
+--                   The unsafe flavor is 'getenv'
+--                   .
+--
+--     [C declaration]: @SDL_getenv@, defined at @SDL3\/SDL_stdinc.h 1809:42@
+getenvSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getenvSafe = Safe.sDL_getenv
+
+-- | Get the value of a variable in the environment.
+--
+--     This function bypasses SDL\'s cached copy of the environment and is not thread-safe.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: This function is not thread safe, consider using @'getenv'@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getenv'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_getenv_unsafe@.
+--                   The safe flavor is 'getenvUnsafeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_getenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1828:42@
+getenvUnsafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getenvUnsafe = Unsafe.sDL_getenv_unsafe
+
+-- | Get the value of a variable in the environment.
+--
+--     This function bypasses SDL\'s cached copy of the environment and is not thread-safe.
+--
+--     [Returns]: a pointer to the value of the variable or NULL if it can\'t be found.
+--
+--     [Thread safety]: This function is not thread safe, consider using @'getenv'@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getenv'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_getenv_unsafe@.
+--                   The unsafe flavor is 'getenvUnsafe'
+--                   .
+--
+--     [C declaration]: @SDL_getenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1828:42@
+getenvUnsafeSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to get.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getenvUnsafeSafe = Safe.sDL_getenv_unsafe
+
+-- | Set the value of a variable in the environment.
+--
+--     [Returns]: 0 on success, -1 on error.
+--
+--     [Thread safety]: This function is not thread safe, consider using @'setEnvironmentVariable'@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_setenv_unsafe@.
+--                   The safe flavor is 'setenvUnsafeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_setenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1846:33@
+setenvUnsafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the variable to set.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@overwrite@]: 1 to overwrite the variable if it exists, 0 to return success without setting the variable if it already exists.
+  -> IO BG.Int32
+setenvUnsafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_setenv_unsafe x00 x11 (Coerce.coerce x22))
+
+-- | Set the value of a variable in the environment.
+--
+--     [Returns]: 0 on success, -1 on error.
+--
+--     [Thread safety]: This function is not thread safe, consider using @'setEnvironmentVariable'@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_setenv_unsafe@.
+--                   The unsafe flavor is 'setenvUnsafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_setenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1846:33@
+setenvUnsafeSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to set.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@value@]: the value of the variable to set.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@overwrite@]: 1 to overwrite the variable if it exists, 0 to return success without setting the variable if it already exists.
+  -> IO BG.Int32
+setenvUnsafeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_setenv_unsafe x00 x11 (Coerce.coerce x22))
+
+-- | Clear a variable from the environment.
+--
+--     [Returns]: 0 on success, -1 on error.
+--
+--     [Thread safety]: This function is not thread safe, consider using @'unsetEnvironmentVariable'@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_unsetenv_unsafe@.
+--                   The safe flavor is 'unsetenvUnsafeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_unsetenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1861:33@
+unsetenvUnsafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to unset.
+  -> IO BG.Int32
+unsetenvUnsafe =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_unsetenv_unsafe x00)
+
+-- | Clear a variable from the environment.
+--
+--     [Returns]: 0 on success, -1 on error.
+--
+--     [Thread safety]: This function is not thread safe, consider using @'unsetEnvironmentVariable'@ instead.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'unsetEnvironmentVariable'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_unsetenv_unsafe@.
+--                   The unsafe flavor is 'unsetenvUnsafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_unsetenv_unsafe@, defined at @SDL3\/SDL_stdinc.h 1861:33@
+unsetenvUnsafeSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the variable to unset.
+  -> IO BG.Int32
+unsetenvUnsafeSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_unsetenv_unsafe x00)
+
+-- | Sort an array.
+--
+--     For example:
+--
+--     @
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *a, const void *b)
+--     {
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->n \< B->n) {
+--             return -1;
+--         } else if (B->n \< A->n) {
+--             return 1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 3, \"third\" }, { 1, \"first\" }, { 2, \"second\" }
+--     };
+--
+--     SDL_qsort(values, SDL_arraysize(values), sizeof(values[0]), compare);
+--     @
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bsearchSafe', 'qsortRSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_qsort@.
+--                   The unsafe import is not exported
+--                   : invokes the comparator synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_qsort@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_qsort@, defined at @SDL3\/SDL_stdinc.h 1923:34@
+qsortSafe
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> IO ()
+qsortSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_qsort x00 (Coerce.coerce x11) (Coerce.coerce x22) x33
+
+-- | Perform a binary search on a previously sorted array.
+--
+--     For example:
+--
+--     @
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *a, const void *b)
+--     {
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->n \< B->n) {
+--             return -1;
+--         } else if (B->n \< A->n) {
+--             return 1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 1, \"first\" }, { 2, \"second\" }, { 3, \"third\" }
+--     };
+--     data key = { 2, NULL };
+--
+--     data *result = SDL_bsearch(&key, values, SDL_arraysize(values), sizeof(values[0]), compare);
+--     @
+--
+--     [Returns]: a pointer to the matching element in the array, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bsearchRSafe', 'qsortSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_bsearch@.
+--                   The unsafe import is not exported
+--                   : invokes the comparator synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_bsearch@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_bsearch@, defined at @SDL3\/SDL_stdinc.h 1973:36@
+bsearchSafe
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@key@]: a pointer to a key equal to the element being searched for.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> IO (BG.Ptr BG.Void)
+bsearchSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Safe.sDL_bsearch x00 x11 (Coerce.coerce x22) (Coerce.coerce x33) x44
+
+-- | Sort an array, passing a userdata pointer to the compare function.
+--
+--     For example:
+--
+--     @
+--     typedef enum {
+--         sort_increasing,
+--         sort_decreasing,
+--     } sort_method;
+--
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *userdata, const void *a, const void *b)
+--     {
+--         sort_method method = (sort_method)(uintptr_t)userdata;
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->key \< B->key) {
+--             return (method == sort_increasing) ? -1 : 1;
+--         } else if (B->key \< A->key) {
+--             return (method == sort_increasing) ? 1 : -1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 3, \"third\" }, { 1, \"first\" }, { 2, \"second\" }
+--     };
+--
+--     SDL_qsort_r(values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing);
+--     @
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bsearchRSafe', 'qsortSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_qsort_r@.
+--                   The unsafe import is not exported
+--                   : invokes the comparator synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_qsort_r@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_qsort_r@, defined at @SDL3\/SDL_stdinc.h 2043:34@
+qsortRSafe
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback_r
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to the compare function.
+  -> IO ()
+qsortRSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Safe.sDL_qsort_r x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44
+
+-- | Perform a binary search on a previously sorted array, passing a userdata pointer to the compare function.
+--
+--     For example:
+--
+--     @
+--     typedef enum {
+--         sort_increasing,
+--         sort_decreasing,
+--     } sort_method;
+--
+--     typedef struct {
+--         int key;
+--         const char *string;
+--     } data;
+--
+--     int SDLCALL compare(const void *userdata, const void *a, const void *b)
+--     {
+--         sort_method method = (sort_method)(uintptr_t)userdata;
+--         const data *A = (const data *)a;
+--         const data *B = (const data *)b;
+--
+--         if (A->key \< B->key) {
+--             return (method == sort_increasing) ? -1 : 1;
+--         } else if (B->key \< A->key) {
+--             return (method == sort_increasing) ? 1 : -1;
+--         } else {
+--             return 0;
+--         }
+--     }
+--
+--     data values[] = {
+--         { 1, \"first\" }, { 2, \"second\" }, { 3, \"third\" }
+--     };
+--     data key = { 2, NULL };
+--
+--     data *result = SDL_bsearch_r(&key, values, SDL_arraysize(values), sizeof(values[0]), compare, (const void *)(uintptr_t)sort_increasing);
+--     @
+--
+--     [Returns]: a pointer to the matching element in the array, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'bsearchSafe', 'qsortRSafe'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_bsearch_r@.
+--                   The unsafe import is not exported
+--                   : invokes the comparator synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Stdinc.Unsafe.sDL_bsearch_r@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_bsearch_r@, defined at @SDL3\/SDL_stdinc.h 2101:36@
+bsearchRSafe
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@key@]: a pointer to a key equal to the element being searched for.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@base@]: a pointer to the start of the array.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@nmemb@]: the number of elements in the array.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@size@]: the size of the elements in the array.
+  -> SDL_CompareCallback_r
+  -- ^
+  --
+  --           [@compare@]: a function used to compare elements in the array.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to the compare function.
+  -> IO (BG.Ptr BG.Void)
+bsearchRSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              Safe.sDL_bsearch_r x00 x11 (Coerce.coerce x22) (Coerce.coerce x33) x44 x55
+
+-- | Compute the absolute value of @x@.
+--
+--     [Returns]: the absolute value of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_abs@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_abs@, defined at @SDL3\/SDL_stdinc.h 2113:33@
+abs
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: an integer value.
+  -> IO BG.Int32
+abs =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_abs (Coerce.coerce x00))
+
+-- | Query if a character is alphabetic (a letter).
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values for English \'a-z\' and \'A-Z\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isalpha@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isalpha@, defined at @SDL3\/SDL_stdinc.h 2188:33@
+isalpha
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+isalpha =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isalpha (Coerce.coerce x00))
+
+-- | Query if a character is alphabetic (a letter) or a number.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values for English \'a-z\', \'A-Z\', and \'0-9\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isalnum@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isalnum@, defined at @SDL3\/SDL_stdinc.h 2203:33@
+isalnum
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+isalnum =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isalnum (Coerce.coerce x00))
+
+-- | Report if a character is blank (a space or tab).
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values 0x20 (space) or 0x9 (tab) as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isblank@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isblank@, defined at @SDL3\/SDL_stdinc.h 2218:33@
+isblank
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+isblank =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isblank (Coerce.coerce x00))
+
+-- | Report if a character is a control character.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values 0 through 0x1F, and 0x7F, as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_iscntrl@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_iscntrl@, defined at @SDL3\/SDL_stdinc.h 2233:33@
+iscntrl
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+iscntrl =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_iscntrl (Coerce.coerce x00))
+
+-- | Report if a character is a numeric digit.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'0\' (0x30) through \'9\' (0x39), as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isdigit@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isdigit@, defined at @SDL3\/SDL_stdinc.h 2248:33@
+isdigit
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+isdigit =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isdigit (Coerce.coerce x00))
+
+-- | Report if a character is a hexadecimal digit.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'A\' through \'F\', \'a\' through \'f\', and \'0\' through \'9\', as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isxdigit@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isxdigit@, defined at @SDL3\/SDL_stdinc.h 2263:33@
+isxdigit
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+isxdigit =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isxdigit (Coerce.coerce x00))
+
+-- | Report if a character is a punctuation mark.
+--
+--     __WARNING__: Regardless of system locale, this is equivalent to @((SDL_isgraph(x)) && (!SDL_isalnum(x)))@.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'isgraph', 'isalnum'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ispunct@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ispunct@, defined at @SDL3\/SDL_stdinc.h 2281:33@
+ispunct
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+ispunct =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_ispunct (Coerce.coerce x00))
+
+-- | Report if a character is whitespace.
+--
+--     __WARNING__: Regardless of system locale, this will only treat the following ASCII values as true:
+--
+--     * space (0x20)
+--
+--     * tab (0x09)
+--
+--     * newline (0x0A)
+--
+--     * vertical tab (0x0B)
+--
+--     * form feed (0x0C)
+--
+--     * return (0x0D)
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isspace@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isspace@, defined at @SDL3\/SDL_stdinc.h 2303:33@
+isspace
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+isspace =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isspace (Coerce.coerce x00))
+
+-- | Report if a character is upper case.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'A\' through \'Z\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isupper@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isupper@, defined at @SDL3\/SDL_stdinc.h 2318:33@
+isupper
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+isupper =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isupper (Coerce.coerce x00))
+
+-- | Report if a character is lower case.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \'a\' through \'z\' as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_islower@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_islower@, defined at @SDL3\/SDL_stdinc.h 2333:33@
+islower
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+islower =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_islower (Coerce.coerce x00))
+
+-- | Report if a character is \"printable\".
+--
+--     Be advised that \"printable\" has a definition that goes back to text terminals from the dawn of computing, making this a sort of special case function that is not suitable for Unicode (or most any) text management.
+--
+--     __WARNING__: Regardless of system locale, this will only treat ASCII values \' \' (0x20) through \'~\' (0x7E) as true.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isprint@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isprint@, defined at @SDL3\/SDL_stdinc.h 2352:33@
+isprint
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+isprint =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isprint (Coerce.coerce x00))
+
+-- | Report if a character is any \"printable\" except space.
+--
+--     Be advised that \"printable\" has a definition that goes back to text terminals from the dawn of computing, making this a sort of special case function that is not suitable for Unicode (or most any) text management.
+--
+--     __WARNING__: Regardless of system locale, this is equivalent to @(SDL_isprint(x)) && ((x) != \' \')@.
+--
+--     [Returns]: non-zero if x falls within the character class, zero otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'isprint'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isgraph@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isgraph@, defined at @SDL3\/SDL_stdinc.h 2373:33@
+isgraph
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+isgraph =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isgraph (Coerce.coerce x00))
+
+-- | Convert low-ASCII English letters to uppercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'a\' through \'z\' to uppercase.
+--
+--     This function returns the uppercase equivalent of @x@. If a character cannot be converted, or is already uppercase, this function returns @x@.
+--
+--     [Returns]: capitalized version of x, or x if no conversion available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_toupper@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_toupper@, defined at @SDL3\/SDL_stdinc.h 2391:33@
+toupper
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+toupper =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_toupper (Coerce.coerce x00))
+
+-- | Convert low-ASCII English letters to lowercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to lowercase.
+--
+--     This function returns the lowercase equivalent of @x@. If a character cannot be converted, or is already lowercase, this function returns @x@.
+--
+--     [Returns]: lowercase version of x, or x if no conversion available.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_tolower@.
+--                   The safe import is not exported
+--                   : locale-independent ASCII character classification; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_tolower@, defined at @SDL3\/SDL_stdinc.h 2409:33@
+tolower
+  :: BG.Int32
+  -- ^
+  --
+  --           [@x@]: character value to check.
+  -> IO BG.Int32
+tolower =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_tolower (Coerce.coerce x00))
+
+-- | Calculate a CRC-16 value.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
+--
+--     This function can be called multiple times, to stream data to be checksummed in blocks. Each call must provide the previous CRC-16 return value to be updated with the next block. The first call to this function for a set of blocks should pass in a zero CRC value.
+--
+--     [Returns]: a CRC-16 checksum value of all blocks in the data set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_crc16@.
+--                   The safe flavor is 'crc16Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_crc16@, defined at @SDL3\/SDL_stdinc.h 2430:36@
+crc16
+  :: BG.Word16
+  -- ^
+  --
+  --           [@crc@]: the current checksum for this data set, or 0 for a new data set.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: a new block of data to add to the checksum.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@len@]: the size, in bytes, of the new block of data.
+  -> IO BG.Word16
+crc16 =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_crc16 (Coerce.coerce x00) x11 (Coerce.coerce x22))
+
+-- | Calculate a CRC-16 value.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
+--
+--     This function can be called multiple times, to stream data to be checksummed in blocks. Each call must provide the previous CRC-16 return value to be updated with the next block. The first call to this function for a set of blocks should pass in a zero CRC value.
+--
+--     [Returns]: a CRC-16 checksum value of all blocks in the data set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_crc16@.
+--                   The unsafe flavor is 'crc16'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_crc16@, defined at @SDL3\/SDL_stdinc.h 2430:36@
+crc16Safe
+  :: BG.Word16
+  -- ^
+  --
+  --           [@crc@]: the current checksum for this data set, or 0 for a new data set.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: a new block of data to add to the checksum.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@len@]: the size, in bytes, of the new block of data.
+  -> IO BG.Word16
+crc16Safe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_crc16 (Coerce.coerce x00) x11 (Coerce.coerce x22))
+
+-- | Calculate a CRC-32 value.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
+--
+--     This function can be called multiple times, to stream data to be checksummed in blocks. Each call must provide the previous CRC-32 return value to be updated with the next block. The first call to this function for a set of blocks should pass in a zero CRC value.
+--
+--     [Returns]: a CRC-32 checksum value of all blocks in the data set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_crc32@.
+--                   The safe flavor is 'crc32Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_crc32@, defined at @SDL3\/SDL_stdinc.h 2451:36@
+crc32
+  :: BG.Word32
+  -- ^
+  --
+  --           [@crc@]: the current checksum for this data set, or 0 for a new data set.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: a new block of data to add to the checksum.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@len@]: the size, in bytes, of the new block of data.
+  -> IO BG.Word32
+crc32 =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_crc32 (Coerce.coerce x00) x11 (Coerce.coerce x22))
+
+-- | Calculate a CRC-32 value.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/Cyclic_redundancy_check](https://en.wikipedia.org/wiki/Cyclic_redundancy_check)
+--
+--     This function can be called multiple times, to stream data to be checksummed in blocks. Each call must provide the previous CRC-32 return value to be updated with the next block. The first call to this function for a set of blocks should pass in a zero CRC value.
+--
+--     [Returns]: a CRC-32 checksum value of all blocks in the data set.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_crc32@.
+--                   The unsafe flavor is 'crc32'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_crc32@, defined at @SDL3\/SDL_stdinc.h 2451:36@
+crc32Safe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@crc@]: the current checksum for this data set, or 0 for a new data set.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: a new block of data to add to the checksum.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@len@]: the size, in bytes, of the new block of data.
+  -> IO BG.Word32
+crc32Safe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_crc32 (Coerce.coerce x00) x11 (Coerce.coerce x22))
+
+-- | Calculate a 32-bit MurmurHash3 value for a block of data.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/MurmurHash](https://en.wikipedia.org/wiki/MurmurHash)
+--
+--     A seed may be specified, which changes the final results consistently, but this does not work like 'crc16' and 'crc32': you can\'t feed a previous result from this function back into itself as the next seed value to calculate a hash in chunks; it won\'t produce the same hash as it would if the same data was provided in a single call.
+--
+--     If you aren\'t sure what to provide for a seed, zero is fine. Murmur3 is not cryptographically secure, so it shouldn\'t be used for hashing top-secret data.
+--
+--     [Returns]: a Murmur3 32-bit hash value.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_murmur3_32@.
+--                   The safe flavor is 'murmur3_32Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_murmur3_32@, defined at @SDL3\/SDL_stdinc.h 2477:36@
+murmur3_32
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be hashed.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@len@]: the size of data, in bytes.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@seed@]: a value that alters the final hash value.
+  -> IO BG.Word32
+murmur3_32 =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_murmur3_32 x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Calculate a 32-bit MurmurHash3 value for a block of data.
+--
+--     [https:\/\/en.wikipedia.org\/wiki\/MurmurHash](https://en.wikipedia.org/wiki/MurmurHash)
+--
+--     A seed may be specified, which changes the final results consistently, but this does not work like 'crc16' and 'crc32': you can\'t feed a previous result from this function back into itself as the next seed value to calculate a hash in chunks; it won\'t produce the same hash as it would if the same data was provided in a single call.
+--
+--     If you aren\'t sure what to provide for a seed, zero is fine. Murmur3 is not cryptographically secure, so it shouldn\'t be used for hashing top-secret data.
+--
+--     [Returns]: a Murmur3 32-bit hash value.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_murmur3_32@.
+--                   The unsafe flavor is 'murmur3_32'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_murmur3_32@, defined at @SDL3\/SDL_stdinc.h 2477:36@
+murmur3_32Safe
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@data@]: the data to be hashed.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@len@]: the size of data, in bytes.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@seed@]: a value that alters the final hash value.
+  -> IO BG.Word32
+murmur3_32Safe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_murmur3_32 x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Initialize all 32-bit words of buffer of memory to a specific value.
+--
+--     This function will set a buffer of @dwords@ 'Uint32' values, pointed to by @dst@, to the value specified in @val@.
+--
+--     Unlike SDL_memset, this sets 32-bit values, not bytes, so it\'s not limited to a range of 0-255.
+--
+--     [Returns]: @dst@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_memset4@.
+--                   The safe flavor is 'memset4Safe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_memset4@, defined at @SDL3\/SDL_stdinc.h 2601:36@
+memset4
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: the destination memory region. Must not be NULL.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@val@]: the 'Uint32' value to set.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@dwords@]: the number of 'Uint32' values to set in @dst@.
+  -> IO (BG.Ptr BG.Void)
+memset4 =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_memset4 x00 (Coerce.coerce x11) (Coerce.coerce x22)
+
+-- | Initialize all 32-bit words of buffer of memory to a specific value.
+--
+--     This function will set a buffer of @dwords@ 'Uint32' values, pointed to by @dst@, to the value specified in @val@.
+--
+--     Unlike SDL_memset, this sets 32-bit values, not bytes, so it\'s not limited to a range of 0-255.
+--
+--     [Returns]: @dst@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_memset4@.
+--                   The unsafe flavor is 'memset4'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_memset4@, defined at @SDL3\/SDL_stdinc.h 2601:36@
+memset4Safe
+  :: BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: the destination memory region. Must not be NULL.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@val@]: the 'Uint32' value to set.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@dwords@]: the number of 'Uint32' values to set in @dst@.
+  -> IO (BG.Ptr BG.Void)
+memset4Safe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_memset4 x00 (Coerce.coerce x11) (Coerce.coerce x22)
+
+-- | Compare two buffers of memory.
+--
+--     [Returns]: less than zero if s1 is \"less than\" s2, greater than zero if s1 is \"greater than\" s2, and zero if the buffers match exactly for @len@ bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_memcmp@.
+--                   The safe flavor is 'memcmpSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_memcmp@, defined at @SDL3\/SDL_stdinc.h 2683:33@
+memcmp
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@s1@]: the first buffer to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@s2@]: the second buffer to compare. NULL is not permitted!
+  -> BG.Word64
+  -- ^
+  --
+  --           [@len@]: the number of bytes to compare between the buffers.
+  -> IO BG.Int32
+memcmp =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_memcmp x00 x11 (Coerce.coerce x22))
+
+-- | Compare two buffers of memory.
+--
+--     [Returns]: less than zero if s1 is \"less than\" s2, greater than zero if s1 is \"greater than\" s2, and zero if the buffers match exactly for @len@ bytes.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_memcmp@.
+--                   The unsafe flavor is 'memcmp'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_memcmp@, defined at @SDL3\/SDL_stdinc.h 2683:33@
+memcmpSafe
+  :: PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@s1@]: the first buffer to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@s2@]: the second buffer to compare. NULL is not permitted!
+  -> BG.Word64
+  -- ^
+  --
+  --           [@len@]: the number of bytes to compare between the buffers.
+  -> IO BG.Int32
+memcmpSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Safe.sDL_memcmp x00 x11 (Coerce.coerce x22))
+
+-- | This works exactly like wcslen() but doesn\'t require access to a C runtime.
+--
+--     Counts the number of wchar_t values in @wstr@, excluding the null terminator.
+--
+--     Like 'strlen' only counts bytes and not codepoints in a UTF-8 string, this counts wchar_t values in a string, even if the string\'s encoding is of variable width, like UTF-16.
+--
+--     Also be aware that wchar_t is different sizes on different platforms (4 bytes on Linux, 2 on Windows, etc).
+--
+--     [Returns]: the length (in wchar_t values, excluding the null terminator) of @wstr@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'wcsnlen', 'utf8strlen', 'utf8strnlen'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcslen@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_wcslen@, defined at @SDL3\/SDL_stdinc.h 2710:36@
+wcslen
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@wstr@]: The null-terminated wide string to read. Must not be NULL.
+  -> IO BG.Word64
+wcslen =
+  \x00 -> fmap Coerce.coerce (Unsafe.sDL_wcslen x00)
+
+-- | This works exactly like wcsnlen() but doesn\'t require access to a C runtime.
+--
+--     Counts up to a maximum of @maxlen@ wchar_t values in @wstr@, excluding the null terminator.
+--
+--     Like 'strnlen' only counts bytes and not codepoints in a UTF-8 string, this counts wchar_t values in a string, even if the string\'s encoding is of variable width, like UTF-16.
+--
+--     Also be aware that wchar_t is different sizes on different platforms (4 bytes on Linux, 2 on Windows, etc).
+--
+--     Also, @maxlen@ is a count of wide characters, not bytes!
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of @wstr@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'wcslen', 'utf8strlen', 'utf8strnlen'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcsnlen@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_wcsnlen@, defined at @SDL3\/SDL_stdinc.h 2741:36@
+wcsnlen
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@wstr@]: The null-terminated wide string to read. Must not be NULL.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: The maximum amount of wide characters to count.
+  -> IO BG.Word64
+wcsnlen =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_wcsnlen x00 (Coerce.coerce x11))
+
+-- | Copy a wide string.
+--
+--     This function copies @maxlen@ - 1 wide characters from @src@ to @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ is 0, no wide characters are copied and no null terminator is written.
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'wcslcat'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcslcpy@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_wcslcpy@, defined at @SDL3\/SDL_stdinc.h 2768:36@
+wcslcpy
+  :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@src@]: The null-terminated wide string to copy. Must not be NULL, and must not overlap with @dst@.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: The length (in wide characters) of the destination buffer.
+  -> IO BG.Word64
+wcslcpy =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_wcslcpy x00 x11 (Coerce.coerce x22))
+
+-- | Concatenate wide strings.
+--
+--     This function appends up to @maxlen@ - SDL_wcslen(dst) - 1 wide characters from @src@ to the end of the wide string in @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ - SDL_wcslen(dst) - 1 is less than or equal to 0, then @dst@ is unmodified.
+--
+--     [Returns]: the length (in wide characters, excluding the null terminator) of the string in @dst@ plus the length of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'wcslcpy'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcslcat@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_wcslcat@, defined at @SDL3\/SDL_stdinc.h 2797:36@
+wcslcat
+  :: BG.Ptr HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer already containing the first null-terminated wide string. Must not be NULL and must not overlap with @src@.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@src@]: The second null-terminated wide string. Must not be NULL, and must not overlap with @dst@.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: The length (in wide characters) of the destination buffer.
+  -> IO BG.Word64
+wcslcat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_wcslcat x00 x11 (Coerce.coerce x22))
+
+-- | Allocate a copy of a wide string.
+--
+--     This allocates enough space for a null-terminated copy of @wstr@, using 'malloc', and then makes a copy of the string into this space.
+--
+--     The returned string is owned by the caller, and should be passed to 'free' when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated wide string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcsdup@.
+--                   The safe flavor is 'wcsdupSafe'
+--                   .
+--
+--     [C declaration]: @SDL_wcsdup@, defined at @SDL3\/SDL_stdinc.h 2815:39@
+wcsdup
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@wstr@]: the string to copy.
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+wcsdup = Unsafe.sDL_wcsdup
+
+-- | Allocate a copy of a wide string.
+--
+--     This allocates enough space for a null-terminated copy of @wstr@, using 'malloc', and then makes a copy of the string into this space.
+--
+--     The returned string is owned by the caller, and should be passed to 'free' when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated wide string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_wcsdup@.
+--                   The unsafe flavor is 'wcsdup'
+--                   .
+--
+--     [C declaration]: @SDL_wcsdup@, defined at @SDL3\/SDL_stdinc.h 2815:39@
+wcsdupSafe
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@wstr@]: the string to copy.
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+wcsdupSafe = Safe.sDL_wcsdup
+
+-- | Search a wide string for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string.
+--
+--     Note that this looks for strings of /wide characters/, not /codepoints/, so it\'s legal to search for malformed and incomplete UTF-16 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcsstr@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_wcsstr@, defined at @SDL3\/SDL_stdinc.h 2835:39@
+wcsstr
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@haystack@]: the wide string to search. Must not be NULL.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@needle@]: the wide string to search for. Must not be NULL.
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+wcsstr = Unsafe.sDL_wcsstr
+
+-- | Search a wide string, up to n wide chars, for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator value to end the string, or @maxlen@ wide character have been examined. It is possible to use this function on a wide string without a null terminator.
+--
+--     Note that this looks for strings of /wide characters/, not /codepoints/, so it\'s legal to search for malformed and incomplete UTF-16 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcsnstr@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_wcsnstr@, defined at @SDL3\/SDL_stdinc.h 2860:39@
+wcsnstr
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@haystack@]: the wide string to search. Must not be NULL.
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@needle@]: the wide string to search for. Must not be NULL.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of wide characters to search in @haystack@.
+  -> IO (BG.Ptr HsBindgen.Runtime.LibC.CWchar)
+wcsnstr =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_wcsnstr x00 x11 (Coerce.coerce x22)
+
+-- | Compare two null-terminated wide strings.
+--
+--     This only compares wchar_t values until it hits a null-terminating character; it does not care if the string is well-formed UTF-16 (or UTF-32, depending on your platform\'s wchar_t size), or uses valid Unicode values.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcscmp@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_wcscmp@, defined at @SDL3\/SDL_stdinc.h 2879:33@
+wcscmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.Int32
+wcscmp =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_wcscmp x00 x11)
+
+-- | Compare two wide strings up to a number of wchar_t values.
+--
+--     This only compares wchar_t values; it does not care if the string is well-formed UTF-16 (or UTF-32, depending on your platform\'s wchar_t size), or uses valid Unicode values.
+--
+--     Note that while this function is intended to be used with UTF-16 (or UTF-32, depending on your platform\'s definition of wchar_t), it is comparing raw wchar_t values and not Unicode codepoints: @maxlen@ specifies a wchar_t limit! If the limit lands in the middle of a multi-wchar UTF-16 sequence, it will only compare a portion of the final character.
+--
+--     @maxlen@ specifies a maximum number of wchar_t to compare; if the strings match to this number of wide chars (or both have matched to a null-terminator character before this count), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcsncmp@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_wcsncmp@, defined at @SDL3\/SDL_stdinc.h 2910:33@
+wcsncmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of wchar_t to compare.
+  -> IO BG.Int32
+wcsncmp =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_wcsncmp x00 x11 (Coerce.coerce x22))
+
+-- | Compare two null-terminated wide strings, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Depending on your platform, \"wchar_t\" might be 2 bytes, and expected to be UTF-16 encoded (like Windows), or 4 bytes in UTF-32 format. Since this handles Unicode, it expects the string to be well-formed and not a null-terminated string of arbitrary bytes. Characters that are not valid UTF-16 (or UTF-32) are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcscasecmp@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_wcscasecmp@, defined at @SDL3\/SDL_stdinc.h 2940:33@
+wcscasecmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.Int32
+wcscasecmp =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_wcscasecmp x00 x11)
+
+-- | Compare two wide strings, case-insensitively, up to a number of wchar_t.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Depending on your platform, \"wchar_t\" might be 2 bytes, and expected to be UTF-16 encoded (like Windows), or 4 bytes in UTF-32 format. Since this handles Unicode, it expects the string to be well-formed and not a null-terminated string of arbitrary bytes. Characters that are not valid UTF-16 (or UTF-32) are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     Note that while this function might deal with variable-sized characters, @maxlen@ specifies a /wchar/ limit! If the limit lands in the middle of a multi-byte UTF-16 sequence, it may convert a portion of the final character to one or more Unicode character U+FFFD (REPLACEMENT CHARACTER) so as not to overflow a buffer.
+--
+--     @maxlen@ specifies a maximum number of wchar_t values to compare; if the strings match to this number of wchar_t (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_wcsncasecmp@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_wcsncasecmp@, defined at @SDL3\/SDL_stdinc.h 2982:33@
+wcsncasecmp
+  :: PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst HsBindgen.Runtime.LibC.CWchar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of wchar_t values to compare.
+  -> IO BG.Int32
+wcsncasecmp =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_wcsncasecmp x00 x11 (Coerce.coerce x22))
+
+-- | This works exactly like strlen() but doesn\'t require access to a C runtime.
+--
+--     Counts the bytes in @str@, excluding the null terminator.
+--
+--     If you need the length of a UTF-8 string, consider using @'utf8strlen'@.
+--
+--     [Returns]: the length (in bytes, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'strnlen', 'utf8strlen', 'utf8strnlen'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strlen@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strlen@, defined at @SDL3\/SDL_stdinc.h 3029:36@
+strlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> IO BG.Word64
+strlen =
+  \x00 -> fmap Coerce.coerce (Unsafe.sDL_strlen x00)
+
+-- | This works exactly like strnlen() but doesn\'t require access to a C runtime.
+--
+--     Counts up to a maximum of @maxlen@ bytes in @str@, excluding the null terminator.
+--
+--     If you need the length of a UTF-8 string, consider using @'utf8strnlen'@.
+--
+--     [Returns]: the length (in bytes, excluding the null terminator) of @src@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'strlen', 'utf8strlen', 'utf8strnlen'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strnlen@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strnlen@, defined at @SDL3\/SDL_stdinc.h 3053:36@
+strnlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: The maximum amount of bytes to count.
+  -> IO BG.Word64
+strnlen =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_strnlen x00 (Coerce.coerce x11))
+
+-- | Copy a string.
+--
+--     This function copies up to @maxlen@ - 1 characters from @src@ to @dst@, then appends a null terminator.
+--
+--     If @maxlen@ is 0, no characters are copied and no null terminator is written.
+--
+--     If you want to copy an UTF-8 string but need to ensure that multi-byte sequences are not truncated, consider using @'utf8strlcpy'@.
+--
+--     [Returns]: the length (in characters, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'strlcat', 'utf8strlcpy'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strlcpy@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strlcpy@, defined at @SDL3\/SDL_stdinc.h 3082:36@
+strlcpy
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@src@]: The null-terminated string to copy. Must not be NULL, and must not overlap with @dst@.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: The length (in characters) of the destination buffer.
+  -> IO BG.Word64
+strlcpy =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_strlcpy x00 x11 (Coerce.coerce x22))
+
+-- | Copy an UTF-8 string.
+--
+--     This function copies up to @dst_bytes@ - 1 bytes from @src@ to @dst@ while also ensuring that the string written to @dst@ does not end in a truncated multi-byte sequence. Finally, it appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     Note that unlike @'strlcpy'@, this function returns the number of bytes written, not the length of @src@.
+--
+--     [Returns]: the number of bytes written, excluding the null terminator.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'strlcpy'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_utf8strlcpy@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_utf8strlcpy@, defined at @SDL3\/SDL_stdinc.h 3110:36@
+utf8strlcpy
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer. Must not be NULL, and must not overlap with @src@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@src@]: The null-terminated UTF-8 string to copy. Must not be NULL, and must not overlap with @dst@.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@dst_bytes@]: The length (in bytes) of the destination buffer. Must not be 0.
+  -> IO BG.Word64
+utf8strlcpy =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_utf8strlcpy x00 x11 (Coerce.coerce x22))
+
+-- | Concatenate strings.
+--
+--     This function appends up to @maxlen@ - SDL_strlen(dst) - 1 characters from @src@ to the end of the string in @dst@, then appends a null terminator.
+--
+--     @src@ and @dst@ must not overlap.
+--
+--     If @maxlen@ - SDL_strlen(dst) - 1 is less than or equal to 0, then @dst@ is unmodified.
+--
+--     [Returns]: the length (in characters, excluding the null terminator) of the string in @dst@ plus the length of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'strlcpy'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strlcat@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strlcat@, defined at @SDL3\/SDL_stdinc.h 3138:36@
+strlcat
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: The destination buffer already containing the first null-terminated string. Must not be NULL and must not overlap with @src@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@src@]: The second null-terminated string. Must not be NULL, and must not overlap with @dst@.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: The length (in characters) of the destination buffer.
+  -> IO BG.Word64
+strlcat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_strlcat x00 x11 (Coerce.coerce x22))
+
+-- | Allocate a copy of a string.
+--
+--     This allocates enough space for a null-terminated copy of @str@, using 'malloc', and then makes a copy of the string into this space.
+--
+--     The returned string is owned by the caller, and should be passed to 'free' when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strdup@.
+--                   The safe flavor is 'strdupSafe'
+--                   .
+--
+--     [C declaration]: @SDL_strdup@, defined at @SDL3\/SDL_stdinc.h 3156:47@
+strdup
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to copy.
+  -> IO (BG.Ptr BG.CChar)
+strdup = Unsafe.sDL_strdup
+
+-- | Allocate a copy of a string.
+--
+--     This allocates enough space for a null-terminated copy of @str@, using 'malloc', and then makes a copy of the string into this space.
+--
+--     The returned string is owned by the caller, and should be passed to 'free' when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_strdup@.
+--                   The unsafe flavor is 'strdup'
+--                   .
+--
+--     [C declaration]: @SDL_strdup@, defined at @SDL3\/SDL_stdinc.h 3156:47@
+strdupSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to copy.
+  -> IO (BG.Ptr BG.CChar)
+strdupSafe = Safe.sDL_strdup
+
+-- | Allocate a copy of a string, up to n characters.
+--
+--     This allocates enough space for a null-terminated copy of @str@, up to @maxlen@ bytes, using 'malloc', and then makes a copy of the string into this space.
+--
+--     If the string is longer than @maxlen@ bytes, the returned string will be @maxlen@ bytes long, plus a null-terminator character that isn\'t included in the count.
+--
+--     The returned string is owned by the caller, and should be passed to 'free' when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strndup@.
+--                   The safe flavor is 'strndupSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strndup@, defined at @SDL3\/SDL_stdinc.h 3181:47@
+strndup
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to copy.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the maximum length of the copied string, not counting the null-terminator character.
+  -> IO (BG.Ptr BG.CChar)
+strndup =
+  \x00 ->
+    \x11 -> Unsafe.sDL_strndup x00 (Coerce.coerce x11)
+
+-- | Allocate a copy of a string, up to n characters.
+--
+--     This allocates enough space for a null-terminated copy of @str@, up to @maxlen@ bytes, using 'malloc', and then makes a copy of the string into this space.
+--
+--     If the string is longer than @maxlen@ bytes, the returned string will be @maxlen@ bytes long, plus a null-terminator character that isn\'t included in the count.
+--
+--     The returned string is owned by the caller, and should be passed to 'free' when no longer needed.
+--
+--     [Returns]: a pointer to the newly-allocated string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_strndup@.
+--                   The unsafe flavor is 'strndup'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strndup@, defined at @SDL3\/SDL_stdinc.h 3181:47@
+strndupSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to copy.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the maximum length of the copied string, not counting the null-terminator character.
+  -> IO (BG.Ptr BG.CChar)
+strndupSafe =
+  \x00 ->
+    \x11 -> Safe.sDL_strndup x00 (Coerce.coerce x11)
+
+-- | Reverse a string\'s contents.
+--
+--     This reverses a null-terminated string in-place. Only the content of the string is reversed; the null-terminator character remains at the end of the reversed string.
+--
+--     __WARNING__: This function reverses the /bytes/ of the string, not the codepoints. If @str@ is a UTF-8 string with Unicode codepoints > 127, this will ruin the string data. You should only use this function on strings that are completely comprised of low ASCII characters.
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strrev@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_strrev@, defined at @SDL3\/SDL_stdinc.h 3202:36@
+strrev
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to reverse.
+  -> IO (BG.Ptr BG.CChar)
+strrev = Unsafe.sDL_strrev
+
+-- | Convert a string to uppercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to uppercase.
+--
+--     This function operates on a null-terminated string of bytes even if it is malformed UTF-8! and converts ASCII characters \'a\' through \'z\' to their uppercase equivalents in-place, returning the original @str@ pointer.
+--
+--     [Returns]: the @str@ pointer passed into this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'strlwr'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strupr@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_strupr@, defined at @SDL3\/SDL_stdinc.h 3223:36@
+strupr
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to convert in-place. Can not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+strupr = Unsafe.sDL_strupr
+
+-- | Convert a string to lowercase.
+--
+--     __WARNING__: Regardless of system locale, this will only convert ASCII values \'A\' through \'Z\' to lowercase.
+--
+--     This function operates on a null-terminated string of bytes even if it is malformed UTF-8! and converts ASCII characters \'A\' through \'Z\' to their lowercase equivalents in-place, returning the original @str@ pointer.
+--
+--     [Returns]: the @str@ pointer passed into this function.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'strupr'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strlwr@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_strlwr@, defined at @SDL3\/SDL_stdinc.h 3244:36@
+strlwr
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to convert in-place. Can not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+strlwr = Unsafe.sDL_strlwr
+
+-- | Search a string for the first instance of a specific byte.
+--
+--     The search ends once it finds the requested byte value, or a null terminator byte to end the string.
+--
+--     Note that this looks for /bytes/, not /characters/, so you cannot match against a Unicode codepoint > 255, regardless of character encoding.
+--
+--     [Returns]: a pointer to the first instance of @c@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strchr@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strchr@, defined at @SDL3\/SDL_stdinc.h 3264:36@
+strchr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to search. Must not be NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@c@]: the byte value to search for.
+  -> IO (BG.Ptr BG.CChar)
+strchr =
+  \x00 ->
+    \x11 -> Unsafe.sDL_strchr x00 (Coerce.coerce x11)
+
+-- | Search a string for the last instance of a specific byte.
+--
+--     The search must go until it finds a null terminator byte to end the string.
+--
+--     Note that this looks for /bytes/, not /characters/, so you cannot match against a Unicode codepoint > 255, regardless of character encoding.
+--
+--     [Returns]: a pointer to the last instance of @c@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strrchr@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strrchr@, defined at @SDL3\/SDL_stdinc.h 3283:36@
+strrchr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to search. Must not be NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@c@]: the byte value to search for.
+  -> IO (BG.Ptr BG.CChar)
+strrchr =
+  \x00 ->
+    \x11 -> Unsafe.sDL_strrchr x00 (Coerce.coerce x11)
+
+-- | Search a string for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string.
+--
+--     Note that this looks for strings of /bytes/, not /characters/, so it\'s legal to search for malformed and incomplete UTF-8 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strstr@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_strstr@, defined at @SDL3\/SDL_stdinc.h 3303:36@
+strstr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@haystack@]: the string to search. Must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@needle@]: the string to search for. Must not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+strstr = Unsafe.sDL_strstr
+
+-- | Search a string, up to n bytes, for the first instance of a specific substring.
+--
+--     The search ends once it finds the requested substring, or a null terminator byte to end the string, or @maxlen@ bytes have been examined. It is possible to use this function on a string without a null terminator.
+--
+--     Note that this looks for strings of /bytes/, not /characters/, so it\'s legal to search for malformed and incomplete UTF-8 sequences.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strnstr@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strnstr@, defined at @SDL3\/SDL_stdinc.h 3326:36@
+strnstr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@haystack@]: the string to search. Must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@needle@]: the string to search for. Must not be NULL.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of bytes to search in @haystack@.
+  -> IO (BG.Ptr BG.CChar)
+strnstr =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_strnstr x00 x11 (Coerce.coerce x22)
+
+-- | Search a UTF-8 string for the first instance of a specific substring, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [Returns]: a pointer to the first instance of @needle@ in the string, or NULL if not found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strcasestr@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_strcasestr@, defined at @SDL3\/SDL_stdinc.h 3354:36@
+strcasestr
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@haystack@]: the string to search. Must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@needle@]: the string to search for. Must not be NULL.
+  -> IO (BG.Ptr BG.CChar)
+strcasestr = Unsafe.sDL_strcasestr
+
+-- | This works exactly like strtok_r() but doesn\'t require access to a C runtime.
+--
+--     Break a string up into a series of tokens.
+--
+--     To start tokenizing a new string, @str@ should be the non-NULL address of the string to start tokenizing. Future calls to get the next token from the same string should specify a NULL.
+--
+--     Note that this function will overwrite pieces of @str@ with null chars to split it into tokens. This function cannot be used with const\/read-only strings!
+--
+--     @saveptr@ just needs to point to a @char *@ that can be overwritten; SDL will use this to save tokenizing state between calls. It is initialized if @str@ is non-NULL, and used to resume tokenizing when @str@ is NULL.
+--
+--     [Returns]: A pointer to the next token, or NULL if no tokens remain.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strtok_r@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_strtok_r@, defined at @SDL3\/SDL_stdinc.h 3383:36@
+strtokR
+  :: BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the string to tokenize, or NULL to continue tokenizing.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@delim@]: the delimiter string that separates tokens.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@saveptr@]: pointer to a char *, used for ongoing state.
+  -> IO (BG.Ptr BG.CChar)
+strtokR = Unsafe.sDL_strtok_r
+
+-- | Count the number of codepoints in a UTF-8 string.
+--
+--     Counts the /codepoints/, not /bytes/, in @str@, excluding the null terminator.
+--
+--     If you need to count the bytes in a string instead, consider using @'strlen'@.
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the count by several replacement characters.
+--
+--     [Returns]: The length (in codepoints, excluding the null terminator) of @src@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'utf8strnlen', 'strlen'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_utf8strlen@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_utf8strlen@, defined at @SDL3\/SDL_stdinc.h 3411:36@
+utf8strlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated UTF-8 string to read. Must not be NULL.
+  -> IO BG.Word64
+utf8strlen =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_utf8strlen x00)
+
+-- | Count the number of codepoints in a UTF-8 string, up to n bytes.
+--
+--     Counts the /codepoints/, not /bytes/, in @str@, excluding the null terminator.
+--
+--     If you need to count the bytes in a string instead, consider using @'strnlen'@.
+--
+--     The counting stops at @bytes@ bytes (not codepoints!). This seems counterintuitive, but makes it easy to express the total size of the string\'s buffer.
+--
+--     Since this handles Unicode, it expects the strings to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), so a malformed or incomplete UTF-8 sequence might increase the count by several replacement characters.
+--
+--     [Returns]: The length (in codepoints, excluding the null terminator) of @src@ but never more than @maxlen@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'utf8strlen', 'strnlen'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_utf8strnlen@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_utf8strnlen@, defined at @SDL3\/SDL_stdinc.h 3444:36@
+utf8strnlen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated UTF-8 string to read. Must not be NULL.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@bytes@]: The maximum amount of bytes to count.
+  -> IO BG.Word64
+utf8strnlen =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_utf8strnlen x00 (Coerce.coerce x11))
+
+-- | Convert an integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget possible negative signs, null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'uitoa', @SDL_ltoa@, 'lltoa'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_itoa@.
+--                   The safe import is not exported
+--                   : pure numeric conversion over a short caller buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_itoa@, defined at @SDL3\/SDL_stdinc.h 3472:36@
+itoa
+  :: BG.Int32
+  -- ^
+  --
+  --           [@value@]: the integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+itoa =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_itoa (Coerce.coerce x00) x11 (Coerce.coerce x22)
+
+-- | Convert an unsigned integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'itoa', @SDL_ultoa@, 'ulltoa'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_uitoa@.
+--                   The safe import is not exported
+--                   : pure numeric conversion over a short caller buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_uitoa@, defined at @SDL3\/SDL_stdinc.h 3500:36@
+uitoa
+  :: BG.Word32
+  -- ^
+  --
+  --           [@value@]: the unsigned integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+uitoa =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_uitoa (Coerce.coerce x00) x11 (Coerce.coerce x22)
+
+-- | Convert a long long integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget possible negative signs, null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'ulltoa', 'itoa', @SDL_ltoa@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_lltoa@.
+--                   The safe import is not exported
+--                   : pure numeric conversion over a short caller buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_lltoa@, defined at @SDL3\/SDL_stdinc.h 3586:36@
+lltoa
+  :: BG.Int64
+  -- ^
+  --
+  --           [@value@]: the long long integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+lltoa =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_lltoa (Coerce.coerce x00) x11 (Coerce.coerce x22)
+
+-- | Convert an unsigned long long integer into a string.
+--
+--     This requires a radix to specified for string format. Specifying 10 produces a decimal number, 16 hexadecimal, etc. Must be in the range of 2 to 36.
+--
+--     Note that this function will overflow a buffer if @str@ is not large enough to hold the output! It may be safer to use SDL_snprintf to clamp output, or SDL_asprintf to allocate a buffer. Otherwise, it doesn\'t hurt to allocate much more space than you expect to use (and don\'t forget null terminator bytes, etc).
+--
+--     [Returns]: @str@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lltoa', 'uitoa', @SDL_ultoa@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ulltoa@.
+--                   The safe import is not exported
+--                   : pure numeric conversion over a short caller buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ulltoa@, defined at @SDL3\/SDL_stdinc.h 3614:36@
+ulltoa
+  :: BG.Word64
+  -- ^
+  --
+  --           [@value@]: the unsigned long long integer to convert.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@str@]: the buffer to write the string into.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@radix@]: the radix to use for string generation.
+  -> IO (BG.Ptr BG.CChar)
+ulltoa =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_ulltoa (Coerce.coerce x00) x11 (Coerce.coerce x22)
+
+-- | Parse an @int@ from a string.
+--
+--     The result of calling @SDL_atoi(str)@ is equivalent to @(int)SDL_strtol(str, NULL, 10)@.
+--
+--     [Returns]: the parsed @int@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'atof', @SDL_strtol@, @SDL_strtoul@, 'strtoll', 'strtoull', 'strtod', 'itoa'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_atoi@.
+--                   The safe import is not exported
+--                   : pure numeric conversion over a short caller buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_atoi@, defined at @SDL3\/SDL_stdinc.h 3638:33@
+atoi
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> IO BG.Int32
+atoi =
+  \x00 -> fmap Coerce.coerce (Unsafe.sDL_atoi x00)
+
+-- | Parse a @double@ from a string.
+--
+--     The result of calling @SDL_atof(str)@ is equivalent to @SDL_strtod(str, NULL)@.
+--
+--     [Returns]: the parsed @double@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'atoi', @SDL_strtol@, @SDL_strtoul@, 'strtoll', 'strtoull', 'strtod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_atof@.
+--                   The safe import is not exported
+--                   : pure numeric conversion over a short caller buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_atof@, defined at @SDL3\/SDL_stdinc.h 3660:36@
+atof
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> IO Double
+atof =
+  \x00 -> fmap Coerce.coerce (Unsafe.sDL_atof x00)
+
+-- | Parse a @long long@ from a string.
+--
+--     If @str@ starts with whitespace, then those whitespace characters are skipped before attempting to parse the number.
+--
+--     If the parsed number does not fit inside a @long long@, the result is clamped to the minimum and maximum representable @long long@ values.
+--
+--     [Returns]: the parsed @long long@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'atoi', 'atof', @SDL_strtol@, @SDL_strtoul@, 'strtoull', 'strtod', 'lltoa'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strtoll@.
+--                   The safe import is not exported
+--                   : pure numeric conversion over a short caller buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strtoll@, defined at @SDL3\/SDL_stdinc.h 3762:39@
+strtoll
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@endp@]: If not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@base@]: The base of the integer to read. Supported values are 0 and 2 to 36 inclusive. If 0, the base will be inferred from the number\'s prefix (0x for hexadecimal, 0 for octal, decimal otherwise).
+  -> IO BG.Int64
+strtoll =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_strtoll x00 x11 (Coerce.coerce x22))
+
+-- | Parse an @unsigned long long@ from a string.
+--
+--     If @str@ starts with whitespace, then those whitespace characters are skipped before attempting to parse the number.
+--
+--     If the parsed number does not fit inside an @unsigned long long@, the result is clamped to the maximum representable @unsigned long long@ value.
+--
+--     [Returns]: the parsed @unsigned long long@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'atoi', 'atof', @SDL_strtol@, 'strtoll', @SDL_strtoul@, 'strtod', 'ulltoa'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strtoull@.
+--                   The safe import is not exported
+--                   : pure numeric conversion over a short caller buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strtoull@, defined at @SDL3\/SDL_stdinc.h 3796:48@
+strtoull
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to read. Must not be NULL.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@endp@]: If not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@base@]: The base of the integer to read. Supported values are 0 and 2 to 36 inclusive. If 0, the base will be inferred from the number\'s prefix (0x for hexadecimal, 0 for octal, decimal otherwise).
+  -> IO BG.Word64
+strtoull =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_strtoull x00 x11 (Coerce.coerce x22))
+
+-- | Parse a @double@ from a string.
+--
+--     This function makes fewer guarantees than the C runtime @strtod@:
+--
+--     * Only decimal notation is guaranteed to be supported. The handling of scientific and hexadecimal notation is unspecified.
+--
+--     * Whether or not INF and NAN can be parsed is unspecified.
+--
+--     * The precision of the result is unspecified.
+--
+--     [Returns]: the parsed @double@, or 0 if no number could be parsed.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'atoi', 'atof', @SDL_strtol@, 'strtoll', @SDL_strtoul@, 'strtoull'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strtod@.
+--                   The safe import is not exported
+--                   : pure numeric conversion over a short caller buffer; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strtod@, defined at @SDL3\/SDL_stdinc.h 3826:36@
+strtod
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: the null-terminated string to read. Must not be NULL.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@endp@]: if not NULL, the address of the first invalid character (i.e. the next character after the parsed number) will be written to this pointer.
+  -> IO Double
+strtod =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_strtod x00 x11)
+
+-- | Compare two null-terminated UTF-8 strings.
+--
+--     Due to the nature of UTF-8 encoding, this will work with Unicode strings, since effectively this function just compares bytes until it hits a null-terminating character. Also due to the nature of UTF-8, this can be used with @'qsortSafe'@ to put strings in (roughly) alphabetical order.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strcmp@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strcmp@, defined at @SDL3\/SDL_stdinc.h 3846:33@
+strcmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.Int32
+strcmp =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_strcmp x00 x11)
+
+-- | Compare two UTF-8 strings up to a number of bytes.
+--
+--     Due to the nature of UTF-8 encoding, this will work with Unicode strings, since effectively this function just compares bytes until it hits a null-terminating character. Also due to the nature of UTF-8, this can be used with @'qsortSafe'@ to put strings in (roughly) alphabetical order.
+--
+--     Note that while this function is intended to be used with UTF-8, it is doing a bytewise comparison, and @maxlen@ specifies a /byte/ limit! If the limit lands in the middle of a multi-byte UTF-8 sequence, it will only compare a portion of the final character.
+--
+--     @maxlen@ specifies a maximum number of bytes to compare; if the strings match to this number of bytes (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strncmp@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strncmp@, defined at @SDL3\/SDL_stdinc.h 3876:33@
+strncmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of /bytes/ to compare.
+  -> IO BG.Int32
+strncmp =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_strncmp x00 x11 (Coerce.coerce x22))
+
+-- | Compare two null-terminated UTF-8 strings, case-insensitively.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the string to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strcasecmp@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strcasecmp@, defined at @SDL3\/SDL_stdinc.h 3904:33@
+strcasecmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> IO BG.Int32
+strcasecmp =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_strcasecmp x00 x11)
+
+-- | Compare two UTF-8 strings, case-insensitively, up to a number of bytes.
+--
+--     This will work with Unicode strings, using a technique called \"case-folding\" to handle the vast majority of case-sensitive human languages regardless of system locale. It can deal with expanding values: a German Eszett character can compare against two ASCII \'s\' chars and be considered a match, for example. A notable exception: it does not handle the Turkish \'i\' character; human language is complicated!
+--
+--     Since this handles Unicode, it expects the string to be well-formed UTF-8 and not a null-terminated string of arbitrary bytes. Bytes that are not valid UTF-8 are treated as Unicode character U+FFFD (REPLACEMENT CHARACTER), which is to say two strings of random bits may turn out to match if they convert to the same amount of replacement characters.
+--
+--     Note that while this function is intended to be used with UTF-8, @maxlen@ specifies a /byte/ limit! If the limit lands in the middle of a multi-byte UTF-8 sequence, it may convert a portion of the final character to one or more Unicode character U+FFFD (REPLACEMENT CHARACTER) so as not to overflow a buffer.
+--
+--     @maxlen@ specifies a maximum number of bytes to compare; if the strings match to this number of bytes (or both have matched to a null-terminator character before this number of bytes), they will be considered equal.
+--
+--     [Returns]: less than zero if str1 is \"less than\" str2, greater than zero if str1 is \"greater than\" str2, and zero if the strings match exactly.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strncasecmp@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_strncasecmp@, defined at @SDL3\/SDL_stdinc.h 3944:33@
+strncasecmp
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str1@]: the first string to compare. NULL is not permitted!
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str2@]: the second string to compare. NULL is not permitted!
+  -> BG.Word64
+  -- ^
+  --
+  --           [@maxlen@]: the maximum number of bytes to compare.
+  -> IO BG.Int32
+strncasecmp =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap Coerce.coerce (Unsafe.sDL_strncasecmp x00 x11 (Coerce.coerce x22))
+
+-- | Searches a string for the first occurrence of any character contained in a breakset, and returns a pointer from the string to that character.
+--
+--     [Returns]: A pointer to the location, in str, of the first occurrence of a character present in the breakset, or NULL if none is found.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_strpbrk@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_strpbrk@, defined at @SDL3\/SDL_stdinc.h 3962:36@
+strpbrk
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@str@]: The null-terminated string to be searched. Must not be NULL, and must not overlap with @breakset@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@breakset@]: A null-terminated string containing the list of characters to look for. Must not be NULL, and must not overlap with @str@.
+  -> IO (BG.Ptr BG.CChar)
+strpbrk = Unsafe.sDL_strpbrk
+
+-- | Decode a UTF-8 string, one Unicode codepoint at a time.
+--
+--     This will return the first Unicode codepoint in the UTF-8 encoded string in @*pstr@, and then advance @*pstr@ past any consumed bytes before returning.
+--
+--     It will not access more than @*pslen@ bytes from the string. @*pslen@ will be adjusted, as well, subtracting the number of bytes consumed.
+--
+--     @pslen@ is allowed to be NULL, in which case the string /must/ be NULL-terminated, as the function will blindly read until it sees the NULL char.
+--
+--     if @*pslen@ is zero, it assumes the end of string is reached and returns a zero codepoint regardless of the contents of the string buffer.
+--
+--     If the resulting codepoint is zero (a NULL terminator), or @*pslen@ is zero, it will not advance @*pstr@ or @*pslen@ at all.
+--
+--     Generally this function is called in a loop until it returns zero, adjusting its parameters each iteration.
+--
+--     If an invalid UTF-8 sequence is encountered, this function returns SDL_INVALID_UNICODE_CODEPOINT and advances the string\/length by one byte (which is to say, a multibyte sequence might produce several SDL_INVALID_UNICODE_CODEPOINT returns before it syncs to the next valid UTF-8 sequence).
+--
+--     Several things can generate invalid UTF-8 sequences, including overlong encodings, the use of UTF-16 surrogate values, and truncated data. Please refer to [RFC3629](https://www.ietf.org/rfc/rfc3629.txt) for details.
+--
+--     [Returns]: the first Unicode codepoint in the string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StepUTF8@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StepUTF8@, defined at @SDL3\/SDL_stdinc.h 4022:36@
+stepUTF8
+  :: BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@pstr@]: a pointer to a UTF-8 string pointer to be read and adjusted.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@pslen@]: a pointer to the number of bytes in the string, to be read and adjusted. NULL is allowed.
+  -> IO BG.Word32
+stepUTF8 =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_StepUTF8 x00 x11)
+
+-- | Decode a UTF-8 string in reverse, one Unicode codepoint at a time.
+--
+--     This will go to the start of the previous Unicode codepoint in the string, move @*pstr@ to that location and return that codepoint.
+--
+--     If @*pstr@ is already at the start of the string), it will not advance @*pstr@ at all.
+--
+--     Generally this function is called in a loop until it returns zero, adjusting its parameter each iteration.
+--
+--     If an invalid UTF-8 sequence is encountered, this function returns SDL_INVALID_UNICODE_CODEPOINT.
+--
+--     Several things can generate invalid UTF-8 sequences, including overlong encodings, the use of UTF-16 surrogate values, and truncated data. Please refer to [RFC3629](https://www.ietf.org/rfc/rfc3629.txt) for details.
+--
+--     [Returns]: the previous Unicode codepoint in the string.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StepBackUTF8@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StepBackUTF8@, defined at @SDL3\/SDL_stdinc.h 4053:36@
+stepBackUTF8
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@start@]: a pointer to the beginning of the UTF-8 string.
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@pstr@]: a pointer to a UTF-8 string pointer to be read and adjusted.
+  -> IO BG.Word32
+stepBackUTF8 =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_StepBackUTF8 x00 x11)
+
+-- | Convert a single Unicode codepoint to UTF-8.
+--
+--     The buffer pointed to by @dst@ must be at least 4 bytes long, as this function may generate between 1 and 4 bytes of output.
+--
+--     This function returns the first byte /after/ the newly-written UTF-8 sequence, which is useful for encoding multiple codepoints in a loop, or knowing where to write a NULL-terminator character to end the string (in either case, plan to have a buffer of /more/ than 4 bytes!).
+--
+--     If @codepoint@ is an invalid value (outside the Unicode range, or a UTF-16 surrogate value, etc), this will use U+FFFD (REPLACEMENT CHARACTER) for the codepoint instead, and not set an error.
+--
+--     If @dst@ is NULL, this returns NULL immediately without writing to the pointer and without setting an error.
+--
+--     [Returns]: the first byte past the newly-written UTF-8 sequence.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UCS4ToUTF8@.
+--                   The safe import is not exported
+--                   : string computation over caller memory with no allocation; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UCS4ToUTF8@, defined at @SDL3\/SDL_stdinc.h 4082:36@
+ucs4ToUTF8
+  :: BG.Word32
+  -- ^
+  --
+  --           [@codepoint@]: a Unicode codepoint to convert to UTF-8.
+  -> BG.Ptr BG.CChar
+  -- ^
+  --
+  --           [@dst@]: the location to write the encoded UTF-8. Must point to at least 4 bytes!
+  -> IO (BG.Ptr BG.CChar)
+ucs4ToUTF8 =
+  \x00 ->
+    \x11 -> Unsafe.sDL_UCS4ToUTF8 (Coerce.coerce x00) x11
+
+-- | Seeds the pseudo-random number generator.
+--
+--     Reusing the seed number will cause @'rand'@ to repeat the same stream of \'random\' numbers.
+--
+--     [Thread safety]: This should be called on the same thread that calls @'rand'@
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rand', 'randBits', 'randf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_srand@.
+--                   The safe flavor is 'srandSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_srand@, defined at @SDL3\/SDL_stdinc.h 4294:34@
+srand
+  :: BG.Word64
+  -- ^
+  --
+  --           [@seed@]: the value to use as a random number seed, or 0 to use 'SDL3.Sys.Timer.getPerformanceCounter'.
+  -> IO ()
+srand = \x00 -> Unsafe.sDL_srand (Coerce.coerce x00)
+
+-- | Seeds the pseudo-random number generator.
+--
+--     Reusing the seed number will cause @'rand'@ to repeat the same stream of \'random\' numbers.
+--
+--     [Thread safety]: This should be called on the same thread that calls @'rand'@
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rand', 'randBits', 'randf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_srand@.
+--                   The unsafe flavor is 'srand'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_srand@, defined at @SDL3\/SDL_stdinc.h 4294:34@
+srandSafe
+  :: BG.Word64
+  -- ^
+  --
+  --           [@seed@]: the value to use as a random number seed, or 0 to use 'SDL3.Sys.Timer.getPerformanceCounter'.
+  -> IO ()
+srandSafe =
+  \x00 -> Safe.sDL_srand (Coerce.coerce x00)
+
+-- | Generate a pseudo-random number less than n for positive n
+--
+--     The method used is faster and of better quality than @rand() % n@. Odds are roughly 99.9% even for n = 1 million. Evenness is better for smaller n, and much worse as n gets bigger.
+--
+--     Example: to simulate a d6 use @SDL_rand(6) + 1@ The +1 converts 0..5 to 1..6
+--
+--     If you want to generate a pseudo-random number in the full range of 'Sint32', you should use: ('Sint32') @'randBits'@
+--
+--     If you want reproducible output, be sure to initialize with @'srand'@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0 .. n-1].
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'srand', 'randf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_rand@.
+--                   The safe flavor is 'randSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_rand@, defined at @SDL3\/SDL_stdinc.h 4328:36@
+rand
+  :: BG.Int32
+  -- ^
+  --
+  --           [@n@]: the number of possible outcomes. n must be positive.
+  -> IO BG.Int32
+rand =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_rand (Coerce.coerce x00))
+
+-- | Generate a pseudo-random number less than n for positive n
+--
+--     The method used is faster and of better quality than @rand() % n@. Odds are roughly 99.9% even for n = 1 million. Evenness is better for smaller n, and much worse as n gets bigger.
+--
+--     Example: to simulate a d6 use @SDL_rand(6) + 1@ The +1 converts 0..5 to 1..6
+--
+--     If you want to generate a pseudo-random number in the full range of 'Sint32', you should use: ('Sint32') @'randBits'@
+--
+--     If you want reproducible output, be sure to initialize with @'srand'@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0 .. n-1].
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'srand', 'randf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_rand@.
+--                   The unsafe flavor is 'rand'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_rand@, defined at @SDL3\/SDL_stdinc.h 4328:36@
+randSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@n@]: the number of possible outcomes. n must be positive.
+  -> IO BG.Int32
+randSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_rand (Coerce.coerce x00))
+
+-- | Generate a uniform pseudo-random floating point number less than 1.0
+--
+--     If you want reproducible output, be sure to initialize with @'srand'@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0.0, 1.0).
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'srand', 'rand'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_randf@.
+--                   The safe flavor is 'randfSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_randf@, defined at @SDL3\/SDL_stdinc.h 4351:35@
+randf :: IO Float
+randf = fmap Coerce.coerce Unsafe.sDL_randf
+
+-- | Generate a uniform pseudo-random floating point number less than 1.0
+--
+--     If you want reproducible output, be sure to initialize with @'srand'@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0.0, 1.0).
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'srand', 'rand'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_randf@.
+--                   The unsafe flavor is 'randf'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_randf@, defined at @SDL3\/SDL_stdinc.h 4351:35@
+randfSafe :: IO Float
+randfSafe = fmap Coerce.coerce Safe.sDL_randf
+
+-- | Generate 32 pseudo-random bits.
+--
+--     You likely want to use @'rand'@ to get a psuedo-random number instead.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0-SDL_MAX_UINT32].
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rand', 'randf', 'srand'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_rand_bits@.
+--                   The safe flavor is 'randBitsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_rand_bits@, defined at @SDL3\/SDL_stdinc.h 4374:36@
+randBits :: IO BG.Word32
+randBits = fmap Coerce.coerce Unsafe.sDL_rand_bits
+
+-- | Generate 32 pseudo-random bits.
+--
+--     You likely want to use @'rand'@ to get a psuedo-random number instead.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0-SDL_MAX_UINT32].
+--
+--     [Thread safety]: All calls should be made from a single thread
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rand', 'randf', 'srand'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_rand_bits@.
+--                   The unsafe flavor is 'randBits'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_rand_bits@, defined at @SDL3\/SDL_stdinc.h 4374:36@
+randBitsSafe :: IO BG.Word32
+randBitsSafe = fmap Coerce.coerce Safe.sDL_rand_bits
+
+-- | Generate a pseudo-random number less than n for positive n
+--
+--     The method used is faster and of better quality than @rand() % n@. Odds are roughly 99.9% even for n = 1 million. Evenness is better for smaller n, and much worse as n gets bigger.
+--
+--     Example: to simulate a d6 use @SDL_rand_r(state, 6) + 1@ The +1 converts 0..5 to 1..6
+--
+--     If you want to generate a pseudo-random number in the full range of 'Sint32', you should use: ('Sint32')SDL_rand_bits_r(state)
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0 .. n-1].
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rand', 'randBitsR', 'randfR'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_rand_r@.
+--                   The safe flavor is 'randRSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_rand_r@, defined at @SDL3\/SDL_stdinc.h 4409:36@
+randR
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@n@]: the number of possible outcomes. n must be positive.
+  -> IO BG.Int32
+randR =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_rand_r x00 (Coerce.coerce x11))
+
+-- | Generate a pseudo-random number less than n for positive n
+--
+--     The method used is faster and of better quality than @rand() % n@. Odds are roughly 99.9% even for n = 1 million. Evenness is better for smaller n, and much worse as n gets bigger.
+--
+--     Example: to simulate a d6 use @SDL_rand_r(state, 6) + 1@ The +1 converts 0..5 to 1..6
+--
+--     If you want to generate a pseudo-random number in the full range of 'Sint32', you should use: ('Sint32')SDL_rand_bits_r(state)
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0 .. n-1].
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'rand', 'randBitsR', 'randfR'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_rand_r@.
+--                   The unsafe flavor is 'randR'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_rand_r@, defined at @SDL3\/SDL_stdinc.h 4409:36@
+randRSafe
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@n@]: the number of possible outcomes. n must be positive.
+  -> IO BG.Int32
+randRSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_rand_r x00 (Coerce.coerce x11))
+
+-- | Generate a uniform pseudo-random floating point number less than 1.0
+--
+--     If you want reproducible output, be sure to initialize with @'srand'@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0.0, 1.0).
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'randBitsR', 'randR', 'randf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_randf_r@.
+--                   The safe flavor is 'randfRSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_randf_r@, defined at @SDL3\/SDL_stdinc.h 4436:35@
+randfR
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> IO Float
+randfR =
+  \x00 -> fmap Coerce.coerce (Unsafe.sDL_randf_r x00)
+
+-- | Generate a uniform pseudo-random floating point number less than 1.0
+--
+--     If you want reproducible output, be sure to initialize with @'srand'@ first.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0.0, 1.0).
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'randBitsR', 'randR', 'randf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_randf_r@.
+--                   The unsafe flavor is 'randfR'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_randf_r@, defined at @SDL3\/SDL_stdinc.h 4436:35@
+randfRSafe
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> IO Float
+randfRSafe =
+  \x00 -> fmap Coerce.coerce (Safe.sDL_randf_r x00)
+
+-- | Generate 32 pseudo-random bits.
+--
+--     You likely want to use @'randR'@ to get a psuedo-random number instead.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0-SDL_MAX_UINT32].
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'randR', 'randfR'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_rand_bits_r@.
+--                   The safe flavor is 'randBitsRSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_rand_bits_r@, defined at @SDL3\/SDL_stdinc.h 4461:36@
+randBitsR
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> IO BG.Word32
+randBitsR =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_rand_bits_r x00)
+
+-- | Generate 32 pseudo-random bits.
+--
+--     You likely want to use @'randR'@ to get a psuedo-random number instead.
+--
+--     There are no guarantees as to the quality of the random sequence produced, and this should not be used for security (cryptography, passwords) or where money is on the line (loot-boxes, casinos). There are many random number libraries available with different characteristics and you should pick one of those to meet any serious needs.
+--
+--     [Returns]: a random value in the range of [0-SDL_MAX_UINT32].
+--
+--     [Thread safety]: This function is thread-safe, as long as the state pointer isn\'t shared between threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'randR', 'randfR'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_rand_bits_r@.
+--                   The unsafe flavor is 'randBitsR'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_rand_bits_r@, defined at @SDL3\/SDL_stdinc.h 4461:36@
+randBitsRSafe
+  :: BG.Ptr Uint64
+  -- ^
+  --
+  --           [@state@]: a pointer to the current random number state, this may not be NULL.
+  -> IO BG.Word32
+randBitsRSafe =
+  \x00 -> fmap Coerce.coerce (Safe.sDL_rand_bits_r x00)
+
+-- | Compute the arc cosine of @x@.
+--
+--     The definition of @y = acos(x)@ is @x = cos(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @0 \<= y \<= Pi@
+--
+--     This function operates on double-precision floating point values, use 'acosf' for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc cosine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'acosf', 'asin', 'cos'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_acos@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_acos@, defined at @SDL3\/SDL_stdinc.h 4515:36@
+acos
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Double
+acos =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_acos (Coerce.coerce x00))
+
+-- | Compute the arc cosine of @x@.
+--
+--     The definition of @y = acos(x)@ is @x = cos(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @0 \<= y \<= Pi@
+--
+--     This function operates on single-precision floating point values, use 'acos' for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc cosine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'acos', 'asinf', 'cosf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_acosf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_acosf@, defined at @SDL3\/SDL_stdinc.h 4545:35@
+acosf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Float
+acosf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_acosf (Coerce.coerce x00))
+
+-- | Compute the arc sine of @x@.
+--
+--     The definition of @y = asin(x)@ is @x = sin(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on double-precision floating point values, use 'asinf' for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc sine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'asinf', 'acos', 'sin'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_asin@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_asin@, defined at @SDL3\/SDL_stdinc.h 4575:36@
+asin
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Double
+asin =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_asin (Coerce.coerce x00))
+
+-- | Compute the arc sine of @x@.
+--
+--     The definition of @y = asin(x)@ is @x = sin(y)@.
+--
+--     Domain: @-1 \<= x \<= 1@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on single-precision floating point values, use 'asin' for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc sine of @x@, in radians.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'asin', 'acosf', 'sinf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_asinf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_asinf@, defined at @SDL3\/SDL_stdinc.h 4605:35@
+asinf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Float
+asinf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_asinf (Coerce.coerce x00))
+
+-- | Compute the arc tangent of @x@.
+--
+--     The definition of @y = atan(x)@ is @x = tan(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on double-precision floating point values, use 'atanf' for single-precision floats.
+--
+--     To calculate the arc tangent of y \/ x, use 'atan2'.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @x@ in radians, or 0 if @x = 0@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'atanf', 'atan2', 'tan'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_atan@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_atan@, defined at @SDL3\/SDL_stdinc.h 4637:36@
+atan
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Double
+atan =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_atan (Coerce.coerce x00))
+
+-- | Compute the arc tangent of @x@.
+--
+--     The definition of @y = atan(x)@ is @x = tan(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-Pi\/2 \<= y \<= Pi\/2@
+--
+--     This function operates on single-precision floating point values, use 'atan' for dboule-precision floats.
+--
+--     To calculate the arc tangent of y \/ x, use 'atan2f'.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @x@ in radians, or 0 if @x = 0@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'atan', 'atan2f', 'tanf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_atanf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_atanf@, defined at @SDL3\/SDL_stdinc.h 4669:35@
+atanf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Float
+atanf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_atanf (Coerce.coerce x00))
+
+-- | Compute the arc tangent of @y \/ x@, using the signs of x and y to adjust the result\'s quadrant.
+--
+--     The definition of @z = atan2(x, y)@ is @y = x tan(z)@, where the quadrant of z is determined based on the signs of x and y.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-Pi \<= y \<= Pi@
+--
+--     This function operates on double-precision floating point values, use 'atan2f' for single-precision floats.
+--
+--     To calculate the arc tangent of a single value, use 'atan'.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @y \/ x@ in radians, or, if @x = 0@, either @-Pi\/2@, @0@, or @Pi\/2@, depending on the value of @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'atan2f', 'atan', 'tan'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_atan2@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_atan2@, defined at @SDL3\/SDL_stdinc.h 4705:36@
+atan2
+  :: Double
+  -- ^
+  --
+  --           [@y@]: floating point value of the numerator (y coordinate).
+  -> Double
+  -- ^
+  --
+  --           [@x@]: floating point value of the denominator (x coordinate).
+  -> IO Double
+atan2 =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_atan2 (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Compute the arc tangent of @y \/ x@, using the signs of x and y to adjust the result\'s quadrant.
+--
+--     The definition of @z = atan2(x, y)@ is @y = x tan(z)@, where the quadrant of z is determined based on the signs of x and y.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-Pi \<= y \<= Pi@
+--
+--     This function operates on single-precision floating point values, use 'atan2' for double-precision floats.
+--
+--     To calculate the arc tangent of a single value, use 'atanf'.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: arc tangent of of @y \/ x@ in radians, or, if @x = 0@, either @-Pi\/2@, @0@, or @Pi\/2@, depending on the value of @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'atan2', 'atan', 'tan'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_atan2f@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_atan2f@, defined at @SDL3\/SDL_stdinc.h 4741:35@
+atan2f
+  :: Float
+  -- ^
+  --
+  --           [@y@]: floating point value of the numerator (y coordinate).
+  -> Float
+  -- ^
+  --
+  --           [@x@]: floating point value of the denominator (x coordinate).
+  -> IO Float
+atan2f =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_atan2f (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Compute the ceiling of @x@.
+--
+--     The ceiling of @x@ is the smallest integer @y@ such that @y >= x@, i.e @x@ rounded up to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use 'ceilf' for single-precision floats.
+--
+--     [Returns]: the ceiling of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'ceilf', 'floor', 'trunc', 'round', @SDL_lround@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ceil@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ceil@, defined at @SDL3\/SDL_stdinc.h 4769:36@
+ceil
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Double
+ceil =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_ceil (Coerce.coerce x00))
+
+-- | Compute the ceiling of @x@.
+--
+--     The ceiling of @x@ is the smallest integer @y@ such that @y >= x@, i.e @x@ rounded up to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use 'ceil' for double-precision floats.
+--
+--     [Returns]: the ceiling of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'ceil', 'floorf', 'truncf', 'roundf', @SDL_lroundf@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ceilf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ceilf@, defined at @SDL3\/SDL_stdinc.h 4797:35@
+ceilf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Float
+ceilf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_ceilf (Coerce.coerce x00))
+
+-- | Copy the sign of one floating-point value to another.
+--
+--     The definition of copysign is that @copysign(x, y) = abs(x) * sign(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= f@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     This function operates on double-precision floating point values, use 'copysignf' for single-precision floats.
+--
+--     [Returns]: the floating point value with the sign of y and the magnitude of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'copysignf', 'fabs'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_copysign@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_copysign@, defined at @SDL3\/SDL_stdinc.h 4823:36@
+copysign
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> Double
+  -- ^
+  --
+  --           [@y@]: floating point value to use as the sign.
+  -> IO Double
+copysign =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_copysign (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Copy the sign of one floating-point value to another.
+--
+--     The definition of copysign is that @copysign(x, y) = abs(x) * sign(y)@.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= f@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     This function operates on single-precision floating point values, use 'copysign' for double-precision floats.
+--
+--     [Returns]: the floating point value with the sign of y and the magnitude of x.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'copysign', 'fabsf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_copysignf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_copysignf@, defined at @SDL3\/SDL_stdinc.h 4849:35@
+copysignf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: floating point value to use as the sign.
+  -> IO Float
+copysignf =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_copysignf (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Compute the cosine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on double-precision floating point values, use 'cosf' for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: cosine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'cosf', 'acos', 'sin'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_cos@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_cos@, defined at @SDL3\/SDL_stdinc.h 4877:36@
+cos
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO Double
+cos =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_cos (Coerce.coerce x00))
+
+-- | Compute the cosine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on single-precision floating point values, use 'cos' for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: cosine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'cos', 'acosf', 'sinf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_cosf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_cosf@, defined at @SDL3\/SDL_stdinc.h 4905:35@
+cosf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO Float
+cosf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_cosf (Coerce.coerce x00))
+
+-- | Compute the exponential of @x@.
+--
+--     The definition of @y = exp(x)@ is @y = e^x@, where @e@ is the base of the natural logarithm. The inverse is the natural logarithm, 'log'.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     The output will overflow if @exp(x)@ is too large to be represented.
+--
+--     This function operates on double-precision floating point values, use 'expf' for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: value of @e^x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'expf', 'log'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_exp@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_exp@, defined at @SDL3\/SDL_stdinc.h 4937:36@
+exp
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Double
+exp =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_exp (Coerce.coerce x00))
+
+-- | Compute the exponential of @x@.
+--
+--     The definition of @y = exp(x)@ is @y = e^x@, where @e@ is the base of the natural logarithm. The inverse is the natural logarithm, 'logf'.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     The output will overflow if @exp(x)@ is too large to be represented.
+--
+--     This function operates on single-precision floating point values, use 'exp' for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: value of @e^x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'exp', 'logf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_expf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_expf@, defined at @SDL3\/SDL_stdinc.h 4969:35@
+expf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Float
+expf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_expf (Coerce.coerce x00))
+
+-- | Compute the absolute value of @x@
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use 'fabsf' for single-precision floats.
+--
+--     [Returns]: the absolute value of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'fabsf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_fabs@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_fabs@, defined at @SDL3\/SDL_stdinc.h 4990:36@
+fabs
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> IO Double
+fabs =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_fabs (Coerce.coerce x00))
+
+-- | Compute the absolute value of @x@
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use 'fabs' for double-precision floats.
+--
+--     [Returns]: the absolute value of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'fabs'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_fabsf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_fabsf@, defined at @SDL3\/SDL_stdinc.h 5011:35@
+fabsf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value to use as the magnitude.
+  -> IO Float
+fabsf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_fabsf (Coerce.coerce x00))
+
+-- | Compute the floor of @x@.
+--
+--     The floor of @x@ is the largest integer @y@ such that @y \<= x@, i.e @x@ rounded down to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use 'floorf' for single-precision floats.
+--
+--     [Returns]: the floor of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'floorf', 'ceil', 'trunc', 'round', @SDL_lround@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_floor@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_floor@, defined at @SDL3\/SDL_stdinc.h 5039:36@
+floor
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Double
+floor =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_floor (Coerce.coerce x00))
+
+-- | Compute the floor of @x@.
+--
+--     The floor of @x@ is the largest integer @y@ such that @y \<= x@, i.e @x@ rounded down to the nearest integer.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use 'floor' for double-precision floats.
+--
+--     [Returns]: the floor of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'floor', 'ceilf', 'truncf', 'roundf', @SDL_lroundf@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_floorf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_floorf@, defined at @SDL3\/SDL_stdinc.h 5067:35@
+floorf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Float
+floorf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_floorf (Coerce.coerce x00))
+
+-- | Truncate @x@ to an integer.
+--
+--     Rounds @x@ to the next closest integer to 0. This is equivalent to removing the fractional part of @x@, leaving only the integer part.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use 'truncf' for single-precision floats.
+--
+--     [Returns]: @x@ truncated to an integer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'truncf', 'fmod', 'ceil', 'floor', 'round', @SDL_lround@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_trunc@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_trunc@, defined at @SDL3\/SDL_stdinc.h 5096:36@
+trunc
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Double
+trunc =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_trunc (Coerce.coerce x00))
+
+-- | Truncate @x@ to an integer.
+--
+--     Rounds @x@ to the next closest integer to 0. This is equivalent to removing the fractional part of @x@, leaving only the integer part.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use 'trunc' for double-precision floats.
+--
+--     [Returns]: @x@ truncated to an integer.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'trunc', 'fmodf', 'ceilf', 'floorf', 'roundf', @SDL_lroundf@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_truncf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_truncf@, defined at @SDL3\/SDL_stdinc.h 5125:35@
+truncf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Float
+truncf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_truncf (Coerce.coerce x00))
+
+-- | Return the floating-point remainder of @x \/ y@
+--
+--     Divides @x@ by @y@, and returns the remainder.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@, @y != 0@
+--
+--     Range: @-y \<= z \<= y@
+--
+--     This function operates on double-precision floating point values, use 'fmodf' for single-precision floats.
+--
+--     [Returns]: the remainder of @x \/ y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'fmodf', 'modf', 'trunc', 'ceil', 'floor', 'round', @SDL_lround@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_fmod@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_fmod@, defined at @SDL3\/SDL_stdinc.h 5155:36@
+fmod
+  :: Double
+  -- ^
+  --
+  --           [@x@]: the numerator.
+  -> Double
+  -- ^
+  --
+  --           [@y@]: the denominator. Must not be 0.
+  -> IO Double
+fmod =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_fmod (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Return the floating-point remainder of @x \/ y@
+--
+--     Divides @x@ by @y@, and returns the remainder.
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@, @y != 0@
+--
+--     Range: @-y \<= z \<= y@
+--
+--     This function operates on single-precision floating point values, use 'fmod' for double-precision floats.
+--
+--     [Returns]: the remainder of @x \/ y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'fmod', 'truncf', 'modff', 'ceilf', 'floorf', 'roundf', @SDL_lroundf@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_fmodf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_fmodf@, defined at @SDL3\/SDL_stdinc.h 5185:35@
+fmodf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: the numerator.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the denominator. Must not be 0.
+  -> IO Float
+fmodf =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_fmodf (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Return whether the value is infinity.
+--
+--     [Returns]: non-zero if the value is infinity, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'isinff'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isinf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isinf@, defined at @SDL3\/SDL_stdinc.h 5199:33@
+isinf
+  :: Double
+  -- ^
+  --
+  --           [@x@]: double-precision floating point value.
+  -> IO BG.Int32
+isinf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isinf (Coerce.coerce x00))
+
+-- | Return whether the value is infinity.
+--
+--     [Returns]: non-zero if the value is infinity, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'isinf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isinff@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isinff@, defined at @SDL3\/SDL_stdinc.h 5213:33@
+isinff
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.Int32
+isinff =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isinff (Coerce.coerce x00))
+
+-- | Return whether the value is NaN.
+--
+--     [Returns]: non-zero if the value is NaN, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'isnanf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isnan@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isnan@, defined at @SDL3\/SDL_stdinc.h 5227:33@
+isnan
+  :: Double
+  -- ^
+  --
+  --           [@x@]: double-precision floating point value.
+  -> IO BG.Int32
+isnan =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isnan (Coerce.coerce x00))
+
+-- | Return whether the value is NaN.
+--
+--     [Returns]: non-zero if the value is NaN, 0 otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'isnan'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_isnanf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_isnanf@, defined at @SDL3\/SDL_stdinc.h 5241:33@
+isnanf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO BG.Int32
+isnanf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_isnanf (Coerce.coerce x00))
+
+-- | Compute the natural logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on double-precision floating point values, use 'logf' for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the natural logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'logf', 'log10', 'exp'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_log@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_log@, defined at @SDL3\/SDL_stdinc.h 5271:36@
+log
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO Double
+log =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_log (Coerce.coerce x00))
+
+-- | Compute the natural logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on single-precision floating point values, use 'log' for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the natural logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'log', 'expf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_logf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_logf@, defined at @SDL3\/SDL_stdinc.h 5300:35@
+logf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO Float
+logf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_logf (Coerce.coerce x00))
+
+-- | Compute the base-10 logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on double-precision floating point values, use 'log10f' for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'log10f', 'log', 'pow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_log10@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_log10@, defined at @SDL3\/SDL_stdinc.h 5330:36@
+log10
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO Double
+log10 =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_log10 (Coerce.coerce x00))
+
+-- | Compute the base-10 logarithm of @x@.
+--
+--     Domain: @0 \< x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     It is an error for @x@ to be less than or equal to 0.
+--
+--     This function operates on single-precision floating point values, use 'log10' for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: the logarithm of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'log10', 'logf', 'powf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_log10f@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_log10f@, defined at @SDL3\/SDL_stdinc.h 5360:35@
+log10f
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than 0.
+  -> IO Float
+log10f =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_log10f (Coerce.coerce x00))
+
+-- | Split @x@ into integer and fractional parts
+--
+--     This function operates on double-precision floating point values, use 'modff' for single-precision floats.
+--
+--     [Returns]: the fractional part of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'modff', 'trunc', 'fmod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_modf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_modf@, defined at @SDL3\/SDL_stdinc.h 5380:36@
+modf
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> BG.Ptr BG.CDouble
+  -- ^
+  --
+  --           [@y@]: output pointer to store the integer part of @x@.
+  -> IO Double
+modf =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_modf (Coerce.coerce x00) x11)
+
+-- | Split @x@ into integer and fractional parts
+--
+--     This function operates on single-precision floating point values, use 'modf' for double-precision floats.
+--
+--     [Returns]: the fractional part of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'modf', 'truncf', 'fmodf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_modff@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_modff@, defined at @SDL3\/SDL_stdinc.h 5400:35@
+modff
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@y@]: output pointer to store the integer part of @x@.
+  -> IO Float
+modff =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_modff (Coerce.coerce x00) x11)
+
+-- | Raise @x@ to the power @y@
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     If @y@ is the base of the natural logarithm (e), consider using 'exp' instead.
+--
+--     This function operates on double-precision floating point values, use 'powf' for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: @x@ raised to the power @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'powf', 'exp', 'log'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_pow@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_pow@, defined at @SDL3\/SDL_stdinc.h 5432:36@
+pow
+  :: Double
+  -- ^
+  --
+  --           [@x@]: the base.
+  -> Double
+  -- ^
+  --
+  --           [@y@]: the exponent.
+  -> IO Double
+pow =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_pow (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Raise @x@ to the power @y@
+--
+--     Domain: @-INF \<= x \<= INF@, @-INF \<= y \<= INF@
+--
+--     Range: @-INF \<= z \<= INF@
+--
+--     If @y@ is the base of the natural logarithm (e), consider using 'exp' instead.
+--
+--     This function operates on single-precision floating point values, use 'pow' for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: @x@ raised to the power @y@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'pow', 'expf', 'logf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_powf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_powf@, defined at @SDL3\/SDL_stdinc.h 5464:35@
+powf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: the base.
+  -> Float
+  -- ^
+  --
+  --           [@y@]: the exponent.
+  -> IO Float
+powf =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_powf (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Round @x@ to the nearest integer.
+--
+--     Rounds @x@ to the nearest integer. Values halfway between integers will be rounded away from zero.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on double-precision floating point values, use 'roundf' for single-precision floats. To get the result as an integer type, use SDL_lround.
+--
+--     [Returns]: the nearest integer to @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'roundf', @SDL_lround@, 'floor', 'ceil', 'trunc'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_round@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_round@, defined at @SDL3\/SDL_stdinc.h 5493:36@
+round
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Double
+round =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_round (Coerce.coerce x00))
+
+-- | Round @x@ to the nearest integer.
+--
+--     Rounds @x@ to the nearest integer. Values halfway between integers will be rounded away from zero.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@, y integer
+--
+--     This function operates on single-precision floating point values, use 'round' for double-precision floats. To get the result as an integer type, use SDL_lroundf.
+--
+--     [Returns]: the nearest integer to @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'round', @SDL_lroundf@, 'floorf', 'ceilf', 'truncf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_roundf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_roundf@, defined at @SDL3\/SDL_stdinc.h 5522:35@
+roundf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value.
+  -> IO Float
+roundf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_roundf (Coerce.coerce x00))
+
+-- | Scale @x@ by an integer power of two.
+--
+--     Multiplies @x@ by the @n@ th power of the floating point radix (always 2).
+--
+--     Domain: @-INF \<= x \<= INF@, @n@ integer
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use 'scalbnf' for single-precision floats.
+--
+--     [Returns]: @x * 2^n@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'scalbnf', 'pow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_scalbn@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_scalbn@, defined at @SDL3\/SDL_stdinc.h 5605:36@
+scalbn
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value to be scaled.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@n@]: integer exponent.
+  -> IO Double
+scalbn =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_scalbn (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Scale @x@ by an integer power of two.
+--
+--     Multiplies @x@ by the @n@ th power of the floating point radix (always 2).
+--
+--     Domain: @-INF \<= x \<= INF@, @n@ integer
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use 'scalbn' for double-precision floats.
+--
+--     [Returns]: @x * 2^n@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'scalbn', 'powf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_scalbnf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_scalbnf@, defined at @SDL3\/SDL_stdinc.h 5630:35@
+scalbnf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value to be scaled.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@n@]: integer exponent.
+  -> IO Float
+scalbnf =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_scalbnf (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Compute the sine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on double-precision floating point values, use 'sinf' for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: sine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sinf', 'asin', 'cos'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_sin@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_sin@, defined at @SDL3\/SDL_stdinc.h 5658:36@
+sin
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO Double
+sin =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_sin (Coerce.coerce x00))
+
+-- | Compute the sine of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-1 \<= y \<= 1@
+--
+--     This function operates on single-precision floating point values, use 'sin' for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: sine of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sin', 'asinf', 'cosf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_sinf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_sinf@, defined at @SDL3\/SDL_stdinc.h 5686:35@
+sinf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO Float
+sinf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_sinf (Coerce.coerce x00))
+
+-- | Compute the square root of @x@.
+--
+--     Domain: @0 \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use 'sqrtf' for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: square root of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sqrtf'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_sqrt@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_sqrt@, defined at @SDL3\/SDL_stdinc.h 5712:36@
+sqrt
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than or equal to 0.
+  -> IO Double
+sqrt =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_sqrt (Coerce.coerce x00))
+
+-- | Compute the square root of @x@.
+--
+--     Domain: @0 \<= x \<= INF@
+--
+--     Range: @0 \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use 'sqrt' for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: square root of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'sqrt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_sqrtf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_sqrtf@, defined at @SDL3\/SDL_stdinc.h 5738:35@
+sqrtf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value. Must be greater than or equal to 0.
+  -> IO Float
+sqrtf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_sqrtf (Coerce.coerce x00))
+
+-- | Compute the tangent of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on double-precision floating point values, use 'tanf' for single-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: tangent of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'tanf', 'sin', 'cos', 'atan', 'atan2'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_tan@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_tan@, defined at @SDL3\/SDL_stdinc.h 5768:36@
+tan
+  :: Double
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO Double
+tan =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_tan (Coerce.coerce x00))
+
+-- | Compute the tangent of @x@.
+--
+--     Domain: @-INF \<= x \<= INF@
+--
+--     Range: @-INF \<= y \<= INF@
+--
+--     This function operates on single-precision floating point values, use 'tan' for double-precision floats.
+--
+--     This function may use a different approximation across different versions, platforms and configurations. i.e, it can return a different value given the same input on different machines or operating systems, or if SDL is updated.
+--
+--     [Returns]: tangent of @x@.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'tan', 'sinf', 'cosf', 'atanf', 'atan2f'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_tanf@.
+--                   The safe import is not exported
+--                   : pure math on immediate values; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_tanf@, defined at @SDL3\/SDL_stdinc.h 5798:35@
+tanf
+  :: Float
+  -- ^
+  --
+  --           [@x@]: floating point value, in radians.
+  -> IO Float
+tanf =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_tanf (Coerce.coerce x00))
+
+-- | This function allocates a context for the specified character set conversion.
+--
+--     [Returns]: a handle that must be freed with 'iconvClose', or SDL_ICONV_ERROR on failure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'iconv', 'iconvClose', 'iconvString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_iconv_open@.
+--                   The safe flavor is 'iconvOpenSafe'
+--                   .
+--
+--     [C declaration]: @SDL_iconv_open@, defined at @SDL3\/SDL_stdinc.h 5826:41@
+iconvOpen
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tocode@]: The target character encoding, must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@fromcode@]: The source character encoding, must not be NULL.
+  -> IO SDL_iconv_t
+iconvOpen = Unsafe.sDL_iconv_open
+
+-- | This function allocates a context for the specified character set conversion.
+--
+--     [Returns]: a handle that must be freed with 'iconvClose', or SDL_ICONV_ERROR on failure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'iconv', 'iconvClose', 'iconvString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_iconv_open@.
+--                   The unsafe flavor is 'iconvOpen'
+--                   .
+--
+--     [C declaration]: @SDL_iconv_open@, defined at @SDL3\/SDL_stdinc.h 5826:41@
+iconvOpenSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tocode@]: The target character encoding, must not be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@fromcode@]: The source character encoding, must not be NULL.
+  -> IO SDL_iconv_t
+iconvOpenSafe = Safe.sDL_iconv_open
+
+-- | This function frees a context used for character set conversion.
+--
+--     [Returns]: 0 on success, or -1 on failure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'iconv', 'iconvOpen', 'iconvString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_iconv_close@.
+--                   The safe flavor is 'iconvCloseSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_iconv_close@, defined at @SDL3\/SDL_stdinc.h 5843:33@
+iconvClose
+  :: SDL_iconv_t
+  -- ^
+  --
+  --           [@cd@]: The character set conversion handle.
+  -> IO BG.Int32
+iconvClose =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_iconv_close x00)
+
+-- | This function frees a context used for character set conversion.
+--
+--     [Returns]: 0 on success, or -1 on failure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'iconv', 'iconvOpen', 'iconvString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_iconv_close@.
+--                   The unsafe flavor is 'iconvClose'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_iconv_close@, defined at @SDL3\/SDL_stdinc.h 5843:33@
+iconvCloseSafe
+  :: SDL_iconv_t
+  -- ^
+  --
+  --           [@cd@]: The character set conversion handle.
+  -> IO BG.Int32
+iconvCloseSafe =
+  \x00 -> fmap Coerce.coerce (Safe.sDL_iconv_close x00)
+
+-- | This function converts text between encodings, reading from and writing to a buffer.
+--
+--     It returns the number of successful conversions on success. On error, SDL_ICONV_E2BIG is returned when the output buffer is too small, or SDL_ICONV_EILSEQ is returned when an invalid input sequence is encountered, or SDL_ICONV_EINVAL is returned when an incomplete input sequence is encountered.
+--
+--     On exit:
+--
+--     * inbuf will point to the beginning of the next multibyte sequence. On error, this is the location of the problematic input sequence. On success, this is the end of the input sequence.
+--
+--     * inbytesleft will be set to the number of bytes left to convert, which will be 0 on success.
+--
+--     * outbuf will point to the location where to store the next output byte.
+--
+--     * outbytesleft will be set to the number of bytes left in the output buffer.
+--
+--     [Returns]: the number of conversions on success, or a negative error code.
+--
+--     [Thread safety]: Do not use the same 'SDL_iconv_t' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'iconvOpen', 'iconvClose', 'iconvString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_iconv@.
+--                   The safe flavor is 'iconvSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_iconv@, defined at @SDL3\/SDL_stdinc.h 5883:36@
+iconv
+  :: SDL_iconv_t
+  -- ^
+  --
+  --           [@cd@]: The character set conversion context, created in @'iconvOpen'@.
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@inbuf@]: Address of variable that points to the first character of the input sequence.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@inbytesleft@]: The number of bytes in the input buffer.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@outbuf@]: Address of variable that points to the output buffer.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@outbytesleft@]: The number of bytes in the output buffer.
+  -> IO BG.Word64
+iconv =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap Coerce.coerce (Unsafe.sDL_iconv x00 x11 x22 x33 x44)
+
+-- | This function converts text between encodings, reading from and writing to a buffer.
+--
+--     It returns the number of successful conversions on success. On error, SDL_ICONV_E2BIG is returned when the output buffer is too small, or SDL_ICONV_EILSEQ is returned when an invalid input sequence is encountered, or SDL_ICONV_EINVAL is returned when an incomplete input sequence is encountered.
+--
+--     On exit:
+--
+--     * inbuf will point to the beginning of the next multibyte sequence. On error, this is the location of the problematic input sequence. On success, this is the end of the input sequence.
+--
+--     * inbytesleft will be set to the number of bytes left to convert, which will be 0 on success.
+--
+--     * outbuf will point to the location where to store the next output byte.
+--
+--     * outbytesleft will be set to the number of bytes left in the output buffer.
+--
+--     [Returns]: the number of conversions on success, or a negative error code.
+--
+--     [Thread safety]: Do not use the same 'SDL_iconv_t' from two threads at once.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'iconvOpen', 'iconvClose', 'iconvString'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_iconv@.
+--                   The unsafe flavor is 'iconv'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_iconv@, defined at @SDL3\/SDL_stdinc.h 5883:36@
+iconvSafe
+  :: SDL_iconv_t
+  -- ^
+  --
+  --           [@cd@]: The character set conversion context, created in @'iconvOpen'@.
+  -> BG.Ptr (PtrConst.PtrConst BG.CChar)
+  -- ^
+  --
+  --           [@inbuf@]: Address of variable that points to the first character of the input sequence.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@inbytesleft@]: The number of bytes in the input buffer.
+  -> BG.Ptr (BG.Ptr BG.CChar)
+  -- ^
+  --
+  --           [@outbuf@]: Address of variable that points to the output buffer.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@outbytesleft@]: The number of bytes in the output buffer.
+  -> IO BG.Word64
+iconvSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap Coerce.coerce (Safe.sDL_iconv x00 x11 x22 x33 x44)
+
+-- | Helper function to convert a string\'s encoding in one call.
+--
+--     This function converts a buffer or string between encodings in one pass.
+--
+--     The string does not need to be NULL-terminated; this function operates on the number of bytes specified in @inbytesleft@ whether there is a NULL character anywhere in the buffer.
+--
+--     The returned string is owned by the caller, and should be passed to 'free' when no longer needed.
+--
+--     [Returns]: a new string, converted to the new encoding, or NULL on error.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'iconvOpen', 'iconvClose', 'iconv'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_iconv_string@.
+--                   The safe flavor is 'iconvStringSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_iconv_string@, defined at @SDL3\/SDL_stdinc.h 5920:36@
+iconvString
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tocode@]: the character encoding of the output string. Examples are \"UTF-8\", \"UCS-4\", etc.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@fromcode@]: the character encoding of data in @inbuf@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@inbuf@]: the string to convert to a different encoding.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@inbytesleft@]: the size of the input string /in bytes/.
+  -> IO (BG.Ptr BG.CChar)
+iconvString =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_iconv_string x00 x11 x22 (Coerce.coerce x33)
+
+-- | Helper function to convert a string\'s encoding in one call.
+--
+--     This function converts a buffer or string between encodings in one pass.
+--
+--     The string does not need to be NULL-terminated; this function operates on the number of bytes specified in @inbytesleft@ whether there is a NULL character anywhere in the buffer.
+--
+--     The returned string is owned by the caller, and should be passed to 'free' when no longer needed.
+--
+--     [Returns]: a new string, converted to the new encoding, or NULL on error.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'iconvOpen', 'iconvClose', 'iconv'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_iconv_string@.
+--                   The unsafe flavor is 'iconvString'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_iconv_string@, defined at @SDL3\/SDL_stdinc.h 5920:36@
+iconvStringSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tocode@]: the character encoding of the output string. Examples are \"UTF-8\", \"UCS-4\", etc.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@fromcode@]: the character encoding of data in @inbuf@.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@inbuf@]: the string to convert to a different encoding.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@inbytesleft@]: the size of the input string /in bytes/.
+  -> IO (BG.Ptr BG.CChar)
+iconvStringSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_iconv_string x00 x11 x22 (Coerce.coerce x33)
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_size_mul_check_overflow_builtin@.
+--                   The safe flavor is 'sizeMulCheckOverflowBuiltinSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_size_mul_check_overflow_builtin@, defined at @SDL3\/SDL_stdinc.h 6101:23@
+sizeMulCheckOverflowBuiltin
+  :: BG.Word64
+  -- ^ [C declaration]: @a@
+  -> BG.Word64
+  -- ^ [C declaration]: @b@
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @ret@
+  -> IO Bool
+sizeMulCheckOverflowBuiltin =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap
+          CBool.toBool
+          (Unsafe.sDL_size_mul_check_overflow_builtin (Coerce.coerce x00) (Coerce.coerce x11) x22)
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_size_mul_check_overflow_builtin@.
+--                   The unsafe flavor is 'sizeMulCheckOverflowBuiltin'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_size_mul_check_overflow_builtin@, defined at @SDL3\/SDL_stdinc.h 6101:23@
+sizeMulCheckOverflowBuiltinSafe
+  :: BG.Word64
+  -- ^ [C declaration]: @a@
+  -> BG.Word64
+  -- ^ [C declaration]: @b@
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @ret@
+  -> IO Bool
+sizeMulCheckOverflowBuiltinSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap
+          CBool.toBool
+          (Safe.sDL_size_mul_check_overflow_builtin (Coerce.coerce x00) (Coerce.coerce x11) x22)
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_size_add_check_overflow_builtin@.
+--                   The safe flavor is 'sizeAddCheckOverflowBuiltinSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_size_add_check_overflow_builtin@, defined at @SDL3\/SDL_stdinc.h 6139:23@
+sizeAddCheckOverflowBuiltin
+  :: BG.Word64
+  -- ^ [C declaration]: @a@
+  -> BG.Word64
+  -- ^ [C declaration]: @b@
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @ret@
+  -> IO Bool
+sizeAddCheckOverflowBuiltin =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap
+          CBool.toBool
+          (Unsafe.sDL_size_add_check_overflow_builtin (Coerce.coerce x00) (Coerce.coerce x11) x22)
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_size_add_check_overflow_builtin@.
+--                   The unsafe flavor is 'sizeAddCheckOverflowBuiltin'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_size_add_check_overflow_builtin@, defined at @SDL3\/SDL_stdinc.h 6139:23@
+sizeAddCheckOverflowBuiltinSafe
+  :: BG.Word64
+  -- ^ [C declaration]: @a@
+  -> BG.Word64
+  -- ^ [C declaration]: @b@
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^ [C declaration]: @ret@
+  -> IO Bool
+sizeAddCheckOverflowBuiltinSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap
+          CBool.toBool
+          (Safe.sDL_size_add_check_overflow_builtin (Coerce.coerce x00) (Coerce.coerce x11) x22)
diff --git a/src/SDL3/Sys/Storage.hs b/src/SDL3/Sys/Storage.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Storage.hs
@@ -0,0 +1,1394 @@
+-- | The storage API is a high-level API designed to abstract away the portability issues that come up when using something lower-level (in SDL\'s case, this sits on top of the [Filesystem](https:\/\/wiki.libsdl.org\/SDL3\/CategoryFilesystem) and [IOStream](https:\/\/wiki.libsdl.org\/SDL3\/CategoryIOStream) subsystems). It is significantly more restrictive than a typical filesystem API, for a number of reasons:
+--
+--     1. __What to Access:__ A common pitfall with existing filesystem APIs is the assumption that all storage is monolithic. However, many other platforms (game consoles in particular) are more strict about what /type/ of filesystem is being accessed; for example, game content and user data are usually two separate storage devices with entirely different characteristics (and possibly different low-level APIs altogether!).
+--
+--     2. __How to Access:__ Another common mistake is applications assuming that all storage is universally writeable - again, many platforms treat game content and user data as two separate storage devices, and only user data is writeable while game content is read-only.
+--
+--     3. __When to Access:__ The most common portability issue with filesystem access is /timing/ - you cannot always assume that the storage device is always accessible all of the time, nor can you assume that there are no limits to how long you have access to a particular device.
+--
+--     Consider the following example:
+--
+--     @
+--     void ReadGameData(void)
+--     {
+--         extern char** fileNames;
+--         extern size_t numFiles;
+--         for (size_t i = 0; i \< numFiles; i += 1) {
+--             FILE *data = fopen(fileNames[i], \"rwb\");
+--             if (data == NULL) {
+--                 \/\/ Something bad happened!
+--             } else {
+--                 \/\/ A bunch of stuff happens here
+--                 fclose(data);
+--             }
+--         }
+--     }
+--
+--     void ReadSave(void)
+--     {
+--         FILE *save = fopen(\"saves\/save0.sav\", \"rb\");
+--         if (save == NULL) {
+--             \/\/ Something bad happened!
+--         } else {
+--             \/\/ A bunch of stuff happens here
+--             fclose(save);
+--         }
+--     }
+--
+--     void WriteSave(void)
+--     {
+--         FILE *save = fopen(\"saves\/save0.sav\", \"wb\");
+--         if (save == NULL) {
+--             \/\/ Something bad happened!
+--         } else {
+--             \/\/ A bunch of stuff happens here
+--             fclose(save);
+--         }
+--     }
+--     @
+--
+--     Going over the bullet points again:
+--
+--     1. __What to Access:__ This code accesses a global filesystem; game data and saves are all presumed to be in the current working directory (which may or may not be the game\'s installation folder!).
+--
+--     2. __How to Access:__ This code assumes that content paths are writeable, and that save data is also writeable despite being in the same location as the game data.
+--
+--     3. __When to Access:__ This code assumes that they can be called at any time, since the filesystem is always accessible and has no limits on how long the filesystem is being accessed.
+--
+--     Due to these assumptions, the filesystem code is not portable and will fail under these common scenarios:
+--
+--     * The game is installed on a device that is read-only, both content loading and game saves will fail or crash outright
+--
+--     * Game\/User storage is not implicitly mounted, so no files will be found for either scenario when a platform requires explicitly mounting filesystems
+--
+--     * Save data may not be safe since the I\/O is not being flushed or validated, so an error occurring elsewhere in the program may result in missing\/corrupted save data
+--
+--     When using 'SDL_Storage', these types of problems are virtually impossible to trip over:
+--
+--     @
+--     void ReadGameData(void)
+--     {
+--         extern char** fileNames;
+--         extern size_t numFiles;
+--
+--         SDL_Storage *title = SDL_OpenTitleStorage(NULL, 0);
+--         if (title == NULL) {
+--             \/\/ Something bad happened!
+--         }
+--         while (!SDL_StorageReady(title)) {
+--             SDL_Delay(1);
+--         }
+--
+--         for (size_t i = 0; i \< numFiles; i += 1) {
+--             void* dst;
+--             Uint64 dstLen = 0;
+--
+--             if (SDL_GetStorageFileSize(title, fileNames[i], &dstLen) && dstLen > 0) {
+--                 dst = SDL_malloc(dstLen);
+--                 if (SDL_ReadStorageFile(title, fileNames[i], dst, dstLen)) {
+--                     \/\/ A bunch of stuff happens here
+--                 } else {
+--                     \/\/ Something bad happened!
+--                 }
+--                 SDL_free(dst);
+--             } else {
+--                 \/\/ Something bad happened!
+--             }
+--         }
+--
+--         SDL_CloseStorage(title);
+--     }
+--
+--     void ReadSave(void)
+--     {
+--         SDL_Storage *user = SDL_OpenUserStorage(\"libsdl\", \"Storage Example\", 0);
+--         if (user == NULL) {
+--             \/\/ Something bad happened!
+--         }
+--         while (!SDL_StorageReady(user)) {
+--             SDL_Delay(1);
+--         }
+--
+--         Uint64 saveLen = 0;
+--         if (SDL_GetStorageFileSize(user, \"save0.sav\", &saveLen) && saveLen > 0) {
+--             void* dst = SDL_malloc(saveLen);
+--             if (SDL_ReadStorageFile(user, \"save0.sav\", dst, saveLen)) {
+--                 \/\/ A bunch of stuff happens here
+--             } else {
+--                 \/\/ Something bad happened!
+--             }
+--             SDL_free(dst);
+--         } else {
+--             \/\/ Something bad happened!
+--         }
+--
+--         SDL_CloseStorage(user);
+--     }
+--
+--     void WriteSave(void)
+--     {
+--         SDL_Storage *user = SDL_OpenUserStorage(\"libsdl\", \"Storage Example\", 0);
+--         if (user == NULL) {
+--             \/\/ Something bad happened!
+--         }
+--         while (!SDL_StorageReady(user)) {
+--             SDL_Delay(1);
+--         }
+--
+--         extern void *saveData; \/\/ A bunch of stuff happened here...
+--         extern Uint64 saveLen;
+--         if (!SDL_WriteStorageFile(user, \"save0.sav\", saveData, saveLen)) {
+--             \/\/ Something bad happened!
+--         }
+--
+--         SDL_CloseStorage(user);
+--     }
+--     @
+--
+--     Note the improvements that 'SDL_Storage' makes:
+--
+--     1. __What to Access:__ This code explicitly reads from a title or user storage device based on the context of the function.
+--
+--     2. __How to Access:__ This code explicitly uses either a read or write function based on the context of the function.
+--
+--     3. __When to Access:__ This code explicitly opens the device when it needs to, and closes it when it is finished working with the filesystem.
+--
+--     The result is an application that is significantly more robust against the increasing demands of platforms and their filesystems!
+--
+--     A publicly available example of an 'SDL_Storage' backend is the [Steam Cloud](https://partner.steamgames.com/doc/features/cloud) backend - you can initialize Steamworks when starting the program, and then SDL will recognize that Steamworks is initialized and automatically use ISteamRemoteStorage when the application opens user storage. More importantly, when you /open/ storage it knows to begin a \"batch\" of filesystem operations, and when you /close/ storage it knows to end and flush the batch. This is used by Steam to support [Dynamic Cloud Sync](https://steamcommunity.com/groups/steamworks/announcements/detail/3142949576401813670); users can save data on one PC, put the device to sleep, and then continue playing on another PC (and vice versa) with the save data fully synchronized across all devices, allowing for a seamless experience without having to do full restarts of the program.
+--
+--     Notes on valid paths
+--
+--     All paths in the Storage API use Unix-style path separators (\'\/\'). Using a different path separator will not work, even if the underlying platform would otherwise accept it. This is to keep code using the Storage API portable between platforms and Storage implementations and simplify app code.
+--
+--     Paths with relative directories (\".\" and \"..\") are forbidden by the Storage API.
+--
+--     All valid UTF-8 strings (discounting the NULL terminator character and the \'\/\' path separator) are usable for filenames, however, an underlying Storage implementation may not support particularly strange sequences and refuse to create files with those names, etc. Function interface for 'SDL_Storage'.
+--
+--     Apps that want to supply a custom implementation of 'SDL_Storage' will fill in all the functions in this struct, and then pass it to 'openStorage' to create a custom 'SDL_Storage' object.
+--
+--     It is not usually necessary to do this; SDL provides standard implementations for many things you might expect to do with an 'SDL_Storage'.
+--
+--     This structure should be initialized using SDL_INIT_INTERFACE()
+--
+--     @since 3.2.0
+--
+--     [See also]: SDL_INIT_INTERFACE
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Storage.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Storage (
+  module SDL3.Sys.Bindgen.Storage,
+
+  -- * Function aliases
+  SDL3.Sys.Storage.openTitleStorage,
+  SDL3.Sys.Storage.openTitleStorageSafe,
+  SDL3.Sys.Storage.openUserStorage,
+  SDL3.Sys.Storage.openUserStorageSafe,
+  SDL3.Sys.Storage.openFileStorage,
+  SDL3.Sys.Storage.openFileStorageSafe,
+  SDL3.Sys.Storage.openStorage,
+  SDL3.Sys.Storage.openStorageSafe,
+  SDL3.Sys.Storage.closeStorage,
+  SDL3.Sys.Storage.closeStorageSafe,
+  SDL3.Sys.Storage.storageReady,
+  SDL3.Sys.Storage.storageReadySafe,
+  SDL3.Sys.Storage.getStorageFileSize,
+  SDL3.Sys.Storage.getStorageFileSizeSafe,
+  SDL3.Sys.Storage.readStorageFile,
+  SDL3.Sys.Storage.readStorageFileSafe,
+  SDL3.Sys.Storage.writeStorageFile,
+  SDL3.Sys.Storage.writeStorageFileSafe,
+  SDL3.Sys.Storage.createStorageDirectory,
+  SDL3.Sys.Storage.createStorageDirectorySafe,
+  SDL3.Sys.Storage.enumerateStorageDirectorySafe,
+  SDL3.Sys.Storage.removeStoragePath,
+  SDL3.Sys.Storage.removeStoragePathSafe,
+  SDL3.Sys.Storage.renameStoragePath,
+  SDL3.Sys.Storage.renameStoragePathSafe,
+  SDL3.Sys.Storage.copyStorageFile,
+  SDL3.Sys.Storage.copyStorageFileSafe,
+  SDL3.Sys.Storage.getStoragePathInfo,
+  SDL3.Sys.Storage.getStoragePathInfoSafe,
+  SDL3.Sys.Storage.getStorageSpaceRemaining,
+  SDL3.Sys.Storage.getStorageSpaceRemainingSafe,
+  SDL3.Sys.Storage.globStorageDirectory,
+  SDL3.Sys.Storage.globStorageDirectorySafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Filesystem qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Storage
+import SDL3.Sys.Bindgen.Storage.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Storage.Unsafe qualified as Unsafe
+
+-- | Opens up a read-only container for the application\'s filesystem.
+--
+--     By default, 'openTitleStorage' uses the generic storage implementation. When the path override is not provided, the generic implementation will use the output of 'SDL3.Sys.Filesystem.getBasePath' as the base path.
+--
+--     [Returns]: a title storage container on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeStorage', 'getStorageFileSize', 'openUserStorage', 'readStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenTitleStorage@.
+--                   The safe flavor is 'openTitleStorageSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenTitleStorage@, defined at @SDL3\/SDL_storage.h 353:43@
+openTitleStorage
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@override@]: a path to override the backend\'s default title root.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: a property list that may contain backend-specific information.
+  -> IO (BG.Ptr SDL_Storage)
+openTitleStorage = Unsafe.sDL_OpenTitleStorage
+
+-- | Opens up a read-only container for the application\'s filesystem.
+--
+--     By default, 'openTitleStorage' uses the generic storage implementation. When the path override is not provided, the generic implementation will use the output of 'SDL3.Sys.Filesystem.getBasePath' as the base path.
+--
+--     [Returns]: a title storage container on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeStorage', 'getStorageFileSize', 'openUserStorage', 'readStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenTitleStorage@.
+--                   The unsafe flavor is 'openTitleStorage'
+--                   .
+--
+--     [C declaration]: @SDL_OpenTitleStorage@, defined at @SDL3\/SDL_storage.h 353:43@
+openTitleStorageSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@override@]: a path to override the backend\'s default title root.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: a property list that may contain backend-specific information.
+  -> IO (BG.Ptr SDL_Storage)
+openTitleStorageSafe = Safe.sDL_OpenTitleStorage
+
+-- | Opens up a container for a user\'s unique read\/write filesystem.
+--
+--     While title storage can generally be kept open throughout runtime, user storage should only be opened when the client is ready to read\/write files. This allows the backend to properly batch file operations and flush them when the container has been closed; ensuring safe and optimal save I\/O.
+--
+--     [Returns]: a user storage container on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeStorage', 'getStorageFileSize', 'getStorageSpaceRemaining', 'openTitleStorage', 'readStorageFile', 'storageReady', 'writeStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenUserStorage@.
+--                   The safe flavor is 'openUserStorageSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenUserStorage@, defined at @SDL3\/SDL_storage.h 379:43@
+openUserStorage
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@org@]: the name of your organization.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@app@]: the name of your application.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: a property list that may contain backend-specific information.
+  -> IO (BG.Ptr SDL_Storage)
+openUserStorage = Unsafe.sDL_OpenUserStorage
+
+-- | Opens up a container for a user\'s unique read\/write filesystem.
+--
+--     While title storage can generally be kept open throughout runtime, user storage should only be opened when the client is ready to read\/write files. This allows the backend to properly batch file operations and flush them when the container has been closed; ensuring safe and optimal save I\/O.
+--
+--     [Returns]: a user storage container on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeStorage', 'getStorageFileSize', 'getStorageSpaceRemaining', 'openTitleStorage', 'readStorageFile', 'storageReady', 'writeStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenUserStorage@.
+--                   The unsafe flavor is 'openUserStorage'
+--                   .
+--
+--     [C declaration]: @SDL_OpenUserStorage@, defined at @SDL3\/SDL_storage.h 379:43@
+openUserStorageSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@org@]: the name of your organization.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@app@]: the name of your application.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: a property list that may contain backend-specific information.
+  -> IO (BG.Ptr SDL_Storage)
+openUserStorageSafe = Safe.sDL_OpenUserStorage
+
+-- | Opens up a container for local filesystem storage.
+--
+--     This is provided for development and tools. Portable applications should use @'openTitleStorage'@ for access to game data and @'openUserStorage'@ for access to user data.
+--
+--     [Returns]: a filesystem storage container on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeStorage', 'getStorageFileSize', 'getStorageSpaceRemaining', 'openTitleStorage', 'openUserStorage', 'readStorageFile', 'writeStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenFileStorage@.
+--                   The safe flavor is 'openFileStorageSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenFileStorage@, defined at @SDL3\/SDL_storage.h 403:43@
+openFileStorage
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the base path prepended to all storage paths, or NULL for no base path.
+  -> IO (BG.Ptr SDL_Storage)
+openFileStorage = Unsafe.sDL_OpenFileStorage
+
+-- | Opens up a container for local filesystem storage.
+--
+--     This is provided for development and tools. Portable applications should use @'openTitleStorage'@ for access to game data and @'openUserStorage'@ for access to user data.
+--
+--     [Returns]: a filesystem storage container on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeStorage', 'getStorageFileSize', 'getStorageSpaceRemaining', 'openTitleStorage', 'openUserStorage', 'readStorageFile', 'writeStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenFileStorage@.
+--                   The unsafe flavor is 'openFileStorage'
+--                   .
+--
+--     [C declaration]: @SDL_OpenFileStorage@, defined at @SDL3\/SDL_storage.h 403:43@
+openFileStorageSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the base path prepended to all storage paths, or NULL for no base path.
+  -> IO (BG.Ptr SDL_Storage)
+openFileStorageSafe = Safe.sDL_OpenFileStorage
+
+-- | Opens up a container using a client-provided storage interface.
+--
+--     Applications do not need to use this function unless they are providing their own 'SDL_Storage' implementation. If you just need an 'SDL_Storage', you should use the built-in implementations in SDL, like @'openTitleStorage'@ or @'openUserStorage'@.
+--
+--     This function makes a copy of @iface@ and the caller does not need to keep it around after this call.
+--
+--     [Returns]: a storage container on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeStorage', 'getStorageFileSize', 'getStorageSpaceRemaining', SDL_INIT_INTERFACE, 'readStorageFile', 'storageReady', 'writeStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OpenStorage@.
+--                   The safe flavor is 'openStorageSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OpenStorage@, defined at @SDL3\/SDL_storage.h 432:43@
+openStorage
+  :: PtrConst.PtrConst SDL_StorageInterface
+  -- ^
+  --
+  --           [@iface@]: the interface that implements this storage, initialized using SDL_INIT_INTERFACE().
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer that will be passed to the interface functions.
+  -> IO (BG.Ptr SDL_Storage)
+openStorage = Unsafe.sDL_OpenStorage
+
+-- | Opens up a container using a client-provided storage interface.
+--
+--     Applications do not need to use this function unless they are providing their own 'SDL_Storage' implementation. If you just need an 'SDL_Storage', you should use the built-in implementations in SDL, like @'openTitleStorage'@ or @'openUserStorage'@.
+--
+--     This function makes a copy of @iface@ and the caller does not need to keep it around after this call.
+--
+--     [Returns]: a storage container on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'closeStorage', 'getStorageFileSize', 'getStorageSpaceRemaining', SDL_INIT_INTERFACE, 'readStorageFile', 'storageReady', 'writeStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OpenStorage@.
+--                   The unsafe flavor is 'openStorage'
+--                   .
+--
+--     [C declaration]: @SDL_OpenStorage@, defined at @SDL3\/SDL_storage.h 432:43@
+openStorageSafe
+  :: PtrConst.PtrConst SDL_StorageInterface
+  -- ^
+  --
+  --           [@iface@]: the interface that implements this storage, initialized using SDL_INIT_INTERFACE().
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: the pointer that will be passed to the interface functions.
+  -> IO (BG.Ptr SDL_Storage)
+openStorageSafe = Safe.sDL_OpenStorage
+
+-- | Closes and frees a storage container.
+--
+--     [Returns]: true if the container was freed with no errors, false otherwise; call 'SDL3.Sys.Error.getError' for more information. Even if the function returns an error, the container data will be freed; the error is only for informational purposes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openFileStorage', 'openStorage', 'openTitleStorage', 'openUserStorage'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CloseStorage@.
+--                   The safe flavor is 'closeStorageSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CloseStorage@, defined at @SDL3\/SDL_storage.h 450:34@
+closeStorage
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to close.
+  -> IO Bool
+closeStorage =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_CloseStorage x00)
+
+-- | Closes and frees a storage container.
+--
+--     [Returns]: true if the container was freed with no errors, false otherwise; call 'SDL3.Sys.Error.getError' for more information. Even if the function returns an error, the container data will be freed; the error is only for informational purposes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'openFileStorage', 'openStorage', 'openTitleStorage', 'openUserStorage'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CloseStorage@.
+--                   The unsafe flavor is 'closeStorage'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CloseStorage@, defined at @SDL3\/SDL_storage.h 450:34@
+closeStorageSafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to close.
+  -> IO Bool
+closeStorageSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_CloseStorage x00)
+
+-- | Checks if the storage container is ready to use.
+--
+--     This function should be called in regular intervals until it returns true - however, it is not recommended to spinwait on this call, as the backend may depend on a synchronous message loop. You might instead poll this in your game\'s main loop while processing events and drawing a loading screen.
+--
+--     [Returns]: true if the container is ready, false otherwise.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StorageReady@.
+--                   The safe flavor is 'storageReadySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StorageReady@, defined at @SDL3\/SDL_storage.h 465:34@
+storageReady
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> IO Bool
+storageReady =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_StorageReady x00)
+
+-- | Checks if the storage container is ready to use.
+--
+--     This function should be called in regular intervals until it returns true - however, it is not recommended to spinwait on this call, as the backend may depend on a synchronous message loop. You might instead poll this in your game\'s main loop while processing events and drawing a loading screen.
+--
+--     [Returns]: true if the container is ready, false otherwise.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_StorageReady@.
+--                   The unsafe flavor is 'storageReady'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StorageReady@, defined at @SDL3\/SDL_storage.h 465:34@
+storageReadySafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> IO Bool
+storageReadySafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_StorageReady x00)
+
+-- | Query the size of a file within a storage container.
+--
+--     [Returns]: true if the file could be queried or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'readStorageFile', 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetStorageFileSize@.
+--                   The safe flavor is 'getStorageFileSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetStorageFileSize@, defined at @SDL3\/SDL_storage.h 481:34@
+getStorageFileSize
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@length@]: a pointer to be filled with the file\'s length.
+  -> IO Bool
+getStorageFileSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetStorageFileSize x00 x11 x22)
+
+-- | Query the size of a file within a storage container.
+--
+--     [Returns]: true if the file could be queried or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'readStorageFile', 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetStorageFileSize@.
+--                   The unsafe flavor is 'getStorageFileSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetStorageFileSize@, defined at @SDL3\/SDL_storage.h 481:34@
+getStorageFileSizeSafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint64
+  -- ^
+  --
+  --           [@length@]: a pointer to be filled with the file\'s length.
+  -> IO Bool
+getStorageFileSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetStorageFileSize x00 x11 x22)
+
+-- | Synchronously read a file from a storage container into a client-provided buffer.
+--
+--     The value of @length@ must match the length of the file exactly; call @'getStorageFileSize'@ to get this value. This behavior may be relaxed in a future release.
+--
+--     [Returns]: true if the file was read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getStorageFileSize', 'storageReady', 'writeStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadStorageFile@.
+--                   The safe flavor is 'readStorageFileSafe'
+--                   : dispatches through the storage\'s SDL_StorageInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadStorageFile@, defined at @SDL3\/SDL_storage.h 504:34@
+readStorageFile
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to read from.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to read.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@destination@]: a client-provided buffer to read the file into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the length of the destination buffer.
+  -> IO Bool
+readStorageFile =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_ReadStorageFile x00 x11 x22 (Coerce.coerce x33))
+
+-- | Synchronously read a file from a storage container into a client-provided buffer.
+--
+--     The value of @length@ must match the length of the file exactly; call @'getStorageFileSize'@ to get this value. This behavior may be relaxed in a future release.
+--
+--     [Returns]: true if the file was read or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getStorageFileSize', 'storageReady', 'writeStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadStorageFile@.
+--                   The unsafe flavor is 'readStorageFile'
+--                   : dispatches through the storage\'s SDL_StorageInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadStorageFile@, defined at @SDL3\/SDL_storage.h 504:34@
+readStorageFileSafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to read from.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to read.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@destination@]: a client-provided buffer to read the file into.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the length of the destination buffer.
+  -> IO Bool
+readStorageFileSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_ReadStorageFile x00 x11 x22 (Coerce.coerce x33))
+
+-- | Synchronously write a file from client memory into a storage container.
+--
+--     [Returns]: true if the file was written or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getStorageSpaceRemaining', 'readStorageFile', 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteStorageFile@.
+--                   The safe flavor is 'writeStorageFileSafe'
+--                   : dispatches through the storage\'s SDL_StorageInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteStorageFile@, defined at @SDL3\/SDL_storage.h 522:34@
+writeStorageFile
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to write to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to write.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@source@]: a client-provided buffer to write from.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the length of the source buffer.
+  -> IO Bool
+writeStorageFile =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_WriteStorageFile x00 x11 x22 (Coerce.coerce x33))
+
+-- | Synchronously write a file from client memory into a storage container.
+--
+--     [Returns]: true if the file was written or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getStorageSpaceRemaining', 'readStorageFile', 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteStorageFile@.
+--                   The unsafe flavor is 'writeStorageFile'
+--                   : dispatches through the storage\'s SDL_StorageInterface, which may be implemented in Haskell.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteStorageFile@, defined at @SDL3\/SDL_storage.h 522:34@
+writeStorageFileSafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to write to.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the relative path of the file to write.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@source@]: a client-provided buffer to write from.
+  -> BG.Word64
+  -- ^
+  --
+  --           [@length@]: the length of the source buffer.
+  -> IO Bool
+writeStorageFileSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_WriteStorageFile x00 x11 x22 (Coerce.coerce x33))
+
+-- | Create a directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateStorageDirectory@.
+--                   The safe flavor is 'createStorageDirectorySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateStorageDirectory@, defined at @SDL3\/SDL_storage.h 536:34@
+createStorageDirectory
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to create.
+  -> IO Bool
+createStorageDirectory =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_CreateStorageDirectory x00 x11)
+
+-- | Create a directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateStorageDirectory@.
+--                   The unsafe flavor is 'createStorageDirectory'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateStorageDirectory@, defined at @SDL3\/SDL_storage.h 536:34@
+createStorageDirectorySafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to create.
+  -> IO Bool
+createStorageDirectorySafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_CreateStorageDirectory x00 x11)
+
+-- | Enumerate a directory in a storage container through a callback function.
+--
+--     This function provides every directory entry through an app-provided callback, called once for each directory entry, until all results have been provided or the callback returns either SDL_ENUM_SUCCESS or SDL_ENUM_FAILURE.
+--
+--     This will return false if there was a system problem in general, or if a callback returns SDL_ENUM_FAILURE. A successful return means a callback returned SDL_ENUM_SUCCESS to halt enumeration, or all directory entries were enumerated.
+--
+--     If @path@ is NULL, this is treated as a request to enumerate the root of the storage container\'s tree. An empty string also works for this.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EnumerateStorageDirectory@.
+--                   The unsafe import is not exported
+--                   : invokes the callback per entry synchronously.
+--                   If your callback is a non-Haskell function pointer that never
+-- re-enters the Haskell runtime, the unsafe import remains available as @SDL3.Sys.Bindgen.Storage.Unsafe.sDL_EnumerateStorageDirectory@.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_EnumerateStorageDirectory@, defined at @SDL3\/SDL_storage.h 565:34@
+enumerateStorageDirectorySafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate, or NULL for the root.
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_EnumerateDirectoryCallback
+  -- ^
+  --
+  --           [@callback@]: a function that is called for each entry in the directory.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO Bool
+enumerateStorageDirectorySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_EnumerateStorageDirectory x00 x11 x22 x33)
+
+-- | Remove a file or an empty directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RemoveStoragePath@.
+--                   The safe flavor is 'removeStoragePathSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RemoveStoragePath@, defined at @SDL3\/SDL_storage.h 579:34@
+removeStoragePath
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> IO Bool
+removeStoragePath =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_RemoveStoragePath x00 x11)
+
+-- | Remove a file or an empty directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RemoveStoragePath@.
+--                   The unsafe flavor is 'removeStoragePath'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RemoveStoragePath@, defined at @SDL3\/SDL_storage.h 579:34@
+removeStoragePathSafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate.
+  -> IO Bool
+removeStoragePathSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_RemoveStoragePath x00 x11)
+
+-- | Rename a file or directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RenameStoragePath@.
+--                   The safe flavor is 'renameStoragePathSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenameStoragePath@, defined at @SDL3\/SDL_storage.h 594:34@
+renameStoragePath
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO Bool
+renameStoragePath =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_RenameStoragePath x00 x11 x22)
+
+-- | Rename a file or directory in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RenameStoragePath@.
+--                   The unsafe flavor is 'renameStoragePath'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RenameStoragePath@, defined at @SDL3\/SDL_storage.h 594:34@
+renameStoragePathSafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO Bool
+renameStoragePathSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_RenameStoragePath x00 x11 x22)
+
+-- | Copy a file in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CopyStorageFile@.
+--                   The safe flavor is 'copyStorageFileSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CopyStorageFile@, defined at @SDL3\/SDL_storage.h 609:34@
+copyStorageFile
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO Bool
+copyStorageFile =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_CopyStorageFile x00 x11 x22)
+
+-- | Copy a file in a writable storage container.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CopyStorageFile@.
+--                   The unsafe flavor is 'copyStorageFile'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CopyStorageFile@, defined at @SDL3\/SDL_storage.h 609:34@
+copyStorageFileSafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@oldpath@]: the old path.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@newpath@]: the new path.
+  -> IO Bool
+copyStorageFileSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_CopyStorageFile x00 x11 x22)
+
+-- | Get information about a filesystem path in a storage container.
+--
+--     [Returns]: true on success or false if the file doesn\'t exist, or another failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetStoragePathInfo@.
+--                   The safe flavor is 'getStoragePathInfoSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetStoragePathInfo@, defined at @SDL3\/SDL_storage.h 625:34@
+getStoragePathInfo
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+  -- ^
+  --
+  --           [@info@]: a pointer filled in with information about the path, or NULL to check for the existence of a file.
+  -> IO Bool
+getStoragePathInfo =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetStoragePathInfo x00 x11 x22)
+
+-- | Get information about a filesystem path in a storage container.
+--
+--     [Returns]: true on success or false if the file doesn\'t exist, or another failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetStoragePathInfo@.
+--                   The unsafe flavor is 'getStoragePathInfo'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetStoragePathInfo@, defined at @SDL3\/SDL_storage.h 625:34@
+getStoragePathInfoSafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Filesystem.SDL_PathInfo
+  -- ^
+  --
+  --           [@info@]: a pointer filled in with information about the path, or NULL to check for the existence of a file.
+  -> IO Bool
+getStoragePathInfoSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetStoragePathInfo x00 x11 x22)
+
+-- | Queries the remaining space in a storage container.
+--
+--     [Returns]: the amount of remaining space, in bytes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady', 'writeStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetStorageSpaceRemaining@.
+--                   The safe flavor is 'getStorageSpaceRemainingSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetStorageSpaceRemaining@, defined at @SDL3\/SDL_storage.h 638:36@
+getStorageSpaceRemaining
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> IO BG.Word64
+getStorageSpaceRemaining =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetStorageSpaceRemaining x00)
+
+-- | Queries the remaining space in a storage container.
+--
+--     [Returns]: the amount of remaining space, in bytes.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'storageReady', 'writeStorageFile'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetStorageSpaceRemaining@.
+--                   The unsafe flavor is 'getStorageSpaceRemaining'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetStorageSpaceRemaining@, defined at @SDL3\/SDL_storage.h 638:36@
+getStorageSpaceRemainingSafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container to query.
+  -> IO BG.Word64
+getStorageSpaceRemainingSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetStorageSpaceRemaining x00)
+
+-- | Enumerate a directory tree, filtered by pattern, and return a list.
+--
+--     Files are filtered out if they don\'t match the string in @pattern@, which may contain wildcard characters @*@ (match everything) and @?@ (match one character). If pattern is NULL, no filtering is done and all results are returned. Subdirectories are permitted, and are specified with a path separator of \'\/\'. Wildcard characters @*@ and @?@ never match a path separator.
+--
+--     @flags@ may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching case-insensitive.
+--
+--     The returned array is always NULL-terminated, for your iterating convenience, but if @count@ is non-NULL, on return it will contain the number of items in the array, not counting the NULL terminator.
+--
+--     If @path@ is NULL, this is treated as a request to enumerate the root of the storage container\'s tree. An empty string also works for this.
+--
+--     [Returns]: an array of strings on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. The caller should pass the returned pointer to 'SDL3.Sys.Stdinc.free' when done with it. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, assuming the @storage@ object is thread-safe.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GlobStorageDirectory@.
+--                   The safe flavor is 'globStorageDirectorySafe'
+--                   : dispatches through the storage\'s SDL_StorageInterface, which may be implemented in Haskell.
+--
+--     [C declaration]: @SDL_GlobStorageDirectory@, defined at @SDL3\/SDL_storage.h 678:37@
+globStorageDirectory
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate, or NULL for the root.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pattern@]: the pattern that files in the directory must match. Can be NULL.
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_GlobFlags
+  -- ^
+  --
+  --           [@flags@]: @SDL_GLOB_*@ bitflags that affect this search.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: on return, will be set to the number of items in the returned array. Can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+globStorageDirectory =
+  Unsafe.sDL_GlobStorageDirectory
+
+-- | Enumerate a directory tree, filtered by pattern, and return a list.
+--
+--     Files are filtered out if they don\'t match the string in @pattern@, which may contain wildcard characters @*@ (match everything) and @?@ (match one character). If pattern is NULL, no filtering is done and all results are returned. Subdirectories are permitted, and are specified with a path separator of \'\/\'. Wildcard characters @*@ and @?@ never match a path separator.
+--
+--     @flags@ may be set to SDL_GLOB_CASEINSENSITIVE to make the pattern matching case-insensitive.
+--
+--     The returned array is always NULL-terminated, for your iterating convenience, but if @count@ is non-NULL, on return it will contain the number of items in the array, not counting the NULL terminator.
+--
+--     If @path@ is NULL, this is treated as a request to enumerate the root of the storage container\'s tree. An empty string also works for this.
+--
+--     [Returns]: an array of strings on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. The caller should pass the returned pointer to 'SDL3.Sys.Stdinc.free' when done with it. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: It is safe to call this function from any thread, assuming the @storage@ object is thread-safe.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GlobStorageDirectory@.
+--                   The unsafe flavor is 'globStorageDirectory'
+--                   : dispatches through the storage\'s SDL_StorageInterface, which may be implemented in Haskell.
+--
+--     [C declaration]: @SDL_GlobStorageDirectory@, defined at @SDL3\/SDL_storage.h 678:37@
+globStorageDirectorySafe
+  :: BG.Ptr SDL_Storage
+  -- ^
+  --
+  --           [@storage@]: a storage container.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the path of the directory to enumerate, or NULL for the root.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@pattern@]: the pattern that files in the directory must match. Can be NULL.
+  -> SDL3.Sys.Bindgen.Filesystem.SDL_GlobFlags
+  -- ^
+  --
+  --           [@flags@]: @SDL_GLOB_*@ bitflags that affect this search.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: on return, will be set to the number of items in the returned array. Can be NULL.
+  -> IO (BG.Ptr (BG.Ptr BG.CChar))
+globStorageDirectorySafe =
+  Safe.sDL_GlobStorageDirectory
diff --git a/src/SDL3/Sys/Surface.hs b/src/SDL3/Sys/Surface.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Surface.hs
@@ -0,0 +1,6002 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | SDL surfaces are buffers of pixels in system RAM. These are useful for passing around and manipulating images that are not stored in GPU memory.
+--
+--     'SDL_Surface' makes serious efforts to manage images in various formats, and provides a reasonable toolbox for transforming the data, including copying between surfaces, filling rectangles in the image data, etc.
+--
+--     There is also a simple .bmp loader, @'loadBMP'@, and a simple .png loader, @'loadPNG'@. SDL itself does not provide loaders for other file formats, but there are several excellent external libraries that do, including its own satellite library, [SDL_image](https://wiki.libsdl.org/SDL3_image) In general these functions are thread-safe in that they can be called on different threads with different surfaces. You should not try to modify any surface from two threads simultaneously. The flags on an 'SDL_Surface'.
+--
+--     These are generally considered read-only.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Surface.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Surface (
+  module SDL3.Sys.Bindgen.Surface,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Surface.SDL_SURFACE_PREALLOCATED,
+  pattern SDL3.Sys.Surface.SDL_SURFACE_LOCK_NEEDED,
+  pattern SDL3.Sys.Surface.SDL_SURFACE_LOCKED,
+  pattern SDL3.Sys.Surface.SDL_SURFACE_SIMD_ALIGNED,
+
+  -- * Function aliases
+  SDL3.Sys.Surface.createSurface,
+  SDL3.Sys.Surface.createSurfaceSafe,
+  SDL3.Sys.Surface.createSurfaceFrom,
+  SDL3.Sys.Surface.createSurfaceFromSafe,
+  SDL3.Sys.Surface.destroySurface,
+  SDL3.Sys.Surface.destroySurfaceSafe,
+  SDL3.Sys.Surface.getSurfaceProperties,
+  SDL3.Sys.Surface.getSurfacePropertiesSafe,
+  SDL3.Sys.Surface.setSurfaceColorspace,
+  SDL3.Sys.Surface.setSurfaceColorspaceSafe,
+  SDL3.Sys.Surface.getSurfaceColorspace,
+  SDL3.Sys.Surface.getSurfaceColorspaceSafe,
+  SDL3.Sys.Surface.createSurfacePalette,
+  SDL3.Sys.Surface.createSurfacePaletteSafe,
+  SDL3.Sys.Surface.setSurfacePalette,
+  SDL3.Sys.Surface.setSurfacePaletteSafe,
+  SDL3.Sys.Surface.getSurfacePalette,
+  SDL3.Sys.Surface.getSurfacePaletteSafe,
+  SDL3.Sys.Surface.addSurfaceAlternateImage,
+  SDL3.Sys.Surface.addSurfaceAlternateImageSafe,
+  SDL3.Sys.Surface.surfaceHasAlternateImages,
+  SDL3.Sys.Surface.surfaceHasAlternateImagesSafe,
+  SDL3.Sys.Surface.getSurfaceImages,
+  SDL3.Sys.Surface.getSurfaceImagesSafe,
+  SDL3.Sys.Surface.removeSurfaceAlternateImages,
+  SDL3.Sys.Surface.removeSurfaceAlternateImagesSafe,
+  SDL3.Sys.Surface.lockSurface,
+  SDL3.Sys.Surface.lockSurfaceSafe,
+  SDL3.Sys.Surface.unlockSurface,
+  SDL3.Sys.Surface.unlockSurfaceSafe,
+  SDL3.Sys.Surface.loadSurfaceIO,
+  SDL3.Sys.Surface.loadSurfaceIOSafe,
+  SDL3.Sys.Surface.loadSurface,
+  SDL3.Sys.Surface.loadSurfaceSafe,
+  SDL3.Sys.Surface.loadBMPIO,
+  SDL3.Sys.Surface.loadBMPIOSafe,
+  SDL3.Sys.Surface.loadBMP,
+  SDL3.Sys.Surface.loadBMPSafe,
+  SDL3.Sys.Surface.saveBMPIO,
+  SDL3.Sys.Surface.saveBMPIOSafe,
+  SDL3.Sys.Surface.saveBMP,
+  SDL3.Sys.Surface.saveBMPSafe,
+  SDL3.Sys.Surface.loadPNGIO,
+  SDL3.Sys.Surface.loadPNGIOSafe,
+  SDL3.Sys.Surface.loadPNG,
+  SDL3.Sys.Surface.loadPNGSafe,
+  SDL3.Sys.Surface.savePNGIO,
+  SDL3.Sys.Surface.savePNGIOSafe,
+  SDL3.Sys.Surface.savePNG,
+  SDL3.Sys.Surface.savePNGSafe,
+  SDL3.Sys.Surface.setSurfaceRLE,
+  SDL3.Sys.Surface.setSurfaceRLESafe,
+  SDL3.Sys.Surface.surfaceHasRLE,
+  SDL3.Sys.Surface.surfaceHasRLESafe,
+  SDL3.Sys.Surface.setSurfaceColorKey,
+  SDL3.Sys.Surface.setSurfaceColorKeySafe,
+  SDL3.Sys.Surface.surfaceHasColorKey,
+  SDL3.Sys.Surface.surfaceHasColorKeySafe,
+  SDL3.Sys.Surface.getSurfaceColorKey,
+  SDL3.Sys.Surface.getSurfaceColorKeySafe,
+  SDL3.Sys.Surface.setSurfaceColorMod,
+  SDL3.Sys.Surface.setSurfaceColorModSafe,
+  SDL3.Sys.Surface.getSurfaceColorMod,
+  SDL3.Sys.Surface.getSurfaceColorModSafe,
+  SDL3.Sys.Surface.setSurfaceAlphaMod,
+  SDL3.Sys.Surface.setSurfaceAlphaModSafe,
+  SDL3.Sys.Surface.getSurfaceAlphaMod,
+  SDL3.Sys.Surface.getSurfaceAlphaModSafe,
+  SDL3.Sys.Surface.setSurfaceBlendMode,
+  SDL3.Sys.Surface.setSurfaceBlendModeSafe,
+  SDL3.Sys.Surface.getSurfaceBlendMode,
+  SDL3.Sys.Surface.getSurfaceBlendModeSafe,
+  SDL3.Sys.Surface.setSurfaceClipRect,
+  SDL3.Sys.Surface.setSurfaceClipRectSafe,
+  SDL3.Sys.Surface.getSurfaceClipRect,
+  SDL3.Sys.Surface.getSurfaceClipRectSafe,
+  SDL3.Sys.Surface.flipSurface,
+  SDL3.Sys.Surface.flipSurfaceSafe,
+  SDL3.Sys.Surface.rotateSurface,
+  SDL3.Sys.Surface.rotateSurfaceSafe,
+  SDL3.Sys.Surface.duplicateSurface,
+  SDL3.Sys.Surface.duplicateSurfaceSafe,
+  SDL3.Sys.Surface.scaleSurface,
+  SDL3.Sys.Surface.scaleSurfaceSafe,
+  SDL3.Sys.Surface.convertSurface,
+  SDL3.Sys.Surface.convertSurfaceSafe,
+  SDL3.Sys.Surface.convertSurfaceAndColorspace,
+  SDL3.Sys.Surface.convertSurfaceAndColorspaceSafe,
+  SDL3.Sys.Surface.convertPixels,
+  SDL3.Sys.Surface.convertPixelsSafe,
+  SDL3.Sys.Surface.convertPixelsAndColorspace,
+  SDL3.Sys.Surface.convertPixelsAndColorspaceSafe,
+  SDL3.Sys.Surface.premultiplyAlpha,
+  SDL3.Sys.Surface.premultiplyAlphaSafe,
+  SDL3.Sys.Surface.premultiplySurfaceAlpha,
+  SDL3.Sys.Surface.premultiplySurfaceAlphaSafe,
+  SDL3.Sys.Surface.clearSurface,
+  SDL3.Sys.Surface.clearSurfaceSafe,
+  SDL3.Sys.Surface.fillSurfaceRect,
+  SDL3.Sys.Surface.fillSurfaceRectSafe,
+  SDL3.Sys.Surface.fillSurfaceRects,
+  SDL3.Sys.Surface.fillSurfaceRectsSafe,
+  SDL3.Sys.Surface.blitSurface,
+  SDL3.Sys.Surface.blitSurfaceSafe,
+  SDL3.Sys.Surface.blitSurfaceUnchecked,
+  SDL3.Sys.Surface.blitSurfaceUncheckedSafe,
+  SDL3.Sys.Surface.blitSurfaceScaled,
+  SDL3.Sys.Surface.blitSurfaceScaledSafe,
+  SDL3.Sys.Surface.blitSurfaceUncheckedScaled,
+  SDL3.Sys.Surface.blitSurfaceUncheckedScaledSafe,
+  SDL3.Sys.Surface.stretchSurface,
+  SDL3.Sys.Surface.stretchSurfaceSafe,
+  SDL3.Sys.Surface.blitSurfaceTiled,
+  SDL3.Sys.Surface.blitSurfaceTiledSafe,
+  SDL3.Sys.Surface.blitSurfaceTiledWithScale,
+  SDL3.Sys.Surface.blitSurfaceTiledWithScaleSafe,
+  SDL3.Sys.Surface.blitSurface9Grid,
+  SDL3.Sys.Surface.blitSurface9GridSafe,
+  SDL3.Sys.Surface.mapSurfaceRGB,
+  SDL3.Sys.Surface.mapSurfaceRGBSafe,
+  SDL3.Sys.Surface.mapSurfaceRGBA,
+  SDL3.Sys.Surface.mapSurfaceRGBASafe,
+  SDL3.Sys.Surface.readSurfacePixel,
+  SDL3.Sys.Surface.readSurfacePixelSafe,
+  SDL3.Sys.Surface.readSurfacePixelFloat,
+  SDL3.Sys.Surface.readSurfacePixelFloatSafe,
+  SDL3.Sys.Surface.writeSurfacePixel,
+  SDL3.Sys.Surface.writeSurfacePixelSafe,
+  SDL3.Sys.Surface.writeSurfacePixelFloat,
+  SDL3.Sys.Surface.writeSurfacePixelFloatSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Blendmode qualified
+import SDL3.Sys.Bindgen.Iostream qualified
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface
+import SDL3.Sys.Bindgen.Surface.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Surface.Unsafe qualified as Unsafe
+
+-- | Allocate a new surface with a specific pixel format.
+--
+--     The pixels of the new surface are initialized to zero.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createSurfaceFrom', 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateSurface@.
+--                   The safe flavor is 'createSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateSurface@, defined at @SDL3\/SDL_surface.h 173:43@
+createSurface
+  :: BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the surface.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the surface.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the SDL_PixelFormat for the new surface\'s pixel format.
+  -> IO (BG.Ptr SDL_Surface)
+createSurface =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_CreateSurface (Coerce.coerce x00) (Coerce.coerce x11) x22
+
+-- | Allocate a new surface with a specific pixel format.
+--
+--     The pixels of the new surface are initialized to zero.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createSurfaceFrom', 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateSurface@.
+--                   The unsafe flavor is 'createSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateSurface@, defined at @SDL3\/SDL_surface.h 173:43@
+createSurfaceSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the surface.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the surface.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the SDL_PixelFormat for the new surface\'s pixel format.
+  -> IO (BG.Ptr SDL_Surface)
+createSurfaceSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_CreateSurface (Coerce.coerce x00) (Coerce.coerce x11) x22
+
+-- | Allocate a new surface with a specific pixel format and existing pixel data.
+--
+--     No copy is made of the pixel data. Pixel data is not managed automatically; you must free the surface before you free the pixel data.
+--
+--     Pitch is the offset in bytes from one row of pixels to the next, e.g. @width*4@ for @SDL_PIXELFORMAT_RGBA8888@.
+--
+--     You may pass NULL for pixels and 0 for pitch to create a surface that you will fill in with valid values later.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createSurface', 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateSurfaceFrom@.
+--                   The safe flavor is 'createSurfaceFromSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateSurfaceFrom@, defined at @SDL3\/SDL_surface.h 203:43@
+createSurfaceFrom
+  :: BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the surface.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the surface.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the SDL_PixelFormat for the new surface\'s pixel format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@pixels@]: a pointer to existing pixel data.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@pitch@]: the number of bytes between each row, including padding.
+  -> IO (BG.Ptr SDL_Surface)
+createSurfaceFrom =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Unsafe.sDL_CreateSurfaceFrom (Coerce.coerce x00) (Coerce.coerce x11) x22 x33 (Coerce.coerce x44)
+
+-- | Allocate a new surface with a specific pixel format and existing pixel data.
+--
+--     No copy is made of the pixel data. Pixel data is not managed automatically; you must free the surface before you free the pixel data.
+--
+--     Pitch is the offset in bytes from one row of pixels to the next, e.g. @width*4@ for @SDL_PIXELFORMAT_RGBA8888@.
+--
+--     You may pass NULL for pixels and 0 for pitch to create a surface that you will fill in with valid values later.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createSurface', 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateSurfaceFrom@.
+--                   The unsafe flavor is 'createSurfaceFrom'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateSurfaceFrom@, defined at @SDL3\/SDL_surface.h 203:43@
+createSurfaceFromSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the surface.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the surface.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the SDL_PixelFormat for the new surface\'s pixel format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@pixels@]: a pointer to existing pixel data.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@pitch@]: the number of bytes between each row, including padding.
+  -> IO (BG.Ptr SDL_Surface)
+createSurfaceFromSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            Safe.sDL_CreateSurfaceFrom (Coerce.coerce x00) (Coerce.coerce x11) x22 x33 (Coerce.coerce x44)
+
+-- | Free a surface.
+--
+--     It is safe to pass NULL to this function.
+--
+--     [Thread safety]: No other thread should be using the surface when it is freed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createSurface', 'createSurfaceFrom'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroySurface@.
+--                   The safe flavor is 'destroySurfaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroySurface@, defined at @SDL3\/SDL_surface.h 219:34@
+destroySurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' to free.
+  -> IO ()
+destroySurface = Unsafe.sDL_DestroySurface
+
+-- | Free a surface.
+--
+--     It is safe to pass NULL to this function.
+--
+--     [Thread safety]: No other thread should be using the surface when it is freed.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createSurface', 'createSurfaceFrom'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroySurface@.
+--                   The unsafe flavor is 'destroySurface'
+--                   .
+--
+--     [C declaration]: @SDL_DestroySurface@, defined at @SDL3\/SDL_surface.h 219:34@
+destroySurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' to free.
+  -> IO ()
+destroySurfaceSafe = Safe.sDL_DestroySurface
+
+-- | Get the properties associated with a surface.
+--
+--     The following properties are understood by SDL:
+--
+--     * @'sDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point surfaces, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 203 for HDR10 surfaces and 1.0 for floating point surfaces.
+--
+--     * @'sDL_PROP_SURFACE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point surfaces, this defines the maximum dynamic range used by the content, in terms of the SDR white point. This defaults to 0.0, which disables tone mapping.
+--
+--     * @'sDL_PROP_SURFACE_TONEMAP_OPERATOR_STRING'@: the tone mapping operator used when compressing from a surface with high dynamic range to another with lower dynamic range. Currently this supports \"chrome\", which uses the same tone mapping that Chrome uses for HDR content, the form \"*=N\", where N is a floating point scale factor applied in linear space, and \"none\", which disables tone mapping. This defaults to \"chrome\".
+--
+--     * @'sDL_PROP_SURFACE_HOTSPOT_X_NUMBER'@: the hotspot pixel offset from the left edge of the image, if this surface is being used as a cursor.
+--
+--     * @'sDL_PROP_SURFACE_HOTSPOT_Y_NUMBER'@: the hotspot pixel offset from the top edge of the image, if this surface is being used as a cursor.
+--
+--     * @'sDL_PROP_SURFACE_ROTATION_FLOAT'@: the number of degrees a surface\'s data is meant to be rotated clockwise to make the image right-side up. Default
+--       1. This is used by the camera API, if a mobile device is oriented differently than what its camera provides (i.e. - the camera always provides portrait images but the phone is being held in landscape orientation). Since SDL 3.4.0.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSurfaceProperties@.
+--                   The safe flavor is 'getSurfacePropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSurfaceProperties@, defined at @SDL3\/SDL_surface.h 259:46@
+getSurfaceProperties
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getSurfaceProperties =
+  Unsafe.sDL_GetSurfaceProperties
+
+-- | Get the properties associated with a surface.
+--
+--     The following properties are understood by SDL:
+--
+--     * @'sDL_PROP_SURFACE_SDR_WHITE_POINT_FLOAT'@: for HDR10 and floating point surfaces, this defines the value of 100% diffuse white, with higher values being displayed in the High Dynamic Range headroom. This defaults to 203 for HDR10 surfaces and 1.0 for floating point surfaces.
+--
+--     * @'sDL_PROP_SURFACE_HDR_HEADROOM_FLOAT'@: for HDR10 and floating point surfaces, this defines the maximum dynamic range used by the content, in terms of the SDR white point. This defaults to 0.0, which disables tone mapping.
+--
+--     * @'sDL_PROP_SURFACE_TONEMAP_OPERATOR_STRING'@: the tone mapping operator used when compressing from a surface with high dynamic range to another with lower dynamic range. Currently this supports \"chrome\", which uses the same tone mapping that Chrome uses for HDR content, the form \"*=N\", where N is a floating point scale factor applied in linear space, and \"none\", which disables tone mapping. This defaults to \"chrome\".
+--
+--     * @'sDL_PROP_SURFACE_HOTSPOT_X_NUMBER'@: the hotspot pixel offset from the left edge of the image, if this surface is being used as a cursor.
+--
+--     * @'sDL_PROP_SURFACE_HOTSPOT_Y_NUMBER'@: the hotspot pixel offset from the top edge of the image, if this surface is being used as a cursor.
+--
+--     * @'sDL_PROP_SURFACE_ROTATION_FLOAT'@: the number of degrees a surface\'s data is meant to be rotated clockwise to make the image right-side up. Default
+--       1. This is used by the camera API, if a mobile device is oriented differently than what its camera provides (i.e. - the camera always provides portrait images but the phone is being held in landscape orientation). Since SDL 3.4.0.
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSurfaceProperties@.
+--                   The unsafe flavor is 'getSurfaceProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetSurfaceProperties@, defined at @SDL3\/SDL_surface.h 259:46@
+getSurfacePropertiesSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getSurfacePropertiesSafe =
+  Safe.sDL_GetSurfaceProperties
+
+-- | Set the colorspace used by a surface.
+--
+--     Setting the colorspace doesn\'t change the pixels, only how they are interpreted in color operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceColorspace'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetSurfaceColorspace@.
+--                   The safe flavor is 'setSurfaceColorspaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceColorspace@, defined at @SDL3\/SDL_surface.h 287:34@
+setSurfaceColorspace
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@colorspace@]: an SDL_Colorspace value describing the surface colorspace.
+  -> IO Bool
+setSurfaceColorspace =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetSurfaceColorspace x00 x11)
+
+-- | Set the colorspace used by a surface.
+--
+--     Setting the colorspace doesn\'t change the pixels, only how they are interpreted in color operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceColorspace'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetSurfaceColorspace@.
+--                   The unsafe flavor is 'setSurfaceColorspace'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceColorspace@, defined at @SDL3\/SDL_surface.h 287:34@
+setSurfaceColorspaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@colorspace@]: an SDL_Colorspace value describing the surface colorspace.
+  -> IO Bool
+setSurfaceColorspaceSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetSurfaceColorspace x00 x11)
+
+-- | Get the colorspace used by a surface.
+--
+--     The colorspace defaults to SDL_COLORSPACE_SRGB_LINEAR for floating point formats, SDL_COLORSPACE_HDR10 for 10-bit formats, SDL_COLORSPACE_SRGB for other RGB surfaces and SDL_COLORSPACE_BT709_FULL for YUV textures.
+--
+--     [Returns]: the colorspace used by the surface, or SDL_COLORSPACE_UNKNOWN if the surface is NULL.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceColorspace'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSurfaceColorspace@.
+--                   The safe flavor is 'getSurfaceColorspaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSurfaceColorspace@, defined at @SDL3\/SDL_surface.h 307:44@
+getSurfaceColorspace
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+getSurfaceColorspace =
+  Unsafe.sDL_GetSurfaceColorspace
+
+-- | Get the colorspace used by a surface.
+--
+--     The colorspace defaults to SDL_COLORSPACE_SRGB_LINEAR for floating point formats, SDL_COLORSPACE_HDR10 for 10-bit formats, SDL_COLORSPACE_SRGB for other RGB surfaces and SDL_COLORSPACE_BT709_FULL for YUV textures.
+--
+--     [Returns]: the colorspace used by the surface, or SDL_COLORSPACE_UNKNOWN if the surface is NULL.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceColorspace'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSurfaceColorspace@.
+--                   The unsafe flavor is 'getSurfaceColorspace'
+--                   .
+--
+--     [C declaration]: @SDL_GetSurfaceColorspace@, defined at @SDL3\/SDL_surface.h 307:44@
+getSurfaceColorspaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+getSurfaceColorspaceSafe =
+  Safe.sDL_GetSurfaceColorspace
+
+-- | Create a palette and associate it with a surface.
+--
+--     This function creates a palette compatible with the provided surface. The palette is then returned for you to modify, and the surface will automatically use the new palette in future operations. You do not need to destroy the returned palette, it will be freed when the reference count reaches 0, usually when the surface is destroyed.
+--
+--     Bitmap surfaces (with format SDL_PIXELFORMAT_INDEX1LSB or SDL_PIXELFORMAT_INDEX1MSB) will have the palette initialized with 0 as white and 1 as black. Other surfaces will get a palette initialized with white in every entry.
+--
+--     If this function is called for a surface that already has a palette, a new palette will be created to replace it.
+--
+--     [Returns]: a new SDL_Palette structure on success or NULL on failure (e.g. if the surface didn\'t have an index format); call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Pixels.setPaletteColors'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateSurfacePalette@.
+--                   The safe flavor is 'createSurfacePaletteSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateSurfacePalette@, defined at @SDL3\/SDL_surface.h 338:43@
+createSurfacePalette
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+createSurfacePalette =
+  Unsafe.sDL_CreateSurfacePalette
+
+-- | Create a palette and associate it with a surface.
+--
+--     This function creates a palette compatible with the provided surface. The palette is then returned for you to modify, and the surface will automatically use the new palette in future operations. You do not need to destroy the returned palette, it will be freed when the reference count reaches 0, usually when the surface is destroyed.
+--
+--     Bitmap surfaces (with format SDL_PIXELFORMAT_INDEX1LSB or SDL_PIXELFORMAT_INDEX1MSB) will have the palette initialized with 0 as white and 1 as black. Other surfaces will get a palette initialized with white in every entry.
+--
+--     If this function is called for a surface that already has a palette, a new palette will be created to replace it.
+--
+--     [Returns]: a new SDL_Palette structure on success or NULL on failure (e.g. if the surface didn\'t have an index format); call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Pixels.setPaletteColors'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateSurfacePalette@.
+--                   The unsafe flavor is 'createSurfacePalette'
+--                   .
+--
+--     [C declaration]: @SDL_CreateSurfacePalette@, defined at @SDL3\/SDL_surface.h 338:43@
+createSurfacePaletteSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+createSurfacePaletteSafe =
+  Safe.sDL_CreateSurfacePalette
+
+-- | Set the palette used by a surface.
+--
+--     Setting the palette keeps an internal reference to the palette, which can be safely destroyed afterwards.
+--
+--     A single palette can be shared with many surfaces.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Pixels.createPalette', 'getSurfacePalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetSurfacePalette@.
+--                   The safe flavor is 'setSurfacePaletteSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfacePalette@, defined at @SDL3\/SDL_surface.h 361:34@
+setSurfacePalette
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the SDL_Palette structure to use.
+  -> IO Bool
+setSurfacePalette =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetSurfacePalette x00 x11)
+
+-- | Set the palette used by a surface.
+--
+--     Setting the palette keeps an internal reference to the palette, which can be safely destroyed afterwards.
+--
+--     A single palette can be shared with many surfaces.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Pixels.createPalette', 'getSurfacePalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetSurfacePalette@.
+--                   The unsafe flavor is 'setSurfacePalette'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfacePalette@, defined at @SDL3\/SDL_surface.h 361:34@
+setSurfacePaletteSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: the SDL_Palette structure to use.
+  -> IO Bool
+setSurfacePaletteSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetSurfacePalette x00 x11)
+
+-- | Get the palette used by a surface.
+--
+--     [Returns]: a pointer to the palette used by the surface, or NULL if there is no palette used.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfacePalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSurfacePalette@.
+--                   The safe flavor is 'getSurfacePaletteSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSurfacePalette@, defined at @SDL3\/SDL_surface.h 376:43@
+getSurfacePalette
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+getSurfacePalette = Unsafe.sDL_GetSurfacePalette
+
+-- | Get the palette used by a surface.
+--
+--     [Returns]: a pointer to the palette used by the surface, or NULL if there is no palette used.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfacePalette'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSurfacePalette@.
+--                   The unsafe flavor is 'getSurfacePalette'
+--                   .
+--
+--     [C declaration]: @SDL_GetSurfacePalette@, defined at @SDL3\/SDL_surface.h 376:43@
+getSurfacePaletteSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette)
+getSurfacePaletteSafe = Safe.sDL_GetSurfacePalette
+
+-- | Add an alternate version of a surface.
+--
+--     This function adds an alternate version of this surface, usually used for content with high DPI representations like cursors or icons. The size, format, and content do not need to match the original surface, and these alternate versions will not be updated when the original surface changes.
+--
+--     This function adds a reference to the alternate version, so you should call @'destroySurface'@ on the image after this call.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'removeSurfaceAlternateImages', 'getSurfaceImages', 'surfaceHasAlternateImages'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AddSurfaceAlternateImage@.
+--                   The safe flavor is 'addSurfaceAlternateImageSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddSurfaceAlternateImage@, defined at @SDL3\/SDL_surface.h 404:34@
+addSurfaceAlternateImage
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@image@]: a pointer to an alternate 'SDL_Surface' to associate with this surface.
+  -> IO Bool
+addSurfaceAlternateImage =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_AddSurfaceAlternateImage x00 x11)
+
+-- | Add an alternate version of a surface.
+--
+--     This function adds an alternate version of this surface, usually used for content with high DPI representations like cursors or icons. The size, format, and content do not need to match the original surface, and these alternate versions will not be updated when the original surface changes.
+--
+--     This function adds a reference to the alternate version, so you should call @'destroySurface'@ on the image after this call.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'removeSurfaceAlternateImages', 'getSurfaceImages', 'surfaceHasAlternateImages'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddSurfaceAlternateImage@.
+--                   The unsafe flavor is 'addSurfaceAlternateImage'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddSurfaceAlternateImage@, defined at @SDL3\/SDL_surface.h 404:34@
+addSurfaceAlternateImageSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@image@]: a pointer to an alternate 'SDL_Surface' to associate with this surface.
+  -> IO Bool
+addSurfaceAlternateImageSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_AddSurfaceAlternateImage x00 x11)
+
+-- | Return whether a surface has alternate versions available.
+--
+--     [Returns]: true if alternate versions are available or false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addSurfaceAlternateImage', 'removeSurfaceAlternateImages', 'getSurfaceImages'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SurfaceHasAlternateImages@.
+--                   The safe flavor is 'surfaceHasAlternateImagesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SurfaceHasAlternateImages@, defined at @SDL3\/SDL_surface.h 420:34@
+surfaceHasAlternateImages
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO Bool
+surfaceHasAlternateImages =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_SurfaceHasAlternateImages x00)
+
+-- | Return whether a surface has alternate versions available.
+--
+--     [Returns]: true if alternate versions are available or false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addSurfaceAlternateImage', 'removeSurfaceAlternateImages', 'getSurfaceImages'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SurfaceHasAlternateImages@.
+--                   The unsafe flavor is 'surfaceHasAlternateImages'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SurfaceHasAlternateImages@, defined at @SDL3\/SDL_surface.h 420:34@
+surfaceHasAlternateImagesSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO Bool
+surfaceHasAlternateImagesSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_SurfaceHasAlternateImages x00)
+
+-- | Get an array including all versions of a surface.
+--
+--     This returns all versions of a surface, with the surface being queried as the first element in the returned array.
+--
+--     Freeing the array of surfaces does not affect the surfaces in the array. They are still referenced by the surface being queried and will be cleaned up normally.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Surface' pointers or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addSurfaceAlternateImage', 'removeSurfaceAlternateImages', 'surfaceHasAlternateImages'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSurfaceImages@.
+--                   The safe flavor is 'getSurfaceImagesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSurfaceImages@, defined at @SDL3\/SDL_surface.h 448:44@
+getSurfaceImages
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of surface pointers returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Surface))
+getSurfaceImages = Unsafe.sDL_GetSurfaceImages
+
+-- | Get an array including all versions of a surface.
+--
+--     This returns all versions of a surface, with the surface being queried as the first element in the returned array.
+--
+--     Freeing the array of surfaces does not affect the surfaces in the array. They are still referenced by the surface being queried and will be cleaned up normally.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Surface' pointers or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addSurfaceAlternateImage', 'removeSurfaceAlternateImages', 'surfaceHasAlternateImages'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSurfaceImages@.
+--                   The unsafe flavor is 'getSurfaceImages'
+--                   .
+--
+--     [C declaration]: @SDL_GetSurfaceImages@, defined at @SDL3\/SDL_surface.h 448:44@
+getSurfaceImagesSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of surface pointers returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Surface))
+getSurfaceImagesSafe = Safe.sDL_GetSurfaceImages
+
+-- | Remove all alternate versions of a surface.
+--
+--     This function removes a reference from all the alternative versions, destroying them if this is the last reference to them.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addSurfaceAlternateImage', 'getSurfaceImages', 'surfaceHasAlternateImages'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RemoveSurfaceAlternateImages@.
+--                   The safe flavor is 'removeSurfaceAlternateImagesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_RemoveSurfaceAlternateImages@, defined at @SDL3\/SDL_surface.h 467:34@
+removeSurfaceAlternateImages
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> IO ()
+removeSurfaceAlternateImages =
+  Unsafe.sDL_RemoveSurfaceAlternateImages
+
+-- | Remove all alternate versions of a surface.
+--
+--     This function removes a reference from all the alternative versions, destroying them if this is the last reference to them.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addSurfaceAlternateImage', 'getSurfaceImages', 'surfaceHasAlternateImages'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RemoveSurfaceAlternateImages@.
+--                   The unsafe flavor is 'removeSurfaceAlternateImages'
+--                   .
+--
+--     [C declaration]: @SDL_RemoveSurfaceAlternateImages@, defined at @SDL3\/SDL_surface.h 467:34@
+removeSurfaceAlternateImagesSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> IO ()
+removeSurfaceAlternateImagesSafe =
+  Safe.sDL_RemoveSurfaceAlternateImages
+
+-- | Set up a surface for directly accessing the pixels.
+--
+--     Between calls to @'lockSurface'@ \/ @'unlockSurface'@, you can write to and read from @surface->pixels@, using the pixel format stored in @surface->format@. Once you are done accessing the surface, you should use @'unlockSurface'@ to release it.
+--
+--     Not all surfaces require locking. If @SDL_MUSTLOCK(surface)@ evaluates to 0, then you can read and write to the surface at any time, and the pixel format of the surface will not change.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces. The locking referred to by this function is making the pixels available for direct access, not thread-safe locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MUSTLOCK@, 'unlockSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LockSurface@.
+--                   The safe flavor is 'lockSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LockSurface@, defined at @SDL3\/SDL_surface.h 495:34@
+lockSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be locked.
+  -> IO Bool
+lockSurface =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_LockSurface x00)
+
+-- | Set up a surface for directly accessing the pixels.
+--
+--     Between calls to @'lockSurface'@ \/ @'unlockSurface'@, you can write to and read from @surface->pixels@, using the pixel format stored in @surface->format@. Once you are done accessing the surface, you should use @'unlockSurface'@ to release it.
+--
+--     Not all surfaces require locking. If @SDL_MUSTLOCK(surface)@ evaluates to 0, then you can read and write to the surface at any time, and the pixel format of the surface will not change.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces. The locking referred to by this function is making the pixels available for direct access, not thread-safe locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_MUSTLOCK@, 'unlockSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LockSurface@.
+--                   The unsafe flavor is 'lockSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LockSurface@, defined at @SDL3\/SDL_surface.h 495:34@
+lockSurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be locked.
+  -> IO Bool
+lockSurfaceSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_LockSurface x00)
+
+-- | Release a surface after directly accessing the pixels.
+--
+--     [Thread safety]: This function is not thread safe. The locking referred to by this function is making the pixels available for direct access, not thread-safe locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UnlockSurface@.
+--                   The safe flavor is 'unlockSurfaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockSurface@, defined at @SDL3\/SDL_surface.h 510:34@
+unlockSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be unlocked.
+  -> IO ()
+unlockSurface = Unsafe.sDL_UnlockSurface
+
+-- | Release a surface after directly accessing the pixels.
+--
+--     [Thread safety]: This function is not thread safe. The locking referred to by this function is making the pixels available for direct access, not thread-safe locking.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'lockSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UnlockSurface@.
+--                   The unsafe flavor is 'unlockSurface'
+--                   .
+--
+--     [C declaration]: @SDL_UnlockSurface@, defined at @SDL3\/SDL_surface.h 510:34@
+unlockSurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be unlocked.
+  -> IO ()
+unlockSurfaceSafe = Safe.sDL_UnlockSurface
+
+-- | Load a BMP or PNG image from a seekable SDL data stream.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'destroySurface', 'loadSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadSurface_IO@.
+--                   The safe flavor is 'loadSurfaceIOSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadSurface_IO@, defined at @SDL3\/SDL_surface.h 531:43@
+loadSurfaceIO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+loadSurfaceIO =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_LoadSurface_IO x00 (CBool.fromBool x11)
+
+-- | Load a BMP or PNG image from a seekable SDL data stream.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'destroySurface', 'loadSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadSurface_IO@.
+--                   The unsafe flavor is 'loadSurfaceIO'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadSurface_IO@, defined at @SDL3\/SDL_surface.h 531:43@
+loadSurfaceIOSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+loadSurfaceIOSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_LoadSurface_IO x00 (CBool.fromBool x11)
+
+-- | Load a BMP or PNG image from a file.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'destroySurface', 'loadSurfaceIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadSurface@.
+--                   The safe flavor is 'loadSurfaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_LoadSurface@, defined at @SDL3\/SDL_surface.h 550:43@
+loadSurface
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the file to load.
+  -> IO (BG.Ptr SDL_Surface)
+loadSurface = Unsafe.sDL_LoadSurface
+
+-- | Load a BMP or PNG image from a file.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'destroySurface', 'loadSurfaceIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadSurface@.
+--                   The unsafe flavor is 'loadSurface'
+--                   .
+--
+--     [C declaration]: @SDL_LoadSurface@, defined at @SDL3\/SDL_surface.h 550:43@
+loadSurfaceSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the file to load.
+  -> IO (BG.Ptr SDL_Surface)
+loadSurfaceSafe = Safe.sDL_LoadSurface
+
+-- | Load a BMP image from a seekable SDL data stream.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroySurface', 'loadBMP', 'saveBMPIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadBMP_IO@.
+--                   The safe flavor is 'loadBMPIOSafe'
+--                   : reads the whole stream; a Haskell SDL_IOStreamInterface re-enters synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadBMP_IO@, defined at @SDL3\/SDL_surface.h 572:43@
+loadBMPIO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+loadBMPIO =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_LoadBMP_IO x00 (CBool.fromBool x11)
+
+-- | Load a BMP image from a seekable SDL data stream.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroySurface', 'loadBMP', 'saveBMPIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadBMP_IO@.
+--                   The unsafe flavor is 'loadBMPIO'
+--                   : reads the whole stream; a Haskell SDL_IOStreamInterface re-enters synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadBMP_IO@, defined at @SDL3\/SDL_surface.h 572:43@
+loadBMPIOSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+loadBMPIOSafe =
+  \x00 ->
+    \x11 -> Safe.sDL_LoadBMP_IO x00 (CBool.fromBool x11)
+
+-- | Load a BMP image from a file.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroySurface', 'loadBMPIO', 'saveBMP'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadBMP@.
+--                   The safe flavor is 'loadBMPSafe'
+--                   : blocks on whole-file I\/O.
+--
+--     [C declaration]: @SDL_LoadBMP@, defined at @SDL3\/SDL_surface.h 592:43@
+loadBMP
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the BMP file to load.
+  -> IO (BG.Ptr SDL_Surface)
+loadBMP = Unsafe.sDL_LoadBMP
+
+-- | Load a BMP image from a file.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroySurface', 'loadBMPIO', 'saveBMP'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadBMP@.
+--                   The unsafe flavor is 'loadBMP'
+--                   : blocks on whole-file I\/O.
+--
+--     [C declaration]: @SDL_LoadBMP@, defined at @SDL3\/SDL_surface.h 592:43@
+loadBMPSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the BMP file to load.
+  -> IO (BG.Ptr SDL_Surface)
+loadBMPSafe = Safe.sDL_LoadBMP
+
+-- | Save a surface to a seekable SDL data stream in BMP format.
+--
+--     Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the BMP directly. Other RGB formats with 8-bit or higher get converted to a 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit surface before they are saved. YUV and paletted 1-bit and 4-bit formats are not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadBMPIO', 'saveBMP'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SaveBMP_IO@.
+--                   The safe flavor is 'saveBMPIOSafe'
+--                   : writes the whole stream; a Haskell SDL_IOStreamInterface re-enters synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SaveBMP_IO@, defined at @SDL3\/SDL_surface.h 618:34@
+saveBMPIO
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: a data stream to save to.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @dst@ before returning, even in the case of an error.
+  -> IO Bool
+saveBMPIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SaveBMP_IO x00 x11 (CBool.fromBool x22))
+
+-- | Save a surface to a seekable SDL data stream in BMP format.
+--
+--     Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the BMP directly. Other RGB formats with 8-bit or higher get converted to a 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit surface before they are saved. YUV and paletted 1-bit and 4-bit formats are not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadBMPIO', 'saveBMP'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SaveBMP_IO@.
+--                   The unsafe flavor is 'saveBMPIO'
+--                   : writes the whole stream; a Haskell SDL_IOStreamInterface re-enters synchronously.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SaveBMP_IO@, defined at @SDL3\/SDL_surface.h 618:34@
+saveBMPIOSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: a data stream to save to.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @dst@ before returning, even in the case of an error.
+  -> IO Bool
+saveBMPIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SaveBMP_IO x00 x11 (CBool.fromBool x22))
+
+-- | Save a surface to a file in BMP format.
+--
+--     Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the BMP directly. Other RGB formats with 8-bit or higher get converted to a 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit surface before they are saved. YUV and paletted 1-bit and 4-bit formats are not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadBMP', 'saveBMPIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SaveBMP@.
+--                   The safe flavor is 'saveBMPSafe'
+--                   : blocks on whole-file I\/O.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SaveBMP@, defined at @SDL3\/SDL_surface.h 642:34@
+saveBMP
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a file to save to.
+  -> IO Bool
+saveBMP =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SaveBMP x00 x11)
+
+-- | Save a surface to a file in BMP format.
+--
+--     Surfaces with a 24-bit, 32-bit and paletted 8-bit format get saved in the BMP directly. Other RGB formats with 8-bit or higher get converted to a 24-bit surface or, if they have an alpha mask or a colorkey, to a 32-bit surface before they are saved. YUV and paletted 1-bit and 4-bit formats are not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'loadBMP', 'saveBMPIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SaveBMP@.
+--                   The unsafe flavor is 'saveBMP'
+--                   : blocks on whole-file I\/O.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SaveBMP@, defined at @SDL3\/SDL_surface.h 642:34@
+saveBMPSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a file to save to.
+  -> IO Bool
+saveBMPSafe =
+  \x00 ->
+    \x11 -> fmap CBool.toBool (Safe.sDL_SaveBMP x00 x11)
+
+-- | Load a PNG image from a seekable SDL data stream.
+--
+--     This is intended as a convenience function for loading images from trusted sources. If you want to load arbitrary images you should use libpng or another image loading library designed with security in mind.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'destroySurface', 'loadPNG', 'savePNGIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadPNG_IO@.
+--                   The safe flavor is 'loadPNGIOSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadPNG_IO@, defined at @SDL3\/SDL_surface.h 668:43@
+loadPNGIO
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+loadPNGIO =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_LoadPNG_IO x00 (CBool.fromBool x11)
+
+-- | Load a PNG image from a seekable SDL data stream.
+--
+--     This is intended as a convenience function for loading images from trusted sources. If you want to load arbitrary images you should use libpng or another image loading library designed with security in mind.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'destroySurface', 'loadPNG', 'savePNGIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadPNG_IO@.
+--                   The unsafe flavor is 'loadPNGIO'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_LoadPNG_IO@, defined at @SDL3\/SDL_surface.h 668:43@
+loadPNGIOSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@src@]: the data stream for the surface.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @src@ before returning, even in the case of an error.
+  -> IO (BG.Ptr SDL_Surface)
+loadPNGIOSafe =
+  \x00 ->
+    \x11 -> Safe.sDL_LoadPNG_IO x00 (CBool.fromBool x11)
+
+-- | Load a PNG image from a file.
+--
+--     This is intended as a convenience function for loading images from trusted sources. If you want to load arbitrary images you should use libpng or another image loading library designed with security in mind.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'destroySurface', 'loadPNGIO', 'savePNG'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_LoadPNG@.
+--                   The safe flavor is 'loadPNGSafe'
+--                   .
+--
+--     [C declaration]: @SDL_LoadPNG@, defined at @SDL3\/SDL_surface.h 692:43@
+loadPNG
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the PNG file to load.
+  -> IO (BG.Ptr SDL_Surface)
+loadPNG = Unsafe.sDL_LoadPNG
+
+-- | Load a PNG image from a file.
+--
+--     This is intended as a convenience function for loading images from trusted sources. If you want to load arbitrary images you should use libpng or another image loading library designed with security in mind.
+--
+--     The new surface should be freed with @'destroySurface'@. Not doing so will result in a memory leak.
+--
+--     [Returns]: a pointer to a new 'SDL_Surface' structure or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'destroySurface', 'loadPNGIO', 'savePNG'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_LoadPNG@.
+--                   The unsafe flavor is 'loadPNG'
+--                   .
+--
+--     [C declaration]: @SDL_LoadPNG@, defined at @SDL3\/SDL_surface.h 692:43@
+loadPNGSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: the PNG file to load.
+  -> IO (BG.Ptr SDL_Surface)
+loadPNGSafe = Safe.sDL_LoadPNG
+
+-- | Save a surface to a seekable SDL data stream in PNG format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'loadPNGIO', 'savePNG'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SavePNG_IO@.
+--                   The safe flavor is 'savePNGIOSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SavePNG_IO@, defined at @SDL3\/SDL_surface.h 712:34@
+savePNGIO
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: a data stream to save to.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @dst@ before returning, even in the case of an error.
+  -> IO Bool
+savePNGIO =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SavePNG_IO x00 x11 (CBool.fromBool x22))
+
+-- | Save a surface to a seekable SDL data stream in PNG format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'loadPNGIO', 'savePNG'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SavePNG_IO@.
+--                   The unsafe flavor is 'savePNGIO'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SavePNG_IO@, defined at @SDL3\/SDL_surface.h 712:34@
+savePNGIOSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> BG.Ptr SDL3.Sys.Bindgen.Iostream.SDL_IOStream
+  -- ^
+  --
+  --           [@dst@]: a data stream to save to.
+  -> Bool
+  -- ^
+  --
+  --           [@closeio@]: if true, calls 'SDL3.Sys.Iostream.closeIO' on @dst@ before returning, even in the case of an error.
+  -> IO Bool
+savePNGIOSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SavePNG_IO x00 x11 (CBool.fromBool x22))
+
+-- | Save a surface to a file in PNG format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'loadPNG', 'savePNGIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SavePNG@.
+--                   The safe flavor is 'savePNGSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SavePNG@, defined at @SDL3\/SDL_surface.h 730:34@
+savePNG
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a file to save to.
+  -> IO Bool
+savePNG =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SavePNG x00 x11)
+
+-- | Save a surface to a file in PNG format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'loadPNG', 'savePNGIO'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SavePNG@.
+--                   The unsafe flavor is 'savePNG'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SavePNG@, defined at @SDL3\/SDL_surface.h 730:34@
+savePNGSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure containing the image to be saved.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@file@]: a file to save to.
+  -> IO Bool
+savePNGSafe =
+  \x00 ->
+    \x11 -> fmap CBool.toBool (Safe.sDL_SavePNG x00 x11)
+
+-- | Set the RLE acceleration hint for a surface.
+--
+--     If RLE is enabled, color key and alpha blending blits are much faster, but the surface must be locked before directly accessing the pixels.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface', 'lockSurface', 'unlockSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetSurfaceRLE@.
+--                   The safe flavor is 'setSurfaceRLESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceRLE@, defined at @SDL3\/SDL_surface.h 752:34@
+setSurfaceRLE
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to optimize.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: true to enable RLE acceleration, false to disable it.
+  -> IO Bool
+setSurfaceRLE =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetSurfaceRLE x00 (CBool.fromBool x11))
+
+-- | Set the RLE acceleration hint for a surface.
+--
+--     If RLE is enabled, color key and alpha blending blits are much faster, but the surface must be locked before directly accessing the pixels.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface', 'lockSurface', 'unlockSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetSurfaceRLE@.
+--                   The unsafe flavor is 'setSurfaceRLE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceRLE@, defined at @SDL3\/SDL_surface.h 752:34@
+setSurfaceRLESafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to optimize.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: true to enable RLE acceleration, false to disable it.
+  -> IO Bool
+setSurfaceRLESafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetSurfaceRLE x00 (CBool.fromBool x11))
+
+-- | Returns whether the surface is RLE enabled.
+--
+--     It is safe to pass a NULL @surface@ here; it will return false.
+--
+--     [Returns]: true if the surface is RLE enabled, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceRLE'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SurfaceHasRLE@.
+--                   The safe flavor is 'surfaceHasRLESafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SurfaceHasRLE@, defined at @SDL3\/SDL_surface.h 768:34@
+surfaceHasRLE
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO Bool
+surfaceHasRLE =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_SurfaceHasRLE x00)
+
+-- | Returns whether the surface is RLE enabled.
+--
+--     It is safe to pass a NULL @surface@ here; it will return false.
+--
+--     [Returns]: true if the surface is RLE enabled, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceRLE'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SurfaceHasRLE@.
+--                   The unsafe flavor is 'surfaceHasRLE'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SurfaceHasRLE@, defined at @SDL3\/SDL_surface.h 768:34@
+surfaceHasRLESafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO Bool
+surfaceHasRLESafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_SurfaceHasRLE x00)
+
+-- | Set the color key (transparent pixel) in a surface.
+--
+--     The color key defines a pixel value that will be treated as transparent in a blit. For example, one can use this to specify that cyan pixels should be considered transparent, and therefore not rendered.
+--
+--     It is a pixel of the format used by the surface, as generated by 'SDL3.Sys.Pixels.mapRGB'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceColorKey', 'setSurfaceRLE', 'surfaceHasColorKey'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetSurfaceColorKey@.
+--                   The safe flavor is 'setSurfaceColorKeySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceColorKey@, defined at @SDL3\/SDL_surface.h 795:34@
+setSurfaceColorKey
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: true to enable color key, false to disable color key.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@key@]: the transparent pixel.
+  -> IO Bool
+setSurfaceColorKey =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetSurfaceColorKey x00 (CBool.fromBool x11) (Coerce.coerce x22))
+
+-- | Set the color key (transparent pixel) in a surface.
+--
+--     The color key defines a pixel value that will be treated as transparent in a blit. For example, one can use this to specify that cyan pixels should be considered transparent, and therefore not rendered.
+--
+--     It is a pixel of the format used by the surface, as generated by 'SDL3.Sys.Pixels.mapRGB'.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceColorKey', 'setSurfaceRLE', 'surfaceHasColorKey'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetSurfaceColorKey@.
+--                   The unsafe flavor is 'setSurfaceColorKey'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceColorKey@, defined at @SDL3\/SDL_surface.h 795:34@
+setSurfaceColorKeySafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: true to enable color key, false to disable color key.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@key@]: the transparent pixel.
+  -> IO Bool
+setSurfaceColorKeySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetSurfaceColorKey x00 (CBool.fromBool x11) (Coerce.coerce x22))
+
+-- | Returns whether the surface has a color key.
+--
+--     It is safe to pass a NULL @surface@ here; it will return false.
+--
+--     [Returns]: true if the surface has a color key, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceColorKey', 'getSurfaceColorKey'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SurfaceHasColorKey@.
+--                   The safe flavor is 'surfaceHasColorKeySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SurfaceHasColorKey@, defined at @SDL3\/SDL_surface.h 812:34@
+surfaceHasColorKey
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO Bool
+surfaceHasColorKey =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_SurfaceHasColorKey x00)
+
+-- | Returns whether the surface has a color key.
+--
+--     It is safe to pass a NULL @surface@ here; it will return false.
+--
+--     [Returns]: true if the surface has a color key, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceColorKey', 'getSurfaceColorKey'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SurfaceHasColorKey@.
+--                   The unsafe flavor is 'surfaceHasColorKey'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SurfaceHasColorKey@, defined at @SDL3\/SDL_surface.h 812:34@
+surfaceHasColorKeySafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> IO Bool
+surfaceHasColorKeySafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_SurfaceHasColorKey x00)
+
+-- | Get the color key (transparent pixel) for a surface.
+--
+--     The color key is a pixel of the format used by the surface, as generated by 'SDL3.Sys.Pixels.mapRGB'.
+--
+--     If the surface doesn\'t have color key enabled this function returns false.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceColorKey', 'surfaceHasColorKey'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSurfaceColorKey@.
+--                   The safe flavor is 'getSurfaceColorKeySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSurfaceColorKey@, defined at @SDL3\/SDL_surface.h 834:34@
+getSurfaceColorKey
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@key@]: a pointer filled in with the transparent pixel.
+  -> IO Bool
+getSurfaceColorKey =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetSurfaceColorKey x00 x11)
+
+-- | Get the color key (transparent pixel) for a surface.
+--
+--     The color key is a pixel of the format used by the surface, as generated by 'SDL3.Sys.Pixels.mapRGB'.
+--
+--     If the surface doesn\'t have color key enabled this function returns false.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceColorKey', 'surfaceHasColorKey'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSurfaceColorKey@.
+--                   The unsafe flavor is 'getSurfaceColorKey'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSurfaceColorKey@, defined at @SDL3\/SDL_surface.h 834:34@
+getSurfaceColorKeySafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@key@]: a pointer filled in with the transparent pixel.
+  -> IO Bool
+getSurfaceColorKeySafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetSurfaceColorKey x00 x11)
+
+-- | Set an additional color value multiplied into blit operations.
+--
+--     When this surface is blitted, during the blit operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * (color \/ 255)@
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceColorMod', 'setSurfaceAlphaMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetSurfaceColorMod@.
+--                   The safe flavor is 'setSurfaceColorModSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceColorMod@, defined at @SDL3\/SDL_surface.h 860:34@
+setSurfaceColorMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into blit operations.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into blit operations.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into blit operations.
+  -> IO Bool
+setSurfaceColorMod =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Unsafe.sDL_SetSurfaceColorMod x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Set an additional color value multiplied into blit operations.
+--
+--     When this surface is blitted, during the blit operation each source color channel is modulated by the appropriate color value according to the following formula:
+--
+--     @srcC = srcC * (color \/ 255)@
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceColorMod', 'setSurfaceAlphaMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetSurfaceColorMod@.
+--                   The unsafe flavor is 'setSurfaceColorMod'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceColorMod@, defined at @SDL3\/SDL_surface.h 860:34@
+setSurfaceColorModSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red color value multiplied into blit operations.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green color value multiplied into blit operations.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue color value multiplied into blit operations.
+  -> IO Bool
+setSurfaceColorModSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            CBool.toBool
+            (Safe.sDL_SetSurfaceColorMod x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Get the additional color value multiplied into blit operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceAlphaMod', 'setSurfaceColorMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSurfaceColorMod@.
+--                   The safe flavor is 'getSurfaceColorModSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSurfaceColorMod@, defined at @SDL3\/SDL_surface.h 881:34@
+getSurfaceColorMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO Bool
+getSurfaceColorMod =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_GetSurfaceColorMod x00 x11 x22 x33)
+
+-- | Get the additional color value multiplied into blit operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceAlphaMod', 'setSurfaceColorMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSurfaceColorMod@.
+--                   The unsafe flavor is 'getSurfaceColorMod'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSurfaceColorMod@, defined at @SDL3\/SDL_surface.h 881:34@
+getSurfaceColorModSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the current red color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the current green color value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the current blue color value.
+  -> IO Bool
+getSurfaceColorModSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_GetSurfaceColorMod x00 x11 x22 x33)
+
+-- | Set an additional alpha value used in blit operations.
+--
+--     When this surface is blitted, during the blit operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * (alpha \/ 255)@
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceAlphaMod', 'setSurfaceColorMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetSurfaceAlphaMod@.
+--                   The safe flavor is 'setSurfaceAlphaModSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceAlphaMod@, defined at @SDL3\/SDL_surface.h 904:34@
+setSurfaceAlphaMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@alpha@]: the alpha value multiplied into blit operations.
+  -> IO Bool
+setSurfaceAlphaMod =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetSurfaceAlphaMod x00 (Coerce.coerce x11))
+
+-- | Set an additional alpha value used in blit operations.
+--
+--     When this surface is blitted, during the blit operation the source alpha value is modulated by this alpha value according to the following formula:
+--
+--     @srcA = srcA * (alpha \/ 255)@
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceAlphaMod', 'setSurfaceColorMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetSurfaceAlphaMod@.
+--                   The unsafe flavor is 'setSurfaceAlphaMod'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceAlphaMod@, defined at @SDL3\/SDL_surface.h 904:34@
+setSurfaceAlphaModSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@alpha@]: the alpha value multiplied into blit operations.
+  -> IO Bool
+setSurfaceAlphaModSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetSurfaceAlphaMod x00 (Coerce.coerce x11))
+
+-- | Get the additional alpha value used in blit operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceColorMod', 'setSurfaceAlphaMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSurfaceAlphaMod@.
+--                   The safe flavor is 'getSurfaceAlphaModSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSurfaceAlphaMod@, defined at @SDL3\/SDL_surface.h 921:34@
+getSurfaceAlphaMod
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO Bool
+getSurfaceAlphaMod =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetSurfaceAlphaMod x00 x11)
+
+-- | Get the additional alpha value used in blit operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceColorMod', 'setSurfaceAlphaMod'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSurfaceAlphaMod@.
+--                   The unsafe flavor is 'getSurfaceAlphaMod'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSurfaceAlphaMod@, defined at @SDL3\/SDL_surface.h 921:34@
+getSurfaceAlphaModSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@alpha@]: a pointer filled in with the current alpha value.
+  -> IO Bool
+getSurfaceAlphaModSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetSurfaceAlphaMod x00 x11)
+
+-- | Set the blend mode used for blit operations.
+--
+--     To copy a surface to another surface (or texture) without blending with the existing data, the blendmode of the SOURCE surface should be set to @SDL_BLENDMODE_NONE@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetSurfaceBlendMode@.
+--                   The safe flavor is 'setSurfaceBlendModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceBlendMode@, defined at @SDL3\/SDL_surface.h 942:34@
+setSurfaceBlendMode
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for blit blending.
+  -> IO Bool
+setSurfaceBlendMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetSurfaceBlendMode x00 x11)
+
+-- | Set the blend mode used for blit operations.
+--
+--     To copy a surface to another surface (or texture) without blending with the existing data, the blendmode of the SOURCE surface should be set to @SDL_BLENDMODE_NONE@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetSurfaceBlendMode@.
+--                   The unsafe flavor is 'setSurfaceBlendMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceBlendMode@, defined at @SDL3\/SDL_surface.h 942:34@
+setSurfaceBlendModeSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to update.
+  -> SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: the SDL_BlendMode to use for blit blending.
+  -> IO Bool
+setSurfaceBlendModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetSurfaceBlendMode x00 x11)
+
+-- | Get the blend mode used for blit operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSurfaceBlendMode@.
+--                   The safe flavor is 'getSurfaceBlendModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSurfaceBlendMode@, defined at @SDL3\/SDL_surface.h 958:34@
+getSurfaceBlendMode
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO Bool
+getSurfaceBlendMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetSurfaceBlendMode x00 x11)
+
+-- | Get the blend mode used for blit operations.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceBlendMode'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSurfaceBlendMode@.
+--                   The unsafe flavor is 'getSurfaceBlendMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSurfaceBlendMode@, defined at @SDL3\/SDL_surface.h 958:34@
+getSurfaceBlendModeSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Blendmode.SDL_BlendMode
+  -- ^
+  --
+  --           [@blendMode@]: a pointer filled in with the current SDL_BlendMode.
+  -> IO Bool
+getSurfaceBlendModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetSurfaceBlendMode x00 x11)
+
+-- | Set the clipping rectangle for a surface.
+--
+--     When @surface@ is the destination of a blit, only the area within the clip rectangle is drawn into.
+--
+--     Note that blits are automatically clipped to the edges of the source and destination surfaces.
+--
+--     [Returns]: true if the rectangle intersects the surface, otherwise false and blits will be completely clipped.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceClipRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetSurfaceClipRect@.
+--                   The safe flavor is 'setSurfaceClipRectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceClipRect@, defined at @SDL3\/SDL_surface.h 982:34@
+setSurfaceClipRect
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be clipped.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the clipping rectangle, or NULL to disable clipping.
+  -> IO Bool
+setSurfaceClipRect =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetSurfaceClipRect x00 x11)
+
+-- | Set the clipping rectangle for a surface.
+--
+--     When @surface@ is the destination of a blit, only the area within the clip rectangle is drawn into.
+--
+--     Note that blits are automatically clipped to the edges of the source and destination surfaces.
+--
+--     [Returns]: true if the rectangle intersects the surface, otherwise false and blits will be completely clipped.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getSurfaceClipRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetSurfaceClipRect@.
+--                   The unsafe flavor is 'setSurfaceClipRect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetSurfaceClipRect@, defined at @SDL3\/SDL_surface.h 982:34@
+setSurfaceClipRectSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure to be clipped.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the clipping rectangle, or NULL to disable clipping.
+  -> IO Bool
+setSurfaceClipRectSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetSurfaceClipRect x00 x11)
+
+-- | Get the clipping rectangle for a surface.
+--
+--     When @surface@ is the destination of a blit, only the area within the clip rectangle is drawn into.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceClipRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSurfaceClipRect@.
+--                   The safe flavor is 'getSurfaceClipRectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSurfaceClipRect@, defined at @SDL3\/SDL_surface.h 1004:34@
+getSurfaceClipRect
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure representing the surface to be clipped.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the clipping rectangle for the surface.
+  -> IO Bool
+getSurfaceClipRect =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetSurfaceClipRect x00 x11)
+
+-- | Get the clipping rectangle for a surface.
+--
+--     When @surface@ is the destination of a blit, only the area within the clip rectangle is drawn into.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setSurfaceClipRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSurfaceClipRect@.
+--                   The unsafe flavor is 'getSurfaceClipRect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetSurfaceClipRect@, defined at @SDL3\/SDL_surface.h 1004:34@
+getSurfaceClipRectSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' structure representing the surface to be clipped.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: an SDL_Rect structure filled in with the clipping rectangle for the surface.
+  -> IO Bool
+getSurfaceClipRectSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetSurfaceClipRect x00 x11)
+
+-- | Flip a surface vertically or horizontally.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_FlipSurface@.
+--                   The safe flavor is 'flipSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlipSurface@, defined at @SDL3\/SDL_surface.h 1019:34@
+flipSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to flip.
+  -> SDL_FlipMode
+  -- ^
+  --
+  --           [@flip@]: the direction to flip.
+  -> IO Bool
+flipSurface =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_FlipSurface x00 x11)
+
+-- | Flip a surface vertically or horizontally.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_FlipSurface@.
+--                   The unsafe flavor is 'flipSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlipSurface@, defined at @SDL3\/SDL_surface.h 1019:34@
+flipSurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to flip.
+  -> SDL_FlipMode
+  -- ^
+  --
+  --           [@flip@]: the direction to flip.
+  -> IO Bool
+flipSurfaceSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_FlipSurface x00 x11)
+
+-- | Return a copy of a surface rotated clockwise a number of degrees.
+--
+--     The angle of rotation can be negative for counter-clockwise rotation.
+--
+--     When the rotation isn\'t a multiple of 90 degrees, the resulting surface is larger than the original, with the background filled in with the colorkey, if available, or RGBA 255\/255\/255\/0 if not.
+--
+--     If @surface@ has the SDL_PROP_SURFACE_ROTATION_FLOAT property set on it, the new copy will have the adjusted value set: if the rotation property is 90 and @angle@ was 30, the new surface will have a property value of 60 (that is: to be upright vs gravity, this surface needs to rotate 60 more degrees). However, note that further rotations on the new surface in this example will produce unexpected results, since the image will have resized and padded to accommodate the not-90 degree angle.
+--
+--     [Returns]: a rotated copy of the surface or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RotateSurface@.
+--                   The safe flavor is 'rotateSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RotateSurface@, defined at @SDL3\/SDL_surface.h 1048:43@
+rotateSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to rotate.
+  -> Float
+  -- ^
+  --
+  --           [@angle@]: the rotation angle, in degrees.
+  -> IO (BG.Ptr SDL_Surface)
+rotateSurface =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_RotateSurface x00 (Coerce.coerce x11)
+
+-- | Return a copy of a surface rotated clockwise a number of degrees.
+--
+--     The angle of rotation can be negative for counter-clockwise rotation.
+--
+--     When the rotation isn\'t a multiple of 90 degrees, the resulting surface is larger than the original, with the background filled in with the colorkey, if available, or RGBA 255\/255\/255\/0 if not.
+--
+--     If @surface@ has the SDL_PROP_SURFACE_ROTATION_FLOAT property set on it, the new copy will have the adjusted value set: if the rotation property is 90 and @angle@ was 30, the new surface will have a property value of 60 (that is: to be upright vs gravity, this surface needs to rotate 60 more degrees). However, note that further rotations on the new surface in this example will produce unexpected results, since the image will have resized and padded to accommodate the not-90 degree angle.
+--
+--     [Returns]: a rotated copy of the surface or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RotateSurface@.
+--                   The unsafe flavor is 'rotateSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RotateSurface@, defined at @SDL3\/SDL_surface.h 1048:43@
+rotateSurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to rotate.
+  -> Float
+  -- ^
+  --
+  --           [@angle@]: the rotation angle, in degrees.
+  -> IO (BG.Ptr SDL_Surface)
+rotateSurfaceSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_RotateSurface x00 (Coerce.coerce x11)
+
+-- | Creates a new surface identical to the existing surface.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     The returned surface should be freed with @'destroySurface'@.
+--
+--     [Returns]: a copy of the surface or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DuplicateSurface@.
+--                   The safe flavor is 'duplicateSurfaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DuplicateSurface@, defined at @SDL3\/SDL_surface.h 1069:43@
+duplicateSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to duplicate.
+  -> IO (BG.Ptr SDL_Surface)
+duplicateSurface = Unsafe.sDL_DuplicateSurface
+
+-- | Creates a new surface identical to the existing surface.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     The returned surface should be freed with @'destroySurface'@.
+--
+--     [Returns]: a copy of the surface or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DuplicateSurface@.
+--                   The unsafe flavor is 'duplicateSurface'
+--                   .
+--
+--     [C declaration]: @SDL_DuplicateSurface@, defined at @SDL3\/SDL_surface.h 1069:43@
+duplicateSurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to duplicate.
+  -> IO (BG.Ptr SDL_Surface)
+duplicateSurfaceSafe = Safe.sDL_DuplicateSurface
+
+-- | Creates a new surface identical to the existing surface, scaled to the desired size.
+--
+--     The returned surface should be freed with @'destroySurface'@.
+--
+--     [Returns]: a copy of the surface or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ScaleSurface@.
+--                   The safe flavor is 'scaleSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ScaleSurface@, defined at @SDL3\/SDL_surface.h 1091:43@
+scaleSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to duplicate and scale.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the new surface.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the new surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO (BG.Ptr SDL_Surface)
+scaleSurface =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_ScaleSurface x00 (Coerce.coerce x11) (Coerce.coerce x22) x33
+
+-- | Creates a new surface identical to the existing surface, scaled to the desired size.
+--
+--     The returned surface should be freed with @'destroySurface'@.
+--
+--     [Returns]: a copy of the surface or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ScaleSurface@.
+--                   The unsafe flavor is 'scaleSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ScaleSurface@, defined at @SDL3\/SDL_surface.h 1091:43@
+scaleSurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to duplicate and scale.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the new surface.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the new surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO (BG.Ptr SDL_Surface)
+scaleSurfaceSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_ScaleSurface x00 (Coerce.coerce x11) (Coerce.coerce x22) x33
+
+-- | Copy an existing surface to a new surface of the specified format.
+--
+--     This function is used to optimize images for faster /repeat/ blitting. This is accomplished by converting the original and storing the result as a new surface. The new, optimized surface can then be used as the source for future blits, making them faster.
+--
+--     If you are converting to an indexed surface and want to map colors to a palette, you can use @'convertSurfaceAndColorspace'@ instead.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'convertSurfaceAndColorspace', 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ConvertSurface@.
+--                   The safe flavor is 'convertSurfaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ConvertSurface@, defined at @SDL3\/SDL_surface.h 1120:43@
+convertSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the existing 'SDL_Surface' structure to convert.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the new pixel format.
+  -> IO (BG.Ptr SDL_Surface)
+convertSurface = Unsafe.sDL_ConvertSurface
+
+-- | Copy an existing surface to a new surface of the specified format.
+--
+--     This function is used to optimize images for faster /repeat/ blitting. This is accomplished by converting the original and storing the result as a new surface. The new, optimized surface can then be used as the source for future blits, making them faster.
+--
+--     If you are converting to an indexed surface and want to map colors to a palette, you can use @'convertSurfaceAndColorspace'@ instead.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'convertSurfaceAndColorspace', 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ConvertSurface@.
+--                   The unsafe flavor is 'convertSurface'
+--                   .
+--
+--     [C declaration]: @SDL_ConvertSurface@, defined at @SDL3\/SDL_surface.h 1120:43@
+convertSurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the existing 'SDL_Surface' structure to convert.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the new pixel format.
+  -> IO (BG.Ptr SDL_Surface)
+convertSurfaceSafe = Safe.sDL_ConvertSurface
+
+-- | Copy an existing surface to a new surface of the specified format and colorspace.
+--
+--     This function converts an existing surface to a new format and colorspace and returns the new surface. This will perform any pixel format and colorspace conversion needed.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'convertSurface', 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ConvertSurfaceAndColorspace@.
+--                   The safe flavor is 'convertSurfaceAndColorspaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_ConvertSurfaceAndColorspace@, defined at @SDL3\/SDL_surface.h 1149:43@
+convertSurfaceAndColorspace
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the existing 'SDL_Surface' structure to convert.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the new pixel format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette to use for indexed formats, may be NULL.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@colorspace@]: the new colorspace.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: an SDL_PropertiesID with additional color properties, or 0.
+  -> IO (BG.Ptr SDL_Surface)
+convertSurfaceAndColorspace =
+  Unsafe.sDL_ConvertSurfaceAndColorspace
+
+-- | Copy an existing surface to a new surface of the specified format and colorspace.
+--
+--     This function converts an existing surface to a new format and colorspace and returns the new surface. This will perform any pixel format and colorspace conversion needed.
+--
+--     If the original surface has alternate images, the new surface will have a reference to them as well.
+--
+--     [Returns]: the new 'SDL_Surface' structure that is created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'convertSurface', 'destroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ConvertSurfaceAndColorspace@.
+--                   The unsafe flavor is 'convertSurfaceAndColorspace'
+--                   .
+--
+--     [C declaration]: @SDL_ConvertSurfaceAndColorspace@, defined at @SDL3\/SDL_surface.h 1149:43@
+convertSurfaceAndColorspaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the existing 'SDL_Surface' structure to convert.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@format@]: the new pixel format.
+  -> BG.Ptr SDL3.Sys.Bindgen.Pixels.SDL_Palette
+  -- ^
+  --
+  --           [@palette@]: an optional palette to use for indexed formats, may be NULL.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@colorspace@]: the new colorspace.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: an SDL_PropertiesID with additional color properties, or 0.
+  -> IO (BG.Ptr SDL_Surface)
+convertSurfaceAndColorspaceSafe =
+  Safe.sDL_ConvertSurfaceAndColorspace
+
+-- | Copy a block of pixels of one format to another format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'convertPixelsAndColorspace'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ConvertPixels@.
+--                   The safe flavor is 'convertPixelsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ConvertPixels@, defined at @SDL3\/SDL_surface.h 1173:34@
+convertPixels
+  :: BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the block to copy, in pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the block to copy, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with new pixel data.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> IO Bool
+convertPixels =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  fmap
+                    CBool.toBool
+                    ( Unsafe.sDL_ConvertPixels
+                        (Coerce.coerce x00)
+                        (Coerce.coerce x11)
+                        x22
+                        x33
+                        (Coerce.coerce x44)
+                        x55
+                        x66
+                        (Coerce.coerce x77)
+                    )
+
+-- | Copy a block of pixels of one format to another format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'convertPixelsAndColorspace'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ConvertPixels@.
+--                   The unsafe flavor is 'convertPixels'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ConvertPixels@, defined at @SDL3\/SDL_surface.h 1173:34@
+convertPixelsSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the block to copy, in pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the block to copy, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with new pixel data.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> IO Bool
+convertPixelsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  fmap
+                    CBool.toBool
+                    ( Safe.sDL_ConvertPixels
+                        (Coerce.coerce x00)
+                        (Coerce.coerce x11)
+                        x22
+                        x33
+                        (Coerce.coerce x44)
+                        x55
+                        x66
+                        (Coerce.coerce x77)
+                    )
+
+-- | Copy a block of pixels of one format and colorspace to another format and colorspace.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'convertPixels'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ConvertPixelsAndColorspace@.
+--                   The safe flavor is 'convertPixelsAndColorspaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ConvertPixelsAndColorspace@, defined at @SDL3\/SDL_surface.h 1206:34@
+convertPixelsAndColorspace
+  :: BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the block to copy, in pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the block to copy, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@src_colorspace@]: an SDL_Colorspace value describing the colorspace of the @src@ pixels.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@src_properties@]: an SDL_PropertiesID with additional source color properties, or 0.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@dst_colorspace@]: an SDL_Colorspace value describing the colorspace of the @dst@ pixels.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@dst_properties@]: an SDL_PropertiesID with additional destination color properties, or 0.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with new pixel data.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> IO Bool
+convertPixelsAndColorspace =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    \x99 ->
+                      \x1010 ->
+                        \x1111 ->
+                          fmap
+                            CBool.toBool
+                            ( Unsafe.sDL_ConvertPixelsAndColorspace
+                                (Coerce.coerce x00)
+                                (Coerce.coerce x11)
+                                x22
+                                x33
+                                x44
+                                x55
+                                (Coerce.coerce x66)
+                                x77
+                                x88
+                                x99
+                                x1010
+                                (Coerce.coerce x1111)
+                            )
+
+-- | Copy a block of pixels of one format and colorspace to another format and colorspace.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'convertPixels'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ConvertPixelsAndColorspace@.
+--                   The unsafe flavor is 'convertPixelsAndColorspace'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ConvertPixelsAndColorspace@, defined at @SDL3\/SDL_surface.h 1206:34@
+convertPixelsAndColorspaceSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the block to copy, in pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the block to copy, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@src_colorspace@]: an SDL_Colorspace value describing the colorspace of the @src@ pixels.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@src_properties@]: an SDL_PropertiesID with additional source color properties, or 0.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_Colorspace
+  -- ^
+  --
+  --           [@dst_colorspace@]: an SDL_Colorspace value describing the colorspace of the @dst@ pixels.
+  -> SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@dst_properties@]: an SDL_PropertiesID with additional destination color properties, or 0.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with new pixel data.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> IO Bool
+convertPixelsAndColorspaceSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    \x99 ->
+                      \x1010 ->
+                        \x1111 ->
+                          fmap
+                            CBool.toBool
+                            ( Safe.sDL_ConvertPixelsAndColorspace
+                                (Coerce.coerce x00)
+                                (Coerce.coerce x11)
+                                x22
+                                x33
+                                x44
+                                x55
+                                (Coerce.coerce x66)
+                                x77
+                                x88
+                                x99
+                                x1010
+                                (Coerce.coerce x1111)
+                            )
+
+-- | Premultiply the alpha on a block of pixels.
+--
+--     This is safe to use with src == dst, but not for other overlapping areas.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PremultiplyAlpha@.
+--                   The safe flavor is 'premultiplyAlphaSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PremultiplyAlpha@, defined at @SDL3\/SDL_surface.h 1232:34@
+premultiplyAlpha
+  :: BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the block to convert, in pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the block to convert, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with premultiplied pixel data.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> Bool
+  -- ^
+  --
+  --           [@linear@]: true to convert from sRGB to linear space for the alpha multiplication, false to do multiplication in sRGB space.
+  -> IO Bool
+premultiplyAlpha =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    fmap
+                      CBool.toBool
+                      ( Unsafe.sDL_PremultiplyAlpha
+                          (Coerce.coerce x00)
+                          (Coerce.coerce x11)
+                          x22
+                          x33
+                          (Coerce.coerce x44)
+                          x55
+                          x66
+                          (Coerce.coerce x77)
+                          (CBool.fromBool x88)
+                      )
+
+-- | Premultiply the alpha on a block of pixels.
+--
+--     This is safe to use with src == dst, but not for other overlapping areas.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: The same destination pixels should not be used from two threads at once. It is safe to use the same source pixels from multiple threads.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PremultiplyAlpha@.
+--                   The unsafe flavor is 'premultiplyAlpha'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PremultiplyAlpha@, defined at @SDL3\/SDL_surface.h 1232:34@
+premultiplyAlphaSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@width@]: the width of the block to convert, in pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@height@]: the height of the block to convert, in pixels.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@src_format@]: an SDL_PixelFormat value of the @src@ pixels format.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@src@]: a pointer to the source pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@src_pitch@]: the pitch of the source pixels, in bytes.
+  -> SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+  -- ^
+  --
+  --           [@dst_format@]: an SDL_PixelFormat value of the @dst@ pixels format.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@dst@]: a pointer to be filled in with premultiplied pixel data.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@dst_pitch@]: the pitch of the destination pixels, in bytes.
+  -> Bool
+  -- ^
+  --
+  --           [@linear@]: true to convert from sRGB to linear space for the alpha multiplication, false to do multiplication in sRGB space.
+  -> IO Bool
+premultiplyAlphaSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    fmap
+                      CBool.toBool
+                      ( Safe.sDL_PremultiplyAlpha
+                          (Coerce.coerce x00)
+                          (Coerce.coerce x11)
+                          x22
+                          x33
+                          (Coerce.coerce x44)
+                          x55
+                          x66
+                          (Coerce.coerce x77)
+                          (CBool.fromBool x88)
+                      )
+
+-- | Premultiply the alpha in a surface.
+--
+--     This is safe to use with src == dst, but not for other overlapping areas.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_PremultiplySurfaceAlpha@.
+--                   The safe flavor is 'premultiplySurfaceAlphaSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PremultiplySurfaceAlpha@, defined at @SDL3\/SDL_surface.h 1250:34@
+premultiplySurfaceAlpha
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to modify.
+  -> Bool
+  -- ^
+  --
+  --           [@linear@]: true to convert from sRGB to linear space for the alpha multiplication, false to do multiplication in sRGB space.
+  -> IO Bool
+premultiplySurfaceAlpha =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_PremultiplySurfaceAlpha x00 (CBool.fromBool x11))
+
+-- | Premultiply the alpha in a surface.
+--
+--     This is safe to use with src == dst, but not for other overlapping areas.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_PremultiplySurfaceAlpha@.
+--                   The unsafe flavor is 'premultiplySurfaceAlpha'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_PremultiplySurfaceAlpha@, defined at @SDL3\/SDL_surface.h 1250:34@
+premultiplySurfaceAlphaSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to modify.
+  -> Bool
+  -- ^
+  --
+  --           [@linear@]: true to convert from sRGB to linear space for the alpha multiplication, false to do multiplication in sRGB space.
+  -> IO Bool
+premultiplySurfaceAlphaSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_PremultiplySurfaceAlpha x00 (CBool.fromBool x11))
+
+-- | Clear a surface with a specific color, with floating point precision.
+--
+--     This function handles all surface formats, and ignores any clip rectangle.
+--
+--     If the surface is YUV, the color is assumed to be in the sRGB colorspace, otherwise the color is assumed to be in the colorspace of the surface.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ClearSurface@.
+--                   The safe flavor is 'clearSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearSurface@, defined at @SDL3\/SDL_surface.h 1273:34@
+clearSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' to clear.
+  -> Float
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel, normally in the range 0-1.
+  -> IO Bool
+clearSurface =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              ( Unsafe.sDL_ClearSurface
+                  x00
+                  (Coerce.coerce x11)
+                  (Coerce.coerce x22)
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+              )
+
+-- | Clear a surface with a specific color, with floating point precision.
+--
+--     This function handles all surface formats, and ignores any clip rectangle.
+--
+--     If the surface is YUV, the color is assumed to be in the sRGB colorspace, otherwise the color is assumed to be in the colorspace of the surface.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ClearSurface@.
+--                   The unsafe flavor is 'clearSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ClearSurface@, defined at @SDL3\/SDL_surface.h 1273:34@
+clearSurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the 'SDL_Surface' to clear.
+  -> Float
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel, normally in the range 0-1.
+  -> IO Bool
+clearSurfaceSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              CBool.toBool
+              ( Safe.sDL_ClearSurface
+                  x00
+                  (Coerce.coerce x11)
+                  (Coerce.coerce x22)
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+              )
+
+-- | Perform a fast fill of a rectangle with a specific color.
+--
+--     @color@ should be a pixel of the format used by the surface, and can be generated by 'SDL3.Sys.Pixels.mapRGB' or 'SDL3.Sys.Pixels.mapRGBA'. If the color value contains an alpha component then the destination is simply filled with that alpha information, no blending takes place.
+--
+--     If there is a clip rectangle set on the destination (set via @'setSurfaceClipRect'@), then this function will fill based on the intersection of the clip rectangle and @rect@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'fillSurfaceRects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_FillSurfaceRect@.
+--                   The safe flavor is 'fillSurfaceRectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FillSurfaceRect@, defined at @SDL3\/SDL_surface.h 1301:34@
+fillSurfaceRect
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the drawing target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the rectangle to fill, or NULL to fill the entire surface.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@color@]: the color to fill with.
+  -> IO Bool
+fillSurfaceRect =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_FillSurfaceRect x00 x11 (Coerce.coerce x22))
+
+-- | Perform a fast fill of a rectangle with a specific color.
+--
+--     @color@ should be a pixel of the format used by the surface, and can be generated by 'SDL3.Sys.Pixels.mapRGB' or 'SDL3.Sys.Pixels.mapRGBA'. If the color value contains an alpha component then the destination is simply filled with that alpha information, no blending takes place.
+--
+--     If there is a clip rectangle set on the destination (set via @'setSurfaceClipRect'@), then this function will fill based on the intersection of the clip rectangle and @rect@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'fillSurfaceRects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_FillSurfaceRect@.
+--                   The unsafe flavor is 'fillSurfaceRect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FillSurfaceRect@, defined at @SDL3\/SDL_surface.h 1301:34@
+fillSurfaceRectSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the drawing target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure representing the rectangle to fill, or NULL to fill the entire surface.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@color@]: the color to fill with.
+  -> IO Bool
+fillSurfaceRectSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_FillSurfaceRect x00 x11 (Coerce.coerce x22))
+
+-- | Perform a fast fill of a set of rectangles with a specific color.
+--
+--     @color@ should be a pixel of the format used by the surface, and can be generated by 'SDL3.Sys.Pixels.mapRGB' or 'SDL3.Sys.Pixels.mapRGBA'. If the color value contains an alpha component then the destination is simply filled with that alpha information, no blending takes place.
+--
+--     If there is a clip rectangle set on the destination (set via @'setSurfaceClipRect'@), then this function will fill based on the intersection of the clip rectangle and @rect@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'fillSurfaceRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_FillSurfaceRects@.
+--                   The safe flavor is 'fillSurfaceRectsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FillSurfaceRects@, defined at @SDL3\/SDL_surface.h 1329:34@
+fillSurfaceRects
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the drawing target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rects@]: an array of SDL_Rects representing the rectangles to fill.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of rectangles in the array.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@color@]: the color to fill with.
+  -> IO Bool
+fillSurfaceRects =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_FillSurfaceRects x00 x11 (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Perform a fast fill of a set of rectangles with a specific color.
+--
+--     @color@ should be a pixel of the format used by the surface, and can be generated by 'SDL3.Sys.Pixels.mapRGB' or 'SDL3.Sys.Pixels.mapRGBA'. If the color value contains an alpha component then the destination is simply filled with that alpha information, no blending takes place.
+--
+--     If there is a clip rectangle set on the destination (set via @'setSurfaceClipRect'@), then this function will fill based on the intersection of the clip rectangle and @rect@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'fillSurfaceRect'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_FillSurfaceRects@.
+--                   The unsafe flavor is 'fillSurfaceRects'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FillSurfaceRects@, defined at @SDL3\/SDL_surface.h 1329:34@
+fillSurfaceRectsSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the drawing target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rects@]: an array of SDL_Rects representing the rectangles to fill.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@count@]: the number of rectangles in the array.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@color@]: the color to fill with.
+  -> IO Bool
+fillSurfaceRectsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_FillSurfaceRects x00 x11 (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Performs a fast blit from the source surface to the destination surface with clipping.
+--
+--     If either @srcrect@ or @dstrect@ are NULL, the entire surface (@src@ or @dst@) is copied while ensuring clipping to @dst->clip_rect@.
+--
+--     The blit function should not be called on a locked surface.
+--
+--     The blit semantics for surfaces with and without blending and colorkey are defined as follows:
+--
+--     @
+--      RGBA->RGB:
+--        Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source alpha-channel and per-surface alpha)
+--         SDL_SRCCOLORKEY ignored.
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB.
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         RGB values of the source color key, ignoring alpha in the
+--         comparison.
+--
+--     RGB->RGBA:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source per-surface alpha)
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB, set destination alpha to source per-surface alpha value.
+--       both:
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         source color key.
+--
+--     RGBA->RGBA:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source alpha-channel and per-surface alpha)
+--         SDL_SRCCOLORKEY ignored.
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy all of RGBA to the destination.
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         RGB values of the source color key, ignoring alpha in the
+--         comparison.
+--
+--     RGB->RGB:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source per-surface alpha)
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB.
+--       both:
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         source color key.
+--     @
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurfaceScaled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BlitSurface@.
+--                   The safe flavor is 'blitSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurface@, defined at @SDL3\/SDL_surface.h 1402:34@
+blitSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the x and y position in the destination surface, or NULL for (0,0). The width and height are ignored, and are copied from @srcrect@. If you want a specific width and height, you should use @'blitSurfaceScaled'@.
+  -> IO Bool
+blitSurface =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_BlitSurface x00 x11 x22 x33)
+
+-- | Performs a fast blit from the source surface to the destination surface with clipping.
+--
+--     If either @srcrect@ or @dstrect@ are NULL, the entire surface (@src@ or @dst@) is copied while ensuring clipping to @dst->clip_rect@.
+--
+--     The blit function should not be called on a locked surface.
+--
+--     The blit semantics for surfaces with and without blending and colorkey are defined as follows:
+--
+--     @
+--      RGBA->RGB:
+--        Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source alpha-channel and per-surface alpha)
+--         SDL_SRCCOLORKEY ignored.
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB.
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         RGB values of the source color key, ignoring alpha in the
+--         comparison.
+--
+--     RGB->RGBA:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source per-surface alpha)
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB, set destination alpha to source per-surface alpha value.
+--       both:
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         source color key.
+--
+--     RGBA->RGBA:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source alpha-channel and per-surface alpha)
+--         SDL_SRCCOLORKEY ignored.
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy all of RGBA to the destination.
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         RGB values of the source color key, ignoring alpha in the
+--         comparison.
+--
+--     RGB->RGB:
+--       Source surface blend mode set to SDL_BLENDMODE_BLEND:
+--         alpha-blend (using the source per-surface alpha)
+--       Source surface blend mode set to SDL_BLENDMODE_NONE:
+--         copy RGB.
+--       both:
+--         if SDL_SRCCOLORKEY set, only copy the pixels that do not match the
+--         source color key.
+--     @
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurfaceScaled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BlitSurface@.
+--                   The unsafe flavor is 'blitSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurface@, defined at @SDL3\/SDL_surface.h 1402:34@
+blitSurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the x and y position in the destination surface, or NULL for (0,0). The width and height are ignored, and are copied from @srcrect@. If you want a specific width and height, you should use @'blitSurfaceScaled'@.
+  -> IO Bool
+blitSurfaceSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_BlitSurface x00 x11 x22 x33)
+
+-- | Perform low-level surface blitting only.
+--
+--     This is a semi-private blit function and it performs low-level surface blitting, assuming the input rectangles have already been clipped.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BlitSurfaceUnchecked@.
+--                   The safe flavor is 'blitSurfaceUncheckedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurfaceUnchecked@, defined at @SDL3\/SDL_surface.h 1426:34@
+blitSurfaceUnchecked
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, may not be NULL.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, may not be NULL.
+  -> IO Bool
+blitSurfaceUnchecked =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_BlitSurfaceUnchecked x00 x11 x22 x33)
+
+-- | Perform low-level surface blitting only.
+--
+--     This is a semi-private blit function and it performs low-level surface blitting, assuming the input rectangles have already been clipped.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BlitSurfaceUnchecked@.
+--                   The unsafe flavor is 'blitSurfaceUnchecked'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurfaceUnchecked@, defined at @SDL3\/SDL_surface.h 1426:34@
+blitSurfaceUncheckedSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, may not be NULL.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, may not be NULL.
+  -> IO Bool
+blitSurfaceUncheckedSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_BlitSurfaceUnchecked x00 x11 x22 x33)
+
+-- | Perform a scaled blit to a destination surface, which may be of a different format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BlitSurfaceScaled@.
+--                   The safe flavor is 'blitSurfaceScaledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurfaceScaled@, defined at @SDL3\/SDL_surface.h 1450:34@
+blitSurfaceScaled
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire destination surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO Bool
+blitSurfaceScaled =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_BlitSurfaceScaled x00 x11 x22 x33 x44)
+
+-- | Perform a scaled blit to a destination surface, which may be of a different format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BlitSurfaceScaled@.
+--                   The unsafe flavor is 'blitSurfaceScaled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurfaceScaled@, defined at @SDL3\/SDL_surface.h 1450:34@
+blitSurfaceScaledSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire destination surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO Bool
+blitSurfaceScaledSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_BlitSurfaceScaled x00 x11 x22 x33 x44)
+
+-- | Perform low-level surface scaled blitting only.
+--
+--     This is a semi-private function and it performs low-level surface blitting, assuming the input rectangles have already been clipped.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurfaceScaled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BlitSurfaceUncheckedScaled@.
+--                   The safe flavor is 'blitSurfaceUncheckedScaledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurfaceUncheckedScaled@, defined at @SDL3\/SDL_surface.h 1475:34@
+blitSurfaceUncheckedScaled
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, may not be NULL.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, may not be NULL.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO Bool
+blitSurfaceUncheckedScaled =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_BlitSurfaceUncheckedScaled x00 x11 x22 x33 x44)
+
+-- | Perform low-level surface scaled blitting only.
+--
+--     This is a semi-private function and it performs low-level surface blitting, assuming the input rectangles have already been clipped.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurfaceScaled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BlitSurfaceUncheckedScaled@.
+--                   The unsafe flavor is 'blitSurfaceUncheckedScaled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurfaceUncheckedScaled@, defined at @SDL3\/SDL_surface.h 1475:34@
+blitSurfaceUncheckedScaledSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, may not be NULL.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, may not be NULL.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO Bool
+blitSurfaceUncheckedScaledSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_BlitSurfaceUncheckedScaled x00 x11 x22 x33 x44)
+
+-- | Perform a stretched pixel copy from one surface to another.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'blitSurfaceScaled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_StretchSurface@.
+--                   The safe flavor is 'stretchSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StretchSurface@, defined at @SDL3\/SDL_surface.h 1498:34@
+stretchSurface
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire destination surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO Bool
+stretchSurface =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_StretchSurface x00 x11 x22 x33 x44)
+
+-- | Perform a stretched pixel copy from one surface to another.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'blitSurfaceScaled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_StretchSurface@.
+--                   The unsafe flavor is 'stretchSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_StretchSurface@, defined at @SDL3\/SDL_surface.h 1498:34@
+stretchSurfaceSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire destination surface.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: the 'SDL_ScaleMode' to be used.
+  -> IO Bool
+stretchSurfaceSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_StretchSurface x00 x11 x22 x33 x44)
+
+-- | Perform a tiled blit to a destination surface, which may be of a different format.
+--
+--     The pixels in @srcrect@ will be repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BlitSurfaceTiled@.
+--                   The safe flavor is 'blitSurfaceTiledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurfaceTiled@, defined at @SDL3\/SDL_surface.h 1523:34@
+blitSurfaceTiled
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO Bool
+blitSurfaceTiled =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_BlitSurfaceTiled x00 x11 x22 x33)
+
+-- | Perform a tiled blit to a destination surface, which may be of a different format.
+--
+--     The pixels in @srcrect@ will be repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BlitSurfaceTiled@.
+--                   The unsafe flavor is 'blitSurfaceTiled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurfaceTiled@, defined at @SDL3\/SDL_surface.h 1523:34@
+blitSurfaceTiledSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO Bool
+blitSurfaceTiledSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_BlitSurfaceTiled x00 x11 x22 x33)
+
+-- | Perform a scaled and tiled blit to a destination surface, which may be of a different format.
+--
+--     The pixels in @srcrect@ will be scaled and repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BlitSurfaceTiledWithScale@.
+--                   The safe flavor is 'blitSurfaceTiledWithScaleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurfaceTiledWithScale@, defined at @SDL3\/SDL_surface.h 1552:34@
+blitSurfaceTiledWithScale
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform srcrect into the destination rectangle, e.g. a 32x32 texture with a scale of 2 would fill 64x64 tiles.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: scale algorithm to be used.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO Bool
+blitSurfaceTiledWithScale =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Unsafe.sDL_BlitSurfaceTiledWithScale x00 x11 (Coerce.coerce x22) x33 x44 x55)
+
+-- | Perform a scaled and tiled blit to a destination surface, which may be of a different format.
+--
+--     The pixels in @srcrect@ will be scaled and repeated as many times as needed to completely fill @dstrect@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BlitSurfaceTiledWithScale@.
+--                   The unsafe flavor is 'blitSurfaceTiledWithScale'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurfaceTiledWithScale@, defined at @SDL3\/SDL_surface.h 1552:34@
+blitSurfaceTiledWithScaleSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be copied, or NULL to copy the entire surface.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform srcrect into the destination rectangle, e.g. a 32x32 texture with a scale of 2 would fill 64x64 tiles.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: scale algorithm to be used.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO Bool
+blitSurfaceTiledWithScaleSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap CBool.toBool (Safe.sDL_BlitSurfaceTiledWithScale x00 x11 (Coerce.coerce x22) x33 x44 x55)
+
+-- | Perform a scaled blit using the 9-grid algorithm to a destination surface, which may be of a different format.
+--
+--     The pixels in the source surface are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then stretched into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_BlitSurface9Grid@.
+--                   The safe flavor is 'blitSurface9GridSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurface9Grid@, defined at @SDL3\/SDL_surface.h 1588:34@
+blitSurface9Grid
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire surface.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled blit.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: scale algorithm to be used.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO Bool
+blitSurface9Grid =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    \x99 ->
+                      fmap
+                        CBool.toBool
+                        ( Unsafe.sDL_BlitSurface9Grid
+                            x00
+                            x11
+                            (Coerce.coerce x22)
+                            (Coerce.coerce x33)
+                            (Coerce.coerce x44)
+                            (Coerce.coerce x55)
+                            (Coerce.coerce x66)
+                            x77
+                            x88
+                            x99
+                        )
+
+-- | Perform a scaled blit using the 9-grid algorithm to a destination surface, which may be of a different format.
+--
+--     The pixels in the source surface are split into a 3x3 grid, using the different corner sizes for each corner, and the sides and center making up the remaining pixels. The corners are then scaled using @scale@ and fit into the corners of the destination rectangle. The sides and center are then stretched into place to cover the remaining destination rectangle.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: Only one thread should be using the @src@ and @dst@ surfaces at any given time.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'blitSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_BlitSurface9Grid@.
+--                   The unsafe flavor is 'blitSurface9Grid'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_BlitSurface9Grid@, defined at @SDL3\/SDL_surface.h 1588:34@
+blitSurface9GridSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@src@]: the 'SDL_Surface' structure to be copied from.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@srcrect@]: the SDL_Rect structure representing the rectangle to be used for the 9-grid, or NULL to use the entire surface.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@left_width@]: the width, in pixels, of the left corners in @srcrect@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@right_width@]: the width, in pixels, of the right corners in @srcrect@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@top_height@]: the height, in pixels, of the top corners in @srcrect@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@bottom_height@]: the height, in pixels, of the bottom corners in @srcrect@.
+  -> Float
+  -- ^
+  --
+  --           [@scale@]: the scale used to transform the corner of @srcrect@ into the corner of @dstrect@, or 0.0f for an unscaled blit.
+  -> SDL_ScaleMode
+  -- ^
+  --
+  --           [@scaleMode@]: scale algorithm to be used.
+  -> BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@dst@]: the 'SDL_Surface' structure that is the blit target.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@dstrect@]: the SDL_Rect structure representing the target rectangle in the destination surface, or NULL to fill the entire surface.
+  -> IO Bool
+blitSurface9GridSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                \x77 ->
+                  \x88 ->
+                    \x99 ->
+                      fmap
+                        CBool.toBool
+                        ( Safe.sDL_BlitSurface9Grid
+                            x00
+                            x11
+                            (Coerce.coerce x22)
+                            (Coerce.coerce x33)
+                            (Coerce.coerce x44)
+                            (Coerce.coerce x55)
+                            (Coerce.coerce x66)
+                            x77
+                            x88
+                            x99
+                        )
+
+-- | Map an RGB triple to an opaque pixel value for a surface.
+--
+--     This function maps the RGB color value to the specified pixel format and returns the pixel value best approximating the given RGB color value for the given pixel format.
+--
+--     If the surface has a palette, the index of the closest matching color in the palette will be returned.
+--
+--     If the surface pixel format has an alpha component it will be returned as all 1 bits (fully opaque).
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'mapSurfaceRGBA'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MapSurfaceRGB@.
+--                   The safe flavor is 'mapSurfaceRGBSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MapSurfaceRGB@, defined at @SDL3\/SDL_surface.h 1621:36@
+mapSurfaceRGB
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to use for the pixel format and palette.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> IO BG.Word32
+mapSurfaceRGB =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            Coerce.coerce
+            (Unsafe.sDL_MapSurfaceRGB x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Map an RGB triple to an opaque pixel value for a surface.
+--
+--     This function maps the RGB color value to the specified pixel format and returns the pixel value best approximating the given RGB color value for the given pixel format.
+--
+--     If the surface has a palette, the index of the closest matching color in the palette will be returned.
+--
+--     If the surface pixel format has an alpha component it will be returned as all 1 bits (fully opaque).
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'mapSurfaceRGBA'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MapSurfaceRGB@.
+--                   The unsafe flavor is 'mapSurfaceRGB'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MapSurfaceRGB@, defined at @SDL3\/SDL_surface.h 1621:36@
+mapSurfaceRGBSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to use for the pixel format and palette.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> IO BG.Word32
+mapSurfaceRGBSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap
+            Coerce.coerce
+            (Safe.sDL_MapSurfaceRGB x00 (Coerce.coerce x11) (Coerce.coerce x22) (Coerce.coerce x33))
+
+-- | Map an RGBA quadruple to a pixel value for a surface.
+--
+--     This function maps the RGBA color value to the specified pixel format and returns the pixel value best approximating the given RGBA color value for the given pixel format.
+--
+--     If the surface pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).
+--
+--     If the surface has a palette, the index of the closest matching color in the palette will be returned.
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'mapSurfaceRGB'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MapSurfaceRGBA@.
+--                   The safe flavor is 'mapSurfaceRGBASafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MapSurfaceRGBA@, defined at @SDL3\/SDL_surface.h 1655:36@
+mapSurfaceRGBA
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to use for the pixel format and palette.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel in the range 0-255.
+  -> IO BG.Word32
+mapSurfaceRGBA =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              Coerce.coerce
+              ( Unsafe.sDL_MapSurfaceRGBA
+                  x00
+                  (Coerce.coerce x11)
+                  (Coerce.coerce x22)
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+              )
+
+-- | Map an RGBA quadruple to a pixel value for a surface.
+--
+--     This function maps the RGBA color value to the specified pixel format and returns the pixel value best approximating the given RGBA color value for the given pixel format.
+--
+--     If the surface pixel format has no alpha component the alpha value will be ignored (as it will be in formats with a palette).
+--
+--     If the surface has a palette, the index of the closest matching color in the palette will be returned.
+--
+--     If the pixel format bpp (color depth) is less than 32-bpp then the unused upper bits of the return value can safely be ignored (e.g., with a 16-bpp format the return value can be assigned to a Uint16, and similarly a Uint8 for an 8-bpp format).
+--
+--     [Returns]: a pixel value.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'mapSurfaceRGB'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MapSurfaceRGBA@.
+--                   The unsafe flavor is 'mapSurfaceRGBA'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MapSurfaceRGBA@, defined at @SDL3\/SDL_surface.h 1655:36@
+mapSurfaceRGBASafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to use for the pixel format and palette.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue component of the pixel in the range 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@a@]: the alpha component of the pixel in the range 0-255.
+  -> IO BG.Word32
+mapSurfaceRGBASafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap
+              Coerce.coerce
+              ( Safe.sDL_MapSurfaceRGBA
+                  x00
+                  (Coerce.coerce x11)
+                  (Coerce.coerce x22)
+                  (Coerce.coerce x33)
+                  (Coerce.coerce x44)
+              )
+
+-- | Retrieves a single pixel from a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     Like 'SDL3.Sys.Pixels.getRGBA', this uses the entire 0..255 range when converting color components from pixel formats with less than 8 bits per RGB component.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadSurfacePixel@.
+--                   The safe flavor is 'readSurfacePixelSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadSurfacePixel@, defined at @SDL3\/SDL_surface.h 1685:34@
+readSurfacePixel
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to read.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha channel, 0-255, or NULL to ignore this channel.
+  -> IO Bool
+readSurfacePixel =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  (Unsafe.sDL_ReadSurfacePixel x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44 x55 x66)
+
+-- | Retrieves a single pixel from a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     Like 'SDL3.Sys.Pixels.getRGBA', this uses the entire 0..255 range when converting color components from pixel formats with less than 8 bits per RGB component.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadSurfacePixel@.
+--                   The unsafe flavor is 'readSurfacePixel'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadSurfacePixel@, defined at @SDL3\/SDL_surface.h 1685:34@
+readSurfacePixelSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to read.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue channel, 0-255, or NULL to ignore this channel.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint8
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha channel, 0-255, or NULL to ignore this channel.
+  -> IO Bool
+readSurfacePixelSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  (Safe.sDL_ReadSurfacePixel x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44 x55 x66)
+
+-- | Retrieves a single pixel from a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ReadSurfacePixelFloat@.
+--                   The safe flavor is 'readSurfacePixelFloatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadSurfacePixelFloat@, defined at @SDL3\/SDL_surface.h 1712:34@
+readSurfacePixelFloat
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to read.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> IO Bool
+readSurfacePixelFloat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  (Unsafe.sDL_ReadSurfacePixelFloat x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44 x55 x66)
+
+-- | Retrieves a single pixel from a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ReadSurfacePixelFloat@.
+--                   The unsafe flavor is 'readSurfacePixelFloat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ReadSurfacePixelFloat@, defined at @SDL3\/SDL_surface.h 1712:34@
+readSurfacePixelFloatSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to read.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@r@]: a pointer filled in with the red channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@g@]: a pointer filled in with the green channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@b@]: a pointer filled in with the blue channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@a@]: a pointer filled in with the alpha channel, normally in the range 0-1, or NULL to ignore this channel.
+  -> IO Bool
+readSurfacePixelFloatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  (Safe.sDL_ReadSurfacePixelFloat x00 (Coerce.coerce x11) (Coerce.coerce x22) x33 x44 x55 x66)
+
+-- | Writes a single pixel to a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     Like 'SDL3.Sys.Pixels.mapRGBA', this uses the entire 0..255 range when converting color components from pixel formats with less than 8 bits per RGB component.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteSurfacePixel@.
+--                   The safe flavor is 'writeSurfacePixelSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteSurfacePixel@, defined at @SDL3\/SDL_surface.h 1738:34@
+writeSurfacePixel
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to write.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red channel value, 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green channel value, 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue channel value, 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@a@]: the alpha channel value, 0-255.
+  -> IO Bool
+writeSurfacePixel =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  ( Unsafe.sDL_WriteSurfacePixel
+                      x00
+                      (Coerce.coerce x11)
+                      (Coerce.coerce x22)
+                      (Coerce.coerce x33)
+                      (Coerce.coerce x44)
+                      (Coerce.coerce x55)
+                      (Coerce.coerce x66)
+                  )
+
+-- | Writes a single pixel to a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     Like 'SDL3.Sys.Pixels.mapRGBA', this uses the entire 0..255 range when converting color components from pixel formats with less than 8 bits per RGB component.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteSurfacePixel@.
+--                   The unsafe flavor is 'writeSurfacePixel'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteSurfacePixel@, defined at @SDL3\/SDL_surface.h 1738:34@
+writeSurfacePixelSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to write.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@r@]: the red channel value, 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@g@]: the green channel value, 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@b@]: the blue channel value, 0-255.
+  -> BG.Word8
+  -- ^
+  --
+  --           [@a@]: the alpha channel value, 0-255.
+  -> IO Bool
+writeSurfacePixelSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  ( Safe.sDL_WriteSurfacePixel
+                      x00
+                      (Coerce.coerce x11)
+                      (Coerce.coerce x22)
+                      (Coerce.coerce x33)
+                      (Coerce.coerce x44)
+                      (Coerce.coerce x55)
+                      (Coerce.coerce x66)
+                  )
+
+-- | Writes a single pixel to a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WriteSurfacePixelFloat@.
+--                   The safe flavor is 'writeSurfacePixelFloatSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteSurfacePixelFloat@, defined at @SDL3\/SDL_surface.h 1761:34@
+writeSurfacePixelFloat
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to write.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> Float
+  -- ^
+  --
+  --           [@r@]: the red channel value, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@g@]: the green channel value, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@b@]: the blue channel value, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@a@]: the alpha channel value, normally in the range 0-1.
+  -> IO Bool
+writeSurfacePixelFloat =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  ( Unsafe.sDL_WriteSurfacePixelFloat
+                      x00
+                      (Coerce.coerce x11)
+                      (Coerce.coerce x22)
+                      (Coerce.coerce x33)
+                      (Coerce.coerce x44)
+                      (Coerce.coerce x55)
+                      (Coerce.coerce x66)
+                  )
+
+-- | Writes a single pixel to a surface.
+--
+--     This function prioritizes correctness over speed: it is suitable for unit tests, but is not intended for use in a game engine.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function can be called on different threads with different surfaces.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WriteSurfacePixelFloat@.
+--                   The unsafe flavor is 'writeSurfacePixelFloat'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WriteSurfacePixelFloat@, defined at @SDL3\/SDL_surface.h 1761:34@
+writeSurfacePixelFloatSafe
+  :: BG.Ptr SDL_Surface
+  -- ^
+  --
+  --           [@surface@]: the surface to write.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the horizontal coordinate, 0 \<= x \< width.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the vertical coordinate, 0 \<= y \< height.
+  -> Float
+  -- ^
+  --
+  --           [@r@]: the red channel value, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@g@]: the green channel value, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@b@]: the blue channel value, normally in the range 0-1.
+  -> Float
+  -- ^
+  --
+  --           [@a@]: the alpha channel value, normally in the range 0-1.
+  -> IO Bool
+writeSurfacePixelFloatSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              \x66 ->
+                fmap
+                  CBool.toBool
+                  ( Safe.sDL_WriteSurfacePixelFloat
+                      x00
+                      (Coerce.coerce x11)
+                      (Coerce.coerce x22)
+                      (Coerce.coerce x33)
+                      (Coerce.coerce x44)
+                      (Coerce.coerce x55)
+                      (Coerce.coerce x66)
+                  )
+
+-- | Typed constant for macro @SDL_SURFACE_PREALLOCATED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_SURFACE_PREALLOCATED :: SDL_SurfaceFlags
+pattern SDL_SURFACE_PREALLOCATED = SDL_SurfaceFlags 0x00000001
+
+-- | Typed constant for macro @SDL_SURFACE_LOCK_NEEDED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_SURFACE_LOCK_NEEDED :: SDL_SurfaceFlags
+pattern SDL_SURFACE_LOCK_NEEDED = SDL_SurfaceFlags 0x00000002
+
+-- | Typed constant for macro @SDL_SURFACE_LOCKED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_SURFACE_LOCKED :: SDL_SurfaceFlags
+pattern SDL_SURFACE_LOCKED = SDL_SurfaceFlags 0x00000004
+
+-- | Typed constant for macro @SDL_SURFACE_SIMD_ALIGNED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_SURFACE_SIMD_ALIGNED :: SDL_SurfaceFlags
+pattern SDL_SURFACE_SIMD_ALIGNED = SDL_SurfaceFlags 0x00000008
diff --git a/src/SDL3/Sys/System.hs b/src/SDL3/Sys/System.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/System.hs
@@ -0,0 +1,559 @@
+-- | Platform-specific SDL API functions.
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.System.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.System (
+  module SDL3.Sys.Bindgen.System,
+
+  -- * Function aliases
+  SDL3.Sys.System.setX11EventHook,
+  SDL3.Sys.System.setX11EventHookSafe,
+  SDL3.Sys.System.setLinuxThreadPriority,
+  SDL3.Sys.System.setLinuxThreadPrioritySafe,
+  SDL3.Sys.System.setLinuxThreadPriorityAndPolicy,
+  SDL3.Sys.System.setLinuxThreadPriorityAndPolicySafe,
+  SDL3.Sys.System.isTablet,
+  SDL3.Sys.System.isTabletSafe,
+  SDL3.Sys.System.isTV,
+  SDL3.Sys.System.isTVSafe,
+  SDL3.Sys.System.getSandbox,
+  SDL3.Sys.System.getSandboxSafe,
+  SDL3.Sys.System.onApplicationWillTerminate,
+  SDL3.Sys.System.onApplicationWillTerminateSafe,
+  SDL3.Sys.System.onApplicationDidReceiveMemoryWarning,
+  SDL3.Sys.System.onApplicationDidReceiveMemoryWarningSafe,
+  SDL3.Sys.System.onApplicationWillEnterBackground,
+  SDL3.Sys.System.onApplicationWillEnterBackgroundSafe,
+  SDL3.Sys.System.onApplicationDidEnterBackground,
+  SDL3.Sys.System.onApplicationDidEnterBackgroundSafe,
+  SDL3.Sys.System.onApplicationWillEnterForeground,
+  SDL3.Sys.System.onApplicationWillEnterForegroundSafe,
+  SDL3.Sys.System.onApplicationDidEnterForeground,
+  SDL3.Sys.System.onApplicationDidEnterForegroundSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.System
+import SDL3.Sys.Bindgen.System.Safe qualified as Safe
+import SDL3.Sys.Bindgen.System.Unsafe qualified as Unsafe
+
+-- | Set a callback for every X11 event.
+--
+--     The callback may modify the event, and should return true if the event should continue to be processed, or false to prevent further processing.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetX11EventHook@.
+--                   The safe flavor is 'setX11EventHookSafe'
+--                   : registration; the hook runs during event pumping.
+--
+--     [C declaration]: @SDL_SetX11EventHook@, defined at @SDL3\/SDL_system.h 178:34@
+setX11EventHook
+  :: SDL_X11EventHook
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_X11EventHook' function to call.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to every iteration of @callback@.
+  -> IO ()
+setX11EventHook = Unsafe.sDL_SetX11EventHook
+
+-- | Set a callback for every X11 event.
+--
+--     The callback may modify the event, and should return true if the event should continue to be processed, or false to prevent further processing.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetX11EventHook@.
+--                   The unsafe flavor is 'setX11EventHook'
+--                   : registration; the hook runs during event pumping.
+--
+--     [C declaration]: @SDL_SetX11EventHook@, defined at @SDL3\/SDL_system.h 178:34@
+setX11EventHookSafe
+  :: SDL_X11EventHook
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_X11EventHook' function to call.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer to pass to every iteration of @callback@.
+  -> IO ()
+setX11EventHookSafe = Safe.sDL_SetX11EventHook
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetLinuxThreadPriority@.
+--                   The safe flavor is 'setLinuxThreadPrioritySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetLinuxThreadPriority@, defined at @SDL3\/SDL_system.h 197:34@
+setLinuxThreadPriority
+  :: BG.Int64
+  -- ^ [C declaration]: @threadID@
+  -> BG.Int32
+  -- ^ [C declaration]: @priority@
+  -> IO Bool
+setLinuxThreadPriority =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetLinuxThreadPriority (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetLinuxThreadPriority@.
+--                   The unsafe flavor is 'setLinuxThreadPriority'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetLinuxThreadPriority@, defined at @SDL3\/SDL_system.h 197:34@
+setLinuxThreadPrioritySafe
+  :: BG.Int64
+  -- ^ [C declaration]: @threadID@
+  -> BG.Int32
+  -- ^ [C declaration]: @priority@
+  -> IO Bool
+setLinuxThreadPrioritySafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetLinuxThreadPriority (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetLinuxThreadPriorityAndPolicy@.
+--                   The safe flavor is 'setLinuxThreadPriorityAndPolicySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetLinuxThreadPriorityAndPolicy@, defined at @SDL3\/SDL_system.h 215:34@
+setLinuxThreadPriorityAndPolicy
+  :: BG.Int64
+  -- ^ [C declaration]: @threadID@
+  -> BG.Int32
+  -- ^ [C declaration]: @sdlPriority@
+  -> BG.Int32
+  -- ^ [C declaration]: @schedPolicy@
+  -> IO Bool
+setLinuxThreadPriorityAndPolicy =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap
+          CBool.toBool
+          ( Unsafe.sDL_SetLinuxThreadPriorityAndPolicy
+              (Coerce.coerce x00)
+              (Coerce.coerce x11)
+              (Coerce.coerce x22)
+          )
+
+-- |
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetLinuxThreadPriorityAndPolicy@.
+--                   The unsafe flavor is 'setLinuxThreadPriorityAndPolicy'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetLinuxThreadPriorityAndPolicy@, defined at @SDL3\/SDL_system.h 215:34@
+setLinuxThreadPriorityAndPolicySafe
+  :: BG.Int64
+  -- ^ [C declaration]: @threadID@
+  -> BG.Int32
+  -- ^ [C declaration]: @sdlPriority@
+  -> BG.Int32
+  -- ^ [C declaration]: @schedPolicy@
+  -> IO Bool
+setLinuxThreadPriorityAndPolicySafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap
+          CBool.toBool
+          (Safe.sDL_SetLinuxThreadPriorityAndPolicy (Coerce.coerce x00) (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Query if the current device is a tablet.
+--
+--     If SDL can\'t determine this, it will return false.
+--
+--     [Returns]: true if the device is a tablet, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IsTablet@.
+--                   The safe flavor is 'isTabletSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsTablet@, defined at @SDL3\/SDL_system.h 630:34@
+isTablet :: IO Bool
+isTablet = fmap CBool.toBool Unsafe.sDL_IsTablet
+
+-- | Query if the current device is a tablet.
+--
+--     If SDL can\'t determine this, it will return false.
+--
+--     [Returns]: true if the device is a tablet, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IsTablet@.
+--                   The unsafe flavor is 'isTablet'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsTablet@, defined at @SDL3\/SDL_system.h 630:34@
+isTabletSafe :: IO Bool
+isTabletSafe = fmap CBool.toBool Safe.sDL_IsTablet
+
+-- | Query if the current device is a TV.
+--
+--     If SDL can\'t determine this, it will return false.
+--
+--     [Returns]: true if the device is a TV, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_IsTV@.
+--                   The safe flavor is 'isTVSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsTV@, defined at @SDL3\/SDL_system.h 643:34@
+isTV :: IO Bool
+isTV = fmap CBool.toBool Unsafe.sDL_IsTV
+
+-- | Query if the current device is a TV.
+--
+--     If SDL can\'t determine this, it will return false.
+--
+--     [Returns]: true if the device is a TV, false otherwise.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_IsTV@.
+--                   The unsafe flavor is 'isTV'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_IsTV@, defined at @SDL3\/SDL_system.h 643:34@
+isTVSafe :: IO Bool
+isTVSafe = fmap CBool.toBool Safe.sDL_IsTV
+
+-- | Get the application sandbox environment, if any.
+--
+--     [Returns]: the application sandbox environment or SDL_SANDBOX_NONE if the application is not running in a sandbox environment.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSandbox@.
+--                   The safe flavor is 'getSandboxSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSandbox@, defined at @SDL3\/SDL_system.h 667:41@
+getSandbox :: IO SDL_Sandbox
+getSandbox = Unsafe.sDL_GetSandbox
+
+-- | Get the application sandbox environment, if any.
+--
+--     [Returns]: the application sandbox environment or SDL_SANDBOX_NONE if the application is not running in a sandbox environment.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSandbox@.
+--                   The unsafe flavor is 'getSandbox'
+--                   .
+--
+--     [C declaration]: @SDL_GetSandbox@, defined at @SDL3\/SDL_system.h 667:41@
+getSandboxSafe :: IO SDL_Sandbox
+getSandboxSafe = Safe.sDL_GetSandbox
+
+-- | Let iOS apps with external event handling report onApplicationWillTerminate.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OnApplicationWillTerminate@.
+--                   The safe flavor is 'onApplicationWillTerminateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationWillTerminate@, defined at @SDL3\/SDL_system.h 687:34@
+onApplicationWillTerminate :: IO ()
+onApplicationWillTerminate =
+  Unsafe.sDL_OnApplicationWillTerminate
+
+-- | Let iOS apps with external event handling report onApplicationWillTerminate.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OnApplicationWillTerminate@.
+--                   The unsafe flavor is 'onApplicationWillTerminate'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationWillTerminate@, defined at @SDL3\/SDL_system.h 687:34@
+onApplicationWillTerminateSafe :: IO ()
+onApplicationWillTerminateSafe =
+  Safe.sDL_OnApplicationWillTerminate
+
+-- | Let iOS apps with external event handling report onApplicationDidReceiveMemoryWarning.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OnApplicationDidReceiveMemoryWarning@.
+--                   The safe flavor is 'onApplicationDidReceiveMemoryWarningSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationDidReceiveMemoryWarning@, defined at @SDL3\/SDL_system.h 704:34@
+onApplicationDidReceiveMemoryWarning :: IO ()
+onApplicationDidReceiveMemoryWarning =
+  Unsafe.sDL_OnApplicationDidReceiveMemoryWarning
+
+-- | Let iOS apps with external event handling report onApplicationDidReceiveMemoryWarning.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OnApplicationDidReceiveMemoryWarning@.
+--                   The unsafe flavor is 'onApplicationDidReceiveMemoryWarning'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationDidReceiveMemoryWarning@, defined at @SDL3\/SDL_system.h 704:34@
+onApplicationDidReceiveMemoryWarningSafe :: IO ()
+onApplicationDidReceiveMemoryWarningSafe =
+  Safe.sDL_OnApplicationDidReceiveMemoryWarning
+
+-- | Let iOS apps with external event handling report onApplicationWillResignActive.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OnApplicationWillEnterBackground@.
+--                   The safe flavor is 'onApplicationWillEnterBackgroundSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationWillEnterBackground@, defined at @SDL3\/SDL_system.h 721:34@
+onApplicationWillEnterBackground :: IO ()
+onApplicationWillEnterBackground =
+  Unsafe.sDL_OnApplicationWillEnterBackground
+
+-- | Let iOS apps with external event handling report onApplicationWillResignActive.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OnApplicationWillEnterBackground@.
+--                   The unsafe flavor is 'onApplicationWillEnterBackground'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationWillEnterBackground@, defined at @SDL3\/SDL_system.h 721:34@
+onApplicationWillEnterBackgroundSafe :: IO ()
+onApplicationWillEnterBackgroundSafe =
+  Safe.sDL_OnApplicationWillEnterBackground
+
+-- | Let iOS apps with external event handling report onApplicationDidEnterBackground.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OnApplicationDidEnterBackground@.
+--                   The safe flavor is 'onApplicationDidEnterBackgroundSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationDidEnterBackground@, defined at @SDL3\/SDL_system.h 738:34@
+onApplicationDidEnterBackground :: IO ()
+onApplicationDidEnterBackground =
+  Unsafe.sDL_OnApplicationDidEnterBackground
+
+-- | Let iOS apps with external event handling report onApplicationDidEnterBackground.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OnApplicationDidEnterBackground@.
+--                   The unsafe flavor is 'onApplicationDidEnterBackground'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationDidEnterBackground@, defined at @SDL3\/SDL_system.h 738:34@
+onApplicationDidEnterBackgroundSafe :: IO ()
+onApplicationDidEnterBackgroundSafe =
+  Safe.sDL_OnApplicationDidEnterBackground
+
+-- | Let iOS apps with external event handling report onApplicationWillEnterForeground.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OnApplicationWillEnterForeground@.
+--                   The safe flavor is 'onApplicationWillEnterForegroundSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationWillEnterForeground@, defined at @SDL3\/SDL_system.h 755:34@
+onApplicationWillEnterForeground :: IO ()
+onApplicationWillEnterForeground =
+  Unsafe.sDL_OnApplicationWillEnterForeground
+
+-- | Let iOS apps with external event handling report onApplicationWillEnterForeground.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OnApplicationWillEnterForeground@.
+--                   The unsafe flavor is 'onApplicationWillEnterForeground'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationWillEnterForeground@, defined at @SDL3\/SDL_system.h 755:34@
+onApplicationWillEnterForegroundSafe :: IO ()
+onApplicationWillEnterForegroundSafe =
+  Safe.sDL_OnApplicationWillEnterForeground
+
+-- | Let iOS apps with external event handling report onApplicationDidBecomeActive.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_OnApplicationDidEnterForeground@.
+--                   The safe flavor is 'onApplicationDidEnterForegroundSafe'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationDidEnterForeground@, defined at @SDL3\/SDL_system.h 772:34@
+onApplicationDidEnterForeground :: IO ()
+onApplicationDidEnterForeground =
+  Unsafe.sDL_OnApplicationDidEnterForeground
+
+-- | Let iOS apps with external event handling report onApplicationDidBecomeActive.
+--
+--     This functions allows iOS apps that have their own event handling to hook into SDL to generate SDL events. This maps directly to an iOS-specific event, but since it doesn\'t do anything iOS-specific internally, it is available on all platforms, in case it might be useful for some specific paradigm. Most apps do not need to use this directly; SDL\'s internal event code will handle all this for windows created by 'SDL3.Sys.Video.createWindow'!
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_OnApplicationDidEnterForeground@.
+--                   The unsafe flavor is 'onApplicationDidEnterForeground'
+--                   .
+--
+--     [C declaration]: @SDL_OnApplicationDidEnterForeground@, defined at @SDL3\/SDL_system.h 772:34@
+onApplicationDidEnterForegroundSafe :: IO ()
+onApplicationDidEnterForegroundSafe =
+  Safe.sDL_OnApplicationDidEnterForeground
diff --git a/src/SDL3/Sys/Thread.hs b/src/SDL3/Sys/Thread.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Thread.hs
@@ -0,0 +1,785 @@
+-- | SDL offers cross-platform thread management functions. These are mostly concerned with starting threads, setting their priority, and dealing with their termination.
+--
+--     In addition, there is support for Thread Local Storage (data that is unique to each thread, but accessed from a single key).
+--
+--     On platforms without thread support (such as Emscripten when built without pthreads), these functions still exist, but things like @SDL_CreateThread()@ will report failure without doing anything.
+--
+--     If you\'re going to work with threads, you almost certainly need to have a good understanding of thread safety measures: locking and synchronization mechanisms are handled by the functions in SDL_mutex.h. The SDL thread object.
+--
+--     These are opaque data.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'waitThread'
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Thread.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Thread (
+  module SDL3.Sys.Bindgen.Thread,
+
+  -- * Function aliases
+  SDL3.Sys.Thread.createThreadRuntime,
+  SDL3.Sys.Thread.createThreadRuntimeSafe,
+  SDL3.Sys.Thread.createThreadWithPropertiesRuntime,
+  SDL3.Sys.Thread.createThreadWithPropertiesRuntimeSafe,
+  SDL3.Sys.Thread.getThreadName,
+  SDL3.Sys.Thread.getThreadNameSafe,
+  SDL3.Sys.Thread.getCurrentThreadID,
+  SDL3.Sys.Thread.getCurrentThreadIDSafe,
+  SDL3.Sys.Thread.getThreadID,
+  SDL3.Sys.Thread.getThreadIDSafe,
+  SDL3.Sys.Thread.setCurrentThreadPriority,
+  SDL3.Sys.Thread.setCurrentThreadPrioritySafe,
+  SDL3.Sys.Thread.waitThread,
+  SDL3.Sys.Thread.waitThreadSafe,
+  SDL3.Sys.Thread.getThreadState,
+  SDL3.Sys.Thread.getThreadStateSafe,
+  SDL3.Sys.Thread.detachThread,
+  SDL3.Sys.Thread.detachThreadSafe,
+  SDL3.Sys.Thread.getTLS,
+  SDL3.Sys.Thread.getTLSSafe,
+  SDL3.Sys.Thread.setTLS,
+  SDL3.Sys.Thread.setTLSSafe,
+  SDL3.Sys.Thread.cleanupTLS,
+  SDL3.Sys.Thread.cleanupTLSSafe,
+)
+where
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Thread
+import SDL3.Sys.Bindgen.Thread.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Thread.Unsafe qualified as Unsafe
+
+-- | The actual entry point for SDL_CreateThread.
+--
+--     [Returns]: an opaque pointer to the new thread object on success, NULL if the new thread could not be created; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateThreadRuntime@.
+--                   The safe flavor is 'createThreadRuntimeSafe'
+--                   : the entry function runs on the spawned thread, not during the call.
+--
+--     [C declaration]: @SDL_CreateThreadRuntime@, defined at @SDL3\/SDL_thread.h 340:42@
+createThreadRuntime
+  :: SDL_ThreadFunction
+  -- ^
+  --
+  --           [@fn@]: the 'SDL_ThreadFunction' function to call in the new thread
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the thread
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@data@]: a pointer that is passed to @fn@
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnBeginThread@]: the C runtime\'s _beginthreadex (or whatnot). Can be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnEndThread@]: the C runtime\'s _endthreadex (or whatnot). Can be NULL.
+  -> IO (BG.Ptr SDL_Thread)
+createThreadRuntime = Unsafe.sDL_CreateThreadRuntime
+
+-- | The actual entry point for SDL_CreateThread.
+--
+--     [Returns]: an opaque pointer to the new thread object on success, NULL if the new thread could not be created; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateThreadRuntime@.
+--                   The unsafe flavor is 'createThreadRuntime'
+--                   : the entry function runs on the spawned thread, not during the call.
+--
+--     [C declaration]: @SDL_CreateThreadRuntime@, defined at @SDL3\/SDL_thread.h 340:42@
+createThreadRuntimeSafe
+  :: SDL_ThreadFunction
+  -- ^
+  --
+  --           [@fn@]: the 'SDL_ThreadFunction' function to call in the new thread
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@name@]: the name of the thread
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@data@]: a pointer that is passed to @fn@
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnBeginThread@]: the C runtime\'s _beginthreadex (or whatnot). Can be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnEndThread@]: the C runtime\'s _endthreadex (or whatnot). Can be NULL.
+  -> IO (BG.Ptr SDL_Thread)
+createThreadRuntimeSafe =
+  Safe.sDL_CreateThreadRuntime
+
+-- | The actual entry point for SDL_CreateThreadWithProperties.
+--
+--     [Returns]: an opaque pointer to the new thread object on success, NULL if the new thread could not be created; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateThreadWithPropertiesRuntime@.
+--                   The safe flavor is 'createThreadWithPropertiesRuntimeSafe'
+--                   : the entry function runs on the spawned thread, not during the call.
+--
+--     [C declaration]: @SDL_CreateThreadWithPropertiesRuntime@, defined at @SDL3\/SDL_thread.h 356:42@
+createThreadWithPropertiesRuntime
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnBeginThread@]: the C runtime\'s _beginthreadex (or whatnot). Can be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnEndThread@]: the C runtime\'s _endthreadex (or whatnot). Can be NULL.
+  -> IO (BG.Ptr SDL_Thread)
+createThreadWithPropertiesRuntime =
+  Unsafe.sDL_CreateThreadWithPropertiesRuntime
+
+-- | The actual entry point for SDL_CreateThreadWithProperties.
+--
+--     [Returns]: an opaque pointer to the new thread object on success, NULL if the new thread could not be created; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateThreadWithPropertiesRuntime@.
+--                   The unsafe flavor is 'createThreadWithPropertiesRuntime'
+--                   : the entry function runs on the spawned thread, not during the call.
+--
+--     [C declaration]: @SDL_CreateThreadWithPropertiesRuntime@, defined at @SDL3\/SDL_thread.h 356:42@
+createThreadWithPropertiesRuntimeSafe
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnBeginThread@]: the C runtime\'s _beginthreadex (or whatnot). Can be NULL.
+  -> SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+  -- ^
+  --
+  --           [@pfnEndThread@]: the C runtime\'s _endthreadex (or whatnot). Can be NULL.
+  -> IO (BG.Ptr SDL_Thread)
+createThreadWithPropertiesRuntimeSafe =
+  Safe.sDL_CreateThreadWithPropertiesRuntime
+
+-- | Get the thread name as it was specified in @SDL_CreateThread()@.
+--
+--     [Returns]: a pointer to a UTF-8 string that names the specified thread, or NULL if it doesn\'t have a name.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetThreadName@.
+--                   The safe flavor is 'getThreadNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetThreadName@, defined at @SDL3\/SDL_thread.h 378:42@
+getThreadName
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getThreadName = Unsafe.sDL_GetThreadName
+
+-- | Get the thread name as it was specified in @SDL_CreateThread()@.
+--
+--     [Returns]: a pointer to a UTF-8 string that names the specified thread, or NULL if it doesn\'t have a name.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetThreadName@.
+--                   The unsafe flavor is 'getThreadName'
+--                   .
+--
+--     [C declaration]: @SDL_GetThreadName@, defined at @SDL3\/SDL_thread.h 378:42@
+getThreadNameSafe
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getThreadNameSafe = Safe.sDL_GetThreadName
+
+-- | Get the thread identifier for the current thread.
+--
+--     This thread identifier is as reported by the underlying operating system. If SDL is running on a platform that does not support threads the return value will always be zero.
+--
+--     This function also returns a valid thread ID when called from the main thread.
+--
+--     [Returns]: the ID of the current thread.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getThreadID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCurrentThreadID@.
+--                   The safe flavor is 'getCurrentThreadIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentThreadID@, defined at @SDL3\/SDL_thread.h 398:42@
+getCurrentThreadID :: IO SDL_ThreadID
+getCurrentThreadID = Unsafe.sDL_GetCurrentThreadID
+
+-- | Get the thread identifier for the current thread.
+--
+--     This thread identifier is as reported by the underlying operating system. If SDL is running on a platform that does not support threads the return value will always be zero.
+--
+--     This function also returns a valid thread ID when called from the main thread.
+--
+--     [Returns]: the ID of the current thread.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getThreadID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCurrentThreadID@.
+--                   The unsafe flavor is 'getCurrentThreadID'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentThreadID@, defined at @SDL3\/SDL_thread.h 398:42@
+getCurrentThreadIDSafe :: IO SDL_ThreadID
+getCurrentThreadIDSafe = Safe.sDL_GetCurrentThreadID
+
+-- | Get the thread identifier for the specified thread.
+--
+--     This thread identifier is as reported by the underlying operating system. If SDL is running on a platform that does not support threads the return value will always be zero.
+--
+--     [Returns]: the ID of the specified thread, or the ID of the current thread if @thread@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCurrentThreadID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetThreadID@.
+--                   The safe flavor is 'getThreadIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetThreadID@, defined at @SDL3\/SDL_thread.h 417:42@
+getThreadID
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO SDL_ThreadID
+getThreadID = Unsafe.sDL_GetThreadID
+
+-- | Get the thread identifier for the specified thread.
+--
+--     This thread identifier is as reported by the underlying operating system. If SDL is running on a platform that does not support threads the return value will always be zero.
+--
+--     [Returns]: the ID of the specified thread, or the ID of the current thread if @thread@ is NULL.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCurrentThreadID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetThreadID@.
+--                   The unsafe flavor is 'getThreadID'
+--                   .
+--
+--     [C declaration]: @SDL_GetThreadID@, defined at @SDL3\/SDL_thread.h 417:42@
+getThreadIDSafe
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO SDL_ThreadID
+getThreadIDSafe = Safe.sDL_GetThreadID
+
+-- | Set the priority for the current thread.
+--
+--     Note that some platforms will not let you alter the priority (or at least, promote the thread to a higher priority) at all, and some require you to be an administrator account. Be prepared for this to fail.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetCurrentThreadPriority@.
+--                   The safe flavor is 'setCurrentThreadPrioritySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetCurrentThreadPriority@, defined at @SDL3\/SDL_thread.h 434:34@
+setCurrentThreadPriority
+  :: SDL_ThreadPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_ThreadPriority' to set.
+  -> IO Bool
+setCurrentThreadPriority =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_SetCurrentThreadPriority x00)
+
+-- | Set the priority for the current thread.
+--
+--     Note that some platforms will not let you alter the priority (or at least, promote the thread to a higher priority) at all, and some require you to be an administrator account. Be prepared for this to fail.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetCurrentThreadPriority@.
+--                   The unsafe flavor is 'setCurrentThreadPriority'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetCurrentThreadPriority@, defined at @SDL3\/SDL_thread.h 434:34@
+setCurrentThreadPrioritySafe
+  :: SDL_ThreadPriority
+  -- ^
+  --
+  --           [@priority@]: the 'SDL_ThreadPriority' to set.
+  -> IO Bool
+setCurrentThreadPrioritySafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_SetCurrentThreadPriority x00)
+
+-- | Wait for a thread to finish.
+--
+--     Threads that haven\'t been detached will remain until this function cleans them up. Not doing so is a resource leak.
+--
+--     Once a thread has been cleaned up through this function, the 'SDL_Thread' that references it becomes invalid and should not be referenced again. As such, only one thread may call @'waitThread'@ on another.
+--
+--     The return code from the thread function is placed in the area pointed to by @status@, if @status@ is not NULL.
+--
+--     You may not wait on a thread that has been used in a call to @'detachThread'@. Use either that function or this one, but not both, or behavior is undefined.
+--
+--     It is safe to pass a NULL thread to this function; it is a no-op.
+--
+--     Note that the thread pointer is freed by this function and is not valid afterward.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but only a single thread can wait any specific thread to finish.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'detachThread'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WaitThread@.
+--                   The safe flavor is 'waitThreadSafe'
+--                   : blocks until the thread exits.
+--
+--     [C declaration]: @SDL_WaitThread@, defined at @SDL3\/SDL_thread.h 472:34@
+waitThread
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the 'SDL_Thread' pointer that was returned from the @SDL_CreateThread()@ call that started this thread.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@status@]: a pointer filled in with the value returned from the thread function by its \'return\', or -1 if the thread has been detached or isn\'t valid, may be NULL.
+  -> IO ()
+waitThread = Unsafe.sDL_WaitThread
+
+-- | Wait for a thread to finish.
+--
+--     Threads that haven\'t been detached will remain until this function cleans them up. Not doing so is a resource leak.
+--
+--     Once a thread has been cleaned up through this function, the 'SDL_Thread' that references it becomes invalid and should not be referenced again. As such, only one thread may call @'waitThread'@ on another.
+--
+--     The return code from the thread function is placed in the area pointed to by @status@, if @status@ is not NULL.
+--
+--     You may not wait on a thread that has been used in a call to @'detachThread'@. Use either that function or this one, but not both, or behavior is undefined.
+--
+--     It is safe to pass a NULL thread to this function; it is a no-op.
+--
+--     Note that the thread pointer is freed by this function and is not valid afterward.
+--
+--     [Thread safety]: It is safe to call this function from any thread, but only a single thread can wait any specific thread to finish.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'detachThread'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WaitThread@.
+--                   The unsafe flavor is 'waitThread'
+--                   : blocks until the thread exits.
+--
+--     [C declaration]: @SDL_WaitThread@, defined at @SDL3\/SDL_thread.h 472:34@
+waitThreadSafe
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the 'SDL_Thread' pointer that was returned from the @SDL_CreateThread()@ call that started this thread.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@status@]: a pointer filled in with the value returned from the thread function by its \'return\', or -1 if the thread has been detached or isn\'t valid, may be NULL.
+  -> IO ()
+waitThreadSafe = Safe.sDL_WaitThread
+
+-- | Get the current state of a thread.
+--
+--     [Returns]: the current state of a thread, or SDL_THREAD_UNKNOWN if the thread isn\'t valid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_ThreadState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetThreadState@.
+--                   The safe flavor is 'getThreadStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetThreadState@, defined at @SDL3\/SDL_thread.h 487:45@
+getThreadState
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO SDL_ThreadState
+getThreadState = Unsafe.sDL_GetThreadState
+
+-- | Get the current state of a thread.
+--
+--     [Returns]: the current state of a thread, or SDL_THREAD_UNKNOWN if the thread isn\'t valid.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_ThreadState'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetThreadState@.
+--                   The unsafe flavor is 'getThreadState'
+--                   .
+--
+--     [C declaration]: @SDL_GetThreadState@, defined at @SDL3\/SDL_thread.h 487:45@
+getThreadStateSafe
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the thread to query.
+  -> IO SDL_ThreadState
+getThreadStateSafe = Safe.sDL_GetThreadState
+
+-- | Let a thread clean up on exit without intervention.
+--
+--     A thread may be \"detached\" to signify that it should not remain until another thread has called @'waitThread'@ on it. Detaching a thread is useful for long-running threads that nothing needs to synchronize with or further manage. When a detached thread is done, it simply goes away.
+--
+--     There is no way to recover the return code of a detached thread. If you need this, don\'t detach the thread and instead use @'waitThread'@.
+--
+--     Once a thread is detached, you should usually assume the 'SDL_Thread' isn\'t safe to reference again, as it will become invalid immediately upon the detached thread\'s exit, instead of remaining until someone has called @'waitThread'@ to finally clean it up. As such, don\'t detach the same thread more than once.
+--
+--     If a thread has already exited when passed to @'detachThread'@, it will stop waiting for a call to @'waitThread'@ and clean up immediately. It is not safe to detach a thread that might be used with @'waitThread'@.
+--
+--     You may not call @'waitThread'@ on a thread that has been detached. Use either that function or this one, but not both, or behavior is undefined.
+--
+--     It is safe to pass NULL to this function; it is a no-op.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'waitThread'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DetachThread@.
+--                   The safe flavor is 'detachThreadSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DetachThread@, defined at @SDL3\/SDL_thread.h 525:34@
+detachThread
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the 'SDL_Thread' pointer that was returned from the @SDL_CreateThread()@ call that started this thread.
+  -> IO ()
+detachThread = Unsafe.sDL_DetachThread
+
+-- | Let a thread clean up on exit without intervention.
+--
+--     A thread may be \"detached\" to signify that it should not remain until another thread has called @'waitThread'@ on it. Detaching a thread is useful for long-running threads that nothing needs to synchronize with or further manage. When a detached thread is done, it simply goes away.
+--
+--     There is no way to recover the return code of a detached thread. If you need this, don\'t detach the thread and instead use @'waitThread'@.
+--
+--     Once a thread is detached, you should usually assume the 'SDL_Thread' isn\'t safe to reference again, as it will become invalid immediately upon the detached thread\'s exit, instead of remaining until someone has called @'waitThread'@ to finally clean it up. As such, don\'t detach the same thread more than once.
+--
+--     If a thread has already exited when passed to @'detachThread'@, it will stop waiting for a call to @'waitThread'@ and clean up immediately. It is not safe to detach a thread that might be used with @'waitThread'@.
+--
+--     You may not call @'waitThread'@ on a thread that has been detached. Use either that function or this one, but not both, or behavior is undefined.
+--
+--     It is safe to pass NULL to this function; it is a no-op.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: @SDL_CreateThread@, 'waitThread'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DetachThread@.
+--                   The unsafe flavor is 'detachThread'
+--                   .
+--
+--     [C declaration]: @SDL_DetachThread@, defined at @SDL3\/SDL_thread.h 525:34@
+detachThreadSafe
+  :: BG.Ptr SDL_Thread
+  -- ^
+  --
+  --           [@thread@]: the 'SDL_Thread' pointer that was returned from the @SDL_CreateThread()@ call that started this thread.
+  -> IO ()
+detachThreadSafe = Safe.sDL_DetachThread
+
+-- | Get the current thread\'s value associated with a thread local storage ID.
+--
+--     [Returns]: the value associated with the ID for the current thread or NULL if no value has been set; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTLS'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTLS@.
+--                   The safe flavor is 'getTLSSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTLS@, defined at @SDL3\/SDL_thread.h 540:36@
+getTLS
+  :: BG.Ptr SDL_TLSID
+  -- ^
+  --
+  --           [@id@]: a pointer to the thread local storage ID, may not be NULL.
+  -> IO (BG.Ptr BG.Void)
+getTLS = Unsafe.sDL_GetTLS
+
+-- | Get the current thread\'s value associated with a thread local storage ID.
+--
+--     [Returns]: the value associated with the ID for the current thread or NULL if no value has been set; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setTLS'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTLS@.
+--                   The unsafe flavor is 'getTLS'
+--                   .
+--
+--     [C declaration]: @SDL_GetTLS@, defined at @SDL3\/SDL_thread.h 540:36@
+getTLSSafe
+  :: BG.Ptr SDL_TLSID
+  -- ^
+  --
+  --           [@id@]: a pointer to the thread local storage ID, may not be NULL.
+  -> IO (BG.Ptr BG.Void)
+getTLSSafe = Safe.sDL_GetTLS
+
+-- | Set the current thread\'s value associated with a thread local storage ID.
+--
+--     If the thread local storage ID is not initialized (the value is 0), a new ID will be created in a thread-safe way, so all calls using a pointer to the same ID will refer to the same local storage.
+--
+--     Note that replacing a value from a previous call to this function on the same thread does /not/ call the previous value\'s destructor!
+--
+--     @destructor@ can be NULL; it is assumed that @value@ does not need to be cleaned up if so.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTLS'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTLS@.
+--                   The safe flavor is 'setTLSSafe'
+--                   : registration; the destructor runs at thread cleanup.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTLS@, defined at @SDL3\/SDL_thread.h 581:34@
+setTLS
+  :: BG.Ptr SDL_TLSID
+  -- ^
+  --
+  --           [@id@]: a pointer to the thread local storage ID, may not be NULL.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@value@]: the value to associate with the ID for the current thread.
+  -> SDL_TLSDestructorCallback
+  -- ^
+  --
+  --           [@destructor@]: a function called when the thread exits, to free the value, may be NULL.
+  -> IO Bool
+setTLS =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetTLS x00 x11 x22)
+
+-- | Set the current thread\'s value associated with a thread local storage ID.
+--
+--     If the thread local storage ID is not initialized (the value is 0), a new ID will be created in a thread-safe way, so all calls using a pointer to the same ID will refer to the same local storage.
+--
+--     Note that replacing a value from a previous call to this function on the same thread does /not/ call the previous value\'s destructor!
+--
+--     @destructor@ can be NULL; it is assumed that @value@ does not need to be cleaned up if so.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTLS'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTLS@.
+--                   The unsafe flavor is 'setTLS'
+--                   : registration; the destructor runs at thread cleanup.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTLS@, defined at @SDL3\/SDL_thread.h 581:34@
+setTLSSafe
+  :: BG.Ptr SDL_TLSID
+  -- ^
+  --
+  --           [@id@]: a pointer to the thread local storage ID, may not be NULL.
+  -> PtrConst.PtrConst BG.Void
+  -- ^
+  --
+  --           [@value@]: the value to associate with the ID for the current thread.
+  -> SDL_TLSDestructorCallback
+  -- ^
+  --
+  --           [@destructor@]: a function called when the thread exits, to free the value, may be NULL.
+  -> IO Bool
+setTLSSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetTLS x00 x11 x22)
+
+-- | Cleanup all TLS data for this thread.
+--
+--     If you are creating your threads outside of SDL and then calling SDL functions, you should call this function before your thread exits, to properly clean up SDL memory.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CleanupTLS@.
+--                   The safe flavor is 'cleanupTLSSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CleanupTLS@, defined at @SDL3\/SDL_thread.h 594:34@
+cleanupTLS :: IO ()
+cleanupTLS = Unsafe.sDL_CleanupTLS
+
+-- | Cleanup all TLS data for this thread.
+--
+--     If you are creating your threads outside of SDL and then calling SDL functions, you should call this function before your thread exits, to properly clean up SDL memory.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CleanupTLS@.
+--                   The unsafe flavor is 'cleanupTLS'
+--                   .
+--
+--     [C declaration]: @SDL_CleanupTLS@, defined at @SDL3\/SDL_thread.h 594:34@
+cleanupTLSSafe :: IO ()
+cleanupTLSSafe = Safe.sDL_CleanupTLS
diff --git a/src/SDL3/Sys/Time.hs b/src/SDL3/Sys/Time.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Time.hs
@@ -0,0 +1,678 @@
+-- | SDL realtime clock and date\/time routines.
+--
+--     There are two data types that are used in this category: SDL_Time, which represents the nanoseconds since a specific moment (an \"epoch\"), and 'SDL_DateTime', which breaks time down into human-understandable components: years, months, days, hours, etc.
+--
+--     Much of the functionality is involved in converting those two types to other useful forms. A structure holding a calendar date and time broken down into its components.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Time.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Time (
+  module SDL3.Sys.Bindgen.Time,
+
+  -- * Function aliases
+  SDL3.Sys.Time.getDateTimeLocalePreferences,
+  SDL3.Sys.Time.getDateTimeLocalePreferencesSafe,
+  SDL3.Sys.Time.getCurrentTime,
+  SDL3.Sys.Time.getCurrentTimeSafe,
+  SDL3.Sys.Time.timeToDateTime,
+  SDL3.Sys.Time.timeToDateTimeSafe,
+  SDL3.Sys.Time.dateTimeToTime,
+  SDL3.Sys.Time.dateTimeToTimeSafe,
+  SDL3.Sys.Time.timeToWindows,
+  SDL3.Sys.Time.timeToWindowsSafe,
+  SDL3.Sys.Time.timeFromWindows,
+  SDL3.Sys.Time.timeFromWindowsSafe,
+  SDL3.Sys.Time.getDaysInMonth,
+  SDL3.Sys.Time.getDaysInMonthSafe,
+  SDL3.Sys.Time.getDayOfYear,
+  SDL3.Sys.Time.getDayOfYearSafe,
+  SDL3.Sys.Time.getDayOfWeek,
+  SDL3.Sys.Time.getDayOfWeekSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Time
+import SDL3.Sys.Bindgen.Time.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Time.Unsafe qualified as Unsafe
+
+-- | Gets the current preferred date and time format for the system locale.
+--
+--     This might be a \"slow\" call that has to query the operating system. It\'s best to ask for this once and save the results. However, the preferred formats can change, usually because the user has changed a system preference outside of your program.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDateTimeLocalePreferences@.
+--                   The safe flavor is 'getDateTimeLocalePreferencesSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDateTimeLocalePreferences@, defined at @SDL3\/SDL_time.h 113:34@
+getDateTimeLocalePreferences
+  :: BG.Ptr SDL_DateFormat
+  -- ^
+  --
+  --           [@dateFormat@]: a pointer to the 'SDL_DateFormat' to hold the returned date format, may be NULL.
+  -> BG.Ptr SDL_TimeFormat
+  -- ^
+  --
+  --           [@timeFormat@]: a pointer to the 'SDL_TimeFormat' to hold the returned time format, may be NULL.
+  -> IO Bool
+getDateTimeLocalePreferences =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetDateTimeLocalePreferences x00 x11)
+
+-- | Gets the current preferred date and time format for the system locale.
+--
+--     This might be a \"slow\" call that has to query the operating system. It\'s best to ask for this once and save the results. However, the preferred formats can change, usually because the user has changed a system preference outside of your program.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDateTimeLocalePreferences@.
+--                   The unsafe flavor is 'getDateTimeLocalePreferences'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDateTimeLocalePreferences@, defined at @SDL3\/SDL_time.h 113:34@
+getDateTimeLocalePreferencesSafe
+  :: BG.Ptr SDL_DateFormat
+  -- ^
+  --
+  --           [@dateFormat@]: a pointer to the 'SDL_DateFormat' to hold the returned date format, may be NULL.
+  -> BG.Ptr SDL_TimeFormat
+  -- ^
+  --
+  --           [@timeFormat@]: a pointer to the 'SDL_TimeFormat' to hold the returned time format, may be NULL.
+  -> IO Bool
+getDateTimeLocalePreferencesSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetDateTimeLocalePreferences x00 x11)
+
+-- | Gets the current value of the system realtime clock in nanoseconds since Jan 1, 1970 in Universal Coordinated Time (UTC).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCurrentTime@.
+--                   The safe flavor is 'getCurrentTimeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetCurrentTime@, defined at @SDL3\/SDL_time.h 127:34@
+getCurrentTime
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the SDL_Time to hold the returned tick count.
+  -> IO Bool
+getCurrentTime =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GetCurrentTime x00)
+
+-- | Gets the current value of the system realtime clock in nanoseconds since Jan 1, 1970 in Universal Coordinated Time (UTC).
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCurrentTime@.
+--                   The unsafe flavor is 'getCurrentTime'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetCurrentTime@, defined at @SDL3\/SDL_time.h 127:34@
+getCurrentTimeSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the SDL_Time to hold the returned tick count.
+  -> IO Bool
+getCurrentTimeSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GetCurrentTime x00)
+
+-- | Converts an SDL_Time in nanoseconds since the epoch to a calendar time in the 'SDL_DateTime' format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_TimeToDateTime@.
+--                   The safe flavor is 'timeToDateTimeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TimeToDateTime@, defined at @SDL3\/SDL_time.h 145:34@
+timeToDateTime
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the SDL_Time to be converted.
+  -> BG.Ptr SDL_DateTime
+  -- ^
+  --
+  --           [@dt@]: the resulting 'SDL_DateTime'.
+  -> Bool
+  -- ^
+  --
+  --           [@localTime@]: the resulting 'SDL_DateTime' will be expressed in local time if true, otherwise it will be in Universal Coordinated Time (UTC).
+  -> IO Bool
+timeToDateTime =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_TimeToDateTime x00 x11 (CBool.fromBool x22))
+
+-- | Converts an SDL_Time in nanoseconds since the epoch to a calendar time in the 'SDL_DateTime' format.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_TimeToDateTime@.
+--                   The unsafe flavor is 'timeToDateTime'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TimeToDateTime@, defined at @SDL3\/SDL_time.h 145:34@
+timeToDateTimeSafe
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the SDL_Time to be converted.
+  -> BG.Ptr SDL_DateTime
+  -- ^
+  --
+  --           [@dt@]: the resulting 'SDL_DateTime'.
+  -> Bool
+  -- ^
+  --
+  --           [@localTime@]: the resulting 'SDL_DateTime' will be expressed in local time if true, otherwise it will be in Universal Coordinated Time (UTC).
+  -> IO Bool
+timeToDateTimeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_TimeToDateTime x00 x11 (CBool.fromBool x22))
+
+-- | Converts a calendar time to an SDL_Time in nanoseconds since the epoch.
+--
+--     This function ignores the day_of_week member of the 'SDL_DateTime' struct, so it may remain unset.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DateTimeToTime@.
+--                   The safe flavor is 'dateTimeToTimeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DateTimeToTime@, defined at @SDL3\/SDL_time.h 162:34@
+dateTimeToTime
+  :: PtrConst.PtrConst SDL_DateTime
+  -- ^
+  --
+  --           [@dt@]: the source 'SDL_DateTime'.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the resulting SDL_Time.
+  -> IO Bool
+dateTimeToTime =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_DateTimeToTime x00 x11)
+
+-- | Converts a calendar time to an SDL_Time in nanoseconds since the epoch.
+--
+--     This function ignores the day_of_week member of the 'SDL_DateTime' struct, so it may remain unset.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DateTimeToTime@.
+--                   The unsafe flavor is 'dateTimeToTime'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DateTimeToTime@, defined at @SDL3\/SDL_time.h 162:34@
+dateTimeToTimeSafe
+  :: PtrConst.PtrConst SDL_DateTime
+  -- ^
+  --
+  --           [@dt@]: the source 'SDL_DateTime'.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the resulting SDL_Time.
+  -> IO Bool
+dateTimeToTimeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_DateTimeToTime x00 x11)
+
+-- | Converts an SDL time into a Windows FILETIME (100-nanosecond intervals since January 1, 1601).
+--
+--     This function fills in the two 32-bit values of the FILETIME structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_TimeToWindows@.
+--                   The safe flavor is 'timeToWindowsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_TimeToWindows@, defined at @SDL3\/SDL_time.h 180:34@
+timeToWindows
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the time to convert.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwLowDateTime@]: a pointer filled in with the low portion of the Windows FILETIME value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwHighDateTime@]: a pointer filled in with the high portion of the Windows FILETIME value.
+  -> IO ()
+timeToWindows = Unsafe.sDL_TimeToWindows
+
+-- | Converts an SDL time into a Windows FILETIME (100-nanosecond intervals since January 1, 1601).
+--
+--     This function fills in the two 32-bit values of the FILETIME structure.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_TimeToWindows@.
+--                   The unsafe flavor is 'timeToWindows'
+--                   .
+--
+--     [C declaration]: @SDL_TimeToWindows@, defined at @SDL3\/SDL_time.h 180:34@
+timeToWindowsSafe
+  :: SDL3.Sys.Bindgen.Stdinc.SDL_Time
+  -- ^
+  --
+  --           [@ticks@]: the time to convert.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwLowDateTime@]: a pointer filled in with the low portion of the Windows FILETIME value.
+  -> BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@dwHighDateTime@]: a pointer filled in with the high portion of the Windows FILETIME value.
+  -> IO ()
+timeToWindowsSafe = Safe.sDL_TimeToWindows
+
+-- | Converts a Windows FILETIME (100-nanosecond intervals since January 1, 1601) to an SDL time.
+--
+--     This function takes the two 32-bit values of the FILETIME structure as parameters.
+--
+--     [Returns]: the converted SDL time.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_TimeFromWindows@.
+--                   The safe flavor is 'timeFromWindowsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TimeFromWindows@, defined at @SDL3\/SDL_time.h 197:38@
+timeFromWindows
+  :: BG.Word32
+  -- ^
+  --
+  --           [@dwLowDateTime@]: the low portion of the Windows FILETIME value.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@dwHighDateTime@]: the high portion of the Windows FILETIME value.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_Time
+timeFromWindows =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_TimeFromWindows (Coerce.coerce x00) (Coerce.coerce x11)
+
+-- | Converts a Windows FILETIME (100-nanosecond intervals since January 1, 1601) to an SDL time.
+--
+--     This function takes the two 32-bit values of the FILETIME structure as parameters.
+--
+--     [Returns]: the converted SDL time.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_TimeFromWindows@.
+--                   The unsafe flavor is 'timeFromWindows'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_TimeFromWindows@, defined at @SDL3\/SDL_time.h 197:38@
+timeFromWindowsSafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@dwLowDateTime@]: the low portion of the Windows FILETIME value.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@dwHighDateTime@]: the high portion of the Windows FILETIME value.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_Time
+timeFromWindowsSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_TimeFromWindows (Coerce.coerce x00) (Coerce.coerce x11)
+
+-- | Get the number of days in a month for a given year.
+--
+--     [Returns]: the number of days in the requested month or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDaysInMonth@.
+--                   The safe flavor is 'getDaysInMonthSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDaysInMonth@, defined at @SDL3\/SDL_time.h 211:33@
+getDaysInMonth
+  :: BG.Int32
+  -- ^
+  --
+  --           [@year@]: the year.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@month@]: the month [1-12].
+  -> IO BG.Int32
+getDaysInMonth =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Unsafe.sDL_GetDaysInMonth (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Get the number of days in a month for a given year.
+--
+--     [Returns]: the number of days in the requested month or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDaysInMonth@.
+--                   The unsafe flavor is 'getDaysInMonth'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDaysInMonth@, defined at @SDL3\/SDL_time.h 211:33@
+getDaysInMonthSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@year@]: the year.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@month@]: the month [1-12].
+  -> IO BG.Int32
+getDaysInMonthSafe =
+  \x00 ->
+    \x11 ->
+      fmap Coerce.coerce (Safe.sDL_GetDaysInMonth (Coerce.coerce x00) (Coerce.coerce x11))
+
+-- | Get the day of year for a calendar date.
+--
+--     [Returns]: the day of year [0-365] if the date is valid or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDayOfYear@.
+--                   The safe flavor is 'getDayOfYearSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDayOfYear@, defined at @SDL3\/SDL_time.h 226:33@
+getDayOfYear
+  :: BG.Int32
+  -- ^
+  --
+  --           [@year@]: the year component of the date.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@month@]: the month component of the date.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@day@]: the day component of the date.
+  -> IO BG.Int32
+getDayOfYear =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap
+          Coerce.coerce
+          (Unsafe.sDL_GetDayOfYear (Coerce.coerce x00) (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Get the day of year for a calendar date.
+--
+--     [Returns]: the day of year [0-365] if the date is valid or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDayOfYear@.
+--                   The unsafe flavor is 'getDayOfYear'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDayOfYear@, defined at @SDL3\/SDL_time.h 226:33@
+getDayOfYearSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@year@]: the year component of the date.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@month@]: the month component of the date.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@day@]: the day component of the date.
+  -> IO BG.Int32
+getDayOfYearSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap
+          Coerce.coerce
+          (Safe.sDL_GetDayOfYear (Coerce.coerce x00) (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Get the day of week for a calendar date.
+--
+--     [Returns]: a value between 0 and 6 (0 being Sunday) if the date is valid or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDayOfWeek@.
+--                   The safe flavor is 'getDayOfWeekSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDayOfWeek@, defined at @SDL3\/SDL_time.h 241:33@
+getDayOfWeek
+  :: BG.Int32
+  -- ^
+  --
+  --           [@year@]: the year component of the date.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@month@]: the month component of the date.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@day@]: the day component of the date.
+  -> IO BG.Int32
+getDayOfWeek =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap
+          Coerce.coerce
+          (Unsafe.sDL_GetDayOfWeek (Coerce.coerce x00) (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Get the day of week for a calendar date.
+--
+--     [Returns]: a value between 0 and 6 (0 being Sunday) if the date is valid or -1 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDayOfWeek@.
+--                   The unsafe flavor is 'getDayOfWeek'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDayOfWeek@, defined at @SDL3\/SDL_time.h 241:33@
+getDayOfWeekSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@year@]: the year component of the date.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@month@]: the month component of the date.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@day@]: the day component of the date.
+  -> IO BG.Int32
+getDayOfWeekSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap
+          Coerce.coerce
+          (Safe.sDL_GetDayOfWeek (Coerce.coerce x00) (Coerce.coerce x11) (Coerce.coerce x22))
diff --git a/src/SDL3/Sys/Timer.hs b/src/SDL3/Sys/Timer.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Timer.hs
@@ -0,0 +1,567 @@
+-- | SDL provides time management functionality. It is useful for dealing with (usually) small durations of time.
+--
+--     This is not to be confused with /calendar time/ management, which is provided by [CategoryTime](https:\/\/wiki.libsdl.org\/SDL3\/CategoryTime).
+--
+--     This category covers measuring time elapsed (@'getTicks'@, @'getPerformanceCounter'@), putting a thread to sleep for a certain amount of time (@'delay'@, @'delayNS'@, @'delayPrecise'@), and firing a callback function after a certain amount of time has elapsed (@'addTimer'@, etc).
+--
+--     There are also useful macros to convert between time units, like @SDL_SECONDS_TO_NS()@ and such. Number of milliseconds in a second.
+--
+--     This is always 1000.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Timer.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Timer (
+  module SDL3.Sys.Bindgen.Timer,
+
+  -- * Function aliases
+  SDL3.Sys.Timer.getTicks,
+  SDL3.Sys.Timer.getTicksNS,
+  SDL3.Sys.Timer.getPerformanceCounter,
+  SDL3.Sys.Timer.getPerformanceFrequency,
+  SDL3.Sys.Timer.delay,
+  SDL3.Sys.Timer.delaySafe,
+  SDL3.Sys.Timer.delayNS,
+  SDL3.Sys.Timer.delayNSSafe,
+  SDL3.Sys.Timer.delayPrecise,
+  SDL3.Sys.Timer.delayPreciseSafe,
+  SDL3.Sys.Timer.addTimer,
+  SDL3.Sys.Timer.addTimerSafe,
+  SDL3.Sys.Timer.addTimerNS,
+  SDL3.Sys.Timer.addTimerNSSafe,
+  SDL3.Sys.Timer.removeTimer,
+  SDL3.Sys.Timer.removeTimerSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Timer
+import SDL3.Sys.Bindgen.Timer.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Timer.Unsafe qualified as Unsafe
+
+-- | Get the number of milliseconds that have elapsed since the SDL library initialization.
+--
+--     [Returns]: an unsigned 64‑bit integer that represents the number of milliseconds that have elapsed since the SDL library was initialized (typically via a call to SDL_Init).
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTicksNS'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTicks@.
+--                   The safe import is not exported
+--                   : reads a monotonic clock value; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTicks@, defined at @SDL3\/SDL_timer.h 201:36@
+getTicks :: IO BG.Word64
+getTicks = fmap Coerce.coerce Unsafe.sDL_GetTicks
+
+-- | Get the number of nanoseconds since SDL library initialization.
+--
+--     [Returns]: an unsigned 64-bit value representing the number of nanoseconds since the SDL library initialized.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTicksNS@.
+--                   The safe import is not exported
+--                   : reads a monotonic clock value; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTicksNS@, defined at @SDL3\/SDL_timer.h 213:36@
+getTicksNS :: IO BG.Word64
+getTicksNS = fmap Coerce.coerce Unsafe.sDL_GetTicksNS
+
+-- | Get the current value of the high resolution counter.
+--
+--     This function is typically used for profiling.
+--
+--     The counter values are only meaningful relative to each other. Differences between values can be converted to times by using @'getPerformanceFrequency'@.
+--
+--     [Returns]: the current counter value.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPerformanceFrequency'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPerformanceCounter@.
+--                   The safe import is not exported
+--                   : reads a monotonic clock value; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetPerformanceCounter@, defined at @SDL3\/SDL_timer.h 232:36@
+getPerformanceCounter :: IO BG.Word64
+getPerformanceCounter =
+  fmap Coerce.coerce Unsafe.sDL_GetPerformanceCounter
+
+-- | Get the count per second of the high resolution counter.
+--
+--     [Returns]: a platform-specific count per second.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getPerformanceCounter'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPerformanceFrequency@.
+--                   The safe import is not exported
+--                   : reads a monotonic clock value; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetPerformanceFrequency@, defined at @SDL3\/SDL_timer.h 245:36@
+getPerformanceFrequency :: IO BG.Word64
+getPerformanceFrequency =
+  fmap Coerce.coerce Unsafe.sDL_GetPerformanceFrequency
+
+-- | Wait a specified number of milliseconds before returning.
+--
+--     This function waits a specified number of milliseconds before returning. It waits at least the specified time, but possibly longer due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'delayNS', 'delayPrecise'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Delay@.
+--                   The safe flavor is 'delaySafe'
+--                   : sleeps the OS thread; an unsafe call stalls every capability and GC for the duration.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_Delay@, defined at @SDL3\/SDL_timer.h 263:34@
+delay
+  :: BG.Word32
+  -- ^
+  --
+  --           [@ms@]: the number of milliseconds to delay.
+  -> IO ()
+delay = \x00 -> Unsafe.sDL_Delay (Coerce.coerce x00)
+
+-- | Wait a specified number of milliseconds before returning.
+--
+--     This function waits a specified number of milliseconds before returning. It waits at least the specified time, but possibly longer due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'delayNS', 'delayPrecise'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Delay@.
+--                   The unsafe flavor is 'delay'
+--                   : sleeps the OS thread; an unsafe call stalls every capability and GC for the duration.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_Delay@, defined at @SDL3\/SDL_timer.h 263:34@
+delaySafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@ms@]: the number of milliseconds to delay.
+  -> IO ()
+delaySafe =
+  \x00 -> Safe.sDL_Delay (Coerce.coerce x00)
+
+-- | Wait a specified number of nanoseconds before returning.
+--
+--     This function waits a specified number of nanoseconds before returning. It waits at least the specified time, but possibly longer due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'delay', 'delayPrecise'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DelayNS@.
+--                   The safe flavor is 'delayNSSafe'
+--                   : sleeps the OS thread; an unsafe call stalls every capability and GC for the duration.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DelayNS@, defined at @SDL3\/SDL_timer.h 281:34@
+delayNS
+  :: BG.Word64
+  -- ^
+  --
+  --           [@ns@]: the number of nanoseconds to delay.
+  -> IO ()
+delayNS =
+  \x00 -> Unsafe.sDL_DelayNS (Coerce.coerce x00)
+
+-- | Wait a specified number of nanoseconds before returning.
+--
+--     This function waits a specified number of nanoseconds before returning. It waits at least the specified time, but possibly longer due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'delay', 'delayPrecise'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DelayNS@.
+--                   The unsafe flavor is 'delayNS'
+--                   : sleeps the OS thread; an unsafe call stalls every capability and GC for the duration.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DelayNS@, defined at @SDL3\/SDL_timer.h 281:34@
+delayNSSafe
+  :: BG.Word64
+  -- ^
+  --
+  --           [@ns@]: the number of nanoseconds to delay.
+  -> IO ()
+delayNSSafe =
+  \x00 -> Safe.sDL_DelayNS (Coerce.coerce x00)
+
+-- | Wait a specified number of nanoseconds before returning.
+--
+--     This function waits a specified number of nanoseconds before returning. It will attempt to wait as close to the requested time as possible, busy waiting if necessary, but could return later due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'delay', 'delayNS'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DelayPrecise@.
+--                   The safe flavor is 'delayPreciseSafe'
+--                   : sleeps the OS thread; an unsafe call stalls every capability and GC for the duration.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DelayPrecise@, defined at @SDL3\/SDL_timer.h 299:34@
+delayPrecise
+  :: BG.Word64
+  -- ^
+  --
+  --           [@ns@]: the number of nanoseconds to delay.
+  -> IO ()
+delayPrecise =
+  \x00 -> Unsafe.sDL_DelayPrecise (Coerce.coerce x00)
+
+-- | Wait a specified number of nanoseconds before returning.
+--
+--     This function waits a specified number of nanoseconds before returning. It will attempt to wait as close to the requested time as possible, busy waiting if necessary, but could return later due to OS scheduling.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'delay', 'delayNS'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DelayPrecise@.
+--                   The unsafe flavor is 'delayPrecise'
+--                   : sleeps the OS thread; an unsafe call stalls every capability and GC for the duration.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DelayPrecise@, defined at @SDL3\/SDL_timer.h 299:34@
+delayPreciseSafe
+  :: BG.Word64
+  -- ^
+  --
+  --           [@ns@]: the number of nanoseconds to delay.
+  -> IO ()
+delayPreciseSafe =
+  \x00 -> Safe.sDL_DelayPrecise (Coerce.coerce x00)
+
+-- | Call a callback function at a future time.
+--
+--     The callback function is passed the current timer interval and the user supplied parameter from the @'addTimer'@ call and should return the next timer interval. If the value returned from the callback is 0, the timer is canceled and will be removed.
+--
+--     The callback is run on a separate thread, and for short timeouts can potentially be called before this function returns.
+--
+--     Timers take into account the amount of time it took to execute the callback. For example, if the callback took 250 ms to execute and returned 1000 (ms), the timer would only wait another 750 ms before its next iteration.
+--
+--     Timing may be inexact due to OS scheduling. Be sure to note the current time with @'getTicksNS'@ or @'getPerformanceCounter'@ in case your callback needs to adjust for variances.
+--
+--     [Returns]: a timer ID or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addTimerNS', 'removeTimer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AddTimer@.
+--                   The safe flavor is 'addTimerSafe'
+--                   : registration; the timer fires on SDL\'s timer thread.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddTimer@, defined at @SDL3\/SDL_timer.h 368:41@
+addTimer
+  :: BG.Word32
+  -- ^
+  --
+  --           [@interval@]: the timer delay, in milliseconds, passed to @callback@.
+  -> SDL_TimerCallback
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_TimerCallback' function to call when the specified @interval@ elapses.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO SDL_TimerID
+addTimer =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_AddTimer (Coerce.coerce x00) x11 x22
+
+-- | Call a callback function at a future time.
+--
+--     The callback function is passed the current timer interval and the user supplied parameter from the @'addTimer'@ call and should return the next timer interval. If the value returned from the callback is 0, the timer is canceled and will be removed.
+--
+--     The callback is run on a separate thread, and for short timeouts can potentially be called before this function returns.
+--
+--     Timers take into account the amount of time it took to execute the callback. For example, if the callback took 250 ms to execute and returned 1000 (ms), the timer would only wait another 750 ms before its next iteration.
+--
+--     Timing may be inexact due to OS scheduling. Be sure to note the current time with @'getTicksNS'@ or @'getPerformanceCounter'@ in case your callback needs to adjust for variances.
+--
+--     [Returns]: a timer ID or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addTimerNS', 'removeTimer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddTimer@.
+--                   The unsafe flavor is 'addTimer'
+--                   : registration; the timer fires on SDL\'s timer thread.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddTimer@, defined at @SDL3\/SDL_timer.h 368:41@
+addTimerSafe
+  :: BG.Word32
+  -- ^
+  --
+  --           [@interval@]: the timer delay, in milliseconds, passed to @callback@.
+  -> SDL_TimerCallback
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_TimerCallback' function to call when the specified @interval@ elapses.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO SDL_TimerID
+addTimerSafe =
+  \x00 ->
+    \x11 ->
+      \x22 -> Safe.sDL_AddTimer (Coerce.coerce x00) x11 x22
+
+-- | Call a callback function at a future time.
+--
+--     The callback function is passed the current timer interval and the user supplied parameter from the @'addTimerNS'@ call and should return the next timer interval. If the value returned from the callback is 0, the timer is canceled and will be removed.
+--
+--     The callback is run on a separate thread, and for short timeouts can potentially be called before this function returns.
+--
+--     Timers take into account the amount of time it took to execute the callback. For example, if the callback took 250 ns to execute and returned 1000 (ns), the timer would only wait another 750 ns before its next iteration.
+--
+--     Timing may be inexact due to OS scheduling. Be sure to note the current time with @'getTicksNS'@ or @'getPerformanceCounter'@ in case your callback needs to adjust for variances.
+--
+--     [Returns]: a timer ID or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addTimer', 'removeTimer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_AddTimerNS@.
+--                   The safe flavor is 'addTimerNSSafe'
+--                   : registration; the timer fires on SDL\'s timer thread.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddTimerNS@, defined at @SDL3\/SDL_timer.h 430:41@
+addTimerNS
+  :: BG.Word64
+  -- ^
+  --
+  --           [@interval@]: the timer delay, in nanoseconds, passed to @callback@.
+  -> SDL_NSTimerCallback
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_TimerCallback' function to call when the specified @interval@ elapses.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO SDL_TimerID
+addTimerNS =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Unsafe.sDL_AddTimerNS (Coerce.coerce x00) x11 x22
+
+-- | Call a callback function at a future time.
+--
+--     The callback function is passed the current timer interval and the user supplied parameter from the @'addTimerNS'@ call and should return the next timer interval. If the value returned from the callback is 0, the timer is canceled and will be removed.
+--
+--     The callback is run on a separate thread, and for short timeouts can potentially be called before this function returns.
+--
+--     Timers take into account the amount of time it took to execute the callback. For example, if the callback took 250 ns to execute and returned 1000 (ns), the timer would only wait another 750 ns before its next iteration.
+--
+--     Timing may be inexact due to OS scheduling. Be sure to note the current time with @'getTicksNS'@ or @'getPerformanceCounter'@ in case your callback needs to adjust for variances.
+--
+--     [Returns]: a timer ID or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addTimer', 'removeTimer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_AddTimerNS@.
+--                   The unsafe flavor is 'addTimerNS'
+--                   : registration; the timer fires on SDL\'s timer thread.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_AddTimerNS@, defined at @SDL3\/SDL_timer.h 430:41@
+addTimerNSSafe
+  :: BG.Word64
+  -- ^
+  --
+  --           [@interval@]: the timer delay, in nanoseconds, passed to @callback@.
+  -> SDL_NSTimerCallback
+  -- ^
+  --
+  --           [@callback@]: the 'SDL_TimerCallback' function to call when the specified @interval@ elapses.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to @callback@.
+  -> IO SDL_TimerID
+addTimerNSSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        Safe.sDL_AddTimerNS (Coerce.coerce x00) x11 x22
+
+-- | Remove a timer created with @'addTimer'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addTimer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RemoveTimer@.
+--                   The safe flavor is 'removeTimerSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RemoveTimer@, defined at @SDL3\/SDL_timer.h 445:34@
+removeTimer
+  :: SDL_TimerID
+  -- ^
+  --
+  --           [@id@]: the ID of the timer to remove.
+  -> IO Bool
+removeTimer =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_RemoveTimer x00)
+
+-- | Remove a timer created with @'addTimer'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'addTimer'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RemoveTimer@.
+--                   The unsafe flavor is 'removeTimer'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RemoveTimer@, defined at @SDL3\/SDL_timer.h 445:34@
+removeTimerSafe
+  :: SDL_TimerID
+  -- ^
+  --
+  --           [@id@]: the ID of the timer to remove.
+  -> IO Bool
+removeTimerSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_RemoveTimer x00)
diff --git a/src/SDL3/Sys/Touch.hs b/src/SDL3/Sys/Touch.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Touch.hs
@@ -0,0 +1,217 @@
+-- | SDL offers touch input, on platforms that support it. It can manage multiple touch devices and track multiple fingers on those devices.
+--
+--     Touches are mostly dealt with through the event system, in the SDL_EVENT_FINGER_DOWN, SDL_EVENT_FINGER_MOTION, and SDL_EVENT_FINGER_UP events, but there are also functions to query for hardware details, etc.
+--
+--     The touch system, by default, will also send virtual mouse events; this can be useful for making a some desktop apps work on a phone without significant changes. For apps that care about mouse and touch input separately, they should ignore mouse events that have a @which@ field of SDL_TOUCH_MOUSEID. A unique ID for a touch device.
+--
+--     This ID is valid for the time the device is connected to the system, and is never reused for the lifetime of the application.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Touch.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Touch (
+  module SDL3.Sys.Bindgen.Touch,
+
+  -- * Function aliases
+  SDL3.Sys.Touch.getTouchDevices,
+  SDL3.Sys.Touch.getTouchDevicesSafe,
+  SDL3.Sys.Touch.getTouchDeviceName,
+  SDL3.Sys.Touch.getTouchDeviceNameSafe,
+  SDL3.Sys.Touch.getTouchDeviceType,
+  SDL3.Sys.Touch.getTouchDeviceTypeSafe,
+  SDL3.Sys.Touch.getTouchFingers,
+  SDL3.Sys.Touch.getTouchFingersSafe,
+)
+where
+
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Touch
+import SDL3.Sys.Bindgen.Touch.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Touch.Unsafe qualified as Unsafe
+
+-- | Get a list of registered touch devices.
+--
+--     On some platforms SDL first sees the touch device if it was actually used. Therefore the returned list might be empty, although devices are available. After using all devices at least once the number will be correct.
+--
+--     [Returns]: a 0 terminated array of touch device IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTouchDevices@.
+--                   The safe flavor is 'getTouchDevicesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTouchDevices@, defined at @SDL3\/SDL_touch.h 140:43@
+getTouchDevices
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_TouchID)
+getTouchDevices = Unsafe.sDL_GetTouchDevices
+
+-- | Get a list of registered touch devices.
+--
+--     On some platforms SDL first sees the touch device if it was actually used. Therefore the returned list might be empty, although devices are available. After using all devices at least once the number will be correct.
+--
+--     [Returns]: a 0 terminated array of touch device IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTouchDevices@.
+--                   The unsafe flavor is 'getTouchDevices'
+--                   .
+--
+--     [C declaration]: @SDL_GetTouchDevices@, defined at @SDL3\/SDL_touch.h 140:43@
+getTouchDevicesSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of devices returned, may be NULL.
+  -> IO (BG.Ptr SDL_TouchID)
+getTouchDevicesSafe = Safe.sDL_GetTouchDevices
+
+-- | Get the touch device name as reported from the driver.
+--
+--     [Returns]: touch device name, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTouchDeviceName@.
+--                   The safe flavor is 'getTouchDeviceNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTouchDeviceName@, defined at @SDL3\/SDL_touch.h 151:42@
+getTouchDeviceName
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the touch device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getTouchDeviceName = Unsafe.sDL_GetTouchDeviceName
+
+-- | Get the touch device name as reported from the driver.
+--
+--     [Returns]: touch device name, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTouchDeviceName@.
+--                   The unsafe flavor is 'getTouchDeviceName'
+--                   .
+--
+--     [C declaration]: @SDL_GetTouchDeviceName@, defined at @SDL3\/SDL_touch.h 151:42@
+getTouchDeviceNameSafe
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the touch device instance ID.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getTouchDeviceNameSafe = Safe.sDL_GetTouchDeviceName
+
+-- | Get the type of the given touch device.
+--
+--     [Returns]: touch device type.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTouchDeviceType@.
+--                   The safe flavor is 'getTouchDeviceTypeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTouchDeviceType@, defined at @SDL3\/SDL_touch.h 161:49@
+getTouchDeviceType
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the ID of a touch device.
+  -> IO SDL_TouchDeviceType
+getTouchDeviceType = Unsafe.sDL_GetTouchDeviceType
+
+-- | Get the type of the given touch device.
+--
+--     [Returns]: touch device type.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTouchDeviceType@.
+--                   The unsafe flavor is 'getTouchDeviceType'
+--                   .
+--
+--     [C declaration]: @SDL_GetTouchDeviceType@, defined at @SDL3\/SDL_touch.h 161:49@
+getTouchDeviceTypeSafe
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the ID of a touch device.
+  -> IO SDL_TouchDeviceType
+getTouchDeviceTypeSafe = Safe.sDL_GetTouchDeviceType
+
+-- | Get a list of active fingers for a given touch device.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Finger' pointers or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTouchFingers@.
+--                   The safe flavor is 'getTouchFingersSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTouchFingers@, defined at @SDL3\/SDL_touch.h 176:43@
+getTouchFingers
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the ID of a touch device.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of fingers returned, can be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Finger))
+getTouchFingers = Unsafe.sDL_GetTouchFingers
+
+-- | Get a list of active fingers for a given touch device.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Finger' pointers or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTouchFingers@.
+--                   The unsafe flavor is 'getTouchFingers'
+--                   .
+--
+--     [C declaration]: @SDL_GetTouchFingers@, defined at @SDL3\/SDL_touch.h 176:43@
+getTouchFingersSafe
+  :: SDL_TouchID
+  -- ^
+  --
+  --           [@touchID@]: the ID of a touch device.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of fingers returned, can be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Finger))
+getTouchFingersSafe = Safe.sDL_GetTouchFingers
diff --git a/src/SDL3/Sys/Tray.hs b/src/SDL3/Sys/Tray.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Tray.hs
@@ -0,0 +1,1451 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | SDL offers a way to add items to the \"system tray\" (more correctly called the \"notification area\" on Windows). On platforms that offer this concept, an SDL app can add a tray icon, submenus, checkboxes, and clickable entries, and register a callback that is fired when the user clicks on these pieces. An opaque handle representing a toplevel system tray object.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Tray.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Tray (
+  module SDL3.Sys.Bindgen.Tray,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Tray.SDL_TRAYENTRY_BUTTON,
+  pattern SDL3.Sys.Tray.SDL_TRAYENTRY_CHECKBOX,
+  pattern SDL3.Sys.Tray.SDL_TRAYENTRY_SUBMENU,
+  pattern SDL3.Sys.Tray.SDL_TRAYENTRY_DISABLED,
+  pattern SDL3.Sys.Tray.SDL_TRAYENTRY_CHECKED,
+
+  -- * Function aliases
+  SDL3.Sys.Tray.createTray,
+  SDL3.Sys.Tray.createTraySafe,
+  SDL3.Sys.Tray.setTrayIcon,
+  SDL3.Sys.Tray.setTrayIconSafe,
+  SDL3.Sys.Tray.setTrayTooltip,
+  SDL3.Sys.Tray.setTrayTooltipSafe,
+  SDL3.Sys.Tray.createTrayMenu,
+  SDL3.Sys.Tray.createTrayMenuSafe,
+  SDL3.Sys.Tray.createTraySubmenu,
+  SDL3.Sys.Tray.createTraySubmenuSafe,
+  SDL3.Sys.Tray.getTrayMenu,
+  SDL3.Sys.Tray.getTrayMenuSafe,
+  SDL3.Sys.Tray.getTraySubmenu,
+  SDL3.Sys.Tray.getTraySubmenuSafe,
+  SDL3.Sys.Tray.getTrayEntries,
+  SDL3.Sys.Tray.getTrayEntriesSafe,
+  SDL3.Sys.Tray.removeTrayEntry,
+  SDL3.Sys.Tray.removeTrayEntrySafe,
+  SDL3.Sys.Tray.insertTrayEntryAt,
+  SDL3.Sys.Tray.insertTrayEntryAtSafe,
+  SDL3.Sys.Tray.setTrayEntryLabel,
+  SDL3.Sys.Tray.setTrayEntryLabelSafe,
+  SDL3.Sys.Tray.getTrayEntryLabel,
+  SDL3.Sys.Tray.getTrayEntryLabelSafe,
+  SDL3.Sys.Tray.setTrayEntryChecked,
+  SDL3.Sys.Tray.setTrayEntryCheckedSafe,
+  SDL3.Sys.Tray.getTrayEntryChecked,
+  SDL3.Sys.Tray.getTrayEntryCheckedSafe,
+  SDL3.Sys.Tray.setTrayEntryEnabled,
+  SDL3.Sys.Tray.setTrayEntryEnabledSafe,
+  SDL3.Sys.Tray.getTrayEntryEnabled,
+  SDL3.Sys.Tray.getTrayEntryEnabledSafe,
+  SDL3.Sys.Tray.setTrayEntryCallback,
+  SDL3.Sys.Tray.setTrayEntryCallbackSafe,
+  SDL3.Sys.Tray.clickTrayEntry,
+  SDL3.Sys.Tray.clickTrayEntrySafe,
+  SDL3.Sys.Tray.destroyTray,
+  SDL3.Sys.Tray.destroyTraySafe,
+  SDL3.Sys.Tray.getTrayEntryParent,
+  SDL3.Sys.Tray.getTrayEntryParentSafe,
+  SDL3.Sys.Tray.getTrayMenuParentEntry,
+  SDL3.Sys.Tray.getTrayMenuParentEntrySafe,
+  SDL3.Sys.Tray.getTrayMenuParentTray,
+  SDL3.Sys.Tray.getTrayMenuParentTraySafe,
+  SDL3.Sys.Tray.updateTrays,
+  SDL3.Sys.Tray.updateTraysSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Tray
+import SDL3.Sys.Bindgen.Tray.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Tray.Unsafe qualified as Unsafe
+
+-- | Create an icon to be placed in the operating system\'s tray, or equivalent.
+--
+--     Many platforms advise not using a system tray unless persistence is a necessary feature. Avoid needlessly creating a tray icon, as the user may feel like it clutters their interface.
+--
+--     Using tray icons require the video subsystem.
+--
+--     [Returns]: The newly created system tray icon.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTrayMenu', 'getTrayMenu', 'destroyTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateTray@.
+--                   The safe flavor is 'createTraySafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateTray@, defined at @SDL3\/SDL_tray.h 121:40@
+createTray
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: a surface to be used as icon. May be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tooltip@]: a tooltip to be displayed when the mouse hovers the icon in UTF-8 encoding. Not supported on all platforms. May be NULL.
+  -> IO (BG.Ptr SDL_Tray)
+createTray = Unsafe.sDL_CreateTray
+
+-- | Create an icon to be placed in the operating system\'s tray, or equivalent.
+--
+--     Many platforms advise not using a system tray unless persistence is a necessary feature. Avoid needlessly creating a tray icon, as the user may feel like it clutters their interface.
+--
+--     Using tray icons require the video subsystem.
+--
+--     [Returns]: The newly created system tray icon.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTrayMenu', 'getTrayMenu', 'destroyTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateTray@.
+--                   The unsafe flavor is 'createTray'
+--                   .
+--
+--     [C declaration]: @SDL_CreateTray@, defined at @SDL3\/SDL_tray.h 121:40@
+createTraySafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: a surface to be used as icon. May be NULL.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tooltip@]: a tooltip to be displayed when the mouse hovers the icon in UTF-8 encoding. Not supported on all platforms. May be NULL.
+  -> IO (BG.Ptr SDL_Tray)
+createTraySafe = Safe.sDL_CreateTray
+
+-- | Updates the system tray icon\'s icon.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTrayIcon@.
+--                   The safe flavor is 'setTrayIconSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetTrayIcon@, defined at @SDL3\/SDL_tray.h 136:34@
+setTrayIcon
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be updated.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: the new icon. May be NULL.
+  -> IO ()
+setTrayIcon = Unsafe.sDL_SetTrayIcon
+
+-- | Updates the system tray icon\'s icon.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTrayIcon@.
+--                   The unsafe flavor is 'setTrayIcon'
+--                   .
+--
+--     [C declaration]: @SDL_SetTrayIcon@, defined at @SDL3\/SDL_tray.h 136:34@
+setTrayIconSafe
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be updated.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: the new icon. May be NULL.
+  -> IO ()
+setTrayIconSafe = Safe.sDL_SetTrayIcon
+
+-- | Updates the system tray icon\'s tooltip.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTrayTooltip@.
+--                   The safe flavor is 'setTrayTooltipSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetTrayTooltip@, defined at @SDL3\/SDL_tray.h 151:34@
+setTrayTooltip
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be updated.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tooltip@]: the new tooltip in UTF-8 encoding. May be NULL.
+  -> IO ()
+setTrayTooltip = Unsafe.sDL_SetTrayTooltip
+
+-- | Updates the system tray icon\'s tooltip.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTrayTooltip@.
+--                   The unsafe flavor is 'setTrayTooltip'
+--                   .
+--
+--     [C declaration]: @SDL_SetTrayTooltip@, defined at @SDL3\/SDL_tray.h 151:34@
+setTrayTooltipSafe
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be updated.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@tooltip@]: the new tooltip in UTF-8 encoding. May be NULL.
+  -> IO ()
+setTrayTooltipSafe = Safe.sDL_SetTrayTooltip
+
+-- | Create a menu for a system tray.
+--
+--     This should be called at most once per tray icon.
+--
+--     This function does the same thing as @'createTraySubmenu'@, except that it takes a 'SDL_Tray' instead of a 'SDL_TrayEntry'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTray', 'getTrayMenu', 'getTrayMenuParentTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateTrayMenu@.
+--                   The safe flavor is 'createTrayMenuSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateTrayMenu@, defined at @SDL3\/SDL_tray.h 175:44@
+createTrayMenu
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+createTrayMenu = Unsafe.sDL_CreateTrayMenu
+
+-- | Create a menu for a system tray.
+--
+--     This should be called at most once per tray icon.
+--
+--     This function does the same thing as @'createTraySubmenu'@, except that it takes a 'SDL_Tray' instead of a 'SDL_TrayEntry'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTray', 'getTrayMenu', 'getTrayMenuParentTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateTrayMenu@.
+--                   The unsafe flavor is 'createTrayMenu'
+--                   .
+--
+--     [C declaration]: @SDL_CreateTrayMenu@, defined at @SDL3\/SDL_tray.h 175:44@
+createTrayMenuSafe
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+createTrayMenuSafe = Safe.sDL_CreateTrayMenu
+
+-- | Create a submenu for a system tray entry.
+--
+--     This should be called at most once per tray entry.
+--
+--     This function does the same thing as 'createTrayMenu', except that it takes a 'SDL_TrayEntry' instead of a 'SDL_Tray'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'insertTrayEntryAt', 'getTraySubmenu', 'getTrayMenuParentEntry'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateTraySubmenu@.
+--                   The safe flavor is 'createTraySubmenuSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateTraySubmenu@, defined at @SDL3\/SDL_tray.h 199:44@
+createTraySubmenu
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+createTraySubmenu = Unsafe.sDL_CreateTraySubmenu
+
+-- | Create a submenu for a system tray entry.
+--
+--     This should be called at most once per tray entry.
+--
+--     This function does the same thing as 'createTrayMenu', except that it takes a 'SDL_TrayEntry' instead of a 'SDL_Tray'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'insertTrayEntryAt', 'getTraySubmenu', 'getTrayMenuParentEntry'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateTraySubmenu@.
+--                   The unsafe flavor is 'createTraySubmenu'
+--                   .
+--
+--     [C declaration]: @SDL_CreateTraySubmenu@, defined at @SDL3\/SDL_tray.h 199:44@
+createTraySubmenuSafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+createTraySubmenuSafe = Safe.sDL_CreateTraySubmenu
+
+-- | Gets a previously created tray menu.
+--
+--     You should have called @'createTrayMenu'@ on the tray object. This function allows you to fetch it again later.
+--
+--     This function does the same thing as @'getTraySubmenu'@, except that it takes a 'SDL_Tray' instead of a 'SDL_TrayEntry'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTray', 'createTrayMenu'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTrayMenu@.
+--                   The safe flavor is 'getTrayMenuSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayMenu@, defined at @SDL3\/SDL_tray.h 223:44@
+getTrayMenu
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+getTrayMenu = Unsafe.sDL_GetTrayMenu
+
+-- | Gets a previously created tray menu.
+--
+--     You should have called @'createTrayMenu'@ on the tray object. This function allows you to fetch it again later.
+--
+--     This function does the same thing as @'getTraySubmenu'@, except that it takes a 'SDL_Tray' instead of a 'SDL_TrayEntry'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTray', 'createTrayMenu'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTrayMenu@.
+--                   The unsafe flavor is 'getTrayMenu'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayMenu@, defined at @SDL3\/SDL_tray.h 223:44@
+getTrayMenuSafe
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+getTrayMenuSafe = Safe.sDL_GetTrayMenu
+
+-- | Gets a previously created tray entry submenu.
+--
+--     You should have called @'createTraySubmenu'@ on the entry object. This function allows you to fetch it again later.
+--
+--     This function does the same thing as @'getTrayMenu'@, except that it takes a 'SDL_TrayEntry' instead of a 'SDL_Tray'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'insertTrayEntryAt', 'createTraySubmenu'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTraySubmenu@.
+--                   The safe flavor is 'getTraySubmenuSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTraySubmenu@, defined at @SDL3\/SDL_tray.h 247:44@
+getTraySubmenu
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+getTraySubmenu = Unsafe.sDL_GetTraySubmenu
+
+-- | Gets a previously created tray entry submenu.
+--
+--     You should have called @'createTraySubmenu'@ on the entry object. This function allows you to fetch it again later.
+--
+--     This function does the same thing as @'getTrayMenu'@, except that it takes a 'SDL_TrayEntry' instead of a 'SDL_Tray'.
+--
+--     A menu does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'insertTrayEntryAt', 'createTraySubmenu'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTraySubmenu@.
+--                   The unsafe flavor is 'getTraySubmenu'
+--                   .
+--
+--     [C declaration]: @SDL_GetTraySubmenu@, defined at @SDL3\/SDL_tray.h 247:44@
+getTraySubmenuSafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the tray entry to bind the menu to.
+  -> IO (BG.Ptr SDL_TrayMenu)
+getTraySubmenuSafe = Safe.sDL_GetTraySubmenu
+
+-- | Returns a list of entries in the menu, in order.
+--
+--     [Returns]: a NULL-terminated list of entries within the given menu. The pointer becomes invalid when any function that inserts or deletes entries in the menu is called.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'removeTrayEntry', 'insertTrayEntryAt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTrayEntries@.
+--                   The safe flavor is 'getTrayEntriesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayEntries@, defined at @SDL3\/SDL_tray.h 267:52@
+getTrayEntries
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: The menu to get entries from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: An optional pointer to obtain the number of entries in the menu.
+  -> IO (BG.Ptr (PtrConst.PtrConst SDL_TrayEntry))
+getTrayEntries = Unsafe.sDL_GetTrayEntries
+
+-- | Returns a list of entries in the menu, in order.
+--
+--     [Returns]: a NULL-terminated list of entries within the given menu. The pointer becomes invalid when any function that inserts or deletes entries in the menu is called.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'removeTrayEntry', 'insertTrayEntryAt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTrayEntries@.
+--                   The unsafe flavor is 'getTrayEntries'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayEntries@, defined at @SDL3\/SDL_tray.h 267:52@
+getTrayEntriesSafe
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: The menu to get entries from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: An optional pointer to obtain the number of entries in the menu.
+  -> IO (BG.Ptr (PtrConst.PtrConst SDL_TrayEntry))
+getTrayEntriesSafe = Safe.sDL_GetTrayEntries
+
+-- | Removes a tray entry.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RemoveTrayEntry@.
+--                   The safe flavor is 'removeTrayEntrySafe'
+--                   .
+--
+--     [C declaration]: @SDL_RemoveTrayEntry@, defined at @SDL3\/SDL_tray.h 282:34@
+removeTrayEntry
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: The entry to be deleted.
+  -> IO ()
+removeTrayEntry = Unsafe.sDL_RemoveTrayEntry
+
+-- | Removes a tray entry.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RemoveTrayEntry@.
+--                   The unsafe flavor is 'removeTrayEntry'
+--                   .
+--
+--     [C declaration]: @SDL_RemoveTrayEntry@, defined at @SDL3\/SDL_tray.h 282:34@
+removeTrayEntrySafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: The entry to be deleted.
+  -> IO ()
+removeTrayEntrySafe = Safe.sDL_RemoveTrayEntry
+
+-- | Insert a tray entry at a given position.
+--
+--     If label is NULL, the entry will be a separator. Many functions won\'t work for an entry that is a separator.
+--
+--     An entry does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created entry, or NULL if pos is out of bounds.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_TrayEntryFlags', 'getTrayEntries', 'removeTrayEntry', 'getTrayEntryParent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_InsertTrayEntryAt@.
+--                   The safe flavor is 'insertTrayEntryAtSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_InsertTrayEntryAt@, defined at @SDL3\/SDL_tray.h 310:45@
+insertTrayEntryAt
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu to append the entry to.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@pos@]: the desired position for the new entry. Entries at or following this place will be moved. If pos is -1, the entry is appended.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@label@]: the text to be displayed on the entry, in UTF-8 encoding, or NULL for a separator.
+  -> SDL_TrayEntryFlags
+  -- ^
+  --
+  --           [@flags@]: a combination of flags, some of which are mandatory.
+  -> IO (BG.Ptr SDL_TrayEntry)
+insertTrayEntryAt =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_InsertTrayEntryAt x00 (Coerce.coerce x11) x22 x33
+
+-- | Insert a tray entry at a given position.
+--
+--     If label is NULL, the entry will be a separator. Many functions won\'t work for an entry that is a separator.
+--
+--     An entry does not need to be destroyed; it will be destroyed with the tray.
+--
+--     [Returns]: the newly created entry, or NULL if pos is out of bounds.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL_TrayEntryFlags', 'getTrayEntries', 'removeTrayEntry', 'getTrayEntryParent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_InsertTrayEntryAt@.
+--                   The unsafe flavor is 'insertTrayEntryAt'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_InsertTrayEntryAt@, defined at @SDL3\/SDL_tray.h 310:45@
+insertTrayEntryAtSafe
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu to append the entry to.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@pos@]: the desired position for the new entry. Entries at or following this place will be moved. If pos is -1, the entry is appended.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@label@]: the text to be displayed on the entry, in UTF-8 encoding, or NULL for a separator.
+  -> SDL_TrayEntryFlags
+  -- ^
+  --
+  --           [@flags@]: a combination of flags, some of which are mandatory.
+  -> IO (BG.Ptr SDL_TrayEntry)
+insertTrayEntryAtSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_InsertTrayEntryAt x00 (Coerce.coerce x11) x22 x33
+
+-- | Sets the label of an entry.
+--
+--     An entry cannot change between a separator and an ordinary entry; that is, it is not possible to set a non-NULL label on an entry that has a NULL label (separators), or to set a NULL label to an entry that has a non-NULL label. The function will silently fail if that happens.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'getTrayEntryLabel'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTrayEntryLabel@.
+--                   The safe flavor is 'setTrayEntryLabelSafe'
+--                   .
+--
+--     [C declaration]: @SDL_SetTrayEntryLabel@, defined at @SDL3\/SDL_tray.h 332:34@
+setTrayEntryLabel
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@label@]: the new label for the entry in UTF-8 encoding.
+  -> IO ()
+setTrayEntryLabel = Unsafe.sDL_SetTrayEntryLabel
+
+-- | Sets the label of an entry.
+--
+--     An entry cannot change between a separator and an ordinary entry; that is, it is not possible to set a non-NULL label on an entry that has a NULL label (separators), or to set a NULL label to an entry that has a non-NULL label. The function will silently fail if that happens.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'getTrayEntryLabel'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTrayEntryLabel@.
+--                   The unsafe flavor is 'setTrayEntryLabel'
+--                   .
+--
+--     [C declaration]: @SDL_SetTrayEntryLabel@, defined at @SDL3\/SDL_tray.h 332:34@
+setTrayEntryLabelSafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@label@]: the new label for the entry in UTF-8 encoding.
+  -> IO ()
+setTrayEntryLabelSafe = Safe.sDL_SetTrayEntryLabel
+
+-- | Gets the label of an entry.
+--
+--     If the returned value is NULL, the entry is a separator.
+--
+--     [Returns]: the label of the entry in UTF-8 encoding.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'setTrayEntryLabel'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTrayEntryLabel@.
+--                   The safe flavor is 'getTrayEntryLabelSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayEntryLabel@, defined at @SDL3\/SDL_tray.h 351:42@
+getTrayEntryLabel
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getTrayEntryLabel = Unsafe.sDL_GetTrayEntryLabel
+
+-- | Gets the label of an entry.
+--
+--     If the returned value is NULL, the entry is a separator.
+--
+--     [Returns]: the label of the entry in UTF-8 encoding.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'setTrayEntryLabel'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTrayEntryLabel@.
+--                   The unsafe flavor is 'getTrayEntryLabel'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayEntryLabel@, defined at @SDL3\/SDL_tray.h 351:42@
+getTrayEntryLabelSafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getTrayEntryLabelSafe = Safe.sDL_GetTrayEntryLabel
+
+-- | Sets whether or not an entry is checked.
+--
+--     The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'getTrayEntryChecked'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTrayEntryChecked@.
+--                   The safe flavor is 'setTrayEntryCheckedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTrayEntryChecked@, defined at @SDL3\/SDL_tray.h 370:34@
+setTrayEntryChecked
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> Bool
+  -- ^
+  --
+  --           [@checked@]: true if the entry should be checked; false otherwise.
+  -> IO ()
+setTrayEntryChecked =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_SetTrayEntryChecked x00 (CBool.fromBool x11)
+
+-- | Sets whether or not an entry is checked.
+--
+--     The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'getTrayEntryChecked'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTrayEntryChecked@.
+--                   The unsafe flavor is 'setTrayEntryChecked'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTrayEntryChecked@, defined at @SDL3\/SDL_tray.h 370:34@
+setTrayEntryCheckedSafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> Bool
+  -- ^
+  --
+  --           [@checked@]: true if the entry should be checked; false otherwise.
+  -> IO ()
+setTrayEntryCheckedSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_SetTrayEntryChecked x00 (CBool.fromBool x11)
+
+-- | Gets whether or not an entry is checked.
+--
+--     The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag.
+--
+--     [Returns]: true if the entry is checked; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'setTrayEntryChecked'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTrayEntryChecked@.
+--                   The safe flavor is 'getTrayEntryCheckedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTrayEntryChecked@, defined at @SDL3\/SDL_tray.h 389:34@
+getTrayEntryChecked
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO Bool
+getTrayEntryChecked =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GetTrayEntryChecked x00)
+
+-- | Gets whether or not an entry is checked.
+--
+--     The entry must have been created with the SDL_TRAYENTRY_CHECKBOX flag.
+--
+--     [Returns]: true if the entry is checked; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'setTrayEntryChecked'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTrayEntryChecked@.
+--                   The unsafe flavor is 'getTrayEntryChecked'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTrayEntryChecked@, defined at @SDL3\/SDL_tray.h 389:34@
+getTrayEntryCheckedSafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO Bool
+getTrayEntryCheckedSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GetTrayEntryChecked x00)
+
+-- | Sets whether or not an entry is enabled.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'getTrayEntryEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTrayEntryEnabled@.
+--                   The safe flavor is 'setTrayEntryEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTrayEntryEnabled@, defined at @SDL3\/SDL_tray.h 406:34@
+setTrayEntryEnabled
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: true if the entry should be enabled; false otherwise.
+  -> IO ()
+setTrayEntryEnabled =
+  \x00 ->
+    \x11 ->
+      Unsafe.sDL_SetTrayEntryEnabled x00 (CBool.fromBool x11)
+
+-- | Sets whether or not an entry is enabled.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'getTrayEntryEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTrayEntryEnabled@.
+--                   The unsafe flavor is 'setTrayEntryEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetTrayEntryEnabled@, defined at @SDL3\/SDL_tray.h 406:34@
+setTrayEntryEnabledSafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> Bool
+  -- ^
+  --
+  --           [@enabled@]: true if the entry should be enabled; false otherwise.
+  -> IO ()
+setTrayEntryEnabledSafe =
+  \x00 ->
+    \x11 ->
+      Safe.sDL_SetTrayEntryEnabled x00 (CBool.fromBool x11)
+
+-- | Gets whether or not an entry is enabled.
+--
+--     [Returns]: true if the entry is enabled; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'setTrayEntryEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTrayEntryEnabled@.
+--                   The safe flavor is 'getTrayEntryEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTrayEntryEnabled@, defined at @SDL3\/SDL_tray.h 423:34@
+getTrayEntryEnabled
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO Bool
+getTrayEntryEnabled =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GetTrayEntryEnabled x00)
+
+-- | Gets whether or not an entry is enabled.
+--
+--     [Returns]: true if the entry is enabled; false otherwise.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt', 'setTrayEntryEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTrayEntryEnabled@.
+--                   The unsafe flavor is 'getTrayEntryEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetTrayEntryEnabled@, defined at @SDL3\/SDL_tray.h 423:34@
+getTrayEntryEnabledSafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be read.
+  -> IO Bool
+getTrayEntryEnabledSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GetTrayEntryEnabled x00)
+
+-- | Sets a callback to be invoked when the entry is selected.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetTrayEntryCallback@.
+--                   The safe flavor is 'setTrayEntryCallbackSafe'
+--                   : registration; fires from the event loop.
+--
+--     [C declaration]: @SDL_SetTrayEntryCallback@, defined at @SDL3\/SDL_tray.h 441:34@
+setTrayEntryCallback
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> SDL_TrayCallback
+  -- ^
+  --
+  --           [@callback@]: a callback to be invoked when the entry is selected.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> IO ()
+setTrayEntryCallback =
+  Unsafe.sDL_SetTrayEntryCallback
+
+-- | Sets a callback to be invoked when the entry is selected.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getTrayEntries', 'insertTrayEntryAt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetTrayEntryCallback@.
+--                   The unsafe flavor is 'setTrayEntryCallback'
+--                   : registration; fires from the event loop.
+--
+--     [C declaration]: @SDL_SetTrayEntryCallback@, defined at @SDL3\/SDL_tray.h 441:34@
+setTrayEntryCallbackSafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry to be updated.
+  -> SDL_TrayCallback
+  -- ^
+  --
+  --           [@callback@]: a callback to be invoked when the entry is selected.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: an optional pointer to pass extra data to the callback when it will be invoked.
+  -> IO ()
+setTrayEntryCallbackSafe =
+  Safe.sDL_SetTrayEntryCallback
+
+-- | Simulate a click on a tray entry.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ClickTrayEntry@.
+--                   The safe flavor is 'clickTrayEntrySafe'
+--                   .
+--
+--     [C declaration]: @SDL_ClickTrayEntry@, defined at @SDL3\/SDL_tray.h 453:34@
+clickTrayEntry
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: The entry to activate.
+  -> IO ()
+clickTrayEntry = Unsafe.sDL_ClickTrayEntry
+
+-- | Simulate a click on a tray entry.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ClickTrayEntry@.
+--                   The unsafe flavor is 'clickTrayEntry'
+--                   .
+--
+--     [C declaration]: @SDL_ClickTrayEntry@, defined at @SDL3\/SDL_tray.h 453:34@
+clickTrayEntrySafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: The entry to activate.
+  -> IO ()
+clickTrayEntrySafe = Safe.sDL_ClickTrayEntry
+
+-- | Destroys a tray object.
+--
+--     This also destroys all associated menus and entries.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyTray@.
+--                   The safe flavor is 'destroyTraySafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyTray@, defined at @SDL3\/SDL_tray.h 469:34@
+destroyTray
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be destroyed.
+  -> IO ()
+destroyTray = Unsafe.sDL_DestroyTray
+
+-- | Destroys a tray object.
+--
+--     This also destroys all associated menus and entries.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyTray@.
+--                   The unsafe flavor is 'destroyTray'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyTray@, defined at @SDL3\/SDL_tray.h 469:34@
+destroyTraySafe
+  :: BG.Ptr SDL_Tray
+  -- ^
+  --
+  --           [@tray@]: the tray icon to be destroyed.
+  -> IO ()
+destroyTraySafe = Safe.sDL_DestroyTray
+
+-- | Gets the menu containing a certain tray entry.
+--
+--     [Returns]: the parent menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'insertTrayEntryAt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTrayEntryParent@.
+--                   The safe flavor is 'getTrayEntryParentSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayEntryParent@, defined at @SDL3\/SDL_tray.h 484:44@
+getTrayEntryParent
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry for which to get the parent menu.
+  -> IO (BG.Ptr SDL_TrayMenu)
+getTrayEntryParent = Unsafe.sDL_GetTrayEntryParent
+
+-- | Gets the menu containing a certain tray entry.
+--
+--     [Returns]: the parent menu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'insertTrayEntryAt'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTrayEntryParent@.
+--                   The unsafe flavor is 'getTrayEntryParent'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayEntryParent@, defined at @SDL3\/SDL_tray.h 484:44@
+getTrayEntryParentSafe
+  :: BG.Ptr SDL_TrayEntry
+  -- ^
+  --
+  --           [@entry@]: the entry for which to get the parent menu.
+  -> IO (BG.Ptr SDL_TrayMenu)
+getTrayEntryParentSafe = Safe.sDL_GetTrayEntryParent
+
+-- | Gets the entry for which the menu is a submenu, if the current menu is a submenu.
+--
+--     Either this function or @'getTrayMenuParentTray'@ will return non-NULL for any given menu.
+--
+--     [Returns]: the parent entry, or NULL if this menu is not a submenu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTraySubmenu', 'getTrayMenuParentTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTrayMenuParentEntry@.
+--                   The safe flavor is 'getTrayMenuParentEntrySafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayMenuParentEntry@, defined at @SDL3\/SDL_tray.h 504:45@
+getTrayMenuParentEntry
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu for which to get the parent entry.
+  -> IO (BG.Ptr SDL_TrayEntry)
+getTrayMenuParentEntry =
+  Unsafe.sDL_GetTrayMenuParentEntry
+
+-- | Gets the entry for which the menu is a submenu, if the current menu is a submenu.
+--
+--     Either this function or @'getTrayMenuParentTray'@ will return non-NULL for any given menu.
+--
+--     [Returns]: the parent entry, or NULL if this menu is not a submenu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTraySubmenu', 'getTrayMenuParentTray'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTrayMenuParentEntry@.
+--                   The unsafe flavor is 'getTrayMenuParentEntry'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayMenuParentEntry@, defined at @SDL3\/SDL_tray.h 504:45@
+getTrayMenuParentEntrySafe
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu for which to get the parent entry.
+  -> IO (BG.Ptr SDL_TrayEntry)
+getTrayMenuParentEntrySafe =
+  Safe.sDL_GetTrayMenuParentEntry
+
+-- | Gets the tray for which this menu is the first-level menu, if the current menu isn\'t a submenu.
+--
+--     Either this function or @'getTrayMenuParentEntry'@ will return non-NULL for any given menu.
+--
+--     [Returns]: the parent tray, or NULL if this menu is a submenu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTrayMenu', 'getTrayMenuParentEntry'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetTrayMenuParentTray@.
+--                   The safe flavor is 'getTrayMenuParentTraySafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayMenuParentTray@, defined at @SDL3\/SDL_tray.h 524:40@
+getTrayMenuParentTray
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu for which to get the parent enttrayry.
+  -> IO (BG.Ptr SDL_Tray)
+getTrayMenuParentTray =
+  Unsafe.sDL_GetTrayMenuParentTray
+
+-- | Gets the tray for which this menu is the first-level menu, if the current menu isn\'t a submenu.
+--
+--     Either this function or @'getTrayMenuParentEntry'@ will return non-NULL for any given menu.
+--
+--     [Returns]: the parent tray, or NULL if this menu is a submenu.
+--
+--     [Thread safety]: This function should be called on the thread that created the tray.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createTrayMenu', 'getTrayMenuParentEntry'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetTrayMenuParentTray@.
+--                   The unsafe flavor is 'getTrayMenuParentTray'
+--                   .
+--
+--     [C declaration]: @SDL_GetTrayMenuParentTray@, defined at @SDL3\/SDL_tray.h 524:40@
+getTrayMenuParentTraySafe
+  :: BG.Ptr SDL_TrayMenu
+  -- ^
+  --
+  --           [@menu@]: the menu for which to get the parent enttrayry.
+  -> IO (BG.Ptr SDL_Tray)
+getTrayMenuParentTraySafe =
+  Safe.sDL_GetTrayMenuParentTray
+
+-- | Update the trays.
+--
+--     This is called automatically by the event loop and is only needed if you\'re using trays but aren\'t handling SDL events.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UpdateTrays@.
+--                   The safe flavor is 'updateTraysSafe'
+--                   .
+--
+--     [C declaration]: @SDL_UpdateTrays@, defined at @SDL3\/SDL_tray.h 536:34@
+updateTrays :: IO ()
+updateTrays = Unsafe.sDL_UpdateTrays
+
+-- | Update the trays.
+--
+--     This is called automatically by the event loop and is only needed if you\'re using trays but aren\'t handling SDL events.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UpdateTrays@.
+--                   The unsafe flavor is 'updateTrays'
+--                   .
+--
+--     [C declaration]: @SDL_UpdateTrays@, defined at @SDL3\/SDL_tray.h 536:34@
+updateTraysSafe :: IO ()
+updateTraysSafe = Safe.sDL_UpdateTrays
+
+-- | Typed constant for macro @SDL_TRAYENTRY_BUTTON@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_TRAYENTRY_BUTTON :: SDL_TrayEntryFlags
+pattern SDL_TRAYENTRY_BUTTON = SDL_TrayEntryFlags 0x00000001
+
+-- | Typed constant for macro @SDL_TRAYENTRY_CHECKBOX@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_TRAYENTRY_CHECKBOX :: SDL_TrayEntryFlags
+pattern SDL_TRAYENTRY_CHECKBOX = SDL_TrayEntryFlags 0x00000002
+
+-- | Typed constant for macro @SDL_TRAYENTRY_SUBMENU@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_TRAYENTRY_SUBMENU :: SDL_TrayEntryFlags
+pattern SDL_TRAYENTRY_SUBMENU = SDL_TrayEntryFlags 0x00000004
+
+-- | Typed constant for macro @SDL_TRAYENTRY_DISABLED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_TRAYENTRY_DISABLED :: SDL_TrayEntryFlags
+pattern SDL_TRAYENTRY_DISABLED = SDL_TrayEntryFlags 0x80000000
+
+-- | Typed constant for macro @SDL_TRAYENTRY_CHECKED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_TRAYENTRY_CHECKED :: SDL_TrayEntryFlags
+pattern SDL_TRAYENTRY_CHECKED = SDL_TrayEntryFlags 0x40000000
diff --git a/src/SDL3/Sys/Version.hs b/src/SDL3/Sys/Version.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Version.hs
@@ -0,0 +1,82 @@
+-- | Functionality to query the current SDL version, both as headers the app was compiled against, and a library the app is linked to. The current major version of SDL headers.
+--
+--     If this were SDL version 3.2.1, this value would be 3.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Version.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Version (
+  module SDL3.Sys.Bindgen.Version,
+
+  -- * Function aliases
+  SDL3.Sys.Version.getVersion,
+  SDL3.Sys.Version.getRevision,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Version
+import SDL3.Sys.Bindgen.Version.Unsafe qualified as Unsafe
+
+-- | Get the version of SDL that is linked against your program.
+--
+--     If you are linking to SDL dynamically, then it is possible that the current version will be different than the version you compiled against. This function returns the current version, while SDL_VERSION is the version you compiled with.
+--
+--     This function may be called safely at any time, even before 'SDL3.Sys.Init.init'.
+--
+--     [Returns]: the version of the linked library.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getRevision'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetVersion@.
+--                   The safe import is not exported
+--                   : returns a compiled-in constant; cannot block, lock, or call back.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetVersion@, defined at @SDL3\/SDL_version.h 160:33@
+getVersion :: IO BG.Int32
+getVersion = fmap Coerce.coerce Unsafe.sDL_GetVersion
+
+-- | Get the code revision of the SDL library that is linked against your program.
+--
+--     This value is the revision of the code you are linking against and may be different from the code you are compiling with, which is found in the constant SDL_REVISION if you explicitly include SDL_revision.h
+--
+--     The revision is an arbitrary string (a hash value) uniquely identifying the exact revision of the SDL library in use, and is only useful in comparing against other revisions. It is NOT an incrementing number.
+--
+--     If SDL wasn\'t built from a git repository with the appropriate tools, this will return an empty string.
+--
+--     You shouldn\'t use this function for anything but logging it for debugging purposes. The string is not intended to be reliable in any way.
+--
+--     [Returns]: an arbitrary string, uniquely identifying the exact revision of the SDL library in use.
+--
+--     [Thread safety]: It is safe to call this function from any thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getVersion'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetRevision@.
+--                   The safe import is not exported
+--                   : returns a compiled-in constant; cannot block, lock, or call back.
+--
+--     [C declaration]: @SDL_GetRevision@, defined at @SDL3\/SDL_version.h 189:42@
+getRevision :: IO (PtrConst.PtrConst BG.CChar)
+getRevision = Unsafe.sDL_GetRevision
diff --git a/src/SDL3/Sys/Video.hs b/src/SDL3/Sys/Video.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Video.hs
@@ -0,0 +1,8638 @@
+{-# LANGUAGE PatternSynonyms #-}
+
+-- | SDL\'s video subsystem is largely interested in abstracting window management from the underlying operating system. You can create windows, manage them in various ways, set them fullscreen, and get events when interesting things happen with them, such as the mouse or keyboard interacting with a window.
+--
+--     The video subsystem is also interested in abstracting away some platform-specific differences in OpenGL: context creation, swapping buffers, etc. This may be crucial to your app, but also you are not required to use OpenGL at all. In fact, SDL can provide rendering to those windows as well, either with an easy-to-use [2D API](https://wiki.libsdl.org/SDL3/CategoryRender) or with a more-powerful [GPU API](https://wiki.libsdl.org/SDL3/CategoryGPU). Of course, it can simply get out of your way and give you the window handles you need to use Vulkan, Direct3D, Metal, or whatever else you like directly, too.
+--
+--     The video subsystem covers a lot of functionality, out of necessity, so it is worth perusing the list of functions just to see what\'s available, but most apps can get by with simply creating a window and listening for events, so start with @'createWindow'@ and 'SDL3.Sys.Events.pollEvent'. This is a unique ID for a display for the time it is connected to the system, and is never reused for the lifetime of the application.
+--
+--     If the display is disconnected and reconnected, it will get a new ID.
+--
+--     The value 0 is an invalid ID.
+--
+--     @since 3.2.0
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Video.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Video (
+  module SDL3.Sys.Bindgen.Video,
+
+  -- * Typed constants
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_DEBUG_FLAG,
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG,
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG,
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_RESET_ISOLATION_FLAG,
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE,
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH,
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_RESET_NO_NOTIFICATION,
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_RESET_LOSE_CONTEXT,
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_PROFILE_CORE,
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_PROFILE_COMPATIBILITY,
+  pattern SDL3.Sys.Video.SDL_GL_CONTEXT_PROFILE_ES,
+  pattern SDL3.Sys.Video.SDL_WINDOW_FULLSCREEN,
+  pattern SDL3.Sys.Video.SDL_WINDOW_OPENGL,
+  pattern SDL3.Sys.Video.SDL_WINDOW_OCCLUDED,
+  pattern SDL3.Sys.Video.SDL_WINDOW_HIDDEN,
+  pattern SDL3.Sys.Video.SDL_WINDOW_BORDERLESS,
+  pattern SDL3.Sys.Video.SDL_WINDOW_RESIZABLE,
+  pattern SDL3.Sys.Video.SDL_WINDOW_MINIMIZED,
+  pattern SDL3.Sys.Video.SDL_WINDOW_MAXIMIZED,
+  pattern SDL3.Sys.Video.SDL_WINDOW_MOUSE_GRABBED,
+  pattern SDL3.Sys.Video.SDL_WINDOW_INPUT_FOCUS,
+  pattern SDL3.Sys.Video.SDL_WINDOW_MOUSE_FOCUS,
+  pattern SDL3.Sys.Video.SDL_WINDOW_EXTERNAL,
+  pattern SDL3.Sys.Video.SDL_WINDOW_MODAL,
+  pattern SDL3.Sys.Video.SDL_WINDOW_HIGH_PIXEL_DENSITY,
+  pattern SDL3.Sys.Video.SDL_WINDOW_MOUSE_CAPTURE,
+  pattern SDL3.Sys.Video.SDL_WINDOW_MOUSE_RELATIVE_MODE,
+  pattern SDL3.Sys.Video.SDL_WINDOW_ALWAYS_ON_TOP,
+  pattern SDL3.Sys.Video.SDL_WINDOW_UTILITY,
+  pattern SDL3.Sys.Video.SDL_WINDOW_TOOLTIP,
+  pattern SDL3.Sys.Video.SDL_WINDOW_POPUP_MENU,
+  pattern SDL3.Sys.Video.SDL_WINDOW_KEYBOARD_GRABBED,
+  pattern SDL3.Sys.Video.SDL_WINDOW_FILL_DOCUMENT,
+  pattern SDL3.Sys.Video.SDL_WINDOW_VULKAN,
+  pattern SDL3.Sys.Video.SDL_WINDOW_METAL,
+  pattern SDL3.Sys.Video.SDL_WINDOW_TRANSPARENT,
+  pattern SDL3.Sys.Video.SDL_WINDOW_NOT_FOCUSABLE,
+
+  -- * Function aliases
+  SDL3.Sys.Video.getNumVideoDrivers,
+  SDL3.Sys.Video.getNumVideoDriversSafe,
+  SDL3.Sys.Video.getVideoDriver,
+  SDL3.Sys.Video.getVideoDriverSafe,
+  SDL3.Sys.Video.getCurrentVideoDriver,
+  SDL3.Sys.Video.getCurrentVideoDriverSafe,
+  SDL3.Sys.Video.getSystemTheme,
+  SDL3.Sys.Video.getSystemThemeSafe,
+  SDL3.Sys.Video.getDisplays,
+  SDL3.Sys.Video.getDisplaysSafe,
+  SDL3.Sys.Video.getPrimaryDisplay,
+  SDL3.Sys.Video.getPrimaryDisplaySafe,
+  SDL3.Sys.Video.getDisplayProperties,
+  SDL3.Sys.Video.getDisplayPropertiesSafe,
+  SDL3.Sys.Video.getDisplayName,
+  SDL3.Sys.Video.getDisplayNameSafe,
+  SDL3.Sys.Video.getDisplayBounds,
+  SDL3.Sys.Video.getDisplayBoundsSafe,
+  SDL3.Sys.Video.getDisplayUsableBounds,
+  SDL3.Sys.Video.getDisplayUsableBoundsSafe,
+  SDL3.Sys.Video.getNaturalDisplayOrientation,
+  SDL3.Sys.Video.getNaturalDisplayOrientationSafe,
+  SDL3.Sys.Video.getCurrentDisplayOrientation,
+  SDL3.Sys.Video.getCurrentDisplayOrientationSafe,
+  SDL3.Sys.Video.getDisplayContentScale,
+  SDL3.Sys.Video.getDisplayContentScaleSafe,
+  SDL3.Sys.Video.getFullscreenDisplayModes,
+  SDL3.Sys.Video.getFullscreenDisplayModesSafe,
+  SDL3.Sys.Video.getClosestFullscreenDisplayMode,
+  SDL3.Sys.Video.getClosestFullscreenDisplayModeSafe,
+  SDL3.Sys.Video.getDesktopDisplayMode,
+  SDL3.Sys.Video.getDesktopDisplayModeSafe,
+  SDL3.Sys.Video.getCurrentDisplayMode,
+  SDL3.Sys.Video.getCurrentDisplayModeSafe,
+  SDL3.Sys.Video.getDisplayForPoint,
+  SDL3.Sys.Video.getDisplayForPointSafe,
+  SDL3.Sys.Video.getDisplayForRect,
+  SDL3.Sys.Video.getDisplayForRectSafe,
+  SDL3.Sys.Video.getDisplayForWindow,
+  SDL3.Sys.Video.getDisplayForWindowSafe,
+  SDL3.Sys.Video.getWindowPixelDensity,
+  SDL3.Sys.Video.getWindowPixelDensitySafe,
+  SDL3.Sys.Video.getWindowDisplayScale,
+  SDL3.Sys.Video.getWindowDisplayScaleSafe,
+  SDL3.Sys.Video.setWindowFullscreenMode,
+  SDL3.Sys.Video.setWindowFullscreenModeSafe,
+  SDL3.Sys.Video.getWindowFullscreenMode,
+  SDL3.Sys.Video.getWindowFullscreenModeSafe,
+  SDL3.Sys.Video.getWindowICCProfile,
+  SDL3.Sys.Video.getWindowICCProfileSafe,
+  SDL3.Sys.Video.getWindowPixelFormat,
+  SDL3.Sys.Video.getWindowPixelFormatSafe,
+  SDL3.Sys.Video.getWindows,
+  SDL3.Sys.Video.getWindowsSafe,
+  SDL3.Sys.Video.createWindow,
+  SDL3.Sys.Video.createWindowSafe,
+  SDL3.Sys.Video.createPopupWindow,
+  SDL3.Sys.Video.createPopupWindowSafe,
+  SDL3.Sys.Video.createWindowWithProperties,
+  SDL3.Sys.Video.createWindowWithPropertiesSafe,
+  SDL3.Sys.Video.getWindowID,
+  SDL3.Sys.Video.getWindowIDSafe,
+  SDL3.Sys.Video.getWindowFromID,
+  SDL3.Sys.Video.getWindowFromIDSafe,
+  SDL3.Sys.Video.getWindowParent,
+  SDL3.Sys.Video.getWindowParentSafe,
+  SDL3.Sys.Video.getWindowProperties,
+  SDL3.Sys.Video.getWindowPropertiesSafe,
+  SDL3.Sys.Video.getWindowFlags,
+  SDL3.Sys.Video.getWindowFlagsSafe,
+  SDL3.Sys.Video.setWindowTitle,
+  SDL3.Sys.Video.setWindowTitleSafe,
+  SDL3.Sys.Video.getWindowTitle,
+  SDL3.Sys.Video.getWindowTitleSafe,
+  SDL3.Sys.Video.setWindowIcon,
+  SDL3.Sys.Video.setWindowIconSafe,
+  SDL3.Sys.Video.setWindowPosition,
+  SDL3.Sys.Video.setWindowPositionSafe,
+  SDL3.Sys.Video.getWindowPosition,
+  SDL3.Sys.Video.getWindowPositionSafe,
+  SDL3.Sys.Video.setWindowSize,
+  SDL3.Sys.Video.setWindowSizeSafe,
+  SDL3.Sys.Video.getWindowSize,
+  SDL3.Sys.Video.getWindowSizeSafe,
+  SDL3.Sys.Video.getWindowSafeArea,
+  SDL3.Sys.Video.getWindowSafeAreaSafe,
+  SDL3.Sys.Video.setWindowAspectRatio,
+  SDL3.Sys.Video.setWindowAspectRatioSafe,
+  SDL3.Sys.Video.getWindowAspectRatio,
+  SDL3.Sys.Video.getWindowAspectRatioSafe,
+  SDL3.Sys.Video.getWindowBordersSize,
+  SDL3.Sys.Video.getWindowBordersSizeSafe,
+  SDL3.Sys.Video.getWindowSizeInPixels,
+  SDL3.Sys.Video.getWindowSizeInPixelsSafe,
+  SDL3.Sys.Video.setWindowMinimumSize,
+  SDL3.Sys.Video.setWindowMinimumSizeSafe,
+  SDL3.Sys.Video.getWindowMinimumSize,
+  SDL3.Sys.Video.getWindowMinimumSizeSafe,
+  SDL3.Sys.Video.setWindowMaximumSize,
+  SDL3.Sys.Video.setWindowMaximumSizeSafe,
+  SDL3.Sys.Video.getWindowMaximumSize,
+  SDL3.Sys.Video.getWindowMaximumSizeSafe,
+  SDL3.Sys.Video.setWindowBordered,
+  SDL3.Sys.Video.setWindowBorderedSafe,
+  SDL3.Sys.Video.setWindowResizable,
+  SDL3.Sys.Video.setWindowResizableSafe,
+  SDL3.Sys.Video.setWindowAlwaysOnTop,
+  SDL3.Sys.Video.setWindowAlwaysOnTopSafe,
+  SDL3.Sys.Video.setWindowFillDocument,
+  SDL3.Sys.Video.setWindowFillDocumentSafe,
+  SDL3.Sys.Video.showWindow,
+  SDL3.Sys.Video.showWindowSafe,
+  SDL3.Sys.Video.hideWindow,
+  SDL3.Sys.Video.hideWindowSafe,
+  SDL3.Sys.Video.raiseWindow,
+  SDL3.Sys.Video.raiseWindowSafe,
+  SDL3.Sys.Video.maximizeWindow,
+  SDL3.Sys.Video.maximizeWindowSafe,
+  SDL3.Sys.Video.minimizeWindow,
+  SDL3.Sys.Video.minimizeWindowSafe,
+  SDL3.Sys.Video.restoreWindow,
+  SDL3.Sys.Video.restoreWindowSafe,
+  SDL3.Sys.Video.setWindowFullscreen,
+  SDL3.Sys.Video.setWindowFullscreenSafe,
+  SDL3.Sys.Video.syncWindow,
+  SDL3.Sys.Video.syncWindowSafe,
+  SDL3.Sys.Video.windowHasSurface,
+  SDL3.Sys.Video.windowHasSurfaceSafe,
+  SDL3.Sys.Video.getWindowSurface,
+  SDL3.Sys.Video.getWindowSurfaceSafe,
+  SDL3.Sys.Video.setWindowSurfaceVSync,
+  SDL3.Sys.Video.setWindowSurfaceVSyncSafe,
+  SDL3.Sys.Video.getWindowSurfaceVSync,
+  SDL3.Sys.Video.getWindowSurfaceVSyncSafe,
+  SDL3.Sys.Video.updateWindowSurface,
+  SDL3.Sys.Video.updateWindowSurfaceSafe,
+  SDL3.Sys.Video.updateWindowSurfaceRects,
+  SDL3.Sys.Video.updateWindowSurfaceRectsSafe,
+  SDL3.Sys.Video.destroyWindowSurface,
+  SDL3.Sys.Video.destroyWindowSurfaceSafe,
+  SDL3.Sys.Video.setWindowKeyboardGrab,
+  SDL3.Sys.Video.setWindowKeyboardGrabSafe,
+  SDL3.Sys.Video.setWindowMouseGrab,
+  SDL3.Sys.Video.setWindowMouseGrabSafe,
+  SDL3.Sys.Video.getWindowKeyboardGrab,
+  SDL3.Sys.Video.getWindowKeyboardGrabSafe,
+  SDL3.Sys.Video.getWindowMouseGrab,
+  SDL3.Sys.Video.getWindowMouseGrabSafe,
+  SDL3.Sys.Video.getGrabbedWindow,
+  SDL3.Sys.Video.getGrabbedWindowSafe,
+  SDL3.Sys.Video.setWindowMouseRect,
+  SDL3.Sys.Video.setWindowMouseRectSafe,
+  SDL3.Sys.Video.getWindowMouseRect,
+  SDL3.Sys.Video.getWindowMouseRectSafe,
+  SDL3.Sys.Video.setWindowOpacity,
+  SDL3.Sys.Video.setWindowOpacitySafe,
+  SDL3.Sys.Video.getWindowOpacity,
+  SDL3.Sys.Video.getWindowOpacitySafe,
+  SDL3.Sys.Video.setWindowParent,
+  SDL3.Sys.Video.setWindowParentSafe,
+  SDL3.Sys.Video.setWindowModal,
+  SDL3.Sys.Video.setWindowModalSafe,
+  SDL3.Sys.Video.setWindowFocusable,
+  SDL3.Sys.Video.setWindowFocusableSafe,
+  SDL3.Sys.Video.showWindowSystemMenu,
+  SDL3.Sys.Video.showWindowSystemMenuSafe,
+  SDL3.Sys.Video.setWindowHitTest,
+  SDL3.Sys.Video.setWindowHitTestSafe,
+  SDL3.Sys.Video.setWindowShape,
+  SDL3.Sys.Video.setWindowShapeSafe,
+  SDL3.Sys.Video.flashWindow,
+  SDL3.Sys.Video.flashWindowSafe,
+  SDL3.Sys.Video.setWindowProgressState,
+  SDL3.Sys.Video.setWindowProgressStateSafe,
+  SDL3.Sys.Video.getWindowProgressState,
+  SDL3.Sys.Video.getWindowProgressStateSafe,
+  SDL3.Sys.Video.setWindowProgressValue,
+  SDL3.Sys.Video.setWindowProgressValueSafe,
+  SDL3.Sys.Video.getWindowProgressValue,
+  SDL3.Sys.Video.getWindowProgressValueSafe,
+  SDL3.Sys.Video.destroyWindow,
+  SDL3.Sys.Video.destroyWindowSafe,
+  SDL3.Sys.Video.screenSaverEnabled,
+  SDL3.Sys.Video.screenSaverEnabledSafe,
+  SDL3.Sys.Video.enableScreenSaver,
+  SDL3.Sys.Video.enableScreenSaverSafe,
+  SDL3.Sys.Video.disableScreenSaver,
+  SDL3.Sys.Video.disableScreenSaverSafe,
+  SDL3.Sys.Video.glLoadLibrary,
+  SDL3.Sys.Video.glLoadLibrarySafe,
+  SDL3.Sys.Video.glGetProcAddress,
+  SDL3.Sys.Video.glGetProcAddressSafe,
+  SDL3.Sys.Video.eglGetProcAddress,
+  SDL3.Sys.Video.eglGetProcAddressSafe,
+  SDL3.Sys.Video.glUnloadLibrary,
+  SDL3.Sys.Video.glUnloadLibrarySafe,
+  SDL3.Sys.Video.glExtensionSupported,
+  SDL3.Sys.Video.glExtensionSupportedSafe,
+  SDL3.Sys.Video.glResetAttributes,
+  SDL3.Sys.Video.glResetAttributesSafe,
+  SDL3.Sys.Video.glSetAttribute,
+  SDL3.Sys.Video.glSetAttributeSafe,
+  SDL3.Sys.Video.glGetAttribute,
+  SDL3.Sys.Video.glGetAttributeSafe,
+  SDL3.Sys.Video.glCreateContext,
+  SDL3.Sys.Video.glCreateContextSafe,
+  SDL3.Sys.Video.glMakeCurrent,
+  SDL3.Sys.Video.glMakeCurrentSafe,
+  SDL3.Sys.Video.glGetCurrentWindow,
+  SDL3.Sys.Video.glGetCurrentWindowSafe,
+  SDL3.Sys.Video.glGetCurrentContext,
+  SDL3.Sys.Video.glGetCurrentContextSafe,
+  SDL3.Sys.Video.eglGetCurrentDisplay,
+  SDL3.Sys.Video.eglGetCurrentDisplaySafe,
+  SDL3.Sys.Video.eglGetCurrentConfig,
+  SDL3.Sys.Video.eglGetCurrentConfigSafe,
+  SDL3.Sys.Video.eglGetWindowSurface,
+  SDL3.Sys.Video.eglGetWindowSurfaceSafe,
+  SDL3.Sys.Video.eglSetAttributeCallbacks,
+  SDL3.Sys.Video.eglSetAttributeCallbacksSafe,
+  SDL3.Sys.Video.glSetSwapInterval,
+  SDL3.Sys.Video.glSetSwapIntervalSafe,
+  SDL3.Sys.Video.glGetSwapInterval,
+  SDL3.Sys.Video.glGetSwapIntervalSafe,
+  SDL3.Sys.Video.glSwapWindow,
+  SDL3.Sys.Video.glSwapWindowSafe,
+  SDL3.Sys.Video.glDestroyContext,
+  SDL3.Sys.Video.glDestroyContextSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.LibC qualified
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Pixels qualified
+import SDL3.Sys.Bindgen.Properties qualified
+import SDL3.Sys.Bindgen.Rect qualified
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Surface qualified
+import SDL3.Sys.Bindgen.Video
+import SDL3.Sys.Bindgen.Video.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Video.Unsafe qualified as Unsafe
+
+-- | Get the number of video drivers compiled into SDL.
+--
+--     [Returns]: the number of built in video drivers.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getVideoDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNumVideoDrivers@.
+--                   The safe flavor is 'getNumVideoDriversSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumVideoDrivers@, defined at @SDL3\/SDL_video.h 563:33@
+getNumVideoDrivers :: IO BG.Int32
+getNumVideoDrivers =
+  fmap Coerce.coerce Unsafe.sDL_GetNumVideoDrivers
+
+-- | Get the number of video drivers compiled into SDL.
+--
+--     [Returns]: the number of built in video drivers.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getVideoDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNumVideoDrivers@.
+--                   The unsafe flavor is 'getNumVideoDrivers'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetNumVideoDrivers@, defined at @SDL3\/SDL_video.h 563:33@
+getNumVideoDriversSafe :: IO BG.Int32
+getNumVideoDriversSafe =
+  fmap Coerce.coerce Safe.sDL_GetNumVideoDrivers
+
+-- | Get the name of a built in video driver.
+--
+--     The video 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 \"cocoa\", \"x11\" or \"windows\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the video driver with the given __index__, or NULL if index is out of bounds.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumVideoDrivers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetVideoDriver@.
+--                   The safe flavor is 'getVideoDriverSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetVideoDriver@, defined at @SDL3\/SDL_video.h 585:42@
+getVideoDriver
+  :: BG.Int32
+  -- ^
+  --
+  --           [@index@]: the index of a video driver.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getVideoDriver =
+  \x00 -> Unsafe.sDL_GetVideoDriver (Coerce.coerce x00)
+
+-- | Get the name of a built in video driver.
+--
+--     The video 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 \"cocoa\", \"x11\" or \"windows\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the video driver with the given __index__, or NULL if index is out of bounds.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumVideoDrivers'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetVideoDriver@.
+--                   The unsafe flavor is 'getVideoDriver'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetVideoDriver@, defined at @SDL3\/SDL_video.h 585:42@
+getVideoDriverSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@index@]: the index of a video driver.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getVideoDriverSafe =
+  \x00 -> Safe.sDL_GetVideoDriver (Coerce.coerce x00)
+
+-- | Get the name of the currently initialized video driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"cocoa\", \"x11\" or \"windows\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current video driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumVideoDrivers', 'getVideoDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCurrentVideoDriver@.
+--                   The safe flavor is 'getCurrentVideoDriverSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentVideoDriver@, defined at @SDL3\/SDL_video.h 604:42@
+getCurrentVideoDriver :: IO (PtrConst.PtrConst BG.CChar)
+getCurrentVideoDriver =
+  Unsafe.sDL_GetCurrentVideoDriver
+
+-- | Get the name of the currently initialized video driver.
+--
+--     The names of drivers are all simple, low-ASCII identifiers, like \"cocoa\", \"x11\" or \"windows\". These never have Unicode characters, and are not meant to be proper names.
+--
+--     [Returns]: the name of the current video driver or NULL if no driver has been initialized.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getNumVideoDrivers', 'getVideoDriver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCurrentVideoDriver@.
+--                   The unsafe flavor is 'getCurrentVideoDriver'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentVideoDriver@, defined at @SDL3\/SDL_video.h 604:42@
+getCurrentVideoDriverSafe :: IO (PtrConst.PtrConst BG.CChar)
+getCurrentVideoDriverSafe =
+  Safe.sDL_GetCurrentVideoDriver
+
+-- | Get the current system theme.
+--
+--     [Returns]: the current system theme, light, dark, or unknown.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetSystemTheme@.
+--                   The safe flavor is 'getSystemThemeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetSystemTheme@, defined at @SDL3\/SDL_video.h 615:45@
+getSystemTheme :: IO SDL_SystemTheme
+getSystemTheme = Unsafe.sDL_GetSystemTheme
+
+-- | Get the current system theme.
+--
+--     [Returns]: the current system theme, light, dark, or unknown.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetSystemTheme@.
+--                   The unsafe flavor is 'getSystemTheme'
+--                   .
+--
+--     [C declaration]: @SDL_GetSystemTheme@, defined at @SDL3\/SDL_video.h 615:45@
+getSystemThemeSafe :: IO SDL_SystemTheme
+getSystemThemeSafe = Safe.sDL_GetSystemTheme
+
+-- | Get a list of currently connected displays.
+--
+--     [Returns]: a 0 terminated array of display instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDisplays@.
+--                   The safe flavor is 'getDisplaysSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplays@, defined at @SDL3\/SDL_video.h 630:45@
+getDisplays
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of displays returned, may be NULL.
+  -> IO (BG.Ptr SDL_DisplayID)
+getDisplays = Unsafe.sDL_GetDisplays
+
+-- | Get a list of currently connected displays.
+--
+--     [Returns]: a 0 terminated array of display instance IDs or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDisplays@.
+--                   The unsafe flavor is 'getDisplays'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplays@, defined at @SDL3\/SDL_video.h 630:45@
+getDisplaysSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of displays returned, may be NULL.
+  -> IO (BG.Ptr SDL_DisplayID)
+getDisplaysSafe = Safe.sDL_GetDisplays
+
+-- | Return the primary display.
+--
+--     [Returns]: the instance ID of the primary display on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetPrimaryDisplay@.
+--                   The safe flavor is 'getPrimaryDisplaySafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetPrimaryDisplay@, defined at @SDL3\/SDL_video.h 644:43@
+getPrimaryDisplay :: IO SDL_DisplayID
+getPrimaryDisplay = Unsafe.sDL_GetPrimaryDisplay
+
+-- | Return the primary display.
+--
+--     [Returns]: the instance ID of the primary display on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetPrimaryDisplay@.
+--                   The unsafe flavor is 'getPrimaryDisplay'
+--                   .
+--
+--     [C declaration]: @SDL_GetPrimaryDisplay@, defined at @SDL3\/SDL_video.h 644:43@
+getPrimaryDisplaySafe :: IO SDL_DisplayID
+getPrimaryDisplaySafe = Safe.sDL_GetPrimaryDisplay
+
+-- | Get the properties associated with a display.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN'@: true if the display has HDR headroom above the SDR white point. This is for informational and diagnostic purposes only, as not all platforms provide this information at the display level.
+--
+--     On KMS\/DRM:
+--
+--     * @'sDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER'@: the \"panel orientation\" property for the display in degrees of clockwise rotation. Note that this is provided only as a hint, and the application is responsible for any coordinate transformations needed to conform to the requested display orientation.
+--
+--     On Wayland:
+--
+--     * @'sDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER'@: the wl_output associated with the display
+--
+--     On Windows:
+--
+--     * @'sDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER'@: the monitor handle (HMONITOR) associated with the display
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDisplayProperties@.
+--                   The safe flavor is 'getDisplayPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplayProperties@, defined at @SDL3\/SDL_video.h 682:46@
+getDisplayProperties
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getDisplayProperties =
+  Unsafe.sDL_GetDisplayProperties
+
+-- | Get the properties associated with a display.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_DISPLAY_HDR_ENABLED_BOOLEAN'@: true if the display has HDR headroom above the SDR white point. This is for informational and diagnostic purposes only, as not all platforms provide this information at the display level.
+--
+--     On KMS\/DRM:
+--
+--     * @'sDL_PROP_DISPLAY_KMSDRM_PANEL_ORIENTATION_NUMBER'@: the \"panel orientation\" property for the display in degrees of clockwise rotation. Note that this is provided only as a hint, and the application is responsible for any coordinate transformations needed to conform to the requested display orientation.
+--
+--     On Wayland:
+--
+--     * @'sDL_PROP_DISPLAY_WAYLAND_WL_OUTPUT_POINTER'@: the wl_output associated with the display
+--
+--     On Windows:
+--
+--     * @'sDL_PROP_DISPLAY_WINDOWS_HMONITOR_POINTER'@: the monitor handle (HMONITOR) associated with the display
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDisplayProperties@.
+--                   The unsafe flavor is 'getDisplayProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplayProperties@, defined at @SDL3\/SDL_video.h 682:46@
+getDisplayPropertiesSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getDisplayPropertiesSafe =
+  Safe.sDL_GetDisplayProperties
+
+-- | Get the name of a display in UTF-8 encoding.
+--
+--     [Returns]: the name of a display or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDisplayName@.
+--                   The safe flavor is 'getDisplayNameSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplayName@, defined at @SDL3\/SDL_video.h 702:42@
+getDisplayName
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getDisplayName = Unsafe.sDL_GetDisplayName
+
+-- | Get the name of a display in UTF-8 encoding.
+--
+--     [Returns]: the name of a display or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDisplayName@.
+--                   The unsafe flavor is 'getDisplayName'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplayName@, defined at @SDL3\/SDL_video.h 702:42@
+getDisplayNameSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getDisplayNameSafe = Safe.sDL_GetDisplayName
+
+-- | Get the desktop area represented by a display.
+--
+--     The primary display is often located at (0,0), but may be placed at a different location depending on monitor layout.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplayUsableBounds', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDisplayBounds@.
+--                   The safe flavor is 'getDisplayBoundsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDisplayBounds@, defined at @SDL3\/SDL_video.h 722:34@
+getDisplayBounds
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure filled in with the display bounds.
+  -> IO Bool
+getDisplayBounds =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetDisplayBounds x00 x11)
+
+-- | Get the desktop area represented by a display.
+--
+--     The primary display is often located at (0,0), but may be placed at a different location depending on monitor layout.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplayUsableBounds', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDisplayBounds@.
+--                   The unsafe flavor is 'getDisplayBounds'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDisplayBounds@, defined at @SDL3\/SDL_video.h 722:34@
+getDisplayBoundsSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure filled in with the display bounds.
+  -> IO Bool
+getDisplayBoundsSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetDisplayBounds x00 x11)
+
+-- | Get the usable desktop area represented by a display, in screen coordinates.
+--
+--     This is the same area as @'getDisplayBounds'@ reports, but with portions reserved by the system removed. For example, on Apple\'s macOS, this subtracts the area occupied by the menu bar and dock.
+--
+--     Setting a window to be fullscreen generally bypasses these unusable areas, so these are good guidelines for the maximum space available to a non-fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplayBounds', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDisplayUsableBounds@.
+--                   The safe flavor is 'getDisplayUsableBoundsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDisplayUsableBounds@, defined at @SDL3\/SDL_video.h 748:34@
+getDisplayUsableBounds
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure filled in with the display bounds.
+  -> IO Bool
+getDisplayUsableBounds =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetDisplayUsableBounds x00 x11)
+
+-- | Get the usable desktop area represented by a display, in screen coordinates.
+--
+--     This is the same area as @'getDisplayBounds'@ reports, but with portions reserved by the system removed. For example, on Apple\'s macOS, this subtracts the area occupied by the menu bar and dock.
+--
+--     Setting a window to be fullscreen generally bypasses these unusable areas, so these are good guidelines for the maximum space available to a non-fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplayBounds', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDisplayUsableBounds@.
+--                   The unsafe flavor is 'getDisplayUsableBounds'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDisplayUsableBounds@, defined at @SDL3\/SDL_video.h 748:34@
+getDisplayUsableBoundsSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the SDL_Rect structure filled in with the display bounds.
+  -> IO Bool
+getDisplayUsableBoundsSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetDisplayUsableBounds x00 x11)
+
+-- | Get the orientation of a display when it is unrotated.
+--
+--     [Returns]: the 'SDL_DisplayOrientation' enum value of the display, or @SDL_ORIENTATION_UNKNOWN@ if it isn\'t available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetNaturalDisplayOrientation@.
+--                   The safe flavor is 'getNaturalDisplayOrientationSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetNaturalDisplayOrientation@, defined at @SDL3\/SDL_video.h 763:52@
+getNaturalDisplayOrientation
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL_DisplayOrientation
+getNaturalDisplayOrientation =
+  Unsafe.sDL_GetNaturalDisplayOrientation
+
+-- | Get the orientation of a display when it is unrotated.
+--
+--     [Returns]: the 'SDL_DisplayOrientation' enum value of the display, or @SDL_ORIENTATION_UNKNOWN@ if it isn\'t available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetNaturalDisplayOrientation@.
+--                   The unsafe flavor is 'getNaturalDisplayOrientation'
+--                   .
+--
+--     [C declaration]: @SDL_GetNaturalDisplayOrientation@, defined at @SDL3\/SDL_video.h 763:52@
+getNaturalDisplayOrientationSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL_DisplayOrientation
+getNaturalDisplayOrientationSafe =
+  Safe.sDL_GetNaturalDisplayOrientation
+
+-- | Get the orientation of a display.
+--
+--     [Returns]: the 'SDL_DisplayOrientation' enum value of the display, or @SDL_ORIENTATION_UNKNOWN@ if it isn\'t available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCurrentDisplayOrientation@.
+--                   The safe flavor is 'getCurrentDisplayOrientationSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentDisplayOrientation@, defined at @SDL3\/SDL_video.h 778:52@
+getCurrentDisplayOrientation
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL_DisplayOrientation
+getCurrentDisplayOrientation =
+  Unsafe.sDL_GetCurrentDisplayOrientation
+
+-- | Get the orientation of a display.
+--
+--     [Returns]: the 'SDL_DisplayOrientation' enum value of the display, or @SDL_ORIENTATION_UNKNOWN@ if it isn\'t available.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCurrentDisplayOrientation@.
+--                   The unsafe flavor is 'getCurrentDisplayOrientation'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentDisplayOrientation@, defined at @SDL3\/SDL_video.h 778:52@
+getCurrentDisplayOrientationSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO SDL_DisplayOrientation
+getCurrentDisplayOrientationSafe =
+  Safe.sDL_GetCurrentDisplayOrientation
+
+-- | Get the content scale of a display.
+--
+--     The content scale is the expected scale for content based on the DPI settings of the display. For example, a 4K display might have a 2.0 (200%) display scale, which means that the user expects UI elements to be twice as big on this display, to aid in readability.
+--
+--     After window creation, @'getWindowDisplayScale'@ should be used to query the content scale factor for individual windows instead of querying the display for a window and calling this function, as the per-window content scale factor may differ from the base value of the display it is on, particularly on high-DPI and\/or multi-monitor desktop configurations.
+--
+--     [Returns]: the content scale of the display, or 0.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowDisplayScale', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDisplayContentScale@.
+--                   The safe flavor is 'getDisplayContentScaleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDisplayContentScale@, defined at @SDL3\/SDL_video.h 805:35@
+getDisplayContentScale
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO Float
+getDisplayContentScale =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetDisplayContentScale x00)
+
+-- | Get the content scale of a display.
+--
+--     The content scale is the expected scale for content based on the DPI settings of the display. For example, a 4K display might have a 2.0 (200%) display scale, which means that the user expects UI elements to be twice as big on this display, to aid in readability.
+--
+--     After window creation, @'getWindowDisplayScale'@ should be used to query the content scale factor for individual windows instead of querying the display for a window and calling this function, as the per-window content scale factor may differ from the base value of the display it is on, particularly on high-DPI and\/or multi-monitor desktop configurations.
+--
+--     [Returns]: the content scale of the display, or 0.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowDisplayScale', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDisplayContentScale@.
+--                   The unsafe flavor is 'getDisplayContentScale'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetDisplayContentScale@, defined at @SDL3\/SDL_video.h 805:35@
+getDisplayContentScaleSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO Float
+getDisplayContentScaleSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetDisplayContentScale x00)
+
+-- | Get a list of fullscreen display modes available on a display.
+--
+--     The display modes are sorted in this priority:
+--
+--     * w -> largest to smallest
+--
+--     * h -> largest to smallest
+--
+--     * bits per pixel -> more colors to fewer colors
+--
+--     * packed pixel layout -> largest to smallest
+--
+--     * refresh rate -> highest to lowest
+--
+--     * pixel density -> lowest to highest
+--
+--     [Returns]: a NULL terminated array of display mode pointers or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetFullscreenDisplayModes@.
+--                   The safe flavor is 'getFullscreenDisplayModesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetFullscreenDisplayModes@, defined at @SDL3\/SDL_video.h 833:48@
+getFullscreenDisplayModes
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of display modes returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_DisplayMode))
+getFullscreenDisplayModes =
+  Unsafe.sDL_GetFullscreenDisplayModes
+
+-- | Get a list of fullscreen display modes available on a display.
+--
+--     The display modes are sorted in this priority:
+--
+--     * w -> largest to smallest
+--
+--     * h -> largest to smallest
+--
+--     * bits per pixel -> more colors to fewer colors
+--
+--     * packed pixel layout -> largest to smallest
+--
+--     * refresh rate -> highest to lowest
+--
+--     * pixel density -> lowest to highest
+--
+--     [Returns]: a NULL terminated array of display mode pointers or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetFullscreenDisplayModes@.
+--                   The unsafe flavor is 'getFullscreenDisplayModes'
+--                   .
+--
+--     [C declaration]: @SDL_GetFullscreenDisplayModes@, defined at @SDL3\/SDL_video.h 833:48@
+getFullscreenDisplayModesSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of display modes returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_DisplayMode))
+getFullscreenDisplayModesSafe =
+  Safe.sDL_GetFullscreenDisplayModes
+
+-- | Get the closest match to the requested display mode.
+--
+--     The available display modes are scanned and @closest@ is filled in with the closest mode matching the requested mode and returned. The mode format and refresh rate default to the desktop mode if they are set to 0. The modes are scanned with size being first priority, format being second priority, and finally checking the refresh rate. If all the available modes are too small, then false is returned.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays', 'getFullscreenDisplayModes'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetClosestFullscreenDisplayMode@.
+--                   The safe flavor is 'getClosestFullscreenDisplayModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetClosestFullscreenDisplayMode@, defined at @SDL3\/SDL_video.h 864:34@
+getClosestFullscreenDisplayMode
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width in pixels of the desired display mode.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height in pixels of the desired display mode.
+  -> Float
+  -- ^
+  --
+  --           [@refresh_rate@]: the refresh rate of the desired display mode, or 0.0f for the desktop refresh rate.
+  -> Bool
+  -- ^
+  --
+  --           [@include_high_density_modes@]: boolean to include high density modes in the search.
+  -> BG.Ptr SDL_DisplayMode
+  -- ^
+  --
+  --           [@closest@]: a pointer filled in with the closest display mode equal to or larger than the desired mode.
+  -> IO Bool
+getClosestFullscreenDisplayMode =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap
+                CBool.toBool
+                ( Unsafe.sDL_GetClosestFullscreenDisplayMode
+                    x00
+                    (Coerce.coerce x11)
+                    (Coerce.coerce x22)
+                    (Coerce.coerce x33)
+                    (CBool.fromBool x44)
+                    x55
+                )
+
+-- | Get the closest match to the requested display mode.
+--
+--     The available display modes are scanned and @closest@ is filled in with the closest mode matching the requested mode and returned. The mode format and refresh rate default to the desktop mode if they are set to 0. The modes are scanned with size being first priority, format being second priority, and finally checking the refresh rate. If all the available modes are too small, then false is returned.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplays', 'getFullscreenDisplayModes'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetClosestFullscreenDisplayMode@.
+--                   The unsafe flavor is 'getClosestFullscreenDisplayMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetClosestFullscreenDisplayMode@, defined at @SDL3\/SDL_video.h 864:34@
+getClosestFullscreenDisplayModeSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width in pixels of the desired display mode.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height in pixels of the desired display mode.
+  -> Float
+  -- ^
+  --
+  --           [@refresh_rate@]: the refresh rate of the desired display mode, or 0.0f for the desktop refresh rate.
+  -> Bool
+  -- ^
+  --
+  --           [@include_high_density_modes@]: boolean to include high density modes in the search.
+  -> BG.Ptr SDL_DisplayMode
+  -- ^
+  --
+  --           [@closest@]: a pointer filled in with the closest display mode equal to or larger than the desired mode.
+  -> IO Bool
+getClosestFullscreenDisplayModeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              fmap
+                CBool.toBool
+                ( Safe.sDL_GetClosestFullscreenDisplayMode
+                    x00
+                    (Coerce.coerce x11)
+                    (Coerce.coerce x22)
+                    (Coerce.coerce x33)
+                    (CBool.fromBool x44)
+                    x55
+                )
+
+-- | Get information about the desktop\'s display mode.
+--
+--     There\'s a difference between this function and @'getCurrentDisplayMode'@ when SDL runs fullscreen and has changed the resolution. In that case this function will return the previous native display mode, and not the current display mode.
+--
+--     [Returns]: a pointer to the desktop display mode or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCurrentDisplayMode', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDesktopDisplayMode@.
+--                   The safe flavor is 'getDesktopDisplayModeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetDesktopDisplayMode@, defined at @SDL3\/SDL_video.h 885:53@
+getDesktopDisplayMode
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+getDesktopDisplayMode =
+  Unsafe.sDL_GetDesktopDisplayMode
+
+-- | Get information about the desktop\'s display mode.
+--
+--     There\'s a difference between this function and @'getCurrentDisplayMode'@ when SDL runs fullscreen and has changed the resolution. In that case this function will return the previous native display mode, and not the current display mode.
+--
+--     [Returns]: a pointer to the desktop display mode or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getCurrentDisplayMode', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDesktopDisplayMode@.
+--                   The unsafe flavor is 'getDesktopDisplayMode'
+--                   .
+--
+--     [C declaration]: @SDL_GetDesktopDisplayMode@, defined at @SDL3\/SDL_video.h 885:53@
+getDesktopDisplayModeSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+getDesktopDisplayModeSafe =
+  Safe.sDL_GetDesktopDisplayMode
+
+-- | Get information about the current display mode.
+--
+--     There\'s a difference between this function and @'getDesktopDisplayMode'@ when SDL runs fullscreen and has changed the resolution. In that case this function will return the current display mode, and not the previous native display mode.
+--
+--     [Returns]: a pointer to the desktop display mode or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDesktopDisplayMode', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetCurrentDisplayMode@.
+--                   The safe flavor is 'getCurrentDisplayModeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentDisplayMode@, defined at @SDL3\/SDL_video.h 906:53@
+getCurrentDisplayMode
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+getCurrentDisplayMode =
+  Unsafe.sDL_GetCurrentDisplayMode
+
+-- | Get information about the current display mode.
+--
+--     There\'s a difference between this function and @'getDesktopDisplayMode'@ when SDL runs fullscreen and has changed the resolution. In that case this function will return the current display mode, and not the previous native display mode.
+--
+--     [Returns]: a pointer to the desktop display mode or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDesktopDisplayMode', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetCurrentDisplayMode@.
+--                   The unsafe flavor is 'getCurrentDisplayMode'
+--                   .
+--
+--     [C declaration]: @SDL_GetCurrentDisplayMode@, defined at @SDL3\/SDL_video.h 906:53@
+getCurrentDisplayModeSafe
+  :: SDL_DisplayID
+  -- ^
+  --
+  --           [@displayID@]: the instance ID of the display to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+getCurrentDisplayModeSafe =
+  Safe.sDL_GetCurrentDisplayMode
+
+-- | Get the display containing a point.
+--
+--     [Returns]: the instance ID of the display containing the point or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplayBounds', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDisplayForPoint@.
+--                   The safe flavor is 'getDisplayForPointSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplayForPoint@, defined at @SDL3\/SDL_video.h 922:43@
+getDisplayForPoint
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point
+  -- ^
+  --
+  --           [@point@]: the point to query.
+  -> IO SDL_DisplayID
+getDisplayForPoint = Unsafe.sDL_GetDisplayForPoint
+
+-- | Get the display containing a point.
+--
+--     [Returns]: the instance ID of the display containing the point or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplayBounds', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDisplayForPoint@.
+--                   The unsafe flavor is 'getDisplayForPoint'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplayForPoint@, defined at @SDL3\/SDL_video.h 922:43@
+getDisplayForPointSafe
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Point
+  -- ^
+  --
+  --           [@point@]: the point to query.
+  -> IO SDL_DisplayID
+getDisplayForPointSafe = Safe.sDL_GetDisplayForPoint
+
+-- | Get the display primarily containing a rect.
+--
+--     [Returns]: the instance ID of the display entirely containing the rect or closest to the center of the rect on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplayBounds', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDisplayForRect@.
+--                   The safe flavor is 'getDisplayForRectSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplayForRect@, defined at @SDL3\/SDL_video.h 939:43@
+getDisplayForRect
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the rect to query.
+  -> IO SDL_DisplayID
+getDisplayForRect = Unsafe.sDL_GetDisplayForRect
+
+-- | Get the display primarily containing a rect.
+--
+--     [Returns]: the instance ID of the display entirely containing the rect or closest to the center of the rect on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplayBounds', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDisplayForRect@.
+--                   The unsafe flavor is 'getDisplayForRect'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplayForRect@, defined at @SDL3\/SDL_video.h 939:43@
+getDisplayForRectSafe
+  :: PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: the rect to query.
+  -> IO SDL_DisplayID
+getDisplayForRectSafe = Safe.sDL_GetDisplayForRect
+
+-- | Get the display associated with a window.
+--
+--     [Returns]: the instance ID of the display containing the center of the window on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplayBounds', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetDisplayForWindow@.
+--                   The safe flavor is 'getDisplayForWindowSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplayForWindow@, defined at @SDL3\/SDL_video.h 956:43@
+getDisplayForWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_DisplayID
+getDisplayForWindow = Unsafe.sDL_GetDisplayForWindow
+
+-- | Get the display associated with a window.
+--
+--     [Returns]: the instance ID of the display containing the center of the window on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getDisplayBounds', 'getDisplays'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetDisplayForWindow@.
+--                   The unsafe flavor is 'getDisplayForWindow'
+--                   .
+--
+--     [C declaration]: @SDL_GetDisplayForWindow@, defined at @SDL3\/SDL_video.h 956:43@
+getDisplayForWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_DisplayID
+getDisplayForWindowSafe =
+  Safe.sDL_GetDisplayForWindow
+
+-- | Get the pixel density of a window.
+--
+--     This is a ratio of pixel size to window size. For example, if the window is 1920x1080 and it has a high density back buffer of 3840x2160 pixels, it would have a pixel density of 2.0.
+--
+--     [Returns]: the pixel density or 0.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowDisplayScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowPixelDensity@.
+--                   The safe flavor is 'getWindowPixelDensitySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowPixelDensity@, defined at @SDL3\/SDL_video.h 975:35@
+getWindowPixelDensity
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Float
+getWindowPixelDensity =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetWindowPixelDensity x00)
+
+-- | Get the pixel density of a window.
+--
+--     This is a ratio of pixel size to window size. For example, if the window is 1920x1080 and it has a high density back buffer of 3840x2160 pixels, it would have a pixel density of 2.0.
+--
+--     [Returns]: the pixel density or 0.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowDisplayScale'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowPixelDensity@.
+--                   The unsafe flavor is 'getWindowPixelDensity'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowPixelDensity@, defined at @SDL3\/SDL_video.h 975:35@
+getWindowPixelDensitySafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Float
+getWindowPixelDensitySafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetWindowPixelDensity x00)
+
+-- | Get the content display scale relative to a window\'s pixel size.
+--
+--     This is a combination of the window pixel density and the display content scale, and is the expected scale for displaying content in this window. For example, if a 3840x2160 window had a display scale of 2.0, the user expects the content to take twice as many pixels and be the same physical size as if it were being displayed in a 1920x1080 window with a display scale of 1.0.
+--
+--     Conceptually this value corresponds to the scale display setting, and is updated when that setting is changed, or the window moves to a display with a different scale setting.
+--
+--     [Returns]: the display scale, or 0.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowDisplayScale@.
+--                   The safe flavor is 'getWindowDisplayScaleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowDisplayScale@, defined at @SDL3\/SDL_video.h 999:35@
+getWindowDisplayScale
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Float
+getWindowDisplayScale =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetWindowDisplayScale x00)
+
+-- | Get the content display scale relative to a window\'s pixel size.
+--
+--     This is a combination of the window pixel density and the display content scale, and is the expected scale for displaying content in this window. For example, if a 3840x2160 window had a display scale of 2.0, the user expects the content to take twice as many pixels and be the same physical size as if it were being displayed in a 1920x1080 window with a display scale of 1.0.
+--
+--     Conceptually this value corresponds to the scale display setting, and is updated when that setting is changed, or the window moves to a display with a different scale setting.
+--
+--     [Returns]: the display scale, or 0.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowDisplayScale@.
+--                   The unsafe flavor is 'getWindowDisplayScale'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowDisplayScale@, defined at @SDL3\/SDL_video.h 999:35@
+getWindowDisplayScaleSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Float
+getWindowDisplayScaleSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetWindowDisplayScale x00)
+
+-- | Set the display mode to use when a window is visible and fullscreen.
+--
+--     This only affects the display mode used when the window is fullscreen. To change the window size when the window is not fullscreen, use @'setWindowSize'@.
+--
+--     If the window is currently in the fullscreen state, this request is asynchronous on some windowing systems and the new mode dimensions may not be applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the new mode takes effect, an SDL_EVENT_WINDOW_RESIZED and\/or an SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event will be emitted with the new mode dimensions.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFullscreenMode', 'setWindowFullscreen', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowFullscreenMode@.
+--                   The safe flavor is 'setWindowFullscreenModeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowFullscreenMode@, defined at @SDL3\/SDL_video.h 1034:34@
+setWindowFullscreenMode
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to affect.
+  -> PtrConst.PtrConst SDL_DisplayMode
+  -- ^
+  --
+  --           [@mode@]: a pointer to the display mode to use, which can be NULL for borderless fullscreen desktop mode, or one of the fullscreen modes returned by @'getFullscreenDisplayModes'@ to set an exclusive fullscreen mode.
+  -> IO Bool
+setWindowFullscreenMode =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowFullscreenMode x00 x11)
+
+-- | Set the display mode to use when a window is visible and fullscreen.
+--
+--     This only affects the display mode used when the window is fullscreen. To change the window size when the window is not fullscreen, use @'setWindowSize'@.
+--
+--     If the window is currently in the fullscreen state, this request is asynchronous on some windowing systems and the new mode dimensions may not be applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the new mode takes effect, an SDL_EVENT_WINDOW_RESIZED and\/or an SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event will be emitted with the new mode dimensions.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFullscreenMode', 'setWindowFullscreen', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowFullscreenMode@.
+--                   The unsafe flavor is 'setWindowFullscreenMode'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowFullscreenMode@, defined at @SDL3\/SDL_video.h 1034:34@
+setWindowFullscreenModeSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to affect.
+  -> PtrConst.PtrConst SDL_DisplayMode
+  -- ^
+  --
+  --           [@mode@]: a pointer to the display mode to use, which can be NULL for borderless fullscreen desktop mode, or one of the fullscreen modes returned by @'getFullscreenDisplayModes'@ to set an exclusive fullscreen mode.
+  -> IO Bool
+setWindowFullscreenModeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowFullscreenMode x00 x11)
+
+-- | Query the display mode to use when a window is visible at fullscreen.
+--
+--     [Returns]: a pointer to the exclusive fullscreen mode to use or NULL for borderless fullscreen desktop mode.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowFullscreenMode', 'setWindowFullscreen'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowFullscreenMode@.
+--                   The safe flavor is 'getWindowFullscreenModeSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowFullscreenMode@, defined at @SDL3\/SDL_video.h 1050:53@
+getWindowFullscreenMode
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+getWindowFullscreenMode =
+  Unsafe.sDL_GetWindowFullscreenMode
+
+-- | Query the display mode to use when a window is visible at fullscreen.
+--
+--     [Returns]: a pointer to the exclusive fullscreen mode to use or NULL for borderless fullscreen desktop mode.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowFullscreenMode', 'setWindowFullscreen'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowFullscreenMode@.
+--                   The unsafe flavor is 'getWindowFullscreenMode'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowFullscreenMode@, defined at @SDL3\/SDL_video.h 1050:53@
+getWindowFullscreenModeSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst SDL_DisplayMode)
+getWindowFullscreenModeSafe =
+  Safe.sDL_GetWindowFullscreenMode
+
+-- | Get the raw ICC profile data for the screen the window is currently on.
+--
+--     [Returns]: the raw ICC profile data on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowICCProfile@.
+--                   The safe flavor is 'getWindowICCProfileSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowICCProfile@, defined at @SDL3\/SDL_video.h 1065:36@
+getWindowICCProfile
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the ICC profile.
+  -> IO (BG.Ptr BG.Void)
+getWindowICCProfile = Unsafe.sDL_GetWindowICCProfile
+
+-- | Get the raw ICC profile data for the screen the window is currently on.
+--
+--     [Returns]: the raw ICC profile data on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowICCProfile@.
+--                   The unsafe flavor is 'getWindowICCProfile'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowICCProfile@, defined at @SDL3\/SDL_video.h 1065:36@
+getWindowICCProfileSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr HsBindgen.Runtime.LibC.CSize
+  -- ^
+  --
+  --           [@size@]: the size of the ICC profile.
+  -> IO (BG.Ptr BG.Void)
+getWindowICCProfileSafe =
+  Safe.sDL_GetWindowICCProfile
+
+-- | Get the pixel format associated with the window.
+--
+--     [Returns]: the pixel format of the window on success or SDL_PIXELFORMAT_UNKNOWN on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowPixelFormat@.
+--                   The safe flavor is 'getWindowPixelFormatSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowPixelFormat@, defined at @SDL3\/SDL_video.h 1079:45@
+getWindowPixelFormat
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+getWindowPixelFormat =
+  Unsafe.sDL_GetWindowPixelFormat
+
+-- | Get the pixel format associated with the window.
+--
+--     [Returns]: the pixel format of the window on success or SDL_PIXELFORMAT_UNKNOWN on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowPixelFormat@.
+--                   The unsafe flavor is 'getWindowPixelFormat'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowPixelFormat@, defined at @SDL3\/SDL_video.h 1079:45@
+getWindowPixelFormatSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL3.Sys.Bindgen.Pixels.SDL_PixelFormat
+getWindowPixelFormatSafe =
+  Safe.sDL_GetWindowPixelFormat
+
+-- | Get a list of valid windows.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Window' pointers or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindows@.
+--                   The safe flavor is 'getWindowsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindows@, defined at @SDL3\/SDL_video.h 1095:43@
+getWindows
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of windows returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Window))
+getWindows = Unsafe.sDL_GetWindows
+
+-- | Get a list of valid windows.
+--
+--     [Returns]: a NULL terminated array of 'SDL_Window' pointers or NULL on failure; call 'SDL3.Sys.Error.getError' for more information. This is a single allocation that should be freed with 'SDL3.Sys.Stdinc.free' when it is no longer needed.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindows@.
+--                   The unsafe flavor is 'getWindows'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindows@, defined at @SDL3\/SDL_video.h 1095:43@
+getWindowsSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of windows returned, may be NULL.
+  -> IO (BG.Ptr (BG.Ptr SDL_Window))
+getWindowsSafe = Safe.sDL_GetWindows
+
+-- | Create a window with the specified dimensions and flags.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     @flags@ may be any of the following OR\'d together:
+--
+--     * @SDL_WINDOW_FULLSCREEN@: fullscreen window at desktop resolution
+--
+--     * @SDL_WINDOW_OPENGL@: window usable with an OpenGL context
+--
+--     * @SDL_WINDOW_HIDDEN@: window is not visible
+--
+--     * @SDL_WINDOW_BORDERLESS@: no window decoration
+--
+--     * @SDL_WINDOW_RESIZABLE@: window can be resized
+--
+--     * @SDL_WINDOW_MINIMIZED@: window is minimized
+--
+--     * @SDL_WINDOW_MAXIMIZED@: window is maximized
+--
+--     * @SDL_WINDOW_MOUSE_GRABBED@: window has grabbed mouse focus
+--
+--     * @SDL_WINDOW_INPUT_FOCUS@: window has input focus
+--
+--     * @SDL_WINDOW_MOUSE_FOCUS@: window has mouse focus
+--
+--     * @SDL_WINDOW_EXTERNAL@: window not created by SDL
+--
+--     * @SDL_WINDOW_MODAL@: window is modal
+--
+--     * @SDL_WINDOW_HIGH_PIXEL_DENSITY@: window uses high pixel density back buffer if possible
+--
+--     * @SDL_WINDOW_MOUSE_CAPTURE@: window has mouse captured (unrelated to MOUSE_GRABBED)
+--
+--     * @SDL_WINDOW_ALWAYS_ON_TOP@: window should always be above others
+--
+--     * @SDL_WINDOW_UTILITY@: window should be treated as a utility window, not showing in the task bar and window list
+--
+--     * @SDL_WINDOW_TOOLTIP@: window should be treated as a tooltip and does not get mouse or keyboard focus, requires a parent window
+--
+--     * @SDL_WINDOW_POPUP_MENU@: window should be treated as a popup menu, requires a parent window
+--
+--     * @SDL_WINDOW_KEYBOARD_GRABBED@: window has grabbed keyboard input
+--
+--     * @SDL_WINDOW_VULKAN@: window usable with a Vulkan instance
+--
+--     * @SDL_WINDOW_METAL@: window usable with a Metal instance
+--
+--     * @SDL_WINDOW_TRANSPARENT@: window with transparent buffer
+--
+--     * @SDL_WINDOW_NOT_FOCUSABLE@: window should not be focusable
+--
+--     The 'SDL_Window' will be shown if SDL_WINDOW_HIDDEN is not set. If hidden at creation time, @'showWindow'@ can be used to show it later.
+--
+--     On Apple\'s macOS, you __must__ set the NSHighResolutionCapable Info.plist property to YES, otherwise you will not receive a High-DPI OpenGL canvas.
+--
+--     The window pixel size may differ from its window coordinate size if the window is on a high pixel density display. Use @'getWindowSize'@ to query the client area\'s size in window coordinates, and @'getWindowSizeInPixels'@ or 'SDL3.Sys.Render.getRenderOutputSize' to query the drawable size in pixels. Note that the drawable size can vary after the window is created and should be queried again if you get an SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event.
+--
+--     If the window is created with any of the SDL_WINDOW_OPENGL or SDL_WINDOW_VULKAN flags, then the corresponding LoadLibrary function (SDL_GL_LoadLibrary or SDL_Vulkan_LoadLibrary) is called and the corresponding UnloadLibrary function is called by @'destroyWindow'@.
+--
+--     If SDL_WINDOW_VULKAN is specified and there isn\'t a working Vulkan driver, @'createWindow'@ will fail, because 'SDL3.Sys.Vulkan.vulkanLoadLibrary' will fail.
+--
+--     If SDL_WINDOW_METAL is specified on an OS that does not support Metal, @'createWindow'@ will fail.
+--
+--     If you intend to use this window with an SDL_Renderer, you should use 'SDL3.Sys.Render.createWindowAndRenderer' instead of this function, to avoid window flicker.
+--
+--     On non-Apple devices, SDL requires you to either not link to the Vulkan loader or link to a dynamic library version. This limitation may be removed in a future version of SDL.
+--
+--     [Returns]: the window that was created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Render.createWindowAndRenderer', 'createPopupWindow', 'createWindowWithProperties', 'destroyWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateWindow@.
+--                   The safe flavor is 'createWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateWindow@, defined at @SDL3\/SDL_video.h 1184:42@
+createWindow
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the title of the window, in UTF-8 encoding.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the window.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the window.
+  -> SDL_WindowFlags
+  -- ^
+  --
+  --           [@flags@]: 0, or one or more 'SDL_WindowFlags' OR\'d together.
+  -> IO (BG.Ptr SDL_Window)
+createWindow =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Unsafe.sDL_CreateWindow x00 (Coerce.coerce x11) (Coerce.coerce x22) x33
+
+-- | Create a window with the specified dimensions and flags.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     @flags@ may be any of the following OR\'d together:
+--
+--     * @SDL_WINDOW_FULLSCREEN@: fullscreen window at desktop resolution
+--
+--     * @SDL_WINDOW_OPENGL@: window usable with an OpenGL context
+--
+--     * @SDL_WINDOW_HIDDEN@: window is not visible
+--
+--     * @SDL_WINDOW_BORDERLESS@: no window decoration
+--
+--     * @SDL_WINDOW_RESIZABLE@: window can be resized
+--
+--     * @SDL_WINDOW_MINIMIZED@: window is minimized
+--
+--     * @SDL_WINDOW_MAXIMIZED@: window is maximized
+--
+--     * @SDL_WINDOW_MOUSE_GRABBED@: window has grabbed mouse focus
+--
+--     * @SDL_WINDOW_INPUT_FOCUS@: window has input focus
+--
+--     * @SDL_WINDOW_MOUSE_FOCUS@: window has mouse focus
+--
+--     * @SDL_WINDOW_EXTERNAL@: window not created by SDL
+--
+--     * @SDL_WINDOW_MODAL@: window is modal
+--
+--     * @SDL_WINDOW_HIGH_PIXEL_DENSITY@: window uses high pixel density back buffer if possible
+--
+--     * @SDL_WINDOW_MOUSE_CAPTURE@: window has mouse captured (unrelated to MOUSE_GRABBED)
+--
+--     * @SDL_WINDOW_ALWAYS_ON_TOP@: window should always be above others
+--
+--     * @SDL_WINDOW_UTILITY@: window should be treated as a utility window, not showing in the task bar and window list
+--
+--     * @SDL_WINDOW_TOOLTIP@: window should be treated as a tooltip and does not get mouse or keyboard focus, requires a parent window
+--
+--     * @SDL_WINDOW_POPUP_MENU@: window should be treated as a popup menu, requires a parent window
+--
+--     * @SDL_WINDOW_KEYBOARD_GRABBED@: window has grabbed keyboard input
+--
+--     * @SDL_WINDOW_VULKAN@: window usable with a Vulkan instance
+--
+--     * @SDL_WINDOW_METAL@: window usable with a Metal instance
+--
+--     * @SDL_WINDOW_TRANSPARENT@: window with transparent buffer
+--
+--     * @SDL_WINDOW_NOT_FOCUSABLE@: window should not be focusable
+--
+--     The 'SDL_Window' will be shown if SDL_WINDOW_HIDDEN is not set. If hidden at creation time, @'showWindow'@ can be used to show it later.
+--
+--     On Apple\'s macOS, you __must__ set the NSHighResolutionCapable Info.plist property to YES, otherwise you will not receive a High-DPI OpenGL canvas.
+--
+--     The window pixel size may differ from its window coordinate size if the window is on a high pixel density display. Use @'getWindowSize'@ to query the client area\'s size in window coordinates, and @'getWindowSizeInPixels'@ or 'SDL3.Sys.Render.getRenderOutputSize' to query the drawable size in pixels. Note that the drawable size can vary after the window is created and should be queried again if you get an SDL_EVENT_WINDOW_PIXEL_SIZE_CHANGED event.
+--
+--     If the window is created with any of the SDL_WINDOW_OPENGL or SDL_WINDOW_VULKAN flags, then the corresponding LoadLibrary function (SDL_GL_LoadLibrary or SDL_Vulkan_LoadLibrary) is called and the corresponding UnloadLibrary function is called by @'destroyWindow'@.
+--
+--     If SDL_WINDOW_VULKAN is specified and there isn\'t a working Vulkan driver, @'createWindow'@ will fail, because 'SDL3.Sys.Vulkan.vulkanLoadLibrary' will fail.
+--
+--     If SDL_WINDOW_METAL is specified on an OS that does not support Metal, @'createWindow'@ will fail.
+--
+--     If you intend to use this window with an SDL_Renderer, you should use 'SDL3.Sys.Render.createWindowAndRenderer' instead of this function, to avoid window flicker.
+--
+--     On non-Apple devices, SDL requires you to either not link to the Vulkan loader or link to a dynamic library version. This limitation may be removed in a future version of SDL.
+--
+--     [Returns]: the window that was created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Render.createWindowAndRenderer', 'createPopupWindow', 'createWindowWithProperties', 'destroyWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateWindow@.
+--                   The unsafe flavor is 'createWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreateWindow@, defined at @SDL3\/SDL_video.h 1184:42@
+createWindowSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the title of the window, in UTF-8 encoding.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the window.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the window.
+  -> SDL_WindowFlags
+  -- ^
+  --
+  --           [@flags@]: 0, or one or more 'SDL_WindowFlags' OR\'d together.
+  -> IO (BG.Ptr SDL_Window)
+createWindowSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          Safe.sDL_CreateWindow x00 (Coerce.coerce x11) (Coerce.coerce x22) x33
+
+-- | Create a child popup window of the specified parent window.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     The flags parameter __must__ contain at least one of the following:
+--
+--     * @SDL_WINDOW_TOOLTIP@: The popup window is a tooltip and will not pass any input events.
+--
+--     * @SDL_WINDOW_POPUP_MENU@: The popup window is a popup menu. The topmost popup menu will implicitly gain the keyboard focus.
+--
+--     The following flags are not relevant to popup window creation and will be ignored:
+--
+--     * @SDL_WINDOW_MINIMIZED@
+--
+--     * @SDL_WINDOW_MAXIMIZED@
+--
+--     * @SDL_WINDOW_FULLSCREEN@
+--
+--     * @SDL_WINDOW_BORDERLESS@
+--
+--     The following flags are incompatible with popup window creation and will cause it to fail:
+--
+--     * @SDL_WINDOW_UTILITY@
+--
+--     * @SDL_WINDOW_MODAL@
+--
+--     The parent parameter __must__ be non-null and a valid window. The parent of a popup window can be either a regular, toplevel window, or another popup window.
+--
+--     Popup windows cannot be minimized, maximized, made fullscreen, raised, flash, be made a modal window, be the parent of a toplevel window, or grab the mouse and\/or keyboard. Attempts to do so will fail.
+--
+--     Popup windows implicitly do not have a border\/decorations and do not appear on the taskbar\/dock or in lists of windows such as alt-tab menus.
+--
+--     By default, popup window positions will automatically be constrained to keep the entire window within display bounds. This can be overridden with the @'sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN'@ property.
+--
+--     By default, popup menus will automatically grab keyboard focus from the parent when shown. This behavior can be overridden by setting the @SDL_WINDOW_NOT_FOCUSABLE@ flag, setting the @'sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN'@ property to false, or toggling it after creation via the @'setWindowFocusable'@ function.
+--
+--     If a parent window is hidden or destroyed, any child popup windows will be recursively hidden or destroyed as well. Child popup windows not explicitly hidden will be restored when the parent is shown.
+--
+--     [Returns]: the window that was created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createWindow', 'createWindowWithProperties', 'destroyWindow', 'getWindowParent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreatePopupWindow@.
+--                   The safe flavor is 'createPopupWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreatePopupWindow@, defined at @SDL3\/SDL_video.h 1260:42@
+createPopupWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@parent@]: the parent of the window, must not be NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@offset_x@]: the x position of the popup window relative to the origin of the parent.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@offset_y@]: the y position of the popup window relative to the origin of the parent window.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the window.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the window.
+  -> SDL_WindowFlags
+  -- ^
+  --
+  --           [@flags@]: SDL_WINDOW_TOOLTIP or SDL_WINDOW_POPUP_MENU, and zero or more additional 'SDL_WindowFlags' OR\'d together.
+  -> IO (BG.Ptr SDL_Window)
+createPopupWindow =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              Unsafe.sDL_CreatePopupWindow
+                x00
+                (Coerce.coerce x11)
+                (Coerce.coerce x22)
+                (Coerce.coerce x33)
+                (Coerce.coerce x44)
+                x55
+
+-- | Create a child popup window of the specified parent window.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     The flags parameter __must__ contain at least one of the following:
+--
+--     * @SDL_WINDOW_TOOLTIP@: The popup window is a tooltip and will not pass any input events.
+--
+--     * @SDL_WINDOW_POPUP_MENU@: The popup window is a popup menu. The topmost popup menu will implicitly gain the keyboard focus.
+--
+--     The following flags are not relevant to popup window creation and will be ignored:
+--
+--     * @SDL_WINDOW_MINIMIZED@
+--
+--     * @SDL_WINDOW_MAXIMIZED@
+--
+--     * @SDL_WINDOW_FULLSCREEN@
+--
+--     * @SDL_WINDOW_BORDERLESS@
+--
+--     The following flags are incompatible with popup window creation and will cause it to fail:
+--
+--     * @SDL_WINDOW_UTILITY@
+--
+--     * @SDL_WINDOW_MODAL@
+--
+--     The parent parameter __must__ be non-null and a valid window. The parent of a popup window can be either a regular, toplevel window, or another popup window.
+--
+--     Popup windows cannot be minimized, maximized, made fullscreen, raised, flash, be made a modal window, be the parent of a toplevel window, or grab the mouse and\/or keyboard. Attempts to do so will fail.
+--
+--     Popup windows implicitly do not have a border\/decorations and do not appear on the taskbar\/dock or in lists of windows such as alt-tab menus.
+--
+--     By default, popup window positions will automatically be constrained to keep the entire window within display bounds. This can be overridden with the @'sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN'@ property.
+--
+--     By default, popup menus will automatically grab keyboard focus from the parent when shown. This behavior can be overridden by setting the @SDL_WINDOW_NOT_FOCUSABLE@ flag, setting the @'sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN'@ property to false, or toggling it after creation via the @'setWindowFocusable'@ function.
+--
+--     If a parent window is hidden or destroyed, any child popup windows will be recursively hidden or destroyed as well. Child popup windows not explicitly hidden will be restored when the parent is shown.
+--
+--     [Returns]: the window that was created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createWindow', 'createWindowWithProperties', 'destroyWindow', 'getWindowParent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreatePopupWindow@.
+--                   The unsafe flavor is 'createPopupWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_CreatePopupWindow@, defined at @SDL3\/SDL_video.h 1260:42@
+createPopupWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@parent@]: the parent of the window, must not be NULL.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@offset_x@]: the x position of the popup window relative to the origin of the parent.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@offset_y@]: the y position of the popup window relative to the origin of the parent window.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the window.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the window.
+  -> SDL_WindowFlags
+  -- ^
+  --
+  --           [@flags@]: SDL_WINDOW_TOOLTIP or SDL_WINDOW_POPUP_MENU, and zero or more additional 'SDL_WindowFlags' OR\'d together.
+  -> IO (BG.Ptr SDL_Window)
+createPopupWindowSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            \x55 ->
+              Safe.sDL_CreatePopupWindow
+                x00
+                (Coerce.coerce x11)
+                (Coerce.coerce x22)
+                (Coerce.coerce x33)
+                (Coerce.coerce x44)
+                x55
+
+-- | Create a window with the specified properties.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN'@: true if the window should be always on top
+--
+--     * @'sDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN'@: true if the window has no window decoration
+--
+--     * @'sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN'@: true if the \"tooltip\" and \"menu\" window types should be automatically constrained to be entirely within display bounds (default), false if no constraints on the position are desired.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN'@: true if the window will be used with an externally managed graphics context.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN'@: true if the window should accept keyboard input (defaults true)
+--
+--     * @'sDL_PROP_WINDOW_CREATE_FULLSCREEN_BOOLEAN'@: true if the window should start in fullscreen mode at desktop resolution
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER'@: the height of the window
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN'@: true if the window should start hidden
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HIGH_PIXEL_DENSITY_BOOLEAN'@: true if the window uses a high pixel density buffer if possible
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MAXIMIZED_BOOLEAN'@: true if the window should start maximized
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MENU_BOOLEAN'@: true if the window is a popup menu
+--
+--     * @'sDL_PROP_WINDOW_CREATE_METAL_BOOLEAN'@: true if the window will be used with Metal rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MINIMIZED_BOOLEAN'@: true if the window should start minimized
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MODAL_BOOLEAN'@: true if the window is modal to its parent
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MOUSE_GRABBED_BOOLEAN'@: true if the window starts with grabbed mouse focus
+--
+--     * @'sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN'@: true if the window will be used with OpenGL rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_PARENT_POINTER'@: an 'SDL_Window' that will be the parent of this window, required for windows with the \"tooltip\", \"menu\", and \"modal\" properties
+--
+--     * @'sDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN'@: true if the window should be resizable
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TITLE_STRING'@: the title of the window, in UTF-8 encoding
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TRANSPARENT_BOOLEAN'@: true if the window show transparent in the areas with alpha of 0
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TOOLTIP_BOOLEAN'@: true if the window is a tooltip
+--
+--     * @'sDL_PROP_WINDOW_CREATE_UTILITY_BOOLEAN'@: true if the window is a utility window, not showing in the task bar and window list
+--
+--     * @'sDL_PROP_WINDOW_CREATE_VULKAN_BOOLEAN'@: true if the window will be used with Vulkan rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIDTH_NUMBER'@: the width of the window
+--
+--     * @'sDL_PROP_WINDOW_CREATE_X_NUMBER'@: the x position of the window, or @'sDL_WINDOWPOS_CENTERED'@, defaults to @'sDL_WINDOWPOS_UNDEFINED'@. This is relative to the parent for windows with the \"tooltip\" or \"menu\" property set.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_Y_NUMBER'@: the y position of the window, or @'sDL_WINDOWPOS_CENTERED'@, defaults to @'sDL_WINDOWPOS_UNDEFINED'@. This is relative to the parent for windows with the \"tooltip\" or \"menu\" property set.
+--
+--     These are additional supported properties on macOS:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER'@: the @(__unsafe_unretained)@ NSWindow associated with the window, if you want to wrap an existing window.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER'@: the @(__unsafe_unretained)@ NSView associated with the window, defaults to @[window contentView]@
+--
+--     These are additional supported properties on iOS, tvOS, and visionOS:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER'@: the @(__unsafe_unretained)@ UIWindowScene associated with the window, defaults to the active window scene.
+--
+--     These are additional supported properties on Wayland:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN'@ - true if the application wants to use the Wayland surface for a custom role and does not want it attached to an XDG toplevel window. See [README-wayland](README-wayland) for more information on using custom surfaces.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN'@ - true if the application wants an associated @wl_egl_window@ object to be created and attached to the window, even if the window does not have the OpenGL property or @SDL_WINDOW_OPENGL@ flag set.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER'@ - the wl_surface associated with the window, if you want to wrap an existing window. See [README-wayland](README-wayland) for more information.
+--
+--     These are additional supported properties on Windows:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER'@: the HWND associated with the window, if you want to wrap an existing window.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER'@: optional, another window to share pixel format with, useful for OpenGL windows
+--
+--     These are additional supported properties with X11:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER'@: the X11 Window associated with the window, if you want to wrap an existing window.
+--
+--     The window is implicitly shown if the \"hidden\" property is not set.
+--
+--     These are additional supported properties with Emscripten:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING'@: the id given to the canvas element. This should start with a \'\#\' sign
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING'@: override the binding element for keyboard inputs for this canvas. The variable can be one of:
+--
+--     * \"\#window\": the javascript window object (default)
+--
+--     * \"\#document\": the javascript document object
+--
+--     * \"\#screen\": the javascript window.screen object
+--
+--     * \"\#canvas\": the WebGL canvas element
+--
+--     * \"\#none\": Don\'t bind anything at all
+--
+--     * any other string without a leading \# sign applies to the element on the page with that ID. Windows with the \"tooltip\" and \"menu\" properties are popup windows and have the behaviors and guidelines outlined in @'createPopupWindow'@.
+--
+--     If this window is being created to be used with an SDL_Renderer, you should not add a graphics API specific property (@'sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN'@, etc), as SDL will handle that internally when it chooses a renderer. However, SDL might need to recreate your window at that point, which may cause the window to appear briefly, and then flicker as it is recreated. The correct approach to this is to create the window with the @'sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN'@ property set to true, then create the renderer, then show the window with @'showWindow'@.
+--
+--     [Returns]: the window that was created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Properties.createProperties', 'createWindow', 'destroyWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_CreateWindowWithProperties@.
+--                   The safe flavor is 'createWindowWithPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_CreateWindowWithProperties@, defined at @SDL3\/SDL_video.h 1409:42@
+createWindowWithProperties
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Window)
+createWindowWithProperties =
+  Unsafe.sDL_CreateWindowWithProperties
+
+-- | Create a window with the specified properties.
+--
+--     The window size is a request and may be different than expected based on the desktop layout and window manager policies. Your application should be prepared to handle a window of any size.
+--
+--     These are the supported properties:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_ALWAYS_ON_TOP_BOOLEAN'@: true if the window should be always on top
+--
+--     * @'sDL_PROP_WINDOW_CREATE_BORDERLESS_BOOLEAN'@: true if the window has no window decoration
+--
+--     * @'sDL_PROP_WINDOW_CREATE_CONSTRAIN_POPUP_BOOLEAN'@: true if the \"tooltip\" and \"menu\" window types should be automatically constrained to be entirely within display bounds (default), false if no constraints on the position are desired.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EXTERNAL_GRAPHICS_CONTEXT_BOOLEAN'@: true if the window will be used with an externally managed graphics context.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_FOCUSABLE_BOOLEAN'@: true if the window should accept keyboard input (defaults true)
+--
+--     * @'sDL_PROP_WINDOW_CREATE_FULLSCREEN_BOOLEAN'@: true if the window should start in fullscreen mode at desktop resolution
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HEIGHT_NUMBER'@: the height of the window
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN'@: true if the window should start hidden
+--
+--     * @'sDL_PROP_WINDOW_CREATE_HIGH_PIXEL_DENSITY_BOOLEAN'@: true if the window uses a high pixel density buffer if possible
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MAXIMIZED_BOOLEAN'@: true if the window should start maximized
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MENU_BOOLEAN'@: true if the window is a popup menu
+--
+--     * @'sDL_PROP_WINDOW_CREATE_METAL_BOOLEAN'@: true if the window will be used with Metal rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MINIMIZED_BOOLEAN'@: true if the window should start minimized
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MODAL_BOOLEAN'@: true if the window is modal to its parent
+--
+--     * @'sDL_PROP_WINDOW_CREATE_MOUSE_GRABBED_BOOLEAN'@: true if the window starts with grabbed mouse focus
+--
+--     * @'sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN'@: true if the window will be used with OpenGL rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_PARENT_POINTER'@: an 'SDL_Window' that will be the parent of this window, required for windows with the \"tooltip\", \"menu\", and \"modal\" properties
+--
+--     * @'sDL_PROP_WINDOW_CREATE_RESIZABLE_BOOLEAN'@: true if the window should be resizable
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TITLE_STRING'@: the title of the window, in UTF-8 encoding
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TRANSPARENT_BOOLEAN'@: true if the window show transparent in the areas with alpha of 0
+--
+--     * @'sDL_PROP_WINDOW_CREATE_TOOLTIP_BOOLEAN'@: true if the window is a tooltip
+--
+--     * @'sDL_PROP_WINDOW_CREATE_UTILITY_BOOLEAN'@: true if the window is a utility window, not showing in the task bar and window list
+--
+--     * @'sDL_PROP_WINDOW_CREATE_VULKAN_BOOLEAN'@: true if the window will be used with Vulkan rendering
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIDTH_NUMBER'@: the width of the window
+--
+--     * @'sDL_PROP_WINDOW_CREATE_X_NUMBER'@: the x position of the window, or @'sDL_WINDOWPOS_CENTERED'@, defaults to @'sDL_WINDOWPOS_UNDEFINED'@. This is relative to the parent for windows with the \"tooltip\" or \"menu\" property set.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_Y_NUMBER'@: the y position of the window, or @'sDL_WINDOWPOS_CENTERED'@, defaults to @'sDL_WINDOWPOS_UNDEFINED'@. This is relative to the parent for windows with the \"tooltip\" or \"menu\" property set.
+--
+--     These are additional supported properties on macOS:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_COCOA_WINDOW_POINTER'@: the @(__unsafe_unretained)@ NSWindow associated with the window, if you want to wrap an existing window.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_COCOA_VIEW_POINTER'@: the @(__unsafe_unretained)@ NSView associated with the window, defaults to @[window contentView]@
+--
+--     These are additional supported properties on iOS, tvOS, and visionOS:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WINDOWSCENE_POINTER'@: the @(__unsafe_unretained)@ UIWindowScene associated with the window, defaults to the active window scene.
+--
+--     These are additional supported properties on Wayland:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_SURFACE_ROLE_CUSTOM_BOOLEAN'@ - true if the application wants to use the Wayland surface for a custom role and does not want it attached to an XDG toplevel window. See [README-wayland](README-wayland) for more information on using custom surfaces.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_CREATE_EGL_WINDOW_BOOLEAN'@ - true if the application wants an associated @wl_egl_window@ object to be created and attached to the window, even if the window does not have the OpenGL property or @SDL_WINDOW_OPENGL@ flag set.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WAYLAND_WL_SURFACE_POINTER'@ - the wl_surface associated with the window, if you want to wrap an existing window. See [README-wayland](README-wayland) for more information.
+--
+--     These are additional supported properties on Windows:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIN32_HWND_POINTER'@: the HWND associated with the window, if you want to wrap an existing window.
+--
+--     * @'sDL_PROP_WINDOW_CREATE_WIN32_PIXEL_FORMAT_HWND_POINTER'@: optional, another window to share pixel format with, useful for OpenGL windows
+--
+--     These are additional supported properties with X11:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_X11_WINDOW_NUMBER'@: the X11 Window associated with the window, if you want to wrap an existing window.
+--
+--     The window is implicitly shown if the \"hidden\" property is not set.
+--
+--     These are additional supported properties with Emscripten:
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_CANVAS_ID_STRING'@: the id given to the canvas element. This should start with a \'\#\' sign
+--
+--     * @'sDL_PROP_WINDOW_CREATE_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING'@: override the binding element for keyboard inputs for this canvas. The variable can be one of:
+--
+--     * \"\#window\": the javascript window object (default)
+--
+--     * \"\#document\": the javascript document object
+--
+--     * \"\#screen\": the javascript window.screen object
+--
+--     * \"\#canvas\": the WebGL canvas element
+--
+--     * \"\#none\": Don\'t bind anything at all
+--
+--     * any other string without a leading \# sign applies to the element on the page with that ID. Windows with the \"tooltip\" and \"menu\" properties are popup windows and have the behaviors and guidelines outlined in @'createPopupWindow'@.
+--
+--     If this window is being created to be used with an SDL_Renderer, you should not add a graphics API specific property (@'sDL_PROP_WINDOW_CREATE_OPENGL_BOOLEAN'@, etc), as SDL will handle that internally when it chooses a renderer. However, SDL might need to recreate your window at that point, which may cause the window to appear briefly, and then flicker as it is recreated. The correct approach to this is to create the window with the @'sDL_PROP_WINDOW_CREATE_HIDDEN_BOOLEAN'@ property set to true, then create the renderer, then show the window with @'showWindow'@.
+--
+--     [Returns]: the window that was created or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Properties.createProperties', 'createWindow', 'destroyWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_CreateWindowWithProperties@.
+--                   The unsafe flavor is 'createWindowWithProperties'
+--                   .
+--
+--     [C declaration]: @SDL_CreateWindowWithProperties@, defined at @SDL3\/SDL_video.h 1409:42@
+createWindowWithPropertiesSafe
+  :: SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+  -- ^
+  --
+  --           [@props@]: the properties to use.
+  -> IO (BG.Ptr SDL_Window)
+createWindowWithPropertiesSafe =
+  Safe.sDL_CreateWindowWithProperties
+
+-- | Get the numeric ID of a window.
+--
+--     The numeric ID is what SDL_WindowEvent references, and is necessary to map these events to specific 'SDL_Window' objects.
+--
+--     [Returns]: the ID of the window on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFromID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowID@.
+--                   The safe flavor is 'getWindowIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowID@, defined at @SDL3\/SDL_video.h 1466:42@
+getWindowID
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_WindowID
+getWindowID = Unsafe.sDL_GetWindowID
+
+-- | Get the numeric ID of a window.
+--
+--     The numeric ID is what SDL_WindowEvent references, and is necessary to map these events to specific 'SDL_Window' objects.
+--
+--     [Returns]: the ID of the window on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFromID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowID@.
+--                   The unsafe flavor is 'getWindowID'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowID@, defined at @SDL3\/SDL_video.h 1466:42@
+getWindowIDSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_WindowID
+getWindowIDSafe = Safe.sDL_GetWindowID
+
+-- | Get a window from a stored ID.
+--
+--     The numeric ID is what SDL_WindowEvent references, and is necessary to map these events to specific 'SDL_Window' objects.
+--
+--     [Returns]: the window associated with @id@ or NULL if it doesn\'t exist; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowFromID@.
+--                   The safe flavor is 'getWindowFromIDSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowFromID@, defined at @SDL3\/SDL_video.h 1484:42@
+getWindowFromID
+  :: SDL_WindowID
+  -- ^
+  --
+  --           [@id@]: the ID of the window.
+  -> IO (BG.Ptr SDL_Window)
+getWindowFromID = Unsafe.sDL_GetWindowFromID
+
+-- | Get a window from a stored ID.
+--
+--     The numeric ID is what SDL_WindowEvent references, and is necessary to map these events to specific 'SDL_Window' objects.
+--
+--     [Returns]: the window associated with @id@ or NULL if it doesn\'t exist; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowID'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowFromID@.
+--                   The unsafe flavor is 'getWindowFromID'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowFromID@, defined at @SDL3\/SDL_video.h 1484:42@
+getWindowFromIDSafe
+  :: SDL_WindowID
+  -- ^
+  --
+  --           [@id@]: the ID of the window.
+  -> IO (BG.Ptr SDL_Window)
+getWindowFromIDSafe = Safe.sDL_GetWindowFromID
+
+-- | Get parent of a window.
+--
+--     [Returns]: the parent of the window on success or NULL if the window has no parent.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createPopupWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowParent@.
+--                   The safe flavor is 'getWindowParentSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowParent@, defined at @SDL3\/SDL_video.h 1499:42@
+getWindowParent
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL_Window)
+getWindowParent = Unsafe.sDL_GetWindowParent
+
+-- | Get parent of a window.
+--
+--     [Returns]: the parent of the window on success or NULL if the window has no parent.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createPopupWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowParent@.
+--                   The unsafe flavor is 'getWindowParent'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowParent@, defined at @SDL3\/SDL_video.h 1499:42@
+getWindowParentSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL_Window)
+getWindowParentSafe = Safe.sDL_GetWindowParent
+
+-- | Get the properties associated with a window.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_WINDOW_SHAPE_POINTER'@: the surface associated with a shaped window
+--
+--     * @'sDL_PROP_WINDOW_HDR_ENABLED_BOOLEAN'@: true if the window has HDR headroom above the SDR white point. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_WINDOW_SDR_WHITE_LEVEL_FLOAT'@: the value of SDR white in the SDL_COLORSPACE_SRGB_LINEAR colorspace. On Windows this corresponds to the SDR white level in scRGB colorspace, and on Apple platforms this is always 1.0 for EDR content. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_WINDOW_HDR_HEADROOM_FLOAT'@: the additional high dynamic range that can be displayed, in terms of the SDR white point. When HDR is not enabled, this will be 1.0. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     On Android:
+--
+--     * @'sDL_PROP_WINDOW_ANDROID_WINDOW_POINTER'@: the ANativeWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_ANDROID_SURFACE_POINTER'@: the EGLSurface associated with the window
+--
+--     On iOS:
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_WINDOW_POINTER'@: the @(__unsafe_unretained)@ UIWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER'@: the NSInteger tag associated with metal views on the window
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER'@: the OpenGL view\'s framebuffer object. It must be bound when rendering to the screen using OpenGL.
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER'@: the OpenGL view\'s renderbuffer object. It must be bound when 'glSwapWindow' is called.
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER'@: the OpenGL view\'s resolve framebuffer, when MSAA is used.
+--
+--     On KMS\/DRM:
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_DEVICE_INDEX_NUMBER'@: the device index associated with the window (e.g. the X in \/dev\/dri\/cardX)
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_DRM_FD_NUMBER'@: the DRM FD associated with the window
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER'@: the GBM device associated with the window
+--
+--     On macOS:
+--
+--     * @'sDL_PROP_WINDOW_COCOA_WINDOW_POINTER'@: the @(__unsafe_unretained)@ NSWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER'@: the NSInteger tag associated with metal views on the window
+--
+--     On OpenVR:
+--
+--     * @'sDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER'@: the OpenVR Overlay Handle ID for the associated overlay window.
+--
+--     On Vivante:
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER'@: the EGLNativeDisplayType associated with the window
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER'@: the EGLNativeWindowType associated with the window
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER'@: the EGLSurface associated with the window
+--
+--     On Windows:
+--
+--     * @'sDL_PROP_WINDOW_WIN32_HWND_POINTER'@: the HWND associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WIN32_HDC_POINTER'@: the HDC associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WIN32_INSTANCE_POINTER'@: the HINSTANCE associated with the window
+--
+--     On Wayland:
+--
+--     Note: The @xdg_*@ window objects do not internally persist across window show\/hide calls. They will be null if the window is hidden and must be queried each time it is shown.
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER'@: the wl_display associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER'@: the wl_surface associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER'@: the wp_viewport associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER'@: the wl_egl_window associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER'@: the xdg_surface associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER'@: the xdg_toplevel role associated with the window
+--
+--     * \'SDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_EXPORT_HANDLE_STRING\': the export handle associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_POPUP_POINTER'@: the xdg_popup role associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_POSITIONER_POINTER'@: the xdg_positioner associated with the window, in popup mode
+--
+--     On X11:
+--
+--     * @'sDL_PROP_WINDOW_X11_DISPLAY_POINTER'@: the X11 Display associated with the window
+--
+--     * @'sDL_PROP_WINDOW_X11_SCREEN_NUMBER'@: the screen number associated with the window
+--
+--     * @'sDL_PROP_WINDOW_X11_WINDOW_NUMBER'@: the X11 Window associated with the window
+--
+--     On Emscripten:
+--
+--     * @'sDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING'@: the id the canvas element will have
+--
+--     * @'sDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING'@: the keyboard element that associates keyboard events to this window
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowProperties@.
+--                   The safe flavor is 'getWindowPropertiesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowProperties@, defined at @SDL3\/SDL_video.h 1628:46@
+getWindowProperties
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getWindowProperties = Unsafe.sDL_GetWindowProperties
+
+-- | Get the properties associated with a window.
+--
+--     The following read-only properties are provided by SDL:
+--
+--     * @'sDL_PROP_WINDOW_SHAPE_POINTER'@: the surface associated with a shaped window
+--
+--     * @'sDL_PROP_WINDOW_HDR_ENABLED_BOOLEAN'@: true if the window has HDR headroom above the SDR white point. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_WINDOW_SDR_WHITE_LEVEL_FLOAT'@: the value of SDR white in the SDL_COLORSPACE_SRGB_LINEAR colorspace. On Windows this corresponds to the SDR white level in scRGB colorspace, and on Apple platforms this is always 1.0 for EDR content. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     * @'sDL_PROP_WINDOW_HDR_HEADROOM_FLOAT'@: the additional high dynamic range that can be displayed, in terms of the SDR white point. When HDR is not enabled, this will be 1.0. This property can change dynamically when SDL_EVENT_WINDOW_HDR_STATE_CHANGED is sent.
+--
+--     On Android:
+--
+--     * @'sDL_PROP_WINDOW_ANDROID_WINDOW_POINTER'@: the ANativeWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_ANDROID_SURFACE_POINTER'@: the EGLSurface associated with the window
+--
+--     On iOS:
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_WINDOW_POINTER'@: the @(__unsafe_unretained)@ UIWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_METAL_VIEW_TAG_NUMBER'@: the NSInteger tag associated with metal views on the window
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_FRAMEBUFFER_NUMBER'@: the OpenGL view\'s framebuffer object. It must be bound when rendering to the screen using OpenGL.
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_RENDERBUFFER_NUMBER'@: the OpenGL view\'s renderbuffer object. It must be bound when 'glSwapWindow' is called.
+--
+--     * @'sDL_PROP_WINDOW_UIKIT_OPENGL_RESOLVE_FRAMEBUFFER_NUMBER'@: the OpenGL view\'s resolve framebuffer, when MSAA is used.
+--
+--     On KMS\/DRM:
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_DEVICE_INDEX_NUMBER'@: the device index associated with the window (e.g. the X in \/dev\/dri\/cardX)
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_DRM_FD_NUMBER'@: the DRM FD associated with the window
+--
+--     * @'sDL_PROP_WINDOW_KMSDRM_GBM_DEVICE_POINTER'@: the GBM device associated with the window
+--
+--     On macOS:
+--
+--     * @'sDL_PROP_WINDOW_COCOA_WINDOW_POINTER'@: the @(__unsafe_unretained)@ NSWindow associated with the window
+--
+--     * @'sDL_PROP_WINDOW_COCOA_METAL_VIEW_TAG_NUMBER'@: the NSInteger tag associated with metal views on the window
+--
+--     On OpenVR:
+--
+--     * @'sDL_PROP_WINDOW_OPENVR_OVERLAY_ID_NUMBER'@: the OpenVR Overlay Handle ID for the associated overlay window.
+--
+--     On Vivante:
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_DISPLAY_POINTER'@: the EGLNativeDisplayType associated with the window
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_WINDOW_POINTER'@: the EGLNativeWindowType associated with the window
+--
+--     * @'sDL_PROP_WINDOW_VIVANTE_SURFACE_POINTER'@: the EGLSurface associated with the window
+--
+--     On Windows:
+--
+--     * @'sDL_PROP_WINDOW_WIN32_HWND_POINTER'@: the HWND associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WIN32_HDC_POINTER'@: the HDC associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WIN32_INSTANCE_POINTER'@: the HINSTANCE associated with the window
+--
+--     On Wayland:
+--
+--     Note: The @xdg_*@ window objects do not internally persist across window show\/hide calls. They will be null if the window is hidden and must be queried each time it is shown.
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_DISPLAY_POINTER'@: the wl_display associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_SURFACE_POINTER'@: the wl_surface associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_VIEWPORT_POINTER'@: the wp_viewport associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_EGL_WINDOW_POINTER'@: the wl_egl_window associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_SURFACE_POINTER'@: the xdg_surface associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_POINTER'@: the xdg_toplevel role associated with the window
+--
+--     * \'SDL_PROP_WINDOW_WAYLAND_XDG_TOPLEVEL_EXPORT_HANDLE_STRING\': the export handle associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_POPUP_POINTER'@: the xdg_popup role associated with the window
+--
+--     * @'sDL_PROP_WINDOW_WAYLAND_XDG_POSITIONER_POINTER'@: the xdg_positioner associated with the window, in popup mode
+--
+--     On X11:
+--
+--     * @'sDL_PROP_WINDOW_X11_DISPLAY_POINTER'@: the X11 Display associated with the window
+--
+--     * @'sDL_PROP_WINDOW_X11_SCREEN_NUMBER'@: the screen number associated with the window
+--
+--     * @'sDL_PROP_WINDOW_X11_WINDOW_NUMBER'@: the X11 Window associated with the window
+--
+--     On Emscripten:
+--
+--     * @'sDL_PROP_WINDOW_EMSCRIPTEN_CANVAS_ID_STRING'@: the id the canvas element will have
+--
+--     * @'sDL_PROP_WINDOW_EMSCRIPTEN_KEYBOARD_ELEMENT_STRING'@: the keyboard element that associates keyboard events to this window
+--
+--     [Returns]: a valid property ID on success or 0 on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowProperties@.
+--                   The unsafe flavor is 'getWindowProperties'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowProperties@, defined at @SDL3\/SDL_video.h 1628:46@
+getWindowPropertiesSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL3.Sys.Bindgen.Properties.SDL_PropertiesID
+getWindowPropertiesSafe =
+  Safe.sDL_GetWindowProperties
+
+-- | Get the window flags.
+--
+--     [Returns]: a mask of the 'SDL_WindowFlags' associated with @window@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createWindow', 'hideWindow', 'maximizeWindow', 'minimizeWindow', 'setWindowFullscreen', 'setWindowMouseGrab', 'setWindowFillDocument', 'showWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowFlags@.
+--                   The safe flavor is 'getWindowFlagsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowFlags@, defined at @SDL3\/SDL_video.h 1687:45@
+getWindowFlags
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_WindowFlags
+getWindowFlags = Unsafe.sDL_GetWindowFlags
+
+-- | Get the window flags.
+--
+--     [Returns]: a mask of the 'SDL_WindowFlags' associated with @window@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createWindow', 'hideWindow', 'maximizeWindow', 'minimizeWindow', 'setWindowFullscreen', 'setWindowMouseGrab', 'setWindowFillDocument', 'showWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowFlags@.
+--                   The unsafe flavor is 'getWindowFlags'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowFlags@, defined at @SDL3\/SDL_video.h 1687:45@
+getWindowFlagsSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_WindowFlags
+getWindowFlagsSafe = Safe.sDL_GetWindowFlags
+
+-- | Set the title of a window.
+--
+--     This string is expected to be in UTF-8 encoding.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowTitle'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowTitle@.
+--                   The safe flavor is 'setWindowTitleSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowTitle@, defined at @SDL3\/SDL_video.h 1705:34@
+setWindowTitle
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the desired window title in UTF-8 format.
+  -> IO Bool
+setWindowTitle =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowTitle x00 x11)
+
+-- | Set the title of a window.
+--
+--     This string is expected to be in UTF-8 encoding.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowTitle'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowTitle@.
+--                   The unsafe flavor is 'setWindowTitle'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowTitle@, defined at @SDL3\/SDL_video.h 1705:34@
+setWindowTitleSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@title@]: the desired window title in UTF-8 format.
+  -> IO Bool
+setWindowTitleSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowTitle x00 x11)
+
+-- | Get the title of a window.
+--
+--     [Returns]: the title of the window in UTF-8 format or \"\" if there is no title.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowTitle'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowTitle@.
+--                   The safe flavor is 'getWindowTitleSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowTitle@, defined at @SDL3\/SDL_video.h 1720:42@
+getWindowTitle
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getWindowTitle = Unsafe.sDL_GetWindowTitle
+
+-- | Get the title of a window.
+--
+--     [Returns]: the title of the window in UTF-8 format or \"\" if there is no title.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowTitle'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowTitle@.
+--                   The unsafe flavor is 'getWindowTitle'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowTitle@, defined at @SDL3\/SDL_video.h 1720:42@
+getWindowTitleSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst BG.CChar)
+getWindowTitleSafe = Safe.sDL_GetWindowTitle
+
+-- | Set the icon for a window.
+--
+--     If this function is passed a surface with alternate representations added using 'SDL3.Sys.Surface.addSurfaceAlternateImage', the surface will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations. For example, if the original surface is 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Surface.addSurfaceAlternateImage'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowIcon@.
+--                   The safe flavor is 'setWindowIconSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowIcon@, defined at @SDL3\/SDL_video.h 1747:34@
+setWindowIcon
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: an SDL_Surface structure containing the icon for the window.
+  -> IO Bool
+setWindowIcon =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowIcon x00 x11)
+
+-- | Set the icon for a window.
+--
+--     If this function is passed a surface with alternate representations added using 'SDL3.Sys.Surface.addSurfaceAlternateImage', the surface will be interpreted as the content to be used for 100% display scale, and the alternate representations will be used for high DPI situations. For example, if the original surface is 32x32, then on a 2x macOS display or 200% display scale on Windows, a 64x64 version of the image will be used, if available. If a matching version of the image isn\'t available, the closest larger size image will be downscaled to the appropriate size and be used instead, if available. Otherwise, the closest smaller image will be upscaled and be used instead.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Surface.addSurfaceAlternateImage'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowIcon@.
+--                   The unsafe flavor is 'setWindowIcon'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowIcon@, defined at @SDL3\/SDL_video.h 1747:34@
+setWindowIconSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@icon@]: an SDL_Surface structure containing the icon for the window.
+  -> IO Bool
+setWindowIconSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowIcon x00 x11)
+
+-- | Request that the window\'s position be set.
+--
+--     If the window is in an exclusive fullscreen or maximized state, this request has no effect.
+--
+--     This can be used to reposition fullscreen-desktop windows onto a different display, however, as exclusive fullscreen windows are locked to a specific display, they can only be repositioned programmatically via @'setWindowFullscreenMode'@.
+--
+--     On some windowing systems this request is asynchronous and the new coordinates may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window position changes, an SDL_EVENT_WINDOW_MOVED event will be emitted with the window\'s new coordinates. Note that the new coordinates may not match the exact coordinates requested, as some windowing systems can restrict the position of the window in certain scenarios (e.g. constraining the position so the window is always within desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowPosition', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowPosition@.
+--                   The safe flavor is 'setWindowPositionSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowPosition@, defined at @SDL3\/SDL_video.h 1788:34@
+setWindowPosition
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to reposition.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the window, or @'sDL_WINDOWPOS_CENTERED'@ or @'sDL_WINDOWPOS_UNDEFINED'@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the window, or @'sDL_WINDOWPOS_CENTERED'@ or @'sDL_WINDOWPOS_UNDEFINED'@.
+  -> IO Bool
+setWindowPosition =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetWindowPosition x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Request that the window\'s position be set.
+--
+--     If the window is in an exclusive fullscreen or maximized state, this request has no effect.
+--
+--     This can be used to reposition fullscreen-desktop windows onto a different display, however, as exclusive fullscreen windows are locked to a specific display, they can only be repositioned programmatically via @'setWindowFullscreenMode'@.
+--
+--     On some windowing systems this request is asynchronous and the new coordinates may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window position changes, an SDL_EVENT_WINDOW_MOVED event will be emitted with the window\'s new coordinates. Note that the new coordinates may not match the exact coordinates requested, as some windowing systems can restrict the position of the window in certain scenarios (e.g. constraining the position so the window is always within desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowPosition', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowPosition@.
+--                   The unsafe flavor is 'setWindowPosition'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowPosition@, defined at @SDL3\/SDL_video.h 1788:34@
+setWindowPositionSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to reposition.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the window, or @'sDL_WINDOWPOS_CENTERED'@ or @'sDL_WINDOWPOS_UNDEFINED'@.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the window, or @'sDL_WINDOWPOS_CENTERED'@ or @'sDL_WINDOWPOS_UNDEFINED'@.
+  -> IO Bool
+setWindowPositionSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetWindowPosition x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Get the position of a window.
+--
+--     This is the current position of the window as last reported by the windowing system.
+--
+--     If you do not need the value for one of the positions a NULL may be passed in the @x@ or @y@ parameter.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowPosition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowPosition@.
+--                   The safe flavor is 'getWindowPositionSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowPosition@, defined at @SDL3\/SDL_video.h 1813:34@
+getWindowPosition
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@x@]: a pointer filled in with the x position of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@y@]: a pointer filled in with the y position of the window, may be NULL.
+  -> IO Bool
+getWindowPosition =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetWindowPosition x00 x11 x22)
+
+-- | Get the position of a window.
+--
+--     This is the current position of the window as last reported by the windowing system.
+--
+--     If you do not need the value for one of the positions a NULL may be passed in the @x@ or @y@ parameter.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowPosition'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowPosition@.
+--                   The unsafe flavor is 'getWindowPosition'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowPosition@, defined at @SDL3\/SDL_video.h 1813:34@
+getWindowPositionSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@x@]: a pointer filled in with the x position of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@y@]: a pointer filled in with the y position of the window, may be NULL.
+  -> IO Bool
+getWindowPositionSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetWindowPosition x00 x11 x22)
+
+-- | Request that the size of a window\'s client area be set.
+--
+--     If the window is in a fullscreen or maximized state, this request has no effect.
+--
+--     To change the exclusive fullscreen mode of a window, use @'setWindowFullscreenMode'@.
+--
+--     On some windowing systems, this request is asynchronous and the new window size may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window size changes, an SDL_EVENT_WINDOW_RESIZED event will be emitted with the new window dimensions. Note that the new dimensions may not match the exact size requested, as some windowing systems can restrict the window size in certain scenarios (e.g. constraining the size of the content area to remain within the usable desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSize', 'setWindowFullscreenMode', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowSize@.
+--                   The safe flavor is 'setWindowSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowSize@, defined at @SDL3\/SDL_video.h 1850:34@
+setWindowSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the window, must be > 0.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the window, must be > 0.
+  -> IO Bool
+setWindowSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetWindowSize x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Request that the size of a window\'s client area be set.
+--
+--     If the window is in a fullscreen or maximized state, this request has no effect.
+--
+--     To change the exclusive fullscreen mode of a window, use @'setWindowFullscreenMode'@.
+--
+--     On some windowing systems, this request is asynchronous and the new window size may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window size changes, an SDL_EVENT_WINDOW_RESIZED event will be emitted with the new window dimensions. Note that the new dimensions may not match the exact size requested, as some windowing systems can restrict the window size in certain scenarios (e.g. constraining the size of the content area to remain within the usable desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSize', 'setWindowFullscreenMode', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowSize@.
+--                   The unsafe flavor is 'setWindowSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowSize@, defined at @SDL3\/SDL_video.h 1850:34@
+setWindowSizeSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@w@]: the width of the window, must be > 0.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@h@]: the height of the window, must be > 0.
+  -> IO Bool
+setWindowSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetWindowSize x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Get the size of a window\'s client area.
+--
+--     The window pixel size may differ from its window coordinate size if the window is on a high pixel density display. Use @'getWindowSizeInPixels'@ or 'SDL3.Sys.Render.getRenderOutputSize' to get the real client area size in pixels.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Render.getRenderOutputSize', 'getWindowSizeInPixels', 'setWindowSize', SDL_EVENT_WINDOW_RESIZED
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowSize@.
+--                   The safe flavor is 'getWindowSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowSize@, defined at @SDL3\/SDL_video.h 1874:34@
+getWindowSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the width and height from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height of the window, may be NULL.
+  -> IO Bool
+getWindowSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetWindowSize x00 x11 x22)
+
+-- | Get the size of a window\'s client area.
+--
+--     The window pixel size may differ from its window coordinate size if the window is on a high pixel density display. Use @'getWindowSizeInPixels'@ or 'SDL3.Sys.Render.getRenderOutputSize' to get the real client area size in pixels.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'SDL3.Sys.Render.getRenderOutputSize', 'getWindowSizeInPixels', 'setWindowSize', SDL_EVENT_WINDOW_RESIZED
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowSize@.
+--                   The unsafe flavor is 'getWindowSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowSize@, defined at @SDL3\/SDL_video.h 1874:34@
+getWindowSizeSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the width and height from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the height of the window, may be NULL.
+  -> IO Bool
+getWindowSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetWindowSize x00 x11 x22)
+
+-- | Get the safe area for this window.
+--
+--     Some devices have portions of the screen which are partially obscured or not interactive, possibly due to on-screen controls, curved edges, camera notches, TV overscan, etc. This function provides the area of the window which is safe to have interactable content. You should continue rendering into the rest of the window, but it should not contain visually important or interactable content.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowSafeArea@.
+--                   The safe flavor is 'getWindowSafeAreaSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowSafeArea@, defined at @SDL3\/SDL_video.h 1896:34@
+getWindowSafeArea
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the client area that is safe for interactive content.
+  -> IO Bool
+getWindowSafeArea =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetWindowSafeArea x00 x11)
+
+-- | Get the safe area for this window.
+--
+--     Some devices have portions of the screen which are partially obscured or not interactive, possibly due to on-screen controls, curved edges, camera notches, TV overscan, etc. This function provides the area of the window which is safe to have interactable content. You should continue rendering into the rest of the window, but it should not contain visually important or interactable content.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowSafeArea@.
+--                   The unsafe flavor is 'getWindowSafeArea'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowSafeArea@, defined at @SDL3\/SDL_video.h 1896:34@
+getWindowSafeAreaSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a pointer filled in with the client area that is safe for interactive content.
+  -> IO Bool
+getWindowSafeAreaSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetWindowSafeArea x00 x11)
+
+-- | Request that the aspect ratio of a window\'s client area be set.
+--
+--     The aspect ratio is the ratio of width divided by height, e.g. 2560x1600 would be 1.6. Larger aspect ratios are wider and smaller aspect ratios are narrower.
+--
+--     If, at the time of this request, the window in a fixed-size state, such as maximized or fullscreen, the request will be deferred until the window exits this state and becomes resizable again.
+--
+--     On some windowing systems, this request is asynchronous and the new window aspect ratio may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window size changes, an SDL_EVENT_WINDOW_RESIZED event will be emitted with the new window dimensions. Note that the new dimensions may not match the exact aspect ratio requested, as some windowing systems can restrict the window size in certain scenarios (e.g. constraining the size of the content area to remain within the usable desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowAspectRatio', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowAspectRatio@.
+--                   The safe flavor is 'setWindowAspectRatioSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowAspectRatio@, defined at @SDL3\/SDL_video.h 1937:34@
+setWindowAspectRatio
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> Float
+  -- ^
+  --
+  --           [@min_aspect@]: the minimum aspect ratio of the window, or 0.0f for no limit.
+  -> Float
+  -- ^
+  --
+  --           [@max_aspect@]: the maximum aspect ratio of the window, or 0.0f for no limit.
+  -> IO Bool
+setWindowAspectRatio =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetWindowAspectRatio x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Request that the aspect ratio of a window\'s client area be set.
+--
+--     The aspect ratio is the ratio of width divided by height, e.g. 2560x1600 would be 1.6. Larger aspect ratios are wider and smaller aspect ratios are narrower.
+--
+--     If, at the time of this request, the window in a fixed-size state, such as maximized or fullscreen, the request will be deferred until the window exits this state and becomes resizable again.
+--
+--     On some windowing systems, this request is asynchronous and the new window aspect ratio may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window size changes, an SDL_EVENT_WINDOW_RESIZED event will be emitted with the new window dimensions. Note that the new dimensions may not match the exact aspect ratio requested, as some windowing systems can restrict the window size in certain scenarios (e.g. constraining the size of the content area to remain within the usable desktop bounds). Additionally, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowAspectRatio', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowAspectRatio@.
+--                   The unsafe flavor is 'setWindowAspectRatio'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowAspectRatio@, defined at @SDL3\/SDL_video.h 1937:34@
+setWindowAspectRatioSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> Float
+  -- ^
+  --
+  --           [@min_aspect@]: the minimum aspect ratio of the window, or 0.0f for no limit.
+  -> Float
+  -- ^
+  --
+  --           [@max_aspect@]: the maximum aspect ratio of the window, or 0.0f for no limit.
+  -> IO Bool
+setWindowAspectRatioSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetWindowAspectRatio x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Get the aspect ratio of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowAspectRatio'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowAspectRatio@.
+--                   The safe flavor is 'getWindowAspectRatioSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowAspectRatio@, defined at @SDL3\/SDL_video.h 1956:34@
+getWindowAspectRatio
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the width and height from.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@min_aspect@]: a pointer filled in with the minimum aspect ratio of the window, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@max_aspect@]: a pointer filled in with the maximum aspect ratio of the window, may be NULL.
+  -> IO Bool
+getWindowAspectRatio =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetWindowAspectRatio x00 x11 x22)
+
+-- | Get the aspect ratio of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowAspectRatio'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowAspectRatio@.
+--                   The unsafe flavor is 'getWindowAspectRatio'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowAspectRatio@, defined at @SDL3\/SDL_video.h 1956:34@
+getWindowAspectRatioSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the width and height from.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@min_aspect@]: a pointer filled in with the minimum aspect ratio of the window, may be NULL.
+  -> BG.Ptr BG.CFloat
+  -- ^
+  --
+  --           [@max_aspect@]: a pointer filled in with the maximum aspect ratio of the window, may be NULL.
+  -> IO Bool
+getWindowAspectRatioSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetWindowAspectRatio x00 x11 x22)
+
+-- | Get the size of a window\'s borders (decorations) around the client area.
+--
+--     Note: If this function fails (returns false), the size values will be initialized to 0, 0, 0, 0 (if a non-NULL pointer is provided), as if the window in question was borderless.
+--
+--     Note: This function may fail on systems where the window has not yet been decorated by the display server (for example, immediately after calling SDL_CreateWindow). It is recommended that you wait at least until the window has been presented and composited, so that the window system has a chance to decorate the window and provide the border dimensions to SDL.
+--
+--     This function also returns false if getting the information is not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowBordersSize@.
+--                   The safe flavor is 'getWindowBordersSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowBordersSize@, defined at @SDL3\/SDL_video.h 1993:34@
+getWindowBordersSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the size values of the border (decorations) from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@top@]: pointer to variable for storing the size of the top border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@left@]: pointer to variable for storing the size of the left border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@bottom@]: pointer to variable for storing the size of the bottom border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@right@]: pointer to variable for storing the size of the right border; NULL is permitted.
+  -> IO Bool
+getWindowBordersSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Unsafe.sDL_GetWindowBordersSize x00 x11 x22 x33 x44)
+
+-- | Get the size of a window\'s borders (decorations) around the client area.
+--
+--     Note: If this function fails (returns false), the size values will be initialized to 0, 0, 0, 0 (if a non-NULL pointer is provided), as if the window in question was borderless.
+--
+--     Note: This function may fail on systems where the window has not yet been decorated by the display server (for example, immediately after calling SDL_CreateWindow). It is recommended that you wait at least until the window has been presented and composited, so that the window system has a chance to decorate the window and provide the border dimensions to SDL.
+--
+--     This function also returns false if getting the information is not supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowBordersSize@.
+--                   The unsafe flavor is 'getWindowBordersSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowBordersSize@, defined at @SDL3\/SDL_video.h 1993:34@
+getWindowBordersSizeSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query the size values of the border (decorations) from.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@top@]: pointer to variable for storing the size of the top border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@left@]: pointer to variable for storing the size of the left border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@bottom@]: pointer to variable for storing the size of the bottom border; NULL is permitted.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@right@]: pointer to variable for storing the size of the right border; NULL is permitted.
+  -> IO Bool
+getWindowBordersSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          \x44 ->
+            fmap CBool.toBool (Safe.sDL_GetWindowBordersSize x00 x11 x22 x33 x44)
+
+-- | Get the size of a window\'s client area, in pixels.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createWindow', 'getWindowSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowSizeInPixels@.
+--                   The safe flavor is 'getWindowSizeInPixelsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowSizeInPixels@, defined at @SDL3\/SDL_video.h 2013:34@
+getWindowSizeInPixels
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window from which the drawable size should be queried.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer to variable for storing the width in pixels, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer to variable for storing the height in pixels, may be NULL.
+  -> IO Bool
+getWindowSizeInPixels =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetWindowSizeInPixels x00 x11 x22)
+
+-- | Get the size of a window\'s client area, in pixels.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createWindow', 'getWindowSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowSizeInPixels@.
+--                   The unsafe flavor is 'getWindowSizeInPixels'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowSizeInPixels@, defined at @SDL3\/SDL_video.h 2013:34@
+getWindowSizeInPixelsSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window from which the drawable size should be queried.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer to variable for storing the width in pixels, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer to variable for storing the height in pixels, may be NULL.
+  -> IO Bool
+getWindowSizeInPixelsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetWindowSizeInPixels x00 x11 x22)
+
+-- | Set the minimum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMinimumSize', 'setWindowMaximumSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowMinimumSize@.
+--                   The safe flavor is 'setWindowMinimumSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowMinimumSize@, defined at @SDL3\/SDL_video.h 2031:34@
+setWindowMinimumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@min_w@]: the minimum width of the window, or 0 for no limit.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@min_h@]: the minimum height of the window, or 0 for no limit.
+  -> IO Bool
+setWindowMinimumSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetWindowMinimumSize x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Set the minimum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMinimumSize', 'setWindowMaximumSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowMinimumSize@.
+--                   The unsafe flavor is 'setWindowMinimumSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowMinimumSize@, defined at @SDL3\/SDL_video.h 2031:34@
+setWindowMinimumSizeSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@min_w@]: the minimum width of the window, or 0 for no limit.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@min_h@]: the minimum height of the window, or 0 for no limit.
+  -> IO Bool
+setWindowMinimumSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetWindowMinimumSize x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Get the minimum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMaximumSize', 'setWindowMinimumSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowMinimumSize@.
+--                   The safe flavor is 'getWindowMinimumSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowMinimumSize@, defined at @SDL3\/SDL_video.h 2051:34@
+getWindowMinimumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the minimum width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the minimum height of the window, may be NULL.
+  -> IO Bool
+getWindowMinimumSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetWindowMinimumSize x00 x11 x22)
+
+-- | Get the minimum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMaximumSize', 'setWindowMinimumSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowMinimumSize@.
+--                   The unsafe flavor is 'getWindowMinimumSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowMinimumSize@, defined at @SDL3\/SDL_video.h 2051:34@
+getWindowMinimumSizeSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the minimum width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the minimum height of the window, may be NULL.
+  -> IO Bool
+getWindowMinimumSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetWindowMinimumSize x00 x11 x22)
+
+-- | Set the maximum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMaximumSize', 'setWindowMinimumSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowMaximumSize@.
+--                   The safe flavor is 'setWindowMaximumSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowMaximumSize@, defined at @SDL3\/SDL_video.h 2069:34@
+setWindowMaximumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@max_w@]: the maximum width of the window, or 0 for no limit.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@max_h@]: the maximum height of the window, or 0 for no limit.
+  -> IO Bool
+setWindowMaximumSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetWindowMaximumSize x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Set the maximum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMaximumSize', 'setWindowMinimumSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowMaximumSize@.
+--                   The unsafe flavor is 'setWindowMaximumSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowMaximumSize@, defined at @SDL3\/SDL_video.h 2069:34@
+setWindowMaximumSizeSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@max_w@]: the maximum width of the window, or 0 for no limit.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@max_h@]: the maximum height of the window, or 0 for no limit.
+  -> IO Bool
+setWindowMaximumSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetWindowMaximumSize x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Get the maximum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMinimumSize', 'setWindowMaximumSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowMaximumSize@.
+--                   The safe flavor is 'getWindowMaximumSizeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowMaximumSize@, defined at @SDL3\/SDL_video.h 2089:34@
+getWindowMaximumSize
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the maximum width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the maximum height of the window, may be NULL.
+  -> IO Bool
+getWindowMaximumSize =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_GetWindowMaximumSize x00 x11 x22)
+
+-- | Get the maximum size of a window\'s client area.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMinimumSize', 'setWindowMaximumSize'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowMaximumSize@.
+--                   The unsafe flavor is 'getWindowMaximumSize'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowMaximumSize@, defined at @SDL3\/SDL_video.h 2089:34@
+getWindowMaximumSizeSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@w@]: a pointer filled in with the maximum width of the window, may be NULL.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@h@]: a pointer filled in with the maximum height of the window, may be NULL.
+  -> IO Bool
+getWindowMaximumSizeSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_GetWindowMaximumSize x00 x11 x22)
+
+-- | Set the border state of a window.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_BORDERLESS@ flag and add or remove the border from the actual window. This is a no-op if the window\'s border already matches the requested state.
+--
+--     You can\'t change the border state of a fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFlags'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowBordered@.
+--                   The safe flavor is 'setWindowBorderedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowBordered@, defined at @SDL3\/SDL_video.h 2111:34@
+setWindowBordered
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the border state.
+  -> Bool
+  -- ^
+  --
+  --           [@bordered@]: false to remove border, true to add border.
+  -> IO Bool
+setWindowBordered =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowBordered x00 (CBool.fromBool x11))
+
+-- | Set the border state of a window.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_BORDERLESS@ flag and add or remove the border from the actual window. This is a no-op if the window\'s border already matches the requested state.
+--
+--     You can\'t change the border state of a fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFlags'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowBordered@.
+--                   The unsafe flavor is 'setWindowBordered'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowBordered@, defined at @SDL3\/SDL_video.h 2111:34@
+setWindowBorderedSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the border state.
+  -> Bool
+  -- ^
+  --
+  --           [@bordered@]: false to remove border, true to add border.
+  -> IO Bool
+setWindowBorderedSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowBordered x00 (CBool.fromBool x11))
+
+-- | Set the user-resizable state of a window.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_RESIZABLE@ flag and allow\/disallow user resizing of the window. This is a no-op if the window\'s resizable state already matches the requested state.
+--
+--     You can\'t change the resizable state of a fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFlags'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowResizable@.
+--                   The safe flavor is 'setWindowResizableSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowResizable@, defined at @SDL3\/SDL_video.h 2133:34@
+setWindowResizable
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the resizable state.
+  -> Bool
+  -- ^
+  --
+  --           [@resizable@]: true to allow resizing, false to disallow.
+  -> IO Bool
+setWindowResizable =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowResizable x00 (CBool.fromBool x11))
+
+-- | Set the user-resizable state of a window.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_RESIZABLE@ flag and allow\/disallow user resizing of the window. This is a no-op if the window\'s resizable state already matches the requested state.
+--
+--     You can\'t change the resizable state of a fullscreen window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFlags'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowResizable@.
+--                   The unsafe flavor is 'setWindowResizable'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowResizable@, defined at @SDL3\/SDL_video.h 2133:34@
+setWindowResizableSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the resizable state.
+  -> Bool
+  -- ^
+  --
+  --           [@resizable@]: true to allow resizing, false to disallow.
+  -> IO Bool
+setWindowResizableSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowResizable x00 (CBool.fromBool x11))
+
+-- | Set the window to always be above the others.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_ALWAYS_ON_TOP@ flag. This will bring the window to the front and keep the window above the rest.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFlags'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowAlwaysOnTop@.
+--                   The safe flavor is 'setWindowAlwaysOnTopSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowAlwaysOnTop@, defined at @SDL3\/SDL_video.h 2152:34@
+setWindowAlwaysOnTop
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the always on top state.
+  -> Bool
+  -- ^
+  --
+  --           [@on_top@]: true to set the window always on top, false to disable.
+  -> IO Bool
+setWindowAlwaysOnTop =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowAlwaysOnTop x00 (CBool.fromBool x11))
+
+-- | Set the window to always be above the others.
+--
+--     This will add or remove the window\'s @SDL_WINDOW_ALWAYS_ON_TOP@ flag. This will bring the window to the front and keep the window above the rest.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFlags'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowAlwaysOnTop@.
+--                   The unsafe flavor is 'setWindowAlwaysOnTop'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowAlwaysOnTop@, defined at @SDL3\/SDL_video.h 2152:34@
+setWindowAlwaysOnTopSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the always on top state.
+  -> Bool
+  -- ^
+  --
+  --           [@on_top@]: true to set the window always on top, false to disable.
+  -> IO Bool
+setWindowAlwaysOnTopSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowAlwaysOnTop x00 (CBool.fromBool x11))
+
+-- | Set the window to fill the current document space (Emscripten only).
+--
+--     This will add or remove the window\'s @SDL_WINDOW_FILL_DOCUMENT@ flag.
+--
+--     Currently this flag only applies to the Emscripten target.
+--
+--     When enabled, the canvas element fills the entire document. Resize events will be generated as the browser window is resized, as that will adjust the canvas size as well. The canvas will cover anything else on the page, including any controls provided by Emscripten in its generated HTML file (in fact, any elements on the page that aren\'t the canvas will be moved into a hidden @div@ element).
+--
+--     Often times this is desirable for a browser-based game, but it means several things that we expect of an SDL window on other platforms might not work as expected, such as minimum window sizes and aspect ratios.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'getWindowFlags'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowFillDocument@.
+--                   The safe flavor is 'setWindowFillDocumentSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowFillDocument@, defined at @SDL3\/SDL_video.h 2183:34@
+setWindowFillDocument
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the fill-document state.
+  -> Bool
+  -- ^
+  --
+  --           [@fill@]: true to set the window to fill the document, false to disable.
+  -> IO Bool
+setWindowFillDocument =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowFillDocument x00 (CBool.fromBool x11))
+
+-- | Set the window to fill the current document space (Emscripten only).
+--
+--     This will add or remove the window\'s @SDL_WINDOW_FILL_DOCUMENT@ flag.
+--
+--     Currently this flag only applies to the Emscripten target.
+--
+--     When enabled, the canvas element fills the entire document. Resize events will be generated as the browser window is resized, as that will adjust the canvas size as well. The canvas will cover anything else on the page, including any controls provided by Emscripten in its generated HTML file (in fact, any elements on the page that aren\'t the canvas will be moved into a hidden @div@ element).
+--
+--     Often times this is desirable for a browser-based game, but it means several things that we expect of an SDL window on other platforms might not work as expected, such as minimum window sizes and aspect ratios.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     [See also]: 'getWindowFlags'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowFillDocument@.
+--                   The unsafe flavor is 'setWindowFillDocument'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowFillDocument@, defined at @SDL3\/SDL_video.h 2183:34@
+setWindowFillDocumentSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window of which to change the fill-document state.
+  -> Bool
+  -- ^
+  --
+  --           [@fill@]: true to set the window to fill the document, false to disable.
+  -> IO Bool
+setWindowFillDocumentSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowFillDocument x00 (CBool.fromBool x11))
+
+-- | Show a window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hideWindow', 'raiseWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ShowWindow@.
+--                   The safe flavor is 'showWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowWindow@, defined at @SDL3\/SDL_video.h 2199:34@
+showWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to show.
+  -> IO Bool
+showWindow =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_ShowWindow x00)
+
+-- | Show a window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'hideWindow', 'raiseWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShowWindow@.
+--                   The unsafe flavor is 'showWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowWindow@, defined at @SDL3\/SDL_video.h 2199:34@
+showWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to show.
+  -> IO Bool
+showWindowSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_ShowWindow x00)
+
+-- | Hide a window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'showWindow', @SDL_WINDOW_HIDDEN@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_HideWindow@.
+--                   The safe flavor is 'hideWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HideWindow@, defined at @SDL3\/SDL_video.h 2215:34@
+hideWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to hide.
+  -> IO Bool
+hideWindow =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_HideWindow x00)
+
+-- | Hide a window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'showWindow', @SDL_WINDOW_HIDDEN@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_HideWindow@.
+--                   The unsafe flavor is 'hideWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_HideWindow@, defined at @SDL3\/SDL_video.h 2215:34@
+hideWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to hide.
+  -> IO Bool
+hideWindowSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_HideWindow x00)
+
+-- | Request that a window be raised above other windows and gain the input focus.
+--
+--     The result of this request is subject to desktop window manager policy, particularly if raising the requested window would result in stealing focus from another application. If the window is successfully raised and gains input focus, an SDL_EVENT_WINDOW_FOCUS_GAINED event will be emitted, and the window will have the SDL_WINDOW_INPUT_FOCUS flag set.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RaiseWindow@.
+--                   The safe flavor is 'raiseWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RaiseWindow@, defined at @SDL3\/SDL_video.h 2235:34@
+raiseWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to raise.
+  -> IO Bool
+raiseWindow =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_RaiseWindow x00)
+
+-- | Request that a window be raised above other windows and gain the input focus.
+--
+--     The result of this request is subject to desktop window manager policy, particularly if raising the requested window would result in stealing focus from another application. If the window is successfully raised and gains input focus, an SDL_EVENT_WINDOW_FOCUS_GAINED event will be emitted, and the window will have the SDL_WINDOW_INPUT_FOCUS flag set.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RaiseWindow@.
+--                   The unsafe flavor is 'raiseWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RaiseWindow@, defined at @SDL3\/SDL_video.h 2235:34@
+raiseWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to raise.
+  -> IO Bool
+raiseWindowSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_RaiseWindow x00)
+
+-- | Request that the window be made as large as possible.
+--
+--     Non-resizable windows can\'t be maximized. The window must have the SDL_WINDOW_RESIZABLE flag set, or this will have no effect.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_MAXIMIZED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     When maximizing a window, whether the constraints set via @'setWindowMaximumSize'@ are honored depends on the policy of the window manager. Win32 and macOS enforce the constraints when maximizing, while X11 and Wayland window managers may vary.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'minimizeWindow', 'restoreWindow', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MaximizeWindow@.
+--                   The safe flavor is 'maximizeWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MaximizeWindow@, defined at @SDL3\/SDL_video.h 2269:34@
+maximizeWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to maximize.
+  -> IO Bool
+maximizeWindow =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_MaximizeWindow x00)
+
+-- | Request that the window be made as large as possible.
+--
+--     Non-resizable windows can\'t be maximized. The window must have the SDL_WINDOW_RESIZABLE flag set, or this will have no effect.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_MAXIMIZED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     When maximizing a window, whether the constraints set via @'setWindowMaximumSize'@ are honored depends on the policy of the window manager. Win32 and macOS enforce the constraints when maximizing, while X11 and Wayland window managers may vary.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'minimizeWindow', 'restoreWindow', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MaximizeWindow@.
+--                   The unsafe flavor is 'maximizeWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MaximizeWindow@, defined at @SDL3\/SDL_video.h 2269:34@
+maximizeWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to maximize.
+  -> IO Bool
+maximizeWindowSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_MaximizeWindow x00)
+
+-- | Request that the window be minimized to an iconic representation.
+--
+--     If the window is in a fullscreen state, this request has no direct effect. It may alter the state the window is returned to when leaving fullscreen.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_MINIMIZED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'maximizeWindow', 'restoreWindow', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_MinimizeWindow@.
+--                   The safe flavor is 'minimizeWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MinimizeWindow@, defined at @SDL3\/SDL_video.h 2298:34@
+minimizeWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to minimize.
+  -> IO Bool
+minimizeWindow =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_MinimizeWindow x00)
+
+-- | Request that the window be minimized to an iconic representation.
+--
+--     If the window is in a fullscreen state, this request has no direct effect. It may alter the state the window is returned to when leaving fullscreen.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_MINIMIZED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'maximizeWindow', 'restoreWindow', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_MinimizeWindow@.
+--                   The unsafe flavor is 'minimizeWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_MinimizeWindow@, defined at @SDL3\/SDL_video.h 2298:34@
+minimizeWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to minimize.
+  -> IO Bool
+minimizeWindowSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_MinimizeWindow x00)
+
+-- | Request that the size and position of a minimized or maximized window be restored.
+--
+--     If the window is in a fullscreen state, this request has no direct effect. It may alter the state the window is returned to when leaving fullscreen.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_RESTORED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'maximizeWindow', 'minimizeWindow', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_RestoreWindow@.
+--                   The safe flavor is 'restoreWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RestoreWindow@, defined at @SDL3\/SDL_video.h 2328:34@
+restoreWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to restore.
+  -> IO Bool
+restoreWindow =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_RestoreWindow x00)
+
+-- | Request that the size and position of a minimized or maximized window be restored.
+--
+--     If the window is in a fullscreen state, this request has no direct effect. It may alter the state the window is returned to when leaving fullscreen.
+--
+--     On some windowing systems this request is asynchronous and the new window state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_RESTORED event will be emitted. Note that, as this is just a request, the windowing system can deny the state change.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'maximizeWindow', 'minimizeWindow', 'syncWindow'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_RestoreWindow@.
+--                   The unsafe flavor is 'restoreWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_RestoreWindow@, defined at @SDL3\/SDL_video.h 2328:34@
+restoreWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to restore.
+  -> IO Bool
+restoreWindowSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_RestoreWindow x00)
+
+-- | Request that the window\'s fullscreen state be changed.
+--
+--     By default a window in fullscreen state uses borderless fullscreen desktop mode, but a specific exclusive display mode can be set using @'setWindowFullscreenMode'@.
+--
+--     On some windowing systems this request is asynchronous and the new fullscreen state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_ENTER_FULLSCREEN or SDL_EVENT_WINDOW_LEAVE_FULLSCREEN event will be emitted. Note that, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFullscreenMode', 'setWindowFullscreenMode', 'syncWindow', @SDL_WINDOW_FULLSCREEN@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowFullscreen@.
+--                   The safe flavor is 'setWindowFullscreenSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowFullscreen@, defined at @SDL3\/SDL_video.h 2360:34@
+setWindowFullscreen
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> Bool
+  -- ^
+  --
+  --           [@fullscreen@]: true for fullscreen mode, false for windowed mode.
+  -> IO Bool
+setWindowFullscreen =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowFullscreen x00 (CBool.fromBool x11))
+
+-- | Request that the window\'s fullscreen state be changed.
+--
+--     By default a window in fullscreen state uses borderless fullscreen desktop mode, but a specific exclusive display mode can be set using @'setWindowFullscreenMode'@.
+--
+--     On some windowing systems this request is asynchronous and the new fullscreen state may not have have been applied immediately upon the return of this function. If an immediate change is required, call @'syncWindow'@ to block until the changes have taken effect.
+--
+--     When the window state changes, an SDL_EVENT_WINDOW_ENTER_FULLSCREEN or SDL_EVENT_WINDOW_LEAVE_FULLSCREEN event will be emitted. Note that, as this is just a request, it can be denied by the windowing system.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowFullscreenMode', 'setWindowFullscreenMode', 'syncWindow', @SDL_WINDOW_FULLSCREEN@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowFullscreen@.
+--                   The unsafe flavor is 'setWindowFullscreen'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowFullscreen@, defined at @SDL3\/SDL_video.h 2360:34@
+setWindowFullscreenSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> Bool
+  -- ^
+  --
+  --           [@fullscreen@]: true for fullscreen mode, false for windowed mode.
+  -> IO Bool
+setWindowFullscreenSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowFullscreen x00 (CBool.fromBool x11))
+
+-- | Block until any pending window state is finalized.
+--
+--     On asynchronous windowing systems, this acts as a synchronization barrier for pending window state. It will attempt to wait until any pending window state has been applied and is guaranteed to return within finite time. Note that for how long it can potentially block depends on the underlying window system, as window state changes may involve somewhat lengthy animations that must complete before the window is in its final requested state.
+--
+--     On windowing systems where changes are immediate, this does nothing.
+--
+--     [Returns]: true on success or false if the operation timed out before the window was in the requested state.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowSize', 'setWindowPosition', 'setWindowFullscreen', 'minimizeWindow', 'maximizeWindow', 'restoreWindow', SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SyncWindow@.
+--                   The safe flavor is 'syncWindowSafe'
+--                   : blocks until pending window state settles (up to a timeout).
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SyncWindow@, defined at @SDL3\/SDL_video.h 2391:34@
+syncWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to wait for the pending state to be applied.
+  -> IO Bool
+syncWindow =
+  \x00 -> fmap CBool.toBool (Unsafe.sDL_SyncWindow x00)
+
+-- | Block until any pending window state is finalized.
+--
+--     On asynchronous windowing systems, this acts as a synchronization barrier for pending window state. It will attempt to wait until any pending window state has been applied and is guaranteed to return within finite time. Note that for how long it can potentially block depends on the underlying window system, as window state changes may involve somewhat lengthy animations that must complete before the window is in its final requested state.
+--
+--     On windowing systems where changes are immediate, this does nothing.
+--
+--     [Returns]: true on success or false if the operation timed out before the window was in the requested state.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowSize', 'setWindowPosition', 'setWindowFullscreen', 'minimizeWindow', 'maximizeWindow', 'restoreWindow', SDL_HINT_VIDEO_SYNC_WINDOW_OPERATIONS
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SyncWindow@.
+--                   The unsafe flavor is 'syncWindow'
+--                   : blocks until pending window state settles (up to a timeout).
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SyncWindow@, defined at @SDL3\/SDL_video.h 2391:34@
+syncWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which to wait for the pending state to be applied.
+  -> IO Bool
+syncWindowSafe =
+  \x00 -> fmap CBool.toBool (Safe.sDL_SyncWindow x00)
+
+-- | Return whether the window has a surface associated with it.
+--
+--     [Returns]: true if there is a surface associated with the window, or false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_WindowHasSurface@.
+--                   The safe flavor is 'windowHasSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WindowHasSurface@, defined at @SDL3\/SDL_video.h 2406:34@
+windowHasSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Bool
+windowHasSurface =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_WindowHasSurface x00)
+
+-- | Return whether the window has a surface associated with it.
+--
+--     [Returns]: true if there is a surface associated with the window, or false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_WindowHasSurface@.
+--                   The unsafe flavor is 'windowHasSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_WindowHasSurface@, defined at @SDL3\/SDL_video.h 2406:34@
+windowHasSurfaceSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Bool
+windowHasSurfaceSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_WindowHasSurface x00)
+
+-- | Get the SDL surface associated with the window.
+--
+--     A new surface will be created with the optimal format for the window, if necessary. This surface will be freed when the window is destroyed. Do not free this surface.
+--
+--     This surface will be invalidated if the window is resized. After resizing a window this function must be called again to return a valid surface.
+--
+--     You may not combine this with 3D or the rendering API on this window.
+--
+--     This function is affected by @SDL_HINT_FRAMEBUFFER_ACCELERATION@.
+--
+--     [Returns]: the surface associated with the window, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyWindowSurface', 'windowHasSurface', 'updateWindowSurface', 'updateWindowSurfaceRects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowSurface@.
+--                   The safe flavor is 'getWindowSurfaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowSurface@, defined at @SDL3\/SDL_video.h 2435:43@
+getWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+getWindowSurface = Unsafe.sDL_GetWindowSurface
+
+-- | Get the SDL surface associated with the window.
+--
+--     A new surface will be created with the optimal format for the window, if necessary. This surface will be freed when the window is destroyed. Do not free this surface.
+--
+--     This surface will be invalidated if the window is resized. After resizing a window this function must be called again to return a valid surface.
+--
+--     You may not combine this with 3D or the rendering API on this window.
+--
+--     This function is affected by @SDL_HINT_FRAMEBUFFER_ACCELERATION@.
+--
+--     [Returns]: the surface associated with the window, or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'destroyWindowSurface', 'windowHasSurface', 'updateWindowSurface', 'updateWindowSurfaceRects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowSurface@.
+--                   The unsafe flavor is 'getWindowSurface'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowSurface@, defined at @SDL3\/SDL_video.h 2435:43@
+getWindowSurfaceSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface)
+getWindowSurfaceSafe = Safe.sDL_GetWindowSurface
+
+-- | Toggle VSync for the window surface.
+--
+--     When a window surface is created, vsync defaults to SDL_WINDOW_SURFACE_VSYNC_DISABLED.
+--
+--     The @vsync@ parameter can be 1 to synchronize present with every vertical refresh, 2 to synchronize present with every second vertical refresh, etc., SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or SDL_WINDOW_SURFACE_VSYNC_DISABLED to disable. Not every value is supported by every driver, so you should check the return value to see whether the requested setting is supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSurfaceVSync'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowSurfaceVSync@.
+--                   The safe flavor is 'setWindowSurfaceVSyncSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowSurfaceVSync@, defined at @SDL3\/SDL_video.h 2461:34@
+setWindowSurfaceVSync
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@vsync@]: the vertical refresh sync interval.
+  -> IO Bool
+setWindowSurfaceVSync =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowSurfaceVSync x00 (Coerce.coerce x11))
+
+-- | Toggle VSync for the window surface.
+--
+--     When a window surface is created, vsync defaults to SDL_WINDOW_SURFACE_VSYNC_DISABLED.
+--
+--     The @vsync@ parameter can be 1 to synchronize present with every vertical refresh, 2 to synchronize present with every second vertical refresh, etc., SDL_WINDOW_SURFACE_VSYNC_ADAPTIVE for late swap tearing (adaptive vsync), or SDL_WINDOW_SURFACE_VSYNC_DISABLED to disable. Not every value is supported by every driver, so you should check the return value to see whether the requested setting is supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSurfaceVSync'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowSurfaceVSync@.
+--                   The unsafe flavor is 'setWindowSurfaceVSync'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowSurfaceVSync@, defined at @SDL3\/SDL_video.h 2461:34@
+setWindowSurfaceVSyncSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@vsync@]: the vertical refresh sync interval.
+  -> IO Bool
+setWindowSurfaceVSyncSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowSurfaceVSync x00 (Coerce.coerce x11))
+
+-- | Get VSync for the window surface.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowSurfaceVSync'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowSurfaceVSync@.
+--                   The safe flavor is 'getWindowSurfaceVSyncSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowSurfaceVSync@, defined at @SDL3\/SDL_video.h 2481:34@
+getWindowSurfaceVSync
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: an int filled with the current vertical refresh sync interval. See @'setWindowSurfaceVSync'@ for the meaning of the value.
+  -> IO Bool
+getWindowSurfaceVSync =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GetWindowSurfaceVSync x00 x11)
+
+-- | Get VSync for the window surface.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowSurfaceVSync'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowSurfaceVSync@.
+--                   The unsafe flavor is 'getWindowSurfaceVSync'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowSurfaceVSync@, defined at @SDL3\/SDL_video.h 2481:34@
+getWindowSurfaceVSyncSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@vsync@]: an int filled with the current vertical refresh sync interval. See @'setWindowSurfaceVSync'@ for the meaning of the value.
+  -> IO Bool
+getWindowSurfaceVSyncSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GetWindowSurfaceVSync x00 x11)
+
+-- | Copy the window surface to the screen.
+--
+--     This is the function you use to reflect any changes to the surface on the screen.
+--
+--     This function is equivalent to the SDL 1.2 API SDL_Flip().
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSurface', 'updateWindowSurfaceRects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UpdateWindowSurface@.
+--                   The safe flavor is 'updateWindowSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateWindowSurface@, defined at @SDL3\/SDL_video.h 2502:34@
+updateWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> IO Bool
+updateWindowSurface =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_UpdateWindowSurface x00)
+
+-- | Copy the window surface to the screen.
+--
+--     This is the function you use to reflect any changes to the surface on the screen.
+--
+--     This function is equivalent to the SDL 1.2 API SDL_Flip().
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSurface', 'updateWindowSurfaceRects'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UpdateWindowSurface@.
+--                   The unsafe flavor is 'updateWindowSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateWindowSurface@, defined at @SDL3\/SDL_video.h 2502:34@
+updateWindowSurfaceSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> IO Bool
+updateWindowSurfaceSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_UpdateWindowSurface x00)
+
+-- | Copy areas of the window surface to the screen.
+--
+--     This is the function you use to reflect changes to portions of the surface on the screen.
+--
+--     This function is equivalent to the SDL 1.2 API SDL_UpdateRects().
+--
+--     Note that this function will update /at least/ the rectangles specified, but this is only intended as an optimization; in practice, this might update more of the screen (or all of the screen!), depending on what method SDL uses to send pixels to the system.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSurface', 'updateWindowSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_UpdateWindowSurfaceRects@.
+--                   The safe flavor is 'updateWindowSurfaceRectsSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateWindowSurfaceRects@, defined at @SDL3\/SDL_video.h 2531:34@
+updateWindowSurfaceRects
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rects@]: an array of SDL_Rect structures representing areas of the surface to copy, in pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@numrects@]: the number of rectangles.
+  -> IO Bool
+updateWindowSurfaceRects =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_UpdateWindowSurfaceRects x00 x11 (Coerce.coerce x22))
+
+-- | Copy areas of the window surface to the screen.
+--
+--     This is the function you use to reflect changes to portions of the surface on the screen.
+--
+--     This function is equivalent to the SDL 1.2 API SDL_UpdateRects().
+--
+--     Note that this function will update /at least/ the rectangles specified, but this is only intended as an optimization; in practice, this might update more of the screen (or all of the screen!), depending on what method SDL uses to send pixels to the system.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSurface', 'updateWindowSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_UpdateWindowSurfaceRects@.
+--                   The unsafe flavor is 'updateWindowSurfaceRects'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_UpdateWindowSurfaceRects@, defined at @SDL3\/SDL_video.h 2531:34@
+updateWindowSurfaceRectsSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rects@]: an array of SDL_Rect structures representing areas of the surface to copy, in pixels.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@numrects@]: the number of rectangles.
+  -> IO Bool
+updateWindowSurfaceRectsSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_UpdateWindowSurfaceRects x00 x11 (Coerce.coerce x22))
+
+-- | Destroy the surface associated with the window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSurface', 'windowHasSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyWindowSurface@.
+--                   The safe flavor is 'destroyWindowSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DestroyWindowSurface@, defined at @SDL3\/SDL_video.h 2547:34@
+destroyWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> IO Bool
+destroyWindowSurface =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_DestroyWindowSurface x00)
+
+-- | Destroy the surface associated with the window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowSurface', 'windowHasSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyWindowSurface@.
+--                   The unsafe flavor is 'destroyWindowSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DestroyWindowSurface@, defined at @SDL3\/SDL_video.h 2547:34@
+destroyWindowSurfaceSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to update.
+  -> IO Bool
+destroyWindowSurfaceSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_DestroyWindowSurface x00)
+
+-- | Set a window\'s keyboard grab mode.
+--
+--     Keyboard grab enables capture of system keyboard shortcuts like Alt+Tab or the Meta\/Super key. Note that not all system keyboard shortcuts can be captured by applications (one example is Ctrl+Alt+Del on Windows).
+--
+--     This is primarily intended for specialized applications such as VNC clients or VM frontends. Normal games should not use keyboard grab.
+--
+--     When keyboard grab is enabled, SDL will continue to handle Alt+Tab when the window is full-screen to ensure the user is not trapped in your application. If you have a custom keyboard shortcut to exit fullscreen mode, you may suppress this behavior with @SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED@.
+--
+--     If the caller enables a grab while another window is currently grabbed, the other window loses its grab in favor of the caller\'s window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowKeyboardGrab', 'setWindowMouseGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowKeyboardGrab@.
+--                   The safe flavor is 'setWindowKeyboardGrabSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowKeyboardGrab@, defined at @SDL3\/SDL_video.h 2580:34@
+setWindowKeyboardGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the keyboard grab mode should be set.
+  -> Bool
+  -- ^
+  --
+  --           [@grabbed@]: this is true to grab keyboard, and false to release.
+  -> IO Bool
+setWindowKeyboardGrab =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowKeyboardGrab x00 (CBool.fromBool x11))
+
+-- | Set a window\'s keyboard grab mode.
+--
+--     Keyboard grab enables capture of system keyboard shortcuts like Alt+Tab or the Meta\/Super key. Note that not all system keyboard shortcuts can be captured by applications (one example is Ctrl+Alt+Del on Windows).
+--
+--     This is primarily intended for specialized applications such as VNC clients or VM frontends. Normal games should not use keyboard grab.
+--
+--     When keyboard grab is enabled, SDL will continue to handle Alt+Tab when the window is full-screen to ensure the user is not trapped in your application. If you have a custom keyboard shortcut to exit fullscreen mode, you may suppress this behavior with @SDL_HINT_ALLOW_ALT_TAB_WHILE_GRABBED@.
+--
+--     If the caller enables a grab while another window is currently grabbed, the other window loses its grab in favor of the caller\'s window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowKeyboardGrab', 'setWindowMouseGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowKeyboardGrab@.
+--                   The unsafe flavor is 'setWindowKeyboardGrab'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowKeyboardGrab@, defined at @SDL3\/SDL_video.h 2580:34@
+setWindowKeyboardGrabSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the keyboard grab mode should be set.
+  -> Bool
+  -- ^
+  --
+  --           [@grabbed@]: this is true to grab keyboard, and false to release.
+  -> IO Bool
+setWindowKeyboardGrabSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowKeyboardGrab x00 (CBool.fromBool x11))
+
+-- | Set a window\'s mouse grab mode.
+--
+--     Mouse grab confines the mouse cursor to the window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMouseRect', 'setWindowMouseRect', 'setWindowKeyboardGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowMouseGrab@.
+--                   The safe flavor is 'setWindowMouseGrabSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowMouseGrab@, defined at @SDL3\/SDL_video.h 2600:34@
+setWindowMouseGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the mouse grab mode should be set.
+  -> Bool
+  -- ^
+  --
+  --           [@grabbed@]: this is true to grab mouse, and false to release.
+  -> IO Bool
+setWindowMouseGrab =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowMouseGrab x00 (CBool.fromBool x11))
+
+-- | Set a window\'s mouse grab mode.
+--
+--     Mouse grab confines the mouse cursor to the window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMouseRect', 'setWindowMouseRect', 'setWindowKeyboardGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowMouseGrab@.
+--                   The unsafe flavor is 'setWindowMouseGrab'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowMouseGrab@, defined at @SDL3\/SDL_video.h 2600:34@
+setWindowMouseGrabSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the mouse grab mode should be set.
+  -> Bool
+  -- ^
+  --
+  --           [@grabbed@]: this is true to grab mouse, and false to release.
+  -> IO Bool
+setWindowMouseGrabSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowMouseGrab x00 (CBool.fromBool x11))
+
+-- | Get a window\'s keyboard grab mode.
+--
+--     [Returns]: true if keyboard is grabbed, and false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowKeyboardGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowKeyboardGrab@.
+--                   The safe flavor is 'getWindowKeyboardGrabSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowKeyboardGrab@, defined at @SDL3\/SDL_video.h 2614:34@
+getWindowKeyboardGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Bool
+getWindowKeyboardGrab =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GetWindowKeyboardGrab x00)
+
+-- | Get a window\'s keyboard grab mode.
+--
+--     [Returns]: true if keyboard is grabbed, and false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowKeyboardGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowKeyboardGrab@.
+--                   The unsafe flavor is 'getWindowKeyboardGrab'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowKeyboardGrab@, defined at @SDL3\/SDL_video.h 2614:34@
+getWindowKeyboardGrabSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Bool
+getWindowKeyboardGrabSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GetWindowKeyboardGrab x00)
+
+-- | Get a window\'s mouse grab mode.
+--
+--     [Returns]: true if mouse is grabbed, and false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMouseRect', 'setWindowMouseRect', 'setWindowMouseGrab', 'setWindowKeyboardGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowMouseGrab@.
+--                   The safe flavor is 'getWindowMouseGrabSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowMouseGrab@, defined at @SDL3\/SDL_video.h 2631:34@
+getWindowMouseGrab
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Bool
+getWindowMouseGrab =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GetWindowMouseGrab x00)
+
+-- | Get a window\'s mouse grab mode.
+--
+--     [Returns]: true if mouse is grabbed, and false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMouseRect', 'setWindowMouseRect', 'setWindowMouseGrab', 'setWindowKeyboardGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowMouseGrab@.
+--                   The unsafe flavor is 'getWindowMouseGrab'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowMouseGrab@, defined at @SDL3\/SDL_video.h 2631:34@
+getWindowMouseGrabSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO Bool
+getWindowMouseGrabSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GetWindowMouseGrab x00)
+
+-- | Get the window that currently has an input grab enabled.
+--
+--     [Returns]: the window if input is grabbed or NULL otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowMouseGrab', 'setWindowKeyboardGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetGrabbedWindow@.
+--                   The safe flavor is 'getGrabbedWindowSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetGrabbedWindow@, defined at @SDL3\/SDL_video.h 2645:42@
+getGrabbedWindow :: IO (BG.Ptr SDL_Window)
+getGrabbedWindow = Unsafe.sDL_GetGrabbedWindow
+
+-- | Get the window that currently has an input grab enabled.
+--
+--     [Returns]: the window if input is grabbed or NULL otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowMouseGrab', 'setWindowKeyboardGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetGrabbedWindow@.
+--                   The unsafe flavor is 'getGrabbedWindow'
+--                   .
+--
+--     [C declaration]: @SDL_GetGrabbedWindow@, defined at @SDL3\/SDL_video.h 2645:42@
+getGrabbedWindowSafe :: IO (BG.Ptr SDL_Window)
+getGrabbedWindowSafe = Safe.sDL_GetGrabbedWindow
+
+-- | Confines the cursor to the specified area of a window.
+--
+--     Note that this does NOT grab the cursor, it only defines the area a cursor is restricted to when the window has mouse focus.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMouseRect', 'getWindowMouseGrab', 'setWindowMouseGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowMouseRect@.
+--                   The safe flavor is 'setWindowMouseRectSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowMouseRect@, defined at @SDL3\/SDL_video.h 2667:34@
+setWindowMouseRect
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that will be associated with the barrier.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a rectangle area in window-relative coordinates. If NULL the barrier for the specified window will be destroyed.
+  -> IO Bool
+setWindowMouseRect =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowMouseRect x00 x11)
+
+-- | Confines the cursor to the specified area of a window.
+--
+--     Note that this does NOT grab the cursor, it only defines the area a cursor is restricted to when the window has mouse focus.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowMouseRect', 'getWindowMouseGrab', 'setWindowMouseGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowMouseRect@.
+--                   The unsafe flavor is 'setWindowMouseRect'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowMouseRect@, defined at @SDL3\/SDL_video.h 2667:34@
+setWindowMouseRectSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that will be associated with the barrier.
+  -> PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect
+  -- ^
+  --
+  --           [@rect@]: a rectangle area in window-relative coordinates. If NULL the barrier for the specified window will be destroyed.
+  -> IO Bool
+setWindowMouseRectSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowMouseRect x00 x11)
+
+-- | Get the mouse confinement rectangle of a window.
+--
+--     [Returns]: a pointer to the mouse confinement rectangle of a window, or NULL if there isn\'t one.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowMouseRect', 'getWindowMouseGrab', 'setWindowMouseGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowMouseRect@.
+--                   The safe flavor is 'getWindowMouseRectSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowMouseRect@, defined at @SDL3\/SDL_video.h 2684:46@
+getWindowMouseRect
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect)
+getWindowMouseRect = Unsafe.sDL_GetWindowMouseRect
+
+-- | Get the mouse confinement rectangle of a window.
+--
+--     [Returns]: a pointer to the mouse confinement rectangle of a window, or NULL if there isn\'t one.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowMouseRect', 'getWindowMouseGrab', 'setWindowMouseGrab'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowMouseRect@.
+--                   The unsafe flavor is 'getWindowMouseRect'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowMouseRect@, defined at @SDL3\/SDL_video.h 2684:46@
+getWindowMouseRectSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO (PtrConst.PtrConst SDL3.Sys.Bindgen.Rect.SDL_Rect)
+getWindowMouseRectSafe = Safe.sDL_GetWindowMouseRect
+
+-- | Set the opacity for a window.
+--
+--     The parameter @opacity@ will be clamped internally between 0.0f (transparent) and 1.0f (opaque).
+--
+--     This function also returns false if setting the opacity isn\'t supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowOpacity'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowOpacity@.
+--                   The safe flavor is 'setWindowOpacitySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowOpacity@, defined at @SDL3\/SDL_video.h 2705:34@
+setWindowOpacity
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window which will be made transparent or opaque.
+  -> Float
+  -- ^
+  --
+  --           [@opacity@]: the opacity value (0.0f - transparent, 1.0f - opaque).
+  -> IO Bool
+setWindowOpacity =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowOpacity x00 (Coerce.coerce x11))
+
+-- | Set the opacity for a window.
+--
+--     The parameter @opacity@ will be clamped internally between 0.0f (transparent) and 1.0f (opaque).
+--
+--     This function also returns false if setting the opacity isn\'t supported.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'getWindowOpacity'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowOpacity@.
+--                   The unsafe flavor is 'setWindowOpacity'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowOpacity@, defined at @SDL3\/SDL_video.h 2705:34@
+setWindowOpacitySafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window which will be made transparent or opaque.
+  -> Float
+  -- ^
+  --
+  --           [@opacity@]: the opacity value (0.0f - transparent, 1.0f - opaque).
+  -> IO Bool
+setWindowOpacitySafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowOpacity x00 (Coerce.coerce x11))
+
+-- | Get the opacity of a window.
+--
+--     If transparency isn\'t supported on this platform, opacity will be returned as 1.0f without error.
+--
+--     [Returns]: the opacity, (0.0f - transparent, 1.0f - opaque), or -1.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowOpacity'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowOpacity@.
+--                   The safe flavor is 'getWindowOpacitySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowOpacity@, defined at @SDL3\/SDL_video.h 2723:35@
+getWindowOpacity
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current opacity value from.
+  -> IO Float
+getWindowOpacity =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetWindowOpacity x00)
+
+-- | Get the opacity of a window.
+--
+--     If transparency isn\'t supported on this platform, opacity will be returned as 1.0f without error.
+--
+--     [Returns]: the opacity, (0.0f - transparent, 1.0f - opaque), or -1.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowOpacity'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowOpacity@.
+--                   The unsafe flavor is 'getWindowOpacity'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowOpacity@, defined at @SDL3\/SDL_video.h 2723:35@
+getWindowOpacitySafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current opacity value from.
+  -> IO Float
+getWindowOpacitySafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetWindowOpacity x00)
+
+-- | Set the window as a child of a parent window.
+--
+--     If the window is already the child of an existing window, it will be reparented to the new owner. Setting the parent window to NULL unparents the window and removes child window status.
+--
+--     If a parent window is hidden or destroyed, the operation will be recursively applied to child windows. Child windows hidden with the parent that did not have their hidden status explicitly set will be restored when the parent is shown.
+--
+--     Attempting to set the parent of a window that is currently in the modal state will fail. Use @'setWindowModal'@ to cancel the modal status before attempting to change the parent.
+--
+--     Popup windows cannot change parents and attempts to do so will fail.
+--
+--     Setting a parent window that is currently the sibling or descendent of the child window results in undefined behavior.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowModal'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowParent@.
+--                   The safe flavor is 'setWindowParentSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowParent@, defined at @SDL3\/SDL_video.h 2757:34@
+setWindowParent
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that should become the child of a parent.
+  -> BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@parent@]: the new parent window for the child window.
+  -> IO Bool
+setWindowParent =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowParent x00 x11)
+
+-- | Set the window as a child of a parent window.
+--
+--     If the window is already the child of an existing window, it will be reparented to the new owner. Setting the parent window to NULL unparents the window and removes child window status.
+--
+--     If a parent window is hidden or destroyed, the operation will be recursively applied to child windows. Child windows hidden with the parent that did not have their hidden status explicitly set will be restored when the parent is shown.
+--
+--     Attempting to set the parent of a window that is currently in the modal state will fail. Use @'setWindowModal'@ to cancel the modal status before attempting to change the parent.
+--
+--     Popup windows cannot change parents and attempts to do so will fail.
+--
+--     Setting a parent window that is currently the sibling or descendent of the child window results in undefined behavior.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowModal'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowParent@.
+--                   The unsafe flavor is 'setWindowParent'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowParent@, defined at @SDL3\/SDL_video.h 2757:34@
+setWindowParentSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window that should become the child of a parent.
+  -> BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@parent@]: the new parent window for the child window.
+  -> IO Bool
+setWindowParentSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowParent x00 x11)
+
+-- | Toggle the state of the window as modal.
+--
+--     To enable modal status on a window, the window must currently be the child window of a parent, or toggling modal status on will fail.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowParent', @SDL_WINDOW_MODAL@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowModal@.
+--                   The safe flavor is 'setWindowModalSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowModal@, defined at @SDL3\/SDL_video.h 2777:34@
+setWindowModal
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window on which to set the modal state.
+  -> Bool
+  -- ^
+  --
+  --           [@modal@]: true to toggle modal status on, false to toggle it off.
+  -> IO Bool
+setWindowModal =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowModal x00 (CBool.fromBool x11))
+
+-- | Toggle the state of the window as modal.
+--
+--     To enable modal status on a window, the window must currently be the child window of a parent, or toggling modal status on will fail.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'setWindowParent', @SDL_WINDOW_MODAL@
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowModal@.
+--                   The unsafe flavor is 'setWindowModal'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowModal@, defined at @SDL3\/SDL_video.h 2777:34@
+setWindowModalSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window on which to set the modal state.
+  -> Bool
+  -- ^
+  --
+  --           [@modal@]: true to toggle modal status on, false to toggle it off.
+  -> IO Bool
+setWindowModalSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowModal x00 (CBool.fromBool x11))
+
+-- | Set whether the window may have input focus.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowFocusable@.
+--                   The safe flavor is 'setWindowFocusableSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowFocusable@, defined at @SDL3\/SDL_video.h 2791:34@
+setWindowFocusable
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to set focusable state.
+  -> Bool
+  -- ^
+  --
+  --           [@focusable@]: true to allow input focus, false to not allow input focus.
+  -> IO Bool
+setWindowFocusable =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowFocusable x00 (CBool.fromBool x11))
+
+-- | Set whether the window may have input focus.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowFocusable@.
+--                   The unsafe flavor is 'setWindowFocusable'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowFocusable@, defined at @SDL3\/SDL_video.h 2791:34@
+setWindowFocusableSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to set focusable state.
+  -> Bool
+  -- ^
+  --
+  --           [@focusable@]: true to allow input focus, false to not allow input focus.
+  -> IO Bool
+setWindowFocusableSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowFocusable x00 (CBool.fromBool x11))
+
+-- | Display the system-level window menu.
+--
+--     This default window menu is provided by the system and on some platforms provides functionality for setting or changing privileged state on the window, such as moving it between workspaces or displays, or toggling the always-on-top property.
+--
+--     On platforms or desktops where this is unsupported, this function does nothing.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ShowWindowSystemMenu@.
+--                   The safe flavor is 'showWindowSystemMenuSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowWindowSystemMenu@, defined at @SDL3\/SDL_video.h 2817:34@
+showWindowSystemMenu
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the menu will be displayed.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the menu, relative to the origin (top-left) of the client area.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the menu, relative to the origin (top-left) of the client area.
+  -> IO Bool
+showWindowSystemMenu =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_ShowWindowSystemMenu x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Display the system-level window menu.
+--
+--     This default window menu is provided by the system and on some platforms provides functionality for setting or changing privileged state on the window, such as moving it between workspaces or displays, or toggling the always-on-top property.
+--
+--     On platforms or desktops where this is unsupported, this function does nothing.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ShowWindowSystemMenu@.
+--                   The unsafe flavor is 'showWindowSystemMenu'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ShowWindowSystemMenu@, defined at @SDL3\/SDL_video.h 2817:34@
+showWindowSystemMenuSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window for which the menu will be displayed.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@x@]: the x coordinate of the menu, relative to the origin (top-left) of the client area.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@y@]: the y coordinate of the menu, relative to the origin (top-left) of the client area.
+  -> IO Bool
+showWindowSystemMenuSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_ShowWindowSystemMenu x00 (Coerce.coerce x11) (Coerce.coerce x22))
+
+-- | Provide a callback that decides if a window region has special properties.
+--
+--     Normally windows are dragged and resized by decorations provided by the system window manager (a title bar, borders, etc), but for some apps, it makes sense to drag them from somewhere else inside the window itself; for example, one might have a borderless window that wants to be draggable from any part, or simulate its own title bar, etc.
+--
+--     This function lets the app provide a callback that designates pieces of a given window as special. This callback is run during event processing if we need to tell the OS to treat a region of the window specially; the use of this callback is known as \"hit testing.\"
+--
+--     Mouse input may not be delivered to your application if it is within a special area; the OS will often apply that input to moving the window or resizing the window and not deliver it to the application.
+--
+--     Specifying NULL for a callback disables hit-testing. Hit-testing is disabled by default.
+--
+--     Platforms that don\'t support this functionality will return false unconditionally, even if you\'re attempting to disable hit-testing.
+--
+--     Your callback may fire at any time, and its firing does not indicate any specific behavior (for example, on Windows, this certainly might fire when the OS is deciding whether to drag your window, but it fires for lots of other reasons, too, some unrelated to anything you probably care about /and when the mouse isn\'t actually at the location it is testing/). Since this can fire at any time, you should try to keep your callback efficient, devoid of allocations, etc.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowHitTest@.
+--                   The safe flavor is 'setWindowHitTestSafe'
+--                   : registration; the hit test runs during event pumping.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowHitTest@, defined at @SDL3\/SDL_video.h 2898:34@
+setWindowHitTest
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to set hit-testing on.
+  -> SDL_HitTest
+  -- ^
+  --
+  --           [@callback@]: the function to call when doing a hit-test.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@callback_data@]: an app-defined void pointer passed to __callback__.
+  -> IO Bool
+setWindowHitTest =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_SetWindowHitTest x00 x11 x22)
+
+-- | Provide a callback that decides if a window region has special properties.
+--
+--     Normally windows are dragged and resized by decorations provided by the system window manager (a title bar, borders, etc), but for some apps, it makes sense to drag them from somewhere else inside the window itself; for example, one might have a borderless window that wants to be draggable from any part, or simulate its own title bar, etc.
+--
+--     This function lets the app provide a callback that designates pieces of a given window as special. This callback is run during event processing if we need to tell the OS to treat a region of the window specially; the use of this callback is known as \"hit testing.\"
+--
+--     Mouse input may not be delivered to your application if it is within a special area; the OS will often apply that input to moving the window or resizing the window and not deliver it to the application.
+--
+--     Specifying NULL for a callback disables hit-testing. Hit-testing is disabled by default.
+--
+--     Platforms that don\'t support this functionality will return false unconditionally, even if you\'re attempting to disable hit-testing.
+--
+--     Your callback may fire at any time, and its firing does not indicate any specific behavior (for example, on Windows, this certainly might fire when the OS is deciding whether to drag your window, but it fires for lots of other reasons, too, some unrelated to anything you probably care about /and when the mouse isn\'t actually at the location it is testing/). Since this can fire at any time, you should try to keep your callback efficient, devoid of allocations, etc.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowHitTest@.
+--                   The unsafe flavor is 'setWindowHitTest'
+--                   : registration; the hit test runs during event pumping.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowHitTest@, defined at @SDL3\/SDL_video.h 2898:34@
+setWindowHitTestSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to set hit-testing on.
+  -> SDL_HitTest
+  -- ^
+  --
+  --           [@callback@]: the function to call when doing a hit-test.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@callback_data@]: an app-defined void pointer passed to __callback__.
+  -> IO Bool
+setWindowHitTestSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_SetWindowHitTest x00 x11 x22)
+
+-- | Set the shape of a transparent window.
+--
+--     This sets the alpha channel of a transparent window and any fully transparent areas are also transparent to mouse clicks. If you are using something besides the SDL render API, then you are responsible for drawing the alpha channel of the window to match the shape alpha channel to get consistent cross-platform results.
+--
+--     The shape is copied inside this function, so you can free it afterwards. If your shape surface changes, you should call @'setWindowShape'@ again to update the window. This is an expensive operation, so should be done sparingly.
+--
+--     The window must have been created with the SDL_WINDOW_TRANSPARENT flag.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowShape@.
+--                   The safe flavor is 'setWindowShapeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowShape@, defined at @SDL3\/SDL_video.h 2926:34@
+setWindowShape
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@shape@]: the surface representing the shape of the window, or NULL to remove any current shape.
+  -> IO Bool
+setWindowShape =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowShape x00 x11)
+
+-- | Set the shape of a transparent window.
+--
+--     This sets the alpha channel of a transparent window and any fully transparent areas are also transparent to mouse clicks. If you are using something besides the SDL render API, then you are responsible for drawing the alpha channel of the window to match the shape alpha channel to get consistent cross-platform results.
+--
+--     The shape is copied inside this function, so you can free it afterwards. If your shape surface changes, you should call @'setWindowShape'@ again to update the window. This is an expensive operation, so should be done sparingly.
+--
+--     The window must have been created with the SDL_WINDOW_TRANSPARENT flag.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowShape@.
+--                   The unsafe flavor is 'setWindowShape'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowShape@, defined at @SDL3\/SDL_video.h 2926:34@
+setWindowShapeSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window.
+  -> BG.Ptr SDL3.Sys.Bindgen.Surface.SDL_Surface
+  -- ^
+  --
+  --           [@shape@]: the surface representing the shape of the window, or NULL to remove any current shape.
+  -> IO Bool
+setWindowShapeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowShape x00 x11)
+
+-- | Request a window to demand attention from the user.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_FlashWindow@.
+--                   The safe flavor is 'flashWindowSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlashWindow@, defined at @SDL3\/SDL_video.h 2940:34@
+flashWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to be flashed.
+  -> SDL_FlashOperation
+  -- ^
+  --
+  --           [@operation@]: the operation to perform.
+  -> IO Bool
+flashWindow =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_FlashWindow x00 x11)
+
+-- | Request a window to demand attention from the user.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_FlashWindow@.
+--                   The unsafe flavor is 'flashWindow'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_FlashWindow@, defined at @SDL3\/SDL_video.h 2940:34@
+flashWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to be flashed.
+  -> SDL_FlashOperation
+  -- ^
+  --
+  --           [@operation@]: the operation to perform.
+  -> IO Bool
+flashWindowSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_FlashWindow x00 x11)
+
+-- | Sets the state of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowProgressState@.
+--                   The safe flavor is 'setWindowProgressStateSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowProgressState@, defined at @SDL3\/SDL_video.h 2955:34@
+setWindowProgressState
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window whose progress state is to be modified.
+  -> SDL_ProgressState
+  -- ^
+  --
+  --           [@state@]: the progress state. @SDL_PROGRESS_STATE_NONE@ stops displaying the progress bar.
+  -> IO Bool
+setWindowProgressState =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowProgressState x00 x11)
+
+-- | Sets the state of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowProgressState@.
+--                   The unsafe flavor is 'setWindowProgressState'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowProgressState@, defined at @SDL3\/SDL_video.h 2955:34@
+setWindowProgressStateSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window whose progress state is to be modified.
+  -> SDL_ProgressState
+  -- ^
+  --
+  --           [@state@]: the progress state. @SDL_PROGRESS_STATE_NONE@ stops displaying the progress bar.
+  -> IO Bool
+setWindowProgressStateSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowProgressState x00 x11)
+
+-- | Get the state of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: the progress state, or @SDL_PROGRESS_STATE_INVALID@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowProgressState@.
+--                   The safe flavor is 'getWindowProgressStateSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowProgressState@, defined at @SDL3\/SDL_video.h 2968:47@
+getWindowProgressState
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current progress state from.
+  -> IO SDL_ProgressState
+getWindowProgressState =
+  Unsafe.sDL_GetWindowProgressState
+
+-- | Get the state of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: the progress state, or @SDL_PROGRESS_STATE_INVALID@ on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowProgressState@.
+--                   The unsafe flavor is 'getWindowProgressState'
+--                   .
+--
+--     [C declaration]: @SDL_GetWindowProgressState@, defined at @SDL3\/SDL_video.h 2968:47@
+getWindowProgressStateSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current progress state from.
+  -> IO SDL_ProgressState
+getWindowProgressStateSafe =
+  Safe.sDL_GetWindowProgressState
+
+-- | Sets the value of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_SetWindowProgressValue@.
+--                   The safe flavor is 'setWindowProgressValueSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowProgressValue@, defined at @SDL3\/SDL_video.h 2983:34@
+setWindowProgressValue
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window whose progress value is to be modified.
+  -> Float
+  -- ^
+  --
+  --           [@value@]: the progress value in the range of [0.0f - 1.0f]. If the value is outside the valid range, it gets clamped.
+  -> IO Bool
+setWindowProgressValue =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_SetWindowProgressValue x00 (Coerce.coerce x11))
+
+-- | Sets the value of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_SetWindowProgressValue@.
+--                   The unsafe flavor is 'setWindowProgressValue'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_SetWindowProgressValue@, defined at @SDL3\/SDL_video.h 2983:34@
+setWindowProgressValueSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window whose progress value is to be modified.
+  -> Float
+  -- ^
+  --
+  --           [@value@]: the progress value in the range of [0.0f - 1.0f]. If the value is outside the valid range, it gets clamped.
+  -> IO Bool
+setWindowProgressValueSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_SetWindowProgressValue x00 (Coerce.coerce x11))
+
+-- | Get the value of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: the progress value in the range of [0.0f - 1.0f], or -1.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GetWindowProgressValue@.
+--                   The safe flavor is 'getWindowProgressValueSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowProgressValue@, defined at @SDL3\/SDL_video.h 2996:35@
+getWindowProgressValue
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current progress value from.
+  -> IO Float
+getWindowProgressValue =
+  \x00 ->
+    fmap Coerce.coerce (Unsafe.sDL_GetWindowProgressValue x00)
+
+-- | Get the value of the progress bar for the given window’s taskbar icon.
+--
+--     [Returns]: the progress value in the range of [0.0f - 1.0f], or -1.0f on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.4.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GetWindowProgressValue@.
+--                   The unsafe flavor is 'getWindowProgressValue'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GetWindowProgressValue@, defined at @SDL3\/SDL_video.h 2996:35@
+getWindowProgressValueSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to get the current progress value from.
+  -> IO Float
+getWindowProgressValueSafe =
+  \x00 ->
+    fmap Coerce.coerce (Safe.sDL_GetWindowProgressValue x00)
+
+-- | Destroy a window.
+--
+--     Any child windows owned by the window will be recursively destroyed as well.
+--
+--     Note that on some platforms, the visible window may not actually be removed from the screen until the SDL event loop is pumped again, even though the 'SDL_Window' is no longer valid after this call.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createPopupWindow', 'createWindow', 'createWindowWithProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DestroyWindow@.
+--                   The safe flavor is 'destroyWindowSafe'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyWindow@, defined at @SDL3\/SDL_video.h 3018:34@
+destroyWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to destroy.
+  -> IO ()
+destroyWindow = Unsafe.sDL_DestroyWindow
+
+-- | Destroy a window.
+--
+--     Any child windows owned by the window will be recursively destroyed as well.
+--
+--     Note that on some platforms, the visible window may not actually be removed from the screen until the SDL event loop is pumped again, even though the 'SDL_Window' is no longer valid after this call.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'createPopupWindow', 'createWindow', 'createWindowWithProperties'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DestroyWindow@.
+--                   The unsafe flavor is 'destroyWindow'
+--                   .
+--
+--     [C declaration]: @SDL_DestroyWindow@, defined at @SDL3\/SDL_video.h 3018:34@
+destroyWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to destroy.
+  -> IO ()
+destroyWindowSafe = Safe.sDL_DestroyWindow
+
+-- | Check whether the screensaver is currently enabled.
+--
+--     The screensaver is disabled by default.
+--
+--     The default can also be changed using @SDL_HINT_VIDEO_ALLOW_SCREENSAVER@.
+--
+--     [Returns]: true if the screensaver is enabled, false if it is disabled.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'disableScreenSaver', 'enableScreenSaver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_ScreenSaverEnabled@.
+--                   The safe flavor is 'screenSaverEnabledSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ScreenSaverEnabled@, defined at @SDL3\/SDL_video.h 3037:34@
+screenSaverEnabled :: IO Bool
+screenSaverEnabled =
+  fmap CBool.toBool Unsafe.sDL_ScreenSaverEnabled
+
+-- | Check whether the screensaver is currently enabled.
+--
+--     The screensaver is disabled by default.
+--
+--     The default can also be changed using @SDL_HINT_VIDEO_ALLOW_SCREENSAVER@.
+--
+--     [Returns]: true if the screensaver is enabled, false if it is disabled.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'disableScreenSaver', 'enableScreenSaver'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_ScreenSaverEnabled@.
+--                   The unsafe flavor is 'screenSaverEnabled'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_ScreenSaverEnabled@, defined at @SDL3\/SDL_video.h 3037:34@
+screenSaverEnabledSafe :: IO Bool
+screenSaverEnabledSafe =
+  fmap CBool.toBool Safe.sDL_ScreenSaverEnabled
+
+-- | Allow the screen to be blanked by a screen saver.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'disableScreenSaver', 'screenSaverEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_EnableScreenSaver@.
+--                   The safe flavor is 'enableScreenSaverSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_EnableScreenSaver@, defined at @SDL3\/SDL_video.h 3052:34@
+enableScreenSaver :: IO Bool
+enableScreenSaver =
+  fmap CBool.toBool Unsafe.sDL_EnableScreenSaver
+
+-- | Allow the screen to be blanked by a screen saver.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'disableScreenSaver', 'screenSaverEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EnableScreenSaver@.
+--                   The unsafe flavor is 'enableScreenSaver'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_EnableScreenSaver@, defined at @SDL3\/SDL_video.h 3052:34@
+enableScreenSaverSafe :: IO Bool
+enableScreenSaverSafe =
+  fmap CBool.toBool Safe.sDL_EnableScreenSaver
+
+-- | Prevent the screen from being blanked by a screen saver.
+--
+--     If you disable the screensaver, it is automatically re-enabled when SDL quits.
+--
+--     The screensaver is disabled by default, but this may by changed by SDL_HINT_VIDEO_ALLOW_SCREENSAVER.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'enableScreenSaver', 'screenSaverEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_DisableScreenSaver@.
+--                   The safe flavor is 'disableScreenSaverSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DisableScreenSaver@, defined at @SDL3\/SDL_video.h 3073:34@
+disableScreenSaver :: IO Bool
+disableScreenSaver =
+  fmap CBool.toBool Unsafe.sDL_DisableScreenSaver
+
+-- | Prevent the screen from being blanked by a screen saver.
+--
+--     If you disable the screensaver, it is automatically re-enabled when SDL quits.
+--
+--     The screensaver is disabled by default, but this may by changed by SDL_HINT_VIDEO_ALLOW_SCREENSAVER.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'enableScreenSaver', 'screenSaverEnabled'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_DisableScreenSaver@.
+--                   The unsafe flavor is 'disableScreenSaver'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_DisableScreenSaver@, defined at @SDL3\/SDL_video.h 3073:34@
+disableScreenSaverSafe :: IO Bool
+disableScreenSaverSafe =
+  fmap CBool.toBool Safe.sDL_DisableScreenSaver
+
+-- | Dynamically load an OpenGL library.
+--
+--     This should be done after initializing the video driver, but before creating any OpenGL windows. If no OpenGL library is loaded, the default library will be loaded upon creation of the first OpenGL window.
+--
+--     If you do this, you need to retrieve all of the GL functions used in your program from the dynamic library using @'glGetProcAddress'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glGetProcAddress', 'glUnloadLibrary'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_LoadLibrary@.
+--                   The safe flavor is 'glLoadLibrarySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_LoadLibrary@, defined at @SDL3\/SDL_video.h 3103:34@
+glLoadLibrary
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the platform dependent OpenGL library name, or NULL to open the default OpenGL library.
+  -> IO Bool
+glLoadLibrary =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GL_LoadLibrary x00)
+
+-- | Dynamically load an OpenGL library.
+--
+--     This should be done after initializing the video driver, but before creating any OpenGL windows. If no OpenGL library is loaded, the default library will be loaded upon creation of the first OpenGL window.
+--
+--     If you do this, you need to retrieve all of the GL functions used in your program from the dynamic library using @'glGetProcAddress'@.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glGetProcAddress', 'glUnloadLibrary'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_LoadLibrary@.
+--                   The unsafe flavor is 'glLoadLibrary'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_LoadLibrary@, defined at @SDL3\/SDL_video.h 3103:34@
+glLoadLibrarySafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the platform dependent OpenGL library name, or NULL to open the default OpenGL library.
+  -> IO Bool
+glLoadLibrarySafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GL_LoadLibrary x00)
+
+-- | Get an OpenGL function by name.
+--
+--     If the GL library is loaded at runtime with @'glLoadLibrary'@, then all GL functions must be retrieved this way. Usually this is used to retrieve function pointers to OpenGL extensions.
+--
+--     There are some quirks to looking up OpenGL functions that require some extra care from the application. If you code carefully, you can handle these quirks without any platform-specific code, though:
+--
+--     * On Windows, function pointers are specific to the current GL context; this means you need to have created a GL context and made it current before calling @'glGetProcAddress'@. If you recreate your context or create a second context, you should assume that any existing function pointers aren\'t valid to use with it. This is (currently) a Windows-specific limitation, and in practice lots of drivers don\'t suffer this limitation, but it is still the way the wgl API is documented to work and you should expect crashes if you don\'t respect it. Store a copy of the function pointers that comes and goes with context lifespan.
+--
+--     * On X11, function pointers returned by this function are valid for any context, and can even be looked up before a context is created at all. This means that, for at least some common OpenGL implementations, if you look up a function that doesn\'t exist, you\'ll get a non-NULL result that is /NOT/ safe to call. You must always make sure the function is actually available for a given GL context before calling it, by checking for the existence of the appropriate extension with @'glExtensionSupported'@, or verifying that the version of OpenGL you\'re using offers the function as core functionality.
+--
+--     * Some OpenGL drivers, on all platforms, /will/ return NULL if a function isn\'t supported, but you can\'t count on this behavior. Check for extensions you use, and if you get a NULL anyway, act as if that extension wasn\'t available. This is probably a bug in the driver, but you can code defensively for this scenario anyhow.
+--
+--     * Just because you\'re on Linux\/Unix, don\'t assume you\'ll be using X11. Next-gen display servers are waiting to replace it, and may or may not make the same promises about function pointers.
+--
+--     * OpenGL function pointers must be declared @APIENTRY@ as in the example code. This will ensure the proper calling convention is followed on platforms where this matters (Win32) thereby avoiding stack corruption.
+--
+--     [Returns]: a pointer to the named OpenGL function. The returned pointer should be cast to the appropriate function signature.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glExtensionSupported', 'glLoadLibrary', 'glUnloadLibrary'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_GetProcAddress@.
+--                   The safe flavor is 'glGetProcAddressSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GL_GetProcAddress@, defined at @SDL3\/SDL_video.h 3158:49@
+glGetProcAddress
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@proc@]: the name of an OpenGL function.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+glGetProcAddress = Unsafe.sDL_GL_GetProcAddress
+
+-- | Get an OpenGL function by name.
+--
+--     If the GL library is loaded at runtime with @'glLoadLibrary'@, then all GL functions must be retrieved this way. Usually this is used to retrieve function pointers to OpenGL extensions.
+--
+--     There are some quirks to looking up OpenGL functions that require some extra care from the application. If you code carefully, you can handle these quirks without any platform-specific code, though:
+--
+--     * On Windows, function pointers are specific to the current GL context; this means you need to have created a GL context and made it current before calling @'glGetProcAddress'@. If you recreate your context or create a second context, you should assume that any existing function pointers aren\'t valid to use with it. This is (currently) a Windows-specific limitation, and in practice lots of drivers don\'t suffer this limitation, but it is still the way the wgl API is documented to work and you should expect crashes if you don\'t respect it. Store a copy of the function pointers that comes and goes with context lifespan.
+--
+--     * On X11, function pointers returned by this function are valid for any context, and can even be looked up before a context is created at all. This means that, for at least some common OpenGL implementations, if you look up a function that doesn\'t exist, you\'ll get a non-NULL result that is /NOT/ safe to call. You must always make sure the function is actually available for a given GL context before calling it, by checking for the existence of the appropriate extension with @'glExtensionSupported'@, or verifying that the version of OpenGL you\'re using offers the function as core functionality.
+--
+--     * Some OpenGL drivers, on all platforms, /will/ return NULL if a function isn\'t supported, but you can\'t count on this behavior. Check for extensions you use, and if you get a NULL anyway, act as if that extension wasn\'t available. This is probably a bug in the driver, but you can code defensively for this scenario anyhow.
+--
+--     * Just because you\'re on Linux\/Unix, don\'t assume you\'ll be using X11. Next-gen display servers are waiting to replace it, and may or may not make the same promises about function pointers.
+--
+--     * OpenGL function pointers must be declared @APIENTRY@ as in the example code. This will ensure the proper calling convention is followed on platforms where this matters (Win32) thereby avoiding stack corruption.
+--
+--     [Returns]: a pointer to the named OpenGL function. The returned pointer should be cast to the appropriate function signature.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glExtensionSupported', 'glLoadLibrary', 'glUnloadLibrary'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_GetProcAddress@.
+--                   The unsafe flavor is 'glGetProcAddress'
+--                   .
+--
+--     [C declaration]: @SDL_GL_GetProcAddress@, defined at @SDL3\/SDL_video.h 3158:49@
+glGetProcAddressSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@proc@]: the name of an OpenGL function.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+glGetProcAddressSafe = Safe.sDL_GL_GetProcAddress
+
+-- | Get an EGL library function by name.
+--
+--     If an EGL library is loaded, this function allows applications to get entry points for EGL functions. This is useful to provide to an EGL API and extension loader.
+--
+--     [Returns]: a pointer to the named EGL function. The returned pointer should be cast to the appropriate function signature.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'eglGetCurrentDisplay'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_EGL_GetProcAddress@.
+--                   The safe flavor is 'eglGetProcAddressSafe'
+--                   .
+--
+--     [C declaration]: @SDL_EGL_GetProcAddress@, defined at @SDL3\/SDL_video.h 3177:49@
+eglGetProcAddress
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@proc@]: the name of an EGL function.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+eglGetProcAddress = Unsafe.sDL_EGL_GetProcAddress
+
+-- | Get an EGL library function by name.
+--
+--     If an EGL library is loaded, this function allows applications to get entry points for EGL functions. This is useful to provide to an EGL API and extension loader.
+--
+--     [Returns]: a pointer to the named EGL function. The returned pointer should be cast to the appropriate function signature.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'eglGetCurrentDisplay'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EGL_GetProcAddress@.
+--                   The unsafe flavor is 'eglGetProcAddress'
+--                   .
+--
+--     [C declaration]: @SDL_EGL_GetProcAddress@, defined at @SDL3\/SDL_video.h 3177:49@
+eglGetProcAddressSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@proc@]: the name of an EGL function.
+  -> IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+eglGetProcAddressSafe = Safe.sDL_EGL_GetProcAddress
+
+-- | Unload the OpenGL library previously loaded by @'glLoadLibrary'@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glLoadLibrary'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_UnloadLibrary@.
+--                   The safe flavor is 'glUnloadLibrarySafe'
+--                   .
+--
+--     [C declaration]: @SDL_GL_UnloadLibrary@, defined at @SDL3\/SDL_video.h 3188:34@
+glUnloadLibrary :: IO ()
+glUnloadLibrary = Unsafe.sDL_GL_UnloadLibrary
+
+-- | Unload the OpenGL library previously loaded by @'glLoadLibrary'@.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glLoadLibrary'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_UnloadLibrary@.
+--                   The unsafe flavor is 'glUnloadLibrary'
+--                   .
+--
+--     [C declaration]: @SDL_GL_UnloadLibrary@, defined at @SDL3\/SDL_video.h 3188:34@
+glUnloadLibrarySafe :: IO ()
+glUnloadLibrarySafe = Safe.sDL_GL_UnloadLibrary
+
+-- | Check if an OpenGL extension is supported for the current context.
+--
+--     This function operates on the current GL context; you must have created a context and it must be current before calling this function. Do not assume that all contexts you create will have the same set of extensions available, or that recreating an existing context will offer the same extensions again.
+--
+--     While it\'s probably not a massive overhead, this function is not an O(1) operation. Check the extensions you care about after creating the GL context and save that information somewhere instead of calling the function every time you need to know.
+--
+--     [Returns]: true if the extension is supported, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_ExtensionSupported@.
+--                   The safe flavor is 'glExtensionSupportedSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_ExtensionSupported@, defined at @SDL3\/SDL_video.h 3211:34@
+glExtensionSupported
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@extension@]: the name of the extension to check.
+  -> IO Bool
+glExtensionSupported =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GL_ExtensionSupported x00)
+
+-- | Check if an OpenGL extension is supported for the current context.
+--
+--     This function operates on the current GL context; you must have created a context and it must be current before calling this function. Do not assume that all contexts you create will have the same set of extensions available, or that recreating an existing context will offer the same extensions again.
+--
+--     While it\'s probably not a massive overhead, this function is not an O(1) operation. Check the extensions you care about after creating the GL context and save that information somewhere instead of calling the function every time you need to know.
+--
+--     [Returns]: true if the extension is supported, false otherwise.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_ExtensionSupported@.
+--                   The unsafe flavor is 'glExtensionSupported'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_ExtensionSupported@, defined at @SDL3\/SDL_video.h 3211:34@
+glExtensionSupportedSafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@extension@]: the name of the extension to check.
+  -> IO Bool
+glExtensionSupportedSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GL_ExtensionSupported x00)
+
+-- | Reset all previously set OpenGL context attributes to their default values.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glGetAttribute', 'glSetAttribute'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_ResetAttributes@.
+--                   The safe flavor is 'glResetAttributesSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GL_ResetAttributes@, defined at @SDL3\/SDL_video.h 3223:34@
+glResetAttributes :: IO ()
+glResetAttributes = Unsafe.sDL_GL_ResetAttributes
+
+-- | Reset all previously set OpenGL context attributes to their default values.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glGetAttribute', 'glSetAttribute'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_ResetAttributes@.
+--                   The unsafe flavor is 'glResetAttributes'
+--                   .
+--
+--     [C declaration]: @SDL_GL_ResetAttributes@, defined at @SDL3\/SDL_video.h 3223:34@
+glResetAttributesSafe :: IO ()
+glResetAttributesSafe = Safe.sDL_GL_ResetAttributes
+
+-- | Set an OpenGL window attribute before window creation.
+--
+--     This function sets the OpenGL attribute @attr@ to @value@. The requested attributes should be set before creating an OpenGL window. You should use @'glGetAttribute'@ to check the values after creating the OpenGL context, since the values obtained can differ from the requested ones.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glCreateContext', 'glGetAttribute', 'glResetAttributes'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_SetAttribute@.
+--                   The safe flavor is 'glSetAttributeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_SetAttribute@, defined at @SDL3\/SDL_video.h 3246:34@
+glSetAttribute
+  :: SDL_GLAttr
+  -- ^
+  --
+  --           [@attr@]: an enum value specifying the OpenGL attribute to set.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@value@]: the desired value for the attribute.
+  -> IO Bool
+glSetAttribute =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GL_SetAttribute x00 (Coerce.coerce x11))
+
+-- | Set an OpenGL window attribute before window creation.
+--
+--     This function sets the OpenGL attribute @attr@ to @value@. The requested attributes should be set before creating an OpenGL window. You should use @'glGetAttribute'@ to check the values after creating the OpenGL context, since the values obtained can differ from the requested ones.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glCreateContext', 'glGetAttribute', 'glResetAttributes'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_SetAttribute@.
+--                   The unsafe flavor is 'glSetAttribute'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_SetAttribute@, defined at @SDL3\/SDL_video.h 3246:34@
+glSetAttributeSafe
+  :: SDL_GLAttr
+  -- ^
+  --
+  --           [@attr@]: an enum value specifying the OpenGL attribute to set.
+  -> BG.Int32
+  -- ^
+  --
+  --           [@value@]: the desired value for the attribute.
+  -> IO Bool
+glSetAttributeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GL_SetAttribute x00 (Coerce.coerce x11))
+
+-- | Get the actual value for an attribute from the current context.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glResetAttributes', 'glSetAttribute'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_GetAttribute@.
+--                   The safe flavor is 'glGetAttributeSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_GetAttribute@, defined at @SDL3\/SDL_video.h 3264:34@
+glGetAttribute
+  :: SDL_GLAttr
+  -- ^
+  --
+  --           [@attr@]: an 'SDL_GLAttr' enum value specifying the OpenGL attribute to get.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the current value of @attr@.
+  -> IO Bool
+glGetAttribute =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GL_GetAttribute x00 x11)
+
+-- | Get the actual value for an attribute from the current context.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glResetAttributes', 'glSetAttribute'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_GetAttribute@.
+--                   The unsafe flavor is 'glGetAttribute'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_GetAttribute@, defined at @SDL3\/SDL_video.h 3264:34@
+glGetAttributeSafe
+  :: SDL_GLAttr
+  -- ^
+  --
+  --           [@attr@]: an 'SDL_GLAttr' enum value specifying the OpenGL attribute to get.
+  -> BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@value@]: a pointer filled in with the current value of @attr@.
+  -> IO Bool
+glGetAttributeSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GL_GetAttribute x00 x11)
+
+-- | Create an OpenGL context for an OpenGL window, and make it current.
+--
+--     The OpenGL context will be created with the current states set through @'glSetAttribute'@.
+--
+--     The 'SDL_Window' specified must have been created with the SDL_WINDOW_OPENGL flag, or context creation will fail.
+--
+--     Windows users new to OpenGL should note that, for historical reasons, GL functions added after OpenGL version 1.1 are not available by default. Those functions must be loaded at run-time, either with an OpenGL extension-handling library or with @'glGetProcAddress'@ and its related functions.
+--
+--     'SDL_GLContext' is opaque to the application.
+--
+--     [Returns]: the OpenGL context associated with @window@ or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glDestroyContext', 'glMakeCurrent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_CreateContext@.
+--                   The safe flavor is 'glCreateContextSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GL_CreateContext@, defined at @SDL3\/SDL_video.h 3294:43@
+glCreateContext
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to associate with the context.
+  -> IO SDL_GLContext
+glCreateContext = Unsafe.sDL_GL_CreateContext
+
+-- | Create an OpenGL context for an OpenGL window, and make it current.
+--
+--     The OpenGL context will be created with the current states set through @'glSetAttribute'@.
+--
+--     The 'SDL_Window' specified must have been created with the SDL_WINDOW_OPENGL flag, or context creation will fail.
+--
+--     Windows users new to OpenGL should note that, for historical reasons, GL functions added after OpenGL version 1.1 are not available by default. Those functions must be loaded at run-time, either with an OpenGL extension-handling library or with @'glGetProcAddress'@ and its related functions.
+--
+--     'SDL_GLContext' is opaque to the application.
+--
+--     [Returns]: the OpenGL context associated with @window@ or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glDestroyContext', 'glMakeCurrent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_CreateContext@.
+--                   The unsafe flavor is 'glCreateContext'
+--                   .
+--
+--     [C declaration]: @SDL_GL_CreateContext@, defined at @SDL3\/SDL_video.h 3294:43@
+glCreateContextSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to associate with the context.
+  -> IO SDL_GLContext
+glCreateContextSafe = Safe.sDL_GL_CreateContext
+
+-- | Set up an OpenGL context for rendering into an OpenGL window.
+--
+--     The context must have been created with a compatible window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glCreateContext'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_MakeCurrent@.
+--                   The safe flavor is 'glMakeCurrentSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_MakeCurrent@, defined at @SDL3\/SDL_video.h 3312:34@
+glMakeCurrent
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to associate with the context.
+  -> SDL_GLContext
+  -- ^
+  --
+  --           [@context@]: the OpenGL context to associate with the window.
+  -> IO Bool
+glMakeCurrent =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Unsafe.sDL_GL_MakeCurrent x00 x11)
+
+-- | Set up an OpenGL context for rendering into an OpenGL window.
+--
+--     The context must have been created with a compatible window.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glCreateContext'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_MakeCurrent@.
+--                   The unsafe flavor is 'glMakeCurrent'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_MakeCurrent@, defined at @SDL3\/SDL_video.h 3312:34@
+glMakeCurrentSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to associate with the context.
+  -> SDL_GLContext
+  -- ^
+  --
+  --           [@context@]: the OpenGL context to associate with the window.
+  -> IO Bool
+glMakeCurrentSafe =
+  \x00 ->
+    \x11 ->
+      fmap CBool.toBool (Safe.sDL_GL_MakeCurrent x00 x11)
+
+-- | Get the currently active OpenGL window.
+--
+--     [Returns]: the currently active OpenGL window on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_GetCurrentWindow@.
+--                   The safe flavor is 'glGetCurrentWindowSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GL_GetCurrentWindow@, defined at @SDL3\/SDL_video.h 3324:42@
+glGetCurrentWindow :: IO (BG.Ptr SDL_Window)
+glGetCurrentWindow = Unsafe.sDL_GL_GetCurrentWindow
+
+-- | Get the currently active OpenGL window.
+--
+--     [Returns]: the currently active OpenGL window on success or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_GetCurrentWindow@.
+--                   The unsafe flavor is 'glGetCurrentWindow'
+--                   .
+--
+--     [C declaration]: @SDL_GL_GetCurrentWindow@, defined at @SDL3\/SDL_video.h 3324:42@
+glGetCurrentWindowSafe :: IO (BG.Ptr SDL_Window)
+glGetCurrentWindowSafe = Safe.sDL_GL_GetCurrentWindow
+
+-- | Get the currently active OpenGL context.
+--
+--     [Returns]: the currently active OpenGL context or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glMakeCurrent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_GetCurrentContext@.
+--                   The safe flavor is 'glGetCurrentContextSafe'
+--                   .
+--
+--     [C declaration]: @SDL_GL_GetCurrentContext@, defined at @SDL3\/SDL_video.h 3338:43@
+glGetCurrentContext :: IO SDL_GLContext
+glGetCurrentContext = Unsafe.sDL_GL_GetCurrentContext
+
+-- | Get the currently active OpenGL context.
+--
+--     [Returns]: the currently active OpenGL context or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glMakeCurrent'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_GetCurrentContext@.
+--                   The unsafe flavor is 'glGetCurrentContext'
+--                   .
+--
+--     [C declaration]: @SDL_GL_GetCurrentContext@, defined at @SDL3\/SDL_video.h 3338:43@
+glGetCurrentContextSafe :: IO SDL_GLContext
+glGetCurrentContextSafe =
+  Safe.sDL_GL_GetCurrentContext
+
+-- | Get the currently active EGL display.
+--
+--     [Returns]: the currently active EGL display or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_EGL_GetCurrentDisplay@.
+--                   The safe flavor is 'eglGetCurrentDisplaySafe'
+--                   .
+--
+--     [C declaration]: @SDL_EGL_GetCurrentDisplay@, defined at @SDL3\/SDL_video.h 3350:44@
+eglGetCurrentDisplay :: IO SDL_EGLDisplay
+eglGetCurrentDisplay =
+  Unsafe.sDL_EGL_GetCurrentDisplay
+
+-- | Get the currently active EGL display.
+--
+--     [Returns]: the currently active EGL display or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EGL_GetCurrentDisplay@.
+--                   The unsafe flavor is 'eglGetCurrentDisplay'
+--                   .
+--
+--     [C declaration]: @SDL_EGL_GetCurrentDisplay@, defined at @SDL3\/SDL_video.h 3350:44@
+eglGetCurrentDisplaySafe :: IO SDL_EGLDisplay
+eglGetCurrentDisplaySafe =
+  Safe.sDL_EGL_GetCurrentDisplay
+
+-- | Get the currently active EGL config.
+--
+--     [Returns]: the currently active EGL config or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_EGL_GetCurrentConfig@.
+--                   The safe flavor is 'eglGetCurrentConfigSafe'
+--                   .
+--
+--     [C declaration]: @SDL_EGL_GetCurrentConfig@, defined at @SDL3\/SDL_video.h 3362:43@
+eglGetCurrentConfig :: IO SDL_EGLConfig
+eglGetCurrentConfig = Unsafe.sDL_EGL_GetCurrentConfig
+
+-- | Get the currently active EGL config.
+--
+--     [Returns]: the currently active EGL config or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EGL_GetCurrentConfig@.
+--                   The unsafe flavor is 'eglGetCurrentConfig'
+--                   .
+--
+--     [C declaration]: @SDL_EGL_GetCurrentConfig@, defined at @SDL3\/SDL_video.h 3362:43@
+eglGetCurrentConfigSafe :: IO SDL_EGLConfig
+eglGetCurrentConfigSafe =
+  Safe.sDL_EGL_GetCurrentConfig
+
+-- | Get the EGL surface associated with the window.
+--
+--     [Returns]: the EGLSurface pointer associated with the window, or NULL on failure.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_EGL_GetWindowSurface@.
+--                   The safe flavor is 'eglGetWindowSurfaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_EGL_GetWindowSurface@, defined at @SDL3\/SDL_video.h 3375:44@
+eglGetWindowSurface
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_EGLSurface
+eglGetWindowSurface = Unsafe.sDL_EGL_GetWindowSurface
+
+-- | Get the EGL surface associated with the window.
+--
+--     [Returns]: the EGLSurface pointer associated with the window, or NULL on failure.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EGL_GetWindowSurface@.
+--                   The unsafe flavor is 'eglGetWindowSurface'
+--                   .
+--
+--     [C declaration]: @SDL_EGL_GetWindowSurface@, defined at @SDL3\/SDL_video.h 3375:44@
+eglGetWindowSurfaceSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to query.
+  -> IO SDL_EGLSurface
+eglGetWindowSurfaceSafe =
+  Safe.sDL_EGL_GetWindowSurface
+
+-- | Sets the callbacks for defining custom EGLAttrib arrays for EGL initialization.
+--
+--     Callbacks that aren\'t needed can be set to NULL.
+--
+--     NOTE: These callback pointers will be reset after 'glResetAttributes'.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_EGL_SetAttributeCallbacks@.
+--                   The safe flavor is 'eglSetAttributeCallbacksSafe'
+--                   : registration; callbacks fire during later EGL context creation.
+--
+--     [C declaration]: @SDL_EGL_SetAttributeCallbacks@, defined at @SDL3\/SDL_video.h 3397:34@
+eglSetAttributeCallbacks
+  :: SDL_EGLAttribArrayCallback
+  -- ^
+  --
+  --           [@platformAttribCallback@]: callback for attributes to pass to eglGetPlatformDisplay. May be NULL.
+  -> SDL_EGLIntArrayCallback
+  -- ^
+  --
+  --           [@surfaceAttribCallback@]: callback for attributes to pass to eglCreateSurface. May be NULL.
+  -> SDL_EGLIntArrayCallback
+  -- ^
+  --
+  --           [@contextAttribCallback@]: callback for attributes to pass to eglCreateContext. May be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to the callbacks.
+  -> IO ()
+eglSetAttributeCallbacks =
+  Unsafe.sDL_EGL_SetAttributeCallbacks
+
+-- | Sets the callbacks for defining custom EGLAttrib arrays for EGL initialization.
+--
+--     Callbacks that aren\'t needed can be set to NULL.
+--
+--     NOTE: These callback pointers will be reset after 'glResetAttributes'.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_EGL_SetAttributeCallbacks@.
+--                   The unsafe flavor is 'eglSetAttributeCallbacks'
+--                   : registration; callbacks fire during later EGL context creation.
+--
+--     [C declaration]: @SDL_EGL_SetAttributeCallbacks@, defined at @SDL3\/SDL_video.h 3397:34@
+eglSetAttributeCallbacksSafe
+  :: SDL_EGLAttribArrayCallback
+  -- ^
+  --
+  --           [@platformAttribCallback@]: callback for attributes to pass to eglGetPlatformDisplay. May be NULL.
+  -> SDL_EGLIntArrayCallback
+  -- ^
+  --
+  --           [@surfaceAttribCallback@]: callback for attributes to pass to eglCreateSurface. May be NULL.
+  -> SDL_EGLIntArrayCallback
+  -- ^
+  --
+  --           [@contextAttribCallback@]: callback for attributes to pass to eglCreateContext. May be NULL.
+  -> BG.Ptr BG.Void
+  -- ^
+  --
+  --           [@userdata@]: a pointer that is passed to the callbacks.
+  -> IO ()
+eglSetAttributeCallbacksSafe =
+  Safe.sDL_EGL_SetAttributeCallbacks
+
+-- | Set the swap interval for the current OpenGL context.
+--
+--     Some systems allow specifying -1 for the interval, to enable adaptive vsync. Adaptive vsync works the same as vsync, but if you\'ve already missed the vertical retrace for a given frame, it swaps buffers immediately, which might be less jarring for the user during occasional framerate drops. If an application requests adaptive vsync and the system does not support it, this function will fail and return false. In such a case, you should probably retry the call with 1 for the interval.
+--
+--     Adaptive vsync is implemented for some glX drivers with GLX_EXT_swap_control_tear, and for some Windows drivers with WGL_EXT_swap_control_tear.
+--
+--     Read more on the Khronos wiki: [https:\/\/www.khronos.org\/opengl\/wiki\/Swap_Interval\#Adaptive_Vsync](https://www.khronos.org/opengl/wiki/Swap_Interval#Adaptive_Vsync)
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glGetSwapInterval'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_SetSwapInterval@.
+--                   The safe flavor is 'glSetSwapIntervalSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_SetSwapInterval@, defined at @SDL3\/SDL_video.h 3430:34@
+glSetSwapInterval
+  :: BG.Int32
+  -- ^
+  --
+  --           [@interval@]: 0 for immediate updates, 1 for updates synchronized with the vertical retrace, -1 for adaptive vsync.
+  -> IO Bool
+glSetSwapInterval =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GL_SetSwapInterval (Coerce.coerce x00))
+
+-- | Set the swap interval for the current OpenGL context.
+--
+--     Some systems allow specifying -1 for the interval, to enable adaptive vsync. Adaptive vsync works the same as vsync, but if you\'ve already missed the vertical retrace for a given frame, it swaps buffers immediately, which might be less jarring for the user during occasional framerate drops. If an application requests adaptive vsync and the system does not support it, this function will fail and return false. In such a case, you should probably retry the call with 1 for the interval.
+--
+--     Adaptive vsync is implemented for some glX drivers with GLX_EXT_swap_control_tear, and for some Windows drivers with WGL_EXT_swap_control_tear.
+--
+--     Read more on the Khronos wiki: [https:\/\/www.khronos.org\/opengl\/wiki\/Swap_Interval\#Adaptive_Vsync](https://www.khronos.org/opengl/wiki/Swap_Interval#Adaptive_Vsync)
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glGetSwapInterval'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_SetSwapInterval@.
+--                   The unsafe flavor is 'glSetSwapInterval'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_SetSwapInterval@, defined at @SDL3\/SDL_video.h 3430:34@
+glSetSwapIntervalSafe
+  :: BG.Int32
+  -- ^
+  --
+  --           [@interval@]: 0 for immediate updates, 1 for updates synchronized with the vertical retrace, -1 for adaptive vsync.
+  -> IO Bool
+glSetSwapIntervalSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GL_SetSwapInterval (Coerce.coerce x00))
+
+-- | Get the swap interval for the current OpenGL context.
+--
+--     If the system can\'t determine the swap interval, or there isn\'t a valid current context, this function will set *interval to 0 as a safe default.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glSetSwapInterval'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_GetSwapInterval@.
+--                   The safe flavor is 'glGetSwapIntervalSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_GetSwapInterval@, defined at @SDL3\/SDL_video.h 3451:34@
+glGetSwapInterval
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@interval@]: output interval value. 0 if there is no vertical retrace synchronization, 1 if the buffer swap is synchronized with the vertical retrace, and -1 if late swaps happen immediately instead of waiting for the next retrace.
+  -> IO Bool
+glGetSwapInterval =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GL_GetSwapInterval x00)
+
+-- | Get the swap interval for the current OpenGL context.
+--
+--     If the system can\'t determine the swap interval, or there isn\'t a valid current context, this function will set *interval to 0 as a safe default.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glSetSwapInterval'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_GetSwapInterval@.
+--                   The unsafe flavor is 'glGetSwapInterval'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_GetSwapInterval@, defined at @SDL3\/SDL_video.h 3451:34@
+glGetSwapIntervalSafe
+  :: BG.Ptr BG.CInt
+  -- ^
+  --
+  --           [@interval@]: output interval value. 0 if there is no vertical retrace synchronization, 1 if the buffer swap is synchronized with the vertical retrace, and -1 if late swaps happen immediately instead of waiting for the next retrace.
+  -> IO Bool
+glGetSwapIntervalSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GL_GetSwapInterval x00)
+
+-- | Update a window with OpenGL rendering.
+--
+--     This is used with double-buffered OpenGL contexts, which are the default.
+--
+--     On macOS, make sure you bind 0 to the draw framebuffer before swapping the window, otherwise nothing will happen. If you aren\'t using glBindFramebuffer(), this is the default and you won\'t have to do anything extra.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_SwapWindow@.
+--                   The safe flavor is 'glSwapWindowSafe'
+--                   : can block on vsync.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_SwapWindow@, defined at @SDL3\/SDL_video.h 3471:34@
+glSwapWindow
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> IO Bool
+glSwapWindow =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GL_SwapWindow x00)
+
+-- | Update a window with OpenGL rendering.
+--
+--     This is used with double-buffered OpenGL contexts, which are the default.
+--
+--     On macOS, make sure you bind 0 to the draw framebuffer before swapping the window, otherwise nothing will happen. If you aren\'t using glBindFramebuffer(), this is the default and you won\'t have to do anything extra.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_SwapWindow@.
+--                   The unsafe flavor is 'glSwapWindow'
+--                   : can block on vsync.
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_SwapWindow@, defined at @SDL3\/SDL_video.h 3471:34@
+glSwapWindowSafe
+  :: BG.Ptr SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to change.
+  -> IO Bool
+glSwapWindowSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GL_SwapWindow x00)
+
+-- | Delete an OpenGL context.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glCreateContext'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_GL_DestroyContext@.
+--                   The safe flavor is 'glDestroyContextSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_DestroyContext@, defined at @SDL3\/SDL_video.h 3486:34@
+glDestroyContext
+  :: SDL_GLContext
+  -- ^
+  --
+  --           [@context@]: the OpenGL context to be deleted.
+  -> IO Bool
+glDestroyContext =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_GL_DestroyContext x00)
+
+-- | Delete an OpenGL context.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function should only be called on the main thread.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'glCreateContext'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_GL_DestroyContext@.
+--                   The unsafe flavor is 'glDestroyContext'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_GL_DestroyContext@, defined at @SDL3\/SDL_video.h 3486:34@
+glDestroyContextSafe
+  :: SDL_GLContext
+  -- ^
+  --
+  --           [@context@]: the OpenGL context to be deleted.
+  -> IO Bool
+glDestroyContextSafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_GL_DestroyContext x00)
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_DEBUG_FLAG@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GL_CONTEXT_DEBUG_FLAG :: SDL_GLContextFlag
+pattern SDL_GL_CONTEXT_DEBUG_FLAG = SDL_GLContextFlag 0x00000001
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG :: SDL_GLContextFlag
+pattern SDL_GL_CONTEXT_FORWARD_COMPATIBLE_FLAG = SDL_GLContextFlag 0x00000002
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG :: SDL_GLContextFlag
+pattern SDL_GL_CONTEXT_ROBUST_ACCESS_FLAG = SDL_GLContextFlag 0x00000004
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_RESET_ISOLATION_FLAG@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_GL_CONTEXT_RESET_ISOLATION_FLAG :: SDL_GLContextFlag
+pattern SDL_GL_CONTEXT_RESET_ISOLATION_FLAG = SDL_GLContextFlag 0x00000008
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE@.
+pattern SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE :: SDL_GLContextReleaseFlag
+pattern SDL_GL_CONTEXT_RELEASE_BEHAVIOR_NONE = SDL_GLContextReleaseFlag 0
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH@.
+pattern SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH :: SDL_GLContextReleaseFlag
+pattern SDL_GL_CONTEXT_RELEASE_BEHAVIOR_FLUSH = SDL_GLContextReleaseFlag 1
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_RESET_NO_NOTIFICATION@.
+pattern SDL_GL_CONTEXT_RESET_NO_NOTIFICATION :: SDL_GLContextResetNotification
+pattern SDL_GL_CONTEXT_RESET_NO_NOTIFICATION = SDL_GLContextResetNotification 0
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_RESET_LOSE_CONTEXT@.
+pattern SDL_GL_CONTEXT_RESET_LOSE_CONTEXT :: SDL_GLContextResetNotification
+pattern SDL_GL_CONTEXT_RESET_LOSE_CONTEXT = SDL_GLContextResetNotification 1
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_PROFILE_CORE@.
+pattern SDL_GL_CONTEXT_PROFILE_CORE :: SDL_GLProfile
+pattern SDL_GL_CONTEXT_PROFILE_CORE = SDL_GLProfile 1
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_PROFILE_COMPATIBILITY@.
+pattern SDL_GL_CONTEXT_PROFILE_COMPATIBILITY :: SDL_GLProfile
+pattern SDL_GL_CONTEXT_PROFILE_COMPATIBILITY = SDL_GLProfile 2
+
+-- | Typed constant for macro @SDL_GL_CONTEXT_PROFILE_ES@.
+pattern SDL_GL_CONTEXT_PROFILE_ES :: SDL_GLProfile
+pattern SDL_GL_CONTEXT_PROFILE_ES = SDL_GLProfile 4
+
+-- | Typed constant for macro @SDL_WINDOW_FULLSCREEN@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_FULLSCREEN :: SDL_WindowFlags
+pattern SDL_WINDOW_FULLSCREEN = SDL_WindowFlags 0x0000000000000001
+
+-- | Typed constant for macro @SDL_WINDOW_OPENGL@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_OPENGL :: SDL_WindowFlags
+pattern SDL_WINDOW_OPENGL = SDL_WindowFlags 0x0000000000000002
+
+-- | Typed constant for macro @SDL_WINDOW_OCCLUDED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_OCCLUDED :: SDL_WindowFlags
+pattern SDL_WINDOW_OCCLUDED = SDL_WindowFlags 0x0000000000000004
+
+-- | Typed constant for macro @SDL_WINDOW_HIDDEN@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_HIDDEN :: SDL_WindowFlags
+pattern SDL_WINDOW_HIDDEN = SDL_WindowFlags 0x0000000000000008
+
+-- | Typed constant for macro @SDL_WINDOW_BORDERLESS@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_BORDERLESS :: SDL_WindowFlags
+pattern SDL_WINDOW_BORDERLESS = SDL_WindowFlags 0x0000000000000010
+
+-- | Typed constant for macro @SDL_WINDOW_RESIZABLE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_RESIZABLE :: SDL_WindowFlags
+pattern SDL_WINDOW_RESIZABLE = SDL_WindowFlags 0x0000000000000020
+
+-- | Typed constant for macro @SDL_WINDOW_MINIMIZED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_MINIMIZED :: SDL_WindowFlags
+pattern SDL_WINDOW_MINIMIZED = SDL_WindowFlags 0x0000000000000040
+
+-- | Typed constant for macro @SDL_WINDOW_MAXIMIZED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_MAXIMIZED :: SDL_WindowFlags
+pattern SDL_WINDOW_MAXIMIZED = SDL_WindowFlags 0x0000000000000080
+
+-- | Typed constant for macro @SDL_WINDOW_MOUSE_GRABBED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_MOUSE_GRABBED :: SDL_WindowFlags
+pattern SDL_WINDOW_MOUSE_GRABBED = SDL_WindowFlags 0x0000000000000100
+
+-- | Typed constant for macro @SDL_WINDOW_INPUT_FOCUS@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_INPUT_FOCUS :: SDL_WindowFlags
+pattern SDL_WINDOW_INPUT_FOCUS = SDL_WindowFlags 0x0000000000000200
+
+-- | Typed constant for macro @SDL_WINDOW_MOUSE_FOCUS@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_MOUSE_FOCUS :: SDL_WindowFlags
+pattern SDL_WINDOW_MOUSE_FOCUS = SDL_WindowFlags 0x0000000000000400
+
+-- | Typed constant for macro @SDL_WINDOW_EXTERNAL@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_EXTERNAL :: SDL_WindowFlags
+pattern SDL_WINDOW_EXTERNAL = SDL_WindowFlags 0x0000000000000800
+
+-- | Typed constant for macro @SDL_WINDOW_MODAL@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_MODAL :: SDL_WindowFlags
+pattern SDL_WINDOW_MODAL = SDL_WindowFlags 0x0000000000001000
+
+-- | Typed constant for macro @SDL_WINDOW_HIGH_PIXEL_DENSITY@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_HIGH_PIXEL_DENSITY :: SDL_WindowFlags
+pattern SDL_WINDOW_HIGH_PIXEL_DENSITY = SDL_WindowFlags 0x0000000000002000
+
+-- | Typed constant for macro @SDL_WINDOW_MOUSE_CAPTURE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_MOUSE_CAPTURE :: SDL_WindowFlags
+pattern SDL_WINDOW_MOUSE_CAPTURE = SDL_WindowFlags 0x0000000000004000
+
+-- | Typed constant for macro @SDL_WINDOW_MOUSE_RELATIVE_MODE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_MOUSE_RELATIVE_MODE :: SDL_WindowFlags
+pattern SDL_WINDOW_MOUSE_RELATIVE_MODE = SDL_WindowFlags 0x0000000000008000
+
+-- | Typed constant for macro @SDL_WINDOW_ALWAYS_ON_TOP@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_ALWAYS_ON_TOP :: SDL_WindowFlags
+pattern SDL_WINDOW_ALWAYS_ON_TOP = SDL_WindowFlags 0x0000000000010000
+
+-- | Typed constant for macro @SDL_WINDOW_UTILITY@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_UTILITY :: SDL_WindowFlags
+pattern SDL_WINDOW_UTILITY = SDL_WindowFlags 0x0000000000020000
+
+-- | Typed constant for macro @SDL_WINDOW_TOOLTIP@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_TOOLTIP :: SDL_WindowFlags
+pattern SDL_WINDOW_TOOLTIP = SDL_WindowFlags 0x0000000000040000
+
+-- | Typed constant for macro @SDL_WINDOW_POPUP_MENU@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_POPUP_MENU :: SDL_WindowFlags
+pattern SDL_WINDOW_POPUP_MENU = SDL_WindowFlags 0x0000000000080000
+
+-- | Typed constant for macro @SDL_WINDOW_KEYBOARD_GRABBED@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_KEYBOARD_GRABBED :: SDL_WindowFlags
+pattern SDL_WINDOW_KEYBOARD_GRABBED = SDL_WindowFlags 0x0000000000100000
+
+-- | Typed constant for macro @SDL_WINDOW_FILL_DOCUMENT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_FILL_DOCUMENT :: SDL_WindowFlags
+pattern SDL_WINDOW_FILL_DOCUMENT = SDL_WindowFlags 0x0000000000200000
+
+-- | Typed constant for macro @SDL_WINDOW_VULKAN@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_VULKAN :: SDL_WindowFlags
+pattern SDL_WINDOW_VULKAN = SDL_WindowFlags 0x0000000010000000
+
+-- | Typed constant for macro @SDL_WINDOW_METAL@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_METAL :: SDL_WindowFlags
+pattern SDL_WINDOW_METAL = SDL_WindowFlags 0x0000000020000000
+
+-- | Typed constant for macro @SDL_WINDOW_TRANSPARENT@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_TRANSPARENT :: SDL_WindowFlags
+pattern SDL_WINDOW_TRANSPARENT = SDL_WindowFlags 0x0000000040000000
+
+-- | Typed constant for macro @SDL_WINDOW_NOT_FOCUSABLE@. Combine with @.|.@ from "Data.Bits".
+pattern SDL_WINDOW_NOT_FOCUSABLE :: SDL_WindowFlags
+pattern SDL_WINDOW_NOT_FOCUSABLE = SDL_WindowFlags 0x0000000080000000
diff --git a/src/SDL3/Sys/Vulkan.hs b/src/SDL3/Sys/Vulkan.hs
new file mode 100644
--- /dev/null
+++ b/src/SDL3/Sys/Vulkan.hs
@@ -0,0 +1,519 @@
+-- | Functions for creating Vulkan surfaces on SDL windows.
+--
+--     == FFI conventions
+--
+--     Unsuffixed aliases are __unsafe__ foreign imports; aliases suffixed @Safe@ are safe. Functions whose callbacks fire during the call export only the Safe alias (the genuine unsafe import stays reachable under @SDL3.Sys.Bindgen.Vulkan.Unsafe@); functions curated unsafe-only export only the unsuffixed one. Each alias\'s documentation records its flavor and rationale.
+--
+--     Full conventions: "SDL3.Sys".
+module SDL3.Sys.Vulkan (
+  module SDL3.Sys.Bindgen.Vulkan,
+
+  -- * Function aliases
+  SDL3.Sys.Vulkan.vulkanLoadLibrary,
+  SDL3.Sys.Vulkan.vulkanLoadLibrarySafe,
+  SDL3.Sys.Vulkan.vulkanGetVkGetInstanceProcAddr,
+  SDL3.Sys.Vulkan.vulkanGetVkGetInstanceProcAddrSafe,
+  SDL3.Sys.Vulkan.vulkanUnloadLibrary,
+  SDL3.Sys.Vulkan.vulkanUnloadLibrarySafe,
+  SDL3.Sys.Vulkan.vulkanGetInstanceExtensions,
+  SDL3.Sys.Vulkan.vulkanGetInstanceExtensionsSafe,
+  SDL3.Sys.Vulkan.vulkanCreateSurface,
+  SDL3.Sys.Vulkan.vulkanCreateSurfaceSafe,
+  SDL3.Sys.Vulkan.vulkanDestroySurface,
+  SDL3.Sys.Vulkan.vulkanDestroySurfaceSafe,
+  SDL3.Sys.Vulkan.vulkanGetPresentationSupport,
+  SDL3.Sys.Vulkan.vulkanGetPresentationSupportSafe,
+)
+where
+
+import Data.Coerce qualified as Coerce
+
+import HsBindgen.Runtime.CBool qualified as CBool
+import HsBindgen.Runtime.PtrConst qualified as PtrConst
+import HsBindgen.Runtime.Support qualified as BG
+import SDL3.Sys.Bindgen.Stdinc qualified
+import SDL3.Sys.Bindgen.Video qualified
+import SDL3.Sys.Bindgen.Vulkan
+import SDL3.Sys.Bindgen.Vulkan.Safe qualified as Safe
+import SDL3.Sys.Bindgen.Vulkan.Unsafe qualified as Unsafe
+
+-- | Dynamically load the Vulkan loader library.
+--
+--     This should be called after initializing the video driver, but before creating any Vulkan windows. If no Vulkan loader library is loaded, the default library will be loaded upon creation of the first Vulkan window.
+--
+--     SDL keeps a counter of how many times this function has been successfully called, so it is safe to call this function multiple times, so long as it is eventually paired with an equivalent number of calls to 'vulkanUnloadLibrary'. The @path@ argument is ignored unless there is no library currently loaded, and and the library isn\'t actually unloaded until there have been an equivalent number of calls to 'vulkanUnloadLibrary'.
+--
+--     It is fairly common for Vulkan applications to link with libvulkan instead of explicitly loading it at run time. This will work with SDL provided the application links to a dynamic library and both it and SDL use the same search path.
+--
+--     If you specify a non-NULL @path@, an application should retrieve all of the Vulkan functions it uses from the dynamic library using 'vulkanGetVkGetInstanceProcAddr' unless you can guarantee @path@ points to the same vulkan loader library the application linked to.
+--
+--     On Apple devices, if @path@ is NULL, SDL will attempt to find the @vkGetInstanceProcAddr@ address within all the Mach-O images of the current process. This is because it is fairly common for Vulkan applications to link with libvulkan (and historically MoltenVK was provided as a static library). If it is not found, on macOS, SDL will attempt to load @vulkan.framework\/vulkan@, @libvulkan.1.dylib@, @MoltenVK.framework\/MoltenVK@, and @libMoltenVK.dylib@, in that order. On iOS, SDL will attempt to load @libMoltenVK.dylib@. Applications using a dynamic framework or .dylib must ensure it is included in its application bundle.
+--
+--     On non-Apple devices, application linking with a static libvulkan is not supported. Either do not link to the Vulkan loader or link to a dynamic library version.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanGetVkGetInstanceProcAddr', 'vulkanUnloadLibrary'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Vulkan_LoadLibrary@.
+--                   The safe flavor is 'vulkanLoadLibrarySafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_Vulkan_LoadLibrary@, defined at @SDL3\/SDL_vulkan.h 133:34@
+vulkanLoadLibrary
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the platform dependent Vulkan loader library name or NULL.
+  -> IO Bool
+vulkanLoadLibrary =
+  \x00 ->
+    fmap CBool.toBool (Unsafe.sDL_Vulkan_LoadLibrary x00)
+
+-- | Dynamically load the Vulkan loader library.
+--
+--     This should be called after initializing the video driver, but before creating any Vulkan windows. If no Vulkan loader library is loaded, the default library will be loaded upon creation of the first Vulkan window.
+--
+--     SDL keeps a counter of how many times this function has been successfully called, so it is safe to call this function multiple times, so long as it is eventually paired with an equivalent number of calls to 'vulkanUnloadLibrary'. The @path@ argument is ignored unless there is no library currently loaded, and and the library isn\'t actually unloaded until there have been an equivalent number of calls to 'vulkanUnloadLibrary'.
+--
+--     It is fairly common for Vulkan applications to link with libvulkan instead of explicitly loading it at run time. This will work with SDL provided the application links to a dynamic library and both it and SDL use the same search path.
+--
+--     If you specify a non-NULL @path@, an application should retrieve all of the Vulkan functions it uses from the dynamic library using 'vulkanGetVkGetInstanceProcAddr' unless you can guarantee @path@ points to the same vulkan loader library the application linked to.
+--
+--     On Apple devices, if @path@ is NULL, SDL will attempt to find the @vkGetInstanceProcAddr@ address within all the Mach-O images of the current process. This is because it is fairly common for Vulkan applications to link with libvulkan (and historically MoltenVK was provided as a static library). If it is not found, on macOS, SDL will attempt to load @vulkan.framework\/vulkan@, @libvulkan.1.dylib@, @MoltenVK.framework\/MoltenVK@, and @libMoltenVK.dylib@, in that order. On iOS, SDL will attempt to load @libMoltenVK.dylib@. Applications using a dynamic framework or .dylib must ensure it is included in its application bundle.
+--
+--     On non-Apple devices, application linking with a static libvulkan is not supported. Either do not link to the Vulkan loader or link to a dynamic library version.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanGetVkGetInstanceProcAddr', 'vulkanUnloadLibrary'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Vulkan_LoadLibrary@.
+--                   The unsafe flavor is 'vulkanLoadLibrary'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_Vulkan_LoadLibrary@, defined at @SDL3\/SDL_vulkan.h 133:34@
+vulkanLoadLibrarySafe
+  :: PtrConst.PtrConst BG.CChar
+  -- ^
+  --
+  --           [@path@]: the platform dependent Vulkan loader library name or NULL.
+  -> IO Bool
+vulkanLoadLibrarySafe =
+  \x00 ->
+    fmap CBool.toBool (Safe.sDL_Vulkan_LoadLibrary x00)
+
+-- | Get the address of the @vkGetInstanceProcAddr@ function.
+--
+--     This should be called after either calling @'vulkanLoadLibrary'@ or creating an SDL_Window with the @SDL_WINDOW_VULKAN@ flag.
+--
+--     The actual type of the returned function pointer is PFN_vkGetInstanceProcAddr, but that isn\'t available because the Vulkan headers are not included here. You should cast the return value of this function to that type, e.g.
+--
+--     @vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) 'vulkanGetVkGetInstanceProcAddr';@
+--
+--     [Returns]: the function pointer for @vkGetInstanceProcAddr@ or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Vulkan_GetVkGetInstanceProcAddr@.
+--                   The safe flavor is 'vulkanGetVkGetInstanceProcAddrSafe'
+--                   .
+--
+--     [C declaration]: @SDL_Vulkan_GetVkGetInstanceProcAddr@, defined at @SDL3\/SDL_vulkan.h 154:49@
+vulkanGetVkGetInstanceProcAddr :: IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+vulkanGetVkGetInstanceProcAddr =
+  Unsafe.sDL_Vulkan_GetVkGetInstanceProcAddr
+
+-- | Get the address of the @vkGetInstanceProcAddr@ function.
+--
+--     This should be called after either calling @'vulkanLoadLibrary'@ or creating an SDL_Window with the @SDL_WINDOW_VULKAN@ flag.
+--
+--     The actual type of the returned function pointer is PFN_vkGetInstanceProcAddr, but that isn\'t available because the Vulkan headers are not included here. You should cast the return value of this function to that type, e.g.
+--
+--     @vkGetInstanceProcAddr = (PFN_vkGetInstanceProcAddr) 'vulkanGetVkGetInstanceProcAddr';@
+--
+--     [Returns]: the function pointer for @vkGetInstanceProcAddr@ or NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Vulkan_GetVkGetInstanceProcAddr@.
+--                   The unsafe flavor is 'vulkanGetVkGetInstanceProcAddr'
+--                   .
+--
+--     [C declaration]: @SDL_Vulkan_GetVkGetInstanceProcAddr@, defined at @SDL3\/SDL_vulkan.h 154:49@
+vulkanGetVkGetInstanceProcAddrSafe :: IO SDL3.Sys.Bindgen.Stdinc.SDL_FunctionPointer
+vulkanGetVkGetInstanceProcAddrSafe =
+  Safe.sDL_Vulkan_GetVkGetInstanceProcAddr
+
+-- | Unload the Vulkan library previously loaded by @'vulkanLoadLibrary'@.
+--
+--     SDL keeps a counter of how many times this function has been called, so it is safe to call this function multiple times, so long as it is paired with an equivalent number of calls to 'vulkanLoadLibrary'. The library isn\'t actually unloaded until there have been an equivalent number of calls to 'vulkanUnloadLibrary'.
+--
+--     Once the library has actually been unloaded, if any Vulkan instances remain, they will likely crash the program. Clean up any existing Vulkan resources, and destroy appropriate windows, renderers and GPU devices before calling this function.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanLoadLibrary'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Vulkan_UnloadLibrary@.
+--                   The safe flavor is 'vulkanUnloadLibrarySafe'
+--                   .
+--
+--     [C declaration]: @SDL_Vulkan_UnloadLibrary@, defined at @SDL3\/SDL_vulkan.h 176:34@
+vulkanUnloadLibrary :: IO ()
+vulkanUnloadLibrary = Unsafe.sDL_Vulkan_UnloadLibrary
+
+-- | Unload the Vulkan library previously loaded by @'vulkanLoadLibrary'@.
+--
+--     SDL keeps a counter of how many times this function has been called, so it is safe to call this function multiple times, so long as it is paired with an equivalent number of calls to 'vulkanLoadLibrary'. The library isn\'t actually unloaded until there have been an equivalent number of calls to 'vulkanUnloadLibrary'.
+--
+--     Once the library has actually been unloaded, if any Vulkan instances remain, they will likely crash the program. Clean up any existing Vulkan resources, and destroy appropriate windows, renderers and GPU devices before calling this function.
+--
+--     [Thread safety]: This function is not thread safe.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanLoadLibrary'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Vulkan_UnloadLibrary@.
+--                   The unsafe flavor is 'vulkanUnloadLibrary'
+--                   .
+--
+--     [C declaration]: @SDL_Vulkan_UnloadLibrary@, defined at @SDL3\/SDL_vulkan.h 176:34@
+vulkanUnloadLibrarySafe :: IO ()
+vulkanUnloadLibrarySafe =
+  Safe.sDL_Vulkan_UnloadLibrary
+
+-- | Get the Vulkan instance extensions needed for vkCreateInstance.
+--
+--     This should be called after either calling @'vulkanLoadLibrary'@ or creating an SDL_Window with the @SDL_WINDOW_VULKAN@ flag.
+--
+--     On return, the variable pointed to by @count@ will be set to the number of elements returned, suitable for using with VkInstanceCreateInfo::enabledExtensionCount, and the returned array can be used with VkInstanceCreateInfo::ppEnabledExtensionNames, for calling Vulkan\'s vkCreateInstance API.
+--
+--     You should not free the returned array; it is owned by SDL.
+--
+--     [Returns]: an array of extension name strings on success, NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanCreateSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Vulkan_GetInstanceExtensions@.
+--                   The safe flavor is 'vulkanGetInstanceExtensionsSafe'
+--                   .
+--
+--     [C declaration]: @SDL_Vulkan_GetInstanceExtensions@, defined at @SDL3\/SDL_vulkan.h 200:50@
+vulkanGetInstanceExtensions
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of extensions returned.
+  -> IO (PtrConst.PtrConst (PtrConst.PtrConst BG.CChar))
+vulkanGetInstanceExtensions =
+  Unsafe.sDL_Vulkan_GetInstanceExtensions
+
+-- | Get the Vulkan instance extensions needed for vkCreateInstance.
+--
+--     This should be called after either calling @'vulkanLoadLibrary'@ or creating an SDL_Window with the @SDL_WINDOW_VULKAN@ flag.
+--
+--     On return, the variable pointed to by @count@ will be set to the number of elements returned, suitable for using with VkInstanceCreateInfo::enabledExtensionCount, and the returned array can be used with VkInstanceCreateInfo::ppEnabledExtensionNames, for calling Vulkan\'s vkCreateInstance API.
+--
+--     You should not free the returned array; it is owned by SDL.
+--
+--     [Returns]: an array of extension name strings on success, NULL on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanCreateSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Vulkan_GetInstanceExtensions@.
+--                   The unsafe flavor is 'vulkanGetInstanceExtensions'
+--                   .
+--
+--     [C declaration]: @SDL_Vulkan_GetInstanceExtensions@, defined at @SDL3\/SDL_vulkan.h 200:50@
+vulkanGetInstanceExtensionsSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Stdinc.Uint32
+  -- ^
+  --
+  --           [@count@]: a pointer filled in with the number of extensions returned.
+  -> IO (PtrConst.PtrConst (PtrConst.PtrConst BG.CChar))
+vulkanGetInstanceExtensionsSafe =
+  Safe.sDL_Vulkan_GetInstanceExtensions
+
+-- | Create a Vulkan rendering surface for a window.
+--
+--     The @window@ must have been created with the @SDL_WINDOW_VULKAN@ flag and @instance@ must have been created with extensions returned by @'vulkanGetInstanceExtensions'@ enabled.
+--
+--     If @allocator@ is NULL, Vulkan will use the system default allocator. This argument is passed directly to Vulkan and isn\'t used by SDL itself.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanGetInstanceExtensions', 'vulkanDestroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Vulkan_CreateSurface@.
+--                   The safe flavor is 'vulkanCreateSurfaceSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_Vulkan_CreateSurface@, defined at @SDL3\/SDL_vulkan.h 226:34@
+vulkanCreateSurface
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to which to attach the Vulkan surface.
+  -> VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -- ^
+  --
+  --           [@allocator@]: a VkAllocationCallbacks struct, which lets the app set the allocator that creates the surface. Can be NULL.
+  -> BG.Ptr VkSurfaceKHR
+  -- ^
+  --
+  --           [@surface@]: a pointer to a VkSurfaceKHR handle to output the newly created surface.
+  -> IO Bool
+vulkanCreateSurface =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Unsafe.sDL_Vulkan_CreateSurface x00 x11 x22 x33)
+
+-- | Create a Vulkan rendering surface for a window.
+--
+--     The @window@ must have been created with the @SDL_WINDOW_VULKAN@ flag and @instance@ must have been created with extensions returned by @'vulkanGetInstanceExtensions'@ enabled.
+--
+--     If @allocator@ is NULL, Vulkan will use the system default allocator. This argument is passed directly to Vulkan and isn\'t used by SDL itself.
+--
+--     [Returns]: true on success or false on failure; call 'SDL3.Sys.Error.getError' for more information.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanGetInstanceExtensions', 'vulkanDestroySurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Vulkan_CreateSurface@.
+--                   The unsafe flavor is 'vulkanCreateSurface'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_Vulkan_CreateSurface@, defined at @SDL3\/SDL_vulkan.h 226:34@
+vulkanCreateSurfaceSafe
+  :: BG.Ptr SDL3.Sys.Bindgen.Video.SDL_Window
+  -- ^
+  --
+  --           [@window@]: the window to which to attach the Vulkan surface.
+  -> VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -- ^
+  --
+  --           [@allocator@]: a VkAllocationCallbacks struct, which lets the app set the allocator that creates the surface. Can be NULL.
+  -> BG.Ptr VkSurfaceKHR
+  -- ^
+  --
+  --           [@surface@]: a pointer to a VkSurfaceKHR handle to output the newly created surface.
+  -> IO Bool
+vulkanCreateSurfaceSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        \x33 ->
+          fmap CBool.toBool (Safe.sDL_Vulkan_CreateSurface x00 x11 x22 x33)
+
+-- | Destroy the Vulkan rendering surface of a window.
+--
+--     This should be called before 'SDL3.Sys.Video.destroyWindow', if 'vulkanCreateSurface' was called after 'SDL3.Sys.Video.createWindow'.
+--
+--     The @instance@ must have been created with extensions returned by @'vulkanGetInstanceExtensions'@ enabled and @surface@ must have been created successfully by an @'vulkanCreateSurface'@ call.
+--
+--     If @allocator@ is NULL, Vulkan will use the system default allocator. This argument is passed directly to Vulkan and isn\'t used by SDL itself.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanGetInstanceExtensions', 'vulkanCreateSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Vulkan_DestroySurface@.
+--                   The safe flavor is 'vulkanDestroySurfaceSafe'
+--                   .
+--
+--     [C declaration]: @SDL_Vulkan_DestroySurface@, defined at @SDL3\/SDL_vulkan.h 254:34@
+vulkanDestroySurface
+  :: VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> VkSurfaceKHR
+  -- ^
+  --
+  --           [@surface@]: vkSurfaceKHR handle to destroy.
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -- ^
+  --
+  --           [@allocator@]: a VkAllocationCallbacks struct, which lets the app set the allocator that destroys the surface. Can be NULL.
+  -> IO ()
+vulkanDestroySurface =
+  Unsafe.sDL_Vulkan_DestroySurface
+
+-- | Destroy the Vulkan rendering surface of a window.
+--
+--     This should be called before 'SDL3.Sys.Video.destroyWindow', if 'vulkanCreateSurface' was called after 'SDL3.Sys.Video.createWindow'.
+--
+--     The @instance@ must have been created with extensions returned by @'vulkanGetInstanceExtensions'@ enabled and @surface@ must have been created successfully by an @'vulkanCreateSurface'@ call.
+--
+--     If @allocator@ is NULL, Vulkan will use the system default allocator. This argument is passed directly to Vulkan and isn\'t used by SDL itself.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanGetInstanceExtensions', 'vulkanCreateSurface'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Vulkan_DestroySurface@.
+--                   The unsafe flavor is 'vulkanDestroySurface'
+--                   .
+--
+--     [C declaration]: @SDL_Vulkan_DestroySurface@, defined at @SDL3\/SDL_vulkan.h 254:34@
+vulkanDestroySurfaceSafe
+  :: VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> VkSurfaceKHR
+  -- ^
+  --
+  --           [@surface@]: vkSurfaceKHR handle to destroy.
+  -> PtrConst.PtrConst VkAllocationCallbacks
+  -- ^
+  --
+  --           [@allocator@]: a VkAllocationCallbacks struct, which lets the app set the allocator that destroys the surface. Can be NULL.
+  -> IO ()
+vulkanDestroySurfaceSafe =
+  Safe.sDL_Vulkan_DestroySurface
+
+-- | Query support for presentation via a given physical device and queue family.
+--
+--     The @instance@ must have been created with extensions returned by @'vulkanGetInstanceExtensions'@ enabled.
+--
+--     [Returns]: true if supported, false if unsupported or an error occurred.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanGetInstanceExtensions'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Unsafe__ foreign import of @SDL_Vulkan_GetPresentationSupport@.
+--                   The safe flavor is 'vulkanGetPresentationSupportSafe'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_Vulkan_GetPresentationSupport@, defined at @SDL3\/SDL_vulkan.h 275:34@
+vulkanGetPresentationSupport
+  :: VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> VkPhysicalDevice
+  -- ^
+  --
+  --           [@physicalDevice@]: a valid Vulkan physical device handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@queueFamilyIndex@]: a valid queue family index for the given physical device.
+  -> IO Bool
+vulkanGetPresentationSupport =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Unsafe.sDL_Vulkan_GetPresentationSupport x00 x11 (Coerce.coerce x22))
+
+-- | Query support for presentation via a given physical device and queue family.
+--
+--     The @instance@ must have been created with extensions returned by @'vulkanGetInstanceExtensions'@ enabled.
+--
+--     [Returns]: true if supported, false if unsupported or an error occurred.
+--
+--     @since 3.2.0
+--
+--     [See also]: 'vulkanGetInstanceExtensions'
+--
+--     === __@sdl3-bindgen-sys@ notes__
+--
+--     [FFI safety]: __Safe__ foreign import of @SDL_Vulkan_GetPresentationSupport@.
+--                   The unsafe flavor is 'vulkanGetPresentationSupport'
+--                   .
+--
+--     [Scalars]: The binding generation has mapped C scalars to native Haskell scalars for this function.
+--                Pointers and structs are untouched by this best-effort mapping. Higher-level bindings are expected to map structs and pointers as appropriate.
+--
+--     [C declaration]: @SDL_Vulkan_GetPresentationSupport@, defined at @SDL3\/SDL_vulkan.h 275:34@
+vulkanGetPresentationSupportSafe
+  :: VkInstance
+  -- ^
+  --
+  --           [@instance@]: the Vulkan instance handle.
+  -> VkPhysicalDevice
+  -- ^
+  --
+  --           [@physicalDevice@]: a valid Vulkan physical device handle.
+  -> BG.Word32
+  -- ^
+  --
+  --           [@queueFamilyIndex@]: a valid queue family index for the given physical device.
+  -> IO Bool
+vulkanGetPresentationSupportSafe =
+  \x00 ->
+    \x11 ->
+      \x22 ->
+        fmap CBool.toBool (Safe.sDL_Vulkan_GetPresentationSupport x00 x11 (Coerce.coerce x22))
